summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--COPYING343
-rw-r--r--INSTALL52
-rw-r--r--LICENSE23
-rw-r--r--Makefile.in101
-rw-r--r--README97
-rw-r--r--README.configure224
-rw-r--r--SUPPORT25
-rw-r--r--c/ACKNOWLEDGEMENTS110
-rw-r--r--c/Makefile.in91
-rw-r--r--c/PROBLEMS60
-rw-r--r--c/README37
-rw-r--r--c/README.DOS72
-rw-r--r--c/REQUIRES13
-rw-r--r--c/TESTED51
-rw-r--r--c/UPDATE_HELP52
-rw-r--r--c/build-tools/Makefile.in13
-rw-r--r--c/build-tools/README32
-rw-r--r--c/build-tools/cklength.c364
-rw-r--r--c/build-tools/eolstrip.c351
-rw-r--r--c/build-tools/os/Makefile.in13
-rw-r--r--c/build-tools/os/msdos/Makefile.in39
-rw-r--r--c/build-tools/os/msdos/README12
-rw-r--r--c/build-tools/os/msdos/cklength.uue286
-rw-r--r--c/build-tools/os/msdos/fixtimer.c111
-rw-r--r--c/build-tools/os/msdos/fixtimer.uue162
-rw-r--r--c/build-tools/os/msdos/ifc.c331
-rw-r--r--c/build-tools/os/msdos/ifc_exe.uue163
-rw-r--r--c/build-tools/packhex.c513
-rw-r--r--c/build-tools/scripts/Makefile.in34
-rw-r--r--c/build-tools/scripts/README32
-rw-r--r--c/build-tools/src/Makefile.in61
-rw-r--r--c/build-tools/src/cklength.c364
-rw-r--r--c/build-tools/src/eolstrip.c351
-rw-r--r--c/build-tools/src/packhex.c513
-rw-r--r--c/build-tools/src/unhex.c725
-rw-r--r--c/build-tools/unhex.c725
-rw-r--r--c/src/Makefile.in15
-rw-r--r--c/src/README27
-rw-r--r--c/src/exec/Makefile.in17
-rw-r--r--c/src/exec/libcsupport/include/clockdrv.h51
-rw-r--r--c/src/exec/libcsupport/include/console.h69
-rw-r--r--c/src/exec/libcsupport/include/iosupp.h44
-rw-r--r--c/src/exec/libcsupport/include/ringbuf.h53
-rw-r--r--c/src/exec/libcsupport/include/rtems/assoc.h42
-rw-r--r--c/src/exec/libcsupport/include/rtems/error.h38
-rw-r--r--c/src/exec/libcsupport/include/rtems/libcsupport.h43
-rw-r--r--c/src/exec/libcsupport/include/rtems/libio.h124
-rw-r--r--c/src/exec/libcsupport/include/spurious.h38
-rw-r--r--c/src/exec/libcsupport/include/sys/utsname.h49
-rw-r--r--c/src/exec/libcsupport/include/timerdrv.h40
-rw-r--r--c/src/exec/libcsupport/include/vmeintr.h58
-rw-r--r--c/src/exec/libcsupport/src/README37
-rw-r--r--c/src/exec/libcsupport/src/__brk.c44
-rw-r--r--c/src/exec/libcsupport/src/__gettod.c103
-rw-r--r--c/src/exec/libcsupport/src/__times.c65
-rw-r--r--c/src/exec/libcsupport/src/assoc.c260
-rw-r--r--c/src/exec/libcsupport/src/error.c209
-rw-r--r--c/src/exec/libcsupport/src/hosterr.c43
-rw-r--r--c/src/exec/libcsupport/src/libio.c532
-rw-r--r--c/src/exec/libcsupport/src/malloc.c400
-rw-r--r--c/src/exec/libcsupport/src/newlibc.c430
-rw-r--r--c/src/exec/libcsupport/src/no_libc.c55
-rw-r--r--c/src/exec/libcsupport/src/unixlibc.c23
-rw-r--r--c/src/exec/libcsupport/src/utsname.c57
-rw-r--r--c/src/exec/posix/Makefile.in13
-rw-r--r--c/src/exec/posix/base/Makefile.in33
-rw-r--r--c/src/exec/posix/base/aio.h137
-rw-r--r--c/src/exec/posix/base/devctl.h30
-rw-r--r--c/src/exec/posix/base/intr.h72
-rw-r--r--c/src/exec/posix/base/limits.h164
-rw-r--r--c/src/exec/posix/base/mqueue.h145
-rw-r--r--c/src/exec/posix/base/pthread.h500
-rw-r--r--c/src/exec/posix/base/sched.h88
-rw-r--r--c/src/exec/posix/base/semaphore.h108
-rw-r--r--c/src/exec/posix/base/unistd.h85
-rw-r--r--c/src/exec/posix/headers/Makefile.in33
-rw-r--r--c/src/exec/posix/headers/cancel.h16
-rw-r--r--c/src/exec/posix/headers/cond.h130
-rw-r--r--c/src/exec/posix/headers/condmp.h162
-rw-r--r--c/src/exec/posix/headers/config.h59
-rw-r--r--c/src/exec/posix/headers/intr.h154
-rw-r--r--c/src/exec/posix/headers/key.h136
-rw-r--r--c/src/exec/posix/headers/mqueue.h186
-rw-r--r--c/src/exec/posix/headers/mqueuemp.h161
-rw-r--r--c/src/exec/posix/headers/mutex.h120
-rw-r--r--c/src/exec/posix/headers/mutexmp.h161
-rw-r--r--c/src/exec/posix/headers/posixapi.h34
-rw-r--r--c/src/exec/posix/headers/priority.h44
-rw-r--r--c/src/exec/posix/headers/psignal.h17
-rw-r--r--c/src/exec/posix/headers/pthread.h123
-rw-r--r--c/src/exec/posix/headers/pthreadmp.h161
-rw-r--r--c/src/exec/posix/headers/semaphore.h135
-rw-r--r--c/src/exec/posix/headers/semaphoremp.h161
-rw-r--r--c/src/exec/posix/headers/seterr.h20
-rw-r--r--c/src/exec/posix/headers/threadsup.h46
-rw-r--r--c/src/exec/posix/headers/time.h50
-rw-r--r--c/src/exec/posix/include/aio.h137
-rw-r--r--c/src/exec/posix/include/devctl.h30
-rw-r--r--c/src/exec/posix/include/intr.h72
-rw-r--r--c/src/exec/posix/include/limits.h164
-rw-r--r--c/src/exec/posix/include/mqueue.h145
-rw-r--r--c/src/exec/posix/include/pthread.h500
-rw-r--r--c/src/exec/posix/include/rtems/posix/Makefile.in33
-rw-r--r--c/src/exec/posix/include/rtems/posix/cancel.h16
-rw-r--r--c/src/exec/posix/include/rtems/posix/cond.h130
-rw-r--r--c/src/exec/posix/include/rtems/posix/condmp.h162
-rw-r--r--c/src/exec/posix/include/rtems/posix/config.h59
-rw-r--r--c/src/exec/posix/include/rtems/posix/intr.h154
-rw-r--r--c/src/exec/posix/include/rtems/posix/key.h136
-rw-r--r--c/src/exec/posix/include/rtems/posix/mqueue.h186
-rw-r--r--c/src/exec/posix/include/rtems/posix/mqueuemp.h161
-rw-r--r--c/src/exec/posix/include/rtems/posix/mutex.h120
-rw-r--r--c/src/exec/posix/include/rtems/posix/mutexmp.h161
-rw-r--r--c/src/exec/posix/include/rtems/posix/posixapi.h34
-rw-r--r--c/src/exec/posix/include/rtems/posix/priority.h44
-rw-r--r--c/src/exec/posix/include/rtems/posix/psignal.h17
-rw-r--r--c/src/exec/posix/include/rtems/posix/pthread.h123
-rw-r--r--c/src/exec/posix/include/rtems/posix/pthreadmp.h161
-rw-r--r--c/src/exec/posix/include/rtems/posix/semaphore.h135
-rw-r--r--c/src/exec/posix/include/rtems/posix/semaphoremp.h161
-rw-r--r--c/src/exec/posix/include/rtems/posix/seterr.h20
-rw-r--r--c/src/exec/posix/include/rtems/posix/threadsup.h46
-rw-r--r--c/src/exec/posix/include/rtems/posix/time.h50
-rw-r--r--c/src/exec/posix/include/sched.h88
-rw-r--r--c/src/exec/posix/include/semaphore.h108
-rw-r--r--c/src/exec/posix/include/sys/Makefile.in30
-rw-r--r--c/src/exec/posix/include/sys/utsname.h49
-rw-r--r--c/src/exec/posix/include/unistd.h85
-rw-r--r--c/src/exec/posix/include/wrap/Makefile.in33
-rw-r--r--c/src/exec/posix/inline/Makefile.in30
-rw-r--r--c/src/exec/posix/inline/cond.inl76
-rw-r--r--c/src/exec/posix/inline/intr.inl72
-rw-r--r--c/src/exec/posix/inline/key.inl70
-rw-r--r--c/src/exec/posix/inline/mqueue.inl83
-rw-r--r--c/src/exec/posix/inline/mutex.inl93
-rw-r--r--c/src/exec/posix/inline/priority.inl37
-rw-r--r--c/src/exec/posix/inline/pthread.inl70
-rw-r--r--c/src/exec/posix/inline/rtems/posix/Makefile.in30
-rw-r--r--c/src/exec/posix/inline/rtems/posix/cond.inl76
-rw-r--r--c/src/exec/posix/inline/rtems/posix/intr.inl72
-rw-r--r--c/src/exec/posix/inline/rtems/posix/key.inl70
-rw-r--r--c/src/exec/posix/inline/rtems/posix/mqueue.inl83
-rw-r--r--c/src/exec/posix/inline/rtems/posix/mutex.inl93
-rw-r--r--c/src/exec/posix/inline/rtems/posix/priority.inl37
-rw-r--r--c/src/exec/posix/inline/rtems/posix/pthread.inl70
-rw-r--r--c/src/exec/posix/inline/rtems/posix/semaphore.inl71
-rw-r--r--c/src/exec/posix/inline/semaphore.inl71
-rw-r--r--c/src/exec/posix/macros/Makefile.in31
-rw-r--r--c/src/exec/posix/macros/rtems/posix/Makefile.in31
-rw-r--r--c/src/exec/posix/optman/Makefile.in46
-rw-r--r--c/src/exec/posix/src/Makefile.in50
-rw-r--r--c/src/exec/posix/src/adasupp.c28
-rw-r--r--c/src/exec/posix/src/aio.c111
-rw-r--r--c/src/exec/posix/src/cancel.c228
-rw-r--r--c/src/exec/posix/src/cond.c501
-rw-r--r--c/src/exec/posix/src/devctl.c22
-rw-r--r--c/src/exec/posix/src/getpid.c22
-rw-r--r--c/src/exec/posix/src/intr.c340
-rw-r--r--c/src/exec/posix/src/key.c262
-rw-r--r--c/src/exec/posix/src/mqueue.c710
-rw-r--r--c/src/exec/posix/src/mutex.c683
-rw-r--r--c/src/exec/posix/src/psignal.c1347
-rw-r--r--c/src/exec/posix/src/pthread.c1309
-rw-r--r--c/src/exec/posix/src/ptimer.c75
-rw-r--r--c/src/exec/posix/src/sched.c153
-rw-r--r--c/src/exec/posix/src/semaphore.c571
-rw-r--r--c/src/exec/posix/src/time.c393
-rw-r--r--c/src/exec/posix/src/types.c212
-rw-r--r--c/src/exec/posix/src/unistd.c41
-rw-r--r--c/src/exec/posix/src/utsname.c57
-rw-r--r--c/src/exec/posix/sys/Makefile.in30
-rw-r--r--c/src/exec/posix/sys/utsname.h49
-rw-r--r--c/src/exec/rtems/Makefile.in13
-rw-r--r--c/src/exec/rtems/headers/Makefile.in37
-rw-r--r--c/src/exec/rtems/headers/asr.h112
-rw-r--r--c/src/exec/rtems/headers/attr.h84
-rw-r--r--c/src/exec/rtems/headers/clock.h103
-rw-r--r--c/src/exec/rtems/headers/config.h54
-rw-r--r--c/src/exec/rtems/headers/dpmem.h157
-rw-r--r--c/src/exec/rtems/headers/event.h174
-rw-r--r--c/src/exec/rtems/headers/eventmp.h147
-rw-r--r--c/src/exec/rtems/headers/eventset.h89
-rw-r--r--c/src/exec/rtems/headers/intr.h160
-rw-r--r--c/src/exec/rtems/headers/message.h317
-rw-r--r--c/src/exec/rtems/headers/modes.h89
-rw-r--r--c/src/exec/rtems/headers/mp.h53
-rw-r--r--c/src/exec/rtems/headers/msgmp.h175
-rw-r--r--c/src/exec/rtems/headers/options.h53
-rw-r--r--c/src/exec/rtems/headers/part.h168
-rw-r--r--c/src/exec/rtems/headers/partmp.h161
-rw-r--r--c/src/exec/rtems/headers/ratemon.h213
-rw-r--r--c/src/exec/rtems/headers/region.h234
-rw-r--r--c/src/exec/rtems/headers/regionmp.h166
-rw-r--r--c/src/exec/rtems/headers/rtems.h121
-rw-r--r--c/src/exec/rtems/headers/rtemsapi.h34
-rw-r--r--c/src/exec/rtems/headers/sem.h248
-rw-r--r--c/src/exec/rtems/headers/semmp.h163
-rw-r--r--c/src/exec/rtems/headers/signal.h83
-rw-r--r--c/src/exec/rtems/headers/signalmp.h147
-rw-r--r--c/src/exec/rtems/headers/status.h83
-rw-r--r--c/src/exec/rtems/headers/support.h99
-rw-r--r--c/src/exec/rtems/headers/taskmp.h167
-rw-r--r--c/src/exec/rtems/headers/tasks.h421
-rw-r--r--c/src/exec/rtems/headers/timer.h207
-rw-r--r--c/src/exec/rtems/headers/types.h96
-rw-r--r--c/src/exec/rtems/include/rtems.h121
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/Makefile.in37
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/asr.h112
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/attr.h84
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/clock.h103
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/config.h54
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/dpmem.h157
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/event.h174
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/eventmp.h147
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/eventset.h89
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/intr.h160
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/message.h317
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/modes.h89
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/mp.h53
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/msgmp.h175
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/options.h53
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/part.h168
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/partmp.h161
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/ratemon.h213
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/region.h234
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/regionmp.h166
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/rtemsapi.h34
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/sem.h248
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/semmp.h163
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/signal.h83
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/signalmp.h147
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/status.h83
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/support.h99
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/taskmp.h167
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/tasks.h421
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/timer.h207
-rw-r--r--c/src/exec/rtems/include/rtems/rtems/types.h96
-rw-r--r--c/src/exec/rtems/inline/Makefile.in30
-rw-r--r--c/src/exec/rtems/inline/asr.inl128
-rw-r--r--c/src/exec/rtems/inline/attr.inl159
-rw-r--r--c/src/exec/rtems/inline/dpmem.inl95
-rw-r--r--c/src/exec/rtems/inline/event.inl21
-rw-r--r--c/src/exec/rtems/inline/eventset.inl91
-rw-r--r--c/src/exec/rtems/inline/message.inl83
-rw-r--r--c/src/exec/rtems/inline/modes.inl152
-rw-r--r--c/src/exec/rtems/inline/options.inl55
-rw-r--r--c/src/exec/rtems/inline/part.inl199
-rw-r--r--c/src/exec/rtems/inline/ratemon.inl143
-rw-r--r--c/src/exec/rtems/inline/region.inl127
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/Makefile.in30
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/asr.inl128
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/attr.inl159
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/dpmem.inl95
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/event.inl21
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/eventset.inl91
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/message.inl83
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/modes.inl152
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/options.inl55
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/part.inl199
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/ratemon.inl143
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/region.inl127
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/sem.inl93
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/status.inl56
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/support.inl61
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/tasks.inl90
-rw-r--r--c/src/exec/rtems/inline/rtems/rtems/timer.inl142
-rw-r--r--c/src/exec/rtems/inline/sem.inl93
-rw-r--r--c/src/exec/rtems/inline/status.inl56
-rw-r--r--c/src/exec/rtems/inline/support.inl61
-rw-r--r--c/src/exec/rtems/inline/tasks.inl90
-rw-r--r--c/src/exec/rtems/inline/timer.inl142
-rw-r--r--c/src/exec/rtems/macros/Makefile.in30
-rw-r--r--c/src/exec/rtems/macros/asr.inl90
-rw-r--r--c/src/exec/rtems/macros/attr.inl91
-rw-r--r--c/src/exec/rtems/macros/dpmem.inl59
-rw-r--r--c/src/exec/rtems/macros/event.inl21
-rw-r--r--c/src/exec/rtems/macros/eventset.inl53
-rw-r--r--c/src/exec/rtems/macros/message.inl49
-rw-r--r--c/src/exec/rtems/macros/modes.inl92
-rw-r--r--c/src/exec/rtems/macros/options.inl39
-rw-r--r--c/src/exec/rtems/macros/part.inl117
-rw-r--r--c/src/exec/rtems/macros/ratemon.inl85
-rw-r--r--c/src/exec/rtems/macros/region.inl75
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/Makefile.in30
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/asr.inl90
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/attr.inl91
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/dpmem.inl59
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/event.inl21
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/eventset.inl53
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/message.inl49
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/modes.inl92
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/options.inl39
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/part.inl117
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/ratemon.inl85
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/region.inl75
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/sem.inl58
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/status.inl39
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/support.inl44
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/tasks.inl58
-rw-r--r--c/src/exec/rtems/macros/rtems/rtems/timer.inl85
-rw-r--r--c/src/exec/rtems/macros/sem.inl58
-rw-r--r--c/src/exec/rtems/macros/status.inl39
-rw-r--r--c/src/exec/rtems/macros/support.inl44
-rw-r--r--c/src/exec/rtems/macros/tasks.inl58
-rw-r--r--c/src/exec/rtems/macros/timer.inl85
-rw-r--r--c/src/exec/rtems/optman/Makefile.in49
-rw-r--r--c/src/exec/rtems/optman/no-dpmem.c98
-rw-r--r--c/src/exec/rtems/optman/no-event.c56
-rw-r--r--c/src/exec/rtems/optman/no-mp.c201
-rw-r--r--c/src/exec/rtems/optman/no-msg.c192
-rw-r--r--c/src/exec/rtems/optman/no-part.c97
-rw-r--r--c/src/exec/rtems/optman/no-region.c114
-rw-r--r--c/src/exec/rtems/optman/no-rtmon.c117
-rw-r--r--c/src/exec/rtems/optman/no-sem.c114
-rw-r--r--c/src/exec/rtems/optman/no-signal.c56
-rw-r--r--c/src/exec/rtems/optman/no-timer.c123
-rw-r--r--c/src/exec/rtems/src/Makefile.in40
-rw-r--r--c/src/exec/rtems/src/clock.c151
-rw-r--r--c/src/exec/rtems/src/dpmem.c281
-rw-r--r--c/src/exec/rtems/src/event.c383
-rw-r--r--c/src/exec/rtems/src/eventmp.c190
-rw-r--r--c/src/exec/rtems/src/intr.c65
-rw-r--r--c/src/exec/rtems/src/mp.c42
-rw-r--r--c/src/exec/rtems/src/msg.c714
-rw-r--r--c/src/exec/rtems/src/msgmp.c458
-rw-r--r--c/src/exec/rtems/src/part.c341
-rw-r--r--c/src/exec/rtems/src/partmp.c302
-rw-r--r--c/src/exec/rtems/src/ratemon.c461
-rw-r--r--c/src/exec/rtems/src/region.c486
-rw-r--r--c/src/exec/rtems/src/regionmp.c310
-rw-r--r--c/src/exec/rtems/src/rtclock.c151
-rw-r--r--c/src/exec/rtems/src/rtemstimer.c349
-rw-r--r--c/src/exec/rtems/src/sem.c571
-rw-r--r--c/src/exec/rtems/src/semmp.c308
-rw-r--r--c/src/exec/rtems/src/signal.c149
-rw-r--r--c/src/exec/rtems/src/signalmp.c189
-rw-r--r--c/src/exec/rtems/src/taskmp.c340
-rw-r--r--c/src/exec/rtems/src/tasks.c1119
-rw-r--r--c/src/exec/rtems/src/timer.c349
-rw-r--r--c/src/exec/sapi/Makefile.in13
-rw-r--r--c/src/exec/sapi/headers/Makefile.in34
-rw-r--r--c/src/exec/sapi/headers/README135
-rw-r--r--c/src/exec/sapi/headers/confdefs.h485
-rw-r--r--c/src/exec/sapi/headers/config.h103
-rw-r--r--c/src/exec/sapi/headers/directives.h120
-rw-r--r--c/src/exec/sapi/headers/extension.h136
-rw-r--r--c/src/exec/sapi/headers/fatal.h49
-rw-r--r--c/src/exec/sapi/headers/init.h110
-rw-r--r--c/src/exec/sapi/headers/io.h244
-rw-r--r--c/src/exec/sapi/headers/mptables.h29
-rw-r--r--c/src/exec/sapi/headers/sptables.h162
-rw-r--r--c/src/exec/sapi/include/confdefs.h485
-rw-r--r--c/src/exec/sapi/include/rtems/Makefile.in34
-rw-r--r--c/src/exec/sapi/include/rtems/README135
-rw-r--r--c/src/exec/sapi/include/rtems/config.h103
-rw-r--r--c/src/exec/sapi/include/rtems/directives.h120
-rw-r--r--c/src/exec/sapi/include/rtems/extension.h136
-rw-r--r--c/src/exec/sapi/include/rtems/fatal.h49
-rw-r--r--c/src/exec/sapi/include/rtems/init.h110
-rw-r--r--c/src/exec/sapi/include/rtems/io.h244
-rw-r--r--c/src/exec/sapi/include/rtems/mptables.h29
-rw-r--r--c/src/exec/sapi/include/rtems/sptables.h162
-rw-r--r--c/src/exec/sapi/inline/Makefile.in29
-rw-r--r--c/src/exec/sapi/inline/extension.inl91
-rw-r--r--c/src/exec/sapi/inline/rtems/Makefile.in29
-rw-r--r--c/src/exec/sapi/inline/rtems/extension.inl91
-rw-r--r--c/src/exec/sapi/macros/Makefile.in29
-rw-r--r--c/src/exec/sapi/macros/extension.inl58
-rw-r--r--c/src/exec/sapi/macros/rtems/Makefile.in29
-rw-r--r--c/src/exec/sapi/macros/rtems/extension.inl58
-rw-r--r--c/src/exec/sapi/optman/Makefile.in46
-rw-r--r--c/src/exec/sapi/optman/no-ext.c67
-rw-r--r--c/src/exec/sapi/optman/no-io.c144
-rw-r--r--c/src/exec/sapi/src/Makefile.in38
-rw-r--r--c/src/exec/sapi/src/debug.c62
-rw-r--r--c/src/exec/sapi/src/exinit.c297
-rw-r--r--c/src/exec/sapi/src/extension.c165
-rw-r--r--c/src/exec/sapi/src/fatal.c38
-rw-r--r--c/src/exec/sapi/src/io.c345
-rw-r--r--c/src/exec/sapi/src/posixapi.c96
-rw-r--r--c/src/exec/sapi/src/rtemsapi.c90
-rw-r--r--c/src/exec/score/Makefile.in13
-rw-r--r--c/src/exec/score/cpu/Makefile.in13
-rw-r--r--c/src/exec/score/cpu/a29k/Makefile.in88
-rw-r--r--c/src/exec/score/cpu/a29k/a29k.h59
-rw-r--r--c/src/exec/score/cpu/a29k/a29ktypes.h57
-rw-r--r--c/src/exec/score/cpu/a29k/amd.ah531
-rw-r--r--c/src/exec/score/cpu/a29k/asm.h103
-rw-r--r--c/src/exec/score/cpu/a29k/cpu.c263
-rw-r--r--c/src/exec/score/cpu/a29k/cpu.h970
-rw-r--r--c/src/exec/score/cpu/a29k/cpu_asm.h71
-rw-r--r--c/src/exec/score/cpu/a29k/cpu_asm.s491
-rw-r--r--c/src/exec/score/cpu/a29k/pswmacro.ah442
-rw-r--r--c/src/exec/score/cpu/a29k/rtems.c48
-rw-r--r--c/src/exec/score/cpu/hppa1.1/Makefile.in83
-rw-r--r--c/src/exec/score/cpu/hppa1.1/cpu.c184
-rw-r--r--c/src/exec/score/cpu/hppa1.1/cpu.h608
-rw-r--r--c/src/exec/score/cpu/hppa1.1/cpu_asm.h73
-rw-r--r--c/src/exec/score/cpu/hppa1.1/cpu_asm.s778
-rw-r--r--c/src/exec/score/cpu/hppa1.1/hppa.h716
-rw-r--r--c/src/exec/score/cpu/hppa1.1/hppatypes.h46
-rw-r--r--c/src/exec/score/cpu/hppa1.1/rtems.s53
-rw-r--r--c/src/exec/score/cpu/i386/Makefile.in86
-rw-r--r--c/src/exec/score/cpu/i386/asm.h143
-rw-r--r--c/src/exec/score/cpu/i386/cpu.c177
-rw-r--r--c/src/exec/score/cpu/i386/cpu.h399
-rw-r--r--c/src/exec/score/cpu/i386/cpu_asm.s660
-rw-r--r--c/src/exec/score/cpu/i386/i386.h474
-rw-r--r--c/src/exec/score/cpu/i386/i386types.h58
-rw-r--r--c/src/exec/score/cpu/i386/rtems.s31
-rw-r--r--c/src/exec/score/cpu/i960/Makefile.in86
-rw-r--r--c/src/exec/score/cpu/i960/asm.h110
-rw-r--r--c/src/exec/score/cpu/i960/cpu.c155
-rw-r--r--c/src/exec/score/cpu/i960/cpu.h459
-rw-r--r--c/src/exec/score/cpu/i960/cpu_asm.s199
-rw-r--r--c/src/exec/score/cpu/i960/i960.h265
-rw-r--r--c/src/exec/score/cpu/i960/i960types.h58
-rw-r--r--c/src/exec/score/cpu/i960/rtems.s25
-rw-r--r--c/src/exec/score/cpu/m68k/Makefile.in75
-rw-r--r--c/src/exec/score/cpu/m68k/asm.h132
-rw-r--r--c/src/exec/score/cpu/m68k/cpu.c179
-rw-r--r--c/src/exec/score/cpu/m68k/cpu.h535
-rw-r--r--c/src/exec/score/cpu/m68k/cpu_asm.s232
-rw-r--r--c/src/exec/score/cpu/m68k/m68302.h608
-rw-r--r--c/src/exec/score/cpu/m68k/m68360.h880
-rw-r--r--c/src/exec/score/cpu/m68k/m68k.h269
-rw-r--r--c/src/exec/score/cpu/m68k/m68ktypes.h58
-rw-r--r--c/src/exec/score/cpu/m68k/qsm.h209
-rw-r--r--c/src/exec/score/cpu/m68k/rtems.s46
-rw-r--r--c/src/exec/score/cpu/m68k/sim.h342
-rw-r--r--c/src/exec/score/cpu/mips/asm.h102
-rw-r--r--c/src/exec/score/cpu/mips/cpu.c219
-rw-r--r--c/src/exec/score/cpu/mips/cpu_asm.S972
-rw-r--r--c/src/exec/score/cpu/mips/cpu_asm.h115
-rw-r--r--c/src/exec/score/cpu/mips/idtcpu.h440
-rw-r--r--c/src/exec/score/cpu/mips/idtmon.h171
-rw-r--r--c/src/exec/score/cpu/mips/iregdef.h325
-rw-r--r--c/src/exec/score/cpu/mips/rtems.c53
-rw-r--r--c/src/exec/score/cpu/mips64orion/Makefile.in81
-rw-r--r--c/src/exec/score/cpu/mips64orion/asm.h102
-rw-r--r--c/src/exec/score/cpu/mips64orion/cpu.c219
-rw-r--r--c/src/exec/score/cpu/mips64orion/cpu.h957
-rw-r--r--c/src/exec/score/cpu/mips64orion/cpu_asm.S972
-rw-r--r--c/src/exec/score/cpu/mips64orion/cpu_asm.h115
-rw-r--r--c/src/exec/score/cpu/mips64orion/idtcpu.h440
-rw-r--r--c/src/exec/score/cpu/mips64orion/idtmon.h171
-rw-r--r--c/src/exec/score/cpu/mips64orion/iregdef.h325
-rw-r--r--c/src/exec/score/cpu/mips64orion/mips64orion.h74
-rw-r--r--c/src/exec/score/cpu/mips64orion/mipstypes.h73
-rw-r--r--c/src/exec/score/cpu/mips64orion/rtems.c53
-rw-r--r--c/src/exec/score/cpu/no_cpu/Makefile.in90
-rw-r--r--c/src/exec/score/cpu/no_cpu/asm.h101
-rw-r--r--c/src/exec/score/cpu/no_cpu/cpu.c162
-rw-r--r--c/src/exec/score/cpu/no_cpu/cpu.h866
-rw-r--r--c/src/exec/score/cpu/no_cpu/cpu_asm.c165
-rw-r--r--c/src/exec/score/cpu/no_cpu/cpu_asm.h70
-rw-r--r--c/src/exec/score/cpu/no_cpu/no_cpu.h56
-rw-r--r--c/src/exec/score/cpu/no_cpu/no_cputypes.h57
-rw-r--r--c/src/exec/score/cpu/no_cpu/rtems.c45
-rw-r--r--c/src/exec/score/cpu/powerpc/Makefile.in92
-rw-r--r--c/src/exec/score/cpu/powerpc/README71
-rw-r--r--c/src/exec/score/cpu/powerpc/TODO7
-rw-r--r--c/src/exec/score/cpu/powerpc/cpu.c264
-rw-r--r--c/src/exec/score/cpu/powerpc/cpu.h1027
-rw-r--r--c/src/exec/score/cpu/powerpc/cpu_asm.s749
-rw-r--r--c/src/exec/score/cpu/powerpc/irq_stub.s228
-rw-r--r--c/src/exec/score/cpu/powerpc/ppc.h296
-rw-r--r--c/src/exec/score/cpu/powerpc/ppctypes.h74
-rw-r--r--c/src/exec/score/cpu/powerpc/rtems.s132
-rw-r--r--c/src/exec/score/cpu/sparc/Makefile.in74
-rw-r--r--c/src/exec/score/cpu/sparc/README110
-rw-r--r--c/src/exec/score/cpu/sparc/asm.h123
-rw-r--r--c/src/exec/score/cpu/sparc/cpu.c409
-rw-r--r--c/src/exec/score/cpu/sparc/cpu.h1003
-rw-r--r--c/src/exec/score/cpu/sparc/cpu_asm.s709
-rw-r--r--c/src/exec/score/cpu/sparc/erc32.h521
-rw-r--r--c/src/exec/score/cpu/sparc/rtems.s58
-rw-r--r--c/src/exec/score/cpu/sparc/sparc.h253
-rw-r--r--c/src/exec/score/cpu/sparc/sparctypes.h64
-rw-r--r--c/src/exec/score/cpu/unix/Makefile.in90
-rw-r--r--c/src/exec/score/cpu/unix/cpu.c1105
-rw-r--r--c/src/exec/score/cpu/unix/cpu.h1060
-rw-r--r--c/src/exec/score/cpu/unix/unix.h61
-rw-r--r--c/src/exec/score/cpu/unix/unixtypes.h72
-rw-r--r--c/src/exec/score/headers/Makefile.in47
-rw-r--r--c/src/exec/score/headers/address.h31
-rw-r--r--c/src/exec/score/headers/apiext.h102
-rw-r--r--c/src/exec/score/headers/bitfield.h98
-rw-r--r--c/src/exec/score/headers/chain.h168
-rw-r--r--c/src/exec/score/headers/context.h134
-rw-r--r--c/src/exec/score/headers/copyrt.h42
-rw-r--r--c/src/exec/score/headers/coremsg.h267
-rw-r--r--c/src/exec/score/headers/coremutex.h172
-rw-r--r--c/src/exec/score/headers/coresem.h156
-rw-r--r--c/src/exec/score/headers/debug.h98
-rw-r--r--c/src/exec/score/headers/heap.h226
-rw-r--r--c/src/exec/score/headers/interr.h95
-rw-r--r--c/src/exec/score/headers/isr.h224
-rw-r--r--c/src/exec/score/headers/mpci.h412
-rw-r--r--c/src/exec/score/headers/mppkt.h101
-rw-r--r--c/src/exec/score/headers/object.h397
-rw-r--r--c/src/exec/score/headers/objectmp.h152
-rw-r--r--c/src/exec/score/headers/priority.h97
-rw-r--r--c/src/exec/score/headers/stack.h50
-rw-r--r--c/src/exec/score/headers/states.h84
-rw-r--r--c/src/exec/score/headers/sysstate.h67
-rw-r--r--c/src/exec/score/headers/system.h153
-rw-r--r--c/src/exec/score/headers/thread.h630
-rw-r--r--c/src/exec/score/headers/threadmp.h89
-rw-r--r--c/src/exec/score/headers/threadq.h301
-rw-r--r--c/src/exec/score/headers/tod.h277
-rw-r--r--c/src/exec/score/headers/tqdata.h90
-rw-r--r--c/src/exec/score/headers/userext.h213
-rw-r--r--c/src/exec/score/headers/watchdog.h194
-rw-r--r--c/src/exec/score/headers/wkspace.h71
-rw-r--r--c/src/exec/score/include/rtems/debug.h98
-rw-r--r--c/src/exec/score/include/rtems/score/Makefile.in47
-rw-r--r--c/src/exec/score/include/rtems/score/address.h31
-rw-r--r--c/src/exec/score/include/rtems/score/apiext.h102
-rw-r--r--c/src/exec/score/include/rtems/score/bitfield.h98
-rw-r--r--c/src/exec/score/include/rtems/score/chain.h168
-rw-r--r--c/src/exec/score/include/rtems/score/context.h134
-rw-r--r--c/src/exec/score/include/rtems/score/copyrt.h42
-rw-r--r--c/src/exec/score/include/rtems/score/coremsg.h267
-rw-r--r--c/src/exec/score/include/rtems/score/coremutex.h172
-rw-r--r--c/src/exec/score/include/rtems/score/coresem.h156
-rw-r--r--c/src/exec/score/include/rtems/score/heap.h226
-rw-r--r--c/src/exec/score/include/rtems/score/interr.h95
-rw-r--r--c/src/exec/score/include/rtems/score/isr.h224
-rw-r--r--c/src/exec/score/include/rtems/score/mpci.h412
-rw-r--r--c/src/exec/score/include/rtems/score/mppkt.h101
-rw-r--r--c/src/exec/score/include/rtems/score/object.h397
-rw-r--r--c/src/exec/score/include/rtems/score/objectmp.h152
-rw-r--r--c/src/exec/score/include/rtems/score/priority.h97
-rw-r--r--c/src/exec/score/include/rtems/score/stack.h50
-rw-r--r--c/src/exec/score/include/rtems/score/states.h84
-rw-r--r--c/src/exec/score/include/rtems/score/sysstate.h67
-rw-r--r--c/src/exec/score/include/rtems/score/thread.h630
-rw-r--r--c/src/exec/score/include/rtems/score/threadmp.h89
-rw-r--r--c/src/exec/score/include/rtems/score/threadq.h301
-rw-r--r--c/src/exec/score/include/rtems/score/tod.h277
-rw-r--r--c/src/exec/score/include/rtems/score/tqdata.h90
-rw-r--r--c/src/exec/score/include/rtems/score/userext.h213
-rw-r--r--c/src/exec/score/include/rtems/score/watchdog.h194
-rw-r--r--c/src/exec/score/include/rtems/score/wkspace.h71
-rw-r--r--c/src/exec/score/include/rtems/system.h153
-rw-r--r--c/src/exec/score/inline/Makefile.in31
-rw-r--r--c/src/exec/score/inline/address.inl120
-rw-r--r--c/src/exec/score/inline/chain.inl390
-rw-r--r--c/src/exec/score/inline/coremsg.inl260
-rw-r--r--c/src/exec/score/inline/coremutex.inl124
-rw-r--r--c/src/exec/score/inline/coresem.inl54
-rw-r--r--c/src/exec/score/inline/heap.inl274
-rw-r--r--c/src/exec/score/inline/isr.inl73
-rw-r--r--c/src/exec/score/inline/mppkt.inl58
-rw-r--r--c/src/exec/score/inline/object.inl244
-rw-r--r--c/src/exec/score/inline/objectmp.inl73
-rw-r--r--c/src/exec/score/inline/priority.inl247
-rw-r--r--c/src/exec/score/inline/rtems/score/Makefile.in31
-rw-r--r--c/src/exec/score/inline/rtems/score/address.inl120
-rw-r--r--c/src/exec/score/inline/rtems/score/chain.inl390
-rw-r--r--c/src/exec/score/inline/rtems/score/coremsg.inl260
-rw-r--r--c/src/exec/score/inline/rtems/score/coremutex.inl124
-rw-r--r--c/src/exec/score/inline/rtems/score/coresem.inl54
-rw-r--r--c/src/exec/score/inline/rtems/score/heap.inl274
-rw-r--r--c/src/exec/score/inline/rtems/score/isr.inl73
-rw-r--r--c/src/exec/score/inline/rtems/score/mppkt.inl58
-rw-r--r--c/src/exec/score/inline/rtems/score/object.inl244
-rw-r--r--c/src/exec/score/inline/rtems/score/objectmp.inl73
-rw-r--r--c/src/exec/score/inline/rtems/score/priority.inl247
-rw-r--r--c/src/exec/score/inline/rtems/score/stack.inl81
-rw-r--r--c/src/exec/score/inline/rtems/score/states.inl384
-rw-r--r--c/src/exec/score/inline/rtems/score/sysstate.inl154
-rw-r--r--c/src/exec/score/inline/rtems/score/thread.inl404
-rw-r--r--c/src/exec/score/inline/rtems/score/threadmp.inl61
-rw-r--r--c/src/exec/score/inline/rtems/score/tod.inl67
-rw-r--r--c/src/exec/score/inline/rtems/score/tqdata.inl73
-rw-r--r--c/src/exec/score/inline/rtems/score/userext.inl121
-rw-r--r--c/src/exec/score/inline/rtems/score/watchdog.inl324
-rw-r--r--c/src/exec/score/inline/rtems/score/wkspace.inl57
-rw-r--r--c/src/exec/score/inline/stack.inl81
-rw-r--r--c/src/exec/score/inline/states.inl384
-rw-r--r--c/src/exec/score/inline/sysstate.inl154
-rw-r--r--c/src/exec/score/inline/thread.inl404
-rw-r--r--c/src/exec/score/inline/threadmp.inl61
-rw-r--r--c/src/exec/score/inline/tod.inl67
-rw-r--r--c/src/exec/score/inline/tqdata.inl73
-rw-r--r--c/src/exec/score/inline/userext.inl121
-rw-r--r--c/src/exec/score/inline/watchdog.inl324
-rw-r--r--c/src/exec/score/inline/wkspace.inl57
-rw-r--r--c/src/exec/score/macros/Makefile.in31
-rw-r--r--c/src/exec/score/macros/README18
-rw-r--r--c/src/exec/score/macros/address.inl68
-rw-r--r--c/src/exec/score/macros/chain.inl200
-rw-r--r--c/src/exec/score/macros/coremsg.inl143
-rw-r--r--c/src/exec/score/macros/coremutex.inl77
-rw-r--r--c/src/exec/score/macros/coresem.inl40
-rw-r--r--c/src/exec/score/macros/heap.inl150
-rw-r--r--c/src/exec/score/macros/isr.inl48
-rw-r--r--c/src/exec/score/macros/mppkt.inl41
-rw-r--r--c/src/exec/score/macros/object.inl148
-rw-r--r--c/src/exec/score/macros/objectmp.inl50
-rw-r--r--c/src/exec/score/macros/priority.inl170
-rw-r--r--c/src/exec/score/macros/rtems/score/Makefile.in31
-rw-r--r--c/src/exec/score/macros/rtems/score/README18
-rw-r--r--c/src/exec/score/macros/rtems/score/address.inl68
-rw-r--r--c/src/exec/score/macros/rtems/score/chain.inl200
-rw-r--r--c/src/exec/score/macros/rtems/score/coremsg.inl143
-rw-r--r--c/src/exec/score/macros/rtems/score/coremutex.inl77
-rw-r--r--c/src/exec/score/macros/rtems/score/coresem.inl40
-rw-r--r--c/src/exec/score/macros/rtems/score/heap.inl150
-rw-r--r--c/src/exec/score/macros/rtems/score/isr.inl48
-rw-r--r--c/src/exec/score/macros/rtems/score/mppkt.inl41
-rw-r--r--c/src/exec/score/macros/rtems/score/object.inl148
-rw-r--r--c/src/exec/score/macros/rtems/score/objectmp.inl50
-rw-r--r--c/src/exec/score/macros/rtems/score/priority.inl170
-rw-r--r--c/src/exec/score/macros/rtems/score/stack.inl50
-rw-r--r--c/src/exec/score/macros/rtems/score/states.inl210
-rw-r--r--c/src/exec/score/macros/rtems/score/sysstate.inl90
-rw-r--r--c/src/exec/score/macros/rtems/score/thread.inl217
-rw-r--r--c/src/exec/score/macros/rtems/score/threadmp.inl50
-rw-r--r--c/src/exec/score/macros/rtems/score/tod.inl49
-rw-r--r--c/src/exec/score/macros/rtems/score/tqdata.inl50
-rw-r--r--c/src/exec/score/macros/rtems/score/userext.inl126
-rw-r--r--c/src/exec/score/macros/rtems/score/watchdog.inl172
-rw-r--r--c/src/exec/score/macros/rtems/score/wkspace.inl39
-rw-r--r--c/src/exec/score/macros/stack.inl50
-rw-r--r--c/src/exec/score/macros/states.inl210
-rw-r--r--c/src/exec/score/macros/sysstate.inl90
-rw-r--r--c/src/exec/score/macros/thread.inl217
-rw-r--r--c/src/exec/score/macros/threadmp.inl50
-rw-r--r--c/src/exec/score/macros/tod.inl49
-rw-r--r--c/src/exec/score/macros/tqdata.inl50
-rw-r--r--c/src/exec/score/macros/userext.inl126
-rw-r--r--c/src/exec/score/macros/watchdog.inl172
-rw-r--r--c/src/exec/score/macros/wkspace.inl39
-rw-r--r--c/src/exec/score/src/Makefile.in41
-rw-r--r--c/src/exec/score/src/apiext.c105
-rw-r--r--c/src/exec/score/src/chain.c202
-rw-r--r--c/src/exec/score/src/coremsg.c432
-rw-r--r--c/src/exec/score/src/coremutex.c330
-rw-r--r--c/src/exec/score/src/coresem.c184
-rw-r--r--c/src/exec/score/src/coretod.c238
-rw-r--r--c/src/exec/score/src/heap.c538
-rw-r--r--c/src/exec/score/src/interr.c61
-rw-r--r--c/src/exec/score/src/isr.c60
-rw-r--r--c/src/exec/score/src/mpci.c525
-rw-r--r--c/src/exec/score/src/object.c516
-rw-r--r--c/src/exec/score/src/objectmp.c275
-rw-r--r--c/src/exec/score/src/thread.c1395
-rw-r--r--c/src/exec/score/src/threadmp.c164
-rw-r--r--c/src/exec/score/src/threadq.c967
-rw-r--r--c/src/exec/score/src/tod.c238
-rw-r--r--c/src/exec/score/src/userext.c204
-rw-r--r--c/src/exec/score/src/watchdog.c273
-rw-r--r--c/src/exec/score/src/wkspace.c88
-rw-r--r--c/src/exec/score/tools/Makefile.in13
-rw-r--r--c/src/exec/score/tools/generic/Makefile.in33
-rw-r--r--c/src/exec/score/tools/hppa1.1/Makefile.in62
-rw-r--r--c/src/exec/score/tools/hppa1.1/genoffsets.c348
-rw-r--r--c/src/exec/score/tools/unix/Makefile.in61
-rw-r--r--c/src/exec/score/tools/unix/gensize.c116
-rw-r--r--c/src/exec/wrapup/Makefile.in17
-rw-r--r--c/src/exec/wrapup/posix/Makefile.in51
-rw-r--r--c/src/exec/wrapup/rtems/Makefile.in48
-rw-r--r--c/src/lib/Makefile.in17
-rw-r--r--c/src/lib/include/Makefile.in26
-rw-r--r--c/src/lib/include/clockdrv.h51
-rw-r--r--c/src/lib/include/console.h69
-rw-r--r--c/src/lib/include/iosupp.h44
-rw-r--r--c/src/lib/include/ringbuf.h53
-rw-r--r--c/src/lib/include/rtems/assoc.h42
-rw-r--r--c/src/lib/include/rtems/error.h38
-rw-r--r--c/src/lib/include/rtems/libcsupport.h43
-rw-r--r--c/src/lib/include/rtems/libio.h124
-rw-r--r--c/src/lib/include/spurious.h38
-rw-r--r--c/src/lib/include/sys/utsname.h49
-rw-r--r--c/src/lib/include/timerdrv.h40
-rw-r--r--c/src/lib/include/vmeintr.h58
-rw-r--r--c/src/lib/libbsp/Makefile.in20
-rw-r--r--c/src/lib/libbsp/README46
-rw-r--r--c/src/lib/libbsp/a29k/Makefile.in14
-rw-r--r--c/src/lib/libbsp/a29k/portsw/Makefile.in19
-rw-r--r--c/src/lib/libbsp/a29k/portsw/README71
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/Makefile.in58
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/concntl.h16
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/console.c302
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/serial.c217
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/serial.h8
-rw-r--r--c/src/lib/libbsp/a29k/portsw/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/a29k/portsw/include/bsp.h106
-rw-r--r--c/src/lib/libbsp/a29k/portsw/include/coverhd.h115
-rw-r--r--c/src/lib/libbsp/a29k/portsw/shmsupp/Makefile.in59
-rw-r--r--c/src/lib/libbsp/a29k/portsw/shmsupp/addrconv.c35
-rw-r--r--c/src/lib/libbsp/a29k/portsw/shmsupp/getcfg.c81
-rw-r--r--c/src/lib/libbsp/a29k/portsw/shmsupp/lock.c90
-rw-r--r--c/src/lib/libbsp/a29k/portsw/shmsupp/mpisr.c51
-rw-r--r--c/src/lib/libbsp/a29k/portsw/start/Makefile.in53
-rw-r--r--c/src/lib/libbsp/a29k/portsw/start/amd.ah517
-rw-r--r--c/src/lib/libbsp/a29k/portsw/start/pswmacro.ah442
-rw-r--r--c/src/lib/libbsp/a29k/portsw/start/register.ah214
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/Makefile.in59
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/bspclean.c30
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/bspstart.c293
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/iface.c96
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/main.c39
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/ramlink11
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/romlink146
-rw-r--r--c/src/lib/libbsp/a29k/portsw/startup/setvec.c49
-rw-r--r--c/src/lib/libbsp/a29k/portsw/times195
-rw-r--r--c/src/lib/libbsp/a29k/portsw/wrapup/Makefile.in50
-rw-r--r--c/src/lib/libbsp/hppa1.1/Makefile.in14
-rw-r--r--c/src/lib/libbsp/hppa1.1/pxfl/Makefile.in49
-rw-r--r--c/src/lib/libbsp/hppa1.1/pxfl/README8
-rw-r--r--c/src/lib/libbsp/hppa1.1/pxfl/floss-bsp.h11
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/Makefile.in16
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/bsp_specs34
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/include/Makefile.in40
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h121
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/include/ttydrv.h54
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/Makefile.in54
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/README9
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/addrconv.c30
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c89
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c51
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/lock.c75
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/mpisr.c27
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/start/start.s169
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/startup/Makefile.in61
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/startup/bspclean.c36
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c439
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c66
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/times7
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/tools/Makefile.in51
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/tools/print_dump.c325
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/tty/Makefile.in54
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/tty/tty.c247
-rw-r--r--c/src/lib/libbsp/hppa1.1/simhppa/wrapup/Makefile.in53
-rw-r--r--c/src/lib/libbsp/i386/Makefile.in14
-rw-r--r--c/src/lib/libbsp/i386/force386/Makefile.in15
-rw-r--r--c/src/lib/libbsp/i386/force386/bsp_specs34
-rw-r--r--c/src/lib/libbsp/i386/force386/clock/Makefile.in54
-rw-r--r--c/src/lib/libbsp/i386/force386/clock/ckinit.c135
-rw-r--r--c/src/lib/libbsp/i386/force386/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/i386/force386/console/console.c286
-rw-r--r--c/src/lib/libbsp/i386/force386/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/i386/force386/include/bsp.h176
-rw-r--r--c/src/lib/libbsp/i386/force386/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/i386/force386/shmsupp/Makefile.in54
-rw-r--r--c/src/lib/libbsp/i386/force386/shmsupp/addrconv.c32
-rw-r--r--c/src/lib/libbsp/i386/force386/shmsupp/getcfg.c73
-rw-r--r--c/src/lib/libbsp/i386/force386/shmsupp/lock.c83
-rw-r--r--c/src/lib/libbsp/i386/force386/shmsupp/mpisr.c31
-rw-r--r--c/src/lib/libbsp/i386/force386/startup/Makefile.in58
-rw-r--r--c/src/lib/libbsp/i386/force386/startup/bspstart.c225
-rw-r--r--c/src/lib/libbsp/i386/force386/startup/exit.c29
-rw-r--r--c/src/lib/libbsp/i386/force386/startup/ldsegs.s86
-rw-r--r--c/src/lib/libbsp/i386/force386/startup/linkcmds44
-rw-r--r--c/src/lib/libbsp/i386/force386/startup/setvec.c59
-rw-r--r--c/src/lib/libbsp/i386/force386/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/i386/force386/timer/timer.c96
-rw-r--r--c/src/lib/libbsp/i386/force386/timer/timerisr.s34
-rw-r--r--c/src/lib/libbsp/i386/force386/times191
-rw-r--r--c/src/lib/libbsp/i386/force386/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/i386/go32/Makefile.in15
-rw-r--r--c/src/lib/libbsp/i386/go32/README38
-rw-r--r--c/src/lib/libbsp/i386/go32/bsp_specs34
-rw-r--r--c/src/lib/libbsp/i386/go32/clock/Makefile.in54
-rw-r--r--c/src/lib/libbsp/i386/go32/clock/ckinit.c199
-rw-r--r--c/src/lib/libbsp/i386/go32/clock/rtc.c212
-rw-r--r--c/src/lib/libbsp/i386/go32/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/i386/go32/console/console.c257
-rw-r--r--c/src/lib/libbsp/i386/go32/console/inch.c162
-rw-r--r--c/src/lib/libbsp/i386/go32/console/outch.c151
-rw-r--r--c/src/lib/libbsp/i386/go32/include/Makefile.in34
-rw-r--r--c/src/lib/libbsp/i386/go32/include/bsp.h172
-rw-r--r--c/src/lib/libbsp/i386/go32/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/i386/go32/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/i386/go32/startup/bspstart.c234
-rw-r--r--c/src/lib/libbsp/i386/go32/startup/exit.c30
-rw-r--r--c/src/lib/libbsp/i386/go32/startup/setvec.c46
-rw-r--r--c/src/lib/libbsp/i386/go32/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/i386/go32/timer/timer.c144
-rw-r--r--c/src/lib/libbsp/i386/go32/timer/timerisr.s41
-rw-r--r--c/src/lib/libbsp/i386/go32/times_i486dx191
-rw-r--r--c/src/lib/libbsp/i386/go32/times_p5196
-rw-r--r--c/src/lib/libbsp/i386/go32/wrapup/Makefile.in50
-rw-r--r--c/src/lib/libbsp/i386/i386ex/Makefile.in18
-rw-r--r--c/src/lib/libbsp/i386/i386ex/README8
-rw-r--r--c/src/lib/libbsp/i386/i386ex/bsp_specs34
-rw-r--r--c/src/lib/libbsp/i386/i386ex/clock/Makefile.in59
-rw-r--r--c/src/lib/libbsp/i386/i386ex/clock/ckinit.c152
-rw-r--r--c/src/lib/libbsp/i386/i386ex/console/Makefile.in57
-rw-r--r--c/src/lib/libbsp/i386/i386ex/console/console.c280
-rw-r--r--c/src/lib/libbsp/i386/i386ex/include/Makefile.in34
-rw-r--r--c/src/lib/libbsp/i386/i386ex/include/bsp.h146
-rw-r--r--c/src/lib/libbsp/i386/i386ex/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/Makefile.in64
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/README25
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/bspstart.c229
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/linkcmds106
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/setvec.c59
-rw-r--r--c/src/lib/libbsp/i386/i386ex/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/i386/i386ex/timer/timer.c99
-rw-r--r--c/src/lib/libbsp/i386/i386ex/timer/timerisr.s34
-rw-r--r--c/src/lib/libbsp/i386/i386ex/wrapup/Makefile.in50
-rw-r--r--c/src/lib/libbsp/i960/Makefile.in14
-rw-r--r--c/src/lib/libbsp/i960/cvme961/Makefile.in15
-rw-r--r--c/src/lib/libbsp/i960/cvme961/bsp_specs34
-rw-r--r--c/src/lib/libbsp/i960/cvme961/clock/Makefile.in53
-rw-r--r--c/src/lib/libbsp/i960/cvme961/clock/ckinit.c141
-rw-r--r--c/src/lib/libbsp/i960/cvme961/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/i960/cvme961/console/console.c212
-rw-r--r--c/src/lib/libbsp/i960/cvme961/include/Makefile.in37
-rw-r--r--c/src/lib/libbsp/i960/cvme961/include/bsp.h149
-rw-r--r--c/src/lib/libbsp/i960/cvme961/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/i960/cvme961/shmsupp/Makefile.in54
-rw-r--r--c/src/lib/libbsp/i960/cvme961/shmsupp/addrconv.c37
-rw-r--r--c/src/lib/libbsp/i960/cvme961/shmsupp/getcfg.c98
-rw-r--r--c/src/lib/libbsp/i960/cvme961/shmsupp/lock.c76
-rw-r--r--c/src/lib/libbsp/i960/cvme961/shmsupp/mpisr.c70
-rw-r--r--c/src/lib/libbsp/i960/cvme961/start/Makefile.in53
-rw-r--r--c/src/lib/libbsp/i960/cvme961/startup/Makefile.in55
-rw-r--r--c/src/lib/libbsp/i960/cvme961/startup/bspclean.c36
-rw-r--r--c/src/lib/libbsp/i960/cvme961/startup/bspstart.c245
-rw-r--r--c/src/lib/libbsp/i960/cvme961/startup/exit.c38
-rw-r--r--c/src/lib/libbsp/i960/cvme961/startup/linkcmds48
-rw-r--r--c/src/lib/libbsp/i960/cvme961/startup/setvec.c145
-rw-r--r--c/src/lib/libbsp/i960/cvme961/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/i960/cvme961/timer/timer.c107
-rw-r--r--c/src/lib/libbsp/i960/cvme961/timer/timerisr.s65
-rw-r--r--c/src/lib/libbsp/i960/cvme961/times191
-rw-r--r--c/src/lib/libbsp/i960/cvme961/wrapup/Makefile.in50
-rw-r--r--c/src/lib/libbsp/m68k/Makefile.in14
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/Makefile.in15
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/clock/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c162
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/console/console.c222
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/include/bsp.h190
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/spurious/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/spurious/spinit.c48
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/startup/Makefile.in52
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c252
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/startup/linkcmds48
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/startup/vmeintr.c60
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/timer/timer.c105
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/timer/timerisr.s38
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/times195
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/efi332/Makefile.in15
-rw-r--r--c/src/lib/libbsp/m68k/efi332/README36
-rw-r--r--c/src/lib/libbsp/m68k/efi332/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/efi332/clock/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi332/clock/ckinit.c137
-rw-r--r--c/src/lib/libbsp/m68k/efi332/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi332/console/console.c394
-rw-r--r--c/src/lib/libbsp/m68k/efi332/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/efi332/include/bsp.h164
-rw-r--r--c/src/lib/libbsp/m68k/efi332/include/coverhd.h106
-rw-r--r--c/src/lib/libbsp/m68k/efi332/include/efi332.h54
-rw-r--r--c/src/lib/libbsp/m68k/efi332/misc/dotests15
-rw-r--r--c/src/lib/libbsp/m68k/efi332/misc/gdbinit6813
-rw-r--r--c/src/lib/libbsp/m68k/efi332/misc/interr.c95
-rw-r--r--c/src/lib/libbsp/m68k/efi332/spurious/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi332/spurious/spinit.c88
-rw-r--r--c/src/lib/libbsp/m68k/efi332/start/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/efi332/start/start.c187
-rw-r--r--c/src/lib/libbsp/m68k/efi332/start332/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/efi332/start332/start332.c187
-rw-r--r--c/src/lib/libbsp/m68k/efi332/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/efi332/startup/bspclean.c28
-rw-r--r--c/src/lib/libbsp/m68k/efi332/startup/bspstart.c227
-rw-r--r--c/src/lib/libbsp/m68k/efi332/startup/except_vect_332_ROM.S290
-rw-r--r--c/src/lib/libbsp/m68k/efi332/startup/linkcmds101
-rw-r--r--c/src/lib/libbsp/m68k/efi332/startup/linkcmds_ROM110
-rw-r--r--c/src/lib/libbsp/m68k/efi332/timer/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi332/timer/timer.c84
-rw-r--r--c/src/lib/libbsp/m68k/efi332/times193
-rw-r--r--c/src/lib/libbsp/m68k/efi332/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/Makefile.in15
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/README41
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/clock/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/clock/ckinit.c157
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/console/console.c366
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/include/16550.h110
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/include/DP8570A.h275
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/include/Makefile.in33
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/include/bsp.h170
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/include/coverhd.h106
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/include/efi68k.h34
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/spurious/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/spurious/spinit.c85
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/start/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/start/start.c71
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/start68k/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/start68k/start68k.c71
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/bspclean.c28
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/bspstart.c236
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/efi68k_tcp.c238
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/efi68k_wd.c45
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/linkcmds109
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/m68k-stub.c782
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/startup/setvec.c45
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/timer/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/timer/timer.c141
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/times193
-rw-r--r--c/src/lib/libbsp/m68k/efi68k/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/Makefile.in19
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/README154
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/clock/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c162
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/console/console.c304
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/include/bsp.h125
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/include/coverhd.h115
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/start/Makefile.in56
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/start/start302.s267
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/start302/Makefile.in56
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/start302/start302.s267
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/startup/bspclean.c26
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c251
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/startup/linkcmds46
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/timer/timer.c130
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/timer/timerisr.s28
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/times193
-rw-r--r--c/src/lib/libbsp/m68k/gen68302/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/Makefile.in19
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/README302
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/clock/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c158
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/console/console.c308
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/include/bsp.h150
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/include/coverhd.h76
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/include/sio.h62
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/start/Makefile.in56
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/start/start360.s424
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/start360/Makefile.in56
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/start360/start360.s424
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/Makefile.in55
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/alloc360.c96
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/bspclean.c27
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/bspstart.c247
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/init68360.c534
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/linkcmds117
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp122
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom150
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/timer/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/timer/timer.c95
-rw-r--r--c/src/lib/libbsp/m68k/gen68360/wrapup/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/idp/Makefile.in15
-rw-r--r--c/src/lib/libbsp/m68k/idp/README35
-rw-r--r--c/src/lib/libbsp/m68k/idp/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/idp/clock/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/idp/clock/ckinit.c199
-rw-r--r--c/src/lib/libbsp/m68k/idp/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/idp/console/console.c284
-rw-r--r--c/src/lib/libbsp/m68k/idp/console/duart.c174
-rw-r--r--c/src/lib/libbsp/m68k/idp/console/leds.c83
-rw-r--r--c/src/lib/libbsp/m68k/idp/console/mc68ec.c21
-rw-r--r--c/src/lib/libbsp/m68k/idp/include/Makefile.in33
-rw-r--r--c/src/lib/libbsp/m68k/idp/include/README13
-rw-r--r--c/src/lib/libbsp/m68k/idp/include/bsp.h97
-rw-r--r--c/src/lib/libbsp/m68k/idp/include/coverhd.h106
-rw-r--r--c/src/lib/libbsp/m68k/idp/include/leds.h27
-rw-r--r--c/src/lib/libbsp/m68k/idp/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/idp/startup/bspstart.c256
-rw-r--r--c/src/lib/libbsp/m68k/idp/startup/linkcmds46
-rw-r--r--c/src/lib/libbsp/m68k/idp/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/m68k/idp/timer/timer.c120
-rw-r--r--c/src/lib/libbsp/m68k/idp/timer/timerisr.s38
-rw-r--r--c/src/lib/libbsp/m68k/idp/times193
-rw-r--r--c/src/lib/libbsp/m68k/idp/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/Makefile.in15
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/clock/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c173
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/console/console.c224
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/include/bsp.h162
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/shmsupp/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/shmsupp/addrconv.c32
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/shmsupp/getcfg.c85
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/shmsupp/lock.c75
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/shmsupp/mpisr.c42
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/startup/bspclean.c46
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c239
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/startup/linkcmds48
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/timer/timer.c107
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/timer/timerisr.s39
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/times191
-rw-r--r--c/src/lib/libbsp/m68k/mvme136/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/Makefile.in15
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/README86
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/clock/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/clock/ckinit.c142
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/console/console.c258
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/include/bsp.h189
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/startup/bspclean.c45
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/startup/bspstart.c245
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/startup/linkcmds52
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/timer/timer.c84
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/timer/timerisr.s28
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/times194
-rw-r--r--c/src/lib/libbsp/m68k/mvme147/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/Makefile.in16
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/README92
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/clock/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/include/bsp.h253
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/shmsupp/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/shmsupp/addrconv.c36
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/shmsupp/getcfg.c87
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/shmsupp/lock.c75
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/shmsupp/mpisr.c46
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/startup/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/startup/bspstart.c305
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds52
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/times194
-rw-r--r--c/src/lib/libbsp/m68k/mvme147s/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/Makefile.in19
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/README151
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/bsp_specs34
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/clock/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c146
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/console/console.c256
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/include/bsp.h300
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/include/coverhd.h104
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/include/page_table.h45
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/startup/Makefile.in54
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/startup/bspclean.c56
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c257
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/startup/linkcmds50
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/startup/page_table.c202
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/timer/timer.c93
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/timer/timerisr.s47
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/times193
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/tools/Makefile.in52
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/tools/sload.c511
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/m68k/shared/setvec.c39
-rw-r--r--c/src/lib/libbsp/mips/README3
-rw-r--r--c/src/lib/libbsp/mips/p4000/README47
-rw-r--r--c/src/lib/libbsp/mips/p4000/bsp_specs34
-rw-r--r--c/src/lib/libbsp/mips/p4000/console/console.c276
-rw-r--r--c/src/lib/libbsp/mips/p4000/console/led.S23
-rw-r--r--c/src/lib/libbsp/mips/p4000/include/bsp.h132
-rw-r--r--c/src/lib/libbsp/mips/p4000/include/coverhd.h116
-rw-r--r--c/src/lib/libbsp/mips/p4000/liblnk/lnklib.S62
-rw-r--r--c/src/lib/libbsp/mips/p4000/start/start.S299
-rw-r--r--c/src/lib/libbsp/mips/p4000/startup/bspclean.c35
-rw-r--r--c/src/lib/libbsp/mips/p4000/startup/ghlinkcmds15
-rw-r--r--c/src/lib/libbsp/mips/p4000/startup/idtmem.S938
-rw-r--r--c/src/lib/libbsp/mips/p4000/startup/idttlb.S390
-rw-r--r--c/src/lib/libbsp/mips/p4000/startup/inittlb.c16
-rw-r--r--c/src/lib/libbsp/mips/p4000/startup/linkcmds72
-rw-r--r--c/src/lib/libbsp/mips/p4000/startup/setvec.c53
-rw-r--r--c/src/lib/libbsp/mips/p4000/times200
-rw-r--r--c/src/lib/libbsp/mips64orion/Makefile.in14
-rw-r--r--c/src/lib/libbsp/mips64orion/README3
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/README47
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/bsp_specs34
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/console/Makefile.in58
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/console/console.c276
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/console/led.S23
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/include/bsp.h132
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/include/coverhd.h116
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/liblnk/Makefile.in58
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/liblnk/lnklib.S62
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/start/Makefile.in53
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/start/start.S299
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/Makefile.in61
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/bspclean.c35
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/ghlinkcmds15
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/idtmem.S938
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/idttlb.S390
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/inittlb.c16
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/linkcmds72
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/startup/setvec.c53
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/times200
-rw-r--r--c/src/lib/libbsp/mips64orion/p4000/wrapup/Makefile.in52
-rw-r--r--c/src/lib/libbsp/no_cpu/Makefile.in14
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/Makefile.in19
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/README69
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/clock/Makefile.in58
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c191
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/console/Makefile.in58
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/console/console.c223
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h105
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/include/coverhd.h115
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/Makefile.in59
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/addrconv.c31
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/getcfg.c77
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/lock.c86
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/mpisr.c47
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/startup/Makefile.in60
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/startup/bspclean.c26
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c255
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/startup/linkcmds46
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/startup/main.c38
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/startup/setvec.c44
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/timer/Makefile.in60
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/timer/timer.c105
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/timer/timerisr.c37
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/times194
-rw-r--r--c/src/lib/libbsp/no_cpu/no_bsp/wrapup/Makefile.in48
-rw-r--r--c/src/lib/libbsp/powerpc/Makefile.in14
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/Makefile.in19
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/README50
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/bsp_specs34
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/dlentry/Makefile.in58
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/dlentry/dlentry.s251
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/flashentry/Makefile.in58
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/flashentry/flashentry.s289
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/include/Makefile.in34
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/include/bsp.h154
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/include/coverhd.h135
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/startup/Makefile.in55
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/startup/bspclean.c44
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c276
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/startup/linkcmds115
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/startup/setvec.c58
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/times197
-rw-r--r--c/src/lib/libbsp/powerpc/papyrus/wrapup/Makefile.in55
-rw-r--r--c/src/lib/libbsp/shared/sbrk.c32
-rw-r--r--c/src/lib/libbsp/shmdr/Makefile.in59
-rw-r--r--c/src/lib/libbsp/shmdr/README9
-rw-r--r--c/src/lib/libbsp/shmdr/addlq.c43
-rw-r--r--c/src/lib/libbsp/shmdr/cnvpkt.c42
-rw-r--r--c/src/lib/libbsp/shmdr/dump.c51
-rw-r--r--c/src/lib/libbsp/shmdr/fatal.c39
-rw-r--r--c/src/lib/libbsp/shmdr/getlq.c48
-rw-r--r--c/src/lib/libbsp/shmdr/getpkt.c36
-rw-r--r--c/src/lib/libbsp/shmdr/init.c254
-rw-r--r--c/src/lib/libbsp/shmdr/initlq.c35
-rw-r--r--c/src/lib/libbsp/shmdr/intr.c58
-rw-r--r--c/src/lib/libbsp/shmdr/mpci.h59
-rw-r--r--c/src/lib/libbsp/shmdr/mpisr.c23
-rw-r--r--c/src/lib/libbsp/shmdr/poll.c53
-rw-r--r--c/src/lib/libbsp/shmdr/receive.c44
-rw-r--r--c/src/lib/libbsp/shmdr/retpkt.c32
-rw-r--r--c/src/lib/libbsp/shmdr/send.c61
-rw-r--r--c/src/lib/libbsp/shmdr/setckvec.c34
-rw-r--r--c/src/lib/libbsp/shmdr/shm.h539
-rw-r--r--c/src/lib/libbsp/shmdr/shm_driver.h539
-rw-r--r--c/src/lib/libbsp/sparc/Makefile.in14
-rw-r--r--c/src/lib/libbsp/sparc/erc32/Makefile.in16
-rw-r--r--c/src/lib/libbsp/sparc/erc32/README80
-rw-r--r--c/src/lib/libbsp/sparc/erc32/bsp_specs34
-rw-r--r--c/src/lib/libbsp/sparc/erc32/clock/Makefile.in59
-rw-r--r--c/src/lib/libbsp/sparc/erc32/clock/ckinit.c262
-rw-r--r--c/src/lib/libbsp/sparc/erc32/console/Makefile.in58
-rw-r--r--c/src/lib/libbsp/sparc/erc32/console/console.c609
-rw-r--r--c/src/lib/libbsp/sparc/erc32/include/Makefile.in34
-rw-r--r--c/src/lib/libbsp/sparc/erc32/include/bsp.h181
-rw-r--r--c/src/lib/libbsp/sparc/erc32/include/coverhd.h111
-rw-r--r--c/src/lib/libbsp/sparc/erc32/start/Makefile.in53
-rw-r--r--c/src/lib/libbsp/sparc/erc32/start/startsis.s309
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startsis/Makefile.in53
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startsis/startsis.s309
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startup/Makefile.in65
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startup/bspclean.c37
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startup/bspstart.c377
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startup/linkcmds132
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startup/setvec.c63
-rw-r--r--c/src/lib/libbsp/sparc/erc32/startup/spurious.c164
-rw-r--r--c/src/lib/libbsp/sparc/erc32/timer/Makefile.in58
-rw-r--r--c/src/lib/libbsp/sparc/erc32/timer/timer.c89
-rw-r--r--c/src/lib/libbsp/sparc/erc32/times193
-rw-r--r--c/src/lib/libbsp/sparc/erc32/tools/Makefile.in25
-rw-r--r--c/src/lib/libbsp/sparc/erc32/wrapup/Makefile.in53
-rw-r--r--c/src/lib/libbsp/unix/Makefile.in14
-rw-r--r--c/src/lib/libbsp/unix/posix/Makefile.in25
-rw-r--r--c/src/lib/libbsp/unix/posix/README18
-rw-r--r--c/src/lib/libbsp/unix/posix/clock/Makefile.in54
-rw-r--r--c/src/lib/libbsp/unix/posix/clock/clock.c112
-rw-r--r--c/src/lib/libbsp/unix/posix/console/Makefile.in53
-rw-r--r--c/src/lib/libbsp/unix/posix/console/console.c95
-rw-r--r--c/src/lib/libbsp/unix/posix/include/Makefile.in32
-rw-r--r--c/src/lib/libbsp/unix/posix/include/bsp.h106
-rw-r--r--c/src/lib/libbsp/unix/posix/include/coverhd.h111
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/Makefile.in54
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/README9
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c30
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c75
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/intr.c34
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/lock.c72
-rw-r--r--c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c32
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/Makefile.in65
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/bspclean.c41
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/bspstart.c368
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/exit.c27
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/no-ctor.c16
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/rtems-ctor.cc116
-rw-r--r--c/src/lib/libbsp/unix/posix/startup/setvec.c47
-rw-r--r--c/src/lib/libbsp/unix/posix/timer/Makefile.in54
-rw-r--r--c/src/lib/libbsp/unix/posix/timer/timer.c74
-rw-r--r--c/src/lib/libbsp/unix/posix/times10
-rw-r--r--c/src/lib/libbsp/unix/posix/tools/Makefile.in30
-rw-r--r--c/src/lib/libbsp/unix/posix/wrapup/Makefile.in64
-rw-r--r--c/src/lib/libc/Makefile.in62
-rw-r--r--c/src/lib/libc/README37
-rw-r--r--c/src/lib/libc/__brk.c44
-rw-r--r--c/src/lib/libc/__gettod.c103
-rw-r--r--c/src/lib/libc/__times.c65
-rw-r--r--c/src/lib/libc/assoc.c260
-rw-r--r--c/src/lib/libc/assoc.h42
-rw-r--r--c/src/lib/libc/error.c209
-rw-r--r--c/src/lib/libc/error.h38
-rw-r--r--c/src/lib/libc/hosterr.c43
-rw-r--r--c/src/lib/libc/internal.h41
-rw-r--r--c/src/lib/libc/libcsupport.h43
-rw-r--r--c/src/lib/libc/libio.c532
-rw-r--r--c/src/lib/libc/libio.h124
-rw-r--r--c/src/lib/libc/malloc.c400
-rw-r--r--c/src/lib/libc/newlibc.c430
-rw-r--r--c/src/lib/libc/newlibif.c90
-rw-r--r--c/src/lib/libc/no_libc.c55
-rw-r--r--c/src/lib/libc/support.c52
-rw-r--r--c/src/lib/libc/syscalls.c102
-rw-r--r--c/src/lib/libc/unixlibc.c23
-rw-r--r--c/src/lib/libc/utsname.c57
-rw-r--r--c/src/lib/libcpu/Makefile.in13
-rw-r--r--c/src/lib/libcpu/README14
-rw-r--r--c/src/lib/libcpu/hppa1.1/Makefile.in13
-rw-r--r--c/src/lib/libcpu/hppa1.1/clock/Makefile.in59
-rw-r--r--c/src/lib/libcpu/hppa1.1/clock/clock.c267
-rw-r--r--c/src/lib/libcpu/hppa1.1/include/Makefile.in20
-rw-r--r--c/src/lib/libcpu/hppa1.1/milli/Makefile.in59
-rw-r--r--c/src/lib/libcpu/hppa1.1/milli/milli.s1998
-rw-r--r--c/src/lib/libcpu/hppa1.1/runway/Makefile.in22
-rw-r--r--c/src/lib/libcpu/hppa1.1/runway/runway.h37
-rw-r--r--c/src/lib/libcpu/hppa1.1/semaphore/Makefile.in52
-rw-r--r--c/src/lib/libcpu/hppa1.1/semaphore/semaphore.c294
-rw-r--r--c/src/lib/libcpu/hppa1.1/semaphore/semaphore.h70
-rw-r--r--c/src/lib/libcpu/hppa1.1/timer/Makefile.in59
-rw-r--r--c/src/lib/libcpu/hppa1.1/timer/timer.c63
-rw-r--r--c/src/lib/libcpu/m68k/Makefile.in13
-rw-r--r--c/src/lib/libcpu/m68k/m68040/Makefile.in13
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/Makefile.in63
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/README40
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/bindec.s920
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/binstr.s140
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/bugfix.s496
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/decbin.s506
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/do_func.s559
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/fpsp.defs348
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/gen_except.s468
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/get_op.s676
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/kernel_ex.s494
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/res_func.s2040
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/round.s649
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/rtems_fpsp.c81
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/rtems_skel.s397
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/sacos.s115
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/sasin.s104
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/satan.s478
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/satanh.s104
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/scale.s371
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s132
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/setox.s865
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s141
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/sint.s247
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/slog2.s188
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/slogn.s592
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.s162
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/srem_mod.s422
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/ssin.s746
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/ssinh.s135
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/stan.s455
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/stanh.s185
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/sto_res.s98
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/stwotox.s427
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/tbldo.s554
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/util.s748
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_bsun.s47
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_fline.s104
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_operr.s356
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_ovfl.s186
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_snan.s277
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_store.s256
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_unfl.s269
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s77
-rw-r--r--c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s83
-rw-r--r--c/src/lib/libcpu/mips/clock/ckinit.c249
-rw-r--r--c/src/lib/libcpu/mips/clock/clock.S45
-rw-r--r--c/src/lib/libcpu/mips/clock/clock.h25
-rw-r--r--c/src/lib/libcpu/mips/timer/gettime.S35
-rw-r--r--c/src/lib/libcpu/mips/timer/timer.c140
-rw-r--r--c/src/lib/libcpu/mips64orion/Makefile.in13
-rw-r--r--c/src/lib/libcpu/mips64orion/clock/Makefile.in58
-rw-r--r--c/src/lib/libcpu/mips64orion/clock/ckinit.c249
-rw-r--r--c/src/lib/libcpu/mips64orion/clock/clock.S45
-rw-r--r--c/src/lib/libcpu/mips64orion/clock/clock.h25
-rw-r--r--c/src/lib/libcpu/mips64orion/include/Makefile.in20
-rw-r--r--c/src/lib/libcpu/mips64orion/timer/Makefile.in60
-rw-r--r--c/src/lib/libcpu/mips64orion/timer/gettime.S35
-rw-r--r--c/src/lib/libcpu/mips64orion/timer/timer.c140
-rw-r--r--c/src/lib/libcpu/powerpc/Makefile.in13
-rw-r--r--c/src/lib/libcpu/powerpc/README13
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/Makefile.in13
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/README22
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/clock/Makefile.in59
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/clock/clock.c265
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/console/Makefile.in58
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/console/console.c387
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/include/Makefile.in20
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/timer/Makefile.in59
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/timer/timer.c98
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/vectors/Makefile.in58
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/vectors/README25
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/vectors/align_h.s434
-rw-r--r--c/src/lib/libcpu/powerpc/ppc403/vectors/vectors.s299
-rw-r--r--c/src/lib/libcpu/sparc/Makefile.in13
-rw-r--r--c/src/lib/libcpu/sparc/include/erc32.h521
-rw-r--r--c/src/lib/libcpu/sparc/reg_win/Makefile.in59
-rw-r--r--c/src/lib/libcpu/sparc/reg_win/window.s257
-rw-r--r--c/src/lib/libmisc/Makefile.in13
-rw-r--r--c/src/lib/libmisc/README16
-rw-r--r--c/src/lib/libmisc/assoc/Makefile.in51
-rw-r--r--c/src/lib/libmisc/assoc/assoc.c260
-rw-r--r--c/src/lib/libmisc/assoc/assoc.h42
-rw-r--r--c/src/lib/libmisc/cpuuse/Makefile.in53
-rw-r--r--c/src/lib/libmisc/cpuuse/README41
-rw-r--r--c/src/lib/libmisc/cpuuse/cpuuse.c142
-rw-r--r--c/src/lib/libmisc/cpuuse/cpuuse.h41
-rw-r--r--c/src/lib/libmisc/cpuuse/internal.h96
-rw-r--r--c/src/lib/libmisc/error/Makefile.in51
-rw-r--r--c/src/lib/libmisc/error/error.c209
-rw-r--r--c/src/lib/libmisc/error/error.h38
-rw-r--r--c/src/lib/libmisc/monitor/Makefile.in57
-rw-r--r--c/src/lib/libmisc/monitor/README97
-rw-r--r--c/src/lib/libmisc/monitor/mon-command.c187
-rw-r--r--c/src/lib/libmisc/monitor/mon-config.c131
-rw-r--r--c/src/lib/libmisc/monitor/mon-dname.c112
-rw-r--r--c/src/lib/libmisc/monitor/mon-driver.c136
-rw-r--r--c/src/lib/libmisc/monitor/mon-extension.c98
-rw-r--r--c/src/lib/libmisc/monitor/mon-itask.c115
-rw-r--r--c/src/lib/libmisc/monitor/mon-manager.c50
-rw-r--r--c/src/lib/libmisc/monitor/mon-monitor.c518
-rw-r--r--c/src/lib/libmisc/monitor/mon-mpci.c159
-rw-r--r--c/src/lib/libmisc/monitor/mon-object.c376
-rw-r--r--c/src/lib/libmisc/monitor/mon-prmisc.c254
-rw-r--r--c/src/lib/libmisc/monitor/mon-queue.c64
-rw-r--r--c/src/lib/libmisc/monitor/mon-server.c303
-rw-r--r--c/src/lib/libmisc/monitor/mon-symbols.c481
-rw-r--r--c/src/lib/libmisc/monitor/mon-task.c93
-rw-r--r--c/src/lib/libmisc/monitor/monitor.h443
-rw-r--r--c/src/lib/libmisc/monitor/symbols.h64
-rw-r--r--c/src/lib/libmisc/rtmonuse/Makefile.in53
-rw-r--r--c/src/lib/libmisc/rtmonuse/rtmonuse.c173
-rw-r--r--c/src/lib/libmisc/rtmonuse/rtmonuse.h18
-rw-r--r--c/src/lib/libmisc/stackchk/Makefile.in52
-rw-r--r--c/src/lib/libmisc/stackchk/README41
-rw-r--r--c/src/lib/libmisc/stackchk/check.c525
-rw-r--r--c/src/lib/libmisc/stackchk/internal.h96
-rw-r--r--c/src/lib/libmisc/stackchk/stackchk.h41
-rw-r--r--c/src/lib/libmisc/wrapup/Makefile.in41
-rw-r--r--c/src/lib/start/Makefile.in13
-rw-r--r--c/src/lib/start/README10
-rw-r--r--c/src/lib/start/a29k/Makefile.in53
-rw-r--r--c/src/lib/start/a29k/amd.ah517
-rw-r--r--c/src/lib/start/a29k/crt0.s288
-rw-r--r--c/src/lib/start/a29k/pswmacro.ah442
-rw-r--r--c/src/lib/start/a29k/register.ah214
-rw-r--r--c/src/lib/start/a29k/register.s393
-rw-r--r--c/src/lib/start/i960/Makefile.in53
-rw-r--r--c/src/lib/start/i960/start.s110
-rw-r--r--c/src/lib/start/m68k/Makefile.in53
-rw-r--r--c/src/lib/start/m68k/start.s167
-rw-r--r--c/src/lib/start/mips64orion/Makefile.in53
-rw-r--r--c/src/lib/start/mips64orion/idt_csu.S299
-rw-r--r--c/src/lib/wrapup/Makefile.in34
-rw-r--r--c/src/libchip/shmdr/README9
-rw-r--r--c/src/libchip/shmdr/addlq.c43
-rw-r--r--c/src/libchip/shmdr/cnvpkt.c42
-rw-r--r--c/src/libchip/shmdr/dump.c51
-rw-r--r--c/src/libchip/shmdr/fatal.c39
-rw-r--r--c/src/libchip/shmdr/getlq.c48
-rw-r--r--c/src/libchip/shmdr/getpkt.c36
-rw-r--r--c/src/libchip/shmdr/init.c254
-rw-r--r--c/src/libchip/shmdr/initlq.c35
-rw-r--r--c/src/libchip/shmdr/intr.c58
-rw-r--r--c/src/libchip/shmdr/mpci.h59
-rw-r--r--c/src/libchip/shmdr/mpisr.c23
-rw-r--r--c/src/libchip/shmdr/poll.c53
-rw-r--r--c/src/libchip/shmdr/receive.c44
-rw-r--r--c/src/libchip/shmdr/retpkt.c32
-rw-r--r--c/src/libchip/shmdr/send.c61
-rw-r--r--c/src/libchip/shmdr/setckvec.c34
-rw-r--r--c/src/libchip/shmdr/shm_driver.h539
-rw-r--r--c/src/libmisc/README16
-rw-r--r--c/src/libmisc/assoc/Makefile.in51
-rw-r--r--c/src/libmisc/assoc/assoc.c260
-rw-r--r--c/src/libmisc/assoc/assoc.h42
-rw-r--r--c/src/libmisc/cpuuse/Makefile.in53
-rw-r--r--c/src/libmisc/cpuuse/README41
-rw-r--r--c/src/libmisc/cpuuse/cpuuse.c142
-rw-r--r--c/src/libmisc/cpuuse/cpuuse.h41
-rw-r--r--c/src/libmisc/cpuuse/internal.h96
-rw-r--r--c/src/libmisc/error/Makefile.in51
-rw-r--r--c/src/libmisc/error/error.c209
-rw-r--r--c/src/libmisc/error/error.h38
-rw-r--r--c/src/libmisc/monitor/Makefile.in57
-rw-r--r--c/src/libmisc/monitor/README97
-rw-r--r--c/src/libmisc/monitor/mon-command.c187
-rw-r--r--c/src/libmisc/monitor/mon-config.c131
-rw-r--r--c/src/libmisc/monitor/mon-dname.c112
-rw-r--r--c/src/libmisc/monitor/mon-driver.c136
-rw-r--r--c/src/libmisc/monitor/mon-extension.c98
-rw-r--r--c/src/libmisc/monitor/mon-itask.c115
-rw-r--r--c/src/libmisc/monitor/mon-manager.c50
-rw-r--r--c/src/libmisc/monitor/mon-monitor.c518
-rw-r--r--c/src/libmisc/monitor/mon-mpci.c159
-rw-r--r--c/src/libmisc/monitor/mon-object.c376
-rw-r--r--c/src/libmisc/monitor/mon-prmisc.c254
-rw-r--r--c/src/libmisc/monitor/mon-queue.c64
-rw-r--r--c/src/libmisc/monitor/mon-server.c303
-rw-r--r--c/src/libmisc/monitor/mon-symbols.c481
-rw-r--r--c/src/libmisc/monitor/mon-task.c93
-rw-r--r--c/src/libmisc/monitor/monitor.h443
-rw-r--r--c/src/libmisc/monitor/symbols.h64
-rw-r--r--c/src/libmisc/rtmonuse/Makefile.in53
-rw-r--r--c/src/libmisc/rtmonuse/rtmonuse.c173
-rw-r--r--c/src/libmisc/rtmonuse/rtmonuse.h18
-rw-r--r--c/src/libmisc/stackchk/Makefile.in52
-rw-r--r--c/src/libmisc/stackchk/README41
-rw-r--r--c/src/libmisc/stackchk/check.c525
-rw-r--r--c/src/libmisc/stackchk/internal.h96
-rw-r--r--c/src/libmisc/stackchk/stackchk.h41
-rw-r--r--c/src/libmisc/wrapup/Makefile.in41
-rw-r--r--c/src/optman/rtems/no-dpmem.c98
-rw-r--r--c/src/optman/rtems/no-event.c56
-rw-r--r--c/src/optman/rtems/no-mp.c201
-rw-r--r--c/src/optman/rtems/no-msg.c192
-rw-r--r--c/src/optman/rtems/no-part.c97
-rw-r--r--c/src/optman/rtems/no-region.c114
-rw-r--r--c/src/optman/rtems/no-rtmon.c117
-rw-r--r--c/src/optman/rtems/no-sem.c114
-rw-r--r--c/src/optman/rtems/no-signal.c56
-rw-r--r--c/src/optman/rtems/no-timer.c123
-rw-r--r--c/src/optman/sapi/no-ext.c67
-rw-r--r--c/src/optman/sapi/no-io.c144
-rw-r--r--c/src/tests/Makefile.in29
-rw-r--r--c/src/tests/README44
-rw-r--r--c/src/tests/libtests/Makefile.in13
-rw-r--r--c/src/tests/libtests/README10
-rw-r--r--c/src/tests/libtests/cpuuse/Makefile.in60
-rw-r--r--c/src/tests/libtests/cpuuse/cpuuse.scn24
-rw-r--r--c/src/tests/libtests/cpuuse/init.c106
-rw-r--r--c/src/tests/libtests/cpuuse/system.h67
-rw-r--r--c/src/tests/libtests/cpuuse/task1.c103
-rw-r--r--c/src/tests/libtests/cpuuse/task2.c29
-rw-r--r--c/src/tests/libtests/cpuuse/task3.c29
-rw-r--r--c/src/tests/libtests/cpuuse/tswitch.c62
-rw-r--r--c/src/tests/libtests/malloctest/Makefile.in60
-rw-r--r--c/src/tests/libtests/malloctest/init.c114
-rw-r--r--c/src/tests/libtests/malloctest/system.h49
-rw-r--r--c/src/tests/libtests/malloctest/task1.c67
-rw-r--r--c/src/tests/libtests/rtmonuse/Makefile.in60
-rw-r--r--c/src/tests/libtests/rtmonuse/getall.c43
-rw-r--r--c/src/tests/libtests/rtmonuse/init.c71
-rw-r--r--c/src/tests/libtests/rtmonuse/rtmonuse.scn27
-rw-r--r--c/src/tests/libtests/rtmonuse/system.h61
-rw-r--r--c/src/tests/libtests/rtmonuse/task1.c124
-rw-r--r--c/src/tests/libtests/stackchk/Makefile.in60
-rw-r--r--c/src/tests/libtests/stackchk/blow.c49
-rw-r--r--c/src/tests/libtests/stackchk/init.c86
-rw-r--r--c/src/tests/libtests/stackchk/stackchk.scn9
-rw-r--r--c/src/tests/libtests/stackchk/system.h51
-rw-r--r--c/src/tests/libtests/stackchk/task1.c44
-rw-r--r--c/src/tests/mptests/Makefile.in15
-rw-r--r--c/src/tests/mptests/README10
-rw-r--r--c/src/tests/mptests/mp01/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp01/init.c96
-rw-r--r--c/src/tests/mptests/mp01/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp01/node1/mp01.doc53
-rw-r--r--c/src/tests/mptests/mp01/node1/mp01.scn15
-rw-r--r--c/src/tests/mptests/mp01/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp01/node2/mp01.doc13
-rw-r--r--c/src/tests/mptests/mp01/node2/mp01.scn15
-rw-r--r--c/src/tests/mptests/mp01/system.h46
-rw-r--r--c/src/tests/mptests/mp01/task1.c84
-rw-r--r--c/src/tests/mptests/mp02/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp02/init.c60
-rw-r--r--c/src/tests/mptests/mp02/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp02/node1/mp02.doc47
-rw-r--r--c/src/tests/mptests/mp02/node1/mp02.scn14
-rw-r--r--c/src/tests/mptests/mp02/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp02/node2/mp02.doc13
-rw-r--r--c/src/tests/mptests/mp02/node2/mp02.scn14
-rw-r--r--c/src/tests/mptests/mp02/system.h45
-rw-r--r--c/src/tests/mptests/mp02/task1.c118
-rw-r--r--c/src/tests/mptests/mp03/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp03/delay.c31
-rw-r--r--c/src/tests/mptests/mp03/init.c65
-rw-r--r--c/src/tests/mptests/mp03/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp03/node1/mp03.doc45
-rw-r--r--c/src/tests/mptests/mp03/node1/mp03.scn24
-rw-r--r--c/src/tests/mptests/mp03/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp03/node2/mp03.doc13
-rw-r--r--c/src/tests/mptests/mp03/node2/mp03.scn24
-rw-r--r--c/src/tests/mptests/mp03/system.h58
-rw-r--r--c/src/tests/mptests/mp03/task1.c155
-rw-r--r--c/src/tests/mptests/mp04/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp04/init.c60
-rw-r--r--c/src/tests/mptests/mp04/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp04/node1/mp04.doc41
-rw-r--r--c/src/tests/mptests/mp04/node1/mp04.scn8
-rw-r--r--c/src/tests/mptests/mp04/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp04/node2/mp04.doc13
-rw-r--r--c/src/tests/mptests/mp04/node2/mp04.scn8
-rw-r--r--c/src/tests/mptests/mp04/system.h47
-rw-r--r--c/src/tests/mptests/mp04/task1.c83
-rw-r--r--c/src/tests/mptests/mp05/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp05/asr.c37
-rw-r--r--c/src/tests/mptests/mp05/init.c65
-rw-r--r--c/src/tests/mptests/mp05/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp05/node1/mp05.doc45
-rw-r--r--c/src/tests/mptests/mp05/node1/mp05.scn11
-rw-r--r--c/src/tests/mptests/mp05/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp05/node2/mp05.doc13
-rw-r--r--c/src/tests/mptests/mp05/node2/mp05.scn10
-rw-r--r--c/src/tests/mptests/mp05/system.h61
-rw-r--r--c/src/tests/mptests/mp05/task1.c106
-rw-r--r--c/src/tests/mptests/mp06/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp06/init.c65
-rw-r--r--c/src/tests/mptests/mp06/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp06/node1/mp06.doc45
-rw-r--r--c/src/tests/mptests/mp06/node1/mp06.scn11
-rw-r--r--c/src/tests/mptests/mp06/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp06/node2/mp06.doc13
-rw-r--r--c/src/tests/mptests/mp06/node2/mp06.scn12
-rw-r--r--c/src/tests/mptests/mp06/system.h52
-rw-r--r--c/src/tests/mptests/mp06/task1.c176
-rw-r--r--c/src/tests/mptests/mp07/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp07/init.c65
-rw-r--r--c/src/tests/mptests/mp07/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp07/node1/mp07.doc46
-rw-r--r--c/src/tests/mptests/mp07/node1/mp07.scn10
-rw-r--r--c/src/tests/mptests/mp07/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp07/node2/mp07.doc13
-rw-r--r--c/src/tests/mptests/mp07/node2/mp07.scn9
-rw-r--r--c/src/tests/mptests/mp07/system.h52
-rw-r--r--c/src/tests/mptests/mp07/task1.c103
-rw-r--r--c/src/tests/mptests/mp08/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp08/init.c74
-rw-r--r--c/src/tests/mptests/mp08/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp08/node1/mp08.doc52
-rw-r--r--c/src/tests/mptests/mp08/node1/mp08.scn11
-rw-r--r--c/src/tests/mptests/mp08/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp08/node2/mp08.doc13
-rw-r--r--c/src/tests/mptests/mp08/node2/mp08.scn12
-rw-r--r--c/src/tests/mptests/mp08/system.h51
-rw-r--r--c/src/tests/mptests/mp08/task1.c89
-rw-r--r--c/src/tests/mptests/mp09/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp09/init.c74
-rw-r--r--c/src/tests/mptests/mp09/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp09/node1/mp09.doc50
-rw-r--r--c/src/tests/mptests/mp09/node1/mp09.scn22
-rw-r--r--c/src/tests/mptests/mp09/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp09/node2/mp09.doc13
-rw-r--r--c/src/tests/mptests/mp09/node2/mp09.scn27
-rw-r--r--c/src/tests/mptests/mp09/recvmsg.c47
-rw-r--r--c/src/tests/mptests/mp09/sendmsg.c60
-rw-r--r--c/src/tests/mptests/mp09/system.h60
-rw-r--r--c/src/tests/mptests/mp09/task1.c109
-rw-r--r--c/src/tests/mptests/mp10/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp10/init.c143
-rw-r--r--c/src/tests/mptests/mp10/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp10/node1/mp10.doc46
-rw-r--r--c/src/tests/mptests/mp10/node1/mp10.scn4
-rw-r--r--c/src/tests/mptests/mp10/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp10/node2/mp10.doc13
-rw-r--r--c/src/tests/mptests/mp10/node2/mp10.scn19
-rw-r--r--c/src/tests/mptests/mp10/system.h64
-rw-r--r--c/src/tests/mptests/mp10/task1.c52
-rw-r--r--c/src/tests/mptests/mp10/task2.c47
-rw-r--r--c/src/tests/mptests/mp10/task3.c50
-rw-r--r--c/src/tests/mptests/mp11/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp11/init.c105
-rw-r--r--c/src/tests/mptests/mp11/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp11/node1/mp11.doc42
-rw-r--r--c/src/tests/mptests/mp11/node1/mp11.scn10
-rw-r--r--c/src/tests/mptests/mp11/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp11/node2/mp11.doc13
-rw-r--r--c/src/tests/mptests/mp11/node2/mp11.scn2
-rw-r--r--c/src/tests/mptests/mp11/system.h56
-rw-r--r--c/src/tests/mptests/mp12/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp12/init.c113
-rw-r--r--c/src/tests/mptests/mp12/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp12/node1/mp12.doc52
-rw-r--r--c/src/tests/mptests/mp12/node1/mp12.scn6
-rw-r--r--c/src/tests/mptests/mp12/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp12/node2/mp12.doc13
-rw-r--r--c/src/tests/mptests/mp12/node2/mp12.scn10
-rw-r--r--c/src/tests/mptests/mp12/system.h55
-rw-r--r--c/src/tests/mptests/mp13/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp13/init.c115
-rw-r--r--c/src/tests/mptests/mp13/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp13/node1/mp13.doc48
-rw-r--r--c/src/tests/mptests/mp13/node1/mp13.scn14
-rw-r--r--c/src/tests/mptests/mp13/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp13/node2/mp13.doc13
-rw-r--r--c/src/tests/mptests/mp13/node2/mp13.scn16
-rw-r--r--c/src/tests/mptests/mp13/system.h60
-rw-r--r--c/src/tests/mptests/mp13/task1.c73
-rw-r--r--c/src/tests/mptests/mp13/task2.c106
-rw-r--r--c/src/tests/mptests/mp14/Makefile.in13
-rw-r--r--c/src/tests/mptests/mp14/delay.c34
-rw-r--r--c/src/tests/mptests/mp14/evtask1.c87
-rw-r--r--c/src/tests/mptests/mp14/evtmtask.c65
-rw-r--r--c/src/tests/mptests/mp14/exit.c40
-rw-r--r--c/src/tests/mptests/mp14/init.c191
-rw-r--r--c/src/tests/mptests/mp14/msgtask1.c107
-rw-r--r--c/src/tests/mptests/mp14/node1/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp14/node1/mp14.doc50
-rw-r--r--c/src/tests/mptests/mp14/node1/mp14.scn41
-rw-r--r--c/src/tests/mptests/mp14/node2/Makefile.in62
-rw-r--r--c/src/tests/mptests/mp14/node2/mp14.doc13
-rw-r--r--c/src/tests/mptests/mp14/node2/mp14.scn38
-rw-r--r--c/src/tests/mptests/mp14/pttask1.c71
-rw-r--r--c/src/tests/mptests/mp14/smtask1.c73
-rw-r--r--c/src/tests/mptests/mp14/system.h117
-rw-r--r--c/src/tests/psxtests/Makefile.in15
-rw-r--r--c/src/tests/psxtests/include/pmacros.h85
-rw-r--r--c/src/tests/psxtests/psx01/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx01/init.c225
-rw-r--r--c/src/tests/psxtests/psx01/psx01.scn46
-rw-r--r--c/src/tests/psxtests/psx01/system.h56
-rw-r--r--c/src/tests/psxtests/psx01/task.c94
-rw-r--r--c/src/tests/psxtests/psx02/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx02/init.c146
-rw-r--r--c/src/tests/psxtests/psx02/psx02.scn26
-rw-r--r--c/src/tests/psxtests/psx02/system.h52
-rw-r--r--c/src/tests/psxtests/psx02/task.c45
-rw-r--r--c/src/tests/psxtests/psx03/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx03/init.c176
-rw-r--r--c/src/tests/psxtests/psx03/psx03.scn17
-rw-r--r--c/src/tests/psxtests/psx03/system.h55
-rw-r--r--c/src/tests/psxtests/psx03/task.c65
-rw-r--r--c/src/tests/psxtests/psx04/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx04/init.c564
-rw-r--r--c/src/tests/psxtests/psx04/psx04.scn112
-rw-r--r--c/src/tests/psxtests/psx04/system.h63
-rw-r--r--c/src/tests/psxtests/psx04/task1.c44
-rw-r--r--c/src/tests/psxtests/psx04/task2.c42
-rw-r--r--c/src/tests/psxtests/psx04/task3.c119
-rw-r--r--c/src/tests/psxtests/psx05/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx05/init.c569
-rw-r--r--c/src/tests/psxtests/psx05/psx05.scn111
-rw-r--r--c/src/tests/psxtests/psx05/system.h67
-rw-r--r--c/src/tests/psxtests/psx05/task.c58
-rw-r--r--c/src/tests/psxtests/psx05/task2.c49
-rw-r--r--c/src/tests/psxtests/psx05/task3.c51
-rw-r--r--c/src/tests/psxtests/psx06/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx06/init.c121
-rw-r--r--c/src/tests/psxtests/psx06/psx06.scn21
-rw-r--r--c/src/tests/psxtests/psx06/system.h61
-rw-r--r--c/src/tests/psxtests/psx06/task.c51
-rw-r--r--c/src/tests/psxtests/psx06/task2.c52
-rw-r--r--c/src/tests/psxtests/psx07/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx07/init.c491
-rw-r--r--c/src/tests/psxtests/psx07/psx07.scn105
-rw-r--r--c/src/tests/psxtests/psx07/system.h51
-rw-r--r--c/src/tests/psxtests/psx07/task.c34
-rw-r--r--c/src/tests/psxtests/psx08/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx08/init.c82
-rw-r--r--c/src/tests/psxtests/psx08/psx08.scn18
-rw-r--r--c/src/tests/psxtests/psx08/system.h56
-rw-r--r--c/src/tests/psxtests/psx08/task.c56
-rw-r--r--c/src/tests/psxtests/psx08/task2.c52
-rw-r--r--c/src/tests/psxtests/psx09/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx09/init.c226
-rw-r--r--c/src/tests/psxtests/psx09/psx09.scn23
-rw-r--r--c/src/tests/psxtests/psx09/system.h58
-rw-r--r--c/src/tests/psxtests/psx10/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx10/init.c312
-rw-r--r--c/src/tests/psxtests/psx10/psx10.scn60
-rw-r--r--c/src/tests/psxtests/psx10/system.h69
-rw-r--r--c/src/tests/psxtests/psx10/task.c65
-rw-r--r--c/src/tests/psxtests/psx10/task2.c47
-rw-r--r--c/src/tests/psxtests/psx10/task3.c46
-rw-r--r--c/src/tests/psxtests/psx11/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx11/init.c108
-rw-r--r--c/src/tests/psxtests/psx11/psx11.scn18
-rw-r--r--c/src/tests/psxtests/psx11/system.h51
-rw-r--r--c/src/tests/psxtests/psx11/task.c92
-rw-r--r--c/src/tests/psxtests/psx12/Makefile.in62
-rw-r--r--c/src/tests/psxtests/psx12/init.c140
-rw-r--r--c/src/tests/psxtests/psx12/psx12.scn11
-rw-r--r--c/src/tests/psxtests/psx12/system.h54
-rw-r--r--c/src/tests/psxtests/psx12/task.c34
-rw-r--r--c/src/tests/psxtests/psxhdrs/Makefile.in66
-rw-r--r--c/src/tests/psxtests/psxhdrs/clock01.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/clock02.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/clock03.c30
-rw-r--r--c/src/tests/psxtests/psxhdrs/clock04.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/clock05.c35
-rw-r--r--c/src/tests/psxtests/psxhdrs/clock06.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond01.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond02.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond03.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond04.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond05.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond06.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond07.c30
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond08.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond09.c35
-rw-r--r--c/src/tests/psxtests/psxhdrs/cond10.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/key01.c34
-rw-r--r--c/src/tests/psxtests/psxhdrs/key02.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/key03.c30
-rw-r--r--c/src/tests/psxtests/psxhdrs/key04.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex01.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex02.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex03.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex04.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex05.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex06.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex07.c36
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex08.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex09.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex10.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex11.c35
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex12.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex13.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex14.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex15.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/mutex16.c35
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc01.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc02.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc03.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc04.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc05.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc06.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc07.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc08.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc09.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc10.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc11.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc12.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc13.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/proc14.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread01.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread02.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread03.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread04.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread05.c36
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread06.c33
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread07.c38
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread08.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread09.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread10.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread11.c52
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread12.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread13.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread14.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread15.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread16.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread17.c36
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread18.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread19.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread20.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread21.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread22.c50
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread23.c30
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread24.c36
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread25.c34
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread26.c31
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread27.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread28.c33
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread29.c36
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread30.c36
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread31.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread32.c35
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread33.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread34.c31
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread35.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/pthread36.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched01.c44
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched02.c31
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched03.c52
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched04.c30
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched05.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched06.c35
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched07.c35
-rw-r--r--c/src/tests/psxtests/psxhdrs/sched08.c31
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal01.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal02.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal03.c24
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal04.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal05.c24
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal06.c39
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal07.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal08.c34
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal09.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal10.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal11.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal12.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal13.c32
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal14.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal15.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal16.c36
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal17.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal18.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal19.c27
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal20.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal21.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/signal22.c26
-rw-r--r--c/src/tests/psxtests/psxhdrs/time01.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/time02.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/time03.c34
-rw-r--r--c/src/tests/psxtests/psxhdrs/time04.c23
-rw-r--r--c/src/tests/psxtests/psxhdrs/time05.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/time06.c24
-rw-r--r--c/src/tests/psxtests/psxhdrs/time07.c24
-rw-r--r--c/src/tests/psxtests/psxhdrs/time08.c24
-rw-r--r--c/src/tests/psxtests/psxhdrs/time09.c24
-rw-r--r--c/src/tests/psxtests/psxhdrs/time10.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/time11.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/time12.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/time13.c25
-rw-r--r--c/src/tests/psxtests/psxhdrs/timer01.c37
-rw-r--r--c/src/tests/psxtests/psxhdrs/timer02.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/timer03.c39
-rw-r--r--c/src/tests/psxtests/psxhdrs/timer04.c29
-rw-r--r--c/src/tests/psxtests/psxhdrs/timer05.c28
-rw-r--r--c/src/tests/psxtests/psxhdrs/timer06.c31
-rw-r--r--c/src/tests/psxtests/support/Makefile.in16
-rw-r--r--c/src/tests/psxtests/support/include/Makefile.in25
-rw-r--r--c/src/tests/psxtests/support/include/pmacros.h85
-rw-r--r--c/src/tests/samples/Makefile.in27
-rw-r--r--c/src/tests/samples/README73
-rw-r--r--c/src/tests/samples/base_mp/Makefile.in13
-rw-r--r--c/src/tests/samples/base_mp/apptask.c37
-rw-r--r--c/src/tests/samples/base_mp/init.c46
-rw-r--r--c/src/tests/samples/base_mp/node1/Makefile.in61
-rw-r--r--c/src/tests/samples/base_mp/node1/base_mp.doc13
-rw-r--r--c/src/tests/samples/base_mp/node1/base_mp.scn5
-rw-r--r--c/src/tests/samples/base_mp/node2/Makefile.in61
-rw-r--r--c/src/tests/samples/base_mp/node2/base_mp.doc13
-rw-r--r--c/src/tests/samples/base_mp/node2/base_mp.scn5
-rw-r--r--c/src/tests/samples/base_mp/system.h48
-rw-r--r--c/src/tests/samples/base_sp/Makefile.in61
-rw-r--r--c/src/tests/samples/base_sp/apptask.c38
-rw-r--r--c/src/tests/samples/base_sp/base_sp.doc13
-rw-r--r--c/src/tests/samples/base_sp/base_sp.scn5
-rw-r--r--c/src/tests/samples/base_sp/init.c48
-rw-r--r--c/src/tests/samples/base_sp/system.h44
-rw-r--r--c/src/tests/samples/cdtest/Makefile.in66
-rw-r--r--c/src/tests/samples/cdtest/cdtest.scn31
-rw-r--r--c/src/tests/samples/cdtest/init.c26
-rw-r--r--c/src/tests/samples/cdtest/main.cc137
-rw-r--r--c/src/tests/samples/cdtest/system.h42
-rw-r--r--c/src/tests/samples/hello/Makefile.in62
-rw-r--r--c/src/tests/samples/hello/hello.doc13
-rw-r--r--c/src/tests/samples/hello/hello.scn3
-rw-r--r--c/src/tests/samples/hello/init.c36
-rw-r--r--c/src/tests/samples/hello/system.h37
-rw-r--r--c/src/tests/samples/paranoia/Makefile.in64
-rw-r--r--c/src/tests/samples/paranoia/init.c39
-rw-r--r--c/src/tests/samples/paranoia/paranoia.c2300
-rw-r--r--c/src/tests/samples/paranoia/paranoia.doc13
-rw-r--r--c/src/tests/samples/paranoia/system.h40
-rw-r--r--c/src/tests/samples/ticker/Makefile.in62
-rw-r--r--c/src/tests/samples/ticker/init.c61
-rw-r--r--c/src/tests/samples/ticker/system.h45
-rw-r--r--c/src/tests/samples/ticker/tasks.c44
-rw-r--r--c/src/tests/samples/ticker/ticker.doc13
-rw-r--r--c/src/tests/samples/ticker/ticker.scn16
-rw-r--r--c/src/tests/sptests/Makefile.in20
-rw-r--r--c/src/tests/sptests/README9
-rw-r--r--c/src/tests/sptests/sp01/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp01/init.c86
-rw-r--r--c/src/tests/sptests/sp01/sp01.doc43
-rw-r--r--c/src/tests/sptests/sp01/sp01.scn18
-rw-r--r--c/src/tests/sptests/sp01/system.h45
-rw-r--r--c/src/tests/sptests/sp01/task1.c50
-rw-r--r--c/src/tests/sptests/sp02/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp02/init.c152
-rw-r--r--c/src/tests/sptests/sp02/preempt.c32
-rw-r--r--c/src/tests/sptests/sp02/sp02.doc37
-rw-r--r--c/src/tests/sptests/sp02/sp02.scn15
-rw-r--r--c/src/tests/sptests/sp02/system.h60
-rw-r--r--c/src/tests/sptests/sp02/task1.c66
-rw-r--r--c/src/tests/sptests/sp02/task2.c34
-rw-r--r--c/src/tests/sptests/sp02/task3.c37
-rw-r--r--c/src/tests/sptests/sp03/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp03/init.c67
-rw-r--r--c/src/tests/sptests/sp03/sp03.doc24
-rw-r--r--c/src/tests/sptests/sp03/sp03.scn26
-rw-r--r--c/src/tests/sptests/sp03/system.h49
-rw-r--r--c/src/tests/sptests/sp03/task1.c59
-rw-r--r--c/src/tests/sptests/sp03/task2.c46
-rw-r--r--c/src/tests/sptests/sp04/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp04/init.c110
-rw-r--r--c/src/tests/sptests/sp04/sp04.doc38
-rw-r--r--c/src/tests/sptests/sp04/sp04.scn23
-rw-r--r--c/src/tests/sptests/sp04/system.h67
-rw-r--r--c/src/tests/sptests/sp04/task1.c103
-rw-r--r--c/src/tests/sptests/sp04/task2.c29
-rw-r--r--c/src/tests/sptests/sp04/task3.c29
-rw-r--r--c/src/tests/sptests/sp04/tswitch.c59
-rw-r--r--c/src/tests/sptests/sp05/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp05/init.c81
-rw-r--r--c/src/tests/sptests/sp05/sp05.doc26
-rw-r--r--c/src/tests/sptests/sp05/sp05.scn47
-rw-r--r--c/src/tests/sptests/sp05/system.h55
-rw-r--r--c/src/tests/sptests/sp05/task1.c78
-rw-r--r--c/src/tests/sptests/sp05/task2.c39
-rw-r--r--c/src/tests/sptests/sp05/task3.c39
-rw-r--r--c/src/tests/sptests/sp06/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp06/init.c87
-rw-r--r--c/src/tests/sptests/sp06/sp06.doc26
-rw-r--r--c/src/tests/sptests/sp06/sp06.scn40
-rw-r--r--c/src/tests/sptests/sp06/system.h58
-rw-r--r--c/src/tests/sptests/sp06/task1.c61
-rw-r--r--c/src/tests/sptests/sp06/task2.c40
-rw-r--r--c/src/tests/sptests/sp06/task3.c32
-rw-r--r--c/src/tests/sptests/sp07/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp07/init.c128
-rw-r--r--c/src/tests/sptests/sp07/sp07.doc37
-rw-r--r--c/src/tests/sptests/sp07/sp07.scn33
-rw-r--r--c/src/tests/sptests/sp07/system.h87
-rw-r--r--c/src/tests/sptests/sp07/task1.c85
-rw-r--r--c/src/tests/sptests/sp07/task2.c78
-rw-r--r--c/src/tests/sptests/sp07/task3.c34
-rw-r--r--c/src/tests/sptests/sp07/task4.c30
-rw-r--r--c/src/tests/sptests/sp07/taskexit.c33
-rw-r--r--c/src/tests/sptests/sp07/tcreate.c35
-rw-r--r--c/src/tests/sptests/sp07/tdelete.c37
-rw-r--r--c/src/tests/sptests/sp07/trestart.c34
-rw-r--r--c/src/tests/sptests/sp07/tstart.c34
-rw-r--r--c/src/tests/sptests/sp08/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp08/init.c53
-rw-r--r--c/src/tests/sptests/sp08/sp08.doc26
-rw-r--r--c/src/tests/sptests/sp08/sp08.scn22
-rw-r--r--c/src/tests/sptests/sp08/system.h50
-rw-r--r--c/src/tests/sptests/sp08/task1.c256
-rw-r--r--c/src/tests/sptests/sp09/Makefile.in65
-rw-r--r--c/src/tests/sptests/sp09/delay.c28
-rw-r--r--c/src/tests/sptests/sp09/init.c120
-rw-r--r--c/src/tests/sptests/sp09/isr.c27
-rw-r--r--c/src/tests/sptests/sp09/screen01.c168
-rw-r--r--c/src/tests/sptests/sp09/screen02.c192
-rw-r--r--c/src/tests/sptests/sp09/screen03.c217
-rw-r--r--c/src/tests/sptests/sp09/screen04.c85
-rw-r--r--c/src/tests/sptests/sp09/screen05.c164
-rw-r--r--c/src/tests/sptests/sp09/screen06.c125
-rw-r--r--c/src/tests/sptests/sp09/screen07.c192
-rw-r--r--c/src/tests/sptests/sp09/screen08.c128
-rw-r--r--c/src/tests/sptests/sp09/screen09.c144
-rw-r--r--c/src/tests/sptests/sp09/screen10.c164
-rw-r--r--c/src/tests/sptests/sp09/screen11.c250
-rw-r--r--c/src/tests/sptests/sp09/screen12.c337
-rw-r--r--c/src/tests/sptests/sp09/screen13.c114
-rw-r--r--c/src/tests/sptests/sp09/screen14.c154
-rw-r--r--c/src/tests/sptests/sp09/sp09.doc36
-rw-r--r--c/src/tests/sptests/sp09/sp09.scn249
-rw-r--r--c/src/tests/sptests/sp09/system.h141
-rw-r--r--c/src/tests/sptests/sp09/task1.c70
-rw-r--r--c/src/tests/sptests/sp09/task2.c48
-rw-r--r--c/src/tests/sptests/sp09/task3.c53
-rw-r--r--c/src/tests/sptests/sp09/task4.c50
-rw-r--r--c/src/tests/sptests/sp11/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp11/init.c92
-rw-r--r--c/src/tests/sptests/sp11/sp11.doc26
-rw-r--r--c/src/tests/sptests/sp11/sp11.scn74
-rw-r--r--c/src/tests/sptests/sp11/system.h90
-rw-r--r--c/src/tests/sptests/sp11/task1.c410
-rw-r--r--c/src/tests/sptests/sp11/task2.c126
-rw-r--r--c/src/tests/sptests/sp11/timer.c97
-rw-r--r--c/src/tests/sptests/sp12/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp12/init.c179
-rw-r--r--c/src/tests/sptests/sp12/pridrv.c131
-rw-r--r--c/src/tests/sptests/sp12/pritask.c91
-rw-r--r--c/src/tests/sptests/sp12/sp12.doc27
-rw-r--r--c/src/tests/sptests/sp12/sp12.scn78
-rw-r--r--c/src/tests/sptests/sp12/system.h82
-rw-r--r--c/src/tests/sptests/sp12/task1.c153
-rw-r--r--c/src/tests/sptests/sp12/task2.c65
-rw-r--r--c/src/tests/sptests/sp12/task3.c50
-rw-r--r--c/src/tests/sptests/sp12/task4.c37
-rw-r--r--c/src/tests/sptests/sp12/task5.c55
-rw-r--r--c/src/tests/sptests/sp13/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp13/fillbuff.c31
-rw-r--r--c/src/tests/sptests/sp13/init.c112
-rw-r--r--c/src/tests/sptests/sp13/putbuff.c29
-rw-r--r--c/src/tests/sptests/sp13/sp13.doc25
-rw-r--r--c/src/tests/sptests/sp13/sp13.scn72
-rw-r--r--c/src/tests/sptests/sp13/system.h68
-rw-r--r--c/src/tests/sptests/sp13/task1.c344
-rw-r--r--c/src/tests/sptests/sp13/task2.c139
-rw-r--r--c/src/tests/sptests/sp13/task3.c78
-rw-r--r--c/src/tests/sptests/sp14/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp14/asr.c47
-rw-r--r--c/src/tests/sptests/sp14/init.c72
-rw-r--r--c/src/tests/sptests/sp14/sp14.doc24
-rw-r--r--c/src/tests/sptests/sp14/sp14.scn33
-rw-r--r--c/src/tests/sptests/sp14/system.h78
-rw-r--r--c/src/tests/sptests/sp14/task1.c116
-rw-r--r--c/src/tests/sptests/sp14/task2.c48
-rw-r--r--c/src/tests/sptests/sp15/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp15/init.c78
-rw-r--r--c/src/tests/sptests/sp15/sp15.doc24
-rw-r--r--c/src/tests/sptests/sp15/sp15.scn16
-rw-r--r--c/src/tests/sptests/sp15/system.h62
-rw-r--r--c/src/tests/sptests/sp15/task1.c129
-rw-r--r--c/src/tests/sptests/sp16/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp16/init.c128
-rw-r--r--c/src/tests/sptests/sp16/sp16.doc24
-rw-r--r--c/src/tests/sptests/sp16/sp16.scn58
-rw-r--r--c/src/tests/sptests/sp16/system.h89
-rw-r--r--c/src/tests/sptests/sp16/task1.c282
-rw-r--r--c/src/tests/sptests/sp16/task2.c86
-rw-r--r--c/src/tests/sptests/sp16/task3.c57
-rw-r--r--c/src/tests/sptests/sp16/task4.c60
-rw-r--r--c/src/tests/sptests/sp16/task5.c73
-rw-r--r--c/src/tests/sptests/sp17/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp17/asr.c32
-rw-r--r--c/src/tests/sptests/sp17/init.c69
-rw-r--r--c/src/tests/sptests/sp17/sp17.doc35
-rw-r--r--c/src/tests/sptests/sp17/sp17.scn8
-rw-r--r--c/src/tests/sptests/sp17/system.h58
-rw-r--r--c/src/tests/sptests/sp17/task1.c48
-rw-r--r--c/src/tests/sptests/sp17/task2.c45
-rw-r--r--c/src/tests/sptests/sp19/Makefile.in63
-rw-r--r--c/src/tests/sptests/sp19/first.c66
-rw-r--r--c/src/tests/sptests/sp19/fptask.c98
-rw-r--r--c/src/tests/sptests/sp19/fptest.h172
-rw-r--r--c/src/tests/sptests/sp19/init.c150
-rw-r--r--c/src/tests/sptests/sp19/inttest.h149
-rw-r--r--c/src/tests/sptests/sp19/sp19.doc23
-rw-r--r--c/src/tests/sptests/sp19/sp19.scn50
-rw-r--r--c/src/tests/sptests/sp19/system.h57
-rw-r--r--c/src/tests/sptests/sp19/task1.c59
-rw-r--r--c/src/tests/sptests/sp20/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp20/getall.c43
-rw-r--r--c/src/tests/sptests/sp20/init.c68
-rw-r--r--c/src/tests/sptests/sp20/sp20.doc24
-rw-r--r--c/src/tests/sptests/sp20/sp20.scn27
-rw-r--r--c/src/tests/sptests/sp20/system.h61
-rw-r--r--c/src/tests/sptests/sp20/task1.c116
-rw-r--r--c/src/tests/sptests/sp21/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp21/init.c53
-rw-r--r--c/src/tests/sptests/sp21/sp21.doc28
-rw-r--r--c/src/tests/sptests/sp21/sp21.scn19
-rw-r--r--c/src/tests/sptests/sp21/system.h46
-rw-r--r--c/src/tests/sptests/sp21/task1.c105
-rw-r--r--c/src/tests/sptests/sp22/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp22/delay.c32
-rw-r--r--c/src/tests/sptests/sp22/init.c66
-rw-r--r--c/src/tests/sptests/sp22/prtime.c32
-rw-r--r--c/src/tests/sptests/sp22/sp22.doc20
-rw-r--r--c/src/tests/sptests/sp22/sp22.scn29
-rw-r--r--c/src/tests/sptests/sp22/system.h57
-rw-r--r--c/src/tests/sptests/sp22/task1.c164
-rw-r--r--c/src/tests/sptests/sp23/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp23/init.c69
-rw-r--r--c/src/tests/sptests/sp23/sp23.doc26
-rw-r--r--c/src/tests/sptests/sp23/sp23.scn9
-rw-r--r--c/src/tests/sptests/sp23/system.h56
-rw-r--r--c/src/tests/sptests/sp23/task1.c96
-rw-r--r--c/src/tests/sptests/sp24/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp24/init.c76
-rw-r--r--c/src/tests/sptests/sp24/resume.c34
-rw-r--r--c/src/tests/sptests/sp24/sp24.doc51
-rw-r--r--c/src/tests/sptests/sp24/sp24.scn16
-rw-r--r--c/src/tests/sptests/sp24/system.h55
-rw-r--r--c/src/tests/sptests/sp24/task1.c58
-rw-r--r--c/src/tests/sptests/sp25/Makefile.in62
-rw-r--r--c/src/tests/sptests/sp25/init.c66
-rw-r--r--c/src/tests/sptests/sp25/sp25.doc32
-rw-r--r--c/src/tests/sptests/sp25/sp25.scn29
-rw-r--r--c/src/tests/sptests/sp25/system.h57
-rw-r--r--c/src/tests/sptests/sp25/task1.c241
-rw-r--r--c/src/tests/sptests/spfatal/Makefile.in62
-rw-r--r--c/src/tests/sptests/spfatal/fatal.c136
-rw-r--r--c/src/tests/sptests/spfatal/init.c51
-rw-r--r--c/src/tests/sptests/spfatal/puterr.c68
-rw-r--r--c/src/tests/sptests/spfatal/spfatal.doc28
-rw-r--r--c/src/tests/sptests/spfatal/spfatal.scn8
-rw-r--r--c/src/tests/sptests/spfatal/system.h82
-rw-r--r--c/src/tests/sptests/spfatal/task1.c29
-rw-r--r--c/src/tests/sptests/spsize/Makefile.in53
-rw-r--r--c/src/tests/sptests/spsize/getint.c32
-rw-r--r--c/src/tests/sptests/spsize/init.c64
-rw-r--r--c/src/tests/sptests/spsize/size.c651
-rw-r--r--c/src/tests/sptests/spsize/system.h47
-rw-r--r--c/src/tests/support/Makefile.in13
-rw-r--r--c/src/tests/support/include/Makefile.in25
-rw-r--r--c/src/tests/support/include/tmacros.h140
-rw-r--r--c/src/tests/support/stubdr/Makefile.in57
-rw-r--r--c/src/tests/support/stubdr/close.c34
-rw-r--r--c/src/tests/support/stubdr/cntrl.c34
-rw-r--r--c/src/tests/support/stubdr/init.c37
-rw-r--r--c/src/tests/support/stubdr/open.c34
-rw-r--r--c/src/tests/support/stubdr/read.c34
-rw-r--r--c/src/tests/support/stubdr/stubdrv.h69
-rw-r--r--c/src/tests/support/stubdr/write.c34
-rw-r--r--c/src/tests/support/wrapup/Makefile.in46
-rw-r--r--c/src/tests/tmtests/Makefile.in19
-rw-r--r--c/src/tests/tmtests/README21
-rw-r--r--c/src/tests/tmtests/include/Makefile.in25
-rw-r--r--c/src/tests/tmtests/include/timesys.h58
-rw-r--r--c/src/tests/tmtests/tm01/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm01/system.h43
-rw-r--r--c/src/tests/tmtests/tm01/task1.c189
-rw-r--r--c/src/tests/tmtests/tm01/tm01.doc13
-rw-r--r--c/src/tests/tmtests/tm02/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm02/system.h44
-rw-r--r--c/src/tests/tmtests/tm02/task1.c158
-rw-r--r--c/src/tests/tmtests/tm02/tm02.doc13
-rw-r--r--c/src/tests/tmtests/tm03/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm03/system.h44
-rw-r--r--c/src/tests/tmtests/tm03/task1.c151
-rw-r--r--c/src/tests/tmtests/tm03/tm03.doc13
-rw-r--r--c/src/tests/tmtests/tm04/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm04/system.h43
-rw-r--r--c/src/tests/tmtests/tm04/task1.c388
-rw-r--r--c/src/tests/tmtests/tm04/tm04.doc13
-rw-r--r--c/src/tests/tmtests/tm05/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm05/system.h44
-rw-r--r--c/src/tests/tmtests/tm05/task1.c132
-rw-r--r--c/src/tests/tmtests/tm05/tm05.doc13
-rw-r--r--c/src/tests/tmtests/tm06/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm06/system.h44
-rw-r--r--c/src/tests/tmtests/tm06/task1.c162
-rw-r--r--c/src/tests/tmtests/tm06/tm06.doc13
-rw-r--r--c/src/tests/tmtests/tm07/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm07/system.h44
-rw-r--r--c/src/tests/tmtests/tm07/task1.c120
-rw-r--r--c/src/tests/tmtests/tm07/tm07.doc13
-rw-r--r--c/src/tests/tmtests/tm08/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm08/system.h44
-rw-r--r--c/src/tests/tmtests/tm08/task1.c255
-rw-r--r--c/src/tests/tmtests/tm08/tm08.doc13
-rw-r--r--c/src/tests/tmtests/tm09/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm09/system.h42
-rw-r--r--c/src/tests/tmtests/tm09/task1.c226
-rw-r--r--c/src/tests/tmtests/tm09/tm09.doc13
-rw-r--r--c/src/tests/tmtests/tm10/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm10/system.h43
-rw-r--r--c/src/tests/tmtests/tm10/task1.c165
-rw-r--r--c/src/tests/tmtests/tm10/tm10.doc13
-rw-r--r--c/src/tests/tmtests/tm11/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm11/system.h43
-rw-r--r--c/src/tests/tmtests/tm11/task1.c155
-rw-r--r--c/src/tests/tmtests/tm11/tm11.doc13
-rw-r--r--c/src/tests/tmtests/tm12/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm12/system.h43
-rw-r--r--c/src/tests/tmtests/tm12/task1.c146
-rw-r--r--c/src/tests/tmtests/tm12/tm12.doc13
-rw-r--r--c/src/tests/tmtests/tm13/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm13/system.h43
-rw-r--r--c/src/tests/tmtests/tm13/task1.c154
-rw-r--r--c/src/tests/tmtests/tm13/tm13.doc13
-rw-r--r--c/src/tests/tmtests/tm14/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm14/system.h43
-rw-r--r--c/src/tests/tmtests/tm14/task1.c146
-rw-r--r--c/src/tests/tmtests/tm14/tm14.doc13
-rw-r--r--c/src/tests/tmtests/tm15/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm15/system.h43
-rw-r--r--c/src/tests/tmtests/tm15/task1.c222
-rw-r--r--c/src/tests/tmtests/tm15/tm15.doc13
-rw-r--r--c/src/tests/tmtests/tm16/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm16/system.h43
-rw-r--r--c/src/tests/tmtests/tm16/task1.c148
-rw-r--r--c/src/tests/tmtests/tm16/tm16.doc13
-rw-r--r--c/src/tests/tmtests/tm17/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm17/system.h43
-rw-r--r--c/src/tests/tmtests/tm17/task1.c127
-rw-r--r--c/src/tests/tmtests/tm17/tm17.doc13
-rw-r--r--c/src/tests/tmtests/tm18/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm18/system.h43
-rw-r--r--c/src/tests/tmtests/tm18/task1.c112
-rw-r--r--c/src/tests/tmtests/tm18/tm18.doc13
-rw-r--r--c/src/tests/tmtests/tm19/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm19/system.h43
-rw-r--r--c/src/tests/tmtests/tm19/task1.c208
-rw-r--r--c/src/tests/tmtests/tm19/tm19.doc13
-rw-r--r--c/src/tests/tmtests/tm20/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm20/system.h44
-rw-r--r--c/src/tests/tmtests/tm20/task1.c466
-rw-r--r--c/src/tests/tmtests/tm20/tm20.doc13
-rw-r--r--c/src/tests/tmtests/tm21/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm21/system.h50
-rw-r--r--c/src/tests/tmtests/tm21/task1.c236
-rw-r--r--c/src/tests/tmtests/tm21/tm21.doc13
-rw-r--r--c/src/tests/tmtests/tm22/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm22/system.h43
-rw-r--r--c/src/tests/tmtests/tm22/task1.c200
-rw-r--r--c/src/tests/tmtests/tm22/tm22.doc13
-rw-r--r--c/src/tests/tmtests/tm23/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm23/system.h43
-rw-r--r--c/src/tests/tmtests/tm23/task1.c302
-rw-r--r--c/src/tests/tmtests/tm23/tm23.doc13
-rw-r--r--c/src/tests/tmtests/tm24/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm24/system.h42
-rw-r--r--c/src/tests/tmtests/tm24/task1.c124
-rw-r--r--c/src/tests/tmtests/tm24/tm24.doc13
-rw-r--r--c/src/tests/tmtests/tm25/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm25/system.h43
-rw-r--r--c/src/tests/tmtests/tm25/task1.c109
-rw-r--r--c/src/tests/tmtests/tm25/tm25.doc13
-rw-r--r--c/src/tests/tmtests/tm26/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm26/fptest.h165
-rw-r--r--c/src/tests/tmtests/tm26/system.h43
-rw-r--r--c/src/tests/tmtests/tm26/task1.c550
-rw-r--r--c/src/tests/tmtests/tm26/tm26.doc13
-rw-r--r--c/src/tests/tmtests/tm27/Makefile.in63
-rw-r--r--c/src/tests/tmtests/tm27/system.h42
-rw-r--r--c/src/tests/tmtests/tm27/task1.c272
-rw-r--r--c/src/tests/tmtests/tm27/tm27.doc13
-rw-r--r--c/src/tests/tmtests/tm28/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm28/system.h43
-rw-r--r--c/src/tests/tmtests/tm28/task1.c134
-rw-r--r--c/src/tests/tmtests/tm28/tm28.doc13
-rw-r--r--c/src/tests/tmtests/tm29/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tm29/system.h43
-rw-r--r--c/src/tests/tmtests/tm29/task1.c207
-rw-r--r--c/src/tests/tmtests/tm29/tm29.doc13
-rw-r--r--c/src/tests/tmtests/tmck/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tmck/system.h42
-rw-r--r--c/src/tests/tmtests/tmck/task1.c180
-rw-r--r--c/src/tests/tmtests/tmck/tmck.doc20
-rw-r--r--c/src/tests/tmtests/tmoverhd/Makefile.in60
-rw-r--r--c/src/tests/tmtests/tmoverhd/dumrtems.h255
-rw-r--r--c/src/tests/tmtests/tmoverhd/empty.c41
-rw-r--r--c/src/tests/tmtests/tmoverhd/system.h60
-rw-r--r--c/src/tests/tmtests/tmoverhd/testtask.c1279
-rw-r--r--c/src/tests/tmtests/tmoverhd/tmoverhd.doc13
-rw-r--r--c/src/tests/tools/generic/Makefile.in25
-rw-r--r--c/src/tests/tools/generic/difftest114
-rw-r--r--c/src/tests/tools/generic/sorttimes192
-rw-r--r--c/src/wrapup/Makefile.in34
-rw-r--r--c/update-tools/310_to_320_list543
-rw-r--r--c/update-tools/Makefile.in37
-rw-r--r--c/update-tools/README7
-rwxr-xr-xconfig.guess693
-rwxr-xr-xconfig.sub933
-rw-r--r--configure1738
-rw-r--r--configure.in639
-rw-r--r--cpukit/libcsupport/include/clockdrv.h51
-rw-r--r--cpukit/libcsupport/include/console.h69
-rw-r--r--cpukit/libcsupport/include/iosupp.h44
-rw-r--r--cpukit/libcsupport/include/ringbuf.h53
-rw-r--r--cpukit/libcsupport/include/rtems/assoc.h42
-rw-r--r--cpukit/libcsupport/include/rtems/error.h38
-rw-r--r--cpukit/libcsupport/include/rtems/libcsupport.h43
-rw-r--r--cpukit/libcsupport/include/rtems/libio.h124
-rw-r--r--cpukit/libcsupport/include/spurious.h38
-rw-r--r--cpukit/libcsupport/include/sys/utsname.h49
-rw-r--r--cpukit/libcsupport/include/timerdrv.h40
-rw-r--r--cpukit/libcsupport/include/vmeintr.h58
-rw-r--r--cpukit/libcsupport/src/README37
-rw-r--r--cpukit/libcsupport/src/__brk.c44
-rw-r--r--cpukit/libcsupport/src/__gettod.c103
-rw-r--r--cpukit/libcsupport/src/__times.c65
-rw-r--r--cpukit/libcsupport/src/assoc.c260
-rw-r--r--cpukit/libcsupport/src/error.c209
-rw-r--r--cpukit/libcsupport/src/hosterr.c43
-rw-r--r--cpukit/libcsupport/src/libio.c532
-rw-r--r--cpukit/libcsupport/src/malloc.c400
-rw-r--r--cpukit/libcsupport/src/newlibc.c430
-rw-r--r--cpukit/libcsupport/src/no_libc.c55
-rw-r--r--cpukit/libcsupport/src/unixlibc.c23
-rw-r--r--cpukit/libcsupport/src/utsname.c57
-rw-r--r--cpukit/libmisc/README16
-rw-r--r--cpukit/libmisc/cpuuse/README41
-rw-r--r--cpukit/libmisc/cpuuse/cpuuse.c142
-rw-r--r--cpukit/libmisc/cpuuse/cpuuse.h41
-rw-r--r--cpukit/libmisc/monitor/README97
-rw-r--r--cpukit/libmisc/monitor/mon-command.c187
-rw-r--r--cpukit/libmisc/monitor/mon-config.c131
-rw-r--r--cpukit/libmisc/monitor/mon-dname.c112
-rw-r--r--cpukit/libmisc/monitor/mon-driver.c136
-rw-r--r--cpukit/libmisc/monitor/mon-extension.c98
-rw-r--r--cpukit/libmisc/monitor/mon-itask.c115
-rw-r--r--cpukit/libmisc/monitor/mon-manager.c50
-rw-r--r--cpukit/libmisc/monitor/mon-monitor.c518
-rw-r--r--cpukit/libmisc/monitor/mon-mpci.c159
-rw-r--r--cpukit/libmisc/monitor/mon-object.c376
-rw-r--r--cpukit/libmisc/monitor/mon-prmisc.c254
-rw-r--r--cpukit/libmisc/monitor/mon-queue.c64
-rw-r--r--cpukit/libmisc/monitor/mon-server.c303
-rw-r--r--cpukit/libmisc/monitor/mon-symbols.c481
-rw-r--r--cpukit/libmisc/monitor/mon-task.c93
-rw-r--r--cpukit/libmisc/monitor/monitor.h443
-rw-r--r--cpukit/libmisc/monitor/symbols.h64
-rw-r--r--cpukit/libmisc/rtmonuse/rtmonuse.c173
-rw-r--r--cpukit/libmisc/rtmonuse/rtmonuse.h18
-rw-r--r--cpukit/libmisc/stackchk/README41
-rw-r--r--cpukit/libmisc/stackchk/check.c525
-rw-r--r--cpukit/libmisc/stackchk/internal.h96
-rw-r--r--cpukit/libmisc/stackchk/stackchk.h41
-rw-r--r--cpukit/posix/include/aio.h137
-rw-r--r--cpukit/posix/include/devctl.h30
-rw-r--r--cpukit/posix/include/intr.h72
-rw-r--r--cpukit/posix/include/mqueue.h145
-rw-r--r--cpukit/posix/include/rtems/posix/cancel.h16
-rw-r--r--cpukit/posix/include/rtems/posix/cond.h130
-rw-r--r--cpukit/posix/include/rtems/posix/condmp.h162
-rw-r--r--cpukit/posix/include/rtems/posix/config.h59
-rw-r--r--cpukit/posix/include/rtems/posix/intr.h154
-rw-r--r--cpukit/posix/include/rtems/posix/key.h136
-rw-r--r--cpukit/posix/include/rtems/posix/mqueue.h186
-rw-r--r--cpukit/posix/include/rtems/posix/mqueuemp.h161
-rw-r--r--cpukit/posix/include/rtems/posix/mutex.h120
-rw-r--r--cpukit/posix/include/rtems/posix/mutexmp.h161
-rw-r--r--cpukit/posix/include/rtems/posix/posixapi.h34
-rw-r--r--cpukit/posix/include/rtems/posix/priority.h44
-rw-r--r--cpukit/posix/include/rtems/posix/psignal.h17
-rw-r--r--cpukit/posix/include/rtems/posix/pthread.h123
-rw-r--r--cpukit/posix/include/rtems/posix/pthreadmp.h161
-rw-r--r--cpukit/posix/include/rtems/posix/semaphore.h135
-rw-r--r--cpukit/posix/include/rtems/posix/semaphoremp.h161
-rw-r--r--cpukit/posix/include/rtems/posix/threadsup.h46
-rw-r--r--cpukit/posix/include/rtems/posix/time.h50
-rw-r--r--cpukit/posix/include/sched.h88
-rw-r--r--cpukit/posix/include/semaphore.h108
-rw-r--r--cpukit/posix/inline/rtems/posix/cond.inl76
-rw-r--r--cpukit/posix/inline/rtems/posix/intr.inl72
-rw-r--r--cpukit/posix/inline/rtems/posix/key.inl70
-rw-r--r--cpukit/posix/inline/rtems/posix/mqueue.inl83
-rw-r--r--cpukit/posix/inline/rtems/posix/mutex.inl93
-rw-r--r--cpukit/posix/inline/rtems/posix/priority.inl37
-rw-r--r--cpukit/posix/inline/rtems/posix/pthread.inl70
-rw-r--r--cpukit/posix/inline/rtems/posix/semaphore.inl71
-rw-r--r--cpukit/posix/src/adasupp.c28
-rw-r--r--cpukit/posix/src/aio.c111
-rw-r--r--cpukit/posix/src/cancel.c228
-rw-r--r--cpukit/posix/src/cond.c501
-rw-r--r--cpukit/posix/src/devctl.c22
-rw-r--r--cpukit/posix/src/getpid.c22
-rw-r--r--cpukit/posix/src/intr.c340
-rw-r--r--cpukit/posix/src/key.c262
-rw-r--r--cpukit/posix/src/mqueue.c710
-rw-r--r--cpukit/posix/src/mutex.c683
-rw-r--r--cpukit/posix/src/psignal.c1347
-rw-r--r--cpukit/posix/src/pthread.c1309
-rw-r--r--cpukit/posix/src/ptimer.c75
-rw-r--r--cpukit/posix/src/sched.c153
-rw-r--r--cpukit/posix/src/semaphore.c571
-rw-r--r--cpukit/posix/src/time.c393
-rw-r--r--cpukit/posix/src/types.c212
-rw-r--r--cpukit/rtems/include/rtems.h121
-rw-r--r--cpukit/rtems/include/rtems/rtems/asr.h112
-rw-r--r--cpukit/rtems/include/rtems/rtems/attr.h84
-rw-r--r--cpukit/rtems/include/rtems/rtems/clock.h103
-rw-r--r--cpukit/rtems/include/rtems/rtems/config.h54
-rw-r--r--cpukit/rtems/include/rtems/rtems/dpmem.h157
-rw-r--r--cpukit/rtems/include/rtems/rtems/event.h174
-rw-r--r--cpukit/rtems/include/rtems/rtems/eventmp.h147
-rw-r--r--cpukit/rtems/include/rtems/rtems/eventset.h89
-rw-r--r--cpukit/rtems/include/rtems/rtems/intr.h160
-rw-r--r--cpukit/rtems/include/rtems/rtems/message.h317
-rw-r--r--cpukit/rtems/include/rtems/rtems/modes.h89
-rw-r--r--cpukit/rtems/include/rtems/rtems/mp.h53
-rw-r--r--cpukit/rtems/include/rtems/rtems/msgmp.h175
-rw-r--r--cpukit/rtems/include/rtems/rtems/options.h53
-rw-r--r--cpukit/rtems/include/rtems/rtems/part.h168
-rw-r--r--cpukit/rtems/include/rtems/rtems/partmp.h161
-rw-r--r--cpukit/rtems/include/rtems/rtems/ratemon.h213
-rw-r--r--cpukit/rtems/include/rtems/rtems/region.h234
-rw-r--r--cpukit/rtems/include/rtems/rtems/regionmp.h166
-rw-r--r--cpukit/rtems/include/rtems/rtems/rtemsapi.h34
-rw-r--r--cpukit/rtems/include/rtems/rtems/sem.h248
-rw-r--r--cpukit/rtems/include/rtems/rtems/semmp.h163
-rw-r--r--cpukit/rtems/include/rtems/rtems/signal.h83
-rw-r--r--cpukit/rtems/include/rtems/rtems/signalmp.h147
-rw-r--r--cpukit/rtems/include/rtems/rtems/status.h83
-rw-r--r--cpukit/rtems/include/rtems/rtems/support.h99
-rw-r--r--cpukit/rtems/include/rtems/rtems/taskmp.h167
-rw-r--r--cpukit/rtems/include/rtems/rtems/tasks.h421
-rw-r--r--cpukit/rtems/include/rtems/rtems/timer.h207
-rw-r--r--cpukit/rtems/include/rtems/rtems/types.h96
-rw-r--r--cpukit/rtems/inline/rtems/rtems/asr.inl128
-rw-r--r--cpukit/rtems/inline/rtems/rtems/attr.inl159
-rw-r--r--cpukit/rtems/inline/rtems/rtems/dpmem.inl95
-rw-r--r--cpukit/rtems/inline/rtems/rtems/event.inl21
-rw-r--r--cpukit/rtems/inline/rtems/rtems/eventset.inl91
-rw-r--r--cpukit/rtems/inline/rtems/rtems/message.inl83
-rw-r--r--cpukit/rtems/inline/rtems/rtems/modes.inl152
-rw-r--r--cpukit/rtems/inline/rtems/rtems/options.inl55
-rw-r--r--cpukit/rtems/inline/rtems/rtems/part.inl199
-rw-r--r--cpukit/rtems/inline/rtems/rtems/ratemon.inl143
-rw-r--r--cpukit/rtems/inline/rtems/rtems/region.inl127
-rw-r--r--cpukit/rtems/inline/rtems/rtems/sem.inl93
-rw-r--r--cpukit/rtems/inline/rtems/rtems/status.inl56
-rw-r--r--cpukit/rtems/inline/rtems/rtems/support.inl61
-rw-r--r--cpukit/rtems/inline/rtems/rtems/tasks.inl90
-rw-r--r--cpukit/rtems/inline/rtems/rtems/timer.inl142
-rw-r--r--cpukit/rtems/macros/rtems/rtems/asr.inl90
-rw-r--r--cpukit/rtems/macros/rtems/rtems/attr.inl91
-rw-r--r--cpukit/rtems/macros/rtems/rtems/dpmem.inl59
-rw-r--r--cpukit/rtems/macros/rtems/rtems/event.inl21
-rw-r--r--cpukit/rtems/macros/rtems/rtems/eventset.inl53
-rw-r--r--cpukit/rtems/macros/rtems/rtems/message.inl49
-rw-r--r--cpukit/rtems/macros/rtems/rtems/modes.inl92
-rw-r--r--cpukit/rtems/macros/rtems/rtems/options.inl39
-rw-r--r--cpukit/rtems/macros/rtems/rtems/part.inl117
-rw-r--r--cpukit/rtems/macros/rtems/rtems/ratemon.inl85
-rw-r--r--cpukit/rtems/macros/rtems/rtems/region.inl75
-rw-r--r--cpukit/rtems/macros/rtems/rtems/sem.inl58
-rw-r--r--cpukit/rtems/macros/rtems/rtems/status.inl39
-rw-r--r--cpukit/rtems/macros/rtems/rtems/support.inl44
-rw-r--r--cpukit/rtems/macros/rtems/rtems/tasks.inl58
-rw-r--r--cpukit/rtems/macros/rtems/rtems/timer.inl85
-rw-r--r--cpukit/rtems/src/dpmem.c281
-rw-r--r--cpukit/rtems/src/event.c383
-rw-r--r--cpukit/rtems/src/eventmp.c190
-rw-r--r--cpukit/rtems/src/intr.c65
-rw-r--r--cpukit/rtems/src/mp.c42
-rw-r--r--cpukit/rtems/src/msg.c714
-rw-r--r--cpukit/rtems/src/msgmp.c458
-rw-r--r--cpukit/rtems/src/part.c341
-rw-r--r--cpukit/rtems/src/partmp.c302
-rw-r--r--cpukit/rtems/src/ratemon.c461
-rw-r--r--cpukit/rtems/src/region.c486
-rw-r--r--cpukit/rtems/src/regionmp.c310
-rw-r--r--cpukit/rtems/src/rtclock.c151
-rw-r--r--cpukit/rtems/src/rtemstimer.c349
-rw-r--r--cpukit/rtems/src/sem.c571
-rw-r--r--cpukit/rtems/src/semmp.c308
-rw-r--r--cpukit/rtems/src/signal.c149
-rw-r--r--cpukit/rtems/src/signalmp.c189
-rw-r--r--cpukit/rtems/src/taskmp.c340
-rw-r--r--cpukit/rtems/src/tasks.c1119
-rw-r--r--cpukit/sapi/include/confdefs.h485
-rw-r--r--cpukit/sapi/include/rtems/README135
-rw-r--r--cpukit/sapi/include/rtems/config.h103
-rw-r--r--cpukit/sapi/include/rtems/extension.h136
-rw-r--r--cpukit/sapi/include/rtems/fatal.h49
-rw-r--r--cpukit/sapi/include/rtems/init.h110
-rw-r--r--cpukit/sapi/include/rtems/io.h244
-rw-r--r--cpukit/sapi/include/rtems/mptables.h29
-rw-r--r--cpukit/sapi/inline/rtems/extension.inl91
-rw-r--r--cpukit/sapi/macros/rtems/extension.inl58
-rw-r--r--cpukit/sapi/src/debug.c62
-rw-r--r--cpukit/sapi/src/exinit.c297
-rw-r--r--cpukit/sapi/src/extension.c165
-rw-r--r--cpukit/sapi/src/fatal.c38
-rw-r--r--cpukit/sapi/src/io.c345
-rw-r--r--cpukit/sapi/src/posixapi.c96
-rw-r--r--cpukit/sapi/src/rtemsapi.c90
-rw-r--r--cpukit/score/cpu/a29k/amd.ah531
-rw-r--r--cpukit/score/cpu/a29k/asm.h103
-rw-r--r--cpukit/score/cpu/a29k/cpu.c263
-rw-r--r--cpukit/score/cpu/a29k/pswmacro.ah442
-rw-r--r--cpukit/score/cpu/hppa1.1/cpu.c184
-rw-r--r--cpukit/score/cpu/i386/asm.h143
-rw-r--r--cpukit/score/cpu/i386/cpu.c177
-rw-r--r--cpukit/score/cpu/i386/rtems/asm.h143
-rw-r--r--cpukit/score/cpu/i960/asm.h110
-rw-r--r--cpukit/score/cpu/i960/cpu.c155
-rw-r--r--cpukit/score/cpu/m68k/asm.h132
-rw-r--r--cpukit/score/cpu/m68k/cpu.c179
-rw-r--r--cpukit/score/cpu/m68k/m68302.h608
-rw-r--r--cpukit/score/cpu/m68k/m68360.h880
-rw-r--r--cpukit/score/cpu/m68k/qsm.h209
-rw-r--r--cpukit/score/cpu/m68k/rtems/asm.h132
-rw-r--r--cpukit/score/cpu/m68k/rtems/m68k/m68302.h608
-rw-r--r--cpukit/score/cpu/m68k/rtems/m68k/m68360.h880
-rw-r--r--cpukit/score/cpu/m68k/rtems/m68k/qsm.h209
-rw-r--r--cpukit/score/cpu/m68k/rtems/m68k/sim.h342
-rw-r--r--cpukit/score/cpu/m68k/sim.h342
-rw-r--r--cpukit/score/cpu/mips/asm.h102
-rw-r--r--cpukit/score/cpu/mips/cpu.c219
-rw-r--r--cpukit/score/cpu/mips/cpu_asm.S972
-rw-r--r--cpukit/score/cpu/mips/idtcpu.h440
-rw-r--r--cpukit/score/cpu/mips/iregdef.h325
-rw-r--r--cpukit/score/cpu/mips/rtems/asm.h102
-rw-r--r--cpukit/score/cpu/mips/rtems/mips/idtcpu.h440
-rw-r--r--cpukit/score/cpu/mips/rtems/mips/iregdef.h325
-rw-r--r--cpukit/score/cpu/mips64orion/asm.h102
-rw-r--r--cpukit/score/cpu/mips64orion/cpu.c219
-rw-r--r--cpukit/score/cpu/mips64orion/cpu_asm.S972
-rw-r--r--cpukit/score/cpu/mips64orion/cpu_asm.h115
-rw-r--r--cpukit/score/cpu/mips64orion/idtcpu.h440
-rw-r--r--cpukit/score/cpu/mips64orion/idtmon.h171
-rw-r--r--cpukit/score/cpu/mips64orion/iregdef.h325
-rw-r--r--cpukit/score/cpu/no_cpu/asm.h101
-rw-r--r--cpukit/score/cpu/no_cpu/cpu.c162
-rw-r--r--cpukit/score/cpu/no_cpu/cpu_asm.c165
-rw-r--r--cpukit/score/cpu/no_cpu/rtems/asm.h101
-rw-r--r--cpukit/score/cpu/sparc/README110
-rw-r--r--cpukit/score/cpu/sparc/asm.h123
-rw-r--r--cpukit/score/cpu/sparc/cpu.c409
-rw-r--r--cpukit/score/cpu/sparc/rtems/asm.h123
-rw-r--r--cpukit/score/cpu/unix/cpu.c1105
-rw-r--r--cpukit/score/include/rtems/debug.h98
-rw-r--r--cpukit/score/include/rtems/score/address.h31
-rw-r--r--cpukit/score/include/rtems/score/apiext.h102
-rw-r--r--cpukit/score/include/rtems/score/bitfield.h98
-rw-r--r--cpukit/score/include/rtems/score/chain.h168
-rw-r--r--cpukit/score/include/rtems/score/context.h134
-rw-r--r--cpukit/score/include/rtems/score/copyrt.h42
-rw-r--r--cpukit/score/include/rtems/score/coremsg.h267
-rw-r--r--cpukit/score/include/rtems/score/coremutex.h172
-rw-r--r--cpukit/score/include/rtems/score/coresem.h156
-rw-r--r--cpukit/score/include/rtems/score/heap.h226
-rw-r--r--cpukit/score/include/rtems/score/interr.h95
-rw-r--r--cpukit/score/include/rtems/score/isr.h224
-rw-r--r--cpukit/score/include/rtems/score/mpci.h412
-rw-r--r--cpukit/score/include/rtems/score/mppkt.h101
-rw-r--r--cpukit/score/include/rtems/score/object.h397
-rw-r--r--cpukit/score/include/rtems/score/objectmp.h152
-rw-r--r--cpukit/score/include/rtems/score/priority.h97
-rw-r--r--cpukit/score/include/rtems/score/stack.h50
-rw-r--r--cpukit/score/include/rtems/score/states.h84
-rw-r--r--cpukit/score/include/rtems/score/sysstate.h67
-rw-r--r--cpukit/score/include/rtems/score/thread.h630
-rw-r--r--cpukit/score/include/rtems/score/threadmp.h89
-rw-r--r--cpukit/score/include/rtems/score/threadq.h301
-rw-r--r--cpukit/score/include/rtems/score/tod.h277
-rw-r--r--cpukit/score/include/rtems/score/tqdata.h90
-rw-r--r--cpukit/score/include/rtems/score/userext.h213
-rw-r--r--cpukit/score/include/rtems/score/watchdog.h194
-rw-r--r--cpukit/score/include/rtems/score/wkspace.h71
-rw-r--r--cpukit/score/include/rtems/system.h153
-rw-r--r--cpukit/score/inline/rtems/score/address.inl120
-rw-r--r--cpukit/score/inline/rtems/score/chain.inl390
-rw-r--r--cpukit/score/inline/rtems/score/coremsg.inl260
-rw-r--r--cpukit/score/inline/rtems/score/coremutex.inl124
-rw-r--r--cpukit/score/inline/rtems/score/coresem.inl54
-rw-r--r--cpukit/score/inline/rtems/score/heap.inl274
-rw-r--r--cpukit/score/inline/rtems/score/isr.inl73
-rw-r--r--cpukit/score/inline/rtems/score/mppkt.inl58
-rw-r--r--cpukit/score/inline/rtems/score/object.inl244
-rw-r--r--cpukit/score/inline/rtems/score/objectmp.inl73
-rw-r--r--cpukit/score/inline/rtems/score/priority.inl247
-rw-r--r--cpukit/score/inline/rtems/score/stack.inl81
-rw-r--r--cpukit/score/inline/rtems/score/states.inl384
-rw-r--r--cpukit/score/inline/rtems/score/sysstate.inl154
-rw-r--r--cpukit/score/inline/rtems/score/thread.inl404
-rw-r--r--cpukit/score/inline/rtems/score/threadmp.inl61
-rw-r--r--cpukit/score/inline/rtems/score/tod.inl67
-rw-r--r--cpukit/score/inline/rtems/score/tqdata.inl73
-rw-r--r--cpukit/score/inline/rtems/score/userext.inl121
-rw-r--r--cpukit/score/inline/rtems/score/watchdog.inl324
-rw-r--r--cpukit/score/inline/rtems/score/wkspace.inl57
-rw-r--r--cpukit/score/macros/README18
-rw-r--r--cpukit/score/macros/rtems/score/README18
-rw-r--r--cpukit/score/macros/rtems/score/address.inl68
-rw-r--r--cpukit/score/macros/rtems/score/chain.inl200
-rw-r--r--cpukit/score/macros/rtems/score/coremsg.inl143
-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.inl150
-rw-r--r--cpukit/score/macros/rtems/score/isr.inl48
-rw-r--r--cpukit/score/macros/rtems/score/mppkt.inl41
-rw-r--r--cpukit/score/macros/rtems/score/object.inl148
-rw-r--r--cpukit/score/macros/rtems/score/objectmp.inl50
-rw-r--r--cpukit/score/macros/rtems/score/priority.inl170
-rw-r--r--cpukit/score/macros/rtems/score/stack.inl50
-rw-r--r--cpukit/score/macros/rtems/score/states.inl210
-rw-r--r--cpukit/score/macros/rtems/score/sysstate.inl90
-rw-r--r--cpukit/score/macros/rtems/score/thread.inl217
-rw-r--r--cpukit/score/macros/rtems/score/threadmp.inl50
-rw-r--r--cpukit/score/macros/rtems/score/tod.inl49
-rw-r--r--cpukit/score/macros/rtems/score/tqdata.inl50
-rw-r--r--cpukit/score/macros/rtems/score/userext.inl126
-rw-r--r--cpukit/score/macros/rtems/score/watchdog.inl172
-rw-r--r--cpukit/score/macros/rtems/score/wkspace.inl39
-rw-r--r--cpukit/score/src/apiext.c105
-rw-r--r--cpukit/score/src/chain.c202
-rw-r--r--cpukit/score/src/coremsg.c432
-rw-r--r--cpukit/score/src/coremutex.c330
-rw-r--r--cpukit/score/src/coresem.c184
-rw-r--r--cpukit/score/src/coretod.c238
-rw-r--r--cpukit/score/src/heap.c538
-rw-r--r--cpukit/score/src/interr.c61
-rw-r--r--cpukit/score/src/isr.c60
-rw-r--r--cpukit/score/src/mpci.c525
-rw-r--r--cpukit/score/src/object.c516
-rw-r--r--cpukit/score/src/objectmp.c275
-rw-r--r--cpukit/score/src/thread.c1395
-rw-r--r--cpukit/score/src/threadmp.c164
-rw-r--r--cpukit/score/src/threadq.c967
-rw-r--r--cpukit/score/src/userext.c204
-rw-r--r--cpukit/score/src/watchdog.c273
-rw-r--r--cpukit/score/src/wkspace.c88
-rw-r--r--cpukit/zlib/doc/rfc1950.txt619
-rw-r--r--cpukit/zlib/doc/rfc1951.txt955
-rw-r--r--cpukit/zlib/doc/rfc1952.txt675
-rw-r--r--doc/Makefile.in29
-rwxr-xr-xinstall-sh250
-rwxr-xr-xmkinstalldirs35
-rw-r--r--testsuites/README44
-rw-r--r--testsuites/libtests/README10
-rw-r--r--testsuites/libtests/cpuuse/cpuuse.scn24
-rw-r--r--testsuites/libtests/cpuuse/init.c106
-rw-r--r--testsuites/libtests/cpuuse/system.h67
-rw-r--r--testsuites/libtests/cpuuse/task1.c103
-rw-r--r--testsuites/libtests/cpuuse/task2.c29
-rw-r--r--testsuites/libtests/cpuuse/task3.c29
-rw-r--r--testsuites/libtests/cpuuse/tswitch.c62
-rw-r--r--testsuites/libtests/malloctest/init.c114
-rw-r--r--testsuites/libtests/malloctest/system.h49
-rw-r--r--testsuites/libtests/malloctest/task1.c67
-rw-r--r--testsuites/libtests/rtmonuse/getall.c43
-rw-r--r--testsuites/libtests/rtmonuse/init.c71
-rw-r--r--testsuites/libtests/rtmonuse/rtmonuse.scn27
-rw-r--r--testsuites/libtests/rtmonuse/system.h61
-rw-r--r--testsuites/libtests/rtmonuse/task1.c124
-rw-r--r--testsuites/libtests/stackchk/blow.c49
-rw-r--r--testsuites/libtests/stackchk/init.c86
-rw-r--r--testsuites/libtests/stackchk/stackchk.scn9
-rw-r--r--testsuites/libtests/stackchk/system.h51
-rw-r--r--testsuites/libtests/stackchk/task1.c44
-rw-r--r--testsuites/mptests/README10
-rw-r--r--testsuites/mptests/mp01/init.c96
-rw-r--r--testsuites/mptests/mp01/node1/mp01.doc53
-rw-r--r--testsuites/mptests/mp01/node1/mp01.scn15
-rw-r--r--testsuites/mptests/mp01/node2/mp01.doc13
-rw-r--r--testsuites/mptests/mp01/node2/mp01.scn15
-rw-r--r--testsuites/mptests/mp01/system.h46
-rw-r--r--testsuites/mptests/mp01/task1.c84
-rw-r--r--testsuites/mptests/mp02/init.c60
-rw-r--r--testsuites/mptests/mp02/node1/mp02.doc47
-rw-r--r--testsuites/mptests/mp02/node1/mp02.scn14
-rw-r--r--testsuites/mptests/mp02/node2/mp02.doc13
-rw-r--r--testsuites/mptests/mp02/node2/mp02.scn14
-rw-r--r--testsuites/mptests/mp02/system.h45
-rw-r--r--testsuites/mptests/mp02/task1.c118
-rw-r--r--testsuites/mptests/mp03/delay.c31
-rw-r--r--testsuites/mptests/mp03/init.c65
-rw-r--r--testsuites/mptests/mp03/node1/mp03.doc45
-rw-r--r--testsuites/mptests/mp03/node1/mp03.scn24
-rw-r--r--testsuites/mptests/mp03/node2/mp03.doc13
-rw-r--r--testsuites/mptests/mp03/node2/mp03.scn24
-rw-r--r--testsuites/mptests/mp03/system.h58
-rw-r--r--testsuites/mptests/mp03/task1.c155
-rw-r--r--testsuites/mptests/mp04/init.c60
-rw-r--r--testsuites/mptests/mp04/node1/mp04.doc41
-rw-r--r--testsuites/mptests/mp04/node1/mp04.scn8
-rw-r--r--testsuites/mptests/mp04/node2/mp04.doc13
-rw-r--r--testsuites/mptests/mp04/node2/mp04.scn8
-rw-r--r--testsuites/mptests/mp04/system.h47
-rw-r--r--testsuites/mptests/mp04/task1.c83
-rw-r--r--testsuites/mptests/mp05/asr.c37
-rw-r--r--testsuites/mptests/mp05/init.c65
-rw-r--r--testsuites/mptests/mp05/node1/mp05.doc45
-rw-r--r--testsuites/mptests/mp05/node1/mp05.scn11
-rw-r--r--testsuites/mptests/mp05/node2/mp05.doc13
-rw-r--r--testsuites/mptests/mp05/node2/mp05.scn10
-rw-r--r--testsuites/mptests/mp05/system.h61
-rw-r--r--testsuites/mptests/mp05/task1.c106
-rw-r--r--testsuites/mptests/mp06/init.c65
-rw-r--r--testsuites/mptests/mp06/node1/mp06.doc45
-rw-r--r--testsuites/mptests/mp06/node1/mp06.scn11
-rw-r--r--testsuites/mptests/mp06/node2/mp06.doc13
-rw-r--r--testsuites/mptests/mp06/node2/mp06.scn12
-rw-r--r--testsuites/mptests/mp06/system.h52
-rw-r--r--testsuites/mptests/mp06/task1.c176
-rw-r--r--testsuites/mptests/mp07/init.c65
-rw-r--r--testsuites/mptests/mp07/node1/mp07.doc46
-rw-r--r--testsuites/mptests/mp07/node1/mp07.scn10
-rw-r--r--testsuites/mptests/mp07/node2/mp07.doc13
-rw-r--r--testsuites/mptests/mp07/node2/mp07.scn9
-rw-r--r--testsuites/mptests/mp07/system.h52
-rw-r--r--testsuites/mptests/mp07/task1.c103
-rw-r--r--testsuites/mptests/mp08/init.c74
-rw-r--r--testsuites/mptests/mp08/node1/mp08.doc52
-rw-r--r--testsuites/mptests/mp08/node1/mp08.scn11
-rw-r--r--testsuites/mptests/mp08/node2/mp08.doc13
-rw-r--r--testsuites/mptests/mp08/node2/mp08.scn12
-rw-r--r--testsuites/mptests/mp08/system.h51
-rw-r--r--testsuites/mptests/mp08/task1.c89
-rw-r--r--testsuites/mptests/mp09/init.c74
-rw-r--r--testsuites/mptests/mp09/node1/mp09.doc50
-rw-r--r--testsuites/mptests/mp09/node1/mp09.scn22
-rw-r--r--testsuites/mptests/mp09/node2/mp09.doc13
-rw-r--r--testsuites/mptests/mp09/node2/mp09.scn27
-rw-r--r--testsuites/mptests/mp09/recvmsg.c47
-rw-r--r--testsuites/mptests/mp09/sendmsg.c60
-rw-r--r--testsuites/mptests/mp09/system.h60
-rw-r--r--testsuites/mptests/mp09/task1.c109
-rw-r--r--testsuites/mptests/mp10/init.c143
-rw-r--r--testsuites/mptests/mp10/node1/mp10.doc46
-rw-r--r--testsuites/mptests/mp10/node1/mp10.scn4
-rw-r--r--testsuites/mptests/mp10/node2/mp10.doc13
-rw-r--r--testsuites/mptests/mp10/node2/mp10.scn19
-rw-r--r--testsuites/mptests/mp10/system.h64
-rw-r--r--testsuites/mptests/mp10/task1.c52
-rw-r--r--testsuites/mptests/mp10/task2.c47
-rw-r--r--testsuites/mptests/mp10/task3.c50
-rw-r--r--testsuites/mptests/mp11/init.c105
-rw-r--r--testsuites/mptests/mp11/node1/mp11.doc42
-rw-r--r--testsuites/mptests/mp11/node1/mp11.scn10
-rw-r--r--testsuites/mptests/mp11/node2/mp11.doc13
-rw-r--r--testsuites/mptests/mp11/node2/mp11.scn2
-rw-r--r--testsuites/mptests/mp11/system.h56
-rw-r--r--testsuites/mptests/mp12/init.c113
-rw-r--r--testsuites/mptests/mp12/node1/mp12.doc52
-rw-r--r--testsuites/mptests/mp12/node1/mp12.scn6
-rw-r--r--testsuites/mptests/mp12/node2/mp12.doc13
-rw-r--r--testsuites/mptests/mp12/node2/mp12.scn10
-rw-r--r--testsuites/mptests/mp12/system.h55
-rw-r--r--testsuites/mptests/mp13/init.c115
-rw-r--r--testsuites/mptests/mp13/node1/mp13.doc48
-rw-r--r--testsuites/mptests/mp13/node1/mp13.scn14
-rw-r--r--testsuites/mptests/mp13/node2/mp13.doc13
-rw-r--r--testsuites/mptests/mp13/node2/mp13.scn16
-rw-r--r--testsuites/mptests/mp13/system.h60
-rw-r--r--testsuites/mptests/mp13/task1.c73
-rw-r--r--testsuites/mptests/mp13/task2.c106
-rw-r--r--testsuites/mptests/mp14/delay.c34
-rw-r--r--testsuites/mptests/mp14/evtask1.c87
-rw-r--r--testsuites/mptests/mp14/evtmtask.c65
-rw-r--r--testsuites/mptests/mp14/exit.c40
-rw-r--r--testsuites/mptests/mp14/init.c191
-rw-r--r--testsuites/mptests/mp14/msgtask1.c107
-rw-r--r--testsuites/mptests/mp14/node1/mp14.doc50
-rw-r--r--testsuites/mptests/mp14/node1/mp14.scn41
-rw-r--r--testsuites/mptests/mp14/node2/mp14.doc13
-rw-r--r--testsuites/mptests/mp14/node2/mp14.scn38
-rw-r--r--testsuites/mptests/mp14/pttask1.c71
-rw-r--r--testsuites/mptests/mp14/smtask1.c73
-rw-r--r--testsuites/mptests/mp14/system.h117
-rw-r--r--testsuites/psxtests/include/pmacros.h85
-rw-r--r--testsuites/psxtests/psx01/init.c225
-rw-r--r--testsuites/psxtests/psx01/psx01.scn46
-rw-r--r--testsuites/psxtests/psx01/system.h56
-rw-r--r--testsuites/psxtests/psx01/task.c94
-rw-r--r--testsuites/psxtests/psx02/init.c146
-rw-r--r--testsuites/psxtests/psx02/psx02.scn26
-rw-r--r--testsuites/psxtests/psx02/system.h52
-rw-r--r--testsuites/psxtests/psx02/task.c45
-rw-r--r--testsuites/psxtests/psx03/init.c176
-rw-r--r--testsuites/psxtests/psx03/psx03.scn17
-rw-r--r--testsuites/psxtests/psx03/system.h55
-rw-r--r--testsuites/psxtests/psx03/task.c65
-rw-r--r--testsuites/psxtests/psx04/init.c564
-rw-r--r--testsuites/psxtests/psx04/psx04.scn112
-rw-r--r--testsuites/psxtests/psx04/system.h63
-rw-r--r--testsuites/psxtests/psx04/task1.c44
-rw-r--r--testsuites/psxtests/psx04/task2.c42
-rw-r--r--testsuites/psxtests/psx04/task3.c119
-rw-r--r--testsuites/psxtests/psx05/init.c569
-rw-r--r--testsuites/psxtests/psx05/psx05.scn111
-rw-r--r--testsuites/psxtests/psx05/system.h67
-rw-r--r--testsuites/psxtests/psx05/task.c58
-rw-r--r--testsuites/psxtests/psx05/task2.c49
-rw-r--r--testsuites/psxtests/psx05/task3.c51
-rw-r--r--testsuites/psxtests/psx06/init.c121
-rw-r--r--testsuites/psxtests/psx06/psx06.scn21
-rw-r--r--testsuites/psxtests/psx06/system.h61
-rw-r--r--testsuites/psxtests/psx06/task.c51
-rw-r--r--testsuites/psxtests/psx06/task2.c52
-rw-r--r--testsuites/psxtests/psx07/init.c491
-rw-r--r--testsuites/psxtests/psx07/psx07.scn105
-rw-r--r--testsuites/psxtests/psx07/system.h51
-rw-r--r--testsuites/psxtests/psx07/task.c34
-rw-r--r--testsuites/psxtests/psx08/init.c82
-rw-r--r--testsuites/psxtests/psx08/psx08.scn18
-rw-r--r--testsuites/psxtests/psx08/system.h56
-rw-r--r--testsuites/psxtests/psx08/task2.c52
-rw-r--r--testsuites/psxtests/psx09/init.c226
-rw-r--r--testsuites/psxtests/psx09/psx09.scn23
-rw-r--r--testsuites/psxtests/psx09/system.h58
-rw-r--r--testsuites/psxtests/psx10/init.c312
-rw-r--r--testsuites/psxtests/psx10/psx10.scn60
-rw-r--r--testsuites/psxtests/psx10/system.h69
-rw-r--r--testsuites/psxtests/psx10/task.c65
-rw-r--r--testsuites/psxtests/psx10/task2.c47
-rw-r--r--testsuites/psxtests/psx10/task3.c46
-rw-r--r--testsuites/psxtests/psx11/init.c108
-rw-r--r--testsuites/psxtests/psx11/psx11.scn18
-rw-r--r--testsuites/psxtests/psx11/system.h51
-rw-r--r--testsuites/psxtests/psx11/task.c92
-rw-r--r--testsuites/psxtests/psx12/init.c140
-rw-r--r--testsuites/psxtests/psx12/psx12.scn11
-rw-r--r--testsuites/psxtests/psx12/system.h54
-rw-r--r--testsuites/psxtests/psx12/task.c34
-rw-r--r--testsuites/psxtests/psxhdrs/clock01.c29
-rw-r--r--testsuites/psxtests/psxhdrs/clock02.c29
-rw-r--r--testsuites/psxtests/psxhdrs/clock03.c30
-rw-r--r--testsuites/psxtests/psxhdrs/clock04.c29
-rw-r--r--testsuites/psxtests/psxhdrs/clock05.c35
-rw-r--r--testsuites/psxtests/psxhdrs/clock06.c32
-rw-r--r--testsuites/psxtests/psxhdrs/cond01.c28
-rw-r--r--testsuites/psxtests/psxhdrs/cond02.c28
-rw-r--r--testsuites/psxtests/psxhdrs/cond03.c29
-rw-r--r--testsuites/psxtests/psxhdrs/cond04.c28
-rw-r--r--testsuites/psxtests/psxhdrs/cond05.c28
-rw-r--r--testsuites/psxtests/psxhdrs/cond06.c29
-rw-r--r--testsuites/psxtests/psxhdrs/cond07.c30
-rw-r--r--testsuites/psxtests/psxhdrs/cond08.c32
-rw-r--r--testsuites/psxtests/psxhdrs/cond09.c35
-rw-r--r--testsuites/psxtests/psxhdrs/cond10.c28
-rw-r--r--testsuites/psxtests/psxhdrs/key01.c34
-rw-r--r--testsuites/psxtests/psxhdrs/key02.c32
-rw-r--r--testsuites/psxtests/psxhdrs/key03.c30
-rw-r--r--testsuites/psxtests/psxhdrs/key04.c28
-rw-r--r--testsuites/psxtests/psxhdrs/mutex01.c28
-rw-r--r--testsuites/psxtests/psxhdrs/mutex02.c28
-rw-r--r--testsuites/psxtests/psxhdrs/mutex03.c29
-rw-r--r--testsuites/psxtests/psxhdrs/mutex04.c28
-rw-r--r--testsuites/psxtests/psxhdrs/mutex05.c28
-rw-r--r--testsuites/psxtests/psxhdrs/mutex06.c28
-rw-r--r--testsuites/psxtests/psxhdrs/mutex07.c36
-rw-r--r--testsuites/psxtests/psxhdrs/mutex08.c32
-rw-r--r--testsuites/psxtests/psxhdrs/mutex09.c32
-rw-r--r--testsuites/psxtests/psxhdrs/mutex10.c32
-rw-r--r--testsuites/psxtests/psxhdrs/mutex11.c35
-rw-r--r--testsuites/psxtests/psxhdrs/mutex12.c28
-rw-r--r--testsuites/psxtests/psxhdrs/mutex13.c32
-rw-r--r--testsuites/psxtests/psxhdrs/mutex14.c32
-rw-r--r--testsuites/psxtests/psxhdrs/mutex15.c32
-rw-r--r--testsuites/psxtests/psxhdrs/mutex16.c35
-rw-r--r--testsuites/psxtests/psxhdrs/proc01.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc02.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc03.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc04.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc05.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc06.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc07.c26
-rw-r--r--testsuites/psxtests/psxhdrs/proc08.c26
-rw-r--r--testsuites/psxtests/psxhdrs/proc09.c27
-rw-r--r--testsuites/psxtests/psxhdrs/proc10.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc11.c25
-rw-r--r--testsuites/psxtests/psxhdrs/proc12.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc13.c23
-rw-r--r--testsuites/psxtests/psxhdrs/proc14.c25
-rw-r--r--testsuites/psxtests/psxhdrs/pthread01.c28
-rw-r--r--testsuites/psxtests/psxhdrs/pthread02.c28
-rw-r--r--testsuites/psxtests/psxhdrs/pthread03.c32
-rw-r--r--testsuites/psxtests/psxhdrs/pthread04.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread05.c36
-rw-r--r--testsuites/psxtests/psxhdrs/pthread06.c33
-rw-r--r--testsuites/psxtests/psxhdrs/pthread07.c38
-rw-r--r--testsuites/psxtests/psxhdrs/pthread08.c27
-rw-r--r--testsuites/psxtests/psxhdrs/pthread09.c27
-rw-r--r--testsuites/psxtests/psxhdrs/pthread10.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread11.c52
-rw-r--r--testsuites/psxtests/psxhdrs/pthread12.c32
-rw-r--r--testsuites/psxtests/psxhdrs/pthread13.c32
-rw-r--r--testsuites/psxtests/psxhdrs/pthread14.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread15.c32
-rw-r--r--testsuites/psxtests/psxhdrs/pthread16.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread17.c36
-rw-r--r--testsuites/psxtests/psxhdrs/pthread18.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread19.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread20.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread21.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread22.c50
-rw-r--r--testsuites/psxtests/psxhdrs/pthread23.c30
-rw-r--r--testsuites/psxtests/psxhdrs/pthread24.c36
-rw-r--r--testsuites/psxtests/psxhdrs/pthread25.c34
-rw-r--r--testsuites/psxtests/psxhdrs/pthread26.c31
-rw-r--r--testsuites/psxtests/psxhdrs/pthread27.c32
-rw-r--r--testsuites/psxtests/psxhdrs/pthread28.c33
-rw-r--r--testsuites/psxtests/psxhdrs/pthread29.c36
-rw-r--r--testsuites/psxtests/psxhdrs/pthread30.c36
-rw-r--r--testsuites/psxtests/psxhdrs/pthread31.c29
-rw-r--r--testsuites/psxtests/psxhdrs/pthread32.c35
-rw-r--r--testsuites/psxtests/psxhdrs/pthread33.c25
-rw-r--r--testsuites/psxtests/psxhdrs/pthread34.c31
-rw-r--r--testsuites/psxtests/psxhdrs/pthread35.c32
-rw-r--r--testsuites/psxtests/psxhdrs/pthread36.c29
-rw-r--r--testsuites/psxtests/psxhdrs/sched01.c44
-rw-r--r--testsuites/psxtests/psxhdrs/sched02.c31
-rw-r--r--testsuites/psxtests/psxhdrs/sched03.c52
-rw-r--r--testsuites/psxtests/psxhdrs/sched04.c30
-rw-r--r--testsuites/psxtests/psxhdrs/sched05.c27
-rw-r--r--testsuites/psxtests/psxhdrs/sched06.c35
-rw-r--r--testsuites/psxtests/psxhdrs/sched07.c35
-rw-r--r--testsuites/psxtests/psxhdrs/sched08.c31
-rw-r--r--testsuites/psxtests/psxhdrs/signal01.c27
-rw-r--r--testsuites/psxtests/psxhdrs/signal02.c27
-rw-r--r--testsuites/psxtests/psxhdrs/signal03.c24
-rw-r--r--testsuites/psxtests/psxhdrs/signal04.c27
-rw-r--r--testsuites/psxtests/psxhdrs/signal05.c24
-rw-r--r--testsuites/psxtests/psxhdrs/signal06.c39
-rw-r--r--testsuites/psxtests/psxhdrs/signal07.c32
-rw-r--r--testsuites/psxtests/psxhdrs/signal08.c34
-rw-r--r--testsuites/psxtests/psxhdrs/signal09.c29
-rw-r--r--testsuites/psxtests/psxhdrs/signal10.c25
-rw-r--r--testsuites/psxtests/psxhdrs/signal11.c26
-rw-r--r--testsuites/psxtests/psxhdrs/signal12.c26
-rw-r--r--testsuites/psxtests/psxhdrs/signal13.c32
-rw-r--r--testsuites/psxtests/psxhdrs/signal14.c26
-rw-r--r--testsuites/psxtests/psxhdrs/signal15.c26
-rw-r--r--testsuites/psxtests/psxhdrs/signal16.c36
-rw-r--r--testsuites/psxtests/psxhdrs/signal17.c27
-rw-r--r--testsuites/psxtests/psxhdrs/signal18.c28
-rw-r--r--testsuites/psxtests/psxhdrs/signal19.c27
-rw-r--r--testsuites/psxtests/psxhdrs/signal20.c26
-rw-r--r--testsuites/psxtests/psxhdrs/signal21.c23
-rw-r--r--testsuites/psxtests/psxhdrs/signal22.c26
-rw-r--r--testsuites/psxtests/psxhdrs/time01.c23
-rw-r--r--testsuites/psxtests/psxhdrs/time02.c28
-rw-r--r--testsuites/psxtests/psxhdrs/time03.c34
-rw-r--r--testsuites/psxtests/psxhdrs/time04.c23
-rw-r--r--testsuites/psxtests/psxhdrs/time05.c28
-rw-r--r--testsuites/psxtests/psxhdrs/time06.c24
-rw-r--r--testsuites/psxtests/psxhdrs/time07.c24
-rw-r--r--testsuites/psxtests/psxhdrs/time08.c24
-rw-r--r--testsuites/psxtests/psxhdrs/time09.c24
-rw-r--r--testsuites/psxtests/psxhdrs/time10.c25
-rw-r--r--testsuites/psxtests/psxhdrs/time11.c25
-rw-r--r--testsuites/psxtests/psxhdrs/time12.c25
-rw-r--r--testsuites/psxtests/psxhdrs/time13.c25
-rw-r--r--testsuites/psxtests/psxhdrs/timer01.c37
-rw-r--r--testsuites/psxtests/psxhdrs/timer02.c28
-rw-r--r--testsuites/psxtests/psxhdrs/timer03.c39
-rw-r--r--testsuites/psxtests/psxhdrs/timer04.c29
-rw-r--r--testsuites/psxtests/psxhdrs/timer05.c28
-rw-r--r--testsuites/psxtests/psxhdrs/timer06.c31
-rw-r--r--testsuites/samples/README73
-rw-r--r--testsuites/samples/base_mp/apptask.c37
-rw-r--r--testsuites/samples/base_mp/init.c46
-rw-r--r--testsuites/samples/base_mp/node1/base_mp.doc13
-rw-r--r--testsuites/samples/base_mp/node1/base_mp.scn5
-rw-r--r--testsuites/samples/base_mp/node2/base_mp.doc13
-rw-r--r--testsuites/samples/base_mp/node2/base_mp.scn5
-rw-r--r--testsuites/samples/base_mp/system.h48
-rw-r--r--testsuites/samples/base_sp/apptask.c38
-rw-r--r--testsuites/samples/base_sp/base_sp.doc13
-rw-r--r--testsuites/samples/base_sp/base_sp.scn5
-rw-r--r--testsuites/samples/base_sp/init.c48
-rw-r--r--testsuites/samples/base_sp/system.h44
-rw-r--r--testsuites/samples/cdtest/cdtest.scn31
-rw-r--r--testsuites/samples/cdtest/init.c26
-rw-r--r--testsuites/samples/cdtest/main.cc137
-rw-r--r--testsuites/samples/cdtest/system.h42
-rw-r--r--testsuites/samples/hello/hello.doc13
-rw-r--r--testsuites/samples/hello/hello.scn3
-rw-r--r--testsuites/samples/hello/init.c36
-rw-r--r--testsuites/samples/hello/system.h37
-rw-r--r--testsuites/samples/paranoia/init.c39
-rw-r--r--testsuites/samples/paranoia/paranoia.c2300
-rw-r--r--testsuites/samples/paranoia/paranoia.doc13
-rw-r--r--testsuites/samples/paranoia/system.h40
-rw-r--r--testsuites/samples/ticker/init.c61
-rw-r--r--testsuites/samples/ticker/system.h45
-rw-r--r--testsuites/samples/ticker/tasks.c44
-rw-r--r--testsuites/samples/ticker/ticker.doc13
-rw-r--r--testsuites/samples/ticker/ticker.scn16
-rw-r--r--testsuites/sptests/README9
-rw-r--r--testsuites/sptests/sp01/init.c86
-rw-r--r--testsuites/sptests/sp01/sp01.doc43
-rw-r--r--testsuites/sptests/sp01/sp01.scn18
-rw-r--r--testsuites/sptests/sp01/system.h45
-rw-r--r--testsuites/sptests/sp01/task1.c50
-rw-r--r--testsuites/sptests/sp02/init.c152
-rw-r--r--testsuites/sptests/sp02/preempt.c32
-rw-r--r--testsuites/sptests/sp02/sp02.doc37
-rw-r--r--testsuites/sptests/sp02/sp02.scn15
-rw-r--r--testsuites/sptests/sp02/system.h60
-rw-r--r--testsuites/sptests/sp02/task1.c66
-rw-r--r--testsuites/sptests/sp02/task2.c34
-rw-r--r--testsuites/sptests/sp02/task3.c37
-rw-r--r--testsuites/sptests/sp03/init.c67
-rw-r--r--testsuites/sptests/sp03/sp03.doc24
-rw-r--r--testsuites/sptests/sp03/sp03.scn26
-rw-r--r--testsuites/sptests/sp03/system.h49
-rw-r--r--testsuites/sptests/sp03/task1.c59
-rw-r--r--testsuites/sptests/sp03/task2.c46
-rw-r--r--testsuites/sptests/sp04/init.c110
-rw-r--r--testsuites/sptests/sp04/sp04.doc38
-rw-r--r--testsuites/sptests/sp04/sp04.scn23
-rw-r--r--testsuites/sptests/sp04/system.h67
-rw-r--r--testsuites/sptests/sp04/task1.c103
-rw-r--r--testsuites/sptests/sp04/task2.c29
-rw-r--r--testsuites/sptests/sp04/task3.c29
-rw-r--r--testsuites/sptests/sp04/tswitch.c59
-rw-r--r--testsuites/sptests/sp05/init.c81
-rw-r--r--testsuites/sptests/sp05/sp05.doc26
-rw-r--r--testsuites/sptests/sp05/sp05.scn47
-rw-r--r--testsuites/sptests/sp05/system.h55
-rw-r--r--testsuites/sptests/sp05/task1.c78
-rw-r--r--testsuites/sptests/sp05/task2.c39
-rw-r--r--testsuites/sptests/sp05/task3.c39
-rw-r--r--testsuites/sptests/sp06/init.c87
-rw-r--r--testsuites/sptests/sp06/sp06.doc26
-rw-r--r--testsuites/sptests/sp06/sp06.scn40
-rw-r--r--testsuites/sptests/sp06/system.h58
-rw-r--r--testsuites/sptests/sp06/task1.c61
-rw-r--r--testsuites/sptests/sp06/task2.c40
-rw-r--r--testsuites/sptests/sp06/task3.c32
-rw-r--r--testsuites/sptests/sp07/init.c128
-rw-r--r--testsuites/sptests/sp07/sp07.doc37
-rw-r--r--testsuites/sptests/sp07/sp07.scn33
-rw-r--r--testsuites/sptests/sp07/system.h87
-rw-r--r--testsuites/sptests/sp07/task1.c85
-rw-r--r--testsuites/sptests/sp07/task2.c78
-rw-r--r--testsuites/sptests/sp07/task3.c34
-rw-r--r--testsuites/sptests/sp07/task4.c30
-rw-r--r--testsuites/sptests/sp07/taskexit.c33
-rw-r--r--testsuites/sptests/sp07/tcreate.c35
-rw-r--r--testsuites/sptests/sp07/tdelete.c37
-rw-r--r--testsuites/sptests/sp07/trestart.c34
-rw-r--r--testsuites/sptests/sp07/tstart.c34
-rw-r--r--testsuites/sptests/sp08/init.c53
-rw-r--r--testsuites/sptests/sp08/sp08.doc26
-rw-r--r--testsuites/sptests/sp08/sp08.scn22
-rw-r--r--testsuites/sptests/sp08/system.h50
-rw-r--r--testsuites/sptests/sp08/task1.c256
-rw-r--r--testsuites/sptests/sp09/delay.c28
-rw-r--r--testsuites/sptests/sp09/init.c120
-rw-r--r--testsuites/sptests/sp09/isr.c27
-rw-r--r--testsuites/sptests/sp09/screen01.c168
-rw-r--r--testsuites/sptests/sp09/screen02.c192
-rw-r--r--testsuites/sptests/sp09/screen03.c217
-rw-r--r--testsuites/sptests/sp09/screen04.c85
-rw-r--r--testsuites/sptests/sp09/screen05.c164
-rw-r--r--testsuites/sptests/sp09/screen06.c125
-rw-r--r--testsuites/sptests/sp09/screen07.c192
-rw-r--r--testsuites/sptests/sp09/screen08.c128
-rw-r--r--testsuites/sptests/sp09/screen09.c144
-rw-r--r--testsuites/sptests/sp09/screen10.c164
-rw-r--r--testsuites/sptests/sp09/screen11.c250
-rw-r--r--testsuites/sptests/sp09/screen12.c337
-rw-r--r--testsuites/sptests/sp09/screen13.c114
-rw-r--r--testsuites/sptests/sp09/screen14.c154
-rw-r--r--testsuites/sptests/sp09/sp09.doc36
-rw-r--r--testsuites/sptests/sp09/sp09.scn249
-rw-r--r--testsuites/sptests/sp09/system.h141
-rw-r--r--testsuites/sptests/sp09/task1.c70
-rw-r--r--testsuites/sptests/sp09/task2.c48
-rw-r--r--testsuites/sptests/sp09/task3.c53
-rw-r--r--testsuites/sptests/sp09/task4.c50
-rw-r--r--testsuites/sptests/sp11/init.c92
-rw-r--r--testsuites/sptests/sp11/sp11.doc26
-rw-r--r--testsuites/sptests/sp11/sp11.scn74
-rw-r--r--testsuites/sptests/sp11/system.h90
-rw-r--r--testsuites/sptests/sp11/task1.c410
-rw-r--r--testsuites/sptests/sp11/task2.c126
-rw-r--r--testsuites/sptests/sp11/timer.c97
-rw-r--r--testsuites/sptests/sp12/init.c179
-rw-r--r--testsuites/sptests/sp12/pridrv.c131
-rw-r--r--testsuites/sptests/sp12/pritask.c91
-rw-r--r--testsuites/sptests/sp12/sp12.doc27
-rw-r--r--testsuites/sptests/sp12/sp12.scn78
-rw-r--r--testsuites/sptests/sp12/system.h82
-rw-r--r--testsuites/sptests/sp12/task1.c153
-rw-r--r--testsuites/sptests/sp12/task2.c65
-rw-r--r--testsuites/sptests/sp12/task3.c50
-rw-r--r--testsuites/sptests/sp12/task4.c37
-rw-r--r--testsuites/sptests/sp12/task5.c55
-rw-r--r--testsuites/sptests/sp13/fillbuff.c31
-rw-r--r--testsuites/sptests/sp13/init.c112
-rw-r--r--testsuites/sptests/sp13/putbuff.c29
-rw-r--r--testsuites/sptests/sp13/sp13.doc25
-rw-r--r--testsuites/sptests/sp13/sp13.scn72
-rw-r--r--testsuites/sptests/sp13/system.h68
-rw-r--r--testsuites/sptests/sp13/task1.c344
-rw-r--r--testsuites/sptests/sp13/task2.c139
-rw-r--r--testsuites/sptests/sp13/task3.c78
-rw-r--r--testsuites/sptests/sp14/asr.c47
-rw-r--r--testsuites/sptests/sp14/init.c72
-rw-r--r--testsuites/sptests/sp14/sp14.doc24
-rw-r--r--testsuites/sptests/sp14/sp14.scn33
-rw-r--r--testsuites/sptests/sp14/system.h78
-rw-r--r--testsuites/sptests/sp14/task1.c116
-rw-r--r--testsuites/sptests/sp14/task2.c48
-rw-r--r--testsuites/sptests/sp15/init.c78
-rw-r--r--testsuites/sptests/sp15/sp15.doc24
-rw-r--r--testsuites/sptests/sp15/sp15.scn16
-rw-r--r--testsuites/sptests/sp15/system.h62
-rw-r--r--testsuites/sptests/sp15/task1.c129
-rw-r--r--testsuites/sptests/sp16/init.c128
-rw-r--r--testsuites/sptests/sp16/sp16.doc24
-rw-r--r--testsuites/sptests/sp16/sp16.scn58
-rw-r--r--testsuites/sptests/sp16/system.h89
-rw-r--r--testsuites/sptests/sp16/task1.c282
-rw-r--r--testsuites/sptests/sp16/task2.c86
-rw-r--r--testsuites/sptests/sp16/task3.c57
-rw-r--r--testsuites/sptests/sp16/task4.c60
-rw-r--r--testsuites/sptests/sp16/task5.c73
-rw-r--r--testsuites/sptests/sp17/asr.c32
-rw-r--r--testsuites/sptests/sp17/init.c69
-rw-r--r--testsuites/sptests/sp17/sp17.doc35
-rw-r--r--testsuites/sptests/sp17/sp17.scn8
-rw-r--r--testsuites/sptests/sp17/system.h58
-rw-r--r--testsuites/sptests/sp17/task1.c48
-rw-r--r--testsuites/sptests/sp17/task2.c45
-rw-r--r--testsuites/sptests/sp19/first.c66
-rw-r--r--testsuites/sptests/sp19/fptask.c98
-rw-r--r--testsuites/sptests/sp19/fptest.h172
-rw-r--r--testsuites/sptests/sp19/init.c150
-rw-r--r--testsuites/sptests/sp19/inttest.h149
-rw-r--r--testsuites/sptests/sp19/sp19.doc23
-rw-r--r--testsuites/sptests/sp19/sp19.scn50
-rw-r--r--testsuites/sptests/sp19/system.h57
-rw-r--r--testsuites/sptests/sp19/task1.c59
-rw-r--r--testsuites/sptests/sp20/getall.c43
-rw-r--r--testsuites/sptests/sp20/init.c68
-rw-r--r--testsuites/sptests/sp20/sp20.doc24
-rw-r--r--testsuites/sptests/sp20/sp20.scn27
-rw-r--r--testsuites/sptests/sp20/system.h61
-rw-r--r--testsuites/sptests/sp20/task1.c116
-rw-r--r--testsuites/sptests/sp21/init.c53
-rw-r--r--testsuites/sptests/sp21/sp21.doc28
-rw-r--r--testsuites/sptests/sp21/sp21.scn19
-rw-r--r--testsuites/sptests/sp21/system.h46
-rw-r--r--testsuites/sptests/sp21/task1.c105
-rw-r--r--testsuites/sptests/sp22/delay.c32
-rw-r--r--testsuites/sptests/sp22/init.c66
-rw-r--r--testsuites/sptests/sp22/prtime.c32
-rw-r--r--testsuites/sptests/sp22/sp22.doc20
-rw-r--r--testsuites/sptests/sp22/sp22.scn29
-rw-r--r--testsuites/sptests/sp22/system.h57
-rw-r--r--testsuites/sptests/sp22/task1.c164
-rw-r--r--testsuites/sptests/sp23/init.c69
-rw-r--r--testsuites/sptests/sp23/sp23.doc26
-rw-r--r--testsuites/sptests/sp23/sp23.scn9
-rw-r--r--testsuites/sptests/sp23/system.h56
-rw-r--r--testsuites/sptests/sp23/task1.c96
-rw-r--r--testsuites/sptests/sp24/init.c76
-rw-r--r--testsuites/sptests/sp24/resume.c34
-rw-r--r--testsuites/sptests/sp24/sp24.doc51
-rw-r--r--testsuites/sptests/sp24/sp24.scn16
-rw-r--r--testsuites/sptests/sp24/system.h55
-rw-r--r--testsuites/sptests/sp24/task1.c58
-rw-r--r--testsuites/sptests/sp25/init.c66
-rw-r--r--testsuites/sptests/sp25/sp25.doc32
-rw-r--r--testsuites/sptests/sp25/sp25.scn29
-rw-r--r--testsuites/sptests/sp25/system.h57
-rw-r--r--testsuites/sptests/sp25/task1.c241
-rw-r--r--testsuites/sptests/spfatal/fatal.c136
-rw-r--r--testsuites/sptests/spfatal/init.c51
-rw-r--r--testsuites/sptests/spfatal/puterr.c68
-rw-r--r--testsuites/sptests/spfatal/spfatal.doc28
-rw-r--r--testsuites/sptests/spfatal/spfatal.scn8
-rw-r--r--testsuites/sptests/spfatal/system.h82
-rw-r--r--testsuites/sptests/spfatal/task1.c29
-rw-r--r--testsuites/sptests/spsize/getint.c32
-rw-r--r--testsuites/sptests/spsize/init.c64
-rw-r--r--testsuites/sptests/spsize/size.c651
-rw-r--r--testsuites/sptests/spsize/system.h47
-rw-r--r--testsuites/support/include/tmacros.h140
-rw-r--r--testsuites/tmtests/README21
-rw-r--r--testsuites/tmtests/include/timesys.h58
-rw-r--r--testsuites/tmtests/tm01/system.h43
-rw-r--r--testsuites/tmtests/tm01/task1.c189
-rw-r--r--testsuites/tmtests/tm01/tm01.doc13
-rw-r--r--testsuites/tmtests/tm02/system.h44
-rw-r--r--testsuites/tmtests/tm02/task1.c158
-rw-r--r--testsuites/tmtests/tm02/tm02.doc13
-rw-r--r--testsuites/tmtests/tm03/system.h44
-rw-r--r--testsuites/tmtests/tm03/task1.c151
-rw-r--r--testsuites/tmtests/tm03/tm03.doc13
-rw-r--r--testsuites/tmtests/tm04/system.h43
-rw-r--r--testsuites/tmtests/tm04/task1.c388
-rw-r--r--testsuites/tmtests/tm04/tm04.doc13
-rw-r--r--testsuites/tmtests/tm05/system.h44
-rw-r--r--testsuites/tmtests/tm05/task1.c132
-rw-r--r--testsuites/tmtests/tm05/tm05.doc13
-rw-r--r--testsuites/tmtests/tm06/system.h44
-rw-r--r--testsuites/tmtests/tm06/task1.c162
-rw-r--r--testsuites/tmtests/tm06/tm06.doc13
-rw-r--r--testsuites/tmtests/tm07/system.h44
-rw-r--r--testsuites/tmtests/tm07/task1.c120
-rw-r--r--testsuites/tmtests/tm07/tm07.doc13
-rw-r--r--testsuites/tmtests/tm08/system.h44
-rw-r--r--testsuites/tmtests/tm08/task1.c255
-rw-r--r--testsuites/tmtests/tm08/tm08.doc13
-rw-r--r--testsuites/tmtests/tm09/system.h42
-rw-r--r--testsuites/tmtests/tm09/task1.c226
-rw-r--r--testsuites/tmtests/tm09/tm09.doc13
-rw-r--r--testsuites/tmtests/tm10/system.h43
-rw-r--r--testsuites/tmtests/tm10/task1.c165
-rw-r--r--testsuites/tmtests/tm10/tm10.doc13
-rw-r--r--testsuites/tmtests/tm11/system.h43
-rw-r--r--testsuites/tmtests/tm11/task1.c155
-rw-r--r--testsuites/tmtests/tm11/tm11.doc13
-rw-r--r--testsuites/tmtests/tm12/system.h43
-rw-r--r--testsuites/tmtests/tm12/task1.c146
-rw-r--r--testsuites/tmtests/tm12/tm12.doc13
-rw-r--r--testsuites/tmtests/tm13/system.h43
-rw-r--r--testsuites/tmtests/tm13/task1.c154
-rw-r--r--testsuites/tmtests/tm13/tm13.doc13
-rw-r--r--testsuites/tmtests/tm14/system.h43
-rw-r--r--testsuites/tmtests/tm14/task1.c146
-rw-r--r--testsuites/tmtests/tm14/tm14.doc13
-rw-r--r--testsuites/tmtests/tm15/system.h43
-rw-r--r--testsuites/tmtests/tm15/task1.c222
-rw-r--r--testsuites/tmtests/tm15/tm15.doc13
-rw-r--r--testsuites/tmtests/tm16/system.h43
-rw-r--r--testsuites/tmtests/tm16/task1.c148
-rw-r--r--testsuites/tmtests/tm16/tm16.doc13
-rw-r--r--testsuites/tmtests/tm17/system.h43
-rw-r--r--testsuites/tmtests/tm17/task1.c127
-rw-r--r--testsuites/tmtests/tm17/tm17.doc13
-rw-r--r--testsuites/tmtests/tm18/system.h43
-rw-r--r--testsuites/tmtests/tm18/task1.c112
-rw-r--r--testsuites/tmtests/tm18/tm18.doc13
-rw-r--r--testsuites/tmtests/tm19/system.h43
-rw-r--r--testsuites/tmtests/tm19/task1.c208
-rw-r--r--testsuites/tmtests/tm19/tm19.doc13
-rw-r--r--testsuites/tmtests/tm20/system.h44
-rw-r--r--testsuites/tmtests/tm20/task1.c466
-rw-r--r--testsuites/tmtests/tm20/tm20.doc13
-rw-r--r--testsuites/tmtests/tm21/system.h50
-rw-r--r--testsuites/tmtests/tm21/task1.c236
-rw-r--r--testsuites/tmtests/tm21/tm21.doc13
-rw-r--r--testsuites/tmtests/tm22/system.h43
-rw-r--r--testsuites/tmtests/tm22/task1.c200
-rw-r--r--testsuites/tmtests/tm22/tm22.doc13
-rw-r--r--testsuites/tmtests/tm23/system.h43
-rw-r--r--testsuites/tmtests/tm23/task1.c302
-rw-r--r--testsuites/tmtests/tm23/tm23.doc13
-rw-r--r--testsuites/tmtests/tm24/system.h42
-rw-r--r--testsuites/tmtests/tm24/task1.c124
-rw-r--r--testsuites/tmtests/tm24/tm24.doc13
-rw-r--r--testsuites/tmtests/tm25/system.h43
-rw-r--r--testsuites/tmtests/tm25/task1.c109
-rw-r--r--testsuites/tmtests/tm25/tm25.doc13
-rw-r--r--testsuites/tmtests/tm26/fptest.h165
-rw-r--r--testsuites/tmtests/tm26/system.h43
-rw-r--r--testsuites/tmtests/tm26/task1.c550
-rw-r--r--testsuites/tmtests/tm26/tm26.doc13
-rw-r--r--testsuites/tmtests/tm27/system.h42
-rw-r--r--testsuites/tmtests/tm27/task1.c272
-rw-r--r--testsuites/tmtests/tm27/tm27.doc13
-rw-r--r--testsuites/tmtests/tm28/system.h43
-rw-r--r--testsuites/tmtests/tm28/task1.c134
-rw-r--r--testsuites/tmtests/tm28/tm28.doc13
-rw-r--r--testsuites/tmtests/tm29/system.h43
-rw-r--r--testsuites/tmtests/tm29/task1.c207
-rw-r--r--testsuites/tmtests/tm29/tm29.doc13
-rw-r--r--testsuites/tmtests/tmck/system.h42
-rw-r--r--testsuites/tmtests/tmck/task1.c180
-rw-r--r--testsuites/tmtests/tmck/tmck.doc20
-rw-r--r--testsuites/tmtests/tmoverhd/dumrtems.h255
-rw-r--r--testsuites/tmtests/tmoverhd/empty.c41
-rw-r--r--testsuites/tmtests/tmoverhd/system.h60
-rw-r--r--testsuites/tmtests/tmoverhd/testtask.c1279
-rw-r--r--testsuites/tmtests/tmoverhd/tmoverhd.doc13
-rw-r--r--tools/build/Makefile.in13
-rw-r--r--tools/build/README32
-rw-r--r--tools/build/cklength.c364
-rw-r--r--tools/build/eolstrip.c351
-rw-r--r--tools/build/os/Makefile.in13
-rw-r--r--tools/build/os/msdos/Makefile.in39
-rw-r--r--tools/build/os/msdos/README12
-rw-r--r--tools/build/os/msdos/cklength.uue286
-rw-r--r--tools/build/os/msdos/fixtimer.c111
-rw-r--r--tools/build/os/msdos/fixtimer.uue162
-rw-r--r--tools/build/os/msdos/ifc.c331
-rw-r--r--tools/build/os/msdos/ifc_exe.uue163
-rw-r--r--tools/build/packhex.c513
-rw-r--r--tools/build/scripts/Makefile.in34
-rw-r--r--tools/build/scripts/README32
-rw-r--r--tools/build/src/Makefile.in61
-rw-r--r--tools/build/src/cklength.c364
-rw-r--r--tools/build/src/eolstrip.c351
-rw-r--r--tools/build/src/packhex.c513
-rw-r--r--tools/build/src/unhex.c725
-rw-r--r--tools/build/unhex.c725
-rw-r--r--tools/cpu/Makefile.in13
-rw-r--r--tools/cpu/generic/Makefile.in33
-rw-r--r--tools/cpu/hppa1.1/genoffsets.c348
-rw-r--r--tools/cpu/unix/Makefile.in61
-rw-r--r--tools/cpu/unix/gensize.c116
-rw-r--r--tools/update/310_to_320_list543
-rw-r--r--tools/update/Makefile.in37
-rw-r--r--tools/update/README7
3297 files changed, 391145 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000000..01e8961d69
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,343 @@
+#
+# $Id$
+#
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000000..fdd814b25a
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+Building RTEMS
+==============
+See the file README.configure.
+
+
+UNCOMPRESSING .tgz FILES
+===========================
+Many of the files found in this directory and its subdirectories
+are gzip'ed, tar archive files. These files have the ".tgz"
+extension. They were compressed with gzip version 1.2.4.
+
+Use a command sequence similar to the following to uncompress each
+file:
+
+ gzcat FILE.tgz | tar xvof -
+
+where FILE.tgz is the file to be installed. This procedure will
+extract the files in the archive into the current directory.
+All of the .tgz files associated with this release RTEMS will
+place their contents in a subdirectory rtems-<release> in the current
+directory.
+
+If you are unsure of what is in an RTEMS archive file, then use
+the following command sequence to get a listing of the contents:
+
+ gzcat FILE.tgz | tar tvf -
+
+NOTES:
+
+(1) The "-o" option to tar is included on the tar command line
+ so that the user extracting the tar archive will own the extracted
+ files.
+
+(2) gzcat is sometimes installed as zcat. Be warned that on many
+ (most) UNIX machines, zcat is associated with compress (.Z files).
+
+(3) If you do not have gzip 1.2.4, it is available from numerous sites
+ including this one. Other sites include prep.ai.mit.edu and
+ gatekeeper.dec.com.
+
+(4) The GNU archive files included in this distribution are packaged
+ exactly like they are on official GNU ftp sites. When extracting
+ GNU archives, they will not extract under a rtems-<version>
+ directory. They will extract themselves under a directory which
+ is the name and version of the tool in question. For example,
+ gcc-2.5.8.tgz will extract its contents into the subdirectory
+ gcc-2.5.8.
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000..74871950fd
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,23 @@
+#
+# $Id$
+#
+ LICENSE INFORMATION
+
+RTEMS is free software; you can redistribute it and/or modify it under
+terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version. RTEMS is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details. You should have received
+a copy of the GNU General Public License along with RTEMS; see
+file COPYING. If not, write to the Free Software Foundation, 675
+Mass Ave, Cambridge, MA 02139, USA.
+
+As a special exception, including RTEMS header files in a file,
+instantiating RTEMS generics or templates, or linking other files
+with RTEMS objects to produce an executable application, does not
+by itself cause the resulting executable application to be covered
+by the GNU General Public License. This exception does not
+however invalidate any other reasons why the executable file might be
+covered by the GNU Public License.
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000000..03c58b6a19
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,101 @@
+#
+# top level directory for RTEMS build tree
+#
+# Modified by Jiri to implement autoconf and cygnus one-tree build
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+target = @target@
+manext = 1
+mandir = @mandir@/man$(manext)
+program_prefix = @program_prefix@
+
+
+VPATH=@srcdir@
+
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+DEFS = @DEFS@
+LDFLAGS =
+LIBS = @LIBS@
+CC_FOR_BUILD = gcc
+
+
+CC_FOR_TARGET = $(program_prefix)gcc
+AS_FOR_TARGET = $(program_prefix)as
+AR_FOR_TARGET = $(program_prefix)ar
+NM_FOR_TARGET = $(program_prefix)nm
+LD_FOR_TARGET = $(program_prefix)ld
+OBJCOPY_FOR_TARGET = $(program_prefix)objcopy
+SIZE_FOR_TARGET = $(program_prefix)size
+
+AWK = @AWK@
+
+RTEMS_ROOT = @RTEMS_ROOT@
+RTEMS_HOST = @RTEMS_HOST@
+PROJECT_ROOT = @PROJECT_ROOT@
+RTEMS_HAS_POSIX_API = @RTEMS_HAS_POSIX_API@
+RTEMS_USE_MACROS = @RTEMS_USE_MACROS@
+RTEMS_USE_GCC272 = @RTEMS_USE_GCC272@
+RTEMS_LIBC_DIR = @RTEMS_LIBC_DIR@
+
+ifeq ($(RTEMSBSP),)
+ RTEMS_BSP = @RTEMS_BSP@
+else
+ RTEMS_BSP = $(RTEMSBSP)
+endif
+
+include $(RTEMS_ROOT)/make/main.cfg
+
+MTARGETS = all $(TARGET_VARIANTS:%=%_install) $(TARGET_VARIANTS:%=%_all) \
+clean_wrapup distclean clean_dirs clean_tools install tests clean depend
+
+.PHONY: clean_modules mlink
+
+EXIT_CMD = exit 1
+
+# Don't pass flags from previous make - especially NOT CFLAGS
+override MAKEFLAGS=
+
+$(MTARGETS): mlink
+ BASEDIR=`pwd`; \
+ for bsp in $(RTEMS_BSP) xxx; \
+ do if [ $$bsp != xxx ] ; then \
+ cd $$BASEDIR; \
+ cmd="cd c; $(MAKE) RTEMS_BSP=$$bsp $(FLAGS_TO_PASS) \
+ RTEMS_CUSTOM=$(RTEMS_ROOT)/make/custom/$$bsp.cfg \
+ INSTALL=$(PROJECT_ROOT)/$$bsp/build-tools/install-if-change \
+ \"CC=$(CC_FOR_TARGET)\" \
+ \"XCFLAGS=$(CFLAGS_FOR_TARGET)\" \
+ \"CC_FOR_BUILD=$(CC_FOR_BUILD)\" \
+ \"AS=$(AS_FOR_TARGET)\" \
+ \"LD=$(LD_FOR_TARGET)\" \
+ \"NM=$(NM_FOR_TARGET)\" \
+ \"AR=$(AR_FOR_TARGET)\" \
+ \"SIZE=$(SIZE_FOR_TARGET)\" \
+ \"OBJCOPY=$(OBJCOPY_FOR_TARGET)\" \
+ \"RTEMS_ROOT=$(RTEMS_ROOT)\" \
+ \"RTEMS_HOST=$(RTEMS_HOST)\" \
+ \"PROJECT_HOME=$(PROJECT_ROOT)/$$bsp\" \
+ \"PROJECT_ROOT=$(PROJECT_ROOT)\" \
+ \"RTEMS_HAS_POSIX_API=$(RTEMS_HAS_POSIX_API)\" \
+ \"RTEMS_USE_MACROS=$(RTEMS_USE_MACROS)\" \
+ \"RTEMS_USE_GCC272=$(RTEMS_USE_GCC272)\" \
+ \"RTEMS_LIBC_DIR=$(RTEMS_LIBC_DIR)\" \
+ \"AWK=$(AWK)\" $@" ; \
+ eval $$cmd || $(EXIT_CMD); \
+ fi; done;
+
+clean_modules:
+ rm -f src/Modules/rtems/.moduleavailcache
+ rm -f src/Modules/rtems/.moduleavailcachedir
+
+mlink:
+ test -d make || ln -s $(RTEMS_ROOT)/make make
+
diff --git a/README b/README
new file mode 100644
index 0000000000..d13a9e2443
--- /dev/null
+++ b/README
@@ -0,0 +1,97 @@
+#
+# $Id$
+#
+
+Building RTEMS
+==============
+See the file README.configure.
+
+Directory Overview
+==================
+
+This is the top level of the RTEMS directory structure. The following
+is a description of the files and directories in this directory:
+
+ INSTALL
+ Rudimentary installation instructions. For more detailed
+ information please see the Release Notes. The Postscript
+ version of this manual can be found in the file
+ c_or_ada/doc/relnotes.tgz.
+
+ LICENSE
+ Required legalese.
+
+ README
+ This file.
+
+ c
+ This directory contains the source code for the C
+ implementation of RTEMS as well as the test suites, sample
+ applications, Board Support Packages, Device Drivers, and
+ support libraries.
+
+ doc
+ This directory contains the PDL for the RTEMS executive.
+
+Ada versus C
+============
+
+There are two implementations of RTEMS in this source tree --
+in Ada and in C. These two implementations are functionally
+and structurally equivalent. The C implementation follows
+the packaging conventions and hiearchical nature of the Ada
+implementation. In addition, a style has been followed which
+allows one to easily find the corresponding Ada and C
+implementations.
+
+File names in C and code placement was carefully designed to insure
+a close mapping to the Ada implementation. The following file name
+extensions are used:
+
+ .adb - Ada body
+ .ads - Ada specification
+ .adp - Ada body requiring preprocessing
+ .inc - include file for .adp files
+
+ .c - C body (non-inlined routines)
+ .inl - C body (inlined routines)
+ .h - C specification
+
+In the executive source, XYZ.c and XYZ.inl correspond directly to a
+single XYZ.adb or XYZ.adp file. A .h file corresponds directly to
+the .ads file. There are only a handful of .inc files in the
+Ada source and these are used to insure that the desired simple
+inline textual expansion is performed. This avoids scoping and
+calling convention side-effects in carefully constructed tests
+which usually test context switch behavior.
+
+In addition, in Ada code and data name references are always fully
+qualified as PACKAGE.NAME. In C, this convention is followed
+by having the package name as part of the name itself and using a
+capital letter to indicate the presence of a "." level. So we have
+PACKAGE.NAME in Ada and _Package_Name in C. The leading "_" in C
+is used to avoid naming conflicts between RTEMS and user variables.
+By using these conventions, one can easily compare the C and Ada
+implementations.
+
+The most noticeable difference between the C and Ada83 code is
+the inability to easily obtain a "typed pointer" in Ada83.
+Using the "&" operator in C yields a pointer with a specific type.
+The 'Address attribute is the closest feature in Ada83. This
+returns a System.Address and this must be coerced via Unchecked_Conversion
+into an access type of the desired type. It is easy to view
+System.Address as similar to a "void *" in C, but this is not the case.
+A "void *" can be assigned to any other pointer type without an
+explicit conversion.
+
+The solution adopted to this problem was to provide two routines for
+each access type in the Ada implementation -- one to convert from
+System.Address to the access type and another to go the opposite
+direction. This results in code which accomplishes the same thing
+as the corresponding C but it is easier to get lost in the clutter
+of the apparent subprogram invocations than the "less bulky"
+C equivalent.
+
+A related difference is the types which are only in Ada which are used
+for pointers to arrays. These types do not exist and are not needed
+in the C implementation.
diff --git a/README.configure b/README.configure
new file mode 100644
index 0000000000..574123ee70
--- /dev/null
+++ b/README.configure
@@ -0,0 +1,224 @@
+
+1. Autoconf support
+===================
+
+This version of RTEMS is configured with GNU autoconf. RTEMS can be
+configured and built either standalone or together with the compiler
+tools in the Cygnus one-tree structure. Using autoconf also means
+that RTEMS now can be built in a separate build directory.
+
+2. Installation
+===============
+
+2.1 Standalone build
+
+To configure RTEMS for a specific target, run configure in the build
+directory. In addition to the standard configure options, the following
+RTEMS-specific option are supported:
+
+ --disable-rtems-inlines
+ --disable-posix
+ --disable-tests
+ --enable-gcc28
+ --enable-libcdir=<DIRECTORY>
+ --enable-rtemsbsp="bsp1 bsp2 ..."
+
+By default, the RTEMS posix interface is built for targets that support
+it. It can be disabled with the --disable-posix option.
+
+By default, the RTEMS test suites are configured. The --disable-tests
+will not configure the RTEMS test suite. This is used only to speed-up
+configuration in case building the tests are not necessary.
+
+By default, RTEMS is built using arguments and build rules which are
+compatible with gcc 2.7.2.2. This requires that the user specify
+the location of the Standard C Library with the --enable-libcdir
+option. If using a gcc which supports the -specs option, then
+the --enable-gcc28 option may be used to enable this feature.
+
+By default, all bsps for a target are built. There are two ways of
+changing this:
+
+ + use the --enable-rtemsbsp otion which will set the specified
+ bsps as the default bsps, or
+ + set the RTEMSBSP variable during make (see below).
+
+The --enable-rtemsbsp= option configures RTEMS for a specific target
+architecture. The following targets are supported:
+
+ (none) will build the host-based version on Linux,
+ Solaris and HPUX.
+
+ a29k-rtems only standalone, uses non-gnu compiler
+ i386-rtems
+ i386-go32-rtems see notes
+ i960-rtems
+ hppa1_1-rtems
+ m68k-rtems
+ mips64orion-rtems
+ no_cpu-rtems
+ powerpc-rtems
+ sparc-rtems
+
+The cross-compiler is set to $(target)-gcc by default. This can be
+overriden by one of the following methods:
+
+ + running make with CC_FOR_TARGET=compiler_to_use. The same applies to
+ all the target specific tools (AS, AR, NM, OBJCOPY, SIZE, LD), or
+ + by using the --program-prefix option to configure to specify the
+ string which will prepended to the tool names. Be sure to include
+ a trailing "-". For example, to use a m68k-coff toolset, use the
+ --program-prefix=m68k-coff- option.
+
+To build, run make in the build directory. To specify which bsps to build,
+add the RTEMSBSP="bsp1 bsp2 .." to the make command.
+
+Installation is done under $(prefix)/$(target)/rtems.
+
+As an example, to build and install the mvme136 and dmv152 bsps for m68k do:
+
+ (path_to_rtems_src)/configure --target=m68k-rtems
+
+ make RTEMSBSP="mvme136 dmv152"
+
+ make install RTEMSBSP="mvme136 dmv152"
+
+
+The sample tests are built by 'make all', do a 'make test' to build the full
+test suite.
+
+2.2 Build with Cygnus one-tree release
+
+To build and install RTEMS with the one-tree structure, just copy the rtems
+directory to the tree. The one-tree configure.in and Makefile.in has to be
+replaced with the RTEMS-aware versions. The build options are the same as
+for the standalone build.
+
+2.3 Target Dependent Notes
+
+i386-go32-rtems:
+
+ 1. This is based on djgpp v1.xx. It needs to be updated to v2.xx.
+ 2. This cannot be built one-tree style since RTEMS requires some
+ files which must be obtained from the binary distribution of the
+ djgpp library. DJGPP can be obtained from
+ http://www.delorie.com/djgpp/dl/ofc.
+ 3. You will need to manually install a number of files from the
+ binary distribution of the DJGPP library doing something
+ like the following:
+
+ # unzip the djgpp distribution
+ cd include
+ cp dpmi.h INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2/include
+ cp go32.h INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2/include
+ cp dos.h INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2/include
+ cp pc.h INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2/include
+
+ cd ../lib
+ cp crt* INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2
+ cp libpc* INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2
+
+ # Make sure about destination on the next lines. It keeps the newlib
+ # libc.a and the binary djgpp libc.a from conflicting.
+ cp libc.a INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2/libcgo32.a
+ cp libc_p.a INSTALL_POINT/lib/gcc-lib/i386-go32-rtems/2.7.2/libcgo32_p.a
+
+
+3. To use the installed RTEMS library
+=====================================
+
+To use the installed RTEMS bsps to build applications, the application
+makefile has to include a bsp-specific makefile that will define the
+RTEMS variables necessary to find include files and libraries. The
+bsp-specific makefile is installed at
+
+ $(prefix)/$(target)/rtmes/$(RTEMS_BSP)/Makefile.inc
+
+For the erc32 bsp installed at /usr/local/cross, the line would read:
+
+include /usr/local/cross/sparc-rtems/rtems/erc32/Makefile.inc
+
+
+4. Supported target bsps
+========================
+
+The following bsps are supported:
+
+host-based : posix (on linux, solaris and hpux)
+
+a29k : portsw
+i386 : force386 i386ex
+i386-go32 : go32 go32_p5
+i960 : cvme961
+hppa1_1 : simhppa
+m68k : dmv152 efi332 efi68k gen68302 gen68360 gen68360_040 idp
+ mvme136 mvme147 mvme147s mvme162
+no_cpu : no_bsp
+mips64orion : p4600 p4650 (p4000 port with either R4600 or R4650)
+powerpc : papyrus
+sparc : erc32
+
+5. Makefile structure
+=====================
+
+The makefiles have been re-organised. Most gnu-based bsps now use three
+main makefiles:
+ + custom/default.cfg,
+ + custom/bsp.cfg and
+ + ompilers/gcc-target-default.cfg.
+
+Default.cfg sets the deafult values of certain common build options.
+
+Bsp.cfg set bsp-specific build options and can also override the
+default settings.
+
+Gcc-target-default.cfg contains the common gcc definitions. Some targets
+(a29k, no_cpu, and posix) still use the old structure.
+
+6. Adding a bsp
+===============
+
+The top-level configure.in has to be modified if a new target is added
+or if a new bsp is to be built by default. The additions required is
+basically to add which makefiles are to be created by configure and
+to add the target to the selection statement. To re-generate
+configure, autoconf-2.12 is needed.
+
+7. Tested configurations
+========================
+
+All gnu-based bsps have been built on Linux.
+The native (posix) ports have been built and run on Linux ans Solaris.
+The sparc port has been tested on SunOS and Linux.
+
+The following configurations have NOT been tested:
+
+ + Anything on Nextstep, HPUX and Irix.
+ + The a29k port.
+
+8. Pre-requisites
+=================
+
+Gawk version 2 or higher.
+GNU make version 3.72 or higher.
+Bash.
+gcc version ???
+
+TODO
+====
+
+The install-if-change script requires bash. On solaris systems, this should
+be changed to ksh, since ksh is provided with solaris (bash not).
+
+A fairly rescent version of gawk is needed to build RTEMS. This should be
+changed so that a plain vanilla awk also works. [NOTE: This dependency
+should disappear when the "gcc 2.8 -specs" is finished.]
+
+'make install' should only install necessary files, not the full
+PROJECT_RELEASE directory as now.
+
+Posix port on solaris-2.5 fails due to undefined built-in functions
+(gcc-2.7.2, might be my installation).
+
+Improve support for 'make CFLAGS=xxx'.
+
diff --git a/SUPPORT b/SUPPORT
new file mode 100644
index 0000000000..55ea218bcf
--- /dev/null
+++ b/SUPPORT
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+RTEMS was developed by On-Line Applications Research Corporation (OAR)
+for the U.S. Army Missile Command. OAR offers support, customization,
+and training for RTEMS. Custom RTEMS development services includes
+porting RTEMS to new processors and the development of custom board
+support packages and device drivers. In addition, OAR is available
+to assist in the development of your real-time embedded application.
+
+For more information, email Mark Johannes at mark@OARcorp.com
+or contact OAR at:
+
+On-Line Applications Research Corporation
+4910-L Corporate Drive
+Huntsville AL 35805
+Voice: (205) 722-9985
+Fax: (205 722-0985
+
+In the past, RTEMS maintainance and enhancements were primarily funded
+by the development contracts sponsored by the U.S. Army. Now RTEMS
+is funded solely by RTEMS users. The future of RTEMS depends on
+its user base.
+
diff --git a/c/ACKNOWLEDGEMENTS b/c/ACKNOWLEDGEMENTS
new file mode 100644
index 0000000000..153cf1b1fe
--- /dev/null
+++ b/c/ACKNOWLEDGEMENTS
@@ -0,0 +1,110 @@
+#
+# $Id$
+#
+
+RTEMS was developed by On-Line Applications Research (OAR) under
+contract to the U.S. Army Missile Command. Other than the
+contributions listed in this document, all code and documentation
+was developed by OAR for the Army.
+
+The RTEMS project would like to thank those who have made
+contributions to the project. Together we make RTEMS a
+much better product.
+
+The following persons/organizations have made contributions:
+
++ Dr. Mikhail (Misha) Savitski (mikhail.savitski@styrex.se) of the EISCAT
+ Scientific Association submitted the BSP and other miscellaneous support
+ for the Motorola MVME162 (M68040LC CPU) VMEbus single board computer.
+
++ Division Inc. of Chapel Hill, NC for sponsoring On-Line Applications
+ Research to port RTEMS to the Hewlett-Packard PA-RISC architecture (V1.1)
+ and the addition of HP-UX as a development host. Tony Bennett
+ (tbennett@chapelhill.hp.com) was assisted in this effort by Joel Sherrill
+ (joel@OARcorp.com). Tony also deserves a big pat on the back for
+ contributing significantly to the overall organization of the development
+ environment and directory structure. RTEMS is much easier to build
+ because of Tony.
+
++ Greg Allen of Division Inc. of Chapel Hill, NC for
+ porting RTEMS to HP-UX. This port treats a UNIX computer as simply
+ another RTEMS target processor. This port can be used to develop
+ and test code which will ultimately run on the embedded platform.
+
++ Doug McBride (mcbride@rodin.colorado.edu) of the Colorado Space Grant
+ College at the University of Colorado at Boulder submitted the BSP
+ for the Motorola IDP board (M68EC040 CPU) single board computer. The
+ BSP leverages heavily off of the existing RTEMS BSP framework, the
+ examples in the back of the IDP user's manual, and the libgloss example
+ support for the IDP board from the newlib/libgloss distribution.
+
++ David Glessner (dwg@glenqcy.glenayre.com) of Glenayre Electronics
+ submitted the support for the Motorola MC68302 CPU. This included
+ the "gen68302" BSP which uses the on-chip peripherals on the MC68302
+ as well as the modifications to the m68k dependent executive code to
+ support m68k family members based on the mc68000 core.
+
++ Bryce Cogswell (cogswell@cs.uoregon.edu) submitted the support for MS-DOS
+ as a development environment as well as djgpp/go32 as a target environment.
+
++ Andy Bray (andy@chaos.org.uk) of I-CUBED Ltd. in Cambridge U.K.
+ for porting RTEMS to the PowerPC. This effort included support for the
+ IBM 403 as well as the Motorola 601, 603, and 604 variants. A special
+ thanks to Dom Latter (dom@i-cubed.demon.co.uk) for being an RTEMS
+ evangelist and promoting the use of RTEMS both at I-CUBED Ltd. as well
+ as within the Internet community as a whole.
+
++ John S. Gwynne (jsg@coulomb.eng.ohio-state.edu) of Ohio State University
+ submitted the support for the Motorola MC68332 CPU as well as completing
+ the support for CPUs based on the MC68000 core. This included the "efi68k"
+ and "efi332" BSPs as well as completing the modifications to the m68k
+ dependent executive code to support m68k family members based on the
+ MC68000 core. "efi68k" and "efi332" are single board computers designed
+ primarily for automotive electronic fuel injection (EFI) control, but can
+ be considered general purpose controllers when used without the EFI
+ companion board(s). See the README in each BSP for more information.
+
++ The European Space Agency for sponsoring On-Line Applications Research
+ to port RTEMS to the SPARC V7 architecture for use with their ERC32
+ radiation-hardened CPU. Jiri Gaisler (jgais@wd.estec.esa.nl) deserves
+ special thanks for championing this port within the ESA was well as
+ for developing and supporting the SPARC Instruction Simulator used to
+ develop and test this port.
+
++ Eric Norum (eric@skatter.usask.ca) of the Saskatchewan Accelerator
+ Laboratory submitted the support for the Motorola MC68360 CPU
+ including the `gen68360' BSP.
+
++ Dominique le Campion (Dominique.LECAMPION@enst-bretagne.fr), for
+ Telecom Bretagne and T.N.I. (Brest, France) submitted the BSP for
+ the Motorola MVME147 board (68030 CPU + 68881 FPU) and the MVME147s
+ variant of this board.
+
++ Craig Lebakken (lebakken@minn.net) and Derrick Ostertag
+ (ostertag@transition.com) of Transition Networks of Eden Prairie, MN
+ for porting RTEMS to the MIPS and AMD 29K architectures. This submission
+ includes complete support for the R4650 as well as partial support
+ for the R4600.
+
++ Erik Ivanenko (ccms@utcc.utoronto.ca) of the University of Toronto
+ for submitting the i386ex bsp.
+
++ Jiri Gaisler (jgais@wd.estec.esa.nl) converted RTEMS to using GNU
+ autoconf. This effort is greatly appreciated.
+
++ Eric Norum (eric@skatter.usask.ca) of the Saskatchewan Accelerator
+ Laboratory submitted a BSP for the m68360 when operating in companion
+ mode with a m68040 and a port of the Motorola MC68040 Floating Point
+ Support Package (FPSP) to RTEMS.
+
+Finally, the RTEMS project would like to thank those who have contributed
+to the other free software efforts which RTEMS utilizes. The primary RTEMS
+development environment is from the Free Software Foundation (the GNU
+project). The "newlib" C library was put together by Cygnus and is
+a collaboration of the efforts of numerous individuals and organizations.
+
+We would like to see your name here. BSPs and ports are always welcome.
+Useful libraries which support RTEMS applications are also an important
+part of providing a strong foundation for the development of real-time
+embedded applications and are welcome as submission.
+
diff --git a/c/Makefile.in b/c/Makefile.in
new file mode 100644
index 0000000000..2892073027
--- /dev/null
+++ b/c/Makefile.in
@@ -0,0 +1,91 @@
+#
+# $Id$
+#
+# top level directory for RTEMS build tree
+# This Makefile is *not* a good example of a directory Makefile.
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+target = @target@
+manext = 1
+mandir = @mandir@/man$(manext)
+program_prefix = @program_prefix@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/directory.cfg
+
+# dubious, but needed by rtems-glom ...
+export PROJECT_HOME
+
+SUB_DIRS=build-tools src
+
+# directories to be created in install point
+CREATE_DIRS = include include/sys \
+ include/rtems include/rtems/score include/rtems/rtems include/rtems/posix \
+ include/netinet include/libc include/libc/sys \
+ lib bin samples \
+ tests tests/screens tests/screens/sptests \
+ tests/screens/psxtests tests/screens/mptests \
+ tests/screens/mptests/node1 tests/screens/mptests/node2 \
+ build-tools update-tools
+
+# Make all/install must include 'env'
+all $(TARGET_VARIANTS:%=%_install) $(TARGET_VARIANTS:%=%_all): env
+
+# top level clean/clobber will delete the install points
+clean_WRAPUP = $(MAKE) clean_wrapup
+clobber_WRAPUP = $(MAKE) clean_wrapup
+
+clean_wrapup: clean_tools clean_dirs clean_modules
+
+.PHONY: dirs clean_wrapup clean_dirs clean_tools clean_modules env install
+
+# XXX The link is temporary while switching to -specs options.
+dirs:
+ -test -d $(PROJECT_ROOT)/c/src/lib/libhwapi && \
+ (cd $(PROJECT_ROOT)/c/src/lib/libhwapi ; $(MAKE) mkdirs)
+ -$(MKDIR) ${CREATE_DIRS:%=$(PROJECT_ROOT)/$(RTEMS_BSP)/%}
+ -ln -s $(PROJECT_ROOT)/$(RTEMS_BSP)/include \
+ $(PROJECT_ROOT)/$(RTEMS_BSP)/lib/include
+
+distclean: clobber
+
+clean_dirs:
+ $(RM) -r $(PROJECT_RELEASE)
+
+clean_tools:
+ cd build-tools; $(MAKE) clean
+
+# NOTE: The wildcard on the install should pick up everything except
+# the tests directory. This significantly minimizes the install size.
+install: all
+ -$(MKDIR) $(prefix)/$(target)
+ -$(MKDIR) $(prefix)/$(target)/rtems
+ -$(MKDIR) $(prefix)/$(target)/rtems/make
+ -$(MKDIR) $(prefix)/$(target)/rtems/make/compilers
+ -$(MKDIR) $(prefix)/$(target)/rtems/make/custom
+ -$(MKDIR) $(prefix)/$(target)/rtems/make/os
+ -rm -rf $(prefix)/$(target)/rtems/$(RTEMS_BSP)
+ cd ../; tar cf - $(RTEMS_BSP)/[bilsu]* | \
+ (cd $(prefix)/$(target)/rtems; tar xpBf - )
+ cd $(srcdir); tar cf - make/compilers make/custom make/os \
+ make/leaf.cfg make/directory.cfg make/main.cfg | \
+ (cd $(prefix)/$(target)/rtems; tar xpBf - )
+ echo RTEMS_BSP = $(RTEMS_BSP) > \
+ $(prefix)/$(target)/rtems/$(RTEMS_BSP)/Makefile.inc
+ cat make/Templates/Makefile.inc >> \
+ $(prefix)/$(target)/rtems/$(RTEMS_BSP)/Makefile.inc
+
+tests:
+ cd src/tests; $(MAKE) all
+
+env: $(SRCS) dirs
+
diff --git a/c/PROBLEMS b/c/PROBLEMS
new file mode 100644
index 0000000000..e0640acb3c
--- /dev/null
+++ b/c/PROBLEMS
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+This is the list of outstanding problems in this release.
+
++ The shell scripts runtest and difftest do not work properly when
+ testing "debug" executables.
+
++ AMD 29k port is based on a non-GNU toolset.
+
++ The test spfatal is out of date and as a result will NOT execute
+ correctly. The addition of POSIX and consequent ongoing initialization
+ reorganization makes it pointless to fix this until the POSIX support
+ is completely in place.
+
++ The m68k family has become quite large and an understanding of the
+ compatibility of the peripherals on the various members of the 683xx
+ family would allow someone to designate some of the drivers submitted
+ for the gen683xx BSPs as useful on other members.
+
++ The only supported i960 family member is the CA. No support for the
+ floating point support found in other family members is present.
+ This also implies that RTEMS may "think" of something as generic
+ across the i960 family when in fact it is specific to the CA.
+ To make matters worse, the i960 target board owned by the RTEMS Project
+ is now broken and as a result even the i960CA is a "compile only" port.
+
++ Some of the BSPs still define RAM_START and RAM_END in the bsp.h file.
+ It is better to define these in the linkcmds file. It is also nice
+ to use the linkcmds file to place overlays for on-board hardware.
+
++ The __read() system call in all of the BSPs using single
+ character input/output needs to be smarter. The following
+ issues need to be addressed:
+
+ + echoing of characters on input
+ + CR/NL echoing
+ + backspaces
+ + tabs
+
++ UNIX port notes:
+
+ + sometimes a stray SIGALRM is reported as spfatal completes.
+
+ + There are conflicts between the names of native library routines
+ which MUST be used and those in the POSIX support. This must
+ be addressed. The POSIX API cannot be used with this port as a
+ result of this.
+
++ Some of the tests may execute correctly and not produce the exact
+ ordering of lines in the screen file. This appears to be a combination
+ of a number of factors including buffering, processor speed, IO
+ device overhead, and clock interrupt rate.
+
++ The clock device drivers should really avoid doing the division
+ by 1000 in the clock tick ISR to convert microseconds into
+ milliseconds. This only applies to clock drivers which generate
+ an ISR each millisecond and only call rtems_clock_tick every
+ so many ISRs.
diff --git a/c/README b/c/README
new file mode 100644
index 0000000000..e1ca9df591
--- /dev/null
+++ b/c/README
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+
+This is the top level of the RTEMS directory structure. The following
+is a description of the files and directories in this directory:
+
+ Makefile.in
+ The top-level Make command file used to build the C implementation
+ of RTEMS. [RTEMS assumes the use of GNU make.]
+
+ README
+ This file.
+
+ REQUIRES
+ A list of the other tools which are assumed to be installed
+ before RTEMS is built.
+
+ SUPPORT
+ Information on third-party support for RTEMS.
+
+ build-tools
+ This directory contains the source for various utilities
+ needed to build RTEMS.
+
+ make
+ Make command files "included" from those in the source distribution.
+ [RTEMS assumes the use of GNU make.]
+
+ patches
+ This directory contains patches for this release of RTEMS.
+
+ src
+ This directory contains the source code for the C
+ implementation of RTEMS as well as the test suites, sample
+ applications, Board Support Packages, Device Drivers, and
+ support libraries.
diff --git a/c/README.DOS b/c/README.DOS
new file mode 100644
index 0000000000..5219479910
--- /dev/null
+++ b/c/README.DOS
@@ -0,0 +1,72 @@
+#
+# $Id$
+#
+
+tools
+-----
+The RTEMS build procedure was designed with the capabilitiies of a
+typical UNIX computer in mind. Making this procedure work under MS-DOS
+is not that difficult but requires that MS-DOS versions of a number
+of UNIX utilities be acquired and installed. For time being, the
+best advice which can be offered is:
+
+ "This is a nasty question, since when I first set up the DOS machine
+ (long before I acquired RTEMS) I ftp'd a bunch of different tool
+ sets (all from SimTel), and then picked individual tools from each
+ set that worked best for me. The djgpp tools are probably a good
+ starting point, especially to get a working sed. Next the gnu tools
+ in SimTel/msdos/gnuish, and then others. Sorry I can't give you more
+ specific names. The only real requirement for the tools is that
+ they *must* accept redirection of command line arguments from a file
+ using the '@' notation (i.e., "mkdir @/tmp/args" reads the argument
+ list from file /tmp/args)."
+
+There is a special version (source and executable) of GNU make 3.71 for
+MS-DOS which minimizes the amount of memory used by recursive makes
+available on lancelot.gcs.redstone.army.mil in the file:
+
+/pub/msdos/gmake371.tgz
+
+Many of the RTEMS specific utilities used in the build and installation
+are UNIX shell scripts. On a UNIX host, these are normally interpreted
+by the Bourne Again Shell (BASH) or the Korn Shell (ksh). Most of these
+scripts can be successfully executed with the following shell from the
+MS-DOS archives from Simtel.
+
+SimTel/msdos/sysutil/ms_sh23b.zip
+
+Please be sure to use the 16-bit version. The Simtel archives are
+available from ftp.cdrom.com as well as a number of mirror sites.
+
+go32
+----
+go32 dumps the stack when a program seg-faults, and if this happens while
+on an alternate stack an infinite loop can ensue. Setting the environment
+variable GO32="core /tmp/core" will prevent more than 20 lines or
+so of stack information from being dumped after a crash, and the output
+will go to a file rather than the screen.
+
+The go32 debuggers get confused by the relocated stacks used by tasks,
+and tend to crash when variables are inspected.
+
+djgcc include files
+-------------------
+In general, we use RTEMS include files because these contain the proper
+declarations for the libc, and in particular, the stdio functions.
+When calling go32-specific functions it is necessary to include some
+djgpp include files, as well. Unfortunately, there are some disagreements
+between RTEMS and djgpp as to how certain functions and types are
+declared. In these cases, the RTEMS source have been modified to
+special-case the differences.
+
+other
+-----
+* Pressing F12 will immediately abort the program.
+See lib/libbsp/i386/go32/console/inch.c.
+
+* lib/libbsp/i386/go32/timer uses the on-board timer chip by default,
+which has a resolution of about 1 microsecond. However, if executing
+on a Pentium processor you can use the on-chip 64-bit cycle counter,
+which counts at whatever clock rate your processor runs at. To enable
+this, set RTEMS_CPU_MODEL=pentium in make/custom/go32.cfg.
+
diff --git a/c/REQUIRES b/c/REQUIRES
new file mode 100644
index 0000000000..dd0085aa45
--- /dev/null
+++ b/c/REQUIRES
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+1. The installation procedure assumes that "gcc" is installed
+ and is in your path for the installation of local tools.
+
+2. gcc 2.7.2 with crossgcc patches (ftp.cygnus.com:/pub/embedded/crossgcc)
+
+3. binutils 2.6 with crossgcc patches.
+
+4. newlib with RTEMS configurations.
+
diff --git a/c/TESTED b/c/TESTED
new file mode 100644
index 0000000000..019731a4ce
--- /dev/null
+++ b/c/TESTED
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+
+This file is current as of the 3.5.17 snapshot.
+
+The RTEMS project uses SparcStations running the Solaris 2.3 operating
+system internally for development. This release has been tested on the
+following Languages/CPUs/Targets using Solaris 2.3/SPARC as the host
+environment:
+
+ CPU CPU
+ LANGUAGE FAMILY MODEL TARGET SUITES
+ ======== ====== ========= =================== ===============
+ C m68k m68000 efi68k (note 1)
+ C m68k m68020 Motorola MVME136 ALL TESTS
+ C m68k m68020 Motorola MVME147 (note 1)
+ C m68k m68lc040 Motorola MVME162 (note 1)
+ C m68k m68ec040 Motorola IDP (note 1)
+ C m68k m68020 DY-4 DMV152 (note 1)
+ C m68k m68302 generic 68302 (note 1)
+ C m68k m68332 efi332 (note 1)
+ C m68k m68302 generic 68360 (note 1)
+ C i386 i386_fp Force CPU-386 ALL TESTS
+ C i386 i486 DJGPP/PC-AT ALL TESTS
+ C i386 pentium DJGPP/PC-AT ALL TESTS
+ C i960 i960ca Cyclone CVME961 (note 4)
+ C hppa hppa7100 simhppa (note 1)
+ C ppc 403 Papyrus (note 1)
+ C UNIX NA Solaris 2 (SPARC) ALL TESTS (inlines)
+ C UNIX NA Solaris 2 (SPARC) ALL TESTS (macros)
+ C UNIX NA Linux (i386) NOT TESTED
+ C UNIX NA HPUX (PA-RISC) (note 2)
+ C no_cpu NA no_bsp (note 3)
+
+NOTES:
+
+"NOT TESTED" indicates that this was not tested in the testing cycle
+immediately preceding the snapshot.
+
+(1) Target board is not owned by RTEMS Project. The target is known
+ to compile and link with all appropriate tests successfully.
+ If the target does not support multiprocessor configurations, then
+ "ALL TESTS" does not include the multiprocessor tests.
+
+(2) RTEMS Project cannot internally compile or test this target.
+
+(3) Target is not intended to be executed. It is only an example.
+
+(4) The board owned by the RTEMS Project is broken. The BSP is known
+ to compile and link with all appropriate tests successfully.
diff --git a/c/UPDATE_HELP b/c/UPDATE_HELP
new file mode 100644
index 0000000000..520d99aafc
--- /dev/null
+++ b/c/UPDATE_HELP
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+Between RTEMS 3.1.0 and 3.2.0, every RTEMS defined symbol made visible
+was renamed. This document describes the change and the tools provided
+to assist you in updating your RTEMS 3.1.0 application.
+
+[NOTE: This change was not included in snapshots prior to 3.1.15.]
+
+DESCRIPTION OF NAME CHANGES:
+============================
+
+The primary change was the addition of the prefix "rtems_" or "RTEMS_" to
+EVERY user visible RTEMS provided constant and routine. The primary
+factor in the decision to make such a sweeping change was conflicts
+between the the RTEMS and POSIX API's.
+
+
+TO UPDATE YOUR APPLICATION:
+===========================
+
+The update script requires that Perl be installed on your computer.
+It has only been tested with Perl 5.x.
+
+After RTEMS has been built, in the directory "$r/<BSP>/update_tools", will
+be a set of tools to aid in making the application source changes necessary
+to address (hopefully) all of the name changes in the RTEMS API between
+releases 3.1.0 and 3.2.0.
+
+The update shell script is the only executable which is invoked by the
+user directly. The word-replace Perl script is invoked by the update
+shell script.
+
+WARNING: These tools modify the files IN PLACE!!! Backup your
+ source before using these tools.
+
+To udpate your application, change directories to the top of your application
+source tree and execute the update script. It should be something similar
+to the following:
+
+cd MY_APP
+$r/<BSP>/update-tools/update
+
+The update script will ask if you have backed up your source code before
+beginning the update process. While operating on files, it will print
+the name of each file and a dot for each change made to the source file.
+
+NOTE: These scripts do not attempt to address changes in calling
+ sequences. After the script has run, you will need to update
+ calls to rtems_clock_get(), rtems_timer_fire_after(), and
+ rtems_timer_fire_when() by hand.
diff --git a/c/build-tools/Makefile.in b/c/build-tools/Makefile.in
new file mode 100644
index 0000000000..4170426842
--- /dev/null
+++ b/c/build-tools/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/directory.cfg
+
+SUB_DIRS=os scripts src
diff --git a/c/build-tools/README b/c/build-tools/README
new file mode 100644
index 0000000000..0436fc958d
--- /dev/null
+++ b/c/build-tools/README
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+Misc. support tools for RTEMS workspaces.
+More will be added later as they are converted from Teamware
+to CVS.
+
+install-if-change
+ Smart install script that also can append suffixes as it
+ installs (suffixes used for debug and profile variants).
+ Requires bash or ksh.
+
+rcs-clean
+ deletes all files from the current directory that can be
+ re-created from RCS. Careful to not delete locked files.
+ May be used by 'gmake clobber'
+
+lock-directory
+unlock-directory
+ traverse a directory structure making it unwritable.
+ Useful to keep people from accidentally overwriting
+ "released" trees if they get confused about which
+ module they have loaded.
+
+rtems-glom
+ glom together all the rtems libraries in order to simplify
+ the link line used by applications.
+ Produces rtems.rel.
+ Not used by the RTEMS src tree at all.
+ Strictly optional.
+
diff --git a/c/build-tools/cklength.c b/c/build-tools/cklength.c
new file mode 100644
index 0000000000..6059cacb1f
--- /dev/null
+++ b/c/build-tools/cklength.c
@@ -0,0 +1,364 @@
+/*
+ * cklength - check the length of lines in a file
+ *
+ * This program check to see if the files passed to it on the command line
+ * contain a line which exceeds the maximum allowable length. The default
+ * maximum line length is 80.
+ *
+ * usage: cklength [ -v ] [ arg ... ] files...
+ * -l length -- maximum line length
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "l:nNv"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -l length -- maximum line length\n\
+ -n -- report line numbers for offending lines\n\
+ -N -- report line numbers and length for offending lines\n\
+ -v -- verbose\n\
+\n\
+Print the name of files which have at least 1 line which exceeds the\n\
+maximum line length. The default maximum line length is 80.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 512
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int report_line_numbers = FALSE; /* report line numbers of offenders */
+int report_line_length = FALSE; /* report line length of offenders */
+
+int line_length = 80; /* maximum allowable line length */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 'l': /* line length */
+ line_length = atoi( optarg );
+ if ( line_length < 0 || line_length > BUFFER_SIZE )
+ error(ERR_FATAL, "(%d) is illegal line length\n",line_length);
+ break;
+
+ case 'n': /* toggle report_line_numbers */
+ report_line_numbers = ! report_line_numbers;
+ break;
+
+ case 'N': /* toggle both reports */
+ report_line_numbers = ! report_line_numbers;
+ report_line_length = ! report_line_length;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int line_number;
+ int length;
+ int count;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ count = 0;
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( length <= line_length )
+ continue;
+
+ if ( count == 0 ) {
+ fprintf( stderr, "%s\n", arg );
+ if ( !report_line_numbers )
+ break;
+ }
+
+ if ( verbose )
+ fprintf( stderr, "TOO LONG:%d: %s\n", line_number, buffer );
+
+ if ( report_line_numbers ) {
+ if ( report_line_length )
+ fprintf( stderr, "%d: %d\n" , line_number, length );
+ else
+ fprintf( stderr, "%d\n" , line_number );
+ }
+
+ count++;
+
+ }
+
+ fclose( in );
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/c/build-tools/eolstrip.c b/c/build-tools/eolstrip.c
new file mode 100644
index 0000000000..b4e0d5d165
--- /dev/null
+++ b/c/build-tools/eolstrip.c
@@ -0,0 +1,351 @@
+/*
+ * eolstrip - strip white space from end of lines
+ *
+ * This program strips the white space from the end of every line in the
+ * specified program.
+ *
+ * usage: eolstrip [ -v ] [ arg ... ] files...
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "vt"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -v -- verbose\n\
+ -t -- test only .. DO NOT OVERWRITE FILE!!!\n\
+\n\
+Strip the white space from the end of every line on the list of files.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 2048
+#define MAX_PATH 2048
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int test_only = FALSE; /* test only */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 't': /* toggle test only mode */
+ test_only = ! test_only;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ FILE *out = (FILE *) 0;
+ char outname[ MAX_PATH ];
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int length;
+ int line_number;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ if ( !test_only ) {
+ sprintf( outname, "%s.eoltmp", arg );
+
+ out = fopen( outname, "w" );
+ if (!out)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+ }
+
+ if ( verbose )
+ fprintf( stderr, "Processing %s\n", arg );
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( buffer[ length ] != '\n' )
+ error(ERR_ERRNO|ERR_FATAL, "Line %d too long in %s\n", line_number, arg);
+
+ while ( isspace( buffer[ length ] ) )
+ buffer[ length-- ] = '\0';
+
+ if ( test_only ) {
+ fprintf( stderr, "%s\n", arg );
+ break;
+ }
+
+ fprintf( out, "%s\n", buffer );
+ }
+
+ fclose( in );
+ if ( !test_only ) {
+ fclose( out );
+ rename( outname, arg );
+ }
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/c/build-tools/os/Makefile.in b/c/build-tools/os/Makefile.in
new file mode 100644
index 0000000000..26c85624db
--- /dev/null
+++ b/c/build-tools/os/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/directory.cfg
+
+SUB_DIRS=$(wildcard $(RTEMS_HOST))
diff --git a/c/build-tools/os/msdos/Makefile.in b/c/build-tools/os/msdos/Makefile.in
new file mode 100644
index 0000000000..5cf6608120
--- /dev/null
+++ b/c/build-tools/os/msdos/Makefile.in
@@ -0,0 +1,39 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/build-tools
+
+INSTALLED=$(DESTDIR)/ifc.exe \
+ $(DESTDIR)/cklength.exe \
+ $(DESTDIR)/fixtimer.exe
+
+all: $(DESTDIR) $(PGMS) install
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the programs
+$(DESTDIR)/ifc.exe: ifc_exe.uue
+ uudecode <ifc_exe.uue
+ mv ifc.exe $(DESTDIR)/ifc.exe
+
+$(DESTDIR)/cklength.exe: cklength.uue
+ uudecode <cklength.uue
+ mv cklength.exe $(DESTDIR)/cklength.exe
+
+$(DESTDIR)/fixtimer.exe: fixtimer.uue
+ uudecode <fixtimer.uue
+ mv fixtimer.exe $(DESTDIR)/fixtimer.exe
+
diff --git a/c/build-tools/os/msdos/README b/c/build-tools/os/msdos/README
new file mode 100644
index 0000000000..af3b0dfb31
--- /dev/null
+++ b/c/build-tools/os/msdos/README
@@ -0,0 +1,12 @@
+#
+# $Id$
+#
+
+ifc is an MS-DOS executable which is equivalent to the program
+install-if-change. It was compiled using Borland C 2.00.
+
+cklength is a precompiled version of the program cklength.c from
+the main source tree.
+
+fixtimer is a program to restore the clock if the program does not
+exit cleanly.
diff --git a/c/build-tools/os/msdos/cklength.uue b/c/build-tools/os/msdos/cklength.uue
new file mode 100644
index 0000000000..fd8052cd9a
--- /dev/null
+++ b/c/build-tools/os/msdos/cklength.uue
@@ -0,0 +1,286 @@
+#
+# $Id$
+#
+begin 664 cklength
+M?T5,1@$" 0 " ( ! $,% #0 "T8 T "
+M!0 H !H %P 8 T $ - "@ H 4 P
+M -0 !$ ! ! ! 7
+M2P %TL % $ $ !=, (73 &\ %? < 0
+M @ %U A=0 (@ !P O=7-R+VQI8B]L9"YS
+M;RXQ $, !6 20 #P
+M #@ $4 /0 !P !# &@
+M A 30 #\ *0 $X !" D
+M $@ W $8 )@ "
+M ! %( 4P Z *@ 00
+M $H 'P $L !5 3P L .P %0 H
+M-@ #$ P 40
+M
+M
+M G
+M '0 C ; N
+M "( -0 E #D R - !X
+M "T ,P !$ *P
+M ^ "\ 3 % !'
+M 0#4 , $ $ Z # "
+M ! U0 P P 0BT , 0 $*W #
+M % !"S P !@ 0P4 , < $32
+M # ( !$^ P "0 1/L , H $3
+M] # + !% P # A=, , T
+M (74 # . "%]@ P #P ACP , !
+M (9" # 1 P $@ ,
+M !, # 4 P %0
+M , !8 # 7 P &
+M , !D ! (8. 2 " !$_0 $0 "P !8
+M 0P4 =!( < = (8U 2 (@ "&$0 $@
+M "< 1/L !$ H U (8O 2 / "&0@ $$0
+M$0 $4 AB8 !( !. (9# 01 1 5P "',@
+M$0#_\0 %P 1+ 2!( < !B $2> $@2 ' 9P !$8@
+M "H$@ !P &\ AD8 !0"$ !$ !T (73 1 /_Q B@ "
+M&*0 $@ ) A@( !( "7 (8% 2
+MG !$T@ $@ " *( ACT !!$ ! "J (9$ 01 1
+M M "&E@ )@$0 $0 , AB !( #' (8\ 01
+M 0 S0 "%U $0#_\0 -8 0[H !0!( < #> (9&
+M 4 1 1 Y "&E@ )@$0 $0 /$ AC@ !( #W (8
+M+ 2 _P "&" $@ 04 AD, !"$ !$ $-
+M (<N 01 1 !$P "&+ $@ 1H 1 H !8!( <
+M $@ (8_ 01 0 !,P "'+P $$0 $0 3H AC( !(
+M $_ (<P 01 1 !1@ "&&@ $@ 4P AS$
+M!!$ !$ %3 (8^ 01 0 !9P "&0@ $0#_\0 6X A?8
+M !$ __$ &( (87 2 !C@ "&1 $$0 $0 9<
+M 1,( /!( < &I $3\ 1 * !M@ !%TL $0#_\0
+M ;T 10 !!$ P '* $2, $@2 ' !SP "&(P $@
+M =8 0R( !( < 'H $3^ 1 + !]0 !#10 '4
+M$@ !P ?H AD !!$ ! (& (8= 2 "#0 !$^
+M $@ "0 A, AA0 !( 9V5T;W!T %]?1%1/4E],25-47U\
+M7W-T87)T ')E860 871O:0!?7T-43U)?3$E35%]? '-T<G1O; !P<F]G;F%M
+M90!V9G!R:6YT9@!?96YV:7)O;@!?96YD %=R:71E %)E860 9V5T<&%R;0!?
+M:6]B %]'3$]"04Q?3T9&4T547U1!0DQ%7P!A8F]R= !A=&5X:70 97AI= !?
+M:6YI= !V97)B;W-E %]S>7-?;F5R<@!S>7-?97)R;&ES= !F8VQO<V4 55-!
+M1T4 7T193D%-24, <')O8V5S<P!?7VEO8@!?<WES7V5R<FQI<W0 =W)I=&4
+M<W1R<F-H<@!?97AI= !E;G9I<F]N &5R<FYO '-T<F-H<@!E<G)O<@!R97!O
+M<G1?;&EN95]L96YG=&@ ;W!T:6YD &]P96X ;W!T87)G &9G971S &]P=&5R
+M<@!R97!O<G1?;&EN95]N=6UB97)S %]E9&%T80!?4%)/0T5$55)%7TQ)3DM!
+M1T5?5$%"3$5? &9O<&5N '-Y<U]N97)R %]?9&]?9VQO8F%L7V1T;W)S %]?
+M0U1/4E]%3D1?7P!?971E>'0 7VQI8E]V97)S:6]N $]P96X 9F9L=7-H %]?
+M9&]?9VQO8F%L7V-T;W)S %]?1%1/4E]%3D1?7P!M86EN &QI;F5?;&5N9W1H
+M '-T<FQE;@!?9FEN:0!F<')I;G1F &QI8F,N<V\N,0 AD, C$P
+M AS$ !#$P AS !!$P AR\ _$P AD8 U
+M$P " AD0 !($P AI8 P$P A@( K%0 A@4
+M L%0 A@@ Y%0 A@L X%0 A@X :%0
+M AA$ >%0 AA0 !5%0 AA< !'%0 AAH !"%0
+M AAT !3%0 AB Q%0 AB, !.%0 AB8 B
+M%0 ABD J%0 ABP \%0 AB\ @%0 AC(
+M ! %0 AC4 =%0 AC@ W%0 "\$" X .@0*(#H$2<
+M(Z @@) 0* 20$ !0 !"]@$ 1 !$D!(CX$ 0O(! 0 !P $
+M "0$ 0DA $94L( *4 J $E 1 "A< (:6$N$,U"+ $ "D! 0 !"
+MYP$ ! $+H 0 ('#X @! $0 1-0"(^R HK__$H #9(2(^S0 F $
+M@*(@ * F4$" E@)@!)(0( "2 F $T ) "X"B( 2O__]E *@ 9*2@ "
+M@ ,$0 1!$ $2B$B/LH2I@ M $ !&?P@ 0 *"$/_PRO__]T 0 $1$
+M $1 $+!D!(C"(''X B!Z G>._F*@0 !BB$" L! @ - &0 ! $+!DA @
+M+Q, (: HB $H !- B80@0@ $T 9 - "80B0 B !T")A"!$ (;0 B$(
+MT"9 !$ (? (B#$(0 AB< (8E "&%0 19 0 !22$ 90 !"KI02H:"
+MHC__ H ,X"B(&PB@ 1$0 AQ2 F HB!N@*(@/P* "J HB!. H '- $
+M(/@0O__P%0 10* !. HB!V H 'M $H/00O__J%0 14 0IO0 B# E!
+M"!$ (: HJ( "+__XM0B(0 3 !%$0@ $ (N2$F&H$+__W14 $70!"#X
+M@* ")!@/_\0O__7T"0@^("@ B08#__T"0@^- $X/R H (D& __Q"__\_0
+M).#\@* ")!@/_\0O__+T"2@]!"__\FB$" !@*1@ "* L1 "'%0 AA$
+M (:0$B$X$P 19(28<A $)VU *@\$ 0F60$" !DA "- "(+R1*B "T 9
+M"("B( "@ 1(0 A] "8+R1*B "0 #] &0 B HC__(H K 0/__0!""\
+MD (@ = D(+R1*B "T 9 "("B( 2O__SDA $(''X B!Z G>.]F) 0 !@3
+M !%0 !"6I(28="JD@ $H !Z80( 1& $P 19(28=A !%E! &* 0
+M( &H![WX)0 ABT (:0$ 4DA B $ 0DV4$ 5@*(@ * #4! 0 !"
+M2Y 0 !2B C__$0 AM "(0" I$ (!( *X"DX 2@ +$0 AA, $60%*$X
+MDA)A^$ 0C64$ 8T 6@^("B( "@ B$0 AM "(/2 HB H !Q, $60
+M%*$XDA)B )00 !! $(HE@>]^- %H/B HB H $A$ (;0 B#\@*(@ *
+M D3 !%D!2A.)(28AB4$ 00 !"&Y80 !$0@ (I@3@ 1, $60%*$XDA)B
+M($ 0A24$ 0I@3@ 1"__\B@!" !0 !"&Y 0 !6P$" @<?@"('H "=X[^0
+M\B>@2/0GH$SV)Z!0^">@5/HGH%@1 "&0 !"$I 2(2@1' LBX "!$0 "
+MC@ ( H !*('H$P1 "'\@(@N. 'H$@5 "&-0 AI 6H3@3 !%DA)B*$
+M0?/4 J$(D!:A.)(0 !! $(!E! $8"F8 "@ :$0 A@2 !*0$B$X$0
+MAM "(1" ID (-H #!$ (85 "&E!*B6)<N8 *0%J$X$P 19(28C! $'=
+MU + "A" X1 "&D!(A.!, $62$F(X0 !!UI00 !D0@ '$0 AI 2(3@3
+M !%0 !!T)(28E 1 "&0 !!W) 2(3@1# @(X " * !41" @(X " *
+M R IF H !1$ $41 !%$( Y(2(EB2$B)P?___M) 0( ! $&MD!
+M&9 0( 3 !%?___KI(28GA $'+ 0 (''X B!Z G>._F* 0 !@1 !%
+MD!(BD$ 0<;23 @*(@ !* F0$ 0$0@ !, $62$F*@?___G)00 ! 0
+M@ :L! &9(0( ! $&\E! @ + 0 B I@ 9!H !("F !H$@ 1 0 ("F
+M0!H2@ ($0@ !, $62$F*XE! $'___XF6$ :,( !Q, $62$F+0E!
+M&Y80 !E___^"F! &H''X B!Z G>._F* 0 !B0$ 0DA &4 0:*4$ :
+ML! "("F/_\2@ ($1@ !, $62$F+PE! $)80 !E___]PF! &H''X B!
+MZ G>._F* 0 !B0$ 0DA &4 09.4$ :L! "("F/_\2@ ($1@ !,
+M $62$F,0E! $)80 !E___]>F! &H''X B!Z G>._F* 0 !B0$ 0DA
+M&4 0824$ :L! "("F/_\2@ ($1@ !, $62$F,PE! $)80 !E___],
+MF! &H''X B!Z G>._F!$ $32 B/X@*)@ * F@$B/XT 0 )_" "@
+M!" $T 0 ("B( 2O__[ 0 (''X B!Z G>._F)WCOZ"!Z G>._F!$
+M $34 B/L@**__Q* V2$B/LT )@!("B( "@ )E! @ )8"8 22$" D@)@
+M!- "0 N HB $K___90"H &2DH H #!$ $01 !$HA(C[*$J8 +0! 1
+MG\( $ "@A#_\,K___= $ !$1 !$0 !!$) 2(PB!Q^ (@>@ (''X B!
+MZ G>._H(''X B!Z _____P #_____ ! '5S
+M86=E.B @8VML96YG=&@@(%L@+78@72!;(&%R9R N+BX@72!F:6QE<RXN+B *
+M(" @(" @(" @(" @+6P@;&5N9W1H(" @+2T@;6%X:6UU;2!L:6YE(&QE;F=T
+M: H@(" @(" @(" @(" M;B @(" @(" @(" M+2!R97!O<G0@;&EN92!N=6UB
+M97)S(&9O<B!O9F9E;F1I;F<@;&EN97,*(" @(" @(" @(" @+4X@(" @(" @
+M(" @+2T@<F5P;W)T(&QI;F4@;G5M8F5R<R!A;F0@;&5N9W1H(&9O<B!O9F9E
+M;F1I;F<@;&EN97,*(" @(" @(" @(" @+78@(" @(" @(" @+2T@=F5R8F]S
+M90H*4')I;G0@=&AE(&YA;64@;V8@9FEL97,@=VAI8V@@:&%V92!A="!L96%S
+M=" Q(&QI;F4@=VAI8V@@97AC965D<R!T:&4*;6%X:6UU;2!L:6YE(&QE;F=T
+M:"X@(%1H92!D969A=6QT(&UA>&EM=6T@;&EN92!L96YG=&@@:7,@.# N"@
+M &PZ;DYV *"5D*2!I<R!I;&QE9V%L(&QI;F4@;&5N9W1H"@ E<P
+M '( 56YA8FQE('1O(&]P96X@9FEL92 H)7,I"@ E
+M<PH %1/3R!,3TY'.B5D.B E<PH "5D.B E9 H )60*
+M E<SH@ " H)7,I"@ ("AU;FMN;W=N(&5R<FYO/25D*0H "@
+M !F871A;"!E<G)O<BP@97AI=&EN9P !E>&ET:6YG &9A=&%L(&5R
+M<F]R+"!A8F]R=&EN9P # Q,C,T-38W.#DM G)7,G(&ES(&YO="!A
+M(&YU;6)E<@ E<R!C86X@;VYL>2!B92 E;&0 E<R!M=7-T(&)E
+M(&)E='=E96X@)6QD(&%N9" E;&0 &]P96XH)R5S)RP@,'@E>"P@,"5O*2!F
+M86EL960 <F5A9"@E9"P@,'@E>"P@)60I(&9A:6QE9 !W<FET
+M92@E9"P@,'@E>"P@)60I(&9A:6QE9 (74 $ (; # !$T@
+M - $3X 0 0#H !0 !"+0 * ")0 8 0-4 "P
+M ! 5 , A?8 @ .0 4 !P !< 0LP
+M!P !"MP ( !. D ,
+M # P,+__\P$ #
+M \,+__\ $ # !(,+__[0$ # !4,+__Z@$ # !@,+__YP$
+M # !L,+__Y $ # !X,+__X0$ # "$,+__W@$ # "0,+__
+MVP$ # "<,+__V $ # "H,+__U0$ # "T,+__T@$ # #
+M,+__SP$ # #,,+__S $ # #8,+__R0$ # #D,+__Q@$ #
+M #P,+__PP$ # #\,+__P $ # $(,+__O0$ ! $4"
+M % $
+M 0 __$ $ U # ! ! .@ P @ 0-4
+M , , $(M # $ !"MP P !0
+M 0LP , 8 $,% # ' !$T@ P "
+M 1/@ , D $3[ # * !$_0 P
+M"P 10 , P (73 # - "%U
+M P #@ A?8 , \ (8\ # 0 "&0@
+M P $0 , !( # 3
+M P % , !4 # 6
+M P %P , !@ # 9
+M #P ! #_\0 !8 0 __$ B $
+M /_Q +0 !$U @ " $, 0R( < !2 (8\
+M ! 0 8 ! #_\0 &L 0T4 < !Z
+M $ /_Q A ! #_\0 (\ 1-$ ( < "E
+M $31 ' M "&00 0 $ ,( 0 __$
+M #) (8. 2 T !$_0 $0 "P -X 0P4 =!(
+M < #E (8U 2 Z@ "&$0 $@ .\ 1/L
+M !$ H #] (8O 2 !! "&0@ $$0 $0 0T AB8
+M !( $6 (9# 01 1 !'P "',@ $0#_\0 20
+M 1+ 2!( < $J $2> $@2 ' !+P !$8@ "H$@ !P
+M 3< AD8 !0"$ !$ $\ (73 1 /_Q !4@ "&*0 $@
+M 5@ A@( !( %? (8% 2 !9 !$T@
+M$@ " 6H ACT !!$ ! %R (9$ 01 1 !? "&E@
+M )@$0 $0 8@ AB !( &/ (8\ 01 0 !E0 "
+M%U $0#_\0 9X 0[H !0!( < &F (9& 4 1 1 !
+MK "&E@ )@$0 $0 ;D AC@ !( &_ (8+ 2
+M !QP "&" $@ <T AD, !"$ !$ '5 (<N 01
+M 1 !VP "&+ $@ >( 1 H !8!( < 'H (8_
+M 01 0 !^P "'+P $$0 $0 @( AC( !( (' (<
+MP 01 1 "#@ "&&@ $@ A0 AS$ !!$ !$ (;
+M (8^ 01 0 "+P "&0@ $0#_\0 C8 A?8 !$ __$
+M )0 (87 2 "5@ "&1 $$0 $0 E\ 1,( /!(
+M < )Q $3\ 1 * "?@ !%TL $0#_\0 H4 10
+M!!$ P *2 $2, $@2 ' "EP "&(P $@ IX 0R(
+M !( < *P $3^ 1 + "O0 !#10 '4$@ !P L(
+M AD !!$ ! +. (8= 2 "U0 !$^ $@ "0
+M ML AA0 !( 9V\S,B]C:VQE;F=T: !C<G1I+G, =F%L=65S+5AA
+M+F, 8W)T<W1U9F8N8P!?7V1O7V=L;V)A;%]C=&]R<U]A=7@ 9V-C,E]C;VUP
+M:6QE9"X 9F]R8V5?=&]?9&%T80!C:VQE;F=T:"YC &=C8S)?8V]M<&EL960N
+M &QI8F=C8S(N8P!C<G1S='5F9BYC %]?9&]?9VQO8F%L7V-T;W)S7V%U> !G
+M8V,R7V-O;7!I;&5D+@!F;W)C95]T;U]D871A &-R=&XN<P!G971O<'0 7U]$
+M5$]27TQ)4U1?7P!?<W1A<G0 <F5A9 !A=&]I %]?0U1/4E],25-47U\ <W1R
+M=&]L '!R;V=N86UE '9F<')I;G1F %]E;G9I<F]N %]E;F0 5W)I=&4 4F5A
+M9 !G971P87)M %]I;V( 7T=,3T)!3%]/1D93151?5$%"3$5? &%B;W)T &%T
+M97AI= !E>&ET %]I;FET '9E<F)O<V4 7W-Y<U]N97)R '-Y<U]E<G)L:7-T
+M &9C;&]S90!54T%'10!?1%E.04U)0P!P<F]C97-S %]?:6]B %]S>7-?97)R
+M;&ES= !W<FET90!S=')R8VAR %]E>&ET &5N=FER;VX 97)R;F\ <W1R8VAR
+M &5R<F]R ')E<&]R=%]L:6YE7VQE;F=T: !O<'1I;F0 ;W!E;@!O<'1A<F<
+M9F=E=', ;W!T97)R ')E<&]R=%]L:6YE7VYU;6)E<G, 7V5D871A %]04D]#
+M14154D5?3$E.2T%'15]404),15\ 9F]P96X <WES7VYE<G( 7U]D;U]G;&]B
+M86Q?9'1O<G, 7U]#5$]27T5.1%]? %]E=&5X= !?;&EB7W9E<G-I;VX 3W!E
+M;@!F9FQU<V@ 7U]D;U]G;&]B86Q?8W1O<G, 7U]$5$]27T5.1%]? &UA:6X
+M;&EN95]L96YG=&@ <W1R;&5N %]F:6YI &9P<FEN=&8 $ %
+MFP UD "]D # %$X ((X
+M $8\ ! *",I4W5N3U,@-2XS($=E;F5R:6,@4V5P=&5M
+M8F5R(#$Y.3, &%S.B!30S,N,"!E87)L>2!A8V-E<W,@,#$@4V5P(#$Y.3,*
+M $=#0SH@*$=.52D@,BXV+C, &%S.B!30S,N,"!E87)L>2!A8V-E<W,@,#$@
+M4V5P(#$Y.3,* $=#0SH@*$=.52D@,BXV+C, &%S.B!30S,N,"!E87)L>2!A
+M8V-E<W,@,#$@4V5P(#$Y.3,* $=#0SH@*$=.52D@,BXV+C, &%S.B!30S,N
+M,"!E87)L>2!A8V-E<W,@,#$@4V5P(#$Y.3,* $=#0SH@*$=.52D@,BXV+C,
+M;&0Z("A31U4I(%-U;D]3+T5,1B H3$LM,2XS*0 0 "D 8?
+M"V0 1,( (60 1,( +3P /(
+M 7H <( EX L(
+M SH !$H !5H !=(
+M !EH !LX !SX !
+MX8 !]( "#( ".8
+M "5( "<( "D8 "G8
+M "R( #&8 $GH %+(
+M & %.8 ) %0X -< %3H #0 %
+M6H #4 %9( #8 %;X #< %>8 #@
+M %A( #D %CX #H %FH $8 %IX
+M %T( &T %]( "X &"20 !\L 1,( "YI;G1E
+M<G +FAA<V@ +F1Y;G-Y;0 N9'EN<W1R "YR96QA+F)S<P N<F5L82YP;'0
+M+G1E>'0 +FEN:70 +F9I;FD +F-T;W)S "YD=&]R<P N<F]D871A "YG;W0
+M+F1Y;F%M:6, +G!L= N9&%T80 N8G-S "YS>6UT86( +G-T<G1A8@ N<W1A
+M8BYI;F1E> N8V]M;65N= N<W1A8@ N<VAS=')T86( +G-T86(N:6YD97AS
+M='( +G-T86)S='( '9A;'5E<RU882YC "\Q,#DS+V]N,3 Y,U]W<R]U<W(O
+M<W)C+VQI8B]L:6)C+P!P;W)T+V=E;B]V86QU97,M6&$N8P %AT(#L@5CTR
+M+C +VYE="]M;W)G86YA+W5S<C$O<G1E;7,M,RXU+C P+V,O8G5I;&0M=&]O
+M;',O<W)C "]U<W(O8V-S+VQI8B]V86QU97,M6&$N;P ;&EB9V-C,BYC "]U
+M<W(T+T=.050O9V-C+3(N-BXS+P N+VQI8F=C8S(N8P!G8V,R7V-O;7!I;&5D
+M+@!I;G0Z=#$]<C$[+3(Q-#<T.#,V-#@[,C$T-S0X,S8T-SL 8VAA<CIT,CUR
+M,CLP.S$R-SL ;&]N9R!I;G0Z=#,]<C$[+3(Q-#<T.#,V-#@[,C$T-S0X,S8T
+M-SL =6YS:6=N960@:6YT.G0T/7(Q.S [+3$[ &QO;F<@=6YS:6=N960@:6YT
+M.G0U/7(Q.S [+3$[ &QO;F<@;&]N9R!I;G0Z=#8]<C$[,#$P,# P,# P,# P
+M,# P,# P,# P,# [,#<W-S<W-S<W-S<W-S<W-S<W-S<W-SL ;&]N9R!L;VYG
+M('5N<VEG;F5D(&EN=#IT-SUR,3LP,# P,# P,# P,# P.S Q-S<W-S<W-S<W
+M-S<W-S<W-S<W-S<W.P!S:&]R="!I;G0Z=#@]<C$[+3,R-S8X.S,R-S8W.P!S
+M:&]R="!U;G-I9VYE9"!I;G0Z=#D]<C$[,#LV-34S-3L <VEG;F5D(&-H87(Z
+M=#$P/7(Q.RTQ,C@[,3(W.P!U;G-I9VYE9"!C:&%R.G0Q,3UR,3LP.S(U-3L
+M9FQO870Z=#$R/7(Q.S0[,#L 9&]U8FQE.G0Q,SUR,3LX.S [ &QO;F<@9&]U
+M8FQE.G0Q-#UR,3LX.S [ &-O;7!L97@@:6YT.G0Q-3US.')E86PZ,2PP+#,R
+M.VEM86<Z,2PS,BPS,CL[ &-O;7!L97@@9FQO870Z=#$V/7(Q-CLT.S [ &-O
+M;7!L97@@9&]U8FQE.G0Q-SUR,3<[.#LP.P!C;VUP;&5X(&QO;F<@9&]U8FQE
+M.G0Q.#UR,3@[.#LP.P!V;VED.G0Q.3TQ.0!A<F-H7W1Y<&4Z5#(P/65!4D-(
+M7S,R0DE4.C L05)#2%\V-$))5#HQ+#L <F5G7V-L87-S.E0R,3UE3D]?4D5'
+M4SHP+$=%3D5204Q?4D5'4SHQ+$907U)%1U,Z,BQ!3$Q?4D5'4SHS+$Q)35]2
+M14=?0TQ!4U-%4SHT+#L ;6%C:&EN95]M;V1E.E0R,CUE5D])1&UO9&4Z,"Q1
+M26UO9&4Z,2Q(26UO9&4Z,BQ04TEM;V1E.C,L4TEM;V1E.C0L4$1);6]D93HU
+M+$1);6]D93HV+%1);6]D93HW+$]);6]D93HX+%%&;6]D93HY+$A&;6]D93HQ
+M,"Q4449M;V1E.C$Q+%-&;6]D93HQ,BQ$1FUO9&4Z,3,L6$9M;V1E.C$T+%1&
+M;6]D93HQ-2Q30VUO9&4Z,38L1$-M;V1E.C$W+%A#;6]D93HQ."Q40VUO9&4Z
+M,3DL0U%);6]D93HR,"Q#2$EM;V1E.C(Q+$-326UO9&4Z,C(L0T1);6]D93HR
+M,RQ#5$EM;V1E.C(T+$-/26UO9&4Z,C4L0DQ+;6]D93HR-BQ#0VUO9&4Z,C<L
+M0T-8;6]D93HR."Q#0U].3T]6;6]D93HR.2Q#0UA?3D]/5FUO9&4Z,S L0T-&
+M4&UO9&4Z,S$L0T-&4$5M;V1E.C,R+$U!6%]-04-(24Y%7TU/1$4Z,S,L.P!M
+M;V1E7V-L87-S.E0R,SUE34]$15]204Y$3TTZ,"Q-3T1%7TE.5#HQ+$U/1$5?
+M1DQ/050Z,BQ-3T1%7U!!4E1)04Q?24Y4.C,L34]$15]#0SHT+$U/1$5?0T]-
+M4$Q%6%])3E0Z-2Q-3T1%7T-/35!,15A?1DQ/050Z-BQ-05A?34]$15]#3$%3
+M4SHW+#L <'1R9&EF9E]T.G0Q '-I>F5?=#IT- !W8VAA<E]T.G0S %51271Y
+M<&4Z=#$Q %-)='EP93IT,0!54TET>7!E.G0T $1)='EP93IT-@!51$ET>7!E
+M.G0W %-&='EP93IT,3( 1$9T>7!E.G0Q,P!W;W)D7W1Y<&4Z=#$ 1$ES=')U
+M8W0Z5#(T/7,X:&EG:#HQ+# L,S([;&]W.C$L,S(L,S([.P!$275N:6]N.G0R
+M-3UU.',Z,C0L,"PV-#ML;#HV+# L-C0[.P!F=6YC7W!T<CIT,C8]*C(W/68Q
+M.0!?7V1O7V=L;V)A;%]D=&]R<SI&,3D
+M $ ! @ ! -0 #4 $0
+M 0 ) !0 ( 0#H Z FP #
+M 0 $ #P L " $#5 U0 5@ ! !H $
+M $ !< # @ !"+0 BT ")0 0
+M ? ! ( 0K< *W %0 # $0 0 , *0
+M 0 " $+, "S #D P \ $ # #, !
+M!@ !#!0 P4 '- ! Y 0 8 1-(
+M 32 )@ 0 /P $ & $3X $^
+M , $ $4 ! !@ !$^P !/L "
+M ! !, 0 8 1/T 3] @
+M 0 4P $ " $4 % -+ (
+M %L ! P "%TP !=, ! ! 0
+M !@ !@ , A=0 74 (@ $ 0 ( :0
+M $ ' (7V %]@ $8 $ # &X !
+M P "&/ !CP % ! !T " , AD(
+M 9" \ @ >0 ( &0@
+M 90 $P "D $ $ ($ # !]8 "XP
+M 0 ") 0 B/ $@
+M 0 , E0 $ (H0 $; !
+M )X ! ".@ !^ ! P
+M "D P EF ,8 $ K@
+M , )EX "; ! +T #
+= ";Y &'P 0 !
+
+end
diff --git a/c/build-tools/os/msdos/fixtimer.c b/c/build-tools/os/msdos/fixtimer.c
new file mode 100644
index 0000000000..3b71032550
--- /dev/null
+++ b/c/build-tools/os/msdos/fixtimer.c
@@ -0,0 +1,111 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <dos.h>
+
+#define IO_RTC 0x70 /* RTC */
+
+#define RTC_SEC 0x00 /* seconds */
+#define RTC_MIN 0x02 /* minutes */
+#define RTC_HRS 0x04 /* hours */
+#define RTC_WDAY 0x06 /* week day */
+#define RTC_DAY 0x07 /* day of month */
+#define RTC_MONTH 0x08 /* month of year */
+#define RTC_YEAR 0x09 /* month of year */
+#define RTC_STATUSA 0x0a /* status register A */
+#define RTCSA_TUP 0x80 /* time update, don't look now */
+
+#define RTC_STATUSB 0x0b /* status register B */
+
+#define RTC_DIAG 0x0e /* status register E - bios diagnostic */
+#define RTCDG_BITS "\020\010clock_battery\007ROM_cksum\006config_unit\005memory_size\004fixed_disk\003invalid_time"
+
+
+
+/* convert 2 digit BCD number */
+static int bcd( unsigned int i )
+{
+ return ((i/16)*10 + (i%16));
+}
+
+static unsigned int rtcin( unsigned int what )
+{
+ outportb( IO_RTC, what );
+ return inportb( IO_RTC+1 );
+}
+
+
+void fix_date( void )
+{
+ int s;
+ struct date date;
+ struct time time;
+
+ /* initialize brain-dead battery powered clock */
+ outportb( IO_RTC, RTC_STATUSA );
+ outportb( IO_RTC+1, 0x26 );
+ outportb( IO_RTC, RTC_STATUSB );
+ outportb( IO_RTC+1, 2 );
+
+ outportb( IO_RTC, RTC_DIAG );
+ s = inportb( IO_RTC+1 );
+ if (s) printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS);
+
+ /* check for presence of clock */
+ s = rtcin(RTC_STATUSA);
+ if ( s == 0xff || s == 0 ) {
+ printf( "Real-time clock not found\n" );
+ return;
+ }
+
+ /* ready for a read? */
+ while ((s & RTCSA_TUP) == RTCSA_TUP)
+ s = rtcin(RTC_STATUSA);
+
+ date.da_year = bcd(rtcin(RTC_YEAR)) + 1900; /* year */
+ if ( date.da_year < 1970) date.da_year += 100;
+ date.da_year -= 1980;
+ date.da_mon = bcd(rtcin(RTC_MONTH)); /* month */
+ date.da_day = bcd(rtcin(RTC_DAY)); /* day */
+
+ (void)bcd(rtcin(RTC_WDAY)); /* weekday */
+
+ time.ti_hour = bcd(rtcin(RTC_HRS)); /* hour */
+ time.ti_min = bcd(rtcin(RTC_MIN)); /* minutes */
+ time.ti_sec = bcd(rtcin(RTC_SEC)); /* seconds */
+ time.ti_hund = 0;
+
+ setdate( & date );
+ settime( & time );
+}
+
+
+
+
+void fix_timer( void )
+{
+#define PIT_PORT 0x40
+#define TIMER_CNTR0 (PIT_PORT + 0) /* timer 0 counter port */
+#define TIMER_MODE (PIT_PORT + 3) /* timer mode port */
+#define TIMER_SEL0 0x00 /* select counter 0 */
+#define TIMER_RATEGEN 0x04 /* mode 2, rate generator */
+#define TIMER_16BIT 0x30 /* r/w counter 16 bits, LSB first */
+
+ /* set timer 0 to generate interrupts every period */
+ outportb( TIMER_MODE, TIMER_SEL0|TIMER_RATEGEN|TIMER_16BIT );
+ outportb( TIMER_CNTR0, 0 ); /* counter low */
+ outportb( TIMER_CNTR0, 0 ); /* counter high */
+}
+
+int main(void)
+{
+ /* Make timer count at correct pace */
+ fix_timer();
+
+ /* Fix the date */
+ fix_date();
+
+ return 0;
+}
diff --git a/c/build-tools/os/msdos/fixtimer.uue b/c/build-tools/os/msdos/fixtimer.uue
new file mode 100644
index 0000000000..bc4b10fc72
--- /dev/null
+++ b/c/build-tools/os/msdos/fixtimer.uue
@@ -0,0 +1,162 @@
+#
+# $Id$
+#
+begin 664 fixtimer.exe
+M35IF 0X 0 @ T __^; 8 (@ $ ^R!R:@$
+M
+M
+M
+M
+M
+M
+M
+M
+M
+M
+M "Z3 $NB1;X ;0PS2&++@( BQXL ([:HY( C :0
+M (D>C ")+JP QP:6 /__Z#0!Q#Z* (O'B]BY_W\F@3TX-W49)HM5 H#Z/740
+M@.;?_P:6 (#^674$_P:6 /*NXV%#)C@%==: S8#WV8D.B@"Y 0#3XX/#"(/C
+M^(D>C@",VBOJBSY\ H'_ )S![\ HD^? *!Q^P$<B@#/GH"<B*Q!-/O1SOO
+M<AF#/GP" '0'@SYZ @!U#K\ $#OO=P>+_>L#Z2$!B]\#VHD>I ")'J@ H9
+M*]B.P+1*5\TA7]/G^H[2B^?[,\ NC@;X ;^F!+GL!"O/\ZH._Q:8!.BU NB=
+M [0 S1J)%I@ B0Z: /\6G 3_-H@ _S:& /\VA #H%P)0Z%H"+HX>^ 'H? .
+M_Q::!#/ B_"Y+P"0_ ($@-0 1N+X+3<-D'0*N1D D+HO .B+ (OLM$R*1@+-
+M(;D. )"Z2 #IAP >N US2&)'G0 C 9V +@$-<TAB1YX (P&>@"X!37-(8D>
+M? ",!GX N 8US2&)'H C :" +@ )8S*CMJZ6 '-(1_#'K@ )<46= #-(1\>
+MN 0EQ19X ,TA'QZX!27%%GP S2$?'K@&)<46@ #-(1_#QP:6 R\.T0+L"
+M ,TAP[D> )"Z5@ NCA[X >CI_[@# %#H*?\ %6+[(M&!+$$T^BZ"@#WXHM6
+M!('B#P #PNL 7<-5B^R*1@3F<.1QM #K %W#58OL@^P(5K *YG"P)N9QL OF
+M<+ "YG&P#N9PY'&T (OP"_9T#[BR 5!6N)0!4.B<"8/$!K@* %#HM?]9B_"!
+M_O\ = 0+]G4+N/P!4.A^"5GIJ0#K"K@* %#HE/]9B_"+QB6 #V '3LN D
+M4.B _UE0Z%__605L!XE&^(%^^+('?02#1OAD@6[XO >X" !0Z%W_65#H//]9
+MB$;[N < 4.A-_UE0Z"S_68A&^K@& %#H/?]94.@<_UFX! !0Z##_65#H#_]9
+MB$;]N ( 4.@@_UE0Z/_^68A&_#/ 4.@1_UE0Z/#^68A&_\9&_@"-1OA0Z'H1
+M68U&_%#HA1%97HOE7<.P-.9#L #F0+ YD##Z/#_Z.S^,\#K ,-5B^Q6BW8$
+M"_9\%(/^6'8#OE< B388 HJ$&@*8ENL-]]Z#_B-WZL<&& +__XO&HY0 N/__
+MZP!>7<(" ,-5B^SK"HL>?@+1X_^7I@2A?@+_#GX""\!UZ_\6= +_%G8"_Q9X
+M O]V!.AZ_5E=PP "Z/!JH#+HP>K /\C@:0 +Z #+D)JQ C,6'UI.+
+M-HH @\8"N0$ @#Z2 -R$8X&C "+_K%_,L#RKN-V@/%_@^P"N $ \,#P27^
+M_XO\*_AR8(OGC,".V(S0CL!12?.D,L"JCMV'\H?9B\.+T$/H&0!W!W) Z!(
+M=_D\('0(/ UT!#P)=>@RP.OD"\!T!T*J"L!U 4.&X#+ ^>,5K$DL(G0/!"(\
+M7'4'@#PB=0*L20OVP^E^_5D#RBZ.'JP#B1Z$ $,#VXOTB^PKZW+FB^6)+H8
+MXPZ)=@"#Q0(VK K X/IT\#/ B48 +O\FJ@.+#HH 4>A' 5F+^ O ="0>'@>.
+M'HP ,_;\\Z0?B_@&_S:. .@I 8/$ HO8!Z.( O =0/I$?TSP+G__XD_@\,"
+M\JXF. 5U](D'PU6+[(,^?@(@=06X 0#K%8M&!(L>?@+1XXF'I@3_!GX",\#K
+M %W#58OL5E>+?@2+10:CZ 0[QW4(QP;H! ZQ"+=02+'N@$B7<$H>@$B40&
+M7UY=PU6+[%97BWX$BT8&*06+-0/WBT8&0(D$B7P"H>8$.\=U!HDVY@3K"(O^
+M WX&B74"B\8%! #K %]>7<-5B^Q6BT8$,](E__^!X@ 4E#H] !968OP@_[_
+M=00SP.L8H>8$B40"BT8$0(D$B3;F!*'F! 4$ .L 7EW#58OL5HM&!#/2)?__
+M@>( %)0Z+< 65F+\(/^_W4$,\#K%8DVZ@2)-N8$BT8$0(D$B\8%! #K %Y=
+MPU6+[%97BWX$"_]U!#/ ZUJ+QP4+ "7X_XOX@S[J! !U!U?HH?]9ZT*+-N@$
+MB\8+P'0QBP2+UX/"*#O"<@E75N@-_UE9ZR2+!#O'<@Y6Z-'^6?\$B\8%! #K
+M$(MT!CLVZ 1USU?H(O]9ZP!?7EW#58OLBT8$B]2!Z@ !.\)S!Z.> #/ ZPO'
+M!I0 " "X___K %W#58OLBT8$BU8& P:> (/2 (O(@<$ 8/2 O2=0H[S',&
+MAP:> .L+QP:4 @ N/__ZP!=PU6+[/]V!.B?_UGK %W#58OLBT8$F5)0Z++_
+MB^7K %W#58OL@^P"5E>+7@2+-XO&B4;^BUX$]T<"0 !T!(O&ZQ^+7@2+?PKK
+M"XO?1X _"G4#_T;^B\9."\!U[HM&_NL 7UZ+Y5W" @!5B^Q6BW8$5NA3!%D+
+MP'0%N/__ZTR#?@H!=1"#/ !^"U;HE?^9*48&&58(@60"7_['! BT0(B40*
+M_W8*_W8(_W8&BD0$F%#HW *#Q B#^O]U"CW__W4%N/__ZP(SP.L 7EW#58OL
+M@^P$5HMV!%;H[ -9"\!T"+K__[C__^L_N $ 4#/ 4%"*1 284.B8 H/$"(E6
+M_HE&_(,\ 'X9BU;^BT;\4E!6Z!#_F8O8B\I86BO#&]'K!HM6_HM&_.L 7HOE
+M7<-5B^RX $2+7@3-(;@ '($T>+1T.L 7<-5B^Q65XM^"HMV!(M$#CO&=0R#
+M?@@"?P:!__]_=@:X___IJ@"#/NH# '4/N) ".\9U",<&Z@,! .L4@S[H P!U
+M#;B CO&=0;'!N@# 0"#/ !T#[@! % SP%!05NC&_H/$"/=$ @0 = ?_= CH
+M"PQ9@60"\__'1 8 (O&!04 B40(B40*@WX( G0_"_]V.\<&= +$"(-^!@!U
+M&%?H6?U9B48&"\!T!X%, @0 ZP6X___K&XM&!HE$"HE$"(E\!H-^" %U!8%,
+M @@ ,\#K %]>7<-65[\$ +Z NL0]T0" P!T!5;HG )93X/&$ O_=>Q?7L-5
+MB^R![(H 5E>+1@A /0( <P4SP.GV (M>!-'C]X? P" =!+_=@C_=@;_=@3H
+MXP"#Q ;IUP"+7@31XX&GP /__8M&!HF&?/^+1@B)AGC_C;9^_^MM_XYX_XN>
+M?/__AGS_B@>(AGO_/ IU!,8$#4:*AGO_B 1&C89^_XO6*]"!^H ?#Z-AG[_
+MB_XK^%>-AG[_4/]V!.A[ (/$!HF&=O\[QW0;@[YV_P!S!;C__^L-BT8(*X9X
+M_P.&=O\KQ^M/C;9^_X.^>/\ = /IB?^-AG[_B_XK^(O'"\!V+E>-AG[_4/]V
+M!.@M (/$!HF&=O\[QW07@[YV_P!S!;C__^L)BT8( X9V_RO'ZP6+1@CK %]>
+MB^5=PU6+[(M>!-'C]X? P (=!"X @!0,\!04/]V!.@H (OEM$"+7@2+3@B+
+M5@;-(7(/4(M>!-'C@8_ P 06.L&4.@%^>L 7<-5B^R+7@31XX&GP /__;1"
+MBD8*BUX$BTX(BU8&S2%R NL'4.C;^)GK %W#58OL@^PB5E<&BWX*'@>+7@B#
+M^R1W6(#[ G)3BT8,BTX."\E]$8!^!@!T"\8%+4?WV??8@]D C7;>XP^1*]+W
+M\Y'W\X@41N,)Z_$KTO?SB!1&"\!U]8U.WO?9 \[\3HH$+ IS! 0ZZP,"1@2J
+MXN^P *H'BT8*ZP!?7HOE7<(, %6+[(-^" IU!HM&!)GK!8M&!#/24E#_=@;_
+M=@BP 5"P85#H7/_K %W#58OL_W8&_W8$_W8(_W8*L !0L&%0Z$#_ZP!=PU6+
+M[/]V!O]V!/]V"/]V"H-^"@IU!;@! .L",\!0L&%0Z!G_ZP!=P[KL ^L#NO$#
+MN04 D+1 NP( S2&Y)P"0NO8#M$#-(>EM]E6+[%97BW8$BT0..\9T!;C__^MF
+M@SP ?"WW1 (( '4,BT0*B]:#P@4[PG46QP0 (M$"HO6@\(%.\)U!HM$"(E$
+M"C/ ZS2+? 8#/$<I/%>+1 B)1 I0BD0$F%#H$OV#Q 8[QW01]T0" )U"H%,
+M A N/__ZP0SP.L 7UY=PU6+[+AK#5"XD )0_W8$C48&4.A, NL 7<-5B^R+
+M7@;_#_]V!HI&!)A0Z 8 B^7K %W#58OL@^P"5HMV!HI&!(A&__\$?3:*1O__
+M1 J+7 J(1__W1 (( '0;@'[_"G0&@'[_#74/5N@9_UD+P'0&N/__Z>D BD;_
+MM #IX0#_#/=$ I =0?W1 (" '4+@4P"$ "X___IQ@"!3 ( 8-\!@!T)H,\
+M '015NC7_ED+P'0&N/__Z:< ZPJX__^+5 8KPHD$Z7W_Z94 @S[J P!U.;B0
+M CO&=3**1 284.@)^UD+P'4%@60"__VX )0]T0" )T!;@" .L",\!0,\!0
+M5NC]^H/$".F/_X!^_PIU'_=$ D =1BX 0!0N!X$4(I$!)A0Z.#\@\0&/0$
+M=1BX 0!0C48$4(I$!)A0Z,C\@\0&/0$ =!'W1 ( G4*@4P"$ "X___K!XI&
+M_[0 ZP!>B^5=PU6+[%:+=@2XD )05NC!_EE9ZP!>7<-5B^R#[ )65XMV!(M^
+M!D?W1 (( '0CZP+K $^+QPO =!56BUX(_T8(B@>84.B+_EE9/?__=>+I=0#W
+M1 ) '0W@WP& '0QBT0&.\=S*H,\ '0-5NBT_5D+P'0$,\#K4T]7_W8(BD0$
+MF%#H(?R#Q :)1OXK?O[K-^L"ZP!/B\<+P'0L_P1]%8M>"/]&"(H'_T0*BUP*
+MB$?_M #K#E:+7@C_1@C_-^CZ_5E9/?__=<N+Q^L 7UZ+Y5W"!@#_)IX$58OL
+MBU8$N00/NR<$_(K&TNC7JHK&(L77JHK"TNC7JHK"(L77JNL 7<(" %6+[('L
+ME@!65\=&J@ QD:M4.LX5[G__S+ \J[WT4E?PX@%1_Y.K7XB4U%2!HU&KBOX
+MC4:N4%?_=@C_5@K&1JU0 7ZJC7ZN!UI96\,&_(U^KHF^;/^+OFS_BW8&K K
+M=!$\)700B 5'_DZM?^_HN?_KZNEU!(FV>/^L/"5TYXF^;/\SR8F.=O^)CFK_
+MB(YU_\>&</___\>&<O___^L!K#+DB]"+V(#K((#[8'-'BI\W!(O#/1< =@/I
+M'02+V-'C+O^G& ]C#TL/I ]7#\D/TP\5$!\0+Q"*#V00/Q!#$$<0Z1";$3P1
+M7!'_$BP3+!,L$W8/@ _IX0. _0!W^(..:O\!ZYN _0!W[(..:O\"ZX^ _0!W
+MX("^=?\K= 2(EG7_Z7S_@Z9J_]^U!>ER_X..:O\@M07I:/^ _0!W1/>&:O\"
+M '4A@XYJ_PBU >E1_^F( XM^!(L%@T8$ H#] G,)B89P_[4#Z3?_@/T$=>&)
+MAG+__L7I*?^ _01ST[4$Z1__DBPPF(#] G<;M0*'AG#_"\!\TM'@B]#1X-'@
+M \(!AG#_Z?O^@/T$=:6'AG+_"\!\M-'@B]#1X-'@ \(!AG+_Z=W^@XYJ_Q"U
+M!>G3_H&.:O\ 8.F:O_OM07IP_Z#IFK_[X&.:O^ +4%Z;/^MPCK"K<*ZPNW
+M$+/I MK&AG7_ ,:&;_\ B)9N_XM^!(L%,]+K$;<*QH9O_P&(EF[_BWX$BP69
+M1T>)=@;WAFK_$ !T!(L51T>)?@2-OGO_"\!U,PO2=2^#OG+_ '4MB[YL_XN.
+M</_C&X/Y_W06BX9J_R4( '0$LC#K K(@BL+HMOWB^>GI_8..:O\$4E!7BL>8
+M4(J&;_]04^B0^18'BY9R_PO2?P/I% 'I(0&(EF[_B78&C;YZ_XM>!/\W0T.)
+M7@3WAFK_( !T#_\W0T.)7@06!^@7_; ZJA8'Z _]Q@4 QH9O_P"#IFK_^XV.
+M>O\K^8?/BY9R_SO1?P*+T>F^ (EV!HB6;O^+?@2+!8-&! (6!XV^>_\RY(D%
+MN0$ Z=@ B78&B)9N_XM^!/>&:O\@ '4,BSV#1@0"'@<+_^L*Q#V#1@0$C, +
+MQW4%'@>_( 3HVOP[CG+_=@2+CG+_Z9D B78&B)9N_XM^!(N.<O\+R7T#N08
+M5U&-GGO_4U*X 0 CAFK_4(N&:O^I@ !T"K@" ,=&_@0 ZQ>I %T"K@( ,=&
+M_@H ZPC'1OX( +@& %#H-_R+1OX!1@06!XV^>__WAFK_" !T$XN6</\+TGX+
+MZ%O\*]%^!(F6=O^*AG7_"L!T%": /2UT#H.N=O\!@Y9V_P!/)H@%Z#3\B_>+
+MOFS_BYYP_[@% ".&:O\]!0!U%HJF;O^ _&]U$(.^=O\ ?P;'AG;_ 0#K'Y"
+M_'AT!8#\6'44@XYJ_T!+2X.N=O\"?0;'AG;_ #CG;_]X9J_P( =0SK!K @
+MZ.'[2SO9?_;WAFK_0 !T#+ PZ,_[BH9N_^C(^XN6=O\+TGXG*\HKVB:*!#PM
+M= @\('0$/"MU!R:LZ*C[24N'RN,'L##HG?OB^8?*XQ$KV2:LB 5'_DZM?P/H
+MD/OB\0O;?@F+R[ @Z'O[XOGIKON)=@:+?@3WAFK_( !U"HL]@T8$ AX'ZP;$
+M/8-&! 2X4 J1JT#1JHFB07I??N+MGC_B[YL_[ EZ#S[K K =?B ?JU0?0/H
+M-OL'BT:JZP!?7HOE7<(( %6+[%97BW8$@S[H! !T'(L>Z 2+?P:+'N@$B7<&
+MB74$B7P&H>@$B40$ZPJ)-N@$B70$B70&7UY=PU6+[(/L E97BW8&BWX$BP0!
+M!:'F!#O&=0:)/N8$ZPV+! /&B4;^BU[^B7\"5NA-\5E?7HOE7<-6H>H$.P;F
+M!'42_S;J!.C:\EDSP*/F!*/J!.L[BQ[F!(MW O<$ 0!U(E;H&?%9.S;J!'4*
+M,\"CY@2CZ@3K!HM$ J/F!%;HH_)9ZPS_-N8$Z)GR68DVY@1>PU6+[(/L E97
+MBW8$_PR+! /&B4;^BWP"]P4! '44.S;J!'0.BP0!!8M>_HE_ HOWZP56Z +_
+M68M>_O<' 0!U"?]V_E;H*O]965]>B^5=PU6+[%:+=@0+]G4"ZQ>+Q@7\_XOP
+M.S;F!'4%Z#S_ZP56Z(__65Y=PU6+[%:T*XMV!(L,BU0"S2%>7<-5B^Q6M"V+
+M=@2+#(M4 LTA7EW# !4=7)B;RU#("T@0V]P>7)I9VAT("AC
+M*2 Q.3@X($)O<FQA;F0@26YT;"X 3G5L;"!P;VEN=&5R(&%S<VEG;FUE;G0-
+M"D1I=FED92!E<G)O<@T*06)N;W)M86P@<')O9W)A;2!T97)M:6YA=&EO;@T*
+M .P$[ 3L
+M!
+M
+M
+M
+M
+M 4E1#($))3U,@9&EA9VYO<W1I8R!E<G)O<B E
+M8@H $ AC;&]C:U]B871T97)Y!U)/35]C:W-U;09C;VYF:6=?=6YI= 5M96UO
+M<GE?<VEZ901F:7AE9%]D:7-K VEN=F%L:61?=&EM90!296%L+71I;64@8VQO
+M8VL@;F]T(&9O=6YD"@ $P("! 4&" @(%!4%$_\6!1$"____________
+M_____P4%_____________________P__(P+_#_____\3__\" @4/ O___Q/_
+M_________R/_____(_\3_P!Z WH#>@, 0 D" ( "
+M * @$ "0 @ @(" H ( $," P
+M + " !" @0 # @ #_ T ( _P
+M . " /\ #P @ #_ , _P
+M ! # /\ @ P #_ , ,
+M_P $ # /\ !0 P #_ 8 ,
+M _P ' # /\ " P #_
+MD , _P * # /\ "P P$@ B "( 2@ J#_
+M______________________________________\ <')I;G0@<V-A;F8@
+M.B!F;&]A=&EN9R!P;VEN="!F;W)M871S(&YO="!L:6YK960-"@ - "AN=6QL
+M*0 P,3(S-#4V-S@Y04)#1$5& !04 105%!04% ( % ,$% D%!04%!04%!044
+M%!04%!04%!04% \7#P@4%!0'%!84%!04%!04%!0-%!04%!04%!04%! *#P\/
+G" H4% 84$@L.%!01% P4% T4%!04%!04 -(!T@'9 50+60M9"UD+
+
+end
diff --git a/c/build-tools/os/msdos/ifc.c b/c/build-tools/os/msdos/ifc.c
new file mode 100644
index 0000000000..091e2dd0ef
--- /dev/null
+++ b/c/build-tools/os/msdos/ifc.c
@@ -0,0 +1,331 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <process.h>
+
+#include <io.h>
+
+void * xmalloc( int size )
+{
+ void * p = (void *)malloc( size );
+ if ( !p ) {
+ fprintf( stderr, "out of memory\n" );
+ exit( 1 );
+ }
+ return p;
+}
+void * xrealloc( void * old, int size )
+{
+ void * p = (void *)realloc( old, size );
+ if ( !p ) {
+ fprintf( stderr, "out of memory\n" );
+ exit( 1 );
+ }
+ return p;
+}
+
+char ** argv_fix( int * argc, char ** argv )
+{
+ char ** new = NULL;
+ int max = 20;
+ int cnt = 0;
+ int j;
+
+ for ( j = 1; argv[j]; ++j )
+ if ( argv[j][0] == '@' && access(argv[j]+1,0)==0 )
+ break;
+ if ( argv[j] == NULL )
+ return argv;
+
+ new = (char **)xmalloc( max * sizeof *new );
+ new[cnt++] = *argv++;
+ for ( ; *argv; ++argv ) {
+ if ( cnt >= max )
+ new = (char **)realloc( new, (max*=2) * sizeof *new );
+
+ if ( argv[0][0] != '@' || access(argv[0]+1,0) ) {
+ new[cnt++] = *argv;
+ } else {
+ char line[ 1000 ];
+ FILE * f = fopen( argv[0]+1, "r" );
+ if ( !f ) {
+ perror( argv[0]+1 );
+ exit( 2 );
+ }
+ while ( fgets( line, sizeof line, f ) ) {
+ int len = strlen( line );
+ /* delete trailing newlines */
+ while ( line[len-1] == '\n' || line[len-1] == '\r' )
+ line[--len] = '\0';
+ if ( cnt >= max )
+ new = (char **)xrealloc( new, (max*=2) * sizeof *new );
+ new[cnt] = (char *)xmalloc( len+1 );
+ strcpy( new[cnt], line );
+ ++cnt;
+ }
+ fclose( f );
+ }
+ }
+ if ( cnt >= max )
+ new = (char **)xrealloc( new, (max+1) * sizeof *new );
+ new[cnt] = NULL;
+ *argc = cnt;
+ return new;
+}
+
+
+const char * USAGE =
+"usage: $progname [ -cNvmV ] file [ file ... ] dest-directory-or-file\n"
+" -v -- verbose\n"
+" -V suffix -- suffix to append to targets (before any . suffix)\n"
+" eg: -V _g would change 'foo' to 'foo_g' and\n"
+" 'libfoo.a' to 'libfoo_g.a'\n"
+" -m mode -- mode for new file(s)\n"
+" -c -- copy instead of move (always on)\n"
+" -N -- copy only if source is newer than target\n"
+;
+
+void fatal( char * msg )
+{
+ if ( msg )
+ fprintf( stderr, "%s\n", msg );
+ fprintf( stderr, "%s", USAGE );
+ exit( 1 );
+}
+
+char * basename( char * f )
+{
+ char * b = strrchr( f, '/' );
+ if ( b ) ++b;
+ else b = f;
+ return b;
+}
+
+#include <sys/stat.h>
+int is_dir( char * path )
+{
+ struct stat buf;
+ if ( stat( path, &buf ) )
+ return 0;
+ return buf.st_mode & S_IFDIR;
+}
+int is_file( char * path )
+{
+ struct stat buf;
+ if ( stat( path, &buf ) )
+ return 0;
+ return buf.st_mode & S_IFREG;
+}
+int newer( char * p1, char * p2 )
+{
+ struct stat buf1;
+ struct stat buf2;
+ if ( stat( p1, &buf1 ) )
+ return 0;
+ if ( stat( p2, &buf2 ) )
+ return 0;
+ return buf1.st_mtime > buf2.st_mtime;
+}
+
+int filecopy( char * d, char * s, int preserve_time )
+{
+#if 0
+ int status;
+ char * argv[ 5 ];
+ argv[0] = "cp";
+ argv[1] = "-p";
+ argv[2] = s;
+ argv[3] = d;
+ argv[4] = NULL;
+ status = spawnvp( P_WAIT, argv[0], argv );
+ if ( status )
+ perror( "cp" );
+ return status;
+#else
+ FILE * fs;
+ FILE * fd;
+ char buffer[ 8192 ];
+ int n;
+ struct ftime When;
+ struct stat Stat;
+
+ fs = fopen( s, "rb" );
+ if ( fs == NULL ) {
+ perror( s );
+ return 1;
+ }
+ fd = fopen( d, "wb" );
+ if ( fd == NULL ) {
+ perror( d );
+ fclose( fs );
+ return 2;
+ }
+
+ if ( preserve_time )
+ if ( getftime( fileno(fs), &When ) ) {
+ perror( s );
+ preserve_time = 0;
+ }
+
+ do {
+ n = fread( buffer, 1, sizeof buffer, fs );
+ if ( n > 0 )
+ if ( fwrite( buffer, 1, n, fd ) < 0 ) {
+ perror( d );
+ return 3;
+ }
+ } while ( n > 0 );
+
+ fclose( fs );
+
+ /* Fix time stamp */
+ if ( preserve_time )
+ if ( setftime( fileno(fd), &When ) ) {
+ perror( s );
+ preserve_time = 0;
+ }
+ fclose( fd );
+
+ /* Fix access rights */
+ if ( stat( s, &Stat ) )
+ perror( s );
+ else if ( chmod( d, Stat.st_mode ) )
+ perror( d );
+
+ return 0;
+#endif
+}
+
+
+
+
+
+int main( int argc, char * argv[] )
+{
+ char * progname;
+ int verbose = 0;
+ int only_if_newer= 0;
+ char * suffix = NULL;
+ char * mode = NULL;
+ char * dest;
+ char ** pp;
+
+ argv = argv_fix( &argc, argv );
+
+ progname = basename( *argv++ );
+
+ /* process the options */
+ while ( argv[0] && argv[0][0] == '-' ) {
+ switch ( argv[0][1] ) {
+ case 'N':
+ ++argv;
+ only_if_newer = 1;
+ break;
+ case 'c':
+ ++argv;
+ /* We always copy, regardless */
+ break;
+ case 'v':
+ ++argv;
+ verbose = 1;
+ break;
+ case 'V':
+ ++argv;
+ suffix = *argv;
+ ++argv;
+ break;
+ case 'm':
+ ++argv;
+ mode = *argv;
+ ++argv;
+ break;
+ default:
+ fatal( NULL );
+ }
+ }
+
+ /* Separate source file(s) from dest directory or file */
+#if 0
+ if ( !argv[0] || !argv[1] )
+ fatal( "missing files or invalid destination" );
+#else
+ /* We used to require at least one file; not any more */
+ if ( !argv[0] )
+ fatal( "missing files or invalid destination" );
+ if ( !argv[1] )
+ return 0;
+#endif
+ for ( pp = argv; *pp; ++pp )
+ continue;
+ --pp;
+ dest = *pp;
+ *pp = NULL;
+
+ /* Process the arguments */
+ for (; *argv; ++argv ) {
+ char * f = *argv;
+ char * leaf = basename( f );
+ char target[ 128 ];
+
+ strcpy( target, dest );
+
+ if ( is_dir( target ) ) {
+ strcat( target, "/" );
+ /* if we were given a suffix, then add it as appropriate */
+ if ( suffix ) {
+ char * dot = strchr( leaf, '.' );
+ if ( dot ) {
+ strncat( target, leaf, dot-leaf );
+ strcat( target, suffix );
+ strcat( target, dot );
+ if ( verbose )
+ printf( "%s: %s will be installed as %s",
+ progname, f, strrchr(target,'/')+1 );
+ } else {
+ strcat( target, leaf );
+ strcat( target, suffix );
+ }
+ } else {
+ strcat( target, leaf );
+ }
+ }
+
+ if ( access( f, 0 ) ) {
+ char buf[200];
+ sprintf( buf, "cannot read %s", f );
+ fatal( buf );
+ }
+
+ if ( only_if_newer && is_file( target ) && !newer( f, target ) ) {
+ if ( verbose )
+ printf( "'%s' not newer than '%s'\n", f, target );
+ continue;
+ }
+
+ if ( verbose )
+ printf( "rm -f %s\n", target );
+ if ( chmod( target, 0777 ) )
+ if ( verbose )
+ perror( target );
+ if ( unlink( target ) )
+ if ( verbose )
+ perror( target );
+ if ( verbose )
+ printf( "cp -p %s %s\n", f, target );
+ if ( filecopy( target, f, 1 ) )
+ return 1;
+ if ( mode ) {
+ char buf[ 255 ];
+ sprintf( buf, "chmod %s %s\n", mode, target );
+ if ( verbose )
+ printf( "%s\n", buf );
+ system( buf );
+ }
+ }
+
+ return 0;
+}
+
diff --git a/c/build-tools/os/msdos/ifc_exe.uue b/c/build-tools/os/msdos/ifc_exe.uue
new file mode 100644
index 0000000000..cd9f52b8f0
--- /dev/null
+++ b/c/build-tools/os/msdos/ifc_exe.uue
@@ -0,0 +1,163 @@
+#
+# $Id$
+#
+
+begin 664 ifc.exe
+M(VEN8VQU9&4@/'-T9&EO+F@^#0HC:6YC;'5D92 \<W1R:6YG+F@^#0HC:6YC
+M;'5D92 \<')O8V5S<RYH/@T*#0HC:6YC;'5D92 \:6\N:#X-"@T*=F]I9" J
+M('AM86QL;V,H(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
+M("HI;6%L;&]C*"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)9G!R:6YT
+M9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H(#$@*3L-
+M"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0IV;VED("H@>')E86QL;V,H('9O
+M:60@*B!O;&0L(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
+M("HI<F5A;&QO8R@@;VQD+"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)
+M9G!R:6YT9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H
+M(#$@*3L-"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0H-"F-H87(@*BH@87)G
+M=E]F:7@H(&EN=" J(&%R9V,L(&-H87(@*BH@87)G=B I#0I[#0H@(" @8VAA
+M<B J*B!N97<@/2!.54Q,.PT*(" @(&EN=" @(" @;6%X(#T@,C [#0H@(" @
+M:6YT"2 @("!C;G0@/2 P.PT*(" @(&EN= D@(" @:CL-"@T*(" @(&9O<B H
+M(&H@/2 Q.R!A<F=V6VI=.R K*VH@*0T*"6EF("@@87)G=EMJ75LP72 ]/2 G
+M0"<@)B8@86-C97-S*&%R9W9;:ETK,2PP*3T]," I#0H)(" @(&)R96%K.PT*
+M(" @(&EF("@@87)G=EMJ72 ]/2!.54Q,("D-"@ER971U<FX@87)G=CL-"@T*
+M(" @(&YE=R ]("AC:&%R("HJ*7AM86QL;V,H(&UA>" J('-I>F5O9B J;F5W
+M("D[#0H@(" @;F5W6V-N="LK72 ]("IA<F=V*RL[#0H@(" @9F]R("@@.R J
+M87)G=CL@*RMA<F=V("D@('L-"@EI9B H(&-N=" ^/2!M87@@*0T*"2 @("!N
+M97<@/2 H8VAA<B J*BER96%L;&]C*"!N97<L("AM87@J/3(I("H@<VEZ96]F
+M("IN97<@*3L-"@D@(" @#0H):68@*"!A<F=V6S!=6S!=("$]("= )R!\?"!A
+M8V-E<W,H87)G=ELP72LQ+# I("D@('L-"@D@(" @;F5W6V-N="LK72 ]("IA
+M<F=V.PT*"7T@96QS92![#0H)(" @(&-H87(@;&EN95L@,3 P,"!=.PT*"2 @
+M("!&24Q%("H@9B ](&9O<&5N*"!A<F=V6S!=*S$L(")R(B I.PT*"2 @("!I
+M9B H("%F("D@('L-"@D)<&5R<F]R*"!A<F=V6S!=*S$@*3L-"@D)97AI="@@
+M,B I.PT*"2 @("!]#0H)(" @('=H:6QE("@@9F=E=',H(&QI;F4L('-I>F5O
+M9B!L:6YE+"!F("D@*2 @>PT*"0EI;G0@;&5N(#T@<W1R;&5N*"!L:6YE("D[
+M#0H)"2\J(&1E;&5T92!T<F%I;&EN9R!N97=L:6YE<R J+PT*"0EW:&EL92 H
+M(&QI;F5;;&5N+3%=(#T]("=<;B<@?'P@;&EN95ML96XM,5T@/3T@)UQR)R I
+M#0H)"2 @("!L:6YE6RTM;&5N72 ]("=<,"<[#0H)"6EF("@@8VYT(#X](&UA
+M>" I#0H)"2 @("!N97<@/2 H8VAA<B J*BEX<F5A;&QO8R@@;F5W+" H;6%X
+M*CTR*2 J('-I>F5O9B J;F5W("D[#0H)"6YE=UMC;G1=(#T@*&-H87(@*BEX
+M;6%L;&]C*"!L96XK,2 I.PT*"0ES=')C<'DH(&YE=UMC;G1=+"!L:6YE("D[
+M#0H)"2LK8VYT.PT*"2 @("!]#0H)(" @(&9C;&]S92@@9B I.PT*"7T)#0H@
+M(" @?0T*(" @(&EF("@@8VYT(#X](&UA>" I#0H);F5W(#T@*&-H87(@*BHI
+M>')E86QL;V,H(&YE=RP@*&UA>"LQ*2 J('-I>F5O9B J;F5W("D[#0H@(" @
+M;F5W6V-N=%T@/2!.54Q,.PT*(" @("IA<F=C(#T@8VYT.PT*(" @(')E='5R
+M;B!N97<[#0I]#0H-"@T*8V]N<W0@8VAA<B J(%5304=%(#T@#0HB=7-A9V4Z
+M("1P<F]G;F%M92!;("UC3G9M5B!=(&9I;&4@6R!F:6QE("XN+B!=(&1E<W0M
+M9&ER96-T;W)Y+6]R+69I;&5<;B(-"B(@(" @(" @("UV(" @(" @(" @("TM
+M('9E<F)O<V5<;B(-"B(@(" @(" @("U6('-U9F9I>" @("TM('-U9F9I>"!T
+M;R!A<'!E;F0@=&\@=&%R9V5T<R H8F5F;W)E(&%N>2 N('-U9F9I>"E<;B(-
+M"B(@(" @(" @(" @(" @(" @(" @(" @("!E9SH@+58@7V<@=V]U;&0@8VAA
+M;F=E("=F;V\G('1O("=F;V]?9R<@86YD7&XB#0HB(" @(" @(" @(" @(" @
+M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" G;&EB9F]O+F$G('1O
+M("=L:6)F;V]?9RYA)UQN(@T*(B @(" @(" @+6T@;6]D92 @(" @+2T@;6]D
+M92!F;W(@;F5W(&9I;&4H<RE<;B(-"B(@(" @(" @("UC(" @(" @(" @("TM
+M(&-O<'D@:6YS=&5A9"!O9B!M;W9E("AA;'=A>7,@;VXI7&XB#0HB(" @(" @
+M(" M3B @(" @(" @(" M+2!C;W!Y(&]N;'D@:68@<V]U<F-E(&ES(&YE=V5R
+M('1H86X@=&%R9V5T7&XB#0H[#0H-"G9O:60@9F%T86PH(&-H87(@*B!M<V<@
+M*0T*>PT*(" @(&EF("@@;7-G("D-"@EF<')I;G1F*"!S=&1E<G(L("(E<UQN
+M(BP@;7-G("D[#0H@(" @9G!R:6YT9B@@<W1D97)R+" B)7,B+"!54T%'12 I
+M.PT*(" @(&5X:70H(#$@*3L-"GT-"@T*8VAA<B J(&)A<V5N86UE*"!C:&%R
+M("H@9B I#0I[#0H@(" @8VAA<B J(&(@/2!S=')R8VAR*"!F+" G+R<@*3L-
+M"B @("!I9B H(&(@*0DK*V([#0H@(" @96QS90EB(#T@9CL-"B @("!R971U
+M<FX@8CL-"GT-"@T*(VEN8VQU9&4@/'-Y<R]S=&%T+F@^#0II;G0@:7-?9&ER
+M*"!C:&%R("H@<&%T:" I#0I[#0H@(" @<W1R=6-T('-T870@8G5F.PT*(" @
+M(&EF("@@<W1A="@@<&%T:"P@)F)U9B I("D-"@ER971U<FX@,#L-"B @("!R
+M971U<FX@8G5F+G-T7VUO9&4@)B!37TE&1$E2.PT*?0T*:6YT(&ES7V9I;&4H
+M(&-H87(@*B!P871H("D-"GL-"B @("!S=')U8W0@<W1A="!B=68[#0H@(" @
+M:68@*"!S=&%T*"!P871H+" F8G5F("D@*0T*"7)E='5R;B P.PT*(" @(')E
+M='5R;B!B=68N<W1?;6]D92 F(%-?249214<[#0I]#0II;G0@;F5W97(H(&-H
+M87(@*B!P,2P@8VAA<B J(' R("D-"GL-"B @("!S=')U8W0@<W1A="!B=68Q
+M.PT*(" @('-T<G5C="!S=&%T(&)U9C([#0H@(" @:68@*"!S=&%T*"!P,2P@
+M)F)U9C$@*2 I#0H)<F5T=7)N(# [#0H@(" @:68@*"!S=&%T*"!P,BP@)F)U
+M9C(@*2 I#0H)<F5T=7)N(# [#0H@(" @<F5T=7)N(&)U9C$N<W1?;71I;64@
+M/B!B=68R+G-T7VUT:6UE.PT*?0T*#0II;G0@9FEL96-O<'DH(&-H87(@*B!D
+M+"!C:&%R("H@<RP@:6YT('!R97-E<G9E7W1I;64@*0T*>PT*(VEF(# -"B @
+M("!I;G0)"7-T871U<SL-"B @("!C:&%R(" @(" @*B!A<F=V6R U(%T[#0H@
+M(" @87)G=ELP72 ](")C<"([#0H@(" @87)G=ELQ72 ]("(M<"([#0H@(" @
+M87)G=ELR72 ](',[#0H@(" @87)G=ELS72 ](&0[#0H@(" @87)G=ELT72 ]
+M($Y53$P[#0H@(" @<W1A='5S(#T@<W!A=VYV<"@@4%]704E4+"!A<F=V6S!=
+M+"!A<F=V("D[#0H@(" @:68@*"!S=&%T=7,@*0T*"7!E<G)O<B@@(F-P(B I
+M.PT*(" @(')E='5R;B!S=&%T=7,[#0HC96QS90T*(" @($9)3$4@(" @(" J
+M(&9S.PT*(" @($9)3$4@(" @(" J(&9D.PT*(" @(&-H87()8G5F9F5R6R X
+M,3DR(%T[#0H@(" @:6YT"0EN.PT*(" @('-T<G5C="!F=&EM90E7:&5N.PT*
+M(" @('-T<G5C="!S=&%T"0E3=&%T.PT*#0H@(" @9G,@/2!F;W!E;B@@<RP@
+M(G)B(B I.PT*(" @(&EF("@@9G,@/3T@3E5,3" I("![#0H)<&5R<F]R*"!S
+M("D[#0H)<F5T=7)N(#$[#0H@(" @?0T*(" @(&9D(#T@9F]P96XH(&0L(")W
+M8B(@*3L-"B @("!I9B H(&9D(#T]($Y53$P@*2 @>PT*"7!E<G)O<B@@9" I
+M.PT*"69C;&]S92@@9G,@*3L-"@ER971U<FX@,CL-"B @("!]#0H-"B @("!I
+M9B H('!R97-E<G9E7W1I;64@*0T*"6EF("@@9V5T9G1I;64H(&9I;&5N;RAF
+M<RDL("97:&5N("D@*2 @>PT*"2 @("!P97)R;W(H(',@*3L-"@D@(" @<')E
+M<V5R=F5?=&EM92 ](# [#0H)?0T*#0H@(" @9&\@>PT*"6X@/2!F<F5A9"@@
+M8G5F9F5R+" Q+"!S:7IE;V8@8G5F9F5R+"!F<R I.PT*"6EF("@@;B ^(# @
+M*0T*"2 @("!I9B H(&9W<FET92@@8G5F9F5R+" Q+"!N+"!F9" I(#P@," I
+M("![#0H)"7!E<G)O<B@@9" I.PT*"0ER971U<FX@,SL-"@D@(" @?0T*(" @
+M('T@=VAI;&4@*"!N(#X@," I.R @(" -"@T*(" @(&9C;&]S92@@9G,@*3L-
+M"@T*(" @("\J($9I>"!T:6UE('-T86UP("HO#0H@(" @:68@*"!P<F5S97)V
+M95]T:6UE("D-"@EI9B H('-E=&9T:6UE*"!F:6QE;F\H9F0I+" F5VAE;B I
+M("D@('L-"@D@(" @<&5R<F]R*"!S("D[#0H)(" @('!R97-E<G9E7W1I;64@
+M/2 P.PT*"7T-"B @("!F8VQO<V4H(&9D("D[#0H-"B @(" O*B!&:7@@86-C
+M97-S(')I9VAT<R J+PT*(" @(&EF("@@<W1A="@@<RP@)E-T870@*2 I#0H)
+M<&5R<F]R*"!S("D[#0H@(" @96QS92!I9B H(&-H;6]D*"!D+"!3=&%T+G-T
+M7VUO9&4@*2 I#0H)<&5R<F]R*"!D("D[#0H-"B @("!R971U<FX@,#L-"B-E
+M;F1I9@T*?0T*#0H-"@T*#0H-"FEN="!M86EN*"!I;G0@87)G8RP@8VAA<B J
+M(&%R9W9;72 I#0I[#0H@(" @8VAA<B J"7!R;V=N86UE.PT*(" @(&EN= D)
+M=F5R8F]S92 ](# [#0H@(" @:6YT"0EO;FQY7VEF7VYE=V5R/2 P.PT*(" @
+M(&-H87(@*@ES=69F:7@@(#T@3E5,3#L-"B @("!C:&%R("H);6]D90D]($Y5
+M3$P[#0H@(" @8VAA<B J( ED97-T.PT*(" @(&-H87(@*BH)<' [#0H-"B @
+M("!A<F=V(#T@87)G=E]F:7@H("9A<F=C+"!A<F=V("D[#0H-"B @("!P<F]G
+M;F%M92 ](&)A<V5N86UE*" J87)G=BLK("D[#0H-"B @(" O*B!P<F]C97-S
+M('1H92!O<'1I;VYS("HO#0H@(" @=VAI;&4@*"!A<F=V6S!=(" F)B @87)G
+M=ELP75LP72 ]/2 G+2<@*2 @>PT*"7-W:71C:" H(&%R9W9;,%U;,5T@*2 @
+M>PT*"2 @("!C87-E("=.)SH-"@D@(" @(" @("LK87)G=CL-"@D);VYL>5]I
+M9E]N97=E<B ](#$[#0H)"6)R96%K.PT*"2 @("!C87-E("=C)SH-"@D@(" @
+M(" @("LK87)G=CL-"@D)+RH@5V4@86QW87ES(&-O<'DL(')E9V%R9&QE<W,@
+M*B\-"@D)8G)E86L[#0H)(" @(&-A<V4@)W8G.@T*"0DK*V%R9W8[#0H)"79E
+M<F)O<V4@/2 Q.PT*"0EB<F5A:SL-"@D@(" @8V%S92 G5B<Z#0H)"2LK87)G
+M=CL-"@D)<W5F9FEX(#T@*F%R9W8[#0H)"2LK87)G=CL-"@D)8G)E86L[#0H)
+M(" @(&-A<V4@)VTG.@T*"0DK*V%R9W8[#0H)"6UO9&4@/2 J87)G=CL-"@D)
+M*RMA<F=V.PT*"0EB<F5A:SL-"@D@(" @9&5F875L=#H-"@D)9F%T86PH($Y5
+M3$P@*3L-"@E]#0H@(" @?0T*#0H@(" @+RH@4V5P87)A=&4@<V]U<F-E(&9I
+M;&4H<RD@9G)O;2!D97-T(&1I<F5C=&]R>2!O<B!F:6QE("HO#0HC:68@, T*
+M(" @(&EF("@@(6%R9W9;,%T@?'P@(6%R9W9;,5T@*0T*"69A=&%L*" B;6ES
+M<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*(V5L<V4-
+M"B @(" O*B!792!U<V5D('1O(')E<75I<F4@870@;&5A<W0@;VYE(&9I;&4[
+M(&YO="!A;GD@;6]R92 J+PT*(" @(&EF("@@(6%R9W9;,%T@*0T*"69A=&%L
+M*" B;6ES<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*
+M(" @(&EF("@@(6%R9W9;,5T@*0T*"7)E='5R;B P.PT*(V5N9&EF#0H@(" @
+M9F]R("@@<' @/2!A<F=V.R J<' [("LK<' @*0T*"6-O;G1I;G5E.PT*(" @
+M("TM<' [#0H@(" @9&5S=" ]("IP<#L-"B @(" J<' @/2!.54Q,.PT*#0H@
+M(" @+RH@4')O8V5S<R!T:&4@87)G=6UE;G1S("HO#0H@(" @9F]R("@[("IA
+M<F=V.R K*V%R9W8@*2 @>PT*"6-H87(@*B!F(#T@*F%R9W8[#0H)8VAA<B J
+M(&QE868@/2!B87-E;F%M92@@9B I.PT*"6-H87(@=&%R9V5T6R Q,C@@73L-
+M"@T*"7-T<F-P>2@@=&%R9V5T+"!D97-T("D[#0H-"@EI9B H(&ES7V1I<B@@
+M=&%R9V5T("D@*2 @>PT*"2 @("!S=')C870H('1A<F=E="P@(B\B("D[#0H)
+M(" @("\J(&EF('=E('=E<F4@9VEV96X@82!S=69F:7@L('1H96X@861D(&ET
+M(&%S(&%P<')O<')I871E("HO#0H)(" @(&EF("@@<W5F9FEX("D@('L-"@D)
+M8VAA<B J(&1O=" ]('-T<F-H<B@@;&5A9BP@)RXG("D[#0H)"6EF("@@9&]T
+M("D@('L-"@D)(" @('-T<FYC870H('1A<F=E="P@;&5A9BP@9&]T+6QE868@
+M*3L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!S=69F:7@@*3L-"@D)(" @('-T
+M<F-A="@@=&%R9V5T+"!D;W0@*3L-"@D)(" @(&EF("@@=F5R8F]S92 I#0H)
+M"0EP<FEN=&8H("(E<SH@)7,@=VEL;"!B92!I;G-T86QL960@87,@)7,B+ T*
+M"0D)(" @(" @('!R;V=N86UE+"!F+"!S=')R8VAR*'1A<F=E="PG+R<I*S$@
+M*3L-"@D)?2!E;'-E('L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!L96%F("D[
+M#0H)"2 @("!S=')C870H('1A<F=E="P@<W5F9FEX("D[#0H)"7T-"@D@(" @
+M?2!E;'-E('L-"@D)<W1R8V%T*"!T87)G970L(&QE868@*3L-"@D@(" @?0T*
+M"7T-"@T*"6EF("@@86-C97-S*"!F+" P("D@*2 @>PT*"2 @("!C:&%R(&)U
+M9ELR,#!=.PT*"2 @("!S<')I;G1F*"!B=68L(")C86YN;W0@<F5A9" E<R(L
+M(&8@*3L-"@D@(" @9F%T86PH(&)U9B I.PT*"7T-"@T*"6EF("@@;VYL>5]I
+M9E]N97=E<B F)B!I<U]F:6QE*"!T87)G970@*2 F)B A;F5W97(H(&8L('1A
+M<F=E=" I("D@('L-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<')I;G1F*" B
+M)R5S)R!N;W0@;F5W97(@=&AA;B G)7,G7&XB+"!F+"!T87)G970@*3L-"@D@
+M(" @8V]N=&EN=64[#0H)?0T*#0H):68@*"!V97)B;W-E("D-"@D@(" @<')I
+M;G1F*" B<FT@+68@)7-<;B(L('1A<F=E=" I.PT*"6EF("@@8VAM;V0H('1A
+M<F=E="P@,#<W-R I("D-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<&5R<F]R
+M*"!T87)G970@*3L-"@EI9B H('5N;&EN:R@@=&%R9V5T("D@*0T*"2 @("!I
+M9B H('9E<F)O<V4@*0T*"0EP97)R;W(H('1A<F=E=" I.PT*"6EF("@@=F5R
+M8F]S92 I#0H)(" @('!R:6YT9B@@(F-P("UP("5S("5S7&XB+"!F+"!T87)G
+M970@*3L-"@EI9B H(&9I;&5C;W!Y*"!T87)G970L(&8L(#$@*2 I#0H)(" @
+M(')E='5R;B Q.PT*"6EF("@@;6]D92 I("![#0H)(" @(&-H87(@8G5F6R R
+M-34@73L-"@D@(" @<W!R:6YT9B@@8G5F+" B8VAM;V0@)7,@)7-<;B(L(&UO
+M9&4L('1A<F=E=" I.PT*"2 @("!I9B H('9E<F)O<V4@*0T*"0EP<FEN=&8H
+M("(E<UQN(BP@8G5F("D[#0H)(" @('-Y<W1E;2@@8G5F("D[#0H)?0T*(" @
+:('T-"@T*(" @(')E='5R;B P.PT*?0T*#0IE
+
+end
diff --git a/c/build-tools/packhex.c b/c/build-tools/packhex.c
new file mode 100644
index 0000000000..ddd010c4a9
--- /dev/null
+++ b/c/build-tools/packhex.c
@@ -0,0 +1,513 @@
+
+/***** P A C K H E X . C ************************************************
+ *
+ * Packhex is a hex-file compaction utility. It attempts to concatenate
+ * hex records to produce more size-efficient packaging.
+ *
+ * Limitations: Input files must be correctly formatted. This utility
+ * is not robust enough to detect hex-record formatting
+ * errors.
+ *
+ * Published: 5/93 Embedded Systems magazine
+ *
+ * Compiler: Microsoft C 6.0
+ * cl /F 1000 packhex.c
+ *
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+/* #define SMALLER_RECORDS */
+#ifdef SMALLER_RECORDS
+#define MAX_LEN_S1_RECS 128
+#define MAX_LEN_S2_RECS 128
+#define MAX_LEN_S3_RECS 128
+#else
+#define MAX_LEN_S1_RECS 252
+#define MAX_LEN_S2_RECS 251
+#define MAX_LEN_S3_RECS 250
+#endif
+
+
+/*--------------------------------- includes ---------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(__unix__) && !defined(EXIT_FAILURE)
+#define EXIT_FAILURE -1
+#define EXIT_SUCCESS 0
+#endif
+
+/*--------------------------------- defines ----------------------------------*/
+
+#define YES 1
+#define MAX_LINE_SIZE 600
+#define EOS '\0'
+
+
+/*---------------------------------- macros ----------------------------------*/
+
+/* Convert ASCII hexadecimal digit to value. */
+
+#define HEX_DIGIT( C ) ( ( ( ( C ) > '9' ) ? ( C ) + 25 : ( C ) ) & 0xF )
+
+
+/*--------------------------------- typedefs ---------------------------------*/
+
+typedef unsigned char Boolean;
+typedef unsigned char Uchar;
+typedef unsigned int Uint;
+typedef unsigned long Ulong;
+
+typedef struct /* Functions and constant returning Hex-record vital stats. */
+{
+ Boolean ( *is_data_record )( char * );
+ Ulong ( *get_address )( char * );
+ Uint ( *get_data_count )( char * );
+ const Uint max_data_count;
+ char *( *get_data_start )( char * );
+ void ( *put_data_record )( Uint, Ulong, char * );
+} Rec_vitals;
+
+
+/*--------------------------- function prototypes ----------------------------*/
+
+Rec_vitals * identify_first_data_record( char * );
+Ulong get_ndigit_hex( char *, int );
+
+
+/*----------------------------- Intel Hex format -----------------------------*/
+
+/*
+ * Intel Hex data-record layout
+ *
+ * :aabbbbccd...dee
+ *
+ * : - header character
+ * aa - record data byte count, a 2-digit hex value
+ * bbbb - record address, a 4-digit hex value
+ * cc - record type, a 2-digit hex value:
+ * "00" is a data record
+ * "01" is an end-of-data record
+ * "02" is an extended-address record
+ * "03" is a start record
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 2's complement
+ * [ (sum of bytes: aabbbbccd...d) modulo 256 ]
+ */
+
+
+Boolean is_intel_data_rec( char * rec_str )
+{
+ return( ( rec_str[ 0 ] == ':' ) && ( rec_str[ 8 ] == '0' ) );
+}
+
+Uint get_intel_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 1, 2 ) );
+}
+
+Ulong get_intel_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 3, 4 ) );
+}
+
+char * get_intel_rec_data_start( char * rec_str )
+{
+ return( rec_str + 9 );
+}
+
+void put_intel_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = count + ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ ":%02X%04lX00%s%02X\n", count, address, data_str, (~sum + 1) & 0xff
+ );
+}
+
+
+Rec_vitals intel_hex =
+{
+ is_intel_data_rec,
+ get_intel_rec_address,
+ get_intel_rec_data_count,
+ 255, /* Maximum data bytes in a record. */
+ get_intel_rec_data_start,
+ put_intel_data_rec
+};
+
+
+/*------------------------- Motorola S1-record format ------------------------*/
+
+/*
+ * Motorola S-record data-record layout
+ *
+ * Sabbc...cd...dee
+ *
+ * S - header character
+ * a - record type, a 1-digit value:
+ * "0" is a header record
+ * "1" is a 2-byte-address data record
+ * "2" is a 3-byte-address data record
+ * "3" is a 4-byte-address data record
+ * "7" is a 4-byte-address end-of-data record
+ * "8" is a 3-byte-address end-of-data record
+ * "9" is a 2-byte-address end-of-data record
+ * bb - record length in bytes, a 2-digit hex value
+ * (record length doesn't count the header/type
+ * chars and checksum byte)
+ * c...c - record address, a 4-, 6-, or 8-digit value,
+ * depending on record type
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 1's complement
+ * [ (sum of all bytes: bbc..cd...d) modulo 256 ]
+ */
+
+#define S1_COUNT_OFFSET 3
+
+
+Boolean is_moto_s1_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '1' ) );
+}
+
+Uint get_moto_s1_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S1_COUNT_OFFSET );
+}
+
+Ulong get_moto_s1_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 4 ) );
+}
+
+char * get_moto_s1_rec_data_start( char * rec_str )
+{
+ return( rec_str + 8 );
+}
+
+void put_moto_s1_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S1_COUNT_OFFSET + count +
+ ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S1%02X%04lX%s%02X\n",
+ count + S1_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s1_rec =
+{
+ is_moto_s1_data_rec,
+ get_moto_s1_rec_address,
+ get_moto_s1_rec_data_count,
+ MAX_LEN_S1_RECS, /* Maximum data bytes in a record. */
+ get_moto_s1_rec_data_start,
+ put_moto_s1_data_rec
+};
+
+
+/*------------------------- Motorola S2-record format ------------------------*/
+
+#define S2_COUNT_OFFSET 4
+
+Boolean is_moto_s2_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '2' ) );
+}
+
+Uint get_moto_s2_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S2_COUNT_OFFSET );
+}
+
+Ulong get_moto_s2_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 6 ) );
+}
+
+char * get_moto_s2_rec_data_start( char * rec_str )
+{
+ return( rec_str + 10 );
+}
+
+void put_moto_s2_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S2_COUNT_OFFSET + count + ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S2%02X%06lX%s%02X\n",
+ count + S2_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s2_rec =
+{
+ is_moto_s2_data_rec,
+ get_moto_s2_rec_address,
+ get_moto_s2_rec_data_count,
+ MAX_LEN_S2_RECS, /* Maximum data bytes in a record. */
+ get_moto_s2_rec_data_start,
+ put_moto_s2_data_rec
+};
+
+
+/*------------------------- Motorola S3-record format ------------------------*/
+
+#define S3_COUNT_OFFSET 5
+
+Boolean is_moto_s3_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '3' ) );
+}
+
+Uint get_moto_s3_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S3_COUNT_OFFSET );
+}
+
+Ulong get_moto_s3_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 8 ) );
+}
+
+char * get_moto_s3_rec_data_start( char * rec_str )
+{
+ return( rec_str + 12 );
+}
+
+void put_moto_s3_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S3_COUNT_OFFSET + count + ( address >> 24 & 0xff ) +
+ ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S3%02X%08lX%s%02X\n",
+ count + S3_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s3_rec =
+{
+ is_moto_s3_data_rec,
+ get_moto_s3_rec_address,
+ get_moto_s3_rec_data_count,
+ MAX_LEN_S3_RECS, /* Maximum data bytes in a record. */
+ get_moto_s3_rec_data_start,
+ put_moto_s3_data_rec
+};
+
+
+/*-------------------- Put your favorite hex format here ---------------------*/
+
+/*
+ * * * * The following is a template for an additional hex format: * * *
+ *
+ *
+ * Boolean is_X_data_rec( char * rec_str ) {}
+ *
+ * Uint get_X_rec_data_count( char * rec_str ) {}
+ *
+ * Ulong get_X_rec_address( char * rec_str ) {}
+ *
+ * char * get_X_rec_data_start( char * rec_str ) {}
+ *
+ * void put_X_data_rec( Uint count, Ulong address, char * data_str ) {}
+ *
+ * Rec_vitals X_rec =
+ * {
+ * is_X_data_rec,
+ * get_X_rec_address,
+ * get_X_rec_data_count,
+ * MAXIMUM DATA BYTES IN A RECORD,
+ * get_X_rec_data_start,
+ * put_X_data_rec
+ * };
+ *
+ */
+
+/*----------------------------------------------------------------------------*/
+
+
+/*
+ * Put address of additional Rec_vitals structures
+ * in this array, before the NULL entry.
+ */
+
+Rec_vitals *formats[] =
+{
+ &intel_hex,
+ &motorola_s1_rec,
+ &motorola_s2_rec,
+ &motorola_s3_rec,
+ ( Rec_vitals * ) NULL
+};
+
+
+/**** main *****************************************************************
+*
+*
+* Expects: Nothing (no command-line parameters).
+*
+* Returns: Exit status (EXIT_SUCCESS or EXIT_FAILURE).
+*
+* Reads hex records on the standard input and attempts to
+* splice adjacent data fields together. Results appear on
+* the standard output.
+*
+*******************************************************************************/
+
+void main( void )
+{
+
+ char inbuff[ MAX_LINE_SIZE ], outbuff[ MAX_LINE_SIZE ];
+ char *in_dptr, *out_dptr;
+ int d_total, d_count, d_excess, n;
+ Ulong in_rec_addr, out_rec_addr = 0;
+ Rec_vitals *rptr;
+
+
+ /* Sift through file until first hex record is identified. */
+ if ( ( rptr = identify_first_data_record( inbuff ) ) == NULL )
+ {
+ fputs( "No hex records found.\n", stderr );
+ exit( EXIT_FAILURE );
+ }
+
+
+ /* Attempt data-record splicing until end-of-file is reached. */
+ d_total = 0;
+ do
+ {
+ if ( rptr->is_data_record( inbuff ) == YES )
+ { /* Input record is a data record. */
+ d_count = rptr->get_data_count( inbuff );
+ in_rec_addr = rptr->get_address( inbuff );
+ in_dptr = rptr->get_data_start( inbuff );
+
+ if ( d_total == 0 || in_rec_addr != out_rec_addr + d_total )
+ { /* Begin a new output record. */
+ if ( d_total != 0 )
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ out_dptr = outbuff;
+ n = d_total = d_count;
+ out_rec_addr = in_rec_addr;
+ }
+ else if
+ ( ( d_excess = d_total + d_count - rptr->max_data_count ) > 0 )
+ { /* Output a maximum-length record, then start a new record. */
+ strncat( outbuff, in_dptr, 2 * ( d_count - d_excess ) );
+ rptr->put_data_record(
+ rptr->max_data_count, out_rec_addr, outbuff
+ );
+ in_dptr += 2 * ( d_count - d_excess );
+ out_dptr = outbuff;
+ n = d_total = d_excess;
+ out_rec_addr += rptr->max_data_count;
+ }
+ else
+ { /* Append input record's data field with accumulated data. */
+ out_dptr = outbuff + ( 2 * d_total );
+ d_total += n = d_count;
+ }
+ strncpy( out_dptr, in_dptr, 2 * n );
+ out_dptr[ 2 * n ] = EOS;
+ }
+ else
+ { /* Not a data record;
+ * flush accumulated data then echo non-data record.
+ */
+ if ( d_total != 0 )
+ {
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ d_total = 0;
+ }
+ puts( inbuff );
+ }
+ } while ( gets( inbuff ) != NULL );
+
+
+ exit( EXIT_SUCCESS );
+
+}
+
+
+/**** identify_first_data_record *******************************************
+*
+* Expects: Pointer to hex-record line buffer.
+*
+* Returns: Pointer to hex-record structure (NULL if no match found).
+*
+* Reads the standard input, line by line, searching for a valid
+* record header character. If a valid header is found, a pointer
+* to the hex-record's type structure is returned, otherwise NULL.
+*
+* The input-stream pointer is left pointing to the first valid hex record.
+*
+*******************************************************************************/
+
+Rec_vitals * identify_first_data_record( char * buff_ptr )
+{
+ Rec_vitals ** ptr;
+
+ while ( gets( buff_ptr ) != NULL )
+ {
+ for ( ptr = formats ; *ptr != ( Rec_vitals * ) NULL ; ptr++ )
+ if ( ( *ptr )->is_data_record( buff_ptr ) == YES )
+ return( *ptr ); /* Successful return. */
+
+ puts( buff_ptr ); /* Echo non-hex-record line. */
+ }
+
+ return( ( Rec_vitals * ) NULL ); /* Unsuccessful return. */
+}
+
+
+/**** get_ndigit_hex *******************************************************
+*
+* Expects: Pointer to first ASCII hexadecimal digit, number of digits.
+*
+* Returns: Value of hexadecimal string as an unsigned long.
+*
+*******************************************************************************/
+
+Ulong get_ndigit_hex( char * cptr, int digits )
+{
+ Ulong value;
+
+ for ( value = 0 ; --digits >= 0 ; cptr++ )
+ value = ( value * 16L ) + HEX_DIGIT( *cptr );
+
+ return( value );
+}
diff --git a/c/build-tools/scripts/Makefile.in b/c/build-tools/scripts/Makefile.in
new file mode 100644
index 0000000000..7f2db3462c
--- /dev/null
+++ b/c/build-tools/scripts/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+# RTEMS build tools
+# NOTE: of course we can't use any of these tools
+# in this Makefile. Most notably: install-if-change
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/build-tools
+
+PGMS=hackspecs.awk install-if-change rcs-clean \
+ lock-directory unlock-directory rtems-glom
+
+INSTALLED=$(PGMS:%=$(DESTDIR)/%)
+
+all: $(DESTDIR) $(PGMS) install
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
diff --git a/c/build-tools/scripts/README b/c/build-tools/scripts/README
new file mode 100644
index 0000000000..0436fc958d
--- /dev/null
+++ b/c/build-tools/scripts/README
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+Misc. support tools for RTEMS workspaces.
+More will be added later as they are converted from Teamware
+to CVS.
+
+install-if-change
+ Smart install script that also can append suffixes as it
+ installs (suffixes used for debug and profile variants).
+ Requires bash or ksh.
+
+rcs-clean
+ deletes all files from the current directory that can be
+ re-created from RCS. Careful to not delete locked files.
+ May be used by 'gmake clobber'
+
+lock-directory
+unlock-directory
+ traverse a directory structure making it unwritable.
+ Useful to keep people from accidentally overwriting
+ "released" trees if they get confused about which
+ module they have loaded.
+
+rtems-glom
+ glom together all the rtems libraries in order to simplify
+ the link line used by applications.
+ Produces rtems.rel.
+ Not used by the RTEMS src tree at all.
+ Strictly optional.
+
diff --git a/c/build-tools/src/Makefile.in b/c/build-tools/src/Makefile.in
new file mode 100644
index 0000000000..f6c3135d54
--- /dev/null
+++ b/c/build-tools/src/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+manext = 1
+mandir = @mandir@/man$(manext)
+
+
+VPATH=@srcdir@
+
+
+# we use host compiler in this directory
+USE_HOST_COMPILER=yes
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cklength eolstrip packhex unhex
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=$(ARCH)/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+PGMS=$(ARCH)/cklength $(ARCH)/eolstrip $(ARCH)/packhex $(ARCH)/unhex
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(HOST_ARCH)
+CLOBBER_ADDITIONS +=
+
+all: $(ARCH) $(SRCS) $(PGMS)
+ $(INSTALL_VARIANT) -m 555 $(PGMS) ${PROJECT_RELEASE}/build-tools
diff --git a/c/build-tools/src/cklength.c b/c/build-tools/src/cklength.c
new file mode 100644
index 0000000000..6059cacb1f
--- /dev/null
+++ b/c/build-tools/src/cklength.c
@@ -0,0 +1,364 @@
+/*
+ * cklength - check the length of lines in a file
+ *
+ * This program check to see if the files passed to it on the command line
+ * contain a line which exceeds the maximum allowable length. The default
+ * maximum line length is 80.
+ *
+ * usage: cklength [ -v ] [ arg ... ] files...
+ * -l length -- maximum line length
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "l:nNv"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -l length -- maximum line length\n\
+ -n -- report line numbers for offending lines\n\
+ -N -- report line numbers and length for offending lines\n\
+ -v -- verbose\n\
+\n\
+Print the name of files which have at least 1 line which exceeds the\n\
+maximum line length. The default maximum line length is 80.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 512
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int report_line_numbers = FALSE; /* report line numbers of offenders */
+int report_line_length = FALSE; /* report line length of offenders */
+
+int line_length = 80; /* maximum allowable line length */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 'l': /* line length */
+ line_length = atoi( optarg );
+ if ( line_length < 0 || line_length > BUFFER_SIZE )
+ error(ERR_FATAL, "(%d) is illegal line length\n",line_length);
+ break;
+
+ case 'n': /* toggle report_line_numbers */
+ report_line_numbers = ! report_line_numbers;
+ break;
+
+ case 'N': /* toggle both reports */
+ report_line_numbers = ! report_line_numbers;
+ report_line_length = ! report_line_length;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int line_number;
+ int length;
+ int count;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ count = 0;
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( length <= line_length )
+ continue;
+
+ if ( count == 0 ) {
+ fprintf( stderr, "%s\n", arg );
+ if ( !report_line_numbers )
+ break;
+ }
+
+ if ( verbose )
+ fprintf( stderr, "TOO LONG:%d: %s\n", line_number, buffer );
+
+ if ( report_line_numbers ) {
+ if ( report_line_length )
+ fprintf( stderr, "%d: %d\n" , line_number, length );
+ else
+ fprintf( stderr, "%d\n" , line_number );
+ }
+
+ count++;
+
+ }
+
+ fclose( in );
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/c/build-tools/src/eolstrip.c b/c/build-tools/src/eolstrip.c
new file mode 100644
index 0000000000..b4e0d5d165
--- /dev/null
+++ b/c/build-tools/src/eolstrip.c
@@ -0,0 +1,351 @@
+/*
+ * eolstrip - strip white space from end of lines
+ *
+ * This program strips the white space from the end of every line in the
+ * specified program.
+ *
+ * usage: eolstrip [ -v ] [ arg ... ] files...
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "vt"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -v -- verbose\n\
+ -t -- test only .. DO NOT OVERWRITE FILE!!!\n\
+\n\
+Strip the white space from the end of every line on the list of files.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 2048
+#define MAX_PATH 2048
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int test_only = FALSE; /* test only */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 't': /* toggle test only mode */
+ test_only = ! test_only;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ FILE *out = (FILE *) 0;
+ char outname[ MAX_PATH ];
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int length;
+ int line_number;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ if ( !test_only ) {
+ sprintf( outname, "%s.eoltmp", arg );
+
+ out = fopen( outname, "w" );
+ if (!out)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+ }
+
+ if ( verbose )
+ fprintf( stderr, "Processing %s\n", arg );
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( buffer[ length ] != '\n' )
+ error(ERR_ERRNO|ERR_FATAL, "Line %d too long in %s\n", line_number, arg);
+
+ while ( isspace( buffer[ length ] ) )
+ buffer[ length-- ] = '\0';
+
+ if ( test_only ) {
+ fprintf( stderr, "%s\n", arg );
+ break;
+ }
+
+ fprintf( out, "%s\n", buffer );
+ }
+
+ fclose( in );
+ if ( !test_only ) {
+ fclose( out );
+ rename( outname, arg );
+ }
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/c/build-tools/src/packhex.c b/c/build-tools/src/packhex.c
new file mode 100644
index 0000000000..ddd010c4a9
--- /dev/null
+++ b/c/build-tools/src/packhex.c
@@ -0,0 +1,513 @@
+
+/***** P A C K H E X . C ************************************************
+ *
+ * Packhex is a hex-file compaction utility. It attempts to concatenate
+ * hex records to produce more size-efficient packaging.
+ *
+ * Limitations: Input files must be correctly formatted. This utility
+ * is not robust enough to detect hex-record formatting
+ * errors.
+ *
+ * Published: 5/93 Embedded Systems magazine
+ *
+ * Compiler: Microsoft C 6.0
+ * cl /F 1000 packhex.c
+ *
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+/* #define SMALLER_RECORDS */
+#ifdef SMALLER_RECORDS
+#define MAX_LEN_S1_RECS 128
+#define MAX_LEN_S2_RECS 128
+#define MAX_LEN_S3_RECS 128
+#else
+#define MAX_LEN_S1_RECS 252
+#define MAX_LEN_S2_RECS 251
+#define MAX_LEN_S3_RECS 250
+#endif
+
+
+/*--------------------------------- includes ---------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(__unix__) && !defined(EXIT_FAILURE)
+#define EXIT_FAILURE -1
+#define EXIT_SUCCESS 0
+#endif
+
+/*--------------------------------- defines ----------------------------------*/
+
+#define YES 1
+#define MAX_LINE_SIZE 600
+#define EOS '\0'
+
+
+/*---------------------------------- macros ----------------------------------*/
+
+/* Convert ASCII hexadecimal digit to value. */
+
+#define HEX_DIGIT( C ) ( ( ( ( C ) > '9' ) ? ( C ) + 25 : ( C ) ) & 0xF )
+
+
+/*--------------------------------- typedefs ---------------------------------*/
+
+typedef unsigned char Boolean;
+typedef unsigned char Uchar;
+typedef unsigned int Uint;
+typedef unsigned long Ulong;
+
+typedef struct /* Functions and constant returning Hex-record vital stats. */
+{
+ Boolean ( *is_data_record )( char * );
+ Ulong ( *get_address )( char * );
+ Uint ( *get_data_count )( char * );
+ const Uint max_data_count;
+ char *( *get_data_start )( char * );
+ void ( *put_data_record )( Uint, Ulong, char * );
+} Rec_vitals;
+
+
+/*--------------------------- function prototypes ----------------------------*/
+
+Rec_vitals * identify_first_data_record( char * );
+Ulong get_ndigit_hex( char *, int );
+
+
+/*----------------------------- Intel Hex format -----------------------------*/
+
+/*
+ * Intel Hex data-record layout
+ *
+ * :aabbbbccd...dee
+ *
+ * : - header character
+ * aa - record data byte count, a 2-digit hex value
+ * bbbb - record address, a 4-digit hex value
+ * cc - record type, a 2-digit hex value:
+ * "00" is a data record
+ * "01" is an end-of-data record
+ * "02" is an extended-address record
+ * "03" is a start record
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 2's complement
+ * [ (sum of bytes: aabbbbccd...d) modulo 256 ]
+ */
+
+
+Boolean is_intel_data_rec( char * rec_str )
+{
+ return( ( rec_str[ 0 ] == ':' ) && ( rec_str[ 8 ] == '0' ) );
+}
+
+Uint get_intel_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 1, 2 ) );
+}
+
+Ulong get_intel_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 3, 4 ) );
+}
+
+char * get_intel_rec_data_start( char * rec_str )
+{
+ return( rec_str + 9 );
+}
+
+void put_intel_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = count + ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ ":%02X%04lX00%s%02X\n", count, address, data_str, (~sum + 1) & 0xff
+ );
+}
+
+
+Rec_vitals intel_hex =
+{
+ is_intel_data_rec,
+ get_intel_rec_address,
+ get_intel_rec_data_count,
+ 255, /* Maximum data bytes in a record. */
+ get_intel_rec_data_start,
+ put_intel_data_rec
+};
+
+
+/*------------------------- Motorola S1-record format ------------------------*/
+
+/*
+ * Motorola S-record data-record layout
+ *
+ * Sabbc...cd...dee
+ *
+ * S - header character
+ * a - record type, a 1-digit value:
+ * "0" is a header record
+ * "1" is a 2-byte-address data record
+ * "2" is a 3-byte-address data record
+ * "3" is a 4-byte-address data record
+ * "7" is a 4-byte-address end-of-data record
+ * "8" is a 3-byte-address end-of-data record
+ * "9" is a 2-byte-address end-of-data record
+ * bb - record length in bytes, a 2-digit hex value
+ * (record length doesn't count the header/type
+ * chars and checksum byte)
+ * c...c - record address, a 4-, 6-, or 8-digit value,
+ * depending on record type
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 1's complement
+ * [ (sum of all bytes: bbc..cd...d) modulo 256 ]
+ */
+
+#define S1_COUNT_OFFSET 3
+
+
+Boolean is_moto_s1_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '1' ) );
+}
+
+Uint get_moto_s1_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S1_COUNT_OFFSET );
+}
+
+Ulong get_moto_s1_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 4 ) );
+}
+
+char * get_moto_s1_rec_data_start( char * rec_str )
+{
+ return( rec_str + 8 );
+}
+
+void put_moto_s1_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S1_COUNT_OFFSET + count +
+ ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S1%02X%04lX%s%02X\n",
+ count + S1_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s1_rec =
+{
+ is_moto_s1_data_rec,
+ get_moto_s1_rec_address,
+ get_moto_s1_rec_data_count,
+ MAX_LEN_S1_RECS, /* Maximum data bytes in a record. */
+ get_moto_s1_rec_data_start,
+ put_moto_s1_data_rec
+};
+
+
+/*------------------------- Motorola S2-record format ------------------------*/
+
+#define S2_COUNT_OFFSET 4
+
+Boolean is_moto_s2_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '2' ) );
+}
+
+Uint get_moto_s2_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S2_COUNT_OFFSET );
+}
+
+Ulong get_moto_s2_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 6 ) );
+}
+
+char * get_moto_s2_rec_data_start( char * rec_str )
+{
+ return( rec_str + 10 );
+}
+
+void put_moto_s2_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S2_COUNT_OFFSET + count + ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S2%02X%06lX%s%02X\n",
+ count + S2_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s2_rec =
+{
+ is_moto_s2_data_rec,
+ get_moto_s2_rec_address,
+ get_moto_s2_rec_data_count,
+ MAX_LEN_S2_RECS, /* Maximum data bytes in a record. */
+ get_moto_s2_rec_data_start,
+ put_moto_s2_data_rec
+};
+
+
+/*------------------------- Motorola S3-record format ------------------------*/
+
+#define S3_COUNT_OFFSET 5
+
+Boolean is_moto_s3_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '3' ) );
+}
+
+Uint get_moto_s3_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S3_COUNT_OFFSET );
+}
+
+Ulong get_moto_s3_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 8 ) );
+}
+
+char * get_moto_s3_rec_data_start( char * rec_str )
+{
+ return( rec_str + 12 );
+}
+
+void put_moto_s3_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S3_COUNT_OFFSET + count + ( address >> 24 & 0xff ) +
+ ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S3%02X%08lX%s%02X\n",
+ count + S3_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s3_rec =
+{
+ is_moto_s3_data_rec,
+ get_moto_s3_rec_address,
+ get_moto_s3_rec_data_count,
+ MAX_LEN_S3_RECS, /* Maximum data bytes in a record. */
+ get_moto_s3_rec_data_start,
+ put_moto_s3_data_rec
+};
+
+
+/*-------------------- Put your favorite hex format here ---------------------*/
+
+/*
+ * * * * The following is a template for an additional hex format: * * *
+ *
+ *
+ * Boolean is_X_data_rec( char * rec_str ) {}
+ *
+ * Uint get_X_rec_data_count( char * rec_str ) {}
+ *
+ * Ulong get_X_rec_address( char * rec_str ) {}
+ *
+ * char * get_X_rec_data_start( char * rec_str ) {}
+ *
+ * void put_X_data_rec( Uint count, Ulong address, char * data_str ) {}
+ *
+ * Rec_vitals X_rec =
+ * {
+ * is_X_data_rec,
+ * get_X_rec_address,
+ * get_X_rec_data_count,
+ * MAXIMUM DATA BYTES IN A RECORD,
+ * get_X_rec_data_start,
+ * put_X_data_rec
+ * };
+ *
+ */
+
+/*----------------------------------------------------------------------------*/
+
+
+/*
+ * Put address of additional Rec_vitals structures
+ * in this array, before the NULL entry.
+ */
+
+Rec_vitals *formats[] =
+{
+ &intel_hex,
+ &motorola_s1_rec,
+ &motorola_s2_rec,
+ &motorola_s3_rec,
+ ( Rec_vitals * ) NULL
+};
+
+
+/**** main *****************************************************************
+*
+*
+* Expects: Nothing (no command-line parameters).
+*
+* Returns: Exit status (EXIT_SUCCESS or EXIT_FAILURE).
+*
+* Reads hex records on the standard input and attempts to
+* splice adjacent data fields together. Results appear on
+* the standard output.
+*
+*******************************************************************************/
+
+void main( void )
+{
+
+ char inbuff[ MAX_LINE_SIZE ], outbuff[ MAX_LINE_SIZE ];
+ char *in_dptr, *out_dptr;
+ int d_total, d_count, d_excess, n;
+ Ulong in_rec_addr, out_rec_addr = 0;
+ Rec_vitals *rptr;
+
+
+ /* Sift through file until first hex record is identified. */
+ if ( ( rptr = identify_first_data_record( inbuff ) ) == NULL )
+ {
+ fputs( "No hex records found.\n", stderr );
+ exit( EXIT_FAILURE );
+ }
+
+
+ /* Attempt data-record splicing until end-of-file is reached. */
+ d_total = 0;
+ do
+ {
+ if ( rptr->is_data_record( inbuff ) == YES )
+ { /* Input record is a data record. */
+ d_count = rptr->get_data_count( inbuff );
+ in_rec_addr = rptr->get_address( inbuff );
+ in_dptr = rptr->get_data_start( inbuff );
+
+ if ( d_total == 0 || in_rec_addr != out_rec_addr + d_total )
+ { /* Begin a new output record. */
+ if ( d_total != 0 )
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ out_dptr = outbuff;
+ n = d_total = d_count;
+ out_rec_addr = in_rec_addr;
+ }
+ else if
+ ( ( d_excess = d_total + d_count - rptr->max_data_count ) > 0 )
+ { /* Output a maximum-length record, then start a new record. */
+ strncat( outbuff, in_dptr, 2 * ( d_count - d_excess ) );
+ rptr->put_data_record(
+ rptr->max_data_count, out_rec_addr, outbuff
+ );
+ in_dptr += 2 * ( d_count - d_excess );
+ out_dptr = outbuff;
+ n = d_total = d_excess;
+ out_rec_addr += rptr->max_data_count;
+ }
+ else
+ { /* Append input record's data field with accumulated data. */
+ out_dptr = outbuff + ( 2 * d_total );
+ d_total += n = d_count;
+ }
+ strncpy( out_dptr, in_dptr, 2 * n );
+ out_dptr[ 2 * n ] = EOS;
+ }
+ else
+ { /* Not a data record;
+ * flush accumulated data then echo non-data record.
+ */
+ if ( d_total != 0 )
+ {
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ d_total = 0;
+ }
+ puts( inbuff );
+ }
+ } while ( gets( inbuff ) != NULL );
+
+
+ exit( EXIT_SUCCESS );
+
+}
+
+
+/**** identify_first_data_record *******************************************
+*
+* Expects: Pointer to hex-record line buffer.
+*
+* Returns: Pointer to hex-record structure (NULL if no match found).
+*
+* Reads the standard input, line by line, searching for a valid
+* record header character. If a valid header is found, a pointer
+* to the hex-record's type structure is returned, otherwise NULL.
+*
+* The input-stream pointer is left pointing to the first valid hex record.
+*
+*******************************************************************************/
+
+Rec_vitals * identify_first_data_record( char * buff_ptr )
+{
+ Rec_vitals ** ptr;
+
+ while ( gets( buff_ptr ) != NULL )
+ {
+ for ( ptr = formats ; *ptr != ( Rec_vitals * ) NULL ; ptr++ )
+ if ( ( *ptr )->is_data_record( buff_ptr ) == YES )
+ return( *ptr ); /* Successful return. */
+
+ puts( buff_ptr ); /* Echo non-hex-record line. */
+ }
+
+ return( ( Rec_vitals * ) NULL ); /* Unsuccessful return. */
+}
+
+
+/**** get_ndigit_hex *******************************************************
+*
+* Expects: Pointer to first ASCII hexadecimal digit, number of digits.
+*
+* Returns: Value of hexadecimal string as an unsigned long.
+*
+*******************************************************************************/
+
+Ulong get_ndigit_hex( char * cptr, int digits )
+{
+ Ulong value;
+
+ for ( value = 0 ; --digits >= 0 ; cptr++ )
+ value = ( value * 16L ) + HEX_DIGIT( *cptr );
+
+ return( value );
+}
diff --git a/c/build-tools/src/unhex.c b/c/build-tools/src/unhex.c
new file mode 100644
index 0000000000..a75ba8e665
--- /dev/null
+++ b/c/build-tools/src/unhex.c
@@ -0,0 +1,725 @@
+/*
+ * unhex
+ * convert a hex file to binary equivalent. If more than one file name
+ * is given, then the output will be logically concatenated together.
+ * stdin and stdout are defaults. Verbose will enable checksum output.
+ *
+ * Supported input formats are Intel hex, Motorola S records, and TI 'B'
+ * records.
+ *
+ * Intel hex input format is
+ * Byte
+ * 1 Colon :
+ * 2..3 Record length, eg: "20"
+ * 4..7 load address nibbles
+ * 8..9 record type: "00" (data) or "02" base addr
+ * 10..x data bytes in ascii-hex
+ * x+1..x+2 cksum (2's compl of (len+addr+data))
+ * x+3 \n -- newline
+ *
+ * $Id$
+ */
+
+char *USAGE = "\
+usage: unhex [-va] [ -o file ] [ file [file ... ] ]\n\
+ -v -- verbose\n\
+ -a base -- 1st byte of output corresponds to this address\n\
+ -l -- linear, just writes data out\n\
+ -o file -- output file; must not be input file\n\
+ -F k_bits -- \"holes\" in input will be filled with 0xFF's\n\
+ up to \"k_bits\" * 1024 bits\n\
+";
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define OK 0
+#define FAILURE (-1)
+#define Failed(x) ((x) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+typedef char bool;
+#define STREQ(a,b) (strcmp(a,b) == 0)
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * Pick out designated bytes
+ */
+
+#define B0(x) ((x) & 0xff)
+#define B1(x) B0((x) >> 8)
+#define B2(x) B0((x) >> 16)
+#define B3(x) B0((x) >> 24)
+
+typedef struct buffer_rec {
+ u32 dl_destaddr;
+ u32 dl_jumpaddr;
+ int dl_count;
+ u8 dl_buf[512];
+} buffer_rec;
+
+/*
+ * vars controlled by command line options
+ */
+
+bool verbose = FALSE; /* be verbose */
+bool linear = FALSE; /* just write out linear data */
+char *outfilename = "-"; /* default output is stdout */
+u32 base = 0L; /* base address */
+u32 FFfill = 0L; /* how far to fill w 0xFF's */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind;
+extern int errno;
+
+char *progname; /* for error() */
+
+void error(int errn, ...);
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* error is fatal; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#ifdef HAVE_STRTOUL
+#define stol(p) strtoul(p, (char **) NULL, 0)
+#else
+#define stol(p) strtol(p, (char **) NULL, 0)
+#endif
+
+int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_S_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_TI_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+void write_record(buffer_rec *tb, FILE *fp);
+int getnibble(char **p);
+int getbyte(char **p);
+long getNbytes(char **p, int n);
+void badformat(char *s, char *fname, char *msg);
+
+#define get1bytes(p) ((int) getbyte(p))
+#define get2bytes(p) ((int) getNbytes(p, 2))
+#define get3bytes(p) getNbytes(p, 3)
+#define get4bytes(p) getNbytes(p, 4)
+
+char *BADADDR = "Invalid record address";
+char *BADLEN = "Invalid record length";
+char *BADBASE = "Bad base or starting address";
+char *BADFMT = "Unrecognized record type";
+char *BADDATA = "Invalid data byte";
+char *BADCSUM = "Invalid checksum";
+char *MISCSUM = "Checksum mismatch";
+char *BADTYPE = "Unrecognized record type";
+char *MISTYPE = "Incompatible record types";
+
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+ register int c;
+ bool showusage = FALSE; /* usage error? */
+ int rc = 0;
+ FILE *outfp, *infp;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ progname = argv[0];
+ while ((c = getopt(argc, argv, "F:a:o:vl")) != EOF)
+ switch (c)
+ {
+ case 'a': /* base address */
+ base = stol(optarg);
+ break;
+
+ case 'l': /* linear output */
+ linear = TRUE;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case 'o': /* output file */
+ outfilename = optarg;
+ break;
+
+ case 'F': /* 0xFF fill amount (bytes) */
+ FFfill = stol(optarg) * 1024L / 8L;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ if (linear && (base != 0))
+ {
+ error(0, "-l and -a may not be specified in combination");
+ exit(1);
+ }
+
+ if (STREQ(outfilename, "-"))
+ {
+ outfp = stdout;
+ outfilename = "stdout";
+ }
+ else
+ if ((outfp = fopen(outfilename, "w")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for output", outfilename);
+ exit(1);
+ }
+
+ /*
+ * Now process the input files (or stdin, if none specified)
+ */
+
+ if (argv[optind] == (char *) NULL) /* just stdin */
+ exit(unhex(stdin, "stdin", outfp, outfilename));
+ else
+ for (; (optarg = argv[optind]); optind++)
+ {
+ if (STREQ(optarg, "-"))
+ rc += unhex(stdin, "stdin", outfp, outfilename);
+ else
+ {
+ if ((infp = fopen(optarg, "r")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for input", optarg);
+ exit(1);
+ }
+ rc += unhex(infp, optarg, outfp, outfilename);
+ }
+ }
+
+ return(rc);
+}
+
+u16 filesum;
+
+int
+unhex(FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ int c;
+
+ filesum = 0;
+
+ /*
+ * Make sure holes will be filled with 0xFF's if requested. We
+ * do this the easy way by just filling the file with FF's before
+ * getting started. To do it more optimally would be quite a bit
+ * more difficult since the user can skip around as much as he/she
+ * likes in the input hex file addressing.
+ *
+ * We'll clean this up later (after this program has run) with
+ * 'stripffs'
+ */
+
+ if (FFfill)
+ {
+ (void) fseek(ofp, 0, 0);
+ for (c = FFfill; c > 0; c--)
+ (void) fputc(0xFF, ofp);
+ }
+
+ /*
+ * Read the first char from file and determine record types
+ */
+
+ if ((c = getc(ifp)) != EOF)
+ {
+ ungetc(c, ifp);
+ switch(c)
+ {
+ case 'S':
+ convert_S_records(ifp, inm, ofp, onm);
+ break;
+
+ case ':':
+ convert_Intel_records(ifp, inm, ofp, onm);
+ break;
+
+ case '9':
+ case 'B':
+ convert_TI_records(ifp, inm, ofp, onm);
+ break;
+
+ default:
+ {
+ char tmp[2];
+ tmp[0] = c; tmp[1] = 0;
+ badformat(tmp, inm, BADFMT);
+ }
+ }
+ }
+
+ if (verbose)
+ fprintf(stderr, "'%s' checksum is 0x%04x\n", inm, filesum);
+
+ return 0;
+}
+
+int
+convert_Intel_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int rectype; /* record type */
+ int len; /* data length of current line */
+ u32 addr;
+ u32 base_address = 0;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != ':')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+
+ if ((addr = get2bytes(&p)) == -1L) /* record addr */
+ badformat(buff, inm, BADADDR);
+
+ rectype = getbyte(&p);
+
+ cksum = len + B0(addr) + B1(addr) + rectype;
+
+ switch (rectype)
+ {
+ case 0x00: /* normal data record */
+ tb.dl_destaddr = base_address + addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x01: /* execution start address */
+ base_address = addr;
+ endrecord = TRUE;
+ break;
+
+ case 0x02: /* new base */
+ if ((base_address = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADBASE);
+ cksum += B0(base_address) + B1(base_address);
+ base_address <<= 4;
+ break;
+
+ case 0x03: /* seg/off execution start address */
+ {
+ u32 seg, off;
+
+ seg = get2bytes(&p);
+ off = get2bytes(&p);
+ if ((seg == -1L) || (off == -1L))
+ badformat(buff, inm, BADADDR);
+
+ cksum += B0(seg) + B1(seg) + B0(off) + B1(off);
+
+ tb.dl_jumpaddr = (seg << 4) + off;
+ break;
+ }
+
+ default:
+ error(0, "unknown Intel-hex record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (-cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_S_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int len; /* data length of current line */
+ int rectype; /* record type */
+ u32 addr;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != 'S')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((rectype = getnibble(&p)) == -1) /* record type */
+ badformat(buff, inm, BADTYPE);
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+ cksum = len;
+
+ switch (rectype)
+ {
+ case 0x00: /* comment field, ignored */
+ goto write_it;
+
+ case 0x01: /* data record, 16 bit addr */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 3;
+ goto doit;
+
+ case 0x02: /* ... 24 bit addr */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 4;
+ goto doit;
+
+ case 0x03: /* ... 32 bit addr */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 5;
+ doit:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+
+ tb.dl_destaddr = addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x07: /* 32 bit end record */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x08: /* 24 bit end record */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x09: /* 16 bit end record */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+
+end_rec:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+ tb.dl_jumpaddr = addr;
+ break;
+
+ default:
+ error(0, "unknown Motorola-S record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ break;
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (~cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+write_it:
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_TI_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ int c;
+ bool endrecord = FALSE;
+ bool eol;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ p = &buff[0];
+ eol = FALSE;
+ while ( ! eol && ! endrecord)
+ {
+ switch (*p++)
+ {
+ case '9':
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ tb.dl_destaddr = get2bytes(&p);
+ break;
+
+ case 'B':
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ break;
+
+ case 'F':
+ eol = TRUE;
+ break;
+
+ case ':':
+ endrecord = TRUE;
+ break;
+
+ default:
+ badformat(p, inm, BADFMT);
+ }
+ }
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+void
+write_record(buffer_rec *tb,
+ FILE *fp)
+{
+ if ( ! linear)
+ {
+ if (tb->dl_destaddr < base)
+ error(ERR_FATAL, "record at address 0x%x precedes base of 0x%x",
+ tb->dl_destaddr, base);
+ (void) fseek(fp, tb->dl_destaddr - base, 0);
+ }
+
+ (void) fwrite(tb->dl_buf, tb->dl_count, 1, fp);
+ tb->dl_destaddr += tb->dl_count;
+ tb->dl_count = 0;
+}
+
+int
+getnibble(char **p)
+{
+ register int val;
+
+ **p = toupper(**p);
+ switch (**p)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ val = **p - '0';
+ break;
+
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ val = 10 + (**p - 'A');
+ break;
+
+ default:
+ return(-1);
+ }
+ *p += 1;
+
+ return(val & 0x0f);
+}
+
+int
+getbyte(char **p)
+{
+ int n0, n1;
+
+ if ((n0 = getnibble(p)) == -1)
+ return(-1);
+ if ((n1 = getnibble(p)) == -1)
+ return(-1);
+
+ return(((n0 << 4) + n1) & 0xff);
+}
+
+long
+getNbytes(char **p,
+ int n)
+{
+ int t;
+ u32 val = 0;
+
+ while (n--)
+ {
+ if ((t = getbyte(p)) == -1)
+ return(-1L);
+ val <<= 8;
+ val += t;
+ }
+
+ return(val);
+}
+
+void
+badformat(char *s,
+ char *fname,
+ char *msg)
+{
+ if (s[strlen(s)-1] == '\n') /* get rid of newline */
+ s[strlen(s)-1] = '\0';
+ error(0, "line '%s'::\n\tfrom file '%s'; %s", s, fname, msg);
+ exit(1);
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_EXIT bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
diff --git a/c/build-tools/unhex.c b/c/build-tools/unhex.c
new file mode 100644
index 0000000000..a75ba8e665
--- /dev/null
+++ b/c/build-tools/unhex.c
@@ -0,0 +1,725 @@
+/*
+ * unhex
+ * convert a hex file to binary equivalent. If more than one file name
+ * is given, then the output will be logically concatenated together.
+ * stdin and stdout are defaults. Verbose will enable checksum output.
+ *
+ * Supported input formats are Intel hex, Motorola S records, and TI 'B'
+ * records.
+ *
+ * Intel hex input format is
+ * Byte
+ * 1 Colon :
+ * 2..3 Record length, eg: "20"
+ * 4..7 load address nibbles
+ * 8..9 record type: "00" (data) or "02" base addr
+ * 10..x data bytes in ascii-hex
+ * x+1..x+2 cksum (2's compl of (len+addr+data))
+ * x+3 \n -- newline
+ *
+ * $Id$
+ */
+
+char *USAGE = "\
+usage: unhex [-va] [ -o file ] [ file [file ... ] ]\n\
+ -v -- verbose\n\
+ -a base -- 1st byte of output corresponds to this address\n\
+ -l -- linear, just writes data out\n\
+ -o file -- output file; must not be input file\n\
+ -F k_bits -- \"holes\" in input will be filled with 0xFF's\n\
+ up to \"k_bits\" * 1024 bits\n\
+";
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define OK 0
+#define FAILURE (-1)
+#define Failed(x) ((x) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+typedef char bool;
+#define STREQ(a,b) (strcmp(a,b) == 0)
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * Pick out designated bytes
+ */
+
+#define B0(x) ((x) & 0xff)
+#define B1(x) B0((x) >> 8)
+#define B2(x) B0((x) >> 16)
+#define B3(x) B0((x) >> 24)
+
+typedef struct buffer_rec {
+ u32 dl_destaddr;
+ u32 dl_jumpaddr;
+ int dl_count;
+ u8 dl_buf[512];
+} buffer_rec;
+
+/*
+ * vars controlled by command line options
+ */
+
+bool verbose = FALSE; /* be verbose */
+bool linear = FALSE; /* just write out linear data */
+char *outfilename = "-"; /* default output is stdout */
+u32 base = 0L; /* base address */
+u32 FFfill = 0L; /* how far to fill w 0xFF's */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind;
+extern int errno;
+
+char *progname; /* for error() */
+
+void error(int errn, ...);
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* error is fatal; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#ifdef HAVE_STRTOUL
+#define stol(p) strtoul(p, (char **) NULL, 0)
+#else
+#define stol(p) strtol(p, (char **) NULL, 0)
+#endif
+
+int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_S_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_TI_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+void write_record(buffer_rec *tb, FILE *fp);
+int getnibble(char **p);
+int getbyte(char **p);
+long getNbytes(char **p, int n);
+void badformat(char *s, char *fname, char *msg);
+
+#define get1bytes(p) ((int) getbyte(p))
+#define get2bytes(p) ((int) getNbytes(p, 2))
+#define get3bytes(p) getNbytes(p, 3)
+#define get4bytes(p) getNbytes(p, 4)
+
+char *BADADDR = "Invalid record address";
+char *BADLEN = "Invalid record length";
+char *BADBASE = "Bad base or starting address";
+char *BADFMT = "Unrecognized record type";
+char *BADDATA = "Invalid data byte";
+char *BADCSUM = "Invalid checksum";
+char *MISCSUM = "Checksum mismatch";
+char *BADTYPE = "Unrecognized record type";
+char *MISTYPE = "Incompatible record types";
+
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+ register int c;
+ bool showusage = FALSE; /* usage error? */
+ int rc = 0;
+ FILE *outfp, *infp;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ progname = argv[0];
+ while ((c = getopt(argc, argv, "F:a:o:vl")) != EOF)
+ switch (c)
+ {
+ case 'a': /* base address */
+ base = stol(optarg);
+ break;
+
+ case 'l': /* linear output */
+ linear = TRUE;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case 'o': /* output file */
+ outfilename = optarg;
+ break;
+
+ case 'F': /* 0xFF fill amount (bytes) */
+ FFfill = stol(optarg) * 1024L / 8L;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ if (linear && (base != 0))
+ {
+ error(0, "-l and -a may not be specified in combination");
+ exit(1);
+ }
+
+ if (STREQ(outfilename, "-"))
+ {
+ outfp = stdout;
+ outfilename = "stdout";
+ }
+ else
+ if ((outfp = fopen(outfilename, "w")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for output", outfilename);
+ exit(1);
+ }
+
+ /*
+ * Now process the input files (or stdin, if none specified)
+ */
+
+ if (argv[optind] == (char *) NULL) /* just stdin */
+ exit(unhex(stdin, "stdin", outfp, outfilename));
+ else
+ for (; (optarg = argv[optind]); optind++)
+ {
+ if (STREQ(optarg, "-"))
+ rc += unhex(stdin, "stdin", outfp, outfilename);
+ else
+ {
+ if ((infp = fopen(optarg, "r")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for input", optarg);
+ exit(1);
+ }
+ rc += unhex(infp, optarg, outfp, outfilename);
+ }
+ }
+
+ return(rc);
+}
+
+u16 filesum;
+
+int
+unhex(FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ int c;
+
+ filesum = 0;
+
+ /*
+ * Make sure holes will be filled with 0xFF's if requested. We
+ * do this the easy way by just filling the file with FF's before
+ * getting started. To do it more optimally would be quite a bit
+ * more difficult since the user can skip around as much as he/she
+ * likes in the input hex file addressing.
+ *
+ * We'll clean this up later (after this program has run) with
+ * 'stripffs'
+ */
+
+ if (FFfill)
+ {
+ (void) fseek(ofp, 0, 0);
+ for (c = FFfill; c > 0; c--)
+ (void) fputc(0xFF, ofp);
+ }
+
+ /*
+ * Read the first char from file and determine record types
+ */
+
+ if ((c = getc(ifp)) != EOF)
+ {
+ ungetc(c, ifp);
+ switch(c)
+ {
+ case 'S':
+ convert_S_records(ifp, inm, ofp, onm);
+ break;
+
+ case ':':
+ convert_Intel_records(ifp, inm, ofp, onm);
+ break;
+
+ case '9':
+ case 'B':
+ convert_TI_records(ifp, inm, ofp, onm);
+ break;
+
+ default:
+ {
+ char tmp[2];
+ tmp[0] = c; tmp[1] = 0;
+ badformat(tmp, inm, BADFMT);
+ }
+ }
+ }
+
+ if (verbose)
+ fprintf(stderr, "'%s' checksum is 0x%04x\n", inm, filesum);
+
+ return 0;
+}
+
+int
+convert_Intel_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int rectype; /* record type */
+ int len; /* data length of current line */
+ u32 addr;
+ u32 base_address = 0;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != ':')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+
+ if ((addr = get2bytes(&p)) == -1L) /* record addr */
+ badformat(buff, inm, BADADDR);
+
+ rectype = getbyte(&p);
+
+ cksum = len + B0(addr) + B1(addr) + rectype;
+
+ switch (rectype)
+ {
+ case 0x00: /* normal data record */
+ tb.dl_destaddr = base_address + addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x01: /* execution start address */
+ base_address = addr;
+ endrecord = TRUE;
+ break;
+
+ case 0x02: /* new base */
+ if ((base_address = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADBASE);
+ cksum += B0(base_address) + B1(base_address);
+ base_address <<= 4;
+ break;
+
+ case 0x03: /* seg/off execution start address */
+ {
+ u32 seg, off;
+
+ seg = get2bytes(&p);
+ off = get2bytes(&p);
+ if ((seg == -1L) || (off == -1L))
+ badformat(buff, inm, BADADDR);
+
+ cksum += B0(seg) + B1(seg) + B0(off) + B1(off);
+
+ tb.dl_jumpaddr = (seg << 4) + off;
+ break;
+ }
+
+ default:
+ error(0, "unknown Intel-hex record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (-cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_S_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int len; /* data length of current line */
+ int rectype; /* record type */
+ u32 addr;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != 'S')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((rectype = getnibble(&p)) == -1) /* record type */
+ badformat(buff, inm, BADTYPE);
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+ cksum = len;
+
+ switch (rectype)
+ {
+ case 0x00: /* comment field, ignored */
+ goto write_it;
+
+ case 0x01: /* data record, 16 bit addr */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 3;
+ goto doit;
+
+ case 0x02: /* ... 24 bit addr */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 4;
+ goto doit;
+
+ case 0x03: /* ... 32 bit addr */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 5;
+ doit:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+
+ tb.dl_destaddr = addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x07: /* 32 bit end record */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x08: /* 24 bit end record */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x09: /* 16 bit end record */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+
+end_rec:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+ tb.dl_jumpaddr = addr;
+ break;
+
+ default:
+ error(0, "unknown Motorola-S record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ break;
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (~cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+write_it:
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_TI_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ int c;
+ bool endrecord = FALSE;
+ bool eol;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ p = &buff[0];
+ eol = FALSE;
+ while ( ! eol && ! endrecord)
+ {
+ switch (*p++)
+ {
+ case '9':
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ tb.dl_destaddr = get2bytes(&p);
+ break;
+
+ case 'B':
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ break;
+
+ case 'F':
+ eol = TRUE;
+ break;
+
+ case ':':
+ endrecord = TRUE;
+ break;
+
+ default:
+ badformat(p, inm, BADFMT);
+ }
+ }
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+void
+write_record(buffer_rec *tb,
+ FILE *fp)
+{
+ if ( ! linear)
+ {
+ if (tb->dl_destaddr < base)
+ error(ERR_FATAL, "record at address 0x%x precedes base of 0x%x",
+ tb->dl_destaddr, base);
+ (void) fseek(fp, tb->dl_destaddr - base, 0);
+ }
+
+ (void) fwrite(tb->dl_buf, tb->dl_count, 1, fp);
+ tb->dl_destaddr += tb->dl_count;
+ tb->dl_count = 0;
+}
+
+int
+getnibble(char **p)
+{
+ register int val;
+
+ **p = toupper(**p);
+ switch (**p)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ val = **p - '0';
+ break;
+
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ val = 10 + (**p - 'A');
+ break;
+
+ default:
+ return(-1);
+ }
+ *p += 1;
+
+ return(val & 0x0f);
+}
+
+int
+getbyte(char **p)
+{
+ int n0, n1;
+
+ if ((n0 = getnibble(p)) == -1)
+ return(-1);
+ if ((n1 = getnibble(p)) == -1)
+ return(-1);
+
+ return(((n0 << 4) + n1) & 0xff);
+}
+
+long
+getNbytes(char **p,
+ int n)
+{
+ int t;
+ u32 val = 0;
+
+ while (n--)
+ {
+ if ((t = getbyte(p)) == -1)
+ return(-1L);
+ val <<= 8;
+ val += t;
+ }
+
+ return(val);
+}
+
+void
+badformat(char *s,
+ char *fname,
+ char *msg)
+{
+ if (s[strlen(s)-1] == '\n') /* get rid of newline */
+ s[strlen(s)-1] = '\0';
+ error(0, "line '%s'::\n\tfrom file '%s'; %s", s, fname, msg);
+ exit(1);
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_EXIT bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
diff --git a/c/src/Makefile.in b/c/src/Makefile.in
new file mode 100644
index 0000000000..bd375ee974
--- /dev/null
+++ b/c/src/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=exec lib tests/tools tests/support tests/samples
+
+
diff --git a/c/src/README b/c/src/README
new file mode 100644
index 0000000000..3e242504dc
--- /dev/null
+++ b/c/src/README
@@ -0,0 +1,27 @@
+#
+# $Id$
+#
+
+This is the top level directory of the C RTEMS environment. The
+following is a description of the contents of each file and
+subdirectory directly in this directory:
+
+ tests
+
+ This directory contains the RTEMS Test Suites. Currently
+ this includes the following suites:
+
+ + Single Processor Test Suite
+ + Multiprocessor Test Suite
+ + Timing Test Suite
+ + Sample Application Suite
+
+ lib
+
+ This directory contains src for RTEMS libraries:
+ libc, board support (including drivers) and libcpu.
+
+ exec
+
+ This directory contains the source code for the RTEMS executive.
+
diff --git a/c/src/exec/Makefile.in b/c/src/exec/Makefile.in
new file mode 100644
index 0000000000..ead6e65f2c
--- /dev/null
+++ b/c/src/exec/Makefile.in
@@ -0,0 +1,17 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+POSIX_DIRS_yes_V=posix
+POSIX_DIRS = $(POSIX_DIRS_$(HAS_POSIX_API)_V)
+
+SUB_DIRS=score rtems $(POSIX_DIRS) sapi wrapup
+
diff --git a/c/src/exec/libcsupport/include/clockdrv.h b/c/src/exec/libcsupport/include/clockdrv.h
new file mode 100644
index 0000000000..368c292f8f
--- /dev/null
+++ b/c/src/exec/libcsupport/include/clockdrv.h
@@ -0,0 +1,51 @@
+/* clock.h
+ *
+ * This file describes the Clock Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CLOCK_DRIVER_h
+#define __CLOCK_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* variables */
+
+extern volatile rtems_unsigned32 Clock_driver_ticks;
+extern rtems_device_major_number rtems_clock_major;
+extern rtems_device_minor_number rtems_clock_minor;
+
+/* default clock driver entry */
+
+#define CLOCK_DRIVER_TABLE_ENTRY \
+ { Clock_initialize, NULL, NULL, NULL, NULL, Clock_control }
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/libcsupport/include/console.h b/c/src/exec/libcsupport/include/console.h
new file mode 100644
index 0000000000..b3437eed91
--- /dev/null
+++ b/c/src/exec/libcsupport/include/console.h
@@ -0,0 +1,69 @@
+/* console.h
+ *
+ * This file describes the Console Device Driver for all boards.
+ * This driver provides support for the standard C Library.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef _CONSOLE_DRIVER_h
+#define _CONSOLE_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CONSOLE_DRIVER_TABLE_ENTRY \
+ { 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_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
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/libcsupport/include/iosupp.h b/c/src/exec/libcsupport/include/iosupp.h
new file mode 100644
index 0000000000..69e6195a2f
--- /dev/null
+++ b/c/src/exec/libcsupport/include/iosupp.h
@@ -0,0 +1,44 @@
+/* iosupp.h
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __IOSUPP_h
+#define __IOSUPP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* character constants */
+
+#define BS 0x08 /* backspace */
+#define LF 0x0a /* line feed */
+#define CR 0x0d /* carriage return */
+#define XON 0x11 /* control-Q */
+#define XOFF 0x13 /* control-S */
+
+/* structures */
+
+#ifdef IOSUPP_INIT
+#define IOSUPP_EXTERN
+#else
+#undef IOSUPP_EXTERN
+#define IOSUPP_EXTERN extern
+#endif
+
+/* functions */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/exec/libcsupport/include/ringbuf.h b/c/src/exec/libcsupport/include/ringbuf.h
new file mode 100644
index 0000000000..8c80aaf9c8
--- /dev/null
+++ b/c/src/exec/libcsupport/include/ringbuf.h
@@ -0,0 +1,53 @@
+/*
+ * ringbuf.h
+ *
+ * This file provides simple ring buffer functionality.
+ *
+ * $Id$
+ */
+
+#ifndef __RINGBUF_H__
+#define __RINGBUF_H__
+
+#ifndef RINGBUF_QUEUE_LENGTH
+#define RINGBUF_QUEUE_LENGTH 128
+#endif
+
+typedef struct {
+ char buffer[RINGBUF_QUEUE_LENGTH];
+ volatile int head;
+ volatile int tail;
+} Ring_buffer_t;
+
+#define Ring_buffer_Initialize( _buffer ) \
+ do { \
+ (_buffer)->head = (_buffer)->tail = 0; \
+ } while ( 0 )
+
+#define Ring_buffer_Is_empty( _buffer ) \
+ ( (_buffer)->head == (_buffer)->tail )
+
+#define Ring_buffer_Is_full( _buffer ) \
+ ( (_buffer)->head == ((_buffer)->tail + 1) % RINGBUF_QUEUE_LENGTH )
+
+#define Ring_buffer_Add_character( _buffer, _ch ) \
+ do { \
+ rtems_unsigned32 isrlevel; \
+ \
+ rtems_interrupt_disable( isrlevel ); \
+ (_buffer)->tail = ((_buffer)->tail+1) % RINGBUF_QUEUE_LENGTH; \
+ (_buffer)->buffer[ (_buffer)->tail ] = (_ch); \
+ rtems_interrupt_enable( isrlevel ); \
+ } while ( 0 )
+
+#define Ring_buffer_Remove_character( _buffer, _ch ) \
+ do { \
+ rtems_unsigned32 isrlevel; \
+ \
+ rtems_interrupt_disable( isrlevel ); \
+ (_buffer)->head = ((_buffer)->head+1) % RINGBUF_QUEUE_LENGTH; \
+ (_ch) = (_buffer)->buffer[ (_buffer)->head ]; \
+ rtems_interrupt_enable( isrlevel ); \
+ } while ( 0 )
+
+#endif
diff --git a/c/src/exec/libcsupport/include/rtems/assoc.h b/c/src/exec/libcsupport/include/rtems/assoc.h
new file mode 100644
index 0000000000..1982d654ac
--- /dev/null
+++ b/c/src/exec/libcsupport/include/rtems/assoc.h
@@ -0,0 +1,42 @@
+/*
+ *
+ * Rtems associativity routines. Mainly used to convert a value from
+ * one space to another (eg: our errno's to host errno's and v.v)
+ *
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ASSOC_H
+#define _INCLUDE_ASSOC_H
+
+typedef struct {
+ const char *name;
+ unsigned32 local_value;
+ unsigned32 remote_value;
+} rtems_assoc_t;
+
+/*
+ * Flag/marker for optional default value in each table
+ */
+
+#define RTEMS_ASSOC_DEFAULT_NAME "(default)"
+
+const rtems_assoc_t *rtems_assoc_ptr_by_name(const rtems_assoc_t *, const char *);
+const rtems_assoc_t *rtems_assoc_ptr_by_value(const rtems_assoc_t *, unsigned32);
+const rtems_assoc_t *rtems_assoc_ptr_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_local_by_remote(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_remote_by_name(const rtems_assoc_t *, const char *);
+unsigned32 rtems_assoc_local_by_name(const rtems_assoc_t *, const char *);
+const char *rtems_assoc_name_by_local(const rtems_assoc_t *, unsigned32);
+const char *rtems_assoc_name_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(const rtems_assoc_t *, unsigned32);
+char *rtems_assoc_name_by_local_bitfield(const rtems_assoc_t *, unsigned32, char *);
+char *rtems_assoc_name_by_remote_bitfield(const rtems_assoc_t *, unsigned32, char *);
+unsigned32 rtems_assoc_local_by_remote_bitfield(const rtems_assoc_t *, unsigned32);
+
+
+#endif /* ! _INCLUDE_ASSOC_H */
diff --git a/c/src/exec/libcsupport/include/rtems/error.h b/c/src/exec/libcsupport/include/rtems/error.h
new file mode 100644
index 0000000000..a0698afb5d
--- /dev/null
+++ b/c/src/exec/libcsupport/include/rtems/error.h
@@ -0,0 +1,38 @@
+/*
+ * Defines and externs for rtems error reporting
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ERROR_h
+#define __RTEMS_ERROR_h
+
+/*
+ * rtems_error() and rtems_panic() support
+ */
+
+#define RTEMS_ERROR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */
+#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */
+
+#define RTEMS_ERROR_MASK (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \
+ RTEMS_ERROR_PANIC) /* all */
+
+const char *rtems_status_text(rtems_status_code);
+int rtems_error(int error_code, const char *printf_format, ...);
+#ifdef __GNUC__
+void rtems_panic(const char *printf_format, ...);
+/*
+ * We should be able to use this attribute but gcc complains that
+ * rtems_panic does in fact return. :(
+ *
+ * __attribute__ ((__noreturn__));
+ */
+#else
+void rtems_panic(const char *printf_format, ...);
+#endif
+
+extern int rtems_panic_in_progress;
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/libcsupport/include/rtems/libcsupport.h b/c/src/exec/libcsupport/include/rtems/libcsupport.h
new file mode 100644
index 0000000000..470a35b51a
--- /dev/null
+++ b/c/src/exec/libcsupport/include/rtems/libcsupport.h
@@ -0,0 +1,43 @@
+/* libcsupport.h
+ *
+ * This include file contains the information regarding the
+ * RTEMS specific support for the standard C library.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __LIBC_SUPPORT_h
+#define __LIBC_SUPPORT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+
+void RTEMS_Malloc_Initialize(
+ void *start,
+ size_t length,
+ size_t sbrk_amount
+);
+
+extern void malloc_dump(void);
+extern void malloc_walk(size_t source, size_t printf_enabled);
+extern void libc_init(int reentrant);
+extern int host_errno(void);
+extern void fix_syscall_errno(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/libcsupport/include/rtems/libio.h b/c/src/exec/libcsupport/include/rtems/libio.h
new file mode 100644
index 0000000000..c79dfc2e33
--- /dev/null
+++ b/c/src/exec/libcsupport/include/rtems/libio.h
@@ -0,0 +1,124 @@
+/*
+ * General purpose communication channel for RTEMS to allow UNIX/POSIX
+ * system call behavior on top of RTEMS IO devices.
+ *
+ * TODO
+ * stat(2)
+ * unlink(2)
+ * rename(2)
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_LIBIO_H
+#define _RTEMS_LIBIO_H
+
+#include <sys/stat.h>
+
+typedef unsigned32 rtems_libio_offset_t;
+
+/*
+ * An open file data structure, indexed by 'fd'
+ * TODO:
+ * should really have a separate per/file data structure that this
+ * points to (eg: size, offset, driver, pathname should be in that)
+ */
+
+typedef struct {
+ rtems_driver_name_t *driver;
+ rtems_libio_offset_t size; /* size of file */
+ rtems_libio_offset_t offset; /* current offset into the file */
+ unsigned32 flags;
+ char *pathname; /* opened pathname */
+ Objects_Id sem;
+ unsigned32 data0; /* private to "driver" */
+ unsigned32 data1; /* ... */
+} rtems_libio_t;
+
+
+/*
+ * param block for read/write
+ * Note: it must include 'offset' instead of using iop's offset since
+ * we can have multiple outstanding i/o's on a device.
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ rtems_libio_offset_t offset;
+ unsigned8 *buffer;
+ unsigned32 count;
+ unsigned32 flags;
+ unsigned32 bytes_moved;
+} rtems_libio_rw_args_t;
+
+/*
+ * param block for open/close
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 flags;
+ unsigned32 mode;
+} rtems_libio_open_close_args_t;
+
+/*
+ * param block for ioctl
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 command;
+ void *buffer;
+ unsigned32 ioctl_return;
+} rtems_libio_ioctl_args_t;
+
+
+/*
+ * Values for 'flag'
+ */
+
+#define LIBIO_FLAGS_NO_DELAY 0x0001 /* return immediately if no data */
+#define LIBIO_FLAGS_READ 0x0002 /* reading */
+#define LIBIO_FLAGS_WRITE 0x0004 /* writing */
+#define LIBIO_FLAGS_LINE_BUFFERED 0x0008 /* line buffered io (^h, ^u, etc) */
+#define LIBIO_FLAGS_OPEN 0x0100 /* device is open */
+#define LIBIO_FLAGS_APPEND 0x0200 /* all writes append */
+#define LIBIO_FLAGS_CREATE 0x0400 /* create file */
+
+#define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE)
+
+void rtems_libio_config(rtems_configuration_table *config, unsigned32 max_fds);
+void rtems_libio_init(void);
+
+int __rtems_open(const char *pathname, unsigned32 flag, unsigned32 mode);
+int __rtems_close(int fd);
+int __rtems_read(int fd, void *buffer, unsigned32 count);
+int __rtems_write(int fd, const void *buffer, unsigned32 count);
+int __rtems_ioctl(int fd, unsigned32 command, void *buffer);
+int __rtems_lseek(int fd, rtems_libio_offset_t offset, int whence);
+int __rtems_fstat(int _fd, struct stat* _sbuf);
+int __rtems_isatty(int _fd);
+
+/*
+ * External I/O handlers
+ */
+typedef struct {
+ int (*open)(const char *pathname, unsigned32 flag, unsigned32 mode);
+ int (*close)(int fd);
+ int (*read)(int fd, void *buffer, unsigned32 count);
+ int (*write)(int fd, const void *buffer, unsigned32 count);
+ int (*ioctl)(int fd, unsigned32 command, void *buffer);
+ int (*lseek)(int fd, rtems_libio_offset_t offset, int whence);
+} rtems_libio_handler_t;
+
+void rtems_register_libio_handler(int handler_flag,
+ const rtems_libio_handler_t *handler);
+
+#define RTEMS_FILE_DESCRIPTOR_TYPE_FILE 0x0000
+#define RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET 0x1000
+#define rtems_make_file_descriptor(fd,flags) ((fd)|(flags))
+#define rtems_file_descriptor_base(fd) ((fd) & 0x0FFF)
+#define rtems_file_descriptor_type(fd) ((fd) & 0xF000)
+#define rtems_file_descriptor_type_index(fd) ((((fd) & 0xF000) >> 12) - 1)
+
+#endif /* _RTEMS_LIBIO_H */
diff --git a/c/src/exec/libcsupport/include/spurious.h b/c/src/exec/libcsupport/include/spurious.h
new file mode 100644
index 0000000000..1250b60d56
--- /dev/null
+++ b/c/src/exec/libcsupport/include/spurious.h
@@ -0,0 +1,38 @@
+/* spurious.h
+ *
+ * This file describes the Spurious Interrupt Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SPURIOUS_h
+#define __SPURIOUS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SPURIOUS_DRIVER_TABLE_ENTRY \
+ { Spurious_Initialize, NULL, NULL, NULL, NULL, NULL }
+
+rtems_device_driver Spurious_Initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *,
+ rtems_id,
+ rtems_unsigned32 *
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/libcsupport/include/sys/utsname.h b/c/src/exec/libcsupport/include/sys/utsname.h
new file mode 100644
index 0000000000..ca15230d40
--- /dev/null
+++ b/c/src/exec/libcsupport/include/sys/utsname.h
@@ -0,0 +1,49 @@
+/* sys/utsname.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SYS_UTSNAME_h
+#define __POSIX_SYS_UTSNAME_h
+
+#include <sys/times.h>
+#include <sys/types.h>
+
+/*
+ * 4.4.1 Get System Name (Table 4-1), P1003.1b-1993, p. 90
+ *
+ * NOTE: The lengths of the strings in this structure are
+ * just long enough to reliably contain the RTEMS information.
+ * For example, the fields are not long enough to support
+ * Internet hostnames.
+ */
+
+struct utsname {
+ char sysname[ 32 ]; /* Name of this implementation of the operating system */
+ char nodename[ 32 ]; /* Name of this node within an implementation */
+ /* specified communication network */
+ char release[ 32 ]; /* Current release level of this implementation */
+ char version[ 32 ]; /* Current version level of this release */
+ char machine[ 32 ]; /* Name of the hardware type on which the system */
+ /* is running */
+};
+
+/*
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+);
+
+/*
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+);
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/libcsupport/include/timerdrv.h b/c/src/exec/libcsupport/include/timerdrv.h
new file mode 100644
index 0000000000..e7dd1c37a3
--- /dev/null
+++ b/c/src/exec/libcsupport/include/timerdrv.h
@@ -0,0 +1,40 @@
+/* timerdrv.h
+ *
+ * This file describes the Timer Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_DRIVER_h
+#define __TIMER_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* functions */
+
+void Timer_initialize( void );
+
+rtems_unsigned32 Read_timer( void );
+
+rtems_status_code Empty_function( void );
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/libcsupport/include/vmeintr.h b/c/src/exec/libcsupport/include/vmeintr.h
new file mode 100644
index 0000000000..2052acecbb
--- /dev/null
+++ b/c/src/exec/libcsupport/include/vmeintr.h
@@ -0,0 +1,58 @@
+/*
+ * vmeintr.h
+ *
+ * This file is the specification for the VMEbus interface library
+ * which should be provided by all BSPs for VMEbus Single Board
+ * Computers but currently only a few do so.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __VME_INTERRUPT_h
+#define __VME_INTERRUPT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This defines the mask which is used to determine which
+ * interrupt levels are affected by a call to this package.
+ * The LSB corresponds to VME interrupt 0 and the MSB
+ * to VME interrupt 7.
+ *
+ */
+
+typedef rtems_unsigned8 VME_interrupt_Mask;
+
+/*
+ * VME_interrupt_Disable
+ *
+ */
+
+void VME_interrupt_Disable (
+ VME_interrupt_Mask mask /* IN */
+);
+
+/*
+ * VME_interrupt_Disable
+ *
+ */
+
+void VME_interrupt_Enable (
+ VME_interrupt_Mask mask /* IN */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* end of include file */
diff --git a/c/src/exec/libcsupport/src/README b/c/src/exec/libcsupport/src/README
new file mode 100644
index 0000000000..ee7a90501e
--- /dev/null
+++ b/c/src/exec/libcsupport/src/README
@@ -0,0 +1,37 @@
+--
+-- $Id$
+--
+
+Overview of newlib support (newlib is from CYGNUS)
+ Each task can have its own libc state including:
+ open stdio files
+ strtok
+ multi precision arithmetic state
+ etc.
+
+ This is implemented by a reentrancy data structure for each task.
+
+ When a task is "started" (in RTEMS sense) the reentrancy structure
+ is allocated. Its address is stored in notepad[NOTEPAD_LAST].
+
+ When task is switched to, the value of global variable _impure_ptr
+ is changed to the value of the new tasks reentrancy structure.
+
+ When a task is deleted
+ atexit() processing (for that task) happens
+ task's stdio buffers are flushed
+
+ When exit(3) is called
+ calling task's atexit processing done
+ global libc state atexit processing done
+ (this will include any atexit routines installed by drivers)
+ executive is shutdown
+ causes a context switch back to bsp land
+
+
+NOTE:
+ libc extension are installed by bsp_libc_init()
+ iff we are using clock interrupts.
+ This hack is necessary to allow the tmtests to avoid
+ timing the extensions.
+
diff --git a/c/src/exec/libcsupport/src/__brk.c b/c/src/exec/libcsupport/src/__brk.c
new file mode 100644
index 0000000000..853ace5e02
--- /dev/null
+++ b/c/src/exec/libcsupport/src/__brk.c
@@ -0,0 +1,44 @@
+#if !defined(RTEMS_UNIX)
+
+/*
+ * RTEMS "Broken" __brk/__sbrk Implementation
+ *
+ * NOTE: sbrk is BSP provided.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#ifdef RTEMS_NEWLIB
+#include <reent.h>
+#endif
+#include <unistd.h>
+
+/* we use RTEMS for memory management. We don't need sbrk */
+
+void * __sbrk(int incr)
+{
+ errno = EINVAL;
+ return (void *)0;
+}
+
+int __brk( const void *endds )
+{
+ errno = EINVAL;
+ return -1;
+}
+
+#endif
diff --git a/c/src/exec/libcsupport/src/__gettod.c b/c/src/exec/libcsupport/src/__gettod.c
new file mode 100644
index 0000000000..1d80792446
--- /dev/null
+++ b/c/src/exec/libcsupport/src/__gettod.c
@@ -0,0 +1,103 @@
+#if !defined(RTEMS_UNIX)
+/*
+ * RTEMS gettimeofday Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#ifdef RTEMS_NEWLIB
+#include <sys/reent.h>
+#endif
+
+#include <time.h>
+#include <sys/time.h>
+
+#include <errno.h>
+#include <assert.h>
+
+/*
+ * NOTE: The solaris gettimeofday does not have a second parameter.
+ */
+
+int gettimeofday(
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ rtems_status_code status;
+ rtems_clock_time_value time;
+
+ if ( !tp ) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* "POSIX" does not seem to allow for not having a TOD */
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TIME_VALUE, &time );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ assert( 0 );
+ return -1;
+ }
+
+ tp->tv_sec = time.seconds;
+ tp->tv_usec = time.microseconds;
+
+ /*
+ * newlib does not have timezone and daylight savings time
+ * yet. When it does this needs to be fixed.
+ */
+
+#if 0
+ if ( tzp ) {
+ tzp->tz_minuteswest = 0; /* at UTC */
+ tzp->tz_dsttime = 0; /* no daylight savings */
+ tzp->minuteswest = timezone / 60; /* from seconds to minutes */
+ tzp->dsttime = daylight;
+ }
+#endif
+ return 0;
+}
+
+#if defined(RTEMS_NEWLIB)
+
+#if 0
+/*
+ * "Reentrant" version
+ */
+
+int _gettimeofday_r(
+ struct _reent *ignored_reentrancy_stuff,
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ return gettimeofday( tp, tzp );
+}
+#endif
+
+/*
+ * "System call" version
+ */
+
+int _gettimeofday(
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ return gettimeofday( tp, tzp );
+}
+
+#endif /* defined(RTEMS_NEWLIB) */
+
+#endif
diff --git a/c/src/exec/libcsupport/src/__times.c b/c/src/exec/libcsupport/src/__times.c
new file mode 100644
index 0000000000..fb46d0238d
--- /dev/null
+++ b/c/src/exec/libcsupport/src/__times.c
@@ -0,0 +1,65 @@
+/*
+ * RTEMS _times Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <sys/times.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <assert.h>
+
+clock_t _times(
+ struct tms *ptms
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks_since_boot;
+
+ if ( !ptms ) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* "POSIX" does not seem to allow for not having a TOD */
+ status = rtems_clock_get(
+ RTEMS_CLOCK_GET_TICKS_SINCE_BOOT,
+ &ticks_since_boot
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ assert( 0 );
+ return -1;
+ }
+
+ /*
+ * RTEMS has no notion of system versus user time and does
+ * not (as of 3.2.0) keep track of CPU usage on a per task basis.
+ */
+
+ ptms->tms_utime = ticks_since_boot;
+ ptms->tms_stime = 0;
+ ptms->tms_cutime = 0;
+ ptms->tms_cstime = 0;
+
+ return 0;
+}
+
+clock_t times(
+ struct tms *ptms
+)
+{
+ return _times( ptms );
+}
+
diff --git a/c/src/exec/libcsupport/src/assoc.c b/c/src/exec/libcsupport/src/assoc.c
new file mode 100644
index 0000000000..74387a8c5b
--- /dev/null
+++ b/c/src/exec/libcsupport/src/assoc.c
@@ -0,0 +1,260 @@
+/*
+ * assoc.c
+ * rtems assoc routines
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "assoc.h"
+
+#include <stdio.h> /* sprintf */
+#include <string.h> /* strcat, strcmp */
+
+#define STREQ(a,b) (strcmp((a), (b)) == 0)
+#define rtems_assoc_is_default(ap) ((ap)->name && STREQ(ap->name, RTEMS_ASSOC_DEFAULT_NAME))
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (strcmp(ap->name, name) == 0)
+ return ap;
+
+ return default_ap;
+}
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->local_value == local_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->remote_value == remote_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+/*
+ * Get values
+ */
+
+unsigned32
+rtems_assoc_remote_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_remote_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+/*
+ * what to return if a value is not found
+ * this is not reentrant, but it really shouldn't be invoked anyway
+ */
+
+const char *
+rtems_assoc_name_bad(
+ unsigned32 bad_value
+)
+{
+#ifdef RTEMS_DEBUG
+ static char bad_buffer[32];
+
+ sprintf(bad_buffer, "< %d [0x%x] >", bad_value, bad_value);
+#else
+ static char bad_buffer[32] = "<assoc.c: BAD NAME>";
+#endif
+ return bad_buffer;
+}
+
+
+const char *
+rtems_assoc_name_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(local_value);
+}
+
+const char *
+rtems_assoc_name_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(remote_value);
+}
+
+/*
+ * Bitfield functions assume just 1 bit set in each of remote and local
+ * entries; they do not check for this.
+ */
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ unsigned32 b;
+ unsigned32 remote_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & local_value)
+ remote_value |= rtems_assoc_remote_by_local(ap, b);
+
+ return remote_value;
+}
+
+
+unsigned32 rtems_assoc_local_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ unsigned32 b;
+ unsigned32 local_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & remote_value)
+ local_value |= rtems_assoc_local_by_remote(ap, b);
+
+ return local_value;
+}
+
+char *
+rtems_assoc_name_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_remote(ap, b));
+ }
+
+ return buffer;
+}
+
+char *
+rtems_assoc_name_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_local(ap, b));
+ }
+
+ return buffer;
+}
diff --git a/c/src/exec/libcsupport/src/error.c b/c/src/exec/libcsupport/src/error.c
new file mode 100644
index 0000000000..5bd481c3e6
--- /dev/null
+++ b/c/src/exec/libcsupport/src/error.c
@@ -0,0 +1,209 @@
+/*
+ * report errors and panics to RTEMS' stderr.
+ * Currently just used by RTEMS monitor.
+ *
+ * $Id$
+ */
+
+
+/*
+ * These routines provide general purpose error reporting.
+ * rtems_error reports an error to stderr and allows use of
+ * printf style formatting. A newline is appended to all messages.
+ *
+ * error_flag can be specified as any of the following:
+ *
+ * RTEMS_ERROR_ERRNO -- include errno text in output
+ * RTEMS_ERROR_PANIC -- halts local system after output
+ * RTEMS_ERROR_ABORT -- abort after output
+ *
+ * It can also include a rtems_status value which can be OR'd
+ * with the above flags. *
+ *
+ * EXAMPLE
+ * #include <rtems.h>
+ * #include <rtems/error.h>
+ * rtems_error(0, "stray interrupt %d", intr);
+ *
+ * EXAMPLE
+ * if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL)
+ * {
+ * rtems_error(status | RTEMS_ERROR_ABORT,
+ * "could not create task");
+ * }
+ *
+ * EXAMPLE
+ * if ((fd = open(pathname, O_RDNLY)) < 0)
+ * {
+ * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname);
+ * goto failed;
+ * }
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "error.h"
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h> /* _exit() */
+
+/* bug in hpux <errno.h>: no prototypes unless you are C++ */
+#ifdef hpux9
+char *strerror(int);
+#endif
+
+extern char *rtems_progname;
+int rtems_panic_in_progress;
+
+rtems_assoc_t rtems_status_assoc[] = {
+ { "successful completion", RTEMS_SUCCESSFUL, },
+ { "returned from a thread", RTEMS_TASK_EXITTED, },
+ { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, },
+ { "invalid object name", RTEMS_INVALID_NAME, },
+ { "invalid object id", RTEMS_INVALID_ID, },
+ { "too many", RTEMS_TOO_MANY, },
+ { "timed out waiting", RTEMS_TIMEOUT, },
+ { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, },
+ { "specified size was invalid", RTEMS_INVALID_SIZE, },
+ { "address specified is invalid", RTEMS_INVALID_ADDRESS, },
+ { "number was invalid", RTEMS_INVALID_NUMBER, },
+ { "item has not been initialized", RTEMS_NOT_DEFINED, },
+ { "resources still outstanding", RTEMS_RESOURCE_IN_USE, },
+ { "request not satisfied", RTEMS_UNSATISFIED, },
+ { "thread is in wrong state", RTEMS_INCORRECT_STATE, },
+ { "thread already in state", RTEMS_ALREADY_SUSPENDED, },
+ { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, },
+ { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, },
+ { "called from wrong environment", RTEMS_CALLED_FROM_ISR, },
+ { "invalid thread priority", RTEMS_INVALID_PRIORITY, },
+ { "invalid date/time", RTEMS_INVALID_CLOCK, },
+ { "invalid node id", RTEMS_INVALID_NODE, },
+ { "directive not configured", RTEMS_NOT_CONFIGURED, },
+ { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , },
+ { "directive not implemented", RTEMS_NOT_IMPLEMENTED, },
+ { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, },
+ { "could not get enough memory", RTEMS_NO_MEMORY, },
+ { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
+ { 0, 0, 0 },
+};
+
+
+const char *
+rtems_status_text(
+ rtems_status_code status
+)
+{
+ return rtems_assoc_name_by_local(rtems_status_assoc, status);
+}
+
+
+static int rtems_verror(
+ unsigned32 error_flag,
+ const char *printf_format,
+ va_list arglist
+)
+{
+ int local_errno = 0;
+ int chars_written = 0;
+ rtems_status_code status;
+
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_panic_in_progress++;
+
+ /* disable task switches */
+ _Thread_Disable_dispatch();
+
+ /* don't aggravate things */
+ if (rtems_panic_in_progress > 2)
+ return 0;
+ }
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ status = error_flag & ~RTEMS_ERROR_MASK;
+ if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
+ local_errno = errno;
+
+ if (_System_state_Is_multiprocessing)
+ fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
+
+ if (rtems_progname && *rtems_progname)
+ chars_written += fprintf(stderr, "%s: ", rtems_progname);
+ chars_written += vfprintf(stderr, printf_format, arglist);
+
+ if (status)
+ chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status));
+
+ if (local_errno)
+ if ((local_errno > 0) && *strerror(local_errno))
+ chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
+ else
+ chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
+
+ chars_written += fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT))
+ {
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_error(0, "fatal error, exiting");
+ _exit(local_errno);
+ }
+ else
+ {
+ rtems_error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+ return chars_written;
+}
+
+
+/*
+ * Report an error.
+ * error_flag is as above; printf_format is a normal
+ * printf(3) format string, with its concommitant arguments.
+ *
+ * Returns the number of characters written.
+ */
+
+int rtems_error(
+ int error_flag,
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+ int chars_written;
+
+ va_start(arglist, printf_format);
+ chars_written = rtems_verror(error_flag, printf_format, arglist);
+ va_end(arglist);
+
+ return chars_written;
+}
+
+/*
+ * rtems_panic is shorthand for rtems_error(RTEMS_ERROR_PANIC, ...)
+ */
+
+void rtems_panic(
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+
+ va_start(arglist, printf_format);
+ (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
+ va_end(arglist);
+}
diff --git a/c/src/exec/libcsupport/src/hosterr.c b/c/src/exec/libcsupport/src/hosterr.c
new file mode 100644
index 0000000000..7c0838a2e0
--- /dev/null
+++ b/c/src/exec/libcsupport/src/hosterr.c
@@ -0,0 +1,43 @@
+/*
+ * Routines to access a host errno
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <errno.h>
+
+int host_errno(void);
+
+/*
+ * copy host errno, if any to thread aware errno, if any
+ */
+
+void fix_syscall_errno(void)
+{
+ errno = host_errno();
+}
+
+/*
+ * Get the host system errno, if any
+ * When using newlib (or possibly other libc's) on top of UNIX
+ * the errno returned by system calls may be unavailable due
+ * to trickery of making errno thread aware.
+ * This provides a kludge of getting at it.
+ */
+
+#undef errno
+extern int errno;
+int host_errno(void)
+{
+ return errno;
+}
+
diff --git a/c/src/exec/libcsupport/src/libio.c b/c/src/exec/libcsupport/src/libio.c
new file mode 100644
index 0000000000..ec10184a10
--- /dev/null
+++ b/c/src/exec/libcsupport/src/libio.c
@@ -0,0 +1,532 @@
+/*
+ * Provide UNIX/POSIX-like io system calls for RTEMS using the
+ * RTEMS IO manager
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/assoc.h> /* assoc.h not included by rtems.h */
+
+#include <stdio.h> /* O_RDONLY, et.al. */
+#include <fcntl.h> /* O_RDONLY, et.al. */
+#include <assert.h>
+
+#if ! defined(O_NDELAY)
+# if defined(solaris2)
+# define O_NDELAY O_NONBLOCK
+# elif defined(RTEMS_NEWLIB)
+# define O_NDELAY _FNBIO
+# endif
+#endif
+
+
+#include <errno.h>
+#include <string.h> /* strcmp */
+#include <unistd.h>
+#include <stdlib.h> /* calloc() */
+
+#include "libio.h" /* libio.h not pulled in by rtems */
+
+/*
+ * Semaphore to protect the io table
+ */
+
+Objects_Id rtems_libio_semaphore;
+
+#define RTEMS_LIBIO_SEM rtems_build_name('L', 'B', 'I', 'O')
+#define RTEMS_LIBIO_IOP_SEM(n) rtems_build_name('L', 'B', 'I', n)
+
+unsigned32 rtems_libio_number_iops;
+rtems_libio_t *rtems_libio_iops;
+rtems_libio_t *rtems_libio_last_iop;
+
+#define rtems_libio_iop(fd) ((((unsigned32)(fd)) < rtems_libio_number_iops) ? \
+ &rtems_libio_iops[fd] : 0)
+
+#define rtems_libio_check_fd(fd) \
+ do { \
+ if ((unsigned32) (fd) >= rtems_libio_number_iops) \
+ { \
+ errno = EBADF; \
+ return -1; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_buffer(buffer) \
+ do { \
+ if ((buffer) == 0) \
+ { \
+ errno = EINVAL; \
+ return -1; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_count(count) \
+ do { \
+ if ((count) == 0) \
+ { \
+ return 0; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_permissions(iop, flag) \
+ do { \
+ if (((iop)->flags & (flag)) == 0) \
+ { \
+ errno = EINVAL; \
+ return -1; \
+ } \
+ } while (0)
+
+/*
+ * External I/O handlers
+ *
+ * Space for all possible handlers is preallocated
+ * to speed up dispatch to external handlers.
+ */
+
+static rtems_libio_handler_t handlers[15];
+
+void
+rtems_register_libio_handler(
+ int handler_flag,
+ const rtems_libio_handler_t *handler
+)
+{
+ int handler_index = rtems_file_descriptor_type_index(handler_flag);
+
+ if ((handler_index < 0) || (handler_index >= 15))
+ rtems_fatal_error_occurred( RTEMS_INVALID_NUMBER );
+ handlers[handler_index] = *handler;
+}
+
+
+void
+rtems_libio_config(
+ rtems_configuration_table *config,
+ unsigned32 max_fds
+)
+{
+ rtems_libio_number_iops = max_fds;
+
+ /*
+ * tweak config to reflect # of semaphores we will need
+ */
+
+ /* one for iop table */
+ config->RTEMS_api_configuration->maximum_semaphores += 1;
+ config->RTEMS_api_configuration->maximum_semaphores += max_fds;
+}
+
+/*
+ * Called by bsp startup code to init the libio area.
+ */
+
+void
+rtems_libio_init(void)
+{
+ rtems_status_code rc;
+
+ if (rtems_libio_number_iops > 0)
+ {
+ rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
+ sizeof(rtems_libio_t));
+ if (rtems_libio_iops == NULL)
+ rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
+
+ rtems_libio_last_iop = rtems_libio_iops + (rtems_libio_number_iops - 1);
+ }
+
+ rc = rtems_semaphore_create(
+ RTEMS_LIBIO_SEM,
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &rtems_libio_semaphore
+ );
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+}
+
+/*
+ * Convert RTEMS status to a UNIX errno
+ */
+
+rtems_assoc_t errno_assoc[] = {
+ { "OK", RTEMS_SUCCESSFUL, 0 },
+ { "TIMEOUT", RTEMS_TIMEOUT, ETIME },
+ { "NO MEMORY", RTEMS_NO_MEMORY, ENOMEM },
+ { "NO DEVICE", RTEMS_UNSATISFIED, ENOSYS },
+ { 0, 0, 0 },
+};
+
+static unsigned32
+rtems_libio_errno(rtems_status_code code)
+{
+ int rc;
+
+ if ((rc = rtems_assoc_remote_by_local(errno_assoc, (unsigned32) code)))
+ {
+ errno = rc;
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * Convert UNIX fnctl(2) flags to ones that RTEMS drivers understand
+ */
+
+rtems_assoc_t access_modes_assoc[] = {
+ { "READ", LIBIO_FLAGS_READ, O_RDONLY },
+ { "WRITE", LIBIO_FLAGS_WRITE, O_WRONLY },
+ { "READ/WRITE", LIBIO_FLAGS_READ_WRITE, O_RDWR },
+ { 0, 0, 0 },
+};
+
+rtems_assoc_t status_flags_assoc[] = {
+ { "NO DELAY", LIBIO_FLAGS_NO_DELAY, O_NDELAY },
+ { "APPEND", LIBIO_FLAGS_APPEND, O_APPEND },
+ { "CREATE", LIBIO_FLAGS_CREATE, O_CREAT },
+ { 0, 0, 0 },
+};
+
+static unsigned32
+rtems_libio_fcntl_flags(unsigned32 fcntl_flags)
+{
+ unsigned32 flags = 0;
+ unsigned32 access_modes;
+
+ /*
+ * Access mode is a small integer
+ */
+
+ access_modes = fcntl_flags & O_ACCMODE;
+ fcntl_flags &= ~O_ACCMODE;
+ flags = rtems_assoc_local_by_remote(access_modes_assoc, access_modes);
+
+ /*
+ * Everything else is single bits
+ */
+
+ flags |= rtems_assoc_local_by_remote_bitfield(status_flags_assoc, fcntl_flags);
+ return flags;
+}
+
+
+static rtems_libio_t *
+rtems_libio_allocate(void)
+{
+ rtems_libio_t *iop;
+ rtems_status_code rc;
+
+ rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+
+ for (iop = rtems_libio_iops; iop <= rtems_libio_last_iop; iop++)
+ if ((iop->flags & LIBIO_FLAGS_OPEN) == 0)
+ {
+ /*
+ * Got one; create a semaphore for it
+ */
+
+ rc = rtems_semaphore_create(
+ RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops),
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &iop->sem
+ );
+ if (rc != RTEMS_SUCCESSFUL)
+ goto failed;
+
+ iop->flags = LIBIO_FLAGS_OPEN;
+ goto done;
+ }
+
+failed:
+ iop = 0;
+
+done:
+ rtems_semaphore_release(rtems_libio_semaphore);
+ return iop;
+}
+
+static void
+rtems_libio_free(rtems_libio_t *iop)
+{
+ rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+
+ if (iop->sem)
+ rtems_semaphore_delete(iop->sem);
+ (void) memset(iop, 0, sizeof(*iop));
+
+ rtems_semaphore_release(rtems_libio_semaphore);
+}
+
+int
+__rtems_open(
+ const char *pathname,
+ unsigned32 flag,
+ unsigned32 mode)
+{
+ rtems_status_code rc;
+ rtems_libio_t *iop = 0;
+ rtems_driver_name_t *np;
+ rtems_libio_open_close_args_t args;
+
+ /*
+ * Additional external I/O handlers would be supported by
+ * adding code to pick apart the pathname appropriately.
+ * The networking code does not require changes here since
+ * network file descriptors are obtained using socket(), not
+ * open().
+ */
+
+ if ((rc = rtems_io_lookup_name(pathname, &np)) != RTEMS_SUCCESSFUL)
+ goto done;
+
+ iop = rtems_libio_allocate();
+ if (iop == 0)
+ {
+ rc = RTEMS_TOO_MANY;
+ goto done;
+ }
+
+ iop->driver = np;
+ iop->pathname = (char *) pathname;
+ iop->flags |= rtems_libio_fcntl_flags(flag);
+
+ args.iop = iop;
+ args.flags = iop->flags;
+ args.mode = mode;
+
+ rc = rtems_io_open(np->major, np->minor, (void *) &args);
+
+done:
+
+ if (rc != RTEMS_SUCCESSFUL)
+ {
+ if (iop)
+ rtems_libio_free(iop);
+ return rtems_libio_errno(rc);
+ }
+
+ return iop - rtems_libio_iops;
+}
+
+int
+__rtems_close(
+ int fd
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_open_close_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].close;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.flags = 0;
+ args.mode = 0;
+
+ rc = rtems_io_close(np->major, np->minor, (void *) &args);
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+ return 0;
+}
+
+int
+__rtems_read(
+ int fd,
+ void * buffer,
+ unsigned32 count
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_rw_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, void *buffer, unsigned32 count);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].read;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, buffer, count);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+ rtems_libio_check_buffer(buffer);
+ rtems_libio_check_count(count);
+ rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ rc = rtems_io_read(np->major, np->minor, (void *) &args);
+
+ iop->offset += args.bytes_moved;
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.bytes_moved;
+}
+
+int
+__rtems_write(
+ int fd,
+ const void *buffer,
+ unsigned32 count
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_rw_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, const void *buffer, unsigned32 count);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].write;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, buffer, count);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+ rtems_libio_check_buffer(buffer);
+ rtems_libio_check_count(count);
+ rtems_libio_check_permissions(iop, LIBIO_FLAGS_WRITE);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = (void *) buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ rc = rtems_io_write(np->major, np->minor, (void *) &args);
+
+ iop->offset += args.bytes_moved;
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.bytes_moved;
+}
+
+int
+__rtems_ioctl(
+ int fd,
+ unsigned32 command,
+ void * buffer)
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_ioctl_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, unsigned32 command, void *buffer);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].ioctl;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, command, buffer);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.command = command;
+ args.buffer = buffer;
+
+ rc = rtems_io_control(np->major, np->minor, (void *) &args);
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.ioctl_return;
+}
+
+/*
+ * internal only??
+ */
+
+
+int
+__rtems_lseek(
+ int fd,
+ rtems_libio_offset_t offset,
+ int whence
+ )
+{
+ rtems_libio_t *iop;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, rtems_libio_offset_t offset, int whence);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].lseek;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, offset, whence);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ switch (whence)
+ {
+ case SEEK_SET:
+ iop->offset = offset;
+ break;
+
+ case SEEK_CUR:
+ iop->offset += offset;
+ break;
+
+ case SEEK_END:
+ iop->offset = iop->size - offset;
+ break;
+
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+}
diff --git a/c/src/exec/libcsupport/src/malloc.c b/c/src/exec/libcsupport/src/malloc.c
new file mode 100644
index 0000000000..580cb97da1
--- /dev/null
+++ b/c/src/exec/libcsupport/src/malloc.c
@@ -0,0 +1,400 @@
+/*
+ * RTEMS Malloc Family Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "libcsupport.h"
+#ifdef RTEMS_NEWLIB
+#include <sys/reent.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h> /* sbrk(2) */
+
+rtems_id RTEMS_Malloc_Heap;
+size_t RTEMS_Malloc_Sbrk_amount;
+
+#ifdef RTEMS_DEBUG
+#define MALLOC_STATS
+#define MALLOC_DIRTY
+#endif
+
+#ifdef MALLOC_STATS
+#define MSBUMP(f,n) rtems_malloc_stats.f += (n)
+
+struct {
+ unsigned32 space_available; /* current size of malloc area */
+ unsigned32 malloc_calls; /* # calls to malloc */
+ unsigned32 free_calls;
+ unsigned32 realloc_calls;
+ unsigned32 calloc_calls;
+ unsigned32 max_depth; /* most ever malloc'd at 1 time */
+ unsigned64 lifetime_allocated;
+ unsigned64 lifetime_freed;
+} rtems_malloc_stats;
+
+#else /* No rtems_malloc_stats */
+#define MSBUMP(f,n)
+#endif
+
+void RTEMS_Malloc_Initialize(
+ void *start,
+ size_t length,
+ size_t sbrk_amount
+)
+{
+ rtems_status_code status;
+ void *starting_address;
+ rtems_unsigned32 old_address;
+ rtems_unsigned32 u32_address;
+
+ /*
+ * If the starting address is 0 then we are to attempt to
+ * get length worth of memory using sbrk. Make sure we
+ * align the address that we get back.
+ */
+
+ starting_address = start;
+ RTEMS_Malloc_Sbrk_amount = sbrk_amount;
+
+ if (!starting_address) {
+ u32_address = (unsigned int)sbrk(length);
+
+ if (u32_address == -1) {
+ rtems_fatal_error_occurred( RTEMS_NO_MEMORY );
+ /* DOES NOT RETURN!!! */
+ }
+
+ if (u32_address & (CPU_ALIGNMENT-1)) {
+ old_address = u32_address;
+ u32_address = (u32_address + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /*
+ * adjust the length by whatever we aligned by
+ */
+
+ length -= u32_address - old_address;
+ }
+
+ starting_address = (void *)u32_address;
+ }
+
+ /*
+ * Unfortunately we cannot use assert if this fails because if this
+ * has failed we do not have a heap and if we do not have a heap
+ * STDIO cannot work because there will be no buffers.
+ */
+
+ status = rtems_region_create(
+ rtems_build_name( 'H', 'E', 'A', 'P' ),
+ starting_address,
+ length,
+ CPU_ALIGNMENT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &RTEMS_Malloc_Heap
+ );
+ if ( status != RTEMS_SUCCESSFUL )
+ rtems_fatal_error_occurred( status );
+
+#ifdef MALLOC_STATS
+ /* zero all the stats */
+ (void) memset(&rtems_malloc_stats, 0, sizeof(rtems_malloc_stats));
+#endif
+
+ MSBUMP(space_available, length);
+}
+
+#ifdef RTEMS_NEWLIB
+void *malloc(
+ size_t size
+)
+{
+ void *return_this;
+ void *starting_address;
+ rtems_unsigned32 the_size;
+ rtems_unsigned32 sbrk_amount;
+ rtems_status_code status;
+
+ MSBUMP(malloc_calls, 1);
+
+ if ( !size )
+ return (void *) 0;
+
+ /*
+ * Try to give a segment in the current region if there is not
+ * enough space then try to grow the region using rtems_region_extend().
+ * If this fails then return a NULL pointer.
+ */
+
+ status = rtems_region_get_segment(
+ RTEMS_Malloc_Heap,
+ size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &return_this
+ );
+
+ if ( status != RTEMS_SUCCESSFUL ) {
+ /*
+ * Round to the "requested sbrk amount" so hopefully we won't have
+ * to grow again for a while. This effectively does sbrk() calls
+ * in "page" amounts.
+ */
+
+ sbrk_amount = RTEMS_Malloc_Sbrk_amount;
+
+ if ( sbrk_amount == 0 )
+ return (void *) 0;
+
+ the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
+
+ if (((rtems_unsigned32)starting_address = (void *)sbrk(the_size)) == -1)
+ return (void *) 0;
+
+ status = rtems_region_extend(
+ RTEMS_Malloc_Heap,
+ starting_address,
+ the_size
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ sbrk(-the_size);
+ errno = ENOMEM;
+ return (void *) 0;
+ }
+
+ MSBUMP(space_available, the_size);
+
+ status = rtems_region_get_segment(
+ RTEMS_Malloc_Heap,
+ size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &return_this
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = ENOMEM;
+ return (void *) 0;
+ }
+ }
+
+#ifdef MALLOC_STATS
+ if (return_this)
+ {
+ unsigned32 actual_size;
+ unsigned32 current_depth;
+ status = rtems_region_get_segment_size(RTEMS_Malloc_Heap, return_this, &actual_size);
+ MSBUMP(lifetime_allocated, actual_size);
+ current_depth = rtems_malloc_stats.lifetime_allocated - rtems_malloc_stats.lifetime_freed;
+ if (current_depth > rtems_malloc_stats.max_depth)
+ rtems_malloc_stats.max_depth = current_depth;
+ }
+#endif
+
+#ifdef MALLOC_DIRTY
+ (void) memset(return_this, 0xCF, size);
+#endif
+
+ return return_this;
+}
+
+void *calloc(
+ size_t nelem,
+ size_t elsize
+)
+{
+ register char *cptr;
+ int length;
+
+ MSBUMP(calloc_calls, 1);
+
+ length = nelem * elsize;
+ cptr = malloc( length );
+ if ( cptr )
+ memset( cptr, '\0', length );
+
+ MSBUMP(malloc_calls, -1); /* subtract off the malloc */
+
+ return cptr;
+}
+
+void *realloc(
+ void *ptr,
+ size_t size
+)
+{
+ rtems_unsigned32 old_size;
+ rtems_status_code status;
+ char *new_area;
+
+ MSBUMP(realloc_calls, 1);
+
+ if ( !ptr )
+ return malloc( size );
+
+ if ( !size ) {
+ free( ptr );
+ return (void *) 0;
+ }
+
+ new_area = malloc( size );
+
+ MSBUMP(malloc_calls, -1); /* subtract off the malloc */
+
+ if ( !new_area ) {
+ free( ptr );
+ return (void *) 0;
+ }
+
+ status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = EINVAL;
+ return (void *) 0;
+ }
+
+ memcpy( new_area, ptr, (size < old_size) ? size : old_size );
+ free( ptr );
+
+ return new_area;
+
+}
+
+void free(
+ void *ptr
+)
+{
+ rtems_status_code status;
+
+ MSBUMP(free_calls, 1);
+
+ if ( !ptr )
+ return;
+
+#ifdef MALLOC_STATS
+ {
+ unsigned32 size;
+ status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &size );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ MSBUMP(lifetime_freed, size);
+ }
+ }
+#endif
+
+ status = rtems_region_return_segment( RTEMS_Malloc_Heap, ptr );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = EINVAL;
+ assert( 0 );
+ }
+}
+/* end if RTEMS_NEWLIB */
+#endif
+
+#ifdef MALLOC_STATS
+/*
+ * Dump the malloc statistics
+ * May be called via atexit() (installable by our bsp) or
+ * at any time by user
+ */
+
+void malloc_dump(void)
+{
+ unsigned32 allocated = rtems_malloc_stats.lifetime_allocated - rtems_malloc_stats.lifetime_freed;
+
+ printf("Malloc stats\n");
+ printf(" avail:%uk allocated:%uk (%d%%) max:%uk (%d%%) lifetime:%Luk freed:%Luk\n",
+ (unsigned int) rtems_malloc_stats.space_available / 1024,
+ (unsigned int) allocated / 1024,
+ /* avoid float! */
+ (allocated * 100) / rtems_malloc_stats.space_available,
+ (unsigned int) rtems_malloc_stats.max_depth / 1024,
+ (rtems_malloc_stats.max_depth * 100) / rtems_malloc_stats.space_available,
+ (unsigned64) rtems_malloc_stats.lifetime_allocated / 1024,
+ (unsigned64) rtems_malloc_stats.lifetime_freed / 1024);
+ printf(" Call counts: malloc:%d free:%d realloc:%d calloc:%d\n",
+ rtems_malloc_stats.malloc_calls,
+ rtems_malloc_stats.free_calls,
+ rtems_malloc_stats.realloc_calls,
+ rtems_malloc_stats.calloc_calls);
+}
+
+
+void malloc_walk(size_t source, size_t printf_enabled)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+
+ the_region = _Region_Get( RTEMS_Malloc_Heap, &location );
+ if ( location == OBJECTS_LOCAL )
+ {
+ _Heap_Walk( &the_region->Memory, source, printf_enabled );
+ _Thread_Enable_dispatch();
+ }
+}
+
+#else
+
+void malloc_dump(void)
+{
+ return;
+}
+
+void malloc_walk(size_t source, size_t printf_enabled)
+{
+ return;
+}
+
+#endif
+
+/*
+ * "Reentrant" versions of the above routines implemented above.
+ */
+
+#ifdef RTEMS_NEWLIB
+void *malloc_r(
+ struct _reent *ignored,
+ size_t size
+)
+{
+ return malloc( size );
+}
+
+void *calloc_r(
+ size_t nelem,
+ size_t elsize
+)
+{
+ return calloc( nelem, elsize );
+}
+
+void *realloc_r(
+ void *ptr,
+ size_t size
+)
+{
+ return realloc_r( ptr, size );
+}
+
+void free_r(
+ void *ptr
+)
+{
+ free( ptr );
+}
+#endif
+
diff --git a/c/src/exec/libcsupport/src/newlibc.c b/c/src/exec/libcsupport/src/newlibc.c
new file mode 100644
index 0000000000..ac8b146a48
--- /dev/null
+++ b/c/src/exec/libcsupport/src/newlibc.c
@@ -0,0 +1,430 @@
+
+/*
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Description:
+ * Implementation of hooks for the CYGNUS newlib libc
+ * These hooks set things up so that:
+ * '_REENT' is switched at task switch time.
+ *
+ *
+ * TODO:
+ *
+ * NOTE:
+ *
+ * $Id$
+ *
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#if defined(RTEMS_NEWLIB)
+#include <libcsupport.h>
+#include <stdlib.h> /* for free() */
+#include <string.h> /* for memset() */
+
+#include <sys/reent.h> /* for extern of _REENT (aka _impure_ptr) */
+#include <errno.h>
+
+/*
+ * NOTE: When using RTEMS fake stat, fstat, and isatty, all output
+ * is line buffered so this setvbuf is not necessary. This
+ * setvbuf insures that we can redirect the output of a test
+ * on the UNIX simulator and it is in the same order as for a
+ * real target.
+ * NOTE:
+ * There is some problem with doing this on the hpux version
+ * of the UNIX simulator (symptom is printf core dumps), so
+ * we just don't for now.
+ * Not sure if this is a problem with hpux, newlib, or something else.
+ */
+
+#if defined(RTEMS_UNIX) && !defined(hpux)
+#define NEED_SETVBUF
+#endif
+
+#ifdef NEED_SETVBUF
+#include <stdio.h>
+#endif
+
+#include "internal.h"
+
+#define LIBC_NOTEPAD RTEMS_NOTEPAD_LAST
+
+
+int libc_reentrant; /* do we think we are reentrant? */
+struct _reent libc_global_reent = _REENT_INIT(libc_global_reent);
+
+/*
+ * CYGNUS newlib routine that does atexit() processing and flushes
+ * stdio streams
+ * undocumented
+ */
+
+extern void _wrapup_reent(struct _reent *);
+extern void _reclaim_reent(struct _reent *);
+
+void
+libc_wrapup(void)
+{
+ /*
+ * In case RTEMS is already down, don't do this. It could be
+ * dangerous.
+ */
+
+ if (!_System_state_Is_up(_System_state_Get()))
+ return;
+
+ _wrapup_reent(0);
+ if (_REENT != &libc_global_reent)
+ {
+ _wrapup_reent(&libc_global_reent);
+#if 0
+ /* don't reclaim this one, just in case we do printfs */
+ /* on our way out to ROM */
+ _reclaim_reent(&libc_global_reent);
+#endif
+ _REENT = &libc_global_reent;
+ }
+}
+
+
+rtems_boolean
+libc_create_hook(rtems_tcb *current_task,
+ rtems_tcb *creating_task)
+{
+ MY_task_set_note(creating_task, LIBC_NOTEPAD, 0);
+ return TRUE;
+}
+
+/*
+ * Called for all user TASKS (system tasks are MPCI Receive Server and IDLE)
+ */
+
+rtems_extension
+libc_start_hook(rtems_tcb *current_task,
+ rtems_tcb *starting_task)
+{
+ struct _reent *ptr;
+
+ /* NOTE: our malloc is reentrant without a reent ptr since
+ * it is based on region manager
+ */
+
+ ptr = (struct _reent *) calloc(1, sizeof(struct _reent));
+
+ if (!ptr)
+ rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
+
+#ifdef __GNUC__
+ /* GCC extension: structure constants */
+ *ptr = (struct _reent) _REENT_INIT((*ptr));
+#else
+ /*
+ * Warning: THIS IS VERY DEPENDENT ON NEWLIB!!! WRITTEN FOR 1.7.0
+ */
+ ptr->_errno=0;
+ ptr->_stdin=&ptr->__sf[0];
+ ptr->_stdout=&ptr->__sf[1];
+ ptr->_stderr=&ptr->__sf[2];
+ ptr->_scanpoint=0;
+ ptr->_asctime[0]=0;
+ ptr->_next=1;
+ ptr->__sdidinit=0;
+#endif
+
+ MY_task_set_note(starting_task, LIBC_NOTEPAD, (rtems_unsigned32) ptr);
+}
+
+/*
+ * Called for all user TASKS (system tasks are MPCI Receive Server and IDLE)
+ *
+ * NOTE: When using RTEMS fake stat, fstat, and isatty, all output
+ * is line buffered so this setvbuf is not necessary. This
+ * setvbuf insures that we can redirect the output of a test
+ * on the UNIX simulator and it is in the same order as for a
+ * real target.
+ */
+
+#ifdef NEED_SETVBUF
+rtems_extension
+libc_begin_hook(rtems_tcb *current_task)
+{
+ setvbuf( stdout, NULL, _IOLBF, BUFSIZ );
+}
+#endif
+
+rtems_extension
+libc_switch_hook(rtems_tcb *current_task,
+ rtems_tcb *heir_task)
+{
+ rtems_unsigned32 impure_value;
+
+ /* XXX We can't use rtems_task_set_note() here since SYSI task has a
+ * tid of 0, which is treated specially (optimized, actually)
+ * by rtems_task_set_note
+ *
+ * NOTE: The above comment is no longer true and we need to use
+ * the extension data areas added about the same time.
+ */
+
+ /*
+ * Don't touch the outgoing task if it has been deleted.
+ */
+
+ if ( !_States_Is_transient( current_task->current_state ) ) {
+ impure_value = (rtems_unsigned32) _REENT;
+ MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value);
+ }
+
+ _REENT = (struct _reent *) MY_task_get_note(heir_task, LIBC_NOTEPAD);
+
+}
+
+/*
+ * Function: libc_delete_hook
+ * Created: 94/12/10
+ *
+ * Description:
+ * Called when a task is deleted.
+ * Must restore the new lib reentrancy state for the new current
+ * task.
+ *
+ * Parameters:
+ *
+ *
+ * Returns:
+ *
+ *
+ * Side Effects:
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+rtems_extension
+libc_delete_hook(rtems_tcb *current_task,
+ rtems_tcb *deleted_task)
+{
+ struct _reent *ptr;
+
+ /*
+ * The reentrancy structure was allocated by newlib using malloc()
+ */
+
+ if (current_task == deleted_task)
+ {
+ ptr = _REENT;
+ }
+ else
+ {
+ ptr = (struct _reent *) MY_task_get_note(deleted_task, LIBC_NOTEPAD);
+ }
+
+ /* if (ptr) */
+ if (ptr && ptr != &libc_global_reent)
+ {
+ _wrapup_reent(ptr);
+ _reclaim_reent(ptr);
+ free(ptr);
+ }
+
+ MY_task_set_note(deleted_task, LIBC_NOTEPAD, 0);
+
+ /*
+ * Require the switch back to another task to install its own
+ */
+
+ if (current_task == deleted_task)
+ {
+ _REENT = 0;
+ }
+}
+
+/*
+ * Function: libc_init
+ * Created: 94/12/10
+ *
+ * Description:
+ * Init libc for CYGNUS newlib
+ * Set up _REENT to use our global libc_global_reent.
+ * (newlib provides a global of its own, but we prefer our
+ * own name for it)
+ *
+ * If reentrancy is desired (which it should be), then
+ * we install the task extension hooks to maintain the
+ * newlib reentrancy global variable _REENT on task
+ * create, delete, switch, exit, etc.
+ *
+ * Parameters:
+ * reentrant non-zero if reentrant library desired.
+ *
+ * Returns:
+ *
+ * Side Effects:
+ * installs libc extensions if reentrant.
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ */
+
+void
+libc_init(int reentrant)
+{
+ rtems_extensions_table libc_extension;
+ rtems_id extension_id;
+ rtems_status_code rc;
+
+ _REENT = &libc_global_reent;
+
+ if (reentrant)
+ {
+ memset(&libc_extension, 0, sizeof(libc_extension));
+
+ libc_extension.thread_create = libc_create_hook;
+ libc_extension.thread_start = libc_start_hook;
+#ifdef NEED_SETVBUF
+ libc_extension.thread_begin = libc_begin_hook;
+#endif
+ 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);
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+
+ libc_reentrant = reentrant;
+ }
+}
+
+#if 0
+/*
+ * Routines required by the gnat runtime.
+ */
+
+int get_errno()
+{
+ return errno;
+}
+#endif
+
+/*
+ * Function: _exit
+ * Created: 94/12/10
+ *
+ * Description:
+ * Called from exit() after it does atexit() processing and stdio fflush's
+ *
+ * called from bottom of exit() to really delete the task.
+ * If we are using reentrant libc, then let the delete extension
+ * do all the work, otherwise if a shutdown is in progress,
+ * then just do it.
+ *
+ * Parameters:
+ * exit status
+ *
+ * Returns:
+ * does not return
+ *
+ * Side Effects:
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+#include <stdio.h>
+
+/* #if !defined(RTEMS_UNIX) && !defined(__GO32__) && !defined(_AM29K) */
+#if !defined(RTEMS_UNIX) && !defined(_AM29K)
+void _exit(int status)
+{
+ rtems_shutdown_executive(status);
+}
+
+#else
+
+void exit(int status)
+{
+ libc_wrapup();
+ rtems_shutdown_executive(status);
+}
+#endif
+
+
+/*
+ * These are directly supported (and completely correct) in the posix api.
+ */
+
+#if !defined(RTEMS_POSIX_API)
+pid_t __getpid(void)
+{
+ return 0;
+}
+#endif
+
+/* #if !defined(RTEMS_POSIX_API) || defined(__GO32__) */
+#if !defined(RTEMS_POSIX_API)
+pid_t getpid(void)
+{
+ return __getpid();
+}
+#endif
+
+/* #if !defined(RTEMS_POSIX_API) || defined(__GO32__) */
+#if !defined(RTEMS_POSIX_API)
+int kill( pid_t pid, int sig )
+{
+ return 0;
+}
+#endif
+
+int __kill( pid_t pid, int sig )
+{
+ return 0;
+}
+
+#if !defined(RTEMS_POSIX_API)
+unsigned int sleep(
+ unsigned int seconds
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks_per_second;
+ rtems_interval ticks;
+
+ status = rtems_clock_get(
+ RTEMS_CLOCK_GET_TICKS_PER_SECOND,
+ &ticks_per_second
+ );
+
+ ticks = seconds * ticks_per_second;
+
+ status = rtems_task_wake_after( ticks );
+
+ /*
+ * Returns the "unslept" amount of time. In RTEMS signals are not
+ * interruptable, so tasks really sleep all of the requested time.
+ */
+
+ return 0;
+}
+#endif
+
+
+#endif
diff --git a/c/src/exec/libcsupport/src/no_libc.c b/c/src/exec/libcsupport/src/no_libc.c
new file mode 100644
index 0000000000..19c9ac836d
--- /dev/null
+++ b/c/src/exec/libcsupport/src/no_libc.c
@@ -0,0 +1,55 @@
+
+/* no_libc.h
+ *
+ * This file contains stubs for the reentrancy hooks when
+ * an unknown C library is used.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#if !defined(RTEMS_NEWLIB) && !defined(RTEMS_UNIX)
+
+#include "libcsupport.h"
+#include "internal.h"
+
+#include <stdlib.h> /* for free() */
+
+void
+libc_init(int reentrant)
+{
+}
+
+void libc_suspend_main(void)
+{
+}
+
+
+void libc_global_exit(rtems_unsigned32 code)
+{
+}
+
+void _exit(int status)
+{
+}
+
+#else
+
+/* remove ANSI errors.
+ * A program must contain at least one external-declaration
+ * (X3.159-1989 p.82,L3).
+ */
+void no_libc_dummy_function( void )
+{
+}
+
+#endif
diff --git a/c/src/exec/libcsupport/src/unixlibc.c b/c/src/exec/libcsupport/src/unixlibc.c
new file mode 100644
index 0000000000..3e757e313d
--- /dev/null
+++ b/c/src/exec/libcsupport/src/unixlibc.c
@@ -0,0 +1,23 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#if defined(RTEMS_UNIXLIB)
+
+void libc_init(int reentrant)
+{
+}
+
+#else
+
+/* remove ANSI errors.
+ * A program must contain at least one external-declaration
+ * (X3.159-1989 p.82,L3).
+ */
+void unixlibc_dummy_function( void )
+{
+}
+
+#endif
diff --git a/c/src/exec/libcsupport/src/utsname.c b/c/src/exec/libcsupport/src/utsname.c
new file mode 100644
index 0000000000..7fba3d610f
--- /dev/null
+++ b/c/src/exec/libcsupport/src/utsname.c
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <sys/utsname.h>
+
+#include <rtems/system.h>
+#include <rtems/score/system.h>
+#include <rtems/score/object.h>
+
+/*PAGE
+ *
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+)
+{
+ /* XXX: Here is what Solaris returns...
+ sysname = SunOS
+ nodename = node_name
+ release = 5.3
+ version = Generic_101318-12
+ machine = sun4m
+ */
+
+ strcpy( name->sysname, "RTEMS" );
+
+ sprintf( name->nodename, "Node %d\n", _Objects_Local_node );
+
+ /* XXX release string is in BAD format for this routine!!! */
+ strcpy( name->release, "3.2.0" );
+
+ /* XXX does this have any meaning for RTEMS */
+
+ strcpy( name->release, "" );
+
+ sprintf( name->machine, "%s/%s", CPU_NAME, CPU_MODEL_NAME );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/exec/posix/Makefile.in b/c/src/exec/posix/Makefile.in
new file mode 100644
index 0000000000..c2b64184d4
--- /dev/null
+++ b/c/src/exec/posix/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=base sys headers $(INLINE) optman src
diff --git a/c/src/exec/posix/base/Makefile.in b/c/src/exec/posix/base/Makefile.in
new file mode 100644
index 0000000000..d11541a321
--- /dev/null
+++ b/c/src/exec/posix/base/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#H_PIECES= aio devctl intr limits mqueue pthread sched semaphore \
+# signal time unistd
+H_PIECES= pthread sched
+# limits.h may have been moved into newlib -- check before removing it
+# from the cvs tree
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/
diff --git a/c/src/exec/posix/base/aio.h b/c/src/exec/posix/base/aio.h
new file mode 100644
index 0000000000..504559c857
--- /dev/null
+++ b/c/src/exec/posix/base/aio.h
@@ -0,0 +1,137 @@
+/* aio.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_ASYNCHRONOUS_IO_h
+#define __POSIX_ASYNCHRONOUS_IO_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_ASYNCHRONOUS_IO)
+
+/*
+ * 6.7.1 Data Definitions for Asynchronous Input and Output,
+ * P1003.1b-1993, p. 151
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <time.h>
+#include <fcntl.h>
+
+/*
+ * 6.7.1.2 Manifest Constants, P1003.1b-1993, p. 153
+ */
+
+#define AIO_CANCELED 0 /* all requested operations have been canceled */
+#define AIO_NOTCANCELED 0 /* some of the operations could not be canceled */
+ /* since they are in progress */
+#define AIO_ALLDONE 0 /* none of the requested operations could be */
+ /* canceled since they are already complete */
+
+/* lio_listio() options */
+
+#define LIO_WAIT 0 /* calling process is to suspend until the */
+ /* operation is complete */
+#define LIO_NOWAIT 0 /* calling process is to continue execution while */
+ /* the operation is performed and no notification */
+ /* shall be given when the operation is completed */
+#define LIO_READ 0 /* request a read() */
+#define LIO_WRITE 0 /* request a write() */
+#define LIO_NOP 0 /* no transfer is requested */
+
+/*
+ * 6.7.1.1 Asynchronous I/O Control Block, P1003.1b-1993, p. 151
+ */
+
+struct aiocb {
+ int aio_fildes; /* File descriptor */
+ off_t aio_offset; /* File offset */
+ volatile void *aio_buf; /* Location of buffer */
+ size_t aio_nbytes; /* Length of transfer */
+ int aio_reqprio; /* Request priority offset */
+ struct sigevent aio_sigevent; /* Signal number and value */
+ int aoi_lio_opcode; /* Operation to be performed */
+};
+
+/*
+ * 6.7.2 Asynchronous Read, P1003.1b-1993, p. 154
+ */
+
+int aio_read(
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.3 Asynchronous Write, P1003.1b-1993, p. 155
+ */
+
+int aio_write(
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.4 List Directed I/O, P1003.1b-1993, p. 158
+ */
+
+int lio_listio(
+ int mode,
+ struct aiocb * const list[],
+ int nent,
+ struct sigevent *sig
+);
+
+/*
+ * 6.7.5 Retrieve Error of Asynchronous I/O Operation, P1003.1b-1993, p. 161
+ */
+
+int aio_error(
+ const struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.6 Retrieve Return Status of Asynchronous I/O Operation,
+ * P1003.1b-1993, p. 162
+ */
+
+int aio_return(
+ const struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.7 Cancel Asynchronous I/O Operation, P1003.1b-1993, p. 163
+ */
+
+int aio_cancel(
+ int filedes,
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.7 Wait for Asynchronous I/O Request, P1003.1b-1993, p. 164
+ */
+
+int aio_suspend(
+ struct aiocb * const list[],
+ int nent,
+ const struct timespec *timeout
+);
+
+#if defined(_POSIX_SYNCHRONIZED_IO)
+
+/*
+ * 6.7.9 Asynchronous File Synchronization, P1003.1b-1993, p. 166
+ */
+
+int aio_fsync(
+ int op,
+ struct aiocb *aiocbp
+);
+
+#endif /* _POSIX_SYNCHRONIZED_IO */
+
+#endif /* _POSIX_ASYNCHRONOUS_IO */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/base/devctl.h b/c/src/exec/posix/base/devctl.h
new file mode 100644
index 0000000000..5073b475ee
--- /dev/null
+++ b/c/src/exec/posix/base/devctl.h
@@ -0,0 +1,30 @@
+/* devctl.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_DEVICE_CONTROL_h
+#define __POSIX_DEVICE_CONTROL_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_DEVICE_CONTROL)
+
+#include <sys/types.h>
+#include <unistd.h>
+
+/*
+ * 21.2.1 Control a Device, P1003.4b/D8, p. 65
+ */
+
+int devctl(
+ int filedes,
+ void *dev_data_ptr,
+ size_t nbyte,
+ int *dev_info_ptr
+);
+
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/base/intr.h b/c/src/exec/posix/base/intr.h
new file mode 100644
index 0000000000..f07d1f9552
--- /dev/null
+++ b/c/src/exec/posix/base/intr.h
@@ -0,0 +1,72 @@
+/* intr.h
+ *
+ * XXX: It is unclear if the type "intr_t" should be defined when
+ * _POSIX_INTERRUPT_CONTROL is not.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_INTERRUPTS_h
+#define __POSIX_INTERRUPTS_h
+
+#include <rtems/posix/features.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#if defined(_POSIX_INTERRUPT_CONTROL)
+
+/*
+ * 22.2 Concepts, P1003.4b/D8, p. 73
+ */
+
+typedef int intr_t;
+
+/*
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+/*
+ * Return codes from an interrupt handler
+ */
+
+#define INTR_HANDLED_NOTIFY 0 /* ISR handled this interrupt, notify */
+ /* the thread that registered the */
+ /* ISR that the interrupt occurred. */
+#define INTR_HANDLED_DO_NOT_NOTIFY 1 /* ISR handled this interrupt, but */
+ /* do NOT perform notification. */
+#define INTR_NOT_HANDLED 2 /* ISR did not handle this interrupt, */
+ /* let the next handler try. */
+
+int intr_capture(
+ intr_t intr,
+ int (*intr_handler)( void *area ),
+ volatile void *area,
+ size_t areasize
+);
+
+int intr_release(
+ intr_t intr,
+ int (*intr_handler)( void *area )
+);
+
+int intr_lock(
+ intr_t intr
+);
+
+int intr_unlock(
+ intr_t intr
+);
+
+/*
+ * 22.3.2 Await Interrupt Notification, P1003.4b/D8, p. 76
+ */
+
+int intr_timed_wait(
+ int flags,
+ const struct timespec *timeout
+);
+
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/base/limits.h b/c/src/exec/posix/base/limits.h
new file mode 100644
index 0000000000..e8ac4bf2fd
--- /dev/null
+++ b/c/src/exec/posix/base/limits.h
@@ -0,0 +1,164 @@
+/* limits.h
+ *
+ * This file lists the minimums for the limits set by each of
+ * the POSIX features subsets.
+ *
+ * XXX: Careful attention needs to be paid to section 2.8 in 1003.1b-1993
+ * to segregrate the variables below based on their "class" according
+ * to our implementation. We also need to set the Run-Time Invariant
+ * and other related values.
+ *
+ * $Id$
+ */
+
+#include_next <limits.h>
+
+#ifndef __POSIX_LIMITS_h
+#define __POSIX_LIMITS_h
+
+/* really only to get min stack size from <rtems/score/cpu.h> */
+#include <rtems/system.h>
+
+/****************************************************************************
+ ****************************************************************************
+ * *
+ * P1003.1b-1993 defines the constants below this comment. *
+ * *
+ ****************************************************************************
+ ****************************************************************************/
+
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_CHILD_MAX 6
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_LINK_MAX 8
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 0
+#define _POSIX_OPEN_MAX 16
+#define _POSIX_PATH_MAX 255
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TZNAME_MAX 3
+
+/*
+ * Definitions of the following may be omitted if the value is >= stated
+ * minimum but is indeterminate.
+ */
+
+#define AIO_LISTIO_MAX 2
+#define AIO_MAX 1
+#define AIO_PRIO_DELTA_MAX 0
+#define ARG_MAX 4096
+#define CHILD_MAX 6
+#define DELAYTIMER_MAX 32
+#define MQ_OPEN_MAX 8
+#define MQ_PRIO_MAX 32
+#define OPEN_MAX 16
+#define PAGESIZE 1
+#define RTSIG_MAX 8
+#define SEM_NSEMS_MAX 256
+#define SEM_VALUE_MAX 32767
+#define SIGQUEUE_MAX 32
+#define STREAM_MAX 8
+#define TIMER_MAX 32
+#define TZNAME_MAX 3
+
+/*
+ * Pathname Variables
+ */
+
+#define LINK_MAX 8
+#define MAX_CANON 255
+#define MAX_INPUT 255
+#define NAME_MAX 14
+#define PATH_MAX 255
+#define PIPE_BUF 512
+
+/*
+ * Invariant values
+ */
+
+#define SSIZE_MAX 32767
+
+/*
+ * Maximum Values
+ */
+
+#define _POSIX_CLOCKRES_MIN 0 /* in nanoseconds */
+
+/****************************************************************************
+ ****************************************************************************
+ * *
+ * P1003.1c/D10 defines the constants below this comment. *
+ *
+ * XXX: doc seems to have printing problems in this table :(
+ * *
+ ****************************************************************************
+ ****************************************************************************/
+
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#define _POSIX_THREAD_KEYS_MAX 28
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TTY_NAME_MAX 9
+
+/*
+ * Definitions of the following may be omitted if the value is >= stated
+ * minimum but is indeterminate.
+ */
+
+#define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX
+#define TTY_NAME_MAX _POSIX_TTY_NAME_MAX
+#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
+#define PTHREAD_STACK_MIN CPU_STACK_MINIMUM_SIZE
+
+/*
+ * The maximum number of keys (PTHREAD_KEYS_MAX) and threads
+ * (PTHREAD_THREADS_MAX) are configurable and may exceed the minimum.
+ *
+#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX
+#define PTHREAD_THREADS_MAX _POSIX_THREAD_THREADS_MAX
+*/
+
+
+/****************************************************************************
+ ****************************************************************************
+ * *
+ * P1003.4b/D8 defines the constants below this comment. *
+ * *
+ ****************************************************************************
+ ****************************************************************************/
+
+#define _POSIX_INTERRUPT_OVERRUN_MAX 32
+
+/*
+ * Definitions of the following may be omitted if the value is >= stated
+ * minimum but is indeterminate.
+ */
+
+#define INTERRUPT_OVERRUN_MAX 32
+
+/*
+ * Pathname Variables
+ */
+
+#define MIN_ALLOC_SIZE
+#define REC_MIN_XFER_SIZE
+#define REC_MAX_XFER_SIZE
+#define REC_INCR_XFER_SIZE
+#define REC_XFER_ALIGN
+#define MAX_ATOMIC_SIZE
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/base/mqueue.h b/c/src/exec/posix/base/mqueue.h
new file mode 100644
index 0000000000..f1b2250e5c
--- /dev/null
+++ b/c/src/exec/posix/base/mqueue.h
@@ -0,0 +1,145 @@
+/* mqueue.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_MESSAGE_QUEUE_h
+#define __POSIX_MESSAGE_QUEUE_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_MESSAGE_PASSING)
+
+#include <sys/types.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+
+/*
+ * 15.1.1 Data Structures, P1003.1b-1993, p. 271
+ */
+
+typedef Objects_Id mqd_t;
+
+struct mq_attr {
+ long mq_flags; /* Message queue flags */
+ long mq_maxmsg; /* Maximum number of messages */
+ long mq_msgsize; /* Maximum message size */
+ long mq_curmsgs; /* Number of messages currently queued */
+};
+
+/*
+ * 15.2.2 Open a Message Queue, P1003.1b-1993, p. 272
+ */
+
+mqd_t mq_open(
+ const char *name,
+ int oflag,
+ ...
+);
+
+/*
+ * 15.2.2 Close a Message Queue, P1003.1b-1993, p. 275
+ */
+
+int mq_close(
+ mqd_t mqdes
+);
+
+/*
+ * 15.2.2 Remove a Message Queue, P1003.1b-1993, p. 276
+ */
+
+int mq_unlink(
+ const char *name
+);
+
+/*
+ * 15.2.4 Send a Message to a Message Queue, P1003.1b-1993, p. 277
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedsend().
+ */
+
+int mq_send(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+#include <time.h>
+
+int mq_timedsend(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+/*
+ * 15.2.5 Receive a Message From a Message Queue, P1003.1b-1993, p. 279
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedreceive().
+ */
+
+ssize_t mq_receive(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+int mq_timedreceive( /* XXX: should this be ssize_t */
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+#if defined(_POSIX_REALTIME_SIGNALS)
+
+/*
+ * 15.2.6 Notify Process that a Message is Available on a Queue,
+ * P1003.1b-1993, p. 280
+ */
+
+int mq_notify(
+ mqd_t mqdes,
+ const struct sigevent *notification
+);
+
+#endif /* _POSIX_REALTIME_SIGNALS */
+
+/*
+ * 15.2.7 Set Message Queue Attributes, P1003.1b-1993, p. 281
+ */
+
+int mq_setattr(
+ mqd_t mqdes,
+ const struct mq_attr *mqstat,
+ struct mq_attr *omqstat
+);
+
+/*
+ * 15.2.8 Get Message Queue Attributes, P1003.1b-1993, p. 283
+ */
+
+int mq_getattr(
+ mqd_t mqdes,
+ struct mq_attr *mqstat
+);
+
+#endif /* _POSIX_MESSAGE_PASSING */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/base/pthread.h b/c/src/exec/posix/base/pthread.h
new file mode 100644
index 0000000000..d70a794f38
--- /dev/null
+++ b/c/src/exec/posix/base/pthread.h
@@ -0,0 +1,500 @@
+/* pthread.h
+ *
+ * $Id$
+ */
+
+#ifndef __PTHREAD_h
+#define __PTHREAD_h
+
+#include <sys/features.h>
+
+#if defined(_POSIX_THREADS)
+
+#include <sys/types.h>
+#include <time.h>
+#include <sys/sched.h>
+
+/*
+ * 3.1.3 Register Fork Handlers, P1003.1c/Draft 10, P1003.1c/Draft 10, p. 27
+ *
+ * RTEMS does not support processes, so we fall under this and do not
+ * provide this routine:
+ *
+ * "Either the implementation shall support the pthread_atfork() function
+ * as described above or the pthread_atfork() funciton shall not be
+ * provided."
+ */
+
+/*
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_init(
+ pthread_mutexattr_t *attr
+);
+
+int pthread_mutexattr_destroy(
+ pthread_mutexattr_t *attr
+);
+
+int pthread_mutexattr_getpshared(
+ const pthread_mutexattr_t *attr,
+ int *pshared
+);
+
+int pthread_mutexattr_setpshared(
+ pthread_mutexattr_t *attr,
+ int pshared
+);
+
+/*
+ * 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_mutex_init(
+ pthread_mutex_t *mutex,
+ const pthread_mutexattr_t *attr
+);
+
+int pthread_mutex_destroy(
+ pthread_mutex_t *mutex
+);
+
+/*
+ * This is used to statically initialize a pthread_mutex_t. Example:
+ *
+ * pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ */
+
+#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF)
+
+/*
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_lock(
+ pthread_mutex_t *mutex
+);
+
+int pthread_mutex_trylock(
+ pthread_mutex_t *mutex
+);
+
+int pthread_mutex_unlock(
+ pthread_mutex_t *mutex
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+int pthread_mutex_timedlock(
+ pthread_mutex_t *mutex,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+/*
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_init(
+ pthread_condattr_t *attr
+);
+
+int pthread_condattr_destroy(
+ pthread_condattr_t *attr
+);
+
+int pthread_condattr_getpshared(
+ const pthread_condattr_t *attr,
+ int *pshared
+);
+
+int pthread_condattr_setpshared(
+ pthread_condattr_t *attr,
+ int pshared
+);
+
+/*
+ * 11.4.2 Initializing and Destroying a Condition Variable,
+ * P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_cond_init(
+ pthread_cond_t *cond,
+ const pthread_condattr_t *attr
+);
+
+int pthread_cond_destroy(
+ pthread_cond_t *mutex
+);
+
+/*
+ * This is used to statically initialize a pthread_cond_t. Example:
+ *
+ * pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ */
+
+#define PTHREAD_COND_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF)
+
+/*
+ * 11.4.3 Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101
+ */
+
+int pthread_cond_signal(
+ pthread_cond_t *cond
+);
+
+int pthread_cond_broadcast(
+ pthread_cond_t *cond
+);
+
+/*
+ * 11.4.4 Waiting on a Condition, P1003.1c/Draft 10, p. 105
+ */
+
+int pthread_cond_wait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex
+);
+
+int pthread_cond_timedwait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ const struct timespec *abstime
+);
+
+#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING)
+
+/*
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setscope(
+ pthread_attr_t *attr,
+ int contentionscope
+);
+
+int pthread_attr_getscope(
+ const pthread_attr_t *attr,
+ int *contentionscope
+);
+
+int pthread_attr_setinheritsched(
+ pthread_attr_t *attr,
+ int inheritsched
+);
+
+int pthread_attr_getinheritsched(
+ const pthread_attr_t *attr,
+ int *inheritsched
+);
+
+int pthread_attr_setschedpolicy(
+ pthread_attr_t *attr,
+ int policy
+);
+
+int pthread_attr_getschedpolicy(
+ const pthread_attr_t *attr,
+ int *policy
+);
+
+#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */
+
+int pthread_attr_setschedparam(
+ pthread_attr_t *attr,
+ const struct sched_param *param
+);
+
+int pthread_attr_getschedparam(
+ const pthread_attr_t *attr,
+ struct sched_param *param
+);
+
+#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING)
+
+/*
+ * 13.5.2 Dynamic Thread Scheduling Parameters Access,
+ * P1003.1c/Draft 10, p. 124
+ */
+
+int pthread_getschedparam(
+ pthread_t thread,
+ int *policy,
+ struct sched_param *param
+);
+
+int pthread_setschedparam(
+ pthread_t thread,
+ int policy,
+ struct sched_param *param
+);
+
+#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */
+
+#if defined(_POSIX_THREAD_PRIO_INHERIT) || defined(_POSIX_THREAD_PRIO_PROTECT)
+
+/*
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_setprotocol(
+ pthread_mutexattr_t *attr,
+ int protocol
+);
+
+int pthread_mutexattr_getprotocol(
+ const pthread_mutexattr_t *attr,
+ int *protocol
+);
+
+int pthread_mutexattr_setprioceiling(
+ pthread_mutexattr_t *attr,
+ int prioceiling
+);
+
+int pthread_mutexattr_getprioceiling(
+ const pthread_mutexattr_t *attr,
+ int *prioceiling
+);
+
+#endif /* _POSIX_THREAD_PRIO_INHERIT || _POSIX_THREAD_PRIO_PROTECT */
+
+#if defined(_POSIX_THREAD_PRIO_PROTECT)
+
+/*
+ * 13.6.2 Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131
+ */
+
+int pthread_mutex_setprioceiling(
+ pthread_mutex_t *mutex,
+ int prioceiling,
+ int *old_ceiling
+);
+
+int pthread_mutex_getprioceiling(
+ pthread_mutex_t *mutex,
+ int *prioceiling
+);
+
+#endif /* _POSIX_THREAD_PRIO_PROTECT */
+
+/*
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_init(
+ pthread_attr_t *attr
+);
+
+int pthread_attr_destroy(
+ pthread_attr_t *attr
+);
+
+int pthread_attr_getstacksize(
+ const pthread_attr_t *attr,
+ size_t *stacksize
+);
+
+int pthread_attr_setstacksize(
+ pthread_attr_t *attr,
+ size_t stacksize
+);
+
+int pthread_attr_getstackaddr(
+ const pthread_attr_t *attr,
+ void **stackaddr
+);
+
+int pthread_attr_setstackaddr(
+ pthread_attr_t *attr,
+ void *stackaddr
+);
+
+int pthread_attr_getdetachstate(
+ const pthread_attr_t *attr,
+ int *detachstate
+);
+
+int pthread_attr_setdetachstate(
+ pthread_attr_t *attr,
+ int detachstate
+);
+
+/*
+ * 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144
+ */
+
+int pthread_create(
+ pthread_t *thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)( void * ),
+ void *arg
+);
+
+/*
+ * 16.1.3 Wait for Thread Termination, P1003.1c/Draft 10, p. 147
+ */
+
+int pthread_join(
+ pthread_t thread,
+ void **value_ptr
+);
+
+/*
+ * 16.1.4 Detaching a Thread, P1003.1c/Draft 10, p. 149
+ */
+
+int pthread_detach(
+ pthread_t thread
+);
+
+/*
+ * 16.1.5.1 Thread Termination, p1003.1c/Draft 10, p. 150
+ */
+
+void pthread_exit(
+ void *value_ptr
+);
+
+/*
+ * 16.1.6 Get Calling Thread's ID, p1003.1c/Draft 10, p. XXX
+ */
+
+pthread_t pthread_self( void );
+
+/*
+ * 16.1.7 Compare Thread IDs, p1003.1c/Draft 10, p. 153
+ */
+
+int pthread_equal(
+ pthread_t t1,
+ pthread_t t2
+);
+
+/*
+ * 16.1.8 Dynamic Package Initialization
+ */
+
+/*
+ * This is used to statically initialize a pthread_once_t. Example:
+ *
+ * pthread_once_t once = PTHREAD_ONCE_INIT;
+ *
+ * NOTE: This is named inconsistently -- it should be INITIALIZER.
+ */
+
+#define PTHREAD_ONCE_INIT { 1, 0 } /* is initialized and not run */
+
+int pthread_once(
+ pthread_once_t *once_control,
+ void (*init_routine)(void)
+);
+
+/*
+ * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163
+ */
+
+int pthread_key_create(
+ pthread_key_t *key,
+ void (*destructor)( void * )
+);
+
+/*
+ * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
+ */
+
+int pthread_setspecific(
+ pthread_key_t key,
+ const void *value
+);
+
+void *pthread_getspecific(
+ pthread_key_t key
+);
+
+/*
+ * 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167
+ */
+
+int pthread_key_delete(
+ pthread_key_t key
+);
+
+/*
+ * 18.2.1 Canceling Execution of a Thread, P1003.1c/Draft 10, p. 181
+ */
+
+#define PTHREAD_CANCEL_ENABLE 0
+#define PTHREAD_CANCEL_DISABLE 1
+
+#define PTHREAD_CANCEL_DEFERRED 0
+#define PTHREAD_CANCEL_ASYNCHRONOUS 1
+
+int pthread_cancel(
+ pthread_t thread
+);
+
+/*
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+int pthread_setcancelstate(
+ int state,
+ int *oldstate
+);
+
+int pthread_setcanceltype(
+ int type,
+ int *oldtype
+);
+
+void pthread_testcancel( void );
+
+/*
+ * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184
+ */
+
+void pthread_cleanup_push(
+ void (*routine)( void * ),
+ void *arg
+);
+
+void pthread_cleanup_pop(
+ int execute
+);
+
+#if defined(_POSIX_THREAD_CPUTIME)
+
+/*
+ * 20.1.6 Accessing a Thread CPU-time Clock, P1003.4b/D8, p. 58
+ */
+
+int pthread_getcpuclockid(
+ pthread_t thread_id,
+ clockid_t *clock_id
+);
+
+/*
+ * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/D8, p. 59
+ */
+
+int pthread_attr_setcputime(
+ pthread_attr_t *attr,
+ int clock_allowed
+);
+
+int pthread_attr_getcputime(
+ pthread_attr_t *attr,
+ int *clock_allowed
+);
+
+#endif /* defined(_POSIX_THREAD_CPUTIME) */
+
+#endif /* defined(_POSIX_THREADS) */
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/base/sched.h b/c/src/exec/posix/base/sched.h
new file mode 100644
index 0000000000..14a603c0c5
--- /dev/null
+++ b/c/src/exec/posix/base/sched.h
@@ -0,0 +1,88 @@
+/* sched.h
+ *
+ * $Id$
+ */
+
+
+#ifndef __POSIX_SCHEDULING_h
+#define __POSIX_SCHEDULING_h
+
+#include <sys/features.h>
+
+#if defined(_POSIX_PRIORITY_SCHEDULING)
+
+#include <sys/types.h>
+#include <time.h>
+#include <sys/sched.h>
+#include <pthread.h>
+
+/*
+ * 13.3.1 Set Scheduling Parameters, P1003.1b-1993, p. 252
+ *
+ */
+
+int sched_setparam(
+ pid_t pid,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.2 Set Scheduling Parameters, P1003.1b-1993, p. 253
+ */
+
+int sched_getparam(
+ pid_t pid,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.3 Set Scheduling Policy and Scheduling Parameters,
+ * P1003.1b-1993, p. 254
+ */
+
+int sched_setscheduler(
+ pid_t pid,
+ int policy,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.4 Get Scheduling Policy, P1003.1b-1993, p. 256
+ */
+
+int sched_getscheduler(
+ pid_t pid
+);
+
+/*
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_get_priority_max(
+ int policy
+);
+
+int sched_get_priority_min(
+ int policy
+);
+
+int sched_rr_get_interval(
+ pid_t pid,
+ struct timespec *interval
+);
+
+#endif /* _POSIX_PRIORITY_SCHEDULING */
+
+#if defined(_POSIX_THREADS) || defined(_POSIX_PRIORITY_SCHEDULING)
+
+/*
+ * 13.3.5 Yield Processor, P1003.1b-1993, p. 257
+ */
+
+int sched_yield( void );
+
+#endif /* _POSIX_THREADS or _POSIX_PRIORITY_SCHEDULING */
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/base/semaphore.h b/c/src/exec/posix/base/semaphore.h
new file mode 100644
index 0000000000..0388f91ad9
--- /dev/null
+++ b/c/src/exec/posix/base/semaphore.h
@@ -0,0 +1,108 @@
+/* semaphore.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SEMAPHORE_h
+#define __POSIX_SEMAPHORE_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_SEMAPHORES)
+
+#include <sys/time.h>
+
+/*
+ * 11.1 Semaphore Characteristics, P1003.1b-1993, p.219
+ */
+
+typedef int sem_t;
+
+/*
+ * 11.2.1 Initialize an Unnamed Semaphore, P1003.1b-1993, p.219
+ */
+
+int sem_init(
+ sem_t *sem,
+ int pshared,
+ unsigned int value
+);
+
+/*
+ * 11.2.2 Destroy an Unnamed Semaphore, P1003.1b-1993, p.220
+ */
+
+int sem_destroy(
+ sem_t *sem
+);
+
+/*
+ * 11.2.3 Initialize/Open a Named Semaphore, P1003.1b-1993, p.221
+ *
+ * NOTE: Follows open() calling conventions.
+ */
+
+sem_t *sem_open(
+ const char *name,
+ int oflag,
+ ...
+);
+
+/*
+ * 11.2.4 Close a Named Semaphore, P1003.1b-1993, p.224
+ */
+
+int sem_close(
+ sem_t *sem
+);
+
+/*
+ * 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
+ */
+
+int sem_unlink(
+ const char *name
+);
+
+/*
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_wait(
+ sem_t *sem
+);
+
+int sem_trywait(
+ sem_t *sem
+);
+
+#if defined(_POSIX_TIMEOUTS)
+int sem_timedwait(
+ sem_t *sem,
+ const struct timespec *timeout
+);
+#endif
+
+/*
+ * 11.2.7 Unlock a Semaphore, P1003.1b-1993, p.227
+ */
+
+int sem_post(
+ sem_t *sem
+);
+
+/*
+ * 11.2.8 Get the Value of a Semaphore, P1003.1b-1993, p.229
+ */
+
+int sem_getvalue(
+ sem_t *sem,
+ int *sval
+);
+
+#endif /* _POSIX_SEMAPHORES */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/base/unistd.h b/c/src/exec/posix/base/unistd.h
new file mode 100644
index 0000000000..147e80c11d
--- /dev/null
+++ b/c/src/exec/posix/base/unistd.h
@@ -0,0 +1,85 @@
+/* unistd.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_UNISTD_h
+#define __POSIX_UNISTD_h
+
+#include <rtems/posix/features.h>
+
+/*
+ * 4.8.1 Get Configurable System Variables, P1003.1b-1993, p. 96
+ *
+ * NOTE: Table 4-2, Configurable System Variables, p. 96
+ */
+
+#define _SC_AIO_LISTIO_MAX 0
+#define _SC_AIO_MAX 1
+#define _SC_AIO_PRIO_DELTA_MAX 2
+#define _SC_ARG_MAX 3
+#define _SC_CHILD_MAX 4
+#define _SC_CLK_TCK 5
+#define _SC_DELAYTIMER_MAX 6
+#define _SC_MQ_OPEN_MAX 7
+#define _SC_MQ_PRIO_MAX 8
+#define _SC_NGROUPS_MAX 9
+#define _SC_OPEN_MAX 10
+#define _SC_PAGESIZE 11
+#define _SC_RTSIG_MAX 12
+#define _SC_SEM_NSEMS_MAX 13
+#define _SC_SEM_VALUE_MAX 14
+#define _SC_SIGQUEUE_MAX 15
+#define _SC_STREAM_MAX 16
+#define _SC_TIMER_MAX 17
+#define _SC_TZNAME_MAX 18
+
+#define _SC_ASYNCHRONOUS_IO 19
+#define _SC_FSYNC 20
+#define _SC_JOB_CONTROL 21
+#define _SC_MAPPED_FILES 22
+#define _SC_MEMLOCK 23
+#define _SC_MEMLOCK_RANGE 24
+#define _SC_MEMORY_PROTECTION 25
+#define _SC_MESSAGE_PASSING 26
+#define _SC_PRIORITIZED_IO 27
+#define _SC_REALTIME_SIGNALS 28
+#define _SC_SAVED_IDS 29
+#define _SC_SEMAPHORES 30
+#define _SC_SHARED_MEMORY_OBJECTS 31
+#define _SC_SYNCHRONIZED_IO 32
+#define _SC_TIMERS 33
+#define _SC_VERSION 34
+
+/*
+ * P1003.1c/D10, p. 52 adds the following.
+ */
+
+#define _SC_GETGR_R_SIZE_MAX 35
+#define _SC_GETPW_R_SIZE_MAX
+#define _SC_LOGIN_NAME_MAX
+#define _SC_THREAD_DESTRUCTOR_ITERATIONS
+#define _SC_THREAD_KEYS_MAX
+#define _SC_THREAD_STACK_MIN
+#define _SC_THREAD_THREADS_MAX
+#define _SC_TTY_NAME_MAX
+
+#define _SC_THREADS
+#define _SC_THREAD_ATTR_STACKADDR
+#define _SC_THREAD_ATTR_STACKSIZE
+#define _SC_THREAD_PRIORITY_SCHEDULING
+#define _SC_THREAD_PRIO_INHERIT
+#define _SC_THREAD_PRIO_CEILING
+#define _SC_THREAD_PROCESS_SHARED
+#define _SC_THREAD_SAGE_FUNCTIONS
+
+/*
+ * 4.8.1 Get Configurable System Variables, P1003.1b-1993, p. 95
+ */
+
+long sysconf(
+ int name
+);
+
+#endif
+/* end of include */
diff --git a/c/src/exec/posix/headers/Makefile.in b/c/src/exec/posix/headers/Makefile.in
new file mode 100644
index 0000000000..7769a4cada
--- /dev/null
+++ b/c/src/exec/posix/headers/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES= cond condmp config key mutex mutexmp posixapi \
+ priority psignal pthread pthreadmp seterr threadsup time
+#H_PIECES= cancel cond condmp intr key mqueue mqueuemp mutex \
+# mutexmp pthread pthreadmp priority semaphore semaphoremp threadsup \
+# time
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/posix
diff --git a/c/src/exec/posix/headers/cancel.h b/c/src/exec/posix/headers/cancel.h
new file mode 100644
index 0000000000..e6d80275f4
--- /dev/null
+++ b/c/src/exec/posix/headers/cancel.h
@@ -0,0 +1,16 @@
+/* rtems/posix/cancel.h
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CANCEL_h
+#define __RTEMS_POSIX_CANCEL_h
+
+typedef struct {
+ Chain_Node Node;
+ void (*routine)( void * );
+ void *arg;
+} POSIX_Cancel_Handler_control;
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/headers/cond.h b/c/src/exec/posix/headers/cond.h
new file mode 100644
index 0000000000..24dbcbfef6
--- /dev/null
+++ b/c/src/exec/posix/headers/cond.h
@@ -0,0 +1,130 @@
+/* rtems/posix/cond.h
+ *
+ * This include file contains all the private support information for
+ * POSIX condition variables.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_h
+#define __RTEMS_POSIX_CONDITION_VARIABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/threadq.h>
+
+/*
+ * Constant to indicate condition variable does not currently have
+ * a mutex assigned to it.
+ */
+
+#define POSIX_CONDITION_VARIABLES_NO_MUTEX 0
+
+/*
+ * Data Structure used to manage a POSIX condition variable
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ pthread_mutex_t Mutex;
+ Thread_queue_Control Wait_queue;
+} POSIX_Condition_variables_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Condition_variables_Information;
+
+/*
+ * _POSIX_Condition_variables_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Condition_variables_Manager_initialization(
+ unsigned32 maximum_condition_variables
+);
+
+/*
+ * _POSIX_Condition_variables_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a condition variable control block from
+ * the inactive chain of free condition variable control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *
+ _POSIX_Condition_variables_Allocate( void );
+
+/*
+ * _POSIX_Condition_variables_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a condition variable control block to the
+ * inactive chain of free condition variable control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
+ POSIX_Condition_variables_Control *the_condition_variable
+);
+
+/*
+ * _POSIX_Condition_variables_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps condition variable IDs to condition variable control
+ * blocks. If ID corresponds to a local condition variable, then it returns
+ * the_condition variable control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the condition variable ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_condition variable is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_condition variable is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Condition_variables_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_condition variable is NULL
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Condition_variables_Is_null (
+ POSIX_Condition_variables_Control *the_condition_variable
+);
+
+#include <rtems/posix/cond.inl>
+#include <rtems/posix/condmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/condmp.h b/c/src/exec/posix/headers/condmp.h
new file mode 100644
index 0000000000..75ab97a63b
--- /dev/null
+++ b/c/src/exec/posix/headers/condmp.h
@@ -0,0 +1,162 @@
+/* condmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Condition Variable Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_MP_h
+#define __RTEMS_POSIX_CONDITION_VARIABLES_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote condition variable operations.
+ */
+
+typedef enum {
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_CREATE = 0,
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_DELETE = 1,
+ POSIX_CONDITION_VARIABLES_MP_EXTRACT_PROXY = 2,
+ POSIX_CONDITION_VARIABLES_MP_OBTAIN_REQUEST = 3,
+ POSIX_CONDITION_VARIABLES_MP_OBTAIN_RESPONSE = 4,
+ POSIX_CONDITION_VARIABLES_MP_RELEASE_REQUEST = 5,
+ POSIX_CONDITION_VARIABLES_MP_RELEASE_RESPONSE = 6,
+} POSIX_Condition_variables_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote condition variable operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Condition_variables_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Condition_variables_MP_Packet;
+
+/*
+ * _POSIX_Condition_variables_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Condition_variables_MP_Send_process_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Condition_variables_MP_Send_request_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Condition_variables_MP_Send_response_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Condition_variables_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Condition_variables_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Condition_variables_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Condition_variables_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a condition variable mp packet.
+ */
+
+POSIX_Condition_variables_MP_Packet
+ *_POSIX_Condition_variables_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/headers/config.h b/c/src/exec/posix/headers/config.h
new file mode 100644
index 0000000000..a0851ad77f
--- /dev/null
+++ b/c/src/exec/posix/headers/config.h
@@ -0,0 +1,59 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters specific for the POSIX API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONFIGURATION_h
+#define __RTEMS_POSIX_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * XXX
+ *
+ * The following records define the Configuration Table. The
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + required number of each object type
+ */
+
+/*
+ * For now, we are only allowing the user to specify the entry point
+ * for posix initialization threads.
+ */
+
+typedef struct {
+ void *(*entry)(void *);
+} posix_initialization_threads_table;
+
+typedef struct {
+ int maximum_threads;
+ int maximum_mutexes;
+ int maximum_condition_variables;
+ int maximum_keys;
+ int maximum_queued_signals;
+ int number_of_initialization_threads;
+ posix_initialization_threads_table *User_initialization_threads_table;
+} posix_api_configuration_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/headers/intr.h b/c/src/exec/posix/headers/intr.h
new file mode 100644
index 0000000000..85ae20de93
--- /dev/null
+++ b/c/src/exec/posix/headers/intr.h
@@ -0,0 +1,154 @@
+/* rtems/posix/intr.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Interrupt Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_h
+#define __RTEMS_POSIX_KEY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+
+/*
+ * Data Structure used to manage each POSIX Interrupt Vector
+ */
+
+typedef struct {
+ int number_installed;
+ int lock_count;
+ int deferred_count;
+ Chain_Control Handlers;
+} POSIX_Interrupt_Control;
+
+/*
+ * Data Structure used to manage a POSIX Interrupt Handler
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int is_active;
+ intr_t vector;
+ Thread_Control *server;
+ int (*handler)( void *area );
+ volatile void *user_data_area;
+} POSIX_Interrupt_Handler_control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Interrupt_Handlers_Information;
+
+/*
+ * The following is an array which is used to manage the set of
+ * interrupt handlers installed on each vector.
+ */
+
+POSIX_EXTERN POSIX_Interrupt_Control
+ _POSIX_Interrupt_Information[ ISR_NUMBER_OF_VECTORS ];
+
+/*
+ * _POSIX_Interrupt_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Interrupt_Manager_initialization(
+ unsigned32 maximum_interrupt_handlers
+);
+
+/*
+ * _POSIX_Interrupt_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a interrupt handler control block from
+ * the inactive chain of free interrupt handler control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Handler_control *
+ _POSIX_Interrupt_Allocate( void );
+
+/*
+ * _POSIX_Interrupt_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a interrupt handler control block to the
+ * inactive chain of free interrupt handler control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Interrupt_Free (
+ POSIX_Interrupt_Handler_control *the_intr
+);
+
+/*
+ * _POSIX_Interrupt_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps interrupt handler IDs to interrupt handler control
+ * blocks. If ID corresponds to a local interrupt handler, then it returns
+ * the_intr control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the interrupt handler ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_intr is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_intr is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Control *_POSIX_Interrupt_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Interrupt_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_intr is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Interrupt_Is_null (
+ POSIX_Interrupt_Handler_control *the_intr
+);
+
+/*
+ * _POSIX_Interrupt_Handler
+ *
+ * DESCRIPTION:
+ *
+ * This function XXX.
+ */
+
+void _POSIX_Interrupt_Handler(
+ ISR_Vector_number vector
+);
+
+#include <rtems/posix/intr.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/key.h b/c/src/exec/posix/headers/key.h
new file mode 100644
index 0000000000..11cb365905
--- /dev/null
+++ b/c/src/exec/posix/headers/key.h
@@ -0,0 +1,136 @@
+/* rtems/posix/key.h
+ *
+ * This include file contains all the private support information for
+ * POSIX key.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_h
+#define __RTEMS_POSIX_KEY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Data Structure used to manage a POSIX key
+ *
+ * NOTE: The Values is a table indexed by the index portion of the
+ * ID of the currently executing thread.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ boolean is_active;
+ void (*destructor)( void * );
+ void **Values[ OBJECTS_CLASSES_LAST_THREAD_CLASS + 1 ];
+} POSIX_Keys_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Keys_Information;
+
+/*
+ * _POSIX_Keys_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Key_Manager_initialization(
+ unsigned32 maximum_keys
+);
+
+/*
+ * _POSIX_Keys_Run_destructors
+ *
+ * DESCRIPTION:
+ *
+ * This function executes all the destructors associated with the thread's
+ * keys. This function will execute until all values have been set to NULL.
+ *
+ * NOTE: This is the routine executed when a thread exits to
+ * run through all the keys and do the destructor action.
+ */
+
+void _POSIX_Keys_Run_destructors(
+ Thread_Control *thread
+);
+
+/*
+ * _POSIX_Keys_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a keys control block from
+ * the inactive chain of free keys control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void );
+
+/*
+ * _POSIX_Keys_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a keys control block to the
+ * inactive chain of free keys control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
+ POSIX_Keys_Control *the_key
+);
+
+/*
+ * _POSIX_Keys_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps key IDs to key control blocks.
+ * If ID corresponds to a local keys, then it returns
+ * the_key control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the keys ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_key is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_key is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Keys_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_key is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Keys_Is_null (
+ POSIX_Keys_Control *the_key
+);
+
+#include <rtems/posix/key.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/mqueue.h b/c/src/exec/posix/headers/mqueue.h
new file mode 100644
index 0000000000..2301bcef4c
--- /dev/null
+++ b/c/src/exec/posix/headers/mqueue.h
@@ -0,0 +1,186 @@
+/* rtems/posix/mqueue.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Message Queues.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_h
+#define __RTEMS_POSIX_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coremsg.h>
+#include <rtems/score/object.h>
+
+/*
+ * Data Structure used to manage a POSIX message queue
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ int flags;
+ boolean named;
+ boolean linked;
+ boolean blocking;
+ unsigned32 open_count;
+ CORE_message_queue_Control Message_queue;
+ struct sigevent notification;
+} POSIX_Message_queue_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Message_queue_Information;
+
+/*
+ * _POSIX_Message_queue_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+);
+
+/*
+ *
+ * _POSIX_Message_queue_Create_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the creation of a message queue utilizing the
+ * core message queue.
+ */
+
+int _POSIX_Message_queue_Create_support(
+ const char *name,
+ int pshared,
+ unsigned int oflag,
+ struct mq_attr *attr,
+ POSIX_Message_queue_Control **message_queue
+);
+
+/*
+ *
+ * _POSIX_Message_queue_Send_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts a message to a specified message queue.
+ */
+
+int _POSIX_Message_queue_Send_support(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ unsigned32 msg_len,
+ Priority_Control msg_prio,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Message_queue_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message queue control block from
+ * the inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void );
+
+/*
+ * _POSIX_Message_queue_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a message queue control block to the
+ * inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
+ POSIX_Message_queue_Control *the_mq
+);
+
+/*
+ * _POSIX_Message_queue_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps message queue IDs to message queue control blocks.
+ * If ID corresponds to a local message queue, then it returns
+ * the_mq control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the message queue ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_message queue is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_mq is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_message_queue is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Message_queue_Is_null (
+ POSIX_Message_queue_Control *the_mq
+);
+
+/*
+ * _POSIX_Message_queue_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+int _POSIX_Message_queue_Name_to_id(
+ const char *name,
+ Objects_Id *id
+);
+
+/*
+ * _POSIX_Message_queue_Priority_to_core
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Message_queue_Priority_to_core(
+ unsigned int priority
+);
+
+#include <rtems/posix/mqueue.inl>
+#include <rtems/posix/mqueuemp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/mqueuemp.h b/c/src/exec/posix/headers/mqueuemp.h
new file mode 100644
index 0000000000..c5fb1232ec
--- /dev/null
+++ b/c/src/exec/posix/headers/mqueuemp.h
@@ -0,0 +1,161 @@
+/* mqueuemp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Message Queue Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_MP_h
+#define __RTEMS_POSIX_MESSAGE_QUEUE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote message queue operations.
+ */
+
+typedef enum {
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_CREATE = 0,
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_DELETE = 1,
+ POSIX_MESSAGE_QUEUE_MP_EXTRACT_PROXY = 2,
+ POSIX_MESSAGE_QUEUE_MP_OBTAIN_REQUEST = 3,
+ POSIX_MESSAGE_QUEUE_MP_OBTAIN_RESPONSE = 4,
+ POSIX_MESSAGE_QUEUE_MP_RELEASE_REQUEST = 5,
+ POSIX_MESSAGE_QUEUE_MP_RELEASE_RESPONSE = 6,
+} POSIX_Message_queue_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote message queue operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Message_queue_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Message_queue_MP_Packet;
+
+/*
+ * _POSIX_Message_queue_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Message_queue_MP_Send_process_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Message_queue_MP_Send_request_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Message_queue_MP_Send_response_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Message_queue_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Message_queue_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Message_queue_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a message queue mp packet.
+ */
+
+POSIX_Message_queue_MP_Packet *_POSIX_Message_queue_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/headers/mutex.h b/c/src/exec/posix/headers/mutex.h
new file mode 100644
index 0000000000..9a3fedc444
--- /dev/null
+++ b/c/src/exec/posix/headers/mutex.h
@@ -0,0 +1,120 @@
+/* rtems/posix/mutex.h
+ *
+ * This include file contains all the private support information for
+ * POSIX mutex's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_h
+#define __RTEMS_POSIX_MUTEX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coremutex.h>
+#include <pthread.h>
+
+/*
+ * Data Structure used to manage a POSIX mutex
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ CORE_mutex_Control Mutex;
+} POSIX_Mutex_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Mutex_Information;
+
+/*
+ * _POSIX_Mutex_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Mutex_Manager_initialization(
+ unsigned32 maximum_mutexes
+);
+
+/*
+ * _POSIX_Mutex_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a mutexes control block from
+ * the inactive chain of free mutexes control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void );
+
+/*
+ * _POSIX_Mutex_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a mutexes control block to the
+ * inactive chain of free mutexes control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free (
+ POSIX_Mutex_Control *the_mutex
+);
+
+/*
+ * _POSIX_Mutex_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps mutexes IDs to mutexes control blocks.
+ * If ID corresponds to a local mutexes, then it returns
+ * the_mutex control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the mutexes ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_mutex is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_mutex is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Mutex_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_mutex is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Mutex_Is_null (
+ POSIX_Mutex_Control *the_mutex
+);
+
+#include <rtems/posix/mutex.inl>
+#include <rtems/posix/mutexmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/mutexmp.h b/c/src/exec/posix/headers/mutexmp.h
new file mode 100644
index 0000000000..d58f34925a
--- /dev/null
+++ b/c/src/exec/posix/headers/mutexmp.h
@@ -0,0 +1,161 @@
+/* mutexmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Mutex Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_MP_h
+#define __RTEMS_POSIX_MUTEX_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote mutex operations.
+ */
+
+typedef enum {
+ POSIX_MUTEX_MP_ANNOUNCE_CREATE = 0,
+ POSIX_MUTEX_MP_ANNOUNCE_DELETE = 1,
+ POSIX_MUTEX_MP_EXTRACT_PROXY = 2,
+ POSIX_MUTEX_MP_OBTAIN_REQUEST = 3,
+ POSIX_MUTEX_MP_OBTAIN_RESPONSE = 4,
+ POSIX_MUTEX_MP_RELEASE_REQUEST = 5,
+ POSIX_MUTEX_MP_RELEASE_RESPONSE = 6,
+} POSIX_Mutex_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote mutex operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Mutex_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Mutex_MP_Packet;
+
+/*
+ * _POSIX_Mutex_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Mutex_MP_Send_process_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Mutex_MP_Send_request_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Mutex_MP_Send_response_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Mutex_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Mutex_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Mutex_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Mutex_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Mutex_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a mutex mp packet.
+ */
+
+POSIX_Mutex_MP_Packet *_POSIX_Mutex_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/headers/posixapi.h b/c/src/exec/posix/headers/posixapi.h
new file mode 100644
index 0000000000..5da4d6a1e2
--- /dev/null
+++ b/c/src/exec/posix/headers/posixapi.h
@@ -0,0 +1,34 @@
+/*
+ * POSIX API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_API_h
+#define __POSIX_API_h
+
+#include <rtems/config.h>
+
+/*PAGE
+ *
+ * _POSIX_API_Initialize
+ *
+ * XXX
+ */
+
+void _POSIX_API_Initialize(
+ rtems_configuration_table *configuration_table
+);
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/headers/priority.h b/c/src/exec/posix/headers/priority.h
new file mode 100644
index 0000000000..c0253f3bab
--- /dev/null
+++ b/c/src/exec/posix/headers/priority.h
@@ -0,0 +1,44 @@
+/*
+ *
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_PRIORITY_h
+#define __RTEMS_POSIX_PRIORITY_h
+
+#include <rtems/score/priority.h>
+
+/*
+ * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
+ *
+ * "Numericallly higher values represent higher priorities."
+ *
+ * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
+ *
+ * There are only 254 posix priority levels since a task at priority level
+ * 255 would never run because of the RTEMS idle task. This is necessary
+ * because GNAT maps the lowest Ada task priority to the lowest thread
+ * priority. The lowest priority Ada task should get to run, so there is
+ * a fundamental conflict with having 255 priorities.
+ */
+
+#define POSIX_SCHEDULER_MAXIMUM_PRIORITY (254)
+
+#define POSIX_SCHEDULER_MINIMUM_PRIORITY (1)
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Priority_Is_valid(
+ int priority
+);
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
+ int priority
+);
+
+RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
+ Priority_Control priority
+);
+
+#include <rtems/posix/priority.inl>
+
+#endif
diff --git a/c/src/exec/posix/headers/psignal.h b/c/src/exec/posix/headers/psignal.h
new file mode 100644
index 0000000000..9c66881076
--- /dev/null
+++ b/c/src/exec/posix/headers/psignal.h
@@ -0,0 +1,17 @@
+/*
+ * $Id$
+ */
+
+#ifndef __POSIX_SIGNALS_h
+#define __POSIX_SIGNALS_h
+
+void _POSIX_signals_Manager_Initialization(
+ int maximum_queued_signals
+);
+
+void _POSIX_signals_Post_switch_extension(
+ Thread_Control *the_thread
+);
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/headers/pthread.h b/c/src/exec/posix/headers/pthread.h
new file mode 100644
index 0000000000..29d9a7eef9
--- /dev/null
+++ b/c/src/exec/posix/headers/pthread.h
@@ -0,0 +1,123 @@
+/* rtems/posix/pthread.h
+ *
+ * This include file contains all the private support information for
+ * POSIX threads.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_h
+#define __RTEMS_POSIX_THREADS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/posix/config.h>
+#include <rtems/posix/threadsup.h>
+
+#define PTHREAD_MINIMUM_STACK_SIZE (STACK_MINIMUM_SIZE * 2)
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Threads_Information;
+
+/*
+ * These are used to manage the user initialization threads.
+ */
+
+POSIX_EXTERN posix_initialization_threads_table
+ *_POSIX_Threads_User_initialization_threads;
+POSIX_EXTERN unsigned32 _POSIX_Threads_Number_of_initialization_threads;
+
+
+/*
+ * _POSIX_Threads_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Threads_Manager_initialization(
+ unsigned32 maximum_pthreads,
+ unsigned32 number_of_initialization_threads,
+ posix_initialization_threads_table *user_threads
+);
+
+/*
+ * _POSIX_Threads_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a pthread control block from
+ * the inactive chain of free pthread control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void );
+
+/*
+ * _POSIX_Threads_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a pthread control block to the
+ * inactive chain of free pthread control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free(
+ Thread_Control *the_pthread
+);
+
+/*
+ * _POSIX_Threads_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps pthread IDs to pthread control blocks.
+ * If ID corresponds to a local pthread, then it returns
+ * the_pthread control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the pthread ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_pthread is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_pthread is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get(
+ pthread_t id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Threads_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_pthread is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Threads_Is_null(
+ Thread_Control *the_pthread
+);
+
+#include <rtems/posix/pthread.inl>
+#include <rtems/posix/pthreadmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/pthreadmp.h b/c/src/exec/posix/headers/pthreadmp.h
new file mode 100644
index 0000000000..0165fe6d36
--- /dev/null
+++ b/c/src/exec/posix/headers/pthreadmp.h
@@ -0,0 +1,161 @@
+/* pthreadmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Threads Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_MP_h
+#define __RTEMS_POSIX_THREADS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote pthread operations.
+ */
+
+typedef enum {
+ POSIX_THREADS_MP_ANNOUNCE_CREATE = 0,
+ POSIX_THREADS_MP_ANNOUNCE_DELETE = 1,
+ POSIX_THREADS_MP_EXTRACT_PROXY = 2,
+ POSIX_THREADS_MP_OBTAIN_REQUEST = 3,
+ POSIX_THREADS_MP_OBTAIN_RESPONSE = 4,
+ POSIX_THREADS_MP_RELEASE_REQUEST = 5,
+ POSIX_THREADS_MP_RELEASE_RESPONSE = 6
+} POSIX_Threads_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote pthread operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Threads_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait;
+ Objects_Id proxy_id;
+} POSIX_Threads_MP_Packet;
+
+/*
+ * _POSIX_Threads_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Threads_MP_Send_process_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Threads_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Threads_MP_Send_request_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Threads_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Threads_MP_Send_response_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Threads_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Threads_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Threads_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Threads_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Threads_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Threads_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Threads_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a pthread mp packet.
+ */
+
+POSIX_Threads_MP_Packet *_POSIX_Threads_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/headers/semaphore.h b/c/src/exec/posix/headers/semaphore.h
new file mode 100644
index 0000000000..5b38fadce0
--- /dev/null
+++ b/c/src/exec/posix/headers/semaphore.h
@@ -0,0 +1,135 @@
+/* rtems/posix/semaphore.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Semaphores.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_h
+#define __RTEMS_POSIX_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coresem.h>
+
+/*
+ * Data Structure used to manage a POSIX semaphore
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ boolean named;
+ boolean linked;
+ unsigned32 open_count;
+ CORE_semaphore_Control Semaphore;
+} POSIX_Semaphore_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Semaphore_Information;
+
+/*
+ * _POSIX_Semaphore_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphorees
+);
+
+/*
+ * _POSIX_Semaphore_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a semaphore control block from
+ * the inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void );
+
+/*
+ * _POSIX_Semaphore_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a semaphore control block to the
+ * inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
+ POSIX_Semaphore_Control *the_semaphore
+);
+
+/*
+ * _POSIX_Semaphore_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps semaphore IDs to semaphore control blocks.
+ * If ID corresponds to a local semaphore, then it returns
+ * the_semaphore control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the semaphore ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_semaphore is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_semaphore is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Semaphore_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_semaphore is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Semaphore_Is_null (
+ POSIX_Semaphore_Control *the_semaphore
+);
+
+/*
+ * _POSIX_Semaphore_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+int _POSIX_Semaphore_Name_to_id(
+ const char *name,
+ Objects_Id *id
+);
+
+#include <rtems/posix/semaphore.inl>
+#include <rtems/posix/semaphoremp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/semaphoremp.h b/c/src/exec/posix/headers/semaphoremp.h
new file mode 100644
index 0000000000..ff4cd16988
--- /dev/null
+++ b/c/src/exec/posix/headers/semaphoremp.h
@@ -0,0 +1,161 @@
+/* semaphoremp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_MP_h
+#define __RTEMS_POSIX_SEMAPHORE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote semaphore operations.
+ */
+
+typedef enum {
+ POSIX_SEMAPHORE_MP_ANNOUNCE_CREATE = 0,
+ POSIX_SEMAPHORE_MP_ANNOUNCE_DELETE = 1,
+ POSIX_SEMAPHORE_MP_EXTRACT_PROXY = 2,
+ POSIX_SEMAPHORE_MP_OBTAIN_REQUEST = 3,
+ POSIX_SEMAPHORE_MP_OBTAIN_RESPONSE = 4,
+ POSIX_SEMAPHORE_MP_RELEASE_REQUEST = 5,
+ POSIX_SEMAPHORE_MP_RELEASE_RESPONSE = 6,
+} POSIX_Semaphore_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote semaphore operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Semaphore_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Semaphore_MP_Packet;
+
+/*
+ * _POSIX_Semaphore_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Semaphore_MP_Send_process_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Semaphore_MP_Send_request_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Semaphore_MP_Send_response_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Semaphore_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Semaphore_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Semaphore_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a semaphore mp packet.
+ */
+
+POSIX_Semaphore_MP_Packet *_POSIX_Semaphore_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/headers/seterr.h b/c/src/exec/posix/headers/seterr.h
new file mode 100644
index 0000000000..5174624d43
--- /dev/null
+++ b/c/src/exec/posix/headers/seterr.h
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SET_ERRNO_h
+#define __POSIX_SET_ERRNO_h
+
+#define set_errno_and_return_minus_one( _error ) \
+ { errno = (_error); return -1; }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/headers/threadsup.h b/c/src/exec/posix/headers/threadsup.h
new file mode 100644
index 0000000000..bb800a507f
--- /dev/null
+++ b/c/src/exec/posix/headers/threadsup.h
@@ -0,0 +1,46 @@
+/* threadsup.h
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREAD_SUPPORT_h
+#define __RTEMS_POSIX_THREAD_SUPPORT_h
+
+#include <rtems/score/coresem.h>
+#include <rtems/score/tqdata.h>
+
+typedef struct {
+ pthread_attr_t Attributes;
+ int detachstate;
+ Thread_queue_Control Join_List;
+ int schedpolicy;
+ struct sched_param schedparam;
+ int ss_high_priority;
+ Watchdog_Control Sporadic_timer;
+
+ sigset_t signals_blocked;
+ sigset_t signals_pending;
+
+#if 0
+ /*
+ * POSIX Interrupts
+ */
+ unsigned32 interrupts_installed;
+ CORE_semaphore_Control Interrupt_Semaphore;
+#endif
+
+#if 0
+ /*
+ * POSIX Cancelability
+ */
+ int cancelability_state;
+ int cancelability_type;
+ int cancelation_requested;
+ Chain_Control Cancellation_Handlers;
+#endif
+
+} POSIX_API_Control;
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/headers/time.h b/c/src/exec/posix/headers/time.h
new file mode 100644
index 0000000000..0e87db388e
--- /dev/null
+++ b/c/src/exec/posix/headers/time.h
@@ -0,0 +1,50 @@
+/*
+ *
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_TIME_h
+#define __RTEMS_POSIX_TIME_h
+
+#include <rtems/score/tod.h>
+
+/*
+ * Seconds from January 1, 1970 to January 1, 1988. Used to account for
+ * differences between POSIX API and RTEMS core.
+ */
+
+#define POSIX_TIME_SECONDS_1970_THROUGH_1988 \
+ (((1987 - 1970 + 1) * TOD_SECONDS_PER_NON_LEAP_YEAR) + \
+ (4 * TOD_SECONDS_PER_DAY))
+
+/*PAGE
+ *
+ * _POSIX_Timespec_subtract
+ */
+
+void _POSIX_Timespec_subtract(
+ const struct timespec *the_start,
+ const struct timespec *end,
+ struct timespec *result
+);
+
+/*
+ * _POSIX_Timespec_to_interval
+ */
+
+Watchdog_Interval _POSIX_Timespec_to_interval(
+ const struct timespec *time
+);
+
+/*PAGE
+ *
+ * _POSIX_Interval_to_timespec
+ */
+
+void _POSIX_Interval_to_timespec(
+ Watchdog_Interval ticks,
+ struct timespec *time
+);
+
+#endif
diff --git a/c/src/exec/posix/include/aio.h b/c/src/exec/posix/include/aio.h
new file mode 100644
index 0000000000..504559c857
--- /dev/null
+++ b/c/src/exec/posix/include/aio.h
@@ -0,0 +1,137 @@
+/* aio.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_ASYNCHRONOUS_IO_h
+#define __POSIX_ASYNCHRONOUS_IO_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_ASYNCHRONOUS_IO)
+
+/*
+ * 6.7.1 Data Definitions for Asynchronous Input and Output,
+ * P1003.1b-1993, p. 151
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <time.h>
+#include <fcntl.h>
+
+/*
+ * 6.7.1.2 Manifest Constants, P1003.1b-1993, p. 153
+ */
+
+#define AIO_CANCELED 0 /* all requested operations have been canceled */
+#define AIO_NOTCANCELED 0 /* some of the operations could not be canceled */
+ /* since they are in progress */
+#define AIO_ALLDONE 0 /* none of the requested operations could be */
+ /* canceled since they are already complete */
+
+/* lio_listio() options */
+
+#define LIO_WAIT 0 /* calling process is to suspend until the */
+ /* operation is complete */
+#define LIO_NOWAIT 0 /* calling process is to continue execution while */
+ /* the operation is performed and no notification */
+ /* shall be given when the operation is completed */
+#define LIO_READ 0 /* request a read() */
+#define LIO_WRITE 0 /* request a write() */
+#define LIO_NOP 0 /* no transfer is requested */
+
+/*
+ * 6.7.1.1 Asynchronous I/O Control Block, P1003.1b-1993, p. 151
+ */
+
+struct aiocb {
+ int aio_fildes; /* File descriptor */
+ off_t aio_offset; /* File offset */
+ volatile void *aio_buf; /* Location of buffer */
+ size_t aio_nbytes; /* Length of transfer */
+ int aio_reqprio; /* Request priority offset */
+ struct sigevent aio_sigevent; /* Signal number and value */
+ int aoi_lio_opcode; /* Operation to be performed */
+};
+
+/*
+ * 6.7.2 Asynchronous Read, P1003.1b-1993, p. 154
+ */
+
+int aio_read(
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.3 Asynchronous Write, P1003.1b-1993, p. 155
+ */
+
+int aio_write(
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.4 List Directed I/O, P1003.1b-1993, p. 158
+ */
+
+int lio_listio(
+ int mode,
+ struct aiocb * const list[],
+ int nent,
+ struct sigevent *sig
+);
+
+/*
+ * 6.7.5 Retrieve Error of Asynchronous I/O Operation, P1003.1b-1993, p. 161
+ */
+
+int aio_error(
+ const struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.6 Retrieve Return Status of Asynchronous I/O Operation,
+ * P1003.1b-1993, p. 162
+ */
+
+int aio_return(
+ const struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.7 Cancel Asynchronous I/O Operation, P1003.1b-1993, p. 163
+ */
+
+int aio_cancel(
+ int filedes,
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.7 Wait for Asynchronous I/O Request, P1003.1b-1993, p. 164
+ */
+
+int aio_suspend(
+ struct aiocb * const list[],
+ int nent,
+ const struct timespec *timeout
+);
+
+#if defined(_POSIX_SYNCHRONIZED_IO)
+
+/*
+ * 6.7.9 Asynchronous File Synchronization, P1003.1b-1993, p. 166
+ */
+
+int aio_fsync(
+ int op,
+ struct aiocb *aiocbp
+);
+
+#endif /* _POSIX_SYNCHRONIZED_IO */
+
+#endif /* _POSIX_ASYNCHRONOUS_IO */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/devctl.h b/c/src/exec/posix/include/devctl.h
new file mode 100644
index 0000000000..5073b475ee
--- /dev/null
+++ b/c/src/exec/posix/include/devctl.h
@@ -0,0 +1,30 @@
+/* devctl.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_DEVICE_CONTROL_h
+#define __POSIX_DEVICE_CONTROL_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_DEVICE_CONTROL)
+
+#include <sys/types.h>
+#include <unistd.h>
+
+/*
+ * 21.2.1 Control a Device, P1003.4b/D8, p. 65
+ */
+
+int devctl(
+ int filedes,
+ void *dev_data_ptr,
+ size_t nbyte,
+ int *dev_info_ptr
+);
+
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/intr.h b/c/src/exec/posix/include/intr.h
new file mode 100644
index 0000000000..f07d1f9552
--- /dev/null
+++ b/c/src/exec/posix/include/intr.h
@@ -0,0 +1,72 @@
+/* intr.h
+ *
+ * XXX: It is unclear if the type "intr_t" should be defined when
+ * _POSIX_INTERRUPT_CONTROL is not.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_INTERRUPTS_h
+#define __POSIX_INTERRUPTS_h
+
+#include <rtems/posix/features.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#if defined(_POSIX_INTERRUPT_CONTROL)
+
+/*
+ * 22.2 Concepts, P1003.4b/D8, p. 73
+ */
+
+typedef int intr_t;
+
+/*
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+/*
+ * Return codes from an interrupt handler
+ */
+
+#define INTR_HANDLED_NOTIFY 0 /* ISR handled this interrupt, notify */
+ /* the thread that registered the */
+ /* ISR that the interrupt occurred. */
+#define INTR_HANDLED_DO_NOT_NOTIFY 1 /* ISR handled this interrupt, but */
+ /* do NOT perform notification. */
+#define INTR_NOT_HANDLED 2 /* ISR did not handle this interrupt, */
+ /* let the next handler try. */
+
+int intr_capture(
+ intr_t intr,
+ int (*intr_handler)( void *area ),
+ volatile void *area,
+ size_t areasize
+);
+
+int intr_release(
+ intr_t intr,
+ int (*intr_handler)( void *area )
+);
+
+int intr_lock(
+ intr_t intr
+);
+
+int intr_unlock(
+ intr_t intr
+);
+
+/*
+ * 22.3.2 Await Interrupt Notification, P1003.4b/D8, p. 76
+ */
+
+int intr_timed_wait(
+ int flags,
+ const struct timespec *timeout
+);
+
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/limits.h b/c/src/exec/posix/include/limits.h
new file mode 100644
index 0000000000..e8ac4bf2fd
--- /dev/null
+++ b/c/src/exec/posix/include/limits.h
@@ -0,0 +1,164 @@
+/* limits.h
+ *
+ * This file lists the minimums for the limits set by each of
+ * the POSIX features subsets.
+ *
+ * XXX: Careful attention needs to be paid to section 2.8 in 1003.1b-1993
+ * to segregrate the variables below based on their "class" according
+ * to our implementation. We also need to set the Run-Time Invariant
+ * and other related values.
+ *
+ * $Id$
+ */
+
+#include_next <limits.h>
+
+#ifndef __POSIX_LIMITS_h
+#define __POSIX_LIMITS_h
+
+/* really only to get min stack size from <rtems/score/cpu.h> */
+#include <rtems/system.h>
+
+/****************************************************************************
+ ****************************************************************************
+ * *
+ * P1003.1b-1993 defines the constants below this comment. *
+ * *
+ ****************************************************************************
+ ****************************************************************************/
+
+#define _POSIX_AIO_LISTIO_MAX 2
+#define _POSIX_AIO_MAX 1
+#define _POSIX_ARG_MAX 4096
+#define _POSIX_CHILD_MAX 6
+#define _POSIX_DELAYTIMER_MAX 32
+#define _POSIX_LINK_MAX 8
+#define _POSIX_MAX_CANON 255
+#define _POSIX_MAX_INPUT 255
+#define _POSIX_MQ_OPEN_MAX 8
+#define _POSIX_MQ_PRIO_MAX 32
+#define _POSIX_NAME_MAX 14
+#define _POSIX_NGROUPS_MAX 0
+#define _POSIX_OPEN_MAX 16
+#define _POSIX_PATH_MAX 255
+#define _POSIX_PIPE_BUF 512
+#define _POSIX_RTSIG_MAX 8
+#define _POSIX_SEM_NSEMS_MAX 256
+#define _POSIX_SEM_VALUE_MAX 32767
+#define _POSIX_SIGQUEUE_MAX 32
+#define _POSIX_SSIZE_MAX 32767
+#define _POSIX_STREAM_MAX 8
+#define _POSIX_TIMER_MAX 32
+#define _POSIX_TZNAME_MAX 3
+
+/*
+ * Definitions of the following may be omitted if the value is >= stated
+ * minimum but is indeterminate.
+ */
+
+#define AIO_LISTIO_MAX 2
+#define AIO_MAX 1
+#define AIO_PRIO_DELTA_MAX 0
+#define ARG_MAX 4096
+#define CHILD_MAX 6
+#define DELAYTIMER_MAX 32
+#define MQ_OPEN_MAX 8
+#define MQ_PRIO_MAX 32
+#define OPEN_MAX 16
+#define PAGESIZE 1
+#define RTSIG_MAX 8
+#define SEM_NSEMS_MAX 256
+#define SEM_VALUE_MAX 32767
+#define SIGQUEUE_MAX 32
+#define STREAM_MAX 8
+#define TIMER_MAX 32
+#define TZNAME_MAX 3
+
+/*
+ * Pathname Variables
+ */
+
+#define LINK_MAX 8
+#define MAX_CANON 255
+#define MAX_INPUT 255
+#define NAME_MAX 14
+#define PATH_MAX 255
+#define PIPE_BUF 512
+
+/*
+ * Invariant values
+ */
+
+#define SSIZE_MAX 32767
+
+/*
+ * Maximum Values
+ */
+
+#define _POSIX_CLOCKRES_MIN 0 /* in nanoseconds */
+
+/****************************************************************************
+ ****************************************************************************
+ * *
+ * P1003.1c/D10 defines the constants below this comment. *
+ *
+ * XXX: doc seems to have printing problems in this table :(
+ * *
+ ****************************************************************************
+ ****************************************************************************/
+
+#define _POSIX_LOGIN_NAME_MAX 9
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4
+#define _POSIX_THREAD_KEYS_MAX 28
+#define _POSIX_THREAD_THREADS_MAX 64
+#define _POSIX_TTY_NAME_MAX 9
+
+/*
+ * Definitions of the following may be omitted if the value is >= stated
+ * minimum but is indeterminate.
+ */
+
+#define LOGIN_NAME_MAX _POSIX_LOGIN_NAME_MAX
+#define TTY_NAME_MAX _POSIX_TTY_NAME_MAX
+#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS
+#define PTHREAD_STACK_MIN CPU_STACK_MINIMUM_SIZE
+
+/*
+ * The maximum number of keys (PTHREAD_KEYS_MAX) and threads
+ * (PTHREAD_THREADS_MAX) are configurable and may exceed the minimum.
+ *
+#define PTHREAD_KEYS_MAX _POSIX_THREAD_KEYS_MAX
+#define PTHREAD_THREADS_MAX _POSIX_THREAD_THREADS_MAX
+*/
+
+
+/****************************************************************************
+ ****************************************************************************
+ * *
+ * P1003.4b/D8 defines the constants below this comment. *
+ * *
+ ****************************************************************************
+ ****************************************************************************/
+
+#define _POSIX_INTERRUPT_OVERRUN_MAX 32
+
+/*
+ * Definitions of the following may be omitted if the value is >= stated
+ * minimum but is indeterminate.
+ */
+
+#define INTERRUPT_OVERRUN_MAX 32
+
+/*
+ * Pathname Variables
+ */
+
+#define MIN_ALLOC_SIZE
+#define REC_MIN_XFER_SIZE
+#define REC_MAX_XFER_SIZE
+#define REC_INCR_XFER_SIZE
+#define REC_XFER_ALIGN
+#define MAX_ATOMIC_SIZE
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/mqueue.h b/c/src/exec/posix/include/mqueue.h
new file mode 100644
index 0000000000..f1b2250e5c
--- /dev/null
+++ b/c/src/exec/posix/include/mqueue.h
@@ -0,0 +1,145 @@
+/* mqueue.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_MESSAGE_QUEUE_h
+#define __POSIX_MESSAGE_QUEUE_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_MESSAGE_PASSING)
+
+#include <sys/types.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+
+/*
+ * 15.1.1 Data Structures, P1003.1b-1993, p. 271
+ */
+
+typedef Objects_Id mqd_t;
+
+struct mq_attr {
+ long mq_flags; /* Message queue flags */
+ long mq_maxmsg; /* Maximum number of messages */
+ long mq_msgsize; /* Maximum message size */
+ long mq_curmsgs; /* Number of messages currently queued */
+};
+
+/*
+ * 15.2.2 Open a Message Queue, P1003.1b-1993, p. 272
+ */
+
+mqd_t mq_open(
+ const char *name,
+ int oflag,
+ ...
+);
+
+/*
+ * 15.2.2 Close a Message Queue, P1003.1b-1993, p. 275
+ */
+
+int mq_close(
+ mqd_t mqdes
+);
+
+/*
+ * 15.2.2 Remove a Message Queue, P1003.1b-1993, p. 276
+ */
+
+int mq_unlink(
+ const char *name
+);
+
+/*
+ * 15.2.4 Send a Message to a Message Queue, P1003.1b-1993, p. 277
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedsend().
+ */
+
+int mq_send(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+#include <time.h>
+
+int mq_timedsend(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+/*
+ * 15.2.5 Receive a Message From a Message Queue, P1003.1b-1993, p. 279
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedreceive().
+ */
+
+ssize_t mq_receive(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+int mq_timedreceive( /* XXX: should this be ssize_t */
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+#if defined(_POSIX_REALTIME_SIGNALS)
+
+/*
+ * 15.2.6 Notify Process that a Message is Available on a Queue,
+ * P1003.1b-1993, p. 280
+ */
+
+int mq_notify(
+ mqd_t mqdes,
+ const struct sigevent *notification
+);
+
+#endif /* _POSIX_REALTIME_SIGNALS */
+
+/*
+ * 15.2.7 Set Message Queue Attributes, P1003.1b-1993, p. 281
+ */
+
+int mq_setattr(
+ mqd_t mqdes,
+ const struct mq_attr *mqstat,
+ struct mq_attr *omqstat
+);
+
+/*
+ * 15.2.8 Get Message Queue Attributes, P1003.1b-1993, p. 283
+ */
+
+int mq_getattr(
+ mqd_t mqdes,
+ struct mq_attr *mqstat
+);
+
+#endif /* _POSIX_MESSAGE_PASSING */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/pthread.h b/c/src/exec/posix/include/pthread.h
new file mode 100644
index 0000000000..d70a794f38
--- /dev/null
+++ b/c/src/exec/posix/include/pthread.h
@@ -0,0 +1,500 @@
+/* pthread.h
+ *
+ * $Id$
+ */
+
+#ifndef __PTHREAD_h
+#define __PTHREAD_h
+
+#include <sys/features.h>
+
+#if defined(_POSIX_THREADS)
+
+#include <sys/types.h>
+#include <time.h>
+#include <sys/sched.h>
+
+/*
+ * 3.1.3 Register Fork Handlers, P1003.1c/Draft 10, P1003.1c/Draft 10, p. 27
+ *
+ * RTEMS does not support processes, so we fall under this and do not
+ * provide this routine:
+ *
+ * "Either the implementation shall support the pthread_atfork() function
+ * as described above or the pthread_atfork() funciton shall not be
+ * provided."
+ */
+
+/*
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_init(
+ pthread_mutexattr_t *attr
+);
+
+int pthread_mutexattr_destroy(
+ pthread_mutexattr_t *attr
+);
+
+int pthread_mutexattr_getpshared(
+ const pthread_mutexattr_t *attr,
+ int *pshared
+);
+
+int pthread_mutexattr_setpshared(
+ pthread_mutexattr_t *attr,
+ int pshared
+);
+
+/*
+ * 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_mutex_init(
+ pthread_mutex_t *mutex,
+ const pthread_mutexattr_t *attr
+);
+
+int pthread_mutex_destroy(
+ pthread_mutex_t *mutex
+);
+
+/*
+ * This is used to statically initialize a pthread_mutex_t. Example:
+ *
+ * pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ */
+
+#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF)
+
+/*
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_lock(
+ pthread_mutex_t *mutex
+);
+
+int pthread_mutex_trylock(
+ pthread_mutex_t *mutex
+);
+
+int pthread_mutex_unlock(
+ pthread_mutex_t *mutex
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+int pthread_mutex_timedlock(
+ pthread_mutex_t *mutex,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+/*
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_init(
+ pthread_condattr_t *attr
+);
+
+int pthread_condattr_destroy(
+ pthread_condattr_t *attr
+);
+
+int pthread_condattr_getpshared(
+ const pthread_condattr_t *attr,
+ int *pshared
+);
+
+int pthread_condattr_setpshared(
+ pthread_condattr_t *attr,
+ int pshared
+);
+
+/*
+ * 11.4.2 Initializing and Destroying a Condition Variable,
+ * P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_cond_init(
+ pthread_cond_t *cond,
+ const pthread_condattr_t *attr
+);
+
+int pthread_cond_destroy(
+ pthread_cond_t *mutex
+);
+
+/*
+ * This is used to statically initialize a pthread_cond_t. Example:
+ *
+ * pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ */
+
+#define PTHREAD_COND_INITIALIZER ((pthread_mutex_t) 0xFFFFFFFF)
+
+/*
+ * 11.4.3 Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101
+ */
+
+int pthread_cond_signal(
+ pthread_cond_t *cond
+);
+
+int pthread_cond_broadcast(
+ pthread_cond_t *cond
+);
+
+/*
+ * 11.4.4 Waiting on a Condition, P1003.1c/Draft 10, p. 105
+ */
+
+int pthread_cond_wait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex
+);
+
+int pthread_cond_timedwait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ const struct timespec *abstime
+);
+
+#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING)
+
+/*
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setscope(
+ pthread_attr_t *attr,
+ int contentionscope
+);
+
+int pthread_attr_getscope(
+ const pthread_attr_t *attr,
+ int *contentionscope
+);
+
+int pthread_attr_setinheritsched(
+ pthread_attr_t *attr,
+ int inheritsched
+);
+
+int pthread_attr_getinheritsched(
+ const pthread_attr_t *attr,
+ int *inheritsched
+);
+
+int pthread_attr_setschedpolicy(
+ pthread_attr_t *attr,
+ int policy
+);
+
+int pthread_attr_getschedpolicy(
+ const pthread_attr_t *attr,
+ int *policy
+);
+
+#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */
+
+int pthread_attr_setschedparam(
+ pthread_attr_t *attr,
+ const struct sched_param *param
+);
+
+int pthread_attr_getschedparam(
+ const pthread_attr_t *attr,
+ struct sched_param *param
+);
+
+#if defined(_POSIX_THREAD_PRIORITY_SCHEDULING)
+
+/*
+ * 13.5.2 Dynamic Thread Scheduling Parameters Access,
+ * P1003.1c/Draft 10, p. 124
+ */
+
+int pthread_getschedparam(
+ pthread_t thread,
+ int *policy,
+ struct sched_param *param
+);
+
+int pthread_setschedparam(
+ pthread_t thread,
+ int policy,
+ struct sched_param *param
+);
+
+#endif /* defined(_POSIX_THREAD_PRIORITY_SCHEDULING) */
+
+#if defined(_POSIX_THREAD_PRIO_INHERIT) || defined(_POSIX_THREAD_PRIO_PROTECT)
+
+/*
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_setprotocol(
+ pthread_mutexattr_t *attr,
+ int protocol
+);
+
+int pthread_mutexattr_getprotocol(
+ const pthread_mutexattr_t *attr,
+ int *protocol
+);
+
+int pthread_mutexattr_setprioceiling(
+ pthread_mutexattr_t *attr,
+ int prioceiling
+);
+
+int pthread_mutexattr_getprioceiling(
+ const pthread_mutexattr_t *attr,
+ int *prioceiling
+);
+
+#endif /* _POSIX_THREAD_PRIO_INHERIT || _POSIX_THREAD_PRIO_PROTECT */
+
+#if defined(_POSIX_THREAD_PRIO_PROTECT)
+
+/*
+ * 13.6.2 Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131
+ */
+
+int pthread_mutex_setprioceiling(
+ pthread_mutex_t *mutex,
+ int prioceiling,
+ int *old_ceiling
+);
+
+int pthread_mutex_getprioceiling(
+ pthread_mutex_t *mutex,
+ int *prioceiling
+);
+
+#endif /* _POSIX_THREAD_PRIO_PROTECT */
+
+/*
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_init(
+ pthread_attr_t *attr
+);
+
+int pthread_attr_destroy(
+ pthread_attr_t *attr
+);
+
+int pthread_attr_getstacksize(
+ const pthread_attr_t *attr,
+ size_t *stacksize
+);
+
+int pthread_attr_setstacksize(
+ pthread_attr_t *attr,
+ size_t stacksize
+);
+
+int pthread_attr_getstackaddr(
+ const pthread_attr_t *attr,
+ void **stackaddr
+);
+
+int pthread_attr_setstackaddr(
+ pthread_attr_t *attr,
+ void *stackaddr
+);
+
+int pthread_attr_getdetachstate(
+ const pthread_attr_t *attr,
+ int *detachstate
+);
+
+int pthread_attr_setdetachstate(
+ pthread_attr_t *attr,
+ int detachstate
+);
+
+/*
+ * 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144
+ */
+
+int pthread_create(
+ pthread_t *thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)( void * ),
+ void *arg
+);
+
+/*
+ * 16.1.3 Wait for Thread Termination, P1003.1c/Draft 10, p. 147
+ */
+
+int pthread_join(
+ pthread_t thread,
+ void **value_ptr
+);
+
+/*
+ * 16.1.4 Detaching a Thread, P1003.1c/Draft 10, p. 149
+ */
+
+int pthread_detach(
+ pthread_t thread
+);
+
+/*
+ * 16.1.5.1 Thread Termination, p1003.1c/Draft 10, p. 150
+ */
+
+void pthread_exit(
+ void *value_ptr
+);
+
+/*
+ * 16.1.6 Get Calling Thread's ID, p1003.1c/Draft 10, p. XXX
+ */
+
+pthread_t pthread_self( void );
+
+/*
+ * 16.1.7 Compare Thread IDs, p1003.1c/Draft 10, p. 153
+ */
+
+int pthread_equal(
+ pthread_t t1,
+ pthread_t t2
+);
+
+/*
+ * 16.1.8 Dynamic Package Initialization
+ */
+
+/*
+ * This is used to statically initialize a pthread_once_t. Example:
+ *
+ * pthread_once_t once = PTHREAD_ONCE_INIT;
+ *
+ * NOTE: This is named inconsistently -- it should be INITIALIZER.
+ */
+
+#define PTHREAD_ONCE_INIT { 1, 0 } /* is initialized and not run */
+
+int pthread_once(
+ pthread_once_t *once_control,
+ void (*init_routine)(void)
+);
+
+/*
+ * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163
+ */
+
+int pthread_key_create(
+ pthread_key_t *key,
+ void (*destructor)( void * )
+);
+
+/*
+ * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
+ */
+
+int pthread_setspecific(
+ pthread_key_t key,
+ const void *value
+);
+
+void *pthread_getspecific(
+ pthread_key_t key
+);
+
+/*
+ * 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167
+ */
+
+int pthread_key_delete(
+ pthread_key_t key
+);
+
+/*
+ * 18.2.1 Canceling Execution of a Thread, P1003.1c/Draft 10, p. 181
+ */
+
+#define PTHREAD_CANCEL_ENABLE 0
+#define PTHREAD_CANCEL_DISABLE 1
+
+#define PTHREAD_CANCEL_DEFERRED 0
+#define PTHREAD_CANCEL_ASYNCHRONOUS 1
+
+int pthread_cancel(
+ pthread_t thread
+);
+
+/*
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+int pthread_setcancelstate(
+ int state,
+ int *oldstate
+);
+
+int pthread_setcanceltype(
+ int type,
+ int *oldtype
+);
+
+void pthread_testcancel( void );
+
+/*
+ * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184
+ */
+
+void pthread_cleanup_push(
+ void (*routine)( void * ),
+ void *arg
+);
+
+void pthread_cleanup_pop(
+ int execute
+);
+
+#if defined(_POSIX_THREAD_CPUTIME)
+
+/*
+ * 20.1.6 Accessing a Thread CPU-time Clock, P1003.4b/D8, p. 58
+ */
+
+int pthread_getcpuclockid(
+ pthread_t thread_id,
+ clockid_t *clock_id
+);
+
+/*
+ * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/D8, p. 59
+ */
+
+int pthread_attr_setcputime(
+ pthread_attr_t *attr,
+ int clock_allowed
+);
+
+int pthread_attr_getcputime(
+ pthread_attr_t *attr,
+ int *clock_allowed
+);
+
+#endif /* defined(_POSIX_THREAD_CPUTIME) */
+
+#endif /* defined(_POSIX_THREADS) */
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/rtems/posix/Makefile.in b/c/src/exec/posix/include/rtems/posix/Makefile.in
new file mode 100644
index 0000000000..7769a4cada
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES= cond condmp config key mutex mutexmp posixapi \
+ priority psignal pthread pthreadmp seterr threadsup time
+#H_PIECES= cancel cond condmp intr key mqueue mqueuemp mutex \
+# mutexmp pthread pthreadmp priority semaphore semaphoremp threadsup \
+# time
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/posix
diff --git a/c/src/exec/posix/include/rtems/posix/cancel.h b/c/src/exec/posix/include/rtems/posix/cancel.h
new file mode 100644
index 0000000000..e6d80275f4
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/cancel.h
@@ -0,0 +1,16 @@
+/* rtems/posix/cancel.h
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CANCEL_h
+#define __RTEMS_POSIX_CANCEL_h
+
+typedef struct {
+ Chain_Node Node;
+ void (*routine)( void * );
+ void *arg;
+} POSIX_Cancel_Handler_control;
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/rtems/posix/cond.h b/c/src/exec/posix/include/rtems/posix/cond.h
new file mode 100644
index 0000000000..24dbcbfef6
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/cond.h
@@ -0,0 +1,130 @@
+/* rtems/posix/cond.h
+ *
+ * This include file contains all the private support information for
+ * POSIX condition variables.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_h
+#define __RTEMS_POSIX_CONDITION_VARIABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/threadq.h>
+
+/*
+ * Constant to indicate condition variable does not currently have
+ * a mutex assigned to it.
+ */
+
+#define POSIX_CONDITION_VARIABLES_NO_MUTEX 0
+
+/*
+ * Data Structure used to manage a POSIX condition variable
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ pthread_mutex_t Mutex;
+ Thread_queue_Control Wait_queue;
+} POSIX_Condition_variables_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Condition_variables_Information;
+
+/*
+ * _POSIX_Condition_variables_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Condition_variables_Manager_initialization(
+ unsigned32 maximum_condition_variables
+);
+
+/*
+ * _POSIX_Condition_variables_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a condition variable control block from
+ * the inactive chain of free condition variable control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *
+ _POSIX_Condition_variables_Allocate( void );
+
+/*
+ * _POSIX_Condition_variables_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a condition variable control block to the
+ * inactive chain of free condition variable control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
+ POSIX_Condition_variables_Control *the_condition_variable
+);
+
+/*
+ * _POSIX_Condition_variables_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps condition variable IDs to condition variable control
+ * blocks. If ID corresponds to a local condition variable, then it returns
+ * the_condition variable control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the condition variable ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_condition variable is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_condition variable is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Condition_variables_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_condition variable is NULL
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Condition_variables_Is_null (
+ POSIX_Condition_variables_Control *the_condition_variable
+);
+
+#include <rtems/posix/cond.inl>
+#include <rtems/posix/condmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/condmp.h b/c/src/exec/posix/include/rtems/posix/condmp.h
new file mode 100644
index 0000000000..75ab97a63b
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/condmp.h
@@ -0,0 +1,162 @@
+/* condmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Condition Variable Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_MP_h
+#define __RTEMS_POSIX_CONDITION_VARIABLES_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote condition variable operations.
+ */
+
+typedef enum {
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_CREATE = 0,
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_DELETE = 1,
+ POSIX_CONDITION_VARIABLES_MP_EXTRACT_PROXY = 2,
+ POSIX_CONDITION_VARIABLES_MP_OBTAIN_REQUEST = 3,
+ POSIX_CONDITION_VARIABLES_MP_OBTAIN_RESPONSE = 4,
+ POSIX_CONDITION_VARIABLES_MP_RELEASE_REQUEST = 5,
+ POSIX_CONDITION_VARIABLES_MP_RELEASE_RESPONSE = 6,
+} POSIX_Condition_variables_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote condition variable operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Condition_variables_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Condition_variables_MP_Packet;
+
+/*
+ * _POSIX_Condition_variables_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Condition_variables_MP_Send_process_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Condition_variables_MP_Send_request_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Condition_variables_MP_Send_response_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Condition_variables_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Condition_variables_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Condition_variables_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Condition_variables_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a condition variable mp packet.
+ */
+
+POSIX_Condition_variables_MP_Packet
+ *_POSIX_Condition_variables_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/include/rtems/posix/config.h b/c/src/exec/posix/include/rtems/posix/config.h
new file mode 100644
index 0000000000..a0851ad77f
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/config.h
@@ -0,0 +1,59 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters specific for the POSIX API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONFIGURATION_h
+#define __RTEMS_POSIX_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * XXX
+ *
+ * The following records define the Configuration Table. The
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + required number of each object type
+ */
+
+/*
+ * For now, we are only allowing the user to specify the entry point
+ * for posix initialization threads.
+ */
+
+typedef struct {
+ void *(*entry)(void *);
+} posix_initialization_threads_table;
+
+typedef struct {
+ int maximum_threads;
+ int maximum_mutexes;
+ int maximum_condition_variables;
+ int maximum_keys;
+ int maximum_queued_signals;
+ int number_of_initialization_threads;
+ posix_initialization_threads_table *User_initialization_threads_table;
+} posix_api_configuration_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/rtems/posix/intr.h b/c/src/exec/posix/include/rtems/posix/intr.h
new file mode 100644
index 0000000000..85ae20de93
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/intr.h
@@ -0,0 +1,154 @@
+/* rtems/posix/intr.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Interrupt Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_h
+#define __RTEMS_POSIX_KEY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+
+/*
+ * Data Structure used to manage each POSIX Interrupt Vector
+ */
+
+typedef struct {
+ int number_installed;
+ int lock_count;
+ int deferred_count;
+ Chain_Control Handlers;
+} POSIX_Interrupt_Control;
+
+/*
+ * Data Structure used to manage a POSIX Interrupt Handler
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int is_active;
+ intr_t vector;
+ Thread_Control *server;
+ int (*handler)( void *area );
+ volatile void *user_data_area;
+} POSIX_Interrupt_Handler_control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Interrupt_Handlers_Information;
+
+/*
+ * The following is an array which is used to manage the set of
+ * interrupt handlers installed on each vector.
+ */
+
+POSIX_EXTERN POSIX_Interrupt_Control
+ _POSIX_Interrupt_Information[ ISR_NUMBER_OF_VECTORS ];
+
+/*
+ * _POSIX_Interrupt_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Interrupt_Manager_initialization(
+ unsigned32 maximum_interrupt_handlers
+);
+
+/*
+ * _POSIX_Interrupt_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a interrupt handler control block from
+ * the inactive chain of free interrupt handler control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Handler_control *
+ _POSIX_Interrupt_Allocate( void );
+
+/*
+ * _POSIX_Interrupt_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a interrupt handler control block to the
+ * inactive chain of free interrupt handler control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Interrupt_Free (
+ POSIX_Interrupt_Handler_control *the_intr
+);
+
+/*
+ * _POSIX_Interrupt_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps interrupt handler IDs to interrupt handler control
+ * blocks. If ID corresponds to a local interrupt handler, then it returns
+ * the_intr control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the interrupt handler ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_intr is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_intr is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Control *_POSIX_Interrupt_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Interrupt_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_intr is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Interrupt_Is_null (
+ POSIX_Interrupt_Handler_control *the_intr
+);
+
+/*
+ * _POSIX_Interrupt_Handler
+ *
+ * DESCRIPTION:
+ *
+ * This function XXX.
+ */
+
+void _POSIX_Interrupt_Handler(
+ ISR_Vector_number vector
+);
+
+#include <rtems/posix/intr.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/key.h b/c/src/exec/posix/include/rtems/posix/key.h
new file mode 100644
index 0000000000..11cb365905
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/key.h
@@ -0,0 +1,136 @@
+/* rtems/posix/key.h
+ *
+ * This include file contains all the private support information for
+ * POSIX key.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_h
+#define __RTEMS_POSIX_KEY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Data Structure used to manage a POSIX key
+ *
+ * NOTE: The Values is a table indexed by the index portion of the
+ * ID of the currently executing thread.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ boolean is_active;
+ void (*destructor)( void * );
+ void **Values[ OBJECTS_CLASSES_LAST_THREAD_CLASS + 1 ];
+} POSIX_Keys_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Keys_Information;
+
+/*
+ * _POSIX_Keys_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Key_Manager_initialization(
+ unsigned32 maximum_keys
+);
+
+/*
+ * _POSIX_Keys_Run_destructors
+ *
+ * DESCRIPTION:
+ *
+ * This function executes all the destructors associated with the thread's
+ * keys. This function will execute until all values have been set to NULL.
+ *
+ * NOTE: This is the routine executed when a thread exits to
+ * run through all the keys and do the destructor action.
+ */
+
+void _POSIX_Keys_Run_destructors(
+ Thread_Control *thread
+);
+
+/*
+ * _POSIX_Keys_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a keys control block from
+ * the inactive chain of free keys control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void );
+
+/*
+ * _POSIX_Keys_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a keys control block to the
+ * inactive chain of free keys control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
+ POSIX_Keys_Control *the_key
+);
+
+/*
+ * _POSIX_Keys_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps key IDs to key control blocks.
+ * If ID corresponds to a local keys, then it returns
+ * the_key control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the keys ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_key is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_key is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Keys_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_key is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Keys_Is_null (
+ POSIX_Keys_Control *the_key
+);
+
+#include <rtems/posix/key.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/mqueue.h b/c/src/exec/posix/include/rtems/posix/mqueue.h
new file mode 100644
index 0000000000..2301bcef4c
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/mqueue.h
@@ -0,0 +1,186 @@
+/* rtems/posix/mqueue.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Message Queues.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_h
+#define __RTEMS_POSIX_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coremsg.h>
+#include <rtems/score/object.h>
+
+/*
+ * Data Structure used to manage a POSIX message queue
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ int flags;
+ boolean named;
+ boolean linked;
+ boolean blocking;
+ unsigned32 open_count;
+ CORE_message_queue_Control Message_queue;
+ struct sigevent notification;
+} POSIX_Message_queue_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Message_queue_Information;
+
+/*
+ * _POSIX_Message_queue_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+);
+
+/*
+ *
+ * _POSIX_Message_queue_Create_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the creation of a message queue utilizing the
+ * core message queue.
+ */
+
+int _POSIX_Message_queue_Create_support(
+ const char *name,
+ int pshared,
+ unsigned int oflag,
+ struct mq_attr *attr,
+ POSIX_Message_queue_Control **message_queue
+);
+
+/*
+ *
+ * _POSIX_Message_queue_Send_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts a message to a specified message queue.
+ */
+
+int _POSIX_Message_queue_Send_support(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ unsigned32 msg_len,
+ Priority_Control msg_prio,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Message_queue_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message queue control block from
+ * the inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void );
+
+/*
+ * _POSIX_Message_queue_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a message queue control block to the
+ * inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
+ POSIX_Message_queue_Control *the_mq
+);
+
+/*
+ * _POSIX_Message_queue_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps message queue IDs to message queue control blocks.
+ * If ID corresponds to a local message queue, then it returns
+ * the_mq control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the message queue ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_message queue is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_mq is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_message_queue is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Message_queue_Is_null (
+ POSIX_Message_queue_Control *the_mq
+);
+
+/*
+ * _POSIX_Message_queue_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+int _POSIX_Message_queue_Name_to_id(
+ const char *name,
+ Objects_Id *id
+);
+
+/*
+ * _POSIX_Message_queue_Priority_to_core
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Message_queue_Priority_to_core(
+ unsigned int priority
+);
+
+#include <rtems/posix/mqueue.inl>
+#include <rtems/posix/mqueuemp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/mqueuemp.h b/c/src/exec/posix/include/rtems/posix/mqueuemp.h
new file mode 100644
index 0000000000..c5fb1232ec
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/mqueuemp.h
@@ -0,0 +1,161 @@
+/* mqueuemp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Message Queue Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_MP_h
+#define __RTEMS_POSIX_MESSAGE_QUEUE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote message queue operations.
+ */
+
+typedef enum {
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_CREATE = 0,
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_DELETE = 1,
+ POSIX_MESSAGE_QUEUE_MP_EXTRACT_PROXY = 2,
+ POSIX_MESSAGE_QUEUE_MP_OBTAIN_REQUEST = 3,
+ POSIX_MESSAGE_QUEUE_MP_OBTAIN_RESPONSE = 4,
+ POSIX_MESSAGE_QUEUE_MP_RELEASE_REQUEST = 5,
+ POSIX_MESSAGE_QUEUE_MP_RELEASE_RESPONSE = 6,
+} POSIX_Message_queue_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote message queue operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Message_queue_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Message_queue_MP_Packet;
+
+/*
+ * _POSIX_Message_queue_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Message_queue_MP_Send_process_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Message_queue_MP_Send_request_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Message_queue_MP_Send_response_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Message_queue_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Message_queue_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Message_queue_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a message queue mp packet.
+ */
+
+POSIX_Message_queue_MP_Packet *_POSIX_Message_queue_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/include/rtems/posix/mutex.h b/c/src/exec/posix/include/rtems/posix/mutex.h
new file mode 100644
index 0000000000..9a3fedc444
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/mutex.h
@@ -0,0 +1,120 @@
+/* rtems/posix/mutex.h
+ *
+ * This include file contains all the private support information for
+ * POSIX mutex's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_h
+#define __RTEMS_POSIX_MUTEX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coremutex.h>
+#include <pthread.h>
+
+/*
+ * Data Structure used to manage a POSIX mutex
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ CORE_mutex_Control Mutex;
+} POSIX_Mutex_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Mutex_Information;
+
+/*
+ * _POSIX_Mutex_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Mutex_Manager_initialization(
+ unsigned32 maximum_mutexes
+);
+
+/*
+ * _POSIX_Mutex_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a mutexes control block from
+ * the inactive chain of free mutexes control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void );
+
+/*
+ * _POSIX_Mutex_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a mutexes control block to the
+ * inactive chain of free mutexes control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free (
+ POSIX_Mutex_Control *the_mutex
+);
+
+/*
+ * _POSIX_Mutex_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps mutexes IDs to mutexes control blocks.
+ * If ID corresponds to a local mutexes, then it returns
+ * the_mutex control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the mutexes ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_mutex is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_mutex is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Mutex_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_mutex is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Mutex_Is_null (
+ POSIX_Mutex_Control *the_mutex
+);
+
+#include <rtems/posix/mutex.inl>
+#include <rtems/posix/mutexmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/mutexmp.h b/c/src/exec/posix/include/rtems/posix/mutexmp.h
new file mode 100644
index 0000000000..d58f34925a
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/mutexmp.h
@@ -0,0 +1,161 @@
+/* mutexmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Mutex Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_MP_h
+#define __RTEMS_POSIX_MUTEX_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote mutex operations.
+ */
+
+typedef enum {
+ POSIX_MUTEX_MP_ANNOUNCE_CREATE = 0,
+ POSIX_MUTEX_MP_ANNOUNCE_DELETE = 1,
+ POSIX_MUTEX_MP_EXTRACT_PROXY = 2,
+ POSIX_MUTEX_MP_OBTAIN_REQUEST = 3,
+ POSIX_MUTEX_MP_OBTAIN_RESPONSE = 4,
+ POSIX_MUTEX_MP_RELEASE_REQUEST = 5,
+ POSIX_MUTEX_MP_RELEASE_RESPONSE = 6,
+} POSIX_Mutex_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote mutex operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Mutex_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Mutex_MP_Packet;
+
+/*
+ * _POSIX_Mutex_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Mutex_MP_Send_process_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Mutex_MP_Send_request_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Mutex_MP_Send_response_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Mutex_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Mutex_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Mutex_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Mutex_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Mutex_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a mutex mp packet.
+ */
+
+POSIX_Mutex_MP_Packet *_POSIX_Mutex_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/include/rtems/posix/posixapi.h b/c/src/exec/posix/include/rtems/posix/posixapi.h
new file mode 100644
index 0000000000..5da4d6a1e2
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/posixapi.h
@@ -0,0 +1,34 @@
+/*
+ * POSIX API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_API_h
+#define __POSIX_API_h
+
+#include <rtems/config.h>
+
+/*PAGE
+ *
+ * _POSIX_API_Initialize
+ *
+ * XXX
+ */
+
+void _POSIX_API_Initialize(
+ rtems_configuration_table *configuration_table
+);
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/rtems/posix/priority.h b/c/src/exec/posix/include/rtems/posix/priority.h
new file mode 100644
index 0000000000..c0253f3bab
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/priority.h
@@ -0,0 +1,44 @@
+/*
+ *
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_PRIORITY_h
+#define __RTEMS_POSIX_PRIORITY_h
+
+#include <rtems/score/priority.h>
+
+/*
+ * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
+ *
+ * "Numericallly higher values represent higher priorities."
+ *
+ * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
+ *
+ * There are only 254 posix priority levels since a task at priority level
+ * 255 would never run because of the RTEMS idle task. This is necessary
+ * because GNAT maps the lowest Ada task priority to the lowest thread
+ * priority. The lowest priority Ada task should get to run, so there is
+ * a fundamental conflict with having 255 priorities.
+ */
+
+#define POSIX_SCHEDULER_MAXIMUM_PRIORITY (254)
+
+#define POSIX_SCHEDULER_MINIMUM_PRIORITY (1)
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Priority_Is_valid(
+ int priority
+);
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
+ int priority
+);
+
+RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
+ Priority_Control priority
+);
+
+#include <rtems/posix/priority.inl>
+
+#endif
diff --git a/c/src/exec/posix/include/rtems/posix/psignal.h b/c/src/exec/posix/include/rtems/posix/psignal.h
new file mode 100644
index 0000000000..9c66881076
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/psignal.h
@@ -0,0 +1,17 @@
+/*
+ * $Id$
+ */
+
+#ifndef __POSIX_SIGNALS_h
+#define __POSIX_SIGNALS_h
+
+void _POSIX_signals_Manager_Initialization(
+ int maximum_queued_signals
+);
+
+void _POSIX_signals_Post_switch_extension(
+ Thread_Control *the_thread
+);
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/include/rtems/posix/pthread.h b/c/src/exec/posix/include/rtems/posix/pthread.h
new file mode 100644
index 0000000000..29d9a7eef9
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/pthread.h
@@ -0,0 +1,123 @@
+/* rtems/posix/pthread.h
+ *
+ * This include file contains all the private support information for
+ * POSIX threads.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_h
+#define __RTEMS_POSIX_THREADS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/posix/config.h>
+#include <rtems/posix/threadsup.h>
+
+#define PTHREAD_MINIMUM_STACK_SIZE (STACK_MINIMUM_SIZE * 2)
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Threads_Information;
+
+/*
+ * These are used to manage the user initialization threads.
+ */
+
+POSIX_EXTERN posix_initialization_threads_table
+ *_POSIX_Threads_User_initialization_threads;
+POSIX_EXTERN unsigned32 _POSIX_Threads_Number_of_initialization_threads;
+
+
+/*
+ * _POSIX_Threads_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Threads_Manager_initialization(
+ unsigned32 maximum_pthreads,
+ unsigned32 number_of_initialization_threads,
+ posix_initialization_threads_table *user_threads
+);
+
+/*
+ * _POSIX_Threads_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a pthread control block from
+ * the inactive chain of free pthread control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void );
+
+/*
+ * _POSIX_Threads_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a pthread control block to the
+ * inactive chain of free pthread control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free(
+ Thread_Control *the_pthread
+);
+
+/*
+ * _POSIX_Threads_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps pthread IDs to pthread control blocks.
+ * If ID corresponds to a local pthread, then it returns
+ * the_pthread control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the pthread ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_pthread is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_pthread is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get(
+ pthread_t id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Threads_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_pthread is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Threads_Is_null(
+ Thread_Control *the_pthread
+);
+
+#include <rtems/posix/pthread.inl>
+#include <rtems/posix/pthreadmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/pthreadmp.h b/c/src/exec/posix/include/rtems/posix/pthreadmp.h
new file mode 100644
index 0000000000..0165fe6d36
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/pthreadmp.h
@@ -0,0 +1,161 @@
+/* pthreadmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Threads Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_MP_h
+#define __RTEMS_POSIX_THREADS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote pthread operations.
+ */
+
+typedef enum {
+ POSIX_THREADS_MP_ANNOUNCE_CREATE = 0,
+ POSIX_THREADS_MP_ANNOUNCE_DELETE = 1,
+ POSIX_THREADS_MP_EXTRACT_PROXY = 2,
+ POSIX_THREADS_MP_OBTAIN_REQUEST = 3,
+ POSIX_THREADS_MP_OBTAIN_RESPONSE = 4,
+ POSIX_THREADS_MP_RELEASE_REQUEST = 5,
+ POSIX_THREADS_MP_RELEASE_RESPONSE = 6
+} POSIX_Threads_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote pthread operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Threads_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait;
+ Objects_Id proxy_id;
+} POSIX_Threads_MP_Packet;
+
+/*
+ * _POSIX_Threads_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Threads_MP_Send_process_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Threads_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Threads_MP_Send_request_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Threads_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Threads_MP_Send_response_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Threads_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Threads_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Threads_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Threads_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Threads_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Threads_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Threads_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a pthread mp packet.
+ */
+
+POSIX_Threads_MP_Packet *_POSIX_Threads_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/include/rtems/posix/semaphore.h b/c/src/exec/posix/include/rtems/posix/semaphore.h
new file mode 100644
index 0000000000..5b38fadce0
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/semaphore.h
@@ -0,0 +1,135 @@
+/* rtems/posix/semaphore.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Semaphores.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_h
+#define __RTEMS_POSIX_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coresem.h>
+
+/*
+ * Data Structure used to manage a POSIX semaphore
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ boolean named;
+ boolean linked;
+ unsigned32 open_count;
+ CORE_semaphore_Control Semaphore;
+} POSIX_Semaphore_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Semaphore_Information;
+
+/*
+ * _POSIX_Semaphore_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphorees
+);
+
+/*
+ * _POSIX_Semaphore_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a semaphore control block from
+ * the inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void );
+
+/*
+ * _POSIX_Semaphore_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a semaphore control block to the
+ * inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
+ POSIX_Semaphore_Control *the_semaphore
+);
+
+/*
+ * _POSIX_Semaphore_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps semaphore IDs to semaphore control blocks.
+ * If ID corresponds to a local semaphore, then it returns
+ * the_semaphore control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the semaphore ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_semaphore is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_semaphore is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Semaphore_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_semaphore is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Semaphore_Is_null (
+ POSIX_Semaphore_Control *the_semaphore
+);
+
+/*
+ * _POSIX_Semaphore_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+int _POSIX_Semaphore_Name_to_id(
+ const char *name,
+ Objects_Id *id
+);
+
+#include <rtems/posix/semaphore.inl>
+#include <rtems/posix/semaphoremp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/semaphoremp.h b/c/src/exec/posix/include/rtems/posix/semaphoremp.h
new file mode 100644
index 0000000000..ff4cd16988
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/semaphoremp.h
@@ -0,0 +1,161 @@
+/* semaphoremp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_MP_h
+#define __RTEMS_POSIX_SEMAPHORE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote semaphore operations.
+ */
+
+typedef enum {
+ POSIX_SEMAPHORE_MP_ANNOUNCE_CREATE = 0,
+ POSIX_SEMAPHORE_MP_ANNOUNCE_DELETE = 1,
+ POSIX_SEMAPHORE_MP_EXTRACT_PROXY = 2,
+ POSIX_SEMAPHORE_MP_OBTAIN_REQUEST = 3,
+ POSIX_SEMAPHORE_MP_OBTAIN_RESPONSE = 4,
+ POSIX_SEMAPHORE_MP_RELEASE_REQUEST = 5,
+ POSIX_SEMAPHORE_MP_RELEASE_RESPONSE = 6,
+} POSIX_Semaphore_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote semaphore operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Semaphore_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Semaphore_MP_Packet;
+
+/*
+ * _POSIX_Semaphore_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Semaphore_MP_Send_process_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Semaphore_MP_Send_request_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Semaphore_MP_Send_response_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Semaphore_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Semaphore_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Semaphore_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a semaphore mp packet.
+ */
+
+POSIX_Semaphore_MP_Packet *_POSIX_Semaphore_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/posix/include/rtems/posix/seterr.h b/c/src/exec/posix/include/rtems/posix/seterr.h
new file mode 100644
index 0000000000..5174624d43
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/seterr.h
@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SET_ERRNO_h
+#define __POSIX_SET_ERRNO_h
+
+#define set_errno_and_return_minus_one( _error ) \
+ { errno = (_error); return -1; }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/rtems/posix/threadsup.h b/c/src/exec/posix/include/rtems/posix/threadsup.h
new file mode 100644
index 0000000000..bb800a507f
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/threadsup.h
@@ -0,0 +1,46 @@
+/* threadsup.h
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREAD_SUPPORT_h
+#define __RTEMS_POSIX_THREAD_SUPPORT_h
+
+#include <rtems/score/coresem.h>
+#include <rtems/score/tqdata.h>
+
+typedef struct {
+ pthread_attr_t Attributes;
+ int detachstate;
+ Thread_queue_Control Join_List;
+ int schedpolicy;
+ struct sched_param schedparam;
+ int ss_high_priority;
+ Watchdog_Control Sporadic_timer;
+
+ sigset_t signals_blocked;
+ sigset_t signals_pending;
+
+#if 0
+ /*
+ * POSIX Interrupts
+ */
+ unsigned32 interrupts_installed;
+ CORE_semaphore_Control Interrupt_Semaphore;
+#endif
+
+#if 0
+ /*
+ * POSIX Cancelability
+ */
+ int cancelability_state;
+ int cancelability_type;
+ int cancelation_requested;
+ Chain_Control Cancellation_Handlers;
+#endif
+
+} POSIX_API_Control;
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/rtems/posix/time.h b/c/src/exec/posix/include/rtems/posix/time.h
new file mode 100644
index 0000000000..0e87db388e
--- /dev/null
+++ b/c/src/exec/posix/include/rtems/posix/time.h
@@ -0,0 +1,50 @@
+/*
+ *
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_TIME_h
+#define __RTEMS_POSIX_TIME_h
+
+#include <rtems/score/tod.h>
+
+/*
+ * Seconds from January 1, 1970 to January 1, 1988. Used to account for
+ * differences between POSIX API and RTEMS core.
+ */
+
+#define POSIX_TIME_SECONDS_1970_THROUGH_1988 \
+ (((1987 - 1970 + 1) * TOD_SECONDS_PER_NON_LEAP_YEAR) + \
+ (4 * TOD_SECONDS_PER_DAY))
+
+/*PAGE
+ *
+ * _POSIX_Timespec_subtract
+ */
+
+void _POSIX_Timespec_subtract(
+ const struct timespec *the_start,
+ const struct timespec *end,
+ struct timespec *result
+);
+
+/*
+ * _POSIX_Timespec_to_interval
+ */
+
+Watchdog_Interval _POSIX_Timespec_to_interval(
+ const struct timespec *time
+);
+
+/*PAGE
+ *
+ * _POSIX_Interval_to_timespec
+ */
+
+void _POSIX_Interval_to_timespec(
+ Watchdog_Interval ticks,
+ struct timespec *time
+);
+
+#endif
diff --git a/c/src/exec/posix/include/sched.h b/c/src/exec/posix/include/sched.h
new file mode 100644
index 0000000000..14a603c0c5
--- /dev/null
+++ b/c/src/exec/posix/include/sched.h
@@ -0,0 +1,88 @@
+/* sched.h
+ *
+ * $Id$
+ */
+
+
+#ifndef __POSIX_SCHEDULING_h
+#define __POSIX_SCHEDULING_h
+
+#include <sys/features.h>
+
+#if defined(_POSIX_PRIORITY_SCHEDULING)
+
+#include <sys/types.h>
+#include <time.h>
+#include <sys/sched.h>
+#include <pthread.h>
+
+/*
+ * 13.3.1 Set Scheduling Parameters, P1003.1b-1993, p. 252
+ *
+ */
+
+int sched_setparam(
+ pid_t pid,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.2 Set Scheduling Parameters, P1003.1b-1993, p. 253
+ */
+
+int sched_getparam(
+ pid_t pid,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.3 Set Scheduling Policy and Scheduling Parameters,
+ * P1003.1b-1993, p. 254
+ */
+
+int sched_setscheduler(
+ pid_t pid,
+ int policy,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.4 Get Scheduling Policy, P1003.1b-1993, p. 256
+ */
+
+int sched_getscheduler(
+ pid_t pid
+);
+
+/*
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_get_priority_max(
+ int policy
+);
+
+int sched_get_priority_min(
+ int policy
+);
+
+int sched_rr_get_interval(
+ pid_t pid,
+ struct timespec *interval
+);
+
+#endif /* _POSIX_PRIORITY_SCHEDULING */
+
+#if defined(_POSIX_THREADS) || defined(_POSIX_PRIORITY_SCHEDULING)
+
+/*
+ * 13.3.5 Yield Processor, P1003.1b-1993, p. 257
+ */
+
+int sched_yield( void );
+
+#endif /* _POSIX_THREADS or _POSIX_PRIORITY_SCHEDULING */
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/semaphore.h b/c/src/exec/posix/include/semaphore.h
new file mode 100644
index 0000000000..0388f91ad9
--- /dev/null
+++ b/c/src/exec/posix/include/semaphore.h
@@ -0,0 +1,108 @@
+/* semaphore.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SEMAPHORE_h
+#define __POSIX_SEMAPHORE_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_SEMAPHORES)
+
+#include <sys/time.h>
+
+/*
+ * 11.1 Semaphore Characteristics, P1003.1b-1993, p.219
+ */
+
+typedef int sem_t;
+
+/*
+ * 11.2.1 Initialize an Unnamed Semaphore, P1003.1b-1993, p.219
+ */
+
+int sem_init(
+ sem_t *sem,
+ int pshared,
+ unsigned int value
+);
+
+/*
+ * 11.2.2 Destroy an Unnamed Semaphore, P1003.1b-1993, p.220
+ */
+
+int sem_destroy(
+ sem_t *sem
+);
+
+/*
+ * 11.2.3 Initialize/Open a Named Semaphore, P1003.1b-1993, p.221
+ *
+ * NOTE: Follows open() calling conventions.
+ */
+
+sem_t *sem_open(
+ const char *name,
+ int oflag,
+ ...
+);
+
+/*
+ * 11.2.4 Close a Named Semaphore, P1003.1b-1993, p.224
+ */
+
+int sem_close(
+ sem_t *sem
+);
+
+/*
+ * 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
+ */
+
+int sem_unlink(
+ const char *name
+);
+
+/*
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_wait(
+ sem_t *sem
+);
+
+int sem_trywait(
+ sem_t *sem
+);
+
+#if defined(_POSIX_TIMEOUTS)
+int sem_timedwait(
+ sem_t *sem,
+ const struct timespec *timeout
+);
+#endif
+
+/*
+ * 11.2.7 Unlock a Semaphore, P1003.1b-1993, p.227
+ */
+
+int sem_post(
+ sem_t *sem
+);
+
+/*
+ * 11.2.8 Get the Value of a Semaphore, P1003.1b-1993, p.229
+ */
+
+int sem_getvalue(
+ sem_t *sem,
+ int *sval
+);
+
+#endif /* _POSIX_SEMAPHORES */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/posix/include/sys/Makefile.in b/c/src/exec/posix/include/sys/Makefile.in
new file mode 100644
index 0000000000..84d2003ba3
--- /dev/null
+++ b/c/src/exec/posix/include/sys/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#H_PIECES=utsname
+H_PIECES=
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/sys
diff --git a/c/src/exec/posix/include/sys/utsname.h b/c/src/exec/posix/include/sys/utsname.h
new file mode 100644
index 0000000000..ca15230d40
--- /dev/null
+++ b/c/src/exec/posix/include/sys/utsname.h
@@ -0,0 +1,49 @@
+/* sys/utsname.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SYS_UTSNAME_h
+#define __POSIX_SYS_UTSNAME_h
+
+#include <sys/times.h>
+#include <sys/types.h>
+
+/*
+ * 4.4.1 Get System Name (Table 4-1), P1003.1b-1993, p. 90
+ *
+ * NOTE: The lengths of the strings in this structure are
+ * just long enough to reliably contain the RTEMS information.
+ * For example, the fields are not long enough to support
+ * Internet hostnames.
+ */
+
+struct utsname {
+ char sysname[ 32 ]; /* Name of this implementation of the operating system */
+ char nodename[ 32 ]; /* Name of this node within an implementation */
+ /* specified communication network */
+ char release[ 32 ]; /* Current release level of this implementation */
+ char version[ 32 ]; /* Current version level of this release */
+ char machine[ 32 ]; /* Name of the hardware type on which the system */
+ /* is running */
+};
+
+/*
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+);
+
+/*
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+);
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/include/unistd.h b/c/src/exec/posix/include/unistd.h
new file mode 100644
index 0000000000..147e80c11d
--- /dev/null
+++ b/c/src/exec/posix/include/unistd.h
@@ -0,0 +1,85 @@
+/* unistd.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_UNISTD_h
+#define __POSIX_UNISTD_h
+
+#include <rtems/posix/features.h>
+
+/*
+ * 4.8.1 Get Configurable System Variables, P1003.1b-1993, p. 96
+ *
+ * NOTE: Table 4-2, Configurable System Variables, p. 96
+ */
+
+#define _SC_AIO_LISTIO_MAX 0
+#define _SC_AIO_MAX 1
+#define _SC_AIO_PRIO_DELTA_MAX 2
+#define _SC_ARG_MAX 3
+#define _SC_CHILD_MAX 4
+#define _SC_CLK_TCK 5
+#define _SC_DELAYTIMER_MAX 6
+#define _SC_MQ_OPEN_MAX 7
+#define _SC_MQ_PRIO_MAX 8
+#define _SC_NGROUPS_MAX 9
+#define _SC_OPEN_MAX 10
+#define _SC_PAGESIZE 11
+#define _SC_RTSIG_MAX 12
+#define _SC_SEM_NSEMS_MAX 13
+#define _SC_SEM_VALUE_MAX 14
+#define _SC_SIGQUEUE_MAX 15
+#define _SC_STREAM_MAX 16
+#define _SC_TIMER_MAX 17
+#define _SC_TZNAME_MAX 18
+
+#define _SC_ASYNCHRONOUS_IO 19
+#define _SC_FSYNC 20
+#define _SC_JOB_CONTROL 21
+#define _SC_MAPPED_FILES 22
+#define _SC_MEMLOCK 23
+#define _SC_MEMLOCK_RANGE 24
+#define _SC_MEMORY_PROTECTION 25
+#define _SC_MESSAGE_PASSING 26
+#define _SC_PRIORITIZED_IO 27
+#define _SC_REALTIME_SIGNALS 28
+#define _SC_SAVED_IDS 29
+#define _SC_SEMAPHORES 30
+#define _SC_SHARED_MEMORY_OBJECTS 31
+#define _SC_SYNCHRONIZED_IO 32
+#define _SC_TIMERS 33
+#define _SC_VERSION 34
+
+/*
+ * P1003.1c/D10, p. 52 adds the following.
+ */
+
+#define _SC_GETGR_R_SIZE_MAX 35
+#define _SC_GETPW_R_SIZE_MAX
+#define _SC_LOGIN_NAME_MAX
+#define _SC_THREAD_DESTRUCTOR_ITERATIONS
+#define _SC_THREAD_KEYS_MAX
+#define _SC_THREAD_STACK_MIN
+#define _SC_THREAD_THREADS_MAX
+#define _SC_TTY_NAME_MAX
+
+#define _SC_THREADS
+#define _SC_THREAD_ATTR_STACKADDR
+#define _SC_THREAD_ATTR_STACKSIZE
+#define _SC_THREAD_PRIORITY_SCHEDULING
+#define _SC_THREAD_PRIO_INHERIT
+#define _SC_THREAD_PRIO_CEILING
+#define _SC_THREAD_PROCESS_SHARED
+#define _SC_THREAD_SAGE_FUNCTIONS
+
+/*
+ * 4.8.1 Get Configurable System Variables, P1003.1b-1993, p. 95
+ */
+
+long sysconf(
+ int name
+);
+
+#endif
+/* end of include */
diff --git a/c/src/exec/posix/include/wrap/Makefile.in b/c/src/exec/posix/include/wrap/Makefile.in
new file mode 100644
index 0000000000..d11541a321
--- /dev/null
+++ b/c/src/exec/posix/include/wrap/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#H_PIECES= aio devctl intr limits mqueue pthread sched semaphore \
+# signal time unistd
+H_PIECES= pthread sched
+# limits.h may have been moved into newlib -- check before removing it
+# from the cvs tree
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/
diff --git a/c/src/exec/posix/inline/Makefile.in b/c/src/exec/posix/inline/Makefile.in
new file mode 100644
index 0000000000..a68a481925
--- /dev/null
+++ b/c/src/exec/posix/inline/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#I_PIECES= cond intr key mqueue mutex pthread priority semaphore
+I_PIECES=cond key mutex pthread priority
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/posix
diff --git a/c/src/exec/posix/inline/cond.inl b/c/src/exec/posix/inline/cond.inl
new file mode 100644
index 0000000000..c85546027f
--- /dev/null
+++ b/c/src/exec/posix/inline/cond.inl
@@ -0,0 +1,76 @@
+/* rtems/posix/cond.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX condition variables.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_inl
+#define __RTEMS_POSIX_CONDITION_VARIABLES_inl
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
+ *_POSIX_Condition_variables_Allocate( void )
+{
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Allocate( &_POSIX_Condition_variables_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
+ POSIX_Condition_variables_Control *the_condition_variable
+)
+{
+ _Objects_Free(
+ &_POSIX_Condition_variables_Information,
+ &the_condition_variable->Object
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+/* XXX really should validate pointer */
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Condition_variables_Is_null (
+ POSIX_Condition_variables_Control *the_condition_variable
+)
+{
+ return !the_condition_variable;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/intr.inl b/c/src/exec/posix/inline/intr.inl
new file mode 100644
index 0000000000..cf666cec4e
--- /dev/null
+++ b/c/src/exec/posix/inline/intr.inl
@@ -0,0 +1,72 @@
+/* rtems/posix/intr.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Interrupt Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_INTERRUPT_inl
+#define __RTEMS_POSIX_INTERRUPT_inl
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Handler_control *
+ _POSIX_Interrupt_Allocate( void )
+{
+ return (POSIX_Interrupt_Handler_control *)
+ _Objects_Allocate( &_POSIX_Interrupt_Handlers_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Interrupt_Free (
+ POSIX_Interrupt_Handler_control *the_intr
+)
+{
+ _Objects_Free( &_POSIX_Interrupt_Handlers_Information, &the_intr->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Control *_POSIX_Interrupt_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Interrupt_Control *)
+ _Objects_Get( &_POSIX_Interrupt_Handlers_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Interrupt_Is_null (
+ POSIX_Interrupt_Handler_control *the_intr
+)
+{
+ return !the_intr;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/key.inl b/c/src/exec/posix/inline/key.inl
new file mode 100644
index 0000000000..3611960322
--- /dev/null
+++ b/c/src/exec/posix/inline/key.inl
@@ -0,0 +1,70 @@
+/* rtems/posix/key.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX key's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_inl
+#define __RTEMS_POSIX_KEY_inl
+
+/*PAGE
+ *
+ * _POSIX_Keys_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void )
+{
+ return (POSIX_Keys_Control *) _Objects_Allocate( &_POSIX_Keys_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
+ POSIX_Keys_Control *the_key
+)
+{
+ _Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Keys_Control *)
+ _Objects_Get( &_POSIX_Keys_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Keys_Is_null (
+ POSIX_Keys_Control *the_key
+)
+{
+ return !the_key;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/mqueue.inl b/c/src/exec/posix/inline/mqueue.inl
new file mode 100644
index 0000000000..56be2e346f
--- /dev/null
+++ b/c/src/exec/posix/inline/mqueue.inl
@@ -0,0 +1,83 @@
+/* rtems/posix/mqueue.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Message Queue.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_inl
+#define __RTEMS_POSIX_MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void )
+{
+ return (POSIX_Message_queue_Control *)
+ _Objects_Allocate( &_POSIX_Message_queue_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ _Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Message_queue_Control *)
+ _Objects_Get( &_POSIX_Message_queue_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Message_queue_Is_null (
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ return !the_mq;
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Priority_to_core
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Message_queue_Priority_to_core(
+ unsigned int priority
+)
+{
+ return priority;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/mutex.inl b/c/src/exec/posix/inline/mutex.inl
new file mode 100644
index 0000000000..8dcdb4c24e
--- /dev/null
+++ b/c/src/exec/posix/inline/mutex.inl
@@ -0,0 +1,93 @@
+/* rtems/posix/mutex.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX mutex's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_inl
+#define __RTEMS_POSIX_MUTEX_inl
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void )
+{
+ return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free (
+ POSIX_Mutex_Control *the_mutex
+)
+{
+ _Objects_Free( &_POSIX_Mutex_Information, &the_mutex->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+ int status;
+
+ if ( !id ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Mutex_Control *) 0;
+ }
+
+ if ( *id == PTHREAD_MUTEX_INITIALIZER ) {
+ /*
+ * Do an "auto-create" here.
+ */
+
+ status = pthread_mutex_init( id, 0 );
+ if ( status ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Mutex_Control *) 0;
+ }
+ }
+
+ /*
+ * Now call Objects_Get()
+ */
+
+ return (POSIX_Mutex_Control *)
+ _Objects_Get( &_POSIX_Mutex_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Mutex_Is_null (
+ POSIX_Mutex_Control *the_mutex
+)
+{
+ return !the_mutex;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/priority.inl b/c/src/exec/posix/inline/priority.inl
new file mode 100644
index 0000000000..dc8187d4ef
--- /dev/null
+++ b/c/src/exec/posix/inline/priority.inl
@@ -0,0 +1,37 @@
+/*
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_PRIORITY_inl
+#define __RTEMS_POSIX_PRIORITY_inl
+
+/*
+ * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
+ *
+ * "Numericallly higher values represent higher priorities."
+ *
+ * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Priority_Is_valid(
+ int priority
+)
+{
+ return (boolean) (priority >= 1 && priority <= 254);
+}
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
+ int priority
+)
+{
+ return (Priority_Control) (255 - priority);
+}
+
+RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
+ Priority_Control priority
+)
+{
+ return 255 - priority;
+}
+
+#endif
diff --git a/c/src/exec/posix/inline/pthread.inl b/c/src/exec/posix/inline/pthread.inl
new file mode 100644
index 0000000000..9a37cd1f55
--- /dev/null
+++ b/c/src/exec/posix/inline/pthread.inl
@@ -0,0 +1,70 @@
+/* rtems/posix/pthread.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX threads.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_inl
+#define __RTEMS_POSIX_THREADS_inl
+
+/*PAGE
+ *
+ * _POSIX_Threads_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
+ Thread_Control *the_pthread
+)
+{
+ _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Get
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get (
+ pthread_t id,
+ Objects_Locations *location
+)
+{
+ return (Thread_Control *)
+ _Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Threads_Is_null (
+ Thread_Control *the_pthread
+)
+{
+ return !the_pthread;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/rtems/posix/Makefile.in b/c/src/exec/posix/inline/rtems/posix/Makefile.in
new file mode 100644
index 0000000000..a68a481925
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#I_PIECES= cond intr key mqueue mutex pthread priority semaphore
+I_PIECES=cond key mutex pthread priority
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/posix
diff --git a/c/src/exec/posix/inline/rtems/posix/cond.inl b/c/src/exec/posix/inline/rtems/posix/cond.inl
new file mode 100644
index 0000000000..c85546027f
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/cond.inl
@@ -0,0 +1,76 @@
+/* rtems/posix/cond.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX condition variables.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_inl
+#define __RTEMS_POSIX_CONDITION_VARIABLES_inl
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
+ *_POSIX_Condition_variables_Allocate( void )
+{
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Allocate( &_POSIX_Condition_variables_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
+ POSIX_Condition_variables_Control *the_condition_variable
+)
+{
+ _Objects_Free(
+ &_POSIX_Condition_variables_Information,
+ &the_condition_variable->Object
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+/* XXX really should validate pointer */
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Condition_variables_Is_null (
+ POSIX_Condition_variables_Control *the_condition_variable
+)
+{
+ return !the_condition_variable;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/rtems/posix/intr.inl b/c/src/exec/posix/inline/rtems/posix/intr.inl
new file mode 100644
index 0000000000..cf666cec4e
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/intr.inl
@@ -0,0 +1,72 @@
+/* rtems/posix/intr.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Interrupt Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_INTERRUPT_inl
+#define __RTEMS_POSIX_INTERRUPT_inl
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Handler_control *
+ _POSIX_Interrupt_Allocate( void )
+{
+ return (POSIX_Interrupt_Handler_control *)
+ _Objects_Allocate( &_POSIX_Interrupt_Handlers_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Interrupt_Free (
+ POSIX_Interrupt_Handler_control *the_intr
+)
+{
+ _Objects_Free( &_POSIX_Interrupt_Handlers_Information, &the_intr->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Control *_POSIX_Interrupt_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Interrupt_Control *)
+ _Objects_Get( &_POSIX_Interrupt_Handlers_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Interrupt_Is_null (
+ POSIX_Interrupt_Handler_control *the_intr
+)
+{
+ return !the_intr;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/rtems/posix/key.inl b/c/src/exec/posix/inline/rtems/posix/key.inl
new file mode 100644
index 0000000000..3611960322
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/key.inl
@@ -0,0 +1,70 @@
+/* rtems/posix/key.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX key's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_inl
+#define __RTEMS_POSIX_KEY_inl
+
+/*PAGE
+ *
+ * _POSIX_Keys_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void )
+{
+ return (POSIX_Keys_Control *) _Objects_Allocate( &_POSIX_Keys_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
+ POSIX_Keys_Control *the_key
+)
+{
+ _Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Keys_Control *)
+ _Objects_Get( &_POSIX_Keys_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Keys_Is_null (
+ POSIX_Keys_Control *the_key
+)
+{
+ return !the_key;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/rtems/posix/mqueue.inl b/c/src/exec/posix/inline/rtems/posix/mqueue.inl
new file mode 100644
index 0000000000..56be2e346f
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/mqueue.inl
@@ -0,0 +1,83 @@
+/* rtems/posix/mqueue.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Message Queue.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_inl
+#define __RTEMS_POSIX_MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void )
+{
+ return (POSIX_Message_queue_Control *)
+ _Objects_Allocate( &_POSIX_Message_queue_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ _Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Message_queue_Control *)
+ _Objects_Get( &_POSIX_Message_queue_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Message_queue_Is_null (
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ return !the_mq;
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Priority_to_core
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Message_queue_Priority_to_core(
+ unsigned int priority
+)
+{
+ return priority;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/rtems/posix/mutex.inl b/c/src/exec/posix/inline/rtems/posix/mutex.inl
new file mode 100644
index 0000000000..8dcdb4c24e
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/mutex.inl
@@ -0,0 +1,93 @@
+/* rtems/posix/mutex.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX mutex's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_inl
+#define __RTEMS_POSIX_MUTEX_inl
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void )
+{
+ return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free (
+ POSIX_Mutex_Control *the_mutex
+)
+{
+ _Objects_Free( &_POSIX_Mutex_Information, &the_mutex->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+ int status;
+
+ if ( !id ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Mutex_Control *) 0;
+ }
+
+ if ( *id == PTHREAD_MUTEX_INITIALIZER ) {
+ /*
+ * Do an "auto-create" here.
+ */
+
+ status = pthread_mutex_init( id, 0 );
+ if ( status ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Mutex_Control *) 0;
+ }
+ }
+
+ /*
+ * Now call Objects_Get()
+ */
+
+ return (POSIX_Mutex_Control *)
+ _Objects_Get( &_POSIX_Mutex_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Mutex_Is_null (
+ POSIX_Mutex_Control *the_mutex
+)
+{
+ return !the_mutex;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/rtems/posix/priority.inl b/c/src/exec/posix/inline/rtems/posix/priority.inl
new file mode 100644
index 0000000000..dc8187d4ef
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/priority.inl
@@ -0,0 +1,37 @@
+/*
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_PRIORITY_inl
+#define __RTEMS_POSIX_PRIORITY_inl
+
+/*
+ * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
+ *
+ * "Numericallly higher values represent higher priorities."
+ *
+ * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Priority_Is_valid(
+ int priority
+)
+{
+ return (boolean) (priority >= 1 && priority <= 254);
+}
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
+ int priority
+)
+{
+ return (Priority_Control) (255 - priority);
+}
+
+RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
+ Priority_Control priority
+)
+{
+ return 255 - priority;
+}
+
+#endif
diff --git a/c/src/exec/posix/inline/rtems/posix/pthread.inl b/c/src/exec/posix/inline/rtems/posix/pthread.inl
new file mode 100644
index 0000000000..9a37cd1f55
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/pthread.inl
@@ -0,0 +1,70 @@
+/* rtems/posix/pthread.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX threads.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_inl
+#define __RTEMS_POSIX_THREADS_inl
+
+/*PAGE
+ *
+ * _POSIX_Threads_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
+ Thread_Control *the_pthread
+)
+{
+ _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Get
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get (
+ pthread_t id,
+ Objects_Locations *location
+)
+{
+ return (Thread_Control *)
+ _Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Threads_Is_null (
+ Thread_Control *the_pthread
+)
+{
+ return !the_pthread;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/rtems/posix/semaphore.inl b/c/src/exec/posix/inline/rtems/posix/semaphore.inl
new file mode 100644
index 0000000000..83dcaf65ca
--- /dev/null
+++ b/c/src/exec/posix/inline/rtems/posix/semaphore.inl
@@ -0,0 +1,71 @@
+/* rtems/posix/semaphore.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Semaphores.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_inl
+#define __RTEMS_POSIX_SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
+{
+ return (POSIX_Semaphore_Control *)
+ _Objects_Allocate( &_POSIX_Semaphore_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ _Objects_Free( &_POSIX_Semaphore_Information, &the_semaphore->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Semaphore_Control *)
+ _Objects_Get( &_POSIX_Semaphore_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Semaphore_Is_null (
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ return !the_semaphore;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/inline/semaphore.inl b/c/src/exec/posix/inline/semaphore.inl
new file mode 100644
index 0000000000..83dcaf65ca
--- /dev/null
+++ b/c/src/exec/posix/inline/semaphore.inl
@@ -0,0 +1,71 @@
+/* rtems/posix/semaphore.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Semaphores.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_inl
+#define __RTEMS_POSIX_SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
+{
+ return (POSIX_Semaphore_Control *)
+ _Objects_Allocate( &_POSIX_Semaphore_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ _Objects_Free( &_POSIX_Semaphore_Information, &the_semaphore->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Semaphore_Control *)
+ _Objects_Get( &_POSIX_Semaphore_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Semaphore_Is_null (
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ return !the_semaphore;
+}
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/posix/macros/Makefile.in b/c/src/exec/posix/macros/Makefile.in
new file mode 100644
index 0000000000..127eec1a58
--- /dev/null
+++ b/c/src/exec/posix/macros/Makefile.in
@@ -0,0 +1,31 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# Right now there are not macro implementation of the posix inline routines
+# So it won't build
+I_PIECES=
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ #$(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/posix
diff --git a/c/src/exec/posix/macros/rtems/posix/Makefile.in b/c/src/exec/posix/macros/rtems/posix/Makefile.in
new file mode 100644
index 0000000000..127eec1a58
--- /dev/null
+++ b/c/src/exec/posix/macros/rtems/posix/Makefile.in
@@ -0,0 +1,31 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# Right now there are not macro implementation of the posix inline routines
+# So it won't build
+I_PIECES=
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ #$(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/posix
diff --git a/c/src/exec/posix/optman/Makefile.in b/c/src/exec/posix/optman/Makefile.in
new file mode 100644
index 0000000000..6d99022a3a
--- /dev/null
+++ b/c/src/exec/posix/optman/Makefile.in
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+C_FILES=
+
+H_FILES=
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+PGMS=$(C_FILES:%.c=$(ARCH)/%.rel)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+ASM4FLAGS += -I $(PROJECT_RELEASE)/include/rtems
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGMS)
+ #$(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
diff --git a/c/src/exec/posix/src/Makefile.in b/c/src/exec/posix/src/Makefile.in
new file mode 100644
index 0000000000..c88a034d27
--- /dev/null
+++ b/c/src/exec/posix/src/Makefile.in
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#C_PIECES= aio cancel cond devctl intr key mqueue mutex pthread \
+# ptimer sched semaphore signal time types unistd utsname
+C_PIECES= adasupp cond getpid key mutex pthread psignal sched time \
+ types unistd
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) ${OBJS}
+
+# temporary so we can see how many things are left to implement
+not:
+ grep -i NOT_IMPL $(C_FILES) | grep -v MP_NOT_IMPL
+ @echo
+ @echo
+ @echo
+ @echo `grep -i NOT_IMPL $(C_FILES) | grep -v MP_NOT_IMPL | wc -l ` places marked not implemented
+ @echo `wc -l $(C_FILES) | grep total` lines of C code to test
diff --git a/c/src/exec/posix/src/adasupp.c b/c/src/exec/posix/src/adasupp.c
new file mode 100644
index 0000000000..234b0c2a40
--- /dev/null
+++ b/c/src/exec/posix/src/adasupp.c
@@ -0,0 +1,28 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include <rtems/system.h>
+#include <rtems/posix/pthread.h>
+
+/*PAGE
+ *
+ * _ada_pthread_minimum_stack_size
+ *
+ * This routine returns the minimum stack size so the GNAT RTS can
+ * allocate enough stack for Ada tasks.
+ */
+
+size_t _ada_pthread_minimum_stack_size( void )
+{
+ /*
+ * Eventually this may need to include a per cpu family calculation
+ * but for now, this will do.
+ */
+
+ return PTHREAD_MINIMUM_STACK_SIZE * 2;
+}
diff --git a/c/src/exec/posix/src/aio.c b/c/src/exec/posix/src/aio.c
new file mode 100644
index 0000000000..9fc072f820
--- /dev/null
+++ b/c/src/exec/posix/src/aio.c
@@ -0,0 +1,111 @@
+/*
+ * $Id$
+ */
+
+#include <aio.h>
+
+#include <rtems/system.h>
+
+/*PAGE
+ *
+ * 6.7.2 Asynchronous Read, P1003.1b-1993, p. 154
+ */
+
+int aio_read(
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.3 Asynchronous Write, P1003.1b-1993, p. 155
+ */
+
+int aio_write(
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.4 List Directed I/O, P1003.1b-1993, p. 158
+ */
+
+int lio_listio(
+ int mode,
+ struct aiocb * const list[],
+ int nent,
+ struct sigevent *sig
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.5 Retrieve Error of Asynchronous I/O Operation, P1003.1b-1993, p. 161
+ */
+
+int aio_error(
+ const struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.6 Retrieve Return Status of Asynchronous I/O Operation,
+ * P1003.1b-1993, p. 162
+ */
+
+int aio_return(
+ const struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.7 Cancel Asynchronous I/O Operation, P1003.1b-1993, p. 163
+ */
+
+int aio_cancel(
+ int filedes,
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.7 Wait for Asynchronous I/O Request, P1003.1b-1993, p. 164
+ */
+
+int aio_suspend(
+ struct aiocb * const list[],
+ int nent,
+ const struct timespec *timeout
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.9 Asynchronous File Synchronization, P1003.1b-1993, p. 166
+ */
+
+int aio_fsync(
+ int op,
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/exec/posix/src/cancel.c b/c/src/exec/posix/src/cancel.c
new file mode 100644
index 0000000000..b6cc073456
--- /dev/null
+++ b/c/src/exec/posix/src/cancel.c
@@ -0,0 +1,228 @@
+/*
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/cancel.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/threadsup.h>
+
+/*PAGE
+ *
+ * POSIX_Thread_cancel_run
+ *
+ */
+
+void POSIX_Thread_cancel_run(
+ Thread_Control *the_thread
+)
+{
+ int old_cancel_state;
+ POSIX_Cancel_Handler_control *handler;
+ Chain_Control *handler_stack;
+ POSIX_API_Thread_Support_Control *thread_support;
+ ISR_Level level;
+
+ thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ handler_stack = &thread_support->Cancellation_Handlers;
+
+ old_cancel_state = thread_support->cancelability_state;
+
+ thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
+
+ while ( !_Chain_Is_empty( handler_stack ) ) {
+ _ISR_Disable( level );
+ handler = (POSIX_Cancel_Handler_control *) _Chain_Tail( handler_stack );
+ _Chain_Extract_unprotected( &handler->Node );
+ _ISR_Enable( level );
+
+ (*handler->routine)( handler->arg );
+
+ _Workspace_Free( handler );
+ }
+
+ thread_support->cancelation_requested = 0;
+
+ thread_support->cancelability_state = old_cancel_state;
+}
+
+/*PAGE
+ *
+ * 18.2.1 Canceling Execution of a Thread, P1003.1c/Draft 10, p. 181
+ */
+
+int pthread_cancel(
+ pthread_t thread
+)
+{
+ Thread_Control *the_thread;
+ POSIX_API_Thread_Support_Control *thread_support;
+ Objects_Locations location;
+
+ the_thread = _POSIX_Threads_Get( &thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return POSIX_MP_NOT_IMPLEMENTED();
+ case OBJECTS_LOCAL:
+ thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ thread_support->cancelation_requested = 1;
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+int pthread_setcancelstate(
+ int state,
+ int *oldstate
+)
+{
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ if ( !oldstate )
+ return EINVAL;
+
+ if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE )
+ return EINVAL;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ *oldstate = thread_support->cancelability_state;
+ thread_support->cancelability_state = state;
+
+ if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
+ thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
+ thread_support->cancelation_requested )
+ POSIX_Thread_cancel_run( _Thread_Executing );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+int pthread_setcanceltype(
+ int type,
+ int *oldtype
+)
+{
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ if ( !oldtype )
+ return EINVAL;
+
+ if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS )
+ return EINVAL;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ *oldtype = thread_support->cancelability_type;
+ thread_support->cancelability_type = type;
+
+ if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
+ thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
+ thread_support->cancelation_requested )
+ POSIX_Thread_cancel_run( _Thread_Executing );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+void pthread_testcancel( void )
+{
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
+ thread_support->cancelation_requested )
+ POSIX_Thread_cancel_run( _Thread_Executing );
+}
+
+/*PAGE
+ *
+ * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184
+ */
+
+void pthread_cleanup_push(
+ void (*routine)( void * ),
+ void *arg
+)
+{
+ POSIX_Cancel_Handler_control *handler;
+ Chain_Control *handler_stack;
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ if ( !routine )
+ return; /* XXX what to do really? */
+
+ handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
+
+ if ( !handler )
+ return; /* XXX what to do really? */
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ handler_stack = &thread_support->Cancellation_Handlers;
+
+ handler->routine = routine;
+ handler->arg = arg;
+
+ _Chain_Append( handler_stack, &handler->Node );
+}
+
+/*PAGE
+ *
+ * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184
+ */
+
+void pthread_cleanup_pop(
+ int execute
+)
+{
+ POSIX_Cancel_Handler_control *handler;
+ Chain_Control *handler_stack;
+ POSIX_API_Thread_Support_Control *thread_support;
+ ISR_Level level;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ handler_stack = &thread_support->Cancellation_Handlers;
+
+ if ( _Chain_Is_empty( handler_stack ) )
+ return;
+
+ _ISR_Disable( level );
+ handler = (POSIX_Cancel_Handler_control *) _Chain_Tail( handler_stack );
+ _Chain_Extract_unprotected( &handler->Node );
+ _ISR_Enable( level );
+
+ if ( execute )
+ (*handler->routine)( handler->arg );
+
+ _Workspace_Free( handler );
+}
diff --git a/c/src/exec/posix/src/cond.c b/c/src/exec/posix/src/cond.c
new file mode 100644
index 0000000000..de2e252b95
--- /dev/null
+++ b/c/src/exec/posix/src/cond.c
@@ -0,0 +1,501 @@
+/*
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/posix/cond.h>
+#include <rtems/posix/time.h>
+#include <rtems/posix/mutex.h>
+
+/*
+ * TEMPORARY
+ */
+
+void _POSIX_Condition_variables_MP_Send_process_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+void _POSIX_Condition_variables_MP_Send_extract_proxy(
+ Thread_Control *the_thread
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+/*
+ * END OF TEMPORARY
+ */
+
+/*PAGE
+ *
+ * The default condition variable attributes structure.
+ */
+
+const pthread_condattr_t _POSIX_Condition_variables_Default_attributes = {
+ TRUE, /* is_initialized */
+ PTHREAD_PROCESS_PRIVATE /* process_shared */
+};
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Manager_initialization
+ *
+ * This routine initializes all condition variable manager related data
+ * structures.
+ *
+ * Input parameters:
+ * maximum_condition_variables - maximum configured condition_variables
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Condition_variables_Manager_initialization(
+ unsigned32 maximum_condition_variables
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Condition_variables_Information,
+ OBJECTS_POSIX_CONDITION_VARIABLES,
+ TRUE,
+ maximum_condition_variables,
+ sizeof( POSIX_Condition_variables_Control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_init(
+ pthread_condattr_t *attr
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *attr = _POSIX_Condition_variables_Default_attributes;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_destroy(
+ pthread_condattr_t *attr
+)
+{
+ if ( !attr || attr->is_initialized == FALSE )
+ return EINVAL;
+
+ attr->is_initialized = FALSE;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_getpshared(
+ const pthread_condattr_t *attr,
+ int *pshared
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *pshared = attr->process_shared;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_setpshared(
+ pthread_condattr_t *attr,
+ int pshared
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ switch ( pshared ) {
+ case PTHREAD_PROCESS_SHARED:
+ case PTHREAD_PROCESS_PRIVATE:
+ attr->process_shared = pshared;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 11.4.2 Initializing and Destroying a Condition Variable,
+ * P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_cond_init(
+ pthread_cond_t *cond,
+ const pthread_condattr_t *attr
+)
+{
+ POSIX_Condition_variables_Control *the_cond;
+ const pthread_condattr_t *the_attr;
+
+ if ( attr ) the_attr = attr;
+ else the_attr = &_POSIX_Condition_variables_Default_attributes;
+
+ /*
+ * XXX: Be careful about attributes when global!!!
+ */
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ return POSIX_MP_NOT_IMPLEMENTED();
+
+ if ( !the_attr->is_initialized )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ the_cond = _POSIX_Condition_variables_Allocate();
+
+ if ( !the_cond ) {
+ _Thread_Enable_dispatch();
+ return ENOMEM;
+ }
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Condition_variables_Information,
+ 0, the_cond->Object.id, FALSE ) ) ) {
+ _POSIX_Condition_variables_Free( the_cond );
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ the_cond->process_shared = the_attr->process_shared;
+
+ the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
+
+/* XXX some more initialization might need to go here */
+ _Thread_queue_Initialize(
+ &the_cond->Wait_queue,
+ OBJECTS_POSIX_CONDITION_VARIABLES,
+ THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_CONDITION_VARIABLE,
+ _POSIX_Condition_variables_MP_Send_extract_proxy,
+ ETIMEDOUT
+ );
+
+ _Objects_Open(
+ &_POSIX_Condition_variables_Information,
+ &the_cond->Object,
+ 0
+ );
+
+ *cond = the_cond->Object.id;
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Condition_variables_MP_Send_process_packet(
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_CREATE,
+ the_cond->Object.id,
+ 0, /* Name not used */
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.2 Initializing and Destroying a Condition Variable,
+ * P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_cond_destroy(
+ pthread_cond_t *cond
+)
+{
+ register POSIX_Condition_variables_Control *the_cond;
+ Objects_Locations location;
+
+ the_cond = _POSIX_Condition_variables_Get( cond, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+
+ if ( _Thread_queue_First( &the_cond->Wait_queue ) ) {
+ _Thread_Enable_dispatch();
+ return EBUSY;
+ }
+
+ _Objects_Close(
+ &_POSIX_Condition_variables_Information,
+ &the_cond->Object
+ );
+
+ _POSIX_Condition_variables_Free( the_cond );
+
+ if ( the_cond->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Condition_variables_Information,
+ the_cond->Object.id
+ );
+
+ _POSIX_Condition_variables_MP_Send_process_packet(
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_DELETE,
+ the_cond->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Signal_support
+ *
+ * A support routine which implements guts of the broadcast and single task
+ * wake up version of the "signal" operation.
+ */
+
+int _POSIX_Condition_variables_Signal_support(
+ pthread_cond_t *cond,
+ boolean is_broadcast
+)
+{
+ register POSIX_Condition_variables_Control *the_cond;
+ Objects_Locations location;
+ Thread_Control *the_thread;
+
+ the_cond = _POSIX_Condition_variables_Get( cond, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+
+ do {
+ the_thread = _Thread_queue_Dequeue( &the_cond->Wait_queue );
+ if ( !the_thread )
+ the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
+ } while ( is_broadcast && the_thread );
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.4.3 Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101
+ */
+
+int pthread_cond_signal(
+ pthread_cond_t *cond
+)
+{
+ return _POSIX_Condition_variables_Signal_support( cond, FALSE );
+}
+
+/*PAGE
+ *
+ * 11.4.3 Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101
+ */
+
+int pthread_cond_broadcast(
+ pthread_cond_t *cond
+)
+{
+ return _POSIX_Condition_variables_Signal_support( cond, TRUE );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Wait_support
+ *
+ * A support routine which implements guts of the blocking, non-blocking, and
+ * timed wait version of condition variable wait routines.
+ */
+
+int _POSIX_Condition_variables_Wait_support(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ Watchdog_Interval timeout,
+ boolean already_timedout
+)
+{
+ register POSIX_Condition_variables_Control *the_cond;
+ Objects_Locations location;
+ int status;
+ int mutex_status;
+
+ if ( !_POSIX_Mutex_Get( mutex, &location ) ) {
+ return EINVAL;
+ }
+
+ _Thread_Unnest_dispatch();
+
+ the_cond = _POSIX_Condition_variables_Get( cond, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+
+ if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ (void) pthread_mutex_unlock( mutex );
+/* XXX ignore this for now since behavior is undefined
+ if ( mutex_status ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+*/
+
+ if ( !already_timedout ) {
+ the_cond->Mutex = *mutex;
+
+ _Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
+ _Thread_Executing->Wait.return_code = 0;
+ _Thread_Executing->Wait.queue = &the_cond->Wait_queue;
+ _Thread_Executing->Wait.id = *cond;
+
+ _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout );
+
+ _Thread_Enable_dispatch();
+
+ /*
+ * Switch ourself out because we blocked as a result of the
+ * _Thread_queue_Enqueue.
+ */
+
+ status = _Thread_Executing->Wait.return_code;
+ if ( status && status != ETIMEDOUT )
+ return status;
+
+ }
+ else
+ status = ETIMEDOUT;
+
+ /*
+ * When we get here the dispatch disable level is 0.
+ */
+
+ mutex_status = pthread_mutex_lock( mutex );
+ if ( mutex_status )
+ return EINVAL;
+
+ return status;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.4.4 Waiting on a Condition, P1003.1c/Draft 10, p. 105
+ */
+
+int pthread_cond_wait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex
+)
+{
+ return _POSIX_Condition_variables_Wait_support(
+ cond,
+ mutex,
+ THREAD_QUEUE_WAIT_FOREVER,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 11.4.4 Waiting on a Condition, P1003.1c/Draft 10, p. 105
+ */
+
+int pthread_cond_timedwait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ const struct timespec *abstime
+)
+{
+ Watchdog_Interval timeout;
+ struct timespec current_time;
+ struct timespec difference;
+ boolean already_timedout = FALSE;
+
+ if ( !abstime )
+ return EINVAL;
+
+ /*
+ * The abstime is a walltime. We turn it into an interval.
+ */
+
+ (void) clock_gettime( CLOCK_REALTIME, &current_time );
+
+ /* XXX probably some error checking should go here */
+
+ _POSIX_Timespec_subtract( &current_time, abstime, &difference );
+
+ if ( ( difference.tv_sec < 0 ) || ( ( difference.tv_sec == 0 ) &&
+ ( difference.tv_nsec < 0 ) ) )
+ already_timedout = TRUE;
+
+ timeout = _POSIX_Timespec_to_interval( &difference );
+
+ return _POSIX_Condition_variables_Wait_support(
+ cond,
+ mutex,
+ timeout,
+ already_timedout
+ );
+}
diff --git a/c/src/exec/posix/src/devctl.c b/c/src/exec/posix/src/devctl.c
new file mode 100644
index 0000000000..699bc2d228
--- /dev/null
+++ b/c/src/exec/posix/src/devctl.c
@@ -0,0 +1,22 @@
+/*
+ * $Id$
+ */
+
+#include <devctl.h>
+
+#include <rtems/system.h>
+
+/*PAGE
+ *
+ * 21.2.1 Control a Device, P1003.4b/D8, p. 65
+ */
+
+int devctl(
+ int filedes,
+ void *dev_data_ptr,
+ size_t nbyte,
+ int *dev_info_ptr
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/exec/posix/src/getpid.c b/c/src/exec/posix/src/getpid.c
new file mode 100644
index 0000000000..b42981398a
--- /dev/null
+++ b/c/src/exec/posix/src/getpid.c
@@ -0,0 +1,22 @@
+/*
+ * $Id$
+ */
+
+#include <limits.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/seterr.h>
+
+/*PAGE
+ *
+ * 4.1.1 Get Process and Parent Process IDs, P1003.1b-1993, p. 83
+ */
+
+pid_t getpid( void )
+{
+ return _Objects_Local_node;
+}
diff --git a/c/src/exec/posix/src/intr.c b/c/src/exec/posix/src/intr.c
new file mode 100644
index 0000000000..5d41a5fe52
--- /dev/null
+++ b/c/src/exec/posix/src/intr.c
@@ -0,0 +1,340 @@
+/*
+ * NOTE: Each task has an interrupt semaphore associated with it.
+ * No matter which interrupt occurs that it has registered,
+ * the same semaphore is used.
+ *
+ * This whole interrupt scheme may have been eliminated in a later draft.
+ *
+ * $Id$
+ */
+
+#include <errno.h>
+#include <intr.h>
+#include <pthread.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/posix/intr.h>
+#include <rtems/posix/time.h>
+#include <rtems/posix/threadsup.h>
+
+/*
+ * _POSIX_Interrupt_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Interrupt_Manager_initialization(
+ unsigned32 maximum_interrupt_handlers
+)
+{
+ unsigned32 index;
+ POSIX_Interrupt_Control *the_vector;
+
+ _Objects_Initialize_information(
+ &_POSIX_Interrupt_Handlers_Information,
+ OBJECTS_POSIX_INTERRUPTS,
+ FALSE,
+ maximum_interrupt_handlers,
+ sizeof( POSIX_Interrupt_Handler_control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+
+ for ( index=0 ; index < CPU_INTERRUPT_NUMBER_OF_VECTORS ; index++ ) {
+ the_vector = &_POSIX_Interrupt_Information[ index ];
+
+ the_vector->number_installed = 0;
+ the_vector->lock_count = 0;
+ the_vector->deferred_count = 0;
+ _Chain_Initialize_empty( &the_vector->Handlers );
+ }
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_capture(
+ intr_t intr,
+ int (*intr_handler)( void *area ),
+ volatile void *area,
+ size_t areasize
+)
+{
+ POSIX_Interrupt_Handler_control *the_intr;
+ POSIX_Interrupt_Control *the_vector;
+ POSIX_API_Thread_Support_Control *thread_support;
+ proc_ptr old_handler;
+
+ if ( !_ISR_Is_vector_number_valid( intr ) ||
+ !_ISR_Is_valid_user_handler( intr_handler ) )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ the_intr = _POSIX_Interrupt_Allocate();
+
+ if ( !the_intr ) {
+ _Thread_Enable_dispatch();
+ return ENOMEM;
+ }
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ the_intr->vector = intr;
+ the_intr->handler = intr_handler;
+ the_intr->user_data_area = area;
+ the_intr->server = _Thread_Executing;
+ the_intr->is_active = TRUE;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ thread_support->interrupts_installed++;
+
+/* XXX should we malloc the semaphore on the fly??? if so we probably need to
+ release it when the thread has released all interrupts and keep
+ a count of how many it has installed. CURRENTLY NO.. ALLOCATED w/TCB
+*/
+
+ /*
+ * This is sufficient to have the handlers invoked in the opposite
+ * order of installation. The loop invoking them can then go from
+ * the front of the list to the end.
+ */
+
+ _Chain_Prepend( &the_vector->Handlers, &the_intr->Object.Node );
+
+ if ( !the_vector->number_installed++ )
+ _ISR_Install_vector(
+ intr,
+ (proc_ptr) _POSIX_Interrupt_Handler,
+ &old_handler
+ );
+
+ _Objects_Open( &_POSIX_Interrupt_Handlers_Information, &the_intr->Object, 0 );
+
+ /*
+ * Normally, an Id would be returned here.
+ */
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_release(
+ intr_t intr,
+ int (*intr_handler)( void *area )
+)
+{
+ boolean found;
+ POSIX_Interrupt_Handler_control *the_intr;
+ POSIX_Interrupt_Control *the_vector;
+ POSIX_API_Thread_Support_Control *thread_support;
+ Chain_Node *the_node;
+
+ if ( !_ISR_Is_valid_user_handler( intr_handler ) )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Since interrupt handlers do not have a user visible id, there is
+ * no choice but to search the entire set of active interrupt handlers
+ * to find this one.
+ */
+
+ found = FALSE;
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ the_node = _Chain_Head( &the_vector->Handlers );
+
+ for ( ; !_Chain_Is_tail( &the_vector->Handlers, the_node ) ; ) {
+ the_intr = (POSIX_Interrupt_Handler_control *) the_node;
+
+ if ( the_intr->handler == intr_handler ) {
+ found = TRUE;
+ break;
+ }
+ the_node = the_node->next;
+ }
+
+ if ( !found ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ if ( !_Thread_Is_executing( the_intr->server ) ) {
+ _Thread_Enable_dispatch();
+ return EINVAL; /* XXX should be ENOISR; */
+ }
+
+ /*
+ * OK now we have found the interrupt handler and can do some work.
+ */
+
+ _Chain_Extract( &the_intr->Object.Node );
+
+ the_intr->is_active = FALSE;
+
+ the_vector->number_installed -= 1;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ thread_support->interrupts_installed--;
+
+ /*
+ * It is unnecessary to flush the semaphore since the handler can only
+ * be "removed" by the thread which installed it. Thus it cannot be
+ * blocked on the semaphore or it would not be executing this routine.
+ */
+
+ _Objects_Close( &_POSIX_Interrupt_Handlers_Information, &the_intr->Object );
+
+ _POSIX_Interrupt_Free( the_intr );
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_lock(
+ intr_t intr
+)
+{
+ POSIX_Interrupt_Control *the_vector;
+
+ _Thread_Disable_dispatch();
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ the_vector->lock_count++;
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_unlock(
+ intr_t intr
+)
+{
+ POSIX_Interrupt_Control *the_vector;
+
+ _Thread_Disable_dispatch();
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ if ( !--the_vector->lock_count ) {
+ while ( --the_vector->deferred_count ) {
+ _POSIX_Interrupt_Handler( intr );
+ }
+ }
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*
+ * 22.3.2 Await Interrupt Notification, P1003.4b/D8, p. 76
+ */
+
+int intr_timed_wait(
+ int flags,
+ const struct timespec *timeout
+)
+{
+ Watchdog_Interval ticks;
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ ticks = _POSIX_Timespec_to_interval( timeout );
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ _Thread_Disable_dispatch();
+
+ _CORE_semaphore_Seize(
+ &thread_support->Interrupt_Semaphore,
+ 0, /* XXX does id=0 hurt in this case? */
+ TRUE,
+ ticks
+ );
+ _Thread_Enable_dispatch();
+
+ return _Thread_Executing->Wait.return_code; /* XXX should be POSIX */
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Handler
+ *
+ */
+
+void _POSIX_Interrupt_Handler(
+ ISR_Vector_number vector
+)
+{
+ POSIX_Interrupt_Handler_control *the_intr;
+ POSIX_Interrupt_Control *the_vector;
+ POSIX_API_Thread_Support_Control *thread_support;
+ Chain_Node *the_node;
+ int status;
+
+ the_vector = &_POSIX_Interrupt_Information[ vector ];
+
+ the_node = _Chain_Head( &the_vector->Handlers );
+
+ for ( ; !_Chain_Is_tail( &the_vector->Handlers, the_node ) ; ) {
+ the_intr = (POSIX_Interrupt_Handler_control *) the_node;
+
+ status = (*the_intr->handler)( (void *) the_intr->user_data_area );
+
+ switch ( status ) {
+ case INTR_HANDLED_NOTIFY:
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ _CORE_semaphore_Surrender(
+ &thread_support->Interrupt_Semaphore,
+ 0, /* XXX is id=0 a problem */
+ 0 /* XXX is this a problem (mp support)*/
+ );
+ return;
+
+ case INTR_HANDLED_DO_NOT_NOTIFY:
+ return;
+
+ case INTR_NOT_HANDLED:
+ default: /* this should not happen */
+ break;
+ }
+ the_node = the_node->next;
+ }
+
+ /* XXX
+ *
+ * This is an unhandled interrupt!!!
+ */
+}
diff --git a/c/src/exec/posix/src/key.c b/c/src/exec/posix/src/key.c
new file mode 100644
index 0000000000..1203343f66
--- /dev/null
+++ b/c/src/exec/posix/src/key.c
@@ -0,0 +1,262 @@
+/*
+ * $Id$
+ */
+
+#include <errno.h>
+#include <limits.h>
+#include <pthread.h>
+#include <string.h>
+
+#include <rtems/system.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/key.h>
+
+/*
+ * _POSIX_Key_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Key_Manager_initialization(
+ unsigned32 maximum_keys
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Keys_Information,
+ OBJECTS_POSIX_KEYS,
+ FALSE,
+ maximum_keys,
+ sizeof( POSIX_Keys_Control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163
+ */
+
+int pthread_key_create(
+ pthread_key_t *key,
+ void (*destructor)( void * )
+)
+{
+ POSIX_Keys_Control *the_key;
+ void *table;
+ unsigned32 the_class;
+ unsigned32 bytes_to_allocate;
+
+
+ _Thread_Disable_dispatch();
+
+ the_key = _POSIX_Keys_Allocate();
+
+ if ( !the_key ) {
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ the_key->destructor = destructor;
+
+ for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;
+ the_class++ ) {
+
+ bytes_to_allocate =
+ (_Objects_Information_table[ the_class ]->maximum + 1) * sizeof( void * );
+
+ table = _Workspace_Allocate( bytes_to_allocate );
+
+ if ( !table ) {
+ for ( --the_class;
+ the_class >= OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class-- )
+ _Workspace_Free( the_key->Values[ the_class ] );
+
+ _POSIX_Keys_Free( the_key );
+ _Thread_Enable_dispatch();
+ return ENOMEM;
+ }
+
+ the_key->Values[ the_class ] = table;
+ memset( table, '\0', bytes_to_allocate );
+ }
+
+ the_key->is_active = TRUE;
+
+ _Objects_Open( &_POSIX_Keys_Information, &the_key->Object, 0 );
+
+ *key = the_key->Object.id;
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
+ */
+
+int pthread_setspecific(
+ pthread_key_t key,
+ const void *value
+)
+{
+ register POSIX_Keys_Control *the_key;
+ unsigned32 index;
+ unsigned32 class;
+ Objects_Locations location;
+
+ the_key = _POSIX_Keys_Get( key, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never happen */
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ index = _Objects_Get_index( _Thread_Executing->Object.id );
+ class = _Objects_Get_class( _Thread_Executing->Object.id );
+ the_key->Values[ class ][ index ] = (void *) value;
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
+ */
+
+void *pthread_getspecific(
+ pthread_key_t key
+)
+{
+ register POSIX_Keys_Control *the_key;
+ unsigned32 index;
+ unsigned32 class;
+ Objects_Locations location;
+ void *key_data;
+
+ the_key = _POSIX_Keys_Get( key, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never happen */
+ return NULL;
+ case OBJECTS_LOCAL:
+ index = _Objects_Get_index( _Thread_Executing->Object.id );
+ class = _Objects_Get_class( _Thread_Executing->Object.id );
+ key_data = (void *) the_key->Values[ class ][ index ];
+ _Thread_Enable_dispatch();
+ return key_data;
+ }
+ return (void *) POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167
+ */
+
+int pthread_key_delete(
+ pthread_key_t key
+)
+{
+ register POSIX_Keys_Control *the_key;
+ Objects_Locations location;
+ unsigned32 the_class;
+
+ the_key = _POSIX_Keys_Get( key, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never happen */
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ _Objects_Close( &_POSIX_Keys_Information, &the_key->Object );
+
+ the_key->is_active = FALSE;
+
+ for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;
+ the_class++ )
+ _Workspace_Free( the_key->Values[ the_class ] );
+
+ /*
+ * NOTE: The destructor is not called and it is the responsibility
+ * of the application to free the memory.
+ */
+
+ _POSIX_Keys_Free( the_key );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Run_destructors
+ *
+ * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163
+ *
+ * NOTE: This is the routine executed when a thread exits to
+ * run through all the keys and do the destructor action.
+ */
+
+void _POSIX_Keys_Run_destructors(
+ Thread_Control *thread
+)
+{
+ unsigned32 index;
+ unsigned32 pthread_index;
+ unsigned32 pthread_class;
+ unsigned32 iterations;
+ boolean are_all_null;
+ POSIX_Keys_Control *the_key;
+ void *value;
+
+ pthread_index = _Objects_Get_index( thread->Object.id );
+ pthread_class = _Objects_Get_class( thread->Object.id );
+
+ iterations = 0;
+
+ for ( ; ; ) {
+
+ are_all_null = TRUE;
+
+ for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) {
+
+ the_key = (POSIX_Keys_Control *)
+ _POSIX_Keys_Information.local_table[ index ];
+
+ if ( the_key && the_key->is_active && the_key->destructor ) {
+ value = the_key->Values[ pthread_class ][ pthread_index ];
+ if ( value ) {
+ (*the_key->destructor)( value );
+ if ( the_key->Values[ pthread_class ][ pthread_index ] )
+ are_all_null = FALSE;
+ }
+ }
+ }
+
+ if ( are_all_null == TRUE )
+ return;
+
+ iterations++;
+
+ /*
+ * The standard allows one to not do this and thus go into an infinite
+ * loop. It seems rude to unnecessarily lock up a system.
+ *
+ * Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
+ */
+
+ if ( iterations >= PTHREAD_DESTRUCTOR_ITERATIONS )
+ return;
+ }
+}
diff --git a/c/src/exec/posix/src/mqueue.c b/c/src/exec/posix/src/mqueue.c
new file mode 100644
index 0000000000..82da4ee706
--- /dev/null
+++ b/c/src/exec/posix/src/mqueue.c
@@ -0,0 +1,710 @@
+/*
+ * NOTE: The structure of the routines is identical to that of POSIX
+ * Message_queues to leave the option of having unnamed message
+ * queues at a future date. They are currently not part of the
+ * POSIX standard but unnamed message_queues are. This is also
+ * the reason for the apparently unnecessary tracking of
+ * the process_shared attribute. [In addition to the fact that
+ * it would be trivial to add pshared to the mq_attr structure
+ * and have process private message queues.]
+ *
+ * This code ignores the O_RDONLY/O_WRONLY/O_RDWR flag at open
+ * time.
+ *
+ * $Id$
+ */
+
+#include <stdarg.h>
+
+#include <pthread.h>
+#include <limits.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <mqueue.h>
+
+#include <rtems/system.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/mqueue.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Manager_initialization
+ *
+ * This routine initializes all message_queue manager related data structures.
+ *
+ * Input parameters:
+ * maximum_message_queues - maximum configured message_queues
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Message_queue_Information,
+ OBJECTS_POSIX_MESSAGE_QUEUES,
+ TRUE,
+ maximum_message_queues,
+ sizeof( POSIX_Message_queue_Control ),
+ TRUE,
+ _POSIX_PATH_MAX,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Create_support
+ */
+
+int _POSIX_Message_queue_Create_support(
+ const char *name,
+ int pshared,
+ unsigned int oflag,
+ struct mq_attr *attr,
+ POSIX_Message_queue_Control **message_queue
+)
+{
+ POSIX_Message_queue_Control *the_mq;
+
+ _Thread_Disable_dispatch();
+
+ the_mq = _POSIX_Message_queue_Allocate();
+
+ if ( !the_mq ) {
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENFILE );
+ }
+
+ if ( pshared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Message_queue_Information, 0,
+ the_mq->Object.id, FALSE ) ) ) {
+ _POSIX_Message_queue_Free( the_mq );
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENFILE );
+ }
+
+ the_mq->process_shared = pshared;
+
+ if ( name ) {
+ the_mq->named = TRUE;
+ the_mq->open_count = 1;
+ the_mq->linked = TRUE;
+ }
+ else
+ the_mq->named = FALSE;
+
+ if ( oflag & O_NONBLOCK )
+ the_mq->blocking = FALSE;
+ else
+ the_mq->blocking = TRUE;
+
+ /* XXX
+ *
+ * Note that this should be based on the current scheduling policy.
+ */
+
+ /* XXX
+ *
+ * Message and waiting disciplines are not distinguished.
+ */
+/*
+ the_mq_attr->message_discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+ the_mq_attr->waiting_discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+ */
+
+ the_mq->Message_queue.Attributes.discipline =
+ CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+
+ if ( ! _CORE_message_queue_Initialize(
+ &the_mq->Message_queue,
+ OBJECTS_POSIX_MESSAGE_QUEUES,
+ &the_mq->Message_queue.Attributes,
+ attr->mq_maxmsg,
+ attr->mq_msgsize,
+ _POSIX_Message_queue_MP_Send_extract_proxy ) ) {
+
+ if ( pshared == PTHREAD_PROCESS_SHARED )
+ _Objects_MP_Close( &_POSIX_Message_queue_Information, the_mq->Object.id );
+
+ _POSIX_Message_queue_Free( the_mq );
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENOSPC );
+ }
+
+
+ /* XXX - need Names to be a string!!! */
+ _Objects_Open(
+ &_POSIX_Message_queue_Information,
+ &the_mq->Object,
+ (char *) name
+ );
+
+ *message_queue = the_mq;
+
+ if ( pshared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Message_queue_MP_Send_process_packet(
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_CREATE,
+ the_mq->Object.id,
+ (char *) name,
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 15.2.2 Open a Message Queue, P1003.1b-1993, p. 272
+ */
+
+mqd_t mq_open(
+ const char *name,
+ int oflag,
+ ...
+ /* mode_t mode, */
+ /* struct mq_attr attr */
+)
+{
+ va_list arg;
+ mode_t mode;
+ struct mq_attr *attr;
+ int status;
+ Objects_Id the_mq_id;
+ POSIX_Message_queue_Control *the_mq;
+
+ if ( oflag & O_CREAT ) {
+ va_start(arg, oflag);
+ mode = (mode_t) va_arg( arg, mode_t * );
+ attr = (struct mq_attr *) va_arg( arg, struct mq_attr ** );
+ va_end(arg);
+ }
+
+ status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
+
+ /*
+ * If the name to id translation worked, then the message queue exists
+ * and we can just return a pointer to the id. Otherwise we may
+ * need to check to see if this is a "message queue does not exist"
+ * or some other miscellaneous error on the name.
+ */
+
+ if ( status ) {
+
+ if ( status == EINVAL ) { /* name -> ID translation failed */
+ if ( !(oflag & O_CREAT) ) { /* willing to create it? */
+ seterrno( ENOENT );
+ return (mqd_t) -1;
+ }
+ /* we are willing to create it */
+ }
+ seterrno( status ); /* some type of error */
+ return (mqd_t) -1;
+
+ } else { /* name -> ID translation succeeded */
+
+ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
+ seterrno( EEXIST );
+ return (mqd_t) -1;
+ }
+
+ /*
+ * XXX In this case we need to do an ID->pointer conversion to
+ * check the mode. This is probably a good place for a subroutine.
+ */
+
+ the_mq->open_count += 1;
+
+ return (mqd_t)&the_mq->Object.id;
+
+ }
+
+ /* XXX verify this comment...
+ *
+ * At this point, the message queue does not exist and everything has been
+ * checked. We should go ahead and create a message queue.
+ */
+
+ status = _POSIX_Message_queue_Create_support(
+ name,
+ TRUE, /* shared across processes */
+ oflag,
+ attr,
+ &the_mq
+ );
+
+ if ( status == -1 )
+ return (mqd_t) -1;
+
+ return (mqd_t) &the_mq->Object.id;
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Delete
+ */
+
+void _POSIX_Message_queue_Delete(
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ if ( !the_mq->linked && !the_mq->open_count ) {
+ _POSIX_Message_queue_Free( the_mq );
+
+ if ( the_mq->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Message_queue_Information,
+ the_mq->Object.id
+ );
+
+ _POSIX_Message_queue_MP_Send_process_packet(
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_DELETE,
+ the_mq->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+
+ }
+}
+
+/*PAGE
+ *
+ * 15.2.2 Close a Message Queue, P1003.1b-1993, p. 275
+ */
+
+int mq_close(
+ mqd_t mqdes
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ the_mq->open_count -= 1;
+ _POSIX_Message_queue_Delete( the_mq );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.2 Remove a Message Queue, P1003.1b-1993, p. 276
+ */
+
+int mq_unlink(
+ const char *name
+)
+{
+ int status;
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Id the_mq_id;
+ Objects_Locations location;
+
+ status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
+
+ if ( !status )
+ set_errno_and_return_minus_one( status );
+
+ the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+
+ _Objects_MP_Close(
+ &_POSIX_Message_queue_Information,
+ the_mq->Object.id
+ );
+
+ the_mq->linked = FALSE;
+
+ _POSIX_Message_queue_Delete( the_mq );
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Send_support
+ */
+
+int _POSIX_Message_queue_Send_support(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ unsigned32 msg_len,
+ Priority_Control msg_prio,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /* XXX must add support for timeout and priority */
+ _CORE_message_queue_Send(
+ &the_mq->Message_queue,
+ (void *) msg_ptr,
+ msg_len,
+ mqdes,
+ NULL /* XXX _POSIX_Message_queue_Core_message_queue_mp_support*/
+ );
+ _Thread_Enable_dispatch();
+ return _Thread_Executing->Wait.return_code;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.4 Send a Message to a Message Queue, P1003.1b-1993, p. 277
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedsend().
+ */
+
+int mq_send(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio
+)
+{
+ return _POSIX_Message_queue_Send_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ THREAD_QUEUE_WAIT_FOREVER
+ );
+}
+
+/*PAGE
+ *
+ * 15.2.4 Send a Message to a Message Queue, P1003.1b-1993, p. 277
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedsend().
+ */
+
+int mq_timedsend(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Message_queue_Send_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Receive_support
+ */
+
+/* XXX be careful ... watch the size going through all the layers ... */
+
+ssize_t _POSIX_Message_queue_Receive_support(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+ unsigned32 status = 0;
+ unsigned32 length_out;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /* XXX need to define the options argument to this */
+ length_out = msg_len;
+ _CORE_message_queue_Seize(
+ &the_mq->Message_queue,
+ mqdes,
+ msg_ptr,
+ &length_out,
+ /* msg_prio, XXXX */
+ the_mq->blocking,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ if ( !status )
+ return length_out;
+ /* XXX --- the return codes gotta be looked at .. fix this */
+ return _Thread_Executing->Wait.return_code;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.5 Receive a Message From a Message Queue, P1003.1b-1993, p. 279
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedreceive().
+ */
+
+ssize_t mq_receive(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio
+)
+{
+ return _POSIX_Message_queue_Receive_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ THREAD_QUEUE_WAIT_FOREVER
+ );
+}
+
+/*PAGE
+ *
+ * 15.2.5 Receive a Message From a Message Queue, P1003.1b-1993, p. 279
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedreceive().
+ */
+
+int mq_timedreceive( /* XXX: should this be ssize_t */
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Message_queue_Receive_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Notify_handler
+ *
+ */
+
+void _POSIX_Message_queue_Notify_handler(
+ void *user_data
+)
+{
+ POSIX_Message_queue_Control *the_mq;
+
+ the_mq = user_data;
+
+ /* XXX do something with signals here!!!! */
+}
+
+/*PAGE
+ *
+ * 15.2.6 Notify Process that a Message is Available on a Queue,
+ * P1003.1b-1993, p. 280
+ */
+
+int mq_notify(
+ mqd_t mqdes,
+ const struct sigevent *notification
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EBADF );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ if ( notification ) {
+ if ( _CORE_message_queue_Is_notify_enabled( &the_mq->Message_queue ) ) {
+ _Thread_Enable_dispatch();
+ seterrno( EBUSY );
+ return( -1 );
+ }
+
+ _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL );
+
+ the_mq->notification = *notification;
+
+ _CORE_message_queue_Set_notify(
+ &the_mq->Message_queue,
+ _POSIX_Message_queue_Notify_handler,
+ the_mq
+ );
+ } else {
+
+ _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL );
+
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.7 Set Message Queue Attributes, P1003.1b-1993, p. 281
+ */
+
+int mq_setattr(
+ mqd_t mqdes,
+ const struct mq_attr *mqstat,
+ struct mq_attr *omqstat
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+ CORE_message_queue_Attributes *the_mq_attr;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /*
+ * Return the old values.
+ */
+
+ /* XXX this is the same stuff as is in mq_getattr... and probably */
+ /* XXX should be in an inlined private routine */
+
+ the_mq_attr = &the_mq->Message_queue.Attributes;
+
+ omqstat->mq_flags = the_mq->flags;
+ omqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
+ omqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
+ omqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
+
+ /*
+ * Ignore everything except the O_NONBLOCK bit.
+ */
+
+ if ( mqstat->mq_flags & O_NONBLOCK )
+ the_mq->blocking = FALSE;
+ else
+ the_mq->blocking = TRUE;
+
+ the_mq->flags = mqstat->mq_flags;
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.8 Get Message Queue Attributes, P1003.1b-1993, p. 283
+ */
+
+int mq_getattr(
+ mqd_t mqdes,
+ struct mq_attr *mqstat
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+ CORE_message_queue_Attributes *the_mq_attr;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /*
+ * Return the old values.
+ */
+
+ /* XXX this is the same stuff as is in mq_setattr... and probably */
+ /* XXX should be in an inlined private routine */
+
+ the_mq_attr = &the_mq->Message_queue.Attributes;
+
+ mqstat->mq_flags = the_mq->flags;
+ mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
+ mqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
+ mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
diff --git a/c/src/exec/posix/src/mutex.c b/c/src/exec/posix/src/mutex.c
new file mode 100644
index 0000000000..037791a252
--- /dev/null
+++ b/c/src/exec/posix/src/mutex.c
@@ -0,0 +1,683 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include <rtems/system.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/mpci.h>
+#include <rtems/posix/mutex.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/time.h>
+
+/*
+ * TEMPORARY
+ */
+
+void _POSIX_Mutex_MP_Send_process_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+void _POSIX_Mutex_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+int _POSIX_Mutex_MP_Send_request_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+)
+{
+ return POSIX_MP_NOT_IMPLEMENTED();
+}
+
+void POSIX_Threads_mutex_MP_support(
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED(); /* XXX: should never get here */
+}
+
+/*
+ * END OF TEMPORARY
+ */
+
+/*PAGE
+ *
+ * The default mutex attributes structure.
+ */
+
+const pthread_mutexattr_t _POSIX_Mutex_Default_attributes = {
+ TRUE, /* is_initialized */
+ PTHREAD_PROCESS_PRIVATE, /* process_shared */
+ POSIX_SCHEDULER_MAXIMUM_PRIORITY, /* prio_ceiling */
+ PTHREAD_PRIO_NONE, /* protocol */
+ FALSE /* recursive */
+};
+
+/*PAGE
+ *
+ * _POSIX_Mutex_From_core_mutex_status
+ */
+
+int _POSIX_Mutex_From_core_mutex_status(
+ CORE_mutex_Status status
+)
+{
+ switch ( status ) {
+ case CORE_MUTEX_STATUS_SUCCESSFUL:
+ return 0;
+ case CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT:
+ return EBUSY;
+ case CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED:
+ return EDEADLK;
+ case CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE:
+ return EPERM;
+ case CORE_MUTEX_WAS_DELETED:
+ return EINVAL;
+ case CORE_MUTEX_TIMEOUT:
+ return EAGAIN;
+ case CORE_MUTEX_STATUS_CEILING_VIOLATED:
+ return EINVAL;
+ default:
+ break;
+ }
+ assert( 0 );
+ return 0;
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Manager_initialization
+ *
+ * This routine initializes all mutex manager related data structures.
+ *
+ * Input parameters:
+ * maximum_mutexes - maximum configured mutexes
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Mutex_Manager_initialization(
+ unsigned32 maximum_mutexes
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Mutex_Information,
+ OBJECTS_POSIX_MUTEXES,
+ TRUE,
+ maximum_mutexes,
+ sizeof( POSIX_Mutex_Control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_init(
+ pthread_mutexattr_t *attr
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *attr = _POSIX_Mutex_Default_attributes;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_destroy(
+ pthread_mutexattr_t *attr
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ attr->is_initialized = FALSE;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_getpshared(
+ const pthread_mutexattr_t *attr,
+ int *pshared
+)
+{
+ if ( !attr || !attr->is_initialized || !pshared )
+ return EINVAL;
+
+ *pshared = attr->process_shared;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_setpshared(
+ pthread_mutexattr_t *attr,
+ int pshared
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( pshared ) {
+ case PTHREAD_PROCESS_SHARED:
+ case PTHREAD_PROCESS_PRIVATE:
+ attr->process_shared = pshared;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
+ *
+ * NOTE: XXX Could be optimized so all the attribute error checking
+ * is not performed when attr is NULL.
+ */
+
+int pthread_mutex_init(
+ pthread_mutex_t *mutex,
+ const pthread_mutexattr_t *attr
+)
+{
+ POSIX_Mutex_Control *the_mutex;
+ CORE_mutex_Attributes *the_mutex_attr;
+ const pthread_mutexattr_t *the_attr;
+ CORE_mutex_Disciplines the_discipline;
+ register POSIX_Mutex_Control *mutex_in_use;
+ Objects_Locations location;
+
+ if ( attr ) the_attr = attr;
+ else the_attr = &_POSIX_Mutex_Default_attributes;
+
+ /* Check for NULL mutex */
+
+ if ( !mutex )
+ return EINVAL;
+
+ /* EBUSY if *mutex is a valid id */
+
+ mutex_in_use = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ break;
+ case OBJECTS_REMOTE:
+ case OBJECTS_LOCAL:
+ _Thread_Enable_dispatch();
+ return EBUSY;
+ };
+
+ if ( !the_attr->is_initialized )
+ return EINVAL;
+
+ /*
+ * XXX: Be careful about attributes when global!!!
+ */
+
+ assert( the_attr->process_shared == PTHREAD_PROCESS_PRIVATE );
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ return POSIX_MP_NOT_IMPLEMENTED();
+
+ /*
+ * Determine the discipline of the mutex
+ */
+
+ switch ( the_attr->protocol ) {
+ case PTHREAD_PRIO_NONE:
+ the_discipline = CORE_MUTEX_DISCIPLINES_FIFO;
+ break;
+ case PTHREAD_PRIO_INHERIT:
+ the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
+ break;
+ case PTHREAD_PRIO_PROTECT:
+ the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
+ break;
+ default:
+ return EINVAL;
+ }
+
+ if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ the_mutex = _POSIX_Mutex_Allocate();
+
+ if ( !the_mutex ) {
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Mutex_Information, 0,
+ the_mutex->Object.id, FALSE ) ) ) {
+ _POSIX_Mutex_Free( the_mutex );
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ the_mutex->process_shared = the_attr->process_shared;
+
+ the_mutex_attr = &the_mutex->Mutex.Attributes;
+
+ the_mutex_attr->allow_nesting = the_attr->recursive;
+ the_mutex_attr->priority_ceiling =
+ _POSIX_Priority_To_core( the_attr->prio_ceiling );
+ the_mutex_attr->discipline = the_discipline;
+
+ /*
+ * Must be initialized to unlocked.
+ */
+
+ _CORE_mutex_Initialize(
+ &the_mutex->Mutex,
+ OBJECTS_POSIX_MUTEXES,
+ the_mutex_attr,
+ CORE_MUTEX_UNLOCKED,
+ NULL /* proxy_extract_callout */
+ );
+
+ _Objects_Open( &_POSIX_Mutex_Information, &the_mutex->Object, 0 );
+
+ *mutex = the_mutex->Object.id;
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Mutex_MP_Send_process_packet(
+ POSIX_MUTEX_MP_ANNOUNCE_CREATE,
+ the_mutex->Object.id,
+ 0, /* Name not used */
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_mutex_destroy(
+ pthread_mutex_t *mutex
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ /*
+ * XXX: There is an error for the mutex being locked
+ * or being in use by a condition variable.
+ */
+
+ if ( _CORE_mutex_Is_locked( &the_mutex->Mutex ) ) {
+ _Thread_Enable_dispatch();
+ return EBUSY;
+ }
+
+ _Objects_Close( &_POSIX_Mutex_Information, &the_mutex->Object );
+
+ _CORE_mutex_Flush(
+ &the_mutex->Mutex,
+ _POSIX_Mutex_MP_Send_object_was_deleted,
+ EINVAL
+ );
+
+ _POSIX_Mutex_Free( the_mutex );
+
+ if ( the_mutex->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close( &_POSIX_Mutex_Information, the_mutex->Object.id );
+
+ _POSIX_Mutex_MP_Send_process_packet(
+ POSIX_MUTEX_MP_ANNOUNCE_DELETE,
+ the_mutex->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Lock_support
+ *
+ * A support routine which implements guts of the blocking, non-blocking, and
+ * timed wait version of mutex lock.
+ */
+
+int _POSIX_Mutex_Lock_support(
+ pthread_mutex_t *mutex,
+ boolean blocking,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return _POSIX_Mutex_MP_Send_request_packet(
+ POSIX_MUTEX_MP_OBTAIN_REQUEST,
+ *mutex,
+ 0, /* must define the option set */
+ WATCHDOG_NO_TIMEOUT
+ );
+ case OBJECTS_LOCAL:
+ _CORE_mutex_Seize(
+ &the_mutex->Mutex,
+ the_mutex->Object.id,
+ blocking,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return _POSIX_Mutex_From_core_mutex_status(
+ (CORE_mutex_Status) _Thread_Executing->Wait.return_code
+ );
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_lock(
+ pthread_mutex_t *mutex
+)
+{
+ return _POSIX_Mutex_Lock_support( mutex, TRUE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_trylock(
+ pthread_mutex_t *mutex
+)
+{
+ return _POSIX_Mutex_Lock_support( mutex, FALSE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_unlock(
+ pthread_mutex_t *mutex
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+ CORE_mutex_Status status;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return _POSIX_Mutex_MP_Send_request_packet(
+ POSIX_MUTEX_MP_RELEASE_REQUEST,
+ *mutex,
+ 0, /* Not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+ case OBJECTS_LOCAL:
+ status = _CORE_mutex_Surrender(
+ &the_mutex->Mutex,
+ the_mutex->Object.id,
+ POSIX_Threads_mutex_MP_support
+ );
+ _Thread_Enable_dispatch();
+ return _POSIX_Mutex_From_core_mutex_status( status );
+ break;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_timedlock(
+ pthread_mutex_t *mutex,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Mutex_Lock_support(
+ mutex,
+ TRUE,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_setprotocol(
+ pthread_mutexattr_t *attr,
+ int protocol
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( protocol ) {
+ case PTHREAD_PRIO_NONE:
+ case PTHREAD_PRIO_INHERIT:
+ case PTHREAD_PRIO_PROTECT:
+ attr->protocol = protocol;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_getprotocol(
+ const pthread_mutexattr_t *attr,
+ int *protocol
+)
+{
+ if ( !attr || !attr->is_initialized || !protocol )
+ return EINVAL;
+
+ *protocol = attr->protocol;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_setprioceiling(
+ pthread_mutexattr_t *attr,
+ int prioceiling
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( prioceiling ) )
+ return EINVAL;
+
+ attr->prio_ceiling = prioceiling;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_getprioceiling(
+ const pthread_mutexattr_t *attr,
+ int *prioceiling
+)
+{
+ if ( !attr || !attr->is_initialized || !prioceiling )
+ return EINVAL;
+
+ *prioceiling = attr->prio_ceiling;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.6.2 Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131
+ */
+
+int pthread_mutex_setprioceiling(
+ pthread_mutex_t *mutex,
+ int prioceiling,
+ int *old_ceiling
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+ Priority_Control the_priority;
+ int status;
+
+ if ( !old_ceiling )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( prioceiling ) )
+ return EINVAL;
+
+ the_priority = _POSIX_Priority_To_core( prioceiling );
+
+ /*
+ * Must acquire the mutex before we can change it's ceiling
+ */
+
+ status = pthread_mutex_lock( mutex );
+ if ( status )
+ return status;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL; /* impossible to get here */
+ case OBJECTS_REMOTE:
+ /* XXX It feels questionable to set the ceiling on a remote mutex. */
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ *old_ceiling = _POSIX_Priority_From_core(
+ the_mutex->Mutex.Attributes.priority_ceiling
+ );
+ the_mutex->Mutex.Attributes.priority_ceiling = the_priority;
+ _CORE_mutex_Surrender(
+ &the_mutex->Mutex,
+ the_mutex->Object.id,
+ POSIX_Threads_mutex_MP_support
+ );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 13.6.2 Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131
+ */
+
+int pthread_mutex_getprioceiling(
+ pthread_mutex_t *mutex,
+ int *prioceiling
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+
+ if ( !prioceiling )
+ return EINVAL;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return POSIX_MP_NOT_IMPLEMENTED(); /* XXX feels questionable */
+ case OBJECTS_LOCAL:
+ *prioceiling = _POSIX_Priority_From_core(
+ the_mutex->Mutex.Attributes.priority_ceiling
+ );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
diff --git a/c/src/exec/posix/src/psignal.c b/c/src/exec/posix/src/psignal.c
new file mode 100644
index 0000000000..289c9f02d5
--- /dev/null
+++ b/c/src/exec/posix/src/psignal.c
@@ -0,0 +1,1347 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/threadsup.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/time.h>
+
+/*
+ * Currently 32 signals numbered 1-32 are defined
+ */
+
+#define SIGNAL_EMPTY_MASK 0x00000000
+#define SIGNAL_ALL_MASK 0xffffffff
+
+#define signo_to_mask( _sig ) (1 << ((_sig) - 1))
+
+#define is_valid_signo( _sig ) \
+ ((_sig) >= 1 && (_sig) <= 32 )
+
+/*** PROCESS WIDE STUFF ****/
+
+sigset_t _POSIX_signals_Pending;
+
+void _POSIX_signals_Abormal_termination_handler( int signo )
+{
+ exit( 1 );
+}
+
+#define _POSIX_signals_Stop_handler NULL
+#define _POSIX_signals_Continue_handler NULL
+
+#define SIGACTION_TERMINATE \
+ { 0, SIGNAL_ALL_MASK, {_POSIX_signals_Abormal_termination_handler} }
+#define SIGACTION_IGNORE \
+ { 0, SIGNAL_ALL_MASK, {SIG_IGN} }
+#define SIGACTION_STOP \
+ { 0, SIGNAL_ALL_MASK, {_POSIX_signals_Stop_handler} }
+#define SIGACTION_CONTINUE \
+ { 0, SIGNAL_ALL_MASK, {_POSIX_signals_Continue_handler} }
+
+#define SIG_ARRAY_MAX (SIGRTMAX + 1)
+struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {
+ /* NO SIGNAL 0 */ SIGACTION_IGNORE,
+ /* SIGHUP 1 */ SIGACTION_TERMINATE,
+ /* SIGINT 2 */ SIGACTION_TERMINATE,
+ /* SIGQUIT 3 */ SIGACTION_TERMINATE,
+ /* SIGILL 4 */ SIGACTION_TERMINATE,
+ /* SIGTRAP 5 */ SIGACTION_TERMINATE,
+ /* SIGIOT 6 */ SIGACTION_TERMINATE,
+ /* SIGABRT 6 SIGACTION_TERMINATE, -- alias for SIGIOT */
+ /* SIGEMT 7 */ SIGACTION_TERMINATE,
+ /* SIGFPE 8 */ SIGACTION_TERMINATE,
+ /* SIGKILL 9 */ SIGACTION_TERMINATE,
+ /* SIGBUS 10 */ SIGACTION_TERMINATE,
+ /* SIGSEGV 11 */ SIGACTION_TERMINATE,
+ /* SIGSYS 12 */ SIGACTION_TERMINATE,
+ /* SIGPIPE 13 */ SIGACTION_TERMINATE,
+ /* SIGALRM 14 */ SIGACTION_TERMINATE,
+ /* SIGTERM 15 */ SIGACTION_TERMINATE,
+ /* SIGUSR1 16 */ SIGACTION_TERMINATE,
+ /* SIGUSR2 17 */ SIGACTION_TERMINATE,
+ /* SIGRTMIN 18 */ SIGACTION_IGNORE,
+ /* SIGRT 19 */ SIGACTION_IGNORE,
+ /* SIGRT 20 */ SIGACTION_IGNORE,
+ /* SIGRT 21 */ SIGACTION_IGNORE,
+ /* SIGRT 22 */ SIGACTION_IGNORE,
+ /* SIGRT 23 */ SIGACTION_IGNORE,
+ /* SIGRT 24 */ SIGACTION_IGNORE,
+ /* SIGRT 25 */ SIGACTION_IGNORE,
+ /* SIGRT 26 */ SIGACTION_IGNORE,
+ /* SIGRT 27 */ SIGACTION_IGNORE,
+ /* SIGRT 28 */ SIGACTION_IGNORE,
+ /* SIGRT 29 */ SIGACTION_IGNORE,
+ /* SIGRT 30 */ SIGACTION_IGNORE,
+ /* SIGRT 31 */ SIGACTION_IGNORE,
+ /* SIGRTMAX 32 */ SIGACTION_IGNORE
+};
+
+struct sigaction _POSIX_signals_Vectors[ SIG_ARRAY_MAX ];
+
+Watchdog_Control _POSIX_signals_Alarm_timer;
+
+Thread_queue_Control _POSIX_signals_Wait_queue;
+
+typedef struct {
+ Chain_Node Node;
+ siginfo_t Info;
+} POSIX_signals_Siginfo_node;
+
+Chain_Control _POSIX_signals_Inactive_siginfo;
+Chain_Control _POSIX_signals_Siginfo[ SIG_ARRAY_MAX ];
+
+/*PAGE
+ *
+ * XXX - move these
+ */
+
+#define _States_Is_interruptible_signal( _states ) \
+ ( ((_states) & \
+ (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL)) == \
+ (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL))
+
+/*PAGE
+ *
+ * _POSIX_signals_Unblock_thread
+ */
+
+/* XXX this routine could probably be cleaned up */
+boolean _POSIX_signals_Unblock_thread(
+ Thread_Control *the_thread,
+ int signo,
+ siginfo_t *info
+)
+{
+ POSIX_API_Control *api;
+ sigset_t mask;
+ siginfo_t *the_info = NULL;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ mask = signo_to_mask( signo );
+
+ /*
+ * Is the thread is specifically waiting for a signal?
+ */
+
+ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
+
+ if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
+ the_thread->Wait.return_code = EINTR;
+
+ the_info = (siginfo_t *) the_thread->Wait.return_argument;
+
+ if ( !info ) {
+ the_info->si_signo = signo;
+ the_info->si_code = SI_USER;
+ the_info->si_value.sival_int = 0;
+ } else {
+ *the_info = *info;
+ }
+
+ _Thread_queue_Extract_with_proxy( the_thread );
+ return TRUE;
+ }
+
+ /*
+ * This should only be reached via pthread_kill().
+ */
+
+ return FALSE;
+ }
+
+ if ( ~api->signals_blocked & mask ) {
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ if ( the_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) {
+ the_thread->Wait.return_code = EINTR;
+ if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
+ _Thread_queue_Extract_with_proxy( the_thread );
+ else if ( _States_Is_delaying(the_thread->current_state)){
+ if ( _Watchdog_Is_active( &the_thread->Timer ) )
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+ }
+ }
+ return FALSE;
+
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Set_process_signals
+ */
+
+void _POSIX_signals_Set_process_signals(
+ sigset_t mask
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ if ( !_POSIX_signals_Pending )
+ _Thread_Do_post_task_switch_extension++;
+ _POSIX_signals_Pending |= mask;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Clear_process_signals
+ */
+
+void _POSIX_signals_Clear_process_signals(
+ sigset_t mask
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _POSIX_signals_Pending &= ~mask;
+ if ( !_POSIX_signals_Pending )
+ _Thread_Do_post_task_switch_extension--;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Clear_signals
+ */
+
+boolean _POSIX_signals_Clear_signals(
+ POSIX_API_Control *api,
+ int signo,
+ siginfo_t *info,
+ boolean is_global,
+ boolean check_blocked
+)
+{
+ sigset_t mask;
+ sigset_t signals_blocked;
+ ISR_Level level;
+ boolean do_callout;
+ POSIX_signals_Siginfo_node *psiginfo;
+
+ mask = signo_to_mask( signo );
+
+ do_callout = FALSE;
+
+ /* set blocked signals based on if checking for them, SIGNAL_ALL_MASK
+ * insures that no signals are blocked and all are checked.
+ */
+
+ if ( check_blocked )
+ signals_blocked = ~api->signals_blocked;
+ else
+ signals_blocked = SIGNAL_ALL_MASK;
+
+ /* XXX this is not right for siginfo type signals yet */
+ /* XXX since they can't be cleared the same way */
+
+ _ISR_Disable( level );
+ if ( is_global ) {
+ if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
+ if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
+ psiginfo = (POSIX_signals_Siginfo_node *)
+ _Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
+ if ( _Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
+ _POSIX_signals_Clear_process_signals( mask );
+ if ( psiginfo ) {
+ *info = psiginfo->Info;
+ _Chain_Append_unprotected(
+ &_POSIX_signals_Inactive_siginfo,
+ &psiginfo->Node
+ );
+ } else
+ do_callout = FALSE;
+ } else
+ _POSIX_signals_Clear_process_signals( mask );
+ do_callout = TRUE;
+ }
+ } else {
+ if ( mask & (api->signals_pending & signals_blocked) ) {
+ api->signals_pending &= ~mask;
+ do_callout = TRUE;
+ }
+ }
+ _ISR_Enable( level );
+ return do_callout;
+}
+
+
+/*PAGE
+ *
+ * _POSIX_signals_Check_signal
+ */
+
+boolean _POSIX_signals_Check_signal(
+ POSIX_API_Control *api,
+ int signo,
+ boolean is_global
+)
+{
+ siginfo_t siginfo_struct;
+ sigset_t saved_signals_blocked;
+
+ if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
+ is_global, TRUE ) )
+ return FALSE;
+
+ /*
+ * Since we made a union of these, only one test is necessary but this is
+ * safer.
+ */
+
+ assert( _POSIX_signals_Vectors[ signo ].sa_handler ||
+ _POSIX_signals_Vectors[ signo ].sa_sigaction );
+
+ /*
+ * Just to prevent sending a signal which is currently being ignored.
+ */
+
+ if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
+ return FALSE;
+
+ /*
+ * Block the signals requested in sa_mask
+ */
+
+ saved_signals_blocked = api->signals_blocked;
+ api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
+
+ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
+ case SA_SIGINFO:
+ assert( is_global );
+
+ (*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
+ signo,
+ &siginfo_struct,
+ NULL /* context is undefined per 1003.1b-1993, p. 66 */
+ );
+ break;
+ default:
+ (*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
+ break;
+ }
+
+ /*
+ * Restore the previous set of blocked signals
+ */
+
+ api->signals_blocked = saved_signals_blocked;
+
+ return TRUE;
+}
+
+void _POSIX_signals_Post_switch_extension(
+ Thread_Control *the_thread
+)
+{
+ POSIX_API_Control *api;
+ int signo;
+ ISR_Level level;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ /*
+ * If we invoke any user code, there is the possibility that
+ * a new signal has been posted that we should process so we
+ * restart the loop if a signal handler was invoked.
+ *
+ * The first thing done is to check there are any signals to be
+ * processed at all. No point in doing this loop otherwise.
+ */
+
+restart:
+ _ISR_Disable( level );
+ if ( !(~api->signals_blocked &
+ (api->signals_pending | _POSIX_signals_Pending)) ) {
+ _ISR_Enable( level );
+ return;
+ }
+ _ISR_Enable( level );
+
+ for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
+
+ if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )
+ goto restart;
+
+ if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )
+ goto restart;
+
+ }
+
+/* XXX - add __SIGFIRSTNOTRT or something like that to newlib siginfo.h */
+
+ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
+
+ if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )
+ goto restart;
+
+ if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )
+ goto restart;
+
+ }
+
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Alarm_TSR
+ */
+
+void _POSIX_signals_Alarm_TSR(
+ Objects_Id id,
+ void *argument
+)
+{
+ int status;
+
+ status = kill( getpid(), SIGALRM );
+ /* XXX can't print from an ISR, should this be fatal? */
+ assert( !status );
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Manager_Initialization
+ */
+
+void _POSIX_signals_Manager_Initialization(
+ int maximum_queued_signals
+)
+{
+ unsigned32 signo;
+
+ /*
+ * Insure we have the same number of vectors and default vector entries
+ */
+
+ assert(
+ sizeof(_POSIX_signals_Vectors) == sizeof(_POSIX_signals_Default_vectors)
+ );
+
+ memcpy(
+ _POSIX_signals_Vectors,
+ _POSIX_signals_Default_vectors,
+ sizeof( _POSIX_signals_Vectors )
+ );
+
+ /*
+ * Initialize the set of pending signals for the entire process
+ */
+
+ sigemptyset( &_POSIX_signals_Pending );
+
+ /*
+ * Initialize the timer used to implement alarm().
+ */
+
+ _Watchdog_Initialize(
+ &_POSIX_signals_Alarm_timer,
+ _POSIX_signals_Alarm_TSR,
+ 0,
+ NULL
+ );
+
+ /*
+ * Initialize the queue we use to block for signals
+ */
+
+ _Thread_queue_Initialize(
+ &_POSIX_signals_Wait_queue,
+ OBJECTS_NO_CLASS,
+ THREAD_QUEUE_DISCIPLINE_PRIORITY,
+ STATES_WAITING_FOR_SIGNAL | STATES_INTERRUPTIBLE_BY_SIGNAL,
+ NULL,
+ EAGAIN
+ );
+
+ /* XXX status codes */
+
+ /*
+ * Allocate the siginfo pools.
+ */
+
+ for ( signo=1 ; signo<= SIGRTMAX ; signo++ )
+ _Chain_Initialize_empty( &_POSIX_signals_Siginfo[ signo ] );
+
+ _Chain_Initialize(
+ &_POSIX_signals_Inactive_siginfo,
+ _Workspace_Allocate_or_fatal_error(
+ maximum_queued_signals * sizeof( POSIX_signals_Siginfo_node )
+ ),
+ maximum_queued_signals,
+ sizeof( POSIX_signals_Siginfo_node )
+ );
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigemptyset(
+ sigset_t *set
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set = 0;
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigfillset(
+ sigset_t *set
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set = SIGNAL_ALL_MASK;
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigaddset(
+ sigset_t *set,
+ int signo
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( !signo )
+ return 0;
+
+ if ( !is_valid_signo(signo) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set |= signo_to_mask(signo);
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigdelset(
+ sigset_t *set,
+ int signo
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( !signo )
+ return 0;
+
+ if ( !is_valid_signo(signo) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set &= ~signo_to_mask(signo);
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigismember(
+ const sigset_t *set,
+ int signo
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( !signo )
+ return 0;
+
+ if ( !is_valid_signo(signo) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( *set & signo_to_mask(signo) )
+ return 1;
+
+ return 0;
+}
+
+/*
+ * 3.3.4 Examine and Change Signal Action, P1003.1b-1993, p. 70
+ */
+
+int sigaction(
+ int sig,
+ const struct sigaction *act,
+ struct sigaction *oact
+)
+{
+ ISR_Level level;
+
+ if ( oact )
+ *oact = _POSIX_signals_Vectors[ sig ];
+
+ if ( !sig )
+ return 0;
+
+ if ( !is_valid_signo(sig) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * Some signals cannot be ignored (P1003.1b-1993, pp. 70-72 and references.
+ *
+ * NOTE: Solaris documentation claims to "silently enforce" this which
+ * contradicts the POSIX specification.
+ */
+
+ if ( sig == SIGKILL )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * Evaluate the new action structure and set the global signal vector
+ * appropriately.
+ */
+
+ if ( act ) {
+
+ /*
+ * Unless the user is installing the default signal actions, then
+ * we can just copy the provided sigaction structure into the vectors.
+ */
+
+ _ISR_Disable( level );
+ if ( act->sa_handler == SIG_DFL ) {
+ _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
+ } else {
+ _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
+ _POSIX_signals_Vectors[ sig ] = *act;
+ }
+ _ISR_Enable( level );
+ }
+
+ /*
+ * No need to evaluate or dispatch because:
+ *
+ * + If we were ignoring the signal before, none could be pending
+ * now (signals not posted when SIG_IGN).
+ * + If we are now ignoring a signal that was previously pending,
+ * we clear the pending signal indicator.
+ */
+
+ return 0;
+}
+
+/*
+ * 3.3.5 Examine and Change Blocked Signals, P1003.1b-1993, p. 73
+ *
+ * NOTE: P1003.1c/D10, p. 37 adds pthread_sigmask().
+ *
+ */
+
+int sigprocmask(
+ int how,
+ const sigset_t *set,
+ sigset_t *oset
+)
+{
+ /*
+ * P1003.1c/Draft 10, p. 38 maps sigprocmask to pthread_sigmask.
+ */
+
+ return pthread_sigmask( how, set, oset );
+}
+
+/*
+ * 3.3.5 Examine and Change Blocked Signals, P1003.1b-1993, p. 73
+ *
+ * NOTE: P1003.1c/D10, p. 37 adds pthread_sigmask().
+ */
+
+int pthread_sigmask(
+ int how,
+ const sigset_t *set,
+ sigset_t *oset
+)
+{
+ POSIX_API_Control *api;
+
+ if ( !set && !oset )
+ set_errno_and_return_minus_one( EINVAL );
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( oset )
+ *oset = api->signals_blocked;
+
+ if ( !set )
+ return 0;
+
+ switch ( how ) {
+ case SIG_BLOCK:
+ api->signals_blocked |= *set;
+ break;
+ case SIG_UNBLOCK:
+ api->signals_blocked &= ~*set;
+ break;
+ case SIG_SETMASK:
+ api->signals_blocked = *set;
+ break;
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+ }
+
+ /* XXX are there critical section problems here? */
+
+ /* XXX evaluate the new set */
+
+ if ( ~api->signals_blocked &
+ (api->signals_pending | _POSIX_signals_Pending) ) {
+ _Thread_Executing->do_post_task_switch_extension = TRUE;
+ _Thread_Dispatch();
+ }
+
+ return 0;
+}
+
+/*
+ * 3.3.6 Examine Pending Signals, P1003.1b-1993, p. 75
+ */
+
+int sigpending(
+ sigset_t *set
+)
+{
+ POSIX_API_Control *api;
+
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ *set = api->signals_pending | _POSIX_signals_Pending;
+
+ return 0;
+}
+
+/*
+ * 3.3.7 Wait for a Signal, P1003.1b-1993, p. 75
+ */
+
+int sigsuspend(
+ const sigset_t *sigmask
+)
+{
+ sigset_t saved_signals_blocked;
+ sigset_t all_signals;
+ int status;
+ POSIX_API_Control *api;
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ status = sigprocmask( SIG_BLOCK, sigmask, &saved_signals_blocked );
+
+ (void) sigfillset( &all_signals );
+
+ status = sigtimedwait( &all_signals, NULL, NULL );
+
+ (void) sigprocmask( SIG_SETMASK, &saved_signals_blocked, NULL );
+
+ return status;
+}
+
+/*
+ * 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
+ *
+ * NOTE: P1003.1c/D10, p. 39 adds sigwait().
+ */
+
+int sigwaitinfo(
+ const sigset_t *set,
+ siginfo_t *info
+)
+{
+ return sigtimedwait( set, info, NULL );
+}
+
+/*
+ * 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
+ *
+ * NOTE: P1003.1c/D10, p. 39 adds sigwait().
+ */
+
+int _POSIX_signals_Get_highest(
+ sigset_t set
+)
+{
+ int signo;
+
+ for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
+ if ( set & signo_to_mask( signo ) )
+ return signo;
+ }
+
+/* XXX - add __SIGFIRSTNOTRT or something like that to newlib siginfo.h */
+
+ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
+ if ( set & signo_to_mask( signo ) )
+ return signo;
+ }
+
+ return 0;
+}
+
+int sigtimedwait(
+ const sigset_t *set,
+ siginfo_t *info,
+ const struct timespec *timeout
+)
+{
+ Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Watchdog_Interval interval;
+ siginfo_t signal_information;
+ siginfo_t *the_info;
+ int signo;
+
+ the_info = ( info ) ? info : &signal_information;
+
+ the_thread = _Thread_Executing;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ /*
+ * What if they are already pending?
+ */
+
+ /* API signals pending? */
+
+ if ( *set & api->signals_pending ) {
+ /* XXX real info later */
+ the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending );
+ _POSIX_signals_Clear_signals( api, the_info->si_signo, the_info,
+ FALSE, FALSE );
+ the_info->si_code = SI_USER;
+ the_info->si_value.sival_int = 0;
+ return the_info->si_signo;
+ }
+
+ /* Process pending signals? */
+
+ if ( *set & _POSIX_signals_Pending) {
+ signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending );
+ _POSIX_signals_Clear_signals( api, signo, the_info, TRUE, FALSE );
+
+ if ( !info ) {
+ the_info->si_signo = signo;
+ the_info->si_code = SI_USER;
+ the_info->si_value.sival_int = 0;
+ }
+ }
+
+ interval = 0;
+ if ( timeout ) {
+
+ if (timeout->tv_nsec < 0 || timeout->tv_nsec >= TOD_NANOSECONDS_PER_SECOND)
+ set_errno_and_return_minus_one( EINVAL );
+
+ interval = _POSIX_Timespec_to_interval( timeout );
+ }
+
+ the_info->si_signo = -1;
+
+ _Thread_Disable_dispatch();
+ the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
+ the_thread->Wait.return_code = EINTR;
+ the_thread->Wait.option = *set;
+ the_thread->Wait.return_argument = (void *) the_info;
+ _Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
+ _Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
+ _Thread_Enable_dispatch();
+
+ errno = _Thread_Executing->Wait.return_code;
+ return the_info->si_signo;
+}
+
+/*
+ * 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
+ *
+ * NOTE: P1003.1c/D10, p. 39 adds sigwait().
+ */
+
+int sigwait(
+ const sigset_t *set,
+ int *sig
+)
+{
+ int status;
+
+ status = sigtimedwait( set, NULL, NULL );
+
+ if ( status != -1 ) {
+ if ( sig )
+ *sig = status;
+ return 0;
+ }
+
+ return errno;
+}
+
+/*PAGE
+ *
+ * 3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
+ *
+ * NOTE: Behavior of kill() depends on _POSIX_SAVED_IDS.
+ */
+
+#define _POSIX_signals_Is_interested( _api, _mask ) \
+ ( ~(_api)->signals_blocked & (_mask) )
+
+int killinfo(
+ pid_t pid,
+ int sig,
+ const union sigval *value
+)
+{
+ sigset_t mask;
+ POSIX_API_Control *api;
+ unsigned32 the_class;
+ unsigned32 index;
+ unsigned32 maximum;
+ Objects_Information *the_info;
+ Objects_Control **object_table;
+ Thread_Control *the_thread;
+ Thread_Control *interested_thread;
+ Priority_Control interested_priority;
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ siginfo_t siginfo_struct;
+ siginfo_t *siginfo;
+ POSIX_signals_Siginfo_node *psiginfo;
+
+ /*
+ * Only supported for the "calling process" (i.e. this node).
+ */
+
+ if( pid != getpid() )
+ set_errno_and_return_minus_one( ESRCH );
+
+ /*
+ * Validate the signal passed if not 0.
+ */
+
+ if ( sig && !is_valid_signo(sig) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * If the signal is being ignored, then we are out of here.
+ */
+
+ if ( !sig || _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
+ return 0;
+
+ /*
+ * P1003.1c/Draft 10, p. 33 says that certain signals should always
+ * be directed to the executing thread such as those caused by hardware
+ * faults.
+ */
+
+ switch ( sig ) {
+ case SIGFPE:
+ case SIGILL:
+ case SIGSEGV:
+ return pthread_kill( pthread_self(), sig );
+ default:
+ break;
+ }
+
+ mask = signo_to_mask( sig );
+
+ /*
+ * Build up a siginfo structure
+ */
+
+ siginfo = &siginfo_struct;
+ siginfo->si_signo = sig;
+ siginfo->si_code = SI_USER;
+ if ( !value ) {
+ siginfo->si_value.sival_int = 0;
+ } else {
+ siginfo->si_value = *value;
+ }
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Is the currently executing thread interested? If so then it will
+ * get it an execute it as soon as the dispatcher executes.
+ */
+
+ the_thread = _Thread_Executing;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+ if ( _POSIX_signals_Is_interested( api, mask ) ) {
+ goto process_it;
+ }
+
+ /*
+ * Is an interested thread waiting for this signal (sigwait())?
+ */
+
+ /* XXX violation of visibility -- need to define thread queue support */
+
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++ ) {
+
+ the_chain = &_POSIX_signals_Wait_queue.Queues.Priority[ index ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_thread = (Thread_Control *)the_node;
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ((the_thread->Wait.option & mask) || (~api->signals_blocked & mask)) {
+ goto process_it;
+ }
+
+ }
+ }
+
+ /*
+ * Is any other thread interested? The highest priority interested
+ * thread is selected. In the event of a tie, then the following
+ * additional criteria is used:
+ *
+ * + ready thread over blocked
+ * + blocked on call interruptible by signal (can return EINTR)
+ * + blocked on call not interruptible by signal
+ *
+ * This looks at every thread in the system regardless of the creating API.
+ *
+ * NOTES:
+ *
+ * + rtems internal threads do not receive signals.
+ */
+
+ interested_thread = NULL;
+ interested_priority = PRIORITY_MAXIMUM + 1;
+
+ for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;
+ the_class++ ) {
+
+ if ( the_class == OBJECTS_INTERNAL_THREADS )
+ continue;
+
+ the_info = _Objects_Information_table[ the_class ];
+
+ if ( !the_info ) /* manager not installed */
+ continue;
+
+ maximum = the_info->maximum;
+ object_table = the_info->local_table;
+
+ assert( object_table ); /* always at least 1 entry */
+
+ for ( index = 1 ; index <= maximum ; index++ ) {
+ the_thread = (Thread_Control *) object_table[ index ];
+
+ if ( !the_thread )
+ continue;
+
+ /*
+ * If this thread is of lower priority than the interested thread,
+ * go on to the next thread.
+ */
+
+ if ( the_thread->current_priority > interested_priority )
+ continue;
+
+ /*
+ * If this thread is not interested, then go on to the next thread.
+ */
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( !api || !_POSIX_signals_Is_interested( api, mask ) )
+ continue;
+
+ /*
+ * Now we know the thread under connsideration is interested.
+ * If the thread under consideration is of higher priority, then
+ * it becomes the interested thread.
+ */
+
+ if ( the_thread->current_priority < interested_priority ) {
+ interested_thread = the_thread;
+ interested_priority = the_thread->current_priority;
+ continue;
+ }
+
+ /*
+ * Now the thread and the interested thread have the same priority.
+ * If the interested thread is ready, then we don't need to send it
+ * to a blocked thread.
+ */
+
+ if ( _States_Is_ready( interested_thread->current_state ) )
+ continue;
+
+ /*
+ * Now the interested thread is blocked.
+ * If the thread we are considering is not, the it becomes the
+ * interested thread.
+ */
+
+ if ( _States_Is_ready( the_thread->current_state ) ) {
+ interested_thread = the_thread;
+ interested_priority = the_thread->current_priority;
+ continue;
+ }
+
+ /*
+ * Now we know both threads are blocked.
+ * If the interested thread is interruptible, then just use it.
+ */
+
+ /* XXX need a new states macro */
+ if ( interested_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL )
+ continue;
+
+ /*
+ * Now both threads are blocked and the interested thread is not
+ * interruptible.
+ * If the thread under consideration is interruptible by a signal,
+ * then it becomes the interested thread.
+ */
+
+ /* XXX need a new states macro */
+ if ( the_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) {
+ interested_thread = the_thread;
+ interested_priority = the_thread->current_priority;
+ }
+ }
+ }
+
+ if ( interested_thread ) {
+ the_thread = interested_thread;
+ goto process_it;
+ }
+
+ /*
+ * OK so no threads were interested right now. It will be left on the
+ * global pending until a thread receives it. The global set of threads
+ * can change interest in this signal in one of the following ways:
+ *
+ * + a thread is created with the signal unblocked,
+ * + pthread_sigmask() unblocks the signal,
+ * + sigprocmask() unblocks the signal, OR
+ * + sigaction() which changes the handler to SIG_IGN.
+ */
+
+ the_thread = NULL;
+ goto post_process_signal;
+
+ /*
+ * We found a thread which was interested, so now we mark that this
+ * thread needs to do the post context switch extension so it can
+ * evaluate the signals pending.
+ */
+
+process_it:
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ /*
+ * Returns TRUE if the signal was synchronously given to a thread
+ * blocked waiting for the signal.
+ */
+
+ if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) {
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+post_process_signal:
+
+ /*
+ * We may have woken up a thread but we definitely need to post the
+ * signal to the process wide information set.
+ */
+
+ _POSIX_signals_Set_process_signals( mask );
+
+ if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
+
+ psiginfo = (POSIX_signals_Siginfo_node *)
+ _Chain_Get( &_POSIX_signals_Inactive_siginfo );
+ if ( !psiginfo )
+ set_errno_and_return_minus_one( EAGAIN );
+
+ psiginfo->Info = *siginfo;
+
+ _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
+ *
+ * NOTE: Behavior of kill() depends on _POSIX_SAVED_IDS.
+ */
+
+int kill(
+ pid_t pid,
+ int sig
+)
+{
+ return killinfo( pid, sig, NULL );
+}
+
+/*
+ * 3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78
+ */
+
+int sigqueue(
+ pid_t pid,
+ int signo,
+ const union sigval value
+)
+{
+ return killinfo( pid, signo, &value );
+}
+
+/*
+ * 3.3.10 Send a Signal to a Thread, P1003.1c/D10, p. 43
+ */
+
+int pthread_kill(
+ pthread_t thread,
+ int sig
+)
+{
+ POSIX_API_Control *api;
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ if ( sig && !is_valid_signo(sig) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO )
+ set_errno_and_return_minus_one( ENOSYS );
+
+ /*
+ * RTEMS does not support sending a siginfo signal to a specific thread.
+ */
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ set_errno_and_return_minus_one( ESRCH );
+ case OBJECTS_LOCAL:
+ /*
+ * If sig == 0 then just validate arguments
+ */
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( sig ) {
+
+ if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ /* XXX critical section */
+
+ api->signals_pending |= signo_to_mask( sig );
+
+ (void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
+ _ISR_Signals_to_thread_executing = TRUE;
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*
+ * 3.4.1 Schedule Alarm, P1003.1b-1993, p. 79
+ */
+
+Watchdog_Control _POSIX_signals_Alarm_timer;
+
+unsigned int alarm(
+ unsigned int seconds
+)
+{
+ unsigned int remaining = 0;
+ Watchdog_Control *the_timer;
+
+ the_timer = &_POSIX_signals_Alarm_timer;
+
+ switch ( _Watchdog_Remove( the_timer ) ) {
+ case WATCHDOG_INACTIVE:
+ case WATCHDOG_BEING_INSERTED:
+ break;
+
+ case WATCHDOG_ACTIVE:
+ case WATCHDOG_REMOVE_IT:
+ remaining = the_timer->initial -
+ (the_timer->stop_time - the_timer->start_time);
+ break;
+ }
+
+ _Watchdog_Insert_seconds( the_timer, seconds );
+
+ return remaining;
+}
+
+/*
+ * 3.4.2 Suspend Process Execution, P1003.1b-1993, p. 81
+ */
+
+int pause( void )
+{
+ sigset_t all_signals;
+ int status;
+
+ (void) sigfillset( &all_signals );
+
+ status = sigtimedwait( &all_signals, NULL, NULL );
+
+ return status;
+}
diff --git a/c/src/exec/posix/src/pthread.c b/c/src/exec/posix/src/pthread.c
new file mode 100644
index 0000000000..95213389cb
--- /dev/null
+++ b/c/src/exec/posix/src/pthread.c
@@ -0,0 +1,1309 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <limits.h>
+
+#include <rtems/system.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/psignal.h>
+#include <rtems/posix/config.h>
+#include <rtems/posix/key.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * The default pthreads attributes structure.
+ *
+ * NOTE: Be careful .. if the default attribute set changes,
+ * _POSIX_Threads_Initialize_user_threads will need to be examined.
+ *
+ */
+
+const pthread_attr_t _POSIX_Threads_Default_attributes = {
+ TRUE, /* is_initialized */
+ NULL, /* stackaddr */
+ PTHREAD_MINIMUM_STACK_SIZE, /* stacksize */
+ PTHREAD_SCOPE_PROCESS, /* contentionscope */
+ PTHREAD_INHERIT_SCHED, /* inheritsched */
+ SCHED_FIFO, /* schedpolicy */
+ { /* schedparam */
+ 2, /* sched_priority */
+ 0, /* ss_low_priority */
+ { 0L, 0 }, /* ss_replenish_period */
+ { 0L, 0 } /* ss_initial_budget */
+ },
+ PTHREAD_CREATE_JOINABLE, /* detachstate */
+ 1 /* cputime_clock_allowed */
+};
+
+/*PAGE
+ *
+ * _POSIX_Threads_Sporadic_budget_TSR
+ */
+
+void _POSIX_Threads_Sporadic_budget_TSR(
+ Objects_Id id,
+ void *argument
+)
+{
+ unsigned32 ticks;
+ unsigned32 new_priority;
+ Thread_Control *the_thread;
+ POSIX_API_Control *api;
+
+ the_thread = argument;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ ticks = _POSIX_Timespec_to_interval( &api->schedparam.ss_initial_budget );
+
+ if ( !ticks )
+ ticks = 1;
+
+ the_thread->cpu_time_budget = ticks;
+
+ new_priority = _POSIX_Priority_To_core( api->ss_high_priority );
+ the_thread->real_priority = new_priority;
+
+ if ( the_thread->resource_count == 0 ||
+ the_thread->current_priority > new_priority )
+ _Thread_Change_priority( the_thread, new_priority, TRUE );
+
+ ticks = _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period );
+
+ if ( !ticks )
+ ticks = 1;
+
+ _Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Sporadic_budget_callout
+ */
+
+void _POSIX_Threads_Sporadic_budget_callout(
+ Thread_Control *the_thread
+)
+{
+ POSIX_API_Control *api;
+ unsigned32 new_priority;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ /*
+ * This will prevent the thread from consuming its entire "budget"
+ * while at low priority.
+ */
+
+
+ the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
+
+ new_priority = _POSIX_Priority_To_core( api->schedparam.ss_low_priority );
+ the_thread->real_priority = new_priority;
+
+ if ( the_thread->resource_count == 0 ||
+ the_thread->current_priority > new_priority )
+ _Thread_Change_priority( the_thread, new_priority, TRUE );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Create_extension
+ *
+ * XXX
+ */
+
+boolean _POSIX_Threads_Create_extension(
+ Thread_Control *executing,
+ Thread_Control *created
+)
+{
+ POSIX_API_Control *api;
+ POSIX_API_Control *executing_api;
+
+ api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
+
+ if ( !api )
+ return FALSE;
+
+ created->API_Extensions[ THREAD_API_POSIX ] = api;
+
+ /* XXX check all fields are touched */
+ api->Attributes = _POSIX_Threads_Default_attributes;
+ api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
+ api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
+ api->schedparam = _POSIX_Threads_Default_attributes.schedparam;
+ api->schedparam.sched_priority =
+ _POSIX_Priority_From_core( created->current_priority );
+
+ /*
+ * If the thread is not a posix thread, then all posix signals are blocked
+ * by default.
+ */
+
+ /* XXX use signal constants */
+ api->signals_pending = 0;
+ if ( _Objects_Get_class( created->Object.id ) == OBJECTS_POSIX_THREADS ) {
+ executing_api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ api->signals_blocked = api->signals_blocked;
+ } else
+ api->signals_blocked = 0xffffffff;
+
+/* XXX set signal parameters -- block all signals for non-posix threads */
+
+ _Thread_queue_Initialize(
+ &api->Join_List,
+ OBJECTS_NO_CLASS, /* only used for proxy operations */
+ THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_JOIN_AT_EXIT,
+ NULL, /* no extract proxy handler */
+ 0
+ );
+
+ _Watchdog_Initialize(
+ &api->Sporadic_timer,
+ _POSIX_Threads_Sporadic_budget_TSR,
+ created->Object.id,
+ created
+ );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Delete_extension
+ */
+
+User_extensions_routine _POSIX_Threads_Delete_extension(
+ Thread_Control *executing,
+ Thread_Control *deleted
+)
+{
+ Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ void **value_ptr;
+
+ api = deleted->API_Extensions[ THREAD_API_POSIX ];
+
+ /* XXX run cancellation handlers */
+
+ _POSIX_Keys_Run_destructors( deleted );
+
+ /*
+ * Wakeup all the tasks which joined with this one
+ */
+
+ value_ptr = (void **) deleted->Wait.return_argument;
+
+ while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
+ *(void **)the_thread->Wait.return_argument = value_ptr;
+
+ if ( api->schedpolicy == SCHED_SPORADIC )
+ (void) _Watchdog_Remove( &api->Sporadic_timer );
+
+ deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
+
+ (void) _Workspace_Free( api );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Initialize_user_threads
+ *
+ * This routine creates and starts all configured user
+ * initialzation threads.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Threads_Initialize_user_threads( void )
+{
+ int status;
+ unsigned32 index;
+ unsigned32 maximum;
+ posix_initialization_threads_table *user_threads;
+ pthread_t thread_id;
+ pthread_attr_t attr;
+
+ user_threads = _POSIX_Threads_User_initialization_threads;
+ maximum = _POSIX_Threads_Number_of_initialization_threads;
+
+ if ( !user_threads || maximum == 0 )
+ return;
+
+ /*
+ * Be careful .. if the default attribute set changes, this may need to.
+ *
+ * Setting the attributes explicitly is critical, since we don't want
+ * to inherit the idle tasks attributes.
+ */
+
+ for ( index=0 ; index < maximum ; index++ ) {
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
+ assert( !status );
+
+ status = pthread_attr_setstacksize( &attr, PTHREAD_MINIMUM_STACK_SIZE * 2 );
+ assert( !status );
+
+ status = pthread_create(
+ &thread_id,
+ &attr,
+ user_threads[ index ].entry,
+ NULL
+ );
+ assert( !status );
+ }
+}
+
+/*PAGE
+ *
+ * API Extension control structures
+ */
+
+API_extensions_Control _POSIX_Threads_API_extensions = {
+ { NULL, NULL },
+ NULL, /* predriver */
+ _POSIX_Threads_Initialize_user_threads, /* postdriver */
+ _POSIX_signals_Post_switch_extension, /* post switch */
+};
+
+User_extensions_Control _POSIX_Threads_User_extensions = {
+ { NULL, NULL },
+ { _POSIX_Threads_Create_extension, /* create */
+ NULL, /* start */
+ NULL, /* restart */
+ _POSIX_Threads_Delete_extension, /* delete */
+ NULL, /* switch */
+ NULL, /* begin */
+ NULL, /* exitted */
+ NULL /* fatal */
+ }
+};
+
+/*PAGE
+ *
+ * _POSIX_Threads_Manager_initialization
+ *
+ * This routine initializes all threads manager related data structures.
+ *
+ * Input parameters:
+ * maximum_pthreads - maximum configured pthreads
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Threads_Manager_initialization(
+ unsigned32 maximum_pthreads,
+ unsigned32 number_of_initialization_threads,
+ posix_initialization_threads_table *user_threads
+
+)
+{
+ _POSIX_Threads_Number_of_initialization_threads =
+ number_of_initialization_threads;
+ _POSIX_Threads_User_initialization_threads = user_threads;
+
+ /*
+ * There may not be any POSIX initialization threads configured.
+ */
+
+#if 0
+ if ( user_threads == NULL || number_of_initialization_threads == 0 )
+ _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, TRUE, EINVAL );
+#endif
+
+ _Objects_Initialize_information(
+ &_POSIX_Threads_Information,
+ OBJECTS_POSIX_THREADS,
+ FALSE, /* does not support global */
+ maximum_pthreads,
+ sizeof( Thread_Control ),
+ TRUE,
+ 5, /* length is arbitrary for now */
+ TRUE /* this class is threads */
+ );
+
+ /*
+ * Add all the extensions for this API
+ */
+
+ _User_extensions_Add_API_set( &_POSIX_Threads_User_extensions );
+
+ _API_extensions_Add( &_POSIX_Threads_API_extensions );
+
+ /*
+ * If we supported MP, then here we would ...
+ * Register the MP Process Packet routine.
+ */
+
+}
+
+/*PAGE
+ *
+ * 3.1.3 Register Fork Handlers, P1003.1c/Draft 10, P1003.1c/Draft 10, p. 27
+ *
+ * RTEMS does not support processes, so we fall under this and do not
+ * provide this routine:
+ *
+ * "Either the implementation shall support the pthread_atfork() function
+ * as described above or the pthread_atfork() funciton shall not be
+ * provided."
+ */
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setscope(
+ pthread_attr_t *attr,
+ int contentionscope
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( contentionscope ) {
+ case PTHREAD_SCOPE_PROCESS:
+ attr->contentionscope = contentionscope;
+ return 0;
+
+ case PTHREAD_SCOPE_SYSTEM:
+ return ENOTSUP;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getscope(
+ const pthread_attr_t *attr,
+ int *contentionscope
+)
+{
+ if ( !attr || !attr->is_initialized || !contentionscope )
+ return EINVAL;
+
+ *contentionscope = attr->contentionscope;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setinheritsched(
+ pthread_attr_t *attr,
+ int inheritsched
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( inheritsched ) {
+ case PTHREAD_INHERIT_SCHED:
+ case PTHREAD_EXPLICIT_SCHED:
+ attr->inheritsched = inheritsched;
+ return 0;
+
+ default:
+ return ENOTSUP;
+ }
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getinheritsched(
+ const pthread_attr_t *attr,
+ int *inheritsched
+)
+{
+ if ( !attr || !attr->is_initialized || !inheritsched )
+ return EINVAL;
+
+ *inheritsched = attr->inheritsched;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setschedpolicy(
+ pthread_attr_t *attr,
+ int policy
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( policy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ case SCHED_SPORADIC:
+ attr->schedpolicy = policy;
+ return 0;
+
+ default:
+ return ENOTSUP;
+ }
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getschedpolicy(
+ const pthread_attr_t *attr,
+ int *policy
+)
+{
+ if ( !attr || !attr->is_initialized || !policy )
+ return EINVAL;
+
+ *policy = attr->schedpolicy;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setschedparam(
+ pthread_attr_t *attr,
+ const struct sched_param *param
+)
+{
+ if ( !attr || !attr->is_initialized || !param )
+ return EINVAL;
+
+ attr->schedparam = *param;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getschedparam(
+ const pthread_attr_t *attr,
+ struct sched_param *param
+)
+{
+ if ( !attr || !attr->is_initialized || !param )
+ return EINVAL;
+
+ *param = attr->schedparam;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.2 Dynamic Thread Scheduling Parameters Access,
+ * P1003.1c/Draft 10, p. 124
+ */
+
+int pthread_getschedparam(
+ pthread_t thread,
+ int *policy,
+ struct sched_param *param
+)
+{
+ Objects_Locations location;
+ POSIX_API_Control *api;
+ register Thread_Control *the_thread;
+
+ if ( !policy || !param )
+ return EINVAL;
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+ *policy = api->schedpolicy;
+ *param = api->schedparam;
+ param->sched_priority =
+ _POSIX_Priority_From_core( the_thread->current_priority );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+
+}
+
+/*PAGE
+ *
+ * 13.5.2 Dynamic Thread Scheduling Parameters Access,
+ * P1003.1c/Draft 10, p. 124
+ */
+
+int pthread_setschedparam(
+ pthread_t thread,
+ int policy,
+ struct sched_param *param
+)
+{
+ register Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ Objects_Locations location;
+
+ /*
+ * Check all the parameters
+ */
+
+ if ( !param )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
+ return EINVAL;
+
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ budget_callout = NULL;
+
+ switch ( policy ) {
+ case SCHED_OTHER:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
+ break;
+
+ case SCHED_FIFO:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ break;
+
+ case SCHED_RR:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
+ break;
+
+ case SCHED_SPORADIC:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+ budget_callout = _POSIX_Threads_Sporadic_budget_callout;
+
+ if ( _POSIX_Timespec_to_interval( &param->ss_replenish_period ) <
+ _POSIX_Timespec_to_interval( &param->ss_initial_budget ) )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( param->ss_low_priority ) )
+ return EINVAL;
+
+ break;
+
+ default:
+ return EINVAL;
+ }
+
+ /*
+ * Actually change the scheduling policy and parameters
+ */
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( api->schedpolicy == SCHED_SPORADIC )
+ (void) _Watchdog_Remove( &api->Sporadic_timer );
+
+ api->schedpolicy = policy;
+ api->schedparam = *param;
+ the_thread->budget_algorithm = budget_algorithm;
+ the_thread->budget_callout = budget_callout;
+
+ switch ( api->schedpolicy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
+
+ the_thread->real_priority =
+ _POSIX_Priority_To_core( api->schedparam.sched_priority );
+
+ _Thread_Change_priority(
+ the_thread,
+ the_thread->real_priority,
+ TRUE
+ );
+ break;
+
+ case SCHED_SPORADIC:
+ api->ss_high_priority = api->schedparam.sched_priority;
+ _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
+ break;
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_init(
+ pthread_attr_t *attr
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *attr = _POSIX_Threads_Default_attributes;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_destroy(
+ pthread_attr_t *attr
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ attr->is_initialized = FALSE;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_getstacksize(
+ const pthread_attr_t *attr,
+ size_t *stacksize
+)
+{
+ if ( !attr || !attr->is_initialized || !stacksize )
+ return EINVAL;
+
+ *stacksize = attr->stacksize;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_setstacksize(
+ pthread_attr_t *attr,
+ size_t stacksize
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
+ attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
+ else
+ attr->stacksize = stacksize;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_getstackaddr(
+ const pthread_attr_t *attr,
+ void **stackaddr
+)
+{
+ if ( !attr || !attr->is_initialized || !stackaddr )
+ return EINVAL;
+
+ *stackaddr = attr->stackaddr;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_setstackaddr(
+ pthread_attr_t *attr,
+ void *stackaddr
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ attr->stackaddr = stackaddr;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_getdetachstate(
+ const pthread_attr_t *attr,
+ int *detachstate
+)
+{
+ if ( !attr || !attr->is_initialized || !detachstate )
+ return EINVAL;
+
+ *detachstate = attr->detachstate;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_setdetachstate(
+ pthread_attr_t *attr,
+ int detachstate
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( detachstate ) {
+ case PTHREAD_CREATE_DETACHED:
+ case PTHREAD_CREATE_JOINABLE:
+ attr->detachstate = detachstate;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144
+ */
+
+int pthread_create(
+ pthread_t *thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)( void * ),
+ void *arg
+)
+{
+ const pthread_attr_t *the_attr;
+ Priority_Control core_priority;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ boolean is_fp;
+ boolean status;
+ Thread_Control *the_thread;
+ char *default_name = "psx";
+ POSIX_API_Control *api;
+ int schedpolicy = SCHED_RR;
+ struct sched_param schedparam;
+
+ the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
+
+ if ( !the_attr->is_initialized )
+ return EINVAL;
+
+ /*
+ * Core Thread Initialize insures we get the minimum amount of
+ * stack space if it is allowed to allocate it itself.
+ */
+
+ if ( the_attr->stackaddr && !_Stack_Is_enough( the_attr->stacksize ) )
+ return EINVAL;
+
+#if 0
+ int cputime_clock_allowed; /* see time.h */
+ POSIX_NOT_IMPLEMENTED();
+#endif
+
+ /*
+ * P1003.1c/Draft 10, p. 121.
+ *
+ * If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
+ * inherits scheduling attributes from the creating thread. If it is
+ * PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
+ * attributes structure.
+ */
+
+ switch ( the_attr->inheritsched ) {
+ case PTHREAD_INHERIT_SCHED:
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ schedpolicy = api->schedpolicy;
+ schedparam = api->schedparam;
+ break;
+
+ case PTHREAD_EXPLICIT_SCHED:
+ schedpolicy = the_attr->schedpolicy;
+ schedparam = the_attr->schedparam;
+ break;
+
+ default:
+ return EINVAL;
+ }
+
+ /*
+ * Check the contentionscope since rtems only supports PROCESS wide
+ * contention (i.e. no system wide contention).
+ */
+
+ if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
+ return ENOTSUP;
+
+ /*
+ * Interpret the scheduling parameters.
+ */
+
+ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
+ return EINVAL;
+
+ core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
+
+ /*
+ * Set the core scheduling policy information.
+ */
+
+ budget_callout = NULL;
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+
+ switch ( schedpolicy ) {
+ case SCHED_OTHER:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
+ break;
+
+ case SCHED_FIFO:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ break;
+
+ case SCHED_RR:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
+ break;
+
+ case SCHED_SPORADIC:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+ budget_callout = _POSIX_Threads_Sporadic_budget_callout;
+
+ if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) <
+ _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) )
+ return EINVAL;
+
+ break;
+
+ default:
+ return EINVAL;
+ }
+
+ /*
+ * Currently all POSIX threads are floating point if the hardware
+ * supports it.
+ */
+
+ is_fp = CPU_HARDWARE_FP;
+
+ /*
+ * Disable dispatch for protection
+ */
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Allocate the thread control block.
+ *
+ * NOTE: Global threads are not currently supported.
+ */
+
+ the_thread = _POSIX_Threads_Allocate();
+
+ if ( !the_thread ) {
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ /*
+ * Initialize the core thread for this task.
+ */
+
+ status = _Thread_Initialize(
+ &_POSIX_Threads_Information,
+ the_thread,
+ the_attr->stackaddr,
+ the_attr->stacksize,
+ is_fp,
+ core_priority,
+ TRUE, /* preemptible */
+ budget_algorithm,
+ budget_callout,
+ 0, /* isr level */
+ &default_name /* posix threads don't have a name */
+ );
+
+ if ( !status ) {
+ _POSIX_Threads_Free( the_thread );
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ /*
+ * finish initializing the per API structure
+ */
+
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ api->Attributes = *the_attr;
+ api->detachstate = the_attr->detachstate;
+ api->schedpolicy = schedpolicy;
+ api->schedparam = schedparam;
+
+ /*
+ * This insures we evaluate the process-wide signals pending when we
+ * first run.
+ *
+ * NOTE: Since the thread starts with all unblocked, this is necessary.
+ */
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ /*
+ * POSIX threads are allocated and started in one operation.
+ */
+
+ status = _Thread_Start(
+ the_thread,
+ THREAD_START_POINTER,
+ start_routine,
+ arg,
+ 0 /* unused */
+ );
+
+ if ( schedpolicy == SCHED_SPORADIC ) {
+ _Watchdog_Insert_ticks(
+ &api->Sporadic_timer,
+ _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
+ );
+ }
+
+ /*
+ * _Thread_Start only fails if the thread was in the incorrect state
+ */
+
+ if ( !status ) {
+ _POSIX_Threads_Free( the_thread );
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ /*
+ * Return the id and indicate we successfully created the thread
+ */
+
+ *thread = the_thread->Object.id;
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.3 Wait for Thread Termination, P1003.1c/Draft 10, p. 147
+ */
+
+int pthread_join(
+ pthread_t thread,
+ void **value_ptr
+)
+{
+ register Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Objects_Locations location;
+ void *return_pointer;
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( api->detachstate == PTHREAD_CREATE_DETACHED ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ if ( _Thread_Is_executing( the_thread ) ) {
+ _Thread_Enable_dispatch();
+ return EDEADLK;
+ }
+
+ /*
+ * Put ourself on the threads join list
+ */
+
+ _Thread_Executing->Wait.return_argument = (unsigned32 *) &return_pointer;
+
+ _Thread_queue_Enter_critical_section( &api->Join_List );
+
+ _Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT );
+
+ _Thread_Enable_dispatch();
+
+ if ( value_ptr )
+ *value_ptr = return_pointer;
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 16.1.4 Detaching a Thread, P1003.1c/Draft 10, p. 149
+ */
+
+int pthread_detach(
+ pthread_t thread
+)
+{
+ register Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Objects_Locations location;
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+ api->detachstate = PTHREAD_CREATE_DETACHED;
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 16.1.5.1 Thread Termination, p1003.1c/Draft 10, p. 150
+ *
+ * NOTE: Key destructors are executed in the POSIX api delete extension.
+ */
+
+void pthread_exit(
+ void *value_ptr
+)
+{
+ _Thread_Disable_dispatch();
+
+ _Thread_Executing->Wait.return_argument = (unsigned32 *)value_ptr;
+
+ _Thread_Close( &_POSIX_Threads_Information, _Thread_Executing );
+
+ _POSIX_Threads_Free( _Thread_Executing );
+
+ _Thread_Enable_dispatch();
+}
+
+/*PAGE
+ *
+ * 16.1.6 Get Calling Thread's ID, p1003.1c/Draft 10, p. 152
+ */
+
+pthread_t pthread_self( void )
+{
+ return _Thread_Executing->Object.id;
+}
+
+/*PAGE
+ *
+ * 16.1.7 Compare Thread IDs, p1003.1c/Draft 10, p. 153
+ *
+ * NOTE: POSIX does not define the behavior when either thread id is invalid.
+ */
+
+int pthread_equal(
+ pthread_t t1,
+ pthread_t t2
+)
+{
+ /*
+ * If the system is configured for debug, then we will do everything we
+ * can to insure that both ids are valid. Otherwise, we will do the
+ * cheapest possible thing to determine if they are equal.
+ */
+
+#ifndef RTEMS_DEBUG
+ return _Objects_Are_ids_equal( t1, t2 );
+#else
+ int status;
+ Objects_Locations location;
+
+ /*
+ * By default this is not a match.
+ */
+
+ status = 0;
+
+ /*
+ * Validate the first id and return 0 if it is not valid
+ */
+
+ (void) _POSIX_Threads_Get( t1, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ break;
+
+ case OBJECTS_LOCAL:
+
+ /*
+ * Validate the second id and return 0 if it is not valid
+ */
+
+ (void) _POSIX_Threads_Get( t2, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ break;
+ case OBJECTS_LOCAL:
+ status = _Objects_Are_ids_equal( t1, t2 );
+ break;
+ }
+ _Thread_Unnest_dispatch();
+ break;
+ }
+
+ _Thread_Enable_dispatch();
+ return status;
+#endif
+}
+
+/*PAGE
+ *
+ * 16.1.8 Dynamic Package Initialization, P1003.1c/Draft 10, p. 154
+ */
+
+int pthread_once(
+ pthread_once_t *once_control,
+ void (*init_routine)(void)
+)
+{
+ if ( !once_control || !init_routine )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ if ( !once_control->init_executed ) {
+ once_control->is_initialized = TRUE;
+ once_control->init_executed = TRUE;
+ (*init_routine)();
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 20.1.6 Accessing a Thread CPU-time Clock, P1003.4b/Draft 8, p. 58
+ */
+
+int pthread_getcpuclockid(
+ pthread_t pid,
+ clockid_t *clock_id
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59
+ */
+
+int pthread_attr_setcputime(
+ pthread_attr_t *attr,
+ int clock_allowed
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( clock_allowed ) {
+ case CLOCK_ENABLED:
+ case CLOCK_DISABLED:
+ attr->cputime_clock_allowed = clock_allowed;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59
+ */
+
+int pthread_attr_getcputime(
+ pthread_attr_t *attr,
+ int *clock_allowed
+)
+{
+ if ( !attr || !attr->is_initialized || !clock_allowed )
+ return EINVAL;
+
+ *clock_allowed = attr->cputime_clock_allowed;
+ return 0;
+}
diff --git a/c/src/exec/posix/src/ptimer.c b/c/src/exec/posix/src/ptimer.c
new file mode 100644
index 0000000000..0446a7a683
--- /dev/null
+++ b/c/src/exec/posix/src/ptimer.c
@@ -0,0 +1,75 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <time.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+
+#include <rtems/posix/time.h>
+
+/*
+ * 14.2.2 Create a Per-Process Timer, P1003.1b-1993, p. 264
+ */
+
+int timer_create(
+ clockid_t clock_id,
+ struct sigevent *evp,
+ timer_t *timerid
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.3 Delete a Per_process Timer, P1003.1b-1993, p. 266
+ */
+
+int timer_delete(
+ timer_t timerid
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.4 Per-Process Timers, P1003.1b-1993, p. 267
+ */
+
+int timer_settime(
+ timer_t timerid,
+ int flags,
+ const struct itimerspec *value,
+ struct itimerspec *ovalue
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.4 Per-Process Timers, P1003.1b-1993, p. 267
+ */
+
+int timer_gettime(
+ timer_t timerid,
+ struct itimerspec *value
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.4 Per-Process Timers, P1003.1b-1993, p. 267
+ */
+
+int timer_getoverrun(
+ timer_t timerid
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/exec/posix/src/sched.c b/c/src/exec/posix/src/sched.c
new file mode 100644
index 0000000000..e558126926
--- /dev/null
+++ b/c/src/exec/posix/src/sched.c
@@ -0,0 +1,153 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <sched.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/thread.h>
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * 13.3.1 Set Scheduling Parameters, P1003.1b-1993, p. 252
+ *
+ */
+
+int sched_setparam(
+ pid_t pid,
+ const struct sched_param *param
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.2 Set Scheduling Parameters, P1003.1b-1993, p. 253
+ */
+
+int sched_getparam(
+ pid_t pid,
+ const struct sched_param *param
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.3 Set Scheduling Policy and Scheduling Parameters,
+ * P1003.1b-1993, p. 254
+ */
+
+int sched_setscheduler(
+ pid_t pid,
+ int policy,
+ const struct sched_param *param
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.4 Get Scheduling Policy, P1003.1b-1993, p. 256
+ */
+
+int sched_getscheduler(
+ pid_t pid
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_get_priority_max(
+ int policy
+)
+{
+ switch ( policy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ case SCHED_SPORADIC:
+ break;
+
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+ }
+
+ return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
+}
+
+/*PAGE
+ *
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_get_priority_min(
+ int policy
+)
+{
+ switch ( policy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ case SCHED_SPORADIC:
+ break;
+
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+ }
+
+ return POSIX_SCHEDULER_MINIMUM_PRIORITY;
+}
+
+/*PAGE
+ *
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_rr_get_interval(
+ pid_t pid,
+ struct timespec *interval
+)
+{
+ /* XXX do we need to support different time quantums per thread */
+
+ /*
+ * Only supported for the "calling process" (i.e. this node).
+ */
+
+ if ( pid != getpid() )
+ set_errno_and_return_minus_one( ESRCH );
+
+ if ( !interval )
+ set_errno_and_return_minus_one( EINVAL );
+
+ _POSIX_Interval_to_timespec( _Thread_Ticks_per_timeslice, interval );
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.3.5 Yield Processor, P1003.1b-1993, p. 257
+ */
+
+int sched_yield( void )
+{
+ _Thread_Disable_dispatch();
+ _Thread_Yield_processor();
+ _Thread_Enable_dispatch();
+ return 0;
+}
diff --git a/c/src/exec/posix/src/semaphore.c b/c/src/exec/posix/src/semaphore.c
new file mode 100644
index 0000000000..a968abe43b
--- /dev/null
+++ b/c/src/exec/posix/src/semaphore.c
@@ -0,0 +1,571 @@
+/*
+ * $Id$
+ */
+
+#include <stdarg.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <limits.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/semaphore.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Manager_initialization
+ *
+ * This routine initializes all semaphore manager related data structures.
+ *
+ * Input parameters:
+ * maximum_semaphores - maximum configured semaphores
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Semaphore_Information,
+ OBJECTS_POSIX_SEMAPHORES,
+ TRUE,
+ maximum_semaphores,
+ sizeof( POSIX_Semaphore_Control ),
+ TRUE,
+ _POSIX_PATH_MAX,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Create_support
+ */
+
+int _POSIX_Semaphore_Create_support(
+ const char *name,
+ int pshared,
+ unsigned int value,
+ POSIX_Semaphore_Control **the_sem
+)
+{
+ POSIX_Semaphore_Control *the_semaphore;
+ CORE_semaphore_Attributes *the_sem_attr;
+
+ _Thread_Disable_dispatch();
+
+ the_semaphore = _POSIX_Semaphore_Allocate();
+
+ if ( !the_semaphore ) {
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENOMEM );
+ }
+
+ if ( pshared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Semaphore_Information, 0,
+ the_semaphore->Object.id, FALSE ) ) ) {
+ _POSIX_Semaphore_Free( the_semaphore );
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( EAGAIN );
+ }
+
+ the_semaphore->process_shared = pshared;
+
+ if ( name ) {
+ the_semaphore->named = TRUE;
+ the_semaphore->open_count = 1;
+ the_semaphore->linked = TRUE;
+ }
+ else
+ the_semaphore->named = FALSE;
+
+ the_sem_attr = &the_semaphore->Semaphore.Attributes;
+
+ /* XXX
+ *
+ * Note should this be based on the current scheduling policy?
+ */
+
+ the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
+
+ _CORE_semaphore_Initialize(
+ &the_semaphore->Semaphore,
+ OBJECTS_POSIX_SEMAPHORES,
+ the_sem_attr,
+ value,
+ 0 /* XXX - proxy_extract_callout is unused */
+ );
+
+ /* XXX - need Names to be a string!!! */
+ _Objects_Open(
+ &_POSIX_Semaphore_Information,
+ &the_semaphore->Object,
+ (char *) name
+ );
+
+ *the_sem = the_semaphore;
+
+ if ( pshared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Semaphore_MP_Send_process_packet(
+ POSIX_SEMAPHORE_MP_ANNOUNCE_CREATE,
+ the_semaphore->Object.id,
+ (char *) name,
+ 0 /* proxy id - Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+
+/*PAGE
+ *
+ * 11.2.1 Initialize an Unnamed Semaphore, P1003.1b-1993, p.219
+ */
+
+int sem_init(
+ sem_t *sem,
+ int pshared,
+ unsigned int value
+)
+{
+ int status;
+ POSIX_Semaphore_Control *the_semaphore;
+
+ status = _POSIX_Semaphore_Create_support(
+ NULL,
+ pshared,
+ value,
+ &the_semaphore
+ );
+
+ if ( status != -1 )
+ *sem = the_semaphore->Object.id;
+
+ return status;
+}
+
+/*PAGE
+ *
+ * 11.2.2 Destroy an Unnamed Semaphore, P1003.1b-1993, p.220
+ */
+
+int sem_destroy(
+ sem_t *sem
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /*
+ * Undefined operation on a named semaphore.
+ */
+
+ if ( the_semaphore->named == TRUE ) {
+ seterrno( EINVAL );
+ return( -1 );
+ }
+
+ _Objects_Close( &_POSIX_Semaphore_Information, &the_semaphore->Object );
+
+ _CORE_semaphore_Flush(
+ &the_semaphore->Semaphore,
+ _POSIX_Semaphore_MP_Send_object_was_deleted,
+ -1 /* XXX should also seterrno -> EINVAL */
+ );
+
+ _POSIX_Semaphore_Free( the_semaphore );
+
+ if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Semaphore_Information,
+ the_semaphore->Object.id
+ );
+
+ _POSIX_Semaphore_MP_Send_process_packet(
+ POSIX_SEMAPHORE_MP_ANNOUNCE_DELETE,
+ the_semaphore->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.3 Initialize/Open a Named Semaphore, P1003.1b-1993, p.221
+ *
+ * NOTE: When oflag is O_CREAT, then optional third and fourth
+ * parameters must be present.
+ */
+
+sem_t *sem_open(
+ const char *name,
+ int oflag,
+ ...
+ /* mode_t mode, */
+ /* unsigned int value */
+)
+{
+ va_list arg;
+ mode_t mode;
+ unsigned int value;
+ int status;
+ Objects_Id the_semaphore_id;
+ POSIX_Semaphore_Control *the_semaphore;
+
+
+ if ( oflag & O_CREAT ) {
+ va_start(arg, oflag);
+ mode = (mode_t) va_arg( arg, mode_t * );
+ value = (unsigned int) va_arg( arg, unsigned int * );
+ va_end(arg);
+ }
+
+ status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
+
+ /*
+ * If the name to id translation worked, then the semaphore exists
+ * and we can just return a pointer to the id. Otherwise we may
+ * need to check to see if this is a "semaphore does not exist"
+ * or some other miscellaneous error on the name.
+ */
+
+ if ( status ) {
+
+ if ( status == EINVAL ) { /* name -> ID translation failed */
+ if ( !(oflag & O_CREAT) ) { /* willing to create it? */
+ seterrno( ENOENT );
+ return (sem_t *) -1;
+ }
+ /* we are willing to create it */
+ }
+ seterrno( status ); /* some type of error */
+ return (sem_t *) -1;
+
+ } else { /* name -> ID translation succeeded */
+
+ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
+ seterrno( EEXIST );
+ return (sem_t *) -1;
+ }
+
+ /*
+ * XXX In this case we need to do an ID->pointer conversion to
+ * check the mode. This is probably a good place for a subroutine.
+ */
+
+ the_semaphore->open_count += 1;
+
+ return (sem_t *)&the_semaphore->Object.id;
+
+ }
+
+ /* XXX verify this comment...
+ *
+ * At this point, the semaphore does not exist and everything has been
+ * checked. We should go ahead and create a semaphore.
+ */
+
+ status = _POSIX_Semaphore_Create_support(
+ name,
+ TRUE, /* shared across processes */
+ value,
+ &the_semaphore
+ );
+
+ if ( status == -1 )
+ return (sem_t *) -1;
+
+ return (sem_t *) &the_semaphore->Object.id;
+
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Delete
+ */
+
+void _POSIX_Semaphore_Delete(
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ if ( !the_semaphore->linked && !the_semaphore->open_count ) {
+ _POSIX_Semaphore_Free( the_semaphore );
+
+ if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Semaphore_Information,
+ the_semaphore->Object.id
+ );
+
+ _POSIX_Semaphore_MP_Send_process_packet(
+ POSIX_SEMAPHORE_MP_ANNOUNCE_DELETE,
+ the_semaphore->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+
+ }
+}
+
+/*PAGE
+ *
+ * 11.2.4 Close a Named Semaphore, P1003.1b-1993, p.224
+ */
+
+int sem_close(
+ sem_t *sem
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ the_semaphore->open_count -= 1;
+ _POSIX_Semaphore_Delete( the_semaphore );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
+ */
+
+int sem_unlink(
+ const char *name
+)
+{
+ int status;
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Id the_semaphore_id;
+ Objects_Locations location;
+
+ status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
+
+ if ( !status )
+ set_errno_and_return_minus_one( status );
+
+ the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+
+ if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
+ _Objects_MP_Close(
+ &_POSIX_Semaphore_Information,
+ the_semaphore->Object.id
+ );
+ }
+
+ the_semaphore->linked = FALSE;
+
+ _POSIX_Semaphore_Delete( the_semaphore );
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Wait_support
+ */
+
+int _POSIX_Semaphore_Wait_support(
+ sem_t *sem,
+ boolean blocking,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ _CORE_semaphore_Seize(
+ &the_semaphore->Semaphore,
+ the_semaphore->Object.id,
+ blocking,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return _Thread_Executing->Wait.return_code;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_wait(
+ sem_t *sem
+)
+{
+ return _POSIX_Semaphore_Wait_support( sem, TRUE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_trywait(
+ sem_t *sem
+)
+{
+ return _POSIX_Semaphore_Wait_support( sem, FALSE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_timedwait(
+ sem_t *sem,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Semaphore_Wait_support(
+ sem,
+ TRUE,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * 11.2.7 Unlock a Semaphore, P1003.1b-1993, p.227
+ */
+
+void POSIX_Semaphore_MP_support(
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+
+int sem_post(
+ sem_t *sem
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ _CORE_semaphore_Surrender(
+ &the_semaphore->Semaphore,
+ the_semaphore->Object.id,
+ POSIX_Semaphore_MP_support
+ );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.8 Get the Value of a Semaphore, P1003.1b-1993, p.229
+ */
+
+int sem_getvalue(
+ sem_t *sem,
+ int *sval
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ *sval = _CORE_semaphore_Get_count( &the_semaphore->Semaphore );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
diff --git a/c/src/exec/posix/src/time.c b/c/src/exec/posix/src/time.c
new file mode 100644
index 0000000000..acb4b507b1
--- /dev/null
+++ b/c/src/exec/posix/src/time.c
@@ -0,0 +1,393 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <time.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_Timespec_subtract
+ */
+
+void _POSIX_Timespec_subtract(
+ const struct timespec *the_start,
+ const struct timespec *end,
+ struct timespec *result
+)
+{
+ struct timespec start_struct = *the_start;
+ struct timespec *start = &start_struct;
+ unsigned int nsecs_per_sec = TOD_NANOSECONDS_PER_SECOND;
+
+ if (end->tv_nsec < start->tv_nsec) {
+ int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec + 1;
+ start->tv_nsec -= nsecs_per_sec * seconds;
+ start->tv_sec += seconds;
+ }
+
+ if (end->tv_nsec - start->tv_nsec > nsecs_per_sec) {
+ int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec;
+ start->tv_nsec += nsecs_per_sec * seconds;
+ start->tv_sec -= seconds;
+ }
+
+ result->tv_sec = end->tv_sec - start->tv_sec;
+ result->tv_nsec = end->tv_nsec - start->tv_nsec;
+}
+
+/*PAGE
+ *
+ * _POSIX_Timespec_to_interval
+ */
+
+Watchdog_Interval _POSIX_Timespec_to_interval(
+ const struct timespec *time
+)
+{
+ Watchdog_Interval ticks;
+
+ ticks = (time->tv_sec * TOD_MICROSECONDS_PER_SECOND) /
+ _TOD_Microseconds_per_tick;
+
+ ticks += (time->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
+ _TOD_Microseconds_per_tick;
+
+ return ticks;
+}
+
+/*PAGE
+ *
+ * _POSIX_Interval_to_timespec
+ */
+
+void _POSIX_Interval_to_timespec(
+ Watchdog_Interval ticks,
+ struct timespec *time
+)
+{
+ unsigned32 usecs;
+
+ usecs = ticks * _TOD_Microseconds_per_tick;
+
+ time->tv_sec = usecs / TOD_MICROSECONDS_PER_SECOND;
+ time->tv_nsec = (usecs % TOD_MICROSECONDS_PER_SECOND) *
+ TOD_NANOSECONDS_PER_MICROSECOND;
+}
+
+/*PAGE
+ *
+ * 4.5.1 Get System Time, P1003.1b-1993, p. 91
+ */
+
+/* Using the implementation in newlib */
+#if 0
+time_t time(
+ time_t *tloc
+)
+{
+ time_t seconds_since_epoch;
+
+ /*
+ * No error is the time of day is not set. For RTEMS the system time
+ * starts out at the rtems epoch.
+ */
+
+ /*
+ * Internally the RTEMS epoch is 1988. This must be taken into account.
+ */
+
+ seconds_since_epoch = _TOD_Seconds_since_epoch;
+
+ seconds_since_epoch += POSIX_TIME_SECONDS_1970_THROUGH_1988;
+
+ if ( tloc )
+ *tloc = seconds_since_epoch;
+
+ return seconds_since_epoch;
+}
+#endif
+
+/*PAGE
+ *
+ * 14.2.1 Clocks, P1003.1b-1993, p. 263
+ */
+
+int clock_settime(
+ clockid_t clock_id,
+ const struct timespec *tp
+)
+{
+ struct tm split_time;
+ TOD_Control tod;
+ Watchdog_Interval seconds;
+
+ assert( tp );
+
+ switch ( clock_id ) {
+
+ case CLOCK_REALTIME:
+ (void) gmtime_r( &tp->tv_sec, &split_time );
+
+ /*
+ * Convert the tm structure format to that used by the TOD Handler
+ *
+ * NOTE: TOD Handler does not honor leap seconds.
+ */
+
+ tod.year = split_time.tm_year + 1900; /* RHS is years since 1900 */
+ tod.month = split_time.tm_mon + 1; /* RHS uses 0-11 */
+ tod.day = split_time.tm_mday;
+ tod.hour = split_time.tm_hour;
+ tod.minute = split_time.tm_min;
+ tod.second = split_time.tm_sec; /* RHS allows 0-61 for leap seconds */
+
+ tod.ticks = (tp->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
+ _TOD_Microseconds_per_tick;
+
+ if ( !_TOD_Validate( &tod ) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * We can't use the tp->tv_sec field because it is based on
+ * a different EPOCH.
+ */
+
+ seconds = _TOD_To_seconds( &tod );
+ _Thread_Disable_dispatch();
+ _TOD_Set( &tod, seconds );
+ _Thread_Enable_dispatch();
+ break;
+
+#ifdef _POSIX_CPUTIME
+ case CLOCK_PROCESS_CPUTIME:
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+
+#ifdef _POSIX_THREAD_CPUTIME
+ case CLOCK_THREAD_CPUTIME:
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+
+ }
+ return 0;
+}
+
+/*PAGE
+ *
+ * 14.2.1 Clocks, P1003.1b-1993, p. 263
+ */
+
+int clock_gettime(
+ clockid_t clock_id,
+ struct timespec *tp
+)
+{
+ ISR_Level level;
+ time_t seconds;
+ long ticks;
+
+ if ( !tp )
+ set_errno_and_return_minus_one( EINVAL );
+
+ switch ( clock_id ) {
+
+ case CLOCK_REALTIME:
+
+ _ISR_Disable( level );
+ seconds = _TOD_Seconds_since_epoch;
+ ticks = _TOD_Current.ticks;
+ _ISR_Enable( level );
+
+ tp->tv_sec = seconds + POSIX_TIME_SECONDS_1970_THROUGH_1988;
+ tp->tv_nsec = ticks * _TOD_Microseconds_per_tick *
+ TOD_NANOSECONDS_PER_MICROSECOND;
+ break;
+
+#ifdef _POSIX_CPUTIME
+ case CLOCK_PROCESS_CPUTIME:
+ /* don't base this on _Watchdog_Ticks_since_boot--duration is too short*/
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+
+#ifdef _POSIX_THREAD_CPUTIME
+ case CLOCK_THREAD_CPUTIME:
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+
+ }
+ return 0;
+}
+
+/*PAGE
+ *
+ * 14.2.1 Clocks, P1003.1b-1993, p. 263
+ */
+
+int clock_getres(
+ clockid_t clock_id,
+ struct timespec *res
+)
+{
+ if ( !res )
+ set_errno_and_return_minus_one( EINVAL );
+
+ switch ( clock_id ) {
+
+ /*
+ * All time in rtems is based on the same clock tick.
+ */
+
+ case CLOCK_REALTIME:
+ case CLOCK_PROCESS_CPUTIME:
+ case CLOCK_THREAD_CPUTIME:
+ if ( res )
+ _POSIX_Interval_to_timespec( _TOD_Microseconds_per_tick, res );
+ break;
+
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+
+ }
+ return 0;
+}
+
+/*PAGE
+ *
+ * 14.2.5 High Resolution Sleep, P1003.1b-1993, p. 269
+ */
+
+int nanosleep(
+ const struct timespec *rqtp,
+ struct timespec *rmtp
+)
+{
+ Watchdog_Interval ticks;
+ struct timespec *the_rqtp;
+
+ if ( !rqtp )
+ set_errno_and_return_minus_one( EINVAL );
+
+ the_rqtp = (struct timespec *)rqtp;
+
+ /*
+ * Return EAGAIN if the delay interval is negative.
+ *
+ * NOTE: This behavior is beyond the POSIX specification.
+ * FSU pthreads shares this behavior.
+ */
+
+ if ( the_rqtp->tv_sec < 0 )
+ the_rqtp->tv_sec = 0;
+
+ if ( /* the_rqtp->tv_sec < 0 || */ the_rqtp->tv_nsec < 0 )
+ set_errno_and_return_minus_one( EAGAIN );
+
+ if ( the_rqtp->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
+ set_errno_and_return_minus_one( EINVAL );
+
+ ticks = _POSIX_Timespec_to_interval( the_rqtp );
+
+ /*
+ * This behavior is also beyond the POSIX specification but is
+ * consistent with the RTEMS api and yields desirable behavior.
+ */
+
+ if ( !ticks ) {
+ _Thread_Yield_processor();
+ _Thread_Dispatch();
+ if ( rmtp ) {
+ rmtp->tv_sec = 0;
+ rmtp->tv_nsec = 0;
+ }
+ return 0;
+ }
+
+ _Thread_Disable_dispatch();
+ _Thread_Set_state(
+ _Thread_Executing,
+ STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL
+ );
+ _Watchdog_Initialize(
+ &_Thread_Executing->Timer,
+ _Thread_Delay_ended,
+ _Thread_Executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
+ _Thread_Enable_dispatch();
+
+ /* calculate time remaining */
+
+ if ( rmtp ) {
+ ticks -=
+ _Thread_Executing->Timer.stop_time - _Thread_Executing->Timer.start_time;
+
+ _POSIX_Interval_to_timespec( ticks, rmtp );
+
+ /*
+ * If there is time remaining, then we were interrupted by a signal.
+ */
+
+ if ( ticks )
+ set_errno_and_return_minus_one( EINTR );
+ }
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 20.1.3 Accessing a Process CPU-time CLock, P1003.4b/D8, p. 55
+ */
+
+int clock_getcpuclockid(
+ pid_t pid,
+ clockid_t *clock_id
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 20.1.5 CPU-time Clock Attribute Access, P1003.4b/D8, p. 58
+ */
+
+int clock_setenable_attr(
+ clockid_t clock_id,
+ int attr
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 20.1.5 CPU-time Clock Attribute Access, P1003.4b/D8, p. 58
+ */
+
+int clock_getenable_attr(
+ clockid_t clock_id,
+ int *attr
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/exec/posix/src/types.c b/c/src/exec/posix/src/types.c
new file mode 100644
index 0000000000..4386ad5292
--- /dev/null
+++ b/c/src/exec/posix/src/types.c
@@ -0,0 +1,212 @@
+/*
+ * $Id$
+ */
+
+#include <limits.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/seterr.h>
+
+pid_t _POSIX_types_Ppid = 0;
+uid_t _POSIX_types_Uid = 0;
+uid_t _POSIX_types_Euid = 0;
+gid_t _POSIX_types_Gid = 0;
+gid_t _POSIX_types_Egid = 0;
+
+/*PAGE
+ *
+ * 4.1.1 Get Process and Parent Process IDs, P1003.1b-1993, p. 83
+ */
+
+pid_t getppid( void )
+{
+ return _POSIX_types_Ppid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+uid_t getuid( void )
+{
+ return _POSIX_types_Uid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+uid_t geteuid( void )
+{
+ return _POSIX_types_Euid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+gid_t getgid( void )
+{
+ return _POSIX_types_Gid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+gid_t getegid( void )
+{
+ return _POSIX_types_Egid;
+}
+
+/*PAGE
+ *
+ * 4.2.2 Set User and Group IDs, P1003.1b-1993, p. 84
+ */
+
+int setuid(
+ uid_t uid
+)
+{
+ _POSIX_types_Uid = uid;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.2.2 Set User and Group IDs, P1003.1b-1993, p. 84
+ */
+
+int setgid(
+ gid_t gid
+)
+{
+ _POSIX_types_Gid = gid;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.2.3 Get Supplementary IDs, P1003.1b-1993, p. 86
+ */
+
+int getgroups(
+ int gidsetsize,
+ gid_t grouplist[]
+)
+{
+ return 0; /* no supplemental group ids */
+}
+
+/*PAGE
+ *
+ * 4.2.4 Get User Name, P1003.1b-1993, p. 87
+ *
+ * NOTE: P1003.1c/D10, p. 49 adds getlogin_r().
+ */
+
+static char _POSIX_types_Getlogin_buffer[ LOGIN_NAME_MAX ];
+
+char *getlogin( void )
+{
+ (void) getlogin_r( _POSIX_types_Getlogin_buffer, LOGIN_NAME_MAX );
+ return _POSIX_types_Getlogin_buffer;
+}
+
+/*PAGE
+ *
+ * 4.2.4 Get User Name, P1003.1b-1993, p. 87
+ *
+ * NOTE: P1003.1c/D10, p. 49 adds getlogin_r().
+ */
+
+int getlogin_r(
+ char *name,
+ size_t namesize
+)
+{
+ if ( namesize < LOGIN_NAME_MAX )
+ return ERANGE;
+
+ strcpy( name, "posixapp" );
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.3.1 Get Process Group IDs, P1003.1b-1993, p. 89
+ */
+
+pid_t getpgrp( void )
+{
+ /*
+ * This always succeeds and returns the process group id. For rtems,
+ * this will always be the local node;
+ */
+
+ return _Objects_Local_node;
+}
+
+/*PAGE
+ *
+ * 4.3.2 Create Session and Set Process Group ID, P1003.1b-1993, p. 88
+ */
+
+pid_t setsid( void )
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 4.3.3 Set Process Group ID for Job Control, P1003.1b-1993, p. 89
+ */
+
+int setpgid(
+ pid_t pid,
+ pid_t pgid
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*
+ * TEMPORARY
+ */
+
+#include <assert.h>
+
+int POSIX_MP_NOT_IMPLEMENTED()
+{
+ assert( 0 );
+ return 0;
+}
+
+int POSIX_BOTTOM_REACHED()
+{
+ assert( 0 );
+ return 0;
+}
+
+int POSIX_NOT_IMPLEMENTED()
+{
+ assert( 0 );
+ return 0;
+}
+
+/*
+ * END OF TEMPORARY
+ */
+
diff --git a/c/src/exec/posix/src/unistd.c b/c/src/exec/posix/src/unistd.c
new file mode 100644
index 0000000000..8d930ce33c
--- /dev/null
+++ b/c/src/exec/posix/src/unistd.c
@@ -0,0 +1,41 @@
+/*
+ * $Id$
+ */
+
+#include <time.h>
+#include <unistd.h>
+
+#include <rtems/system.h>
+
+
+/*
+ * 3.4.3 Delay Process Execution, P1003.1b-1993, p. 81
+ */
+
+unsigned int sleep(
+ unsigned int seconds
+)
+{
+ /* XXX can we get away with this implementation? */
+ struct timespec tp;
+ struct timespec tm;
+
+ tp.tv_sec = seconds;
+ tp.tv_nsec = 0;
+
+ nanosleep( &tp, &tm );
+
+ return tm.tv_sec; /* seconds remaining */
+}
+
+/*PAGE
+ *
+ * 4.8.1 Get Configurable System Variables, P1003.1b-1993, p. 95
+ */
+
+long sysconf(
+ int name
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/exec/posix/src/utsname.c b/c/src/exec/posix/src/utsname.c
new file mode 100644
index 0000000000..7fba3d610f
--- /dev/null
+++ b/c/src/exec/posix/src/utsname.c
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <sys/utsname.h>
+
+#include <rtems/system.h>
+#include <rtems/score/system.h>
+#include <rtems/score/object.h>
+
+/*PAGE
+ *
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+)
+{
+ /* XXX: Here is what Solaris returns...
+ sysname = SunOS
+ nodename = node_name
+ release = 5.3
+ version = Generic_101318-12
+ machine = sun4m
+ */
+
+ strcpy( name->sysname, "RTEMS" );
+
+ sprintf( name->nodename, "Node %d\n", _Objects_Local_node );
+
+ /* XXX release string is in BAD format for this routine!!! */
+ strcpy( name->release, "3.2.0" );
+
+ /* XXX does this have any meaning for RTEMS */
+
+ strcpy( name->release, "" );
+
+ sprintf( name->machine, "%s/%s", CPU_NAME, CPU_MODEL_NAME );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/exec/posix/sys/Makefile.in b/c/src/exec/posix/sys/Makefile.in
new file mode 100644
index 0000000000..84d2003ba3
--- /dev/null
+++ b/c/src/exec/posix/sys/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#H_PIECES=utsname
+H_PIECES=
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/sys
diff --git a/c/src/exec/posix/sys/utsname.h b/c/src/exec/posix/sys/utsname.h
new file mode 100644
index 0000000000..ca15230d40
--- /dev/null
+++ b/c/src/exec/posix/sys/utsname.h
@@ -0,0 +1,49 @@
+/* sys/utsname.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SYS_UTSNAME_h
+#define __POSIX_SYS_UTSNAME_h
+
+#include <sys/times.h>
+#include <sys/types.h>
+
+/*
+ * 4.4.1 Get System Name (Table 4-1), P1003.1b-1993, p. 90
+ *
+ * NOTE: The lengths of the strings in this structure are
+ * just long enough to reliably contain the RTEMS information.
+ * For example, the fields are not long enough to support
+ * Internet hostnames.
+ */
+
+struct utsname {
+ char sysname[ 32 ]; /* Name of this implementation of the operating system */
+ char nodename[ 32 ]; /* Name of this node within an implementation */
+ /* specified communication network */
+ char release[ 32 ]; /* Current release level of this implementation */
+ char version[ 32 ]; /* Current version level of this release */
+ char machine[ 32 ]; /* Name of the hardware type on which the system */
+ /* is running */
+};
+
+/*
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+);
+
+/*
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+);
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/rtems/Makefile.in b/c/src/exec/rtems/Makefile.in
new file mode 100644
index 0000000000..d8f3d6fae8
--- /dev/null
+++ b/c/src/exec/rtems/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=headers $(INLINE) optman src
diff --git a/c/src/exec/rtems/headers/Makefile.in b/c/src/exec/rtems/headers/Makefile.in
new file mode 100644
index 0000000000..b7b0f463c5
--- /dev/null
+++ b/c/src/exec/rtems/headers/Makefile.in
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES=asr attr clock config dpmem event eventmp eventset \
+ intr message modes mp msgmp options part partmp \
+ ratemon region regionmp rtemsapi sem semmp signal signalmp status \
+ support taskmp tasks timer types
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed externally
+EXTERNAL_H_PIECES = rtems
+EXTERNAL_H_FILES=$(EXTERNAL_H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES) $(EXTERNAL_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/rtems
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/exec/rtems/headers/asr.h b/c/src/exec/rtems/headers/asr.h
new file mode 100644
index 0000000000..9631f93d40
--- /dev/null
+++ b/c/src/exec/rtems/headers/asr.h
@@ -0,0 +1,112 @@
+/* asr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Asynchronous Signal Handler. This Handler provides the low-level
+ * support required by the Signal Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ASR_h
+#define __RTEMS_ASR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/modes.h>
+
+/*
+ *
+ * The following type defines the control block used to manage
+ * each signal set.
+ */
+
+typedef unsigned32 rtems_signal_set;
+
+/*
+ * Return type for ASR Handler
+ */
+
+typedef void rtems_asr;
+
+/*
+ * The following type corresponds to the applications asynchronous
+ * signal processing routine.
+ */
+
+typedef rtems_asr ( *rtems_asr_entry )(
+ rtems_signal_set
+ );
+
+/*
+ *
+ * The following defines the control structure used to manage
+ * signals. Each thread has a copy of this record.
+ */
+
+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 */
+ rtems_signal_set signals_pending; /* pending signal set */
+ unsigned32 nest_level; /* nest level of RTEMS_ASR */
+} ASR_Information;
+
+/*
+ * The following constants define the individual signals which may
+ * be used to compose a signal set.
+ */
+
+#define RTEMS_SIGNAL_0 0x00000001
+#define RTEMS_SIGNAL_1 0x00000002
+#define RTEMS_SIGNAL_2 0x00000004
+#define RTEMS_SIGNAL_3 0x00000008
+#define RTEMS_SIGNAL_4 0x00000010
+#define RTEMS_SIGNAL_5 0x00000020
+#define RTEMS_SIGNAL_6 0x00000040
+#define RTEMS_SIGNAL_7 0x00000080
+#define RTEMS_SIGNAL_8 0x00000100
+#define RTEMS_SIGNAL_9 0x00000200
+#define RTEMS_SIGNAL_10 0x00000400
+#define RTEMS_SIGNAL_11 0x00000800
+#define RTEMS_SIGNAL_12 0x00001000
+#define RTEMS_SIGNAL_13 0x00002000
+#define RTEMS_SIGNAL_14 0x00004000
+#define RTEMS_SIGNAL_15 0x00008000
+#define RTEMS_SIGNAL_16 0x00010000
+#define RTEMS_SIGNAL_17 0x00020000
+#define RTEMS_SIGNAL_18 0x00040000
+#define RTEMS_SIGNAL_19 0x00080000
+#define RTEMS_SIGNAL_20 0x00100000
+#define RTEMS_SIGNAL_21 0x00200000
+#define RTEMS_SIGNAL_22 0x00400000
+#define RTEMS_SIGNAL_23 0x00800000
+#define RTEMS_SIGNAL_24 0x01000000
+#define RTEMS_SIGNAL_25 0x02000000
+#define RTEMS_SIGNAL_26 0x04000000
+#define RTEMS_SIGNAL_27 0x08000000
+#define RTEMS_SIGNAL_28 0x10000000
+#define RTEMS_SIGNAL_29 0x20000000
+#define RTEMS_SIGNAL_30 0x40000000
+#define RTEMS_SIGNAL_31 0x80000000
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/asr.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/attr.h b/c/src/exec/rtems/headers/attr.h
new file mode 100644
index 0000000000..cada11dbad
--- /dev/null
+++ b/c/src/exec/rtems/headers/attr.h
@@ -0,0 +1,84 @@
+/* attr.h
+ *
+ * This include file contains all information about the Object Attributes
+ * Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ATTRIBUTES_h
+#define __RTEMS_ATTRIBUTES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+typedef unsigned32 rtems_attribute;
+
+/* constants */
+
+#define RTEMS_DEFAULT_ATTRIBUTES 0x00000000
+
+#define RTEMS_NO_FLOATING_POINT 0x00000000 /* don't use FP HW */
+#define RTEMS_FLOATING_POINT 0x00000001 /* utilize coprocessor */
+
+#define RTEMS_LOCAL 0x00000000 /* local resource */
+#define RTEMS_GLOBAL 0x00000002 /* global resource */
+
+#define RTEMS_FIFO 0x00000000 /* process RTEMS_FIFO */
+#define RTEMS_PRIORITY 0x00000004 /* process by priority */
+
+#define RTEMS_COUNTING_SEMAPHORE 0x00000000
+#define RTEMS_BINARY_SEMAPHORE 0x00000010
+
+#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
+#define ATTRIBUTES_NOT_SUPPORTED RTEMS_FLOATING_POINT
+#endif
+
+#if ( CPU_ALL_TASKS_ARE_FP == TRUE )
+#define ATTRIBUTES_REQUIRED RTEMS_FLOATING_POINT
+#else
+#define ATTRIBUTES_REQUIRED 0
+#endif
+
+/*
+ * _Attributes_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs initialization for this handler.
+ *
+ * NOTE: There is no initialization required in C. Conditional compilation
+ * takes care of this in C.
+ */
+
+#define _Attributes_Handler_initialization()
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/attr.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/clock.h b/c/src/exec/rtems/headers/clock.h
new file mode 100644
index 0000000000..6bdc06483d
--- /dev/null
+++ b/c/src/exec/rtems/headers/clock.h
@@ -0,0 +1,103 @@
+/* clock.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Clock Manager. This manager provides facilities to set, obtain,
+ * and continually update the current date and time.
+ *
+ * This manager provides directives to:
+ *
+ * + set the current date and time
+ * + obtain the current date and time
+ * + announce a clock tick
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CLOCK_h
+#define __RTEMS_CLOCK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/tod.h>
+#include <rtems/rtems/types.h>
+
+/*
+ * List of things which can be returned by the rtems_clock_get directive.
+ */
+
+typedef enum {
+ RTEMS_CLOCK_GET_TOD,
+ RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH,
+ RTEMS_CLOCK_GET_TICKS_SINCE_BOOT,
+ RTEMS_CLOCK_GET_TICKS_PER_SECOND,
+ RTEMS_CLOCK_GET_TIME_VALUE
+} rtems_clock_get_options;
+
+/*
+ * Standard flavor style to return TOD in for a rtems_clock_get option.
+ */
+
+typedef struct {
+ unsigned32 seconds;
+ unsigned32 microseconds;
+} rtems_clock_time_value;
+
+/*
+ * rtems_clock_get
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_get directive. It returns
+ * one of the following:
+ * + current time of day
+ * + seconds since epoch
+ * + ticks since boot
+ * + ticks per second
+ */
+
+rtems_status_code rtems_clock_get(
+ rtems_clock_get_options option,
+ void *time_buffer
+);
+
+/*
+ * rtems_clock_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_set directive. It sets
+ * the current time of day to that in the time_buffer record.
+ */
+
+rtems_status_code rtems_clock_set(
+ rtems_time_of_day *time_buffer
+);
+
+/*
+ * rtems_clock_tick
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_tick directive. It is invoked
+ * to inform RTEMS of the occurrence of a clock tick.
+ */
+
+rtems_status_code rtems_clock_tick( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/config.h b/c/src/exec/rtems/headers/config.h
new file mode 100644
index 0000000000..0bdf3c974b
--- /dev/null
+++ b/c/src/exec/rtems/headers/config.h
@@ -0,0 +1,54 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters specific for the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_CONFIGURATION_h
+#define __RTEMS_RTEMS_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/tasks.h>
+
+/*
+ * The following records define the Configuration Table. The
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + required number of each object type
+ */
+
+typedef struct {
+ unsigned32 maximum_tasks;
+ unsigned32 maximum_timers;
+ unsigned32 maximum_semaphores;
+ unsigned32 maximum_message_queues;
+ unsigned32 maximum_partitions;
+ unsigned32 maximum_regions;
+ unsigned32 maximum_ports;
+ unsigned32 maximum_periods;
+ unsigned32 number_of_initialization_tasks;
+ rtems_initialization_tasks_table *User_initialization_tasks_table;
+} rtems_api_configuration_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/dpmem.h b/c/src/exec/rtems/headers/dpmem.h
new file mode 100644
index 0000000000..0405e800a8
--- /dev/null
+++ b/c/src/exec/rtems/headers/dpmem.h
@@ -0,0 +1,157 @@
+/* dpmem.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Dual Ported Memory Manager. This manager provides a mechanism
+ * for converting addresses between internal and external representations
+ * for multiple dual-ported memory areas.
+ *
+ * Directives provided are:
+ *
+ * + create a port
+ * + get ID of a port
+ * + delete a port
+ * + convert external to internal address
+ * + convert internal to external address
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DUAL_PORTED_MEMORY_h
+#define __RTEMS_DUAL_PORTED_MEMORY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+
+/*
+ * The following structure defines the port control block. Each port
+ * has a control block associated with it. This control block contains
+ * all information required to support the port related operations.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ void *internal_base; /* base internal address */
+ void *external_base; /* base external address */
+ unsigned32 length; /* length of dual-ported area */
+} Dual_ported_memory_Control;
+
+/*
+ * The following define the internal Dual Ported Memory information.
+ */
+
+RTEMS_EXTERN Objects_Information _Dual_ported_memory_Information;
+
+/*
+ * _Dual_ported_memory_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Dual_ported_memory_Manager_initialization(
+ unsigned32 maximum_ports
+);
+
+/*
+ * rtems_port_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_create directive. The port
+ * will have the name name. The port maps onto an area of dual ported
+ * memory of length bytes which has internal_start and external_start
+ * as the internal and external starting addresses, respectively.
+ * It returns the id of the created port in ID.
+ */
+
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ unsigned32 length,
+ Objects_Id *id
+);
+
+/*
+ * rtems_port_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_ident directive. This directive
+ * returns the port ID associated with name. If more than one port is
+ * named name, then the port to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_port_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_delete directive. It deletes
+ * the port associated with ID.
+ */
+
+rtems_status_code rtems_port_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_port_external_to_internal
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_external_to_internal directive.
+ * It returns the internal port address which maps to the provided
+ * external port address for the specified port ID.
+ */
+
+rtems_status_code rtems_port_external_to_internal(
+ Objects_Id id,
+ void *external,
+ void **internal
+);
+
+/*
+ * rtems_port_internal_to_external
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the Port_internal_to_external directive.
+ * It returns the external port address which maps to the provided
+ * internal port address for the specified port ID.
+ */
+
+rtems_status_code rtems_port_internal_to_external(
+ Objects_Id id,
+ void *internal,
+ void **external
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/dpmem.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/event.h b/c/src/exec/rtems/headers/event.h
new file mode 100644
index 0000000000..42f6b89e89
--- /dev/null
+++ b/c/src/exec/rtems/headers/event.h
@@ -0,0 +1,174 @@
+/* event.h
+ *
+ * This include file contains the information pertaining to the Event
+ * Manager. This manager provides a high performance method of communication
+ * and synchronization.
+ *
+ * Directives provided are:
+ *
+ * + send an event set to a task
+ * + receive event condition
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_h
+#define __RTEMS_EVENT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/eventset.h>
+
+/*
+ * This constant is passed as the event_in to the
+ * rtems_event_receive directive to determine which events are pending.
+ */
+
+#define EVENT_CURRENT 0
+
+/*
+ * The following enumerated types indicate what happened while the event
+ * manager was in the synchronization window.
+ */
+
+typedef enum {
+ EVENT_SYNC_SYNCHRONIZED,
+ EVENT_SYNC_NOTHING_HAPPENED,
+ EVENT_SYNC_TIMEOUT,
+ EVENT_SYNC_SATISFIED
+} Event_Sync_states;
+
+/*
+ * Event_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Event_Manager_initialization( void );
+
+/*
+ * rtems_event_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_event_send directive. It sends
+ * event_in to the task specified by ID. If the task is blocked
+ * waiting to receive events and the posting of event_in satisfies
+ * the task's event condition, then it is unblocked.
+ */
+
+rtems_status_code rtems_event_send (
+ Objects_Id id,
+ rtems_event_set event_in
+);
+
+/*
+ * rtems_event_receive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_event_receive directive. This
+ * directive is invoked when the calling task wishes to receive
+ * the event_in event condition. One of the fields in the option_set
+ * parameter determines whether the receive request is satisfied if
+ * any or all of the events are pending. If the event condition
+ * is not satisfied immediately, then the task may block with an
+ * optional timeout of TICKS clock ticks or return immediately.
+ * This determination is based on another field in the option_set
+ * parameter. This directive returns the events received in the
+ * event_out parameter.
+ */
+
+rtems_status_code rtems_event_receive (
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+);
+
+/*
+ * _Event_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine determines if the event condition event_in is
+ * satisfied. If so or if the no_wait option is enabled in option_set,
+ * then the procedure returns immediately. If neither of these
+ * conditions is true, then the calling task is blocked with an
+ * optional timeout of ticks clock ticks.
+ */
+
+void _Event_Seize (
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+);
+
+/*
+ * _Event_Surrender
+ *
+ * DESCRIPTION:
+ *
+ * This routine determines if the event condition of the_thread
+ * has been satisfied. If so, it unblocks the_thread.
+ */
+
+void _Event_Surrender (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Event_Timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task's event receive request
+ * has not been satisfied after the specified timeout interval.
+ * The task represented by ID will be unblocked and its status
+ * code will be set in it's control block to indicate that a timeout
+ * has occurred.
+ */
+
+void _Event_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * The following defines the synchronization flag used by the
+ * Event Manager to insure that signals sent to the currently
+ * executing thread are received properly.
+ */
+
+RTEMS_EXTERN volatile Event_Sync_states _Event_Sync_state;
+
+#include <rtems/rtems/eventmp.h>
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/event.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/eventmp.h b/c/src/exec/rtems/headers/eventmp.h
new file mode 100644
index 0000000000..f934f20a4e
--- /dev/null
+++ b/c/src/exec/rtems/headers/eventmp.h
@@ -0,0 +1,147 @@
+/* eventmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_MP_h
+#define __RTEMS_EVENT_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/event.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote event operations.
+ */
+
+typedef enum {
+ EVENT_MP_SEND_REQUEST = 0,
+ EVENT_MP_SEND_RESPONSE = 1
+} Event_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote event operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Event_MP_Remote_operations operation;
+ rtems_event_set event_in;
+} Event_MP_Packet;
+
+/*
+ * _Event_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ *
+ * This routine is not needed since there are no process
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _Event_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Event_MP_Send_request_packet (
+ Event_MP_Remote_operations operation,
+ Objects_Id event_id,
+ rtems_event_set event_in
+);
+
+/*
+ * _Event_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Event_MP_Send_response_packet (
+ Event_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Event_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Event_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Event_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Event_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Event_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a event mp packet.
+ */
+
+Event_MP_Packet *_Event_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/headers/eventset.h b/c/src/exec/rtems/headers/eventset.h
new file mode 100644
index 0000000000..a85254b3de
--- /dev/null
+++ b/c/src/exec/rtems/headers/eventset.h
@@ -0,0 +1,89 @@
+/* eventset.h
+ *
+ * This include file contains the information pertaining to the
+ * Event Sets Handler. This handler provides methods for the manipulation
+ * of event sets which will be sent and received by tasks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_SET_h
+#define __RTEMS_EVENT_SET_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following defines the type used to control event sets.
+ */
+
+typedef unsigned32 rtems_event_set;
+
+/*
+ * The following constants define the individual events which may
+ * be used to compose an event set.
+ */
+
+#define RTEMS_PENDING_EVENTS 0 /* receive pending events */
+#define RTEMS_ALL_EVENTS 0xFFFFFFFF
+
+#define RTEMS_EVENT_0 0x00000001
+#define RTEMS_EVENT_1 0x00000002
+#define RTEMS_EVENT_2 0x00000004
+#define RTEMS_EVENT_3 0x00000008
+#define RTEMS_EVENT_4 0x00000010
+#define RTEMS_EVENT_5 0x00000020
+#define RTEMS_EVENT_6 0x00000040
+#define RTEMS_EVENT_7 0x00000080
+#define RTEMS_EVENT_8 0x00000100
+#define RTEMS_EVENT_9 0x00000200
+#define RTEMS_EVENT_10 0x00000400
+#define RTEMS_EVENT_11 0x00000800
+#define RTEMS_EVENT_12 0x00001000
+#define RTEMS_EVENT_13 0x00002000
+#define RTEMS_EVENT_14 0x00004000
+#define RTEMS_EVENT_15 0x00008000
+#define RTEMS_EVENT_16 0x00010000
+#define RTEMS_EVENT_17 0x00020000
+#define RTEMS_EVENT_18 0x00040000
+#define RTEMS_EVENT_19 0x00080000
+#define RTEMS_EVENT_20 0x00100000
+#define RTEMS_EVENT_21 0x00200000
+#define RTEMS_EVENT_22 0x00400000
+#define RTEMS_EVENT_23 0x00800000
+#define RTEMS_EVENT_24 0x01000000
+#define RTEMS_EVENT_25 0x02000000
+#define RTEMS_EVENT_26 0x04000000
+#define RTEMS_EVENT_27 0x08000000
+#define RTEMS_EVENT_28 0x10000000
+#define RTEMS_EVENT_29 0x20000000
+#define RTEMS_EVENT_30 0x40000000
+#define RTEMS_EVENT_31 0x80000000
+
+
+/*
+ * The following constant is the value of an event set which
+ * has no events pending.
+ */
+
+#define EVENT_SETS_NONE_PENDING 0
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/eventset.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/intr.h b/c/src/exec/rtems/headers/intr.h
new file mode 100644
index 0000000000..09697a93d6
--- /dev/null
+++ b/c/src/exec/rtems/headers/intr.h
@@ -0,0 +1,160 @@
+/* intr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Interrupt Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_INTERRUPT_h
+#define __RTEMS_INTERRUPT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+
+/*
+ * Interrupt level type
+ */
+
+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:
+ *
+ * This routine initializes the interrupt manager.
+ *
+ */
+
+void _Interrupt_Manager_initialization( void );
+
+/*
+ * rtems_interrupt_catch
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_interrupt_catch directive. This
+ * directive installs new_isr_handler as the RTEMS interrupt service
+ * routine for vector. The previous RTEMS interrupt service
+ * routine is returned in old_isr_handler.
+ */
+
+rtems_status_code rtems_interrupt_catch(
+ rtems_isr_entry new_isr_handler,
+ rtems_vector_number vector,
+ rtems_isr_entry *old_isr_handler
+);
+
+/*
+ * rtems_interrupt_disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables all maskable interrupts and returns the
+ * previous level in _isr_cookie.
+ */
+
+#define rtems_interrupt_disable( _isr_cookie ) \
+ _ISR_Disable(_isr_cookie)
+
+/*
+ * rtems_interrupt_enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables maskable interrupts to the level indicated
+ * _isr_cookie.
+ */
+
+#define rtems_interrupt_enable( _isr_cookie ) \
+ _ISR_Enable(_isr_cookie)
+
+/*
+ * rtems_interrupt_flash
+ *
+ * DESCRIPTION:
+ *
+ * This routine temporarily enables maskable interrupts to the
+ * level in _isr_cookie before redisabling them.
+ */
+
+#define rtems_interrupt_flash( _isr_cookie ) \
+ _ISR_Flash(_isr_cookie)
+
+/*
+ * rtems_interrupt_is_in_progress
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the processor is currently servicing
+ * and interrupt and FALSE otherwise. A return value of TRUE indicates
+ * that the caller is an interrupt service routine, NOT a thread. The
+ * directives available to an interrupt service routine are restricted.
+ */
+
+#define rtems_interrupt_is_in_progress() \
+ _ISR_Is_in_progress()
+
+/*
+ * rtems_interrupt_cause
+ *
+ * DESCRIPTION:
+ *
+ * This routine generates an interrupt.
+ *
+ * NOTE: No implementation.
+ */
+
+#define rtems_interrupt_cause( _interrupt_to_cause )
+
+/*
+ * rtems_interrupt_cause
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the specified interrupt.
+ *
+ * NOTE: No implementation.
+ */
+
+#define rtems_interrupt_clear( _interrupt_to_clear )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/message.h b/c/src/exec/rtems/headers/message.h
new file mode 100644
index 0000000000..f819b7cfa2
--- /dev/null
+++ b/c/src/exec/rtems/headers/message.h
@@ -0,0 +1,317 @@
+/* message.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Message Queue Manager. This manager provides a mechanism for
+ * communication and synchronization between tasks using messages.
+ *
+ * Directives provided are:
+ *
+ * + create a queue
+ * + get ID of a queue
+ * + delete a queue
+ * + put a message at the rear of a queue
+ * + put a message at the front of a queue
+ * + broadcast N messages to a queue
+ * + receive message from a queue
+ * + flush all messages on a queue
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MESSAGE_QUEUE_h
+#define __RTEMS_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/coremsg.h>
+
+/*
+ * The following enumerated type details the modes in which a message
+ * may be submitted to a message queue. The message may be posted
+ * in a send or urgent fashion.
+ */
+
+typedef enum {
+ MESSAGE_QUEUE_SEND_REQUEST = 0,
+ MESSAGE_QUEUE_URGENT_REQUEST = 1
+} Message_queue_Submit_types;
+
+/*
+ * The following records define the control block used to manage
+ * each message queue.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ rtems_attribute attribute_set;
+ CORE_message_queue_Control message_queue;
+} Message_queue_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Message_queue_Information;
+
+/*
+ * _Message_queue_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+);
+
+/*
+ * rtems_message_queue_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_create directive. The
+ * message queue will have the name name. If the attribute_set indicates
+ * that the message queue is to be limited in the number of messages
+ * that can be outstanding, then count indicates the maximum number of
+ * messages that will be held. It returns the id of the created
+ * message queue in ID.
+ */
+
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ unsigned32 count,
+ unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_message_queue_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_ident directive.
+ * This directive returns the message queue ID associated with NAME.
+ * If more than one message queue is named name, then the message
+ * queue to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the message queue named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_message_queue_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_delete directive. The
+ * message queue indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_message_queue_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_message_queue_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_send(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+);
+
+/*
+ * rtems_message_queue_urgent
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_urgent(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+);
+
+/*
+ * rtems_message_queue_broadcast
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_broadcast(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ unsigned32 *count
+);
+
+/*
+ * rtems_message_queue_receive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_receive directive.
+ * This directive is invoked when the calling task wishes to receive
+ * a message from the message queue indicated by ID. The received
+ * message is to be placed in buffer. If no messages are outstanding
+ * and the option_set indicates that the task is willing to block,
+ * then the task will be blocked until a message arrives or until,
+ * optionally, timeout clock ticks have passed.
+ */
+
+rtems_status_code rtems_message_queue_receive(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ unsigned32 option_set,
+ rtems_interval timeout
+);
+
+/*
+ * rtems_message_queue_flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_flush directive.
+ * This directive takes all outstanding messages for the message
+ * queue indicated by ID and returns them to the inactive message
+ * chain. The number of messages flushed is returned in COUNT.
+ */
+
+rtems_status_code rtems_message_queue_flush(
+ Objects_Id id,
+ unsigned32 *count
+);
+
+/*
+ * _Message_queue_Submit
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the directives rtems_message_queue_send
+ * and rtems_message_queue_urgent. It processes a message that is
+ * to be submitted to the designated message queue. The message will
+ * either be processed as a send send message which it will be inserted
+ * at the rear of the queue or it will be processed as an urgent message
+ * which will be inserted at the front of the queue.
+ */
+
+rtems_status_code _Message_queue_Submit(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ Message_queue_Submit_types submit_type
+);
+
+/*
+ * _Message_queue_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message queue control block from
+ * the inactive chain of free message queue control blocks.
+ */
+
+Message_queue_Control *_Message_queue_Allocate (
+ unsigned32 count,
+ unsigned32 max_message_size
+);
+
+/*
+ * _Message_queue_Translate_core_message_queue_return_code
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a RTEMS status code based on the core message queue
+ * status code specified.
+ */
+
+rtems_status_code _Message_queue_Translate_core_message_queue_return_code (
+ unsigned32 the_message_queue_status
+);
+
+/*
+ *
+ * _Message_queue_Core_message_queue_mp_support
+ *
+ * Input parameters:
+ * the_thread - the remote thread the message was submitted to
+ * id - id of the message queue
+ *
+ * Output parameters: NONE
+ */
+
+void _Message_queue_Core_message_queue_mp_support (
+ Thread_Control *the_thread,
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/message.inl>
+#endif
+#include <rtems/rtems/msgmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/modes.h b/c/src/exec/rtems/headers/modes.h
new file mode 100644
index 0000000000..90327636c1
--- /dev/null
+++ b/c/src/exec/rtems/headers/modes.h
@@ -0,0 +1,89 @@
+/* modes.h
+ *
+ * This include file contains all constants and structures associated
+ * with the RTEMS thread and RTEMS_ASR modes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MODES_h
+#define __RTEMS_MODES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+
+/*
+ * The following type defines the control block used to manage
+ * each a mode set.
+ */
+
+typedef unsigned32 Modes_Control;
+
+/*
+ * The following constants define the individual modes and masks
+ * which may be used to compose a mode set and to alter modes.
+ */
+
+#define RTEMS_ALL_MODE_MASKS 0x0000ffff
+
+#define RTEMS_DEFAULT_MODES 0x00000000
+#define RTEMS_CURRENT_MODE 0
+
+#define RTEMS_PREEMPT_MASK 0x00000100 /* preemption bit */
+#define RTEMS_TIMESLICE_MASK 0x00000200 /* timeslice bit */
+#define RTEMS_ASR_MASK 0x00000400 /* RTEMS_ASR enable bit */
+#define RTEMS_INTERRUPT_MASK CPU_MODES_INTERRUPT_MASK
+
+#define RTEMS_PREEMPT 0x00000000 /* enable preemption */
+#define RTEMS_NO_PREEMPT 0x00000100 /* disable preemption */
+
+#define RTEMS_NO_TIMESLICE 0x00000000 /* disable timeslicing */
+#define RTEMS_TIMESLICE 0x00000200 /* enable timeslicing */
+
+#define RTEMS_ASR 0x00000000 /* enable RTEMS_ASR */
+#define RTEMS_NO_ASR 0x00000400 /* disable RTEMS_ASR */
+
+/*
+ * The number of bits for interrupt levels is CPU dependent.
+ * RTEMS supports 0 to 256 levels in bits 0-7 of the mode.
+ */
+
+/*PAGE
+ *
+ * RTEMS_INTERRUPT_LEVEL
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the processor dependent interrupt
+ * level which corresponds to the requested interrupt level.
+ *
+ * NOTE: RTEMS supports 256 interrupt levels using the least
+ * significant eight bits of MODES.CONTROL. On any
+ * particular CPU, fewer than 256 levels may be supported.
+ */
+
+#define RTEMS_INTERRUPT_LEVEL( _mode_set ) \
+ ( (_mode_set) & RTEMS_INTERRUPT_MASK )
+
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/modes.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/mp.h b/c/src/exec/rtems/headers/mp.h
new file mode 100644
index 0000000000..0fabd202aa
--- /dev/null
+++ b/c/src/exec/rtems/headers/mp.h
@@ -0,0 +1,53 @@
+/* mp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MP_h
+#define __RTEMS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ *
+ * _Multiprocessing_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Multiprocessing_Manager_initialization ( void );
+
+/*
+ *
+ * rtems_multiprocessing_announce
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the MULTIPROCESSING_ANNOUNCE directive.
+ * It is invoked by the MPCI layer to indicate that an MPCI packet
+ * has been received.
+ */
+
+void rtems_multiprocessing_announce ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/msgmp.h b/c/src/exec/rtems/headers/msgmp.h
new file mode 100644
index 0000000000..c640aad0cd
--- /dev/null
+++ b/c/src/exec/rtems/headers/msgmp.h
@@ -0,0 +1,175 @@
+/* msgmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MESSAGE_QUEUE_MP_h
+#define __RTEMS_MESSAGE_QUEUE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/message.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote message queue operations.
+ */
+
+typedef enum {
+ MESSAGE_QUEUE_MP_ANNOUNCE_CREATE = 0,
+ MESSAGE_QUEUE_MP_ANNOUNCE_DELETE = 1,
+ MESSAGE_QUEUE_MP_EXTRACT_PROXY = 2,
+ MESSAGE_QUEUE_MP_RECEIVE_REQUEST = 3,
+ MESSAGE_QUEUE_MP_RECEIVE_RESPONSE = 4,
+ MESSAGE_QUEUE_MP_SEND_REQUEST = 5,
+ MESSAGE_QUEUE_MP_SEND_RESPONSE = 6,
+ MESSAGE_QUEUE_MP_URGENT_REQUEST = 7,
+ MESSAGE_QUEUE_MP_URGENT_RESPONSE = 8,
+ MESSAGE_QUEUE_MP_BROADCAST_REQUEST = 9,
+ MESSAGE_QUEUE_MP_BROADCAST_RESPONSE = 10,
+ MESSAGE_QUEUE_MP_FLUSH_REQUEST = 11,
+ MESSAGE_QUEUE_MP_FLUSH_RESPONSE = 12
+} Message_queue_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote message queue operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Message_queue_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ Objects_Id proxy_id;
+ unsigned32 count;
+ unsigned32 size;
+ unsigned32 pad0;
+ CORE_message_queue_Buffer Buffer;
+} Message_queue_MP_Packet;
+
+/*
+ * _Message_queue_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Message_queue_MP_Send_process_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Message_queue_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Message_queue_MP_Send_request_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ void *buffer,
+ unsigned32 *size_p,
+ rtems_option option_set,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Message_queue_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Message_queue_MP_Send_response_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Message_queue_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Message_queue_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Message_queue_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _Message_queue_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Message_queue_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a message queue mp packet.
+ */
+
+Message_queue_MP_Packet *_Message_queue_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/headers/options.h b/c/src/exec/rtems/headers/options.h
new file mode 100644
index 0000000000..79ebcf9fc2
--- /dev/null
+++ b/c/src/exec/rtems/headers/options.h
@@ -0,0 +1,53 @@
+/* options.h
+ *
+ * This include file contains information which defines the
+ * options available on many directives.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_OPTIONS_h
+#define __RTEMS_OPTIONS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * option sets.
+ */
+
+typedef unsigned32 rtems_option;
+
+/*
+ * The following constants define the individual options which may
+ * be used to compose an option set.
+ */
+
+#define RTEMS_DEFAULT_OPTIONS 0x00000000
+
+#define RTEMS_WAIT 0x00000000 /* wait on resource */
+#define RTEMS_NO_WAIT 0x00000001 /* do not wait on resource */
+
+#define RTEMS_EVENT_ALL 0x00000000 /* wait for all events */
+#define RTEMS_EVENT_ANY 0x00000002 /* wait on any event */
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/options.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/part.h b/c/src/exec/rtems/headers/part.h
new file mode 100644
index 0000000000..eda5649f70
--- /dev/null
+++ b/c/src/exec/rtems/headers/part.h
@@ -0,0 +1,168 @@
+/* partition.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Partition Manager. This manager provides facilities to
+ * dynamically allocate memory in fixed-sized units which are returned
+ * as buffers.
+ *
+ * Directives provided are:
+ *
+ * + create a partition
+ * + get an ID of a partition
+ * + delete a partition
+ * + get a buffer from a partition
+ * + return a buffer to a partition
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_PARTITION_h
+#define __RTEMS_PARTITION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/types.h>
+
+/*
+ * The following defines the control block used to manage each partition.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ void *starting_address; /* physical address */
+ unsigned32 length; /* in bytes */
+ unsigned32 buffer_size; /* in bytes */
+ rtems_attribute attribute_set; /* attributes */
+ unsigned32 number_of_used_blocks; /* or allocated buffers */
+ Chain_Control Memory; /* buffer chain */
+} Partition_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Partition_Information;
+
+/*
+ * _Partition_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Partition_Manager_initialization(
+ unsigned32 maximum_partitions
+);
+
+/*
+ * rtems_partition_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_create directive. The
+ * partition will have the name name. The memory area managed by
+ * the partition is of length bytes and starts at starting_address.
+ * The memory area will be divided into as many buffers of
+ * buffer_size bytes as possible. The attribute_set determines if
+ * the partition is global or local. It returns the id of the
+ * created partition in ID.
+ */
+
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_partition_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_ident directive.
+ * This directive returns the partition ID associated with name.
+ * If more than one partition is named name, then the partition
+ * to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the partition named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_partition_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_delete directive. The
+ * partition indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_partition_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_partition_get_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_get_buffer directive. It
+ * attempts to allocate a buffer from the partition associated with ID.
+ * If a buffer is allocated, its address is returned in buffer.
+ */
+
+rtems_status_code rtems_partition_get_buffer(
+ Objects_Id id,
+ void **buffer
+);
+
+/*
+ * rtems_partition_return_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_return_buffer directive. It
+ * frees the buffer to the partition associated with ID. The buffer must
+ * have been previously allocated from the same partition.
+ */
+
+rtems_status_code rtems_partition_return_buffer(
+ Objects_Id id,
+ void *buffer
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/part.inl>
+#endif
+#include <rtems/rtems/partmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/partmp.h b/c/src/exec/rtems/headers/partmp.h
new file mode 100644
index 0000000000..19bc2c7d61
--- /dev/null
+++ b/c/src/exec/rtems/headers/partmp.h
@@ -0,0 +1,161 @@
+/* partmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_PARTITION_MP_h
+#define __RTEMS_PARTITION_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+
+#include <rtems/rtems/part.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote partition operations.
+ */
+
+typedef enum {
+ PARTITION_MP_ANNOUNCE_CREATE = 0,
+ PARTITION_MP_ANNOUNCE_DELETE = 1,
+ PARTITION_MP_EXTRACT_PROXY = 2,
+ PARTITION_MP_GET_BUFFER_REQUEST = 3,
+ PARTITION_MP_GET_BUFFER_RESPONSE = 4,
+ PARTITION_MP_RETURN_BUFFER_REQUEST = 5,
+ PARTITION_MP_RETURN_BUFFER_RESPONSE = 6
+} Partition_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote partition operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Partition_MP_Remote_operations operation;
+ rtems_name name;
+ void *buffer;
+ Objects_Id proxy_id;
+} Partition_MP_Packet;
+
+/*
+ * _Partition_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Partition_MP_Send_process_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Partition_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Partition_MP_Send_request_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ void *buffer
+);
+
+/*
+ * _Partition_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Partition_MP_Send_response_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Partition_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Partition_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Partition_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by the Partition since a partition
+ * cannot be deleted when buffers are in use.
+ */
+
+/*
+ * _Partition_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Partition_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Partition_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a partition mp packet.
+ */
+
+Partition_MP_Packet *_Partition_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/headers/ratemon.h b/c/src/exec/rtems/headers/ratemon.h
new file mode 100644
index 0000000000..251bb88dac
--- /dev/null
+++ b/c/src/exec/rtems/headers/ratemon.h
@@ -0,0 +1,213 @@
+/* ratemon.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the Rate Monotonic Manager. This manager
+ * provides facilities to implement tasks which execute in a periodic fashion.
+ *
+ * Directives provided are:
+ *
+ * + create a rate monotonic timer
+ * + cancel a period
+ * + delete a rate monotonic timer
+ * + conclude current and start the next period
+ * + obtain status information on a period
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RATE_MONOTONIC_h
+#define __RTEMS_RATE_MONOTONIC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the states in which a
+ * period may be.
+ */
+
+typedef enum {
+ RATE_MONOTONIC_INACTIVE, /* off chain, never initialized */
+ RATE_MONOTONIC_OWNER_IS_BLOCKING, /* on chain, owner is blocking on it */
+ RATE_MONOTONIC_ACTIVE, /* on chain, running continuously */
+ RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING, /* on chain, expired while owner was */
+ /* was blocking on it */
+ RATE_MONOTONIC_EXPIRED /* off chain, will be reset by next */
+ /* rtems_rate_monotonic_period */
+} rtems_rate_monotonic_period_states;
+
+/*
+ * The following constant is the interval passed to the rate_monontonic_period
+ * directive to obtain status information.
+ */
+
+#define RTEMS_PERIOD_STATUS WATCHDOG_NO_TIMEOUT
+
+/*
+ * The following defines the period status structure.
+ */
+
+typedef struct {
+ rtems_rate_monotonic_period_states state;
+ unsigned32 ticks_since_last_period;
+ unsigned32 ticks_executed_since_last_period;
+} rtems_rate_monotonic_period_status;
+
+/*
+ * The following structure defines the control block used to manage
+ * each period.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Watchdog_Control Timer;
+ rtems_rate_monotonic_period_states state;
+ unsigned32 owner_ticks_executed_at_period;
+ unsigned32 time_at_period;
+ Thread_Control *owner;
+} Rate_monotonic_Control;
+
+RTEMS_EXTERN Objects_Information _Rate_monotonic_Information;
+
+/*
+ * _Rate_monotonic_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Rate_monotonic_Manager_initialization(
+ unsigned32 maximum_periods
+);
+
+/*
+ * rtems_rate_monotonic_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rate_monotonic_create directive. The
+ * period will have the name name. It returns the id of the
+ * created period in ID.
+ */
+
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_rate_monotonic_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_ident directive.
+ * This directive returns the period ID associated with name.
+ * If more than one period is named name, then the period
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_rate_monotonic_cancel
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_cancel directive. This
+ * directive stops the period associated with ID from continuing to
+ * run.
+ */
+
+rtems_status_code rtems_rate_monotonic_cancel(
+ Objects_Id id
+);
+
+/*
+ * rtems_rate_monotonic_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_delete directive. The
+ * period indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_rate_monotonic_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_rate_monotonic_get_status
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_get_status directive.
+ * Information about the period indicated by ID is returned.
+ *
+ */
+
+rtems_status_code rtems_rate_monotonic_get_status(
+ Objects_Id id,
+ rtems_rate_monotonic_period_status *status
+);
+
+/*
+ * rtems_rate_monotonic_period
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_period directive. When
+ * length is non-zero, this directive initiates the period associated with
+ * ID from continuing for a period of length. If length is zero, then
+ * result is set to indicate the current state of the period.
+ */
+
+rtems_status_code rtems_rate_monotonic_period(
+ Objects_Id id,
+ rtems_interval length
+);
+
+/*
+ * _Rate_monotonic_Timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when the period represented
+ * by ID expires. If the task which owns this period is blocked
+ * waiting for the period to expire, then it is readied and the
+ * period is restarted. If the owning task is not waiting for the
+ * period to expire, then the period is placed in the EXPIRED
+ * state and not restarted.
+ */
+
+void _Rate_monotonic_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/ratemon.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/region.h b/c/src/exec/rtems/headers/region.h
new file mode 100644
index 0000000000..ae191f62e4
--- /dev/null
+++ b/c/src/exec/rtems/headers/region.h
@@ -0,0 +1,234 @@
+/* region.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Region Manager. This manager provides facilities to dynamically
+ * allocate memory in variable sized units which are returned as segments.
+ *
+ * Directives provided are:
+ *
+ * + create a region
+ * + get an ID of a region
+ * + delete a region
+ * + get a segment from a region
+ * + return a segment to a region
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_REGION_h
+#define __RTEMS_REGION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/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
+ * each region.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Thread_queue_Control Wait_queue; /* waiting threads */
+ void *starting_address; /* physical start addr */
+ unsigned32 length; /* physical length(bytes) */
+ unsigned32 page_size; /* in bytes */
+ unsigned32 maximum_segment_size; /* in bytes */
+ rtems_attribute attribute_set;
+ unsigned32 number_of_used_blocks; /* blocks allocated */
+ Heap_Control Memory;
+} Region_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Region_Information;
+
+/*
+ * _Region_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Region_Manager_initialization(
+ unsigned32 maximum_regions
+);
+
+/*
+ * rtems_region_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_create directive. The
+ * region will have the name name. The memory area managed by
+ * the region is of length bytes and starts at starting_address.
+ * The memory area will be divided into as many allocatable units of
+ * page_size bytes as possible. The attribute_set determines which
+ * thread queue discipline is used by the region. It returns the
+ * id of the created region in ID.
+ */
+
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 page_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_region_extend
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_extend directive. The
+ * region will have the name name. The memory area managed by
+ * the region will be attempted to be grown by length bytes using
+ * the memory starting at starting_address.
+ */
+
+rtems_status_code rtems_region_extend(
+ Objects_Id id,
+ void *starting_address,
+ unsigned32 length
+);
+
+/*
+ * rtems_region_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_ident directive.
+ * This directive returns the region ID associated with name.
+ * If more than one region is named name, then the region
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_region_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_delete directive. The
+ * region indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_region_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_region_get_segment
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_get_segment directive. It
+ * attempts to allocate a segment from the region associated with ID.
+ * If a segment of the requested size can be allocated, its address
+ * is returned in segment. If no segment is available, then the task
+ * may return immediately or block waiting for a segment with an optional
+ * timeout of timeout clock ticks. Whether the task blocks or returns
+ * immediately is based on the no_wait option in the option_set.
+ */
+
+rtems_status_code rtems_region_get_segment(
+ Objects_Id id,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+);
+
+/*
+ * rtems_region_get_segment_size
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_get_segment_size directive. It
+ * returns the size in bytes of the specified user memory area.
+ */
+
+rtems_status_code rtems_region_get_segment_size(
+ Objects_Id id,
+ void *segment,
+ unsigned32 *size
+);
+
+/*
+ * rtems_region_return_segment
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_return_segment directive. It
+ * frees the segment to the region associated with ID. The segment must
+ * have been previously allocated from the same region. If freeing the
+ * segment results in enough memory being available to satisfy the
+ * rtems_region_get_segment of the first blocked task, then that task and as
+ * many subsequent tasks as possible will be unblocked with their requests
+ * satisfied.
+ */
+
+rtems_status_code rtems_region_return_segment(
+ Objects_Id id,
+ void *segment
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/region.inl>
+#endif
+#include <rtems/rtems/regionmp.h>
+
+/*
+ * _Region_Debug_Walk
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked to verify the integrity of a heap associated
+ * with the_region.
+ */
+
+#ifdef RTEMS_DEBUG
+
+#define _Region_Debug_Walk( _the_region, _source ) \
+ do { \
+ if ( _Debug_Is_enabled( RTEMS_DEBUG_REGION ) ) \
+ _Heap_Walk( &(_the_region)->Memory, _source, FALSE ); \
+ } while ( 0 )
+
+#else
+
+#define _Region_Debug_Walk( _the_region, _source )
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/regionmp.h b/c/src/exec/rtems/headers/regionmp.h
new file mode 100644
index 0000000000..a0560a4558
--- /dev/null
+++ b/c/src/exec/rtems/headers/regionmp.h
@@ -0,0 +1,166 @@
+/* regionmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_REGION_MP_h
+#define __RTEMS_REGION_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote region operations.
+ */
+
+typedef enum {
+ REGION_MP_ANNOUNCE_CREATE = 0,
+ REGION_MP_ANNOUNCE_DELETE = 1,
+ REGION_MP_EXTRACT_PROXY = 2,
+ REGION_MP_GET_SEGMENT_REQUEST = 3,
+ REGION_MP_GET_SEGMENT_RESPONSE = 4,
+ REGION_MP_RETURN_SEGMENT_REQUEST = 5,
+ REGION_MP_RETURN_SEGMENT_RESPONSE = 6
+} Region_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote region operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Region_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ unsigned32 size;
+ Objects_Id proxy_id;
+ void *segment;
+} Region_MP_Packet;
+
+/*
+ * _Region_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Region_MP_Send_process_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Region_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Region_MP_Send_request_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ void *segment,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout
+);
+
+/*
+ * _Region_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Region_MP_Send_response_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Region_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Region_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Region_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by the Region since a region
+ * cannot be deleted when segments are in use.
+ */
+
+/*
+ * _Region_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Region_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Region_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a region mp packet.
+ */
+
+Region_MP_Packet *_Region_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/headers/rtems.h b/c/src/exec/rtems/headers/rtems.h
new file mode 100644
index 0000000000..b78eec9b6b
--- /dev/null
+++ b/c/src/exec/rtems/headers/rtems.h
@@ -0,0 +1,121 @@
+/* rtems.h
+ *
+ * This include file contains information about RTEMS executive that
+ * is required by the application and is CPU independent. It includes
+ * two (2) CPU dependent files to tailor its data structures for a
+ * particular processor.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_GENERIC_h
+#define __RTEMS_RTEMS_GENERIC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Unless told otherwise, the RTEMS include files will hide some stuff
+ * from normal application code. Defining this crosses a boundary which
+ * is undesirable since it means your application is using RTEMS features
+ * which are not included in the formally defined and supported API.
+ * Define this at your own risk.
+ */
+
+#ifndef __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#define __RTEMS_APPLICATION__
+#endif
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+
+#include <rtems/config.h>
+#include <rtems/init.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/extension.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/rtems/ratemon.h>
+#include <rtems/rtems/mp.h>
+
+#include <rtems/rtems/support.h>
+#include <rtems/score/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(class, node) OBJECTS_ID_INITIAL(class, 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
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/rtemsapi.h b/c/src/exec/rtems/headers/rtemsapi.h
new file mode 100644
index 0000000000..2ceb6ab577
--- /dev/null
+++ b/c/src/exec/rtems/headers/rtemsapi.h
@@ -0,0 +1,34 @@
+/*
+ * RTEMS API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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/c/src/exec/rtems/headers/sem.h b/c/src/exec/rtems/headers/sem.h
new file mode 100644
index 0000000000..321724ed53
--- /dev/null
+++ b/c/src/exec/rtems/headers/sem.h
@@ -0,0 +1,248 @@
+/* semaphore.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Semaphore Manager. This manager utilizes standard Dijkstra
+ * counting semaphores to provide synchronization and mutual exclusion
+ * capabilities.
+ *
+ * Directives provided are:
+ *
+ * + create a semaphore
+ * + get an ID of a semaphore
+ * + delete a semaphore
+ * + acquire a semaphore
+ * + release a semaphore
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SEMAPHORE_h
+#define __RTEMS_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/object.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/threadq.h>
+
+/*
+ * The following defines the control block used to manage each semaphore.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ rtems_attribute attribute_set;
+ union {
+ CORE_mutex_Control mutex;
+ CORE_semaphore_Control semaphore;
+ } Core_control;
+} Semaphore_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Semaphore_Information;
+
+/*
+ * _Semaphore_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+);
+
+/*
+ * rtems_semaphore_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_create directive. The
+ * semaphore will have the name name. The starting count for
+ * the semaphore is count. The attribute_set determines if
+ * the semaphore is global or local and the thread queue
+ * discipline. It returns the id of the created semaphore in ID.
+ */
+
+rtems_status_code rtems_semaphore_create(
+ rtems_name name,
+ unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ rtems_id *id
+);
+
+/*
+ * rtems_semaphore_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_ident directive.
+ * This directive returns the semaphore ID associated with name.
+ * If more than one semaphore is named name, then the semaphore
+ * to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the semaphore named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ unsigned32 node,
+ rtems_id *id
+);
+
+/*
+ * rtems_semaphore_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_delete directive. The
+ * semaphore indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_semaphore_delete(
+ rtems_id id
+);
+
+/*
+ * rtems_semaphore_obtain
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_obtain directive. It
+ * attempts to obtain a unit from the semaphore associated with ID.
+ * If a unit can be allocated, the calling task will return immediately.
+ * If no unit is available, then the task may return immediately or
+ * block waiting for a unit with an optional timeout of timeout
+ * clock ticks. Whether the task blocks or returns immediately
+ * is based on the RTEMS_NO_WAIT option in the option_set.
+ */
+
+rtems_status_code rtems_semaphore_obtain(
+ rtems_id id,
+ unsigned32 option_set,
+ rtems_interval timeout
+);
+
+/*
+ * rtems_semaphore_release
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_release directive. It
+ * frees a unit to the semaphore associated with ID. 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.
+ */
+
+rtems_status_code rtems_semaphore_release(
+ rtems_id id
+);
+
+/*
+ * _Semaphore_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine attempts to receive a unit from the_semaphore.
+ * If a unit is available or if the RTEMS_NO_WAIT option is enabled in
+ * option_set, then the routine returns. Otherwise, the calling task
+ * is blocked until a unit becomes available.
+ */
+
+boolean _Semaphore_Seize(
+ Semaphore_Control *the_semaphore,
+ unsigned32 option_set
+);
+
+/*
+ * _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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/sem.inl>
+#endif
+#include <rtems/rtems/semmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/semmp.h b/c/src/exec/rtems/headers/semmp.h
new file mode 100644
index 0000000000..e3b161512d
--- /dev/null
+++ b/c/src/exec/rtems/headers/semmp.h
@@ -0,0 +1,163 @@
+/* semmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SEMAPHORE_MP_h
+#define __RTEMS_SEMAPHORE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote semaphore operations.
+ */
+
+typedef enum {
+ SEMAPHORE_MP_ANNOUNCE_CREATE = 0,
+ SEMAPHORE_MP_ANNOUNCE_DELETE = 1,
+ SEMAPHORE_MP_EXTRACT_PROXY = 2,
+ SEMAPHORE_MP_OBTAIN_REQUEST = 3,
+ SEMAPHORE_MP_OBTAIN_RESPONSE = 4,
+ SEMAPHORE_MP_RELEASE_REQUEST = 5,
+ SEMAPHORE_MP_RELEASE_RESPONSE = 6
+} Semaphore_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote semaphore operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Semaphore_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ Objects_Id proxy_id;
+} Semaphore_MP_Packet;
+
+/*
+ * _Semaphore_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Semaphore_MP_Send_process_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Semaphore_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Semaphore_MP_Send_request_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_option option_set,
+ rtems_interval timeout
+);
+
+/*
+ * _Semaphore_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Semaphore_MP_Send_response_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Semaphore_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Semaphore_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Semaphore_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _Semaphore_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Semaphore_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a semaphore mp packet.
+ */
+
+Semaphore_MP_Packet *_Semaphore_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/headers/signal.h b/c/src/exec/rtems/headers/signal.h
new file mode 100644
index 0000000000..18fdeba88a
--- /dev/null
+++ b/c/src/exec/rtems/headers/signal.h
@@ -0,0 +1,83 @@
+/* signal.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Signal Manager. This manager provides capabilities required
+ * for asynchronous communication between tasks via signal sets.
+ *
+ * Directives provided are:
+ *
+ * + establish an asynchronous signal routine
+ * + send a signal set to a task
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SIGNAL_h
+#define __RTEMS_SIGNAL_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/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
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_signal_catch directive. This directive
+ * is used to establish asr_handler as the Asynchronous Signal Routine
+ * (RTEMS_ASR) for the calling task. The asr_handler will execute with a
+ * mode of mode_set.
+ */
+
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry asr_handler,
+ rtems_mode mode_set
+);
+
+/*
+ * rtems_signal_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_signal_send directive. This directive
+ * sends the signal_set to the task specified by ID.
+ */
+
+rtems_status_code rtems_signal_send(
+ Objects_Id id,
+ rtems_signal_set signal_set
+);
+
+#include <rtems/rtems/signalmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/signalmp.h b/c/src/exec/rtems/headers/signalmp.h
new file mode 100644
index 0000000000..fb9c0ea833
--- /dev/null
+++ b/c/src/exec/rtems/headers/signalmp.h
@@ -0,0 +1,147 @@
+/* signalmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Signal Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SIGNAL_MP_h
+#define __RTEMS_SIGNAL_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/asr.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote signal operations.
+ */
+
+typedef enum {
+ SIGNAL_MP_SEND_REQUEST = 0,
+ SIGNAL_MP_SEND_RESPONSE = 1
+} Signal_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote signal operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Signal_MP_Remote_operations operation;
+ rtems_signal_set signal_in;
+} Signal_MP_Packet;
+
+/*
+ * _Signal_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ *
+ * This routine is not needed since there are no process
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _Signal_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Signal_MP_Send_request_packet (
+ Signal_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_signal_set signal_in
+);
+
+/*
+ * _Signal_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Signal_MP_Send_response_packet (
+ Signal_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Signal_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Signal_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Signal_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Signal_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Signal_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a signal mp packet.
+ */
+
+Signal_MP_Packet *_Signal_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/headers/status.h b/c/src/exec/rtems/headers/status.h
new file mode 100644
index 0000000000..cff32c0f83
--- /dev/null
+++ b/c/src/exec/rtems/headers/status.h
@@ -0,0 +1,83 @@
+/* status.h
+ *
+ * This include file contains the status codes returned from the
+ * executive directives.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_STATUS_h
+#define __RTEMS_STATUS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+/* enumerated constants */
+
+typedef enum {
+ RTEMS_SUCCESSFUL = 0, /* successful completion */
+ RTEMS_TASK_EXITTED = 1, /* returned from a thread */
+ RTEMS_MP_NOT_CONFIGURED = 2, /* multiprocessing not configured */
+ RTEMS_INVALID_NAME = 3, /* invalid object name */
+ RTEMS_INVALID_ID = 4, /* invalid object id */
+ RTEMS_TOO_MANY = 5, /* too many */
+ RTEMS_TIMEOUT = 6, /* timed out waiting */
+ RTEMS_OBJECT_WAS_DELETED = 7, /* object deleted while waiting */
+ RTEMS_INVALID_SIZE = 8, /* specified size was invalid */
+ RTEMS_INVALID_ADDRESS = 9, /* address specified is invalid */
+ RTEMS_INVALID_NUMBER = 10, /* number was invalid */
+ RTEMS_NOT_DEFINED = 11, /* item has not been initialized */
+ RTEMS_RESOURCE_IN_USE = 12, /* resources still outstanding */
+ RTEMS_UNSATISFIED = 13, /* request not satisfied */
+ RTEMS_INCORRECT_STATE = 14, /* thread is in wrong state */
+ RTEMS_ALREADY_SUSPENDED = 15, /* thread already in state */
+ RTEMS_ILLEGAL_ON_SELF = 16, /* illegal on calling thread */
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT = 17, /* illegal for remote object */
+ RTEMS_CALLED_FROM_ISR = 18, /* called from wrong environment */
+ RTEMS_INVALID_PRIORITY = 19, /* invalid thread priority */
+ RTEMS_INVALID_CLOCK = 20, /* invalid date/time */
+ RTEMS_INVALID_NODE = 21, /* invalid node id */
+ RTEMS_NOT_CONFIGURED = 22, /* directive not configured */
+ 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_NO_MEMORY = 26, /* could not get enough memory */
+ RTEMS_PROXY_BLOCKING = 27 /* internal error only */
+} rtems_status_code;
+
+#define RTEMS_STATUS_CODES_FIRST RTEMS_SUCCESSFUL
+#define RTEMS_STATUS_CODES_LAST RTEMS_PROXY_BLOCKING
+
+extern rtems_status_code _Status_Object_name_errors_to_status[];
+
+#ifdef RTEMS_API_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
+
+/*
+ * Applications are allowed to use the macros to compare status codes.
+ */
+
+#include <rtems/rtems/status.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/support.h b/c/src/exec/rtems/headers/support.h
new file mode 100644
index 0000000000..d5c9c494a0
--- /dev/null
+++ b/c/src/exec/rtems/headers/support.h
@@ -0,0 +1,99 @@
+/* support.h
+ *
+ * This include file contains information about support functions for
+ * the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_SUPPORT_h
+#define __RTEMS_RTEMS_SUPPORT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+
+/*
+ * rtems_build_name
+ *
+ * DESCRIPTION:
+ *
+ * This function returns an object name composed of the four characters
+ * C1, C2, C3, and C4.
+ *
+ * NOTE:
+ *
+ * This must be implemented as a macro for use in Configuration Tables.
+ *
+ */
+
+#define rtems_build_name( _C1, _C2, _C3, _C4 ) \
+ ( (_C1) << 24 | (_C2) << 16 | (_C3) << 8 | (_C4) )
+
+/*
+ * 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)
+#define RTEMS_MICROSECONDS_TO_TICKS(_ms) \
+ TOD_MICROSECONDS_TO_TICKS(_ms)
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/support.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/taskmp.h b/c/src/exec/rtems/headers/taskmp.h
new file mode 100644
index 0000000000..5d94e0c3c4
--- /dev/null
+++ b/c/src/exec/rtems/headers/taskmp.h
@@ -0,0 +1,167 @@
+/* taskmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the multiprocessing support in the task manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TASKS_MP_h
+#define __RTEMS_RTEMS_TASKS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/thread.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote task operations.
+ */
+
+typedef enum {
+ RTEMS_TASKS_MP_ANNOUNCE_CREATE = 0,
+ RTEMS_TASKS_MP_ANNOUNCE_DELETE = 1,
+ RTEMS_TASKS_MP_SUSPEND_REQUEST = 2,
+ RTEMS_TASKS_MP_SUSPEND_RESPONSE = 3,
+ RTEMS_TASKS_MP_RESUME_REQUEST = 4,
+ RTEMS_TASKS_MP_RESUME_RESPONSE = 5,
+ RTEMS_TASKS_MP_SET_PRIORITY_REQUEST = 6,
+ RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE = 7,
+ RTEMS_TASKS_MP_GET_NOTE_REQUEST = 8,
+ RTEMS_TASKS_MP_GET_NOTE_RESPONSE = 9,
+ RTEMS_TASKS_MP_SET_NOTE_REQUEST = 10,
+ RTEMS_TASKS_MP_SET_NOTE_RESPONSE = 11
+} RTEMS_tasks_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote task operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ RTEMS_tasks_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_task_priority the_priority;
+ unsigned32 notepad;
+ unsigned32 note;
+} RTEMS_tasks_MP_Packet;
+
+/*
+ * _RTEMS_tasks_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _RTEMS_tasks_MP_Send_process_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_name name
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_task_priority the_priority,
+ unsigned32 notepad,
+ unsigned32 note
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _RTEMS_tasks_MP_Send_response_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _RTEMS_tasks_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _RTEMS_tasks_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by RTEMS_tasks since a task
+ * cannot be deleted when segments are in use.
+ */
+
+/*
+ * _RTEMS_tasks_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*
+ * _RTEMS_tasks_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a task mp packet.
+ */
+
+RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/headers/tasks.h b/c/src/exec/rtems/headers/tasks.h
new file mode 100644
index 0000000000..56813f4f9c
--- /dev/null
+++ b/c/src/exec/rtems/headers/tasks.h
@@ -0,0 +1,421 @@
+/* tasks.h
+ *
+ * This include file contains all constants and structures associated
+ * with RTEMS tasks. This manager provides a comprehensive set of directives
+ * to create, delete, and administer tasks.
+ *
+ * Directives provided are:
+ *
+ * + create a task
+ * + get an ID of a task
+ * + start a task
+ * + restart a task
+ * + delete a task
+ * + suspend a task
+ * + resume a task
+ * + set a task's priority
+ * + change the current task's mode
+ * + get a task notepad entry
+ * + set a task notepad entry
+ * + wake up after interval
+ * + wake up when specified
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TASKS_h
+#define __RTEMS_RTEMS_TASKS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/eventset.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/status.h>
+
+/*
+ * Constant to be used as the ID of current task
+ */
+
+#define RTEMS_SELF OBJECTS_ID_OF_SELF
+
+/*
+ * This constant is passed to the rtems_task_wake_after directive as the
+ * interval when a task wishes to yield the CPU.
+ */
+
+#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
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _RTEMS_tasks_Information;
+
+/*
+ * These are used to manage the user initialization tasks.
+ */
+
+RTEMS_EXTERN rtems_initialization_tasks_table
+ *_RTEMS_tasks_User_initialization_tasks;
+RTEMS_EXTERN unsigned32 _RTEMS_tasks_Number_of_initialization_tasks;
+
+/*
+ * _RTEMS_tasks_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes all Task Manager related data structures.
+ */
+
+void _RTEMS_tasks_Manager_initialization(
+ unsigned32 maximum_tasks,
+ unsigned32 number_of_initialization_tasks,
+ rtems_initialization_tasks_table *user_tasks
+);
+
+/*
+ * rtems_task_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_create directive. The task
+ * will have the name name. The attribute_set can be used to indicate
+ * that the task will be globally accessible or utilize floating point.
+ * The task's stack will be stack_size bytes. The task will begin
+ * execution with initial_priority and initial_modes. It returns the
+ * id of the created task in ID.
+ */
+
+rtems_status_code rtems_task_create(
+ rtems_name name,
+ rtems_task_priority initial_priority,
+ unsigned32 stack_size,
+ rtems_mode initial_modes,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_task_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_ident directive.
+ * This directive returns the task ID associated with name.
+ * If more than one task is named name, then the task to
+ * which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the task named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_task_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_task_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_delete directive. The
+ * task indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_task_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_get_note
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_get_note directive. The
+ * value of the indicated notepad for the task associated with ID
+ * is returned in note.
+ */
+
+rtems_status_code rtems_task_get_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 *note
+);
+
+/*
+ * rtems_task_set_note
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_set_note directive. The
+ * value of the indicated notepad for the task associated with ID
+ * is returned in note.
+ */
+
+rtems_status_code rtems_task_set_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 note
+);
+
+/*
+ * rtems_task_mode
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_mode directive. The current
+ * values of the modes indicated by mask of the calling task are changed
+ * to that indicated in mode_set. The former mode of the task is
+ * returned in mode_set.
+ */
+
+rtems_status_code rtems_task_mode(
+ rtems_mode mode_set,
+ rtems_mode mask,
+ rtems_mode *previous_mode_set
+);
+
+/*
+ * rtems_task_restart
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_restart directive. The
+ * task associated with ID is restarted at its initial entry
+ * point with the new argument.
+ */
+
+rtems_status_code rtems_task_restart(
+ Objects_Id id,
+ unsigned32 arg
+);
+
+/*
+ * rtems_task_suspend
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_suspend directive. The
+ * SUSPENDED state is set for task associated with ID.
+ */
+
+rtems_status_code rtems_task_suspend(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_resume
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_resume Directive. The
+ * SUSPENDED state is cleared for task associated with ID.
+ */
+
+rtems_status_code rtems_task_resume(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_set_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_set_priority directive. The
+ * current priority of the task associated with ID is set to
+ * new_priority. The former priority of that task is returned
+ * in old_priority.
+ */
+
+rtems_status_code rtems_task_set_priority(
+ Objects_Id id,
+ rtems_task_priority new_priority,
+ rtems_task_priority *old_priority
+);
+
+/*
+ * rtems_task_start
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_start directive. The
+ * starting execution point of the task associated with ID is
+ * set to entry_point with the initial argument.
+ */
+
+rtems_status_code rtems_task_start(
+ Objects_Id id,
+ rtems_task_entry entry_point,
+ unsigned32 argument
+);
+
+/*
+ * rtems_task_wake_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_wake_when directive. The
+ * calling task is blocked until the current time of day is
+ * equal to that indicated by time_buffer.
+ */
+
+rtems_status_code rtems_task_wake_when(
+ rtems_time_of_day *time_buffer
+);
+
+/*
+ * rtems_task_wake_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_wake_after directive. The
+ * calling task is blocked until the indicated number of clock
+ * ticks have occurred.
+ */
+
+rtems_status_code rtems_task_wake_after(
+ rtems_interval ticks
+);
+
+/*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 );
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/tasks.inl>
+#endif
+#include <rtems/rtems/taskmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/timer.h b/c/src/exec/rtems/headers/timer.h
new file mode 100644
index 0000000000..88e4f65f70
--- /dev/null
+++ b/c/src/exec/rtems/headers/timer.h
@@ -0,0 +1,207 @@
+/* timer.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the Timer Manager. This manager provides
+ * facilities to configure, initiate, cancel, and delete timers which will
+ * fire at specified intervals of time.
+ *
+ * Directives provided are:
+ *
+ * + create a timer
+ * + get an ID of a timer
+ * + delete a timer
+ * + set a timer to fire after a number of ticks have passed
+ * + set a timer to fire when a specified date and time has been reached
+ * + reset a timer
+ * + cancel a time
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TIMER_h
+#define __RTEMS_TIMER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type details the classes to which a timer
+ * may belong.
+ */
+
+typedef enum {
+ TIMER_INTERVAL,
+ TIMER_TIME_OF_DAY,
+ TIMER_DORMANT
+} Timer_Classes;
+
+/*
+ * The following types define a pointer to a timer service routine.
+ */
+
+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
+ * this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Timer_Information;
+
+/*
+ * The following records define the control block used to manage
+ * each timer.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Watchdog_Control Ticker;
+ Timer_Classes the_class;
+} Timer_Control;
+
+/*
+ * _Timer_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+);
+
+/*
+ * rtems_timer_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_create directive. The
+ * timer will have the name name. It returns the id of the
+ * created timer in ID.
+ */
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_timer_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_ident directive.
+ * This directive returns the timer ID associated with name.
+ * If more than one timer is named name, then the timer
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_timer_cancel
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_cancel directive. It is used
+ * to stop the timer associated with ID from firing.
+ */
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+);
+
+/*
+ * rtems_timer_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_delete directive. The
+ * timer indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_timer_fire_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_fire_after directive. It
+ * initiates the timer associated with ID to fire in ticks clock
+ * ticks. When the timer fires, the routine will be invoked.
+ */
+
+rtems_status_code rtems_timer_fire_after(
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
+ * rtems_timer_fire_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_fire_when directive. It
+ * initiates the timer associated with ID to fire at wall_time
+ * When the timer fires, the routine will be invoked.
+ */
+
+rtems_status_code rtems_timer_fire_when(
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
+ * rtems_timer_reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_reset directive. It is used
+ * to reinitialize the interval timer associated with ID just as if
+ * rtems_timer_fire_after were re-invoked with the same arguments that
+ * were used to initiate this timer.
+ */
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/timer.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/headers/types.h b/c/src/exec/rtems/headers/types.h
new file mode 100644
index 0000000000..a0004fbb8a
--- /dev/null
+++ b/c/src/exec/rtems/headers/types.h
@@ -0,0 +1,96 @@
+/* types.h
+ *
+ * This include file defines the types used by the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TYPES_h
+#define __RTEMS_RTEMS_TYPES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+
+/*
+ * RTEMS basic type definitions
+ */
+
+typedef unsigned8 rtems_unsigned8; /* unsigned 8-bit value */
+typedef unsigned16 rtems_unsigned16; /* unsigned 16-bit value */
+typedef unsigned32 rtems_unsigned32; /* unsigned 32-bit value */
+
+typedef signed8 rtems_signed8; /* signed 8-bit value */
+typedef signed16 rtems_signed16; /* signed 16-bit value */
+typedef signed32 rtems_signed32; /* signed 32-bit value */
+
+/*
+ * some C++ compilers (eg: HP's) don't do 'long long'
+ */
+#if defined(__GNUC__)
+typedef unsigned64 rtems_unsigned64; /* unsigned 64-bit value */
+typedef signed64 rtems_signed64; /* signed 64-bit value */
+#endif
+
+typedef single_precision rtems_single; /* single precision float */
+typedef double_precision rtems_double; /* double precision float */
+
+typedef boolean rtems_boolean;
+
+typedef unsigned32 rtems_name;
+typedef Objects_Id rtems_id;
+
+typedef Context_Control rtems_context;
+typedef Context_Control_fp rtems_context_fp;
+typedef CPU_Interrupt_frame rtems_interrupt_frame;
+
+/*
+ * Time related
+ */
+
+typedef Watchdog_Interval rtems_interval;
+typedef TOD_Control rtems_time_of_day;
+
+/*
+ * 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
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems.h b/c/src/exec/rtems/include/rtems.h
new file mode 100644
index 0000000000..b78eec9b6b
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems.h
@@ -0,0 +1,121 @@
+/* rtems.h
+ *
+ * This include file contains information about RTEMS executive that
+ * is required by the application and is CPU independent. It includes
+ * two (2) CPU dependent files to tailor its data structures for a
+ * particular processor.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_GENERIC_h
+#define __RTEMS_RTEMS_GENERIC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Unless told otherwise, the RTEMS include files will hide some stuff
+ * from normal application code. Defining this crosses a boundary which
+ * is undesirable since it means your application is using RTEMS features
+ * which are not included in the formally defined and supported API.
+ * Define this at your own risk.
+ */
+
+#ifndef __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#define __RTEMS_APPLICATION__
+#endif
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+
+#include <rtems/config.h>
+#include <rtems/init.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/extension.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/rtems/ratemon.h>
+#include <rtems/rtems/mp.h>
+
+#include <rtems/rtems/support.h>
+#include <rtems/score/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(class, node) OBJECTS_ID_INITIAL(class, 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
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/Makefile.in b/c/src/exec/rtems/include/rtems/rtems/Makefile.in
new file mode 100644
index 0000000000..b7b0f463c5
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/Makefile.in
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES=asr attr clock config dpmem event eventmp eventset \
+ intr message modes mp msgmp options part partmp \
+ ratemon region regionmp rtemsapi sem semmp signal signalmp status \
+ support taskmp tasks timer types
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed externally
+EXTERNAL_H_PIECES = rtems
+EXTERNAL_H_FILES=$(EXTERNAL_H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES) $(EXTERNAL_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/rtems
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/exec/rtems/include/rtems/rtems/asr.h b/c/src/exec/rtems/include/rtems/rtems/asr.h
new file mode 100644
index 0000000000..9631f93d40
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/asr.h
@@ -0,0 +1,112 @@
+/* asr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Asynchronous Signal Handler. This Handler provides the low-level
+ * support required by the Signal Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ASR_h
+#define __RTEMS_ASR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/modes.h>
+
+/*
+ *
+ * The following type defines the control block used to manage
+ * each signal set.
+ */
+
+typedef unsigned32 rtems_signal_set;
+
+/*
+ * Return type for ASR Handler
+ */
+
+typedef void rtems_asr;
+
+/*
+ * The following type corresponds to the applications asynchronous
+ * signal processing routine.
+ */
+
+typedef rtems_asr ( *rtems_asr_entry )(
+ rtems_signal_set
+ );
+
+/*
+ *
+ * The following defines the control structure used to manage
+ * signals. Each thread has a copy of this record.
+ */
+
+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 */
+ rtems_signal_set signals_pending; /* pending signal set */
+ unsigned32 nest_level; /* nest level of RTEMS_ASR */
+} ASR_Information;
+
+/*
+ * The following constants define the individual signals which may
+ * be used to compose a signal set.
+ */
+
+#define RTEMS_SIGNAL_0 0x00000001
+#define RTEMS_SIGNAL_1 0x00000002
+#define RTEMS_SIGNAL_2 0x00000004
+#define RTEMS_SIGNAL_3 0x00000008
+#define RTEMS_SIGNAL_4 0x00000010
+#define RTEMS_SIGNAL_5 0x00000020
+#define RTEMS_SIGNAL_6 0x00000040
+#define RTEMS_SIGNAL_7 0x00000080
+#define RTEMS_SIGNAL_8 0x00000100
+#define RTEMS_SIGNAL_9 0x00000200
+#define RTEMS_SIGNAL_10 0x00000400
+#define RTEMS_SIGNAL_11 0x00000800
+#define RTEMS_SIGNAL_12 0x00001000
+#define RTEMS_SIGNAL_13 0x00002000
+#define RTEMS_SIGNAL_14 0x00004000
+#define RTEMS_SIGNAL_15 0x00008000
+#define RTEMS_SIGNAL_16 0x00010000
+#define RTEMS_SIGNAL_17 0x00020000
+#define RTEMS_SIGNAL_18 0x00040000
+#define RTEMS_SIGNAL_19 0x00080000
+#define RTEMS_SIGNAL_20 0x00100000
+#define RTEMS_SIGNAL_21 0x00200000
+#define RTEMS_SIGNAL_22 0x00400000
+#define RTEMS_SIGNAL_23 0x00800000
+#define RTEMS_SIGNAL_24 0x01000000
+#define RTEMS_SIGNAL_25 0x02000000
+#define RTEMS_SIGNAL_26 0x04000000
+#define RTEMS_SIGNAL_27 0x08000000
+#define RTEMS_SIGNAL_28 0x10000000
+#define RTEMS_SIGNAL_29 0x20000000
+#define RTEMS_SIGNAL_30 0x40000000
+#define RTEMS_SIGNAL_31 0x80000000
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/asr.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/attr.h b/c/src/exec/rtems/include/rtems/rtems/attr.h
new file mode 100644
index 0000000000..cada11dbad
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/attr.h
@@ -0,0 +1,84 @@
+/* attr.h
+ *
+ * This include file contains all information about the Object Attributes
+ * Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ATTRIBUTES_h
+#define __RTEMS_ATTRIBUTES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+typedef unsigned32 rtems_attribute;
+
+/* constants */
+
+#define RTEMS_DEFAULT_ATTRIBUTES 0x00000000
+
+#define RTEMS_NO_FLOATING_POINT 0x00000000 /* don't use FP HW */
+#define RTEMS_FLOATING_POINT 0x00000001 /* utilize coprocessor */
+
+#define RTEMS_LOCAL 0x00000000 /* local resource */
+#define RTEMS_GLOBAL 0x00000002 /* global resource */
+
+#define RTEMS_FIFO 0x00000000 /* process RTEMS_FIFO */
+#define RTEMS_PRIORITY 0x00000004 /* process by priority */
+
+#define RTEMS_COUNTING_SEMAPHORE 0x00000000
+#define RTEMS_BINARY_SEMAPHORE 0x00000010
+
+#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
+#define ATTRIBUTES_NOT_SUPPORTED RTEMS_FLOATING_POINT
+#endif
+
+#if ( CPU_ALL_TASKS_ARE_FP == TRUE )
+#define ATTRIBUTES_REQUIRED RTEMS_FLOATING_POINT
+#else
+#define ATTRIBUTES_REQUIRED 0
+#endif
+
+/*
+ * _Attributes_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs initialization for this handler.
+ *
+ * NOTE: There is no initialization required in C. Conditional compilation
+ * takes care of this in C.
+ */
+
+#define _Attributes_Handler_initialization()
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/attr.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/clock.h b/c/src/exec/rtems/include/rtems/rtems/clock.h
new file mode 100644
index 0000000000..6bdc06483d
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/clock.h
@@ -0,0 +1,103 @@
+/* clock.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Clock Manager. This manager provides facilities to set, obtain,
+ * and continually update the current date and time.
+ *
+ * This manager provides directives to:
+ *
+ * + set the current date and time
+ * + obtain the current date and time
+ * + announce a clock tick
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CLOCK_h
+#define __RTEMS_CLOCK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/tod.h>
+#include <rtems/rtems/types.h>
+
+/*
+ * List of things which can be returned by the rtems_clock_get directive.
+ */
+
+typedef enum {
+ RTEMS_CLOCK_GET_TOD,
+ RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH,
+ RTEMS_CLOCK_GET_TICKS_SINCE_BOOT,
+ RTEMS_CLOCK_GET_TICKS_PER_SECOND,
+ RTEMS_CLOCK_GET_TIME_VALUE
+} rtems_clock_get_options;
+
+/*
+ * Standard flavor style to return TOD in for a rtems_clock_get option.
+ */
+
+typedef struct {
+ unsigned32 seconds;
+ unsigned32 microseconds;
+} rtems_clock_time_value;
+
+/*
+ * rtems_clock_get
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_get directive. It returns
+ * one of the following:
+ * + current time of day
+ * + seconds since epoch
+ * + ticks since boot
+ * + ticks per second
+ */
+
+rtems_status_code rtems_clock_get(
+ rtems_clock_get_options option,
+ void *time_buffer
+);
+
+/*
+ * rtems_clock_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_set directive. It sets
+ * the current time of day to that in the time_buffer record.
+ */
+
+rtems_status_code rtems_clock_set(
+ rtems_time_of_day *time_buffer
+);
+
+/*
+ * rtems_clock_tick
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_tick directive. It is invoked
+ * to inform RTEMS of the occurrence of a clock tick.
+ */
+
+rtems_status_code rtems_clock_tick( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/config.h b/c/src/exec/rtems/include/rtems/rtems/config.h
new file mode 100644
index 0000000000..0bdf3c974b
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/config.h
@@ -0,0 +1,54 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters specific for the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_CONFIGURATION_h
+#define __RTEMS_RTEMS_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/tasks.h>
+
+/*
+ * The following records define the Configuration Table. The
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + required number of each object type
+ */
+
+typedef struct {
+ unsigned32 maximum_tasks;
+ unsigned32 maximum_timers;
+ unsigned32 maximum_semaphores;
+ unsigned32 maximum_message_queues;
+ unsigned32 maximum_partitions;
+ unsigned32 maximum_regions;
+ unsigned32 maximum_ports;
+ unsigned32 maximum_periods;
+ unsigned32 number_of_initialization_tasks;
+ rtems_initialization_tasks_table *User_initialization_tasks_table;
+} rtems_api_configuration_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/dpmem.h b/c/src/exec/rtems/include/rtems/rtems/dpmem.h
new file mode 100644
index 0000000000..0405e800a8
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/dpmem.h
@@ -0,0 +1,157 @@
+/* dpmem.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Dual Ported Memory Manager. This manager provides a mechanism
+ * for converting addresses between internal and external representations
+ * for multiple dual-ported memory areas.
+ *
+ * Directives provided are:
+ *
+ * + create a port
+ * + get ID of a port
+ * + delete a port
+ * + convert external to internal address
+ * + convert internal to external address
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DUAL_PORTED_MEMORY_h
+#define __RTEMS_DUAL_PORTED_MEMORY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+
+/*
+ * The following structure defines the port control block. Each port
+ * has a control block associated with it. This control block contains
+ * all information required to support the port related operations.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ void *internal_base; /* base internal address */
+ void *external_base; /* base external address */
+ unsigned32 length; /* length of dual-ported area */
+} Dual_ported_memory_Control;
+
+/*
+ * The following define the internal Dual Ported Memory information.
+ */
+
+RTEMS_EXTERN Objects_Information _Dual_ported_memory_Information;
+
+/*
+ * _Dual_ported_memory_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Dual_ported_memory_Manager_initialization(
+ unsigned32 maximum_ports
+);
+
+/*
+ * rtems_port_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_create directive. The port
+ * will have the name name. The port maps onto an area of dual ported
+ * memory of length bytes which has internal_start and external_start
+ * as the internal and external starting addresses, respectively.
+ * It returns the id of the created port in ID.
+ */
+
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ unsigned32 length,
+ Objects_Id *id
+);
+
+/*
+ * rtems_port_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_ident directive. This directive
+ * returns the port ID associated with name. If more than one port is
+ * named name, then the port to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_port_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_delete directive. It deletes
+ * the port associated with ID.
+ */
+
+rtems_status_code rtems_port_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_port_external_to_internal
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_external_to_internal directive.
+ * It returns the internal port address which maps to the provided
+ * external port address for the specified port ID.
+ */
+
+rtems_status_code rtems_port_external_to_internal(
+ Objects_Id id,
+ void *external,
+ void **internal
+);
+
+/*
+ * rtems_port_internal_to_external
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the Port_internal_to_external directive.
+ * It returns the external port address which maps to the provided
+ * internal port address for the specified port ID.
+ */
+
+rtems_status_code rtems_port_internal_to_external(
+ Objects_Id id,
+ void *internal,
+ void **external
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/dpmem.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/event.h b/c/src/exec/rtems/include/rtems/rtems/event.h
new file mode 100644
index 0000000000..42f6b89e89
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/event.h
@@ -0,0 +1,174 @@
+/* event.h
+ *
+ * This include file contains the information pertaining to the Event
+ * Manager. This manager provides a high performance method of communication
+ * and synchronization.
+ *
+ * Directives provided are:
+ *
+ * + send an event set to a task
+ * + receive event condition
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_h
+#define __RTEMS_EVENT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/eventset.h>
+
+/*
+ * This constant is passed as the event_in to the
+ * rtems_event_receive directive to determine which events are pending.
+ */
+
+#define EVENT_CURRENT 0
+
+/*
+ * The following enumerated types indicate what happened while the event
+ * manager was in the synchronization window.
+ */
+
+typedef enum {
+ EVENT_SYNC_SYNCHRONIZED,
+ EVENT_SYNC_NOTHING_HAPPENED,
+ EVENT_SYNC_TIMEOUT,
+ EVENT_SYNC_SATISFIED
+} Event_Sync_states;
+
+/*
+ * Event_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Event_Manager_initialization( void );
+
+/*
+ * rtems_event_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_event_send directive. It sends
+ * event_in to the task specified by ID. If the task is blocked
+ * waiting to receive events and the posting of event_in satisfies
+ * the task's event condition, then it is unblocked.
+ */
+
+rtems_status_code rtems_event_send (
+ Objects_Id id,
+ rtems_event_set event_in
+);
+
+/*
+ * rtems_event_receive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_event_receive directive. This
+ * directive is invoked when the calling task wishes to receive
+ * the event_in event condition. One of the fields in the option_set
+ * parameter determines whether the receive request is satisfied if
+ * any or all of the events are pending. If the event condition
+ * is not satisfied immediately, then the task may block with an
+ * optional timeout of TICKS clock ticks or return immediately.
+ * This determination is based on another field in the option_set
+ * parameter. This directive returns the events received in the
+ * event_out parameter.
+ */
+
+rtems_status_code rtems_event_receive (
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+);
+
+/*
+ * _Event_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine determines if the event condition event_in is
+ * satisfied. If so or if the no_wait option is enabled in option_set,
+ * then the procedure returns immediately. If neither of these
+ * conditions is true, then the calling task is blocked with an
+ * optional timeout of ticks clock ticks.
+ */
+
+void _Event_Seize (
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+);
+
+/*
+ * _Event_Surrender
+ *
+ * DESCRIPTION:
+ *
+ * This routine determines if the event condition of the_thread
+ * has been satisfied. If so, it unblocks the_thread.
+ */
+
+void _Event_Surrender (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Event_Timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task's event receive request
+ * has not been satisfied after the specified timeout interval.
+ * The task represented by ID will be unblocked and its status
+ * code will be set in it's control block to indicate that a timeout
+ * has occurred.
+ */
+
+void _Event_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * The following defines the synchronization flag used by the
+ * Event Manager to insure that signals sent to the currently
+ * executing thread are received properly.
+ */
+
+RTEMS_EXTERN volatile Event_Sync_states _Event_Sync_state;
+
+#include <rtems/rtems/eventmp.h>
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/event.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/eventmp.h b/c/src/exec/rtems/include/rtems/rtems/eventmp.h
new file mode 100644
index 0000000000..f934f20a4e
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/eventmp.h
@@ -0,0 +1,147 @@
+/* eventmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_MP_h
+#define __RTEMS_EVENT_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/event.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote event operations.
+ */
+
+typedef enum {
+ EVENT_MP_SEND_REQUEST = 0,
+ EVENT_MP_SEND_RESPONSE = 1
+} Event_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote event operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Event_MP_Remote_operations operation;
+ rtems_event_set event_in;
+} Event_MP_Packet;
+
+/*
+ * _Event_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ *
+ * This routine is not needed since there are no process
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _Event_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Event_MP_Send_request_packet (
+ Event_MP_Remote_operations operation,
+ Objects_Id event_id,
+ rtems_event_set event_in
+);
+
+/*
+ * _Event_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Event_MP_Send_response_packet (
+ Event_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Event_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Event_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Event_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Event_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Event_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a event mp packet.
+ */
+
+Event_MP_Packet *_Event_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/eventset.h b/c/src/exec/rtems/include/rtems/rtems/eventset.h
new file mode 100644
index 0000000000..a85254b3de
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/eventset.h
@@ -0,0 +1,89 @@
+/* eventset.h
+ *
+ * This include file contains the information pertaining to the
+ * Event Sets Handler. This handler provides methods for the manipulation
+ * of event sets which will be sent and received by tasks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_SET_h
+#define __RTEMS_EVENT_SET_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following defines the type used to control event sets.
+ */
+
+typedef unsigned32 rtems_event_set;
+
+/*
+ * The following constants define the individual events which may
+ * be used to compose an event set.
+ */
+
+#define RTEMS_PENDING_EVENTS 0 /* receive pending events */
+#define RTEMS_ALL_EVENTS 0xFFFFFFFF
+
+#define RTEMS_EVENT_0 0x00000001
+#define RTEMS_EVENT_1 0x00000002
+#define RTEMS_EVENT_2 0x00000004
+#define RTEMS_EVENT_3 0x00000008
+#define RTEMS_EVENT_4 0x00000010
+#define RTEMS_EVENT_5 0x00000020
+#define RTEMS_EVENT_6 0x00000040
+#define RTEMS_EVENT_7 0x00000080
+#define RTEMS_EVENT_8 0x00000100
+#define RTEMS_EVENT_9 0x00000200
+#define RTEMS_EVENT_10 0x00000400
+#define RTEMS_EVENT_11 0x00000800
+#define RTEMS_EVENT_12 0x00001000
+#define RTEMS_EVENT_13 0x00002000
+#define RTEMS_EVENT_14 0x00004000
+#define RTEMS_EVENT_15 0x00008000
+#define RTEMS_EVENT_16 0x00010000
+#define RTEMS_EVENT_17 0x00020000
+#define RTEMS_EVENT_18 0x00040000
+#define RTEMS_EVENT_19 0x00080000
+#define RTEMS_EVENT_20 0x00100000
+#define RTEMS_EVENT_21 0x00200000
+#define RTEMS_EVENT_22 0x00400000
+#define RTEMS_EVENT_23 0x00800000
+#define RTEMS_EVENT_24 0x01000000
+#define RTEMS_EVENT_25 0x02000000
+#define RTEMS_EVENT_26 0x04000000
+#define RTEMS_EVENT_27 0x08000000
+#define RTEMS_EVENT_28 0x10000000
+#define RTEMS_EVENT_29 0x20000000
+#define RTEMS_EVENT_30 0x40000000
+#define RTEMS_EVENT_31 0x80000000
+
+
+/*
+ * The following constant is the value of an event set which
+ * has no events pending.
+ */
+
+#define EVENT_SETS_NONE_PENDING 0
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/eventset.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/intr.h b/c/src/exec/rtems/include/rtems/rtems/intr.h
new file mode 100644
index 0000000000..09697a93d6
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/intr.h
@@ -0,0 +1,160 @@
+/* intr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Interrupt Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_INTERRUPT_h
+#define __RTEMS_INTERRUPT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+
+/*
+ * Interrupt level type
+ */
+
+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:
+ *
+ * This routine initializes the interrupt manager.
+ *
+ */
+
+void _Interrupt_Manager_initialization( void );
+
+/*
+ * rtems_interrupt_catch
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_interrupt_catch directive. This
+ * directive installs new_isr_handler as the RTEMS interrupt service
+ * routine for vector. The previous RTEMS interrupt service
+ * routine is returned in old_isr_handler.
+ */
+
+rtems_status_code rtems_interrupt_catch(
+ rtems_isr_entry new_isr_handler,
+ rtems_vector_number vector,
+ rtems_isr_entry *old_isr_handler
+);
+
+/*
+ * rtems_interrupt_disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables all maskable interrupts and returns the
+ * previous level in _isr_cookie.
+ */
+
+#define rtems_interrupt_disable( _isr_cookie ) \
+ _ISR_Disable(_isr_cookie)
+
+/*
+ * rtems_interrupt_enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables maskable interrupts to the level indicated
+ * _isr_cookie.
+ */
+
+#define rtems_interrupt_enable( _isr_cookie ) \
+ _ISR_Enable(_isr_cookie)
+
+/*
+ * rtems_interrupt_flash
+ *
+ * DESCRIPTION:
+ *
+ * This routine temporarily enables maskable interrupts to the
+ * level in _isr_cookie before redisabling them.
+ */
+
+#define rtems_interrupt_flash( _isr_cookie ) \
+ _ISR_Flash(_isr_cookie)
+
+/*
+ * rtems_interrupt_is_in_progress
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the processor is currently servicing
+ * and interrupt and FALSE otherwise. A return value of TRUE indicates
+ * that the caller is an interrupt service routine, NOT a thread. The
+ * directives available to an interrupt service routine are restricted.
+ */
+
+#define rtems_interrupt_is_in_progress() \
+ _ISR_Is_in_progress()
+
+/*
+ * rtems_interrupt_cause
+ *
+ * DESCRIPTION:
+ *
+ * This routine generates an interrupt.
+ *
+ * NOTE: No implementation.
+ */
+
+#define rtems_interrupt_cause( _interrupt_to_cause )
+
+/*
+ * rtems_interrupt_cause
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the specified interrupt.
+ *
+ * NOTE: No implementation.
+ */
+
+#define rtems_interrupt_clear( _interrupt_to_clear )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/message.h b/c/src/exec/rtems/include/rtems/rtems/message.h
new file mode 100644
index 0000000000..f819b7cfa2
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/message.h
@@ -0,0 +1,317 @@
+/* message.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Message Queue Manager. This manager provides a mechanism for
+ * communication and synchronization between tasks using messages.
+ *
+ * Directives provided are:
+ *
+ * + create a queue
+ * + get ID of a queue
+ * + delete a queue
+ * + put a message at the rear of a queue
+ * + put a message at the front of a queue
+ * + broadcast N messages to a queue
+ * + receive message from a queue
+ * + flush all messages on a queue
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MESSAGE_QUEUE_h
+#define __RTEMS_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/coremsg.h>
+
+/*
+ * The following enumerated type details the modes in which a message
+ * may be submitted to a message queue. The message may be posted
+ * in a send or urgent fashion.
+ */
+
+typedef enum {
+ MESSAGE_QUEUE_SEND_REQUEST = 0,
+ MESSAGE_QUEUE_URGENT_REQUEST = 1
+} Message_queue_Submit_types;
+
+/*
+ * The following records define the control block used to manage
+ * each message queue.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ rtems_attribute attribute_set;
+ CORE_message_queue_Control message_queue;
+} Message_queue_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Message_queue_Information;
+
+/*
+ * _Message_queue_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+);
+
+/*
+ * rtems_message_queue_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_create directive. The
+ * message queue will have the name name. If the attribute_set indicates
+ * that the message queue is to be limited in the number of messages
+ * that can be outstanding, then count indicates the maximum number of
+ * messages that will be held. It returns the id of the created
+ * message queue in ID.
+ */
+
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ unsigned32 count,
+ unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_message_queue_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_ident directive.
+ * This directive returns the message queue ID associated with NAME.
+ * If more than one message queue is named name, then the message
+ * queue to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the message queue named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_message_queue_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_delete directive. The
+ * message queue indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_message_queue_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_message_queue_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_send(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+);
+
+/*
+ * rtems_message_queue_urgent
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_urgent(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+);
+
+/*
+ * rtems_message_queue_broadcast
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_broadcast(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ unsigned32 *count
+);
+
+/*
+ * rtems_message_queue_receive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_receive directive.
+ * This directive is invoked when the calling task wishes to receive
+ * a message from the message queue indicated by ID. The received
+ * message is to be placed in buffer. If no messages are outstanding
+ * and the option_set indicates that the task is willing to block,
+ * then the task will be blocked until a message arrives or until,
+ * optionally, timeout clock ticks have passed.
+ */
+
+rtems_status_code rtems_message_queue_receive(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ unsigned32 option_set,
+ rtems_interval timeout
+);
+
+/*
+ * rtems_message_queue_flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_flush directive.
+ * This directive takes all outstanding messages for the message
+ * queue indicated by ID and returns them to the inactive message
+ * chain. The number of messages flushed is returned in COUNT.
+ */
+
+rtems_status_code rtems_message_queue_flush(
+ Objects_Id id,
+ unsigned32 *count
+);
+
+/*
+ * _Message_queue_Submit
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the directives rtems_message_queue_send
+ * and rtems_message_queue_urgent. It processes a message that is
+ * to be submitted to the designated message queue. The message will
+ * either be processed as a send send message which it will be inserted
+ * at the rear of the queue or it will be processed as an urgent message
+ * which will be inserted at the front of the queue.
+ */
+
+rtems_status_code _Message_queue_Submit(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ Message_queue_Submit_types submit_type
+);
+
+/*
+ * _Message_queue_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message queue control block from
+ * the inactive chain of free message queue control blocks.
+ */
+
+Message_queue_Control *_Message_queue_Allocate (
+ unsigned32 count,
+ unsigned32 max_message_size
+);
+
+/*
+ * _Message_queue_Translate_core_message_queue_return_code
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a RTEMS status code based on the core message queue
+ * status code specified.
+ */
+
+rtems_status_code _Message_queue_Translate_core_message_queue_return_code (
+ unsigned32 the_message_queue_status
+);
+
+/*
+ *
+ * _Message_queue_Core_message_queue_mp_support
+ *
+ * Input parameters:
+ * the_thread - the remote thread the message was submitted to
+ * id - id of the message queue
+ *
+ * Output parameters: NONE
+ */
+
+void _Message_queue_Core_message_queue_mp_support (
+ Thread_Control *the_thread,
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/message.inl>
+#endif
+#include <rtems/rtems/msgmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/modes.h b/c/src/exec/rtems/include/rtems/rtems/modes.h
new file mode 100644
index 0000000000..90327636c1
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/modes.h
@@ -0,0 +1,89 @@
+/* modes.h
+ *
+ * This include file contains all constants and structures associated
+ * with the RTEMS thread and RTEMS_ASR modes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MODES_h
+#define __RTEMS_MODES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+
+/*
+ * The following type defines the control block used to manage
+ * each a mode set.
+ */
+
+typedef unsigned32 Modes_Control;
+
+/*
+ * The following constants define the individual modes and masks
+ * which may be used to compose a mode set and to alter modes.
+ */
+
+#define RTEMS_ALL_MODE_MASKS 0x0000ffff
+
+#define RTEMS_DEFAULT_MODES 0x00000000
+#define RTEMS_CURRENT_MODE 0
+
+#define RTEMS_PREEMPT_MASK 0x00000100 /* preemption bit */
+#define RTEMS_TIMESLICE_MASK 0x00000200 /* timeslice bit */
+#define RTEMS_ASR_MASK 0x00000400 /* RTEMS_ASR enable bit */
+#define RTEMS_INTERRUPT_MASK CPU_MODES_INTERRUPT_MASK
+
+#define RTEMS_PREEMPT 0x00000000 /* enable preemption */
+#define RTEMS_NO_PREEMPT 0x00000100 /* disable preemption */
+
+#define RTEMS_NO_TIMESLICE 0x00000000 /* disable timeslicing */
+#define RTEMS_TIMESLICE 0x00000200 /* enable timeslicing */
+
+#define RTEMS_ASR 0x00000000 /* enable RTEMS_ASR */
+#define RTEMS_NO_ASR 0x00000400 /* disable RTEMS_ASR */
+
+/*
+ * The number of bits for interrupt levels is CPU dependent.
+ * RTEMS supports 0 to 256 levels in bits 0-7 of the mode.
+ */
+
+/*PAGE
+ *
+ * RTEMS_INTERRUPT_LEVEL
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the processor dependent interrupt
+ * level which corresponds to the requested interrupt level.
+ *
+ * NOTE: RTEMS supports 256 interrupt levels using the least
+ * significant eight bits of MODES.CONTROL. On any
+ * particular CPU, fewer than 256 levels may be supported.
+ */
+
+#define RTEMS_INTERRUPT_LEVEL( _mode_set ) \
+ ( (_mode_set) & RTEMS_INTERRUPT_MASK )
+
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/modes.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/mp.h b/c/src/exec/rtems/include/rtems/rtems/mp.h
new file mode 100644
index 0000000000..0fabd202aa
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/mp.h
@@ -0,0 +1,53 @@
+/* mp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MP_h
+#define __RTEMS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ *
+ * _Multiprocessing_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Multiprocessing_Manager_initialization ( void );
+
+/*
+ *
+ * rtems_multiprocessing_announce
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the MULTIPROCESSING_ANNOUNCE directive.
+ * It is invoked by the MPCI layer to indicate that an MPCI packet
+ * has been received.
+ */
+
+void rtems_multiprocessing_announce ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/msgmp.h b/c/src/exec/rtems/include/rtems/rtems/msgmp.h
new file mode 100644
index 0000000000..c640aad0cd
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/msgmp.h
@@ -0,0 +1,175 @@
+/* msgmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MESSAGE_QUEUE_MP_h
+#define __RTEMS_MESSAGE_QUEUE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/message.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote message queue operations.
+ */
+
+typedef enum {
+ MESSAGE_QUEUE_MP_ANNOUNCE_CREATE = 0,
+ MESSAGE_QUEUE_MP_ANNOUNCE_DELETE = 1,
+ MESSAGE_QUEUE_MP_EXTRACT_PROXY = 2,
+ MESSAGE_QUEUE_MP_RECEIVE_REQUEST = 3,
+ MESSAGE_QUEUE_MP_RECEIVE_RESPONSE = 4,
+ MESSAGE_QUEUE_MP_SEND_REQUEST = 5,
+ MESSAGE_QUEUE_MP_SEND_RESPONSE = 6,
+ MESSAGE_QUEUE_MP_URGENT_REQUEST = 7,
+ MESSAGE_QUEUE_MP_URGENT_RESPONSE = 8,
+ MESSAGE_QUEUE_MP_BROADCAST_REQUEST = 9,
+ MESSAGE_QUEUE_MP_BROADCAST_RESPONSE = 10,
+ MESSAGE_QUEUE_MP_FLUSH_REQUEST = 11,
+ MESSAGE_QUEUE_MP_FLUSH_RESPONSE = 12
+} Message_queue_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote message queue operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Message_queue_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ Objects_Id proxy_id;
+ unsigned32 count;
+ unsigned32 size;
+ unsigned32 pad0;
+ CORE_message_queue_Buffer Buffer;
+} Message_queue_MP_Packet;
+
+/*
+ * _Message_queue_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Message_queue_MP_Send_process_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Message_queue_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Message_queue_MP_Send_request_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ void *buffer,
+ unsigned32 *size_p,
+ rtems_option option_set,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Message_queue_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Message_queue_MP_Send_response_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Message_queue_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Message_queue_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Message_queue_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _Message_queue_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Message_queue_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a message queue mp packet.
+ */
+
+Message_queue_MP_Packet *_Message_queue_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/options.h b/c/src/exec/rtems/include/rtems/rtems/options.h
new file mode 100644
index 0000000000..79ebcf9fc2
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/options.h
@@ -0,0 +1,53 @@
+/* options.h
+ *
+ * This include file contains information which defines the
+ * options available on many directives.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_OPTIONS_h
+#define __RTEMS_OPTIONS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * option sets.
+ */
+
+typedef unsigned32 rtems_option;
+
+/*
+ * The following constants define the individual options which may
+ * be used to compose an option set.
+ */
+
+#define RTEMS_DEFAULT_OPTIONS 0x00000000
+
+#define RTEMS_WAIT 0x00000000 /* wait on resource */
+#define RTEMS_NO_WAIT 0x00000001 /* do not wait on resource */
+
+#define RTEMS_EVENT_ALL 0x00000000 /* wait for all events */
+#define RTEMS_EVENT_ANY 0x00000002 /* wait on any event */
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/options.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/part.h b/c/src/exec/rtems/include/rtems/rtems/part.h
new file mode 100644
index 0000000000..eda5649f70
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/part.h
@@ -0,0 +1,168 @@
+/* partition.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Partition Manager. This manager provides facilities to
+ * dynamically allocate memory in fixed-sized units which are returned
+ * as buffers.
+ *
+ * Directives provided are:
+ *
+ * + create a partition
+ * + get an ID of a partition
+ * + delete a partition
+ * + get a buffer from a partition
+ * + return a buffer to a partition
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_PARTITION_h
+#define __RTEMS_PARTITION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/types.h>
+
+/*
+ * The following defines the control block used to manage each partition.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ void *starting_address; /* physical address */
+ unsigned32 length; /* in bytes */
+ unsigned32 buffer_size; /* in bytes */
+ rtems_attribute attribute_set; /* attributes */
+ unsigned32 number_of_used_blocks; /* or allocated buffers */
+ Chain_Control Memory; /* buffer chain */
+} Partition_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Partition_Information;
+
+/*
+ * _Partition_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Partition_Manager_initialization(
+ unsigned32 maximum_partitions
+);
+
+/*
+ * rtems_partition_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_create directive. The
+ * partition will have the name name. The memory area managed by
+ * the partition is of length bytes and starts at starting_address.
+ * The memory area will be divided into as many buffers of
+ * buffer_size bytes as possible. The attribute_set determines if
+ * the partition is global or local. It returns the id of the
+ * created partition in ID.
+ */
+
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_partition_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_ident directive.
+ * This directive returns the partition ID associated with name.
+ * If more than one partition is named name, then the partition
+ * to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the partition named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_partition_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_delete directive. The
+ * partition indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_partition_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_partition_get_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_get_buffer directive. It
+ * attempts to allocate a buffer from the partition associated with ID.
+ * If a buffer is allocated, its address is returned in buffer.
+ */
+
+rtems_status_code rtems_partition_get_buffer(
+ Objects_Id id,
+ void **buffer
+);
+
+/*
+ * rtems_partition_return_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_return_buffer directive. It
+ * frees the buffer to the partition associated with ID. The buffer must
+ * have been previously allocated from the same partition.
+ */
+
+rtems_status_code rtems_partition_return_buffer(
+ Objects_Id id,
+ void *buffer
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/part.inl>
+#endif
+#include <rtems/rtems/partmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/partmp.h b/c/src/exec/rtems/include/rtems/rtems/partmp.h
new file mode 100644
index 0000000000..19bc2c7d61
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/partmp.h
@@ -0,0 +1,161 @@
+/* partmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_PARTITION_MP_h
+#define __RTEMS_PARTITION_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+
+#include <rtems/rtems/part.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote partition operations.
+ */
+
+typedef enum {
+ PARTITION_MP_ANNOUNCE_CREATE = 0,
+ PARTITION_MP_ANNOUNCE_DELETE = 1,
+ PARTITION_MP_EXTRACT_PROXY = 2,
+ PARTITION_MP_GET_BUFFER_REQUEST = 3,
+ PARTITION_MP_GET_BUFFER_RESPONSE = 4,
+ PARTITION_MP_RETURN_BUFFER_REQUEST = 5,
+ PARTITION_MP_RETURN_BUFFER_RESPONSE = 6
+} Partition_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote partition operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Partition_MP_Remote_operations operation;
+ rtems_name name;
+ void *buffer;
+ Objects_Id proxy_id;
+} Partition_MP_Packet;
+
+/*
+ * _Partition_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Partition_MP_Send_process_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Partition_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Partition_MP_Send_request_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ void *buffer
+);
+
+/*
+ * _Partition_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Partition_MP_Send_response_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Partition_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Partition_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Partition_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by the Partition since a partition
+ * cannot be deleted when buffers are in use.
+ */
+
+/*
+ * _Partition_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Partition_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Partition_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a partition mp packet.
+ */
+
+Partition_MP_Packet *_Partition_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/ratemon.h b/c/src/exec/rtems/include/rtems/rtems/ratemon.h
new file mode 100644
index 0000000000..251bb88dac
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/ratemon.h
@@ -0,0 +1,213 @@
+/* ratemon.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the Rate Monotonic Manager. This manager
+ * provides facilities to implement tasks which execute in a periodic fashion.
+ *
+ * Directives provided are:
+ *
+ * + create a rate monotonic timer
+ * + cancel a period
+ * + delete a rate monotonic timer
+ * + conclude current and start the next period
+ * + obtain status information on a period
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RATE_MONOTONIC_h
+#define __RTEMS_RATE_MONOTONIC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the states in which a
+ * period may be.
+ */
+
+typedef enum {
+ RATE_MONOTONIC_INACTIVE, /* off chain, never initialized */
+ RATE_MONOTONIC_OWNER_IS_BLOCKING, /* on chain, owner is blocking on it */
+ RATE_MONOTONIC_ACTIVE, /* on chain, running continuously */
+ RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING, /* on chain, expired while owner was */
+ /* was blocking on it */
+ RATE_MONOTONIC_EXPIRED /* off chain, will be reset by next */
+ /* rtems_rate_monotonic_period */
+} rtems_rate_monotonic_period_states;
+
+/*
+ * The following constant is the interval passed to the rate_monontonic_period
+ * directive to obtain status information.
+ */
+
+#define RTEMS_PERIOD_STATUS WATCHDOG_NO_TIMEOUT
+
+/*
+ * The following defines the period status structure.
+ */
+
+typedef struct {
+ rtems_rate_monotonic_period_states state;
+ unsigned32 ticks_since_last_period;
+ unsigned32 ticks_executed_since_last_period;
+} rtems_rate_monotonic_period_status;
+
+/*
+ * The following structure defines the control block used to manage
+ * each period.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Watchdog_Control Timer;
+ rtems_rate_monotonic_period_states state;
+ unsigned32 owner_ticks_executed_at_period;
+ unsigned32 time_at_period;
+ Thread_Control *owner;
+} Rate_monotonic_Control;
+
+RTEMS_EXTERN Objects_Information _Rate_monotonic_Information;
+
+/*
+ * _Rate_monotonic_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Rate_monotonic_Manager_initialization(
+ unsigned32 maximum_periods
+);
+
+/*
+ * rtems_rate_monotonic_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rate_monotonic_create directive. The
+ * period will have the name name. It returns the id of the
+ * created period in ID.
+ */
+
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_rate_monotonic_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_ident directive.
+ * This directive returns the period ID associated with name.
+ * If more than one period is named name, then the period
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_rate_monotonic_cancel
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_cancel directive. This
+ * directive stops the period associated with ID from continuing to
+ * run.
+ */
+
+rtems_status_code rtems_rate_monotonic_cancel(
+ Objects_Id id
+);
+
+/*
+ * rtems_rate_monotonic_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_delete directive. The
+ * period indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_rate_monotonic_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_rate_monotonic_get_status
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_get_status directive.
+ * Information about the period indicated by ID is returned.
+ *
+ */
+
+rtems_status_code rtems_rate_monotonic_get_status(
+ Objects_Id id,
+ rtems_rate_monotonic_period_status *status
+);
+
+/*
+ * rtems_rate_monotonic_period
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_period directive. When
+ * length is non-zero, this directive initiates the period associated with
+ * ID from continuing for a period of length. If length is zero, then
+ * result is set to indicate the current state of the period.
+ */
+
+rtems_status_code rtems_rate_monotonic_period(
+ Objects_Id id,
+ rtems_interval length
+);
+
+/*
+ * _Rate_monotonic_Timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when the period represented
+ * by ID expires. If the task which owns this period is blocked
+ * waiting for the period to expire, then it is readied and the
+ * period is restarted. If the owning task is not waiting for the
+ * period to expire, then the period is placed in the EXPIRED
+ * state and not restarted.
+ */
+
+void _Rate_monotonic_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/ratemon.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/region.h b/c/src/exec/rtems/include/rtems/rtems/region.h
new file mode 100644
index 0000000000..ae191f62e4
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/region.h
@@ -0,0 +1,234 @@
+/* region.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Region Manager. This manager provides facilities to dynamically
+ * allocate memory in variable sized units which are returned as segments.
+ *
+ * Directives provided are:
+ *
+ * + create a region
+ * + get an ID of a region
+ * + delete a region
+ * + get a segment from a region
+ * + return a segment to a region
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_REGION_h
+#define __RTEMS_REGION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/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
+ * each region.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Thread_queue_Control Wait_queue; /* waiting threads */
+ void *starting_address; /* physical start addr */
+ unsigned32 length; /* physical length(bytes) */
+ unsigned32 page_size; /* in bytes */
+ unsigned32 maximum_segment_size; /* in bytes */
+ rtems_attribute attribute_set;
+ unsigned32 number_of_used_blocks; /* blocks allocated */
+ Heap_Control Memory;
+} Region_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Region_Information;
+
+/*
+ * _Region_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Region_Manager_initialization(
+ unsigned32 maximum_regions
+);
+
+/*
+ * rtems_region_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_create directive. The
+ * region will have the name name. The memory area managed by
+ * the region is of length bytes and starts at starting_address.
+ * The memory area will be divided into as many allocatable units of
+ * page_size bytes as possible. The attribute_set determines which
+ * thread queue discipline is used by the region. It returns the
+ * id of the created region in ID.
+ */
+
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 page_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_region_extend
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_extend directive. The
+ * region will have the name name. The memory area managed by
+ * the region will be attempted to be grown by length bytes using
+ * the memory starting at starting_address.
+ */
+
+rtems_status_code rtems_region_extend(
+ Objects_Id id,
+ void *starting_address,
+ unsigned32 length
+);
+
+/*
+ * rtems_region_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_ident directive.
+ * This directive returns the region ID associated with name.
+ * If more than one region is named name, then the region
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_region_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_delete directive. The
+ * region indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_region_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_region_get_segment
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_get_segment directive. It
+ * attempts to allocate a segment from the region associated with ID.
+ * If a segment of the requested size can be allocated, its address
+ * is returned in segment. If no segment is available, then the task
+ * may return immediately or block waiting for a segment with an optional
+ * timeout of timeout clock ticks. Whether the task blocks or returns
+ * immediately is based on the no_wait option in the option_set.
+ */
+
+rtems_status_code rtems_region_get_segment(
+ Objects_Id id,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+);
+
+/*
+ * rtems_region_get_segment_size
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_get_segment_size directive. It
+ * returns the size in bytes of the specified user memory area.
+ */
+
+rtems_status_code rtems_region_get_segment_size(
+ Objects_Id id,
+ void *segment,
+ unsigned32 *size
+);
+
+/*
+ * rtems_region_return_segment
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_return_segment directive. It
+ * frees the segment to the region associated with ID. The segment must
+ * have been previously allocated from the same region. If freeing the
+ * segment results in enough memory being available to satisfy the
+ * rtems_region_get_segment of the first blocked task, then that task and as
+ * many subsequent tasks as possible will be unblocked with their requests
+ * satisfied.
+ */
+
+rtems_status_code rtems_region_return_segment(
+ Objects_Id id,
+ void *segment
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/region.inl>
+#endif
+#include <rtems/rtems/regionmp.h>
+
+/*
+ * _Region_Debug_Walk
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked to verify the integrity of a heap associated
+ * with the_region.
+ */
+
+#ifdef RTEMS_DEBUG
+
+#define _Region_Debug_Walk( _the_region, _source ) \
+ do { \
+ if ( _Debug_Is_enabled( RTEMS_DEBUG_REGION ) ) \
+ _Heap_Walk( &(_the_region)->Memory, _source, FALSE ); \
+ } while ( 0 )
+
+#else
+
+#define _Region_Debug_Walk( _the_region, _source )
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/regionmp.h b/c/src/exec/rtems/include/rtems/rtems/regionmp.h
new file mode 100644
index 0000000000..a0560a4558
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/regionmp.h
@@ -0,0 +1,166 @@
+/* regionmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_REGION_MP_h
+#define __RTEMS_REGION_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote region operations.
+ */
+
+typedef enum {
+ REGION_MP_ANNOUNCE_CREATE = 0,
+ REGION_MP_ANNOUNCE_DELETE = 1,
+ REGION_MP_EXTRACT_PROXY = 2,
+ REGION_MP_GET_SEGMENT_REQUEST = 3,
+ REGION_MP_GET_SEGMENT_RESPONSE = 4,
+ REGION_MP_RETURN_SEGMENT_REQUEST = 5,
+ REGION_MP_RETURN_SEGMENT_RESPONSE = 6
+} Region_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote region operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Region_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ unsigned32 size;
+ Objects_Id proxy_id;
+ void *segment;
+} Region_MP_Packet;
+
+/*
+ * _Region_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Region_MP_Send_process_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Region_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Region_MP_Send_request_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ void *segment,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout
+);
+
+/*
+ * _Region_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Region_MP_Send_response_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Region_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Region_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Region_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by the Region since a region
+ * cannot be deleted when segments are in use.
+ */
+
+/*
+ * _Region_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Region_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Region_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a region mp packet.
+ */
+
+Region_MP_Packet *_Region_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/rtemsapi.h b/c/src/exec/rtems/include/rtems/rtems/rtemsapi.h
new file mode 100644
index 0000000000..2ceb6ab577
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/rtemsapi.h
@@ -0,0 +1,34 @@
+/*
+ * RTEMS API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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/c/src/exec/rtems/include/rtems/rtems/sem.h b/c/src/exec/rtems/include/rtems/rtems/sem.h
new file mode 100644
index 0000000000..321724ed53
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/sem.h
@@ -0,0 +1,248 @@
+/* semaphore.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Semaphore Manager. This manager utilizes standard Dijkstra
+ * counting semaphores to provide synchronization and mutual exclusion
+ * capabilities.
+ *
+ * Directives provided are:
+ *
+ * + create a semaphore
+ * + get an ID of a semaphore
+ * + delete a semaphore
+ * + acquire a semaphore
+ * + release a semaphore
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SEMAPHORE_h
+#define __RTEMS_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/object.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/threadq.h>
+
+/*
+ * The following defines the control block used to manage each semaphore.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ rtems_attribute attribute_set;
+ union {
+ CORE_mutex_Control mutex;
+ CORE_semaphore_Control semaphore;
+ } Core_control;
+} Semaphore_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Semaphore_Information;
+
+/*
+ * _Semaphore_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+);
+
+/*
+ * rtems_semaphore_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_create directive. The
+ * semaphore will have the name name. The starting count for
+ * the semaphore is count. The attribute_set determines if
+ * the semaphore is global or local and the thread queue
+ * discipline. It returns the id of the created semaphore in ID.
+ */
+
+rtems_status_code rtems_semaphore_create(
+ rtems_name name,
+ unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ rtems_id *id
+);
+
+/*
+ * rtems_semaphore_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_ident directive.
+ * This directive returns the semaphore ID associated with name.
+ * If more than one semaphore is named name, then the semaphore
+ * to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the semaphore named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ unsigned32 node,
+ rtems_id *id
+);
+
+/*
+ * rtems_semaphore_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_delete directive. The
+ * semaphore indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_semaphore_delete(
+ rtems_id id
+);
+
+/*
+ * rtems_semaphore_obtain
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_obtain directive. It
+ * attempts to obtain a unit from the semaphore associated with ID.
+ * If a unit can be allocated, the calling task will return immediately.
+ * If no unit is available, then the task may return immediately or
+ * block waiting for a unit with an optional timeout of timeout
+ * clock ticks. Whether the task blocks or returns immediately
+ * is based on the RTEMS_NO_WAIT option in the option_set.
+ */
+
+rtems_status_code rtems_semaphore_obtain(
+ rtems_id id,
+ unsigned32 option_set,
+ rtems_interval timeout
+);
+
+/*
+ * rtems_semaphore_release
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_release directive. It
+ * frees a unit to the semaphore associated with ID. 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.
+ */
+
+rtems_status_code rtems_semaphore_release(
+ rtems_id id
+);
+
+/*
+ * _Semaphore_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine attempts to receive a unit from the_semaphore.
+ * If a unit is available or if the RTEMS_NO_WAIT option is enabled in
+ * option_set, then the routine returns. Otherwise, the calling task
+ * is blocked until a unit becomes available.
+ */
+
+boolean _Semaphore_Seize(
+ Semaphore_Control *the_semaphore,
+ unsigned32 option_set
+);
+
+/*
+ * _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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/sem.inl>
+#endif
+#include <rtems/rtems/semmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/semmp.h b/c/src/exec/rtems/include/rtems/rtems/semmp.h
new file mode 100644
index 0000000000..e3b161512d
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/semmp.h
@@ -0,0 +1,163 @@
+/* semmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SEMAPHORE_MP_h
+#define __RTEMS_SEMAPHORE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote semaphore operations.
+ */
+
+typedef enum {
+ SEMAPHORE_MP_ANNOUNCE_CREATE = 0,
+ SEMAPHORE_MP_ANNOUNCE_DELETE = 1,
+ SEMAPHORE_MP_EXTRACT_PROXY = 2,
+ SEMAPHORE_MP_OBTAIN_REQUEST = 3,
+ SEMAPHORE_MP_OBTAIN_RESPONSE = 4,
+ SEMAPHORE_MP_RELEASE_REQUEST = 5,
+ SEMAPHORE_MP_RELEASE_RESPONSE = 6
+} Semaphore_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote semaphore operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Semaphore_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ Objects_Id proxy_id;
+} Semaphore_MP_Packet;
+
+/*
+ * _Semaphore_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Semaphore_MP_Send_process_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Semaphore_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Semaphore_MP_Send_request_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_option option_set,
+ rtems_interval timeout
+);
+
+/*
+ * _Semaphore_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Semaphore_MP_Send_response_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Semaphore_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Semaphore_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Semaphore_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _Semaphore_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Semaphore_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a semaphore mp packet.
+ */
+
+Semaphore_MP_Packet *_Semaphore_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/signal.h b/c/src/exec/rtems/include/rtems/rtems/signal.h
new file mode 100644
index 0000000000..18fdeba88a
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/signal.h
@@ -0,0 +1,83 @@
+/* signal.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Signal Manager. This manager provides capabilities required
+ * for asynchronous communication between tasks via signal sets.
+ *
+ * Directives provided are:
+ *
+ * + establish an asynchronous signal routine
+ * + send a signal set to a task
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SIGNAL_h
+#define __RTEMS_SIGNAL_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/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
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_signal_catch directive. This directive
+ * is used to establish asr_handler as the Asynchronous Signal Routine
+ * (RTEMS_ASR) for the calling task. The asr_handler will execute with a
+ * mode of mode_set.
+ */
+
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry asr_handler,
+ rtems_mode mode_set
+);
+
+/*
+ * rtems_signal_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_signal_send directive. This directive
+ * sends the signal_set to the task specified by ID.
+ */
+
+rtems_status_code rtems_signal_send(
+ Objects_Id id,
+ rtems_signal_set signal_set
+);
+
+#include <rtems/rtems/signalmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/signalmp.h b/c/src/exec/rtems/include/rtems/rtems/signalmp.h
new file mode 100644
index 0000000000..fb9c0ea833
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/signalmp.h
@@ -0,0 +1,147 @@
+/* signalmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Signal Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SIGNAL_MP_h
+#define __RTEMS_SIGNAL_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/asr.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote signal operations.
+ */
+
+typedef enum {
+ SIGNAL_MP_SEND_REQUEST = 0,
+ SIGNAL_MP_SEND_RESPONSE = 1
+} Signal_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote signal operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Signal_MP_Remote_operations operation;
+ rtems_signal_set signal_in;
+} Signal_MP_Packet;
+
+/*
+ * _Signal_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ *
+ * This routine is not needed since there are no process
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _Signal_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Signal_MP_Send_request_packet (
+ Signal_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_signal_set signal_in
+);
+
+/*
+ * _Signal_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Signal_MP_Send_response_packet (
+ Signal_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Signal_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Signal_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Signal_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Signal_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Signal_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a signal mp packet.
+ */
+
+Signal_MP_Packet *_Signal_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/status.h b/c/src/exec/rtems/include/rtems/rtems/status.h
new file mode 100644
index 0000000000..cff32c0f83
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/status.h
@@ -0,0 +1,83 @@
+/* status.h
+ *
+ * This include file contains the status codes returned from the
+ * executive directives.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_STATUS_h
+#define __RTEMS_STATUS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+/* enumerated constants */
+
+typedef enum {
+ RTEMS_SUCCESSFUL = 0, /* successful completion */
+ RTEMS_TASK_EXITTED = 1, /* returned from a thread */
+ RTEMS_MP_NOT_CONFIGURED = 2, /* multiprocessing not configured */
+ RTEMS_INVALID_NAME = 3, /* invalid object name */
+ RTEMS_INVALID_ID = 4, /* invalid object id */
+ RTEMS_TOO_MANY = 5, /* too many */
+ RTEMS_TIMEOUT = 6, /* timed out waiting */
+ RTEMS_OBJECT_WAS_DELETED = 7, /* object deleted while waiting */
+ RTEMS_INVALID_SIZE = 8, /* specified size was invalid */
+ RTEMS_INVALID_ADDRESS = 9, /* address specified is invalid */
+ RTEMS_INVALID_NUMBER = 10, /* number was invalid */
+ RTEMS_NOT_DEFINED = 11, /* item has not been initialized */
+ RTEMS_RESOURCE_IN_USE = 12, /* resources still outstanding */
+ RTEMS_UNSATISFIED = 13, /* request not satisfied */
+ RTEMS_INCORRECT_STATE = 14, /* thread is in wrong state */
+ RTEMS_ALREADY_SUSPENDED = 15, /* thread already in state */
+ RTEMS_ILLEGAL_ON_SELF = 16, /* illegal on calling thread */
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT = 17, /* illegal for remote object */
+ RTEMS_CALLED_FROM_ISR = 18, /* called from wrong environment */
+ RTEMS_INVALID_PRIORITY = 19, /* invalid thread priority */
+ RTEMS_INVALID_CLOCK = 20, /* invalid date/time */
+ RTEMS_INVALID_NODE = 21, /* invalid node id */
+ RTEMS_NOT_CONFIGURED = 22, /* directive not configured */
+ 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_NO_MEMORY = 26, /* could not get enough memory */
+ RTEMS_PROXY_BLOCKING = 27 /* internal error only */
+} rtems_status_code;
+
+#define RTEMS_STATUS_CODES_FIRST RTEMS_SUCCESSFUL
+#define RTEMS_STATUS_CODES_LAST RTEMS_PROXY_BLOCKING
+
+extern rtems_status_code _Status_Object_name_errors_to_status[];
+
+#ifdef RTEMS_API_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
+
+/*
+ * Applications are allowed to use the macros to compare status codes.
+ */
+
+#include <rtems/rtems/status.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/support.h b/c/src/exec/rtems/include/rtems/rtems/support.h
new file mode 100644
index 0000000000..d5c9c494a0
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/support.h
@@ -0,0 +1,99 @@
+/* support.h
+ *
+ * This include file contains information about support functions for
+ * the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_SUPPORT_h
+#define __RTEMS_RTEMS_SUPPORT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+
+/*
+ * rtems_build_name
+ *
+ * DESCRIPTION:
+ *
+ * This function returns an object name composed of the four characters
+ * C1, C2, C3, and C4.
+ *
+ * NOTE:
+ *
+ * This must be implemented as a macro for use in Configuration Tables.
+ *
+ */
+
+#define rtems_build_name( _C1, _C2, _C3, _C4 ) \
+ ( (_C1) << 24 | (_C2) << 16 | (_C3) << 8 | (_C4) )
+
+/*
+ * 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)
+#define RTEMS_MICROSECONDS_TO_TICKS(_ms) \
+ TOD_MICROSECONDS_TO_TICKS(_ms)
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/support.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/taskmp.h b/c/src/exec/rtems/include/rtems/rtems/taskmp.h
new file mode 100644
index 0000000000..5d94e0c3c4
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/taskmp.h
@@ -0,0 +1,167 @@
+/* taskmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the multiprocessing support in the task manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TASKS_MP_h
+#define __RTEMS_RTEMS_TASKS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/thread.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote task operations.
+ */
+
+typedef enum {
+ RTEMS_TASKS_MP_ANNOUNCE_CREATE = 0,
+ RTEMS_TASKS_MP_ANNOUNCE_DELETE = 1,
+ RTEMS_TASKS_MP_SUSPEND_REQUEST = 2,
+ RTEMS_TASKS_MP_SUSPEND_RESPONSE = 3,
+ RTEMS_TASKS_MP_RESUME_REQUEST = 4,
+ RTEMS_TASKS_MP_RESUME_RESPONSE = 5,
+ RTEMS_TASKS_MP_SET_PRIORITY_REQUEST = 6,
+ RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE = 7,
+ RTEMS_TASKS_MP_GET_NOTE_REQUEST = 8,
+ RTEMS_TASKS_MP_GET_NOTE_RESPONSE = 9,
+ RTEMS_TASKS_MP_SET_NOTE_REQUEST = 10,
+ RTEMS_TASKS_MP_SET_NOTE_RESPONSE = 11
+} RTEMS_tasks_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote task operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ RTEMS_tasks_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_task_priority the_priority;
+ unsigned32 notepad;
+ unsigned32 note;
+} RTEMS_tasks_MP_Packet;
+
+/*
+ * _RTEMS_tasks_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _RTEMS_tasks_MP_Send_process_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_name name
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_task_priority the_priority,
+ unsigned32 notepad,
+ unsigned32 note
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _RTEMS_tasks_MP_Send_response_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _RTEMS_tasks_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _RTEMS_tasks_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by RTEMS_tasks since a task
+ * cannot be deleted when segments are in use.
+ */
+
+/*
+ * _RTEMS_tasks_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*
+ * _RTEMS_tasks_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a task mp packet.
+ */
+
+RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/tasks.h b/c/src/exec/rtems/include/rtems/rtems/tasks.h
new file mode 100644
index 0000000000..56813f4f9c
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/tasks.h
@@ -0,0 +1,421 @@
+/* tasks.h
+ *
+ * This include file contains all constants and structures associated
+ * with RTEMS tasks. This manager provides a comprehensive set of directives
+ * to create, delete, and administer tasks.
+ *
+ * Directives provided are:
+ *
+ * + create a task
+ * + get an ID of a task
+ * + start a task
+ * + restart a task
+ * + delete a task
+ * + suspend a task
+ * + resume a task
+ * + set a task's priority
+ * + change the current task's mode
+ * + get a task notepad entry
+ * + set a task notepad entry
+ * + wake up after interval
+ * + wake up when specified
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TASKS_h
+#define __RTEMS_RTEMS_TASKS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/eventset.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/status.h>
+
+/*
+ * Constant to be used as the ID of current task
+ */
+
+#define RTEMS_SELF OBJECTS_ID_OF_SELF
+
+/*
+ * This constant is passed to the rtems_task_wake_after directive as the
+ * interval when a task wishes to yield the CPU.
+ */
+
+#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
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _RTEMS_tasks_Information;
+
+/*
+ * These are used to manage the user initialization tasks.
+ */
+
+RTEMS_EXTERN rtems_initialization_tasks_table
+ *_RTEMS_tasks_User_initialization_tasks;
+RTEMS_EXTERN unsigned32 _RTEMS_tasks_Number_of_initialization_tasks;
+
+/*
+ * _RTEMS_tasks_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes all Task Manager related data structures.
+ */
+
+void _RTEMS_tasks_Manager_initialization(
+ unsigned32 maximum_tasks,
+ unsigned32 number_of_initialization_tasks,
+ rtems_initialization_tasks_table *user_tasks
+);
+
+/*
+ * rtems_task_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_create directive. The task
+ * will have the name name. The attribute_set can be used to indicate
+ * that the task will be globally accessible or utilize floating point.
+ * The task's stack will be stack_size bytes. The task will begin
+ * execution with initial_priority and initial_modes. It returns the
+ * id of the created task in ID.
+ */
+
+rtems_status_code rtems_task_create(
+ rtems_name name,
+ rtems_task_priority initial_priority,
+ unsigned32 stack_size,
+ rtems_mode initial_modes,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_task_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_ident directive.
+ * This directive returns the task ID associated with name.
+ * If more than one task is named name, then the task to
+ * which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the task named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_task_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_task_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_delete directive. The
+ * task indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_task_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_get_note
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_get_note directive. The
+ * value of the indicated notepad for the task associated with ID
+ * is returned in note.
+ */
+
+rtems_status_code rtems_task_get_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 *note
+);
+
+/*
+ * rtems_task_set_note
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_set_note directive. The
+ * value of the indicated notepad for the task associated with ID
+ * is returned in note.
+ */
+
+rtems_status_code rtems_task_set_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 note
+);
+
+/*
+ * rtems_task_mode
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_mode directive. The current
+ * values of the modes indicated by mask of the calling task are changed
+ * to that indicated in mode_set. The former mode of the task is
+ * returned in mode_set.
+ */
+
+rtems_status_code rtems_task_mode(
+ rtems_mode mode_set,
+ rtems_mode mask,
+ rtems_mode *previous_mode_set
+);
+
+/*
+ * rtems_task_restart
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_restart directive. The
+ * task associated with ID is restarted at its initial entry
+ * point with the new argument.
+ */
+
+rtems_status_code rtems_task_restart(
+ Objects_Id id,
+ unsigned32 arg
+);
+
+/*
+ * rtems_task_suspend
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_suspend directive. The
+ * SUSPENDED state is set for task associated with ID.
+ */
+
+rtems_status_code rtems_task_suspend(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_resume
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_resume Directive. The
+ * SUSPENDED state is cleared for task associated with ID.
+ */
+
+rtems_status_code rtems_task_resume(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_set_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_set_priority directive. The
+ * current priority of the task associated with ID is set to
+ * new_priority. The former priority of that task is returned
+ * in old_priority.
+ */
+
+rtems_status_code rtems_task_set_priority(
+ Objects_Id id,
+ rtems_task_priority new_priority,
+ rtems_task_priority *old_priority
+);
+
+/*
+ * rtems_task_start
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_start directive. The
+ * starting execution point of the task associated with ID is
+ * set to entry_point with the initial argument.
+ */
+
+rtems_status_code rtems_task_start(
+ Objects_Id id,
+ rtems_task_entry entry_point,
+ unsigned32 argument
+);
+
+/*
+ * rtems_task_wake_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_wake_when directive. The
+ * calling task is blocked until the current time of day is
+ * equal to that indicated by time_buffer.
+ */
+
+rtems_status_code rtems_task_wake_when(
+ rtems_time_of_day *time_buffer
+);
+
+/*
+ * rtems_task_wake_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_wake_after directive. The
+ * calling task is blocked until the indicated number of clock
+ * ticks have occurred.
+ */
+
+rtems_status_code rtems_task_wake_after(
+ rtems_interval ticks
+);
+
+/*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 );
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/tasks.inl>
+#endif
+#include <rtems/rtems/taskmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/timer.h b/c/src/exec/rtems/include/rtems/rtems/timer.h
new file mode 100644
index 0000000000..88e4f65f70
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/timer.h
@@ -0,0 +1,207 @@
+/* timer.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the Timer Manager. This manager provides
+ * facilities to configure, initiate, cancel, and delete timers which will
+ * fire at specified intervals of time.
+ *
+ * Directives provided are:
+ *
+ * + create a timer
+ * + get an ID of a timer
+ * + delete a timer
+ * + set a timer to fire after a number of ticks have passed
+ * + set a timer to fire when a specified date and time has been reached
+ * + reset a timer
+ * + cancel a time
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TIMER_h
+#define __RTEMS_TIMER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type details the classes to which a timer
+ * may belong.
+ */
+
+typedef enum {
+ TIMER_INTERVAL,
+ TIMER_TIME_OF_DAY,
+ TIMER_DORMANT
+} Timer_Classes;
+
+/*
+ * The following types define a pointer to a timer service routine.
+ */
+
+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
+ * this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Timer_Information;
+
+/*
+ * The following records define the control block used to manage
+ * each timer.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Watchdog_Control Ticker;
+ Timer_Classes the_class;
+} Timer_Control;
+
+/*
+ * _Timer_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+);
+
+/*
+ * rtems_timer_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_create directive. The
+ * timer will have the name name. It returns the id of the
+ * created timer in ID.
+ */
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_timer_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_ident directive.
+ * This directive returns the timer ID associated with name.
+ * If more than one timer is named name, then the timer
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_timer_cancel
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_cancel directive. It is used
+ * to stop the timer associated with ID from firing.
+ */
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+);
+
+/*
+ * rtems_timer_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_delete directive. The
+ * timer indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_timer_fire_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_fire_after directive. It
+ * initiates the timer associated with ID to fire in ticks clock
+ * ticks. When the timer fires, the routine will be invoked.
+ */
+
+rtems_status_code rtems_timer_fire_after(
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
+ * rtems_timer_fire_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_fire_when directive. It
+ * initiates the timer associated with ID to fire at wall_time
+ * When the timer fires, the routine will be invoked.
+ */
+
+rtems_status_code rtems_timer_fire_when(
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
+ * rtems_timer_reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_reset directive. It is used
+ * to reinitialize the interval timer associated with ID just as if
+ * rtems_timer_fire_after were re-invoked with the same arguments that
+ * were used to initiate this timer.
+ */
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/timer.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/include/rtems/rtems/types.h b/c/src/exec/rtems/include/rtems/rtems/types.h
new file mode 100644
index 0000000000..a0004fbb8a
--- /dev/null
+++ b/c/src/exec/rtems/include/rtems/rtems/types.h
@@ -0,0 +1,96 @@
+/* types.h
+ *
+ * This include file defines the types used by the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TYPES_h
+#define __RTEMS_RTEMS_TYPES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+
+/*
+ * RTEMS basic type definitions
+ */
+
+typedef unsigned8 rtems_unsigned8; /* unsigned 8-bit value */
+typedef unsigned16 rtems_unsigned16; /* unsigned 16-bit value */
+typedef unsigned32 rtems_unsigned32; /* unsigned 32-bit value */
+
+typedef signed8 rtems_signed8; /* signed 8-bit value */
+typedef signed16 rtems_signed16; /* signed 16-bit value */
+typedef signed32 rtems_signed32; /* signed 32-bit value */
+
+/*
+ * some C++ compilers (eg: HP's) don't do 'long long'
+ */
+#if defined(__GNUC__)
+typedef unsigned64 rtems_unsigned64; /* unsigned 64-bit value */
+typedef signed64 rtems_signed64; /* signed 64-bit value */
+#endif
+
+typedef single_precision rtems_single; /* single precision float */
+typedef double_precision rtems_double; /* double precision float */
+
+typedef boolean rtems_boolean;
+
+typedef unsigned32 rtems_name;
+typedef Objects_Id rtems_id;
+
+typedef Context_Control rtems_context;
+typedef Context_Control_fp rtems_context_fp;
+typedef CPU_Interrupt_frame rtems_interrupt_frame;
+
+/*
+ * Time related
+ */
+
+typedef Watchdog_Interval rtems_interval;
+typedef TOD_Control rtems_time_of_day;
+
+/*
+ * 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
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/Makefile.in b/c/src/exec/rtems/inline/Makefile.in
new file mode 100644
index 0000000000..e041a1b657
--- /dev/null
+++ b/c/src/exec/rtems/inline/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES=asr attr dpmem event eventset message modes options \
+ part ratemon region sem status support tasks timer
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/rtems
diff --git a/c/src/exec/rtems/inline/asr.inl b/c/src/exec/rtems/inline/asr.inl
new file mode 100644
index 0000000000..743c7ed5f7
--- /dev/null
+++ b/c/src/exec/rtems/inline/asr.inl
@@ -0,0 +1,128 @@
+/* inline/asr.inl
+ *
+ * This include file contains the implemenation of all routines
+ * associated with the asynchronous signal handler which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ASR_inl
+#define __INLINE_ASR_inl
+
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _ASR_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the given RTEMS_ASR information record.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Initialize (
+ ASR_Information *information
+)
+{
+ information->is_enabled = TRUE;
+ information->handler = NULL;
+ information->mode_set = RTEMS_DEFAULT_MODES;
+ information->signals_posted = 0;
+ information->signals_pending = 0;
+ information->nest_level = 0;
+}
+
+/*PAGE
+ *
+ * _ASR_Swap_signals
+ *
+ * DESCRIPTION:
+ *
+ * This routine atomically swaps the pending and posted signal
+ * sets. This is done when the thread alters its mode in such a
+ * way that the RTEMS_ASR disable/enable flag changes.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Swap_signals (
+ ASR_Information *information
+)
+{
+ rtems_signal_set _signals;
+ ISR_Level _level;
+
+ _ISR_Disable( _level );
+ _signals = information->signals_pending;
+ information->signals_pending = information->signals_posted;
+ information->signals_posted = _signals;
+ _ISR_Enable( _level );
+}
+
+/*PAGE
+ *
+ * _ASR_Is_null_handler
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given asr_handler is NULL and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ASR_Is_null_handler (
+ rtems_asr_entry asr_handler
+)
+{
+ return asr_handler == NULL;
+}
+
+/*PAGE
+ *
+ * _ASR_Are_signals_pending
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there are signals pending in the
+ * given RTEMS_ASR information record and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ASR_Are_signals_pending (
+ ASR_Information *information
+)
+{
+ return information->signals_posted != 0;
+}
+
+/*PAGE
+ *
+ * _ASR_Post_signals
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts the given signals into the signal_set
+ * passed in. The result is returned to the user in signal_set.
+ *
+ * NOTE: This must be implemented as a macro.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Post_signals(
+ rtems_signal_set signals,
+ rtems_signal_set *signal_set
+)
+{
+ ISR_Level _level;
+
+ _ISR_Disable( _level );
+ *signal_set |= signals;
+ _ISR_Enable( _level );
+}
+
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/attr.inl b/c/src/exec/rtems/inline/attr.inl
new file mode 100644
index 0000000000..208dbcf1b4
--- /dev/null
+++ b/c/src/exec/rtems/inline/attr.inl
@@ -0,0 +1,159 @@
+/* inline/attr.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with attributes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ATTRIBUTES_inl
+#define __INLINE_ATTRIBUTES_inl
+
+/*PAGE
+ *
+ * _Attributes_Set
+ *
+ * DESCRIPTION:
+ *
+ * This function sets the requested new_attributes in the attribute_set
+ * passed in. The result is returned to the user.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_attribute _Attributes_Set (
+ rtems_attribute new_attributes,
+ rtems_attribute attribute_set
+)
+{
+ return attribute_set | new_attributes;
+}
+
+/*PAGE
+ *
+ * _Attributes_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function clears the requested new_attributes in the attribute_set
+ * passed in. The result is returned to the user.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_attribute _Attributes_Clear (
+ rtems_attribute attribute_set,
+ rtems_attribute mask
+)
+{
+ return attribute_set & ~mask;
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_floating_point
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the floating point attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_floating_point(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_FLOATING_POINT );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_global
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the global object attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_global(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_GLOBAL );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_priority(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_binary_semaphore
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the binary semaphore attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_binary_semaphore(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_BINARY_SEMAPHORE );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_inherit_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority inheritance attribute
+ * is enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_inherit_priority(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_INHERIT_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_priority_ceiling
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority ceiling attribute
+ * is enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_priority_ceiling(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_PRIORITY_CEILING );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/dpmem.inl b/c/src/exec/rtems/inline/dpmem.inl
new file mode 100644
index 0000000000..182a4c4094
--- /dev/null
+++ b/c/src/exec/rtems/inline/dpmem.inl
@@ -0,0 +1,95 @@
+/* inline/dpmem.inl
+ *
+ * This include file contains the inline routine used in conjunction
+ * with the Dual Ported Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_DPMEM_inl
+#define __INLINE_DPMEM_inl
+
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a port control block from the inactive chain
+ * of free port control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Dual_ported_memory_Control
+ *_Dual_ported_memory_Allocate ( void )
+{
+ return (Dual_ported_memory_Control *)
+ _Objects_Allocate( &_Dual_ported_memory_Information );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a port control block to the inactive chain
+ * of free port control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Dual_ported_memory_Free (
+ Dual_ported_memory_Control *the_port
+)
+{
+ _Objects_Free( &_Dual_ported_memory_Information, &the_port->Object );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps port IDs to port control blocks. If ID
+ * corresponds to a local port, then it returns the_port control
+ * pointer which maps to ID and location is set to OBJECTS_LOCAL.
+ * Global ports are not supported, thus if ID does not map to a
+ * local port, location is set to OBJECTS_ERROR and the_port is
+ * undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Dual_ported_memory_Control *)
+ _Objects_Get( &_Dual_ported_memory_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_port is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Dual_ported_memory_Is_null(
+ Dual_ported_memory_Control *the_port
+)
+{
+ return ( the_port == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/event.inl b/c/src/exec/rtems/inline/event.inl
new file mode 100644
index 0000000000..9de27085d0
--- /dev/null
+++ b/c/src/exec/rtems/inline/event.inl
@@ -0,0 +1,21 @@
+/* inline/event.inl
+ *
+ * This include file contains the static inline implementation of
+ * macros for the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_EVENT_inl
+#define __MACROS_EVENT_inl
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/eventset.inl b/c/src/exec/rtems/inline/eventset.inl
new file mode 100644
index 0000000000..a32190888b
--- /dev/null
+++ b/c/src/exec/rtems/inline/eventset.inl
@@ -0,0 +1,91 @@
+/* inline/eventset.inl
+ *
+ * This include file contains the information pertaining to event sets.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_EVENT_SET_inl
+#define __INLINE_EVENT_SET_inl
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if on events are posted in the event_set,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Event_sets_Is_empty(
+ rtems_event_set the_event_set
+)
+{
+ return ( the_event_set == 0 );
+}
+
+/*PAGE
+ *
+ * _Event_sets_Post
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts the given new_events into the event_set
+ * passed in. The result is returned to the user in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE void _Event_sets_Post(
+ rtems_event_set the_new_events,
+ rtems_event_set *the_event_set
+)
+{
+ *the_event_set |= the_new_events;
+}
+
+/*PAGE
+ *
+ * _Event_sets_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the events in event_condition which are
+ * set in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
+ rtems_event_set the_event_set,
+ rtems_event_set the_event_condition
+)
+{
+ return ( the_event_set & the_event_condition );
+}
+
+/*PAGE
+ *
+ * _Event_sets_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the events in mask from the event_set
+ * passed in. The result is returned to the user in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
+ rtems_event_set the_event_set,
+ rtems_event_set the_mask
+)
+{
+ return ( the_event_set & ~(the_mask) );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/message.inl b/c/src/exec/rtems/inline/message.inl
new file mode 100644
index 0000000000..d4895d0df5
--- /dev/null
+++ b/c/src/exec/rtems/inline/message.inl
@@ -0,0 +1,83 @@
+/* message.inl
+ *
+ * This include file contains the static inline implementation of all
+ * inlined routines in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MESSAGE_QUEUE_inl
+#define __MESSAGE_QUEUE_inl
+
+#include <rtems/score/wkspace.h>
+
+/*PAGE
+ *
+ * _Message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function places the_message at the rear of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Message_queue_Is_null (
+ Message_queue_Control *the_message_queue
+)
+{
+ return ( the_message_queue == NULL );
+}
+
+
+/*PAGE
+ *
+ * _Message_queue_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine deallocates a message queue control block into
+ * the inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Message_queue_Free (
+ Message_queue_Control *the_message_queue
+)
+{
+ _Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
+}
+
+/*PAGE
+ *
+ * _Message_queue_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps message queue IDs to message queue control
+ * blocks. If ID corresponds to a local message queue, then it
+ * returns the_message_queue control pointer which maps to ID
+ * and location is set to OBJECTS_LOCAL. If the message queue ID is
+ * global and resides on a remote node, then location is set
+ * to OBJECTS_REMOTE, and the_message_queue is undefined.
+ * Otherwise, location is set to OBJECTS_ERROR and
+ * the_message_queue is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Message_queue_Control *)
+ _Objects_Get( &_Message_queue_Information, id, location );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/modes.inl b/c/src/exec/rtems/inline/modes.inl
new file mode 100644
index 0000000000..8cc1c2273a
--- /dev/null
+++ b/c/src/exec/rtems/inline/modes.inl
@@ -0,0 +1,152 @@
+/* modes.inl
+ *
+ * This include file contains the static inline implementation of the
+ * inlined routines in the Mode Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MODES_inl
+#define __MODES_inl
+
+/*PAGE
+ *
+ * _Modes_Mask_changed
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if any of the mode flags in mask
+ * are set in mode_set, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Mask_changed (
+ Modes_Control mode_set,
+ Modes_Control masks
+)
+{
+ return ( mode_set & masks );
+}
+
+/*PAGE
+ *
+ * _Modes_Is_asr_disabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that Asynchronous
+ * Signal Processing is disabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_asr_disabled (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR;
+}
+
+/*PAGE
+ *
+ * _Modes_Is_preempt
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that preemption
+ * is enabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_preempt (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
+}
+
+/*PAGE
+ *
+ * _Modes_Is_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that timeslicing
+ * is enabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_timeslice (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE;
+}
+
+/*PAGE
+ *
+ * _Modes_Get_interrupt_level
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the interrupt level portion of the mode_set.
+ */
+
+RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
+ Modes_Control mode_set
+)
+{
+ return ( mode_set & RTEMS_INTERRUPT_MASK );
+}
+
+/*PAGE
+ *
+ * _Modes_Set_interrupt_level
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current interrupt level to that specified
+ * in the mode_set.
+ */
+
+RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
+ Modes_Control mode_set
+)
+{
+ _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
+}
+
+/*PAGE
+ *
+ * _Modes_Change
+ *
+ * DESCRIPTION:
+ *
+ * This routine changes the modes in old_mode_set indicated by
+ * mask to the requested values in new_mode_set. The resulting
+ * mode set is returned in out_mode_set and the modes that changed
+ * is returned in changed.
+ */
+
+RTEMS_INLINE_ROUTINE void _Modes_Change (
+ Modes_Control old_mode_set,
+ Modes_Control new_mode_set,
+ Modes_Control mask,
+ Modes_Control *out_mode_set,
+ Modes_Control *changed
+)
+{
+ Modes_Control _out_mode;
+
+ _out_mode = old_mode_set;
+ _out_mode &= ~mask;
+ _out_mode |= new_mode_set & mask;
+ *changed = _out_mode ^ old_mode_set;
+ *out_mode_set = _out_mode;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/options.inl b/c/src/exec/rtems/inline/options.inl
new file mode 100644
index 0000000000..9ed048ea7d
--- /dev/null
+++ b/c/src/exec/rtems/inline/options.inl
@@ -0,0 +1,55 @@
+/* options.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the Options Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OPTIONS_inl
+#define __OPTIONS_inl
+
+/*PAGE
+ *
+ * _Options_Is_no_wait
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the RTEMS_NO_WAIT option is enabled in
+ * option_set, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Options_Is_no_wait (
+ rtems_option option_set
+)
+{
+ return (option_set & RTEMS_NO_WAIT);
+}
+
+/*PAGE
+ *
+ * _Options_Is_any
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the RTEMS_EVENT_ANY option is enabled in
+ * OPTION_SET, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Options_Is_any (
+ rtems_option option_set
+)
+{
+ return (option_set & RTEMS_EVENT_ANY);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/part.inl b/c/src/exec/rtems/inline/part.inl
new file mode 100644
index 0000000000..b29b023eb1
--- /dev/null
+++ b/c/src/exec/rtems/inline/part.inl
@@ -0,0 +1,199 @@
+/* part.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PARTITION_inl
+#define __PARTITION_inl
+
+/*PAGE
+ *
+ * _Partition_Allocate_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a buffer from the_partition.
+ * If successful, it returns the address of the allocated buffer.
+ * Otherwise, it returns NULL.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
+ Partition_Control *the_partition
+)
+{
+ return _Chain_Get( &the_partition->Memory );
+}
+
+/*PAGE
+ *
+ * _Partition_Free_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees the_buffer to the_partition.
+ */
+
+RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
+ Partition_Control *the_partition,
+ Chain_Node *the_buffer
+)
+{
+ _Chain_Append( &the_partition->Memory, the_buffer );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_on_boundary
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_buffer is on a valid buffer
+ * boundary for the_partition, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_on_boundary (
+ void *the_buffer,
+ Partition_Control *the_partition
+)
+{
+ unsigned32 offset;
+
+ offset = (unsigned32) _Addresses_Subtract(
+ the_buffer,
+ the_partition->starting_address
+ );
+
+ return ((offset % the_partition->buffer_size) == 0);
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_buffer is a valid buffer from
+ * the_partition, otherwise FALSE is returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_valid (
+ Chain_Node *the_buffer,
+ Partition_Control *the_partition
+)
+{
+ void *starting;
+ void *ending;
+
+ starting = the_partition->starting_address;
+ ending = _Addresses_Add_offset( starting, the_partition->length );
+
+ return (
+ _Addresses_Is_in_range( the_buffer, starting, ending ) &&
+ _Partition_Is_buffer_on_boundary( the_buffer, the_partition )
+ );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_size_aligned
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the use of the specified buffer_size
+ * will result in the allocation of buffers whose first byte is
+ * properly aligned, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_size_aligned (
+ unsigned32 buffer_size
+)
+{
+ return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
+}
+
+/*PAGE
+ *
+ * _Partition_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a partition control block from
+ * the inactive chain of free partition control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
+{
+ return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
+}
+
+/*PAGE
+ *
+ * _Partition_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a partition control block to the
+ * inactive chain of free partition control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Partition_Free (
+ Partition_Control *the_partition
+)
+{
+ _Objects_Free( &_Partition_Information, &the_partition->Object );
+}
+
+/*PAGE
+ *
+ * _Partition_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps partition IDs to partition control blocks.
+ * If ID corresponds to a local partition, then it returns
+ * the_partition control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. If the partition ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_partition is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_partition is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Partition_Control *)
+ _Objects_Get( &_Partition_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_partition is NULL
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_null (
+ Partition_Control *the_partition
+)
+{
+ return ( the_partition == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/ratemon.inl b/c/src/exec/rtems/inline/ratemon.inl
new file mode 100644
index 0000000000..b5a4e9698f
--- /dev/null
+++ b/c/src/exec/rtems/inline/ratemon.inl
@@ -0,0 +1,143 @@
+/* ratemon.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines in the Rate Monotonic Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_inl
+#define __RATE_MONOTONIC_inl
+
+/*PAGE
+ *
+ * _Rate_monotonic_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a period control block from
+ * the inactive chain of free period control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void )
+{
+ return (Rate_monotonic_Control *)
+ _Objects_Allocate( &_Rate_monotonic_Information );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a period control block from
+ * the inactive chain of free period control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Rate_monotonic_Free (
+ Rate_monotonic_Control *the_period
+)
+{
+ _Objects_Free( &_Rate_monotonic_Information, &the_period->Object );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps period IDs to period control blocks.
+ * If ID corresponds to a local period, then it returns
+ * the_period control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the_period is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Rate_monotonic_Control *)
+ _Objects_Get( &_Rate_monotonic_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_active
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the ACTIVE state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_active (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_ACTIVE);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_inactive
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the ACTIVE state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_inactive (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_INACTIVE);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_expired
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the EXPIRED state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_expired (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_EXPIRED);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_null (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period == NULL);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/region.inl b/c/src/exec/rtems/inline/region.inl
new file mode 100644
index 0000000000..c2d596c438
--- /dev/null
+++ b/c/src/exec/rtems/inline/region.inl
@@ -0,0 +1,127 @@
+/* region.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __REGION_inl
+#define __REGION_inl
+
+/*PAGE
+ *
+ * _Region_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a region control block from
+ * the inactive chain of free region control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void )
+{
+ return (Region_Control *) _Objects_Allocate( &_Region_Information );
+}
+
+/*PAGE
+ *
+ * _Region_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a region control block to the
+ * inactive chain of free region control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Region_Free (
+ Region_Control *the_region
+)
+{
+ _Objects_Free( &_Region_Information, &the_region->Object );
+}
+
+/*PAGE
+ *
+ * _Region_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps region IDs to region control blocks.
+ * If ID corresponds to a local region, then it returns
+ * the_region control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the_region is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Region_Control *_Region_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Region_Control *)
+ _Objects_Get( &_Region_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Region_Allocate_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a segment from the_region.
+ * If successful, it returns the address of the allocated segment.
+ * Otherwise, it returns NULL.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment (
+ Region_Control *the_region,
+ unsigned32 size
+)
+{
+ return _Heap_Allocate( &the_region->Memory, size );
+}
+
+/*PAGE
+ *
+ * _Region_Free_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function frees the_segment to the_region.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Region_Free_segment (
+ Region_Control *the_region,
+ void *the_segment
+)
+{
+ return _Heap_Free( &the_region->Memory, the_segment );
+}
+
+/*PAGE
+ *
+ * _Region_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_region is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Region_Is_null (
+ Region_Control *the_region
+)
+{
+ return ( the_region == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/Makefile.in b/c/src/exec/rtems/inline/rtems/rtems/Makefile.in
new file mode 100644
index 0000000000..e041a1b657
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES=asr attr dpmem event eventset message modes options \
+ part ratemon region sem status support tasks timer
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/rtems
diff --git a/c/src/exec/rtems/inline/rtems/rtems/asr.inl b/c/src/exec/rtems/inline/rtems/rtems/asr.inl
new file mode 100644
index 0000000000..743c7ed5f7
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/asr.inl
@@ -0,0 +1,128 @@
+/* inline/asr.inl
+ *
+ * This include file contains the implemenation of all routines
+ * associated with the asynchronous signal handler which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ASR_inl
+#define __INLINE_ASR_inl
+
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _ASR_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the given RTEMS_ASR information record.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Initialize (
+ ASR_Information *information
+)
+{
+ information->is_enabled = TRUE;
+ information->handler = NULL;
+ information->mode_set = RTEMS_DEFAULT_MODES;
+ information->signals_posted = 0;
+ information->signals_pending = 0;
+ information->nest_level = 0;
+}
+
+/*PAGE
+ *
+ * _ASR_Swap_signals
+ *
+ * DESCRIPTION:
+ *
+ * This routine atomically swaps the pending and posted signal
+ * sets. This is done when the thread alters its mode in such a
+ * way that the RTEMS_ASR disable/enable flag changes.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Swap_signals (
+ ASR_Information *information
+)
+{
+ rtems_signal_set _signals;
+ ISR_Level _level;
+
+ _ISR_Disable( _level );
+ _signals = information->signals_pending;
+ information->signals_pending = information->signals_posted;
+ information->signals_posted = _signals;
+ _ISR_Enable( _level );
+}
+
+/*PAGE
+ *
+ * _ASR_Is_null_handler
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given asr_handler is NULL and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ASR_Is_null_handler (
+ rtems_asr_entry asr_handler
+)
+{
+ return asr_handler == NULL;
+}
+
+/*PAGE
+ *
+ * _ASR_Are_signals_pending
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there are signals pending in the
+ * given RTEMS_ASR information record and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ASR_Are_signals_pending (
+ ASR_Information *information
+)
+{
+ return information->signals_posted != 0;
+}
+
+/*PAGE
+ *
+ * _ASR_Post_signals
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts the given signals into the signal_set
+ * passed in. The result is returned to the user in signal_set.
+ *
+ * NOTE: This must be implemented as a macro.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Post_signals(
+ rtems_signal_set signals,
+ rtems_signal_set *signal_set
+)
+{
+ ISR_Level _level;
+
+ _ISR_Disable( _level );
+ *signal_set |= signals;
+ _ISR_Enable( _level );
+}
+
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/attr.inl b/c/src/exec/rtems/inline/rtems/rtems/attr.inl
new file mode 100644
index 0000000000..208dbcf1b4
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/attr.inl
@@ -0,0 +1,159 @@
+/* inline/attr.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with attributes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ATTRIBUTES_inl
+#define __INLINE_ATTRIBUTES_inl
+
+/*PAGE
+ *
+ * _Attributes_Set
+ *
+ * DESCRIPTION:
+ *
+ * This function sets the requested new_attributes in the attribute_set
+ * passed in. The result is returned to the user.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_attribute _Attributes_Set (
+ rtems_attribute new_attributes,
+ rtems_attribute attribute_set
+)
+{
+ return attribute_set | new_attributes;
+}
+
+/*PAGE
+ *
+ * _Attributes_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function clears the requested new_attributes in the attribute_set
+ * passed in. The result is returned to the user.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_attribute _Attributes_Clear (
+ rtems_attribute attribute_set,
+ rtems_attribute mask
+)
+{
+ return attribute_set & ~mask;
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_floating_point
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the floating point attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_floating_point(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_FLOATING_POINT );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_global
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the global object attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_global(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_GLOBAL );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_priority(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_binary_semaphore
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the binary semaphore attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_binary_semaphore(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_BINARY_SEMAPHORE );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_inherit_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority inheritance attribute
+ * is enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_inherit_priority(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_INHERIT_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_priority_ceiling
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority ceiling attribute
+ * is enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_priority_ceiling(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_PRIORITY_CEILING );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/dpmem.inl b/c/src/exec/rtems/inline/rtems/rtems/dpmem.inl
new file mode 100644
index 0000000000..182a4c4094
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/dpmem.inl
@@ -0,0 +1,95 @@
+/* inline/dpmem.inl
+ *
+ * This include file contains the inline routine used in conjunction
+ * with the Dual Ported Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_DPMEM_inl
+#define __INLINE_DPMEM_inl
+
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a port control block from the inactive chain
+ * of free port control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Dual_ported_memory_Control
+ *_Dual_ported_memory_Allocate ( void )
+{
+ return (Dual_ported_memory_Control *)
+ _Objects_Allocate( &_Dual_ported_memory_Information );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a port control block to the inactive chain
+ * of free port control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Dual_ported_memory_Free (
+ Dual_ported_memory_Control *the_port
+)
+{
+ _Objects_Free( &_Dual_ported_memory_Information, &the_port->Object );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps port IDs to port control blocks. If ID
+ * corresponds to a local port, then it returns the_port control
+ * pointer which maps to ID and location is set to OBJECTS_LOCAL.
+ * Global ports are not supported, thus if ID does not map to a
+ * local port, location is set to OBJECTS_ERROR and the_port is
+ * undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Dual_ported_memory_Control *)
+ _Objects_Get( &_Dual_ported_memory_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_port is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Dual_ported_memory_Is_null(
+ Dual_ported_memory_Control *the_port
+)
+{
+ return ( the_port == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/event.inl b/c/src/exec/rtems/inline/rtems/rtems/event.inl
new file mode 100644
index 0000000000..9de27085d0
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/event.inl
@@ -0,0 +1,21 @@
+/* inline/event.inl
+ *
+ * This include file contains the static inline implementation of
+ * macros for the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_EVENT_inl
+#define __MACROS_EVENT_inl
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/eventset.inl b/c/src/exec/rtems/inline/rtems/rtems/eventset.inl
new file mode 100644
index 0000000000..a32190888b
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/eventset.inl
@@ -0,0 +1,91 @@
+/* inline/eventset.inl
+ *
+ * This include file contains the information pertaining to event sets.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_EVENT_SET_inl
+#define __INLINE_EVENT_SET_inl
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if on events are posted in the event_set,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Event_sets_Is_empty(
+ rtems_event_set the_event_set
+)
+{
+ return ( the_event_set == 0 );
+}
+
+/*PAGE
+ *
+ * _Event_sets_Post
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts the given new_events into the event_set
+ * passed in. The result is returned to the user in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE void _Event_sets_Post(
+ rtems_event_set the_new_events,
+ rtems_event_set *the_event_set
+)
+{
+ *the_event_set |= the_new_events;
+}
+
+/*PAGE
+ *
+ * _Event_sets_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the events in event_condition which are
+ * set in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
+ rtems_event_set the_event_set,
+ rtems_event_set the_event_condition
+)
+{
+ return ( the_event_set & the_event_condition );
+}
+
+/*PAGE
+ *
+ * _Event_sets_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the events in mask from the event_set
+ * passed in. The result is returned to the user in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
+ rtems_event_set the_event_set,
+ rtems_event_set the_mask
+)
+{
+ return ( the_event_set & ~(the_mask) );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/message.inl b/c/src/exec/rtems/inline/rtems/rtems/message.inl
new file mode 100644
index 0000000000..d4895d0df5
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/message.inl
@@ -0,0 +1,83 @@
+/* message.inl
+ *
+ * This include file contains the static inline implementation of all
+ * inlined routines in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MESSAGE_QUEUE_inl
+#define __MESSAGE_QUEUE_inl
+
+#include <rtems/score/wkspace.h>
+
+/*PAGE
+ *
+ * _Message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function places the_message at the rear of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Message_queue_Is_null (
+ Message_queue_Control *the_message_queue
+)
+{
+ return ( the_message_queue == NULL );
+}
+
+
+/*PAGE
+ *
+ * _Message_queue_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine deallocates a message queue control block into
+ * the inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Message_queue_Free (
+ Message_queue_Control *the_message_queue
+)
+{
+ _Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
+}
+
+/*PAGE
+ *
+ * _Message_queue_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps message queue IDs to message queue control
+ * blocks. If ID corresponds to a local message queue, then it
+ * returns the_message_queue control pointer which maps to ID
+ * and location is set to OBJECTS_LOCAL. If the message queue ID is
+ * global and resides on a remote node, then location is set
+ * to OBJECTS_REMOTE, and the_message_queue is undefined.
+ * Otherwise, location is set to OBJECTS_ERROR and
+ * the_message_queue is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Message_queue_Control *)
+ _Objects_Get( &_Message_queue_Information, id, location );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/modes.inl b/c/src/exec/rtems/inline/rtems/rtems/modes.inl
new file mode 100644
index 0000000000..8cc1c2273a
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/modes.inl
@@ -0,0 +1,152 @@
+/* modes.inl
+ *
+ * This include file contains the static inline implementation of the
+ * inlined routines in the Mode Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MODES_inl
+#define __MODES_inl
+
+/*PAGE
+ *
+ * _Modes_Mask_changed
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if any of the mode flags in mask
+ * are set in mode_set, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Mask_changed (
+ Modes_Control mode_set,
+ Modes_Control masks
+)
+{
+ return ( mode_set & masks );
+}
+
+/*PAGE
+ *
+ * _Modes_Is_asr_disabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that Asynchronous
+ * Signal Processing is disabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_asr_disabled (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR;
+}
+
+/*PAGE
+ *
+ * _Modes_Is_preempt
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that preemption
+ * is enabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_preempt (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
+}
+
+/*PAGE
+ *
+ * _Modes_Is_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that timeslicing
+ * is enabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_timeslice (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE;
+}
+
+/*PAGE
+ *
+ * _Modes_Get_interrupt_level
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the interrupt level portion of the mode_set.
+ */
+
+RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
+ Modes_Control mode_set
+)
+{
+ return ( mode_set & RTEMS_INTERRUPT_MASK );
+}
+
+/*PAGE
+ *
+ * _Modes_Set_interrupt_level
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current interrupt level to that specified
+ * in the mode_set.
+ */
+
+RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
+ Modes_Control mode_set
+)
+{
+ _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
+}
+
+/*PAGE
+ *
+ * _Modes_Change
+ *
+ * DESCRIPTION:
+ *
+ * This routine changes the modes in old_mode_set indicated by
+ * mask to the requested values in new_mode_set. The resulting
+ * mode set is returned in out_mode_set and the modes that changed
+ * is returned in changed.
+ */
+
+RTEMS_INLINE_ROUTINE void _Modes_Change (
+ Modes_Control old_mode_set,
+ Modes_Control new_mode_set,
+ Modes_Control mask,
+ Modes_Control *out_mode_set,
+ Modes_Control *changed
+)
+{
+ Modes_Control _out_mode;
+
+ _out_mode = old_mode_set;
+ _out_mode &= ~mask;
+ _out_mode |= new_mode_set & mask;
+ *changed = _out_mode ^ old_mode_set;
+ *out_mode_set = _out_mode;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/options.inl b/c/src/exec/rtems/inline/rtems/rtems/options.inl
new file mode 100644
index 0000000000..9ed048ea7d
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/options.inl
@@ -0,0 +1,55 @@
+/* options.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the Options Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OPTIONS_inl
+#define __OPTIONS_inl
+
+/*PAGE
+ *
+ * _Options_Is_no_wait
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the RTEMS_NO_WAIT option is enabled in
+ * option_set, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Options_Is_no_wait (
+ rtems_option option_set
+)
+{
+ return (option_set & RTEMS_NO_WAIT);
+}
+
+/*PAGE
+ *
+ * _Options_Is_any
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the RTEMS_EVENT_ANY option is enabled in
+ * OPTION_SET, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Options_Is_any (
+ rtems_option option_set
+)
+{
+ return (option_set & RTEMS_EVENT_ANY);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/part.inl b/c/src/exec/rtems/inline/rtems/rtems/part.inl
new file mode 100644
index 0000000000..b29b023eb1
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/part.inl
@@ -0,0 +1,199 @@
+/* part.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PARTITION_inl
+#define __PARTITION_inl
+
+/*PAGE
+ *
+ * _Partition_Allocate_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a buffer from the_partition.
+ * If successful, it returns the address of the allocated buffer.
+ * Otherwise, it returns NULL.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
+ Partition_Control *the_partition
+)
+{
+ return _Chain_Get( &the_partition->Memory );
+}
+
+/*PAGE
+ *
+ * _Partition_Free_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees the_buffer to the_partition.
+ */
+
+RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
+ Partition_Control *the_partition,
+ Chain_Node *the_buffer
+)
+{
+ _Chain_Append( &the_partition->Memory, the_buffer );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_on_boundary
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_buffer is on a valid buffer
+ * boundary for the_partition, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_on_boundary (
+ void *the_buffer,
+ Partition_Control *the_partition
+)
+{
+ unsigned32 offset;
+
+ offset = (unsigned32) _Addresses_Subtract(
+ the_buffer,
+ the_partition->starting_address
+ );
+
+ return ((offset % the_partition->buffer_size) == 0);
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_buffer is a valid buffer from
+ * the_partition, otherwise FALSE is returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_valid (
+ Chain_Node *the_buffer,
+ Partition_Control *the_partition
+)
+{
+ void *starting;
+ void *ending;
+
+ starting = the_partition->starting_address;
+ ending = _Addresses_Add_offset( starting, the_partition->length );
+
+ return (
+ _Addresses_Is_in_range( the_buffer, starting, ending ) &&
+ _Partition_Is_buffer_on_boundary( the_buffer, the_partition )
+ );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_size_aligned
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the use of the specified buffer_size
+ * will result in the allocation of buffers whose first byte is
+ * properly aligned, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_size_aligned (
+ unsigned32 buffer_size
+)
+{
+ return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
+}
+
+/*PAGE
+ *
+ * _Partition_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a partition control block from
+ * the inactive chain of free partition control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
+{
+ return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
+}
+
+/*PAGE
+ *
+ * _Partition_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a partition control block to the
+ * inactive chain of free partition control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Partition_Free (
+ Partition_Control *the_partition
+)
+{
+ _Objects_Free( &_Partition_Information, &the_partition->Object );
+}
+
+/*PAGE
+ *
+ * _Partition_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps partition IDs to partition control blocks.
+ * If ID corresponds to a local partition, then it returns
+ * the_partition control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. If the partition ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_partition is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_partition is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Partition_Control *)
+ _Objects_Get( &_Partition_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_partition is NULL
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_null (
+ Partition_Control *the_partition
+)
+{
+ return ( the_partition == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/ratemon.inl b/c/src/exec/rtems/inline/rtems/rtems/ratemon.inl
new file mode 100644
index 0000000000..b5a4e9698f
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/ratemon.inl
@@ -0,0 +1,143 @@
+/* ratemon.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines in the Rate Monotonic Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_inl
+#define __RATE_MONOTONIC_inl
+
+/*PAGE
+ *
+ * _Rate_monotonic_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a period control block from
+ * the inactive chain of free period control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void )
+{
+ return (Rate_monotonic_Control *)
+ _Objects_Allocate( &_Rate_monotonic_Information );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a period control block from
+ * the inactive chain of free period control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Rate_monotonic_Free (
+ Rate_monotonic_Control *the_period
+)
+{
+ _Objects_Free( &_Rate_monotonic_Information, &the_period->Object );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps period IDs to period control blocks.
+ * If ID corresponds to a local period, then it returns
+ * the_period control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the_period is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Rate_monotonic_Control *)
+ _Objects_Get( &_Rate_monotonic_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_active
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the ACTIVE state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_active (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_ACTIVE);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_inactive
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the ACTIVE state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_inactive (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_INACTIVE);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_expired
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the EXPIRED state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_expired (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_EXPIRED);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_null (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period == NULL);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/region.inl b/c/src/exec/rtems/inline/rtems/rtems/region.inl
new file mode 100644
index 0000000000..c2d596c438
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/region.inl
@@ -0,0 +1,127 @@
+/* region.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __REGION_inl
+#define __REGION_inl
+
+/*PAGE
+ *
+ * _Region_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a region control block from
+ * the inactive chain of free region control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void )
+{
+ return (Region_Control *) _Objects_Allocate( &_Region_Information );
+}
+
+/*PAGE
+ *
+ * _Region_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a region control block to the
+ * inactive chain of free region control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Region_Free (
+ Region_Control *the_region
+)
+{
+ _Objects_Free( &_Region_Information, &the_region->Object );
+}
+
+/*PAGE
+ *
+ * _Region_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps region IDs to region control blocks.
+ * If ID corresponds to a local region, then it returns
+ * the_region control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the_region is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Region_Control *_Region_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Region_Control *)
+ _Objects_Get( &_Region_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Region_Allocate_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a segment from the_region.
+ * If successful, it returns the address of the allocated segment.
+ * Otherwise, it returns NULL.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment (
+ Region_Control *the_region,
+ unsigned32 size
+)
+{
+ return _Heap_Allocate( &the_region->Memory, size );
+}
+
+/*PAGE
+ *
+ * _Region_Free_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function frees the_segment to the_region.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Region_Free_segment (
+ Region_Control *the_region,
+ void *the_segment
+)
+{
+ return _Heap_Free( &the_region->Memory, the_segment );
+}
+
+/*PAGE
+ *
+ * _Region_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_region is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Region_Is_null (
+ Region_Control *the_region
+)
+{
+ return ( the_region == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/sem.inl b/c/src/exec/rtems/inline/rtems/rtems/sem.inl
new file mode 100644
index 0000000000..25d0eeafe5
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/sem.inl
@@ -0,0 +1,93 @@
+/* sem.inl
+ *
+ * This file contains the static inlin implementation of the inlined
+ * routines from the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SEMAPHORE_inl
+#define __SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _Semaphore_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a semaphore control block from
+ * the inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
+{
+ return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a semaphore control block to the
+ * inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Semaphore_Free (
+ Semaphore_Control *the_semaphore
+)
+{
+ _Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps semaphore IDs to semaphore control blocks.
+ * If ID corresponds to a local semaphore, then it returns
+ * the_semaphore control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the semaphore ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_semaphore is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_semaphore is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Semaphore_Control *)
+ _Objects_Get( &_Semaphore_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_semaphore is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Semaphore_Is_null (
+ Semaphore_Control *the_semaphore
+)
+{
+ return ( the_semaphore == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/status.inl b/c/src/exec/rtems/inline/rtems/rtems/status.inl
new file mode 100644
index 0000000000..733e749176
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/status.inl
@@ -0,0 +1,56 @@
+/* inline/status.inl
+ *
+ * This include file contains the implementations of the inlined
+ * routines for the status package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_STATUS_inl
+#define __INLINE_STATUS_inl
+
+/*PAGE
+ *
+ * rtems_is_status_successful
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the status code is equal to RTEMS_SUCCESSFUL,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean rtems_is_status_successful(
+ rtems_status_code code
+)
+{
+ return (code == RTEMS_SUCCESSFUL);
+}
+
+/*PAGE
+ *
+ * rtems_are_statuses_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the status code1 is equal to code2,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean rtems_are_statuses_equal(
+ rtems_status_code code1,
+ rtems_status_code code2
+)
+{
+ return (code1 == code2);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/support.inl b/c/src/exec/rtems/inline/rtems/rtems/support.inl
new file mode 100644
index 0000000000..75274846f2
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/support.inl
@@ -0,0 +1,61 @@
+/* support.inl
+ *
+ * This include file contains the static inline implementation of all
+ * of the inlined routines specific to the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SUPPORT_inl
+#define __RTEMS_SUPPORT_inl
+
+/*PAGE
+ *
+ * rtems_is_name_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the name is valid, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_boolean rtems_is_name_valid (
+ rtems_name name
+)
+{
+ return ( name != 0 );
+}
+
+/*PAGE
+ *
+ * rtems_name_to_characters
+ *
+ * DESCRIPTION:
+ *
+ * This function breaks the object name into the four component
+ * characters C1, C2, C3, and C4.
+ */
+
+RTEMS_INLINE_ROUTINE void rtems_name_to_characters(
+ rtems_name name,
+ char *c1,
+ char *c2,
+ char *c3,
+ char *c4
+)
+{
+ *c1 = (name >> 24) & 0xff;
+ *c2 = (name >> 16) & 0xff;
+ *c3 = (name >> 8) & 0xff;
+ *c4 = name & 0xff;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/tasks.inl b/c/src/exec/rtems/inline/rtems/rtems/tasks.inl
new file mode 100644
index 0000000000..b16ad40469
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/tasks.inl
@@ -0,0 +1,90 @@
+/* tasks.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the with RTEMS Tasks Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TASKS_inl
+#define __RTEMS_TASKS_inl
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a task control block from
+ * the inactive chain of free task control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information );
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a task control block to the
+ * inactive chain of free task control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _RTEMS_tasks_Free (
+ Thread_Control *the_task
+)
+{
+ _Objects_Free(
+ _Objects_Get_information( the_task->Object.id ),
+ &the_task->Object
+ );
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_to_Core
+ *
+ * DESCRIPTION:
+ *
+ * This function converts an RTEMS API priority into a core priority.
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _RTEMS_tasks_Priority_to_Core(
+ rtems_task_priority priority
+)
+{
+ return (Priority_Control) priority;
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_is_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority is a valid user task priority
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _RTEMS_tasks_Priority_is_valid (
+ rtems_task_priority the_priority
+)
+{
+ return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
+ ( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/rtems/rtems/timer.inl b/c/src/exec/rtems/inline/rtems/rtems/timer.inl
new file mode 100644
index 0000000000..c773fc1ebc
--- /dev/null
+++ b/c/src/exec/rtems/inline/rtems/rtems/timer.inl
@@ -0,0 +1,142 @@
+/* timer.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Timer Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_inl
+#define __TIMER_inl
+
+/*PAGE
+ *
+ * _Timer_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a timer control block from
+ * the inactive chain of free timer control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void )
+{
+ return (Timer_Control *) _Objects_Allocate( &_Timer_Information );
+}
+
+/*PAGE
+ *
+ * _Timer_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a timer control block to the
+ * inactive chain of free timer control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Timer_Free (
+ Timer_Control *the_timer
+)
+{
+ _Objects_Free( &_Timer_Information, &the_timer->Object );
+}
+
+/*PAGE
+ *
+ * _Timer_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps timer IDs to timer control blocks.
+ * If ID corresponds to a local timer, then it returns
+ * the timer control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the returned value is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Timer_Control *)
+ _Objects_Get( &_Timer_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_interval_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of an INTERVAL
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_interval_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_INTERVAL );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_time_of_day_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of an INTERVAL
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_timer_of_day_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_TIME_OF_DAY );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_dormant_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of a DORMANT
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_dormant_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_DORMANT );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_timer is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_null (
+ Timer_Control *the_timer
+)
+{
+ return ( the_timer == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/sem.inl b/c/src/exec/rtems/inline/sem.inl
new file mode 100644
index 0000000000..25d0eeafe5
--- /dev/null
+++ b/c/src/exec/rtems/inline/sem.inl
@@ -0,0 +1,93 @@
+/* sem.inl
+ *
+ * This file contains the static inlin implementation of the inlined
+ * routines from the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SEMAPHORE_inl
+#define __SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _Semaphore_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a semaphore control block from
+ * the inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
+{
+ return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a semaphore control block to the
+ * inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Semaphore_Free (
+ Semaphore_Control *the_semaphore
+)
+{
+ _Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps semaphore IDs to semaphore control blocks.
+ * If ID corresponds to a local semaphore, then it returns
+ * the_semaphore control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the semaphore ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_semaphore is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_semaphore is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Semaphore_Control *)
+ _Objects_Get( &_Semaphore_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_semaphore is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Semaphore_Is_null (
+ Semaphore_Control *the_semaphore
+)
+{
+ return ( the_semaphore == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/status.inl b/c/src/exec/rtems/inline/status.inl
new file mode 100644
index 0000000000..733e749176
--- /dev/null
+++ b/c/src/exec/rtems/inline/status.inl
@@ -0,0 +1,56 @@
+/* inline/status.inl
+ *
+ * This include file contains the implementations of the inlined
+ * routines for the status package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_STATUS_inl
+#define __INLINE_STATUS_inl
+
+/*PAGE
+ *
+ * rtems_is_status_successful
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the status code is equal to RTEMS_SUCCESSFUL,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean rtems_is_status_successful(
+ rtems_status_code code
+)
+{
+ return (code == RTEMS_SUCCESSFUL);
+}
+
+/*PAGE
+ *
+ * rtems_are_statuses_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the status code1 is equal to code2,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean rtems_are_statuses_equal(
+ rtems_status_code code1,
+ rtems_status_code code2
+)
+{
+ return (code1 == code2);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/support.inl b/c/src/exec/rtems/inline/support.inl
new file mode 100644
index 0000000000..75274846f2
--- /dev/null
+++ b/c/src/exec/rtems/inline/support.inl
@@ -0,0 +1,61 @@
+/* support.inl
+ *
+ * This include file contains the static inline implementation of all
+ * of the inlined routines specific to the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SUPPORT_inl
+#define __RTEMS_SUPPORT_inl
+
+/*PAGE
+ *
+ * rtems_is_name_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the name is valid, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_boolean rtems_is_name_valid (
+ rtems_name name
+)
+{
+ return ( name != 0 );
+}
+
+/*PAGE
+ *
+ * rtems_name_to_characters
+ *
+ * DESCRIPTION:
+ *
+ * This function breaks the object name into the four component
+ * characters C1, C2, C3, and C4.
+ */
+
+RTEMS_INLINE_ROUTINE void rtems_name_to_characters(
+ rtems_name name,
+ char *c1,
+ char *c2,
+ char *c3,
+ char *c4
+)
+{
+ *c1 = (name >> 24) & 0xff;
+ *c2 = (name >> 16) & 0xff;
+ *c3 = (name >> 8) & 0xff;
+ *c4 = name & 0xff;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/tasks.inl b/c/src/exec/rtems/inline/tasks.inl
new file mode 100644
index 0000000000..b16ad40469
--- /dev/null
+++ b/c/src/exec/rtems/inline/tasks.inl
@@ -0,0 +1,90 @@
+/* tasks.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the with RTEMS Tasks Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TASKS_inl
+#define __RTEMS_TASKS_inl
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a task control block from
+ * the inactive chain of free task control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information );
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a task control block to the
+ * inactive chain of free task control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _RTEMS_tasks_Free (
+ Thread_Control *the_task
+)
+{
+ _Objects_Free(
+ _Objects_Get_information( the_task->Object.id ),
+ &the_task->Object
+ );
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_to_Core
+ *
+ * DESCRIPTION:
+ *
+ * This function converts an RTEMS API priority into a core priority.
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _RTEMS_tasks_Priority_to_Core(
+ rtems_task_priority priority
+)
+{
+ return (Priority_Control) priority;
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_is_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority is a valid user task priority
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _RTEMS_tasks_Priority_is_valid (
+ rtems_task_priority the_priority
+)
+{
+ return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
+ ( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/inline/timer.inl b/c/src/exec/rtems/inline/timer.inl
new file mode 100644
index 0000000000..c773fc1ebc
--- /dev/null
+++ b/c/src/exec/rtems/inline/timer.inl
@@ -0,0 +1,142 @@
+/* timer.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Timer Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_inl
+#define __TIMER_inl
+
+/*PAGE
+ *
+ * _Timer_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a timer control block from
+ * the inactive chain of free timer control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void )
+{
+ return (Timer_Control *) _Objects_Allocate( &_Timer_Information );
+}
+
+/*PAGE
+ *
+ * _Timer_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a timer control block to the
+ * inactive chain of free timer control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Timer_Free (
+ Timer_Control *the_timer
+)
+{
+ _Objects_Free( &_Timer_Information, &the_timer->Object );
+}
+
+/*PAGE
+ *
+ * _Timer_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps timer IDs to timer control blocks.
+ * If ID corresponds to a local timer, then it returns
+ * the timer control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the returned value is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Timer_Control *)
+ _Objects_Get( &_Timer_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_interval_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of an INTERVAL
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_interval_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_INTERVAL );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_time_of_day_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of an INTERVAL
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_timer_of_day_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_TIME_OF_DAY );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_dormant_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of a DORMANT
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_dormant_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_DORMANT );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_timer is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_null (
+ Timer_Control *the_timer
+)
+{
+ return ( the_timer == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/Makefile.in b/c/src/exec/rtems/macros/Makefile.in
new file mode 100644
index 0000000000..e041a1b657
--- /dev/null
+++ b/c/src/exec/rtems/macros/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES=asr attr dpmem event eventset message modes options \
+ part ratemon region sem status support tasks timer
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/rtems
diff --git a/c/src/exec/rtems/macros/asr.inl b/c/src/exec/rtems/macros/asr.inl
new file mode 100644
index 0000000000..dc6dc414b8
--- /dev/null
+++ b/c/src/exec/rtems/macros/asr.inl
@@ -0,0 +1,90 @@
+/* macros/asr.h
+ *
+ * This include file contains the implemenation of all routines
+ * associated with the asynchronous signal handler which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ASR_h
+#define __INLINE_ASR_h
+
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _ASR_Initialize
+ *
+ */
+
+#define _ASR_Initialize( _information ) \
+{ \
+ (_information)->is_enabled = TRUE; \
+ (_information)->handler = NULL; \
+ (_information)->mode_set = RTEMS_DEFAULT_MODES; \
+ (_information)->signals_posted = 0; \
+ (_information)->signals_pending = 0; \
+ (_information)->nest_level = 0; \
+}
+
+/*PAGE
+ *
+ * _ASR_Swap_signals
+ *
+ */
+
+#define _ASR_Swap_signals( _information ) \
+{ \
+ rtems_signal_set _signals; \
+ ISR_Level _level; \
+ \
+ _ISR_Disable( _level ); \
+ _signals = (_information)->signals_pending; \
+ (_information)->signals_pending = (_information)->signals_posted; \
+ (_information)->signals_posted = _signals; \
+ _ISR_Enable( _level ); \
+}
+
+/*PAGE
+ *
+ * _ASR_Is_null_handler
+ *
+ */
+
+#define _ASR_Is_null_handler( _asr_handler ) \
+ ( (_asr_handler) == NULL )
+
+/*PAGE
+ *
+ * _ASR_Are_signals_pending
+ *
+ */
+
+#define _ASR_Are_signals_pending( _information ) \
+ ( (_information)->signals_posted != 0 )
+
+/*PAGE
+ *
+ * _ASR_Post_signals
+ *
+ */
+
+#define _ASR_Post_signals( _signals, _signal_set ) \
+ do { \
+ ISR_Level _level; \
+ \
+ _ISR_Disable( _level ); \
+ *(_signal_set) |= (_signals); \
+ _ISR_Enable( _level ); \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/attr.inl b/c/src/exec/rtems/macros/attr.inl
new file mode 100644
index 0000000000..a538d2bdd3
--- /dev/null
+++ b/c/src/exec/rtems/macros/attr.inl
@@ -0,0 +1,91 @@
+/* macros/attr.h
+ *
+ * This include file contains all of the inlined routines associated
+ * with attributes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_ATTRIBUTES_h
+#define __MACROS_ATTRIBUTES_h
+
+/*PAGE
+ *
+ * _Attributes_Set
+ */
+
+#define _Attributes_Set( _new_attributes, _attribute_set ) \
+ ( (_attribute_set) | (_new_attributes) )
+
+/*PAGE
+ *
+ * _Attributes_Clear
+ */
+
+#define _Attributes_Clear( _attribute_set, _mask ) \
+ ( (_attribute_set) & ~(_mask) )
+
+/*PAGE
+ *
+ * _Attributes_Is_floating_point
+ *
+ */
+
+#define _Attributes_Is_floating_point( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_FLOATING_POINT )
+
+/*PAGE
+ *
+ * _Attributes_Is_global
+ *
+ */
+
+#define _Attributes_Is_global( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_GLOBAL )
+
+/*PAGE
+ *
+ * _Attributes_Is_priority
+ *
+ */
+
+#define _Attributes_Is_priority( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_PRIORITY )
+
+/*PAGE
+ *
+ * _Attributes_Is_binary_semaphore
+ *
+ */
+
+#define _Attributes_Is_binary_semaphore( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_BINARY_SEMAPHORE )
+
+/*PAGE
+ *
+ * _Attributes_Is_inherit_priority
+ *
+ */
+
+#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/c/src/exec/rtems/macros/dpmem.inl b/c/src/exec/rtems/macros/dpmem.inl
new file mode 100644
index 0000000000..9b12e66ab5
--- /dev/null
+++ b/c/src/exec/rtems/macros/dpmem.inl
@@ -0,0 +1,59 @@
+/* macros/dpmem.h
+ *
+ * This include file contains the inline routine used in conjunction
+ * with the Dual Ported Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_DPMEM_h
+#define __MACROS_DPMEM_h
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Allocate
+ *
+ */
+
+#define _Dual_ported_memory_Allocate() \
+ (Dual_ported_memory_Control *) \
+ _Objects_Allocate( &_Dual_ported_memory_Information )
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Free
+ *
+ */
+
+#define _Dual_ported_memory_Free( _the_port ) \
+ _Objects_Free( &_Dual_ported_memory_Information, &(_the_port)->Object )
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Get
+ *
+ */
+
+#define _Dual_ported_memory_Get( _id, _location ) \
+ (Dual_ported_memory_Control *) \
+ _Objects_Get( &_Dual_ported_memory_Information, (_id), (_location) )
+
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Is_null
+ */
+
+#define _Dual_ported_memory_Is_null( _the_port ) \
+ ( (_the_port) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/event.inl b/c/src/exec/rtems/macros/event.inl
new file mode 100644
index 0000000000..5bc060ba69
--- /dev/null
+++ b/c/src/exec/rtems/macros/event.inl
@@ -0,0 +1,21 @@
+/* macros/event.h
+ *
+ * This include file contains the implementation of macros for
+ * the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_EVENT_h
+#define __MACROS_EVENT_h
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/eventset.inl b/c/src/exec/rtems/macros/eventset.inl
new file mode 100644
index 0000000000..d5e95e4db6
--- /dev/null
+++ b/c/src/exec/rtems/macros/eventset.inl
@@ -0,0 +1,53 @@
+/* eventset.inl
+ *
+ * This include file contains the macro implementation of inlined
+ * routines in the event set object.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EVENT_SET_inl
+#define __EVENT_SET_inl
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Is_empty( _the_event_set ) \
+ ((_the_event_set) == 0 )
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Post( _the_new_events, _the_event_set ) \
+ *(_the_event_set) |= (_the_new_events)
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Get( _the_event_set, _the_event_condition ) \
+ ((_the_event_set) & (_the_event_condition))
+
+/*PAGE
+ *
+ * _Event_sets_Clear
+ */
+
+#define _Event_sets_Clear( _the_event_set, _the_mask ) \
+ ((_the_event_set) & ~(_the_mask))
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/message.inl b/c/src/exec/rtems/macros/message.inl
new file mode 100644
index 0000000000..6a0fe8f942
--- /dev/null
+++ b/c/src/exec/rtems/macros/message.inl
@@ -0,0 +1,49 @@
+/* message.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MESSAGE_QUEUE_inl
+#define __MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _Message_queue_Is_null
+ *
+ */
+
+#define _Message_queue_Is_null( _the_message_queue ) \
+ ( (_the_message_queue) == NULL )
+
+/*PAGE
+ *
+ * _Message_queue_Free
+ *
+ */
+
+#define _Message_queue_Free( _the_message_queue ) \
+ _Objects_Free( &_Message_queue_Information, &(_the_message_queue)->Object )
+
+/*PAGE
+ *
+ * _Message_queue_Get
+ *
+ */
+
+#define _Message_queue_Get( _id, _location ) \
+ (Message_queue_Control *) \
+ _Objects_Get( &_Message_queue_Information, (_id), (_location) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/modes.inl b/c/src/exec/rtems/macros/modes.inl
new file mode 100644
index 0000000000..3c03b8c5f6
--- /dev/null
+++ b/c/src/exec/rtems/macros/modes.inl
@@ -0,0 +1,92 @@
+/* modes.inl
+ *
+ * This include file contains the macro implementation of the
+ * inlined routines in the Mode Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MODES_inl
+#define __MODES_inl
+
+/*PAGE
+ *
+ * _Modes_Mask_changed
+ *
+ */
+
+#define _Modes_Mask_changed( _mode_set, _masks ) \
+ ( (_mode_set) & (_masks) )
+
+/*PAGE
+ *
+ * _Modes_Is_asr_disabled
+ *
+ */
+
+#define _Modes_Is_asr_disabled( _mode_set ) \
+ (((_mode_set) & RTEMS_ASR_MASK) == RTEMS_NO_ASR)
+
+/*PAGE
+ *
+ * _Modes_Is_preempt
+ *
+ */
+
+#define _Modes_Is_preempt( _mode_set ) \
+ ( ( (_mode_set) & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT )
+
+/*PAGE
+ *
+ * _Modes_Is_timeslice
+ *
+ */
+
+#define _Modes_Is_timeslice( _mode_set ) \
+ (((_mode_set) & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE)
+
+/*PAGE
+ *
+ * _Modes_Get_interrupt_level
+ *
+ */
+
+#define _Modes_Get_interrupt_level( _mode_set ) \
+ ( (_mode_set) & RTEMS_INTERRUPT_MASK )
+
+/*PAGE
+ *
+ * _Modes_Set_interrupt_level
+ *
+ */
+
+#define _Modes_Set_interrupt_level( _mode_set ) \
+ _ISR_Set_level( _Modes_Get_interrupt_level( (_mode_set) ) )
+
+/*PAGE
+ *
+ * _Modes_Change
+ *
+ */
+
+#define _Modes_Change( _old_mode_set, _new_mode_set, \
+ _mask, _out_mode_set, _changed ) \
+ { Modes_Control _out_mode; \
+ \
+ _out_mode = (_old_mode_set); \
+ _out_mode &= ~(_mask); \
+ _out_mode |= (_new_mode_set) & (_mask); \
+ *(_changed) = _out_mode ^ (_old_mode_set); \
+ *(_out_mode_set) = _out_mode; \
+ }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/options.inl b/c/src/exec/rtems/macros/options.inl
new file mode 100644
index 0000000000..41e4798d3c
--- /dev/null
+++ b/c/src/exec/rtems/macros/options.inl
@@ -0,0 +1,39 @@
+/* options.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Options Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OPTIONS_inl
+#define __OPTIONS_inl
+
+/*PAGE
+ *
+ * _Options_Is_no_wait
+ *
+ */
+
+#define _Options_Is_no_wait( _option_set ) \
+ ( (_option_set) & RTEMS_NO_WAIT )
+
+/*PAGE
+ *
+ * _Options_Is_any
+ *
+ */
+
+#define _Options_Is_any( _option_set ) \
+ ( (_option_set) & RTEMS_EVENT_ANY )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/part.inl b/c/src/exec/rtems/macros/part.inl
new file mode 100644
index 0000000000..f593acc577
--- /dev/null
+++ b/c/src/exec/rtems/macros/part.inl
@@ -0,0 +1,117 @@
+/* part.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PARTITION_inl
+#define __PARTITION_inl
+
+/*PAGE
+ *
+ * _Partition_Allocate_buffer
+ *
+ */
+
+#define _Partition_Allocate_buffer( _the_partition ) \
+ _Chain_Get( &(_the_partition)->Memory )
+
+/*PAGE
+ *
+ * _Partition_Free_buffer
+ *
+ */
+
+#define _Partition_Free_buffer( _the_partition, _the_buffer ) \
+ _Chain_Append( &(_the_partition)->Memory, (_the_buffer) )
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_on_boundary
+ *
+ */
+
+#define _Partition_Is_buffer_on_boundary( _the_buffer, _the_partition ) \
+ ((((unsigned32) _Addresses_Subtract( \
+ (_the_buffer), \
+ (_the_partition)->starting_address ) \
+ ) % \
+ (_the_partition)->buffer_size) == 0)
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_valid
+ *
+ */
+
+#define _Partition_Is_buffer_valid( _the_buffer, _the_partition ) \
+ ( \
+ _Addresses_Is_in_range( \
+ (_the_buffer), \
+ (_the_partition)->starting_address, \
+ _Addresses_Add_offset( \
+ (_the_partition)->starting_address, \
+ (_the_partition)->length \
+ ) \
+ ) && \
+ _Partition_Is_buffer_on_boundary( (_the_buffer), (_the_partition) ) \
+ )
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_size_aligned
+ *
+ */
+
+#define _Partition_Is_buffer_size_aligned( _buffer_size ) \
+ ((_buffer_size) % CPU_PARTITION_ALIGNMENT == 0)
+
+/*PAGE
+ *
+ * _Partition_Allocate
+ *
+ */
+
+#define _Partition_Allocate() \
+ (Partition_Control *) _Objects_Allocate( &_Partition_Information )
+
+/*PAGE
+ *
+ * _Partition_Free
+ *
+ */
+
+#define _Partition_Free( _the_partition ) \
+ _Objects_Free( &_Partition_Information, &(_the_partition)->Object )
+
+/*PAGE
+ *
+ * _Partition_Get
+ *
+ */
+
+#define _Partition_Get( _id, _location ) \
+ (Partition_Control *) \
+ _Objects_Get( &_Partition_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Partition_Is_null
+ *
+ */
+
+#define _Partition_Is_null( _the_partition ) \
+ ( (_the_partition) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/ratemon.inl b/c/src/exec/rtems/macros/ratemon.inl
new file mode 100644
index 0000000000..bdcaf25960
--- /dev/null
+++ b/c/src/exec/rtems/macros/ratemon.inl
@@ -0,0 +1,85 @@
+/* ratemon.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines in the Rate Monotonic Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_inl
+#define __RATE_MONOTONIC_inl
+
+/*PAGE
+ *
+ * _Rate_monotonic_Allocate
+ *
+ */
+
+#define _Rate_monotonic_Allocate() \
+ (Rate_monotonic_Control *) \
+ _Objects_Allocate( &_Rate_monotonic_Information )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Free
+ *
+ */
+
+#define _Rate_monotonic_Free( _the_period ) \
+ _Objects_Free( &_Rate_monotonic_Information, &(_the_period)->Object )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Get
+ *
+ */
+
+#define _Rate_monotonic_Get( _id, _location ) \
+ (Rate_monotonic_Control *) \
+ _Objects_Get( &_Rate_monotonic_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_active
+ *
+ */
+
+#define _Rate_monotonic_Is_active( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_ACTIVE)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_inactive
+ *
+ */
+
+#define _Rate_monotonic_Is_inactive( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_INACTIVE)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_expired
+ *
+ */
+
+#define _Rate_monotonic_Is_expired( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_EXPIRED)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_null
+ *
+ */
+
+#define _Rate_monotonic_Is_null( _the_period ) ( (_the_period) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/region.inl b/c/src/exec/rtems/macros/region.inl
new file mode 100644
index 0000000000..98fca1031b
--- /dev/null
+++ b/c/src/exec/rtems/macros/region.inl
@@ -0,0 +1,75 @@
+/* region.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __REGION_inl
+#define __REGION_inl
+
+/*PAGE
+ *
+ * _Region_Allocate
+ *
+ */
+
+#define _Region_Allocate() \
+ (Region_Control *) _Objects_Allocate( &_Region_Information )
+
+/*PAGE
+ *
+ * _Region_Free
+ *
+ */
+
+#define _Region_Free( _the_region ) \
+ _Objects_Free( &_Region_Information, &(_the_region)->Object )
+
+/*PAGE
+ *
+ * _Region_Get
+ *
+ */
+
+#define _Region_Get( _id, _location ) \
+ (Region_Control *) \
+ _Objects_Get( &_Region_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Region_Allocate_segment
+ *
+ */
+
+#define _Region_Allocate_segment( _the_region, _size ) \
+ _Heap_Allocate( &(_the_region)->Memory, (_size) )
+
+/*PAGE
+ *
+ * _Region_Free_segment
+ *
+ */
+
+#define _Region_Free_segment( _the_region, _the_segment ) \
+ _Heap_Free( &(_the_region)->Memory, (_the_segment) )
+
+/*PAGE
+ *
+ * _Region_Is_null
+ *
+ */
+
+#define _Region_Is_null( _the_region ) ( (_the_region) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/Makefile.in b/c/src/exec/rtems/macros/rtems/rtems/Makefile.in
new file mode 100644
index 0000000000..e041a1b657
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES=asr attr dpmem event eventset message modes options \
+ part ratemon region sem status support tasks timer
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/rtems
diff --git a/c/src/exec/rtems/macros/rtems/rtems/asr.inl b/c/src/exec/rtems/macros/rtems/rtems/asr.inl
new file mode 100644
index 0000000000..dc6dc414b8
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/asr.inl
@@ -0,0 +1,90 @@
+/* macros/asr.h
+ *
+ * This include file contains the implemenation of all routines
+ * associated with the asynchronous signal handler which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ASR_h
+#define __INLINE_ASR_h
+
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _ASR_Initialize
+ *
+ */
+
+#define _ASR_Initialize( _information ) \
+{ \
+ (_information)->is_enabled = TRUE; \
+ (_information)->handler = NULL; \
+ (_information)->mode_set = RTEMS_DEFAULT_MODES; \
+ (_information)->signals_posted = 0; \
+ (_information)->signals_pending = 0; \
+ (_information)->nest_level = 0; \
+}
+
+/*PAGE
+ *
+ * _ASR_Swap_signals
+ *
+ */
+
+#define _ASR_Swap_signals( _information ) \
+{ \
+ rtems_signal_set _signals; \
+ ISR_Level _level; \
+ \
+ _ISR_Disable( _level ); \
+ _signals = (_information)->signals_pending; \
+ (_information)->signals_pending = (_information)->signals_posted; \
+ (_information)->signals_posted = _signals; \
+ _ISR_Enable( _level ); \
+}
+
+/*PAGE
+ *
+ * _ASR_Is_null_handler
+ *
+ */
+
+#define _ASR_Is_null_handler( _asr_handler ) \
+ ( (_asr_handler) == NULL )
+
+/*PAGE
+ *
+ * _ASR_Are_signals_pending
+ *
+ */
+
+#define _ASR_Are_signals_pending( _information ) \
+ ( (_information)->signals_posted != 0 )
+
+/*PAGE
+ *
+ * _ASR_Post_signals
+ *
+ */
+
+#define _ASR_Post_signals( _signals, _signal_set ) \
+ do { \
+ ISR_Level _level; \
+ \
+ _ISR_Disable( _level ); \
+ *(_signal_set) |= (_signals); \
+ _ISR_Enable( _level ); \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/attr.inl b/c/src/exec/rtems/macros/rtems/rtems/attr.inl
new file mode 100644
index 0000000000..a538d2bdd3
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/attr.inl
@@ -0,0 +1,91 @@
+/* macros/attr.h
+ *
+ * This include file contains all of the inlined routines associated
+ * with attributes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_ATTRIBUTES_h
+#define __MACROS_ATTRIBUTES_h
+
+/*PAGE
+ *
+ * _Attributes_Set
+ */
+
+#define _Attributes_Set( _new_attributes, _attribute_set ) \
+ ( (_attribute_set) | (_new_attributes) )
+
+/*PAGE
+ *
+ * _Attributes_Clear
+ */
+
+#define _Attributes_Clear( _attribute_set, _mask ) \
+ ( (_attribute_set) & ~(_mask) )
+
+/*PAGE
+ *
+ * _Attributes_Is_floating_point
+ *
+ */
+
+#define _Attributes_Is_floating_point( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_FLOATING_POINT )
+
+/*PAGE
+ *
+ * _Attributes_Is_global
+ *
+ */
+
+#define _Attributes_Is_global( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_GLOBAL )
+
+/*PAGE
+ *
+ * _Attributes_Is_priority
+ *
+ */
+
+#define _Attributes_Is_priority( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_PRIORITY )
+
+/*PAGE
+ *
+ * _Attributes_Is_binary_semaphore
+ *
+ */
+
+#define _Attributes_Is_binary_semaphore( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_BINARY_SEMAPHORE )
+
+/*PAGE
+ *
+ * _Attributes_Is_inherit_priority
+ *
+ */
+
+#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/c/src/exec/rtems/macros/rtems/rtems/dpmem.inl b/c/src/exec/rtems/macros/rtems/rtems/dpmem.inl
new file mode 100644
index 0000000000..9b12e66ab5
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/dpmem.inl
@@ -0,0 +1,59 @@
+/* macros/dpmem.h
+ *
+ * This include file contains the inline routine used in conjunction
+ * with the Dual Ported Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_DPMEM_h
+#define __MACROS_DPMEM_h
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Allocate
+ *
+ */
+
+#define _Dual_ported_memory_Allocate() \
+ (Dual_ported_memory_Control *) \
+ _Objects_Allocate( &_Dual_ported_memory_Information )
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Free
+ *
+ */
+
+#define _Dual_ported_memory_Free( _the_port ) \
+ _Objects_Free( &_Dual_ported_memory_Information, &(_the_port)->Object )
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Get
+ *
+ */
+
+#define _Dual_ported_memory_Get( _id, _location ) \
+ (Dual_ported_memory_Control *) \
+ _Objects_Get( &_Dual_ported_memory_Information, (_id), (_location) )
+
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Is_null
+ */
+
+#define _Dual_ported_memory_Is_null( _the_port ) \
+ ( (_the_port) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/event.inl b/c/src/exec/rtems/macros/rtems/rtems/event.inl
new file mode 100644
index 0000000000..5bc060ba69
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/event.inl
@@ -0,0 +1,21 @@
+/* macros/event.h
+ *
+ * This include file contains the implementation of macros for
+ * the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_EVENT_h
+#define __MACROS_EVENT_h
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/eventset.inl b/c/src/exec/rtems/macros/rtems/rtems/eventset.inl
new file mode 100644
index 0000000000..d5e95e4db6
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/eventset.inl
@@ -0,0 +1,53 @@
+/* eventset.inl
+ *
+ * This include file contains the macro implementation of inlined
+ * routines in the event set object.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EVENT_SET_inl
+#define __EVENT_SET_inl
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Is_empty( _the_event_set ) \
+ ((_the_event_set) == 0 )
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Post( _the_new_events, _the_event_set ) \
+ *(_the_event_set) |= (_the_new_events)
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Get( _the_event_set, _the_event_condition ) \
+ ((_the_event_set) & (_the_event_condition))
+
+/*PAGE
+ *
+ * _Event_sets_Clear
+ */
+
+#define _Event_sets_Clear( _the_event_set, _the_mask ) \
+ ((_the_event_set) & ~(_the_mask))
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/message.inl b/c/src/exec/rtems/macros/rtems/rtems/message.inl
new file mode 100644
index 0000000000..6a0fe8f942
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/message.inl
@@ -0,0 +1,49 @@
+/* message.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MESSAGE_QUEUE_inl
+#define __MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _Message_queue_Is_null
+ *
+ */
+
+#define _Message_queue_Is_null( _the_message_queue ) \
+ ( (_the_message_queue) == NULL )
+
+/*PAGE
+ *
+ * _Message_queue_Free
+ *
+ */
+
+#define _Message_queue_Free( _the_message_queue ) \
+ _Objects_Free( &_Message_queue_Information, &(_the_message_queue)->Object )
+
+/*PAGE
+ *
+ * _Message_queue_Get
+ *
+ */
+
+#define _Message_queue_Get( _id, _location ) \
+ (Message_queue_Control *) \
+ _Objects_Get( &_Message_queue_Information, (_id), (_location) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/modes.inl b/c/src/exec/rtems/macros/rtems/rtems/modes.inl
new file mode 100644
index 0000000000..3c03b8c5f6
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/modes.inl
@@ -0,0 +1,92 @@
+/* modes.inl
+ *
+ * This include file contains the macro implementation of the
+ * inlined routines in the Mode Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MODES_inl
+#define __MODES_inl
+
+/*PAGE
+ *
+ * _Modes_Mask_changed
+ *
+ */
+
+#define _Modes_Mask_changed( _mode_set, _masks ) \
+ ( (_mode_set) & (_masks) )
+
+/*PAGE
+ *
+ * _Modes_Is_asr_disabled
+ *
+ */
+
+#define _Modes_Is_asr_disabled( _mode_set ) \
+ (((_mode_set) & RTEMS_ASR_MASK) == RTEMS_NO_ASR)
+
+/*PAGE
+ *
+ * _Modes_Is_preempt
+ *
+ */
+
+#define _Modes_Is_preempt( _mode_set ) \
+ ( ( (_mode_set) & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT )
+
+/*PAGE
+ *
+ * _Modes_Is_timeslice
+ *
+ */
+
+#define _Modes_Is_timeslice( _mode_set ) \
+ (((_mode_set) & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE)
+
+/*PAGE
+ *
+ * _Modes_Get_interrupt_level
+ *
+ */
+
+#define _Modes_Get_interrupt_level( _mode_set ) \
+ ( (_mode_set) & RTEMS_INTERRUPT_MASK )
+
+/*PAGE
+ *
+ * _Modes_Set_interrupt_level
+ *
+ */
+
+#define _Modes_Set_interrupt_level( _mode_set ) \
+ _ISR_Set_level( _Modes_Get_interrupt_level( (_mode_set) ) )
+
+/*PAGE
+ *
+ * _Modes_Change
+ *
+ */
+
+#define _Modes_Change( _old_mode_set, _new_mode_set, \
+ _mask, _out_mode_set, _changed ) \
+ { Modes_Control _out_mode; \
+ \
+ _out_mode = (_old_mode_set); \
+ _out_mode &= ~(_mask); \
+ _out_mode |= (_new_mode_set) & (_mask); \
+ *(_changed) = _out_mode ^ (_old_mode_set); \
+ *(_out_mode_set) = _out_mode; \
+ }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/options.inl b/c/src/exec/rtems/macros/rtems/rtems/options.inl
new file mode 100644
index 0000000000..41e4798d3c
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/options.inl
@@ -0,0 +1,39 @@
+/* options.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Options Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OPTIONS_inl
+#define __OPTIONS_inl
+
+/*PAGE
+ *
+ * _Options_Is_no_wait
+ *
+ */
+
+#define _Options_Is_no_wait( _option_set ) \
+ ( (_option_set) & RTEMS_NO_WAIT )
+
+/*PAGE
+ *
+ * _Options_Is_any
+ *
+ */
+
+#define _Options_Is_any( _option_set ) \
+ ( (_option_set) & RTEMS_EVENT_ANY )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/part.inl b/c/src/exec/rtems/macros/rtems/rtems/part.inl
new file mode 100644
index 0000000000..f593acc577
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/part.inl
@@ -0,0 +1,117 @@
+/* part.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PARTITION_inl
+#define __PARTITION_inl
+
+/*PAGE
+ *
+ * _Partition_Allocate_buffer
+ *
+ */
+
+#define _Partition_Allocate_buffer( _the_partition ) \
+ _Chain_Get( &(_the_partition)->Memory )
+
+/*PAGE
+ *
+ * _Partition_Free_buffer
+ *
+ */
+
+#define _Partition_Free_buffer( _the_partition, _the_buffer ) \
+ _Chain_Append( &(_the_partition)->Memory, (_the_buffer) )
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_on_boundary
+ *
+ */
+
+#define _Partition_Is_buffer_on_boundary( _the_buffer, _the_partition ) \
+ ((((unsigned32) _Addresses_Subtract( \
+ (_the_buffer), \
+ (_the_partition)->starting_address ) \
+ ) % \
+ (_the_partition)->buffer_size) == 0)
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_valid
+ *
+ */
+
+#define _Partition_Is_buffer_valid( _the_buffer, _the_partition ) \
+ ( \
+ _Addresses_Is_in_range( \
+ (_the_buffer), \
+ (_the_partition)->starting_address, \
+ _Addresses_Add_offset( \
+ (_the_partition)->starting_address, \
+ (_the_partition)->length \
+ ) \
+ ) && \
+ _Partition_Is_buffer_on_boundary( (_the_buffer), (_the_partition) ) \
+ )
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_size_aligned
+ *
+ */
+
+#define _Partition_Is_buffer_size_aligned( _buffer_size ) \
+ ((_buffer_size) % CPU_PARTITION_ALIGNMENT == 0)
+
+/*PAGE
+ *
+ * _Partition_Allocate
+ *
+ */
+
+#define _Partition_Allocate() \
+ (Partition_Control *) _Objects_Allocate( &_Partition_Information )
+
+/*PAGE
+ *
+ * _Partition_Free
+ *
+ */
+
+#define _Partition_Free( _the_partition ) \
+ _Objects_Free( &_Partition_Information, &(_the_partition)->Object )
+
+/*PAGE
+ *
+ * _Partition_Get
+ *
+ */
+
+#define _Partition_Get( _id, _location ) \
+ (Partition_Control *) \
+ _Objects_Get( &_Partition_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Partition_Is_null
+ *
+ */
+
+#define _Partition_Is_null( _the_partition ) \
+ ( (_the_partition) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/ratemon.inl b/c/src/exec/rtems/macros/rtems/rtems/ratemon.inl
new file mode 100644
index 0000000000..bdcaf25960
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/ratemon.inl
@@ -0,0 +1,85 @@
+/* ratemon.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines in the Rate Monotonic Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_inl
+#define __RATE_MONOTONIC_inl
+
+/*PAGE
+ *
+ * _Rate_monotonic_Allocate
+ *
+ */
+
+#define _Rate_monotonic_Allocate() \
+ (Rate_monotonic_Control *) \
+ _Objects_Allocate( &_Rate_monotonic_Information )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Free
+ *
+ */
+
+#define _Rate_monotonic_Free( _the_period ) \
+ _Objects_Free( &_Rate_monotonic_Information, &(_the_period)->Object )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Get
+ *
+ */
+
+#define _Rate_monotonic_Get( _id, _location ) \
+ (Rate_monotonic_Control *) \
+ _Objects_Get( &_Rate_monotonic_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_active
+ *
+ */
+
+#define _Rate_monotonic_Is_active( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_ACTIVE)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_inactive
+ *
+ */
+
+#define _Rate_monotonic_Is_inactive( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_INACTIVE)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_expired
+ *
+ */
+
+#define _Rate_monotonic_Is_expired( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_EXPIRED)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_null
+ *
+ */
+
+#define _Rate_monotonic_Is_null( _the_period ) ( (_the_period) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/region.inl b/c/src/exec/rtems/macros/rtems/rtems/region.inl
new file mode 100644
index 0000000000..98fca1031b
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/region.inl
@@ -0,0 +1,75 @@
+/* region.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __REGION_inl
+#define __REGION_inl
+
+/*PAGE
+ *
+ * _Region_Allocate
+ *
+ */
+
+#define _Region_Allocate() \
+ (Region_Control *) _Objects_Allocate( &_Region_Information )
+
+/*PAGE
+ *
+ * _Region_Free
+ *
+ */
+
+#define _Region_Free( _the_region ) \
+ _Objects_Free( &_Region_Information, &(_the_region)->Object )
+
+/*PAGE
+ *
+ * _Region_Get
+ *
+ */
+
+#define _Region_Get( _id, _location ) \
+ (Region_Control *) \
+ _Objects_Get( &_Region_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Region_Allocate_segment
+ *
+ */
+
+#define _Region_Allocate_segment( _the_region, _size ) \
+ _Heap_Allocate( &(_the_region)->Memory, (_size) )
+
+/*PAGE
+ *
+ * _Region_Free_segment
+ *
+ */
+
+#define _Region_Free_segment( _the_region, _the_segment ) \
+ _Heap_Free( &(_the_region)->Memory, (_the_segment) )
+
+/*PAGE
+ *
+ * _Region_Is_null
+ *
+ */
+
+#define _Region_Is_null( _the_region ) ( (_the_region) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/sem.inl b/c/src/exec/rtems/macros/rtems/rtems/sem.inl
new file mode 100644
index 0000000000..15d1404acf
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/sem.inl
@@ -0,0 +1,58 @@
+/* sem.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SEMAPHORE_inl
+#define __SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _Semaphore_Allocate
+ *
+ */
+
+#define _Semaphore_Allocate() \
+ (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information )
+
+/*PAGE
+ *
+ * _Semaphore_Free
+ *
+ */
+
+#define _Semaphore_Free( _the_semaphore ) \
+ _Objects_Free( &_Semaphore_Information, &(_the_semaphore)->Object )
+
+/*PAGE
+ *
+ * _Semaphore_Get
+ *
+ */
+
+#define _Semaphore_Get( _id, _location ) \
+ (Semaphore_Control *) \
+ _Objects_Get( &_Semaphore_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Semaphore_Is_null
+ *
+ */
+
+#define _Semaphore_Is_null( _the_semaphore ) \
+ ( (_the_semaphore) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/status.inl b/c/src/exec/rtems/macros/rtems/rtems/status.inl
new file mode 100644
index 0000000000..d90ec79234
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/status.inl
@@ -0,0 +1,39 @@
+/* macros/status.h
+ *
+ * This include file contains the implementations of the inlined
+ * routines for the status package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_STATUS_h
+#define __MACROS_STATUS_h
+
+/*PAGE
+ *
+ * rtems_is_status_successful
+ *
+ */
+
+#define rtems_is_status_successful( _code ) \
+ ( (_code) == RTEMS_SUCCESSFUL )
+
+/*PAGE
+ *
+ * rtems_are_statuses_equal
+ *
+ */
+
+#define rtems_are_statuses_equal( _code1, _code2 ) \
+ ((_code1) == (_code2))
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/support.inl b/c/src/exec/rtems/macros/rtems/rtems/support.inl
new file mode 100644
index 0000000000..59d3bfec95
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/support.inl
@@ -0,0 +1,44 @@
+/* support.inl
+ *
+ * This include file contains the macros implementation of all
+ * of the inlined routines specific to the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SUPPORT_inl
+#define __RTEMS_SUPPORT_inl
+
+/*PAGE
+ *
+ * rtems_is_name_valid
+ *
+ */
+
+#define rtems_is_name_valid( _name ) \
+ ( (_name) != 0 )
+
+/*PAGE
+ *
+ * rtems_name_to_characters
+ *
+ */
+
+#define rtems_name_to_characters( _name, _c1, _c2, _c3, _c4 ) \
+ { \
+ (*(_c1) = ((_name) >> 24) & 0xff; \
+ (*(_c2) = ((_name) >> 16) & 0xff; \
+ (*(_c3) = ((_name) >> 8) & 0xff; \
+ (*(_c4) = ((_name)) & 0xff; \
+ }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/rtems/rtems/tasks.inl b/c/src/exec/rtems/macros/rtems/rtems/tasks.inl
new file mode 100644
index 0000000000..12d8fc51cc
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/tasks.inl
@@ -0,0 +1,58 @@
+/* tasks.inl
+ *
+ * This file contains the macro implementation of all inlined
+ * routines in the with RTEMS Tasks Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TASKS_inl
+#define __RTEMS_TASKS_inl
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Allocate
+ *
+ */
+
+#define _RTEMS_tasks_Allocate() \
+ (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information )
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Free
+ *
+ */
+
+#define _RTEMS_tasks_Free( _the_task ) \
+ _Objects_Free( &_RTEMS_tasks_Information, &(_the_task)->Object )
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_to_Core
+ */
+
+#define _RTEMS_tasks_Priority_to_Core( _priority ) \
+ ((Priority_Control) (_priority))
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_is_valid
+ *
+ */
+
+#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/c/src/exec/rtems/macros/rtems/rtems/timer.inl b/c/src/exec/rtems/macros/rtems/rtems/timer.inl
new file mode 100644
index 0000000000..0f9d9d56ef
--- /dev/null
+++ b/c/src/exec/rtems/macros/rtems/rtems/timer.inl
@@ -0,0 +1,85 @@
+/* timer.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Timer Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_inl
+#define __TIMER_inl
+
+/*PAGE
+ *
+ * _Timer_Allocate
+ *
+ */
+
+#define _Timer_Allocate() \
+ (Timer_Control *) _Objects_Allocate( &_Timer_Information )
+
+/*PAGE
+ *
+ * _Timer_Free
+ *
+ */
+
+#define _Timer_Free( _the_timer ) \
+ _Objects_Free( &_Timer_Information, &(_the_timer)->Object )
+
+/*PAGE
+ *
+ * _Timer_Get
+ *
+ */
+
+#define _Timer_Get( _id, _location ) \
+ (Timer_Control *) \
+ _Objects_Get( &_Timer_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Timer_Is_interval_class
+ *
+ */
+
+#define _Timer_Is_interval_class( _the_class ) \
+ ( (_the_class) == TIMER_INTERVAL )
+
+/*PAGE
+ *
+ * _Timer_Is_time_of_day_class
+ *
+ */
+
+#define _Timer_Is_time_of_day_class( _the_class ) \
+ ( (_the_class) == TIMER_TIME_OF_DAY )
+
+/*PAGE
+ *
+ * _Timer_Is_dormant_class
+ *
+ */
+
+#define _Timer_Is_dormant_class( _the_class ) \
+ ( (_the_class) == TIMER_DORMANT )
+
+/*PAGE
+ *
+ * _Timer_Is_null
+ *
+ */
+
+#define _Timer_Is_null( _the_timer ) \
+ ( (_the_timer) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/sem.inl b/c/src/exec/rtems/macros/sem.inl
new file mode 100644
index 0000000000..15d1404acf
--- /dev/null
+++ b/c/src/exec/rtems/macros/sem.inl
@@ -0,0 +1,58 @@
+/* sem.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SEMAPHORE_inl
+#define __SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _Semaphore_Allocate
+ *
+ */
+
+#define _Semaphore_Allocate() \
+ (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information )
+
+/*PAGE
+ *
+ * _Semaphore_Free
+ *
+ */
+
+#define _Semaphore_Free( _the_semaphore ) \
+ _Objects_Free( &_Semaphore_Information, &(_the_semaphore)->Object )
+
+/*PAGE
+ *
+ * _Semaphore_Get
+ *
+ */
+
+#define _Semaphore_Get( _id, _location ) \
+ (Semaphore_Control *) \
+ _Objects_Get( &_Semaphore_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Semaphore_Is_null
+ *
+ */
+
+#define _Semaphore_Is_null( _the_semaphore ) \
+ ( (_the_semaphore) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/status.inl b/c/src/exec/rtems/macros/status.inl
new file mode 100644
index 0000000000..d90ec79234
--- /dev/null
+++ b/c/src/exec/rtems/macros/status.inl
@@ -0,0 +1,39 @@
+/* macros/status.h
+ *
+ * This include file contains the implementations of the inlined
+ * routines for the status package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_STATUS_h
+#define __MACROS_STATUS_h
+
+/*PAGE
+ *
+ * rtems_is_status_successful
+ *
+ */
+
+#define rtems_is_status_successful( _code ) \
+ ( (_code) == RTEMS_SUCCESSFUL )
+
+/*PAGE
+ *
+ * rtems_are_statuses_equal
+ *
+ */
+
+#define rtems_are_statuses_equal( _code1, _code2 ) \
+ ((_code1) == (_code2))
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/support.inl b/c/src/exec/rtems/macros/support.inl
new file mode 100644
index 0000000000..59d3bfec95
--- /dev/null
+++ b/c/src/exec/rtems/macros/support.inl
@@ -0,0 +1,44 @@
+/* support.inl
+ *
+ * This include file contains the macros implementation of all
+ * of the inlined routines specific to the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SUPPORT_inl
+#define __RTEMS_SUPPORT_inl
+
+/*PAGE
+ *
+ * rtems_is_name_valid
+ *
+ */
+
+#define rtems_is_name_valid( _name ) \
+ ( (_name) != 0 )
+
+/*PAGE
+ *
+ * rtems_name_to_characters
+ *
+ */
+
+#define rtems_name_to_characters( _name, _c1, _c2, _c3, _c4 ) \
+ { \
+ (*(_c1) = ((_name) >> 24) & 0xff; \
+ (*(_c2) = ((_name) >> 16) & 0xff; \
+ (*(_c3) = ((_name) >> 8) & 0xff; \
+ (*(_c4) = ((_name)) & 0xff; \
+ }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/macros/tasks.inl b/c/src/exec/rtems/macros/tasks.inl
new file mode 100644
index 0000000000..12d8fc51cc
--- /dev/null
+++ b/c/src/exec/rtems/macros/tasks.inl
@@ -0,0 +1,58 @@
+/* tasks.inl
+ *
+ * This file contains the macro implementation of all inlined
+ * routines in the with RTEMS Tasks Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TASKS_inl
+#define __RTEMS_TASKS_inl
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Allocate
+ *
+ */
+
+#define _RTEMS_tasks_Allocate() \
+ (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information )
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Free
+ *
+ */
+
+#define _RTEMS_tasks_Free( _the_task ) \
+ _Objects_Free( &_RTEMS_tasks_Information, &(_the_task)->Object )
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_to_Core
+ */
+
+#define _RTEMS_tasks_Priority_to_Core( _priority ) \
+ ((Priority_Control) (_priority))
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_is_valid
+ *
+ */
+
+#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/c/src/exec/rtems/macros/timer.inl b/c/src/exec/rtems/macros/timer.inl
new file mode 100644
index 0000000000..0f9d9d56ef
--- /dev/null
+++ b/c/src/exec/rtems/macros/timer.inl
@@ -0,0 +1,85 @@
+/* timer.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Timer Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_inl
+#define __TIMER_inl
+
+/*PAGE
+ *
+ * _Timer_Allocate
+ *
+ */
+
+#define _Timer_Allocate() \
+ (Timer_Control *) _Objects_Allocate( &_Timer_Information )
+
+/*PAGE
+ *
+ * _Timer_Free
+ *
+ */
+
+#define _Timer_Free( _the_timer ) \
+ _Objects_Free( &_Timer_Information, &(_the_timer)->Object )
+
+/*PAGE
+ *
+ * _Timer_Get
+ *
+ */
+
+#define _Timer_Get( _id, _location ) \
+ (Timer_Control *) \
+ _Objects_Get( &_Timer_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Timer_Is_interval_class
+ *
+ */
+
+#define _Timer_Is_interval_class( _the_class ) \
+ ( (_the_class) == TIMER_INTERVAL )
+
+/*PAGE
+ *
+ * _Timer_Is_time_of_day_class
+ *
+ */
+
+#define _Timer_Is_time_of_day_class( _the_class ) \
+ ( (_the_class) == TIMER_TIME_OF_DAY )
+
+/*PAGE
+ *
+ * _Timer_Is_dormant_class
+ *
+ */
+
+#define _Timer_Is_dormant_class( _the_class ) \
+ ( (_the_class) == TIMER_DORMANT )
+
+/*PAGE
+ *
+ * _Timer_Is_null
+ *
+ */
+
+#define _Timer_Is_null( _the_timer ) \
+ ( (_the_timer) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/rtems/optman/Makefile.in b/c/src/exec/rtems/optman/Makefile.in
new file mode 100644
index 0000000000..ac24e9b841
--- /dev/null
+++ b/c/src/exec/rtems/optman/Makefile.in
@@ -0,0 +1,49 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+C_FILES= no-dpmem.c no-event.c no-mp.c no-msg.c \
+ no-part.c no-region.c no-rtmon.c no-sem.c no-signal.c no-timer.c
+
+S_FILES=
+
+H_FILES=
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES)
+
+PGMS=$(C_FILES:%.c=$(ARCH)/%.rel)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+ASM4FLAGS += -I $(PROJECT_RELEASE)/include/rtems
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGMS)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
diff --git a/c/src/exec/rtems/optman/no-dpmem.c b/c/src/exec/rtems/optman/no-dpmem.c
new file mode 100644
index 0000000000..bab609f42f
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-dpmem.c
@@ -0,0 +1,98 @@
+/*
+ * Dual Port Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/dpmem.h>
+
+void _Dual_ported_memory_Manager_initialization(
+ unsigned32 maximum_ports
+)
+{
+}
+
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ unsigned32 length,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_internal_to_external(
+ Objects_Id id,
+ void *internal,
+ void **external
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_external_to_internal(
+ Objects_Id id,
+ void *external,
+ void **internal
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/exec/rtems/optman/no-event.c b/c/src/exec/rtems/optman/no-event.c
new file mode 100644
index 0000000000..63b1014351
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-event.c
@@ -0,0 +1,56 @@
+/*
+ * Event Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _Event_Manager_initialization( void )
+{
+}
+
+rtems_status_code rtems_event_send(
+ Objects_Id id,
+ rtems_event_set event_in
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_event_receive(
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
diff --git a/c/src/exec/rtems/optman/no-mp.c b/c/src/exec/rtems/optman/no-mp.c
new file mode 100644
index 0000000000..bad3476729
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-mp.c
@@ -0,0 +1,201 @@
+/*
+ * Multiprocessing Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/interr.h>
+
+void _Multiprocessing_Manager_initialization ( void )
+{
+}
+
+void rtems_multiprocessing_announce ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table,
+ unsigned32 timeout_status
+)
+{
+}
+
+void _MPCI_Create_server( void )
+{
+}
+
+void _MPCI_Initialization ( void )
+{
+}
+
+void _MPCI_Register_packet_processor(
+ MP_packet_Classes the_class,
+ MPCI_Packet_processor the_packet_processor
+
+)
+{
+}
+
+MP_packet_Prefix *_MPCI_Get_packet ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+void _MPCI_Return_packet (
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Send_process_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+unsigned32 _MPCI_Send_request_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet,
+ States_Control extra_state
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return 0;
+}
+
+void _MPCI_Send_response_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+MP_packet_Prefix *_MPCI_Receive_packet ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+Thread_Control *_MPCI_Process_response (
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+Thread _MPCI_Receive_server(
+ unsigned32 ignore
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Announce ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+
+void _MPCI_Internal_packets_Send_process_packet (
+ MPCI_Internal_Remote_operations operation
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Internal_packets_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+MPCI_Internal_packet *_MPCI_Internal_packets_Get_packet ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/optman/no-msg.c b/c/src/exec/rtems/optman/no-msg.c
new file mode 100644
index 0000000000..f5f3d6e551
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-msg.c
@@ -0,0 +1,192 @@
+/*
+ * Message Queue Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/message.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/interr.h>
+
+void _Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+)
+{
+}
+
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ unsigned32 count,
+ unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_send(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_urgent(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_broadcast(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ unsigned32 *count
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_receive(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size_p,
+ unsigned32 option_set,
+ rtems_interval timeout
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_flush(
+ Objects_Id id,
+ unsigned32 *count
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+unsigned32 _Message_queue_Flush_support(
+ Message_queue_Control *the_message_queue
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+ return 0;
+}
+
+boolean _Message_queue_Seize(
+ Message_queue_Control *the_message_queue,
+ rtems_option option_set,
+ void *buffer,
+ unsigned32 *size_p
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+ _Thread_Executing->Wait.return_code = RTEMS_UNSATISFIED;
+ return TRUE;
+}
+
+rtems_status_code _Message_queue_Submit(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ Message_queue_Submit_types submit_type
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/exec/rtems/optman/no-part.c b/c/src/exec/rtems/optman/no-part.c
new file mode 100644
index 0000000000..7efb5b6f06
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-part.c
@@ -0,0 +1,97 @@
+/*
+ * Partition Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _Partition_Manager_initialization(
+ unsigned32 maximum_partitions
+)
+{
+}
+
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_get_buffer(
+ Objects_Id id,
+ void **buffer
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_return_buffer(
+ Objects_Id id,
+ void *buffer
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/exec/rtems/optman/no-region.c b/c/src/exec/rtems/optman/no-region.c
new file mode 100644
index 0000000000..da97953e56
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-region.c
@@ -0,0 +1,114 @@
+/*
+ * Region Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _Region_Manager_initialization(
+ unsigned32 maximum_regions
+)
+{
+}
+
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 page_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_get_segment(
+ Objects_Id id,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_get_segment_size(
+ Objects_Id id,
+ void *segment,
+ unsigned32 *size
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_return_segment(
+ Objects_Id id,
+ void *segment
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/exec/rtems/optman/no-rtmon.c b/c/src/exec/rtems/optman/no-rtmon.c
new file mode 100644
index 0000000000..01f539524b
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-rtmon.c
@@ -0,0 +1,117 @@
+/*
+ * Rate Monotonic Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/ratemon.h>
+
+void _Rate_monotonic_Manager_initialization(
+ unsigned32 maximum_periods
+)
+{
+}
+
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_cancel(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_period(
+ Objects_Id id,
+ rtems_interval length
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+void _Rate_monotonic_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+boolean _Rate_monotonic_Set_state(
+Rate_monotonic_Control *the_period
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return FALSE;
+}
diff --git a/c/src/exec/rtems/optman/no-sem.c b/c/src/exec/rtems/optman/no-sem.c
new file mode 100644
index 0000000000..334b94233e
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-sem.c
@@ -0,0 +1,114 @@
+/*
+ * Semaphore Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/interr.h>
+
+void _Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+)
+{
+}
+
+rtems_status_code rtems_semaphore_create(
+ rtems_name name,
+ unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_obtain(
+ Objects_Id id,
+ unsigned32 option_set,
+ rtems_interval timeout
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_release(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+boolean _Semaphore_Seize(
+ Semaphore_Control *the_semaphore,
+ rtems_option option_set
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ _Thread_Executing->Wait.return_code = RTEMS_UNSATISFIED;
+ return TRUE;
+}
diff --git a/c/src/exec/rtems/optman/no-signal.c b/c/src/exec/rtems/optman/no-signal.c
new file mode 100644
index 0000000000..a8e0b4e610
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-signal.c
@@ -0,0 +1,56 @@
+/*
+ * Signal Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/rtems/signal.h>
+
+void _Signal_Manager_initialization( void )
+{
+}
+
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry handler,
+ rtems_mode mode_set
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_signal_send(
+ rtems_id id,
+ rtems_signal_set signal_set
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/optman/no-timer.c b/c/src/exec/rtems/optman/no-timer.c
new file mode 100644
index 0000000000..6a8f17e0f9
--- /dev/null
+++ b/c/src/exec/rtems/optman/no-timer.c
@@ -0,0 +1,123 @@
+/*
+ * Timer Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/timer.h>
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+)
+{
+}
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_fire_after(
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_fire_when(
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/exec/rtems/src/Makefile.in b/c/src/exec/rtems/src/Makefile.in
new file mode 100644
index 0000000000..99a7fa75cd
--- /dev/null
+++ b/c/src/exec/rtems/src/Makefile.in
@@ -0,0 +1,40 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+C_PIECES=clock dpmem event eventmp intr mp msg msgmp \
+ part partmp ratemon region regionmp sem semmp signal signalmp \
+ taskmp tasks timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+SRCS=$(C_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) ${OBJS}
diff --git a/c/src/exec/rtems/src/clock.c b/c/src/exec/rtems/src/clock.c
new file mode 100644
index 0000000000..388e6f091f
--- /dev/null
+++ b/c/src/exec/rtems/src/clock.c
@@ -0,0 +1,151 @@
+/*
+ * Clock Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * rtems_clock_get
+ *
+ * This directive returns the current date and time. If the time has
+ * not been set by a tm_set then an error is returned.
+ *
+ * Input parameters:
+ * option - which value to return
+ * time_buffer - pointer to output buffer (a time and date structure
+ * or an interval)
+ *
+ * Output parameters:
+ * time_buffer - output filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_clock_get(
+ rtems_clock_get_options option,
+ void *time_buffer
+)
+{
+ ISR_Level level;
+ rtems_interval tmp;
+
+ switch ( option ) {
+ case RTEMS_CLOCK_GET_TOD:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ *(rtems_time_of_day *)time_buffer = _TOD_Current;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ *(rtems_interval *)time_buffer = _TOD_Seconds_since_epoch;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT:
+ *(rtems_interval *)time_buffer = _Watchdog_Ticks_since_boot;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TICKS_PER_SECOND:
+ *(rtems_interval *)time_buffer = _TOD_Ticks_per_second;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TIME_VALUE:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ _ISR_Disable( level );
+ ((rtems_clock_time_value *)time_buffer)->seconds =
+ _TOD_Seconds_since_epoch;
+ tmp = _TOD_Current.ticks;
+ _ISR_Enable( level );
+
+ tmp *= _TOD_Microseconds_per_tick;
+ ((rtems_clock_time_value *)time_buffer)->microseconds = tmp;
+
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* should never get here */
+
+}
+
+/*PAGE
+ *
+ * rtems_clock_set
+ *
+ * This directive sets the date and time for this node.
+ *
+ * Input parameters:
+ * time_buffer - pointer to the time and date structure
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_clock_set(
+ rtems_time_of_day *time_buffer
+)
+{
+ rtems_interval seconds;
+
+ 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 RTEMS_INVALID_CLOCK;
+}
+
+/*PAGE
+ *
+ * rtems_clock_tick
+ *
+ * This directive notifies the executve that a tick has occurred.
+ * When the tick occurs the time manager updates and maintains
+ * the calendar time, timeslicing, and any timeout delays.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always succeeds
+ *
+ * NOTE: This routine only works for leap-years through 2099.
+ */
+
+rtems_status_code rtems_clock_tick( void )
+{
+ _TOD_Tickle_ticks();
+
+ _Watchdog_Tickle_ticks();
+
+ _Thread_Tickle_timeslice();
+
+ if ( _Thread_Is_context_switch_necessary() &&
+ _Thread_Is_dispatching_enabled() )
+ _Thread_Dispatch();
+
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/exec/rtems/src/dpmem.c b/c/src/exec/rtems/src/dpmem.c
new file mode 100644
index 0000000000..90026df3b3
--- /dev/null
+++ b/c/src/exec/rtems/src/dpmem.c
@@ -0,0 +1,281 @@
+/*
+ * Dual Port Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/address.h>
+#include <rtems/rtems/dpmem.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/dpmem.h>
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Manager_initialization
+ *
+ * This routine initializes all dual-ported memory manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_ports - number of ports to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Dual_ported_memory_Manager_initialization(
+ unsigned32 maximum_ports
+)
+{
+ _Objects_Initialize_information(
+ &_Dual_ported_memory_Information,
+ OBJECTS_RTEMS_PORTS,
+ FALSE,
+ maximum_ports,
+ sizeof( Dual_ported_memory_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_port_create
+ *
+ * This directive creates a port into a dual-ported memory area.
+ *
+ * Input parameters:
+ * name - user defined port name
+ * internal_start - internal start address of port
+ * external_start - external start address of port
+ * length - physical length in bytes
+ * id - address of port id to set
+ *
+ * Output parameters:
+ * id - port id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ unsigned32 length,
+ Objects_Id *id
+)
+{
+ register Dual_ported_memory_Control *the_port;
+
+ if ( !rtems_is_name_valid( name) )
+ return RTEMS_INVALID_NAME;
+
+ if ( !_Addresses_Is_aligned( internal_start ) ||
+ !_Addresses_Is_aligned( external_start ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_port = _Dual_ported_memory_Allocate();
+
+ if ( !the_port ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_port->internal_base = internal_start;
+ the_port->external_base = external_start;
+ the_port->length = length - 1;
+
+ _Objects_Open(
+ &_Dual_ported_memory_Information,
+ &the_port->Object,
+ &name
+ );
+
+ *id = the_port->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_port_ident
+ *
+ * This directive returns the system ID associated with
+ * the port name.
+ *
+ * Input parameters:
+ * name - user defined port name
+ * id - pointer to port id
+ *
+ * Output parameters:
+ * *id - port id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ Objects_Id *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
+ *
+ * rtems_port_delete
+ *
+ * This directive allows a thread to delete a dual-ported memory area
+ * specified by the dual-ported memory identifier.
+ *
+ * Input parameters:
+ * id - dual-ported memory area id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_port_delete(
+ Objects_Id id
+)
+{
+ register Dual_ported_memory_Control *the_port;
+ Objects_Locations location;
+
+ the_port = _Dual_ported_memory_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_port_internal_to_external
+ *
+ * This directive converts an internal dual-ported memory address to an
+ * external dual-ported memory address. If the given internal address
+ * is an invalid dual-ported address, then the external address is set
+ * to the given internal address.
+ *
+ * Input parameters:
+ * id - id of dual-ported memory object
+ * internal - internal address to set
+ * external - pointer to external address
+ *
+ * Output parameters:
+ * external - external address
+ * RTEMS_SUCCESSFUL - always succeeds
+ */
+
+rtems_status_code rtems_port_internal_to_external(
+ Objects_Id id,
+ void *internal,
+ void **external
+)
+{
+ register Dual_ported_memory_Control *the_port;
+ Objects_Locations location;
+ unsigned32 ending;
+
+ the_port = _Dual_ported_memory_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ ending = _Addresses_Subtract( internal, the_port->internal_base );
+ if ( ending > the_port->length )
+ *external = internal;
+ else
+ *external = _Addresses_Add_offset( the_port->external_base,
+ ending );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_port_external_to_internal
+ *
+ * This directive converts an external dual-ported memory address to an
+ * internal dual-ported memory address. If the given external address
+ * is an invalid dual-ported address, then the internal address is set
+ * to the given external address.
+ *
+ * Input parameters:
+ * id - id of dp memory object
+ * external - external address
+ * internal - pointer of internal address to set
+ *
+ * Output parameters:
+ * internal - internal address
+ * RTEMS_SUCCESSFUL - always succeeds
+ */
+
+rtems_status_code rtems_port_external_to_internal(
+ Objects_Id id,
+ void *external,
+ void **internal
+)
+{
+ register Dual_ported_memory_Control *the_port;
+ Objects_Locations location;
+ unsigned32 ending;
+
+ the_port = _Dual_ported_memory_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ ending = _Addresses_Subtract( external, the_port->external_base );
+ if ( ending > the_port->length )
+ *internal = external;
+ else
+ *internal = _Addresses_Add_offset( the_port->internal_base,
+ ending );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/c/src/exec/rtems/src/event.c b/c/src/exec/rtems/src/event.c
new file mode 100644
index 0000000000..8df3a4edf5
--- /dev/null
+++ b/c/src/exec/rtems/src/event.c
@@ -0,0 +1,383 @@
+/*
+ * Event Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/tasks.h>
+
+/*PAGE
+ *
+ * _Event_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Event_Manager_initialization( void )
+{
+ _Event_Sync_state = EVENT_SYNC_SYNCHRONIZED;
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor( MP_PACKET_EVENT, _Event_MP_Process_packet );
+}
+
+/*PAGE
+ *
+ * rtems_event_send
+ *
+ * This directive allows a thread send an event set to another thread.
+ *
+ * Input parameters:
+ * id - thread id
+ * event - event set
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_event_send(
+ Objects_Id id,
+ rtems_event_set event_in
+)
+{
+ 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;
+ case OBJECTS_REMOTE:
+ return(
+ _Event_MP_Send_request_packet(
+ EVENT_MP_SEND_REQUEST,
+ id,
+ event_in
+ )
+ );
+ case OBJECTS_LOCAL:
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_event_receive
+ *
+ * This directive allows a thread to receive a set of events.
+ *
+ * Input parameters:
+ * event_in - input event condition
+ * option_set - options
+ * ticks - number of ticks to wait (0 means wait forever)
+ * event_out - pointer to output event set
+ *
+ * Output parameters:
+ * event out - event set
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_event_receive(
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ 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 = api->pending_events;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ _Thread_Disable_dispatch();
+ _Event_Seize( event_in, option_set, ticks, event_out );
+ _Thread_Enable_dispatch();
+ return( _Thread_Executing->Wait.return_code );
+}
+
+
+/*PAGE
+ *
+ * _Event_Seize
+ *
+ * This routine attempts to satisfy the requested event condition
+ * for the running thread.
+ *
+ * Input parameters:
+ * event_in - the event condition to satisfy
+ * option_set - acquire event options
+ * ticks - interval to wait
+ * event_out - pointer to event set output area
+ *
+ * Output parameters: NONE
+ * *event_out - event set output area filled in
+ *
+ * INTERRUPT LATENCY:
+ * available
+ * wait
+ * check sync
+ */
+
+void _Event_Seize(
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+)
+{
+ Thread_Control *executing;
+ rtems_event_set seized_events;
+ rtems_event_set pending_events;
+ ISR_Level level;
+ RTEMS_API_Control *api;
+ Event_Sync_states sync_state;
+
+ executing = _Thread_Executing;
+ executing->Wait.return_code = RTEMS_SUCCESSFUL;
+
+ api = executing->API_Extensions[ THREAD_API_RTEMS ];
+
+ _ISR_Disable( level );
+ pending_events = api->pending_events;
+ seized_events = _Event_sets_Get( pending_events, event_in );
+
+ if ( !_Event_sets_Is_empty( seized_events ) &&
+ (seized_events == event_in || _Options_Is_any( option_set )) ) {
+ api->pending_events =
+ _Event_sets_Clear( pending_events, seized_events );
+ _ISR_Enable( level );
+ *event_out = seized_events;
+ return;
+ }
+
+ if ( _Options_Is_no_wait( option_set ) ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = RTEMS_UNSATISFIED;
+ *event_out = seized_events;
+ return;
+ }
+
+ _Event_Sync_state = EVENT_SYNC_NOTHING_HAPPENED;
+
+ executing->Wait.option = (unsigned32) option_set;
+ executing->Wait.count = (unsigned32) event_in;
+ executing->Wait.return_argument = event_out;
+
+ _ISR_Enable( level );
+
+ if ( ticks ) {
+ _Watchdog_Initialize(
+ &executing->Timer,
+ _Event_Timeout,
+ executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_ticks( &executing->Timer, ticks );
+ }
+
+ _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
+
+ _ISR_Disable( level );
+
+ sync_state = _Event_Sync_state;
+ _Event_Sync_state = EVENT_SYNC_SYNCHRONIZED;
+
+ switch ( sync_state ) {
+ case EVENT_SYNC_SYNCHRONIZED:
+ /*
+ * This cannot happen. It indicates that this routine did not
+ * enter the synchronization states above.
+ */
+ return;
+
+ case EVENT_SYNC_NOTHING_HAPPENED:
+ _ISR_Enable( level );
+ return;
+
+ case EVENT_SYNC_TIMEOUT:
+ executing->Wait.return_code = RTEMS_TIMEOUT;
+ _ISR_Enable( level );
+ _Thread_Unblock( executing );
+ return;
+
+ case EVENT_SYNC_SATISFIED:
+ if ( _Watchdog_Is_active( &executing->Timer ) ) {
+ _Watchdog_Deactivate( &executing->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &executing->Timer );
+ } else
+ _ISR_Enable( level );
+ _Thread_Unblock( executing );
+ return;
+ }
+}
+
+/*PAGE
+ *
+ * _Event_Surrender
+ *
+ * This routines remove a thread from the specified threadq.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread to be dequeued
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * before flash
+ * after flash
+ * check sync
+ */
+
+void _Event_Surrender(
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ rtems_event_set pending_events;
+ rtems_event_set event_condition;
+ rtems_event_set seized_events;
+ rtems_option option_set;
+ RTEMS_API_Control *api;
+
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+
+ option_set = (rtems_option) the_thread->Wait.option;
+
+ _ISR_Disable( level );
+ pending_events = api->pending_events;
+ event_condition = (rtems_event_set) the_thread->Wait.count;
+
+ seized_events = _Event_sets_Get( pending_events, event_condition );
+
+ if ( !_Event_sets_Is_empty( seized_events ) ) {
+ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
+ if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
+ api->pending_events =
+ _Event_sets_Clear( pending_events, seized_events );
+ *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
+
+ _ISR_Flash( level );
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ }
+ else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+ return;
+ }
+ }
+
+ switch ( _Event_Sync_state ) {
+ case EVENT_SYNC_SYNCHRONIZED:
+ case EVENT_SYNC_SATISFIED:
+ break;
+
+ case EVENT_SYNC_NOTHING_HAPPENED:
+ case EVENT_SYNC_TIMEOUT:
+ if ( !_Thread_Is_executing( the_thread ) )
+ break;
+
+ if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
+ api->pending_events =
+ _Event_sets_Clear( pending_events,seized_events );
+ *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
+ _Event_Sync_state = EVENT_SYNC_SATISFIED;
+ }
+ break;
+ }
+ }
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Event_Timeout
+ *
+ * This routine processes a thread which timeouts while waiting to
+ * receive an event_set. It is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters: NONE
+ */
+
+void _Event_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+
+ /*
+ * If the event manager is not synchronized, then it is either
+ * "nothing happened", "timeout", or "satisfied". If the_thread
+ * is the executing thread, then it is in the process of blocking
+ * and it is the thread which is responsible for the synchronization
+ * process.
+ *
+ * If it is not satisfied, then it is "nothing happened" and
+ * this is the "timeout" transition. After a request is satisfied,
+ * a timeout is not allowed to occur.
+ */
+
+ if ( _Event_Sync_state != EVENT_SYNC_SYNCHRONIZED &&
+ _Thread_Is_executing( the_thread ) ) {
+ if ( _Event_Sync_state != EVENT_SYNC_SATISFIED )
+ _Event_Sync_state = EVENT_SYNC_TIMEOUT;
+ } else {
+ the_thread->Wait.return_code = RTEMS_TIMEOUT;
+ _Thread_Unblock( the_thread );
+ }
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
diff --git a/c/src/exec/rtems/src/eventmp.c b/c/src/exec/rtems/src/eventmp.c
new file mode 100644
index 0000000000..c123fae488
--- /dev/null
+++ b/c/src/exec/rtems/src/eventmp.c
@@ -0,0 +1,190 @@
+/*
+ * Multiprocessing Support for the Event Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Event_MP_Send_process_packet
+ *
+ * This subprogram is not needed since there are no process
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Event_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Event_MP_Send_request_packet (
+ Event_MP_Remote_operations operation,
+ Objects_Id event_id,
+ rtems_event_set event_in
+)
+{
+ Event_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case EVENT_MP_SEND_REQUEST:
+
+ the_packet = _Event_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = event_id;
+ the_packet->event_in = event_in;
+
+ return (rtems_status_code)
+ _MPCI_Send_request_packet(
+ rtems_get_node( event_id ),
+ &the_packet->Prefix,
+ STATES_READY
+ );
+
+ break;
+
+ case EVENT_MP_SEND_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Event_MP_Send_response_packet
+ *
+ */
+
+void _Event_MP_Send_response_packet (
+ Event_MP_Remote_operations operation,
+ Thread_Control *the_thread
+)
+{
+ Event_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case EVENT_MP_SEND_RESPONSE:
+
+ the_packet = ( Event_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case EVENT_MP_SEND_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Event_MP_Process_packet
+ *
+ */
+
+void _Event_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Event_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+
+ the_packet = (Event_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case EVENT_MP_SEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_event_send(
+ the_packet->Prefix.id,
+ the_packet->event_in
+ );
+
+ _Event_MP_Send_response_packet(
+ EVENT_MP_SEND_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case EVENT_MP_SEND_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Event_MP_Send_object_was_deleted
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Event_MP_Send_extract_proxy
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Event_MP_Get_packet
+ *
+ */
+
+Event_MP_Packet *_Event_MP_Get_packet ( void )
+{
+ return ( (Event_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/intr.c b/c/src/exec/rtems/src/intr.c
new file mode 100644
index 0000000000..91eff38b06
--- /dev/null
+++ b/c/src/exec/rtems/src/intr.c
@@ -0,0 +1,65 @@
+/*
+ * Interrupt Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/intr.h>
+
+/* _Interrupt_Manager_initialization
+ *
+ * This routine initializes the interrupt manager.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Interrupt_Manager_initialization( void )
+{
+}
+
+/* rtems_interrupt_catch
+ *
+ * This directive allows a thread to specify what action to take when
+ * catching signals.
+ *
+ * Input parameters:
+ * new_isr_handler - address of interrupt service routine (isr)
+ * vector - interrupt vector number
+ * old_isr_handler - address at which to store previous ISR address
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always succeeds
+ * *old_isr_handler - previous ISR address
+ */
+
+rtems_status_code rtems_interrupt_catch(
+ rtems_isr_entry new_isr_handler,
+ rtems_vector_number vector,
+ rtems_isr_entry *old_isr_handler
+)
+{
+ if ( !_ISR_Is_vector_number_valid( vector ) )
+ return RTEMS_INVALID_NUMBER;
+
+ if ( !_ISR_Is_valid_user_handler( (void *) new_isr_handler ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ _ISR_Install_vector(
+ vector, (proc_ptr)new_isr_handler, (proc_ptr *)old_isr_handler );
+
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/exec/rtems/src/mp.c b/c/src/exec/rtems/src/mp.c
new file mode 100644
index 0000000000..a1fb6960a9
--- /dev/null
+++ b/c/src/exec/rtems/src/mp.c
@@ -0,0 +1,42 @@
+/*
+ * Multiprocessing Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/score/mpci.h>
+
+/*PAGE
+ *
+ * _Multiprocessing_Manager_initialization
+ *
+ */
+
+void _Multiprocessing_Manager_initialization ( void )
+{
+}
+
+/*PAGE
+ *
+ * rtems_multiprocessing_announce
+ *
+ */
+
+void rtems_multiprocessing_announce ( void )
+{
+ _MPCI_Announce();
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/msg.c b/c/src/exec/rtems/src/msg.c
new file mode 100644
index 0000000000..37258d4faa
--- /dev/null
+++ b/c/src/exec/rtems/src/msg.c
@@ -0,0 +1,714 @@
+/*
+ * Message Queue Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coremsg.h>
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/mpci.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/message.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Message_queue_Manager_initialization
+ *
+ * This routine initializes all message queue manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_message_queues - number of message queues to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+)
+{
+ _Objects_Initialize_information(
+ &_Message_queue_Information,
+ OBJECTS_RTEMS_MESSAGE_QUEUES,
+ TRUE,
+ maximum_message_queues,
+ sizeof( Message_queue_Control ),
+ FALSE,
+ 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
+ *
+ * _Message_queue_Allocate
+ *
+ * Allocate a message queue and the space for its messages
+ *
+ * Input parameters:
+ * the_message_queue - the message queue to allocate message buffers
+ * count - maximum message and reserved buffer count
+ * max_message_size - maximum size of each message
+ *
+ * Output parameters:
+ * the_message_queue - set if successful, NULL otherwise
+ */
+
+Message_queue_Control *_Message_queue_Allocate (
+ unsigned32 count,
+ unsigned32 max_message_size
+)
+{
+ return
+ (Message_queue_Control *)_Objects_Allocate(&_Message_queue_Information);
+
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_create
+ *
+ * This directive creates a message queue by allocating and initializing
+ * a message queue data structure.
+ *
+ * Input parameters:
+ * name - user defined queue name
+ * count - maximum message and reserved buffer count
+ * max_message_size - maximum size of each message
+ * attribute_set - process method
+ * id - pointer to queue
+ *
+ * Output parameters:
+ * id - queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ unsigned32 count,
+ unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ register Message_queue_Control *the_message_queue;
+ CORE_message_queue_Attributes the_message_queue_attributes;
+ boolean is_global;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ if ( (is_global = _Attributes_Is_global( attribute_set ) ) &&
+ !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ if (count == 0)
+ return RTEMS_INVALID_NUMBER;
+
+ if (max_message_size == 0)
+ return RTEMS_INVALID_SIZE;
+
+#if 1
+ /*
+ * I am not 100% sure this should be an error.
+ * It seems reasonable to create a que with a large max size,
+ * and then just send smaller msgs from remote (or all) nodes.
+ */
+
+ if ( is_global && (_MPCI_table->maximum_packet_size < max_message_size) )
+ return RTEMS_INVALID_SIZE;
+
+#endif
+
+ _Thread_Disable_dispatch(); /* protects object pointer */
+
+ the_message_queue = _Message_queue_Allocate( count, max_message_size );
+
+ if ( !the_message_queue ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( is_global &&
+ !( _Objects_MP_Allocate_and_open( &_Message_queue_Information,
+ name, the_message_queue->Object.id, FALSE ) ) ) {
+ _Message_queue_Free( the_message_queue );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_message_queue->attribute_set = attribute_set;
+
+ if (_Attributes_Is_priority( attribute_set ) )
+ the_message_queue_attributes.discipline =
+ CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
+ else
+ the_message_queue_attributes.discipline =
+ CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+
+ if ( ! _CORE_message_queue_Initialize(
+ &the_message_queue->message_queue,
+ OBJECTS_RTEMS_MESSAGE_QUEUES,
+ &the_message_queue_attributes,
+ count,
+ max_message_size,
+ _Message_queue_MP_Send_extract_proxy ) ) {
+ if ( is_global )
+ _Objects_MP_Close(
+ &_Message_queue_Information, the_message_queue->Object.id);
+
+ _Message_queue_Free( the_message_queue );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ _Objects_Open(
+ &_Message_queue_Information,
+ &the_message_queue->Object,
+ &name
+ );
+
+ *id = the_message_queue->Object.id;
+
+ if ( is_global )
+ _Message_queue_MP_Send_process_packet(
+ MESSAGE_QUEUE_MP_ANNOUNCE_CREATE,
+ the_message_queue->Object.id,
+ name,
+ 0
+ );
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_ident
+ *
+ * This directive returns the system ID associated with
+ * the message queue name.
+ *
+ * Input parameters:
+ * name - user defined message queue name
+ * node - node(s) to be searched
+ * id - pointer to message queue id
+ *
+ * Output parameters:
+ * *id - message queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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
+ *
+ * rtems_message_queue_delete
+ *
+ * This directive allows a thread to delete the message queue specified
+ * by the given queue identifier.
+ *
+ * Input parameters:
+ * id - queue id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_delete(
+ Objects_Id id
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ _Objects_Close( &_Message_queue_Information,
+ &the_message_queue->Object );
+
+ _CORE_message_queue_Close(
+ &the_message_queue->message_queue,
+ _Message_queue_MP_Send_object_was_deleted,
+ CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED
+ );
+
+ _Message_queue_Free( the_message_queue );
+
+ if ( _Attributes_Is_global( the_message_queue->attribute_set ) ) {
+ _Objects_MP_Close(
+ &_Message_queue_Information,
+ the_message_queue->Object.id
+ );
+
+ _Message_queue_MP_Send_process_packet(
+ MESSAGE_QUEUE_MP_ANNOUNCE_DELETE,
+ the_message_queue->Object.id,
+ 0, /* Not used */
+ 0
+ );
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_send
+ *
+ * This routine implements the directives q_send. It sends a
+ * message to the specified message queue.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size of message to sent urgently
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_send(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ return( _Message_queue_Submit(id, buffer, size, MESSAGE_QUEUE_SEND_REQUEST) );
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_urgent
+ *
+ * This routine implements the directives q_urgent. It urgents a
+ * message to the specified message queue.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size of message to sent urgently
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_urgent(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ return(_Message_queue_Submit(id, buffer, size, MESSAGE_QUEUE_URGENT_REQUEST));
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_broadcast
+ *
+ * This directive sends a message for every thread waiting on the queue
+ * designated by id.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size of message to broadcast
+ * count - pointer to area to store number of threads made ready
+ *
+ * Output parameters:
+ * count - number of threads made ready
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_broadcast(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ unsigned32 *count
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+ CORE_message_queue_Status core_status;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = count;
+
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_BROADCAST_REQUEST,
+ id,
+ buffer,
+ &size,
+ 0, /* option_set not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+
+ case OBJECTS_LOCAL:
+ core_status = _CORE_message_queue_Broadcast(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ id,
+ _Message_queue_Core_message_queue_mp_support,
+ count
+ );
+
+ _Thread_Enable_dispatch();
+ return
+ _Message_queue_Translate_core_message_queue_return_code( core_status );
+
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_receive
+ *
+ * This directive dequeues a message from the designated message queue
+ * and copies it into the requesting thread's buffer.
+ *
+ * Input parameters:
+ * id - queue id
+ * buffer - pointer to message buffer
+ * size - size of message receive
+ * option_set - options on receive
+ * timeout - number of ticks to wait
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_receive(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ unsigned32 option_set,
+ rtems_interval timeout
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+ boolean wait;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+
+ case OBJECTS_REMOTE:
+ return _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_RECEIVE_REQUEST,
+ id,
+ buffer,
+ size,
+ option_set,
+ timeout
+ );
+
+ case OBJECTS_LOCAL:
+ if ( _Options_Is_no_wait( option_set ) )
+ wait = FALSE;
+ else
+ wait = TRUE;
+
+ _CORE_message_queue_Seize(
+ &the_message_queue->message_queue,
+ the_message_queue->Object.id,
+ buffer,
+ size,
+ wait,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return( _Message_queue_Translate_core_message_queue_return_code(
+ _Thread_Executing->Wait.return_code ) );
+
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_flush
+ *
+ * This directive removes all pending messages from a queue and returns
+ * the number of messages removed. If no messages were present then
+ * a count of zero is returned.
+ *
+ * Input parameters:
+ * id - queue id
+ * count - return area for count
+ *
+ * Output parameters:
+ * count - number of messages removed ( 0 = empty queue )
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_flush(
+ Objects_Id id,
+ unsigned32 *count
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = count;
+
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_FLUSH_REQUEST,
+ id,
+ 0, /* buffer not used */
+ 0, /* size */
+ 0, /* option_set not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+
+ case OBJECTS_LOCAL:
+ *count = _CORE_message_queue_Flush( &the_message_queue->message_queue );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Message_queue_Submit
+ *
+ * This routine implements the directives rtems_message_queue_send
+ * and rtems_message_queue_urgent. It processes a message that is
+ * to be submitted to the designated message queue. The message will
+ * either be processed as a send send message which it will be inserted
+ * at the rear of the queue or it will be processed as an urgent message
+ * which will be inserted at the front of the queue.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size in bytes of message to send
+ * submit_type - send or urgent message
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code _Message_queue_Submit(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ Message_queue_Submit_types submit_type
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+ CORE_message_queue_Status core_status;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location )
+ {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+
+ case OBJECTS_REMOTE:
+ switch ( submit_type ) {
+ case MESSAGE_QUEUE_SEND_REQUEST:
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_SEND_REQUEST,
+ id,
+ buffer,
+ &size,
+ 0, /* option_set */
+ MPCI_DEFAULT_TIMEOUT
+ );
+
+ case MESSAGE_QUEUE_URGENT_REQUEST:
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_URGENT_REQUEST,
+ id,
+ buffer,
+ &size,
+ 0, /* option_set */
+ MPCI_DEFAULT_TIMEOUT
+ );
+ }
+
+ case OBJECTS_LOCAL:
+ switch ( submit_type ) {
+ case MESSAGE_QUEUE_SEND_REQUEST:
+ core_status = _CORE_message_queue_Send(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ id,
+ _Message_queue_Core_message_queue_mp_support
+ );
+ break;
+ case MESSAGE_QUEUE_URGENT_REQUEST:
+ core_status = _CORE_message_queue_Urgent(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ id,
+ _Message_queue_Core_message_queue_mp_support
+ );
+ break;
+ default:
+ core_status = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+ return RTEMS_INTERNAL_ERROR; /* should never get here */
+ }
+
+ _Thread_Enable_dispatch();
+ return _Message_queue_Translate_core_message_queue_return_code(
+ core_status );
+
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Message_queue_Translate_core_message_queue_return_code
+ *
+ * Input parameters:
+ * the_message_queue_status - message_queue status code to translate
+ *
+ * Output parameters:
+ * rtems status code - translated RTEMS status code
+ *
+ */
+
+rtems_status_code _Message_queue_Translate_core_message_queue_return_code (
+ unsigned32 the_message_queue_status
+)
+{
+ switch ( the_message_queue_status ) {
+ case CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL:
+ return RTEMS_SUCCESSFUL;
+ case CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE:
+ return RTEMS_INVALID_SIZE;
+ case CORE_MESSAGE_QUEUE_STATUS_TOO_MANY:
+ return RTEMS_TOO_MANY;
+ case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED:
+ return RTEMS_UNSATISFIED;
+ case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT:
+ return RTEMS_UNSATISFIED;
+ case CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED:
+ return RTEMS_OBJECT_WAS_DELETED;
+ case CORE_MESSAGE_QUEUE_STATUS_TIMEOUT:
+ return RTEMS_TIMEOUT;
+ case THREAD_STATUS_PROXY_BLOCKING:
+ return RTEMS_PROXY_BLOCKING;
+ }
+ _Internal_error_Occurred( /* XXX */
+ INTERNAL_ERROR_RTEMS_API,
+ TRUE,
+ the_message_queue_status
+ );
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Message_queue_Core_message_queue_mp_support
+ *
+ * Input parameters:
+ * the_thread - the remote thread the message was submitted to
+ * id - id of the message queue
+ *
+ * Output parameters: NONE
+ */
+
+void _Message_queue_Core_message_queue_mp_support (
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ the_thread->receive_packet->return_code = RTEMS_SUCCESSFUL;
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_RECEIVE_RESPONSE,
+ id,
+ the_thread
+ );
+}
diff --git a/c/src/exec/rtems/src/msgmp.c b/c/src/exec/rtems/src/msgmp.c
new file mode 100644
index 0000000000..2168b9db7d
--- /dev/null
+++ b/c/src/exec/rtems/src/msgmp.c
@@ -0,0 +1,458 @@
+/*
+ * Multiprocessing Support for the Message Queue Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/message.h>
+#include <rtems/score/mpci.h>
+#include <rtems/rtems/msgmp.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_process_packet
+ *
+ */
+
+void _Message_queue_MP_Send_process_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Message_queue_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+
+ the_packet = _Message_queue_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = message_queue_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == MESSAGE_QUEUE_MP_EXTRACT_PROXY )
+ node = rtems_get_node( message_queue_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Message_queue_MP_Send_request_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ void *buffer,
+ unsigned32 *size_p,
+ rtems_option option_set,
+ rtems_interval timeout
+)
+{
+ Message_queue_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+
+ the_packet = _Message_queue_MP_Get_packet();
+ 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.to_convert = sizeof(Message_queue_MP_Packet);
+
+ /*
+ * make sure message is not too big for our MPCI driver
+ * We have to check it here instead of waiting for MPCI because
+ * we are about to slam in the payload
+ */
+
+ if (the_packet->Prefix.length > _MPCI_table->maximum_packet_size) {
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_SIZE;
+ }
+
+ if ( ! _Options_Is_no_wait(option_set))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = operation;
+ the_packet->Prefix.id = message_queue_id;
+ the_packet->option_set = option_set;
+
+ /*
+ * Copy the data into place if needed
+ */
+
+ if (buffer) {
+ the_packet->Buffer.size = *size_p;
+ _CORE_message_queue_Copy_buffer(
+ buffer,
+ the_packet->Buffer.buffer,
+ *size_p
+ );
+ }
+
+ return (rtems_status_code) _MPCI_Send_request_packet(
+ rtems_get_node(message_queue_id),
+ &the_packet->Prefix,
+ STATES_WAITING_FOR_MESSAGE
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+
+ the_packet = _Message_queue_MP_Get_packet();
+ 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);
+
+ if ( ! _Options_Is_no_wait(option_set))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = MESSAGE_QUEUE_MP_RECEIVE_REQUEST;
+ the_packet->Prefix.id = message_queue_id;
+ 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.return_argument_1 = size_p;
+
+ return (rtems_status_code) _MPCI_Send_request_packet(
+ rtems_get_node(message_queue_id),
+ &the_packet->Prefix,
+ STATES_WAITING_FOR_MESSAGE
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+ break;
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_response_packet
+ *
+ */
+
+void _Message_queue_MP_Send_response_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ Thread_Control *the_thread
+)
+{
+ Message_queue_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+
+ the_packet = ( Message_queue_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ *
+ * Exception: MESSAGE_QUEUE_MP_RECEIVE_RESPONSE needs payload length
+ * added to 'length'
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ if (operation == MESSAGE_QUEUE_MP_RECEIVE_RESPONSE)
+ the_packet->Prefix.length += the_packet->size;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Message_queue_MP_Process_packet
+ *
+ */
+
+void _Message_queue_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Message_queue_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Message_queue_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Message_queue_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Message_queue_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_receive(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ &the_packet->size,
+ the_packet->option_set,
+ the_packet->Prefix.timeout
+ );
+
+ 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,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ if (the_packet->Prefix.return_code == RTEMS_SUCCESSFUL) {
+ *(rtems_unsigned32 *)the_thread->Wait.return_argument_1 =
+ the_packet->size;
+
+ _CORE_message_queue_Copy_buffer(
+ the_packet->Buffer.buffer,
+ the_thread->Wait.return_argument,
+ the_packet->size
+ );
+ }
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_send(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ the_packet->Buffer.size
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_SEND_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_urgent(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ the_packet->Buffer.size
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_URGENT_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_broadcast(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ the_packet->Buffer.size,
+ &the_packet->count
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_BROADCAST_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(unsigned32 *)the_thread->Wait.return_argument = the_packet->count;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_flush(
+ the_packet->Prefix.id,
+ &the_packet->count
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_FLUSH_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_object_was_deleted
+ *
+ */
+
+void _Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+)
+{
+ the_proxy->receive_packet->return_code = RTEMS_OBJECT_WAS_DELETED;
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_RECEIVE_RESPONSE,
+ the_proxy->Wait.id,
+ the_proxy
+ );
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_extract_proxy
+ *
+ */
+
+void _Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Message_queue_MP_Send_process_packet(
+ MESSAGE_QUEUE_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Get_packet
+ *
+ */
+
+Message_queue_MP_Packet *_Message_queue_MP_Get_packet ( void )
+{
+ return ( (Message_queue_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/part.c b/c/src/exec/rtems/src/part.c
new file mode 100644
index 0000000000..bdf51f9c2a
--- /dev/null
+++ b/c/src/exec/rtems/src/part.c
@@ -0,0 +1,341 @@
+/*
+ * Partition Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/sysstate.h>
+
+/*PAGE
+ *
+ * _Partition_Manager_initialization
+ *
+ * This routine initializes all partition manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_partitions - number of partitions to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Partition_Manager_initialization(
+ unsigned32 maximum_partitions
+)
+{
+ _Objects_Initialize_information(
+ &_Partition_Information,
+ OBJECTS_RTEMS_PARTITIONS,
+ TRUE,
+ maximum_partitions,
+ sizeof( Partition_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_PARTITION,
+ _Partition_MP_Process_packet
+ );
+
+}
+
+/*PAGE
+ *
+ * rtems_partition_create
+ *
+ * This directive creates a partiton of fixed sized buffers from the
+ * given contiguous memory area.
+ *
+ * Input parameters:
+ * name - user defined partition name
+ * starting_address - physical start address of partition
+ * length - physical length in bytes
+ * buffer_size - size of buffers in bytes
+ * attribute_set - partition attributes
+ * id - pointer to partition id
+ *
+ * Output parameters:
+ * id - partition id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ register Partition_Control *the_partition;
+
+ if ( !rtems_is_name_valid( 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;
+
+ if ( !_Addresses_Is_aligned( starting_address ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ if ( _Attributes_Is_global( attribute_set ) &&
+ !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ _Thread_Disable_dispatch(); /* prevents deletion */
+
+ the_partition = _Partition_Allocate();
+
+ if ( !the_partition ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( _Attributes_Is_global( attribute_set ) &&
+ !( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
+ the_partition->Object.id, FALSE ) ) ) {
+ _Partition_Free( the_partition );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+ the_partition->starting_address = starting_address;
+ the_partition->length = length;
+ the_partition->buffer_size = buffer_size;
+ the_partition->attribute_set = attribute_set;
+ the_partition->number_of_used_blocks = 0;
+
+ _Chain_Initialize( &the_partition->Memory, starting_address,
+ length / buffer_size, buffer_size );
+
+ _Objects_Open( &_Partition_Information, &the_partition->Object, &name );
+
+ *id = the_partition->Object.id;
+ if ( _Attributes_Is_global( attribute_set ) )
+ _Partition_MP_Send_process_packet(
+ PARTITION_MP_ANNOUNCE_CREATE,
+ the_partition->Object.id,
+ name,
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_partition_ident
+ *
+ * This directive returns the system ID associated with
+ * the partition name.
+ *
+ * Input parameters:
+ * name - user defined partition name
+ * node - node(s) to be searched
+ * id - pointer to partition id
+ *
+ * Output parameters:
+ * *id - partition id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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
+ *
+ * rtems_partition_delete
+ *
+ * This directive allows a thread to delete a partition specified by
+ * the partition identifier, provided that none of its buffers are
+ * still allocated.
+ *
+ * Input parameters:
+ * id - partition id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_delete(
+ Objects_Id id
+)
+{
+ register Partition_Control *the_partition;
+ Objects_Locations location;
+
+ the_partition = _Partition_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ if ( the_partition->number_of_used_blocks == 0 ) {
+ _Objects_Close( &_Partition_Information, &the_partition->Object );
+ _Partition_Free( the_partition );
+ if ( _Attributes_Is_global( the_partition->attribute_set ) ) {
+
+ _Objects_MP_Close(
+ &_Partition_Information,
+ the_partition->Object.id
+ );
+
+ _Partition_MP_Send_process_packet(
+ PARTITION_MP_ANNOUNCE_DELETE,
+ the_partition->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_RESOURCE_IN_USE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_partition_get_buffer
+ *
+ * This directive will obtain a buffer from a buffer partition.
+ *
+ * Input parameters:
+ * id - partition id
+ * buffer - pointer to buffer address
+ *
+ * Output parameters:
+ * buffer - pointer to buffer address filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_get_buffer(
+ Objects_Id id,
+ void **buffer
+)
+{
+ register Partition_Control *the_partition;
+ Objects_Locations location;
+ void *the_buffer;
+
+ the_partition = _Partition_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = buffer;
+ return(
+ _Partition_MP_Send_request_packet(
+ PARTITION_MP_GET_BUFFER_REQUEST,
+ id,
+ 0 /* Not used */
+ )
+ );
+ case OBJECTS_LOCAL:
+ the_buffer = _Partition_Allocate_buffer( the_partition );
+ if ( the_buffer ) {
+ the_partition->number_of_used_blocks += 1;
+ _Thread_Enable_dispatch();
+ *buffer = the_buffer;
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_UNSATISFIED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_partition_return_buffer
+ *
+ * This directive will return the given buffer to the specified
+ * buffer partition.
+ *
+ * Input parameters:
+ * id - partition id
+ * buffer - pointer to buffer address
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_return_buffer(
+ Objects_Id id,
+ void *buffer
+)
+{
+ register Partition_Control *the_partition;
+ Objects_Locations location;
+
+ the_partition = _Partition_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return(
+ _Partition_MP_Send_request_packet(
+ PARTITION_MP_RETURN_BUFFER_REQUEST,
+ id,
+ buffer
+ )
+ );
+ case OBJECTS_LOCAL:
+ if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
+ _Partition_Free_buffer( the_partition, buffer );
+ the_partition->number_of_used_blocks -= 1;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_ADDRESS;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/c/src/exec/rtems/src/partmp.c b/c/src/exec/rtems/src/partmp.c
new file mode 100644
index 0000000000..35e0b74364
--- /dev/null
+++ b/c/src/exec/rtems/src/partmp.c
@@ -0,0 +1,302 @@
+/*
+ * Multiprocessing Support for the Partition Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Partition_MP_Send_process_packet
+ *
+ */
+
+void _Partition_MP_Send_process_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Partition_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+ case PARTITION_MP_ANNOUNCE_DELETE:
+ case PARTITION_MP_EXTRACT_PROXY:
+
+ the_packet = _Partition_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = partition_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == PARTITION_MP_EXTRACT_PROXY )
+ node = rtems_get_node( partition_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Partition_MP_Send_request_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ void *buffer
+)
+{
+ Partition_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+
+ the_packet = _Partition_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = partition_id;
+ the_packet->buffer = buffer;
+
+ return
+ _MPCI_Send_request_packet(
+ rtems_get_node( partition_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+
+ break;
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+ case PARTITION_MP_ANNOUNCE_DELETE:
+ case PARTITION_MP_EXTRACT_PROXY:
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Send_response_packet
+ *
+ */
+
+void _Partition_MP_Send_response_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ Thread_Control *the_thread
+)
+{
+ Partition_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+
+ the_packet = ( Partition_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+ case PARTITION_MP_ANNOUNCE_DELETE:
+ case PARTITION_MP_EXTRACT_PROXY:
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Partition_MP_Process_packet
+ *
+ */
+
+void _Partition_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Partition_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Partition_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Partition_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Partition_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_partition_get_buffer(
+ the_packet->Prefix.id,
+ &the_packet->buffer
+ );
+
+ _Partition_MP_Send_response_packet(
+ PARTITION_MP_GET_BUFFER_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(void **)the_thread->Wait.return_argument = the_packet->buffer;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_partition_return_buffer(
+ the_packet->Prefix.id,
+ the_packet->buffer
+ );
+
+ _Partition_MP_Send_response_packet(
+ PARTITION_MP_RETURN_BUFFER_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Send_object_was_deleted
+ *
+ * This routine is not needed by the Partition since a partition
+ * cannot be deleted when buffers are in use.
+ *
+ */
+
+/*PAGE
+ *
+ * _Partition_MP_Send_extract_proxy
+ *
+ */
+
+void _Partition_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Partition_MP_Send_process_packet(
+ PARTITION_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Get_packet
+ *
+ */
+
+Partition_MP_Packet *_Partition_MP_Get_packet ( void )
+{
+ return ( (Partition_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/ratemon.c b/c/src/exec/rtems/src/ratemon.c
new file mode 100644
index 0000000000..2832e652e1
--- /dev/null
+++ b/c/src/exec/rtems/src/ratemon.c
@@ -0,0 +1,461 @@
+/*
+ * Rate Monotonic Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/ratemon.h>
+#include <rtems/score/thread.h>
+
+/*PAGE
+ *
+ * _Rate_monotonic_Manager_initialization
+ *
+ * This routine initializes all Rate Monotonic Manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_periods - number of periods timers to initialize
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: The Rate Monotonic Manager is built on top of the Watchdog
+ * Handler.
+ */
+
+void _Rate_monotonic_Manager_initialization(
+ unsigned32 maximum_periods
+)
+{
+ _Objects_Initialize_information(
+ &_Rate_monotonic_Information,
+ OBJECTS_RTEMS_PERIODS,
+ FALSE,
+ maximum_periods,
+ sizeof( Rate_monotonic_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_create
+ *
+ * This directive creates a rate monotonic timer and performs
+ * some initialization.
+ *
+ * Input parameters:
+ * name - name of period
+ * id - pointer to rate monotonic id
+ *
+ * Output parameters:
+ * id - rate monotonic id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Rate_monotonic_Control *the_period;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_period = _Rate_monotonic_Allocate();
+
+ if ( !the_period ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_period->owner = _Thread_Executing;
+ the_period->state = RATE_MONOTONIC_INACTIVE;
+
+ _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, &name );
+
+ *id = the_period->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_ident
+ *
+ * This directive returns the system ID associated with
+ * the rate monotonic period name.
+ *
+ * Input parameters:
+ * name - user defined period name
+ * id - pointer to period id
+ *
+ * Output parameters:
+ * *id - region id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Rate_monotonic_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_cancel
+ *
+ * This directive allows a thread to cancel a rate monotonic timer.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful and caller is not the owning thread
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_cancel(
+ Objects_Id id
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+
+ the_period = _Rate_monotonic_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_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;
+ }
+ (void) _Watchdog_Remove( &the_period->Timer );
+ the_period->state = RATE_MONOTONIC_INACTIVE;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_delete
+ *
+ * This directive allows a thread to delete a rate monotonic timer.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_delete(
+ Objects_Id id
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+
+ 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;
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_get_status
+ *
+ * This directive allows a thread to obtain status information on a
+ * period.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ * status - pointer to status control block
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ *
+ */
+
+rtems_status_code rtems_rate_monotonic_get_status(
+ Objects_Id id,
+ rtems_rate_monotonic_period_status *status
+)
+{
+ Objects_Locations location;
+ Rate_monotonic_Control *the_period;
+
+ if ( status == NULL )
+ return RTEMS_INVALID_ADDRESS;
+
+ 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;
+ case OBJECTS_LOCAL:
+ status->state = the_period->state;
+
+ if ( status->state == RATE_MONOTONIC_INACTIVE ) {
+ status->ticks_since_last_period = 0;
+ status->ticks_executed_since_last_period = 0;
+ } else {
+ status->ticks_since_last_period =
+ _Watchdog_Ticks_since_boot - the_period->time_at_period;
+
+ status->ticks_executed_since_last_period =
+ the_period->owner->ticks_executed -
+ the_period->owner_ticks_executed_at_period;
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_period
+ *
+ * This directive allows a thread to manipulate a rate monotonic timer.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ * length - length of period (in ticks)
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_period(
+ Objects_Id id,
+ rtems_interval length
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+ rtems_status_code return_value;
+ rtems_rate_monotonic_period_states local_state;
+ ISR_Level level;
+
+ 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;
+ case OBJECTS_LOCAL:
+ if ( !_Thread_Is_executing( the_period->owner ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_OWNER_OF_RESOURCE;
+ }
+
+ if ( length == RTEMS_PERIOD_STATUS ) {
+ switch ( the_period->state ) {
+ case RATE_MONOTONIC_INACTIVE:
+ return_value = RTEMS_NOT_DEFINED;
+ break;
+ case RATE_MONOTONIC_ACTIVE:
+ return_value = RTEMS_SUCCESSFUL;
+ break;
+ case RATE_MONOTONIC_EXPIRED:
+ return_value = RTEMS_TIMEOUT;
+ break;
+ default: /* unreached -- only to remove warnings */
+ return_value = RTEMS_INTERNAL_ERROR;
+ break;
+ }
+ _Thread_Enable_dispatch();
+ return( return_value );
+ }
+
+ _ISR_Disable( level );
+ switch ( the_period->state ) {
+ case RATE_MONOTONIC_INACTIVE:
+ _ISR_Enable( level );
+ the_period->state = RATE_MONOTONIC_ACTIVE;
+ _Watchdog_Initialize(
+ &the_period->Timer,
+ _Rate_monotonic_Timeout,
+ id,
+ NULL
+ );
+
+ the_period->owner_ticks_executed_at_period =
+ _Thread_Executing->ticks_executed;
+
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+
+ _Watchdog_Insert_ticks( &the_period->Timer, length );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+
+ case RATE_MONOTONIC_ACTIVE:
+ /*
+ * This tells the _Rate_monotonic_Timeout that this task is
+ * in the process of blocking on the period.
+ */
+
+ the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
+ _ISR_Enable( level );
+
+ _Thread_Executing->Wait.id = the_period->Object.id;
+ _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
+
+ /*
+ * Did the watchdog timer expire while we were actually blocking
+ * on it?
+ */
+
+ _ISR_Disable( level );
+ local_state = the_period->state;
+ the_period->state = RATE_MONOTONIC_ACTIVE;
+ _ISR_Enable( level );
+
+ /*
+ * If it did, then we want to unblock ourself and continue as
+ * if nothing happen. The period was reset in the timeout routine.
+ */
+
+ if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
+ _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ break;
+
+ case RATE_MONOTONIC_EXPIRED:
+ _ISR_Enable( level );
+ the_period->state = RATE_MONOTONIC_ACTIVE;
+ the_period->owner_ticks_executed_at_period =
+ _Thread_Executing->ticks_executed;
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+
+ _Watchdog_Insert_ticks( &the_period->Timer, length );
+ _Thread_Enable_dispatch();
+ return RTEMS_TIMEOUT;
+
+ case RATE_MONOTONIC_OWNER_IS_BLOCKING:
+ case RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING:
+ /*
+ * These should never happen.
+ */
+ break;
+ }
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Timeout
+ *
+ * This routine processes a period ending. If the owning thread
+ * is waiting for the period, that thread is unblocked and the
+ * period reinitiated. Otherwise, the period is expired.
+ * This routine is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - period id
+ *
+ * Output parameters: NONE
+ */
+
+void _Rate_monotonic_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+ Thread_Control *the_thread;
+
+ the_period = _Rate_monotonic_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+ the_thread = the_period->owner;
+ if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
+ the_thread->Wait.id == the_period->Object.id ) {
+ _Thread_Unblock( the_thread );
+ the_period->owner_ticks_executed_at_period =
+ the_thread->ticks_executed;
+
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+
+ _Watchdog_Reset( &the_period->Timer );
+ } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
+ the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
+ the_period->owner_ticks_executed_at_period =
+ the_thread->ticks_executed;
+
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+ _Watchdog_Reset( &the_period->Timer );
+ } else
+ the_period->state = RATE_MONOTONIC_EXPIRED;
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
+
diff --git a/c/src/exec/rtems/src/region.c b/c/src/exec/rtems/src/region.c
new file mode 100644
index 0000000000..414c7d41af
--- /dev/null
+++ b/c/src/exec/rtems/src/region.c
@@ -0,0 +1,486 @@
+/*
+ * Region Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+
+/*PAGE
+ *
+ * _Region_Manager_initialization
+ *
+ * This routine initializes all region manager related data structures.
+ *
+ * Input parameters:
+ * maximum_regions - number of regions to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Region_Manager_initialization(
+ unsigned32 maximum_regions
+)
+{
+ _Objects_Initialize_information(
+ &_Region_Information,
+ OBJECTS_RTEMS_REGIONS,
+ FALSE,
+ maximum_regions,
+ sizeof( Region_Control ),
+ FALSE,
+ 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
+ *
+ * rtems_region_create
+ *
+ * This directive creates a region of physical contiguous memory area
+ * from which variable sized segments can be allocated.
+ *
+ * Input parameters:
+ * name - user defined region name
+ * starting_address - physical start address of region
+ * length - physical length in bytes
+ * page_size - page size in bytes
+ * attribute_set - region attributes
+ * id - address of region id to set
+ *
+ * Output parameters:
+ * id - region id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 page_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ Region_Control *the_region;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ if ( !_Addresses_Is_aligned( starting_address ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_region = _Region_Allocate();
+
+ if ( !the_region ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_region->maximum_segment_size =
+ _Heap_Initialize(&the_region->Memory, starting_address, length, page_size);
+
+ if ( !the_region->maximum_segment_size ) {
+ _Region_Free( the_region );
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_SIZE;
+ }
+
+ the_region->starting_address = starting_address;
+ the_region->length = length;
+ the_region->page_size = page_size;
+ the_region->attribute_set = attribute_set;
+ the_region->number_of_used_blocks = 0;
+
+ _Thread_queue_Initialize(
+ &the_region->Wait_queue,
+ OBJECTS_RTEMS_REGIONS,
+ _Attributes_Is_priority( attribute_set ) ?
+ THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_SEGMENT,
+ _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;
+}
+
+/*PAGE
+ *
+ * rtems_region_ident
+ *
+ * This directive returns the system ID associated with
+ * the region name.
+ *
+ * Input parameters:
+ * name - user defined region name
+ * id - pointer to region id
+ *
+ * Output parameters:
+ * *id - region id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ Objects_Id *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
+ *
+ * rtems_region_delete
+ *
+ * This directive allows a thread to delete a region specified by
+ * the region identifier, provided that none of its segments are
+ * still allocated.
+ *
+ * Input parameters:
+ * id - region id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_delete(
+ Objects_Id id
+)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_RESOURCE_IN_USE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_region_extend
+ *
+ * This directive attempts to grow a region of physical contiguous memory area
+ * from which variable sized segments can be allocated.
+ *
+ * Input parameters:
+ * id - id of region to grow
+ * start - starting address of memory area for extension
+ * length - physical length in bytes to grow the region
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_extend(
+ Objects_Id id,
+ void *starting_address,
+ unsigned32 length
+)
+{
+ Region_Control *the_region;
+ Objects_Locations location;
+ unsigned32 amount_extended;
+ Heap_Extend_status heap_status;
+ rtems_status_code status;
+
+ status = RTEMS_SUCCESSFUL;
+
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+
+ heap_status = _Heap_Extend(
+ &the_region->Memory,
+ starting_address,
+ length,
+ &amount_extended
+ );
+
+ switch ( heap_status ) {
+ case HEAP_EXTEND_SUCCESSFUL:
+ the_region->length += amount_extended;
+ the_region->maximum_segment_size += amount_extended;
+ break;
+ case HEAP_EXTEND_ERROR:
+ status = RTEMS_INVALID_ADDRESS;
+ break;
+ case HEAP_EXTEND_NOT_IMPLEMENTED:
+ status = RTEMS_NOT_IMPLEMENTED;
+ break;
+ }
+ _Thread_Enable_dispatch();
+ return( status );
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_region_get_segment
+ *
+ * This directive will obtain a segment from the given region.
+ *
+ * Input parameters:
+ * id - region id
+ * size - segment size in bytes
+ * option_set - wait option
+ * timeout - number of ticks to wait (0 means wait forever)
+ * segment - pointer to segment address
+ *
+ * Output parameters:
+ * segment - pointer to segment address filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_get_segment(
+ Objects_Id id,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+ Thread_Control *executing;
+ void *the_segment;
+
+ *segment = NULL;
+
+ if ( size == 0 )
+ return RTEMS_INVALID_SIZE;
+
+ executing = _Thread_Executing;
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ if ( size > the_region->maximum_segment_size ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_SIZE;
+ }
+
+ _Region_Debug_Walk( the_region, 1 );
+
+ the_segment = _Region_Allocate_segment( the_region, size );
+
+ _Region_Debug_Walk( the_region, 2 );
+
+ if ( the_segment ) {
+ the_region->number_of_used_blocks += 1;
+ _Thread_Enable_dispatch();
+ *segment = the_segment;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ if ( _Options_Is_no_wait( option_set ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_UNSATISFIED;
+ }
+
+ executing->Wait.queue = &the_region->Wait_queue;
+ executing->Wait.id = id;
+ executing->Wait.count = size;
+ executing->Wait.return_argument = (unsigned32 *) segment;
+
+ _Thread_queue_Enter_critical_section( &the_region->Wait_queue );
+
+ _Thread_queue_Enqueue( &the_region->Wait_queue, timeout );
+
+ _Thread_Enable_dispatch();
+ return (rtems_status_code) executing->Wait.return_code;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+/*PAGE
+ *
+ * rtems_region_get_segment_size
+ *
+ * This directive will return the size of the segment indicated
+ *
+ * Input parameters:
+ * id - region id
+ * segment - segment address
+ * size - pointer to segment size in bytes
+ *
+ * Output parameters:
+ * size - segment size in bytes filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_get_segment_size(
+ Objects_Id id,
+ void *segment,
+ unsigned32 *size
+)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+
+ if ( _Heap_Size_of_user_area( &the_region->Memory, segment, size ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_ADDRESS;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_region_return_segment
+ *
+ * This directive will return a segment to its region.
+ *
+ * Input parameters:
+ * id - region id
+ * segment - pointer to segment address
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_return_segment(
+ Objects_Id id,
+ void *segment
+)
+{
+ register Region_Control *the_region;
+ Thread_Control *the_thread;
+ Objects_Locations location;
+ void **the_segment;
+ int status;
+
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+
+ _Region_Debug_Walk( the_region, 3 );
+
+ status = _Region_Free_segment( the_region, segment );
+
+ _Region_Debug_Walk( the_region, 4 );
+
+ if ( !status ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_ADDRESS;
+ }
+
+ the_region->number_of_used_blocks -= 1;
+ for ( ; ; ) {
+ the_thread = _Thread_queue_First( &the_region->Wait_queue );
+
+ if ( the_thread == NULL )
+ break;
+
+ the_segment = (void **) _Region_Allocate_segment(
+ the_region,
+ the_thread->Wait.count
+ );
+
+ if ( the_segment == NULL )
+ break;
+
+ *(void **)the_thread->Wait.return_argument = the_segment;
+ the_region->number_of_used_blocks += 1;
+ _Thread_queue_Extract( &the_region->Wait_queue, the_thread );
+ the_thread->Wait.return_code = RTEMS_SUCCESSFUL;
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/c/src/exec/rtems/src/regionmp.c b/c/src/exec/rtems/src/regionmp.c
new file mode 100644
index 0000000000..5cc4a2127c
--- /dev/null
+++ b/c/src/exec/rtems/src/regionmp.c
@@ -0,0 +1,310 @@
+/*
+ * Multiprocessing Support for the Region Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Region_MP_Send_process_packet
+ *
+ */
+
+void _Region_MP_Send_process_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Region_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case REGION_MP_ANNOUNCE_CREATE:
+ case REGION_MP_ANNOUNCE_DELETE:
+ case REGION_MP_EXTRACT_PROXY:
+
+ the_packet = _Region_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = region_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == REGION_MP_EXTRACT_PROXY )
+ node = rtems_get_node( region_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case REGION_MP_GET_SEGMENT_REQUEST:
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Region_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Region_MP_Send_request_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ void *segment,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout
+)
+{
+ Region_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case REGION_MP_GET_SEGMENT_REQUEST:
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+
+ the_packet = _Region_MP_Get_packet();
+ 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))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = operation;
+ the_packet->Prefix.id = region_id;
+ the_packet->segment = segment;
+ the_packet->size = size;
+ the_packet->option_set = option_set;
+
+ return (rtems_status_code) _MPCI_Send_request_packet(
+ rtems_get_node( region_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+ break;
+
+ case REGION_MP_ANNOUNCE_CREATE:
+ case REGION_MP_ANNOUNCE_DELETE:
+ case REGION_MP_EXTRACT_PROXY:
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_INTERNAL_ERROR;
+}
+
+/*PAGE
+ *
+ * _Region_MP_Send_response_packet
+ *
+ */
+
+void _Region_MP_Send_response_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ Thread_Control *the_thread
+)
+{
+ Region_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+
+ the_packet = ( Region_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case REGION_MP_ANNOUNCE_CREATE:
+ case REGION_MP_ANNOUNCE_DELETE:
+ case REGION_MP_EXTRACT_PROXY:
+ case REGION_MP_GET_SEGMENT_REQUEST:
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Region_MP_Process_packet
+ *
+ */
+
+void _Region_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Region_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Region_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case REGION_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Region_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Region_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_GET_SEGMENT_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_region_get_segment(
+ the_packet->Prefix.id,
+ the_packet->size,
+ the_packet->option_set,
+ the_packet->Prefix.timeout,
+ &the_packet->segment
+ );
+
+ _Region_MP_Send_response_packet(
+ REGION_MP_GET_SEGMENT_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(void **)the_thread->Wait.return_argument = the_packet->segment;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_region_return_segment(
+ the_packet->Prefix.id,
+ the_packet->segment
+ );
+
+ _Region_MP_Send_response_packet(
+ REGION_MP_RETURN_SEGMENT_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Region_MP_Send_object_was_deleted
+ *
+ * This routine is not needed by the Region since a region
+ * cannot be deleted when segments are in use.
+ *
+ */
+
+/*PAGE
+ *
+ * _Region_MP_Send_extract_proxy
+ *
+ */
+
+void _Region_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Region_MP_Send_process_packet(
+ REGION_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+}
+
+/*PAGE
+ *
+ * _Region_MP_Get_packet
+ *
+ */
+
+Region_MP_Packet *_Region_MP_Get_packet ( void )
+{
+ return ( (Region_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/rtclock.c b/c/src/exec/rtems/src/rtclock.c
new file mode 100644
index 0000000000..388e6f091f
--- /dev/null
+++ b/c/src/exec/rtems/src/rtclock.c
@@ -0,0 +1,151 @@
+/*
+ * Clock Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * rtems_clock_get
+ *
+ * This directive returns the current date and time. If the time has
+ * not been set by a tm_set then an error is returned.
+ *
+ * Input parameters:
+ * option - which value to return
+ * time_buffer - pointer to output buffer (a time and date structure
+ * or an interval)
+ *
+ * Output parameters:
+ * time_buffer - output filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_clock_get(
+ rtems_clock_get_options option,
+ void *time_buffer
+)
+{
+ ISR_Level level;
+ rtems_interval tmp;
+
+ switch ( option ) {
+ case RTEMS_CLOCK_GET_TOD:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ *(rtems_time_of_day *)time_buffer = _TOD_Current;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ *(rtems_interval *)time_buffer = _TOD_Seconds_since_epoch;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT:
+ *(rtems_interval *)time_buffer = _Watchdog_Ticks_since_boot;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TICKS_PER_SECOND:
+ *(rtems_interval *)time_buffer = _TOD_Ticks_per_second;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TIME_VALUE:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ _ISR_Disable( level );
+ ((rtems_clock_time_value *)time_buffer)->seconds =
+ _TOD_Seconds_since_epoch;
+ tmp = _TOD_Current.ticks;
+ _ISR_Enable( level );
+
+ tmp *= _TOD_Microseconds_per_tick;
+ ((rtems_clock_time_value *)time_buffer)->microseconds = tmp;
+
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* should never get here */
+
+}
+
+/*PAGE
+ *
+ * rtems_clock_set
+ *
+ * This directive sets the date and time for this node.
+ *
+ * Input parameters:
+ * time_buffer - pointer to the time and date structure
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_clock_set(
+ rtems_time_of_day *time_buffer
+)
+{
+ rtems_interval seconds;
+
+ 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 RTEMS_INVALID_CLOCK;
+}
+
+/*PAGE
+ *
+ * rtems_clock_tick
+ *
+ * This directive notifies the executve that a tick has occurred.
+ * When the tick occurs the time manager updates and maintains
+ * the calendar time, timeslicing, and any timeout delays.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always succeeds
+ *
+ * NOTE: This routine only works for leap-years through 2099.
+ */
+
+rtems_status_code rtems_clock_tick( void )
+{
+ _TOD_Tickle_ticks();
+
+ _Watchdog_Tickle_ticks();
+
+ _Thread_Tickle_timeslice();
+
+ if ( _Thread_Is_context_switch_necessary() &&
+ _Thread_Is_dispatching_enabled() )
+ _Thread_Dispatch();
+
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/exec/rtems/src/rtemstimer.c b/c/src/exec/rtems/src/rtemstimer.c
new file mode 100644
index 0000000000..0feafb6708
--- /dev/null
+++ b/c/src/exec/rtems/src/rtemstimer.c
@@ -0,0 +1,349 @@
+/*
+ * Timer Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _Timer_Manager_initialization
+ *
+ * This routine initializes all timer manager related data structures.
+ *
+ * Input parameters:
+ * maximum_timers - number of timers to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+)
+{
+ _Objects_Initialize_information(
+ &_Timer_Information,
+ OBJECTS_RTEMS_TIMERS,
+ FALSE,
+ maximum_timers,
+ sizeof( Timer_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_timer_create
+ *
+ * This directive creates a timer and performs some initialization.
+ *
+ * Input parameters:
+ * name - timer name
+ * id - pointer to timer id
+ *
+ * Output parameters:
+ * id - timer id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Timer_Control *the_timer;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_timer = _Timer_Allocate();
+
+ if ( !the_timer ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_timer->the_class = TIMER_DORMANT;
+
+ _Objects_Open( &_Timer_Information, &the_timer->Object, &name );
+
+ *id = the_timer->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_timer_ident
+ *
+ * This directive returns the system ID associated with
+ * the timer name.
+ *
+ * Input parameters:
+ * name - user defined message queue name
+ * id - pointer to timer id
+ *
+ * Output parameters:
+ * *id - message queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Timer_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_timer_cancel
+ *
+ * This directive allows a thread to cancel a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_delete
+ *
+ * This directive allows a thread to delete a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_fire_after
+ *
+ * This directive allows a thread to start a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ * ticks - interval until routine is fired
+ * routine - routine to schedule
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_fire_after(
+ 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;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ (void) _Watchdog_Remove( &the_timer->Ticker );
+ the_timer->the_class = TIMER_INTERVAL;
+ _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
+ _Watchdog_Insert_ticks( &the_timer->Ticker, ticks );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_fire_when
+ *
+ * This directive allows a thread to start a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ * wall_time - time of day to fire timer
+ * routine - routine to schedule
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_fire_when(
+ 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_interval seconds;
+
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ 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;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ (void) _Watchdog_Remove( &the_timer->Ticker );
+ the_timer->the_class = TIMER_TIME_OF_DAY;
+ _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
+ _Watchdog_Insert_seconds(
+ &the_timer->Ticker,
+ seconds - _TOD_Seconds_since_epoch
+ );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_reset
+ *
+ * This directive allows a thread to reset a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_DEFINED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/c/src/exec/rtems/src/sem.c b/c/src/exec/rtems/src/sem.c
new file mode 100644
index 0000000000..553750a924
--- /dev/null
+++ b/c/src/exec/rtems/src/sem.c
@@ -0,0 +1,571 @@
+/*
+ * Semaphore Manager
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the Semaphore Manager.
+ * This manager utilizes standard Dijkstra counting semaphores to provide
+ * synchronization and mutual exclusion capabilities.
+ *
+ * Directives provided are:
+ *
+ * + create a semaphore
+ * + get an ID of a semaphore
+ * + delete a semaphore
+ * + acquire a semaphore
+ * + release a semaphore
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/sysstate.h>
+
+#include <rtems/score/interr.h>
+
+/*PAGE
+ *
+ * _Semaphore_Manager_initialization
+ *
+ * This routine initializes all semaphore manager related data structures.
+ *
+ * Input parameters:
+ * maximum_semaphores - maximum configured semaphores
+ *
+ * Output parameters: NONE
+ */
+
+void _Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+)
+{
+ _Objects_Initialize_information(
+ &_Semaphore_Information,
+ OBJECTS_RTEMS_SEMAPHORES,
+ TRUE,
+ maximum_semaphores,
+ sizeof( Semaphore_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_SEMAPHORE,
+ _Semaphore_MP_Process_packet
+ );
+
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_create
+ *
+ * This directive creates a semaphore and sets the initial value based
+ * 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
+ * priority_ceiling - semaphore's ceiling priority
+ * id - pointer to semaphore id
+ *
+ * Output parameters:
+ * id - semaphore id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_create(
+ 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 ( !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ if ( _Attributes_Is_inherit_priority( attribute_set ) )
+ return RTEMS_NOT_DEFINED;
+
+ } else if ( _Attributes_Is_inherit_priority( attribute_set ) ||
+ _Attributes_Is_priority_ceiling( attribute_set ) ) {
+
+ if ( ! ( _Attributes_Is_binary_semaphore( attribute_set ) &&
+ _Attributes_Is_priority( attribute_set ) ) )
+ return RTEMS_NOT_DEFINED;
+
+ }
+
+ if ( _Attributes_Is_binary_semaphore( attribute_set ) && ( count > 1 ) )
+ return RTEMS_INVALID_NUMBER;
+
+ _Thread_Disable_dispatch(); /* prevents deletion */
+
+ the_semaphore = _Semaphore_Allocate();
+
+ if ( !the_semaphore ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( _Attributes_Is_global( attribute_set ) &&
+ ! ( _Objects_MP_Allocate_and_open( &_Semaphore_Information, name,
+ the_semaphore->Object.id, FALSE ) ) ) {
+ _Semaphore_Free( the_semaphore );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_semaphore->attribute_set = attribute_set;
+
+ 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 ????? */
+
+ the_mutex_attributes.priority_ceiling = priority_ceiling;
+
+ 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;
+
+ /*
+ * The following are just to make Purify happy.
+ */
+
+ the_mutex_attributes.allow_nesting = TRUE;
+ the_mutex_attributes.priority_ceiling = PRIORITY_MINIMUM;
+
+ _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 );
+
+ *id = the_semaphore->Object.id;
+
+ if ( _Attributes_Is_global( attribute_set ) )
+ _Semaphore_MP_Send_process_packet(
+ SEMAPHORE_MP_ANNOUNCE_CREATE,
+ the_semaphore->Object.id,
+ name,
+ 0 /* Not used */
+ );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_ident
+ *
+ * This directive returns the system ID associated with
+ * the semaphore name.
+ *
+ * Input parameters:
+ * name - user defined semaphore name
+ * node - node(s) to be searched
+ * id - pointer to semaphore id
+ *
+ * Output parameters:
+ * *id - semaphore id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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
+ *
+ * rtems_semaphore_delete
+ *
+ * This directive allows a thread to delete a semaphore specified by
+ * the semaphore id. The semaphore is freed back to the inactive
+ * semaphore chain.
+ *
+ * Input parameters:
+ * id - semaphore id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_delete(
+ Objects_Id id
+)
+{
+ register Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _Semaphore_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ 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 );
+
+ _Semaphore_Free( the_semaphore );
+
+ if ( _Attributes_Is_global( the_semaphore->attribute_set ) ) {
+
+ _Objects_MP_Close( &_Semaphore_Information, the_semaphore->Object.id );
+
+ _Semaphore_MP_Send_process_packet(
+ SEMAPHORE_MP_ANNOUNCE_DELETE,
+ the_semaphore->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_obtain
+ *
+ * This directive allows a thread to acquire a semaphore.
+ *
+ * Input parameters:
+ * id - semaphore id
+ * option_set - wait option
+ * timeout - number of ticks to wait (0 means wait forever)
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_obtain(
+ 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 ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return _Semaphore_MP_Send_request_packet(
+ SEMAPHORE_MP_OBTAIN_REQUEST,
+ id,
+ option_set,
+ timeout
+ );
+ case OBJECTS_LOCAL:
+ 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 );
+ }
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_release
+ *
+ * This directive allows a thread to release a semaphore.
+ *
+ * Input parameters:
+ * id - semaphore id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_release(
+ Objects_Id id
+)
+{
+ register Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+ CORE_mutex_Status mutex_status;
+ CORE_semaphore_Status semaphore_status;
+
+ the_semaphore = _Semaphore_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return _Semaphore_MP_Send_request_packet(
+ SEMAPHORE_MP_RELEASE_REQUEST,
+ id,
+ 0, /* Not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+ case OBJECTS_LOCAL:
+ 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 );
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*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;
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Semaphore_Translate_core_semaphore_return_code
+ *
+ * Input parameters:
+ * the_semaphore_status - semaphore status code to translate
+ *
+ * Output parameters:
+ * rtems status code - translated RTEMS status code
+ *
+ */
+
+rtems_status_code _Semaphore_Translate_core_semaphore_return_code (
+ unsigned32 the_semaphore_status
+)
+{
+ 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;
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*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
+ );
+}
+
+
+/*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/c/src/exec/rtems/src/semmp.c b/c/src/exec/rtems/src/semmp.c
new file mode 100644
index 0000000000..9267990ed5
--- /dev/null
+++ b/c/src/exec/rtems/src/semmp.c
@@ -0,0 +1,308 @@
+/*
+ * Multiprocessing Support for the Semaphore Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_process_packet
+ *
+ */
+
+void _Semaphore_MP_Send_process_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Semaphore_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+
+ the_packet = _Semaphore_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = semaphore_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == SEMAPHORE_MP_EXTRACT_PROXY )
+ node = rtems_get_node( semaphore_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_request_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
+)
+{
+ Semaphore_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+
+ the_packet = _Semaphore_MP_Get_packet();
+ 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))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = operation;
+ the_packet->Prefix.id = semaphore_id;
+ the_packet->option_set = option_set;
+
+ return _MPCI_Send_request_packet(
+ rtems_get_node( semaphore_id ),
+ &the_packet->Prefix,
+ STATES_WAITING_FOR_SEMAPHORE
+ );
+ break;
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_response_packet
+ *
+ */
+
+void _Semaphore_MP_Send_response_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+)
+{
+ Semaphore_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+
+ the_packet = ( Semaphore_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Semaphore_MP_Process_packet
+ *
+ */
+
+void _Semaphore_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Semaphore_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Semaphore_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Semaphore_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Semaphore_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_semaphore_obtain(
+ the_packet->Prefix.id,
+ the_packet->option_set,
+ the_packet->Prefix.timeout
+ );
+
+ if ( ! _Thread_Is_proxy_blocking( the_packet->Prefix.return_code ) )
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_OBTAIN_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_semaphore_release(
+ the_packet->Prefix.id
+ );
+
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_RELEASE_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_object_was_deleted
+ *
+ */
+
+void _Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+)
+{
+ the_proxy->receive_packet->return_code = RTEMS_OBJECT_WAS_DELETED;
+
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_OBTAIN_RESPONSE,
+ the_proxy->Wait.id,
+ the_proxy
+ );
+
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_extract_proxy
+ *
+ */
+
+void _Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Semaphore_MP_Send_process_packet(
+ SEMAPHORE_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Get_packet
+ *
+ */
+
+Semaphore_MP_Packet *_Semaphore_MP_Get_packet ( void )
+{
+ return ( (Semaphore_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/signal.c b/c/src/exec/rtems/src/signal.c
new file mode 100644
index 0000000000..9f6d8df1a3
--- /dev/null
+++ b/c/src/exec/rtems/src/signal.c
@@ -0,0 +1,149 @@
+/*
+ * Signal Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/score/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
+ * catching signals.
+ *
+ * Input parameters:
+ * handler - address of asynchronous signal routine (asr)
+ * ( NULL indicates asr is invalid )
+ * mode_set - mode value for asr
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always succeeds
+ */
+
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry asr_handler,
+ rtems_mode mode_set
+)
+{
+ 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 ) ) {
+ asr->mode_set = mode_set;
+ asr->handler = asr_handler;
+ }
+ else
+ _ASR_Initialize( asr );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_signal_send
+ *
+ * This directive allows a thread to send signals to a thread.
+ *
+ * Input parameters:
+ * id - thread id
+ * signal_set - signal set
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_signal_send(
+ Objects_Id id,
+ rtems_signal_set signal_set
+)
+{
+ 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;
+ case OBJECTS_REMOTE:
+ return _Signal_MP_Send_request_packet(
+ SIGNAL_MP_SEND_REQUEST,
+ id,
+ signal_set
+ );
+ case OBJECTS_LOCAL:
+ 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 );
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_DEFINED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/c/src/exec/rtems/src/signalmp.c b/c/src/exec/rtems/src/signalmp.c
new file mode 100644
index 0000000000..4bc696b901
--- /dev/null
+++ b/c/src/exec/rtems/src/signalmp.c
@@ -0,0 +1,189 @@
+/*
+ * Multiprocessing Support for the Signal Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Signal_MP_Send_process_packet
+ *
+ * This subprogram is not needed since there are no process
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Signal_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Signal_MP_Send_request_packet (
+ Signal_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_signal_set signal_in
+)
+{
+ Signal_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SIGNAL_MP_SEND_REQUEST:
+
+ the_packet = _Signal_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = task_id;
+ the_packet->signal_in = signal_in;
+
+ return _MPCI_Send_request_packet(
+ rtems_get_node( task_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+ break;
+
+ case SIGNAL_MP_SEND_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_INTERNAL_ERROR;
+}
+
+/*PAGE
+ *
+ * _Signal_MP_Send_response_packet
+ *
+ */
+
+void _Signal_MP_Send_response_packet (
+ Signal_MP_Remote_operations operation,
+ Thread_Control *the_thread
+)
+{
+ Signal_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SIGNAL_MP_SEND_RESPONSE:
+
+ the_packet = ( Signal_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case SIGNAL_MP_SEND_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Signal_MP_Process_packet
+ *
+ */
+
+void _Signal_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Signal_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+
+ the_packet = (Signal_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case SIGNAL_MP_SEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_signal_send(
+ the_packet->Prefix.id,
+ the_packet->signal_in
+ );
+
+ _Signal_MP_Send_response_packet(
+ SIGNAL_MP_SEND_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case SIGNAL_MP_SEND_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Signal_MP_Send_object_was_deleted
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Signal_MP_Send_extract_proxy
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Signal_MP_Get_packet
+ *
+ */
+
+Signal_MP_Packet *_Signal_MP_Get_packet ( void )
+{
+ return ( (Signal_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/taskmp.c b/c/src/exec/rtems/src/taskmp.c
new file mode 100644
index 0000000000..fc093fb83b
--- /dev/null
+++ b/c/src/exec/rtems/src/taskmp.c
@@ -0,0 +1,340 @@
+/*
+ * Multiprocessing Support for the RTEMS Task Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_process_packet
+ *
+ */
+
+void _RTEMS_tasks_MP_Send_process_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_name name
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+
+ the_packet = _RTEMS_tasks_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = task_id;
+ the_packet->name = name;
+
+ _MPCI_Send_process_packet( MPCI_ALL_NODES, &the_packet->Prefix );
+ break;
+
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_task_priority new_priority,
+ unsigned32 notepad,
+ unsigned32 note
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+
+ the_packet = _RTEMS_tasks_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = task_id;
+ the_packet->the_priority = new_priority;
+ the_packet->notepad = notepad;
+ the_packet->note = note;
+
+ return _MPCI_Send_request_packet(
+ rtems_get_node( task_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+ break;
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_response_packet
+ *
+ */
+
+void _RTEMS_tasks_MP_Send_response_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Thread_Control *the_thread
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+
+ the_packet = (RTEMS_tasks_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _RTEMS_tasks_MP_Process_packet
+ *
+ */
+
+void _RTEMS_tasks_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (RTEMS_tasks_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_RTEMS_tasks_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_RTEMS_tasks_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_suspend(
+ the_packet->Prefix.id
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_SUSPEND_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_resume(
+ the_packet->Prefix.id
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_RESUME_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_set_priority(
+ the_packet->Prefix.id,
+ the_packet->the_priority,
+ &the_packet->the_priority
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(rtems_task_priority *)the_thread->Wait.return_argument =
+ the_packet->the_priority;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_get_note(
+ the_packet->Prefix.id,
+ the_packet->notepad,
+ &the_packet->note
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_GET_NOTE_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(unsigned32 *)the_thread->Wait.return_argument = the_packet->note;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_set_note(
+ the_packet->Prefix.id,
+ the_packet->notepad,
+ the_packet->note
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_SET_NOTE_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_object_was_deleted
+ *
+ * This routine is not neededby the Tasks since a task
+ * cannot be globally deleted.
+ *
+ */
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_extract_proxy
+ *
+ * This routine is not neededby the Tasks since a task
+ * cannot be globally deleted.
+ *
+ */
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Get_packet
+ *
+ */
+
+RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void )
+{
+ return (RTEMS_tasks_MP_Packet *) _MPCI_Get_packet();
+}
+
+/* end of file */
diff --git a/c/src/exec/rtems/src/tasks.c b/c/src/exec/rtems/src/tasks.c
new file mode 100644
index 0000000000..09568d4568
--- /dev/null
+++ b/c/src/exec/rtems/src/tasks.c
@@ -0,0 +1,1119 @@
+/*
+ * RTEMS Task Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/object.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/states.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/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
+ */
+
+void _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;
+ asr->signals_posted = 0;
+ _ISR_Enable( level );
+
+
+ if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
+ return;
+
+ 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 );
+
+}
+
+API_extensions_Control _RTEMS_tasks_API_extensions = {
+ { NULL, NULL },
+ NULL, /* predriver */
+ _RTEMS_tasks_Initialize_user_tasks, /* postdriver */
+ _RTEMS_tasks_Switch_extension /* post switch */
+};
+
+User_extensions_Control _RTEMS_tasks_User_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 */
+ NULL, /* begin */
+ NULL, /* exitted */
+ NULL /* fatal */
+ }
+};
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Manager_initialization
+ *
+ * This routine initializes all Task Manager related data structures.
+ *
+ * Input parameters:
+ * maximum_tasks - number of tasks to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _RTEMS_tasks_Manager_initialization(
+ 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;
+
+ /*
+ * There may not be any RTEMS initialization tasks configured.
+ */
+
+#if 0
+ if ( user_tasks == NULL || number_of_initialization_tasks == 0 )
+ _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, RTEMS_TOO_MANY );
+#endif
+
+ _Objects_Initialize_information(
+ &_RTEMS_tasks_Information,
+ OBJECTS_RTEMS_TASKS,
+ TRUE,
+ maximum_tasks,
+ sizeof( Thread_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ TRUE
+ );
+
+ /*
+ * Add all the extensions for this API
+ */
+
+ _User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
+
+ _API_extensions_Add( &_RTEMS_tasks_API_extensions );
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_TASKS,
+ _RTEMS_tasks_MP_Process_packet
+ );
+
+}
+
+/*PAGE
+ *
+ * rtems_task_create
+ *
+ * This directive creates a thread by allocating and initializing a
+ * thread control block and a stack. The newly created thread is
+ * placed in the dormant state.
+ *
+ * Input parameters:
+ * name - user defined thread name
+ * initial_priority - thread priority
+ * stack_size - stack size in bytes
+ * initial_modes - initial thread mode
+ * attribute_set - thread attributes
+ * id - pointer to thread id
+ *
+ * Output parameters:
+ * id - thread id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_create(
+ rtems_name name,
+ rtems_task_priority initial_priority,
+ unsigned32 stack_size,
+ rtems_mode initial_modes,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ register Thread_Control *the_thread;
+ 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;
+
+ /*
+ * Core Thread Initialize insures we get the minimum amount of
+ * stack space.
+ */
+
+#if 0
+ if ( !_Stack_Is_enough( stack_size ) )
+ return RTEMS_INVALID_SIZE;
+#endif
+
+ /*
+ * Validate the RTEMS API priority and convert it to the core priority range.
+ */
+
+ if ( !_RTEMS_tasks_Priority_is_valid( initial_priority ) )
+ return RTEMS_INVALID_PRIORITY;
+
+ core_priority = _RTEMS_tasks_Priority_to_Core( initial_priority );
+
+ /*
+ * Fix the attribute set to match the attributes which
+ * this processor (1) requires and (2) is able to support.
+ * First add in the required flags for attribute_set
+ * Typically this might include FP if the platform
+ * or application required all tasks to be fp aware.
+ * Then turn off the requested bits which are not supported.
+ */
+
+ the_attribute_set = _Attributes_Set( attribute_set, ATTRIBUTES_REQUIRED );
+ the_attribute_set =
+ _Attributes_Clear( the_attribute_set, ATTRIBUTES_NOT_SUPPORTED );
+
+ if ( _Attributes_Is_floating_point( the_attribute_set ) )
+ is_fp = TRUE;
+ else
+ is_fp = FALSE;
+
+ if ( _Attributes_Is_global( the_attribute_set ) ) {
+
+ is_global = TRUE;
+
+ if ( !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ } else
+ is_global = FALSE;
+
+ /*
+ * Make sure system is MP if this task is global
+ */
+
+ /*
+ * Disable dispatch for protection
+ */
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Allocate the thread control block and -- if the task is global --
+ * allocate a global object control block.
+ *
+ * NOTE: This routine does not use the combined allocate and open
+ * global object routine because this results in a lack of
+ * control over when memory is allocated and can be freed in
+ * the event of an error.
+ */
+
+ the_thread = _RTEMS_tasks_Allocate();
+
+ if ( !the_thread ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( is_global ) {
+ the_global_object = _Objects_MP_Allocate_global_object();
+
+ if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
+ _RTEMS_tasks_Free( the_thread );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+ }
+
+ /*
+ * Initialize the core thread for this task.
+ */
+
+ 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) ?
+ THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE :
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ NULL, /* no budget algorithm callout */
+ _Modes_Get_interrupt_level(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;
+ }
+
+ 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->is_global = TRUE;
+
+ _Objects_MP_Open(
+ &_RTEMS_tasks_Information,
+ the_global_object,
+ name,
+ the_thread->Object.id
+ );
+
+ _RTEMS_tasks_MP_Send_process_packet(
+ RTEMS_TASKS_MP_ANNOUNCE_CREATE,
+ the_thread->Object.id,
+ name
+ );
+
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_task_ident
+ *
+ * This directive returns the system ID associated with
+ * the thread name.
+ *
+ * Input parameters:
+ * name - user defined thread name
+ * node - node(s) to be searched
+ * id - pointer to thread id
+ *
+ * Output parameters:
+ * *id - thread id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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 );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_task_start
+ *
+ * This directive readies the thread identified by the "id"
+ * based on its current priorty, to await execution. A thread
+ * can be started only from the dormant state.
+ *
+ * Input parameters:
+ * id - thread id
+ * entry_point - start execution address of thread
+ * argument - thread argument
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_start(
+ rtems_id id,
+ rtems_task_entry entry_point,
+ unsigned32 argument
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ if ( entry_point == NULL )
+ return RTEMS_INVALID_ADDRESS;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INCORRECT_STATE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_restart
+ *
+ * This directive readies the specified thread. It restores
+ * the thread environment to the original values established
+ * at thread creation and start time. A thread can be restarted
+ * from any state except the dormant state.
+ *
+ * Input parameters:
+ * id - thread id
+ * argument - thread argument
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_restart(
+ Objects_Id id,
+ unsigned32 argument
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ if ( _Thread_Restart( the_thread, NULL, argument ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INCORRECT_STATE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_delete
+ *
+ * This directive allows a thread to delete itself or the thread
+ * identified in the id field. The executive halts execution
+ * of the thread and frees the thread control block.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters:
+ * nothing - if id is the requesting thread (always succeeds)
+ * RTEMS_SUCCESSFUL - if successful and id is
+ * not the requesting thread
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_delete(
+ Objects_Id id
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ _Thread_Close( &_RTEMS_tasks_Information, the_thread );
+
+ _RTEMS_tasks_Free( the_thread );
+
+ if ( the_thread->is_global ) {
+
+ _Objects_MP_Close( &_RTEMS_tasks_Information, the_thread->Object.id );
+
+ _RTEMS_tasks_MP_Send_process_packet(
+ RTEMS_TASKS_MP_ANNOUNCE_DELETE,
+ the_thread->Object.id,
+ 0 /* Not used */
+ );
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_suspend
+ *
+ * This directive will place the specified thread in the "suspended"
+ * state. Note that the suspended state can be in addition to
+ * other waiting states.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_suspend(
+ Objects_Id id
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ 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 */
+ );
+ case OBJECTS_LOCAL:
+ if ( !_States_Is_suspended( the_thread->current_state ) ) {
+ _Thread_Set_state( the_thread, STATES_SUSPENDED );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_ALREADY_SUSPENDED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_resume
+ *
+ * This directive will remove the specified thread
+ * from the suspended state.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_resume(
+ Objects_Id id
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return(
+ _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_RESUME_REQUEST,
+ id,
+ 0, /* Not used */
+ 0, /* Not used */
+ 0 /* Not used */
+ )
+ );
+ case OBJECTS_LOCAL:
+ if ( _States_Is_suspended( the_thread->current_state ) ) {
+ _Thread_Resume( the_thread );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INCORRECT_STATE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_set_priority
+ *
+ * This directive changes the priority of the specified thread.
+ * The specified thread can be any thread in the system including
+ * the requesting thread.
+ *
+ * Input parameters:
+ * id - thread id (0 indicates requesting thread)
+ * new_priority - thread priority (0 indicates current priority)
+ * old_priority - pointer to previous priority
+ *
+ * Output parameters:
+ * old_priority - previous priority
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_set_priority(
+ Objects_Id id,
+ rtems_task_priority new_priority,
+ rtems_task_priority *old_priority
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ if ( new_priority != RTEMS_CURRENT_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;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = old_priority;
+ return(
+ _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_SET_PRIORITY_REQUEST,
+ id,
+ new_priority,
+ 0, /* Not used */
+ 0 /* Not used */
+ )
+ );
+ case OBJECTS_LOCAL:
+ *old_priority = the_thread->current_priority;
+ if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
+ the_thread->real_priority = new_priority;
+ if ( the_thread->resource_count == 0 ||
+ the_thread->current_priority > new_priority )
+ _Thread_Change_priority( the_thread, new_priority, FALSE );
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_mode
+ *
+ * This directive enables and disables several modes of
+ * execution for the requesting thread.
+ *
+ * Input parameters:
+ * mode_set - new mode
+ * mask - mask
+ * previous_mode_set - address of previous mode set
+ *
+ * Output:
+ * *previous_mode_set - previous mode set
+ * always return RTEMS_SUCCESSFUL;
+ */
+
+rtems_status_code rtems_task_mode(
+ rtems_mode mode_set,
+ rtems_mode mask,
+ rtems_mode *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;
+
+ if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
+ old_mode |= RTEMS_NO_TIMESLICE;
+ else
+ old_mode |= RTEMS_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 ) {
+ if ( _Modes_Is_timeslice(mode_set) )
+ executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
+ else
+ executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ }
+
+ /*
+ * 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;
+ executing->do_post_task_switch_extension = TRUE;
+ }
+ }
+ }
+
+ if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
+ _Thread_Dispatch();
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_task_get_note
+ *
+ * This directive obtains the note from the specified notepad
+ * of the specified thread.
+ *
+ * Input parameters:
+ * id - thread id
+ * notepad - notepad number
+ * note - pointer to note
+ *
+ * Output parameters:
+ * note - filled in if successful
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_get_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 *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
+ * be checking an unsigned number for being negative.
+ */
+
+ if ( notepad > RTEMS_NOTEPAD_LAST )
+ return RTEMS_INVALID_NUMBER;
+
+ /*
+ * Optimize the most likely case to avoid the Thread_Dispatch.
+ */
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
+ _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
+ 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;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = note;
+
+ return _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_GET_NOTE_REQUEST,
+ id,
+ 0, /* Not used */
+ notepad,
+ 0 /* Not used */
+ );
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ *note = api->Notepads[ notepad ];
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_set_note
+ *
+ * This directive sets the specified notepad contents to the given
+ * note.
+ *
+ * Input parameters:
+ * id - thread id
+ * notepad - notepad number
+ * note - note value
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_set_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 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
+ * be checking an unsigned number for being negative.
+ */
+
+ if ( notepad > RTEMS_NOTEPAD_LAST )
+ return RTEMS_INVALID_NUMBER;
+
+ /*
+ * Optimize the most likely case to avoid the Thread_Dispatch.
+ */
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
+ _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
+ 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;
+ case OBJECTS_REMOTE:
+ return _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_SET_NOTE_REQUEST,
+ id,
+ 0, /* Not used */
+ notepad,
+ note
+ );
+
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ api->Notepads[ notepad ] = note;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_wake_after
+ *
+ * This directive suspends the requesting thread for the given amount
+ * of ticks.
+ *
+ * Input parameters:
+ * ticks - number of ticks to wait
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always successful
+ */
+
+rtems_status_code rtems_task_wake_after(
+ rtems_interval ticks
+)
+{
+ if ( ticks == 0 ) {
+ _Thread_Yield_processor();
+ _Thread_Dispatch();
+ } else {
+ _Thread_Disable_dispatch();
+ _Thread_Set_state( _Thread_Executing, STATES_DELAYING );
+ _Watchdog_Initialize(
+ &_Thread_Executing->Timer,
+ _Thread_Delay_ended,
+ _Thread_Executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
+ _Thread_Enable_dispatch();
+ }
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_task_wake_when
+ *
+ * This directive blocks the requesting thread until the given date and
+ * time is reached.
+ *
+ * Input parameters:
+ * time_buffer - pointer to the time and date structure
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_wake_when(
+rtems_time_of_day *time_buffer
+)
+{
+ Watchdog_Interval seconds;
+
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ time_buffer->ticks = 0;
+
+ 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;
+
+ _Thread_Disable_dispatch();
+ _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
+ _Watchdog_Initialize(
+ &_Thread_Executing->Timer,
+ _Thread_Delay_ended,
+ _Thread_Executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_seconds(
+ &_Thread_Executing->Timer,
+ seconds - _TOD_Seconds_since_epoch
+ );
+ _Thread_Enable_dispatch();
+ 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;
+
+ if ( !user_tasks || maximum == 0 )
+ return;
+
+ 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/c/src/exec/rtems/src/timer.c b/c/src/exec/rtems/src/timer.c
new file mode 100644
index 0000000000..0feafb6708
--- /dev/null
+++ b/c/src/exec/rtems/src/timer.c
@@ -0,0 +1,349 @@
+/*
+ * Timer Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _Timer_Manager_initialization
+ *
+ * This routine initializes all timer manager related data structures.
+ *
+ * Input parameters:
+ * maximum_timers - number of timers to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+)
+{
+ _Objects_Initialize_information(
+ &_Timer_Information,
+ OBJECTS_RTEMS_TIMERS,
+ FALSE,
+ maximum_timers,
+ sizeof( Timer_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_timer_create
+ *
+ * This directive creates a timer and performs some initialization.
+ *
+ * Input parameters:
+ * name - timer name
+ * id - pointer to timer id
+ *
+ * Output parameters:
+ * id - timer id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Timer_Control *the_timer;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_timer = _Timer_Allocate();
+
+ if ( !the_timer ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_timer->the_class = TIMER_DORMANT;
+
+ _Objects_Open( &_Timer_Information, &the_timer->Object, &name );
+
+ *id = the_timer->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_timer_ident
+ *
+ * This directive returns the system ID associated with
+ * the timer name.
+ *
+ * Input parameters:
+ * name - user defined message queue name
+ * id - pointer to timer id
+ *
+ * Output parameters:
+ * *id - message queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Timer_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_timer_cancel
+ *
+ * This directive allows a thread to cancel a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_delete
+ *
+ * This directive allows a thread to delete a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_fire_after
+ *
+ * This directive allows a thread to start a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ * ticks - interval until routine is fired
+ * routine - routine to schedule
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_fire_after(
+ 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;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ (void) _Watchdog_Remove( &the_timer->Ticker );
+ the_timer->the_class = TIMER_INTERVAL;
+ _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
+ _Watchdog_Insert_ticks( &the_timer->Ticker, ticks );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_fire_when
+ *
+ * This directive allows a thread to start a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ * wall_time - time of day to fire timer
+ * routine - routine to schedule
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_fire_when(
+ 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_interval seconds;
+
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ 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;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ (void) _Watchdog_Remove( &the_timer->Ticker );
+ the_timer->the_class = TIMER_TIME_OF_DAY;
+ _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
+ _Watchdog_Insert_seconds(
+ &the_timer->Ticker,
+ seconds - _TOD_Seconds_since_epoch
+ );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_reset
+ *
+ * This directive allows a thread to reset a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_DEFINED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/c/src/exec/sapi/Makefile.in b/c/src/exec/sapi/Makefile.in
new file mode 100644
index 0000000000..d8f3d6fae8
--- /dev/null
+++ b/c/src/exec/sapi/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=headers $(INLINE) optman src
diff --git a/c/src/exec/sapi/headers/Makefile.in b/c/src/exec/sapi/headers/Makefile.in
new file mode 100644
index 0000000000..24e8766199
--- /dev/null
+++ b/c/src/exec/sapi/headers/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES= config directives extension fatal init io mptables sptables
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed externally
+EXTERNAL_H_PIECES = confdefs
+EXTERNAL_H_FILES=$(EXTERNAL_H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES) $(EXTERNAL_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/exec/sapi/headers/README b/c/src/exec/sapi/headers/README
new file mode 100644
index 0000000000..5fcc0d14c7
--- /dev/null
+++ b/c/src/exec/sapi/headers/README
@@ -0,0 +1,135 @@
+#
+# $Id$
+#
+
+Configuring a System Using the Template in confdefs.h
+=====================================================
+
+The file confdefs.h is a Configuration Template file which can be
+used to greatly simplify the creation and maintenance of RTEMS
+Configuration Tables. The basic concepts are:
+
+ + confdefs.h provides defaults for all configuration parameters
+
+ + applications specify only those values they wish to override
+
+ + confdefs.h can be the only file which knows the precise layout
+ of the RTEMS Configuration Tables.
+
+The Configuration Template setup is used by all RTEMS tests to
+simplify the maintenance of the tests.
+
+Here is the section from the system.h file from test tm21 from
+the Timing Test Suite:
+
+ /* configuration information */
+
+ #define CONFIGURE_TMTEST
+
+ #define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ #define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+ #define CONFIGURE_MAXIMUM_TASKS 102
+ #define CONFIGURE_MAXIMUM_TIMERS 100
+ #define CONFIGURE_MAXIMUM_SEMAPHORES 100
+ #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 100
+ #define CONFIGURE_MAXIMUM_PARTITIONS 100
+ #define CONFIGURE_MAXIMUM_REGIONS 100
+ #define CONFIGURE_MAXIMUM_PORTS 100
+ #define CONFIGURE_MAXIMUM_PERIODS 100
+
+ #define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+ #include <confdefs.h>
+
+
+The above example overrides a number of the configuration parameters.
+It informs the template that it is a member of the Timing Suite,
+requires a console and timer driver, and that it needs 102 tasks,
+100 timers, 100 semaphores, 100 message queues, 100 partitions,
+100 regions, 100 ports, and 100 periods. By default, the test
+would have gotten no drivers, 10 tasks, and no other RTEMS objects.
+
+The following shows the configuration tables generated by the
+template by default.
+
+
+#include <bsp.h>
+
+#define NULL_DRIVER_TABLE_ENTRY \
+ { NULL, NULL, NULL, NULL, NULL, NULL }
+
+rtems_driver_address_table Device_drivers[] = {
+#ifdef CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ CONSOLE_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+ CLOCK_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+ STUB_DRIVER_TABLE_ENTRY,
+#endif
+ NULL_DRIVER_TABLE_ENTRY,
+};
+
+rtems_initialization_tasks_table Initialization_tasks[] = {
+ { rtems_build_name( 'U', 'I', '1', ' ' ), /* init task name */
+ RTEMS_MINIMUM_STACK_SIZE, /* init task stack size */
+ 1, /* init task priority */
+ RTEMS_DEFAULT_ATTRIBUTES, /* init task attributes */
+ Init, /* init task entry point */
+ RTEMS_NO_PREEMPT, /* init task initial mode */
+ 0 /* init task argument list */
+ }
+};
+
+#ifdef CONFIGURE_MPTEST
+/*
+ * NODE_NUMBER is assumed to be set on the compile line.
+ */
+
+rtems_multiprocessing_table Multiprocessing_configuration = {
+ NODE_NUMBER, /* local node number */
+ 2, /* maximum # nodes in system */
+ 32, /* maximum # global objects */
+ 32, /* maximum # proxies */
+ &MPCI_table /* pointer to MPCI config table */
+};
+#endif
+
+/*
+ * CONFIGURE_EXECUTIVE_RAM_SIZE is a rough guess based on the number of
+ * tasks in the system plus enough extra to get a whole 64K extra.
+ *
+ * The NULL address for the workspace area is assumed to be assigned
+ * at startup time by the BSP.
+ */
+
+rtems_configuration_table Configuration = {
+ NULL, /* executive RAM work area */
+ CONFIGURE_EXECUTIVE_RAM_SIZE, /* executive RAM size */
+ 10, /* maximum # tasks */
+ 0, /* maximum # timers */
+ 0, /* maximum # semaphores */
+ 0, /* maximum # message queues */
+ 0, /* maximum # messages */
+ 0, /* maximum # partitions */
+ 0, /* maximum # regions */
+ 0, /* maximum # dp memory areas */
+ 0, /* maximum # periods */
+ 0, /* maximum # user extensions */
+ RTEMS_MILLISECONDS_TO_MICROSECONDS(10), /* # us in a tick */
+ 50, /* # ticks in a timeslice */
+ sizeof (Initialization_tasks) / sizeof(rtems_initialization_tasks_table),
+ /* number of init tasks */
+ Initialization_tasks, /* init task(s) table */
+ sizeof (Device_drivers) / sizeof(rtems_driver_address_table),
+ /* number of device drivers */
+ Device_drivers, /* pointer to driver address table */
+ NULL, /* pointer to initial extensions */
+#ifdef CONFIGURE_MPTEST
+ &Multiprocessing_configuration
+#else
+ NULL /* ptr to MP config table */
+#endif
+};
diff --git a/c/src/exec/sapi/headers/confdefs.h b/c/src/exec/sapi/headers/confdefs.h
new file mode 100644
index 0000000000..ab08adb4b5
--- /dev/null
+++ b/c/src/exec/sapi/headers/confdefs.h
@@ -0,0 +1,485 @@
+/* confdefs.h
+ *
+ * This include file contains the configuration table template that will
+ * be used by the single processor tests to define its default configuration
+ * parameters.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CONFIGURATION_TEMPLATE_h
+#define __CONFIGURATION_TEMPLATE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern rtems_initialization_tasks_table Initialization_tasks[];
+extern rtems_driver_address_table Device_drivers[];
+extern rtems_configuration_table Configuration;
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+#ifdef RTEMS_POSIX_API
+extern posix_api_configuration_table Configuration_POSIX_API;
+#endif
+
+/*
+ * Default User Initialization Task Table. This table guarantees that
+ * one user initialization table is defined.
+ */
+
+#ifdef CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#ifdef CONFIGURE_HAS_OWN_INIT_TASK_TABLE
+
+/*
+ * The user is defining their own table information and setting the
+ * appropriate variables.
+ */
+
+#else
+
+#ifndef CONFIGURE_INIT_TASK_NAME
+#define CONFIGURE_INIT_TASK_NAME rtems_build_name( 'U', 'I', '1', ' ' )
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_STACK_SIZE
+#define CONFIGURE_INIT_TASK_STACK_SIZE RTEMS_MINIMUM_STACK_SIZE
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_PRIORITY
+#define CONFIGURE_INIT_TASK_PRIORITY 1
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ATTRIBUTES
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ENTRY_POINT
+#define CONFIGURE_INIT_TASK_ENTRY_POINT Init
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_INITIAL_MODES
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_NO_PREEMPT
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ARGUMENTS
+#define CONFIGURE_INIT_TASK_ARGUMENTS 0
+#endif
+
+#ifdef CONFIGURE_INIT
+rtems_initialization_tasks_table Initialization_tasks[] = {
+ { CONFIGURE_INIT_TASK_NAME,
+ CONFIGURE_INIT_TASK_STACK_SIZE,
+ CONFIGURE_INIT_TASK_PRIORITY,
+ CONFIGURE_INIT_TASK_ATTRIBUTES,
+ CONFIGURE_INIT_TASK_ENTRY_POINT,
+ CONFIGURE_INIT_TASK_INITIAL_MODES,
+ CONFIGURE_INIT_TASK_ARGUMENTS
+ }
+};
+#endif
+
+#define CONFIGURE_INIT_TASK_TABLE Initialization_tasks
+
+#define CONFIGURE_INIT_TASK_TABLE_SIZE \
+ sizeof(CONFIGURE_INIT_TASK_TABLE) / sizeof(rtems_initialization_tasks_table)
+
+#endif /* CONFIGURE_HAS_OWN_INIT_TASK_TABLE */
+
+#else /* CONFIGURE_RTEMS_INIT_TASKS_TABLE */
+
+#define CONFIGURE_INIT_TASK_TABLE NULL
+#define CONFIGURE_INIT_TASK_TABLE_SIZE 0
+
+#endif
+
+/*
+ * Default Device Driver Table. Each driver needed by the test is explicitly
+ * choosen by that test. There is always a null driver entry.
+ */
+
+#define NULL_DRIVER_TABLE_ENTRY \
+ { NULL, NULL, NULL, NULL, NULL, NULL }
+
+#ifdef CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+#include <timerdrv.h>
+#endif
+
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+#include <stubdrv.h>
+#endif
+
+#ifndef CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
+
+#ifdef CONFIGURE_INIT
+rtems_driver_address_table Device_drivers[] = {
+#ifdef CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ CONSOLE_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+ CLOCK_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+ STUB_DRIVER_TABLE_ENTRY,
+#endif
+ NULL_DRIVER_TABLE_ENTRY
+};
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE */
+
+/*
+ * Default the number of devices per device driver. This value may be
+ * overridden by the user.
+ */
+
+#ifndef CONFIGURE_HAS_OWN_NUMBER_OF_DEVICES
+
+#ifndef CONFIGURE_MAXIMUM_DEVICES
+#define CONFIGURE_MAXIMUM_DEVICES 20
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_NUMBER_OF_DEVICES */
+
+/*
+ * Default Configuration Table. This table contains the most values set in
+ * the RTEMS Test Suite. Each value may be overridden within each test to
+ * customize the environment.
+ */
+
+#ifdef CONFIGURE_MPTEST
+#ifndef CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+
+#ifndef CONFIGURE_MP_NODE_NUMBER
+#define CONFIGURE_MP_NODE_NUMBER NODE_NUMBER
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_NODES
+#define CONFIGURE_MP_MAXIMUM_NODES 2
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS
+#define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 32
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_PROXIES
+#define CONFIGURE_MP_MAXIMUM_PROXIES 32
+#endif
+
+#ifndef CONFIGURE_MP_MPCI_TABLE_POINTER
+#include <mpci.h>
+#define CONFIGURE_MP_MPCI_TABLE_POINTER &MPCI_table
+#endif
+
+#ifdef CONFIGURE_INIT
+rtems_multiprocessing_table Multiprocessing_configuration = {
+ CONFIGURE_MP_NODE_NUMBER, /* local node number */
+ CONFIGURE_MP_MAXIMUM_NODES, /* maximum # nodes in system */
+ CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS, /* maximum # global objects */
+ CONFIGURE_MP_MAXIMUM_PROXIES, /* maximum # proxies */
+ CONFIGURE_MP_MPCI_TABLE_POINTER /* pointer to MPCI config table */
+};
+#endif
+
+#define CONFIGURE_MULTIPROCESSING_TABLE &Multiprocessing_configuration
+
+#endif /* CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE */
+
+#else
+
+#define CONFIGURE_MULTIPROCESSING_TABLE NULL
+
+#endif /* CONFIGURE_MPTEST */
+
+/*
+ * Default Configuration Table. This table contains the most values set in
+ * the RTEMS Test Suite. Each value may be overridden within each test to
+ * customize the environment.
+ */
+
+#ifndef CONFIGURE_HAS_OWN_CONFIGURATION_TABLE
+
+#ifndef CONFIGURE_EXECUTIVE_RAM_WORK_AREA
+#define CONFIGURE_EXECUTIVE_RAM_WORK_AREA NULL
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_TASKS
+#define CONFIGURE_MAXIMUM_TASKS 10
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_TIMERS
+#define CONFIGURE_MAXIMUM_TIMERS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_SEMAPHORES
+#define CONFIGURE_MAXIMUM_SEMAPHORES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PARTITIONS
+#define CONFIGURE_MAXIMUM_PARTITIONS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_REGIONS
+#define CONFIGURE_MAXIMUM_REGIONS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PORTS
+#define CONFIGURE_MAXIMUM_PORTS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PERIODS
+#define CONFIGURE_MAXIMUM_PERIODS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_USER_EXTENSIONS
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 0
+#endif
+
+#ifndef CONFIGURE_MICROSECONDS_PER_TICK
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(10)
+#endif
+
+#ifndef CONFIGURE_TICKS_PER_TIMESLICE
+#define CONFIGURE_TICKS_PER_TIMESLICE 50
+#endif
+
+#ifndef CONFIGURE_INITIAL_EXTENSIONS
+#define CONFIGURE_INITIAL_EXTENSIONS NULL
+#endif
+
+/*
+ * POSIX API Configuration Parameters
+ */
+
+#ifdef RTEMS_POSIX_API
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
+#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_KEYS
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
+#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 0
+#endif
+
+#ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#ifdef CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
+
+/*
+ * The user is defining their own table information and setting the
+ * appropriate variables.
+ */
+
+#else
+
+#ifndef CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT
+#define CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT POSIX_Init
+#endif
+
+#ifdef CONFIGURE_INIT
+posix_initialization_threads_table POSIX_Initialization_threads[] = {
+ { CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT }
+};
+#endif
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME POSIX_Initialization_threads
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE \
+ sizeof(CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME) / \
+ sizeof(posix_initialization_threads_table)
+
+#endif /* CONFIGURE_POSIX_HAS_OWN_INIT_TASK_TABLE */
+
+#else /* CONFIGURE_POSIX_INIT_THREAD_TABLE */
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME NULL
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE 0
+
+#endif
+
+#endif /* RTEMS_POSIX_API */
+
+/*
+ * Calculate the RAM size based on the maximum number of objects configured.
+ * The model is to estimate the memory required for each configured item,
+ * sum the memory requirements and insure that there is at least 32K greater
+ * than that for things not directly addressed such as:
+ *
+ * + stacks greater than minimum size
+ * + FP contexts
+ * + API areas (should be optional)
+ * + messages
+ * + object name and local pointer table overhead
+ * + per node memory requirements
+ * + executive fixed requirements (including at least internal threads
+ * and the Ready chains)
+ *
+ * NOTE: Eventually this should take into account some of the above.
+ * Basically, this is a "back of the envelope" estimate for
+ * memory requirements. It could be more accurate.
+ */
+
+#ifndef CONFIGURE_EXECUTIVE_RAM_SIZE
+
+#define CONFIGURE_OBJECT_TABLE_STUFF \
+ ( sizeof(Objects_Control *) + sizeof(rtems_name *) + sizeof(rtems_name) )
+
+#define CONFIGURE_MEMORY_FOR_TASKS(_tasks) \
+ ((_tasks) * \
+ ((sizeof(Thread_Control) + CONTEXT_FP_SIZE + \
+ STACK_MINIMUM_SIZE + sizeof( RTEMS_API_Control ) + \
+ CONFIGURE_OBJECT_TABLE_STUFF)) \
+ )
+
+#define CONFIGURE_MEMORY_FOR_TIMERS(_timers) \
+ ((_timers) * ( sizeof(Timer_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) \
+ ((_semaphores) * \
+ ( sizeof(Semaphore_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) \
+ ( (_queues) * \
+ ( sizeof(Message_queue_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) \
+ ( (_partitions) * \
+ ( sizeof(Partition_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_REGIONS(_regions) \
+ ( (_regions) * \
+ ( sizeof(Region_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PORTS(_ports) \
+ ( (_ports) * \
+ ( sizeof(Dual_ported_memory_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PERIODS(_periods) \
+ ( (_periods) * \
+ ( sizeof(Rate_monotonic_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) \
+ ( (_extensions) * \
+ ( sizeof(Extension_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_DEVICES(_devices) \
+ (((_devices) + 1) * ( sizeof(rtems_driver_name_t) ) )
+
+#ifdef CONFIGURE_MPTEST
+
+#ifndef CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+
+#define CONFIGURE_MEMORY_FOR_PROXIES(_proxies) \
+ ( ((_proxies) + 1) * ( sizeof(Thread_Proxy_control) ) )
+
+#define CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(_global_objects) \
+ ((_global_objects) * ( sizeof(Objects_MP_Control) ) )
+
+#define CONFIGURE_MEMORY_FOR_MP \
+ ( CONFIGURE_MEMORY_FOR_PROXIES(CONFIGURE_MP_MAXIMUM_PROXIES) + \
+ CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS) \
+ )
+
+#endif /* CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE */
+
+#else
+
+#define CONFIGURE_MEMORY_FOR_MP 0
+
+#endif
+#define CONFIGURE_EXECUTIVE_RAM_SIZE \
+(( CONFIGURE_MEMORY_FOR_TASKS(CONFIGURE_MAXIMUM_TASKS) + \
+ CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS) + \
+ CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_MAXIMUM_SEMAPHORES) + \
+ CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES) + \
+ CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS) + \
+ CONFIGURE_MEMORY_FOR_REGIONS(CONFIGURE_MAXIMUM_REGIONS) + \
+ CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS) + \
+ CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS) + \
+ CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) + \
+ CONFIGURE_MEMORY_FOR_DEVICES(CONFIGURE_MAXIMUM_DEVICES) + \
+ CONFIGURE_MEMORY_FOR_MP + \
+ (96*1024) \
+) & 0xffff8000)
+#endif
+
+#ifdef CONFIGURE_INIT
+
+rtems_api_configuration_table Configuration_RTEMS_API = {
+ CONFIGURE_MAXIMUM_TASKS,
+ CONFIGURE_MAXIMUM_TIMERS,
+ CONFIGURE_MAXIMUM_SEMAPHORES,
+ CONFIGURE_MAXIMUM_MESSAGE_QUEUES,
+ CONFIGURE_MAXIMUM_PARTITIONS,
+ CONFIGURE_MAXIMUM_REGIONS,
+ CONFIGURE_MAXIMUM_PORTS,
+ CONFIGURE_MAXIMUM_PERIODS,
+ CONFIGURE_INIT_TASK_TABLE_SIZE,
+ CONFIGURE_INIT_TASK_TABLE
+};
+
+#ifdef RTEMS_POSIX_API
+posix_api_configuration_table Configuration_POSIX_API = {
+ CONFIGURE_MAXIMUM_POSIX_THREADS,
+ CONFIGURE_MAXIMUM_POSIX_MUTEXES,
+ CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES,
+ CONFIGURE_MAXIMUM_POSIX_KEYS,
+ CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
+ CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE,
+ CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME
+};
+#endif
+
+rtems_configuration_table Configuration = {
+ CONFIGURE_EXECUTIVE_RAM_WORK_AREA,
+ CONFIGURE_EXECUTIVE_RAM_SIZE,
+ CONFIGURE_MAXIMUM_USER_EXTENSIONS,
+ CONFIGURE_MICROSECONDS_PER_TICK,
+ CONFIGURE_TICKS_PER_TIMESLICE,
+ CONFIGURE_MAXIMUM_DEVICES,
+ sizeof (Device_drivers)/
+ sizeof(rtems_driver_address_table), /* number of device drivers */
+ Device_drivers, /* pointer to driver table */
+ CONFIGURE_INITIAL_EXTENSIONS, /* pointer to initial extensions */
+ CONFIGURE_MULTIPROCESSING_TABLE, /* pointer to MP config table */
+ &Configuration_RTEMS_API, /* pointer to RTEMS API config */
+#ifdef RTEMS_POSIX_API
+ &Configuration_POSIX_API /* pointer to POSIX API config */
+#else
+ NULL /* pointer to POSIX API config */
+#endif
+};
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_CONFIGURATION_TABLE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/headers/config.h b/c/src/exec/sapi/headers/config.h
new file mode 100644
index 0000000000..dd297e9d83
--- /dev/null
+++ b/c/src/exec/sapi/headers/config.h
@@ -0,0 +1,103 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CONFIGURATION_h
+#define __RTEMS_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This is kind of kludgy but it allows targets to totally ignore the
+ * POSIX API safely.
+ */
+
+#ifdef RTEMS_POSIX_API
+#include <rtems/posix/config.h>
+#else
+
+typedef void *posix_api_configuration_table;
+#endif
+
+#include <rtems/rtems/config.h>
+
+/* XXX <rtems/rtems/config.h> should cover these
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/tasks.h>
+*/
+
+#include <rtems/extension.h>
+#include <rtems/io.h>
+#include <rtems/score/mpci.h>
+
+/*
+ * The following records define the Multiprocessor Configuration
+ * Table. This table defines the multiprocessor system
+ * characteristics which must be known by RTEMS in a multiprocessor
+ * system.
+ */
+
+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
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + location and size of the RTEMS Workspace
+ * + microseconds per clock tick
+ * + clock ticks per task timeslice
+ * + required number of each object type for each API configured
+ */
+
+typedef struct {
+ void *work_space_start;
+ unsigned32 work_space_size;
+ unsigned32 maximum_extensions;
+ unsigned32 microseconds_per_tick;
+ unsigned32 ticks_per_timeslice;
+ unsigned32 maximum_devices;
+ unsigned32 number_of_device_drivers;
+ rtems_driver_address_table *Device_driver_table;
+ rtems_extensions_table *User_extension_table;
+ rtems_multiprocessing_table *User_multiprocessing_table;
+ rtems_api_configuration_table *RTEMS_api_configuration;
+ posix_api_configuration_table *POSIX_api_configuration;
+} rtems_configuration_table;
+
+/*
+ * The following are provided strictly for the convenience of
+ * the user. They are not used in RTEMS itself.
+ */
+
+SAPI_EXTERN rtems_configuration_table *_Configuration_Table;
+SAPI_EXTERN rtems_multiprocessing_table *_Configuration_MP_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/headers/directives.h b/c/src/exec/sapi/headers/directives.h
new file mode 100644
index 0000000000..a59c9981a3
--- /dev/null
+++ b/c/src/exec/sapi/headers/directives.h
@@ -0,0 +1,120 @@
+/* directives.h
+ *
+ * The following definitions are the directive numbers used
+ * in the assembly interface.
+ *
+ * COPYRIGHT (c) 1989-1997
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DIRECTIVES_h
+#define __RTEMS_DIRECTIVES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RTEMS_INITIALIZE_EXECUTIVE 0
+#define RTEMS_INITIALIZE_EXECUTIVE_EARLY 1
+#define RTEMS_INITIALIZE_EXECUTIVE_LATE 2
+#define RTEMS_SHUTDOWN_EXECUTIVE 3
+#define RTEMS_TASKS_CREATE 4
+#define RTEMS_TASKS_NAME_TO_ID 5
+#define RTEMS_TASKS_START 6
+#define RTEMS_TASKS_RESTART 7
+#define RTEMS_TASKS_DELETE 8
+#define RTEMS_TASKS_SUSPEND 9
+#define RTEMS_TASKS_RESUME 10
+#define RTEMS_TASKS_SET_PRIORITY 11
+#define RTEMS_TASKS_MODE 12
+#define RTEMS_TASKS_GET_NOTE 13
+#define RTEMS_TASKS_SET_NOTE 14
+#define RTEMS_TASKS_WAKE_AFTER 15
+#define RTEMS_TASKS_WAKE_WHEN 16
+#define RTEMS_INTERRUPT_CATCH 17
+#define RTEMS_CLOCK_SET 18
+#define RTEMS_CLOCK_GET 19
+#define RTEMS_CLOCK_TICK 20
+#define RTEMS_EXTENSION_CREATE 21
+#define RTEMS_EXTENSION_NAME_TO_ID 22
+#define RTEMS_EXTENSION_DELETE 23
+#define RTEMS_TIMER_CREATE 24
+#define RTEMS_TIMER_NAME_TO_ID 25
+#define RTEMS_TIMER_CANCEL 26
+#define RTEMS_TIMER_DELETE 27
+#define RTEMS_TIMER_FIRE_AFTER 28
+#define RTEMS_TIMER_FIRE_WHEN 29
+#define RTEMS_TIMER_RESET 30
+#define RTEMS_SEMAPHORE_CREATE 31
+#define RTEMS_SEMAPHORE_NAME_TO_ID 32
+#define RTEMS_SEMAPHORE_DELETE 33
+#define RTEMS_SEMAPHORE_OBTAIN 34
+#define RTEMS_SEMAPHORE_RELEASE 35
+#define RTEMS_MESSAGE_QUEUE_CREATE 36
+#define RTEMS_MESSAGE_QUEUE_NAME_TO_ID 37
+#define RTEMS_MESSAGE_QUEUE_DELETE 38
+#define RTEMS_MESSAGE_QUEUE_SEND 39
+#define RTEMS_MESSAGE_QUEUE_URGENT 40
+#define RTEMS_MESSAGE_QUEUE_BROADCAST 41
+#define RTEMS_MESSAGE_QUEUE_RECEIVE 42
+#define RTEMS_MESSAGE_QUEUE_FLUSH 43
+#define RTEMS_EVENT_SEND 44
+#define RTEMS_EVENT_RECEIVE 45
+#define RTEMS_SIGNAL_CATCH 46
+#define RTEMS_SIGNAL_SEND 47
+#define RTEMS_PARTITION_CREATE 48
+#define RTEMS_PARTITION_NAME_TO_ID 49
+#define RTEMS_PARTITION_DELETE 50
+#define RTEMS_PARTITION_GET_BUFFER 51
+#define RTEMS_PARTITION_RETURN_BUFFER 52
+#define RTEMS_REGION_CREATE 53
+#define RTEMS_REGION_EXTEND 54
+#define RTEMS_REGION_NAME_TO_ID 55
+#define RTEMS_REGION_DELETE 56
+#define RTEMS_REGION_GET_SEGMENT_SIZE 57
+#define RTEMS_REGION_GET_SEGMENT 58
+#define RTEMS_REGION_RETURN_SEGMENT 59
+#define RTEMS_DUAL_PORTED_MEMORY_CREATE 60
+#define RTEMS_DUAL_PORTED_MEMORY_NAME_TO_ID 61
+#define RTEMS_DUAL_PORTED_MEMORY_DELETE 62
+#define RTEMS_DUAL_PORTED_MEMORY_EXTERNAL_TO_INTERNAL 63
+#define RTEMS_DUAL_PORTED_MEMORY_INTERNAL_TO_EXTERNAL 64
+#define RTEMS_IO_INITIALIZE 65
+#define RTEMS_IO_REGISTER_NAME 66
+#define RTEMS_IO_LOOKUP_NAME 67
+#define RTEMS_IO_OPEN 68
+#define RTEMS_IO_CLOSE 69
+#define RTEMS_IO_READ 70
+#define RTEMS_IO_WRITE 71
+#define RTEMS_IO_CONTROL 72
+#define RTEMS_FATAL_ERROR_OCCURRED 73
+#define RTEMS_RATE_MONOTONIC_CREATE 74
+#define RTEMS_RATE_MONOTONIC_NAME_TO_ID 75
+#define RTEMS_RATE_MONOTONIC_DELETE 76
+#define RTEMS_RATE_MONOTONIC_CANCEL 77
+#define RTEMS_RATE_MONOTONIC_PERIOD 78
+#define RTEMS_MULTIPROCESSING_ANNOUNCE 79
+#define RTEMS_DEBUG_ENABLE 80
+#define RTEMS_DEBUG_DISABLE 81
+
+#define RTEMS_NUMBER_OF_ENTRY_POINTS 82
+
+/*
+ * The jump table of entry points into RTEMS directives.
+ */
+
+extern const void *_Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of directives.h */
diff --git a/c/src/exec/sapi/headers/extension.h b/c/src/exec/sapi/headers/extension.h
new file mode 100644
index 0000000000..c9559855ef
--- /dev/null
+++ b/c/src/exec/sapi/headers/extension.h
@@ -0,0 +1,136 @@
+/* extension.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the User Extension Manager. This manager
+ * provides a mechanism for manipulating sets of user-defined extensions.
+ *
+ * Directives provided are:
+ *
+ * + create user extension set
+ * + get ID of user extension set
+ * + delete user extension set
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EXTENSION_MANAGER_h
+#define __RTEMS_EXTENSION_MANAGER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/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_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
+ * this class of objects.
+ */
+
+SAPI_EXTERN Objects_Information _Extension_Information;
+
+/*
+ * The following records define the control block used to manage
+ * each extension.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ User_extensions_Control Extension;
+} Extension_Control;
+
+/*
+ * _Extension_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Extension_Manager_initialization(
+ unsigned32 maximum_extensions
+);
+
+/*
+ * rtems_extension_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_create directive. The
+ * extension will have the name name. The entry points of the
+ * routines which constitute this extension set are in EXTENSION_TABLE.
+ * It returns the id of the created extension in ID.
+ */
+
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *extension_table,
+ Objects_Id *id
+);
+
+/*
+ * rtems_extension_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_ident directive.
+ * This directive returns the extension ID associated with name.
+ * If more than one extension is named name, then the extension
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_extension_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_delete directive. The
+ * extension indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_extension_delete(
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/extension.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/headers/fatal.h b/c/src/exec/sapi/headers/fatal.h
new file mode 100644
index 0000000000..5cb9a6460a
--- /dev/null
+++ b/c/src/exec/sapi/headers/fatal.h
@@ -0,0 +1,49 @@
+/* fatal.h
+ *
+ * This include file contains constants and prototypes related
+ * to the Fatal Error Manager. This manager processes all fatal or
+ * irrecoverable errors.
+ *
+ * This manager provides directives to:
+ *
+ * + announce a fatal error has occurred
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_FATAL_h
+#define __RTEMS_FATAL_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * rtems_fatal_error_occurred
+ *
+ * DESCRIPTION:
+ *
+ * This is the routine which implements the rtems_fatal_error_occurred
+ * directive. It is invoked when the application or RTEMS
+ * determines that a fatal error has occurred.
+ */
+
+void volatile rtems_fatal_error_occurred(
+ unsigned32 the_error
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/headers/init.h b/c/src/exec/sapi/headers/init.h
new file mode 100644
index 0000000000..1a92f53e46
--- /dev/null
+++ b/c/src/exec/sapi/headers/init.h
@@ -0,0 +1,110 @@
+/* init.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Initialization Manager. This manager is responsible for
+ * initializing RTEMS, creating and starting all configured initialization
+ * tasks, invoking the initialization routine for each user-supplied device
+ * driver, and initializing the optional multiprocessor layer.
+ *
+ * This manager provides directives to:
+ *
+ * + initialize the RTEMS executive
+ * + shutdown the RTEMS executive
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_INIT_h
+#define __RTEMS_INIT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/config.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
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_initialize_executive directive. This
+ * directive is invoked at system startup to initialize the RTEMS
+ * multitasking environment.
+ */
+
+void rtems_initialize_executive(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+
+/*
+ * rtems_initialize_executive_early
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the early portion of rtems_initialize_executive
+ * directive up to the pretasking hook. This directive is invoked at system
+ * startup to initialize the RTEMS multitasking environment.
+ */
+
+rtems_interrupt_level rtems_initialize_executive_early(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+
+/*
+ * rtems_initialize_executive_late
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the early portion of rtems_initialize_executive
+ * directive up to the pretasking hook. This directive is invoked at system
+ * startup to initialize the RTEMS multitasking environment.
+ */
+
+void rtems_initialize_executive_late(
+ rtems_interrupt_level bsp_level
+);
+
+/*
+ * rtems_shutdown_executive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_shutdown_executive directive. The
+ * invocation of this directive results in the RTEMS environment being
+ * shutdown and multitasking halted. From the application's perspective,
+ * invocation of this directive results in the rtems_initialize_executive
+ * directive exitting to the startup code which invoked it.
+ */
+
+void rtems_shutdown_executive(
+ unsigned32 result
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/headers/io.h b/c/src/exec/sapi/headers/io.h
new file mode 100644
index 0000000000..a1eddcf637
--- /dev/null
+++ b/c/src/exec/sapi/headers/io.h
@@ -0,0 +1,244 @@
+/* io.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Input/Output Manager. This manager provides a well defined
+ * mechanism for accessing device drivers and a structured methodology for
+ * organizing device drivers.
+ *
+ * Directives provided are:
+ *
+ * + initialize a device driver
+ * + open a device driver
+ * + close a device driver
+ * + read from a device driver
+ * + write to a device driver
+ * + special device services
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_IO_h
+#define __RTEMS_IO_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/status.h>
+
+/*
+ *
+ * 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;
+
+/*
+ * Table for the io device names
+ */
+
+typedef struct {
+ char *device_name;
+ unsigned32 device_name_length;
+ rtems_device_major_number major;
+ rtems_device_minor_number minor;
+} rtems_driver_name_t;
+
+/*
+ * This is the table of device names.
+ */
+
+/*
+ * The following declare the data required to manage the Driver
+ * Address Table and Device Name Table.
+ */
+
+SAPI_EXTERN unsigned32 _IO_Number_of_drivers;
+SAPI_EXTERN rtems_driver_address_table *_IO_Driver_address_table;
+SAPI_EXTERN unsigned32 _IO_Number_of_devices;
+SAPI_EXTERN rtems_driver_name_t *_IO_Driver_name_table;
+
+/*
+ * _IO_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+);
+
+/*
+ * rtems_io_register_name
+ *
+ * DESCRIPTION:
+ *
+ * Associate a name with a driver.
+ *
+ */
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+);
+
+
+/*
+ * rtems_io_lookup_name
+ *
+ * DESCRIPTION:
+ *
+ * Find what driver "owns" this name
+ */
+
+rtems_status_code rtems_io_lookup_name(
+ const char *name,
+ rtems_driver_name_t **device_info
+);
+
+
+/*
+ * rtems_io_initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_initialize directive. It is invoked
+ * to initialize a device driver or an individual device.
+ */
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_open
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_open directive. It is invoked
+ * to open a device.
+ */
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_close
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_close directive. It is invoked
+ * to close a device.
+ */
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_read
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_read directive. It is invoked
+ * to read from a device.
+ */
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_write
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_write directive. It is invoked
+ * to write to a device.
+ */
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_control
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_control directive. It is invoked
+ * to perform a device specific operation on a device.
+ */
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * _IO_Initialize_all_drivers
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes all of the device drivers configured
+ * in the Device Driver Address Table.
+ */
+
+void _IO_Initialize_all_drivers( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/headers/mptables.h b/c/src/exec/sapi/headers/mptables.h
new file mode 100644
index 0000000000..7a00554c23
--- /dev/null
+++ b/c/src/exec/sapi/headers/mptables.h
@@ -0,0 +1,29 @@
+/* mptables.h
+ *
+ * This include file contains the executive's pre-initialized tables
+ * used in a multiprocessor configuration.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MPTABLES_h
+#define __RTEMS_MPTABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/headers/sptables.h b/c/src/exec/sapi/headers/sptables.h
new file mode 100644
index 0000000000..16430b54fc
--- /dev/null
+++ b/c/src/exec/sapi/headers/sptables.h
@@ -0,0 +1,162 @@
+/* sptables.h
+ *
+ * This include file contains the executive's pre-initialized tables
+ * used when in a single processor configuration.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SPTABLES_h
+#define __RTEMS_SPTABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/config.h>
+
+#include <rtems/debug.h>
+#include <rtems/fatal.h>
+#include <rtems/init.h>
+#include <rtems/io.h>
+#include <rtems/score/sysstate.h>
+
+#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>
+
+/*
+ * This is the default Multiprocessing Configuration Table.
+ * It is used in single processor configurations.
+ */
+
+const rtems_multiprocessing_table
+ _Initialization_Default_multiprocessing_table = {
+ 1, /* local node number */
+ 1, /* maximum number nodes in system */
+ 0, /* maximum number global objects */
+ 0, /* maximum number proxies */
+ NULL, /* pointer to MPCI address table */
+};
+
+/*
+ * This is the version string.
+ */
+
+const char _RTEMS_version[] =
+ "RTEMS RELEASE V4.0.0 (" CPU_NAME "/" CPU_MODEL_NAME ")";
+
+
+/*
+ * This table is used by the single entry point code.
+ */
+
+const void * _Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ] = {
+ (void *) rtems_initialize_executive, /* 0 */
+ (void *) rtems_initialize_executive_early, /* 1 */
+ (void *) rtems_initialize_executive_late, /* 2 */
+ (void *) rtems_shutdown_executive, /* 3 */
+ (void *) rtems_task_create, /* 4 */
+ (void *) rtems_task_ident, /* 5 */
+ (void *) rtems_task_start, /* 6 */
+ (void *) rtems_task_restart, /* 7 */
+ (void *) rtems_task_delete, /* 8 */
+ (void *) rtems_task_suspend, /* 9 */
+ (void *) rtems_task_resume, /* 10 */
+ (void *) rtems_task_set_priority, /* 11 */
+ (void *) rtems_task_mode, /* 12 */
+ (void *) rtems_task_get_note, /* 13 */
+ (void *) rtems_task_set_note, /* 14 */
+ (void *) rtems_task_wake_after, /* 15 */
+ (void *) rtems_task_wake_when, /* 16 */
+ (void *) rtems_interrupt_catch, /* 17 */
+ (void *) rtems_clock_set, /* 18 */
+ (void *) rtems_clock_get, /* 19 */
+ (void *) rtems_clock_tick, /* 20 */
+ (void *) rtems_extension_create, /* 21 */
+ (void *) rtems_extension_ident, /* 22 */
+ (void *) rtems_extension_delete, /* 23 */
+ (void *) rtems_timer_create, /* 24 */
+ (void *) rtems_timer_ident, /* 25 */
+ (void *) rtems_timer_cancel, /* 26 */
+ (void *) rtems_timer_delete, /* 27 */
+ (void *) rtems_timer_fire_after, /* 28 */
+ (void *) rtems_timer_fire_when, /* 29 */
+ (void *) rtems_timer_reset, /* 30 */
+ (void *) rtems_semaphore_create, /* 31 */
+ (void *) rtems_semaphore_ident, /* 32 */
+ (void *) rtems_semaphore_delete, /* 33 */
+ (void *) rtems_semaphore_obtain, /* 34 */
+ (void *) rtems_semaphore_release, /* 35 */
+ (void *) rtems_message_queue_create, /* 36 */
+ (void *) rtems_message_queue_ident, /* 37 */
+ (void *) rtems_message_queue_delete, /* 38 */
+ (void *) rtems_message_queue_send, /* 39 */
+ (void *) rtems_message_queue_urgent, /* 40 */
+ (void *) rtems_message_queue_broadcast, /* 41 */
+ (void *) rtems_message_queue_receive, /* 42 */
+ (void *) rtems_message_queue_flush, /* 43 */
+ (void *) rtems_event_send, /* 44 */
+ (void *) rtems_event_receive, /* 45 */
+ (void *) rtems_signal_catch, /* 46 */
+ (void *) rtems_signal_send, /* 47 */
+ (void *) rtems_partition_create, /* 48 */
+ (void *) rtems_partition_ident, /* 49 */
+ (void *) rtems_partition_delete, /* 50 */
+ (void *) rtems_partition_get_buffer, /* 51 */
+ (void *) rtems_partition_return_buffer, /* 52 */
+ (void *) rtems_region_create, /* 53 */
+ (void *) rtems_region_extend, /* 54 */
+ (void *) rtems_region_ident, /* 55 */
+ (void *) rtems_region_delete, /* 56 */
+ (void *) rtems_region_get_segment, /* 57 */
+ (void *) rtems_region_get_segment_size, /* 58 */
+ (void *) rtems_region_return_segment, /* 59 */
+ (void *) rtems_port_create, /* 60 */
+ (void *) rtems_port_ident, /* 61 */
+ (void *) rtems_port_delete, /* 62 */
+ (void *) rtems_port_external_to_internal, /* 63 */
+ (void *) rtems_port_internal_to_external, /* 64 */
+ (void *) rtems_io_initialize, /* 65 */
+ (void *) rtems_io_register_name, /* 66 */
+ (void *) rtems_io_lookup_name, /* 67 */
+ (void *) rtems_io_open, /* 68 */
+ (void *) rtems_io_close, /* 69 */
+ (void *) rtems_io_read, /* 70 */
+ (void *) rtems_io_write, /* 71 */
+ (void *) rtems_io_control, /* 72 */
+ (void *) rtems_fatal_error_occurred, /* 73 */
+ (void *) rtems_rate_monotonic_create, /* 74 */
+ (void *) rtems_rate_monotonic_ident, /* 75 */
+ (void *) rtems_rate_monotonic_delete, /* 76 */
+ (void *) rtems_rate_monotonic_cancel, /* 77 */
+ (void *) rtems_rate_monotonic_period, /* 78 */
+ (void *) rtems_multiprocessing_announce, /* 79 */
+ (void *) rtems_debug_enable, /* 80 */
+ (void *) rtems_debug_disable /* 81 */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/confdefs.h b/c/src/exec/sapi/include/confdefs.h
new file mode 100644
index 0000000000..ab08adb4b5
--- /dev/null
+++ b/c/src/exec/sapi/include/confdefs.h
@@ -0,0 +1,485 @@
+/* confdefs.h
+ *
+ * This include file contains the configuration table template that will
+ * be used by the single processor tests to define its default configuration
+ * parameters.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CONFIGURATION_TEMPLATE_h
+#define __CONFIGURATION_TEMPLATE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern rtems_initialization_tasks_table Initialization_tasks[];
+extern rtems_driver_address_table Device_drivers[];
+extern rtems_configuration_table Configuration;
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+#ifdef RTEMS_POSIX_API
+extern posix_api_configuration_table Configuration_POSIX_API;
+#endif
+
+/*
+ * Default User Initialization Task Table. This table guarantees that
+ * one user initialization table is defined.
+ */
+
+#ifdef CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#ifdef CONFIGURE_HAS_OWN_INIT_TASK_TABLE
+
+/*
+ * The user is defining their own table information and setting the
+ * appropriate variables.
+ */
+
+#else
+
+#ifndef CONFIGURE_INIT_TASK_NAME
+#define CONFIGURE_INIT_TASK_NAME rtems_build_name( 'U', 'I', '1', ' ' )
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_STACK_SIZE
+#define CONFIGURE_INIT_TASK_STACK_SIZE RTEMS_MINIMUM_STACK_SIZE
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_PRIORITY
+#define CONFIGURE_INIT_TASK_PRIORITY 1
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ATTRIBUTES
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ENTRY_POINT
+#define CONFIGURE_INIT_TASK_ENTRY_POINT Init
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_INITIAL_MODES
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_NO_PREEMPT
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ARGUMENTS
+#define CONFIGURE_INIT_TASK_ARGUMENTS 0
+#endif
+
+#ifdef CONFIGURE_INIT
+rtems_initialization_tasks_table Initialization_tasks[] = {
+ { CONFIGURE_INIT_TASK_NAME,
+ CONFIGURE_INIT_TASK_STACK_SIZE,
+ CONFIGURE_INIT_TASK_PRIORITY,
+ CONFIGURE_INIT_TASK_ATTRIBUTES,
+ CONFIGURE_INIT_TASK_ENTRY_POINT,
+ CONFIGURE_INIT_TASK_INITIAL_MODES,
+ CONFIGURE_INIT_TASK_ARGUMENTS
+ }
+};
+#endif
+
+#define CONFIGURE_INIT_TASK_TABLE Initialization_tasks
+
+#define CONFIGURE_INIT_TASK_TABLE_SIZE \
+ sizeof(CONFIGURE_INIT_TASK_TABLE) / sizeof(rtems_initialization_tasks_table)
+
+#endif /* CONFIGURE_HAS_OWN_INIT_TASK_TABLE */
+
+#else /* CONFIGURE_RTEMS_INIT_TASKS_TABLE */
+
+#define CONFIGURE_INIT_TASK_TABLE NULL
+#define CONFIGURE_INIT_TASK_TABLE_SIZE 0
+
+#endif
+
+/*
+ * Default Device Driver Table. Each driver needed by the test is explicitly
+ * choosen by that test. There is always a null driver entry.
+ */
+
+#define NULL_DRIVER_TABLE_ENTRY \
+ { NULL, NULL, NULL, NULL, NULL, NULL }
+
+#ifdef CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+#include <timerdrv.h>
+#endif
+
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+#include <stubdrv.h>
+#endif
+
+#ifndef CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
+
+#ifdef CONFIGURE_INIT
+rtems_driver_address_table Device_drivers[] = {
+#ifdef CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ CONSOLE_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+ CLOCK_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+ STUB_DRIVER_TABLE_ENTRY,
+#endif
+ NULL_DRIVER_TABLE_ENTRY
+};
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE */
+
+/*
+ * Default the number of devices per device driver. This value may be
+ * overridden by the user.
+ */
+
+#ifndef CONFIGURE_HAS_OWN_NUMBER_OF_DEVICES
+
+#ifndef CONFIGURE_MAXIMUM_DEVICES
+#define CONFIGURE_MAXIMUM_DEVICES 20
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_NUMBER_OF_DEVICES */
+
+/*
+ * Default Configuration Table. This table contains the most values set in
+ * the RTEMS Test Suite. Each value may be overridden within each test to
+ * customize the environment.
+ */
+
+#ifdef CONFIGURE_MPTEST
+#ifndef CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+
+#ifndef CONFIGURE_MP_NODE_NUMBER
+#define CONFIGURE_MP_NODE_NUMBER NODE_NUMBER
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_NODES
+#define CONFIGURE_MP_MAXIMUM_NODES 2
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS
+#define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 32
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_PROXIES
+#define CONFIGURE_MP_MAXIMUM_PROXIES 32
+#endif
+
+#ifndef CONFIGURE_MP_MPCI_TABLE_POINTER
+#include <mpci.h>
+#define CONFIGURE_MP_MPCI_TABLE_POINTER &MPCI_table
+#endif
+
+#ifdef CONFIGURE_INIT
+rtems_multiprocessing_table Multiprocessing_configuration = {
+ CONFIGURE_MP_NODE_NUMBER, /* local node number */
+ CONFIGURE_MP_MAXIMUM_NODES, /* maximum # nodes in system */
+ CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS, /* maximum # global objects */
+ CONFIGURE_MP_MAXIMUM_PROXIES, /* maximum # proxies */
+ CONFIGURE_MP_MPCI_TABLE_POINTER /* pointer to MPCI config table */
+};
+#endif
+
+#define CONFIGURE_MULTIPROCESSING_TABLE &Multiprocessing_configuration
+
+#endif /* CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE */
+
+#else
+
+#define CONFIGURE_MULTIPROCESSING_TABLE NULL
+
+#endif /* CONFIGURE_MPTEST */
+
+/*
+ * Default Configuration Table. This table contains the most values set in
+ * the RTEMS Test Suite. Each value may be overridden within each test to
+ * customize the environment.
+ */
+
+#ifndef CONFIGURE_HAS_OWN_CONFIGURATION_TABLE
+
+#ifndef CONFIGURE_EXECUTIVE_RAM_WORK_AREA
+#define CONFIGURE_EXECUTIVE_RAM_WORK_AREA NULL
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_TASKS
+#define CONFIGURE_MAXIMUM_TASKS 10
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_TIMERS
+#define CONFIGURE_MAXIMUM_TIMERS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_SEMAPHORES
+#define CONFIGURE_MAXIMUM_SEMAPHORES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PARTITIONS
+#define CONFIGURE_MAXIMUM_PARTITIONS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_REGIONS
+#define CONFIGURE_MAXIMUM_REGIONS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PORTS
+#define CONFIGURE_MAXIMUM_PORTS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PERIODS
+#define CONFIGURE_MAXIMUM_PERIODS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_USER_EXTENSIONS
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 0
+#endif
+
+#ifndef CONFIGURE_MICROSECONDS_PER_TICK
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(10)
+#endif
+
+#ifndef CONFIGURE_TICKS_PER_TIMESLICE
+#define CONFIGURE_TICKS_PER_TIMESLICE 50
+#endif
+
+#ifndef CONFIGURE_INITIAL_EXTENSIONS
+#define CONFIGURE_INITIAL_EXTENSIONS NULL
+#endif
+
+/*
+ * POSIX API Configuration Parameters
+ */
+
+#ifdef RTEMS_POSIX_API
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
+#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_KEYS
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
+#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 0
+#endif
+
+#ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#ifdef CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
+
+/*
+ * The user is defining their own table information and setting the
+ * appropriate variables.
+ */
+
+#else
+
+#ifndef CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT
+#define CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT POSIX_Init
+#endif
+
+#ifdef CONFIGURE_INIT
+posix_initialization_threads_table POSIX_Initialization_threads[] = {
+ { CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT }
+};
+#endif
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME POSIX_Initialization_threads
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE \
+ sizeof(CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME) / \
+ sizeof(posix_initialization_threads_table)
+
+#endif /* CONFIGURE_POSIX_HAS_OWN_INIT_TASK_TABLE */
+
+#else /* CONFIGURE_POSIX_INIT_THREAD_TABLE */
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME NULL
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE 0
+
+#endif
+
+#endif /* RTEMS_POSIX_API */
+
+/*
+ * Calculate the RAM size based on the maximum number of objects configured.
+ * The model is to estimate the memory required for each configured item,
+ * sum the memory requirements and insure that there is at least 32K greater
+ * than that for things not directly addressed such as:
+ *
+ * + stacks greater than minimum size
+ * + FP contexts
+ * + API areas (should be optional)
+ * + messages
+ * + object name and local pointer table overhead
+ * + per node memory requirements
+ * + executive fixed requirements (including at least internal threads
+ * and the Ready chains)
+ *
+ * NOTE: Eventually this should take into account some of the above.
+ * Basically, this is a "back of the envelope" estimate for
+ * memory requirements. It could be more accurate.
+ */
+
+#ifndef CONFIGURE_EXECUTIVE_RAM_SIZE
+
+#define CONFIGURE_OBJECT_TABLE_STUFF \
+ ( sizeof(Objects_Control *) + sizeof(rtems_name *) + sizeof(rtems_name) )
+
+#define CONFIGURE_MEMORY_FOR_TASKS(_tasks) \
+ ((_tasks) * \
+ ((sizeof(Thread_Control) + CONTEXT_FP_SIZE + \
+ STACK_MINIMUM_SIZE + sizeof( RTEMS_API_Control ) + \
+ CONFIGURE_OBJECT_TABLE_STUFF)) \
+ )
+
+#define CONFIGURE_MEMORY_FOR_TIMERS(_timers) \
+ ((_timers) * ( sizeof(Timer_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) \
+ ((_semaphores) * \
+ ( sizeof(Semaphore_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) \
+ ( (_queues) * \
+ ( sizeof(Message_queue_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) \
+ ( (_partitions) * \
+ ( sizeof(Partition_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_REGIONS(_regions) \
+ ( (_regions) * \
+ ( sizeof(Region_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PORTS(_ports) \
+ ( (_ports) * \
+ ( sizeof(Dual_ported_memory_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PERIODS(_periods) \
+ ( (_periods) * \
+ ( sizeof(Rate_monotonic_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) \
+ ( (_extensions) * \
+ ( sizeof(Extension_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_DEVICES(_devices) \
+ (((_devices) + 1) * ( sizeof(rtems_driver_name_t) ) )
+
+#ifdef CONFIGURE_MPTEST
+
+#ifndef CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+
+#define CONFIGURE_MEMORY_FOR_PROXIES(_proxies) \
+ ( ((_proxies) + 1) * ( sizeof(Thread_Proxy_control) ) )
+
+#define CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(_global_objects) \
+ ((_global_objects) * ( sizeof(Objects_MP_Control) ) )
+
+#define CONFIGURE_MEMORY_FOR_MP \
+ ( CONFIGURE_MEMORY_FOR_PROXIES(CONFIGURE_MP_MAXIMUM_PROXIES) + \
+ CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS) \
+ )
+
+#endif /* CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE */
+
+#else
+
+#define CONFIGURE_MEMORY_FOR_MP 0
+
+#endif
+#define CONFIGURE_EXECUTIVE_RAM_SIZE \
+(( CONFIGURE_MEMORY_FOR_TASKS(CONFIGURE_MAXIMUM_TASKS) + \
+ CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS) + \
+ CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_MAXIMUM_SEMAPHORES) + \
+ CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES) + \
+ CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS) + \
+ CONFIGURE_MEMORY_FOR_REGIONS(CONFIGURE_MAXIMUM_REGIONS) + \
+ CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS) + \
+ CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS) + \
+ CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) + \
+ CONFIGURE_MEMORY_FOR_DEVICES(CONFIGURE_MAXIMUM_DEVICES) + \
+ CONFIGURE_MEMORY_FOR_MP + \
+ (96*1024) \
+) & 0xffff8000)
+#endif
+
+#ifdef CONFIGURE_INIT
+
+rtems_api_configuration_table Configuration_RTEMS_API = {
+ CONFIGURE_MAXIMUM_TASKS,
+ CONFIGURE_MAXIMUM_TIMERS,
+ CONFIGURE_MAXIMUM_SEMAPHORES,
+ CONFIGURE_MAXIMUM_MESSAGE_QUEUES,
+ CONFIGURE_MAXIMUM_PARTITIONS,
+ CONFIGURE_MAXIMUM_REGIONS,
+ CONFIGURE_MAXIMUM_PORTS,
+ CONFIGURE_MAXIMUM_PERIODS,
+ CONFIGURE_INIT_TASK_TABLE_SIZE,
+ CONFIGURE_INIT_TASK_TABLE
+};
+
+#ifdef RTEMS_POSIX_API
+posix_api_configuration_table Configuration_POSIX_API = {
+ CONFIGURE_MAXIMUM_POSIX_THREADS,
+ CONFIGURE_MAXIMUM_POSIX_MUTEXES,
+ CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES,
+ CONFIGURE_MAXIMUM_POSIX_KEYS,
+ CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
+ CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE,
+ CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME
+};
+#endif
+
+rtems_configuration_table Configuration = {
+ CONFIGURE_EXECUTIVE_RAM_WORK_AREA,
+ CONFIGURE_EXECUTIVE_RAM_SIZE,
+ CONFIGURE_MAXIMUM_USER_EXTENSIONS,
+ CONFIGURE_MICROSECONDS_PER_TICK,
+ CONFIGURE_TICKS_PER_TIMESLICE,
+ CONFIGURE_MAXIMUM_DEVICES,
+ sizeof (Device_drivers)/
+ sizeof(rtems_driver_address_table), /* number of device drivers */
+ Device_drivers, /* pointer to driver table */
+ CONFIGURE_INITIAL_EXTENSIONS, /* pointer to initial extensions */
+ CONFIGURE_MULTIPROCESSING_TABLE, /* pointer to MP config table */
+ &Configuration_RTEMS_API, /* pointer to RTEMS API config */
+#ifdef RTEMS_POSIX_API
+ &Configuration_POSIX_API /* pointer to POSIX API config */
+#else
+ NULL /* pointer to POSIX API config */
+#endif
+};
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_CONFIGURATION_TABLE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/rtems/Makefile.in b/c/src/exec/sapi/include/rtems/Makefile.in
new file mode 100644
index 0000000000..24e8766199
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES= config directives extension fatal init io mptables sptables
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed externally
+EXTERNAL_H_PIECES = confdefs
+EXTERNAL_H_FILES=$(EXTERNAL_H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES) $(EXTERNAL_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/exec/sapi/include/rtems/README b/c/src/exec/sapi/include/rtems/README
new file mode 100644
index 0000000000..5fcc0d14c7
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/README
@@ -0,0 +1,135 @@
+#
+# $Id$
+#
+
+Configuring a System Using the Template in confdefs.h
+=====================================================
+
+The file confdefs.h is a Configuration Template file which can be
+used to greatly simplify the creation and maintenance of RTEMS
+Configuration Tables. The basic concepts are:
+
+ + confdefs.h provides defaults for all configuration parameters
+
+ + applications specify only those values they wish to override
+
+ + confdefs.h can be the only file which knows the precise layout
+ of the RTEMS Configuration Tables.
+
+The Configuration Template setup is used by all RTEMS tests to
+simplify the maintenance of the tests.
+
+Here is the section from the system.h file from test tm21 from
+the Timing Test Suite:
+
+ /* configuration information */
+
+ #define CONFIGURE_TMTEST
+
+ #define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ #define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+ #define CONFIGURE_MAXIMUM_TASKS 102
+ #define CONFIGURE_MAXIMUM_TIMERS 100
+ #define CONFIGURE_MAXIMUM_SEMAPHORES 100
+ #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 100
+ #define CONFIGURE_MAXIMUM_PARTITIONS 100
+ #define CONFIGURE_MAXIMUM_REGIONS 100
+ #define CONFIGURE_MAXIMUM_PORTS 100
+ #define CONFIGURE_MAXIMUM_PERIODS 100
+
+ #define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+ #include <confdefs.h>
+
+
+The above example overrides a number of the configuration parameters.
+It informs the template that it is a member of the Timing Suite,
+requires a console and timer driver, and that it needs 102 tasks,
+100 timers, 100 semaphores, 100 message queues, 100 partitions,
+100 regions, 100 ports, and 100 periods. By default, the test
+would have gotten no drivers, 10 tasks, and no other RTEMS objects.
+
+The following shows the configuration tables generated by the
+template by default.
+
+
+#include <bsp.h>
+
+#define NULL_DRIVER_TABLE_ENTRY \
+ { NULL, NULL, NULL, NULL, NULL, NULL }
+
+rtems_driver_address_table Device_drivers[] = {
+#ifdef CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ CONSOLE_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+ CLOCK_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+ STUB_DRIVER_TABLE_ENTRY,
+#endif
+ NULL_DRIVER_TABLE_ENTRY,
+};
+
+rtems_initialization_tasks_table Initialization_tasks[] = {
+ { rtems_build_name( 'U', 'I', '1', ' ' ), /* init task name */
+ RTEMS_MINIMUM_STACK_SIZE, /* init task stack size */
+ 1, /* init task priority */
+ RTEMS_DEFAULT_ATTRIBUTES, /* init task attributes */
+ Init, /* init task entry point */
+ RTEMS_NO_PREEMPT, /* init task initial mode */
+ 0 /* init task argument list */
+ }
+};
+
+#ifdef CONFIGURE_MPTEST
+/*
+ * NODE_NUMBER is assumed to be set on the compile line.
+ */
+
+rtems_multiprocessing_table Multiprocessing_configuration = {
+ NODE_NUMBER, /* local node number */
+ 2, /* maximum # nodes in system */
+ 32, /* maximum # global objects */
+ 32, /* maximum # proxies */
+ &MPCI_table /* pointer to MPCI config table */
+};
+#endif
+
+/*
+ * CONFIGURE_EXECUTIVE_RAM_SIZE is a rough guess based on the number of
+ * tasks in the system plus enough extra to get a whole 64K extra.
+ *
+ * The NULL address for the workspace area is assumed to be assigned
+ * at startup time by the BSP.
+ */
+
+rtems_configuration_table Configuration = {
+ NULL, /* executive RAM work area */
+ CONFIGURE_EXECUTIVE_RAM_SIZE, /* executive RAM size */
+ 10, /* maximum # tasks */
+ 0, /* maximum # timers */
+ 0, /* maximum # semaphores */
+ 0, /* maximum # message queues */
+ 0, /* maximum # messages */
+ 0, /* maximum # partitions */
+ 0, /* maximum # regions */
+ 0, /* maximum # dp memory areas */
+ 0, /* maximum # periods */
+ 0, /* maximum # user extensions */
+ RTEMS_MILLISECONDS_TO_MICROSECONDS(10), /* # us in a tick */
+ 50, /* # ticks in a timeslice */
+ sizeof (Initialization_tasks) / sizeof(rtems_initialization_tasks_table),
+ /* number of init tasks */
+ Initialization_tasks, /* init task(s) table */
+ sizeof (Device_drivers) / sizeof(rtems_driver_address_table),
+ /* number of device drivers */
+ Device_drivers, /* pointer to driver address table */
+ NULL, /* pointer to initial extensions */
+#ifdef CONFIGURE_MPTEST
+ &Multiprocessing_configuration
+#else
+ NULL /* ptr to MP config table */
+#endif
+};
diff --git a/c/src/exec/sapi/include/rtems/config.h b/c/src/exec/sapi/include/rtems/config.h
new file mode 100644
index 0000000000..dd297e9d83
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/config.h
@@ -0,0 +1,103 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CONFIGURATION_h
+#define __RTEMS_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This is kind of kludgy but it allows targets to totally ignore the
+ * POSIX API safely.
+ */
+
+#ifdef RTEMS_POSIX_API
+#include <rtems/posix/config.h>
+#else
+
+typedef void *posix_api_configuration_table;
+#endif
+
+#include <rtems/rtems/config.h>
+
+/* XXX <rtems/rtems/config.h> should cover these
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/tasks.h>
+*/
+
+#include <rtems/extension.h>
+#include <rtems/io.h>
+#include <rtems/score/mpci.h>
+
+/*
+ * The following records define the Multiprocessor Configuration
+ * Table. This table defines the multiprocessor system
+ * characteristics which must be known by RTEMS in a multiprocessor
+ * system.
+ */
+
+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
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + location and size of the RTEMS Workspace
+ * + microseconds per clock tick
+ * + clock ticks per task timeslice
+ * + required number of each object type for each API configured
+ */
+
+typedef struct {
+ void *work_space_start;
+ unsigned32 work_space_size;
+ unsigned32 maximum_extensions;
+ unsigned32 microseconds_per_tick;
+ unsigned32 ticks_per_timeslice;
+ unsigned32 maximum_devices;
+ unsigned32 number_of_device_drivers;
+ rtems_driver_address_table *Device_driver_table;
+ rtems_extensions_table *User_extension_table;
+ rtems_multiprocessing_table *User_multiprocessing_table;
+ rtems_api_configuration_table *RTEMS_api_configuration;
+ posix_api_configuration_table *POSIX_api_configuration;
+} rtems_configuration_table;
+
+/*
+ * The following are provided strictly for the convenience of
+ * the user. They are not used in RTEMS itself.
+ */
+
+SAPI_EXTERN rtems_configuration_table *_Configuration_Table;
+SAPI_EXTERN rtems_multiprocessing_table *_Configuration_MP_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/rtems/directives.h b/c/src/exec/sapi/include/rtems/directives.h
new file mode 100644
index 0000000000..a59c9981a3
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/directives.h
@@ -0,0 +1,120 @@
+/* directives.h
+ *
+ * The following definitions are the directive numbers used
+ * in the assembly interface.
+ *
+ * COPYRIGHT (c) 1989-1997
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DIRECTIVES_h
+#define __RTEMS_DIRECTIVES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RTEMS_INITIALIZE_EXECUTIVE 0
+#define RTEMS_INITIALIZE_EXECUTIVE_EARLY 1
+#define RTEMS_INITIALIZE_EXECUTIVE_LATE 2
+#define RTEMS_SHUTDOWN_EXECUTIVE 3
+#define RTEMS_TASKS_CREATE 4
+#define RTEMS_TASKS_NAME_TO_ID 5
+#define RTEMS_TASKS_START 6
+#define RTEMS_TASKS_RESTART 7
+#define RTEMS_TASKS_DELETE 8
+#define RTEMS_TASKS_SUSPEND 9
+#define RTEMS_TASKS_RESUME 10
+#define RTEMS_TASKS_SET_PRIORITY 11
+#define RTEMS_TASKS_MODE 12
+#define RTEMS_TASKS_GET_NOTE 13
+#define RTEMS_TASKS_SET_NOTE 14
+#define RTEMS_TASKS_WAKE_AFTER 15
+#define RTEMS_TASKS_WAKE_WHEN 16
+#define RTEMS_INTERRUPT_CATCH 17
+#define RTEMS_CLOCK_SET 18
+#define RTEMS_CLOCK_GET 19
+#define RTEMS_CLOCK_TICK 20
+#define RTEMS_EXTENSION_CREATE 21
+#define RTEMS_EXTENSION_NAME_TO_ID 22
+#define RTEMS_EXTENSION_DELETE 23
+#define RTEMS_TIMER_CREATE 24
+#define RTEMS_TIMER_NAME_TO_ID 25
+#define RTEMS_TIMER_CANCEL 26
+#define RTEMS_TIMER_DELETE 27
+#define RTEMS_TIMER_FIRE_AFTER 28
+#define RTEMS_TIMER_FIRE_WHEN 29
+#define RTEMS_TIMER_RESET 30
+#define RTEMS_SEMAPHORE_CREATE 31
+#define RTEMS_SEMAPHORE_NAME_TO_ID 32
+#define RTEMS_SEMAPHORE_DELETE 33
+#define RTEMS_SEMAPHORE_OBTAIN 34
+#define RTEMS_SEMAPHORE_RELEASE 35
+#define RTEMS_MESSAGE_QUEUE_CREATE 36
+#define RTEMS_MESSAGE_QUEUE_NAME_TO_ID 37
+#define RTEMS_MESSAGE_QUEUE_DELETE 38
+#define RTEMS_MESSAGE_QUEUE_SEND 39
+#define RTEMS_MESSAGE_QUEUE_URGENT 40
+#define RTEMS_MESSAGE_QUEUE_BROADCAST 41
+#define RTEMS_MESSAGE_QUEUE_RECEIVE 42
+#define RTEMS_MESSAGE_QUEUE_FLUSH 43
+#define RTEMS_EVENT_SEND 44
+#define RTEMS_EVENT_RECEIVE 45
+#define RTEMS_SIGNAL_CATCH 46
+#define RTEMS_SIGNAL_SEND 47
+#define RTEMS_PARTITION_CREATE 48
+#define RTEMS_PARTITION_NAME_TO_ID 49
+#define RTEMS_PARTITION_DELETE 50
+#define RTEMS_PARTITION_GET_BUFFER 51
+#define RTEMS_PARTITION_RETURN_BUFFER 52
+#define RTEMS_REGION_CREATE 53
+#define RTEMS_REGION_EXTEND 54
+#define RTEMS_REGION_NAME_TO_ID 55
+#define RTEMS_REGION_DELETE 56
+#define RTEMS_REGION_GET_SEGMENT_SIZE 57
+#define RTEMS_REGION_GET_SEGMENT 58
+#define RTEMS_REGION_RETURN_SEGMENT 59
+#define RTEMS_DUAL_PORTED_MEMORY_CREATE 60
+#define RTEMS_DUAL_PORTED_MEMORY_NAME_TO_ID 61
+#define RTEMS_DUAL_PORTED_MEMORY_DELETE 62
+#define RTEMS_DUAL_PORTED_MEMORY_EXTERNAL_TO_INTERNAL 63
+#define RTEMS_DUAL_PORTED_MEMORY_INTERNAL_TO_EXTERNAL 64
+#define RTEMS_IO_INITIALIZE 65
+#define RTEMS_IO_REGISTER_NAME 66
+#define RTEMS_IO_LOOKUP_NAME 67
+#define RTEMS_IO_OPEN 68
+#define RTEMS_IO_CLOSE 69
+#define RTEMS_IO_READ 70
+#define RTEMS_IO_WRITE 71
+#define RTEMS_IO_CONTROL 72
+#define RTEMS_FATAL_ERROR_OCCURRED 73
+#define RTEMS_RATE_MONOTONIC_CREATE 74
+#define RTEMS_RATE_MONOTONIC_NAME_TO_ID 75
+#define RTEMS_RATE_MONOTONIC_DELETE 76
+#define RTEMS_RATE_MONOTONIC_CANCEL 77
+#define RTEMS_RATE_MONOTONIC_PERIOD 78
+#define RTEMS_MULTIPROCESSING_ANNOUNCE 79
+#define RTEMS_DEBUG_ENABLE 80
+#define RTEMS_DEBUG_DISABLE 81
+
+#define RTEMS_NUMBER_OF_ENTRY_POINTS 82
+
+/*
+ * The jump table of entry points into RTEMS directives.
+ */
+
+extern const void *_Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of directives.h */
diff --git a/c/src/exec/sapi/include/rtems/extension.h b/c/src/exec/sapi/include/rtems/extension.h
new file mode 100644
index 0000000000..c9559855ef
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/extension.h
@@ -0,0 +1,136 @@
+/* extension.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the User Extension Manager. This manager
+ * provides a mechanism for manipulating sets of user-defined extensions.
+ *
+ * Directives provided are:
+ *
+ * + create user extension set
+ * + get ID of user extension set
+ * + delete user extension set
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EXTENSION_MANAGER_h
+#define __RTEMS_EXTENSION_MANAGER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/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_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
+ * this class of objects.
+ */
+
+SAPI_EXTERN Objects_Information _Extension_Information;
+
+/*
+ * The following records define the control block used to manage
+ * each extension.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ User_extensions_Control Extension;
+} Extension_Control;
+
+/*
+ * _Extension_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Extension_Manager_initialization(
+ unsigned32 maximum_extensions
+);
+
+/*
+ * rtems_extension_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_create directive. The
+ * extension will have the name name. The entry points of the
+ * routines which constitute this extension set are in EXTENSION_TABLE.
+ * It returns the id of the created extension in ID.
+ */
+
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *extension_table,
+ Objects_Id *id
+);
+
+/*
+ * rtems_extension_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_ident directive.
+ * This directive returns the extension ID associated with name.
+ * If more than one extension is named name, then the extension
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_extension_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_delete directive. The
+ * extension indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_extension_delete(
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/extension.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/rtems/fatal.h b/c/src/exec/sapi/include/rtems/fatal.h
new file mode 100644
index 0000000000..5cb9a6460a
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/fatal.h
@@ -0,0 +1,49 @@
+/* fatal.h
+ *
+ * This include file contains constants and prototypes related
+ * to the Fatal Error Manager. This manager processes all fatal or
+ * irrecoverable errors.
+ *
+ * This manager provides directives to:
+ *
+ * + announce a fatal error has occurred
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_FATAL_h
+#define __RTEMS_FATAL_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * rtems_fatal_error_occurred
+ *
+ * DESCRIPTION:
+ *
+ * This is the routine which implements the rtems_fatal_error_occurred
+ * directive. It is invoked when the application or RTEMS
+ * determines that a fatal error has occurred.
+ */
+
+void volatile rtems_fatal_error_occurred(
+ unsigned32 the_error
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/rtems/init.h b/c/src/exec/sapi/include/rtems/init.h
new file mode 100644
index 0000000000..1a92f53e46
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/init.h
@@ -0,0 +1,110 @@
+/* init.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Initialization Manager. This manager is responsible for
+ * initializing RTEMS, creating and starting all configured initialization
+ * tasks, invoking the initialization routine for each user-supplied device
+ * driver, and initializing the optional multiprocessor layer.
+ *
+ * This manager provides directives to:
+ *
+ * + initialize the RTEMS executive
+ * + shutdown the RTEMS executive
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_INIT_h
+#define __RTEMS_INIT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/config.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
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_initialize_executive directive. This
+ * directive is invoked at system startup to initialize the RTEMS
+ * multitasking environment.
+ */
+
+void rtems_initialize_executive(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+
+/*
+ * rtems_initialize_executive_early
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the early portion of rtems_initialize_executive
+ * directive up to the pretasking hook. This directive is invoked at system
+ * startup to initialize the RTEMS multitasking environment.
+ */
+
+rtems_interrupt_level rtems_initialize_executive_early(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+
+/*
+ * rtems_initialize_executive_late
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the early portion of rtems_initialize_executive
+ * directive up to the pretasking hook. This directive is invoked at system
+ * startup to initialize the RTEMS multitasking environment.
+ */
+
+void rtems_initialize_executive_late(
+ rtems_interrupt_level bsp_level
+);
+
+/*
+ * rtems_shutdown_executive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_shutdown_executive directive. The
+ * invocation of this directive results in the RTEMS environment being
+ * shutdown and multitasking halted. From the application's perspective,
+ * invocation of this directive results in the rtems_initialize_executive
+ * directive exitting to the startup code which invoked it.
+ */
+
+void rtems_shutdown_executive(
+ unsigned32 result
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/rtems/io.h b/c/src/exec/sapi/include/rtems/io.h
new file mode 100644
index 0000000000..a1eddcf637
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/io.h
@@ -0,0 +1,244 @@
+/* io.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Input/Output Manager. This manager provides a well defined
+ * mechanism for accessing device drivers and a structured methodology for
+ * organizing device drivers.
+ *
+ * Directives provided are:
+ *
+ * + initialize a device driver
+ * + open a device driver
+ * + close a device driver
+ * + read from a device driver
+ * + write to a device driver
+ * + special device services
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_IO_h
+#define __RTEMS_IO_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/status.h>
+
+/*
+ *
+ * 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;
+
+/*
+ * Table for the io device names
+ */
+
+typedef struct {
+ char *device_name;
+ unsigned32 device_name_length;
+ rtems_device_major_number major;
+ rtems_device_minor_number minor;
+} rtems_driver_name_t;
+
+/*
+ * This is the table of device names.
+ */
+
+/*
+ * The following declare the data required to manage the Driver
+ * Address Table and Device Name Table.
+ */
+
+SAPI_EXTERN unsigned32 _IO_Number_of_drivers;
+SAPI_EXTERN rtems_driver_address_table *_IO_Driver_address_table;
+SAPI_EXTERN unsigned32 _IO_Number_of_devices;
+SAPI_EXTERN rtems_driver_name_t *_IO_Driver_name_table;
+
+/*
+ * _IO_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+);
+
+/*
+ * rtems_io_register_name
+ *
+ * DESCRIPTION:
+ *
+ * Associate a name with a driver.
+ *
+ */
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+);
+
+
+/*
+ * rtems_io_lookup_name
+ *
+ * DESCRIPTION:
+ *
+ * Find what driver "owns" this name
+ */
+
+rtems_status_code rtems_io_lookup_name(
+ const char *name,
+ rtems_driver_name_t **device_info
+);
+
+
+/*
+ * rtems_io_initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_initialize directive. It is invoked
+ * to initialize a device driver or an individual device.
+ */
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_open
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_open directive. It is invoked
+ * to open a device.
+ */
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_close
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_close directive. It is invoked
+ * to close a device.
+ */
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_read
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_read directive. It is invoked
+ * to read from a device.
+ */
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_write
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_write directive. It is invoked
+ * to write to a device.
+ */
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_control
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_control directive. It is invoked
+ * to perform a device specific operation on a device.
+ */
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * _IO_Initialize_all_drivers
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes all of the device drivers configured
+ * in the Device Driver Address Table.
+ */
+
+void _IO_Initialize_all_drivers( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/rtems/mptables.h b/c/src/exec/sapi/include/rtems/mptables.h
new file mode 100644
index 0000000000..7a00554c23
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/mptables.h
@@ -0,0 +1,29 @@
+/* mptables.h
+ *
+ * This include file contains the executive's pre-initialized tables
+ * used in a multiprocessor configuration.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MPTABLES_h
+#define __RTEMS_MPTABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/include/rtems/sptables.h b/c/src/exec/sapi/include/rtems/sptables.h
new file mode 100644
index 0000000000..16430b54fc
--- /dev/null
+++ b/c/src/exec/sapi/include/rtems/sptables.h
@@ -0,0 +1,162 @@
+/* sptables.h
+ *
+ * This include file contains the executive's pre-initialized tables
+ * used when in a single processor configuration.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SPTABLES_h
+#define __RTEMS_SPTABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/config.h>
+
+#include <rtems/debug.h>
+#include <rtems/fatal.h>
+#include <rtems/init.h>
+#include <rtems/io.h>
+#include <rtems/score/sysstate.h>
+
+#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>
+
+/*
+ * This is the default Multiprocessing Configuration Table.
+ * It is used in single processor configurations.
+ */
+
+const rtems_multiprocessing_table
+ _Initialization_Default_multiprocessing_table = {
+ 1, /* local node number */
+ 1, /* maximum number nodes in system */
+ 0, /* maximum number global objects */
+ 0, /* maximum number proxies */
+ NULL, /* pointer to MPCI address table */
+};
+
+/*
+ * This is the version string.
+ */
+
+const char _RTEMS_version[] =
+ "RTEMS RELEASE V4.0.0 (" CPU_NAME "/" CPU_MODEL_NAME ")";
+
+
+/*
+ * This table is used by the single entry point code.
+ */
+
+const void * _Entry_points[ RTEMS_NUMBER_OF_ENTRY_POINTS ] = {
+ (void *) rtems_initialize_executive, /* 0 */
+ (void *) rtems_initialize_executive_early, /* 1 */
+ (void *) rtems_initialize_executive_late, /* 2 */
+ (void *) rtems_shutdown_executive, /* 3 */
+ (void *) rtems_task_create, /* 4 */
+ (void *) rtems_task_ident, /* 5 */
+ (void *) rtems_task_start, /* 6 */
+ (void *) rtems_task_restart, /* 7 */
+ (void *) rtems_task_delete, /* 8 */
+ (void *) rtems_task_suspend, /* 9 */
+ (void *) rtems_task_resume, /* 10 */
+ (void *) rtems_task_set_priority, /* 11 */
+ (void *) rtems_task_mode, /* 12 */
+ (void *) rtems_task_get_note, /* 13 */
+ (void *) rtems_task_set_note, /* 14 */
+ (void *) rtems_task_wake_after, /* 15 */
+ (void *) rtems_task_wake_when, /* 16 */
+ (void *) rtems_interrupt_catch, /* 17 */
+ (void *) rtems_clock_set, /* 18 */
+ (void *) rtems_clock_get, /* 19 */
+ (void *) rtems_clock_tick, /* 20 */
+ (void *) rtems_extension_create, /* 21 */
+ (void *) rtems_extension_ident, /* 22 */
+ (void *) rtems_extension_delete, /* 23 */
+ (void *) rtems_timer_create, /* 24 */
+ (void *) rtems_timer_ident, /* 25 */
+ (void *) rtems_timer_cancel, /* 26 */
+ (void *) rtems_timer_delete, /* 27 */
+ (void *) rtems_timer_fire_after, /* 28 */
+ (void *) rtems_timer_fire_when, /* 29 */
+ (void *) rtems_timer_reset, /* 30 */
+ (void *) rtems_semaphore_create, /* 31 */
+ (void *) rtems_semaphore_ident, /* 32 */
+ (void *) rtems_semaphore_delete, /* 33 */
+ (void *) rtems_semaphore_obtain, /* 34 */
+ (void *) rtems_semaphore_release, /* 35 */
+ (void *) rtems_message_queue_create, /* 36 */
+ (void *) rtems_message_queue_ident, /* 37 */
+ (void *) rtems_message_queue_delete, /* 38 */
+ (void *) rtems_message_queue_send, /* 39 */
+ (void *) rtems_message_queue_urgent, /* 40 */
+ (void *) rtems_message_queue_broadcast, /* 41 */
+ (void *) rtems_message_queue_receive, /* 42 */
+ (void *) rtems_message_queue_flush, /* 43 */
+ (void *) rtems_event_send, /* 44 */
+ (void *) rtems_event_receive, /* 45 */
+ (void *) rtems_signal_catch, /* 46 */
+ (void *) rtems_signal_send, /* 47 */
+ (void *) rtems_partition_create, /* 48 */
+ (void *) rtems_partition_ident, /* 49 */
+ (void *) rtems_partition_delete, /* 50 */
+ (void *) rtems_partition_get_buffer, /* 51 */
+ (void *) rtems_partition_return_buffer, /* 52 */
+ (void *) rtems_region_create, /* 53 */
+ (void *) rtems_region_extend, /* 54 */
+ (void *) rtems_region_ident, /* 55 */
+ (void *) rtems_region_delete, /* 56 */
+ (void *) rtems_region_get_segment, /* 57 */
+ (void *) rtems_region_get_segment_size, /* 58 */
+ (void *) rtems_region_return_segment, /* 59 */
+ (void *) rtems_port_create, /* 60 */
+ (void *) rtems_port_ident, /* 61 */
+ (void *) rtems_port_delete, /* 62 */
+ (void *) rtems_port_external_to_internal, /* 63 */
+ (void *) rtems_port_internal_to_external, /* 64 */
+ (void *) rtems_io_initialize, /* 65 */
+ (void *) rtems_io_register_name, /* 66 */
+ (void *) rtems_io_lookup_name, /* 67 */
+ (void *) rtems_io_open, /* 68 */
+ (void *) rtems_io_close, /* 69 */
+ (void *) rtems_io_read, /* 70 */
+ (void *) rtems_io_write, /* 71 */
+ (void *) rtems_io_control, /* 72 */
+ (void *) rtems_fatal_error_occurred, /* 73 */
+ (void *) rtems_rate_monotonic_create, /* 74 */
+ (void *) rtems_rate_monotonic_ident, /* 75 */
+ (void *) rtems_rate_monotonic_delete, /* 76 */
+ (void *) rtems_rate_monotonic_cancel, /* 77 */
+ (void *) rtems_rate_monotonic_period, /* 78 */
+ (void *) rtems_multiprocessing_announce, /* 79 */
+ (void *) rtems_debug_enable, /* 80 */
+ (void *) rtems_debug_disable /* 81 */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/inline/Makefile.in b/c/src/exec/sapi/inline/Makefile.in
new file mode 100644
index 0000000000..63b4731cbe
--- /dev/null
+++ b/c/src/exec/sapi/inline/Makefile.in
@@ -0,0 +1,29 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= extension
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/exec/sapi/inline/extension.inl b/c/src/exec/sapi/inline/extension.inl
new file mode 100644
index 0000000000..6a00bc6f58
--- /dev/null
+++ b/c/src/exec/sapi/inline/extension.inl
@@ -0,0 +1,91 @@
+/* extension.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Extension Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EXTENSION_MANAGER_inl
+#define __EXTENSION_MANAGER_inl
+
+/*PAGE
+ *
+ * _Extension_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a extension control block from
+ * the inactive chain of free extension control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void )
+{
+ return (Extension_Control *) _Objects_Allocate( &_Extension_Information );
+}
+
+/*PAGE
+ *
+ * _Extension_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a extension control block to the
+ * inactive chain of free extension control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Extension_Free (
+ Extension_Control *the_extension
+)
+{
+ _Objects_Free( &_Extension_Information, &the_extension->Object );
+}
+
+/*PAGE
+ *
+ * _Extension_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps extension IDs to extension control blocks.
+ * If ID corresponds to a local extension, then it returns
+ * the extension control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the returned value is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Extension_Control *)
+ _Objects_Get( &_Extension_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Extension_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_extension is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Extension_Is_null (
+ Extension_Control *the_extension
+)
+{
+ return ( the_extension == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/inline/rtems/Makefile.in b/c/src/exec/sapi/inline/rtems/Makefile.in
new file mode 100644
index 0000000000..63b4731cbe
--- /dev/null
+++ b/c/src/exec/sapi/inline/rtems/Makefile.in
@@ -0,0 +1,29 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= extension
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/exec/sapi/inline/rtems/extension.inl b/c/src/exec/sapi/inline/rtems/extension.inl
new file mode 100644
index 0000000000..6a00bc6f58
--- /dev/null
+++ b/c/src/exec/sapi/inline/rtems/extension.inl
@@ -0,0 +1,91 @@
+/* extension.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Extension Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EXTENSION_MANAGER_inl
+#define __EXTENSION_MANAGER_inl
+
+/*PAGE
+ *
+ * _Extension_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a extension control block from
+ * the inactive chain of free extension control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void )
+{
+ return (Extension_Control *) _Objects_Allocate( &_Extension_Information );
+}
+
+/*PAGE
+ *
+ * _Extension_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a extension control block to the
+ * inactive chain of free extension control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Extension_Free (
+ Extension_Control *the_extension
+)
+{
+ _Objects_Free( &_Extension_Information, &the_extension->Object );
+}
+
+/*PAGE
+ *
+ * _Extension_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps extension IDs to extension control blocks.
+ * If ID corresponds to a local extension, then it returns
+ * the extension control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the returned value is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Extension_Control *)
+ _Objects_Get( &_Extension_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Extension_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_extension is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Extension_Is_null (
+ Extension_Control *the_extension
+)
+{
+ return ( the_extension == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/macros/Makefile.in b/c/src/exec/sapi/macros/Makefile.in
new file mode 100644
index 0000000000..63b4731cbe
--- /dev/null
+++ b/c/src/exec/sapi/macros/Makefile.in
@@ -0,0 +1,29 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= extension
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/exec/sapi/macros/extension.inl b/c/src/exec/sapi/macros/extension.inl
new file mode 100644
index 0000000000..113cdf3154
--- /dev/null
+++ b/c/src/exec/sapi/macros/extension.inl
@@ -0,0 +1,58 @@
+/* extension.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Extension Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EXTENSION_inl
+#define __EXTENSION_inl
+
+/*PAGE
+ *
+ * _Extension_Allocate
+ *
+ */
+
+#define _Extension_Allocate() \
+ (Extension_Control *) _Objects_Allocate( &_Extension_Information )
+
+/*PAGE
+ *
+ * _Extension_Free
+ *
+ */
+
+#define _Extension_Free( _the_extension ) \
+ _Objects_Free( &_Extension_Information, &(_the_extension)->Object )
+
+/*PAGE
+ *
+ * _Extension_Get
+ *
+ */
+
+#define _Extension_Get( _id, _location ) \
+ (Extension_Control *) \
+ _Objects_Get( &_Extension_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Extension_Is_null
+ *
+ */
+
+#define _Extension_Is_null( _the_extension ) \
+ ( (_the_extension) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/macros/rtems/Makefile.in b/c/src/exec/sapi/macros/rtems/Makefile.in
new file mode 100644
index 0000000000..63b4731cbe
--- /dev/null
+++ b/c/src/exec/sapi/macros/rtems/Makefile.in
@@ -0,0 +1,29 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= extension
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/exec/sapi/macros/rtems/extension.inl b/c/src/exec/sapi/macros/rtems/extension.inl
new file mode 100644
index 0000000000..113cdf3154
--- /dev/null
+++ b/c/src/exec/sapi/macros/rtems/extension.inl
@@ -0,0 +1,58 @@
+/* extension.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Extension Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EXTENSION_inl
+#define __EXTENSION_inl
+
+/*PAGE
+ *
+ * _Extension_Allocate
+ *
+ */
+
+#define _Extension_Allocate() \
+ (Extension_Control *) _Objects_Allocate( &_Extension_Information )
+
+/*PAGE
+ *
+ * _Extension_Free
+ *
+ */
+
+#define _Extension_Free( _the_extension ) \
+ _Objects_Free( &_Extension_Information, &(_the_extension)->Object )
+
+/*PAGE
+ *
+ * _Extension_Get
+ *
+ */
+
+#define _Extension_Get( _id, _location ) \
+ (Extension_Control *) \
+ _Objects_Get( &_Extension_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Extension_Is_null
+ *
+ */
+
+#define _Extension_Is_null( _the_extension ) \
+ ( (_the_extension) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/sapi/optman/Makefile.in b/c/src/exec/sapi/optman/Makefile.in
new file mode 100644
index 0000000000..1043e11a7f
--- /dev/null
+++ b/c/src/exec/sapi/optman/Makefile.in
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+C_FILES= no-ext.c no-io.c
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+PGMS=$(C_FILES:%.c=$(ARCH)/%.rel)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+ASM4FLAGS += -I $(PROJECT_RELEASE)/include/rtems
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGMS)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
diff --git a/c/src/exec/sapi/optman/no-ext.c b/c/src/exec/sapi/optman/no-ext.c
new file mode 100644
index 0000000000..92387ba6cb
--- /dev/null
+++ b/c/src/exec/sapi/optman/no-ext.c
@@ -0,0 +1,67 @@
+/*
+ * Extension Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/extension.h>
+#include <rtems/score/interr.h>
+
+void _Extension_Manager_initialization(
+ unsigned32 maximum_extensions
+)
+{
+}
+
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *extension_table,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_extension_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/exec/sapi/optman/no-io.c b/c/src/exec/sapi/optman/no-io.c
new file mode 100644
index 0000000000..273d9208ef
--- /dev/null
+++ b/c/src/exec/sapi/optman/no-io.c
@@ -0,0 +1,144 @@
+/*
+ * Input/Output Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/io.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+)
+{
+}
+
+void _IO_Initialize_all_drivers( void )
+{
+}
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_lookup_name(
+ const char *pathname,
+ rtems_driver_name_t **rnp
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/exec/sapi/src/Makefile.in b/c/src/exec/sapi/src/Makefile.in
new file mode 100644
index 0000000000..424011b99a
--- /dev/null
+++ b/c/src/exec/sapi/src/Makefile.in
@@ -0,0 +1,38 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+C_PIECES= debug extension fatal init io posixapi rtemsapi
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+SRCS=$(C_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) ${OBJS}
diff --git a/c/src/exec/sapi/src/debug.c b/c/src/exec/sapi/src/debug.c
new file mode 100644
index 0000000000..fc27831685
--- /dev/null
+++ b/c/src/exec/sapi/src/debug.c
@@ -0,0 +1,62 @@
+/*
+ * Debug Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/debug.h>
+
+/*PAGE
+ *
+ * _Debug_Manager_initialization
+ */
+
+void _Debug_Manager_initialization( void )
+{
+ rtems_debug_disable( RTEMS_DEBUG_ALL_MASK );
+}
+
+/*PAGE
+ *
+ * rtems_debug_enable
+ */
+
+void rtems_debug_enable (
+ rtems_debug_control to_be_enabled
+)
+{
+ _Debug_Level |= to_be_enabled;
+}
+
+/*PAGE
+ *
+ * rtems_debug_disable
+ */
+
+void rtems_debug_disable (
+ rtems_debug_control to_be_disabled
+)
+{
+ _Debug_Level &= ~to_be_disabled;
+}
+
+/*PAGE
+ *
+ * _Debug_Is_enabled
+ */
+
+boolean _Debug_Is_enabled(
+ rtems_debug_control level
+)
+{
+ return (_Debug_Level & level);
+}
diff --git a/c/src/exec/sapi/src/exinit.c b/c/src/exec/sapi/src/exinit.c
new file mode 100644
index 0000000000..96da35e825
--- /dev/null
+++ b/c/src/exec/sapi/src/exinit.c
@@ -0,0 +1,297 @@
+/*
+ * Initialization Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * SCORE_INIT and SAPI_INIT are defined so all of the super core and
+ * super API data will be included in this object file.
+ */
+
+#define SAPI_INIT
+#define SCORE_INIT
+
+#include <rtems/system.h>
+#include <rtems/config.h>
+#include <rtems/debug.h>
+#include <rtems/extension.h>
+#include <rtems/fatal.h>
+#include <rtems/init.h>
+#include <rtems/io.h>
+#include <rtems/score/sysstate.h>
+
+#include <rtems/score/apiext.h>
+#include <rtems/score/copyrt.h>
+#include <rtems/score/heap.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/wkspace.h>
+
+#include <rtems/directives.h>
+#include <rtems/sptables.h>
+
+
+#include <rtems/rtems/rtemsapi.h>
+#ifdef RTEMS_POSIX_API
+#include <rtems/posix/posixapi.h>
+#endif
+
+/*PAGE
+ *
+ * rtems_initialize_executive
+ *
+ * This directive initializes all the kernels data structures
+ * to the states necessary for the kernel to begin execution. All
+ * include files that contain global variable definitions should be
+ * included in this file. The system threads and initialization threads
+ * are created and started by this routine. This routine then
+ * initiates multithreading.
+ *
+ * Input parameters:
+ * configuration_table - pointer to the user's configuration table
+ * cpu_table - pointer to the user's CPU configuration table
+ *
+ * Output parameters: NONE
+ */
+
+void rtems_initialize_executive(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+)
+{
+ rtems_interrupt_level bsp_level;
+
+ bsp_level = rtems_initialize_executive_early(configuration_table, cpu_table);
+ rtems_initialize_executive_late( bsp_level );
+}
+
+rtems_interrupt_level rtems_initialize_executive_early(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+)
+{
+ rtems_interrupt_level bsp_level;
+ rtems_multiprocessing_table *multiprocessing_table;
+
+ /*
+ * Dispatching and interrupts are disabled until the end of the
+ * initialization sequence. This prevents an inadvertent context
+ * switch before the executive is initialized.
+ */
+
+ _ISR_Disable( bsp_level );
+
+ if ( configuration_table == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_NO_CONFIGURATION_TABLE
+ );
+
+ /*
+ * 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
+ );
+
+ /*
+ * Provided just for user convenience.
+ */
+
+ _Configuration_Table = configuration_table;
+ _Configuration_MP_table = multiprocessing_table;
+
+ /*
+ * Internally we view single processor systems as a very restricted
+ * multiprocessor system.
+ */
+
+ if ( multiprocessing_table == NULL )
+ multiprocessing_table =
+ (void *)&_Initialization_Default_multiprocessing_table;
+
+ if ( cpu_table == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_NO_CPU_TABLE
+ );
+
+ _CPU_Initialize( cpu_table, _Thread_Dispatch );
+
+ /*
+ * Do this as early as possible to insure no debugging output
+ * is even attempted to be printed.
+ */
+
+ _Debug_Manager_initialization();
+
+ _API_extensions_Initialization();
+
+ _Thread_Dispatch_initialization();
+
+ _User_extensions_Handler_initialization(
+ configuration_table->User_extension_table
+ );
+
+ _Workspace_Handler_initialization(
+ (void *)configuration_table->work_space_start,
+ configuration_table->work_space_size
+ );
+
+ _ISR_Handler_initialization();
+
+ _Objects_Handler_initialization(
+ multiprocessing_table->node,
+ multiprocessing_table->maximum_nodes,
+ multiprocessing_table->maximum_global_objects
+ );
+
+ _Priority_Handler_initialization();
+
+ _Watchdog_Handler_initialization();
+
+ _TOD_Handler_initialization( configuration_table->microseconds_per_tick );
+
+ _Thread_Handler_initialization(
+ configuration_table->ticks_per_timeslice,
+ configuration_table->maximum_extensions,
+ multiprocessing_table->maximum_proxies
+ );
+
+ _MPCI_Handler_initialization(
+ multiprocessing_table->User_mpci_table,
+ RTEMS_TIMEOUT
+ );
+
+/* MANAGERS */
+
+ _Extension_Manager_initialization( configuration_table->maximum_extensions );
+
+ _IO_Manager_initialization(
+ configuration_table->Device_driver_table,
+ configuration_table->number_of_device_drivers,
+ configuration_table->maximum_devices
+ );
+
+ _RTEMS_API_Initialize( configuration_table );
+
+#ifdef RTEMS_POSIX_API
+ _POSIX_API_Initialize( configuration_table );
+#endif
+
+ _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
+
+ if ( cpu_table->pretasking_hook )
+ (*cpu_table->pretasking_hook)();
+
+ /*
+ * No threads should be created before this point!!!
+ *
+ * At this point all API extensions are in place. After the call to
+ * _Thread_Create_idle() _Thread_Executing will be set.
+ * and _Thread_Heir are not set yet.
+ */
+
+ _Thread_Create_idle();
+
+ _MPCI_Create_server();
+
+ /*
+ * Run the API and BSPs predriver hook.
+ */
+
+ _API_extensions_Run_predriver();
+
+ if ( _CPU_Table.predriver_hook )
+ (*_CPU_Table.predriver_hook)();
+
+ /*
+ * Initialize all the device drivers and initialize the MPCI layer.
+ *
+ * NOTE: The MPCI may be build upon a device driver.
+ */
+
+ _IO_Initialize_all_drivers();
+
+ if ( _System_state_Is_multiprocessing ) {
+ _MPCI_Initialization();
+ _MPCI_Internal_packets_Send_process_packet(
+ MPCI_PACKETS_SYSTEM_VERIFY
+ );
+ }
+
+ /*
+ * Run the APIs and BSPs postdriver hooks.
+ *
+ * The API extensions are supposed to create user initialization tasks.
+ */
+
+ _API_extensions_Run_postdriver();
+
+ if ( _CPU_Table.postdriver_hook )
+ (*_CPU_Table.postdriver_hook)();
+
+ return bsp_level;
+}
+
+void rtems_initialize_executive_late(
+ rtems_interrupt_level bsp_level
+)
+{
+
+ _System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
+
+ _Thread_Start_multitasking();
+
+ /*
+ * Restore the interrupt level to what the BSP had. Technically,
+ * this is unnecessary since the BSP should have all interrupts
+ * disabled when rtems_initialize_executive is invoked. But this keeps
+ * the ISR Disable/Enable calls paired.
+ */
+
+ _ISR_Enable( bsp_level );
+}
+
+/*PAGE
+ *
+ * rtems_shutdown_executive
+ *
+ * This kernel routine shutdowns the executive. It halts multitasking
+ * and returns control to the application execution "thread" which
+ * initialially invoked the rtems_initialize_executive directive.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void rtems_shutdown_executive(
+ unsigned32 result
+)
+{
+ if ( _System_state_Current != SYSTEM_STATE_SHUTDOWN ) {
+ _System_state_Set( SYSTEM_STATE_SHUTDOWN );
+ _Thread_Stop_multitasking();
+ }
+}
diff --git a/c/src/exec/sapi/src/extension.c b/c/src/exec/sapi/src/extension.c
new file mode 100644
index 0000000000..10a828213d
--- /dev/null
+++ b/c/src/exec/sapi/src/extension.c
@@ -0,0 +1,165 @@
+/*
+ * Extension Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/extension.h>
+
+/*PAGE
+ *
+ * _Extension_Manager_initialization
+ *
+ * This routine initializes all extension manager related data structures.
+ *
+ * Input parameters:
+ * maximum_extensions - number of extensions to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Extension_Manager_initialization(
+ unsigned32 maximum_extensions
+)
+{
+ _Objects_Initialize_information(
+ &_Extension_Information,
+ OBJECTS_RTEMS_EXTENSIONS,
+ FALSE,
+ maximum_extensions,
+ sizeof( Extension_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_extension_create
+ *
+ * This directive creates a extension and performs some initialization.
+ *
+ * Input parameters:
+ * name - extension name
+ * extension_table - pointer to extension set information
+ * id - pointer to extension id
+ *
+ * Output parameters:
+ * id - extension id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *extension_table,
+ Objects_Id *id
+)
+{
+ Extension_Control *the_extension;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_extension = _Extension_Allocate();
+
+ if ( !the_extension ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ _User_extensions_Add_set( &the_extension->Extension, extension_table );
+
+ _Objects_Open( &_Extension_Information, &the_extension->Object, &name );
+
+ *id = the_extension->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_extension_ident
+ *
+ * This directive returns the system ID associated with
+ * the extension name.
+ *
+ * Input parameters:
+ * name - user defined message queue name
+ * id - pointer to extension id
+ *
+ * Output parameters:
+ * *id - message queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Extension_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_extension_delete
+ *
+ * This directive allows a thread to delete a extension.
+ *
+ * Input parameters:
+ * id - extension id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_extension_delete(
+ Objects_Id id
+)
+{
+ Extension_Control *the_extension;
+ Objects_Locations location;
+
+ the_extension = _Extension_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/c/src/exec/sapi/src/fatal.c b/c/src/exec/sapi/src/fatal.c
new file mode 100644
index 0000000000..534be655e8
--- /dev/null
+++ b/c/src/exec/sapi/src/fatal.c
@@ -0,0 +1,38 @@
+/*
+ * Fatal Error Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/fatal.h>
+#include <rtems/score/interr.h>
+
+/*PAGE
+ *
+ * rtems_fatal_error_occurred
+ *
+ * This directive will invoke the internal fatal error handler.
+ *
+ * Input parameters:
+ * the_error - fatal error status code
+ *
+ * Output parameters: NONE
+ */
+
+void volatile rtems_fatal_error_occurred(
+ unsigned32 the_error
+)
+{
+ _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, FALSE, the_error );
+
+/* will not return from this routine */
+}
diff --git a/c/src/exec/sapi/src/io.c b/c/src/exec/sapi/src/io.c
new file mode 100644
index 0000000000..f4f1b83c64
--- /dev/null
+++ b/c/src/exec/sapi/src/io.c
@@ -0,0 +1,345 @@
+/*
+ * Input/Output Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/io.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+
+#include <string.h>
+
+/*PAGE
+ *
+ * _IO_Manager_initialization
+ *
+ */
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+)
+{
+ void *tmp;
+ unsigned32 index;
+ rtems_driver_name_t *np;
+
+ _IO_Driver_address_table = driver_table;
+ _IO_Number_of_drivers = number_of_drivers;
+ _IO_Number_of_devices = number_of_devices;
+
+ tmp = _Workspace_Allocate_or_fatal_error(
+ sizeof( rtems_driver_name_t ) * ( number_of_devices + 1 )
+ );
+
+ _IO_Driver_name_table = (rtems_driver_name_t *) tmp;
+
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ ) {
+ np->device_name = 0;
+ np->device_name_length = 0;
+ np->major = 0;
+ np->minor = 0;
+ }
+}
+
+/*PAGE
+ *
+ * _IO_Initialize_all_drivers
+ *
+ * This routine initializes all device drivers
+ *
+ * Input Paramters: NONE
+ *
+ * Output Parameters: NONE
+ */
+
+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, NULL);
+}
+
+/*PAGE
+ *
+ * rtems_io_register_name
+ *
+ * Associate a name with a driver
+ *
+ * Input Paramters:
+ * device_name - pointer to name string to associate with device
+ * major - device major number to receive name
+ * minor - device minor number to receive name
+ *
+ * Output Parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+ )
+{
+ rtems_driver_name_t *np;
+ unsigned32 level;
+ unsigned32 index;
+
+ /* find an empty slot */
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
+ {
+
+ _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;
+ _ISR_Enable(level);
+
+ return RTEMS_SUCCESSFUL;
+ }
+ _ISR_Enable(level);
+ }
+
+ return RTEMS_TOO_MANY;
+}
+
+/*PAGE
+ *
+ * rtems_io_lookup_name
+ *
+ * Find what driver "owns" this name
+ *
+ * Input Paramters:
+ * name - name to lookup the associated device
+ *
+ * Output Parameters:
+ * device_info - device associate with name
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_io_lookup_name(
+ const char *name,
+ rtems_driver_name_t **device_info
+)
+{
+ rtems_driver_name_t *np;
+ unsigned32 index;
+
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
+ if (np->device_name)
+ if (strncmp(np->device_name, name, np->device_name_length) == 0)
+ {
+ *device_info = np;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ *device_info = 0;
+ return RTEMS_UNSATISFIED;
+}
+
+
+/*PAGE
+ *
+ * rtems_io_initialize
+ *
+ * This routine is the initialization directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].initialization;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_open
+ *
+ * This routine is the open directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].open;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_close
+ *
+ * This routine is the close directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].close;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_read
+ *
+ * This routine is the read directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].read;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_write
+ *
+ * This routine is the write directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].write;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_control
+ *
+ * This routine is the control directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].control;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/exec/sapi/src/posixapi.c b/c/src/exec/sapi/src/posixapi.c
new file mode 100644
index 0000000000..687ebd2edd
--- /dev/null
+++ b/c/src/exec/sapi/src/posixapi.c
@@ -0,0 +1,96 @@
+/*
+ * RTEMS API Initialization Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <assert.h>
+
+/*
+ * POSIX_API_INIT is defined so all of the POSIX API
+ * data will be included in this object file.
+ */
+
+#define POSIX_API_INIT
+
+#include <rtems/system.h> /* include this before checking RTEMS_POSIX_API */
+#ifdef RTEMS_POSIX_API
+
+#include <sys/types.h>
+#include <rtems/config.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/cond.h>
+#include <rtems/posix/config.h>
+#include <rtems/posix/key.h>
+#include <rtems/posix/mutex.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/psignal.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_API_Initialize
+ *
+ * XXX
+ */
+
+posix_api_configuration_table _POSIX_Default_configuration = {
+ 0, /* maximum_threads */
+ 0, /* maximum_mutexes */
+ 0, /* maximum_condition_variables */
+ 0, /* maximum_keys */
+ 0, /* maximum_queued_signals */
+ 0, /* number_of_initialization_threads */
+ NULL /* User_initialization_threads_table */
+};
+
+
+void _POSIX_API_Initialize(
+ rtems_configuration_table *configuration_table
+)
+{
+ posix_api_configuration_table *api_configuration;
+
+ /* XXX need to assert here based on size assumptions */
+
+ assert( sizeof(pthread_t) == sizeof(Objects_Id) );
+
+ api_configuration = configuration_table->POSIX_api_configuration;
+ if ( !api_configuration )
+ api_configuration = &_POSIX_Default_configuration;
+
+ _POSIX_signals_Manager_Initialization(
+ api_configuration->maximum_queued_signals
+ );
+
+ _POSIX_Threads_Manager_initialization(
+ api_configuration->maximum_threads,
+ api_configuration->number_of_initialization_threads,
+ api_configuration->User_initialization_threads_table
+ );
+
+ _POSIX_Condition_variables_Manager_initialization(
+ api_configuration->maximum_condition_variables
+ );
+
+ _POSIX_Key_Manager_initialization( api_configuration->maximum_keys );
+
+ _POSIX_Mutex_Manager_initialization(
+ api_configuration->maximum_mutexes
+ );
+
+}
+
+#endif
+/* end of file */
diff --git a/c/src/exec/sapi/src/rtemsapi.c b/c/src/exec/sapi/src/rtemsapi.c
new file mode 100644
index 0000000000..7156598835
--- /dev/null
+++ b/c/src/exec/sapi/src/rtemsapi.c
@@ -0,0 +1,90 @@
+/*
+ * POSIX API Initialization Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * RTEMS_API_INIT is defined so all of the RTEMS API
+ * data will be included in this object file.
+ */
+
+#define RTEMS_API_INIT
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/rtemsapi.h>
+
+#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
+)
+{
+ rtems_api_configuration_table *api_configuration;
+
+ api_configuration = configuration_table->RTEMS_api_configuration;
+
+ _Attributes_Handler_initialization();
+
+ _Interrupt_Manager_initialization();
+
+ _Multiprocessing_Manager_initialization();
+
+ _RTEMS_tasks_Manager_initialization(
+ api_configuration->maximum_tasks,
+ api_configuration->number_of_initialization_tasks,
+ api_configuration->User_initialization_tasks_table
+ );
+
+ _Timer_Manager_initialization( api_configuration->maximum_timers );
+
+ _Signal_Manager_initialization();
+
+ _Event_Manager_initialization();
+
+ _Message_queue_Manager_initialization(
+ api_configuration->maximum_message_queues
+ );
+
+ _Semaphore_Manager_initialization( api_configuration->maximum_semaphores );
+
+ _Partition_Manager_initialization( api_configuration->maximum_partitions );
+
+ _Region_Manager_initialization( api_configuration->maximum_regions );
+
+ _Dual_ported_memory_Manager_initialization( api_configuration->maximum_ports);
+
+ _Rate_monotonic_Manager_initialization( api_configuration->maximum_periods );
+}
+
+/* end of file */
diff --git a/c/src/exec/score/Makefile.in b/c/src/exec/score/Makefile.in
new file mode 100644
index 0000000000..a20d8b3f18
--- /dev/null
+++ b/c/src/exec/score/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=headers $(INLINE) tools cpu src
diff --git a/c/src/exec/score/cpu/Makefile.in b/c/src/exec/score/cpu/Makefile.in
new file mode 100644
index 0000000000..18843f3bb0
--- /dev/null
+++ b/c/src/exec/score/cpu/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=$(RTEMS_CPU)
diff --git a/c/src/exec/score/cpu/a29k/Makefile.in b/c/src/exec/score/cpu/a29k/Makefile.in
new file mode 100644
index 0000000000..fc16379320
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/Makefile.in
@@ -0,0 +1,88 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+# Normally cpu_asm and rtems are assembly files
+C_PIECES=cpu rtems
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/a29ktypes.h
+
+# H_FILES that get installed externally
+# a29k.h is handled separately
+EXTERNAL_H_FILES = $(srcdir)/asm.h $(srcdir)/amd.ah $(srcdir)/pswmacro.ah $(srcdir)/register.ah
+
+# Assembly source names, if any, go here -- minus the .s
+# Normally cpu_asm and rtems are assembly files
+S_PIECES=cpu_asm sig
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+ $(INSTALL_VARIANT) -m 444 $(RELS) ${PROJECT_RELEASE}/lib
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/a29k.h \
+ ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/a29k.h: a29k.h
+ $(SED) -e 's?REPLACE_THIS_WITH_THE_CPU_MODEL?$(RTEMS_CPU_MODEL)?' \
+ -e 's?REPLACE_THIS_WITH_THE_BSP?$(RTEMS_BSP)?' \
+ < $< >$(ARCH)/a29k.h.tmp
+ $(INSTALL) -m 444 $(ARCH)/a29k.h.tmp $@
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/a29k/a29k.h b/c/src/exec/score/cpu/a29k/a29k.h
new file mode 100644
index 0000000000..0de0670675
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/a29k.h
@@ -0,0 +1,59 @@
+/* a29k.h
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+/* @(#)a29k.h 10/21/96 1.3 */
+
+#ifndef _INCLUDE_A29K_h
+#define _INCLUDE_A29K_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the "no cpu"
+ * family when executing in protected mode. It does
+ * this by setting variables to indicate which implementation
+ * dependent features are present in a particular member
+ * of the family.
+ */
+
+#if defined(a29205)
+
+#define CPU_MODEL_NAME "a29205"
+#define A29K_HAS_FPU 0
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "AMD 29K"
+
+/*
+ * Some bits in the CPS:
+ */
+#define TD 0x20000
+#define DI 0x00002
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_A29K_h */
+/* end of include file */
diff --git a/c/src/exec/score/cpu/a29k/a29ktypes.h b/c/src/exec/score/cpu/a29k/a29ktypes.h
new file mode 100644
index 0000000000..c612a46b88
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/a29ktypes.h
@@ -0,0 +1,57 @@
+/* no_cputypes.h
+ *
+ * This include file contains type definitions pertaining to the Intel
+ * no_cpu processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __NO_CPU_TYPES_h
+#define __NO_CPU_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void no_cpu_isr;
+typedef void ( *no_cpu_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/a29k/amd.ah b/c/src/exec/score/cpu/a29k/amd.ah
new file mode 100644
index 0000000000..ceef89564a
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/amd.ah
@@ -0,0 +1,531 @@
+; /* @(#)amd.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Initialization values for registers after RESET
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+' /* $Id */
+;* File information and includes.
+
+ .file "amd.ah"
+ .ident "@(#)amd.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+
+;
+;* AMD PROCESSOR SPECIFIC VALUES...
+;
+
+;
+;* Processor revision levels...
+;
+
+; PRL values: 31-28 27-24
+; Am29000 0 x
+; Am29005 1 x
+; Am29050 2 x
+; Am29035 3 x
+; Am29030 4 x
+; Am29200 5 x
+; Am29205 5 1x
+; Am29240 6 0
+; Manx 7 0
+; Cougar 8 0
+
+
+ .equ AM29000_PRL, 0x00
+
+ .equ AM29005_PRL, 0x10
+
+ .equ AM29050_PRL, 0x20
+
+ .equ AM29035_PRL, 0x30
+
+ .equ AM29030_PRL, 0x40
+
+ .equ AM29200_PRL, 0x50
+
+ .equ AM29205_PRL, 0x58
+
+ .equ AM29240_PRL, 0x60
+
+ .equ AM29040_PRL, 0x70
+
+ .equ MANX_PRL, 0x70
+
+ .equ COUGAR_PRL, 0x80
+
+;
+;* data structures sizes.
+;
+ .equ CFGINFO_SIZE, 16*4
+
+ .equ PGMINFO_SIZE, 16*4
+
+ .equ VARARGS_SPACE, 16*4
+
+ .equ WINDOWSIZE, 0x80
+;
+;* Am29027 Mode registers
+;
+
+ .equ Am29027Mode1, 0x0fc00820
+
+ .equ Am29027Mode2, 0x00001375
+
+
+
+;* Processor Based Equates and Defines
+
+ .equ SIG_SYNC, -1
+
+ .equ ENABLE, (SM)
+
+ .equ DISABLE, (ENABLE | DI | DA)
+
+ .equ DISABLE_FZ, (FZ | ENABLE | DI | DA)
+
+ .equ CLR_TRAP, (FZ | DA)
+
+ .equ InitOPS, (TD | SM | (3<<IMShift) | DI | DA)
+
+ .equ InitCPS, (TD | SM | (0<<IMShift) | DI | DA)
+
+ .equ InitCPS1, (TD | SM | (0<<IMShift) | DI )
+
+ .equ CPS_TMR, (SM | (0<<IMShift) | DI)
+
+ .equ CPS_INT0, (TD | SM | (0<<IMShift))
+
+ .equ CPS_TMRINT0, (SM | (0<<IMShift))
+
+ .equ InitCFG, 0x0
+
+ .equ InitRBP, (B0|B1|B2|B3|B4|B5)
+
+ .equ TMC_VALUE, 0xFFFFFF
+
+ .equ TMR_VALUE, (IE | TMC_VALUE)
+
+
+
+
+
+
+;* 29205 specific (internal) peripheral initialization constants.
+
+; Current Processor Status (CPS) Register.
+; Old Processor Status Register (OPS).
+
+ .equ DA, 0x00001
+ .equ DI, 0x00002
+ .equ IMShift,0x2
+ .equ SM, 0x00010
+ .equ PI, 0x00020
+ .equ PD, 0x00040
+ .equ WM, 0x00080
+ .equ RE, 0x00100
+ .equ LK, 0x00200
+ .equ FZ, 0x00400
+ .equ TU, 0x00800
+ .equ TP, 0x01000
+ .equ TE, 0x02000
+ .equ IP, 0x04000
+ .equ CA, 0x08000
+ .equ MM, 0x10000
+ .equ TD, 0x20000
+
+; Configuration Register (CFG)
+
+ .equ CD, 0x01
+ .equ CP, 0x02
+ .equ BO, 0x04
+ .equ RV, 0x08
+ .equ VF, 0x10
+ .equ DW, 0x20
+ .equ CO, 0x40
+ .equ EE, 0x80
+ .equ IDShift, 8
+ .equ CFG_ID, 0x100
+ .equ ILShift, 9
+ .equ CFG_ILMask, 0x600
+ .equ DDShift, 11
+ .equ CFG_DD, 0x800
+ .equ DLShift, 12
+ .equ CFG_DLMask, 0x3000
+ .equ PCEShift, 14
+ .equ CFG_PCE, 0x4000
+ .equ PMBShift, 16
+ .equ D16, 0x8000
+ .equ TBOShift, 23
+ .equ PRLShift, 24
+
+; Channel Control Register (CHC)
+
+ .equ CV, 0x1
+ .equ NN, 0x2
+ .equ TRShift, 2
+ .equ TF, 0x400
+ .equ PER, 0x800
+ .equ LA, 0x1000
+ .equ ST, 0x2000
+ .equ ML, 0x4000
+ .equ LS, 0x8000
+ .equ CRShift, 16
+ .equ CNTLShift, 24
+ .equ CEShift, 31
+ .equ WBERShift, 31
+
+; Register Bank Protect (RBP)
+ .equ B0, 0x1
+ .equ B1, 0x2
+ .equ B2, 0x4
+ .equ B3, 0x8
+ .equ B4, 0x10
+ .equ B5, 0x20
+ .equ B6, 0x40
+ .equ B7, 0x80
+ .equ B8, 0x100
+ .equ B9, 0x200
+ .equ B10, 0x400
+ .equ B11, 0x800
+ .equ B12, 0x1000
+ .equ B13, 0x2000
+ .equ B14, 0x4000
+ .equ B15, 0x8000
+
+; Timer Counter
+
+ .equ TCVMask, 0xffffff
+
+; Timer Reload Register
+
+ .equ IE, 0x1000000
+ .equ IN, 0x2000000
+ .equ OV, 0x4000000
+ .equ TRVMAsk, 0xffffff
+
+; MMU Configuration
+
+ .equ PSShift, 8
+ .equ PS0Shift, 8
+ .equ PS1Shift, 12
+
+; LRU Recommendation (LRU)
+ .equ LRUMask, 0xff
+
+; Reason Vector (RSN)
+ .equ RSNMask, 0xff
+
+; Region Mapping Address (RMA0 | RMA1)
+ .equ PBAMask,0xffff
+ .equ VBAShift, 16
+
+; Region Mapping Control (RMC0 | RMC1)
+ .equ TIDMask, 0xff
+ .equ RMC_UE, 0x100
+ .equ RMC_UW, 0x200
+ .equ RMC_UR, 0x400
+ .equ RMC_SE, 0x800
+ .equ RMC_SW, 0x1000
+ .equ RMC_SR, 0x2000
+ .equ RMC_VE, 0x4000
+ .equ RMC_IO, 0x10000
+ .equ RGSShift, 17
+ .equ RMC_PGMShift, 22
+
+; Instruction breakpoint Control (IBC0 | IBC1)
+ .equ BPIDMask, 0xff
+ .equ BTE, 0x100
+ .equ BRM, 0x200
+ .equ IBC_BSY, 0x400
+ .equ BEN, 0x800
+ .equ BHO, 0x1000
+
+; Cache Data Register (CDR)
+ .equ CDR_US, 0x1
+ .equ P, 0x2
+ .equ CDR_V, 0x4
+ .equ IATAGShift, 20
+
+; Cache Interface Register (CIR)
+ .equ CPTRShift, 2
+ .equ CIR_RW, 0x1000000
+ .equ FSELShift, 28
+
+; Indirect Pointer A, B, C (IPA, IPB, IPC)
+ .equ IPShift, 2
+
+; ALU Status (ALU)
+ .equ FCMask, 0x1F
+ .equ BPShift, 5
+ .equ C, 0x80
+ .equ Z, 0x100
+ .equ N, 0x200
+ .equ ALU_V, 0x400
+ .equ DF, 0x800
+
+; Byte Pointer
+ .equ BPMask, 0x3
+
+; Load/Store Count Remaining (CR)
+ .equ CRMask, 0xff
+
+; Floating Point Environment (FPE)
+ .equ NM, 0x1
+ .equ RM, 0x2
+ .equ VM, 0x4
+ .equ UM, 0x8
+ .equ XM, 0x10
+ .equ DM, 0x20
+ .equ FRMShift, 6
+ .equ FF, 0x100
+ .equ ACFShift, 9
+
+; Integer Environment (INTE)
+ .equ MO, 0x1
+ .equ DO, 0x2
+
+; Floating Point Status (FPS)
+ .equ NS, 0x1
+ .equ RS, 0x2
+ .equ VS, 0x4
+ .equ FPS_US, 0x8
+ .equ XS, 0x10
+ .equ DS, 0x20
+ .equ NT, 0x100
+ .equ RT, 0x200
+ .equ VT, 0x400
+ .equ UT, 0x800
+ .equ XT, 0x1000
+ .equ DT, 0x2000
+
+; Exception Opcode (EXOP)
+ .equ IOPMask, 0xff
+
+; TLB Entry Word 0
+; .equ TIDMask, 0xff already defined above
+ .equ TLB_UE, 0x100
+ .equ TLB_UW, 0x200
+ .equ TLB_UR, 0x400
+ .equ TLB_SE, 0x800
+ .equ TLB_SW, 0x1000
+ .equ TLB_SR, 0x2000
+ .equ TLB_VE, 0x4000
+ .equ VTAGShift, 15
+
+; TLB Entry Word 1
+ .equ TLB_IO, 0x1
+ .equ U, 0x2
+ .equ TLB_PGMShift, 6
+ .equ RPNShift, 10
+
+; Am29200 ROM Control bits.
+ .equ RMCT_DW0Shift, 29
+ .equ RMCT_DW1Shift, 21
+ .equ RMCT_DW2Shift, 13
+ .equ RMCT_DW3Shift, 5
+
+; Am29200 DRAM Control bits.
+ .equ DW3, (1<<18)
+ .equ DW2, (1<<22)
+ .equ DW1, (1<<26)
+ .equ DW0, (1<<30)
+
+ ; Internal peripheral address assignments.
+ .equ RMCT, 0x80000000
+ .equ RMCF, 0x80000004
+ .equ DRCT, 0x80000008
+ .equ DRCF, 0x8000000C
+ .equ DRM0, 0x80000010
+ .equ DRM1, 0x80000014
+ .equ DRM2, 0x80000018
+ .equ DRM3, 0x8000001C
+ .equ PIACT0, 0x80000020
+ .equ PIACT1, 0x80000020
+ .equ ICT, 0x80000028
+ .equ DMCT0, 0x80000030
+ .equ DMAD0, 0x80000034
+ .ifdef revA
+ .equ TAD0, 0x80000036
+ .equ TCN0, 0x8000003A
+ .else
+ .equ TAD0, 0x80000070 ; default
+ .equ TCN0, 0x8000003C ; default
+ .endif
+ .equ DMCN0, 0x80000038
+ .equ DMCT1, 0x80000040
+ .equ DMAD1, 0x80000044
+ .equ DMCN1, 0x80000048
+ .equ SPCT, 0x80000080
+ .equ SPST, 0x80000084
+ .equ SPTH, 0x80000088
+ .equ SPRB, 0x8000008C
+ .equ BAUD, 0x80000090
+ .equ PPCT, 0x800000C0
+ .equ PPST, 0x800000C1
+ .equ PPDT, 0x800000C4
+ .equ POCT, 0x800000D0
+ .equ PIN, 0x800000D4
+ .equ POUT, 0x800000D8
+ .equ POEN, 0x800000DC
+ .equ VCT, 0x800000E0
+ .equ TOP, 0x800000E4
+ .equ SIDE, 0x800000E8
+ .equ VDT, 0x800000EC
+
+ ; Interrupt Controller Register bits.
+ .equ TXDI, (1<<5)
+ .equ RXDI, (1<<6)
+ .equ RXSI, (1<<7)
+ .equ PPI, (1<<11)
+ .equ DMA1I, (1<<13)
+ .equ DMA0I, (1<<14)
+ .equ IOPIMask, (0xFF<<16)
+ .equ VDI, (1<<27)
+ .equ ICT200_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+ .equ ICT205_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+
+ ; Serial port Initialization bits
+ .equ NO_PARITY, 0
+
+
+ ; SPST bits
+ .equ THREShift, 22
+
+;* REGISTER Addresses
+
+ .equ ROMCntlRegAddr, 0x80000000
+
+ .equ ROMCfgRegAddr, 0x80000004
+
+ .equ DRAMCntlRegAddr, 0x80000008
+
+ .equ DRAMCfgRegAddr, 0x8000000C
+
+ .equ DRAMMap0RegAddr, 0x80000010
+
+ .equ DRAMMap1RegAddr, 0x80000014
+
+ .equ DRAMMap2RegAddr, 0x80000018
+
+ .equ DRAMMap3RegAddr, 0x8000001C
+
+ .equ PIACntl0RegAddr, 0x80000020
+
+ .equ PIACntl1RegAddr, 0x80000024
+
+ .equ INTRCntlRegAddr, 0x80000028
+
+ .equ DMACntl0RegAddr, 0x80000030
+
+ .equ DMACntl1RegAddr, 0x80000040
+
+ .equ SERPortCntlRegAddr, 0x80000080
+
+ .equ SERPortStatRegAddr, 0x80000084
+
+ .equ SERPortTHLDRegAddr, 0x80000088
+
+ .equ SERPortRbufRegAddr, 0x8000008C
+
+ .equ SERPortBaudRegAddr, 0x80000090
+
+ .equ PARPortCntlRegAddr, 0x800000C0
+
+ .equ PIOCntlRegAddr, 0x800000D0
+
+ .equ PIOInpRegAddr, 0x800000D4
+
+ .equ PIOOutRegAddr, 0x800000D8
+
+ .equ PIOOutEnaRegAddr, 0x800000DC
+
+ .equ VCTCntlRegAddr, 0x800000E0
+
+;
+;* Control constants
+;
+
+;* AM29030 Timer related constants.
+
+ .equ TMR_IE, 0x01000000
+
+ .equ TMR_IN, 0x02000000
+
+ .equ TMR_OV, 0x04000000
+
+ .equ TMC_INITCNT, 1613
+
+;
+;* System initialization values.
+;
+
+ .equ __os_version, 0x0001 ;
+
+ .equ STACKSize, 0x8000 ;
+
+ .equ PGMExecMode, 0x0000 ;
+
+ .equ TSTCK_OFST, 28 * 4
+
+ .equ CSTCK_OFST, 29 * 4
+
+ .equ TMSTCK_OFST, 30 * 4
+
+ .equ CMSTCK_OFST, 31 * 4
+
+ .equ CTXSW_OK, 0xA55A ; ctx switch ok
+
+ .set NV_STARTOFST, 0x20 ; 32 bytes
+
+ .set NV_BAUDOFST, 0x00 ; 00 bytes
+
+ .set reg_cir, 29
+
+ .set reg_cdr, 30
+
+ .equ MSG_BUFSIZE, 0x1000 ; serial buffer size
+
+ .equ ILLOPTRAP, 0
+
+ .equ UATRAP, 1
+
+ .equ PVTRAP, 5
+
+ .equ UITLBMISSTRAP, 8
+
+ .equ UDTLBMISSTRAP, 9
+
+ .equ TIMERTRAP, 14
+
+ .equ TRACETRAP, 15
+
+ .equ XLINXTRAP, 16
+
+ .equ SERIALTRAP, 17
+
+ .equ SLOWTMRTRAP, 18
+
+ .equ PORTTRAP, 19
+
+ .equ SVSCTRAP, 80
+
+ .equ SVSCTRAP1, 81
+
+ .equ V_CACHETRAP, 66 ;
+
+ .equ V_SETSERVICE, 67 ;
+
+ .equ INIT_TIMER, 100
+
+ .equ DISABLE_TIMER, 101
+
+ .equ GET_TIMER, 102
+
+ .equ CLEAR_TIMER, 103
+
+ .equ V_SPILL, 64
+
+ .equ V_FILL, 65
+
+ .equ SIGDFL, 105
diff --git a/c/src/exec/score/cpu/a29k/asm.h b/c/src/exec/score/cpu/a29k/asm.h
new file mode 100644
index 0000000000..5622b124ce
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/asm.h
@@ -0,0 +1,103 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * !!! THIS FILE DOES NOT APPEAR TO HAVE BEEN USED IN THE 29K PORT !!!
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1989-1997
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __A29K_ASM_h
+#define __A29K_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/asm.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/exec/score/cpu/a29k/cpu.c b/c/src/exec/score/cpu/a29k/cpu.c
new file mode 100644
index 0000000000..df626a6371
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/cpu.c
@@ -0,0 +1,263 @@
+/*
+ * AMD 29K CPU Dependent Source
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+#ifndef lint
+static char _sccsid[] = "@(#)cpu.c 10/21/96 1.8\n";
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/thread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+void a29k_ISR_Handler(unsigned32 vector);
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)() /* ignored on this CPU */
+)
+{
+ unsigned int i;
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+
+ for ( i = 0; i < ISR_NUMBER_OF_VECTORS; i++ )
+ {
+ _ISR_Vector_table[i] = (proc_ptr)NULL;
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 cps;
+
+ /*
+ * This routine returns the current interrupt level.
+ */
+ cps = a29k_getops();
+ if (cps & (TD|DI))
+ return 1;
+ else
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+extern void intr14( void );
+extern void intr18( void );
+extern void intr19( void );
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+ switch( vector )
+ {
+ case 14:
+ _settrap( vector, intr14 );
+ break;
+ case 18:
+ _settrap( vector, intr18 );
+ break;
+ case 19:
+ _settrap( vector, intr19 );
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, new_handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+void _CPU_Internal_threads_Idle_thread_body( void )
+{
+
+ for( ; ; )
+ {
+ }
+ /* insert your "halt" instruction here */ ;
+}
+
+void a29k_fatal_error( unsigned32 error )
+{
+ printf("\n\nfatal error %d, rebooting!!!\n",error );
+ exit(error);
+}
+
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ */
+
+void a29k_ISR_Handler(unsigned32 vector)
+{
+ _ISR_Nest_level++;
+ _Thread_Dispatch_disable_level++;
+ if ( _ISR_Vector_table[ vector ] )
+ (*_ISR_Vector_table[ vector ])( vector );
+ --_Thread_Dispatch_disable_level;
+ --_ISR_Nest_level;
+ if ( !_Thread_Dispatch_disable_level && !_ISR_Nest_level &&
+ (_Context_Switch_necessary || _ISR_Signals_to_thread_executing ))
+ _Thread_Dispatch();
+ return;
+}
diff --git a/c/src/exec/score/cpu/a29k/cpu.h b/c/src/exec/score/cpu/a29k/cpu.h
new file mode 100644
index 0000000000..32c09def2c
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/cpu.h
@@ -0,0 +1,970 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the AMD 29K
+ * processor.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)cpu.h 10/21/96 1.11 */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/a29k.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/a29ktypes.h>
+#endif
+
+extern unsigned int a29k_disable( void );
+extern void a29k_enable( unsigned int cookie );
+extern unsigned int a29k_getops( void );
+extern void a29k_getops_sup( void );
+extern void a29k_disable_sup( void );
+extern void a29k_enable_sup( void );
+extern void a29k_disable_all( void );
+extern void a29k_disable_all_sup( void );
+extern void a29k_enable_all( void );
+extern void a29k_enable_all_sup( void );
+extern void a29k_halt( void );
+extern void a29k_fatal_error( unsigned32 error );
+extern void a29k_as70( void );
+extern void a29k_super_mode( void );
+extern void a29k_context_switch_sup(void);
+extern void a29k_context_restore_sup(void);
+extern void a29k_context_save_sup(void);
+extern void a29k_sigdfl_sup(void);
+
+/* conditional compilation parameters */
+
+/*
+ * Should the calls to _Thread_Enable_dispatch be inlined?
+ *
+ * If TRUE, then they are inlined.
+ * If FALSE, then a subroutine call is made.
+ *
+ * Basically this is an example of the classic trade-off of size
+ * versus speed. Inlining the call (TRUE) typically increases the
+ * size of RTEMS while speeding up the enabling of dispatching.
+ * [NOTE: In general, the _Thread_Dispatch_disable_level will
+ * only be 0 or 1 unless you are in an interrupt handler and that
+ * interrupt handler invokes the executive.] When not inlined
+ * something calls _Thread_Enable_dispatch which in turns calls
+ * _Thread_Dispatch. If the enable dispatch is inlined, then
+ * one subroutine call is avoided entirely.]
+ */
+
+#define CPU_INLINE_ENABLE_DISPATCH TRUE
+
+/*
+ * Should the body of the search loops in _Thread_queue_Enqueue_priority
+ * be unrolled one time? In unrolled each iteration of the loop examines
+ * two "nodes" on the chain being searched. Otherwise, only one node
+ * is examined per iteration.
+ *
+ * If TRUE, then the loops are unrolled.
+ * If FALSE, then the loops are not unrolled.
+ *
+ * The primary factor in making this decision is the cost of disabling
+ * and enabling interrupts (_ISR_Flash) versus the cost of rest of the
+ * body of the loop. On some CPUs, the flash is more expensive than
+ * one iteration of the loop body. In this case, it might be desirable
+ * to unroll the loop. It is important to note that on some CPUs, this
+ * code is the longest interrupt disable period in RTEMS. So it is
+ * necessary to strike a balance when setting this parameter.
+ */
+
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+
+/*
+ * Does RTEMS manage a dedicated interrupt stack in software?
+ *
+ * If TRUE, then a stack is allocated in _Interrupt_Manager_initialization.
+ * If FALSE, nothing is done.
+ *
+ * If the CPU supports a dedicated interrupt stack in hardware,
+ * then it is generally the responsibility of the BSP to allocate it
+ * and set it up.
+ *
+ * If the CPU does not support a dedicated interrupt stack, then
+ * the porter has two options: (1) execute interrupts on the
+ * stack of the interrupted task, and (2) have RTEMS manage a dedicated
+ * interrupt stack.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Does this CPU have hardware support for a dedicated interrupt stack?
+ *
+ * If TRUE, then it must be installed during initialization.
+ * If FALSE, then no installation is performed.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
+ *
+ * If TRUE, then the memory is allocated during initialization.
+ * If FALSE, then the memory is allocated during initialization.
+ *
+ * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE
+ * or CPU_INSTALL_HARDWARE_INTERRUPT_STACK is TRUE.
+ */
+
+#define CPU_ALLOCATE_INTERRUPT_STACK FALSE
+
+/*
+ * Does the CPU have hardware floating point?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
+ *
+ * If there is a FP coprocessor such as the i387 or mc68881, then
+ * the answer is TRUE.
+ *
+ * The macro name "NO_CPU_HAS_FPU" should be made CPU specific.
+ * It indicates whether or not this CPU model has FP support. For
+ * example, it would be possible to have an i386_nofp CPU model
+ * which set this to false to indicate that you have an i386 without
+ * an i387 and wish to leave floating point support out of RTEMS.
+ */
+
+#if ( A29K_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+/*
+ * Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
+ *
+ * So far, the only CPU in which this option has been used is the
+ * HP PA-RISC. The HP C compiler and gcc both implicitly use the
+ * floating point registers to perform integer multiplies. If
+ * a function which you would not think utilize the FP unit DOES,
+ * then one can not easily predict which tasks will use the FP hardware.
+ * In this case, this option should be TRUE.
+ *
+ * If CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
+ */
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+
+/*
+ * Should the IDLE task have a floating point context?
+ *
+ * If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
+ * and it has a floating point context which is switched in and out.
+ * If FALSE, then the IDLE task does not have a floating point context.
+ *
+ * Setting this to TRUE negatively impacts the time required to preempt
+ * the IDLE task from an interrupt because the floating point context
+ * must be saved as part of the preemption.
+ */
+
+#define CPU_IDLE_TASK_IS_FP FALSE
+
+/*
+ * Should the saving of the floating point registers be deferred
+ * until a context switch is made to another different floating point
+ * task?
+ *
+ * If TRUE, then the floating point context will not be stored until
+ * necessary. It will remain in the floating point registers and not
+ * disturned until another floating point task is switched to.
+ *
+ * If FALSE, then the floating point context is saved when a floating
+ * point task is switched out and restored when the next floating point
+ * task is restored. The state of the floating point registers between
+ * those two operations is not specified.
+ *
+ * If the floating point context does NOT have to be saved as part of
+ * interrupt dispatching, then it should be safe to set this to TRUE.
+ *
+ * Setting this flag to TRUE results in using a different algorithm
+ * for deciding when to save and restore the floating point context.
+ * The deferred FP switch algorithm minimizes the number of times
+ * the FP context is saved and restored. The FP context is not saved
+ * until a context switch is made to another, different FP task.
+ * Thus in a system with only one FP task, the FP context will never
+ * be saved or restored.
+ */
+
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+/*
+ * Does this port provide a CPU dependent IDLE task implementation?
+ *
+ * If TRUE, then the routine _CPU_Internal_threads_Idle_thread_body
+ * must be provided and is the default IDLE thread body instead of
+ * _Internal_threads_Idle_thread_body.
+ *
+ * If FALSE, then use the generic IDLE thread body if the BSP does
+ * not provide one.
+ *
+ * This is intended to allow for supporting processors which have
+ * a low power or idle mode. When the IDLE thread is executed, then
+ * the CPU can be powered down.
+ *
+ * The order of precedence for selecting the IDLE thread body is:
+ *
+ * 1. BSP provided
+ * 2. CPU dependent (if provided)
+ * 3. generic (if no BSP and no CPU dependent)
+ */
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY TRUE
+
+/*
+ * Does the stack grow up (toward higher addresses) or down
+ * (toward lower addresses)?
+ *
+ * If TRUE, then the grows upward.
+ * If FALSE, then the grows toward smaller addresses.
+ */
+
+#define CPU_STACK_GROWS_UP FALSE
+
+/*
+ * The following is the variable attribute used to force alignment
+ * of critical RTEMS structures. On some processors it may make
+ * sense to have these aligned on tighter boundaries than
+ * the minimum requirements of the compiler in order to have as
+ * much of the critical data area as possible in a cache line.
+ *
+ * The placement of this macro in the declaration of the variables
+ * is based on the syntactically requirements of the GNU C
+ * "__attribute__" extension. For example with GNU C, use
+ * the following to force a structures to a 32 byte boundary.
+ *
+ * __attribute__ ((aligned (32)))
+ *
+ * NOTE: Currently only the Priority Bit Map table uses this feature.
+ * To benefit from using this, the data must be heavily
+ * used so it will stay in the cache and used frequently enough
+ * in the executive to justify turning this on.
+ */
+
+#define CPU_STRUCTURE_ALIGNMENT
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ *
+ */
+
+#error "Check these definitions!!!"
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+/*
+ * The following defines the number of bits actually used in the
+ * interrupt field of the task mode. How those bits map to the
+ * CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
+ */
+
+#define CPU_MODES_INTERRUPT_MASK 0x00000001
+
+/*
+ * Processor defined structures
+ *
+ * Examples structures include the descriptor tables from the i386
+ * and the processor control structure on the i960ca.
+ */
+
+/* may need to put some structures here. */
+
+/*
+ * Contexts
+ *
+ * Generally there are 2 types of context to save.
+ * 1. Interrupt registers to save
+ * 2. Task level registers to save
+ *
+ * This means we have the following 3 context items:
+ * 1. task level context stuff:: Context_Control
+ * 2. floating point task stuff:: Context_Control_fp
+ * 3. special interrupt level context :: Context_Control_interrupt
+ *
+ * On some processors, it is cost-effective to save only the callee
+ * preserved registers during a task context switch. This means
+ * that the ISR code needs to save those registers which do not
+ * persist across function calls. It is not mandatory to make this
+ * distinctions between the caller/callee saves registers for the
+ * purpose of minimizing context saved during task switch and on interrupts.
+ * If the cost of saving extra registers is minimal, simplicity is the
+ * choice. Save the same context on interrupt entry as for tasks in
+ * this case.
+ *
+ * Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
+ * care should be used in designing the context area.
+ *
+ * On some CPUs with hardware floating point support, the Context_Control_fp
+ * structure will not be used or it simply consist of an array of a
+ * fixed number of bytes. This is done when the floating point context
+ * is dumped by a "FP save context" type instruction and the format
+ * is not really defined by the CPU. In this case, there is no need
+ * to figure out the exact format -- only the size. Of course, although
+ * this is enough information for RTEMS, it is probably not enough for
+ * a debugger such as gdb. But that is another problem.
+ */
+
+typedef struct {
+ unsigned32 signal;
+ unsigned32 gr1;
+ unsigned32 rab;
+ unsigned32 PC0;
+ unsigned32 PC1;
+ unsigned32 PC2;
+ unsigned32 CHA;
+ unsigned32 CHD;
+ unsigned32 CHC;
+ unsigned32 ALU;
+ unsigned32 OPS;
+ unsigned32 tav;
+ unsigned32 lr1;
+ unsigned32 rfb;
+ unsigned32 msp;
+
+ unsigned32 FPStat0;
+ unsigned32 FPStat1;
+ unsigned32 FPStat2;
+ unsigned32 IPA;
+ unsigned32 IPB;
+ unsigned32 IPC;
+ unsigned32 Q;
+
+ unsigned32 gr96;
+ unsigned32 gr97;
+ unsigned32 gr98;
+ unsigned32 gr99;
+ unsigned32 gr100;
+ unsigned32 gr101;
+ unsigned32 gr102;
+ unsigned32 gr103;
+ unsigned32 gr104;
+ unsigned32 gr105;
+ unsigned32 gr106;
+ unsigned32 gr107;
+ unsigned32 gr108;
+ unsigned32 gr109;
+ unsigned32 gr110;
+ unsigned32 gr111;
+
+ unsigned32 gr112;
+ unsigned32 gr113;
+ unsigned32 gr114;
+ unsigned32 gr115;
+
+ unsigned32 gr116;
+ unsigned32 gr117;
+ unsigned32 gr118;
+ unsigned32 gr119;
+ unsigned32 gr120;
+ unsigned32 gr121;
+ unsigned32 gr122;
+ unsigned32 gr123;
+ unsigned32 gr124;
+
+ unsigned32 local_count;
+
+ unsigned32 locals[128];
+} Context_Control;
+
+typedef struct {
+ double some_float_register;
+} Context_Control_fp;
+
+typedef struct {
+ unsigned32 special_interrupt_register;
+} CPU_Interrupt_frame;
+
+
+/*
+ * The following table contains the information required to configure
+ * the XXX processor specific parameters.
+ *
+ * NOTE: The interrupt_stack_size field is required if
+ * CPU_ALLOCATE_INTERRUPT_STACK is defined as TRUE.
+ *
+ * The pretasking_hook, predriver_hook, and postdriver_hook,
+ * and the do_zero_of_workspace fields are required on ALL CPUs.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_system_initialization_stack;
+ unsigned32 some_other_cpu_dependent_info;
+} rtems_cpu_table;
+
+/*
+ * This variable is optional. It is used on CPUs on which it is difficult
+ * to generate an "uninitialized" FP context. It is filled in by
+ * _CPU_Initialize and copied into the task's FP context area during
+ * _CPU_Context_Initialize.
+ */
+
+EXTERN Context_Control_fp _CPU_Null_fp_context;
+
+/*
+ * On some CPUs, RTEMS supports a software managed interrupt stack.
+ * This stack is allocated by the Interrupt Manager and the switch
+ * is performed in _ISR_Handler. These variables contain pointers
+ * to the lowest and highest addresses in the chunk of memory allocated
+ * for the interrupt stack. Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent
+ * code the option of picking the version it wants to use.
+ *
+ * NOTE: These two variables are required if the macro
+ * CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+ */
+
+EXTERN void *_CPU_Interrupt_stack_low;
+EXTERN void *_CPU_Interrupt_stack_high;
+
+/*
+ * With some compilation systems, it is difficult if not impossible to
+ * call a high-level language routine from assembly language. This
+ * is especially true of commercial Ada compilers and name mangling
+ * C++ ones. This variable can be optionally defined by the CPU porter
+ * and contains the address of the routine _Thread_Dispatch. This
+ * can make it easier to invoke that routine at the end of the interrupt
+ * sequence (if a dispatch is necessary).
+ */
+
+EXTERN void (*_CPU_Thread_dispatch_pointer)();
+
+/*
+ * Nothing prevents the porter from declaring more CPU specific variables.
+ */
+
+/* XXX: if needed, put more variables here */
+
+/*
+ * The size of the floating point context area. On some CPUs this
+ * will not be a "sizeof" because the format of the floating point
+ * area is not defined -- only the size is. This is usually on
+ * CPUs with a "floating point save context" instruction.
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/*
+ * Amount of extra stack (above minimum stack size) required by
+ * system initialization thread. Remember that in a multiprocessor
+ * system the system intialization thread becomes the MP server thread.
+ */
+
+#define CPU_SYSTEM_INITIALIZATION_THREAD_EXTRA_STACK 0
+
+/*
+ * This defines the number of entries in the ISR_Vector_table managed
+ * by RTEMS.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 256
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Should be large enough to run all RTEMS tests. This insures
+ * that a "reasonable" small application should not have any problems.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE (8192)
+
+/*
+ * CPU's worst alignment requirement for data types on a byte boundary. This
+ * alignment does not take into account the requirements for the stack.
+ */
+
+#define CPU_ALIGNMENT 4
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * heap handler. This alignment requirement may be stricter than that
+ * for the data types alignment specified by CPU_ALIGNMENT. It is
+ * common for the heap to follow the same alignment requirement as
+ * CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict enough for the heap,
+ * then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for memory
+ * buffers allocated by the partition manager. This alignment requirement
+ * may be stricter than that for the data types alignment specified by
+ * CPU_ALIGNMENT. It is common for the partition to follow the same
+ * alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict
+ * enough for the partition, then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * stack. This alignment requirement may be stricter than that for the
+ * data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
+ * is strict enough for the stack, then this should be set to 0.
+ *
+ * NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
+ */
+
+#define CPU_STACK_ALIGNMENT 0
+
+/* ISR handler macros */
+
+/*
+ * Disable all interrupts for an RTEMS critical section. The previous
+ * level is returned in _level.
+ */
+
+#define _CPU_ISR_Disable( _isr_cookie ) \
+ do{ _isr_cookie = a29k_disable(); }while(0)
+
+/*
+ * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
+ * This indicates the end of an RTEMS critical section. The parameter
+ * _level is not modified.
+ */
+
+#define _CPU_ISR_Enable( _isr_cookie ) \
+ do{ a29k_enable(_isr_cookie) ; }while(0)
+
+/*
+ * This temporarily restores the interrupt to _level before immediately
+ * disabling them again. This is used to divide long RTEMS critical
+ * sections into two or more parts. The parameter _level is not
+ * modified.
+ */
+
+#define _CPU_ISR_Flash( _isr_cookie ) \
+ do{ \
+ _CPU_ISR_Enable( _isr_cookie ); \
+ _CPU_ISR_Disable( _isr_cookie ); \
+ }while(0)
+
+/*
+ * Map interrupt level in task mode onto the hardware that the CPU
+ * actually provides. Currently, interrupt levels which do not
+ * map onto the CPU in a generic fashion are undefined. Someday,
+ * it would be nice if these were "mapped" by the application
+ * via a callout. For example, m68k has 8 levels 0 - 7, levels
+ * 8 - 255 would be available for bsp/application specific meaning.
+ * This could be used to manage a programmable interrupt controller
+ * via the rtems_task_mode directive.
+ */
+
+#define _CPU_ISR_Set_level( new_level ) \
+ do{ \
+ if ( new_level ) a29k_disable_all(); \
+ else a29k_enable_all(); \
+ }while(0);
+
+/* end of ISR handler macros */
+
+/* Context handler macros */
+
+extern void _CPU_Context_save(
+ Context_Control *new_context
+);
+
+/*
+ * Initialize the context to a state suitable for starting a
+ * task after a context restore operation. Generally, this
+ * involves:
+ *
+ * - setting a starting address
+ * - preparing the stack
+ * - preparing the stack and frame pointers
+ * - setting the proper interrupt level in the context
+ * - initializing the floating point context
+ *
+ * This routine generally does not set any unnecessary register
+ * in the context. The state of the "general data" registers is
+ * undefined at task start time.
+ *
+ * NOTE: This is_fp parameter is TRUE if the thread is to be a floating
+ * point thread. This is typically only used on CPUs where the
+ * FPU may be easily disabled by software such as on the SPARC
+ * where the PSR contains an enable FPU bit.
+ */
+
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point, _is_fp ) \
+ do{ /* allocate 1/4 of stack for memory stack, 3/4 of stack for register stack */ \
+ unsigned32 _mem_stack_tmp = (unsigned32)(_stack_base) + (_size); \
+ unsigned32 _reg_stack_tmp = (unsigned32)(_stack_base) + (((_size)*3)/4); \
+ _mem_stack_tmp &= ~(CPU_ALIGNMENT-1); \
+ _reg_stack_tmp &= ~(CPU_ALIGNMENT-1); \
+ _CPU_Context_save(_the_context); \
+ (_the_context)->msp = _mem_stack_tmp; /* gr125 */ \
+ (_the_context)->lr1 = \
+ (_the_context)->locals[1] = \
+ (_the_context)->rfb = _reg_stack_tmp; /* gr127 */ \
+ (_the_context)->gr1 = _reg_stack_tmp - 4 * 4; \
+ (_the_context)->rab = _reg_stack_tmp - 128 * 4; /* gr126 */ \
+ (_the_context)->local_count = 1-1; \
+ (_the_context)->PC1 = _entry_point; \
+ (_the_context)->PC0 = (unsigned32)((char *)_entry_point + 4); \
+ if (_isr) { (_the_context)->OPS |= (TD | DI); } \
+ else \
+ { (_the_context)->OPS &= ~(TD | DI); } \
+ }while(0)
+
+/*
+ * This routine is responsible for somehow restarting the currently
+ * executing task. If you are lucky, then all that is necessary
+ * is restoring the context. Otherwise, there will need to be
+ * a special assembly routine which does something special in this
+ * case. Context_Restore should work most of the time. It will
+ * not work if restarting self conflicts with the stack frame
+ * assumptions of restoring a context.
+ */
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) )
+
+/*
+ * The purpose of this macro is to allow the initial pointer into
+ * a floating point context area (used to save the floating point
+ * context) to be at an arbitrary place in the floating point
+ * context area.
+ *
+ * This is necessary because some FP units are designed to have
+ * their context saved as a stack which grows into lower addresses.
+ * Other FP units can be saved by simply moving registers into offsets
+ * from the base of the context area. Finally some FP units provide
+ * a "dump context" instruction which could fill in from high to low
+ * or low to high based on the whim of the CPU designers.
+ */
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (char *) (_base) + (_offset) )
+
+/*
+ * This routine initializes the FP context area passed to it to.
+ * There are a few standard ways in which to initialize the
+ * floating point context. The code included for this macro assumes
+ * that this is a CPU in which a "initial" FP context was saved into
+ * _CPU_Null_fp_context and it simply copies it to the destination
+ * context passed to it.
+ *
+ * Other models include (1) not doing anything, and (2) putting
+ * a "null FP status word" in the correct place in the FP context.
+ */
+
+#define _CPU_Context_Initialize_fp( _destination ) \
+ do { \
+ *((Context_Control_fp *) *((void **) _destination)) = _CPU_Null_fp_context; \
+ } while(0)
+
+/* end of Context handler macros */
+
+/* Fatal Error manager macros */
+
+/*
+ * This routine copies _error into a known place -- typically a stack
+ * location or a register, optionally disables interrupts, and
+ * halts/stops the CPU.
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ a29k_fatal_error(_error)
+
+/* end of Fatal Error manager macros */
+
+/* Bitfield handler macros */
+
+/*
+ * This routine sets _output to the bit number of the first bit
+ * set in _value. _value is of CPU dependent type Priority_Bit_map_control.
+ * This type may be either 16 or 32 bits wide although only the 16
+ * least significant bits will be used.
+ *
+ * There are a number of variables in using a "find first bit" type
+ * instruction.
+ *
+ * (1) What happens when run on a value of zero?
+ * (2) Bits may be numbered from MSB to LSB or vice-versa.
+ * (3) The numbering may be zero or one based.
+ * (4) The "find first bit" instruction may search from MSB or LSB.
+ *
+ * RTEMS guarantees that (1) will never happen so it is not a concern.
+ * (2),(3), (4) are handled by the macros _CPU_Priority_mask() and
+ * _CPU_Priority_bits_index(). These three form a set of routines
+ * which must logically operate together. Bits in the _value are
+ * set and cleared based on masks built by _CPU_Priority_mask().
+ * The basic major and minor values calculated by _Priority_Major()
+ * and _Priority_Minor() are "massaged" by _CPU_Priority_bits_index()
+ * to properly range between the values returned by the "find first bit"
+ * instruction. This makes it possible for _Priority_Get_highest() to
+ * calculate the major and directly index into the minor table.
+ * This mapping is necessary to ensure that 0 (a high priority major/minor)
+ * is the first bit found.
+ *
+ * This entire "find first bit" and mapping process depends heavily
+ * on the manner in which a priority is broken into a major and minor
+ * components with the major being the 4 MSB of a priority and minor
+ * the 4 LSB. Thus (0 << 4) + 0 corresponds to priority 0 -- the highest
+ * priority. And (15 << 4) + 14 corresponds to priority 254 -- the next
+ * to the lowest priority.
+ *
+ * If your CPU does not have a "find first bit" instruction, then
+ * there are ways to make do without it. Here are a handful of ways
+ * to implement this in software:
+ *
+ * - a series of 16 bit test instructions
+ * - a "binary search using if's"
+ * - _number = 0
+ * if _value > 0x00ff
+ * _value >>=8
+ * _number = 8;
+ *
+ * if _value > 0x0000f
+ * _value >=8
+ * _number += 4
+ *
+ * _number += bit_set_table[ _value ]
+ *
+ * where bit_set_table[ 16 ] has values which indicate the first
+ * bit set
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ (_output) = 0; /* do something to prevent warnings */ \
+ }
+
+#endif
+
+/* end of Bitfield handler macros */
+
+/*
+ * This routine builds the mask which corresponds to the bit fields
+ * as searched by _CPU_Bitfield_Find_first_bit(). See the discussion
+ * for that routine.
+ */
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 1 << (_bit_number) )
+
+#endif
+
+/*
+ * This routine translates the bit numbers returned by
+ * _CPU_Bitfield_Find_first_bit() into something suitable for use as
+ * a major or minor component of a priority. See the discussion
+ * for that routine.
+ */
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+#endif
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)()
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Install_interrupt_stack
+ *
+ * This routine installs the hardware interrupt stack pointer.
+ *
+ * NOTE: It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
+ * is TRUE.
+ */
+
+void _CPU_Install_interrupt_stack( void );
+
+/*
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * This routine is the CPU dependent IDLE thread body.
+ *
+ * NOTE: It need only be provided if CPU_PROVIDES_IDLE_THREAD_BODY
+ * is TRUE.
+ */
+
+void _CPU_Internal_threads_Idle_thread_body( void );
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+/* The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version will work on any processor, but if there is a better
+ * way for your CPU PLEASE use it. The most common way to do this is to:
+ *
+ * swap least significant two bytes with 16-bit rotate
+ * swap upper and lower 16-bits
+ * swap most significant two bytes with 16-bit rotate
+ *
+ * Some CPUs have special instructions which swap a 32-bit quantity in
+ * a single instruction (e.g. i486). It is probably best to avoid
+ * an "endian swapping control bit" in the CPU. One good reason is
+ * that interrupts would probably have to be disabled to insure that
+ * an interrupt does not try to access the same "chunk" with the wrong
+ * endian. Another good reason is that on some CPUs, the endian bit
+ * endianness for ALL fetches -- both code and data -- so the code
+ * will be fetched incorrectly.
+ */
+
+#define CPU_swap_u32( value ) \
+ ((value&0xff) << 24) | (((value >> 8)&0xff) << 16) | (((value >> 16)&0xff) << 8) | ((value>>24)&0xff)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/exec/score/cpu/a29k/cpu_asm.h b/c/src/exec/score/cpu/a29k/cpu_asm.h
new file mode 100644
index 0000000000..03c813dc09
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/cpu_asm.h
@@ -0,0 +1,71 @@
+/*
+ * cpu_asm.h
+ *
+ * Very loose template for an include file for the cpu_asm.? file
+ * if it is implemented as a ".S" file (preprocessed by cpp) instead
+ * of a ".s" file (preprocessed by gm4 or gasp).
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+/* @(#)cpu_asm.h 06/08/96 1.2 */
+
+#ifndef __CPU_ASM_h
+#define __CPU_ASM_h
+
+/* pull in the generated offsets */
+
+/* #include <rtems/score/offsets.h> */
+
+/*
+ * Hardware General Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Floating Point Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Control Registers
+ */
+
+/* put something here */
+
+/*
+ * Calling Convention
+ */
+
+/* put something here */
+
+/*
+ * Temporary registers
+ */
+
+/* put something here */
+
+/*
+ * Floating Point Registers - SW Conventions
+ */
+
+/* put something here */
+
+/*
+ * Temporary floating point registers
+ */
+
+/* put something here */
+
+#endif
+
+/* end of file */
diff --git a/c/src/exec/score/cpu/a29k/cpu_asm.s b/c/src/exec/score/cpu/a29k/cpu_asm.s
new file mode 100644
index 0000000000..d95950b974
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/cpu_asm.s
@@ -0,0 +1,491 @@
+;/* cpu_asm.c ===> cpu_asm.S or cpu_asm.s
+; *
+; * Author: Craig Lebakken <craigl@transition.com>
+; *
+; * COPYRIGHT (c) 1996 by Transition Networks Inc.
+; *
+; * To anyone who acknowledges that this file is provided "AS IS"
+; * without any express or implied warranty:
+; * permission to use, copy, modify, and distribute this file
+; * for any purpose is hereby granted without fee, provided that
+; * the above copyright notice and this notice appears in all
+; * copies, and that the name of Transition Networks not be used in
+; * advertising or publicity pertaining to distribution of the
+; * software without specific, written prior permission.
+; * Transition Networks makes no representations about the suitability
+; * of this software for any purpose.
+; *
+; *
+; * This file contains the basic algorithms for all assembly code used
+; * in an specific CPU port of RTEMS. These algorithms must be implemented
+; * in assembly language
+; *
+; * NOTE: This is supposed to be a .S or .s file NOT a C file.
+; *
+; * COPYRIGHT (c) 1989-1997.
+; * On-Line Applications Research Corporation (OAR).
+; * Copyright assigned to U.S. Government, 1994.
+; *
+; * The license and distribution terms for this file may in
+; * the file LICENSE in this distribution or at
+; * http://www.OARcorp.com/rtems/license.html.
+; *
+; * $Id$
+; */
+
+;/*
+; * This is supposed to be an assembly file. This means that system.h
+; * and cpu.h should not be included in a "real" cpu_asm file. An
+; * implementation in assembly should include "cpu_asm.h>
+; */
+
+;#include <cpu_asm.h>
+ .include "register.ah"
+ .include "amd.ah"
+ .include "pswmacro.ah"
+; .extern _bsp_exit
+;
+; push a register onto the struct
+ .macro spush, sp, reg
+ store 0, 0, reg, sp ; push register
+ add sp, sp, 4 ; adjust stack pointer
+ .endm
+; push a register onto the struct
+ .macro spushsr, sp, reg, sr
+ mfsr reg, sr
+ store 0, 0, reg, sp ; push register
+ add sp, sp, 4 ; adjust stack pointer
+ .endm
+; pop a register from the struct
+ .macro spop, reg, sp
+ load 0, 0, reg, sp
+ add sp,sp,4
+ .endm
+; pop a special register from the struct
+ .macro spopsr, sreg, reg, sp
+ load 0, 0, reg, sp
+ mtsr sreg, reg
+ add sp,sp,4
+ .endm
+;
+;/*
+; * _CPU_Context_save_fp_context
+; *
+; * This routine is responsible for saving the FP context
+; * at *fp_context_ptr. If the point to load the FP context
+; * from is changed then the pointer is modified by this routine.
+; *
+; * Sometimes a macro implementation of this is in cpu.h which dereferences
+; * the ** and a similarly named routine in this file is passed something
+; * like a (Context_Control_fp *). The general rule on making this decision
+; * is to avoid writing assembly language.
+; */
+
+;#if 0
+;void _CPU_Context_save_fp(
+; void **fp_context_ptr
+;)
+;{
+;}
+;#endif
+ .global _CPU_Context_save_fp
+_CPU_Context_save_fp:
+ jmpi lr0
+ nop
+
+;/*
+; * _CPU_Context_restore_fp_context
+; *
+; * This routine is responsible for restoring the FP context
+; * at *fp_context_ptr. If the point to load the FP context
+; * from is changed then the pointer is modified by this routine.
+; *
+; * Sometimes a macro implementation of this is in cpu.h which dereferences
+; * the ** and a similarly named routine in this file is passed something
+; * like a (Context_Control_fp *). The general rule on making this decision
+; * is to avoid writing assembly language.
+; */
+
+;#if 0
+;void _CPU_Context_restore_fp(
+; void **fp_context_ptr
+;)
+;{
+;}
+;#endif
+ .global __CPU_Context_restore_fp
+__CPU_Context_restore_fp:
+ jmpi lr0
+ nop
+
+;/* _CPU_Context_switch
+; *
+; * This routine performs a normal non-FP context switch.
+; */
+;#if 0
+;void _CPU_Context_switch(
+; Context_Control *run,
+; Context_Control *heir
+;)
+;{
+;}
+;#endif
+ .global __CPU_Context_switch
+__CPU_Context_switch:
+ asneq 106, gr1, gr1 ; syscall
+ jmpi lr0 ;
+ nop ;
+
+
+
+ .global _a29k_context_switch_sup
+_a29k_context_switch_sup:
+ add pcb,lr2,0
+ add kt1,lr3,0 ;move heir pointer to safe location
+ constn it0,SIG_SYNC
+ spush pcb,it0
+ spush pcb,gr1
+ spush pcb,rab ;push rab
+ spushsr pcb,it0,pc0 ;push specials
+ spushsr pcb,it0,pc1
+ add pcb,pcb,1*4 ;space pc2
+ spushsr pcb,it0,CHA ;push CHA
+ spushsr pcb,it0,CHD ;push CHD
+ spushsr pcb,it0,CHC ;push CHC
+ add pcb,pcb,1*4 ;space for alu
+ spushsr pcb,it0,ops ;push OPS
+ mfsr kt0,cps ;current status
+ const it1,FZ ;FZ constant
+ andn it1,kt0,it1 ;clear FZ bit
+ mtsr cps,it1 ;cps without FZ
+ add pcb,pcb,1*4 ;space for tav
+ mtsrim chc,0 ;possible DERR
+;
+ spush pcb,lr1 ;push R-stack
+ spush pcb,rfb ; support
+ spush pcb,msp ;push M-stack pnt.
+;
+ add pcb,pcb,3*4 ;space for floating point
+; spush pcb,FPStat0 ;floating point
+; spush pcb,FPStat1
+; spush pcb,FPStat2
+;
+ add pcb,pcb,4*4 ;space for IPA..Q
+;
+ mtsrim cr,29-1
+ storem 0,0,gr96,pcb ;push gr96-124, optional
+ add pcb,pcb,29*4 ;space for gr96-124
+;
+ sub it0,rfb,gr1 ;get bytes in cache
+ srl it0,it0,2 ;adjust to words
+ sub it0,it0,1
+ spush pcb,it0
+ mtsr cr,it0
+ storem 0,0,lr0,pcb ;save lr0-rfb
+;
+context_restore:
+ add pcb,kt1,0 ;pcb=heir
+ add pcb,pcb,4 ;space for signal num
+ spop gr1,pcb ;restore freeze registers
+ add gr1,gr1,0 ;alu op
+ add pcb,pcb,9*4 ;move past freeze registers
+ add pcb,pcb,1*4 ;space for tav
+ spop lr1,pcb
+ spop rfb,pcb
+ spop msp,pcb
+; spop FPStat0,pcb
+; spop FPStat1,pcb
+; spop FPStat2,pcb
+ add pcb,pcb,3*4 ;space for floating point
+ add pcb,pcb,4*4 ;space for IPA..Q
+ mtsrim cr,29-1
+ loadm 0,0,gr96,pcb ;pop gr96-gr124
+ add pcb,pcb,29*4 ;space for gr96-124
+
+ spop it1,pcb ;pop locals count
+ mtsr cr,it1
+ loadm 0,0,lr0,pcb ;load locals
+
+ add pcb,kt1,0 ;pcb=heir
+ mtsr cps,kt0 ;cps with FZ
+ nop
+ add pcb,pcb,4 ;space for signal num
+ spop gr1,pcb ;restore freeze registers
+ add gr1,gr1,0 ;alu op
+ spop rab,pcb
+ spopsr pc0,it1,pcb
+ spopsr pc1,it1,pcb
+ add pcb,pcb,4 ;space for pc2
+ spopsr CHA,it1,pcb
+ spopsr CHD,it1,pcb
+ spopsr CHC,it1,pcb
+ add pcb,pcb,4 ;space for alu
+ spopsr ops,it1,pcb
+ nop
+ iret
+
+
+;/*
+; * _CPU_Context_restore
+; *
+; * This routine is generallu used only to restart self in an
+; * efficient manner. It may simply be a label in _CPU_Context_switch.
+; *
+; * NOTE: May be unnecessary to reload some registers.
+; */
+;#if 0
+;void _CPU_Context_restore(
+; Context_Control *new_context
+;)
+;{
+;}
+;#endif
+
+ .global __CPU_Context_restore
+__CPU_Context_restore:
+ asneq 107, gr1, gr1 ; syscall
+ jmpi lr0 ;
+ nop ;
+
+ .global _a29k_context_restore_sup
+_a29k_context_restore_sup:
+ add kt1,lr2,0 ;kt1 = restore context
+ mfsr kt0,cps ;current status
+ const it1,FZ ;FZ constant
+ andn it1,kt0,it1 ;clear FZ bit
+ mtsr cps,it1 ;cps without FZ
+ jmp context_restore
+ nop
+
+ .global _a29k_context_save_sup
+_a29k_context_save_sup:
+ add pcb,lr2,0
+ constn it0,SIG_SYNC
+ spush pcb,it0
+ spush pcb,gr1
+ spush pcb,rab ;push rab
+ spushsr pcb,it0,pc0 ;push specials
+ spushsr pcb,it0,pc1
+ add pcb,pcb,1*4 ;space pc2
+ spushsr pcb,it0,CHA ;push CHA
+ spushsr pcb,it0,CHD ;push CHD
+ spushsr pcb,it0,CHC ;push CHC
+ add pcb,pcb,1*4 ;space for alu
+ spushsr pcb,it0,ops ;push OPS
+ mfsr it0,cps ;current status
+SaveFZState it1,it2
+ add pcb,pcb,1*4 ;space for tav
+ mtsrim chc,0 ;possible DERR
+;
+ spush pcb,lr1 ;push R-stack
+ spush pcb,rfb ; support
+ spush pcb,msp ;push M-stack pnt.
+;
+ spush pcb,FPStat0 ;floating point
+ spush pcb,FPStat1
+ spush pcb,FPStat2
+;
+ add pcb,pcb,4*4 ;space for IPA..Q
+;
+ mtsrim cr,29-1
+ storem 0,0,gr96,pcb ;push gr96-124, optional
+ add pcb,pcb,29*4 ;space for gr96-124
+;
+ sub kt0,rfb,gr1 ;get bytes in cache
+ srl kt0,kt0,2 ;adjust to words
+ sub kt0,kt0,1
+ spush pcb,kt0 ;push number of words
+ mtsr cr,kt0
+ storem 0,0,lr0,pcb ;save lr0-rfb
+;
+ mtsr cps,it0 ;cps with FZ
+RestoreFZState it1,it2
+
+ nop
+ nop
+ nop
+;
+ iret
+;
+
+ .global __CPU_Context_save
+__CPU_Context_save:
+ asneq 108, gr1, gr1 ; syscall
+ jmpi lr0 ;
+ nop ;
+
+
+;/* void __ISR_Handler()
+; *
+; * This routine provides the RTEMS interrupt management.
+; *
+; */
+
+;#if 0
+;void _ISR_Handler()
+;{
+; /*
+; * This discussion ignores a lot of the ugly details in a real
+; * implementation such as saving enough registers/state to be
+; * able to do something real. Keep in mind that the goal is
+; * to invoke a user's ISR handler which is written in C and
+; * uses a certain set of registers.
+; *
+; * Also note that the exact order is to a large extent flexible.
+; * Hardware will dictate a sequence for a certain subset of
+; * _ISR_Handler while requirements for setting
+; */
+
+; /*
+; * At entry to "common" _ISR_Handler, the vector number must be
+; * available. On some CPUs the hardware puts either the vector
+; * number or the offset into the vector table for this ISR in a
+; * known place. If the hardware does not give us this information,
+; * then the assembly portion of RTEMS for this port will contain
+; * a set of distinct interrupt entry points which somehow place
+; * the vector number in a known place (which is safe if another
+; * interrupt nests this one) and branches to _ISR_Handler.
+; *
+; * save some or all context on stack
+; * may need to save some special interrupt information for exit
+; *
+; * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+; * if ( _ISR_Nest_level == 0 )
+; * switch to software interrupt stack
+; * #endif
+; *
+; * _ISR_Nest_level++;
+; *
+; * _Thread_Dispatch_disable_level++;
+; *
+; * (*_ISR_Vector_table[ vector ])( vector );
+; *
+; * --_ISR_Nest_level;
+; *
+; * if ( _ISR_Nest_level )
+; * goto the label "exit interrupt (simple case)"
+; *
+; * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+; * restore stack
+; * #endif
+; *
+; * if ( !_Context_Switch_necessary )
+; * goto the label "exit interrupt (simple case)"
+; *
+; * if ( !_ISR_Signals_to_thread_executing )
+; * goto the label "exit interrupt (simple case)"
+; *
+; * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+; *
+; * prepare to get out of interrupt
+; * return from interrupt (maybe to _ISR_Dispatch)
+; *
+; * LABEL "exit interrupt (simple case):
+; * prepare to get out of interrupt
+; * return from interrupt
+; */
+;}
+;#endif
+; .global __ISR_Handler
+;__ISR_Handler:
+; jmpi lr0
+; nop
+
+ .global _a29k_getops
+_a29k_getops:
+ asneq 113, gr96, gr96
+ jmpi lr0
+ nop
+
+ .global _a29k_getops_sup
+_a29k_getops_sup:
+ mfsr gr96, ops ; caller wants ops
+ iret
+ nop
+
+ .global _a29k_disable
+_a29k_disable:
+ asneq 110, gr96, gr96
+ jmpi lr0
+ nop
+
+ .global _a29k_disable_sup
+_a29k_disable_sup:
+ mfsr kt0, ops
+ add gr96, kt0, 0 ; return ops to caller
+ const kt1, (DI | TD)
+ consth kt1, (DI | TD)
+ or kt1, kt0, kt1
+ mtsr ops, kt1
+ iret
+ nop
+
+ .global _a29k_disable_all
+_a29k_disable_all:
+ asneq 112, gr96, gr96
+ jmpi lr0
+ nop
+
+ .global _a29k_disable_all_sup
+_a29k_disable_all_sup:
+ mfsr kt0, ops
+ const kt1, (DI | TD)
+ consth kt1, (DI | TD)
+ or kt1, kt0, kt1
+ mtsr ops, kt1
+ iret
+ nop
+
+ .global _a29k_enable_all
+_a29k_enable_all:
+ asneq 111, gr96, gr96
+ jmpi lr0
+ nop
+
+ .global _a29k_enable_all_sup
+_a29k_enable_all_sup:
+ mfsr kt0, ops
+ const kt1, (DI | TD)
+ consth kt1, (DI | TD)
+ andn kt1, kt0, kt1
+ mtsr ops, kt1
+ iret
+ nop
+
+ .global _a29k_enable
+_a29k_enable:
+ asneq 109, gr96, gr96
+ jmpi lr0
+ nop
+
+ .global _a29k_enable_sup
+_a29k_enable_sup:
+ mfsr kt0, ops
+ const kt1, (DI | TD)
+ consth kt1, (DI | TD)
+ and kt3, lr2, kt1
+ andn kt0, kt0, kt1
+ or kt1, kt0, kt3
+ mtsr ops, kt1
+ iret
+ nop
+
+ .global _a29k_halt
+_a29k_halt:
+ halt
+ jmp _a29k_halt
+ nop
+
+ .global _a29k_super_mode
+_a29k_super_mode:
+ mfsr gr96, ops
+ or gr96, gr96, 0x10
+ mtsr ops, gr96
+ iret
+ nop
+
+ .global _a29k_as70
+_a29k_as70:
+ asneq 70,gr96,gr96
+ jmpi lr0
+ nop
diff --git a/c/src/exec/score/cpu/a29k/pswmacro.ah b/c/src/exec/score/cpu/a29k/pswmacro.ah
new file mode 100644
index 0000000000..c21eee4f35
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/pswmacro.ah
@@ -0,0 +1,442 @@
+; /* @(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; macros: Do_install and init_TLB
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+
+;* File information and includes.
+
+ .file "macro.ah"
+ .ident "@(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+ .macro CONST32, RegName, RegValue
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endm
+
+ .macro CONSTX, RegName, RegValue
+ .if (RegValue) <= 0x0000ffff
+ const RegName, RegValue
+ .else
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endif
+ .endm
+
+ .macro PRODEV, RegName
+ srl RegName, RegName, 24
+ .endm
+
+;
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+;
+
+;* Assumes vector table address in v0
+
+ .macro _setvec, trapnum, trapaddr
+ mfsr v0, vab ;
+ const v2, trapnum ;
+ sll v1, v2, 2 ;
+ add v1, v1, v0 ; v0 has location of vector tab
+
+ const v2, trapaddr ;
+ consth v2, trapaddr ;
+ store 0, 0, v2, v1 ;
+ nop ;
+ .endm
+
+ .macro syscall, name
+ const tav, HIF_@name ;
+ asneq V_SYSCALL, gr1, gr1 ;
+ nop ;
+ nop ;
+ .endm
+
+
+
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+
+ .macro Do_Install, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_Install
+ nop
+ .endm
+
+ .macro Do_InstallX, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_InstallX
+ nop
+ .endm
+
+
+
+; push a register onto the stack
+ .macro pushreg, reg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ store 0, 0, reg, sp ; push register
+ .endm
+
+ .macro push, sp, reg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop the register from stack
+ .macro popreg, reg, sp
+ load 0, 0, reg, sp ; pop register
+ add sp, sp, 4 ; adjust stack pointer
+ .endm
+ .macro pop, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ .endm
+
+; push a special register onto stack
+ .macro pushspcl, spcl, tmpreg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ mfsr tmpreg, spcl ; get spcl reg
+ store 0, 0, tmpreg, sp ; push onto stack
+ .endm
+
+ .macro pushsr, sp, reg, sreg
+ mfsr reg, sreg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop a special register from stack
+ .macro popspcl, spcl, tmpreg, sp
+ load 0, 0, tmpreg, sp ; pop from stack
+ add sp, sp, 4 ; adjust stack pointer
+ mtsr spcl, tmpreg ; set spcl reg
+ .endm
+
+ .macro popsr, sreg, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ mtsr sreg, reg
+ .endm
+
+;
+; save freeze mode registers on memory stack.
+;
+
+ .macro SaveFZState, tmp1, tmp2
+
+ ; save freeze mode registers.
+
+ pushspcl pc0, tmp1, msp
+ pushspcl pc1, tmp1, msp
+ pushspcl alu, tmp1, msp
+
+ pushspcl cha, tmp1, msp
+ pushspcl chd, tmp1, msp
+ pushspcl chc, tmp1, msp
+
+ pushspcl ops, tmp1, msp
+
+ ; turn freeze off
+
+ const tmp2, FZ
+ mfsr tmp1, cps
+ andn tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+ .endm
+
+; restore freeze mode registers from memory stack.
+
+ .macro RestoreFZState, tmp1, tmp2
+
+ ; turn freeze on
+
+ const tmp2, (FZ|DI|DA)
+ mfsr tmp1, cps
+ or tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+
+ ; restore freeze mode registers.
+
+ popspcl ops, tmp1, msp
+ popspcl chc, tmp1, msp
+ popspcl chd, tmp1, msp
+ popspcl cha, tmp1, msp
+ popspcl alu, tmp1, msp
+ popspcl pc1, tmp1, msp
+ popspcl pc0, tmp1, msp
+ .endm
+
+;
+;*
+;
+ .equ WS, 512 ; window size
+ .equ RALLOC, 4 * 4 ; stack alloc for C
+ .equ SIGCTX_UM_SIZE, 40 * 4 ;
+ .equ SIGCTX_RFB, (38) * 4 ; user mode saved
+ .equ SIGCTX_SM_SIZE, 12 * 4 ;
+ .equ SIGCTX_SIG, (11)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_GR1, (10)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_RAB, (9)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC0, (8)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC1, (7)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC2, (6)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_CHC, (3)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_OPS, (1)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_TAV, (0)*4 + SIGCTX_UM_SIZE ;
+
+ .macro sup_sv
+ add it2, trapreg, 0 ; transfer signal #
+ sub msp, msp, 4 ;
+ store 0, 0, it2, msp ; save signal number
+ sub msp, msp, 4 ; push gr1
+
+ store 0, 0, gr1, msp ;
+ sub msp, msp, 4 ; push rab
+ store 0, 0, rab, msp ;
+ const it0, WS ; Window size
+
+ sub rab, rfb, it0 ; set rab = rfb-512
+ pushsr msp, it0, PC0 ; save program counter0
+ pushsr msp, it0, PC1 ; save program counter1
+ pushsr msp, it0, PC2 ; save program counter2
+
+ pushsr msp, it0, CHA ; save channel address
+ pushsr msp, it0, CHD ; save channel data
+ pushsr msp, it0, CHC ; save channel control
+ pushsr msp, it0, ALU ; save alu
+
+ pushsr msp, it0, OPS ; save ops
+ sub msp, msp, 4 ;
+ store 0, 0, tav, msp ; push tav
+ mtsrim chc, 0 ; no loadm/storem
+
+ mfsr it0, ops ; get ops value
+ const it1, (TD | DI) ; disable interrupts
+ consth it1, (TD | DI) ; disable interrupts
+ or it0, it0, it1 ; set bits
+
+ mtsr ops, it0 ; set new ops
+ const it0, _sigcode ; signal handler
+ consth it0, _sigcode ; signal handler
+ mtsr pc1, it0 ; store pc1
+
+ add it1, it0, 4 ; next addr
+ mtsr pc0, it1 ; store pc1 location
+ iret ; return
+ nop ; ALIGN
+ .endm
+
+ .macro sig_return
+ mfsr it0, cps ; get processor status
+ const it1, FZ|DA ; Freeze + traps disable
+ or it0, it0, it1 ; to set FZ+DA
+ mtsr cps, it0 ; in freeze mode
+
+ load 0, 0, tav, msp ; restore tav
+ add msp, msp, 4 ;
+
+ popsr OPS,it0, msp ;
+ popsr ALU,it0, msp ;
+ popsr CHC,it0, msp ;
+ popsr CHD,it0, msp ;
+
+ popsr CHA,it0, msp ;
+ popsr PC2,it0, msp ;
+ popsr PC1,it0, msp ;
+ popsr PC0,it0, msp ;
+
+ load 0, 0, rab, msp ;
+ add msp, msp, 4 ;
+ load 0, 0, it0, msp ;
+ add gr1, it0, 0 ; pop rsp
+
+ add msp, msp, 8 ; discount signal #
+ iret
+ .endm
+
+ .macro repair_R_stack
+ add v0, msp, SIGCTX_GR1 ; interrupted gr1
+ load 0, 0, v2, v0 ;
+ add v0, msp, SIGCTX_RFB ;
+ load 0, 0, v3, v0 ; interupted rfb
+
+ const v1, WS ;
+ sub v1, v3, v1 ; rfb-512
+ cpltu v0, v2, v1 ; test gr1 < rfb-512
+ jmpf v0, $1 ;
+
+ add gr1, rab, 0 ;
+ add v2, v1, 0 ; set LB = rfb-512
+$1:
+;* if gr1 < rfb-512 yes LB = rfb-512 signalled during spill
+;* if no, LB=gr1 interrupted cache < 126 registers
+ cpleu v0, v2, rfb ; test LB<=rfb
+ jmpf v0, $2 ;
+ nop ;
+ add v2, rfb, 0 ;
+$2:
+ cpeq v0, v3, rfb ; fill rfb->'rfb
+ jmpt v0, $3 ; if rfb==rfb'
+ const tav, (0x80<<2) ; prepare for fill
+ or tav, tav, v2 ;
+
+ mtsr IPA, tav ; IPA=LA<<2
+ sub tav, v3, gr98 ; cache fill LA->rfb
+ srl tav, tav, 2 ; convert to words
+ sub tav, tav, 1 ;
+
+ mtsr cr, tav ;
+ loadm 0, 0, gr0, v2 ; fill from LA->rfb
+$3:
+ add rfb, v3, 0 ; move rfb upto 'rfb
+ sub rab, v1, 0 ; assign rab to rfb-512
+
+ add v0, msp, SIGCTX_GR1 ;
+ load 0, 0, v2, v0 ; v0 = interrupted gr1
+ add gr1, v2, 0 ; move gr1 upto 'gr1
+ nop ;
+ .endm
+
+ .macro repair_regs
+ mtsrim cr, 29 - 1 ; to restore locals
+ loadm 0, 0, v0, msp ;
+ add msp, msp, 29*4 ;
+ popsr Q, tav, msp ;
+
+ popsr IPC, tav, msp ;
+ popsr IPB, tav, msp ;
+ popsr IPA, tav, msp ;
+ pop FPStat3, msp ; floating point regs
+
+ pop FPStat2, msp ; floating point regs
+ pop FPStat1, msp ; floating point regs
+ pop FPStat0, msp ; floating point regs
+
+ add msp, msp, 3*4 ; R-stack repaired
+ .endm
+
+;
+;*HIF related...
+;
+
+
+
+
+; send the message in bufaddr to Montip.
+ .macro SendMessageToMontip, bufaddr
+ const lr2, bufaddr
+$1:
+ call lr0, _msg_send
+ consth lr2, bufaddr
+ cpeq gr96, gr96, 0
+ jmpf gr96, $1
+ const lr2, bufaddr
+ .endm
+
+; build a HIF_CALL message in bufaddr to send to montip.
+ .macro BuildHIFCALLMsg, bufaddr, tmp1, tmp2
+ const tmp1, bufaddr
+ consth tmp1, bufaddr
+ const tmp2, HIF_CALL_MSGCODE
+ store 0, 0, tmp2, tmp1 ; msg code
+ add tmp1, tmp1, 4
+ const tmp2, HIF_CALL_MSGLEN
+ store 0, 0, tmp2, tmp1 ; msg len
+ add tmp1, tmp1, 4
+ store 0, 0, gr121, tmp1 ; service number
+ add tmp1, tmp1, 4
+ store 0, 0, lr2, tmp1 ; lr2
+ add tmp1, tmp1, 4
+ store 0, 0, lr3, tmp1 ; lr3
+ add tmp1, tmp1, 4
+ store 0, 0, lr4, tmp1 ; lr4
+ .endm
+
+;
+;*
+;* All the funky AMD style macros go in here...simply for
+;* compatility
+;
+;
+ .macro IMPORT, symbol
+ .extern symbol
+ .endm
+
+ .macro GLOBAL, symbol
+ .global symbol
+ .endm
+
+ .macro USESECT, name, type
+ .sect name, type
+ .use name
+ .endm
+
+ .macro SECTION, name, type
+ .sect name, type
+ .endm
+
+ .macro FUNC, fname, lineno
+ .global fname
+fname:
+ .endm
+
+ .macro ENDFUNC, fname, lineno
+ .endm
+
+;*************************************LONG
+ .macro LONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************UNSIGNED LONG
+ .macro ULONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************SHORT
+ .macro SHORT, varname
+varname:
+ .block 2
+ .endm
+
+;*************************************CHAR
+ .macro CHAR, varname
+varname:
+ .block 1
+ .endm
+
+;*************************************LONGARRAY
+ .macro LONGARRAY, name, count
+name:
+ .block count*4
+ .endm
+
+;*************************************SHORTARRAY
+
+ .macro SHORTARRAY, name, count
+name:
+ .block count*2
+ .endm
+
+;*************************************CHARARRAY
+
+ .macro CHARARRAY, name, count
+name:
+ .block count
+ .endm
+
+
+;*************************************VOID_FPTR
+
+ .macro VOID_FPTR, name
+name:
+ .block 4
+ .endm
diff --git a/c/src/exec/score/cpu/a29k/rtems.c b/c/src/exec/score/cpu/a29k/rtems.c
new file mode 100644
index 0000000000..bf509ab474
--- /dev/null
+++ b/c/src/exec/score/cpu/a29k/rtems.c
@@ -0,0 +1,48 @@
+/* rtems.c ===> rtems.S or rtems.s
+ *
+ * This file contains the single entry point code for
+ * the XXX implementation of RTEMS.
+ *
+ * NOTE: This is supposed to be a .S or .s file NOT a C file.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+#ifndef lint
+static char _sccsid[] = "@(#)rtems.c 04/08/96 1.1\n";
+#endif
+
+/*
+ * This is supposed to be an assembly file. This means that system.h
+ * and cpu.h should not be included in a "real" rtems file.
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+/* #include "asm.h> */
+
+/*
+ * RTEMS
+ *
+ * This routine jumps to the directive indicated in the
+ * CPU defined register. This routine is used when RTEMS is
+ * linked by itself and placed in ROM. This routine is the
+ * first address in the ROM space for RTEMS. The user "calls"
+ * this address with the directive arguments in the normal place.
+ * This routine then jumps indirectly to the correct directive
+ * preserving the arguments. The directive should not realize
+ * it has been "wrapped" in this way. The table "_Entry_points"
+ * is used to look up the directive.
+ */
+
+void RTEMS()
+{
+}
+
diff --git a/c/src/exec/score/cpu/hppa1.1/Makefile.in b/c/src/exec/score/cpu/hppa1.1/Makefile.in
new file mode 100644
index 0000000000..a63f748ea6
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/Makefile.in
@@ -0,0 +1,83 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpu
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/hppa.h $(srcdir)/cpu_asm.h \
+ $(srcdir)/hppatypes.h
+
+# H_FILES that get installed externally
+EXTERNAL_H_FILES =
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=cpu_asm rtems
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS := -I$(ARCH) $(CPPFLAGS)
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(ARCH)/offsets.h: $(ARCH) cpu.h $(PROJECT_RELEASE)/bin/genoffsets
+ $(RM) $@
+ $(PROJECT_RELEASE)/bin/genoffsets > $@
+ $(CHMOD) -w $@
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+all: ${ARCH} install-headers $(SRCS) $(ARCH)/offsets.h preinstall $(RELS)
+
+preinstall:
+ $(INSTALL) -m 444 $(ARCH)/offsets.h ${PROJECT_RELEASE}/include/rtems/score
+
+install-headers: $(ARCH) ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/hppa1.1/cpu.c b/c/src/exec/score/cpu/hppa1.1/cpu.c
new file mode 100644
index 0000000000..49a7267ce6
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/cpu.c
@@ -0,0 +1,184 @@
+/*
+ * HP PA-RISC Dependent Source
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+void hppa_cpu_halt(unsigned32 the_error);
+
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is unsupported. For HPPA this function is handled by BSP
+ */
+
+ _CPU_Fatal_halt( 0xdeaddead );
+}
+
+
+
+/*
+ * This is the default handler which is called if
+ * _CPU_ISR_install_vector() has not been called for the
+ * specified vector. It simply forwards onto the spurious
+ * handler defined in the cpu-table.
+ */
+
+static ISR_Handler
+hppa_interrupt_report_spurious(ISR_Vector_number vector,
+ void* rtems_isr_frame) /* HPPA extension */
+{
+
+ /*
+ * If the CPU table defines a spurious_handler, then
+ * call it. If the handler returns halt.
+ */
+ if ( _CPU_Table.spurious_handler )
+ _CPU_Table.spurious_handler(vector, rtems_isr_frame);
+
+ hppa_cpu_halt(vector);
+}
+
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level(void)
+{
+ int level;
+ HPPA_ASM_SSM(0, level); /* change no bits; just get copy */
+ if (level & HPPA_PSW_I)
+ return 0;
+ return 1;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector. The handler is a C callable routine.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[vector];
+
+ _ISR_Vector_table[vector] = new_handler;
+}
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ *
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ register unsigned8 *fp_context;
+ unsigned32 i;
+ proc_ptr old_handler;
+
+ /*
+ * This is the default fp context for all tasks
+ * Set it up so that denormalized results go to zero.
+ */
+
+ fp_context = (unsigned8*) &_CPU_Null_fp_context;
+ for (i=0 ; i<sizeof(Context_Control_fp); i++)
+ *fp_context++ = 0;
+ *((unsigned32 *) &_CPU_Null_fp_context) = HPPA_FPSTATUS_D;
+
+ /*
+ * Save r27 into _CPU_Default_gr27 so it will hopefully be the correct
+ * global data pointer for the entire system.
+ */
+
+ asm volatile( "stw %%r27,%0" : "=m" (_CPU_Default_gr27): );
+
+ /*
+ * Init the 2nd level interrupt handlers
+ */
+
+ for (i=0; i < CPU_INTERRUPT_NUMBER_OF_VECTORS; i++)
+ _CPU_ISR_install_vector(i,
+ hppa_interrupt_report_spurious,
+ &old_handler);
+
+ _CPU_Table = *cpu_table;
+
+}
+
+
+/*
+ * Halt the system.
+ * Called by the _CPU_Fatal_halt macro
+ *
+ * XXX
+ * Later on, this will allow us to return to the prom.
+ * For now, we just ignore 'type_of_halt'
+ *
+ * XXX
+ * NOTE: for gcc, this function must be at the bottom
+ * of the file, that is because if it is at the top
+ * of the file, gcc will inline it's calls. Since
+ * the function uses the HPPA_ASM_LABEL() macro, when
+ * gcc inlines it, you get two definitions of the same
+ * label name, which is an assembly error.
+ */
+
+
+void
+hppa_cpu_halt(unsigned32 the_error)
+{
+ unsigned32 isrlevel;
+
+ _CPU_ISR_Disable(isrlevel);
+
+ /*
+ * XXXXX NOTE: This label is only needed that that when
+ * the simulator stops, it shows the label name specified
+ */
+ HPPA_ASM_LABEL("_hppa_cpu_halt");
+ HPPA_ASM_BREAK(0, 0);
+}
+
diff --git a/c/src/exec/score/cpu/hppa1.1/cpu.h b/c/src/exec/score/cpu/hppa1.1/cpu.h
new file mode 100644
index 0000000000..8d0f356d86
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/cpu.h
@@ -0,0 +1,608 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the HP
+ * PA-RISC processor (Level 1.1).
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Note:
+ * This file is included by both C and assembler code ( -DASM )
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/hppa.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/hppatypes.h>
+#endif
+
+/* conditional compilation parameters */
+
+#define CPU_INLINE_ENABLE_DISPATCH FALSE
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+
+/*
+ * RTEMS manages an interrupt stack in software for the HPPA.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+
+/*
+ * HPPA has hardware FP, it is assumed to exist by GCC so all tasks
+ * may implicitly use it (especially for integer multiplies). Because
+ * the FP context is technically part of the basic integer context
+ * on this CPU, we cannot use the deferred FP context switch algorithm.
+ */
+
+#define CPU_HARDWARE_FP TRUE
+#define CPU_ALL_TASKS_ARE_FP TRUE
+#define CPU_IDLE_TASK_IS_FP FALSE
+#define CPU_USE_DEFERRED_FP_SWITCH FALSE
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY FALSE
+#define CPU_STACK_GROWS_UP TRUE
+#define CPU_STRUCTURE_ALIGNMENT __attribute__ ((__aligned__ (32)))
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+/* constants */
+
+#define CPU_MODES_INTERRUPT_LEVEL 0x00000001 /* interrupt level in mode */
+#define CPU_MODES_INTERRUPT_MASK 0x00000001 /* interrupt level in mode */
+
+/*
+ * PSW contstants
+ */
+
+#define CPU_PSW_BASE (HPPA_PSW_C | HPPA_PSW_Q | HPPA_PSW_P | HPPA_PSW_D)
+#define CPU_PSW_INTERRUPTS_ON (CPU_PSW_BASE | HPPA_PSW_I)
+#define CPU_PSW_INTERRUPTS_OFF (CPU_PSW_BASE)
+
+#define CPU_PSW_DEFAULT CPU_PSW_BASE
+
+
+#ifndef ASM
+
+/*
+ * Contexts
+ *
+ * This means we have the following context items:
+ * 1. task level context stuff:: Context_Control
+ * 2. floating point task stuff:: Context_Control_fp
+ *
+ * The PA-RISC is very fast so the expense of saving an extra register
+ * or two is not of great concern at the present. So we are not making
+ * a distinction between what is saved during a task switch and what is
+ * saved at each interrupt. Plus saving the entire context should make
+ * it easier to make gdb aware of RTEMS tasks.
+ */
+
+typedef struct {
+ unsigned32 flags; /* whatever */
+ unsigned32 gr1; /* scratch -- caller saves */
+ unsigned32 gr2; /* RP -- return pointer */
+ unsigned32 gr3; /* scratch -- callee saves */
+ unsigned32 gr4; /* scratch -- callee saves */
+ unsigned32 gr5; /* scratch -- callee saves */
+ unsigned32 gr6; /* scratch -- callee saves */
+ unsigned32 gr7; /* scratch -- callee saves */
+ unsigned32 gr8; /* scratch -- callee saves */
+ unsigned32 gr9; /* scratch -- callee saves */
+ unsigned32 gr10; /* scratch -- callee saves */
+ unsigned32 gr11; /* scratch -- callee saves */
+ unsigned32 gr12; /* scratch -- callee saves */
+ unsigned32 gr13; /* scratch -- callee saves */
+ unsigned32 gr14; /* scratch -- callee saves */
+ unsigned32 gr15; /* scratch -- callee saves */
+ unsigned32 gr16; /* scratch -- callee saves */
+ unsigned32 gr17; /* scratch -- callee saves */
+ unsigned32 gr18; /* scratch -- callee saves */
+ unsigned32 gr19; /* scratch -- caller saves */
+ unsigned32 gr20; /* scratch -- caller saves */
+ unsigned32 gr21; /* scratch -- caller saves */
+ unsigned32 gr22; /* scratch -- caller saves */
+ unsigned32 gr23; /* argument 3 */
+ unsigned32 gr24; /* argument 2 */
+ unsigned32 gr25; /* argument 1 */
+ unsigned32 gr26; /* argument 0 */
+ unsigned32 gr27; /* DP -- global data pointer */
+ unsigned32 gr28; /* return values -- caller saves */
+ unsigned32 gr29; /* return values -- caller saves */
+ unsigned32 sp; /* gr30 */
+ unsigned32 gr31;
+
+ /* Various control registers */
+
+ unsigned32 sar; /* cr11 */
+ unsigned32 ipsw; /* cr22; full 32 bits of psw */
+ unsigned32 iir; /* cr19; interrupt instruction register */
+ unsigned32 ior; /* cr21; interrupt offset register */
+ unsigned32 isr; /* cr20; interrupt space register (not used) */
+ unsigned32 pcoqfront; /* cr18; front que offset */
+ unsigned32 pcoqback; /* cr18; back que offset */
+ unsigned32 pcsqfront; /* cr17; front que space (not used) */
+ unsigned32 pcsqback; /* cr17; back que space (not used) */
+ unsigned32 itimer; /* cr16; itimer value */
+
+} Context_Control;
+
+
+/* Must be double word aligned.
+ * This will be ok since our allocator returns 8 byte aligned chunks
+ */
+
+typedef struct {
+ double fr0; /* status */
+ double fr1; /* exception information */
+ double fr2; /* exception information */
+ double fr3; /* exception information */
+ double fr4; /* argument */
+ double fr5; /* argument */
+ double fr6; /* argument */
+ double fr7; /* argument */
+ double fr8; /* scratch -- caller saves */
+ double fr9; /* scratch -- caller saves */
+ double fr10; /* scratch -- caller saves */
+ double fr11; /* scratch -- caller saves */
+ double fr12; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr13; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr14; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr15; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr16; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr17; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr18; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr19; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr20; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr21; /* callee saves -- (PA-RISC 1.1 CPUs) */
+ double fr22; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr23; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr24; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr25; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr26; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr27; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr28; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr29; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr30; /* caller saves -- (PA-RISC 1.1 CPUs) */
+ double fr31; /* caller saves -- (PA-RISC 1.1 CPUs) */
+} Context_Control_fp;
+
+/*
+ * The following structure defines the set of information saved
+ * on the current stack by RTEMS upon receipt of each interrupt.
+ */
+
+typedef struct {
+ Context_Control Integer;
+ Context_Control_fp Floating_Point;
+} CPU_Interrupt_frame;
+
+/*
+ * Our interrupt handlers take a 2nd argument:
+ * a pointer to a CPU_Interrupt_frame
+ * So we use our own prototype instead of rtems_isr_entry
+ */
+
+typedef void ( *hppa_rtems_isr_entry )(
+ unsigned32,
+ CPU_Interrupt_frame *
+ );
+
+/*
+ * The following table contains the information required to configure
+ * the HPPA specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void * );
+ /* end of fields required on all CPUs */
+
+ hppa_rtems_isr_entry spurious_handler;
+
+ unsigned32 itimer_clicks_per_microsecond; /* for use by Clock driver */
+} rtems_cpu_table;
+
+/* variables */
+
+SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
+SCORE_EXTERN unsigned32 _CPU_Default_gr27;
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+#endif /* ! ASM */
+
+/*
+ * context sizes
+ */
+
+#ifndef ASM
+#define CPU_CONTEXT_SIZE sizeof( Context_Control )
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+#endif
+
+/*
+ * size of a frame on the stack
+ */
+
+#define CPU_FRAME_SIZE (16 * 4)
+
+/*
+ * (Optional) # of bytes for libmisc/stackchk to check
+ * If not specifed, then it defaults to something reasonable
+ * for most architectures.
+ */
+
+#define CPU_STACK_CHECK_SIZE (CPU_FRAME_SIZE * 2)
+
+/*
+ * extra stack required by the MPCI receive server thread
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
+
+/*
+ * HPPA has 32 traps, then 32 external interrupts
+ * Rtems (_ISR_Vector_Table) is aware ONLY of the first 32
+ * The BSP is aware of the external interrupts and possibly more.
+ *
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS (HPPA_INTERNAL_TRAPS)
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Don't be chintzy here; we don't want to debug these problems
+ * Some of the tests eat almost 4k.
+ * Plus, the HPPA always allocates chunks of 64 bytes for stack
+ * growth.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE (8 * 1024)
+
+/*
+ * HPPA double's must be on 8 byte boundary
+ */
+
+#define CPU_ALIGNMENT 8
+
+/*
+ * just follow the basic HPPA alignment for the heap and partition
+ */
+
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * HPPA stack is best when 64 byte aligned.
+ */
+
+#define CPU_STACK_ALIGNMENT 64
+
+#ifndef ASM
+
+/* macros */
+
+/*
+ * ISR handler macros
+ *
+ * These macros perform the following functions:
+ * + disable all maskable CPU interrupts
+ * + restore previous interrupt level (enable)
+ * + temporarily restore interrupts (flash)
+ * + set a particular level
+ */
+
+/* Disable interrupts; returning previous psw bits in _isr_level */
+#define _CPU_ISR_Disable( _isr_level ) \
+ do { \
+ HPPA_ASM_RSM(HPPA_PSW_I, _isr_level); \
+ if (_isr_level & HPPA_PSW_I) _isr_level = 0; \
+ else _isr_level = 1; \
+ } while(0)
+
+/* Enable interrupts to previous level from _CPU_ISR_Disable
+ * does not change 'level' */
+#define _CPU_ISR_Enable( _isr_level ) \
+ { \
+ register int _ignore; \
+ if (_isr_level == 0) HPPA_ASM_SSM(HPPA_PSW_I, _ignore); \
+ else HPPA_ASM_RSM(HPPA_PSW_I, _ignore); \
+ }
+
+/* restore, then disable interrupts; does not change level */
+#define _CPU_ISR_Flash( _isr_level ) \
+ { \
+ if (_isr_level == 0) \
+ { \
+ register int _ignore; \
+ HPPA_ASM_SSM(HPPA_PSW_I, _ignore); \
+ HPPA_ASM_RSM(HPPA_PSW_I, _ignore); \
+ } \
+ }
+
+/*
+ * Interrupt task levels
+ *
+ * Future scheme proposal
+ * level will be an index into a array.
+ * Each entry of array will be the interrupt bits
+ * enabled for that level. There will be 32 bits of external
+ * interrupts (to be placed in EIEM) and some (optional) bsp
+ * specific bits
+ *
+ * For pixel flow this *may* mean something like:
+ * level 0: all interrupts enabled (external + rhino)
+ * level 1: rhino disabled
+ * level 2: all io interrupts disabled (timer still enabled)
+ * level 7: *ALL* disabled (timer disabled)
+ */
+
+/* set interrupts on or off; does not return new level */
+#define _CPU_ISR_Set_level( new_level ) \
+ { \
+ volatile int ignore; \
+ if ( new_level ) HPPA_ASM_RSM(HPPA_PSW_I, ignore); \
+ else HPPA_ASM_SSM(HPPA_PSW_I, ignore); \
+ }
+
+/* return current level */
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/*
+ * Context handler macros
+ *
+ * These macros perform the following functions:
+ * + initialize a context area
+ * + restart the current thread
+ * + calculate the initial pointer into a FP context area
+ * + initialize an FP context area
+ *
+ * HPPA port adds two macros which hide the "indirectness" of the
+ * pointer passed the save/restore FP context assembly routines.
+ */
+
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _new_level, _entry_point, _is_fp ) \
+ do { \
+ unsigned32 _stack; \
+ \
+ (_the_context)->flags = 0xfeedf00d; \
+ (_the_context)->pcoqfront = (unsigned32)(_entry_point); \
+ (_the_context)->pcoqback = (unsigned32)(_entry_point) + 4; \
+ (_the_context)->pcsqfront = 0; \
+ (_the_context)->pcsqback = 0; \
+ if ( (_new_level) ) \
+ (_the_context)->ipsw = CPU_PSW_INTERRUPTS_OFF; \
+ else \
+ (_the_context)->ipsw = CPU_PSW_INTERRUPTS_ON; \
+ \
+ _stack = ((unsigned32)(_stack_base) + (CPU_STACK_ALIGNMENT - 1)); \
+ _stack &= ~(CPU_STACK_ALIGNMENT - 1); \
+ if ((_stack - (unsigned32) (_stack_base)) < CPU_FRAME_SIZE) \
+ _stack += CPU_FRAME_SIZE; \
+ \
+ (_the_context)->sp = (_stack); \
+ (_the_context)->gr27 = _CPU_Default_gr27; \
+ } while (0)
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ do { \
+ _CPU_Context_restore( (_the_context) ); \
+ } while (0)
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+#define _CPU_Context_Initialize_fp( _destination ) \
+ do { \
+ *((Context_Control_fp *) *((void **) _destination)) = _CPU_Null_fp_context;\
+ } while(0)
+
+#define _CPU_Context_save_fp( _fp_context ) \
+ _CPU_Save_float_context( *(Context_Control_fp **)(_fp_context) )
+
+#define _CPU_Context_restore_fp( _fp_context ) \
+ _CPU_Restore_float_context( *(Context_Control_fp **)(_fp_context) )
+
+/* end of Context handler macros */
+
+/*
+ * Fatal Error manager macros
+ *
+ * These macros perform the following functions:
+ * + disable interrupts and halt the CPU
+ */
+
+void hppa_cpu_halt(unsigned32 the_error);
+#define _CPU_Fatal_halt( _error ) \
+ hppa_cpu_halt(_error)
+
+/* end of Fatal Error manager macros */
+
+/*
+ * Bitfield handler macros
+ *
+ * These macros perform the following functions:
+ * + scan for the highest numbered (MSB) set in a 16 bit bitfield
+ *
+ * NOTE:
+ *
+ * The HPPA does not have a scan instruction. This functionality
+ * is implemented in software.
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE FALSE
+#define CPU_USE_GENERIC_BITFIELD_DATA FALSE
+
+int hppa_rtems_ffs(unsigned int value);
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ _output = hppa_rtems_ffs(_value)
+
+/* end of Bitfield handler macros */
+
+/*
+ * Priority handler macros
+ *
+ * These macros perform the following functions:
+ * + return a mask with the bit for this major/minor portion of
+ * of thread priority set.
+ * + translate the bit number returned by "Bitfield_find_first_bit"
+ * into an index into the thread ready chain bit maps
+ *
+ * Note: 255 is the lowest priority
+ */
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 1 << (_bit_number) )
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generally used only to restart self in an
+ * efficient manner and avoid stack conflicts.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Save_float_context
+ *
+ * This routine saves the floating point context passed to it.
+ *
+ * NOTE: _CPU_Context_save_fp is implemented as a macro on the HPPA
+ * which dereferences the pointer before calling this.
+ */
+
+void _CPU_Save_float_context(
+ Context_Control_fp *fp_context
+);
+
+/*
+ * _CPU_Restore_float_context
+ *
+ * This routine restores the floating point context passed to it.
+ *
+ * NOTE: _CPU_Context_save_fp is implemented as a macro on the HPPA
+ * which dereferences the pointer before calling this.
+ */
+
+void _CPU_Restore_float_context(
+ Context_Control_fp *fp_context
+);
+
+
+/*
+ * The raw interrupt handler for external interrupts
+ */
+
+extern void _Generic_ISR_Handler(
+ void
+);
+
+
+/* The following routine swaps the endian format of an unsigned int.
+ * It must be static so it can be referenced indirectly.
+ */
+
+static inline unsigned int
+CPU_swap_u32(unsigned32 value)
+{
+ unsigned32 swapped;
+
+ HPPA_ASM_SWAPBYTES(value, swapped);
+
+ return( swapped );
+}
+
+#endif /* ! ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! __CPU_h */
diff --git a/c/src/exec/score/cpu/hppa1.1/cpu_asm.h b/c/src/exec/score/cpu/hppa1.1/cpu_asm.h
new file mode 100644
index 0000000000..951f80dcf0
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/cpu_asm.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1990,1991 The University of Utah and
+ * the Center for Software Science (CSS). All rights reserved.
+ *
+ * Permission to use, copy, modify and distribute this software is hereby
+ * granted provided that (1) source code retains these copyright, permission,
+ * and disclaimer notices, and (2) redistributions including binaries
+ * reproduce the notices in supporting documentation, and (3) all advertising
+ * materials mentioning features or use of this software display the following
+ * acknowledgement: ``This product includes software developed by the Center
+ * for Software Science at the University of Utah.''
+ *
+ * THE UNIVERSITY OF UTAH AND CSS ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS
+ * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSS DISCLAIM ANY LIABILITY OF
+ * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
+ *
+ * CSS requests users of this software to return to css-dist@cs.utah.edu any
+ * improvements that they make and grant CSS redistribution rights.
+ *
+ * Utah $Hdr: asm.h 1.6 91/12/03$
+ *
+ * $Id$
+ */
+
+/*
+ * Hardware Space Registers
+ */
+sr0 .reg %sr0
+sr1 .reg %sr1
+sr2 .reg %sr2
+sr3 .reg %sr3
+sr4 .reg %sr4
+sr5 .reg %sr5
+sr6 .reg %sr6
+sr7 .reg %sr7
+
+/*
+ * Control register aliases
+ */
+
+rctr .reg %cr0
+pidr1 .reg %cr8
+pidr2 .reg %cr9
+ccr .reg %cr10
+sar .reg %cr11
+pidr3 .reg %cr12
+pidr4 .reg %cr13
+iva .reg %cr14
+eiem .reg %cr15
+itmr .reg %cr16
+pcsq .reg %cr17
+pcoq .reg %cr18
+iir .reg %cr19
+isr .reg %cr20
+ior .reg %cr21
+ipsw .reg %cr22
+eirr .reg %cr23
+
+/*
+ * Calling Convention
+ */
+rp .reg %r2
+arg3 .reg %r23
+arg2 .reg %r24
+arg1 .reg %r25
+arg0 .reg %r26
+dp .reg %r27
+ret0 .reg %r28
+ret1 .reg %r29
+sl .reg %r29
+sp .reg %r30
+
+
diff --git a/c/src/exec/score/cpu/hppa1.1/cpu_asm.s b/c/src/exec/score/cpu/hppa1.1/cpu_asm.s
new file mode 100644
index 0000000000..529c9be1e5
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/cpu_asm.s
@@ -0,0 +1,778 @@
+/*
+ * TODO:
+ * Context_switch needs to only save callee save registers
+ * I think this means can skip: r1, r2, r19-29, r31
+ * Ref: p 3-2 of Procedure Calling Conventions Manual
+ * This should be #ifndef DEBUG so that debugger has
+ * accurate visibility into all registers
+ *
+ * This file contains the assembly code for the HPPA implementation
+ * of RTEMS.
+ *
+ * COPYRIGHT (c) 1994,95 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/score/hppa.h>
+#include <rtems/score/cpu_asm.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/offsets.h>
+
+ .SPACE $PRIVATE$
+ .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
+ .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
+ .SPACE $TEXT$
+ .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
+ .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
+ .SPACE $TEXT$
+ .SUBSPA $CODE$
+
+/*
+ * Special register usage for context switch and interrupts
+ * Stay away from %cr28 which is used for TLB misses on 72000
+ */
+
+isr_arg0 .reg %cr24
+isr_r9 .reg %cr25
+isr_r8 .reg %cr26
+
+/*
+ * Interrupt stack frame looks like this
+ *
+ * offset item
+ * -----------------------------------------------------------------
+ * INTEGER_CONTEXT_OFFSET Context_Control
+ * FP_CONTEXT_OFFSET Context_Control_fp
+ *
+ * It is padded out to a multiple of 64
+ */
+
+
+/*PAGE^L
+ * void _Generic_ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ * We jump here from the interrupt vector.
+ * The HPPA hardware has done some stuff for us:
+ * PSW saved in IPSW
+ * PSW set to 0
+ * PSW[E] set to default (0)
+ * PSW[M] set to 1 iff this is HPMC
+ *
+ * IIA queue is frozen (since PSW[Q] is now 0)
+ * privilege level promoted to 0
+ * IIR, ISR, IOR potentially updated if PSW[Q] was 1 at trap
+ * registers GR 1,8,9,16,17,24,25 copied to shadow regs
+ * SHR 0 1 2 3 4 5 6
+ *
+ * Our vector stub (in the BSP) MUST have done the following:
+ *
+ * a) Saved the original %r9 into %isr_r9 (%cr25)
+ * b) Placed the vector number in %r9
+ * c) Was allowed to also destroy $isr_r8 (%cr26),
+ * but the stub was NOT allowed to destroy any other registers.
+ *
+ * The typical stub sequence (in the BSP) should look like this:
+ *
+ * a) mtctl %r9,isr_r9 ; (save r9 in cr25)
+ * b) ldi vector,%r9 ; (load constant vector number in r9)
+ * c) mtctl %r8,isr_r8 ; (save r8 in cr26)
+ * d) ldil L%MY_BSP_first_level_interrupt_handler,%r8
+ * e) ldo R%MY_BSP_first_level_interrupt_handler(%r8),%r8
+ * ; (point to BSP raw handler table)
+ * f) ldwx,s %r9(%r8),%r8 ; (load value from raw handler table)
+ * g) bv 0(%r8) ; (call raw handler: _Generic_ISR_Handler)
+ * h) mfctl isr_r8,%r8 ; (restore r8 from cr26 in delay slot)
+ *
+ * Optionally, steps (c) thru (h) _could_ be replaced with a single
+ * bl,n _Generic_ISR_Handler,%r0
+ *
+ *
+ */
+ .EXPORT _Generic_ISR_Handler,ENTRY,PRIV_LEV=0
+_Generic_ISR_Handler:
+ .PROC
+ .CALLINFO FRAME=0,NO_CALLS
+ .ENTRY
+
+ mtctl arg0, isr_arg0
+
+/*
+ * save interrupt state
+ */
+ mfctl ipsw, arg0
+ stw arg0, IPSW_OFFSET(sp)
+
+ mfctl iir, arg0
+ stw arg0, IIR_OFFSET(sp)
+
+ mfctl ior, arg0
+ stw arg0, IOR_OFFSET(sp)
+
+ mfctl pcoq, arg0
+ stw arg0, PCOQFRONT_OFFSET(sp)
+
+ mtctl %r0, pcoq
+ mfctl pcoq, arg0
+ stw arg0, PCOQBACK_OFFSET(sp)
+
+ mfctl %sar, arg0
+ stw arg0, SAR_OFFSET(sp)
+
+/*
+ * Build an interrupt frame to hold the contexts we will need.
+ * We have already saved the interrupt items on the stack
+ *
+ * At this point the following registers are damaged wrt the interrupt
+ * reg current value saved value
+ * ------------------------------------------------
+ * arg0 scratch isr_arg0 (cr24)
+ * r9 vector number isr_r9 (cr25)
+ *
+ * Point to beginning of integer context and
+ * save the integer context
+ */
+ stw %r1,R1_OFFSET(sp)
+ stw %r2,R2_OFFSET(sp)
+ stw %r3,R3_OFFSET(sp)
+ stw %r4,R4_OFFSET(sp)
+ stw %r5,R5_OFFSET(sp)
+ stw %r6,R6_OFFSET(sp)
+ stw %r7,R7_OFFSET(sp)
+ stw %r8,R8_OFFSET(sp)
+/*
+ * skip r9
+ */
+ stw %r10,R10_OFFSET(sp)
+ stw %r11,R11_OFFSET(sp)
+ stw %r12,R12_OFFSET(sp)
+ stw %r13,R13_OFFSET(sp)
+ stw %r14,R14_OFFSET(sp)
+ stw %r15,R15_OFFSET(sp)
+ stw %r16,R16_OFFSET(sp)
+ stw %r17,R17_OFFSET(sp)
+ stw %r18,R18_OFFSET(sp)
+ stw %r19,R19_OFFSET(sp)
+ stw %r20,R20_OFFSET(sp)
+ stw %r21,R21_OFFSET(sp)
+ stw %r22,R22_OFFSET(sp)
+ stw %r23,R23_OFFSET(sp)
+ stw %r24,R24_OFFSET(sp)
+ stw %r25,R25_OFFSET(sp)
+/*
+ * skip arg0
+ */
+ stw %r27,R27_OFFSET(sp)
+ stw %r28,R28_OFFSET(sp)
+ stw %r29,R29_OFFSET(sp)
+ stw %r30,R30_OFFSET(sp)
+ stw %r31,R31_OFFSET(sp)
+
+/* Now most registers are available since they have been saved
+ *
+ * The following items are currently wrong in the integer context
+ * reg current value saved value
+ * ------------------------------------------------
+ * arg0 scratch isr_arg0 (cr24)
+ * r9 vector number isr_r9 (cr25)
+ *
+ * Fix them
+ */
+
+ mfctl isr_arg0,%r3
+ stw %r3,ARG0_OFFSET(sp)
+
+ mfctl isr_r9,%r3
+ stw %r3,R9_OFFSET(sp)
+
+/*
+ * At this point we are done with isr_arg0, and isr_r9 control registers
+ *
+ * Prepare to re-enter virtual mode
+ * We need Q in case the interrupt handler enables interrupts
+ */
+
+ ldil L%CPU_PSW_DEFAULT, arg0
+ ldo R%CPU_PSW_DEFAULT(arg0), arg0
+ mtctl arg0, ipsw
+
+/*
+ * Now jump to "rest_of_isr_handler" with the rfi
+ * We are assuming the space queues are all correct already
+ */
+
+ ldil L%rest_of_isr_handler, arg0
+ ldo R%rest_of_isr_handler(arg0), arg0
+ mtctl arg0, pcoq
+ ldo 4(arg0), arg0
+ mtctl arg0, pcoq
+
+ rfi
+ nop
+
+/*
+ * At this point we are back in virtual mode and all our
+ * normal addressing is once again ok.
+ *
+ * It is now ok to take an exception or trap
+ */
+
+rest_of_isr_handler:
+
+/*
+ * Point to beginning of float context and
+ * save the floating point context -- doing whatever patches are necessary
+ */
+
+ .call ARGW0=GR
+ bl _CPU_Save_float_context,%r2
+ ldo FP_CONTEXT_OFFSET(sp),arg0
+
+/*
+ * save the ptr to interrupt frame as an argument for the interrupt handler
+ */
+
+ copy sp, arg1
+
+/*
+ * Advance the frame to point beyond all interrupt contexts (integer & float)
+ * this also includes the pad to align to 64byte stack boundary
+ */
+ ldo CPU_INTERRUPT_FRAME_SIZE(sp), sp
+
+/*
+ * r3 -- &_ISR_Nest_level
+ * r5 -- value _ISR_Nest_level
+ * r4 -- &_Thread_Dispatch_disable_level
+ * r6 -- value _Thread_Dispatch_disable_level
+ * r9 -- vector number
+ */
+
+ .import _ISR_Nest_level,data
+ ldil L%_ISR_Nest_level,%r3
+ ldo R%_ISR_Nest_level(%r3),%r3
+ ldw 0(%r3),%r5
+
+ .import _Thread_Dispatch_disable_level,data
+ ldil L%_Thread_Dispatch_disable_level,%r4
+ ldo R%_Thread_Dispatch_disable_level(%r4),%r4
+ ldw 0(%r4),%r6
+
+/*
+ * increment interrupt nest level counter. If outermost interrupt
+ * switch the stack and squirrel away the previous sp.
+ */
+ addi 1,%r5,%r5
+ stw %r5, 0(%r3)
+
+/*
+ * compute and save new stack (with frame)
+ * just in case we are nested -- simpler this way
+ */
+ comibf,= 1,%r5,stack_done
+ ldo 128(sp),%r7
+
+/*
+ * Switch to interrupt stack allocated by the interrupt manager (intr.c)
+ */
+ .import _CPU_Interrupt_stack_low,data
+ ldil L%_CPU_Interrupt_stack_low,%r7
+ ldw R%_CPU_Interrupt_stack_low(%r7),%r7
+ ldo 128(%r7),%r7
+
+stack_done:
+/*
+ * save our current stack pointer where the "old sp" is supposed to be
+ */
+ stw sp, -4(%r7)
+/*
+ * and switch stacks (or advance old stack in nested case)
+ */
+ copy %r7, sp
+
+/*
+ * increment the dispatch disable level counter.
+ */
+ addi 1,%r6,%r6
+ stw %r6, 0(%r4)
+
+/*
+ * load address of user handler
+ * Note: No error checking is done, it is assumed that the
+ * vector table contains a valid address or a stub
+ * spurious handler.
+ */
+ .import _ISR_Vector_table,data
+ ldil L%_ISR_Vector_table,%r8
+ ldo R%_ISR_Vector_table(%r8),%r8
+ ldwx,s %r9(%r8),%r8
+
+/*
+ * invoke user interrupt handler
+ * Interrupts are currently disabled, as per RTEMS convention
+ * The handler has the option of re-enabling interrupts
+ * NOTE: can not use 'bl' since it uses "pc-relative" addressing
+ * and we are using a hard coded address from a table
+ * So... we fudge r2 ourselves (ala dynacall)
+ * arg0 = vector number, arg1 = ptr to rtems_interrupt_frame
+ */
+ copy %r9, %r26
+ .call ARGW0=GR, ARGW1=GR
+ blr %r0, rp
+ bv,n 0(%r8)
+
+post_user_interrupt_handler:
+
+/*
+ * Back from user handler(s)
+ * Disable external interrupts (since the interrupt handler could
+ * have turned them on) and return to the interrupted task stack (assuming
+ * (_ISR_Nest_level == 0)
+ */
+
+ rsm HPPA_PSW_I + HPPA_PSW_R, %r0
+ ldw -4(sp), sp
+
+/*
+ * r3 -- (most of) &_ISR_Nest_level
+ * r5 -- value _ISR_Nest_level
+ * r4 -- (most of) &_Thread_Dispatch_disable_level
+ * r6 -- value _Thread_Dispatch_disable_level
+ * r7 -- (most of) &_ISR_Signals_to_thread_executing
+ * r8 -- value _ISR_Signals_to_thread_executing
+ */
+
+ .import _ISR_Nest_level,data
+ ldil L%_ISR_Nest_level,%r3
+ ldw R%_ISR_Nest_level(%r3),%r5
+
+ .import _Thread_Dispatch_disable_level,data
+ ldil L%_Thread_Dispatch_disable_level,%r4
+ ldw R%_Thread_Dispatch_disable_level(%r4),%r6
+
+ .import _ISR_Signals_to_thread_executing,data
+ ldil L%_ISR_Signals_to_thread_executing,%r7
+
+/*
+ * decrement isr nest level
+ */
+ addi -1, %r5, %r5
+ stw %r5, R%_ISR_Nest_level(%r3)
+
+/*
+ * decrement dispatch disable level counter and, if not 0, go on
+ */
+ addi -1,%r6,%r6
+ comibf,= 0,%r6,isr_restore
+ stw %r6, R%_Thread_Dispatch_disable_level(%r4)
+
+/*
+ * check whether or not a context switch is necessary
+ */
+ .import _Context_Switch_necessary,data
+ ldil L%_Context_Switch_necessary,%r8
+ ldw R%_Context_Switch_necessary(%r8),%r8
+ comibf,=,n 0,%r8,ISR_dispatch
+
+/*
+ * check whether or not a context switch is necessary because an ISR
+ * sent signals to the interrupted task
+ */
+ ldw R%_ISR_Signals_to_thread_executing(%r7),%r8
+ comibt,=,n 0,%r8,isr_restore
+
+
+/*
+ * OK, something happened while in ISR and we need to switch to a task
+ * other than the one which was interrupted or the
+ * ISR_Signals_to_thread_executing case
+ * We also turn on interrupts, since the interrupted task had them
+ * on (obviously :-) and Thread_Dispatch is happy to leave ints on.
+ */
+
+ISR_dispatch:
+ stw %r0, R%_ISR_Signals_to_thread_executing(%r7)
+
+ ssm HPPA_PSW_I, %r0
+
+ .import _Thread_Dispatch,code
+ .call
+ bl _Thread_Dispatch,%r2
+ ldo 128(sp),sp
+
+ ldo -128(sp),sp
+
+isr_restore:
+
+/*
+ * enable interrupts during most of restore
+ */
+ ssm HPPA_PSW_I, %r0
+
+/*
+ * Get a pointer to beginning of our stack frame
+ */
+ ldo -CPU_INTERRUPT_FRAME_SIZE(sp), %arg1
+
+/*
+ * restore float
+ */
+ .call ARGW0=GR
+ bl _CPU_Restore_float_context,%r2
+ ldo FP_CONTEXT_OFFSET(%arg1), arg0
+
+ copy %arg1, %arg0
+
+/*
+ * ********** FALL THRU **********
+ */
+
+/*
+ * Jump here from bottom of Context_Switch
+ * Also called directly by _CPU_Context_Restart_self via _Thread_Restart_self
+ * restore interrupt state
+ */
+
+ .EXPORT _CPU_Context_restore
+_CPU_Context_restore:
+
+/*
+ * restore integer state
+ */
+ ldw R1_OFFSET(arg0),%r1
+ ldw R2_OFFSET(arg0),%r2
+ ldw R3_OFFSET(arg0),%r3
+ ldw R4_OFFSET(arg0),%r4
+ ldw R5_OFFSET(arg0),%r5
+ ldw R6_OFFSET(arg0),%r6
+ ldw R7_OFFSET(arg0),%r7
+ ldw R8_OFFSET(arg0),%r8
+ ldw R9_OFFSET(arg0),%r9
+ ldw R10_OFFSET(arg0),%r10
+ ldw R11_OFFSET(arg0),%r11
+ ldw R12_OFFSET(arg0),%r12
+ ldw R13_OFFSET(arg0),%r13
+ ldw R14_OFFSET(arg0),%r14
+ ldw R15_OFFSET(arg0),%r15
+ ldw R16_OFFSET(arg0),%r16
+ ldw R17_OFFSET(arg0),%r17
+ ldw R18_OFFSET(arg0),%r18
+ ldw R19_OFFSET(arg0),%r19
+ ldw R20_OFFSET(arg0),%r20
+ ldw R21_OFFSET(arg0),%r21
+ ldw R22_OFFSET(arg0),%r22
+ ldw R23_OFFSET(arg0),%r23
+ ldw R24_OFFSET(arg0),%r24
+/*
+ * skipping r25; used as scratch register below
+ * skipping r26 (arg0) until we are done with it
+ */
+ ldw R27_OFFSET(arg0),%r27
+ ldw R28_OFFSET(arg0),%r28
+ ldw R29_OFFSET(arg0),%r29
+/*
+ * skipping r30 (sp) until we turn off interrupts
+ */
+ ldw R31_OFFSET(arg0),%r31
+
+/*
+ * Turn off Q & R & I so we can write r30 and interrupt control registers
+ */
+ rsm HPPA_PSW_Q + HPPA_PSW_R + HPPA_PSW_I, %r0
+
+/*
+ * now safe to restore r30
+ */
+ ldw R30_OFFSET(arg0),%r30
+
+ ldw IPSW_OFFSET(arg0), %r25
+ mtctl %r25, ipsw
+
+ ldw SAR_OFFSET(arg0), %r25
+ mtctl %r25, sar
+
+ ldw PCOQFRONT_OFFSET(arg0), %r25
+ mtctl %r25, pcoq
+
+ ldw PCOQBACK_OFFSET(arg0), %r25
+ mtctl %r25, pcoq
+
+/*
+ * Load r25 with interrupts off
+ */
+ ldw R25_OFFSET(arg0),%r25
+/*
+ * Must load r26 (arg0) last
+ */
+ ldw R26_OFFSET(arg0),%r26
+
+isr_exit:
+ rfi
+ .EXIT
+ .PROCEND
+
+/*
+ * This section is used to context switch floating point registers.
+ * Ref: 6-35 of Architecture 1.1
+ *
+ * NOTE: since integer multiply uses the floating point unit,
+ * we have to save/restore fp on every trap. We cannot
+ * just try to keep track of fp usage.
+ */
+
+ .align 32
+ .EXPORT _CPU_Save_float_context,ENTRY,PRIV_LEV=0
+_CPU_Save_float_context:
+ .PROC
+ .CALLINFO FRAME=0,NO_CALLS
+ .ENTRY
+ fstds,ma %fr0,8(%arg0)
+ fstds,ma %fr1,8(%arg0)
+ fstds,ma %fr2,8(%arg0)
+ fstds,ma %fr3,8(%arg0)
+ fstds,ma %fr4,8(%arg0)
+ fstds,ma %fr5,8(%arg0)
+ fstds,ma %fr6,8(%arg0)
+ fstds,ma %fr7,8(%arg0)
+ fstds,ma %fr8,8(%arg0)
+ fstds,ma %fr9,8(%arg0)
+ fstds,ma %fr10,8(%arg0)
+ fstds,ma %fr11,8(%arg0)
+ fstds,ma %fr12,8(%arg0)
+ fstds,ma %fr13,8(%arg0)
+ fstds,ma %fr14,8(%arg0)
+ fstds,ma %fr15,8(%arg0)
+ fstds,ma %fr16,8(%arg0)
+ fstds,ma %fr17,8(%arg0)
+ fstds,ma %fr18,8(%arg0)
+ fstds,ma %fr19,8(%arg0)
+ fstds,ma %fr20,8(%arg0)
+ fstds,ma %fr21,8(%arg0)
+ fstds,ma %fr22,8(%arg0)
+ fstds,ma %fr23,8(%arg0)
+ fstds,ma %fr24,8(%arg0)
+ fstds,ma %fr25,8(%arg0)
+ fstds,ma %fr26,8(%arg0)
+ fstds,ma %fr27,8(%arg0)
+ fstds,ma %fr28,8(%arg0)
+ fstds,ma %fr29,8(%arg0)
+ fstds,ma %fr30,8(%arg0)
+ fstds %fr31,0(%arg0)
+ bv 0(%r2)
+ addi -(31*8), %arg0, %arg0 ; restore arg0 just for fun
+ .EXIT
+ .PROCEND
+
+ .align 32
+ .EXPORT _CPU_Restore_float_context,ENTRY,PRIV_LEV=0
+_CPU_Restore_float_context:
+ .PROC
+ .CALLINFO FRAME=0,NO_CALLS
+ .ENTRY
+ addi (31*8), %arg0, %arg0 ; point at last double
+ fldds 0(%arg0),%fr31
+ fldds,mb -8(%arg0),%fr30
+ fldds,mb -8(%arg0),%fr29
+ fldds,mb -8(%arg0),%fr28
+ fldds,mb -8(%arg0),%fr27
+ fldds,mb -8(%arg0),%fr26
+ fldds,mb -8(%arg0),%fr25
+ fldds,mb -8(%arg0),%fr24
+ fldds,mb -8(%arg0),%fr23
+ fldds,mb -8(%arg0),%fr22
+ fldds,mb -8(%arg0),%fr21
+ fldds,mb -8(%arg0),%fr20
+ fldds,mb -8(%arg0),%fr19
+ fldds,mb -8(%arg0),%fr18
+ fldds,mb -8(%arg0),%fr17
+ fldds,mb -8(%arg0),%fr16
+ fldds,mb -8(%arg0),%fr15
+ fldds,mb -8(%arg0),%fr14
+ fldds,mb -8(%arg0),%fr13
+ fldds,mb -8(%arg0),%fr12
+ fldds,mb -8(%arg0),%fr11
+ fldds,mb -8(%arg0),%fr10
+ fldds,mb -8(%arg0),%fr9
+ fldds,mb -8(%arg0),%fr8
+ fldds,mb -8(%arg0),%fr7
+ fldds,mb -8(%arg0),%fr6
+ fldds,mb -8(%arg0),%fr5
+ fldds,mb -8(%arg0),%fr4
+ fldds,mb -8(%arg0),%fr3
+ fldds,mb -8(%arg0),%fr2
+ fldds,mb -8(%arg0),%fr1
+ bv 0(%r2)
+ fldds,mb -8(%arg0),%fr0
+ .EXIT
+ .PROCEND
+
+/*
+ * These 2 small routines are unused right now.
+ * Normally we just go thru _CPU_Save_float_context (and Restore)
+ *
+ * Here we just deref the ptr and jump up, letting _CPU_Save_float_context
+ * do the return for us.
+ */
+
+ .EXPORT _CPU_Context_save_fp,ENTRY,PRIV_LEV=0
+_CPU_Context_save_fp:
+ .PROC
+ .CALLINFO FRAME=0,NO_CALLS
+ .ENTRY
+ bl _CPU_Save_float_context, %r0
+ ldw 0(%arg0), %arg0
+ .EXIT
+ .PROCEND
+
+ .EXPORT _CPU_Context_restore_fp,ENTRY,PRIV_LEV=0
+_CPU_Context_restore_fp:
+ .PROC
+ .CALLINFO FRAME=0,NO_CALLS
+ .ENTRY
+ bl _CPU_Restore_float_context, %r0
+ ldw 0(%arg0), %arg0
+ .EXIT
+ .PROCEND
+
+
+/*
+ * void _CPU_Context_switch( run_context, heir_context )
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+ .align 32
+ .EXPORT _CPU_Context_switch,ENTRY,PRIV_LEV=0,ARGW0=GR,ARGW1=GR
+_CPU_Context_switch:
+ .PROC
+ .CALLINFO FRAME=64
+ .ENTRY
+
+/*
+ * Save the integer context
+ */
+ stw %r1,R1_OFFSET(arg0)
+ stw %r2,R2_OFFSET(arg0)
+ stw %r3,R3_OFFSET(arg0)
+ stw %r4,R4_OFFSET(arg0)
+ stw %r5,R5_OFFSET(arg0)
+ stw %r6,R6_OFFSET(arg0)
+ stw %r7,R7_OFFSET(arg0)
+ stw %r8,R8_OFFSET(arg0)
+ stw %r9,R9_OFFSET(arg0)
+ stw %r10,R10_OFFSET(arg0)
+ stw %r11,R11_OFFSET(arg0)
+ stw %r12,R12_OFFSET(arg0)
+ stw %r13,R13_OFFSET(arg0)
+ stw %r14,R14_OFFSET(arg0)
+ stw %r15,R15_OFFSET(arg0)
+ stw %r16,R16_OFFSET(arg0)
+ stw %r17,R17_OFFSET(arg0)
+ stw %r18,R18_OFFSET(arg0)
+ stw %r19,R19_OFFSET(arg0)
+ stw %r20,R20_OFFSET(arg0)
+ stw %r21,R21_OFFSET(arg0)
+ stw %r22,R22_OFFSET(arg0)
+ stw %r23,R23_OFFSET(arg0)
+ stw %r24,R24_OFFSET(arg0)
+ stw %r25,R25_OFFSET(arg0)
+ stw %r26,R26_OFFSET(arg0)
+ stw %r27,R27_OFFSET(arg0)
+ stw %r28,R28_OFFSET(arg0)
+ stw %r29,R29_OFFSET(arg0)
+ stw %r30,R30_OFFSET(arg0)
+ stw %r31,R31_OFFSET(arg0)
+
+/*
+ * fill in interrupt context section
+ */
+ stw %r2, PCOQFRONT_OFFSET(%arg0)
+ ldo 4(%r2), %r2
+ stw %r2, PCOQBACK_OFFSET(%arg0)
+
+/*
+ * Generate a suitable IPSW by using the system default psw
+ * with the current low bits added in.
+ */
+
+ ldil L%CPU_PSW_DEFAULT, %r2
+ ldo R%CPU_PSW_DEFAULT(%r2), %r2
+ ssm 0, %arg2
+ dep %arg2, 31, 8, %r2
+ stw %r2, IPSW_OFFSET(%arg0)
+
+/*
+ * at this point, the running task context is completely saved
+ * Now jump to the bottom of the interrupt handler to load the
+ * heirs context
+ */
+
+ b _CPU_Context_restore
+ copy %arg1, %arg0
+
+ .EXIT
+ .PROCEND
+
+
+/*
+ * Find first bit
+ * NOTE:
+ * This is used (and written) only for the ready chain code and
+ * priority bit maps.
+ * Any other use constitutes fraud.
+ * Returns first bit from the least significant side.
+ * Eg: if input is 0x8001
+ * output will indicate the '1' bit and return 0.
+ * This is counter to HPPA bit numbering which calls this
+ * bit 31. This way simplifies the macros _CPU_Priority_Mask
+ * and _CPU_Priority_Bits_index.
+ *
+ * NOTE:
+ * We just use 16 bit version
+ * does not handle zero case
+ *
+ * Based on the UTAH Mach libc version of ffs.
+ */
+
+ .align 32
+ .EXPORT hppa_rtems_ffs,ENTRY,PRIV_LEV=0,ARGW0=GR
+hppa_rtems_ffs:
+ .PROC
+ .CALLINFO FRAME=0,NO_CALLS
+ .ENTRY
+
+#ifdef RETURN_ERROR_ON_ZERO
+ comb,= %arg0,%r0,ffsdone ; If arg0 is 0
+ ldi -1,%ret0 ; return -1
+#endif
+
+#if BITFIELD_SIZE == 32
+ ldi 31,%ret0 ; Set return to high bit
+ extru,= %arg0,31,16,%r0 ; If low 16 bits are non-zero
+ addi,tr -16,%ret0,%ret0 ; subtract 16 from bitpos
+ shd %r0,%arg0,16,%arg0 ; else shift right 16 bits
+#else
+ ldi 15,%ret0 ; Set return to high bit
+#endif
+ extru,= %arg0,31,8,%r0 ; If low 8 bits are non-zero
+ addi,tr -8,%ret0,%ret0 ; subtract 8 from bitpos
+ shd %r0,%arg0,8,%arg0 ; else shift right 8 bits
+ extru,= %arg0,31,4,%r0 ; If low 4 bits are non-zero
+ addi,tr -4,%ret0,%ret0 ; subtract 4 from bitpos
+ shd %r0,%arg0,4,%arg0 ; else shift right 4 bits
+ extru,= %arg0,31,2,%r0 ; If low 2 bits are non-zero
+ addi,tr -2,%ret0,%ret0 ; subtract 2 from bitpos
+ shd %r0,%arg0,2,%arg0 ; else shift right 2 bits
+ extru,= %arg0,31,1,%r0 ; If low bit is non-zero
+ addi -1,%ret0,%ret0 ; subtract 1 from bitpos
+ffsdone:
+ bv,n 0(%r2)
+ nop
+ .EXIT
+ .PROCEND
diff --git a/c/src/exec/score/cpu/hppa1.1/hppa.h b/c/src/exec/score/cpu/hppa1.1/hppa.h
new file mode 100644
index 0000000000..88ab99c4e0
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/hppa.h
@@ -0,0 +1,716 @@
+/*
+ * Description:
+ *
+ * Definitions for HP PA Risc
+ * ref: PA RISC 1.1 Architecture and Instruction Set Reference Manual
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Note:
+ * This file is included by both C and assembler code ( -DASM )
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_HPPA_H
+#define _INCLUDE_HPPA_H
+
+#ifdef ASM
+#include <rtems/score/targopts.h>
+#endif
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*
+ * This section contains the information required to build
+ * RTEMS for a particular member of the Hewlett Packard
+ * PA-RISC family. It does this by setting variables to
+ * indicate which implementation dependent features are
+ * present in a particular member of the family.
+ */
+
+#if defined(hppa7100)
+
+#define CPU_MODEL_NAME "hppa 7100"
+
+#elif defined(hppa7200)
+
+#define CPU_MODEL_NAME "hppa 7200"
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#if !defined(CPU_NAME)
+#define CPU_NAME "HP PA-RISC 1.1"
+#endif
+
+/*
+ * Processor Status Word (PSW) Masks
+ */
+
+
+#define HPPA_PSW_Y 0x80000000 /* Data Debug Trap Disable */
+#define HPPA_PSW_Z 0x40000000 /* Instruction Debug Trap Disable */
+#define HPPA_PSW_r2 0x20000000 /* reserved */
+#define HPPA_PSW_r3 0x10000000 /* reserved */
+#define HPPA_PSW_r4 0x08000000 /* reserved */
+#define HPPA_PSW_E 0x04000000 /* Little Endian on Memory References */
+#define HPPA_PSW_S 0x02000000 /* Secure Interval Timer */
+#define HPPA_PSW_T 0x01000000 /* Taken Branch Trap Enable */
+#define HPPA_PSW_H 0x00800000 /* Higher-Privilege Transfer Trap Enable*/
+#define HPPA_PSW_L 0x00400000 /* Lower-Privilege Transfer Trap Enable */
+#define HPPA_PSW_N 0x00200000 /* PC Queue Front Instruction Nullified */
+#define HPPA_PSW_X 0x00100000 /* Data Memory Break Disable */
+#define HPPA_PSW_B 0x00080000 /* Taken Branch in Previous Cycle */
+#define HPPA_PSW_C 0x00040000 /* Code Address Translation Enable */
+#define HPPA_PSW_V 0x00020000 /* Divide Step Correction */
+#define HPPA_PSW_M 0x00010000 /* High-Priority Machine Check Disable */
+#define HPPA_PSW_CB 0x0000ff00 /* Carry/Borrow Bits */
+#define HPPA_PSW_r24 0x00000080 /* reserved */
+#define HPPA_PSW_G 0x00000040 /* Debug trap Enable */
+#define HPPA_PSW_F 0x00000020 /* Performance monitor interrupt unmask */
+#define HPPA_PSW_R 0x00000010 /* Recovery Counter Enable */
+#define HPPA_PSW_Q 0x00000008 /* Interruption State Collection Enable */
+#define HPPA_PSW_P 0x00000004 /* Protection ID Validation Enable */
+#define HPPA_PSW_D 0x00000002 /* Data Address Translation Enable */
+#define HPPA_PSW_I 0x00000001 /* External, Power Failure, */
+ /* Low-Priority Machine Check */
+ /* Interruption Enable */
+
+/*
+ * HPPA traps and interrupts
+ * basic layout. Note numbers do not denote priority
+ *
+ * 0-31 basic traps and interrupts defined by HPPA architecture
+ * 0-31 32 external interrupts
+ * 32-... bsp defined
+ */
+
+#define HPPA_TRAP_NON_EXISTENT 0
+/* group 1 */
+#define HPPA_TRAP_HIGH_PRIORITY_MACHINE_CHECK 1
+/* group 2 */
+#define HPPA_TRAP_POWER_FAIL 2
+#define HPPA_TRAP_RECOVERY_COUNTER 3
+#define HPPA_TRAP_EXTERNAL_INTERRUPT 4
+#define HPPA_TRAP_LOW_PRIORITY_MACHINE_CHECK 5
+#define HPPA_TRAP_PERFORMANCE_MONITOR 29
+/* group 3 */
+#define HPPA_TRAP_INSTRUCTION_TLB_MISS 6
+#define HPPA_TRAP_INSTRUCTION_MEMORY_PROTECTION 7
+#define HPPA_TRAP_INSTRUCTION_DEBUG 30
+#define HPPA_TRAP_ILLEGAL_INSTRUCTION 8
+#define HPPA_TRAP_BREAK_INSTRUCTION 9
+#define HPPA_TRAP_PRIVILEGED_OPERATION 10
+#define HPPA_TRAP_PRIVILEGED_REGISTER 11
+#define HPPA_TRAP_OVERFLOW 12
+#define HPPA_TRAP_CONDITIONAL 13
+#define HPPA_TRAP_ASSIST_EXCEPTION 14
+#define HPPA_TRAP_DATA_TLB_MISS 15
+#define HPPA_TRAP_NON_ACCESS_INSTRUCTION_TLB_MISS 16
+#define HPPA_TRAP_NON_ACCESS_DATA_TLB_MISS 17
+#define HPPA_TRAP_DATA_MEMORY_ACCESS_RIGHTS 26
+#define HPPA_TRAP_DATA_MEMORY_PROTECTION_ID 27
+#define HPPA_TRAP_UNALIGNED_DATA_REFERENCE 28
+#define HPPA_TRAP_DATA_MEMORY_PROTECTION 18
+#define HPPA_TRAP_DATA_MEMORY_BREAK 19
+#define HPPA_TRAP_TLB_DIRTY_BIT 20
+#define HPPA_TRAP_PAGE_REFERENCE 21
+#define HPPA_TRAP_DATA_DEBUG 31
+#define HPPA_TRAP_ASSIST_EMULATION 22
+/* group 4 */
+#define HPPA_TRAP_HIGHER_PRIVILEGE_TRANSFER 23
+#define HPPA_TRAP_LOWER_PRIVILEGE_TRANSFER 24
+#define HPPA_TRAP_TAKEN_BRANCH 25
+
+#define HPPA_INTERNAL_TRAPS 32
+
+/* External Interrupts via interrupt 4 */
+
+#define HPPA_INTERRUPT_EXTERNAL_0 0
+#define HPPA_INTERRUPT_EXTERNAL_1 1
+#define HPPA_INTERRUPT_EXTERNAL_2 2
+#define HPPA_INTERRUPT_EXTERNAL_3 3
+#define HPPA_INTERRUPT_EXTERNAL_4 4
+#define HPPA_INTERRUPT_EXTERNAL_5 5
+#define HPPA_INTERRUPT_EXTERNAL_6 6
+#define HPPA_INTERRUPT_EXTERNAL_7 7
+#define HPPA_INTERRUPT_EXTERNAL_8 8
+#define HPPA_INTERRUPT_EXTERNAL_9 9
+#define HPPA_INTERRUPT_EXTERNAL_10 10
+#define HPPA_INTERRUPT_EXTERNAL_11 11
+#define HPPA_INTERRUPT_EXTERNAL_12 12
+#define HPPA_INTERRUPT_EXTERNAL_13 13
+#define HPPA_INTERRUPT_EXTERNAL_14 14
+#define HPPA_INTERRUPT_EXTERNAL_15 15
+#define HPPA_INTERRUPT_EXTERNAL_16 16
+#define HPPA_INTERRUPT_EXTERNAL_17 17
+#define HPPA_INTERRUPT_EXTERNAL_18 18
+#define HPPA_INTERRUPT_EXTERNAL_19 19
+#define HPPA_INTERRUPT_EXTERNAL_20 20
+#define HPPA_INTERRUPT_EXTERNAL_21 21
+#define HPPA_INTERRUPT_EXTERNAL_22 22
+#define HPPA_INTERRUPT_EXTERNAL_23 23
+#define HPPA_INTERRUPT_EXTERNAL_24 24
+#define HPPA_INTERRUPT_EXTERNAL_25 25
+#define HPPA_INTERRUPT_EXTERNAL_26 26
+#define HPPA_INTERRUPT_EXTERNAL_27 27
+#define HPPA_INTERRUPT_EXTERNAL_28 28
+#define HPPA_INTERRUPT_EXTERNAL_29 29
+#define HPPA_INTERRUPT_EXTERNAL_30 30
+#define HPPA_INTERRUPT_EXTERNAL_31 31
+
+#define HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER HPPA_INTERRUPT_EXTERNAL_0
+#define HPPA_EXTERNAL_INTERRUPTS 32
+
+/* BSP defined interrupts begin here */
+
+#define HPPA_INTERRUPT_MAX 32
+
+/*
+ * Cache characteristics
+ */
+
+#define HPPA_CACHELINE_SIZE 32
+#define HPPA_CACHELINE_MASK (HPPA_CACHELINE_SIZE - 1)
+
+/*
+ * page size characteristics
+ */
+
+#define HPPA_PAGE_SIZE 4096
+#define HPPA_PAGE_MASK (0xfffff000)
+
+
+/*
+ * TLB characteristics
+ *
+ * Flags and Access Control layout for using TLB protection insertion
+ *
+ * 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
+ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * |?|?|T|D|B|type |PL1|Pl2|U| access id |?|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ */
+
+/*
+ * Access rights (type + PL1 + PL2)
+ */
+#define HPPA_PROT_R 0x00c00000 /* Read Only, no Write, no Execute */
+#define HPPA_PROT_RW 0x01c00000 /* Read & Write Only, no Execute */
+#define HPPA_PROT_RX 0x02c00000 /* Read & Execute Only, no Write */
+#define HPPA_PROT_RWX 0x03c00000 /* Read, Write, Execute */
+#define HPPA_PROT_X0 0x04c00000 /* Execute Only, Promote to Level 0 */
+#define HPPA_PROT_X1 0x05c00000 /* Execute Only, Promote to Level 1 */
+#define HPPA_PROT_X2 0x06c00000 /* Execute Only, Promote to Level 2 */
+#define HPPA_PROT_X3 0x07c00000 /* Execute Only, Promote to Level 3 */
+
+/*
+ * Floating point status register definitions
+ */
+
+#define HPPA_FPSTATUS_ENABLE_I 0x00000001 /* inexact operation */
+#define HPPA_FPSTATUS_ENABLE_U 0x00000002 /* underflow */
+#define HPPA_FPSTATUS_ENABLE_O 0x00000004 /* overflow */
+#define HPPA_FPSTATUS_ENABLE_Z 0x00000008 /* division by zero */
+#define HPPA_FPSTATUS_ENABLE_V 0x00000010 /* invalid operation */
+#define HPPA_FPSTATUS_D 0x00000020 /* denormalize as zero */
+#define HPPA_FPSTATUS_T 0x00000040 /* delayed trap */
+#define HPPA_FPSTATUS_RM_MASK 0x00000600 /* rounding mode */
+#define HPPA_FPSTATUS_RM_SHIFT 9
+#define HPPA_FPSTATUS_CQ_MASK 0x001FFC00 /* compare queue */
+#define HPPA_FPSTATUS_CQ_SHIFT 13
+#define HPPA_FPSTATUS_C 0x04000000 /* most recent ompare bit */
+#define HPPA_FPSTATUS_FLAG_I 0x08000000 /* inexact */
+#define HPPA_FPSTATUS_FLAG_U 0x10000000 /* underflow */
+#define HPPA_FPSTATUS_FLAG_O 0x20000000 /* overflow */
+#define HPPA_FPSTATUS_FLAG_Z 0x40000000 /* division by zero */
+#define HPPA_FPSTATUS_FLAG_V 0x80000000 /* invalid operation */
+
+
+/*
+ * Inline macros for misc. interesting opcodes
+ */
+
+/* generate a global label */
+#define HPPA_ASM_LABEL(label) \
+ asm(".export " label ", ! .label " label);
+
+/* Return From Interrupt RFI */
+#define HPPA_ASM_RFI() asm volatile ("rfi")
+
+/* Set System Mask SSM i,t */
+#define HPPA_ASM_SSM(i,gr) asm volatile ("ssm %1, %0" \
+ : "=r" (gr) \
+ : "i" (i))
+/* Reset System Mask RSM i,t */
+#define HPPA_ASM_RSM(i,gr) asm volatile ("rsm %1, %0" \
+ : "=r" (gr) \
+ : "i" (i))
+/* Move To System Mask MTSM r */
+#define HPPA_ASM_MTSM(gr) asm volatile ("mtsm %0" \
+ : : "r" (gr))
+
+/* Load Space Identifier LDSID (s,b),t */
+#define HPPA_ASM_LDSID(sr,grb,grt) asm volatile ("ldsid (%1,%2),%0" \
+ : "=r" (grt) \
+ : "i" (sr), \
+ "r" (grb))
+
+/*
+ * Gcc extended asm doesn't really allow for treatment of space registers
+ * as "registers", so we have to use "i" format.
+ * Unfortunately this means that the "=" constraint is not available.
+ */
+
+/* Move To Space Register MTSP r,sr */
+#define HPPA_ASM_MTSP(gr,sr) asm volatile ("mtsp %1,%0" \
+ : : "i" (sr), \
+ "r" (gr))
+
+/* Move From Space Register MFSP sr,t */
+#define HPPA_ASM_MFSP(sr,gr) asm volatile ("mfsp %1,%0" \
+ : "=r" (gr) \
+ : "i" (sr))
+
+/* Move To Control register MTCTL r,t */
+#define HPPA_ASM_MTCTL(gr,cr) asm volatile ("mtctl %1,%0" \
+ : : "i" (cr), \
+ "r" (gr))
+
+/* Move From Control register MFCTL r,t */
+#define HPPA_ASM_MFCTL(cr,gr) asm volatile ("mfctl %1,%0" \
+ : "=r" (gr) \
+ : "i" (cr))
+
+/* Synchronize caches SYNC */
+#define HPPA_ASM_SYNC() asm volatile ("sync")
+
+/* Probe Read Access PROBER (s,b),r,t */
+#define HPPA_ASM_PROBER(sr,groff,gracc,grt) \
+ asm volatile ("prober (%1,%2),%3,%0" \
+ : "=r" (grt) \
+ : "i" (sr), \
+ "r" (groff), \
+ "r" (gracc))
+
+/* Probe Read Access Immediate PROBERI (s,b),i,t*/
+#define HPPA_ASM_PROBERI(sr,groff,iacc,grt) \
+ asm volatile ("proberi (%1,%2),%3,%0" \
+ : "=r" (grt) \
+ : "i" (sr), \
+ "r" (groff), \
+ "i" (iacc))
+
+/* Probe Write Access PROBEW (s,b),r,t */
+#define HPPA_ASM_PROBEW(sr,groff,gracc,grt) \
+ asm volatile ("probew (%1,%2),%3,%0" \
+ : "=r" (grt) \
+ : "i" (sr), \
+ "r" (groff), \
+ "r" (gracc))
+
+/* Probe Write Access Immediate PROBEWI (s,b),i,t */
+#define HPPA_ASM_PROBEWI(sr,groff,iacc,grt) \
+ asm volatile ("probewi (%1,%2),%3,%0" \
+ : "=r" (grt) \
+ : "i" (sr), \
+ "r" (groff), \
+ "i" (iacc))
+
+/* Load Physical Address LPA x(s,b),t */
+#define HPPA_ASM_LPA(sr,grb,grt) asm volatile ("lpa %%r0(%1,%2),%0" \
+ : "=r" (grt) \
+ : "i" (sr), \
+ "r" (grb))
+
+/* Load Coherence Index LCI x(s,b),t */
+/* AKA: Load Hash Address LHA x(s,b),t */
+#define HPPA_ASM_LCI(grx,sr,grb,grt) asm volatile ("lha %1(%2,%3),%0" \
+ : "=r" (grt) \
+ : "r" (grx),\
+ "i" (sr), \
+ "r" (grb))
+#define HPPA_ASM_LHA(grx,sr,grb,grt) HPPA_ASM_LCI(grx,sr,grb,grt)
+
+/* Purge Data Tlb PDTLB x(s,b) */
+#define HPPA_ASM_PDTLB(grx,sr,grb) asm volatile ("pdtlb %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Purge Instruction Tlb PITLB x(s,b) */
+#define HPPA_ASM_PITLB(grx,sr,grb) asm volatile ("pitlb %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Purge Data Tlb Entry PDTLBE x(s,b) */
+#define HPPA_ASM_PDTLBE(grx,sr,grb) asm volatile ("pdtlbe %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Purge Instruction Tlb Entry PITLBE x(s,b) */
+#define HPPA_ASM_PITLBE(grx,sr,grb) asm volatile ("pitlbe %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+
+/* Insert Data TLB Address IDTLBA r,(s,b) */
+#define HPPA_ASM_IDTLBA(gr,sr,grb) asm volatile ("idtlba %0,(%1,%2)" \
+ : : "r" (gr), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Insert Instruction TLB Address IITLBA r,(s,b) */
+#define HPPA_ASM_IITLBA(gr,sr,grb) asm volatile ("iitlba %0,(%1,%2)" \
+ : : "r" (gr), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Insert Data TLB Protection IDTLBP r,(s,b) */
+#define HPPA_ASM_IDTLBP(gr,sr,grb) asm volatile ("idtlbp %0,(%1,%2)" \
+ : : "r" (gr), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Insert Instruction TLB Protection IITLBP r,(s,b) */
+#define HPPA_ASM_IITLBP(gr,sr,grb) asm volatile ("iitlbp %0,(%1,%2)" \
+ : : "r" (gr), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Purge Data Cache PDC x(s,b) */
+#define HPPA_ASM_PDC(grx,sr,grb) asm volatile ("pdc %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Flush Data Cache FDC x(s,b) */
+#define HPPA_ASM_FDC(grx,sr,grb) asm volatile ("fdc %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Flush Instruction Cache FDC x(s,b) */
+#define HPPA_ASM_FIC(grx,sr,grb) asm volatile ("fic %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Flush Data Cache Entry FDCE x(s,b) */
+#define HPPA_ASM_FDCE(grx,sr,grb) asm volatile ("fdce %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Flush Instruction Cache Entry FICE x(s,b) */
+#define HPPA_ASM_FICE(grx,sr,grb) asm volatile ("fice %0(%1,%2)" \
+ : : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Break BREAK i5,i13 */
+#define HPPA_ASM_BREAK(i5,i13) asm volatile ("break %0,%1" \
+ : : "i" (i5), \
+ "i" (i13))
+
+/* Load and Clear Word Short LDCWS d(s,b),t */
+#define HPPA_ASM_LDCWS(i,sr,grb,grt) asm volatile ("ldcws %1(%2,%3),%0" \
+ : "=r" (grt) \
+ : "i" (i), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Load and Clear Word Indexed LDCWX x(s,b),t */
+#define HPPA_ASM_LDCWX(grx,sr,grb,grt) asm volatile ("ldcwx %1(%2,%3),%0" \
+ : "=r" (grt) \
+ : "r" (grx), \
+ "i" (sr), \
+ "r" (grb))
+
+/* Load Word Absolute Short LDWAS d(b),t */
+/* NOTE: "short" here means "short displacement" */
+#define HPPA_ASM_LDWAS(disp,grbase,gr) asm volatile("ldwas %1(%2),%0" \
+ : "=r" (gr) \
+ : "i" (disp), \
+ "r" (grbase))
+
+/* Store Word Absolute Short STWAS r,d(b) */
+/* NOTE: "short" here means "short displacement" */
+#define HPPA_ASM_STWAS(gr,disp,grbase) asm volatile("stwas %0,%1(%2)" \
+ : : "r" (gr), \
+ "i" (disp), \
+ "r" (grbase))
+
+/*
+ * Swap bytes
+ * REFERENCE: PA72000 TRM -- Appendix C
+ */
+#define HPPA_ASM_SWAPBYTES(value, swapped) asm volatile( \
+ " shd %1,%1,16,%0 \n\
+ dep %0,15,8,%0 \n\
+ shd %1,%0,8,%0" \
+ : "=r" (swapped) \
+ : "r" (value) \
+ )
+
+
+/* 72000 Diagnose instructions follow
+ * These macros assume gas knows about these instructions.
+ * gas2.2.u1 did not.
+ * I added them to my copy and installed it locally.
+ *
+ * There are *very* special requirements for these guys
+ * ref: TRM 6.1.3 Programming Constraints
+ *
+ * The macros below handle the following rules
+ *
+ * Except for WIT, WDT, WDD, WIDO, WIDE, all DIAGNOSE must be doubled.
+ * Must never be nullified (hence the leading nop)
+ * NOP must preced every RDD,RDT,WDD,WDT,RDTLB
+ * Instruction preceeding GR_SHDW must not set any of the GR's saved
+ *
+ * The macros do *NOT* deal with the following problems
+ * doubled DIAGNOSE instructions must not straddle a page boundary
+ * if code translation enabled. (since 2nd could trap on ITLB)
+ * If you care about DHIT and DPE bits of DR0, then
+ * No store instruction in the 2 insn window before RDD
+ */
+
+
+/* Move To CPU/DIAG register MTCPU r,t */
+#define HPPA_ASM_MTCPU(gr,dr) asm volatile (" nop \n" \
+ " mtcpu %1,%0 \n" \
+ " mtcpu %1,%0" \
+ : : "i" (dr), \
+ "r" (gr))
+
+/* Move From CPU/DIAG register MFCPU r,t */
+#define HPPA_ASM_MFCPU(dr,gr) asm volatile (" nop \n" \
+ " mfcpu %1,%0\n" \
+ " mfcpu %1,%0" \
+ : "=r" (gr) \
+ : "i" (dr))
+
+/* Transfer of Control Enable TOC_EN */
+#define HPPA_ASM_TOC_EN() asm volatile (" tocen \n" \
+ " tocen")
+
+/* Transfer of Control Disable TOC_DIS */
+#define HPPA_ASM_TOC_DIS() asm volatile (" tocdis \n" \
+ " tocdis")
+
+/* Shadow Registers to General Register SHDW_GR */
+#define HPPA_ASM_SHDW_GR() asm volatile (" shdwgr \n" \
+ " shdwgr" \
+ ::: "r1" "r8" "r9" "r16" \
+ "r17" "r24" "r25")
+
+/* General Registers to Shadow Register GR_SHDW */
+#define HPPA_ASM_GR_SHDW() asm volatile (" nop \n" \
+ " grshdw \n" \
+ " grshdw")
+
+/*
+ * Definitions of special registers for use by the above macros.
+ */
+
+/* Hardware Space Registers */
+#define HPPA_SR0 0
+#define HPPA_SR1 1
+#define HPPA_SR2 2
+#define HPPA_SR3 3
+#define HPPA_SR4 4
+#define HPPA_SR5 5
+#define HPPA_SR6 6
+#define HPPA_SR7 7
+
+/* Hardware Control Registers */
+#define HPPA_CR0 0
+#define HPPA_RCTR 0 /* Recovery Counter Register */
+
+#define HPPA_CR8 8 /* Protection ID 1 */
+#define HPPA_PIDR1 8
+
+#define HPPA_CR9 9 /* Protection ID 2 */
+#define HPPA_PIDR2 9
+
+#define HPPA_CR10 10
+#define HPPA_CCR 10 /* Coprocessor Confiquration Register */
+
+#define HPPA_CR11 11
+#define HPPA_SAR 11 /* Shift Amount Register */
+
+#define HPPA_CR12 12
+#define HPPA_PIDR3 12 /* Protection ID 3 */
+
+#define HPPA_CR13 13
+#define HPPA_PIDR4 13 /* Protection ID 4 */
+
+#define HPPA_CR14 14
+#define HPPA_IVA 14 /* Interrupt Vector Address */
+
+#define HPPA_CR15 15
+#define HPPA_EIEM 15 /* External Interrupt Enable Mask */
+
+#define HPPA_CR16 16
+#define HPPA_ITMR 16 /* Interval Timer */
+
+#define HPPA_CR17 17
+#define HPPA_PCSQ 17 /* Program Counter Space queue */
+
+#define HPPA_CR18 18
+#define HPPA_PCOQ 18 /* Program Counter Offset queue */
+
+#define HPPA_CR19 19
+#define HPPA_IIR 19 /* Interruption Instruction Register */
+
+#define HPPA_CR20 20
+#define HPPA_ISR 20 /* Interruption Space Register */
+
+#define HPPA_CR21 21
+#define HPPA_IOR 21 /* Interruption Offset Register */
+
+#define HPPA_CR22 22
+#define HPPA_IPSW 22 /* Interrpution Processor Status Word */
+
+#define HPPA_CR23 23
+#define HPPA_EIRR 23 /* External Interrupt Request */
+
+#define HPPA_CR24 24
+#define HPPA_PPDA 24 /* Physcial Page Directory Address */
+#define HPPA_TR0 24 /* Temporary register 0 */
+
+#define HPPA_CR25 25
+#define HPPA_HTA 25 /* Hash Table Address */
+#define HPPA_TR1 25 /* Temporary register 1 */
+
+#define HPPA_CR26 26
+#define HPPA_TR2 26 /* Temporary register 2 */
+
+#define HPPA_CR27 27
+#define HPPA_TR3 27 /* Temporary register 3 */
+
+#define HPPA_CR28 28
+#define HPPA_TR4 28 /* Temporary register 4 */
+
+#define HPPA_CR29 29
+#define HPPA_TR5 29 /* Temporary register 5 */
+
+#define HPPA_CR30 30
+#define HPPA_TR6 30 /* Temporary register 6 */
+
+#define HPPA_CR31 31
+#define HPPA_CPUID 31 /* MP identifier */
+
+/*
+ * Diagnose registers
+ */
+
+#define HPPA_DR0 0
+#define HPPA_DR1 1
+#define HPPA_DR8 8
+#define HPPA_DR24 24
+#define HPPA_DR25 25
+
+/*
+ * Tear apart a break instruction to find its type.
+ */
+#define HPPA_BREAK5(x) ((x) & 0x1F)
+#define HPPA_BREAK13(x) (((x) >> 13) & 0x1FFF)
+
+/* assemble a break instruction */
+#define HPPA_BREAK(i5,i13) (((i5) & 0x1F) | (((i13) & 0x1FFF) << 13))
+
+
+/*
+ * this won't work in ASM or non-GNU compilers
+ */
+
+#if !defined(ASM) && defined(__GNUC__)
+
+/*
+ * static inline utility functions to get at control registers
+ */
+
+#define EMIT_GET_CONTROL(name, reg) \
+static __inline__ unsigned int \
+get_ ## name (void) \
+{ \
+ unsigned int value; \
+ HPPA_ASM_MFCTL(reg, value); \
+ return value; \
+}
+
+#define EMIT_SET_CONTROL(name, reg) \
+static __inline__ void \
+set_ ## name (unsigned int new_value) \
+{ \
+ HPPA_ASM_MTCTL(new_value, reg); \
+}
+
+#define EMIT_CONTROLS(name, reg) \
+ EMIT_GET_CONTROL(name, reg) \
+ EMIT_SET_CONTROL(name, reg)
+
+EMIT_CONTROLS(recovery, HPPA_RCTR); /* CR0 */
+EMIT_CONTROLS(pid1, HPPA_PIDR1); /* CR8 */
+EMIT_CONTROLS(pid2, HPPA_PIDR2); /* CR9 */
+EMIT_CONTROLS(ccr, HPPA_CCR); /* CR10; CCR and SCR share CR10 */
+EMIT_CONTROLS(scr, HPPA_CCR); /* CR10; CCR and SCR share CR10 */
+EMIT_CONTROLS(sar, HPPA_SAR); /* CR11 */
+EMIT_CONTROLS(pid3, HPPA_PIDR3); /* CR12 */
+EMIT_CONTROLS(pid4, HPPA_PIDR4); /* CR13 */
+EMIT_CONTROLS(iva, HPPA_IVA); /* CR14 */
+EMIT_CONTROLS(eiem, HPPA_EIEM); /* CR15 */
+EMIT_CONTROLS(itimer, HPPA_ITMR); /* CR16 */
+EMIT_CONTROLS(pcsq, HPPA_PCSQ); /* CR17 */
+EMIT_CONTROLS(pcoq, HPPA_PCOQ); /* CR18 */
+EMIT_CONTROLS(iir, HPPA_IIR); /* CR19 */
+EMIT_CONTROLS(isr, HPPA_ISR); /* CR20 */
+EMIT_CONTROLS(ior, HPPA_IOR); /* CR21 */
+EMIT_CONTROLS(ipsw, HPPA_IPSW); /* CR22 */
+EMIT_CONTROLS(eirr, HPPA_EIRR); /* CR23 */
+EMIT_CONTROLS(tr0, HPPA_TR0); /* CR24 */
+EMIT_CONTROLS(tr1, HPPA_TR1); /* CR25 */
+EMIT_CONTROLS(tr2, HPPA_TR2); /* CR26 */
+EMIT_CONTROLS(tr3, HPPA_TR3); /* CR27 */
+EMIT_CONTROLS(tr4, HPPA_TR4); /* CR28 */
+EMIT_CONTROLS(tr5, HPPA_TR5); /* CR29 */
+EMIT_CONTROLS(tr6, HPPA_TR6); /* CR30 */
+EMIT_CONTROLS(tr7, HPPA_CR31); /* CR31 */
+
+#endif /* ASM and GNU */
+
+/*
+ * If and How to invoke the debugger (a ROM debugger generally)
+ */
+#define CPU_INVOKE_DEBUGGER \
+ do { \
+ HPPA_ASM_BREAK(1,1); \
+ } while (0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_HPPA_H */
+
diff --git a/c/src/exec/score/cpu/hppa1.1/hppatypes.h b/c/src/exec/score/cpu/hppa1.1/hppatypes.h
new file mode 100644
index 0000000000..512323819b
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/hppatypes.h
@@ -0,0 +1,46 @@
+/* hppatypes.h
+ *
+ * This include file contains type definitions pertaining to the Hewlett
+ * Packard PA-RISC processor family.
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_HPPATYPES_H
+#define _INCLUDE_HPPATYPES_H
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* 8-bit unsigned integer */
+typedef unsigned short unsigned16; /* 16-bit unsigned integer */
+typedef unsigned int unsigned32; /* 32-bit unsigned integer */
+typedef unsigned long long unsigned64; /* 64-bit unsigned integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif /* _INCLUDE_HPPATYPES_H */
+/* end of include file */
diff --git a/c/src/exec/score/cpu/hppa1.1/rtems.s b/c/src/exec/score/cpu/hppa1.1/rtems.s
new file mode 100644
index 0000000000..66764ae4d9
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/rtems.s
@@ -0,0 +1,53 @@
+/* rtems.S
+ *
+ * This file contains the single entry point code for
+ * the HPPA implementation of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/score/hppa.h>
+#include <rtems/score/cpu_asm.h>
+
+ .SPACE $PRIVATE$
+ .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
+ .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
+ .SPACE $TEXT$
+ .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
+ .SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
+ .SPACE $TEXT$
+ .SUBSPA $CODE$
+
+ .align 32
+ .EXPORT cpu_jump_to_directive,ENTRY,PRIV_LEV=0
+cpu_jump_to_directive
+ .PROC
+ .CALLINFO FRAME=0,NO_CALLS
+ .ENTRY
+
+# invoke user interrupt handler
+
+# XXX: look at register usage and code
+# XXX: this is not necessarily right!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+# r9 = directive number
+
+ .import _Entry_points,data
+ ldil L%_Entry_points,%r8
+ ldo R%_Entry_points(%r8),%r8
+ ldwx,s %r9(%r8),%r8
+
+ .call ARGW0=GR
+ bv,n 0(%r8)
+ nop
+
+ .EXIT
+ .PROCEND
+
diff --git a/c/src/exec/score/cpu/i386/Makefile.in b/c/src/exec/score/cpu/i386/Makefile.in
new file mode 100644
index 0000000000..81a4978937
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/Makefile.in
@@ -0,0 +1,86 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpu
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/i386types.h
+
+# H_FILES that get installed externally
+# i386.h is handled specially
+EXTERNAL_H_FILES = $(srcdir)/asm.h
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=cpu_asm rtems
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+install: all
+
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/i386.h \
+ ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/i386.h: i386.h
+ $(SED) -e 's?REPLACE_THIS_WITH_THE_CPU_MODEL?$(RTEMS_CPU_MODEL)?' \
+ -e 's?REPLACE_THIS_WITH_THE_BSP?$(RTEMS_BSP)?' \
+ < $< >$(ARCH)/i386.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/i386.h-tmp $@
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/i386/asm.h b/c/src/exec/score/cpu/i386/asm.h
new file mode 100644
index 0000000000..aff04bded3
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/asm.h
@@ -0,0 +1,143 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __i386_ASM_h
+#define __i386_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/i386.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+/*
+ * Go32 suffers the same bug as __REGISTER_PREFIX__
+ */
+
+#if __GO32__
+#undef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+/*
+ * Looks like there is a bug in gcc 2.6.2 where this is not
+ * defined correctly when configured as i386-coff and
+ * i386-aout.
+ */
+
+#undef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__ %
+
+/*
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+*/
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define eax REG (eax)
+#define ebx REG (ebx)
+#define ecx REG (ecx)
+#define edx REG (edx)
+#define esi REG (esi)
+#define edi REG (edi)
+#define esp REG (esp)
+#define ebp REG (ebp)
+
+#define ax REG (ax)
+#define bx REG (bx)
+#define cx REG (cx)
+#define dx REG (dx)
+#define si REG (si)
+#define di REG (di)
+#define sp REG (sp)
+#define bp REG (bp)
+
+#define ah REG (ah)
+#define al REG (al)
+
+#define cs REG (cs)
+#define ds REG (ds)
+#define es REG (es)
+#define fs REG (fs)
+#define gs REG (gs)
+#define ss REG (ss)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/exec/score/cpu/i386/cpu.c b/c/src/exec/score/cpu/i386/cpu.c
new file mode 100644
index 0000000000..c7f8ff2477
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/cpu.c
@@ -0,0 +1,177 @@
+/*
+ * Intel i386 Dependent Source
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ register unsigned16 fp_status asm ("ax");
+ register void *fp_context;
+
+ _CPU_Table = *cpu_table;
+
+ /*
+ * The following code saves a NULL i387 context which is given
+ * to each task at start and restart time. The following code
+ * is based upon that provided in the i386 Programmer's
+ * Manual and should work on any coprocessor greater than
+ * the i80287.
+ *
+ * NOTE: The NO RTEMS_WAIT form of the coprocessor instructions
+ * MUST be used in case there is not a coprocessor
+ * to wait for.
+ */
+
+ fp_status = 0xa5a5;
+ asm volatile( "fninit" );
+ asm volatile( "fnstsw %0" : "=a" (fp_status) : "0" (fp_status) );
+
+ if ( fp_status == 0 ) {
+
+ fp_context = &_CPU_Null_fp_context;
+
+ asm volatile( "fsave (%0)" : "=r" (fp_context)
+ : "0" (fp_context)
+ );
+ }
+}
+
+/*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
+ */
+
+#if __GO32__
+#include <go32.h>
+#include <dpmi.h>
+#endif /* __GO32__ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+#if __GO32__
+ _go32_dpmi_seginfo handler_info;
+
+ /* get the address of the old handler */
+ _go32_dpmi_get_protected_mode_interrupt_vector( vector, &handler_info);
+
+ /* Notice how we're failing to save the pm_segment portion of the */
+ /* structure here? That means we might crash the system if we */
+ /* try to restore the ISR. Can't fix this until i386_isr is */
+ /* redefined. XXX [BHC]. */
+ *old_handler = (proc_ptr *) handler_info.pm_offset;
+
+ handler_info.pm_offset = (u_long) new_handler;
+ handler_info.pm_selector = _go32_my_cs();
+
+ /* install the IDT entry */
+ _go32_dpmi_set_protected_mode_interrupt_vector( vector, &handler_info );
+#else
+ i386_IDT_slot idt;
+ unsigned32 handler;
+
+ *old_handler = 0; /* XXX not supported */
+
+ handler = (unsigned32) new_handler;
+
+ /* build the IDT entry */
+ idt.offset_0_15 = handler & 0xffff;
+ idt.segment_selector = i386_get_cs();
+ idt.reserved = 0x00;
+ idt.p_dpl = 0x8e; /* present, ISR */
+ idt.offset_16_31 = handler >> 16;
+
+ /* install the IDT entry */
+ i386_Install_idt(
+ (unsigned32) &idt,
+ _CPU_Table.interrupt_table_segment,
+ (unsigned32) _CPU_Table.interrupt_table_offset + (8 * vector)
+ );
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _ISR_Handler_0(), _ISR_Handler_1();
+
+#define PER_ISR_ENTRY \
+ (((unsigned32) _ISR_Handler_1 - (unsigned32) _ISR_Handler_0))
+
+#define _Interrupt_Handler_entry( _vector ) \
+ (((unsigned32)_ISR_Handler_0) + ((_vector) * PER_ISR_ENTRY))
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr ignored;
+ unsigned32 unique_handler;
+
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /* calculate the unique entry point for this vector */
+ unique_handler = _Interrupt_Handler_entry( vector );
+
+ _CPU_ISR_install_raw_handler( vector, (void *)unique_handler, &ignored );
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
diff --git a/c/src/exec/score/cpu/i386/cpu.h b/c/src/exec/score/cpu/i386/cpu.h
new file mode 100644
index 0000000000..f847de2b1a
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/cpu.h
@@ -0,0 +1,399 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the Intel
+ * i386 processor.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/i386.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/i386types.h>
+#endif
+
+/* conditional compilation parameters */
+
+#define CPU_INLINE_ENABLE_DISPATCH TRUE
+#define CPU_UNROLL_ENQUEUE_PRIORITY FALSE
+
+/*
+ * i386 has an RTEMS allocated and managed interrupt stack.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+
+/*
+ * Some family members have no FP, some have an FPU such as the i387
+ * for the i386, others have it built in (i486DX, Pentium).
+ */
+
+#if ( I386_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE /* i387 for i386 */
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+#define CPU_IDLE_TASK_IS_FP FALSE
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY FALSE
+#define CPU_STACK_GROWS_UP FALSE
+#define CPU_STRUCTURE_ALIGNMENT
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN FALSE
+#define CPU_LITTLE_ENDIAN TRUE
+
+/* structures */
+
+/*
+ * Basic integer context for the i386 family.
+ */
+
+typedef struct {
+ unsigned32 eflags; /* extended flags register */
+ void *esp; /* extended stack pointer register */
+ void *ebp; /* extended base pointer register */
+ unsigned32 ebx; /* extended bx register */
+ unsigned32 esi; /* extended source index register */
+ unsigned32 edi; /* extended destination index flags register */
+} Context_Control;
+
+/*
+ * FP context save area for the i387 numeric coprocessors.
+ */
+
+typedef struct {
+ unsigned8 fp_save_area[108]; /* context size area for I80387 */
+ /* 28 bytes for environment */
+} Context_Control_fp;
+
+/*
+ * The following structure defines the set of information saved
+ * on the current stack by RTEMS upon receipt of each interrupt.
+ */
+
+typedef struct {
+ unsigned32 TBD; /* XXX Fix for this CPU */
+} CPU_Interrupt_frame;
+
+/*
+ * The following table contains the information required to configure
+ * the i386 specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ unsigned32 interrupt_table_segment;
+ void *interrupt_table_offset;
+} rtems_cpu_table;
+
+/*
+ * context size area for floating point
+ *
+ * NOTE: This is out of place on the i386 to avoid a forward reference.
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/* variables */
+
+SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+/* constants */
+
+/*
+ * This defines the number of levels and the mask used to pick those
+ * bits out of a thread mode.
+ */
+
+#define CPU_MODES_INTERRUPT_LEVEL 0x00000001 /* interrupt level in mode */
+#define CPU_MODES_INTERRUPT_MASK 0x00000001 /* interrupt level in mode */
+
+/*
+ * extra stack required by the MPCI receive server thread
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 1024
+
+/*
+ * i386 family supports 256 distinct vectors.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 256
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Minimum size of a thread's stack.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE 1024
+
+/*
+ * i386 is pretty tolerant of alignment. Just put things on 4 byte boundaries.
+ */
+
+#define CPU_ALIGNMENT 4
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * On i386 thread stacks require no further alignment after allocation
+ * from the Workspace.
+ */
+
+#define CPU_STACK_ALIGNMENT 0
+
+/* macros */
+
+/*
+ * ISR handler macros
+ *
+ * These macros perform the following functions:
+ * + disable all maskable CPU interrupts
+ * + restore previous interrupt level (enable)
+ * + temporarily restore interrupts (flash)
+ * + set a particular level
+ */
+
+#define _CPU_ISR_Disable( _level ) i386_disable_interrupts( _level )
+
+#define _CPU_ISR_Enable( _level ) i386_enable_interrupts( _level )
+
+#define _CPU_ISR_Flash( _level ) i386_flash_interrupts( _level )
+
+#define _CPU_ISR_Set_level( _new_level ) \
+ { \
+ if ( _new_level ) asm volatile ( "cli" ); \
+ else asm volatile ( "sti" ); \
+ }
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/*
+ * Context handler macros
+ *
+ * These macros perform the following functions:
+ * + initialize a context area
+ * + restart the current thread
+ * + calculate the initial pointer into a FP context area
+ * + initialize an FP context area
+ */
+
+#define CPU_EFLAGS_INTERRUPTS_ON 0x00003202
+#define CPU_EFLAGS_INTERRUPTS_OFF 0x00003002
+
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point, _is_fp ) \
+ do { \
+ unsigned32 _stack; \
+ \
+ if ( (_isr) ) (_the_context)->eflags = CPU_EFLAGS_INTERRUPTS_OFF; \
+ else (_the_context)->eflags = CPU_EFLAGS_INTERRUPTS_ON; \
+ \
+ _stack = ((unsigned32)(_stack_base)) + (_size) - 4; \
+ \
+ *((proc_ptr *)(_stack)) = (_entry_point); \
+ (_the_context)->ebp = (void *) _stack; \
+ (_the_context)->esp = (void *) _stack; \
+ } while (0)
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+#define _CPU_Context_Initialize_fp( _fp_area ) \
+ { \
+ unsigned32 *_source = (unsigned32 *) &_CPU_Null_fp_context; \
+ unsigned32 *_destination = *(_fp_area); \
+ unsigned32 _index; \
+ \
+ for ( _index=0 ; _index < CPU_CONTEXT_FP_SIZE/4 ; _index++ ) \
+ *_destination++ = *_source++; \
+ }
+
+/* end of Context handler macros */
+
+/*
+ * Fatal Error manager macros
+ *
+ * These macros perform the following functions:
+ * + disable interrupts and halt the CPU
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ { \
+ asm volatile ( "cli ; \
+ movl %0,%%eax ; \
+ hlt" \
+ : "=r" ((_error)) : "0" ((_error)) \
+ ); \
+ }
+
+/* end of Fatal Error manager macros */
+
+/*
+ * Bitfield handler macros
+ *
+ * These macros perform the following functions:
+ * + scan for the highest numbered (MSB) set in a 16 bit bitfield
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE FALSE
+#define CPU_USE_GENERIC_BITFIELD_DATA FALSE
+
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ register unsigned16 __value_in_register = (_value); \
+ \
+ _output = 0; \
+ \
+ asm volatile ( "bsfw %0,%1 " \
+ : "=r" (__value_in_register), "=r" (_output) \
+ : "0" (__value_in_register), "1" (_output) \
+ ); \
+ }
+
+/* end of Bitfield handler macros */
+
+/*
+ * Priority handler macros
+ *
+ * These macros perform the following functions:
+ * + return a mask with the bit for this major/minor portion of
+ * of thread priority set.
+ * + translate the bit number returned by "Bitfield_find_first_bit"
+ * into an index into the thread ready chain bit maps
+ */
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 1 << (_bit_number) )
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner and avoid stack conflicts.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/i386/cpu_asm.s b/c/src/exec/score/cpu/i386/cpu_asm.s
new file mode 100644
index 0000000000..3bd4126a01
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/cpu_asm.s
@@ -0,0 +1,660 @@
+/* cpu_asm.s
+ *
+ * This file contains all assembly code for the Intel i386 implementation
+ * of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+
+/*
+ * Format of i386 Register structure
+ */
+
+.set REG_EFLAGS, 0
+.set REG_ESP, REG_EFLAGS + 4
+.set REG_EBP, REG_ESP + 4
+.set REG_EBX, REG_EBP + 4
+.set REG_ESI, REG_EBX + 4
+.set REG_EDI, REG_ESI + 4
+.set SIZE_REGS, REG_EDI + 4
+
+ BEGIN_CODE
+
+/*
+ * void _CPU_Context_switch( run_context, heir_context )
+ *
+ * This routine performs a normal non-FP context.
+ */
+
+ .align 2
+ PUBLIC (_CPU_Context_switch)
+
+.set RUNCONTEXT_ARG, 4 # save context argument
+.set HEIRCONTEXT_ARG, 8 # restore context argument
+
+SYM (_CPU_Context_switch):
+ movl RUNCONTEXT_ARG(esp),eax # eax = running threads context
+ pushf # push eflags
+ popl REG_EFLAGS(eax) # save eflags
+ movl esp,REG_ESP(eax) # save stack pointer
+ movl ebp,REG_EBP(eax) # save base pointer
+ movl ebx,REG_EBX(eax) # save ebx
+ movl esi,REG_ESI(eax) # save source register
+ movl edi,REG_EDI(eax) # save destination register
+
+ movl HEIRCONTEXT_ARG(esp),eax # eax = heir threads context
+
+restore:
+ pushl REG_EFLAGS(eax) # push eflags
+ popf # restore eflags
+ movl REG_ESP(eax),esp # restore stack pointer
+ movl REG_EBP(eax),ebp # restore base pointer
+ movl REG_EBX(eax),ebx # restore ebx
+ movl REG_ESI(eax),esi # restore source register
+ movl REG_EDI(eax),edi # restore destination register
+ ret
+
+/*
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+/*
+ * void _CPU_Context_restore( new_context )
+ *
+ * This routine performs a normal non-FP context.
+ */
+
+ PUBLIC (_CPU_Context_restore)
+
+.set NEWCONTEXT_ARG, 4 # context to restore argument
+
+SYM (_CPU_Context_restore):
+
+ movl NEWCONTEXT_ARG(esp),eax # eax = running threads context
+ jmp restore
+
+/*PAGE
+ * void _CPU_Context_save_fp_context( &fp_context_ptr )
+ * void _CPU_Context_restore_fp_context( &fp_context_ptr )
+ *
+ * This section is used to context switch an i80287, i80387,
+ * the built-in coprocessor or the i80486 or compatible.
+ */
+
+.set FPCONTEXT_ARG, 4 # FP context argument
+
+ .align 2
+ PUBLIC (_CPU_Context_save_fp)
+SYM (_CPU_Context_save_fp):
+ movl FPCONTEXT_ARG(esp),eax # eax = &ptr to FP context area
+ movl (eax),eax # eax = FP context area
+ fsave (eax) # save FP context
+ ret
+
+ .align 2
+ PUBLIC (_CPU_Context_restore_fp)
+SYM (_CPU_Context_restore_fp):
+ movl FPCONTEXT_ARG(esp),eax # eax = &ptr to FP context area
+ movl (eax),eax # eax = FP context area
+ frstor (eax) # restore FP context
+ ret
+
+/*PAGE
+ * void _ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ * NOTE:
+ * Upon entry, the stack will contain a stack frame back to the
+ * interrupted task. If dispatching is enabled, this is the
+ * outer most interrupt, and (a context switch is necessary or
+ * the current task has signals), then set up the stack to
+ * transfer control to the interrupt dispatcher.
+ */
+
+.set SET_SEGMENT_REGISTERS_IN_INTERRUPT, 0
+
+.set SAVED_REGS , 32 # space consumed by saved regs
+.set EIP_OFFSET , SAVED_REGS # offset of tasks eip
+.set CS_OFFSET , EIP_OFFSET+4 # offset of tasks code segment
+.set EFLAGS_OFFSET , CS_OFFSET+4 # offset of tasks eflags
+
+ .align 2
+ PUBLIC (_ISR_Handler)
+
+SYM (_ISR_Handler):
+ /*
+ * Before this was point is reached the vectors unique
+ * entry point did the following:
+ *
+ * 1. saved all registers with a "pusha"
+ * 2. put the vector number in eax.
+ *
+ * BEGINNING OF ESTABLISH SEGMENTS
+ *
+ * WARNING: If an interrupt can occur when the segments are
+ * not correct, then this is where we should establish
+ * the segments. In addition to establishing the
+ * segments, it may be necessary to establish a stack
+ * in the current data area on the outermost interrupt.
+ *
+ * NOTE: If the previous values of the segment registers are
+ * pushed, do not forget to adjust SAVED_REGS.
+ *
+ * NOTE: Make sure the exit code which restores these
+ * when this type of code is needed.
+ */
+
+ /***** ESTABLISH SEGMENTS CODE GOES HERE ******/
+
+ /*
+ * END OF ESTABLISH SEGMENTS
+ */
+
+ /*
+ * Now switch stacks if necessary
+ */
+
+ movl esp, edx # edx = previous stack pointer
+ cmpl $0, SYM (_ISR_Nest_level) # is this the outermost interrupt?
+ jne nested # No, then continue
+ movl SYM (_CPU_Interrupt_stack_high), esp
+
+ /*
+ * We want to insure that the old stack pointer is on the
+ * stack we will be on at the end of the ISR when we restore it.
+ * By saving it on every interrupt, all we have to do is pop it
+ * near the end of every interrupt.
+ */
+
+nested:
+ pushl edx # save the previous stack pointer
+ incl SYM (_ISR_Nest_level) # one nest level deeper
+ incl SYM (_Thread_Dispatch_disable_level) # disable multitasking
+
+ # EAX is preloaded with the vector number.
+ push eax # push vector number
+ mov SYM (_ISR_Vector_table) (,eax,4),eax
+ # eax = Users handler
+ call eax # invoke user ISR
+ pop eax # eax = vector number
+
+ decl SYM (_ISR_Nest_level) # one less ISR nest level
+ # If interrupts are nested,
+ # then dispatching is disabled
+
+ decl SYM (_Thread_Dispatch_disable_level)
+ # unnest multitasking
+ # Is dispatch disabled
+ jne exit # Yes, then exit
+
+ cmpl $0, SYM (_Context_Switch_necessary)
+ # Is task switch necessary?
+ jne bframe # Yes, then build stack
+
+ cmpl $0, SYM (_ISR_Signals_to_thread_executing)
+ # signals sent to Run_thread
+ # while in interrupt handler?
+ je exit # No, exit
+
+bframe:
+ cli # DISABLE INTERRUPTS!!
+ popl esp # restore the stack pointer
+ movl $0, SYM (_ISR_Signals_to_thread_executing)
+ # push the isf for Isr_dispatch
+ push EFLAGS_OFFSET(esp) # push tasks eflags
+ push cs # cs of Isr_dispatch
+ push $ SYM (_ISR_Dispatch) # entry point
+ iret
+
+exit:
+ cli # DISABLE INTERRUPTS!!
+ popl esp # restore the stack pointer
+
+ /*
+ * BEGINNING OF DE-ESTABLISH SEGMENTS
+ *
+ * NOTE: Make sure there is code here if code is added to
+ * load the segment registers.
+ *
+ */
+
+ /******* DE-ESTABLISH SEGMENTS CODE GOES HERE ********/
+
+ /*
+ * END OF DE-ESTABLISH SEGMENTS
+ */
+
+ popa # restore general registers
+ iret
+
+/*PAGE
+ * Distinct Interrupt Entry Points
+ *
+ * The following macro and the 256 instantiations of the macro
+ * are necessary to determine which interrupt vector occurred.
+ * The following macro allows a unique entry point to be defined
+ * for each vector.
+ *
+ * NOTE: There are not spaces around the vector number argument
+ * to the DISTINCT_INTERRUPT_ENTRY macro because m4 will
+ * undesirably generate the symbol "_Isr_handler_ N"
+ * instead of "_Isr_handler_N" like we want.
+ */
+
+#define DISTINCT_INTERRUPT_ENTRY(_vector) \
+ .align 16 ; \
+ PUBLIC (_ISR_Handler_ ## _vector ) ; \
+SYM (_ISR_Handler_ ## _vector ): \
+ pusha ; \
+ xor eax, eax ; \
+ movb $ ## _vector, al ; \
+ jmp SYM (_ISR_Handler) ;
+
+DISTINCT_INTERRUPT_ENTRY(0)
+DISTINCT_INTERRUPT_ENTRY(1)
+DISTINCT_INTERRUPT_ENTRY(2)
+DISTINCT_INTERRUPT_ENTRY(3)
+DISTINCT_INTERRUPT_ENTRY(4)
+DISTINCT_INTERRUPT_ENTRY(5)
+DISTINCT_INTERRUPT_ENTRY(6)
+DISTINCT_INTERRUPT_ENTRY(7)
+DISTINCT_INTERRUPT_ENTRY(8)
+DISTINCT_INTERRUPT_ENTRY(9)
+DISTINCT_INTERRUPT_ENTRY(10)
+DISTINCT_INTERRUPT_ENTRY(11)
+DISTINCT_INTERRUPT_ENTRY(12)
+DISTINCT_INTERRUPT_ENTRY(13)
+DISTINCT_INTERRUPT_ENTRY(14)
+DISTINCT_INTERRUPT_ENTRY(15)
+DISTINCT_INTERRUPT_ENTRY(16)
+DISTINCT_INTERRUPT_ENTRY(17)
+DISTINCT_INTERRUPT_ENTRY(18)
+DISTINCT_INTERRUPT_ENTRY(19)
+DISTINCT_INTERRUPT_ENTRY(20)
+DISTINCT_INTERRUPT_ENTRY(21)
+DISTINCT_INTERRUPT_ENTRY(22)
+DISTINCT_INTERRUPT_ENTRY(23)
+DISTINCT_INTERRUPT_ENTRY(24)
+DISTINCT_INTERRUPT_ENTRY(25)
+DISTINCT_INTERRUPT_ENTRY(26)
+DISTINCT_INTERRUPT_ENTRY(27)
+DISTINCT_INTERRUPT_ENTRY(28)
+DISTINCT_INTERRUPT_ENTRY(29)
+DISTINCT_INTERRUPT_ENTRY(30)
+DISTINCT_INTERRUPT_ENTRY(31)
+DISTINCT_INTERRUPT_ENTRY(32)
+DISTINCT_INTERRUPT_ENTRY(33)
+DISTINCT_INTERRUPT_ENTRY(34)
+DISTINCT_INTERRUPT_ENTRY(35)
+DISTINCT_INTERRUPT_ENTRY(36)
+DISTINCT_INTERRUPT_ENTRY(37)
+DISTINCT_INTERRUPT_ENTRY(38)
+DISTINCT_INTERRUPT_ENTRY(39)
+DISTINCT_INTERRUPT_ENTRY(40)
+DISTINCT_INTERRUPT_ENTRY(41)
+DISTINCT_INTERRUPT_ENTRY(42)
+DISTINCT_INTERRUPT_ENTRY(43)
+DISTINCT_INTERRUPT_ENTRY(44)
+DISTINCT_INTERRUPT_ENTRY(45)
+DISTINCT_INTERRUPT_ENTRY(46)
+DISTINCT_INTERRUPT_ENTRY(47)
+DISTINCT_INTERRUPT_ENTRY(48)
+DISTINCT_INTERRUPT_ENTRY(49)
+DISTINCT_INTERRUPT_ENTRY(50)
+DISTINCT_INTERRUPT_ENTRY(51)
+DISTINCT_INTERRUPT_ENTRY(52)
+DISTINCT_INTERRUPT_ENTRY(53)
+DISTINCT_INTERRUPT_ENTRY(54)
+DISTINCT_INTERRUPT_ENTRY(55)
+DISTINCT_INTERRUPT_ENTRY(56)
+DISTINCT_INTERRUPT_ENTRY(57)
+DISTINCT_INTERRUPT_ENTRY(58)
+DISTINCT_INTERRUPT_ENTRY(59)
+DISTINCT_INTERRUPT_ENTRY(60)
+DISTINCT_INTERRUPT_ENTRY(61)
+DISTINCT_INTERRUPT_ENTRY(62)
+DISTINCT_INTERRUPT_ENTRY(63)
+DISTINCT_INTERRUPT_ENTRY(64)
+DISTINCT_INTERRUPT_ENTRY(65)
+DISTINCT_INTERRUPT_ENTRY(66)
+DISTINCT_INTERRUPT_ENTRY(67)
+DISTINCT_INTERRUPT_ENTRY(68)
+DISTINCT_INTERRUPT_ENTRY(69)
+DISTINCT_INTERRUPT_ENTRY(70)
+DISTINCT_INTERRUPT_ENTRY(71)
+DISTINCT_INTERRUPT_ENTRY(72)
+DISTINCT_INTERRUPT_ENTRY(73)
+DISTINCT_INTERRUPT_ENTRY(74)
+DISTINCT_INTERRUPT_ENTRY(75)
+DISTINCT_INTERRUPT_ENTRY(76)
+DISTINCT_INTERRUPT_ENTRY(77)
+DISTINCT_INTERRUPT_ENTRY(78)
+DISTINCT_INTERRUPT_ENTRY(79)
+DISTINCT_INTERRUPT_ENTRY(80)
+DISTINCT_INTERRUPT_ENTRY(81)
+DISTINCT_INTERRUPT_ENTRY(82)
+DISTINCT_INTERRUPT_ENTRY(83)
+DISTINCT_INTERRUPT_ENTRY(84)
+DISTINCT_INTERRUPT_ENTRY(85)
+DISTINCT_INTERRUPT_ENTRY(86)
+DISTINCT_INTERRUPT_ENTRY(87)
+DISTINCT_INTERRUPT_ENTRY(88)
+DISTINCT_INTERRUPT_ENTRY(89)
+DISTINCT_INTERRUPT_ENTRY(90)
+DISTINCT_INTERRUPT_ENTRY(91)
+DISTINCT_INTERRUPT_ENTRY(92)
+DISTINCT_INTERRUPT_ENTRY(93)
+DISTINCT_INTERRUPT_ENTRY(94)
+DISTINCT_INTERRUPT_ENTRY(95)
+DISTINCT_INTERRUPT_ENTRY(96)
+DISTINCT_INTERRUPT_ENTRY(97)
+DISTINCT_INTERRUPT_ENTRY(98)
+DISTINCT_INTERRUPT_ENTRY(99)
+DISTINCT_INTERRUPT_ENTRY(100)
+DISTINCT_INTERRUPT_ENTRY(101)
+DISTINCT_INTERRUPT_ENTRY(102)
+DISTINCT_INTERRUPT_ENTRY(103)
+DISTINCT_INTERRUPT_ENTRY(104)
+DISTINCT_INTERRUPT_ENTRY(105)
+DISTINCT_INTERRUPT_ENTRY(106)
+DISTINCT_INTERRUPT_ENTRY(107)
+DISTINCT_INTERRUPT_ENTRY(108)
+DISTINCT_INTERRUPT_ENTRY(109)
+DISTINCT_INTERRUPT_ENTRY(110)
+DISTINCT_INTERRUPT_ENTRY(111)
+DISTINCT_INTERRUPT_ENTRY(112)
+DISTINCT_INTERRUPT_ENTRY(113)
+DISTINCT_INTERRUPT_ENTRY(114)
+DISTINCT_INTERRUPT_ENTRY(115)
+DISTINCT_INTERRUPT_ENTRY(116)
+DISTINCT_INTERRUPT_ENTRY(117)
+DISTINCT_INTERRUPT_ENTRY(118)
+DISTINCT_INTERRUPT_ENTRY(119)
+DISTINCT_INTERRUPT_ENTRY(120)
+DISTINCT_INTERRUPT_ENTRY(121)
+DISTINCT_INTERRUPT_ENTRY(122)
+DISTINCT_INTERRUPT_ENTRY(123)
+DISTINCT_INTERRUPT_ENTRY(124)
+DISTINCT_INTERRUPT_ENTRY(125)
+DISTINCT_INTERRUPT_ENTRY(126)
+DISTINCT_INTERRUPT_ENTRY(127)
+DISTINCT_INTERRUPT_ENTRY(128)
+DISTINCT_INTERRUPT_ENTRY(129)
+DISTINCT_INTERRUPT_ENTRY(130)
+DISTINCT_INTERRUPT_ENTRY(131)
+DISTINCT_INTERRUPT_ENTRY(132)
+DISTINCT_INTERRUPT_ENTRY(133)
+DISTINCT_INTERRUPT_ENTRY(134)
+DISTINCT_INTERRUPT_ENTRY(135)
+DISTINCT_INTERRUPT_ENTRY(136)
+DISTINCT_INTERRUPT_ENTRY(137)
+DISTINCT_INTERRUPT_ENTRY(138)
+DISTINCT_INTERRUPT_ENTRY(139)
+DISTINCT_INTERRUPT_ENTRY(140)
+DISTINCT_INTERRUPT_ENTRY(141)
+DISTINCT_INTERRUPT_ENTRY(142)
+DISTINCT_INTERRUPT_ENTRY(143)
+DISTINCT_INTERRUPT_ENTRY(144)
+DISTINCT_INTERRUPT_ENTRY(145)
+DISTINCT_INTERRUPT_ENTRY(146)
+DISTINCT_INTERRUPT_ENTRY(147)
+DISTINCT_INTERRUPT_ENTRY(148)
+DISTINCT_INTERRUPT_ENTRY(149)
+DISTINCT_INTERRUPT_ENTRY(150)
+DISTINCT_INTERRUPT_ENTRY(151)
+DISTINCT_INTERRUPT_ENTRY(152)
+DISTINCT_INTERRUPT_ENTRY(153)
+DISTINCT_INTERRUPT_ENTRY(154)
+DISTINCT_INTERRUPT_ENTRY(155)
+DISTINCT_INTERRUPT_ENTRY(156)
+DISTINCT_INTERRUPT_ENTRY(157)
+DISTINCT_INTERRUPT_ENTRY(158)
+DISTINCT_INTERRUPT_ENTRY(159)
+DISTINCT_INTERRUPT_ENTRY(160)
+DISTINCT_INTERRUPT_ENTRY(161)
+DISTINCT_INTERRUPT_ENTRY(162)
+DISTINCT_INTERRUPT_ENTRY(163)
+DISTINCT_INTERRUPT_ENTRY(164)
+DISTINCT_INTERRUPT_ENTRY(165)
+DISTINCT_INTERRUPT_ENTRY(166)
+DISTINCT_INTERRUPT_ENTRY(167)
+DISTINCT_INTERRUPT_ENTRY(168)
+DISTINCT_INTERRUPT_ENTRY(169)
+DISTINCT_INTERRUPT_ENTRY(170)
+DISTINCT_INTERRUPT_ENTRY(171)
+DISTINCT_INTERRUPT_ENTRY(172)
+DISTINCT_INTERRUPT_ENTRY(173)
+DISTINCT_INTERRUPT_ENTRY(174)
+DISTINCT_INTERRUPT_ENTRY(175)
+DISTINCT_INTERRUPT_ENTRY(176)
+DISTINCT_INTERRUPT_ENTRY(177)
+DISTINCT_INTERRUPT_ENTRY(178)
+DISTINCT_INTERRUPT_ENTRY(179)
+DISTINCT_INTERRUPT_ENTRY(180)
+DISTINCT_INTERRUPT_ENTRY(181)
+DISTINCT_INTERRUPT_ENTRY(182)
+DISTINCT_INTERRUPT_ENTRY(183)
+DISTINCT_INTERRUPT_ENTRY(184)
+DISTINCT_INTERRUPT_ENTRY(185)
+DISTINCT_INTERRUPT_ENTRY(186)
+DISTINCT_INTERRUPT_ENTRY(187)
+DISTINCT_INTERRUPT_ENTRY(188)
+DISTINCT_INTERRUPT_ENTRY(189)
+DISTINCT_INTERRUPT_ENTRY(190)
+DISTINCT_INTERRUPT_ENTRY(191)
+DISTINCT_INTERRUPT_ENTRY(192)
+DISTINCT_INTERRUPT_ENTRY(193)
+DISTINCT_INTERRUPT_ENTRY(194)
+DISTINCT_INTERRUPT_ENTRY(195)
+DISTINCT_INTERRUPT_ENTRY(196)
+DISTINCT_INTERRUPT_ENTRY(197)
+DISTINCT_INTERRUPT_ENTRY(198)
+DISTINCT_INTERRUPT_ENTRY(199)
+DISTINCT_INTERRUPT_ENTRY(200)
+DISTINCT_INTERRUPT_ENTRY(201)
+DISTINCT_INTERRUPT_ENTRY(202)
+DISTINCT_INTERRUPT_ENTRY(203)
+DISTINCT_INTERRUPT_ENTRY(204)
+DISTINCT_INTERRUPT_ENTRY(205)
+DISTINCT_INTERRUPT_ENTRY(206)
+DISTINCT_INTERRUPT_ENTRY(207)
+DISTINCT_INTERRUPT_ENTRY(208)
+DISTINCT_INTERRUPT_ENTRY(209)
+DISTINCT_INTERRUPT_ENTRY(210)
+DISTINCT_INTERRUPT_ENTRY(211)
+DISTINCT_INTERRUPT_ENTRY(212)
+DISTINCT_INTERRUPT_ENTRY(213)
+DISTINCT_INTERRUPT_ENTRY(214)
+DISTINCT_INTERRUPT_ENTRY(215)
+DISTINCT_INTERRUPT_ENTRY(216)
+DISTINCT_INTERRUPT_ENTRY(217)
+DISTINCT_INTERRUPT_ENTRY(218)
+DISTINCT_INTERRUPT_ENTRY(219)
+DISTINCT_INTERRUPT_ENTRY(220)
+DISTINCT_INTERRUPT_ENTRY(221)
+DISTINCT_INTERRUPT_ENTRY(222)
+DISTINCT_INTERRUPT_ENTRY(223)
+DISTINCT_INTERRUPT_ENTRY(224)
+DISTINCT_INTERRUPT_ENTRY(225)
+DISTINCT_INTERRUPT_ENTRY(226)
+DISTINCT_INTERRUPT_ENTRY(227)
+DISTINCT_INTERRUPT_ENTRY(228)
+DISTINCT_INTERRUPT_ENTRY(229)
+DISTINCT_INTERRUPT_ENTRY(230)
+DISTINCT_INTERRUPT_ENTRY(231)
+DISTINCT_INTERRUPT_ENTRY(232)
+DISTINCT_INTERRUPT_ENTRY(233)
+DISTINCT_INTERRUPT_ENTRY(234)
+DISTINCT_INTERRUPT_ENTRY(235)
+DISTINCT_INTERRUPT_ENTRY(236)
+DISTINCT_INTERRUPT_ENTRY(237)
+DISTINCT_INTERRUPT_ENTRY(238)
+DISTINCT_INTERRUPT_ENTRY(239)
+DISTINCT_INTERRUPT_ENTRY(240)
+DISTINCT_INTERRUPT_ENTRY(241)
+DISTINCT_INTERRUPT_ENTRY(242)
+DISTINCT_INTERRUPT_ENTRY(243)
+DISTINCT_INTERRUPT_ENTRY(244)
+DISTINCT_INTERRUPT_ENTRY(245)
+DISTINCT_INTERRUPT_ENTRY(246)
+DISTINCT_INTERRUPT_ENTRY(247)
+DISTINCT_INTERRUPT_ENTRY(248)
+DISTINCT_INTERRUPT_ENTRY(249)
+DISTINCT_INTERRUPT_ENTRY(250)
+DISTINCT_INTERRUPT_ENTRY(251)
+DISTINCT_INTERRUPT_ENTRY(252)
+DISTINCT_INTERRUPT_ENTRY(253)
+DISTINCT_INTERRUPT_ENTRY(254)
+DISTINCT_INTERRUPT_ENTRY(255)
+
+/*PAGE
+ * void _ISR_Dispatch()
+ *
+ * Entry point from the outermost interrupt service routine exit.
+ * The current stack is the supervisor mode stack.
+ */
+
+ PUBLIC (_ISR_Dispatch)
+SYM (_ISR_Dispatch):
+
+ call SYM (_Thread_Dispatch) # invoke Dispatcher
+
+ /*
+ * BEGINNING OF DE-ESTABLISH SEGMENTS
+ *
+ * NOTE: Make sure there is code here if code is added to
+ * load the segment registers.
+ *
+ */
+
+ /***** DE-ESTABLISH SEGMENTS CODE GOES HERE ****/
+
+ /*
+ * END OF DE-ESTABLISH SEGMENTS
+ */
+
+ popa # restore general registers
+ iret # return to interrupted thread
+
+/*
+ * GO32 does not require these segment related routines.
+ */
+
+#ifndef __GO32__
+/*PAGE
+ *
+ * void i386_Install_idt(
+ * unsigned32 source_offset,
+ * unsigned16 destination_segment,
+ * unsigned32 destination_offset
+ * );
+ */
+
+ .align 2
+ PUBLIC (i386_Install_idt)
+
+.set INSTALL_IDT_SAVED_REGS, 8
+
+.set SOURCE_OFFSET_ARG, INSTALL_IDT_SAVED_REGS + 4
+.set DESTINATION_SEGMENT_ARG, INSTALL_IDT_SAVED_REGS + 8
+.set DESTINATION_OFFSET_ARG, INSTALL_IDT_SAVED_REGS + 12
+
+SYM (i386_Install_idt):
+ push esi
+ push edi
+
+ movl SOURCE_OFFSET_ARG(esp),esi
+ movl DESTINATION_OFFSET_ARG(esp),edi
+
+ pushf # save flags
+ cli # DISABLE INTERRUPTS!!!
+
+ movw DESTINATION_SEGMENT_ARG+4(esp),ax
+ push es # save es
+ movw ax,es
+ movsl # copy 1st half of IDT entry
+ movsl # copy 2nd half of IDT entry
+ pop es # restore es
+
+ popf # ENABLE INTERRUPTS!!!
+
+ pop edi
+ pop esi
+ ret
+
+/*
+ * void *i386_Logical_to_physical(
+ * rtems_unsigned16 segment,
+ * void *address
+ * );
+ *
+ * Returns thirty-two bit physical address for segment:address.
+ */
+
+.set SEGMENT_ARG, 4
+.set ADDRESS_ARG, 8
+
+ PUBLIC (i386_Logical_to_physical)
+
+SYM (i386_Logical_to_physical):
+
+ xorl eax,eax # clear eax
+ movzwl SEGMENT_ARG(esp),ecx # ecx = segment value
+ movl $ SYM (_Global_descriptor_table),edx
+ # edx = address of our GDT
+ addl ecx,edx # edx = address of desired entry
+ movb 7(edx),ah # ah = base 31:24
+ movb 4(edx),al # al = base 23:16
+ shll $16,eax # move ax into correct bits
+ movw 2(edx),ax # ax = base 0:15
+ movl ADDRESS_ARG(esp),ecx # ecx = address to convert
+ addl eax,ecx # ecx = physical address equivalent
+ movl ecx,eax # eax = ecx
+ ret
+
+/*
+ * void *i386_Physical_to_logical(
+ * rtems_unsigned16 segment,
+ * void *address
+ * );
+ *
+ * Returns thirty-two bit physical address for segment:address.
+ */
+
+/*
+ *.set SEGMENT_ARG, 4
+ *.set ADDRESS_ARG, 8 -- use sets from above
+ */
+
+ PUBLIC (i386_Physical_to_logical)
+
+SYM (i386_Physical_to_logical):
+ xorl eax,eax # clear eax
+ movzwl SEGMENT_ARG(esp),ecx # ecx = segment value
+ movl $ SYM (_Global_descriptor_table),edx
+ # edx = address of our GDT
+ addl ecx,edx # edx = address of desired entry
+ movb 7(edx),ah # ah = base 31:24
+ movb 4(edx),al # al = base 23:16
+ shll $16,eax # move ax into correct bits
+ movw 2(edx),ax # ax = base 0:15
+ movl ADDRESS_ARG(esp),ecx # ecx = address to convert
+ subl eax,ecx # ecx = logical address equivalent
+ movl ecx,eax # eax = ecx
+ ret
+#endif /* __GO32__ */
+
+END_CODE
+
+END
diff --git a/c/src/exec/score/cpu/i386/i386.h b/c/src/exec/score/cpu/i386/i386.h
new file mode 100644
index 0000000000..e9e03be1a7
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/i386.h
@@ -0,0 +1,474 @@
+/* i386.h
+ *
+ * This include file contains information pertaining to the Intel
+ * i386 processor.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __i386_h
+#define __i386_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section contains the information required to build
+ * RTEMS for a particular member of the Intel i386
+ * family when executing in protected mode. It does
+ * this by setting variables to indicate which implementation
+ * dependent features are present in a particular member
+ * of the family.
+ *
+ * Currently recognized:
+ * i386_fp (i386 DX or SX w/i387)
+ * i386_fp (i386 DX or SX w/o i387)
+ * i486dx
+ * i486sx
+ * pentium
+ *
+ * Floating point is the only feature which currently varies. Eventually
+ * the i486-plus level instruction for endian swapping should be added
+ * to this feature list.
+ */
+
+#if defined(i386_fp)
+
+#define CPU_MODEL_NAME "i386 with i387"
+#define I386_HAS_FPU 1
+
+#elif defined(i386_nofp)
+
+#define CPU_MODEL_NAME "i386 w/o i387"
+#define I386_HAS_FPU 0
+
+#elif defined(i486dx)
+
+#define CPU_MODEL_NAME "i486dx"
+#define I386_HAS_FPU 1
+
+#elif defined(i486sx)
+
+#define CPU_MODEL_NAME "i486sx"
+#define I386_HAS_FPU 0
+
+#elif defined(pentium)
+
+#define CPU_MODEL_NAME "Pentium"
+#define I386_HAS_FPU 1
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "Intel i386"
+
+#ifndef ASM
+
+/*
+ * Structure which makes it easier to deal with LxDT and SxDT instructions.
+ */
+
+typedef struct {
+ unsigned short limit;
+ unsigned short physical_address[ 2 ];
+} i386_DTR_load_save_format;
+
+/* See Chapter 5 - Memory Management in i386 manual */
+
+typedef struct {
+ unsigned short limit_0_15;
+ unsigned short base_0_15;
+ unsigned char base_16_23;
+ unsigned char type_dt_dpl_p;
+ unsigned char limit_16_19_granularity;
+ unsigned char base_24_31;
+} i386_GDT_slot;
+
+/* See Chapter 9 - Exceptions and Interrupts in i386 manual
+ *
+ * NOTE: This is the IDT entry for interrupt gates ONLY.
+ */
+
+typedef struct {
+ unsigned short offset_0_15;
+ unsigned short segment_selector;
+ unsigned char reserved;
+ unsigned char p_dpl;
+ unsigned short offset_16_31;
+} i386_IDT_slot;
+
+/*
+ * Interrupt Level Macros
+ */
+
+#define i386_disable_interrupts( _level ) \
+ { \
+ _level = 0; /* avoids warnings */ \
+ asm volatile ( "pushf ; \
+ cli ; \
+ pop %0" \
+ : "=r" ((_level)) : "0" ((_level)) \
+ ); \
+ }
+
+#define i386_enable_interrupts( _level ) \
+ { \
+ asm volatile ( "push %0 ; \
+ popf" \
+ : "=r" ((_level)) : "0" ((_level)) \
+ ); \
+ }
+
+#define i386_flash_interrupts( _level ) \
+ { \
+ asm volatile ( "push %0 ; \
+ popf ; \
+ cli" \
+ : "=r" ((_level)) : "0" ((_level)) \
+ ); \
+ }
+
+#define i386_get_interrupt_level( _level ) \
+ do { \
+ register unsigned32 _eflags = 0; \
+ \
+ asm volatile ( "pushf ; \
+ pop %0" \
+ : "=r" ((_eflags)) : "0" ((_eflags)) \
+ ); \
+ \
+ _level = (_eflags & 0x0200) ? 0 : 1; \
+ } while (0)
+
+/*
+ * The following routine swaps the endian format of an unsigned int.
+ * It must be static so it can be referenced indirectly.
+ */
+
+static inline unsigned int i386_swap_U32(
+ unsigned int value
+)
+{
+ asm volatile( "rorw $8,%%ax;"
+ "rorl $16,%0;"
+ "rorw $8,%%ax" : "=a" (value) : "0" (value) );
+ return( value );
+}
+
+/*
+ * Segment Access Routines
+ *
+ * NOTE: Unfortunately, these are still static inlines even when the
+ * "macro" implementation of the generic code is used.
+ */
+
+static inline unsigned short i386_get_cs()
+{
+ register unsigned short segment = 0;
+
+ asm volatile ( "movw %%cs,%0" : "=r" (segment) : "0" (segment) );
+
+ return segment;
+}
+
+static inline unsigned short i386_get_ds()
+{
+ register unsigned short segment = 0;
+
+ asm volatile ( "movw %%ds,%0" : "=r" (segment) : "0" (segment) );
+
+ return segment;
+}
+
+static inline unsigned short i386_get_es()
+{
+ register unsigned short segment = 0;
+
+ asm volatile ( "movw %%es,%0" : "=r" (segment) : "0" (segment) );
+
+ return segment;
+}
+
+static inline unsigned short i386_get_ss()
+{
+ register unsigned short segment = 0;
+
+ asm volatile ( "movw %%ss,%0" : "=r" (segment) : "0" (segment) );
+
+ return segment;
+}
+
+static inline unsigned short i386_get_fs()
+{
+ register unsigned short segment = 0;
+
+ asm volatile ( "movw %%fs,%0" : "=r" (segment) : "0" (segment) );
+
+ return segment;
+}
+
+static inline unsigned short i386_get_gs()
+{
+ register unsigned short segment = 0;
+
+ asm volatile ( "movw %%gs,%0" : "=r" (segment) : "0" (segment) );
+
+ return segment;
+}
+
+/*
+ * IO Port Access Routines
+ */
+
+#define i386_outport_byte( _port, _value ) \
+ { register unsigned short __port = _port; \
+ register unsigned char __value = _value; \
+ \
+ asm volatile ( "outb %0,%1" : "=a" (__value), "=d" (__port) \
+ : "0" (__value), "1" (__port) \
+ ); \
+ }
+
+#define i386_outport_word( _port, _value ) \
+ { register unsigned short __port = _port; \
+ register unsigned short __value = _value; \
+ \
+ asm volatile ( "outw %0,%1" : "=a" (__value), "=d" (__port) \
+ : "0" (__value), "1" (__port) \
+ ); \
+ }
+
+#define i386_outport_long( _port, _value ) \
+ { register unsigned short __port = _port; \
+ register unsigned int __value = _value; \
+ \
+ asm volatile ( "outl %0,%1" : "=a" (__value), "=d" (__port) \
+ : "0" (__value), "1" (__port) \
+ ); \
+ }
+
+#define i386_inport_byte( _port, _value ) \
+ { register unsigned short __port = _port; \
+ register unsigned char __value = 0; \
+ \
+ asm volatile ( "inb %1,%0" : "=a" (__value), "=d" (__port) \
+ : "0" (__value), "1" (__port) \
+ ); \
+ _value = __value; \
+ }
+
+#define i386_inport_word( _port, _value ) \
+ { register unsigned short __port = _port; \
+ register unsigned short __value = 0; \
+ \
+ asm volatile ( "inw %1,%0" : "=a" (__value), "=d" (__port) \
+ : "0" (__value), "1" (__port) \
+ ); \
+ _value = __value; \
+ }
+
+#define i386_inport_long( _port, _value ) \
+ { register unsigned short __port = _port; \
+ register unsigned int __value = 0; \
+ \
+ asm volatile ( "inl %1,%0" : "=a" (__value), "=d" (__port) \
+ : "0" (__value), "1" (__port) \
+ ); \
+ _value = __value; \
+ }
+
+/*
+ * Descriptor Table helper routines
+ */
+
+
+#define i386_get_GDTR( _gdtr_address ) \
+ { \
+ void *_gdtr = (_gdtr_address); \
+ \
+ asm volatile( "sgdt (%0)" : "=r" (_gdtr) : "0" (_gdtr) ); \
+ }
+
+#define i386_get_GDT_slot( _gdtr_base, _segment, _slot_address ) \
+ { \
+ register unsigned int _gdt_slot = (_gdtr_base) + (_segment); \
+ register volatile void *_slot = (_slot_address); \
+ register unsigned int _temporary = 0; \
+ \
+ asm volatile( "movl %%gs:(%0),%1 ; \
+ movl %1,(%2) ; \
+ movl %%gs:4(%0),%1 ; \
+ movl %1,4(%2)" \
+ : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \
+ : "0" (_gdt_slot), "1" (_temporary), "2" (_slot) \
+ ); \
+ }
+
+#define i386_set_GDT_slot( _gdtr_base, _segment, _slot_address ) \
+ { \
+ register unsigned int _gdt_slot = (_gdtr_base) + (_segment); \
+ register volatile void *_slot = (_slot_address); \
+ register unsigned int _temporary = 0; \
+ \
+ asm volatile( "movl (%2),%1 ; \
+ movl %1,%%gs:(%0) ; \
+ movl 4(%2),%1 ; \
+ movl %1,%%gs:4(%0) \
+ " \
+ : "=r" (_gdt_slot), "=r" (_temporary), "=r" (_slot) \
+ : "0" (_gdt_slot), "1" (_temporary), "2" (_slot) \
+ ); \
+ }
+
+static inline void i386_set_segment(
+ unsigned short segment,
+ unsigned int base,
+ unsigned int limit
+)
+{
+ i386_DTR_load_save_format gdtr;
+ volatile i386_GDT_slot Gdt_slot;
+ volatile i386_GDT_slot *gdt_slot = &Gdt_slot;
+ unsigned short tmp_segment = 0;
+ unsigned int limit_adjusted;
+
+ /* load physical address of the GDT */
+
+ i386_get_GDTR( &gdtr );
+
+ gdt_slot->type_dt_dpl_p = 0x92; /* present, dpl=0, */
+ /* application=1, */
+ /* type=data read/write */
+ gdt_slot->limit_16_19_granularity = 0x40; /* 32 bit segment */
+
+ limit_adjusted = limit;
+ if ( limit > 4095 ) {
+ gdt_slot->limit_16_19_granularity |= 0x80; /* set granularity bit */
+ limit_adjusted /= 4096;
+ }
+
+ gdt_slot->limit_16_19_granularity |= (limit_adjusted >> 16) & 0xff;
+ gdt_slot->limit_0_15 = limit_adjusted & 0xffff;
+
+ gdt_slot->base_0_15 = base & 0xffff;
+ gdt_slot->base_16_23 = (base >> 16) & 0xff;
+ gdt_slot->base_24_31 = (base >> 24);
+
+ i386_set_GDT_slot(
+ gdtr.physical_address[0] + (gdtr.physical_address[1] << 16),
+ segment,
+ gdt_slot
+ );
+
+ /* Now, reload all segment registers so the limit takes effect. */
+
+ asm volatile( "movw %%ds,%0 ; movw %0,%%ds
+ movw %%es,%0 ; movw %0,%%es
+ movw %%fs,%0 ; movw %0,%%fs
+ movw %%gs,%0 ; movw %0,%%gs
+ movw %%ss,%0 ; movw %0,%%ss"
+ : "=r" (tmp_segment)
+ : "0" (tmp_segment)
+ );
+
+}
+
+/* routines */
+
+/*
+ * i386_Logical_to_physical
+ *
+ * Converts logical address to physical address.
+ */
+
+void *i386_Logical_to_physical(
+ unsigned short segment,
+ void *address
+);
+
+/*
+ * i386_Physical_to_logical
+ *
+ * Converts physical address to logical address.
+ */
+
+void *i386_Physical_to_logical(
+ unsigned short segment,
+ void *address
+);
+
+/*
+ * i386_Install_idt
+ *
+ * This routine installs an IDT entry.
+ */
+
+void i386_Install_idt(
+ unsigned int source_offset,
+ unsigned short destination_segment,
+ unsigned int destination_offset
+);
+
+/*
+ * "Simpler" names for a lot of the things defined in this file
+ */
+
+/* segment access routines */
+
+#define get_cs() i386_get_cs()
+#define get_ds() i386_get_ds()
+#define get_es() i386_get_es()
+#define get_ss() i386_get_ss()
+#define get_fs() i386_get_fs()
+#define get_gs() i386_get_gs()
+
+#define CPU_swap_u32( _value ) i386_swap_U32( _value )
+
+/* i80x86 I/O instructions */
+
+#define outport_byte( _port, _value ) i386_outport_byte( _port, _value )
+#define outport_word( _port, _value ) i386_outport_word( _port, _value )
+#define outport_long( _port, _value ) i386_outport_long( _port, _value )
+#define inport_byte( _port, _value ) i386_inport_byte( _port, _value )
+#define inport_word( _port, _value ) i386_inport_word( _port, _value )
+#define inport_long( _port, _value ) i386_inport_long( _port, _value )
+
+/* complicated static inline functions */
+
+#define get_GDTR( _gdtr_address ) \
+ i386_get_GDTR( _gdtr_address )
+
+#define get_GDT_slot( _gdtr_base, _segment, _slot_address ) \
+ i386_get_GDT_slot( _gdtr_base, _segment, _slot_address )
+
+#define set_GDT_slot( _gdtr_base, _segment, _slot_address ) \
+ i386_set_GDT_slot( _gdtr_base, _segment, _slot_address )
+
+#define set_segment( _segment, _base, _limit ) \
+ i386_set_segment( _segment, _base, _limit )
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/i386/i386types.h b/c/src/exec/score/cpu/i386/i386types.h
new file mode 100644
index 0000000000..1398062a08
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/i386types.h
@@ -0,0 +1,58 @@
+/* i386types.h
+ *
+ * This include file contains type definitions pertaining to the Intel
+ * i386 processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __i386_TYPES_h
+#define __i386_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void i386_isr;
+
+typedef i386_isr ( *i386_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/i386/rtems.s b/c/src/exec/score/cpu/i386/rtems.s
new file mode 100644
index 0000000000..74047d0781
--- /dev/null
+++ b/c/src/exec/score/cpu/i386/rtems.s
@@ -0,0 +1,31 @@
+/* rtems.s
+ *
+ * This file contains the single entry point code for
+ * the i386 implementation of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+
+ EXTERN (_Entry_points)
+
+ BEGIN_CODE
+
+ .align 2
+ PUBLIC (RTEMS)
+
+SYM (RTEMS):
+ jmpl SYM (_Entry_points)(,eax,4)
+
+ END_CODE
+
+END
diff --git a/c/src/exec/score/cpu/i960/Makefile.in b/c/src/exec/score/cpu/i960/Makefile.in
new file mode 100644
index 0000000000..2841cb17a8
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/Makefile.in
@@ -0,0 +1,86 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpu
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/i960types.h
+
+# H_FILES that get installed externally
+# i960.h is handled separately
+EXTERNAL_H_FILES = $(srcdir)/asm.h
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=cpu_asm rtems
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+install: all
+
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/i960.h \
+ ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/i960.h: i960.h
+ $(SED) -e 's?REPLACE_THIS_WITH_THE_CPU_MODEL?$(RTEMS_CPU_MODEL)?' \
+ -e 's?REPLACE_THIS_WITH_THE_BSP?$(RTEMS_BSP)?' \
+ < $< >$(ARCH)/i960.h.tmp
+ $(INSTALL) -m 444 $(ARCH)/i960.h.tmp $@
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/i960/asm.h b/c/src/exec/score/cpu/i960/asm.h
new file mode 100644
index 0000000000..a9a0788925
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/asm.h
@@ -0,0 +1,110 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __i960_ASM_h
+#define __i960_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/i960.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define g0 REG (g0)
+#define g1 REG (g1)
+#define g2 REG (g2)
+#define g3 REG (g3)
+#define g4 REG (g4)
+#define g5 REG (g5)
+#define g6 REG (g6)
+#define g7 REG (g7)
+#define g8 REG (g8)
+#define g9 REG (g9)
+#define g10 REG (g10)
+#define g11 REG (g11)
+#define g12 REG (g12)
+#define g13 REG (g13)
+#define g14 REG (g14)
+#define g15 REG (g15)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/i960/cpu.c b/c/src/exec/score/cpu/i960/cpu.c
new file mode 100644
index 0000000000..6a3cf6595c
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/cpu.c
@@ -0,0 +1,155 @@
+/*
+ * Intel i960CA Dependent Source
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#if defined(__i960CA__) || defined(__i960_CA__) || defined(__i960CA)
+#else
+#warning "*** ENTIRE FILE IMPLEMENTED & TESTED FOR CA ONLY ***"
+#warning "*** THIS FILE WILL NOT COMPILE ON ANOTHER FAMILY MEMBER ***"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ *
+ * OUTPUT PARAMETERS: NONE
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+
+ _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
+ */
+
+#define _Is_vector_caching_enabled( _prcb ) \
+ ((_prcb)->control_tbl->icon & 0x2000)
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ i960ca_PRCB *prcb = _CPU_Table.Prcb;
+ proc_ptr *cached_intr_tbl = NULL;
+
+ /* The i80960CA does not support vectors 0-7. The first 9 entries
+ * in the Interrupt Table are used to manage pending interrupts.
+ * Thus vector 8, the first valid vector number, is actually in
+ * slot 9 in the table.
+ */
+
+ *old_handler = prcb->intr_tbl[ vector + 1 ];
+
+ prcb->intr_tbl[ vector + 1 ] = new_handler;
+
+ if ( _Is_vector_caching_enabled( prcb ) )
+ if ( (vector & 0xf) == 0x2 ) /* cacheable? */
+ cached_intr_tbl[ vector >> 4 ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU__ISR_install_vector
+ *
+ * Install the RTEMS vector wrapper in the CPU's interrupt table.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr ignored;
+
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored );
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+#define soft_reset( prcb ) \
+ { register i960ca_PRCB *_prcb = (prcb); \
+ register unsigned32 *_next=0; \
+ register unsigned32 _cmd = 0x30000; \
+ asm volatile( "lda next,%1; \
+ sysctl %0,%1,%2; \
+ next: mov g0,g0" \
+ : "=d" (_cmd), "=d" (_next), "=d" (_prcb) \
+ : "0" (_cmd), "1" (_next), "2" (_prcb) ); \
+ }
+
+void _CPU_Install_interrupt_stack( void )
+{
+ i960ca_PRCB *prcb = _CPU_Table.Prcb;
+ unsigned32 level;
+
+ /*
+ * Set the Interrupt Stack in the PRCB and force a reload of it.
+ * Interrupts are disabled for safety.
+ */
+
+ _CPU_ISR_Disable( level );
+
+ prcb->intr_stack = _CPU_Interrupt_stack_low;
+
+ soft_reset( prcb );
+
+ _CPU_ISR_Enable( level );
+}
diff --git a/c/src/exec/score/cpu/i960/cpu.h b/c/src/exec/score/cpu/i960/cpu.h
new file mode 100644
index 0000000000..06eaea8b0d
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/cpu.h
@@ -0,0 +1,459 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the Intel
+ * i960 processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#pragma align 4 /* for GNU C structure alignment */
+
+#include <rtems/score/i960.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/i960types.h>
+#endif
+
+#define CPU_INLINE_ENABLE_DISPATCH FALSE
+#define CPU_UNROLL_ENQUEUE_PRIORITY FALSE
+
+/*
+ * Use the i960's hardware interrupt stack support and have the
+ * interrupt manager allocate the memory for it.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+
+/*
+ * Some family members have no FP (SA/KA/CA/CF), others have it built in
+ * (KB/MC/MX). There does not appear to be an external coprocessor
+ * for this family.
+ */
+
+#if ( I960_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#error "Floating point support for i960 family has been implemented!!!"
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+#define CPU_IDLE_TASK_IS_FP FALSE
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY FALSE
+#define CPU_STACK_GROWS_UP TRUE
+#define CPU_STRUCTURE_ALIGNMENT __attribute__ ((aligned (16)))
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+
+/* structures */
+
+/*
+ * Basic integer context for the i960 family.
+ */
+
+typedef struct {
+ void *r0_pfp; /* (r0) Previous Frame Pointer */
+ void *r1_sp; /* (r1) Stack Pointer */
+ unsigned32 pc; /* (pc) Processor Control */
+ void *g8; /* (g8) Global Register 8 */
+ void *g9; /* (g9) Global Register 9 */
+ void *g10; /* (g10) Global Register 10 */
+ void *g11; /* (g11) Global Register 11 */
+ void *g12; /* (g12) Global Register 12 */
+ void *g13; /* (g13) Global Register 13 */
+ unsigned32 g14; /* (g14) Global Register 14 */
+ void *g15_fp; /* (g15) Frame Pointer */
+} Context_Control;
+
+/*
+ * FP context save area for the i960 Numeric Extension
+ */
+
+typedef struct {
+ unsigned32 fp0_1; /* (fp0) first word */
+ unsigned32 fp0_2; /* (fp0) second word */
+ unsigned32 fp0_3; /* (fp0) third word */
+ unsigned32 fp1_1; /* (fp1) first word */
+ unsigned32 fp1_2; /* (fp1) second word */
+ unsigned32 fp1_3; /* (fp1) third word */
+ unsigned32 fp2_1; /* (fp2) first word */
+ unsigned32 fp2_2; /* (fp2) second word */
+ unsigned32 fp2_3; /* (fp2) third word */
+ unsigned32 fp3_1; /* (fp3) first word */
+ unsigned32 fp3_2; /* (fp3) second word */
+ unsigned32 fp3_3; /* (fp3) third word */
+} Context_Control_fp;
+
+/*
+ * The following structure defines the set of information saved
+ * on the current stack by RTEMS upon receipt of each interrupt.
+ */
+
+typedef struct {
+ unsigned32 TBD; /* XXX Fix for this CPU */
+} CPU_Interrupt_frame;
+
+/*
+ * Call frame for the i960 family.
+ */
+
+typedef struct {
+ void *r0_pfp; /* (r0) Previous Frame Pointer */
+ void *r1_sp; /* (r1) Stack Pointer */
+ void *r2_rip; /* (r2) Return Instruction Pointer */
+ void *r3; /* (r3) Local Register 3 */
+ void *r4; /* (r4) Local Register 4 */
+ void *r5; /* (r5) Local Register 5 */
+ void *r6; /* (r6) Local Register 6 */
+ void *r7; /* (r7) Local Register 7 */
+ void *r8; /* (r8) Local Register 8 */
+ void *r9; /* (r9) Local Register 9 */
+ void *r10; /* (r10) Local Register 10 */
+ void *r11; /* (r11) Local Register 11 */
+ void *r12; /* (r12) Local Register 12 */
+ void *r13; /* (r13) Local Register 13 */
+ void *r14; /* (r14) Local Register 14 */
+ void *r15; /* (r15) Local Register 15 */
+ /* XXX Looks like sometimes there is FP stuff here (MC manual)? */
+} CPU_Call_frame;
+
+/*
+ * The following table contains the information required to configure
+ * the i960 specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+#if defined(__i960CA__) || defined(__i960_CA__) || defined(__i960CA)
+ i960ca_PRCB *Prcb;
+#endif
+} rtems_cpu_table;
+
+/* variables */
+
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+/* constants */
+
+/*
+ * This defines the number of levels and the mask used to pick those
+ * bits out of a thread mode.
+ */
+
+#define CPU_MODES_INTERRUPT_LEVEL 0x0000001f /* interrupt level in mode */
+#define CPU_MODES_INTERRUPT_MASK 0x0000001f /* interrupt level in mode */
+
+/*
+ * context size area for floating point
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/*
+ * extra stack required by the MPCI receive server thread
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK (CPU_STACK_MINIMUM_SIZE)
+
+/*
+ * i960 family supports 256 distinct vectors.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 256
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Minimum size of a thread's stack.
+ *
+ * NOTE: See CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK
+ */
+
+#define CPU_STACK_MINIMUM_SIZE 2048
+
+/*
+ * i960 is pretty tolerant of alignment. Just put things on 4 byte boundaries.
+ */
+
+#define CPU_ALIGNMENT 4
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * i960ca stack requires 16 byte alignment
+ *
+ * NOTE: This factor may need to be family member dependent.
+ */
+
+#define CPU_STACK_ALIGNMENT 16
+
+/* macros */
+
+/*
+ * ISR handler macros
+ *
+ * These macros perform the following functions:
+ * + disable all maskable CPU interrupts
+ * + restore previous interrupt level (enable)
+ * + temporarily restore interrupts (flash)
+ * + set a particular level
+ */
+
+#define _CPU_ISR_Disable( _level ) i960_disable_interrupts( _level )
+#define _CPU_ISR_Enable( _level ) i960_enable_interrupts( _level )
+#define _CPU_ISR_Flash( _level ) i960_flash_interrupts( _level )
+
+#define _CPU_ISR_Set_level( newlevel ) \
+ { \
+ unsigned32 _mask = 0; \
+ unsigned32 _level = (newlevel); \
+ \
+ __asm__ volatile ( "ldconst 0x1f0000,%0; \
+ modpc 0,%0,%1" : "=d" (_mask), "=d" (_level) \
+ : "0" (_mask), "1" (_level) \
+ ); \
+ }
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* ISR handler section macros */
+
+/*
+ * Context handler macros
+ *
+ * These macros perform the following functions:
+ * + initialize a context area
+ * + restart the current thread
+ * + calculate the initial pointer into a FP context area
+ * + initialize an FP context area
+ */
+
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry, _is_fp ) \
+ { CPU_Call_frame *_texit_frame; \
+ unsigned32 _mask; \
+ unsigned32 _base_pc; \
+ unsigned32 _stack_tmp; \
+ void *_stack; \
+ \
+ _stack_tmp = (unsigned32)(_stack_base) + CPU_STACK_ALIGNMENT; \
+ _stack_tmp &= ~(CPU_STACK_ALIGNMENT - 1); \
+ _stack = (void *) _stack_tmp; \
+ \
+ __asm__ volatile ( "flushreg" : : ); /* flush register cache */ \
+ \
+ (_the_context)->r0_pfp = _stack; \
+ (_the_context)->g15_fp = _stack + (1 * sizeof(CPU_Call_frame)); \
+ (_the_context)->r1_sp = _stack + (2 * sizeof(CPU_Call_frame)); \
+ __asm__ volatile ( "ldconst 0x1f0000,%0 ; " \
+ "modpc 0,0,%1 ; " \
+ "andnot %0,%1,%1 ; " \
+ : "=d" (_mask), "=d" (_base_pc) : ); \
+ (_the_context)->pc = _base_pc | ((_isr) << 16); \
+ (_the_context)->g14 = 0; \
+ \
+ _texit_frame = (CPU_Call_frame *)_stack; \
+ _texit_frame->r0_pfp = NULL; \
+ _texit_frame->r1_sp = (_the_context)->g15_fp; \
+ _texit_frame->r2_rip = (_entry); \
+ }
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+#define _CPU_Context_Fp_start( _base, _offset ) NULL
+
+#define _CPU_Context_Initialize_fp( _fp_area )
+
+/* end of Context handler macros */
+
+/*
+ * Fatal Error manager macros
+ *
+ * These macros perform the following functions:
+ * + disable interrupts and halt the CPU
+ */
+
+#define _CPU_Fatal_halt( _errorcode ) \
+ { unsigned32 _mask, _level; \
+ unsigned32 _error = (_errorcode); \
+ \
+ __asm__ volatile ( "ldconst 0x1f0000,%0 ; \
+ mov %0,%1 ; \
+ modpc 0,%0,%1 ; \
+ mov %2,g0 ; \
+ self: b self " \
+ : "=d" (_mask), "=d" (_level), "=d" (_error) : ); \
+ }
+
+/* end of Fatal Error Manager macros */
+
+/*
+ * Bitfield handler macros
+ *
+ * These macros perform the following functions:
+ * + scan for the highest numbered (MSB) set in a 16 bit bitfield
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE FALSE
+#define CPU_USE_GENERIC_BITFIELD_DATA FALSE
+
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { unsigned32 _search = (_value); \
+ \
+ (_output) = 0; /* to prevent warnings */ \
+ __asm__ volatile ( "scanbit %0,%1 " \
+ : "=d" (_search), "=d" (_output) \
+ : "0" (_search), "1" (_output) ); \
+ }
+
+/* end of Bitfield handler macros */
+
+/*
+ * Priority handler macros
+ *
+ * These macros perform the following functions:
+ * + return a mask with the bit for this major/minor portion of
+ * of thread priority set.
+ * + translate the bit number returned by "Bitfield_find_first_bit"
+ * into an index into the thread ready chain bit maps
+ */
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 0x8000 >> (_bit_number) )
+
+#define _CPU_Priority_bits_index( _priority ) \
+ ( 15 - (_priority) )
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Install_interrupt_stack
+ *
+ * This routine installs the hardware interrupt stack pointer.
+ */
+
+void _CPU_Install_interrupt_stack( void );
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner and avoid stack conflicts.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/i960/cpu_asm.s b/c/src/exec/score/cpu/i960/cpu_asm.s
new file mode 100644
index 0000000000..795e96a746
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/cpu_asm.s
@@ -0,0 +1,199 @@
+/* cpu_asm.s
+ *
+ * This file contains all assembly code for the i960CA implementation
+ * of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+ .text
+/*
+ * Format of i960ca Register structure
+ */
+
+.set REG_R0_PFP , 0 # (r0) Previous Frame Pointer
+.set REG_R1_SP , REG_R0_PFP+4 # (r1) Stack Pointer
+.set REG_PC , REG_R1_SP+4 # (pc) Processor Controls
+.set REG_G8 , REG_PC+4 # (g8) Global Register 8
+.set REG_G9 , REG_G8+4 # (g9) Global Register 9
+.set REG_G10 , REG_G9+4 # (g10) Global Register 10
+.set REG_G11 , REG_G10+4 # (g11) Global Register 11
+.set REG_G12 , REG_G11+4 # (g12) Global Register 12
+.set REG_G13 , REG_G12+4 # (g13) Global Register 13
+.set REG_G14 , REG_G13+4 # (g14) Global Register 14
+.set REG_G15_FP , REG_G14+4 # (g15) Global Register 15
+.set SIZE_REGS , REG_G15_FP+4 # size of cpu_context_registers
+ # structure
+
+/*
+ * void _CPU_Context_switch( run_context, heir_context )
+ *
+ * This routine performs a normal non-FP context.
+ */
+ .align 4
+ .globl __CPU_Context_switch
+
+__CPU_Context_switch:
+ modpc 0,0,g2 # get old intr level (PC)
+ st g2,REG_PC(g0) # save pc
+ stq g8,REG_G8(g0) # save g8-g11
+ stq g12,REG_G12(g0) # save g12-g15
+ stl pfp,REG_R0_PFP(g0) # save pfp, sp
+
+restore: flushreg # flush register cache
+ ldconst 0x001f0000,g2 # g2 = PC mask
+ ld REG_PC(g1),g3 # thread->Regs.pc = pc;
+ ldq REG_G12(g1),g12 # restore g12-g15
+ ldl REG_R0_PFP(g1),pfp # restore pfp, sp
+ ldq REG_G8(g1),g8 # restore g8-g11
+ modpc 0,g2,g3 # restore PC register
+ ret
+
+/*
+ * void _CPU_Context_restore( new_context )
+ *
+ * This routine performs a normal non-FP context.
+ */
+
+ .globl __CPU_Context_restore
+__CPU_Context_restore:
+ mov g0,g1 # g0 = _Thread_executing
+ b restore
+
+/*PAGE
+ * void _CPU_Context_save_fp_context( &fp_context_ptr )
+ * void _CPU_Context_restore_fp_context( &fp_context_ptr )
+ *
+ * There is currently no hardware floating point for the i960.
+ */
+
+ .globl __CPU_Context_save_fp
+ .globl __CPU_Context_restore_fp
+__CPU_Context_save_fp:
+__CPU_Context_restore_fp:
+#if ( I960_HAS_FPU == 1 )
+#error "Floating point support for i960 family has been implemented!!!"
+#endif
+ ret
+
+/*PAGE
+ * void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE:
+ * Upon entry, the supervisor stack will contain a stack frame
+ * back to the interrupted thread and the interrupt stack will contain
+ * an interrupt stack frame. If dispatching is enabled, this
+ * is the outer most interrupt, and (a context switch is necessary or
+ * the current thread has signals), then set up the supervisor stack to
+ * transfer control to the interrupt dispatcher.
+ */
+
+ .globl __ISR_Handler
+__ISR_Handler:
+ #ldconst 1,r8
+ #modpc 0,r8,r8 # enable tracing
+
+ # r4 = &_Thread_Dispatch_disable_level
+ ld __Thread_Dispatch_disable_level,r4
+ movl g0,r8 # save g0-g1
+
+ ld -16+8(fp),g0 # g0 = vector number
+ movl g2,r10 # save g2-g3
+
+ ld __ISR_Nest_level,r5 # r5 = &_Isr_nest_level
+ mov g14,r7 # save g14
+
+ lda 0,g14 # NOT Branch and Link
+ movl g4,r12 # save g4-g5
+
+ lda 1(r4),r4 # increment dispatch disable level
+ movl g6,r14 # save g6-g7
+
+ ld __ISR_Vector_table[g0*4],g1 # g1 = Users handler
+ addo 1,r5,r5 # increment ISR level
+
+ st r4,__Thread_Dispatch_disable_level
+ # one ISR nest level deeper
+ subo 1,r4,r4 # decrement dispatch disable level
+
+ st r5,__ISR_Nest_level # disable multitasking
+ subo 1,r5,r5 # decrement ISR nest level
+
+ callx (g1) # invoke user ISR
+
+ st r4,__Thread_Dispatch_disable_level
+ # unnest multitasking
+ st r5,__ISR_Nest_level # one less ISR nest level
+ cmpobne.f 0,r4,exit # If dispatch disabled, exit
+ ldl -16(fp),g0 # g0 = threads PC reg
+ # g1 = threads AC reg
+ ld __Context_Switch_necessary,r6
+ # r6 = Is thread switch necessary?
+ bbs.f 13,g0,exit # not outer level, then exit
+ cmpobne.f 0,r6,bframe # Switch necessary?
+
+ ld __ISR_Signals_to_thread_executing,g2
+ # signals sent to Run_thread
+ # while in interrupt handler?
+ cmpobe.f 0,g2,exit # No, then exit
+
+bframe: mov 0,g2
+ st g2,__ISR_Signals_to_thread_executing
+
+ ldconst 0x1f0000,g2 # g2 = intr disable mask
+ mov g2,g3 # g3 = new intr level
+ modpc 0,g2,g3 # set new level
+
+ andnot 7,pfp,r4 # r4 = pfp without ret type
+ flushreg # flush registers
+ # push _Isr_dispatch ret frame
+ # build ISF in r4-r6
+ ldconst 64,g2 # g2 = size of stack frame
+ ld 4(r4),g3 # g3 = previous sp
+ addo g2,g3,r5 # r5 = _Isr_dispatch SP
+ lda __ISR_Dispatch,r6 # r6 = _Isr_dispatch entry
+ stt r4,(g3) # set _Isr_dispatch ret info
+ st g1,16(g3) # set r4 = AC for ISR disp
+ or 7,g3,pfp # pfp to _Isr_dispatch
+
+exit: mov r7,g14 # restore g14
+ movq r8,g0 # restore g0-g3
+ movq r12,g4 # restore g4-g7
+ ret
+
+
+/*PAGE
+ *
+ * void __ISR_Dispatch()
+ *
+ * Entry point from the outermost interrupt service routine exit.
+ * The current stack is the supervisor mode stack.
+ */
+
+__ISR_Dispatch:
+ mov g14,r7
+ mov 0,g14
+ movq g0,r8
+ movq g4,r12
+ call __Thread_Dispatch
+
+ ldconst -1,r5 # r5 = reload mask
+ modac r5,r4,r4 # restore threads AC register
+ mov r7,g14
+ movq r8,g0
+ movq r12,g4
+ ret
diff --git a/c/src/exec/score/cpu/i960/i960.h b/c/src/exec/score/cpu/i960/i960.h
new file mode 100644
index 0000000000..04e7c489f0
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/i960.h
@@ -0,0 +1,265 @@
+/* i960.h
+ *
+ * This include file contains information pertaining to the Intel
+ * i960 processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __i960_h
+#define __i960_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the Intel i960
+ * family. It does this by setting variables to indicate
+ * which implementation dependent features are present
+ * in a particular member of the family.
+ *
+ * NOTE: For now i960 is really the i960ca. eventually need
+ * to put in at least support for FPU.
+ */
+
+#if defined(i960ca)
+
+#define CPU_MODEL_NAME "i960ca"
+#define I960_HAS_FPU 0
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "Intel i960"
+
+#ifndef ASM
+
+/*
+ * XXX should have an ifdef here and have stuff for the other
+ * XXX family members...
+ */
+
+#if defined(__i960CA__) || defined(__i960_CA__) || defined(__i960CA)
+
+/* i960CA control structures */
+
+/* Intel i960CA Control Table */
+
+typedef struct {
+ /* Control Group 0 */
+ unsigned int ipb0; /* IP breakpoint 0 */
+ unsigned int ipb1; /* IP breakpoint 1 */
+ unsigned int dab0; /* data address breakpoint 0 */
+ unsigned int dab1; /* data address breakpoint 1 */
+ /* Control Group 1 */
+ unsigned int imap0; /* interrupt map 0 */
+ unsigned int imap1; /* interrupt map 1 */
+ unsigned int imap2; /* interrupt map 2 */
+ unsigned int icon; /* interrupt control */
+ /* Control Group 2 */
+ unsigned int mcon0; /* memory region 0 configuration */
+ unsigned int mcon1; /* memory region 1 configuration */
+ unsigned int mcon2; /* memory region 2 configuration */
+ unsigned int mcon3; /* memory region 3 configuration */
+ /* Control Group 3 */
+ unsigned int mcon4; /* memory region 4 configuration */
+ unsigned int mcon5; /* memory region 5 configuration */
+ unsigned int mcon6; /* memory region 6 configuration */
+ unsigned int mcon7; /* memory region 7 configuration */
+ /* Control Group 4 */
+ unsigned int mcon8; /* memory region 8 configuration */
+ unsigned int mcon9; /* memory region 9 configuration */
+ unsigned int mcon10; /* memory region 10 configuration */
+ unsigned int mcon11; /* memory region 11 configuration */
+ /* Control Group 5 */
+ unsigned int mcon12; /* memory region 12 configuration */
+ unsigned int mcon13; /* memory region 13 configuration */
+ unsigned int mcon14; /* memory region 14 configuration */
+ unsigned int mcon15; /* memory region 15 configuration */
+ /* Control Group 6 */
+ unsigned int bpcon; /* breakpoint control */
+ unsigned int tc; /* trace control */
+ unsigned int bcon; /* bus configuration control */
+ unsigned int reserved; /* reserved */
+} i960ca_control_table;
+
+/* Intel i960CA Processor Control Block */
+
+typedef struct {
+ unsigned int *fault_tbl; /* fault table base address */
+ i960ca_control_table
+ *control_tbl; /* control table base address */
+ unsigned int initial_ac; /* AC register initial value */
+ unsigned int fault_config; /* fault configuration word */
+ void **intr_tbl; /* interrupt table base address */
+ void *sys_proc_tbl; /* system procedure table
+ base address */
+ unsigned int reserved; /* reserved */
+ unsigned int *intr_stack; /* interrupt stack pointer */
+ unsigned int ins_cache_cfg; /* instruction cache
+ configuration word */
+ unsigned int reg_cache_cfg; /* register cache configuration word */
+} i960ca_PRCB;
+
+#endif
+
+/*
+ * Interrupt Level Routines
+ */
+
+#define i960_disable_interrupts( oldlevel ) \
+ { (oldlevel) = 0x1f0000; \
+ asm volatile ( "modpc 0,%1,%1" \
+ : "=d" ((oldlevel)) \
+ : "0" ((oldlevel)) ); \
+ }
+
+#define i960_enable_interrupts( oldlevel ) \
+ { unsigned int _mask = 0x1f0000; \
+ asm volatile ( "modpc 0,%0,%1" \
+ : "=d" (_mask), "=d" ((oldlevel)) \
+ : "0" (_mask), "1" ((oldlevel)) ); \
+ }
+
+#define i960_flash_interrupts( oldlevel ) \
+ { unsigned int _mask = 0x1f0000; \
+ asm volatile ( "modpc 0,%0,%1 ; \
+ mov %0,%1 ; \
+ modpc 0,%0,%1" \
+ : "=d" (_mask), "=d" ((oldlevel)) \
+ : "0" (_mask), "1" ((oldlevel)) ); \
+ }
+
+#define i960_get_interrupt_level( _level ) \
+ { \
+ i960_disable_interrupts( _level ); \
+ i960_enable_interrupts( _level ); \
+ (_level) = ((_level) & 0x1f0000) >> 16; \
+ } while ( 0 )
+
+#define i960_atomic_modify( mask, addr, prev ) \
+ { register unsigned int _mask = (mask); \
+ register unsigned int *_addr = (unsigned int *)(addr); \
+ asm volatile( "atmod %0,%1,%1" \
+ : "=d" (_addr), "=d" (_mask) \
+ : "0" (_addr), "1" (_mask) ); \
+ (prev) = _mask; \
+ }
+
+
+#define atomic_modify( _mask, _address, _previous ) \
+ i960_atomic_modify( _mask, _address, _previous )
+
+#define i960_enable_tracing() \
+ { register unsigned int _pc = 0x1; \
+ asm volatile( "modpc 0,%0,%0" : "=d" (_pc) : "0" (_pc) ); \
+ }
+
+#define i960_unmask_intr( xint ) \
+ { register unsigned int _mask= (1<<(xint)); \
+ asm volatile( "or sf1,%0,sf1" : "=d" (_mask) : "0" (_mask) ); \
+ }
+
+#define i960_mask_intr( xint ) \
+ { register unsigned int _mask= (1<<(xint)); \
+ asm volatile( "andnot %0,sf1,sf1" : "=d" (_mask) : "0" (_mask) ); \
+ }
+
+#define i960_clear_intr( xint ) \
+ { register unsigned int _xint=(xint); \
+asm volatile( "loop_til_cleared: clrbit %0,sf0,sf0 ; \
+ bbs %0,sf0, loop_til_cleared" \
+ : "=d" (_xint) : "0" (_xint) ); \
+ }
+
+#define i960_reload_ctl_group( group ) \
+ { register int _cmd = ((group)|0x400) ; \
+ asm volatile( "sysctl %0,%0,%0" : "=d" (_cmd) : "0" (_cmd) ); \
+ }
+
+#define i960_cause_intr( intr ) \
+ { register int _intr = (intr); \
+ asm volatile( "sysctl %0,%0,%0" : "=d" (_intr) : "0" (_intr) ); \
+ }
+
+#define i960_soft_reset( prcb ) \
+ { register i960ca_PRCB *_prcb = (prcb); \
+ register unsigned int *_next=0; \
+ register unsigned int _cmd = 0x30000; \
+ asm volatile( "lda next,%1; \
+ sysctl %0,%1,%2; \
+ next: mov g0,g0" \
+ : "=d" (_cmd), "=d" (_next), "=d" (_prcb) \
+ : "0" (_cmd), "1" (_next), "2" (_prcb) ); \
+ }
+
+static inline unsigned int i960_pend_intrs()
+{ register unsigned int _intr=0;
+ asm volatile( "mov sf0,%0" : "=d" (_intr) : "0" (_intr) );
+ return ( _intr );
+}
+
+static inline unsigned int i960_mask_intrs()
+{ register unsigned int _intr=0;
+ asm volatile( "mov sf1,%0" : "=d" (_intr) : "0" (_intr) );
+ return( _intr );
+}
+
+static inline unsigned int i960_get_fp()
+{ register unsigned int _fp=0;
+ asm volatile( "mov fp,%0" : "=d" (_fp) : "0" (_fp) );
+ return ( _fp );
+}
+
+/*
+ * The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version is based on code presented in Vol. 4, No. 4 of
+ * Insight 960. It is certainly something you wouldn't think
+ * of on your own.
+ */
+
+static inline unsigned int CPU_swap_u32(
+ unsigned int value
+)
+{
+ register unsigned int to_swap = value;
+ register unsigned int temp = 0xFF00FF00;
+ register unsigned int swapped = 0;
+
+ /* to_swap swapped */
+ asm volatile ( "rotate 16,%0,%2 ;" /* 0x12345678 0x56781234 */
+ "modify %1,%0,%2 ;" /* 0x12345678 0x12785634 */
+ "rotate 8,%2,%2" /* 0x12345678 0x78563412 */
+ : "=r" (to_swap), "=r" (temp), "=r" (swapped)
+ : "0" (to_swap), "1" (temp), "2" (swapped)
+ );
+ return( swapped );
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/i960/i960types.h b/c/src/exec/score/cpu/i960/i960types.h
new file mode 100644
index 0000000000..6636812597
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/i960types.h
@@ -0,0 +1,58 @@
+/* i960types.h
+ *
+ * This include file contains type definitions pertaining to the Intel
+ * i960 processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __i960_TYPES_h
+#define __i960_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned32 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void i960_isr;
+
+typedef void ( *i960_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/i960/rtems.s b/c/src/exec/score/cpu/i960/rtems.s
new file mode 100644
index 0000000000..a3821b44dd
--- /dev/null
+++ b/c/src/exec/score/cpu/i960/rtems.s
@@ -0,0 +1,25 @@
+/* rtems.s
+ *
+ * This file contains the single entry point code for
+ * the i960 implementation of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+ .text
+
+ .align 4
+ .globl RTEMS
+
+RTEMS:
+ ld __Entry_points[g7*4],r4
+ bx (r4)
+
diff --git a/c/src/exec/score/cpu/m68k/Makefile.in b/c/src/exec/score/cpu/m68k/Makefile.in
new file mode 100644
index 0000000000..298642c169
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/Makefile.in
@@ -0,0 +1,75 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpu
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/m68k.h $(srcdir)/m68ktypes.h
+
+# H_FILES that get installed externally
+EXTERNAL_H_FILES = $(srcdir)/asm.h $(srcdir)/m68302.h $(srcdir)/m68360.h \
+ $(srcdir)/qsm.h $(srcdir)/sim.h
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=cpu_asm rtems
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/m68k/asm.h b/c/src/exec/score/cpu/m68k/asm.h
new file mode 100644
index 0000000000..2f63ddee53
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/asm.h
@@ -0,0 +1,132 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __M68k_ASM_h
+#define __M68k_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define d0 REG (d0)
+#define d1 REG (d1)
+#define d2 REG (d2)
+#define d3 REG (d3)
+#define d4 REG (d4)
+#define d5 REG (d5)
+#define d6 REG (d6)
+#define d7 REG (d7)
+#define a0 REG (a0)
+#define a1 REG (a1)
+#define a2 REG (a2)
+#define a3 REG (a3)
+#define a4 REG (a4)
+#define a5 REG (a5)
+#define a6 REG (a6)
+#define a7 REG (a7)
+
+#define msp REG (msp)
+#define usp REG (usp)
+#define isp REG (isp)
+#define sr REG (sr)
+#define vbr REG (vbr)
+#define dfc REG (dfc)
+
+#define fp0 REG (fp0)
+#define fp1 REG (fp1)
+#define fp2 REG (fp2)
+#define fp3 REG (fp3)
+#define fp4 REG (fp4)
+#define fp5 REG (fp5)
+#define fp6 REG (fp6)
+#define fp7 REG (fp7)
+
+#define fpc REG (fpc)
+#define fpi REG (fpi)
+#define fps REG (fps)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/exec/score/cpu/m68k/cpu.c b/c/src/exec/score/cpu/m68k/cpu.c
new file mode 100644
index 0000000000..01fbabd957
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/cpu.c
@@ -0,0 +1,179 @@
+/*
+ * Motorola MC68xxx Dependent Source
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - entry pointer to thread dispatcher
+ *
+ * OUTPUT PARAMETERS: NONE
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+#if ( M68K_HAS_VBR == 0 )
+ /* fill the isr redirect table with the code to place the format/id
+ onto the stack */
+
+ unsigned32 slot;
+
+ for (slot = 0; slot < CPU_INTERRUPT_NUMBER_OF_VECTORS; slot++)
+ {
+ _CPU_ISR_jump_table[slot].move_a7 = M68K_MOVE_A7;
+ _CPU_ISR_jump_table[slot].format_id = slot << 2;
+ _CPU_ISR_jump_table[slot].jmp = M68K_JMP;
+ _CPU_ISR_jump_table[slot].isr_handler = (unsigned32) 0xDEADDEAD;
+ }
+#endif /* M68K_HAS_VBR */
+
+ _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
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr *interrupt_table = NULL;
+
+#if (M68K_HAS_FPSP_PACKAGE == 1)
+ /*
+ * If this vector being installed is one related to FP, then the
+ * FPSP will install the handler itself and handle it completely
+ * with no intervention from RTEMS.
+ */
+
+ if (*_FPSP_install_raw_handler &&
+ (*_FPSP_install_raw_handler)(vector, new_handler, *old_handler))
+ return;
+#endif
+
+
+ /*
+ * On CPU models without a VBR, it is necessary for there to be some
+ * header code for each ISR which saves a register, loads the vector
+ * number, and jumps to _ISR_Handler.
+ */
+
+ m68k_get_vbr( interrupt_table );
+ *old_handler = interrupt_table[ vector ];
+#if ( M68K_HAS_VBR == 1 )
+ interrupt_table[ vector ] = new_handler;
+#else
+ _CPU_ISR_jump_table[vector].isr_handler = (unsigned32) new_handler;
+ interrupt_table[ vector ] = (proc_ptr) &_CPU_ISR_jump_table[vector];
+#endif /* M68K_HAS_VBR */
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * new_handler - replacement ISR for this vector number
+ * old_handler - former ISR for this vector number
+ *
+ * Output parameters: NONE
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr ignored;
+
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored );
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ void *isp = _CPU_Interrupt_stack_high;
+
+ asm volatile ( "movec %0,%%isp" : "=r" (isp) : "0" (isp) );
+#else
+#warning "PLEASE IMPLEMENT ME... There is NO dedicated interrupt stack"
+#warning "on CPUs without a dedicated hardware interrupt stack!!!"
+#warning "INTERRUPTS RUN ON A TASK STACK!!!"
+#endif
+}
+
+#if ( M68K_HAS_BFFFO != 1 )
+/*
+ * Returns table for duplication of the BFFFO instruction (16 bits only)
+ */
+const unsigned char __BFFFOtable[256] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif
diff --git a/c/src/exec/score/cpu/m68k/cpu.h b/c/src/exec/score/cpu/m68k/cpu.h
new file mode 100644
index 0000000000..bc83bf3138
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/cpu.h
@@ -0,0 +1,535 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the Motorola
+ * m68xxx processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/m68k.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/m68ktypes.h>
+#endif
+
+/* conditional compilation parameters */
+
+#define CPU_INLINE_ENABLE_DISPATCH TRUE
+#define CPU_UNROLL_ENQUEUE_PRIORITY FALSE
+
+/*
+ * Use the m68k's hardware interrupt stack support and have the
+ * interrupt manager allocate the memory for it.
+ *
+ * NOTE: The definitions when M68K_HAS_SEPARATE_STACKS is 0 should
+ * change when the software interrupt stack support is implemented.
+ */
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1)
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+#else
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
+#define CPU_ALLOCATE_INTERRUPT_STACK FALSE
+#endif
+
+/*
+ * Some family members have no FP, some have an FPU such as the
+ * MC68881/MC68882 for the MC68020, others have it built in (MC68030, 040).
+ */
+
+#if ( M68K_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+/*
+ * All tasks are not by default floating point tasks on this CPU.
+ * The IDLE task does not have a floating point context on this CPU.
+ * It is safe to use the deferred floating point context switch
+ * algorithm on this CPU.
+ */
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+#define CPU_IDLE_TASK_IS_FP FALSE
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY FALSE
+#define CPU_STACK_GROWS_UP FALSE
+#define CPU_STRUCTURE_ALIGNMENT
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+#ifndef ASM
+/* structures */
+
+/*
+ * Basic integer context for the m68k family.
+ */
+
+typedef struct {
+ unsigned32 sr; /* (sr) status register */
+ unsigned32 d2; /* (d2) data register 2 */
+ unsigned32 d3; /* (d3) data register 3 */
+ unsigned32 d4; /* (d4) data register 4 */
+ unsigned32 d5; /* (d5) data register 5 */
+ unsigned32 d6; /* (d6) data register 6 */
+ unsigned32 d7; /* (d7) data register 7 */
+ void *a2; /* (a2) address register 2 */
+ void *a3; /* (a3) address register 3 */
+ void *a4; /* (a4) address register 4 */
+ void *a5; /* (a5) address register 5 */
+ void *a6; /* (a6) address register 6 */
+ void *a7_msp; /* (a7) master stack pointer */
+} Context_Control;
+
+/*
+ * FP context save area for the M68881/M68882 numeric coprocessors.
+ */
+
+typedef struct {
+ unsigned8 fp_save_area[332]; /* 216 bytes for FSAVE/FRESTORE */
+ /* 96 bytes for FMOVEM FP0-7 */
+ /* 12 bytes for FMOVEM CREGS */
+ /* 4 bytes for non-null flag */
+} Context_Control_fp;
+
+/*
+ * The following structure defines the set of information saved
+ * on the current stack by RTEMS upon receipt of each interrupt.
+ */
+
+typedef struct {
+ unsigned32 TBD; /* XXX Fix for this CPU */
+} CPU_Interrupt_frame;
+
+/*
+ * The following table contains the information required to configure
+ * the m68k specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ m68k_isr *interrupt_vector_table;
+} rtems_cpu_table;
+
+/* variables */
+
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+extern char _VBR[];
+
+#if ( M68K_HAS_VBR == 0 )
+
+/*
+ * Table of ISR handler entries that resides in RAM. The FORMAT/ID is
+ * pushed onto the stack. This is not is the same order as VBR processors.
+ * The ISR handler takes the format and uses it for dispatching the user
+ * handler.
+ *
+ * FIXME : should be moved to below CPU_INTERRUPT_NUMBER_OF_VECTORS
+ *
+ */
+
+typedef struct {
+ unsigned16 move_a7; /* move #FORMAT_ID,%a7@- */
+ unsigned16 format_id;
+ unsigned16 jmp; /* jmp _ISR_Handlers */
+ unsigned32 isr_handler;
+} _CPU_ISR_handler_entry;
+
+#define M68K_MOVE_A7 0x3F3C
+#define M68K_JMP 0x4EF9
+
+ /* points to jsr-exception-table in targets wo/ VBR register */
+SCORE_EXTERN _CPU_ISR_handler_entry _CPU_ISR_jump_table[256];
+
+#endif /* M68K_HAS_VBR */
+#endif /* ASM */
+
+/* constants */
+
+/*
+ * This defines the number of levels and the mask used to pick those
+ * bits out of a thread mode.
+ */
+
+#define CPU_MODES_INTERRUPT_LEVEL 0x00000007 /* interrupt level in mode */
+#define CPU_MODES_INTERRUPT_MASK 0x00000007 /* interrupt level in mode */
+
+/*
+ * context size area for floating point
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/*
+ * extra stack required by the MPCI receive server thread
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 1024
+
+/*
+ * m68k family supports 256 distinct vectors.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 256
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Minimum size of a thread's stack.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE 2048
+
+/*
+ * m68k is pretty tolerant of alignment. Just put things on 4 byte boundaries.
+ */
+
+#define CPU_ALIGNMENT 4
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * On m68k thread stacks require no further alignment after allocation
+ * from the Workspace.
+ */
+
+#define CPU_STACK_ALIGNMENT 0
+
+#ifndef ASM
+
+/* macros */
+
+/*
+ * ISR handler macros
+ *
+ * These macros perform the following functions:
+ * + disable all maskable CPU interrupts
+ * + restore previous interrupt level (enable)
+ * + temporarily restore interrupts (flash)
+ * + set a particular level
+ */
+
+#define _CPU_ISR_Disable( _level ) \
+ m68k_disable_interrupts( _level )
+
+#define _CPU_ISR_Enable( _level ) \
+ m68k_enable_interrupts( _level )
+
+#define _CPU_ISR_Flash( _level ) \
+ m68k_flash_interrupts( _level )
+
+#define _CPU_ISR_Set_level( _newlevel ) \
+ m68k_set_interrupt_level( _newlevel )
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/*
+ * Context handler macros
+ *
+ * These macros perform the following functions:
+ * + initialize a context area
+ * + restart the current thread
+ * + calculate the initial pointer into a FP context area
+ * + initialize an FP context area
+ */
+
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point, _is_fp ) \
+ do { \
+ unsigned32 _stack; \
+ \
+ (_the_context)->sr = 0x3000 | ((_isr) << 8); \
+ _stack = (unsigned32)(_stack_base) + (_size) - 4; \
+ (_the_context)->a7_msp = (void *)_stack; \
+ *(void **)_stack = (void *)(_entry_point); \
+ } while ( 0 )
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ { asm volatile( "movew %0,%%sr ; " \
+ "moval %1,%%a7 ; " \
+ "rts" \
+ : "=d" ((_the_context)->sr), "=d" ((_the_context)->a7_msp) \
+ : "0" ((_the_context)->sr), "1" ((_the_context)->a7_msp) ); \
+ }
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ((void *) \
+ _Addresses_Add_offset( \
+ (_base), \
+ (_offset) + CPU_CONTEXT_FP_SIZE - 4 \
+ ) \
+ )
+
+#define _CPU_Context_Initialize_fp( _fp_area ) \
+ { unsigned32 *_fp_context = (unsigned32 *)*(_fp_area); \
+ \
+ *(--(_fp_context)) = 0; \
+ *(_fp_area) = (unsigned8 *)(_fp_context); \
+ }
+
+/* end of Context handler macros */
+
+/*
+ * Fatal Error manager macros
+ *
+ * These macros perform the following functions:
+ * + disable interrupts and halt the CPU
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ { asm volatile( "movl %0,%%d0; " \
+ "orw #0x0700,%%sr; " \
+ "stop #0x2700" : "=d" ((_error)) : "0" ((_error)) ); \
+ }
+
+/* end of Fatal Error manager macros */
+
+/*
+ * Bitfield handler macros
+ *
+ * These macros perform the following functions:
+ * + scan for the highest numbered (MSB) set in a 16 bit bitfield
+ *
+ * NOTE:
+ *
+ * It appears that on the M68020 bitfield are always 32 bits wide
+ * when in a register. This code forces the bitfield to be in
+ * memory (it really always is anyway). This allows us to
+ * have a real 16 bit wide bitfield which operates "correctly."
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE FALSE
+#define CPU_USE_GENERIC_BITFIELD_DATA FALSE
+
+#if ( M68K_HAS_BFFFO == 1 )
+
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ asm volatile( "bfffo (%1),#0,#16,%0" : "=d" (_output) : "a" (&_value));
+#else
+
+/* duplicates BFFFO results for 16 bits (i.e., 15-(_priority) in
+ _CPU_Priority_bits_index is not needed), handles the 0 case, and
+ does not molest _value -- jsg */
+#if ( M68K_HAS_EXTB_L == 1 )
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ extern const unsigned char __BFFFOtable[256]; \
+ register int dumby; \
+ \
+ asm volatile ( " move.w %2,%1\n" \
+ " lsr.w #8,%1\n" \
+ " beq.s 1f\n" \
+ " move.b (%3,%1.w),%0\n" \
+ " extb.l %0\n" \
+ " bra.s 0f\n" \
+ "1: moveq.l #8,%0\n" \
+ " add.b (%3,%2.w),%0\n" \
+ "0:\n" \
+ : "=&d" ((_output)), "=&d" ((dumby)) \
+ : "d" ((_value)), "ao" ((__BFFFOtable)) \
+ : "cc" ) ; \
+ }
+#else
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ extern const unsigned char __BFFFOtable[256]; \
+ register int dumby; \
+ \
+ asm volatile ( " move.w %2,%1\n" \
+ " lsr.w #8,%1\n" \
+ " beq.s 1f\n" \
+ " move.b (%3,%1.w),%0\n" \
+ " and.l #0x000000ff,%0\n"\
+ " bra.s 0f\n" \
+ "1: moveq.l #8,%0\n" \
+ " add.b (%3,%2.w),%0\n" \
+ "0:\n" \
+ : "=&d" ((_output)), "=&d" ((dumby)) \
+ : "d" ((_value)), "ao" ((__BFFFOtable)) \
+ : "cc" ) ; \
+ }
+#endif /* M68K_HAS_EXTB_L */
+
+#endif
+
+/* end of Bitfield handler macros */
+
+/*
+ * Priority handler macros
+ *
+ * These macros perform the following functions:
+ * + return a mask with the bit for this major/minor portion of
+ * of thread priority set.
+ * + translate the bit number returned by "Bitfield_find_first_bit"
+ * into an index into the thread ready chain bit maps
+ */
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 0x8000 >> (_bit_number) )
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Install_interrupt_stack
+ *
+ * This routine installs the hardware interrupt stack pointer.
+ */
+
+void _CPU_Install_interrupt_stack( void );
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+#if (M68K_HAS_FPSP_PACKAGE == 1)
+/*
+ * Hooks for the Floating Point Support Package (FPSP) provided by Motorola
+ *
+ * NOTES:
+ *
+ * Motorola 68k family CPU's before the 68040 used a coprocessor
+ * (68881 or 68882) to handle floating point. The 68040 has internal
+ * floating point support -- but *not* the complete support provided by
+ * the 68881 or 68882. The leftover functions are taken care of by the
+ * M68040 Floating Point Support Package. Quoting from the MC68040
+ * Microprocessors User's Manual, Section 9, Floating-Point Unit (MC68040):
+ *
+ * "When used with the M68040FPSP, the MC68040 FPU is fully
+ * compliant with IEEE floating-point standards."
+ *
+ * M68KFPSPInstallExceptionHandlers is in libcpu/m68k/MODEL/fpsp and
+ * is invoked early in the application code to insure that proper FP
+ * behavior is installed. This is not left to the BSP to call, since
+ * this would force all applications using that BSP to use FPSP which
+ * is not necessarily desirable.
+ *
+ * There is a similar package for the 68060 but RTEMS does not yet
+ * support the 68060.
+ */
+
+void M68KFPSPInstallExceptionHandlers (void);
+
+SCORE_EXTERN int (*_FPSP_install_raw_handler)(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+#endif
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/m68k/cpu_asm.s b/c/src/exec/score/cpu/m68k/cpu_asm.s
new file mode 100644
index 0000000000..4b203a8991
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/cpu_asm.s
@@ -0,0 +1,232 @@
+/* cpu_asm.s
+ *
+ * This file contains all assembly code for the MC68020 implementation
+ * of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <asm.h>
+
+ .text
+
+/* void _CPU_Context_switch( run_context, heir_context )
+ *
+ * This routine performs a normal non-FP context.
+ */
+
+ .align 4
+ .global SYM (_CPU_Context_switch)
+
+.set RUNCONTEXT_ARG, 4 | save context argument
+.set HEIRCONTEXT_ARG, 8 | restore context argument
+
+SYM (_CPU_Context_switch):
+ moval a7@(RUNCONTEXT_ARG),a0| a0 = running thread context
+ movw sr,d1 | d1 = status register
+ movml d1-d7/a2-a7,a0@ | save context
+
+ moval a7@(HEIRCONTEXT_ARG),a0| a0 = heir thread context
+restore: movml a0@,d1-d7/a2-a7 | restore context
+ movw d1,sr | restore status register
+ rts
+
+/*PAGE
+ * void __CPU_Context_save_fp_context( &fp_context_ptr )
+ * void __CPU_Context_restore_fp_context( &fp_context_ptr )
+ *
+ * These routines are used to context switch a MC68881 or MC68882.
+ *
+ * NOTE: Context save and restore code is based upon the code shown
+ * on page 6-38 of the MC68881/68882 Users Manual (rev 1).
+ *
+ * CPU_FP_CONTEXT_SIZE is higher than expected to account for the
+ * -1 pushed at end of this sequence.
+ */
+
+.set FPCONTEXT_ARG, 4 | save FP context argument
+
+ .align 4
+ .global SYM (_CPU_Context_save_fp)
+SYM (_CPU_Context_save_fp):
+#if ( M68K_HAS_FPU == 1 )
+ moval a7@(FPCONTEXT_ARG),a1 | a1 = &ptr to context area
+ moval a1@,a0 | a0 = Save context area
+ fsave a0@- | save 68881/68882 state frame
+ tstb a0@ | check for a null frame
+ beq nosv | Yes, skip save of user model
+ fmovem fp0-fp7,a0@- | save data registers (fp0-fp7)
+ fmovem fpc/fps/fpi,a0@- | and save control registers
+ movl #-1,a0@- | place not-null flag on stack
+nosv: movl a0,a1@ | save pointer to saved context
+#endif
+ rts
+
+ .align 4
+ .global SYM (_CPU_Context_restore_fp)
+SYM (_CPU_Context_restore_fp):
+#if ( M68K_HAS_FPU == 1 )
+ moval a7@(FPCONTEXT_ARG),a1 | a1 = &ptr to context area
+ moval a1@,a0 | a0 = address of saved context
+ tstb a0@ | Null context frame?
+ beq norst | Yes, skip fp restore
+ addql #4,a0 | throwaway non-null flag
+ fmovem a0@+,fpc/fps/fpi | restore control registers
+ fmovem a0@+,fp0-fp7 | restore data regs (fp0-fp7)
+norst: frestore a0@+ | restore the fp state frame
+ movl a0,a1@ | save pointer to saved context
+#endif
+ rts
+
+/*PAGE
+ * void _ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ * NOTE:
+ * Upon entry, the master stack will contain an interrupt stack frame
+ * back to the interrupted thread and the interrupt stack will contain
+ * a throwaway interrupt stack frame. If dispatching is enabled, this
+ * is the outer most interrupt, and (a context switch is necessary or
+ * the current thread has signals), then set up the master stack to
+ * transfer control to the interrupt dispatcher.
+ */
+
+/* m68000 notes:
+ *
+ * with this approach, lower interrupts (1-5 for efi68k) may
+ * execute twice if a higher priority interrupt is
+ * acknowledged before _Thread_Dispatch_disable is
+ * increamented and the higher priority interrupt
+ * preforms a context switch after executing. The lower
+ * priority intterrupt will execute (1) at the end of the
+ * higher priority interrupt in the new context if
+ * permitted by the new interrupt level mask, and (2) when
+ * the original context regains the cpu.
+ *
+ * XXX: Code for switching to a software maintained interrupt stack is
+ * not in place.
+ */
+
+#if ( M68K_HAS_VBR == 1)
+.set SR_OFFSET, 0 | Status register offset
+.set PC_OFFSET, 2 | Program Counter offset
+.set FVO_OFFSET, 6 | Format/vector offset
+#else
+.set SR_OFFSET, 2 | Status register offset
+.set PC_OFFSET, 4 | Program Counter offset
+.set FVO_OFFSET, 0 | Format/vector offset placed in the stack
+#endif /* M68K_HAS_VBR */
+
+.set SAVED, 16 | space for saved registers
+
+ .align 4
+ .global SYM (_ISR_Handler)
+
+SYM (_ISR_Handler):
+ addql #1,SYM (_Thread_Dispatch_disable_level) | disable multitasking
+ addql #1,SYM (_ISR_Nest_level) | one nest level deeper
+ moveml d0-d1/a0-a1,a7@- | save d0-d1,a0-a1
+
+/*
+ * NOTE FOR CPUs WITHOUT HARDWARE INTERRUPT STACK:
+ *
+ * After the interrupted codes registers have been saved, it is save
+ * to switch to the software maintained interrupt stack.
+ *
+ * PLEASE, if you have a m68k without a dedicated interrupt stack,
+ * implement the stack switching code.
+ */
+
+ movew a7@(SAVED+FVO_OFFSET),d0 | d0 = F/VO
+ andl #0x0fff,d0 | d0 = vector offset in vbr
+
+#if ( M68K_HAS_PREINDEXING == 1 )
+ movel @( SYM (_ISR_Vector_table),d0:w:1),a0| fetch the ISR
+#else
+ movel # SYM (_ISR_Vector_table),a0 | a0 = base of RTEMS table
+ addal d0,a0 | a0 = address of vector
+ movel (a0),a0 | a0 = address of user routine
+#endif
+
+ lsrl #2,d0 | d0 = vector number
+ movel d0,a7@- | push vector number
+ jbsr a0@ | invoke the user ISR
+ addql #4,a7 | remove vector number
+
+ subql #1,SYM (_ISR_Nest_level) | one less nest level
+ subql #1,SYM (_Thread_Dispatch_disable_level)
+ | unnest multitasking
+ bne exit | If dispatch disabled, exit
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ movew #0xf000,d0 | isolate format nibble
+ andw a7@(SAVED+FVO_OFFSET),d0 | get F/VO
+ cmpiw #0x1000,d0 | is it a throwaway isf?
+ bne exit | NOT outer level, so branch
+#endif
+
+ tstl SYM (_Context_Switch_necessary)
+ | Is thread switch necessary?
+ bne bframe | Yes, invoke dispatcher
+
+ tstl SYM (_ISR_Signals_to_thread_executing)
+ | signals sent to Run_thread
+ | while in interrupt handler?
+ beq exit | No, then exit
+
+
+bframe: clrl SYM (_ISR_Signals_to_thread_executing)
+ | If sent, will be processed
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ movec msp,a0 | a0 = master stack pointer
+ movew #0,a0@- | push format word
+ movel # SYM (_ISR_Dispatch),a0@- | push return addr
+ movew a0@(6+SR_OFFSET),a0@- | push thread sr
+ movec a0,msp | set master stack pointer
+#else
+
+ movew a7@(16+SR_OFFSET),sr
+ jsr SYM (_Thread_Dispatch)
+
+#endif
+
+exit: moveml a7@+,d0-d1/a0-a1 | restore d0-d1,a0-a1
+#if ( M68K_HAS_VBR == 0 )
+ addql #2,a7 | pop format/id
+#endif /* M68K_HAS_VBR */
+ rte | return to thread
+ | OR _Isr_dispatch
+
+/*PAGE
+ * void _ISR_Dispatch()
+ *
+ * Entry point from the outermost interrupt service routine exit.
+ * The current stack is the supervisor mode stack if this processor
+ * has separate stacks.
+ *
+ * 1. save all registers not preserved across C calls.
+ * 2. invoke the _Thread_Dispatch routine to switch tasks
+ * or a signal to the currently executing task.
+ * 3. restore all registers not preserved across C calls.
+ * 4. return from interrupt
+ */
+
+ .global SYM (_ISR_Dispatch)
+SYM (_ISR_Dispatch):
+ movml d0-d1/a0-a1,a7@-
+ jsr SYM (_Thread_Dispatch)
+ movml a7@+,d0-d1/a0-a1
+#if ( M68K_HAS_VBR == 0 )
+ addql #2,a7 | pop format/id
+#endif /* M68K_HAS_VBR */
+ rte
diff --git a/c/src/exec/score/cpu/m68k/m68302.h b/c/src/exec/score/cpu/m68k/m68302.h
new file mode 100644
index 0000000000..da96478cf3
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/m68302.h
@@ -0,0 +1,608 @@
+/*
+ *------------------------------------------------------------------
+ *
+ * m68302.h - Definitions for Motorola MC68302 processor.
+ *
+ * Section references in this file refer to revision 2 of Motorola's
+ * "MC68302 Integrated Multiprotocol Processor User's Manual".
+ * (Motorola document MC68302UM/AD REV 2.)
+ *
+ * Based on Don Meyer's cpu68302.h that was posted in comp.sys.m68k
+ * on 17 February, 1993.
+ *
+ * Copyright 1995 David W. Glessner.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above copyright notice, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *
+ * $Id$
+ *
+ *------------------------------------------------------------------
+ */
+
+#ifndef __MOTOROLA_MC68302_DEFINITIONS_h
+#define __MOTOROLA_MC68302_DEFINITIONS_h
+
+/*
+ * BAR - Base Address Register
+ * Section 2.7
+ */
+#define M302_BAR (*((volatile rtems_unsigned16 *) 0xf2))
+
+/*
+ * SCR - System Control Register
+ * Section 3.8.1
+ */
+#define M302_SCR (*((volatile rtems_unsigned32 *) 0xf4))
+/*
+ * SCR bits
+ */
+#define RBIT_SCR_IPA 0x08000000
+#define RBIT_SCR_HWT 0x04000000
+#define RBIT_SCR_WPV 0x02000000
+#define RBIT_SCR_ADC 0x01000000
+
+#define RBIT_SCR_ERRE 0x00400000
+#define RBIT_SCR_VGE 0x00200000
+#define RBIT_SCR_WPVE 0x00100000
+#define RBIT_SCR_RMCST 0x00080000
+#define RBIT_SCR_EMWS 0x00040000
+#define RBIT_SCR_ADCE 0x00020000
+#define RBIT_SCR_BCLM 0x00010000
+
+#define RBIT_SCR_FRZW 0x00008000
+#define RBIT_SCR_FRZ2 0x00004000
+#define RBIT_SCR_FRZ1 0x00002000
+#define RBIT_SCR_SAM 0x00001000
+#define RBIT_SCR_HWDEN 0x00000800
+#define RBIT_SCR_HWDCN2 0x00000400
+#define RBIT_SCR_HWDCN1 0x00000200
+#define RBIT_SCR_HWDCN0 0x00000100
+
+#define RBIT_SCR_LPREC 0x00000080
+#define RBIT_SCR_LPP16 0x00000040
+#define RBIT_SCR_LPEN 0x00000020
+#define RBIT_SCR_LPCLKDIV 0x0000001f
+
+
+/*
+ * 68000 interrupt and trap vector numbers
+ */
+#define M68K_IVEC_BUS_ERROR 2
+#define M68K_IVEC_ADDRESS_ERROR 3
+#define M68K_IVEC_ILLEGAL_OPCODE 4
+#define M68K_IVEC_ZERO_DIVIDE 5
+#define M68K_IVEC_CHK 6
+#define M68K_IVEC_TRAPV 7
+#define M68K_IVEC_PRIVILEGE 8
+#define M68K_IVEC_TRACE 9
+#define M68K_IVEC_LINE_A 10
+#define M68K_IVEC_LINE_F 11
+/* Unassigned, Reserved 12-14 */
+#define M68K_IVEC_UNINITIALIZED_INT 15
+/* Unassigned, Reserved 16-23 */
+#define M68K_IVEC_SPURIOUS_INT 24
+
+#define M68K_IVEC_LEVEL1_AUTOVECTOR 25
+#define M68K_IVEC_LEVEL2_AUTOVECTOR 26
+#define M68K_IVEC_LEVEL3_AUTOVECTOR 27
+#define M68K_IVEC_LEVEL4_AUTOVECTOR 28
+#define M68K_IVEC_LEVEL5_AUTOVECTOR 29
+#define M68K_IVEC_LEVEL6_AUTOVECTOR 30
+#define M68K_IVEC_LEVEL7_AUTOVECTOR 31
+
+#define M68K_IVEC_TRAP0 32
+#define M68K_IVEC_TRAP1 33
+#define M68K_IVEC_TRAP2 34
+#define M68K_IVEC_TRAP3 35
+#define M68K_IVEC_TRAP4 36
+#define M68K_IVEC_TRAP5 37
+#define M68K_IVEC_TRAP6 38
+#define M68K_IVEC_TRAP7 39
+#define M68K_IVEC_TRAP8 40
+#define M68K_IVEC_TRAP9 41
+#define M68K_IVEC_TRAP10 42
+#define M68K_IVEC_TRAP11 43
+#define M68K_IVEC_TRAP12 44
+#define M68K_IVEC_TRAP13 45
+#define M68K_IVEC_TRAP14 46
+#define M68K_IVEC_TRAP15 47
+/*
+ * Unassigned, Reserved 48-59
+ *
+ * Note: Vectors 60-63 are used by the MC68302 (e.g. BAR, SCR).
+ */
+
+/*
+ * MC68302 Interrupt Vectors
+ * Section 3.2
+ */
+enum m68302_ivec_e {
+ M302_IVEC_ERR =0,
+ M302_IVEC_PB8 =1, /* General-Purpose Interrupt 0 */
+ M302_IVEC_SMC2 =2,
+ M302_IVEC_SMC1 =3,
+ M302_IVEC_TIMER3 =4,
+ M302_IVEC_SCP =5,
+ M302_IVEC_TIMER2 =6,
+ M302_IVEC_PB9 =7, /* General-Purpose Interrupt 1 */
+ M302_IVEC_SCC3 =8,
+ M302_IVEC_TIMER1 =9,
+ M302_IVEC_SCC2 =10,
+ M302_IVEC_IDMA =11,
+ M302_IVEC_SDMA =12, /* SDMA Channels Bus Error */
+ M302_IVEC_SCC1 =13,
+ M302_IVEC_PB10 =14, /* General-Purpose Interrupt 2 */
+ M302_IVEC_PB11 =15, /* General-Purpose Interrupt 3 */
+ M302_IVEC_IRQ1 =17, /* External Device */
+ M302_IVEC_IRQ6 =22, /* External Device */
+ M302_IVEC_IRQ7 =23 /* External Device */
+};
+
+
+/*
+ * GIMR - Global Interrupt Mode Register
+ * Section 3.2.5.1
+ */
+#define RBIT_GIMR_MOD (1<<15)
+#define RBIT_GIMR_IV7 (1<<14)
+#define RBIT_GIMR_IV6 (1<<13)
+#define RBIT_GIMR_IV1 (1<<12)
+#define RBIT_GIMR_ET7 (1<<10)
+#define RBIT_GIMR_ET6 (1<<9)
+#define RBIT_GIMR_ET1 (1<<8)
+#define RBIT_GIMR_VECTOR (7<<5)
+
+/*
+ * IPR - Interrupt Pending Register (Section 3.2.5.2)
+ * IMR - Interrupt Mask Register (Section 3.2.5.3)
+ * ISR - Interrupt In-Service Register (Section 3.2.5.4)
+ */
+#define RBIT_IPR_PB11 (1<<15)
+#define RBIT_IPR_PB10 (1<<14)
+#define RBIT_IPR_SCC1 (1<<13)
+#define RBIT_IPR_SDMA (1<<12)
+#define RBIT_IPR_IDMA (1<<11)
+#define RBIT_IPR_SCC2 (1<<10)
+#define RBIT_IPR_TIMER1 (1<<9)
+#define RBIT_IPR_SCC3 (1<<8)
+#define RBIT_IPR_PB9 (1<<7)
+#define RBIT_IPR_TIMER2 (1<<6)
+#define RBIT_IPR_SCP (1<<5)
+#define RBIT_IPR_TIMER3 (1<<4)
+#define RBIT_IPR_SMC1 (1<<3)
+#define RBIT_IPR_SMC2 (1<<2)
+#define RBIT_IPR_PB8 (1<<1)
+#define RBIT_IPR_ERR (1<<0)
+
+#define RBIT_ISR_PB11 (1<<15)
+#define RBIT_ISR_PB10 (1<<14)
+#define RBIT_ISR_SCC1 (1<<13)
+#define RBIT_ISR_SDMA (1<<12)
+#define RBIT_ISR_IDMA (1<<11)
+#define RBIT_ISR_SCC2 (1<<10)
+#define RBIT_ISR_TIMER1 (1<<9)
+#define RBIT_ISR_SCC3 (1<<8)
+#define RBIT_ISR_PB9 (1<<7)
+#define RBIT_ISR_TIMER2 (1<<6)
+#define RBIT_ISR_SCP (1<<5)
+#define RBIT_ISR_TIMER3 (1<<4)
+#define RBIT_ISR_SMC1 (1<<3)
+#define RBIT_ISR_SMC2 (1<<2)
+#define RBIT_ISR_PB8 (1<<1)
+
+#define RBIT_IMR_PB11 (1<<15) /* PB11 Interrupt Mask */
+#define RBIT_IMR_PB10 (1<<14) /* PB10 Interrupt Mask */
+#define RBIT_IMR_SCC1 (1<<13) /* SCC1 Interrupt Mask */
+#define RBIT_IMR_SDMA (1<<12) /* SDMA Interrupt Mask */
+#define RBIT_IMR_IDMA (1<<11) /* IDMA Interrupt Mask */
+#define RBIT_IMR_SCC2 (1<<10) /* SCC2 Interrupt Mask */
+#define RBIT_IMR_TIMER1 (1<<9) /* TIMER1 Interrupt Mask */
+#define RBIT_IMR_SCC3 (1<<8) /* SCC3 Interrupt Mask */
+#define RBIT_IMR_PB9 (1<<7) /* PB9 Interrupt Mask */
+#define RBIT_IMR_TIMER2 (1<<6) /* TIMER2 Interrupt Mask */
+#define RBIT_IMR_SCP (1<<5) /* SCP Interrupt Mask */
+#define RBIT_IMR_TIMER3 (1<<4) /* TIMER3 Interrupt Mask */
+#define RBIT_IMR_SMC1 (1<<3) /* SMC1 Interrupt Mask */
+#define RBIT_IMR_SMC2 (1<<2) /* SMC2 Interrupt Mask */
+#define RBIT_IMR_PB8 (1<<1) /* PB8 Interrupt Mask */
+
+
+/*
+ * DRAM Refresh
+ * Section 3.9
+ *
+ * The DRAM refresh memory map replaces the SCC2 Tx BD 6 and Tx BD 7
+ * structures in the parameter RAM.
+ *
+ * Access to the DRAM registers can be accomplished by
+ * the following approach:
+ *
+ * volatile m302_DRAM_refresh_t *dram;
+ * dram = (volatile m302_DRAM_refresh_t *) &m302.scc2.bd.tx[6];
+ *
+ * Then simply use pointer references (e.g. dram->count = 3).
+ */
+typedef struct {
+ rtems_unsigned16 dram_high; /* DRAM high address and FC */
+ rtems_unsigned16 dram_low; /* DRAM low address */
+ rtems_unsigned16 increment; /* increment step (bytes/row) */
+ rtems_unsigned16 count; /* RAM refresh cycle count (#rows) */
+ rtems_unsigned16 t_ptr_h; /* temporary refresh high addr & FC */
+ rtems_unsigned16 t_ptr_l; /* temporary refresh low address */
+ rtems_unsigned16 t_count; /* temporary refresh cycles count */
+ rtems_unsigned16 res; /* reserved */
+} m302_DRAM_refresh_t;
+
+
+/*
+ * TMR - Timer Mode Register (for timers 1 and 2)
+ * Section 3.5.2.1
+ */
+#define RBIT_TMR_ICLK_STOP (0<<1)
+#define RBIT_TMR_ICLK_MASTER (1<<1)
+#define RBIT_TMR_ICLK_MASTER16 (2<<1)
+#define RBIT_TMR_ICLK_TIN (3<<1)
+
+#define RBIT_TMR_OM (1<<5)
+#define RBIT_TMR_ORI (1<<4)
+#define RBIT_TMR_FRR (1<<3)
+#define RBIT_TMR_RST (1<<0)
+
+
+/*
+ * TER - Timer Event Register (for timers 1 and 2)
+ * Section 3.5.2.5
+ */
+#define RBIT_TER_REF (1<<1) /* Output Reference Event */
+#define RBIT_TER_CAP (1<<0) /* Capture Event */
+
+
+/*
+ * SCC Buffer Descriptors and Buffer Descriptors Table
+ * Section 4.5.5
+ */
+typedef struct m302_SCC_bd {
+ rtems_unsigned16 status; /* status and control */
+ rtems_unsigned16 length; /* data length */
+ rtems_unsigned8 *buffer; /* data buffer pointer */
+} m302_SCC_bd_t;
+
+typedef struct {
+ m302_SCC_bd_t rx[8]; /* receive buffer descriptors */
+ m302_SCC_bd_t tx[8]; /* transmit buffer descriptors */
+} m302_SCC_bd_table_t;
+
+
+/*
+ * SCC Parameter RAM (offset 0x080 from an SCC Base)
+ * Section 4.5.6
+ *
+ * Each SCC parameter RAM area begins at offset 0x80 from each SCC base
+ * area (0x400, 0x500, or 0x600 from the dual-port RAM base).
+ *
+ * Offsets 0x9c-0xbf from each SCC base area compose the protocol-specific
+ * portion of the SCC parameter RAM.
+ */
+typedef struct {
+ rtems_unsigned8 rfcr; /* Rx Function Code */
+ rtems_unsigned8 tfcr; /* Tx Function Code */
+ rtems_unsigned16 mrblr; /* Maximum Rx Buffer Length */
+ rtems_unsigned16 _rstate; /* Rx Internal State */
+ rtems_unsigned8 res2;
+ rtems_unsigned8 rbd; /* Rx Internal Buffer Number */
+ rtems_unsigned32 _rdptr; /* Rx Internal Data Pointer */
+ rtems_unsigned16 _rcount; /* Rx Internal Byte Count */
+ rtems_unsigned16 _rtmp; /* Rx Temp */
+ rtems_unsigned16 _tstate; /* Tx Internal State */
+ rtems_unsigned8 res7;
+ rtems_unsigned8 tbd; /* Tx Internal Buffer Number */
+ rtems_unsigned32 _tdptr; /* Tx Internal Data Pointer */
+ rtems_unsigned16 _tcount; /* Tx Internal Byte Count */
+ rtems_unsigned16 _ttmp; /* Tx Temp */
+} m302_SCC_parameters_t;
+
+/*
+ * UART-Specific SCC Parameter RAM
+ * Section 4.5.11.3
+ */
+typedef struct {
+ rtems_unsigned16 max_idl; /* Maximum IDLE Characters (rx) */
+ rtems_unsigned16 idlc; /* Temporary rx IDLE counter */
+ rtems_unsigned16 brkcr; /* Break Count Register (tx) */
+ rtems_unsigned16 parec; /* Receive Parity Error Counter */
+ rtems_unsigned16 frmec; /* Receive Framing Error Counter */
+ rtems_unsigned16 nosec; /* Receive Noise Counter */
+ rtems_unsigned16 brkec; /* Receive Break Condition Counter */
+ rtems_unsigned16 uaddr1; /* UART ADDRESS Character 1 */
+ rtems_unsigned16 uaddr2; /* UART ADDRESS Character 2 */
+ rtems_unsigned16 rccr; /* Receive Control Character Register */
+ rtems_unsigned16 character[8]; /* Control Characters 1 through 8*/
+} m302_SCC_UartSpecific_t;
+/*
+ * This definition allows for the checking of receive buffers
+ * for errors.
+ */
+
+#define RCV_ERR 0x003F
+
+/*
+ * UART receive buffer descriptor bit definitions.
+ * Section 4.5.11.14
+ */
+#define RBIT_UART_CTRL (1<<11) /* buffer contains a control char */
+#define RBIT_UART_ADDR (1<<10) /* first byte contains an address */
+#define RBIT_UART_MATCH (1<<9) /* indicates which addr char matched */
+#define RBIT_UART_IDLE (1<<8) /* buffer closed due to IDLE sequence */
+#define RBIT_UART_BR (1<<5) /* break sequence was received */
+#define RBIT_UART_FR (1<<4) /* framing error was received */
+#define RBIT_UART_PR (1<<3) /* parity error was received */
+#define RBIT_UART_OV (1<<1) /* receiver overrun occurred */
+#define RBIT_UART_CD (1<<0) /* carrier detect lost */
+#define RBIT_UART_STATUS 0x003B /* all status bits */
+
+/*
+ * UART transmit buffer descriptor bit definitions.
+ * Section 4.5.11.15
+ */
+#define RBIT_UART_CR (1<<11) /* clear-to-send report
+ * this results in two idle bits
+ * between back-to-back frames
+ */
+#define RBIT_UART_A (1<<10) /* buffer contains address characters
+ * only valid in multidrop mode (UM0=1)
+ */
+#define RBIT_UART_PREAMBLE (1<<9) /* send preamble before data */
+#define RBIT_UART_CTS_LOST (1<<0) /* CTS lost */
+
+/*
+ * UART event register
+ * Section 4.5.11.16
+ */
+#define M302_UART_EV_CTS (1<<7) /* CTS status changed */
+#define M302_UART_EV_CD (1<<6) /* carrier detect status changed */
+#define M302_UART_EV_IDL (1<<5) /* IDLE sequence status changed */
+#define M302_UART_EV_BRK (1<<4) /* break character was received */
+#define M302_UART_EV_CCR (1<<3) /* control character received */
+#define M302_UART_EV_TX (1<<1) /* buffer has been transmitted */
+#define M302_UART_EV_RX (1<<0) /* buffer has been received */
+
+
+/*
+ * HDLC-Specific SCC Parameter RAM
+ * Section 4.5.12.3
+ *
+ * c_mask_l should be 0xF0B8 for 16-bit CRC, 0xdebb for 32-bit CRC
+ * c_mask_h is a don't care for 16-bit CRC, 0x20E2 for 32-bit CRC
+ */
+typedef struct {
+ rtems_unsigned16 rcrc_l; /* Temp Receive CRC Low */
+ rtems_unsigned16 rcrc_h; /* Temp Receive CRC High */
+ rtems_unsigned16 c_mask_l; /* CRC Mask Low */
+ rtems_unsigned16 c_mask_h; /* CRC Mask High */
+ rtems_unsigned16 tcrc_l; /* Temp Transmit CRC Low */
+ rtems_unsigned16 tcrc_h; /* Temp Transmit CRC High */
+
+ rtems_unsigned16 disfc; /* Discard Frame Counter */
+ rtems_unsigned16 crcec; /* CRC Error Counter */
+ rtems_unsigned16 abtsc; /* Abort Sequence Counter */
+ rtems_unsigned16 nmarc; /* Nonmatching Address Received Cntr */
+ rtems_unsigned16 retrc; /* Frame Retransmission Counter */
+
+ rtems_unsigned16 mflr; /* Maximum Frame Length Register */
+ rtems_unsigned16 max_cnt; /* Maximum_Length Counter */
+
+ rtems_unsigned16 hmask; /* User Defined Frame Address Mask */
+ rtems_unsigned16 haddr1; /* User Defined Frame Address */
+ rtems_unsigned16 haddr2; /* " */
+ rtems_unsigned16 haddr3; /* " */
+ rtems_unsigned16 haddr4; /* " */
+} m302_SCC_HdlcSpecific_t;
+/*
+ * HDLC receiver buffer descriptor bit definitions
+ * Section 4.5.12.10
+ */
+#define RBIT_HDLC_EMPTY_BIT 0x8000 /* buffer associated with BD is empty */
+#define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in a frame */
+#define RBIT_HDLC_FIRST_BIT 0x0400 /* buffer is first in a frame */
+#define RBIT_HDLC_FRAME_LEN 0x0020 /* receiver frame length violation */
+#define RBIT_HDLC_NONOCT_Rx 0x0010 /* received non-octet aligned frame */
+#define RBIT_HDLC_ABORT_SEQ 0x0008 /* received abort sequence */
+#define RBIT_HDLC_CRC_ERROR 0x0004 /* frame contains a CRC error */
+#define RBIT_HDLC_OVERRUN 0x0002 /* receiver overrun occurred */
+#define RBIT_HDLC_CD_LOST 0x0001 /* carrier detect lost */
+
+/*
+ * HDLC transmit buffer descriptor bit definitions
+ * Section 4.5.12.11
+ */
+#define RBIT_HDLC_READY_BIT 0x8000 /* buffer is ready to transmit */
+#define RBIT_HDLC_EXT_BUFFER 0x4000 /* buffer is in external memory */
+#define RBIT_HDLC_WRAP_BIT 0x2000 /* last buffer in bd table, so wrap */
+#define RBIT_HDLC_WAKE_UP 0x1000 /* interrupt when buffer serviced */
+#define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in the frame */
+#define RBIT_HDLC_TxCRC_BIT 0x0400 /* transmit a CRC sequence */
+#define RBIT_HDLC_UNDERRUN 0x0002 /* transmitter underrun */
+#define RBIT_HDLC_CTS_LOST 0x0001 /* CTS lost */
+
+/*
+ * HDLC event register bit definitions
+ * Section 4.5.12.12
+ */
+#define RBIT_HDLC_CTS 0x80 /* CTS status changed */
+#define RBIT_HDLC_CD 0x40 /* carrier detect status changed */
+#define RBIT_HDLC_IDL 0x20 /* IDLE sequence status changed */
+#define RBIT_HDLC_TXE 0x10 /* transmit error */
+#define RBIT_HDLC_RXF 0x08 /* received frame */
+#define RBIT_HDLC_BSY 0x04 /* frame rcvd and discarded due to
+ * lack of buffers
+ */
+#define RBIT_HDLC_TXB 0x02 /* buffer has been transmitted */
+#define RBIT_HDLC_RXB 0x01 /* received buffer */
+
+
+
+typedef struct {
+ m302_SCC_bd_table_t bd; /* +000 Buffer Descriptor Table */
+ m302_SCC_parameters_t parm; /* +080 Common Parameter RAM */
+ union { /* +09C Protocol-Specific Parm RAM */
+ m302_SCC_UartSpecific_t uart;
+ m302_SCC_HdlcSpecific_t hdlc;
+ } prot;
+ rtems_unsigned8 res[0x040]; /* +0C0 reserved, (not implemented) */
+} m302_SCC_t;
+
+
+/*
+ * Common SCC Registers
+ */
+typedef struct {
+ rtems_unsigned16 res1;
+ rtems_unsigned16 scon; /* SCC Configuration Register 4.5.2 */
+ rtems_unsigned16 scm; /* SCC Mode Register 4.5.3 */
+ rtems_unsigned16 dsr; /* SCC Data Synchronization Register 4.5.4 */
+ rtems_unsigned8 scce; /* SCC Event Register 4.5.8.1 */
+ rtems_unsigned8 res2;
+ rtems_unsigned8 sccm; /* SCC Mask Register 4.5.8.2 */
+ rtems_unsigned8 res3;
+ rtems_unsigned8 sccs; /* SCC Status Register 4.5.8.3 */
+ rtems_unsigned8 res4;
+ rtems_unsigned16 res5;
+} m302_SCC_Registers_t;
+
+/*
+ * SCON - SCC Configuration Register
+ * Section 4.5.2
+ */
+#define RBIT_SCON_WOMS (1<<15) /* Wired-OR Mode Select (NMSI mode only)
+ * When set, the TXD driver is an
+ * open-drain output */
+#define RBIT_SCON_EXTC (1<<14) /* External Clock Source */
+#define RBIT_SCON_TCS (1<<13) /* Transmit Clock Source */
+#define RBIT_SCON_RCS (1<<12) /* Receive Clock Source */
+
+/*
+ * SCM - SCC Mode Register bit definitions
+ * Section 4.5.3
+ * The parameter-specific mode bits occupy bits 15 through 6.
+ */
+#define RBIT_SCM_ENR (1<<3) /* Enable receiver */
+#define RBIT_SCM_ENT (1<<2) /* Enable transmitter */
+
+
+/*
+ * Internal MC68302 Registers
+ * starts at offset 0x800 from dual-port RAM base
+ * Section 2.8
+ */
+typedef struct {
+ /* offset +800 */
+ rtems_unsigned16 res0;
+ rtems_unsigned16 cmr; /* IDMA Channel Mode Register */
+ rtems_unsigned32 sapr; /* IDMA Source Address Pointer */
+ rtems_unsigned32 dapr; /* IDMA Destination Address Pointer */
+ rtems_unsigned16 bcr; /* IDMA Byte Count Register */
+ rtems_unsigned8 csr; /* IDMA Channel Status Register */
+ rtems_unsigned8 res1;
+ rtems_unsigned8 fcr; /* IDMA Function Code Register */
+ rtems_unsigned8 res2;
+
+ /* offset +812 */
+ rtems_unsigned16 gimr; /* Global Interrupt Mode Register */
+ rtems_unsigned16 ipr; /* Interrupt Pending Register */
+ rtems_unsigned16 imr; /* Interrupt Mask Register */
+ rtems_unsigned16 isr; /* Interrupt In-Service Register */
+ rtems_unsigned16 res3;
+ rtems_unsigned16 res4;
+
+ /* offset +81e */
+ rtems_unsigned16 pacnt; /* Port A Control Register */
+ rtems_unsigned16 paddr; /* Port A Data Direction Register */
+ rtems_unsigned16 padat; /* Port A Data Register */
+ rtems_unsigned16 pbcnt; /* Port B Control Register */
+ rtems_unsigned16 pbddr; /* Port B Data Direction Register */
+ rtems_unsigned16 pbdat; /* Port B Data Register */
+ rtems_unsigned16 res5;
+
+ /* offset +82c */
+ rtems_unsigned16 res6;
+ rtems_unsigned16 res7;
+ rtems_unsigned16 br0; /* Base Register (CS0) */
+ rtems_unsigned16 or0; /* Option Register (CS0) */
+ rtems_unsigned16 br1; /* Base Register (CS1) */
+ rtems_unsigned16 or1; /* Option Register (CS1) */
+ rtems_unsigned16 br2; /* Base Register (CS2) */
+ rtems_unsigned16 or2; /* Option Register (CS2) */
+ rtems_unsigned16 br3; /* Base Register (CS3) */
+ rtems_unsigned16 or3; /* Option Register (CS3) */
+
+ /* offset +840 */
+ rtems_unsigned16 tmr1; /* Timer Unit 1 Mode Register */
+ rtems_unsigned16 trr1; /* Timer Unit 1 Reference Register */
+ rtems_unsigned16 tcr1; /* Timer Unit 1 Capture Register */
+ rtems_unsigned16 tcn1; /* Timer Unit 1 Counter */
+ rtems_unsigned8 res8;
+ rtems_unsigned8 ter1; /* Timer Unit 1 Event Register */
+ rtems_unsigned16 wrr; /* Watchdog Reference Register */
+ rtems_unsigned16 wcn; /* Watchdog Counter */
+ rtems_unsigned16 res9;
+ rtems_unsigned16 tmr2; /* Timer Unit 2 Mode Register */
+ rtems_unsigned16 trr2; /* Timer Unit 2 Reference Register */
+ rtems_unsigned16 tcr2; /* Timer Unit 2 Capture Register */
+ rtems_unsigned16 tcn2; /* Timer Unit 2 Counter */
+ rtems_unsigned8 resa;
+ rtems_unsigned8 ter2; /* Timer Unit 2 Event Register */
+ rtems_unsigned16 resb;
+ rtems_unsigned16 resc;
+ rtems_unsigned16 resd;
+
+ /* offset +860 */
+ rtems_unsigned8 cr; /* Command Register */
+ rtems_unsigned8 rese[0x1f];
+
+ /* offset +880, +890, +8a0 */
+ m302_SCC_Registers_t scc[3]; /* SCC1, SCC2, SCC3 Registers */
+
+ /* offset +8b0 */
+ rtems_unsigned16 spmode; /* SCP,SMC Mode and Clock Cntrl Reg */
+ rtems_unsigned16 simask; /* Serial Interface Mask Register */
+ rtems_unsigned16 simode; /* Serial Interface Mode Register */
+} m302_internalReg_t ;
+
+
+/*
+ * MC68302 dual-port RAM structure.
+ * (Includes System RAM, Parameter RAM, and Internal Registers).
+ * Section 2.8
+ */
+typedef struct {
+ rtems_unsigned8 mem[0x240]; /* +000 User Data Memory */
+ rtems_unsigned8 res1[0x1c0]; /* +240 reserved, (not implemented) */
+ m302_SCC_t scc1; /* +400 SCC1 */
+ m302_SCC_t scc2; /* +500 SCC2 */
+ m302_SCC_t scc3; /* +600 SCC3 */
+ rtems_unsigned8 res2[0x100]; /* +700 reserved, (not implemented) */
+ m302_internalReg_t reg; /* +800 68302 Internal Registers */
+} m302_dualPortRAM_t;
+
+
+/*
+ * Declare the variable that's used to reference the variables in
+ * the dual-port RAM.
+ */
+extern volatile m302_dualPortRAM_t m302;
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/m68k/m68360.h b/c/src/exec/score/cpu/m68k/m68360.h
new file mode 100644
index 0000000000..84687c49fa
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/m68360.h
@@ -0,0 +1,880 @@
+/*
+ **************************************************************************
+ **************************************************************************
+ ** **
+ ** MOTOROLA MC68360 QUAD INTEGRATED COMMUNICATIONS CONTROLLER (QUICC) **
+ ** **
+ ** HARDWARE DECLARATIONS **
+ ** **
+ ** **
+ ** Submitted By: **
+ ** **
+ ** W. Eric Norum **
+ ** Saskatchewan Accelerator Laboratory **
+ ** University of Saskatchewan **
+ ** 107 North Road **
+ ** Saskatoon, Saskatchewan, CANADA **
+ ** S7N 5C6 **
+ ** **
+ ** eric@skatter.usask.ca **
+ ** **
+ ** $Id$ **
+ ** **
+ **************************************************************************
+ **************************************************************************
+ */
+
+#ifndef __MC68360_h
+#define __MC68360_h
+
+/*
+ *************************************************************************
+ * REGISTER SUBBLOCKS *
+ *************************************************************************
+ */
+
+/*
+ * Memory controller registers
+ */
+typedef struct m360MEMCRegisters_ {
+ rtems_unsigned32 br;
+ rtems_unsigned32 or;
+ rtems_unsigned32 _pad[2];
+} m360MEMCRegisters_t;
+
+/*
+ * Serial Communications Controller registers
+ */
+typedef struct m360SCCRegisters_ {
+ rtems_unsigned32 gsmr_l;
+ rtems_unsigned32 gsmr_h;
+ rtems_unsigned16 psmr;
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 todr;
+ rtems_unsigned16 dsr;
+ rtems_unsigned16 scce;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned16 sccm;
+ rtems_unsigned8 _pad2;
+ rtems_unsigned8 sccs;
+ rtems_unsigned32 _pad3[2];
+} m360SCCRegisters_t;
+
+/*
+ * Serial Management Controller registers
+ */
+typedef struct m360SMCRegisters_ {
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 smcmr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned8 smce;
+ rtems_unsigned8 _pad2;
+ rtems_unsigned16 _pad3;
+ rtems_unsigned8 smcm;
+ rtems_unsigned8 _pad4;
+ rtems_unsigned32 _pad5;
+} m360SMCRegisters_t;
+
+
+/*
+ *************************************************************************
+ * Miscellaneous Parameters *
+ *************************************************************************
+ */
+typedef struct m360MiscParms_ {
+ rtems_unsigned16 rev_num;
+ rtems_unsigned16 _res1;
+ rtems_unsigned32 _res2;
+ rtems_unsigned32 _res3;
+} m360MiscParms_t;
+
+/*
+ *************************************************************************
+ * RISC Timers *
+ *************************************************************************
+ */
+typedef struct m360TimerParms_ {
+ rtems_unsigned16 tm_base;
+ rtems_unsigned16 _tm_ptr;
+ rtems_unsigned16 _r_tmr;
+ rtems_unsigned16 _r_tmv;
+ rtems_unsigned32 tm_cmd;
+ rtems_unsigned32 tm_cnt;
+} m360TimerParms_t;
+
+/*
+ * RISC Controller Configuration Register (RCCR)
+ * All other bits in this register are either reserved or
+ * used only with a Motorola-supplied RAM microcode packge.
+ */
+#define M360_RCCR_TIME (1<<15) /* Enable timer */
+#define M360_RCCR_TIMEP(x) ((x)<<8) /* Timer period */
+
+/*
+ * Command register
+ * Set up this register before issuing a M360_CR_OP_SET_TIMER command.
+ */
+#define M360_TM_CMD_V (1<<31) /* Set to enable timer */
+#define M360_TM_CMD_R (1<<30) /* Set for automatic restart */
+#define M360_TM_CMD_TIMER(x) ((x)<<16) /* Select timer */
+#define M360_TM_CMD_PERIOD(x) (x) /* Timer period (16 bits) */
+
+/*
+ *************************************************************************
+ * DMA Controllers *
+ *************************************************************************
+ */
+typedef struct m360IDMAparms_ {
+ rtems_unsigned16 ibase;
+ rtems_unsigned16 ibptr;
+ rtems_unsigned32 _istate;
+ rtems_unsigned32 _itemp;
+} m360IDMAparms_t;
+
+/*
+ *************************************************************************
+ * Serial Communication Controllers *
+ *************************************************************************
+ */
+typedef struct m360SCCparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ rtems_unsigned32 _rcrc;
+ rtems_unsigned32 _tcrc;
+ union {
+ struct {
+ rtems_unsigned32 _res0;
+ rtems_unsigned32 _res1;
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _idlc;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 parec;
+ rtems_unsigned16 frmec;
+ rtems_unsigned16 nosec;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 uaddr[2];
+ rtems_unsigned16 _rtemp;
+ rtems_unsigned16 toseq;
+ rtems_unsigned16 character[8];
+ rtems_unsigned16 rccm;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 rlbc;
+ } uart;
+ } un;
+} m360SCCparms_t;
+
+typedef struct m360SCCENparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ rtems_unsigned32 _rcrc;
+ rtems_unsigned32 _tcrc;
+ union {
+ struct {
+ rtems_unsigned32 _res0;
+ rtems_unsigned32 _res1;
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _idlc;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 parec;
+ rtems_unsigned16 frmec;
+ rtems_unsigned16 nosec;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 uaddr[2];
+ rtems_unsigned16 _rtemp;
+ rtems_unsigned16 toseq;
+ rtems_unsigned16 character[8];
+ rtems_unsigned16 rccm;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 rlbc;
+ } uart;
+ struct {
+ rtems_unsigned32 c_pres;
+ rtems_unsigned32 c_mask;
+ rtems_unsigned32 crcec;
+ rtems_unsigned32 alec;
+ rtems_unsigned32 disfc;
+ rtems_unsigned16 pads;
+ rtems_unsigned16 ret_lim;
+ rtems_unsigned16 _ret_cnt;
+ rtems_unsigned16 mflr;
+ rtems_unsigned16 minflr;
+ rtems_unsigned16 maxd1;
+ rtems_unsigned16 maxd2;
+ rtems_unsigned16 _maxd;
+ rtems_unsigned16 dma_cnt;
+ rtems_unsigned16 _max_b;
+ rtems_unsigned16 gaddr1;
+ rtems_unsigned16 gaddr2;
+ rtems_unsigned16 gaddr3;
+ rtems_unsigned16 gaddr4;
+ rtems_unsigned32 _tbuf0data0;
+ rtems_unsigned32 _tbuf0data1;
+ rtems_unsigned32 _tbuf0rba0;
+ rtems_unsigned32 _tbuf0crc;
+ rtems_unsigned16 _tbuf0bcnt;
+ rtems_unsigned16 paddr_h;
+ rtems_unsigned16 paddr_m;
+ rtems_unsigned16 paddr_l;
+ rtems_unsigned16 p_per;
+ rtems_unsigned16 _rfbd_ptr;
+ rtems_unsigned16 _tfbd_ptr;
+ rtems_unsigned16 _tlbd_ptr;
+ rtems_unsigned32 _tbuf1data0;
+ rtems_unsigned32 _tbuf1data1;
+ rtems_unsigned32 _tbuf1rba0;
+ rtems_unsigned32 _tbuf1crc;
+ rtems_unsigned16 _tbuf1bcnt;
+ rtems_unsigned16 _tx_len;
+ rtems_unsigned16 iaddr1;
+ rtems_unsigned16 iaddr2;
+ rtems_unsigned16 iaddr3;
+ rtems_unsigned16 iaddr4;
+ rtems_unsigned16 _boff_cnt;
+ rtems_unsigned16 taddr_l;
+ rtems_unsigned16 taddr_m;
+ rtems_unsigned16 taddr_h;
+ } ethernet;
+ } un;
+} m360SCCENparms_t;
+
+/*
+ * Receive and transmit function code register bits
+ * These apply to the function code registers of all devices, not just SCC.
+ */
+#define M360_RFCR_MOT (1<<4)
+#define M360_RFCR_DMA_SPACE 0x8
+#define M360_TFCR_MOT (1<<4)
+#define M360_TFCR_DMA_SPACE 0x8
+
+/*
+ *************************************************************************
+ * Serial Management Controllers *
+ *************************************************************************
+ */
+typedef struct m360SMCparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ union {
+ struct {
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 _r_mask;
+ } uart;
+ struct {
+ rtems_unsigned16 _pad0[5];
+ } transparent;
+ } un;
+} m360SMCparms_t;
+
+/*
+ * Mode register
+ */
+#define M360_SMCMR_CLEN(x) ((x)<<11) /* Character length */
+#define M360_SMCMR_2STOP (1<<10) /* 2 stop bits */
+#define M360_SMCMR_PARITY (1<<9) /* Enable parity */
+#define M360_SMCMR_EVEN (1<<8) /* Even parity */
+#define M360_SMCMR_SM_GCI (0<<4) /* GCI Mode */
+#define M360_SMCMR_SM_UART (2<<4) /* UART Mode */
+#define M360_SMCMR_SM_TRANSPARENT (3<<4) /* Transparent Mode */
+#define M360_SMCMR_DM_LOOPBACK (1<<2) /* Local loopback mode */
+#define M360_SMCMR_DM_ECHO (2<<2) /* Echo mode */
+#define M360_SMCMR_TEN (1<<1) /* Enable transmitter */
+#define M360_SMCMR_REN (1<<0) /* Enable receiver */
+
+/*
+ * Event and mask registers (SMCE, SMCM)
+ */
+#define M360_SMCE_BRK (1<<4)
+#define M360_SMCE_BSY (1<<2)
+#define M360_SMCE_TX (1<<1)
+#define M360_SMCE_RX (1<<0)
+
+/*
+ *************************************************************************
+ * Serial Peripheral Interface *
+ *************************************************************************
+ */
+typedef struct m360SPIparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+} m360SPIparms_t;
+
+/*
+ * Mode register (SPMODE)
+ */
+#define M360_SPMODE_LOOP (1<<14) /* Local loopback mode */
+#define M360_SPMODE_CI (1<<13) /* Clock invert */
+#define M360_SPMODE_CP (1<<12) /* Clock phase */
+#define M360_SPMODE_DIV16 (1<<11) /* Divide BRGCLK by 16 */
+#define M360_SPMODE_REV (1<<10) /* Reverse data */
+#define M360_SPMODE_MASTER (1<<9) /* SPI is master */
+#define M360_SPMODE_EN (1<<8) /* Enable SPI */
+#define M360_SPMODE_CLEN(x) ((x)<<4) /* Character length */
+#define M360_SPMODE_PM(x) (x) /* Prescaler modulus */
+
+/*
+ * Mode register (SPCOM)
+ */
+#define M360_SPCOM_STR (1<<7) /* Start transmit */
+
+/*
+ * Event and mask registers (SPIE, SPIM)
+ */
+#define M360_SPIE_MME (1<<5) /* Multi-master error */
+#define M360_SPIE_TXE (1<<4) /* Tx error */
+#define M360_SPIE_BSY (1<<2) /* Busy condition*/
+#define M360_SPIE_TXB (1<<1) /* Tx buffer */
+#define M360_SPIE_RXB (1<<0) /* Rx buffer */
+
+/*
+ *************************************************************************
+ * SDMA (SCC, SMC, SPI) Buffer Descriptors *
+ *************************************************************************
+ */
+typedef struct m360BufferDescriptor_ {
+ rtems_unsigned16 status;
+ rtems_unsigned16 length;
+ volatile void *buffer;
+} m360BufferDescriptor_t;
+
+/*
+ * Bits in receive buffer descriptor status word
+ */
+#define M360_BD_EMPTY (1<<15) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_WRAP (1<<13) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_INTERRUPT (1<<12) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_LAST (1<<11) /* Ethernet, SPI */
+#define M360_BD_CONTROL_CHAR (1<<11) /* SCC UART */
+#define M360_BD_FIRST_IN_FRAME (1<<10) /* Ethernet */
+#define M360_BD_ADDRESS (1<<10) /* SCC UART */
+#define M360_BD_CONTINUOUS (1<<9) /* SCC UART, SMC UART, SPI */
+#define M360_BD_MISS (1<<8) /* Ethernet */
+#define M360_BD_IDLE (1<<8) /* SCC UART, SMC UART */
+#define M360_BD_ADDRSS_MATCH (1<<7) /* SCC UART */
+#define M360_BD_LONG (1<<5) /* Ethernet */
+#define M360_BD_BREAK (1<<5) /* SCC UART, SMC UART */
+#define M360_BD_NONALIGNED (1<<4) /* Ethernet */
+#define M360_BD_FRAMING_ERROR (1<<4) /* SCC UART, SMC UART */
+#define M360_BD_SHORT (1<<3) /* Ethernet */
+#define M360_BD_PARITY_ERROR (1<<3) /* SCC UART, SMC UART */
+#define M360_BD_CRC_ERROR (1<<2) /* Ethernet */
+#define M360_BD_OVERRUN (1<<1) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_COLLISION (1<<0) /* Ethernet */
+#define M360_BD_CARRIER_LOST (1<<0) /* SCC UART */
+#define M360_BD_MASTER_ERROR (1<<0) /* SPI */
+
+/*
+ * Bits in transmit buffer descriptor status word
+ * Many bits have the same meaning as those in receiver buffer descriptors.
+ */
+#define M360_BD_READY (1<<15) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_PAD (1<<14) /* Ethernet */
+#define M360_BD_CTS_REPORT (1<<11) /* SCC UART */
+#define M360_BD_TX_CRC (1<<10) /* Ethernet */
+#define M360_BD_DEFER (1<<9) /* Ethernet */
+#define M360_BD_HEARTBEAT (1<<8) /* Ethernet */
+#define M360_BD_PREAMBLE (1<<8) /* SCC UART, SMC UART */
+#define M360_BD_LATE_COLLISION (1<<7) /* Ethernet */
+#define M360_BD_NO_STOP_BIT (1<<7) /* SCC UART */
+#define M360_BD_RETRY_LIMIT (1<<6) /* Ethernet */
+#define M360_BD_RETRY_COUNT(x) (((x)&0x3C)>>2) /* Ethernet */
+#define M360_BD_UNDERRUN (1<<1) /* Ethernet, SPI */
+#define M360_BD_CARRIER_LOST (1<<0) /* Ethernet */
+#define M360_BD_CTS_LOST (1<<0) /* SCC UART */
+
+/*
+ *************************************************************************
+ * IDMA Buffer Descriptors *
+ *************************************************************************
+ */
+typedef struct m360IDMABufferDescriptor_ {
+ rtems_unsigned16 status;
+ rtems_unsigned16 _pad;
+ rtems_unsigned32 length;
+ void *source;
+ void *destination;
+} m360IDMABufferDescriptor_t;
+
+/*
+ *************************************************************************
+ * RISC Communication Processor Module Command Register (CR) *
+ *************************************************************************
+ */
+#define M360_CR_RST (1<<15) /* Reset communication processor */
+#define M360_CR_OP_INIT_RX_TX (0<<8) /* SCC, SMC UART, SMC GCI, SPI */
+#define M360_CR_OP_INIT_RX (1<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_INIT_TX (2<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_INIT_HUNT (3<<8) /* SCC, SMC UART */
+#define M360_CR_OP_STOP_TX (4<<8) /* SCC, SMC UART */
+#define M360_CR_OP_GR_STOP_TX (5<<8) /* SCC */
+#define M360_CR_OP_INIT_IDMA (5<<8) /* IDMA */
+#define M360_CR_OP_RESTART_TX (6<<8) /* SCC, SMC UART */
+#define M360_CR_OP_CLOSE_RX_BD (7<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_SET_GRP_ADDR (8<<8) /* SCC */
+#define M360_CR_OP_SET_TIMER (8<<8) /* Timer */
+#define M360_CR_OP_GCI_TIMEOUT (9<<8) /* SMC GCI */
+#define M360_CR_OP_RESERT_BCS (10<<8) /* SCC */
+#define M360_CR_OP_GCI_ABORT (10<<8) /* SMC GCI */
+#define M360_CR_CHAN_SCC1 (0<<4) /* Channel selection */
+#define M360_CR_CHAN_SCC2 (4<<4)
+#define M360_CR_CHAN_SPI (5<<4)
+#define M360_CR_CHAN_TIMER (5<<4)
+#define M360_CR_CHAN_SCC3 (8<<4)
+#define M360_CR_CHAN_SMC1 (9<<4)
+#define M360_CR_CHAN_IDMA1 (9<<4)
+#define M360_CR_CHAN_SCC4 (12<<4)
+#define M360_CR_CHAN_SMC2 (13<<4)
+#define M360_CR_CHAN_IDMA2 (13<<4)
+#define M360_CR_FLG (1<<0) /* Command flag */
+
+/*
+ *************************************************************************
+ * System Protection Control Register (SYPCR) *
+ *************************************************************************
+ */
+#define M360_SYPCR_SWE (1<<7) /* Software watchdog enable */
+#define M360_SYPCR_SWRI (1<<6) /* Software watchdog reset select */
+#define M360_SYPCR_SWT1 (1<<5) /* Software watchdog timing bit 1 */
+#define M360_SYPCR_SWT0 (1<<4) /* Software watchdog timing bit 0 */
+#define M360_SYPCR_DBFE (1<<3) /* Double bus fault monitor enable */
+#define M360_SYPCR_BME (1<<2) /* Bus monitor external enable */
+#define M360_SYPCR_BMT1 (1<<1) /* Bus monitor timing bit 1 */
+#define M360_SYPCR_BMT0 (1<<0) /* Bus monitor timing bit 0 */
+
+/*
+ *************************************************************************
+ * Memory Control Registers *
+ *************************************************************************
+ */
+#define M360_GMR_RCNT(x) ((x)<<24) /* Refresh count */
+#define M360_GMR_RFEN (1<<23) /* Refresh enable */
+#define M360_GMR_RCYC(x) ((x)<<21) /* Refresh cycle length */
+#define M360_GMR_PGS(x) ((x)<<18) /* Page size */
+#define M360_GMR_DPS_32BIT (0<<16) /* DRAM port size */
+#define M360_GMR_DPS_16BIT (1<<16)
+#define M360_GMR_DPS_8BIT (2<<16)
+#define M360_GMR_DPS_DSACK (3<<16)
+#define M360_GMR_WBT40 (1<<15) /* Wait between 040 transfers */
+#define M360_GMR_WBTQ (1<<14) /* Wait between 360 transfers */
+#define M360_GMR_SYNC (1<<13) /* Synchronous external access */
+#define M360_GMR_EMWS (1<<12) /* External master wait state */
+#define M360_GMR_OPAR (1<<11) /* Odd parity */
+#define M360_GMR_PBEE (1<<10) /* Parity bus error enable */
+#define M360_GMR_TSS40 (1<<9) /* TS* sample for 040 */
+#define M360_GMR_NCS (1<<8) /* No CPU space */
+#define M360_GMR_DWQ (1<<7) /* Delay write for 360 */
+#define M360_GMR_DW40 (1<<6) /* Delay write for 040 */
+#define M360_GMR_GAMX (1<<5) /* Global address mux enable */
+
+#define M360_MEMC_BR_FC(x) ((x)<<7) /* Function code limit */
+#define M360_MEMC_BR_TRLXQ (1<<6) /* Relax timing requirements */
+#define M360_MEMC_BR_BACK40 (1<<5) /* Burst acknowledge to 040 */
+#define M360_MEMC_BR_CSNT40 (1<<4) /* CS* negate timing for 040 */
+#define M360_MEMC_BR_CSNTQ (1<<3) /* CS* negate timing for 360 */
+#define M360_MEMC_BR_PAREN (1<<2) /* Enable parity checking */
+#define M360_MEMC_BR_WP (1<<1) /* Write Protect */
+#define M360_MEMC_BR_V (1<<0) /* Base/Option register are valid */
+
+#define M360_MEMC_OR_TCYC(x) ((x)<<28) /* Cycle length (clocks) */
+#define M360_MEMC_OR_WAITS(x) M360_MEMC_OR_TCYC((x)+1)
+#define M360_MEMC_OR_2KB 0x0FFFF800 /* Address range */
+#define M360_MEMC_OR_4KB 0x0FFFF000
+#define M360_MEMC_OR_8KB 0x0FFFE000
+#define M360_MEMC_OR_16KB 0x0FFFC000
+#define M360_MEMC_OR_32KB 0x0FFF8000
+#define M360_MEMC_OR_64KB 0x0FFF0000
+#define M360_MEMC_OR_128KB 0x0FFE0000
+#define M360_MEMC_OR_256KB 0x0FFC0000
+#define M360_MEMC_OR_512KB 0x0FF80000
+#define M360_MEMC_OR_1MB 0x0FF00000
+#define M360_MEMC_OR_2MB 0x0FE00000
+#define M360_MEMC_OR_4MB 0x0FC00000
+#define M360_MEMC_OR_8MB 0x0F800000
+#define M360_MEMC_OR_16MB 0x0F000000
+#define M360_MEMC_OR_32MB 0x0E000000
+#define M360_MEMC_OR_64MB 0x0C000000
+#define M360_MEMC_OR_128MB 0x08000000
+#define M360_MEMC_OR_256MB 0x00000000
+#define M360_MEMC_OR_FCMC(x) ((x)<<7) /* Function code mask */
+#define M360_MEMC_OR_BCYC(x) ((x)<<5) /* Burst cycle length (clocks) */
+#define M360_MEMC_OR_PGME (1<<3) /* Page mode enable */
+#define M360_MEMC_OR_32BIT (0<<1) /* Port size */
+#define M360_MEMC_OR_16BIT (1<<1)
+#define M360_MEMC_OR_8BIT (2<<1)
+#define M360_MEMC_OR_DSACK (3<<1)
+#define M360_MEMC_OR_DRAM (1<<0) /* Dynamic RAM select */
+
+/*
+ *************************************************************************
+ * SI Mode Register (SIMODE) *
+ *************************************************************************
+ */
+#define M360_SI_SMC2_BITS 0xFFFF0000 /* All SMC2 bits */
+#define M360_SI_SMC2_TDM (1<<31) /* Multiplexed SMC2 */
+#define M360_SI_SMC2_BRG1 (0<<28) /* SMC2 clock souce */
+#define M360_SI_SMC2_BRG2 (1<<28)
+#define M360_SI_SMC2_BRG3 (2<<28)
+#define M360_SI_SMC2_BRG4 (3<<28)
+#define M360_SI_SMC2_CLK5 (0<<28)
+#define M360_SI_SMC2_CLK6 (1<<28)
+#define M360_SI_SMC2_CLK7 (2<<28)
+#define M360_SI_SMC2_CLK8 (3<<28)
+#define M360_SI_SMC1_BITS 0x0000FFFF /* All SMC1 bits */
+#define M360_SI_SMC1_TDM (1<<15) /* Multiplexed SMC1 */
+#define M360_SI_SMC1_BRG1 (0<<12) /* SMC1 clock souce */
+#define M360_SI_SMC1_BRG2 (1<<12)
+#define M360_SI_SMC1_BRG3 (2<<12)
+#define M360_SI_SMC1_BRG4 (3<<12)
+#define M360_SI_SMC1_CLK1 (0<<12)
+#define M360_SI_SMC1_CLK2 (1<<12)
+#define M360_SI_SMC1_CLK3 (2<<12)
+#define M360_SI_SMC1_CLK4 (3<<12)
+
+/*
+ *************************************************************************
+ * SDMA Configuration Register (SDMA) *
+ *************************************************************************
+ */
+#define M360_SDMA_FREEZE (2<<13) /* Freeze on next bus cycle */
+#define M360_SDMA_SISM_7 (7<<8) /* Normal interrupt service mask */
+#define M360_SDMA_SAID_4 (4<<4) /* Normal arbitration ID */
+#define M360_SDMA_INTE (1<<1) /* SBER interrupt enable */
+#define M360_SDMA_INTB (1<<0) /* SBKP interrupt enable */
+
+/*
+ *************************************************************************
+ * Baud (sic) Rate Generators *
+ *************************************************************************
+ */
+#define M360_BRG_RST (1<<17) /* Reset generator */
+#define M360_BRG_EN (1<<16) /* Enable generator */
+#define M360_BRG_EXTC_BRGCLK (0<<14) /* Source is BRGCLK */
+#define M360_BRG_EXTC_CLK2 (1<<14) /* Source is CLK2 pin */
+#define M360_BRG_EXTC_CLK6 (2<<14) /* Source is CLK6 pin */
+#define M360_BRG_ATB (1<<13) /* Autobaud */
+#define M360_BRG_115200 (13<<1) /* Assume 25 MHz clock */
+#define M360_BRG_57600 (26<<1)
+#define M360_BRG_38400 (40<<1)
+#define M360_BRG_19200 (80<<1)
+#define M360_BRG_9600 (162<<1)
+#define M360_BRG_4800 (324<<1)
+#define M360_BRG_2400 (650<<1)
+#define M360_BRG_1200 (1301<<1)
+#define M360_BRG_600 (2603<<1)
+#define M360_BRG_300 ((324<<1) | 1)
+#define M360_BRG_150 ((650<<1) | 1)
+#define M360_BRG_75 ((1301<<1) | 1)
+
+/*
+ *************************************************************************
+ * MC68360 DUAL-PORT RAM AND REGISTERS *
+ *************************************************************************
+ */
+typedef struct m360_ {
+ /*
+ * Dual-port RAM
+ */
+ rtems_unsigned8 dpram0[0x400]; /* Microcode program */
+ rtems_unsigned8 dpram1[0x200];
+ rtems_unsigned8 dpram2[0x100]; /* Microcode scratch */
+ rtems_unsigned8 dpram3[0x100]; /* Not on REV A or B masks */
+ rtems_unsigned8 _rsv0[0xC00-0x800];
+ m360SCCENparms_t scc1p;
+ rtems_unsigned8 _rsv1[0xCB0-0xC00-sizeof(m360SCCENparms_t)];
+ m360MiscParms_t miscp;
+ rtems_unsigned8 _rsv2[0xD00-0xCB0-sizeof(m360MiscParms_t)];
+ m360SCCparms_t scc2p;
+ rtems_unsigned8 _rsv3[0xD80-0xD00-sizeof(m360SCCparms_t)];
+ m360SPIparms_t spip;
+ rtems_unsigned8 _rsv4[0xDB0-0xD80-sizeof(m360SPIparms_t)];
+ m360TimerParms_t tmp;
+ rtems_unsigned8 _rsv5[0xE00-0xDB0-sizeof(m360TimerParms_t)];
+ m360SCCparms_t scc3p;
+ rtems_unsigned8 _rsv6[0xE70-0xE00-sizeof(m360SCCparms_t)];
+ m360IDMAparms_t idma1p;
+ rtems_unsigned8 _rsv7[0xE80-0xE70-sizeof(m360IDMAparms_t)];
+ m360SMCparms_t smc1p;
+ rtems_unsigned8 _rsv8[0xF00-0xE80-sizeof(m360SMCparms_t)];
+ m360SCCparms_t scc4p;
+ rtems_unsigned8 _rsv9[0xF70-0xF00-sizeof(m360SCCparms_t)];
+ m360IDMAparms_t idma2p;
+ rtems_unsigned8 _rsv10[0xF80-0xF70-sizeof(m360IDMAparms_t)];
+ m360SMCparms_t smc2p;
+ rtems_unsigned8 _rsv11[0x1000-0xF80-sizeof(m360SMCparms_t)];
+
+ /*
+ * SIM Block
+ */
+ rtems_unsigned32 mcr;
+ rtems_unsigned32 _pad00;
+ rtems_unsigned8 avr;
+ rtems_unsigned8 rsr;
+ rtems_unsigned16 _pad01;
+ rtems_unsigned8 clkocr;
+ rtems_unsigned8 _pad02;
+ rtems_unsigned16 _pad03;
+ rtems_unsigned16 pllcr;
+ rtems_unsigned16 _pad04;
+ rtems_unsigned16 cdvcr;
+ rtems_unsigned16 pepar;
+ rtems_unsigned32 _pad05[2];
+ rtems_unsigned16 _pad06;
+ rtems_unsigned8 sypcr;
+ rtems_unsigned8 swiv;
+ rtems_unsigned16 _pad07;
+ rtems_unsigned16 picr;
+ rtems_unsigned16 _pad08;
+ rtems_unsigned16 pitr;
+ rtems_unsigned16 _pad09;
+ rtems_unsigned8 _pad10;
+ rtems_unsigned8 swsr;
+ rtems_unsigned32 bkar;
+ rtems_unsigned32 bcar;
+ rtems_unsigned32 _pad11[2];
+
+ /*
+ * MEMC Block
+ */
+ rtems_unsigned32 gmr;
+ rtems_unsigned16 mstat;
+ rtems_unsigned16 _pad12;
+ rtems_unsigned32 _pad13[2];
+ m360MEMCRegisters_t memc[8];
+ rtems_unsigned8 _pad14[0xF0-0xD0];
+ rtems_unsigned8 _pad15[0x100-0xF0];
+ rtems_unsigned8 _pad16[0x500-0x100];
+
+ /*
+ * IDMA1 Block
+ */
+ rtems_unsigned16 iccr;
+ rtems_unsigned16 _pad17;
+ rtems_unsigned16 cmr1;
+ rtems_unsigned16 _pad18;
+ rtems_unsigned32 sapr1;
+ rtems_unsigned32 dapr1;
+ rtems_unsigned32 bcr1;
+ rtems_unsigned8 fcr1;
+ rtems_unsigned8 _pad19;
+ rtems_unsigned8 cmar1;
+ rtems_unsigned8 _pad20;
+ rtems_unsigned8 csr1;
+ rtems_unsigned8 _pad21;
+ rtems_unsigned16 _pad22;
+
+ /*
+ * SDMA Block
+ */
+ rtems_unsigned8 sdsr;
+ rtems_unsigned8 _pad23;
+ rtems_unsigned16 sdcr;
+ rtems_unsigned32 sdar;
+
+ /*
+ * IDMA2 Block
+ */
+ rtems_unsigned16 _pad24;
+ rtems_unsigned16 cmr2;
+ rtems_unsigned32 sapr2;
+ rtems_unsigned32 dapr2;
+ rtems_unsigned32 bcr2;
+ rtems_unsigned8 fcr2;
+ rtems_unsigned8 _pad26;
+ rtems_unsigned8 cmar2;
+ rtems_unsigned8 _pad27;
+ rtems_unsigned8 csr2;
+ rtems_unsigned8 _pad28;
+ rtems_unsigned16 _pad29;
+ rtems_unsigned32 _pad30;
+
+ /*
+ * CPIC Block
+ */
+ rtems_unsigned32 cicr;
+ rtems_unsigned32 cipr;
+ rtems_unsigned32 cimr;
+ rtems_unsigned32 cisr;
+
+ /*
+ * Parallel I/O Block
+ */
+ rtems_unsigned16 padir;
+ rtems_unsigned16 papar;
+ rtems_unsigned16 paodr;
+ rtems_unsigned16 padat;
+ rtems_unsigned32 _pad31[2];
+ rtems_unsigned16 pcdir;
+ rtems_unsigned16 pcpar;
+ rtems_unsigned16 pcso;
+ rtems_unsigned16 pcdat;
+ rtems_unsigned16 pcint;
+ rtems_unsigned16 _pad32;
+ rtems_unsigned32 _pad33[5];
+
+ /*
+ * TIMER Block
+ */
+ rtems_unsigned16 tgcr;
+ rtems_unsigned16 _pad34;
+ rtems_unsigned32 _pad35[3];
+ rtems_unsigned16 tmr1;
+ rtems_unsigned16 tmr2;
+ rtems_unsigned16 trr1;
+ rtems_unsigned16 trr2;
+ rtems_unsigned16 tcr1;
+ rtems_unsigned16 tcr2;
+ rtems_unsigned16 tcn1;
+ rtems_unsigned16 tcn2;
+ rtems_unsigned16 tmr3;
+ rtems_unsigned16 tmr4;
+ rtems_unsigned16 trr3;
+ rtems_unsigned16 trr4;
+ rtems_unsigned16 tcr3;
+ rtems_unsigned16 tcr4;
+ rtems_unsigned16 tcn3;
+ rtems_unsigned16 tcn4;
+ rtems_unsigned16 ter1;
+ rtems_unsigned16 ter2;
+ rtems_unsigned16 ter3;
+ rtems_unsigned16 ter4;
+ rtems_unsigned32 _pad36[2];
+
+ /*
+ * CP Block
+ */
+ rtems_unsigned16 cr;
+ rtems_unsigned16 _pad37;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 _pad38;
+ rtems_unsigned32 _pad39[3];
+ rtems_unsigned16 _pad40;
+ rtems_unsigned16 rter;
+ rtems_unsigned16 _pad41;
+ rtems_unsigned16 rtmr;
+ rtems_unsigned32 _pad42[5];
+
+ /*
+ * BRG Block
+ */
+ rtems_unsigned32 brgc1;
+ rtems_unsigned32 brgc2;
+ rtems_unsigned32 brgc3;
+ rtems_unsigned32 brgc4;
+
+ /*
+ * SCC Block
+ */
+ m360SCCRegisters_t scc1;
+ m360SCCRegisters_t scc2;
+ m360SCCRegisters_t scc3;
+ m360SCCRegisters_t scc4;
+
+ /*
+ * SMC Block
+ */
+ m360SMCRegisters_t smc1;
+ m360SMCRegisters_t smc2;
+
+ /*
+ * SPI Block
+ */
+ rtems_unsigned16 spmode;
+ rtems_unsigned16 _pad43[2];
+ rtems_unsigned8 spie;
+ rtems_unsigned8 _pad44;
+ rtems_unsigned16 _pad45;
+ rtems_unsigned8 spim;
+ rtems_unsigned8 _pad46[2];
+ rtems_unsigned8 spcom;
+ rtems_unsigned16 _pad47[2];
+
+ /*
+ * PIP Block
+ */
+ rtems_unsigned16 pipc;
+ rtems_unsigned16 _pad48;
+ rtems_unsigned16 ptpr;
+ rtems_unsigned32 pbdir;
+ rtems_unsigned32 pbpar;
+ rtems_unsigned16 _pad49;
+ rtems_unsigned16 pbodr;
+ rtems_unsigned32 pbdat;
+ rtems_unsigned32 _pad50[6];
+
+ /*
+ * SI Block
+ */
+ rtems_unsigned32 simode;
+ rtems_unsigned8 sigmr;
+ rtems_unsigned8 _pad51;
+ rtems_unsigned8 sistr;
+ rtems_unsigned8 sicmr;
+ rtems_unsigned32 _pad52;
+ rtems_unsigned32 sicr;
+ rtems_unsigned16 _pad53;
+ rtems_unsigned16 sirp[2];
+ rtems_unsigned16 _pad54;
+ rtems_unsigned32 _pad55[2];
+ rtems_unsigned8 siram[256];
+} m360_t;
+
+extern volatile m360_t m360;
+
+#endif /* __MC68360_h */
diff --git a/c/src/exec/score/cpu/m68k/m68k.h b/c/src/exec/score/cpu/m68k/m68k.h
new file mode 100644
index 0000000000..f4bdd83c4f
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/m68k.h
@@ -0,0 +1,269 @@
+/* m68k.h
+ *
+ * This include file contains information pertaining to the Motorola
+ * m68xxx processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __M68k_h
+#define __M68k_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section contains the information required to build
+ * RTEMS for a particular member of the Motorola MC68xxx
+ * family. It does this by setting variables to indicate
+ * which implementation dependent features are present in
+ * a particular member of the family.
+ *
+ * Currently recognized:
+ * m68000 (no FP)
+ * m68020 (implies FP)
+ * m68020_nofp (no FP)
+ * m68030 (implies FP)
+ * m68040 (implies FP)
+ * m68lc040 (no FP)
+ * m68ec040 (no FP)
+ * m68302 (no FP)
+ * m68332 (no FP)
+ * mcpu32 (no FP) (includes m68360)
+ *
+ * Primary difference (for RTEMS) between m68040, m680lc040, and
+ * m68ec040 is the presence or absence of the FPU.
+ *
+ * Here is some information on the 040 variants (courtesy of Doug McBride,
+ * mcbride@rodin.colorado.edu):
+ *
+ * "The 68040 is a superset of the 68EC040 and the 68LC040. The
+ * 68EC040 and 68LC040 do not have FPU's. The 68LC040 and the
+ * 68EC040 have renamed the DLE pin as JS0 which must be tied to
+ * Gnd or Vcc. The 68EC040 has renamed the MDIS pin as JS1. The
+ * 68EC040 has access control units instead of memory management units.
+ * The 68EC040 should not have the PFLUSH or PTEST instructions executed
+ * (cause an indeterminate result). The 68EC040 and 68LC040 do not
+ * implement the DLE or multiplexed bus modes. The 68EC040 does not
+ * implement the output buffer impedance selection mode of operation."
+ *
+ * M68K_HAS_EXTB_L is used to enable/disable usage of the extb.l instruction
+ * which is not available for 68000 or 68ec000 cores (68000, 68001, 68008,
+ * 68010, 68302, 68306, 68307). This instruction is available on the 68020
+ * up and the cpu32 based models.
+ *
+ * NOTE:
+ * Eventually it would be nice to evaluate doing a lot of this section
+ * by having each model specify which core it uses and then go from there.
+ */
+
+#if defined(m68000)
+
+#define CPU_MODEL_NAME "m68000"
+#define M68K_HAS_VBR 0
+#define M68K_HAS_SEPARATE_STACKS 0
+#define M68K_HAS_FPU 0
+#define M68K_HAS_BFFFO 0
+#define M68K_HAS_PREINDEXING 0
+#define M68K_HAS_EXTB_L 0
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(m68020)
+
+#define CPU_MODEL_NAME "m68020"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 1
+#define M68K_HAS_FPU 1
+#define M68K_HAS_BFFFO 1
+#define M68K_HAS_PREINDEXING 1
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(m68020_nofp)
+
+#define CPU_MODEL_NAME "m68020 w/o fp"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 1
+#define M68K_HAS_FPU 0
+#define M68K_HAS_BFFFO 1
+#define M68K_HAS_PREINDEXING 1
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(m68030)
+
+#define CPU_MODEL_NAME "m68030"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 1
+#define M68K_HAS_FPU 1
+#define M68K_HAS_BFFFO 1
+#define M68K_HAS_PREINDEXING 1
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(m68040)
+
+#define CPU_MODEL_NAME "m68040"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 1
+#define M68K_HAS_FPU 1
+#define M68K_HAS_BFFFO 1
+#define M68K_HAS_PREINDEXING 1
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 1
+
+#elif defined(m68lc040)
+
+#define CPU_MODEL_NAME "m68lc040"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 1
+#define M68K_HAS_FPU 0
+#define M68K_HAS_BFFFO 1
+#define M68K_HAS_PREINDEXING 1
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(m68ec040)
+
+#define CPU_MODEL_NAME "m68ec040"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 1
+#define M68K_HAS_FPU 0
+#define M68K_HAS_BFFFO 1
+#define M68K_HAS_PREINDEXING 1
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(m68302)
+ /* essentially a m68000 with onboard peripherals */
+#define CPU_MODEL_NAME "m68302"
+#define M68K_HAS_VBR 0
+#define M68K_HAS_SEPARATE_STACKS 0
+#define M68K_HAS_FPU 0
+#define M68K_HAS_BFFFO 0
+#define M68K_HAS_PREINDEXING 0
+#define M68K_HAS_EXTB_L 0
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(m68332)
+
+#define CPU_MODEL_NAME "m68332"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 0
+#define M68K_HAS_FPU 0
+#define M68K_HAS_BFFFO 0
+#define M68K_HAS_PREINDEXING 0
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#elif defined(mcpu32)
+
+#define CPU_MODEL_NAME "mcpu32"
+#define M68K_HAS_VBR 1
+#define M68K_HAS_SEPARATE_STACKS 0
+#define M68K_HAS_FPU 0
+#define M68K_HAS_BFFFO 0
+#define M68K_HAS_PREINDEXING 1
+#define M68K_HAS_EXTB_L 1
+#define M68K_HAS_FPSP_PACKAGE 0
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "Motorola MC68xxx"
+
+#ifndef ASM
+
+#define m68k_disable_interrupts( _level ) \
+ asm volatile ( "movew %%sr,%0\n\t" \
+ "orw #0x0700,%%sr" \
+ : "=d" (_level))
+
+#define m68k_enable_interrupts( _level ) \
+ asm volatile ( "movew %0,%%sr " : : "d" (_level));
+
+#define m68k_flash_interrupts( _level ) \
+ asm volatile ( "movew %0,%%sr\n\t" \
+ "orw #0x0700,%%sr" \
+ : : "d" (_level))
+
+#define m68k_get_interrupt_level( _level ) \
+ do { \
+ register unsigned32 _tmpsr; \
+ \
+ asm volatile( "movw %%sr,%0" : "=d" (_tmpsr)); \
+ _level = (_tmpsr & 0x0700) >> 8; \
+ } while (0)
+
+#define m68k_set_interrupt_level( _newlevel ) \
+ do { \
+ register unsigned32 _tmpsr; \
+ \
+ asm volatile( "movw %%sr,%0" : "=d" (_tmpsr)); \
+ _tmpsr = (_tmpsr & 0xf8ff) | ((_newlevel) << 8); \
+ asm volatile( "movw %0,%%sr" : : "d" (_tmpsr)); \
+ } while (0)
+
+#if ( M68K_HAS_VBR == 1 )
+#define m68k_get_vbr( vbr ) \
+ asm volatile ( "movec %%vbr,%0 " : "=r" (vbr))
+
+#define m68k_set_vbr( vbr ) \
+ asm volatile ( "movec %0,%%vbr " : : "r" (vbr))
+#else
+#define m68k_get_vbr( _vbr ) _vbr = (void *)_VBR
+#define m68k_set_vbr( _vbr )
+#endif
+
+/*
+ * The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ */
+
+static inline unsigned int m68k_swap_u32(
+ unsigned int value
+)
+{
+ unsigned int swapped = value;
+
+ asm volatile( "rorw #8,%0" : "=d" (swapped) : "0" (swapped) );
+ asm volatile( "swap %0" : "=d" (swapped) : "0" (swapped) );
+ asm volatile( "rorw #8,%0" : "=d" (swapped) : "0" (swapped) );
+
+ return( swapped );
+}
+
+/* XXX this is only valid for some m68k family members and should be fixed */
+
+#define m68k_enable_caching() \
+ { register unsigned32 _ctl=0x01; \
+ asm volatile ( "movec %0,%%cacr" \
+ : "=d" (_ctl) : "0" (_ctl) ); \
+ }
+
+#define CPU_swap_u32( value ) m68k_swap_u32( value )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/m68k/m68ktypes.h b/c/src/exec/score/cpu/m68k/m68ktypes.h
new file mode 100644
index 0000000000..fcae995892
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/m68ktypes.h
@@ -0,0 +1,58 @@
+/* m68ktypes.h
+ *
+ * This include file contains type definitions pertaining to the Motorola
+ * m68xxx processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __M68k_TYPES_h
+#define __M68k_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void m68k_isr;
+
+typedef void ( *m68k_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/m68k/qsm.h b/c/src/exec/score/cpu/m68k/qsm.h
new file mode 100644
index 0000000000..e1bf33bc12
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/qsm.h
@@ -0,0 +1,209 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * QSM -- Queued Serial Module
+ *
+ * The QSM contains two serial interfaces: (a) the queued serial
+ * peripheral interface (QSPI) and the serial communication interface
+ * (SCI). The QSPI provides peripheral expansion and/or interprocessor
+ * communication through a full-duplex, synchronous, three-wire bus. A
+ * self contained RAM queue permits serial data transfers without CPU
+ * intervention and automatic continuous sampling. The SCI provides a
+ * standard non-return to zero mark/space format with wakeup functions
+ * to allow the CPU to run uninterrupted until woken
+ *
+ * For more information, refer to Motorola's "Modular Microcontroller
+ * Family Queued Serial Module Reference Manual" (Motorola document
+ * QSMRM/AD).
+ *
+ * This file has been created by John S. Gwynne for support of
+ * Motorola's 68332 MCU in the efi332 project.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above authorship, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _QSM_H_
+#define _QSM_H_
+
+
+#include <efi332.h>
+
+
+/* SAM-- shift and mask */
+#undef SAM
+#define SAM(a,b,c) ((a << b) & c)
+
+
+/* QSM_CRB (QSM Control Register Block) base address of the QSM
+ control registers */
+#if SIM_MM == 0
+#define QSM_CRB 0x7ffc00
+#else
+#undef SIM_MM
+#define SIM_MM 1
+#define QSM_CRB 0xfffc00
+#endif
+
+
+#define QSMCR (volatile unsigned short int * const)(0x00 + QSM_CRB)
+ /* QSM Configuration Register */
+#define STOP 0x8000 /* Stop Enable */
+#define FRZ 0x6000 /* Freeze Control */
+#define SUPV 0x0080 /* Supervisor/Unrestricted */
+#define IARB 0x000f /* Inerrupt Arbitration */
+
+
+#define QTEST (volatile unsigned short int * const)(0x02 + QSM_CRB)
+ /* QSM Test Register */
+/* Used only for factor testing */
+
+
+#define QILR (volatile unsigned char * const)(0x04 + QSM_CRB)
+ /* QSM Interrupt Level Register */
+#define ILQSPI 0x38 /* Interrupt Level for QSPI */
+#define ILSCI 0x07 /* Interrupt Level for SCI */
+
+
+#define QIVR (volatile unsigned char * const)(0x05 + QSM_CRB)
+ /* QSM Interrupt Vector Register */
+#define INTV 0xff /* Interrupt Vector Number */
+
+
+#define SCCR0 (volatile unsigned short int * const)(0x08 + QSM_CRB)
+ /* SCI Control Register 0 */
+#define SCBR 0x1fff /* SCI Baud Rate */
+
+
+#define SCCR1 (volatile unsigned short int * const)(0x0a + QSM_CRB)
+ /* SCI Control Register 1 */
+#define LOOPS 0x4000 /* Loop Mode */
+#define WOMS 0x2000 /* Wired-OR Mode for SCI Pins */
+#define ILT 0x1000 /* Idle-Line Detect Type */
+#define PT 0x0800 /* Parity Type */
+#define PE 0x0400 /* Parity Enable */
+#define M 0x0200 /* Mode Select */
+#define WAKE 0x0100 /* Wakeup by Address Mark */
+#define TIE 0x0080 /* Transmit Complete Interrupt Enable */
+#define TCIE 0x0040 /* Transmit Complete Interrupt Enable */
+#define RIE 0x0020 /* Receiver Interrupt Enable */
+#define ILIE 0x0010 /* Idle-Line Interrupt Enable */
+#define TE 0x0008 /* Transmitter Enable */
+#define RE 0x0004 /* Receiver Enable */
+#define RWU 0x0002 /* Receiver Wakeup */
+#define SBK 0x0001 /* Send Break */
+
+
+#define SCSR (volatile unsigned short int * const)(0x0c + QSM_CRB)
+ /* SCI Status Register */
+#define TDRE 0x0100 /* Transmit Data Register Empty */
+#define TC 0x0080 /* Transmit Complete */
+#define RDRF 0x0040 /* Receive Data Register Full */
+#define RAF 0x0020 /* Receiver Active */
+#define IDLE 0x0010 /* Idle-Line Detected */
+#define OR 0x0008 /* Overrun Error */
+#define NF 0x0004 /* Noise Error Flag */
+#define FE 0x0002 /* Framing Error */
+#define PF 0x0001 /* Parity Error */
+
+
+#define SCDR (volatile unsigned short int * const)(0x0e + QSM_CRB)
+ /* SCI Data Register */
+
+
+#define PORTQS (volatile unsigned char * const)(0x15 + QSM_CRB)
+ /* Port QS Data Register */
+
+#define PQSPAR (volatile unsigned char * const)(0x16 + QSM_CRB)
+ /* PORT QS Pin Assignment Rgister */
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a QSPI
+ signal. */
+/* note: PQS2 is a digital I/O pin unless the SPI is enabled in which
+ case it becomes the SPI serial clock SCK. */
+/* note: PQS7 is a digital I/O pin unless the SCI transmitter is
+ enabled in which case it becomes the SCI serial output TxD. */
+#define QSMFun 0x0
+#define QSMDis 0x1
+/*
+ * PQSPAR Field | QSM Function | Discrete I/O pin
+ *------------------+--------------+------------------ */
+#define PQSPA0 0 /* MISO | PQS0 */
+#define PQSPA1 1 /* MOSI | PQS1 */
+#define PQSPA2 2 /* SCK | PQS2 (see note)*/
+#define PQSPA3 3 /* PCSO/!SS | PQS3 */
+#define PQSPA4 4 /* PCS1 | PQS4 */
+#define PQSPA5 5 /* PCS2 | PQS5 */
+#define PQSPA6 6 /* PCS3 | PQS6 */
+#define PQSPA7 7 /* TxD | PQS7 (see note)*/
+
+
+#define DDRQS (volatile unsigned char * const)(0x17 + QSM_CRB)
+ /* PORT QS Data Direction Register */
+/* Clearing a bit makes the corresponding pin an input; setting a bit
+ makes the pin an output. */
+
+
+#define SPCR0 (volatile unsigned short int * const)(0x18 + QSM_CRB)
+ /* QSPI Control Register 0 */
+#define MSTR 0x8000 /* Master/Slave Mode Select */
+#define WOMQ 0x4000 /* Wired-OR Mode for QSPI Pins */
+#define BITS 0x3c00 /* Bits Per Transfer */
+#define CPOL 0x0200 /* Clock Polarity */
+#define CPHA 0x0100 /* Clock Phase */
+#define SPBR 0x00ff /* Serial Clock Baud Rate */
+
+
+#define SPCR1 (volatile unsigned short int * const)(0x1a + QSM_CRB)
+ /* QSPI Control Register 1 */
+#define SPE 0x8000 /* QSPI Enable */
+#define DSCKL 0x7f00 /* Delay before SCK */
+#define DTL 0x00ff /* Length of Delay after Transfer */
+
+
+#define SPCR2 (volatile unsigned short int * const)(0x1c + QSM_CRB)
+ /* QSPI Control Register 2 */
+#define SPIFIE 0x8000 /* SPI Finished Interrupt Enable */
+#define WREN 0x4000 /* Wrap Enable */
+#define WRTO 0x2000 /* Wrap To */
+#define ENDQP 0x0f00 /* Ending Queue Pointer */
+#define NEWQP 0x000f /* New Queue Pointer Value */
+
+
+#define SPCR3 (volatile unsigned char * const)(0x1e + QSM_CRB)
+ /* QSPI Control Register 3 */
+#define LOOPQ 0x0400 /* QSPI Loop Mode */
+#define HMIE 0x0200 /* HALTA and MODF Interrupt Enable */
+#define HALT 0x0100 /* Halt */
+
+
+#define SPSR (volatile unsigned char * const)(0x1f + QSM_CRB)
+ /* QSPI Status Register */
+#define SPIF 0x0080 /* QSPI Finished Flag */
+#define MODF 0x0040 /* Mode Fault Flag */
+#define HALTA 0x0020 /* Halt Acknowlwdge Flag */
+#define CPTQP x0000f /* Completed Queue Pointer */
+
+#define QSPIRR (volatile unsigned char * const)(0x100 + QSM_CRB)
+ /* QSPI Receive Data RAM */
+#define QSPITR (volatile unsigned char * const)(0x120 + QSM_CRB)
+ /* QSPI Transmit Data RAM */
+#define QSPIcR (volatile unsigned char * const)(0x140 + QSM_CRB)
+ /* QSPI Command RAM */
+
+#endif /* _QSM_H_ */
diff --git a/c/src/exec/score/cpu/m68k/rtems.s b/c/src/exec/score/cpu/m68k/rtems.s
new file mode 100644
index 0000000000..60995cad46
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/rtems.s
@@ -0,0 +1,46 @@
+/* rtems.s
+ *
+ * This file contains the single entry point code for
+ * the m68k implementation of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <asm.h>
+
+/*
+ * There seems to be no reason to have two versions of this.
+ * The following version should work across the entire family.
+ * The worst assumption is that gcc will put entry in a scratch
+ * register and not screw up the stack.
+ *
+ * NOTE: This is a 68020 version:
+ *
+ * jmpl @(%%d0:l:4)@(__Entry_points)
+ */
+
+ EXTERN (_Entry_points)
+
+ BEGIN_CODE
+
+ .align 4
+ .global SYM (RTEMS)
+
+SYM (RTEMS):
+ moveal SYM (_Entry_points), a0
+ lsll #2, d0
+ addal d0, a0
+ moveal @(a0),a0
+ jmpl @(a0)
+
+ END_CODE
+END
diff --git a/c/src/exec/score/cpu/m68k/sim.h b/c/src/exec/score/cpu/m68k/sim.h
new file mode 100644
index 0000000000..d70f56d360
--- /dev/null
+++ b/c/src/exec/score/cpu/m68k/sim.h
@@ -0,0 +1,342 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * SIM -- System Integration Module
+ *
+ * The system integration module (SIM) is used on many Motorola 16-
+ * and 32-bit MCUs for the following functions:
+ *
+ * () System configuration and protection. Bus and software watchdog
+ * monitors are provided in addition to periodic interrupt generators.
+ *
+ * () Clock signal generation for other intermodule bus (IMB) members
+ * and external devices.
+ *
+ * () The generation of chip-select signals that simplify external
+ * circuitry interface.
+ *
+ * () Data ports that are available for general purpose input and
+ * output.
+ *
+ * () A system test block that is intended only for factory tests.
+ *
+ * For more information, refer to Motorola's "Modular Microcontroller
+ * Family System Integration Module Reference Manual" (Motorola document
+ * SIMRM/AD).
+ *
+ * This file has been created by John S. Gwynne for support of
+ * Motorola's 68332 MCU in the efi332 project.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above authorship, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _SIM_H_
+#define _SIM_H_
+
+
+/*
+ * XXX Why is a generic file like this including a bsp specific file?
+
+#include <efi332.h>
+ */
+
+
+/* SAM-- shift and mask */
+#undef SAM
+#define SAM(a,b,c) ((a << b) & c)
+
+/*
+ * These macros make this file usable from assembly.
+ */
+
+#ifdef ASM
+#define SIM_VOLATILE_USHORT_POINTER
+#define SIM_VOLATILE_UCHAR_POINTER
+#else
+#define SIM_VOLATILE_USHORT_POINTER (volatile unsigned short int * const)
+#define SIM_VOLATILE_UCHAR_POINTER (volatile unsigned char * const)
+#endif
+
+/* SIM_CRB (SIM Control Register Block) base address of the SIM
+ control registers */
+/* not included in ram_init.h */
+#if SIM_MM == 0
+#define SIM_CRB 0x7ffa00
+#else
+#undef SIM_MM
+#define SIM_MM 1
+#define SIM_CRB 0xfffa00
+#endif
+/* end not included in ram_init.h */
+
+
+
+#define SIMCR SIM_VOLATILE_USHORT_POINTER(0x00 + SIM_CRB)
+ /* Module Configuration Register */
+#define EXOFF 0x8000 /* External Clock Off */
+#define FRZSW 0x4000 /* Freeze Software Enable */
+#define FRZBM 0x2000 /* Freeze Bus Monitor Enable */
+#define SLVEN 0x0800 /* Factory Test Model Enabled (ro)*/
+#define SHEN 0x0300 /* Show Cycle Enable */
+#define SUPV 0x0080 /* Supervisor/Unrestricted Data Space */
+#define MM 0x0040 /* Module Mapping */
+#define IARB 0x000f /* Interrupt Arbitration Field */
+
+
+
+#define SIMTR SIM_VOLATILE_USHORT_POINTER(0x02 + SIM_CRB)
+ /* SIM Test Register */
+/* Used only for factor testing */
+
+
+
+#define SYNCR SIM_VOLATILE_USHORT_POINTER(0x04 + SIM_CRB)
+ /* Clock Synthesizer Control Register */
+#define W 0x8000 /* Frequency Control (VCO) */
+#define X 0x4000 /* Frequency Control Bit (Prescale) */
+#define Y 0x3f00 /* Frequency Control Counter */
+#define EDIV 0x0080 /* ECLK Divide Rate */
+#define SLIMP 0x0010 /* Limp Mode Status */
+#define SLOCK 0x0008 /* Synthesizer Lock */
+#define RSTEN 0x0004 /* Reset Enable */
+#define STSIM 0x0002 /* Stop Mode SIM Clock */
+#define STEXT 0x0001 /* Stop Mode External Clock */
+
+
+
+#define RSR SIM_VOLATILE_UCHAR_POINTER(0x07 + SIM_CRB)
+ /* Reset Status Register */
+#define EXT 0x0080 /* External Reset */
+#define POW 0x0040 /* Power-On Reset */
+#define SW 0x0020 /* Software Watchdog Reset */
+#define DBF 0x0010 /* Double Bus Fault Reset */
+#define LOC 0x0004 /* Loss of Clock Reset */
+#define SYS 0x0002 /* System Reset */
+#define TST 0x0001 /* Test Submodule Reset */
+
+
+
+#define SIMTRE SIM_VOLATILE_USHORT_POINTER(0x08 + SIM_CRB)
+ /* System Integration Test Register */
+/* Used only for factor testing */
+
+
+
+#define PORTE0 SIM_VOLATILE_UCHAR_POINTER(0x11 + SIM_CRB)
+#define PORTE1 SIM_VOLATILE_UCHAR_POINTER(0x13 + SIM_CRB)
+ /* Port E Data Register */
+#define DDRE SIM_VOLATILE_UCHAR_POINTER(0x15 + SIM_CRB)
+ /* Port E Data Direction Register */
+#define PEPAR SIM_VOLATILE_UCHAR_POINTER(0x17 + SIM_CRB)
+ /* Port E Pin Assignment Register */
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a bus control
+ signal. */
+
+
+
+#define PORTF0 SIM_VOLATILE_UCHAR_POINTER(0x19 + SIM_CRB)
+#define PORTF1 SIM_VOLATILE_UCHAR_POINTER(0x1b + SIM_CRB)
+ /* Port F Data Register */
+#define DDRF SIM_VOLATILE_UCHAR_POINTER(0x1d + SIM_CRB)
+ /* Port E Data Direction Register */
+#define PFPAR SIM_VOLATILE_UCHAR_POINTER(0x1f + SIM_CRB)
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a bus control
+ signal. */
+
+
+
+#define SYPCR SIM_VOLATILE_UCHAR_POINTER(0x21 + SIM_CRB)
+/* !!! can write to only once after reset !!! */
+ /* System Protection Control Register */
+#define SWE 0x80 /* Software Watch Enable */
+#define SWP 0x40 /* Software Watchdog Prescale */
+#define SWT 0x30 /* Software Watchdog Timing */
+#define HME 0x08 /* Halt Monitor Enable */
+#define BME 0x04 /* Bus Monitor External Enable */
+#define BMT 0x03 /* Bus Monitor Timing */
+
+
+
+#define PICR SIM_VOLATILE_USHORT_POINTER(0x22 + SIM_CRB)
+ /* Periodic Interrupt Control Reg. */
+#define PIRQL 0x0700 /* Periodic Interrupt Request Level */
+#define PIV 0x00ff /* Periodic Interrupt Level */
+
+
+
+#define PITR SIM_VOLATILE_USHORT_POINTER(0x24 + SIM_CRB)
+ /* Periodic Interrupt Timer Register */
+#define PTP 0x0100 /* Periodic Timer Prescaler Control */
+#define PITM 0x00ff /* Periodic Interrupt Timing Modulus */
+
+
+
+#define SWSR SIM_VOLATILE_UCHAR_POINTER(0x27 + SIM_CRB)
+ /* Software Service Register */
+/* write 0x55 then 0xaa to service the software watchdog */
+
+
+
+#define TSTMSRA SIM_VOLATILE_USHORT_POINTER(0x30 + SIM_CRB)
+ /* Test Module Master Shift A */
+#define TSTMSRB SIM_VOLATILE_USHORT_POINTER(0x32 + SIM_CRB)
+ /* Test Module Master Shift A */
+#define TSTSC SIM_VOLATILE_USHORT_POINTER(0x34 + SIM_CRB)
+ /* Test Module Shift Count */
+#define TSTRC SIM_VOLATILE_USHORT_POINTER(0x36 + SIM_CRB)
+ /* Test Module Repetition Counter */
+#define CREG SIM_VOLATILE_USHORT_POINTER(0x38 + SIM_CRB)
+ /* Test Module Control */
+#define DREG SIM_VOLATILE_USHORT_POINTER(0x3a + SIM_CRB)
+ /* Test Module Distributed */
+/* Used only for factor testing */
+
+
+
+#define PORTC SIM_VOLATILE_UCHAR_POINTER(0x41 + SIM_CRB)
+ /* Port C Data */
+
+
+
+#define CSPAR0 SIM_VOLATILE_USHORT_POINTER(0x44 + SIM_CRB)
+ /* Chip Select Pin Assignment
+ Resgister 0 */
+/* CSPAR0 contains seven two-bit fields that determine the functions
+ of corresponding chip-select pins. CSPAR0[15:14] are not
+ used. These bits always read zero; write have no effect. CSPAR0 bit
+ 1 always reads one; writes to CSPAR0 bit 1 have no effect. */
+#define CSPAR1 SIM_VOLATILE_USHORT_POINTER(0x46 + SIM_CRB)
+ /* Chip Select Pin Assignment
+ Register 1 */
+/* CSPAR1 contains five two-bit fields that determine the finctions of
+ corresponding chip-select pins. CSPAR1[15:10] are not used. These
+ bits always read zero; writes have no effect. */
+/*
+ *
+ * Bit Field | Description
+ * ------------+---------------
+ * 00 | Discrete Output
+ * 01 | Alternate Function
+ * 10 | Chip Select (8-bit port)
+ * 11 | Chip Select (16-bit port)
+ */
+#define DisOut 0x0
+#define AltFun 0x1
+#define CS8bit 0x2
+#define CS16bit 0x3
+/*
+ *
+ * CSPARx Field |Chip Select Signal | Alternate Signal | Discrete Output
+ *-----------------+--------------------+--------------------+---------------*/
+#define CS_5 12 /* !CS5 | FC2 | PC2 */
+#define CS_4 10 /* !CS4 | FC1 | PC1 */
+#define CS_3 8 /* !CS3 | FC0 | PC0 */
+#define CS_2 6 /* !CS2 | !BGACK | */
+#define CS_1 4 /* !CS1 | !BG | */
+#define CS_0 2 /* !CS0 | !BR | */
+#define CSBOOT 0 /* !CSBOOT | | */
+/* | | | */
+#define CS_10 8 /* !CS10 | ADDR23 | ECLK */
+#define CS_9 6 /* !CS9 | ADDR22 | PC6 */
+#define CS_8 4 /* !CS8 | ADDR21 | PC5 */
+#define CS_7 2 /* !CS7 | ADDR20 | PC4 */
+#define CS_6 0 /* !CS6 | ADDR19 | PC3 */
+
+#define BS_2K 0x0
+#define BS_8K 0x1
+#define BS_16K 0x2
+#define BS_64K 0x3
+#define BS_128K 0x4
+#define BS_256K 0x5
+#define BS_512K 0x6
+#define BS_1M 0x7
+
+#define CSBARBT SIM_VOLATILE_USHORT_POINTER(0x48 + SIM_CRB)
+#define CSBAR0 SIM_VOLATILE_USHORT_POINTER(0x4c + SIM_CRB)
+#define CSBAR1 SIM_VOLATILE_USHORT_POINTER(0x50 + SIM_CRB)
+#define CSBAR2 SIM_VOLATILE_USHORT_POINTER(0x54 + SIM_CRB)
+#define CSBAR3 SIM_VOLATILE_USHORT_POINTER(0x58 + SIM_CRB)
+#define CSBAR4 SIM_VOLATILE_USHORT_POINTER(0x5c + SIM_CRB)
+#define CSBAR5 SIM_VOLATILE_USHORT_POINTER(0x60 + SIM_CRB)
+#define CSBAR6 SIM_VOLATILE_USHORT_POINTER(0x64 + SIM_CRB)
+#define CSBAR7 SIM_VOLATILE_USHORT_POINTER(0x68 + SIM_CRB)
+#define CSBAR8 SIM_VOLATILE_USHORT_POINTER(0x6c + SIM_CRB)
+#define CSBAR9 SIM_VOLATILE_USHORT_POINTER(0x70 + SIM_CRB)
+#define CSBAR10 SIM_VOLATILE_USHORT_POINTER(0x74 + SIM_CRB)
+
+#define MODE 0x8000
+#define Disable 0
+#define LowerByte 0x2000
+#define UpperByte 0x4000
+#define BothBytes 0x6000
+#define ReadOnly 0x0800
+#define WriteOnly 0x1000
+#define ReadWrite 0x1800
+#define SyncAS 0x0
+#define SyncDS 0x0400
+
+#define WaitStates_0 (0x0 << 6)
+#define WaitStates_1 (0x1 << 6)
+#define WaitStates_2 (0x2 << 6)
+#define WaitStates_3 (0x3 << 6)
+#define WaitStates_4 (0x4 << 6)
+#define WaitStates_5 (0x5 << 6)
+#define WaitStates_6 (0x6 << 6)
+#define WaitStates_7 (0x7 << 6)
+#define WaitStates_8 (0x8 << 6)
+#define WaitStates_9 (0x9 << 6)
+#define WaitStates_10 (0xa << 6)
+#define WaitStates_11 (0xb << 6)
+#define WaitStates_12 (0xc << 6)
+#define WaitStates_13 (0xd << 6)
+#define FastTerm (0xe << 6)
+#define External (0xf << 6)
+
+#define CPUSpace (0x0 << 4)
+#define UserSpace (0x1 << 4)
+#define SupSpace (0x2 << 4)
+#define UserSupSpace (0x3 << 4)
+
+#define IPLevel_any 0x0
+#define IPLevel_1 0x2
+#define IPLevel_2 0x4
+#define IPLevel_3 0x6
+#define IPLevel_4 0x8
+#define IPLevel_5 0xa
+#define IPLevel_6 0xc
+#define IPLevel_7 0xe
+
+#define AVEC 1
+
+#define CSORBT SIM_VOLATILE_USHORT_POINTER(0x4a + SIM_CRB)
+#define CSOR0 SIM_VOLATILE_USHORT_POINTER(0x4e + SIM_CRB)
+#define CSOR1 SIM_VOLATILE_USHORT_POINTER(0x52 + SIM_CRB)
+#define CSOR2 SIM_VOLATILE_USHORT_POINTER(0x56 + SIM_CRB)
+#define CSOR3 SIM_VOLATILE_USHORT_POINTER(0x5a + SIM_CRB)
+#define CSOR4 SIM_VOLATILE_USHORT_POINTER(0x5e + SIM_CRB)
+#define CSOR5 SIM_VOLATILE_USHORT_POINTER(0x62 + SIM_CRB)
+#define CSOR6 SIM_VOLATILE_USHORT_POINTER(0x66 + SIM_CRB)
+#define CSOR7 SIM_VOLATILE_USHORT_POINTER(0x6a + SIM_CRB)
+#define CSOR8 SIM_VOLATILE_USHORT_POINTER(0x6e + SIM_CRB)
+#define CSOR9 SIM_VOLATILE_USHORT_POINTER(0x72 + SIM_CRB)
+#define CSOR10 SIM_VOLATILE_USHORT_POINTER(0x76 + SIM_CRB)
+
+#endif /* _SIM_h_ */
diff --git a/c/src/exec/score/cpu/mips/asm.h b/c/src/exec/score/cpu/mips/asm.h
new file mode 100644
index 0000000000..fccd89069f
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/asm.h
@@ -0,0 +1,102 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+/* @(#)asm.h 03/15/96 1.1 */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/exec/score/cpu/mips/cpu.c b/c/src/exec/score/cpu/mips/cpu.c
new file mode 100644
index 0000000000..0b3d787bdf
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/cpu.c
@@ -0,0 +1,219 @@
+/*
+ * Mips CPU Dependent Source
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)cpu.c 08/20/96 1.5\n";
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+
+
+ISR_Handler_entry _ISR_Vector_table[ ISR_NUMBER_OF_VECTORS ];
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void null_handler( void )
+{
+}
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ unsigned int i = ISR_NUMBER_OF_VECTORS;
+
+ while ( i-- )
+ {
+ _ISR_Vector_table[i] = (ISR_Handler_entry)null_handler;
+ }
+
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0 /* located in cpu_asm.S */
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+
+#if 0 /* not necessary */
+/* use IDT/Sim to set interrupt vector. Needed to co-exist with debugger. */
+ add_ext_int_func( vector, new_handler );
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+/* we don't support this yet */
+}
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+#if 0 /* located in cpu_asm.S */
+void _CPU_Thread_Idle_body( void )
+{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+}
+#endif
+
+extern void mips_break( int error );
+
+#include <stdio.h>
+
+void mips_fatal_error( int error )
+{
+ printf("fatal error 0x%x %d\n",error,error);
+ mips_break( error );
+}
diff --git a/c/src/exec/score/cpu/mips/cpu_asm.S b/c/src/exec/score/cpu/mips/cpu_asm.S
new file mode 100644
index 0000000000..1f23a9ca15
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/cpu_asm.S
@@ -0,0 +1,972 @@
+/* cpu_asm.S
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.s:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)cpu_asm.S 08/20/96 1.15 */
+
+#include "cpu_asm.h"
+
+#include "iregdef.h"
+#include "idtcpu.h"
+
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+#define ENDFRAME(name) \
+ .end name
+
+
+#define EXCP_STACK_SIZE (NREGS*R_SZ)
+
+#if __ghs__
+#define sd sw
+#define ld lw
+#define dmtc0 mtc0
+#define dsll sll
+#define dmfc0 mfc0
+#endif
+
+#if 1 /* 32 bit unsigned32 types */
+#define sint sw
+#define lint lw
+#define stackadd addiu
+#define intadd addu
+#define SZ_INT 4
+#define SZ_INT_POW2 2
+#else /* 64 bit unsigned32 types */
+#define sint dw
+#define lint dw
+#define stackadd daddiu
+#define intadd daddu
+#define SZ_INT 8
+#define SZ_INT_POW2 3
+#endif
+
+#ifdef __GNUC__
+#define EXTERN(x,size) .extern x,size
+#else
+#define EXTERN(x,size)
+#endif
+
+/* NOTE: these constants must match the Context_Control structure in cpu.h */
+#define S0_OFFSET 0
+#define S1_OFFSET 1
+#define S2_OFFSET 2
+#define S3_OFFSET 3
+#define S4_OFFSET 4
+#define S5_OFFSET 5
+#define S6_OFFSET 6
+#define S7_OFFSET 7
+#define SP_OFFSET 8
+#define FP_OFFSET 9
+#define RA_OFFSET 10
+#define C0_SR_OFFSET 11
+#define C0_EPC_OFFSET 12
+
+/* NOTE: these constants must match the Context_Control_fp structure in cpu.h */
+#define FP0_OFFSET 0
+#define FP1_OFFSET 1
+#define FP2_OFFSET 2
+#define FP3_OFFSET 3
+#define FP4_OFFSET 4
+#define FP5_OFFSET 5
+#define FP6_OFFSET 6
+#define FP7_OFFSET 7
+#define FP8_OFFSET 8
+#define FP9_OFFSET 9
+#define FP10_OFFSET 10
+#define FP11_OFFSET 11
+#define FP12_OFFSET 12
+#define FP13_OFFSET 13
+#define FP14_OFFSET 14
+#define FP15_OFFSET 15
+#define FP16_OFFSET 16
+#define FP17_OFFSET 17
+#define FP18_OFFSET 18
+#define FP19_OFFSET 19
+#define FP20_OFFSET 20
+#define FP21_OFFSET 21
+#define FP22_OFFSET 22
+#define FP23_OFFSET 23
+#define FP24_OFFSET 24
+#define FP25_OFFSET 25
+#define FP26_OFFSET 26
+#define FP27_OFFSET 27
+#define FP28_OFFSET 28
+#define FP29_OFFSET 29
+#define FP30_OFFSET 30
+#define FP31_OFFSET 31
+
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+/* return the current exception level for the 4650 */
+FRAME(_CPU_ISR_Get_level,sp,0,ra)
+ mfc0 v0,C0_SR
+ nop
+ andi v0,SR_EXL
+ srl v0,1
+ j ra
+ENDFRAME(_CPU_ISR_Get_level)
+
+FRAME(_CPU_ISR_Set_level,sp,0,ra)
+ nop
+ mfc0 a0,C0_SR
+ nop
+ andi a0,SR_EXL
+ beqz a0,_CPU_ISR_Set_1 /* normalize a0 */
+ nop
+ li a0,1
+_CPU_ISR_Set_1:
+ beq v0,a0,_CPU_ISR_Set_exit /* if (current_level != new_level ) */
+ nop
+ bnez a0,_CPU_ISR_Set_2
+ nop
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_EXL
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* disable exception level */
+ nop
+ j ra
+ nop
+_CPU_ISR_Set_2:
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_IE
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ nop
+ ori t0,SR_EXL|SR_IE /* enable exception level */
+ nop
+ mtc0 t0,C0_SR
+ nop
+_CPU_ISR_Set_exit:
+ j ra
+ nop
+ENDFRAME(_CPU_ISR_Set_level)
+
+/*
+ * _CPU_Context_save_fp_context
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_save_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_save_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ swc1 $f0,FP0_OFFSET*4(a1)
+ swc1 $f1,FP1_OFFSET*4(a1)
+ swc1 $f2,FP2_OFFSET*4(a1)
+ swc1 $f3,FP3_OFFSET*4(a1)
+ swc1 $f4,FP4_OFFSET*4(a1)
+ swc1 $f5,FP5_OFFSET*4(a1)
+ swc1 $f6,FP6_OFFSET*4(a1)
+ swc1 $f7,FP7_OFFSET*4(a1)
+ swc1 $f8,FP8_OFFSET*4(a1)
+ swc1 $f9,FP9_OFFSET*4(a1)
+ swc1 $f10,FP10_OFFSET*4(a1)
+ swc1 $f11,FP11_OFFSET*4(a1)
+ swc1 $f12,FP12_OFFSET*4(a1)
+ swc1 $f13,FP13_OFFSET*4(a1)
+ swc1 $f14,FP14_OFFSET*4(a1)
+ swc1 $f15,FP15_OFFSET*4(a1)
+ swc1 $f16,FP16_OFFSET*4(a1)
+ swc1 $f17,FP17_OFFSET*4(a1)
+ swc1 $f18,FP18_OFFSET*4(a1)
+ swc1 $f19,FP19_OFFSET*4(a1)
+ swc1 $f20,FP20_OFFSET*4(a1)
+ swc1 $f21,FP21_OFFSET*4(a1)
+ swc1 $f22,FP22_OFFSET*4(a1)
+ swc1 $f23,FP23_OFFSET*4(a1)
+ swc1 $f24,FP24_OFFSET*4(a1)
+ swc1 $f25,FP25_OFFSET*4(a1)
+ swc1 $f26,FP26_OFFSET*4(a1)
+ swc1 $f27,FP27_OFFSET*4(a1)
+ swc1 $f28,FP28_OFFSET*4(a1)
+ swc1 $f29,FP29_OFFSET*4(a1)
+ swc1 $f30,FP30_OFFSET*4(a1)
+ swc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_save_fp)
+
+/*
+ * _CPU_Context_restore_fp_context
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_restore_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_restore_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ lwc1 $f0,FP0_OFFSET*4(a1)
+ lwc1 $f1,FP1_OFFSET*4(a1)
+ lwc1 $f2,FP2_OFFSET*4(a1)
+ lwc1 $f3,FP3_OFFSET*4(a1)
+ lwc1 $f4,FP4_OFFSET*4(a1)
+ lwc1 $f5,FP5_OFFSET*4(a1)
+ lwc1 $f6,FP6_OFFSET*4(a1)
+ lwc1 $f7,FP7_OFFSET*4(a1)
+ lwc1 $f8,FP8_OFFSET*4(a1)
+ lwc1 $f9,FP9_OFFSET*4(a1)
+ lwc1 $f10,FP10_OFFSET*4(a1)
+ lwc1 $f11,FP11_OFFSET*4(a1)
+ lwc1 $f12,FP12_OFFSET*4(a1)
+ lwc1 $f13,FP13_OFFSET*4(a1)
+ lwc1 $f14,FP14_OFFSET*4(a1)
+ lwc1 $f15,FP15_OFFSET*4(a1)
+ lwc1 $f16,FP16_OFFSET*4(a1)
+ lwc1 $f17,FP17_OFFSET*4(a1)
+ lwc1 $f18,FP18_OFFSET*4(a1)
+ lwc1 $f19,FP19_OFFSET*4(a1)
+ lwc1 $f20,FP20_OFFSET*4(a1)
+ lwc1 $f21,FP21_OFFSET*4(a1)
+ lwc1 $f22,FP22_OFFSET*4(a1)
+ lwc1 $f23,FP23_OFFSET*4(a1)
+ lwc1 $f24,FP24_OFFSET*4(a1)
+ lwc1 $f25,FP25_OFFSET*4(a1)
+ lwc1 $f26,FP26_OFFSET*4(a1)
+ lwc1 $f27,FP27_OFFSET*4(a1)
+ lwc1 $f28,FP28_OFFSET*4(a1)
+ lwc1 $f29,FP29_OFFSET*4(a1)
+ lwc1 $f30,FP30_OFFSET*4(a1)
+ lwc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_restore_fp)
+
+/* _CPU_Context_switch
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+/* void _CPU_Context_switch(
+ * Context_Control *run,
+ * Context_Control *heir
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_switch,sp,0,ra)
+
+ mfc0 t0,C0_SR
+ li t1,~SR_IE
+ sd t0,C0_SR_OFFSET*8(a0) /* save status register */
+ and t0,t1
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ ori t0,SR_EXL|SR_IE /* enable exception level to disable interrupts */
+ mtc0 t0,C0_SR
+
+ sd ra,RA_OFFSET*8(a0) /* save current context */
+ sd sp,SP_OFFSET*8(a0)
+ sd fp,FP_OFFSET*8(a0)
+ sd s0,S0_OFFSET*8(a0)
+ sd s1,S1_OFFSET*8(a0)
+ sd s2,S2_OFFSET*8(a0)
+ sd s3,S3_OFFSET*8(a0)
+ sd s4,S4_OFFSET*8(a0)
+ sd s5,S5_OFFSET*8(a0)
+ sd s6,S6_OFFSET*8(a0)
+ sd s7,S7_OFFSET*8(a0)
+ dmfc0 t0,C0_EPC
+ sd t0,C0_EPC_OFFSET*8(a0)
+
+_CPU_Context_switch_restore:
+ ld s0,S0_OFFSET*8(a1) /* restore context */
+ ld s1,S1_OFFSET*8(a1)
+ ld s2,S2_OFFSET*8(a1)
+ ld s3,S3_OFFSET*8(a1)
+ ld s4,S4_OFFSET*8(a1)
+ ld s5,S5_OFFSET*8(a1)
+ ld s6,S6_OFFSET*8(a1)
+ ld s7,S7_OFFSET*8(a1)
+ ld fp,FP_OFFSET*8(a1)
+ ld sp,SP_OFFSET*8(a1)
+ ld ra,RA_OFFSET*8(a1)
+ ld t0,C0_EPC_OFFSET*8(a1)
+ dmtc0 t0,C0_EPC
+ ld t0,C0_SR_OFFSET*8(a1)
+ andi t0,SR_EXL
+ bnez t0,_CPU_Context_1 /* set exception level from restore context */
+ li t0,~SR_EXL
+ mfc0 t1,C0_SR
+ nop
+ and t1,t0
+ mtc0 t1,C0_SR
+_CPU_Context_1:
+ j ra
+ nop
+ENDFRAME(_CPU_Context_switch)
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generally used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+#if 0
+void _CPU_Context_restore(
+ Context_Control *new_context
+)
+{
+}
+#endif
+
+FRAME(_CPU_Context_restore,sp,0,ra)
+ dadd a1,a0,zero
+ j _CPU_Context_switch_restore
+ nop
+ENDFRAME(_CPU_Context_restore)
+
+EXTERN(_ISR_Nest_level, SZ_INT)
+EXTERN(_Thread_Dispatch_disable_level,SZ_INT)
+EXTERN(_Context_Switch_necessary,SZ_INT)
+EXTERN(_ISR_Signals_to_thread_executing,SZ_INT)
+.extern _Thread_Dispatch
+.extern _ISR_Vector_table
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ */
+
+#if 0
+void _ISR_Handler()
+{
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ */
+#endif
+FRAME(_ISR_Handler,sp,0,ra)
+.set noreorder
+#if USE_IDTKIT
+/* IDT/Kit incorrectly adds 4 to EPC before returning. This compensates */
+ lreg k0, R_EPC*R_SZ(sp)
+ daddiu k0,k0,-4
+ sreg k0, R_EPC*R_SZ(sp)
+ lreg k0, R_CAUSE*R_SZ(sp)
+ li k1, ~CAUSE_BD
+ and k0, k1
+ sreg k0, R_CAUSE*R_SZ(sp)
+#endif
+
+/* save registers not already saved by IDT/sim */
+ stackadd sp,sp,-EXCP_STACK_SIZE /* store ra on the stack */
+
+ sreg ra, R_RA*R_SZ(sp)
+ sreg v0, R_V0*R_SZ(sp)
+ sreg v1, R_V1*R_SZ(sp)
+ sreg a0, R_A0*R_SZ(sp)
+ sreg a1, R_A1*R_SZ(sp)
+ sreg a2, R_A2*R_SZ(sp)
+ sreg a3, R_A3*R_SZ(sp)
+ sreg t0, R_T0*R_SZ(sp)
+ sreg t1, R_T1*R_SZ(sp)
+ sreg t2, R_T2*R_SZ(sp)
+ sreg t3, R_T3*R_SZ(sp)
+ sreg t4, R_T4*R_SZ(sp)
+ sreg t5, R_T5*R_SZ(sp)
+ sreg t6, R_T6*R_SZ(sp)
+ sreg t7, R_T7*R_SZ(sp)
+ mflo k0
+ sreg t8, R_T8*R_SZ(sp)
+ sreg k0, R_MDLO*R_SZ(sp)
+ sreg t9, R_T9*R_SZ(sp)
+ mfhi k0
+ sreg gp, R_GP*R_SZ(sp)
+ sreg fp, R_FP*R_SZ(sp)
+ sreg k0, R_MDHI*R_SZ(sp)
+ .set noat
+ sreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,-40 /* store ra on the stack */
+ sd ra,32(sp)
+
+/* determine if an interrupt generated this exception */
+ mfc0 k0,C0_CAUSE
+ and k1,k0,CAUSE_EXCMASK
+ bnez k1,_ISR_Handler_prom_exit /* not an external interrupt, pass exception to Monitor */
+ mfc0 k1,C0_SR
+ and k0,k1
+ and k0,CAUSE_IPMASK
+ beq k0,zero,_ISR_Handler_quick_exit /* external interrupt not enabled, ignore */
+ nop
+
+ /*
+ * save some or all context on stack
+ * may need to save some special interrupt information for exit
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ */
+#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ lint t0,_ISR_Nest_level
+ beq t0, zero, _ISR_Handler_1
+ nop
+ /* switch stacks */
+_ISR_Handler_1:
+#else
+ lint t0,_ISR_Nest_level
+#endif
+ /*
+ * _ISR_Nest_level++;
+ */
+ addi t0,t0,1
+ sint t0,_ISR_Nest_level
+ /*
+ * _Thread_Dispatch_disable_level++;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,1
+ sint t1,_Thread_Dispatch_disable_level
+#if 0
+ nop
+ j _ISR_Handler_4
+ nop
+ /*
+ * while ( interrupts_pending(cause_reg) ) {
+ * vector = BITFIELD_TO_INDEX(cause_reg);
+ * (*_ISR_Vector_table[ vector ])( vector );
+ * }
+ */
+_ISR_Handler_2:
+/* software interrupt priorities can be applied here */
+ li t1,-1
+/* convert bit field into interrupt index */
+_ISR_Handler_3:
+ andi t2,t0,1
+ addi t1,1
+ beql t2,zero,_ISR_Handler_3
+ dsrl t0,1
+ li t1,7
+ dsll t1,3 /* convert index to byte offset (*8) */
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+ j _ISR_Handler_5
+ nop
+_ISR_Handler_4:
+ mfc0 t0,C0_CAUSE
+ andi t0,CAUSE_IPMASK
+ bne t0,zero,_ISR_Handler_2
+ dsrl t0,t0,8
+_ISR_Handler_5:
+#else
+ nop
+ li t1,7
+ dsll t1,t1,SZ_INT_POW2
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+#endif
+ /*
+ * --_ISR_Nest_level;
+ */
+ lint t2,_ISR_Nest_level
+ addi t2,t2,-1
+ sint t2,_ISR_Nest_level
+ /*
+ * --_Thread_Dispatch_disable_level;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,-1
+ sint t1,_Thread_Dispatch_disable_level
+ /*
+ * if ( _Thread_Dispatch_disable_level || _ISR_Nest_level )
+ * goto the label "exit interrupt (simple case)"
+ */
+ or t0,t2,t1
+ bne t0,zero,_ISR_Handler_exit
+ nop
+ /*
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * restore stack
+ * #endif
+ *
+ * if ( !_Context_Switch_necessary && !_ISR_Signals_to_thread_executing )
+ * goto the label "exit interrupt (simple case)"
+ */
+ lint t0,_Context_Switch_necessary
+ lint t1,_ISR_Signals_to_thread_executing
+ or t0,t0,t1
+ beq t0,zero,_ISR_Handler_exit
+ nop
+
+ /*
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ */
+ jal _Thread_Dispatch
+ nop
+ /*
+ * prepare to get out of interrupt
+ * return from interrupt (maybe to _ISR_Dispatch)
+ *
+ * LABEL "exit interrupt (simple case):
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+_ISR_Handler_exit:
+ ld ra,32(sp)
+ stackadd sp,sp,40
+
+/* restore interrupt context from stack */
+ lreg k0, R_MDLO*R_SZ(sp)
+ mtlo k0
+ lreg k0, R_MDHI*R_SZ(sp)
+ lreg a2, R_A2*R_SZ(sp)
+ mthi k0
+ lreg a3, R_A3*R_SZ(sp)
+ lreg t0, R_T0*R_SZ(sp)
+ lreg t1, R_T1*R_SZ(sp)
+ lreg t2, R_T2*R_SZ(sp)
+ lreg t3, R_T3*R_SZ(sp)
+ lreg t4, R_T4*R_SZ(sp)
+ lreg t5, R_T5*R_SZ(sp)
+ lreg t6, R_T6*R_SZ(sp)
+ lreg t7, R_T7*R_SZ(sp)
+ lreg t8, R_T8*R_SZ(sp)
+ lreg t9, R_T9*R_SZ(sp)
+ lreg gp, R_GP*R_SZ(sp)
+ lreg fp, R_FP*R_SZ(sp)
+ lreg ra, R_RA*R_SZ(sp)
+ lreg a0, R_A0*R_SZ(sp)
+ lreg a1, R_A1*R_SZ(sp)
+ lreg v1, R_V1*R_SZ(sp)
+ lreg v0, R_V0*R_SZ(sp)
+ .set noat
+ lreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,EXCP_STACK_SIZE /* store ra on the stack */
+
+#if USE_IDTKIT
+/* we handled exception, so return non-zero value */
+ li v0,1
+#endif
+
+_ISR_Handler_quick_exit:
+#ifdef USE_IDTKIT
+ j ra
+#else
+ eret
+#endif
+ nop
+
+_ISR_Handler_prom_exit:
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ .set reorder
+
+ENDFRAME(_ISR_Handler)
+
+
+FRAME(mips_enable_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ or t0,t0,a0
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_interrupts)
+
+FRAME(mips_disable_interrupts,sp,0,ra)
+ mfc0 v0,C0_SR /* get status reg */
+ li t1,SR_IMASK /* t1 = load interrupt mask word */
+ not t0,t1 /* t0 = ~t1 */
+ and t0,v0 /* clear imask bits */
+ mtc0 t0,C0_SR /* save status reg */
+ and v0,t1 /* mask return value (only return imask bits) */
+ jr ra
+ nop
+ENDFRAME(mips_disable_interrupts)
+
+FRAME(mips_enable_global_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ ori t0,SR_IE
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_global_interrupts)
+
+FRAME(mips_disable_global_interrupts,sp,0,ra)
+ li t1,SR_IE
+ mfc0 t0,C0_SR /* get status reg */
+ not t1
+ and t0,t1
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_disable_global_interrupts)
+
+/* return the value of the status register in v0. Used for debugging */
+FRAME(mips_get_sr,sp,0,ra)
+ mfc0 v0,C0_SR
+ j ra
+ nop
+ENDFRAME(mips_get_sr)
+
+FRAME(mips_break,sp,0,ra)
+#if 1
+ break 0x0
+ j mips_break
+#else
+ j ra
+#endif
+ nop
+ENDFRAME(mips_break)
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+FRAME(_CPU_Thread_Idle_body,sp,0,ra)
+ wait /* enter low power mode */
+ j _CPU_Thread_Idle_body
+ nop
+ENDFRAME(_CPU_Thread_Idle_body)
+
+#define VEC_CODE_LENGTH 10*4
+
+/**************************************************************************
+**
+** init_exc_vecs() - moves the exception code into the addresses
+** reserved for exception vectors
+**
+** UTLB Miss exception vector at address 0x80000000
+**
+** General exception vector at address 0x80000080
+**
+** RESET exception vector is at address 0xbfc00000
+**
+***************************************************************************/
+
+#define INITEXCFRM ((2*4)+4) /* ra + 2 arguments */
+FRAME(init_exc_vecs,sp,0,ra)
+/* This code yanked from SIM */
+#if defined(CPU_R3000)
+ .set noreorder
+ la t1,exc_utlb_code
+ la t2,exc_norm_code
+ li t3,UT_VEC
+ li t4,E_VEC
+ li t5,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ lw t7,0(t2)
+ sw t6,0(t3)
+ sw t7,0(t4)
+ addiu t1,4
+ addiu t3,4
+ addiu t4,4
+ subu t5,4
+ bne t5,zero,1b
+ addiu t2,4
+ move t5,ra # assumes clear_cache doesnt use t5
+ li a0,UT_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ nop
+ li a0,E_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ move ra,t5 # restore ra
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ .set reorder
+ move t5,ra # assumes clear_cache doesnt use t5
+
+ /* TLB exception vector */
+ la t1,exc_tlb_code
+ li t2,T_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,T_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ la t1,exc_xtlb_code
+ li t2,X_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ /* extended TLB exception vector */
+ li a0,X_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* cache error exception vector */
+ la t1,exc_cache_code
+ li t2,C_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,C_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* normal exception vector */
+ la t1,exc_norm_code
+ li t2,E_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,E_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ move ra,t5 # restore ra
+ j ra
+#endif
+ENDFRAME(init_exc_vecs)
+
+
+#if defined(CPU_R4000)
+FRAME(exc_tlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_tlb_code)
+
+
+FRAME(exc_xtlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_xtlb_code)
+
+
+FRAME(exc_cache_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_cache_code)
+
+
+FRAME(exc_norm_code,sp,0,ra)
+ la k0, _ISR_Handler /* generic external int hndlr */
+ j k0
+ nop
+ subu sp, EXCP_STACK_SIZE /* set up local stack frame */
+ENDFRAME(exc_norm_code)
+#endif
+
+/**************************************************************************
+**
+** enable_int(mask) - enables interrupts - mask is positioned so it only
+** needs to be or'ed into the status reg. This
+** also does some other things !!!! caution should
+** be used if invoking this while in the middle
+** of a debugging session where the client may have
+** nested interrupts.
+**
+****************************************************************************/
+FRAME(enable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ or a0,1
+ or t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ .set reorder
+ENDFRAME(enable_int)
+
+
+/***************************************************************************
+**
+** disable_int(mask) - disable the interrupt - mask is the complement
+** of the bits to be cleared - i.e. to clear ext int
+** 5 the mask would be - 0xffff7fff
+**
+****************************************************************************/
+FRAME(disable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ nop
+ and t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ENDFRAME(disable_int)
+
+
diff --git a/c/src/exec/score/cpu/mips/cpu_asm.h b/c/src/exec/score/cpu/mips/cpu_asm.h
new file mode 100644
index 0000000000..f443c55b00
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/cpu_asm.h
@@ -0,0 +1,115 @@
+/*
+ * cpu_asm.h
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+/* @(#)cpu_asm.h 08/20/96 1.2 */
+
+#ifndef __CPU_ASM_h
+#define __CPU_ASM_h
+
+/* pull in the generated offsets */
+
+/* #include <rtems/score/offsets.h> */
+
+/*
+ * Hardware General Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Floating Point Registers
+ */
+
+#define R_FP0 0
+#define R_FP1 1
+#define R_FP2 2
+#define R_FP3 3
+#define R_FP4 4
+#define R_FP5 5
+#define R_FP6 6
+#define R_FP7 7
+#define R_FP8 8
+#define R_FP9 9
+#define R_FP10 10
+#define R_FP11 11
+#define R_FP12 12
+#define R_FP13 13
+#define R_FP14 14
+#define R_FP15 15
+#define R_FP16 16
+#define R_FP17 17
+#define R_FP18 18
+#define R_FP19 19
+#define R_FP20 20
+#define R_FP21 21
+#define R_FP22 22
+#define R_FP23 23
+#define R_FP24 24
+#define R_FP25 25
+#define R_FP26 26
+#define R_FP27 27
+#define R_FP28 28
+#define R_FP29 29
+#define R_FP30 30
+#define R_FP31 31
+
+/*
+ * Hardware Control Registers
+ */
+
+/* put something here */
+
+/*
+ * Calling Convention
+ */
+
+/* put something here */
+
+/*
+ * Temporary registers
+ */
+
+/* put something here */
+
+/*
+ * Floating Point Registers - SW Conventions
+ */
+
+/* put something here */
+
+/*
+ * Temporary floating point registers
+ */
+
+/* put something here */
+
+#endif
+
+/* end of file */
diff --git a/c/src/exec/score/cpu/mips/idtcpu.h b/c/src/exec/score/cpu/mips/idtcpu.h
new file mode 100644
index 0000000000..f921e85ef6
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/idtcpu.h
@@ -0,0 +1,440 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtcpu.h -- cpu related defines
+*/
+
+#ifndef _IDTCPU_H__
+#define _IDTCPU_H__
+
+/*
+ * 950313: Ketan added Register definition for XContext reg.
+ * added define for WAIT instruction.
+ * 950421: Ketan added Register definition for Config reg (R3081)
+ */
+
+/*
+** memory configuration and mapping
+*/
+#define K0BASE 0x80000000
+#define K0SIZE 0x20000000
+#define K1BASE 0xa0000000
+#define K1SIZE 0x20000000
+#define K2BASE 0xc0000000
+#define K2SIZE 0x20000000
+#if defined(CPU_R4000)
+#define KSBASE 0xe0000000
+#define KSSIZE 0x20000000
+#endif
+
+#define KUBASE 0
+#define KUSIZE 0x80000000
+
+/*
+** Exception Vectors
+*/
+#if defined(CPU_R3000)
+#define UT_VEC K0BASE /* utlbmiss vector */
+#define E_VEC (K0BASE+0x80) /* exception vevtor */
+#endif
+#if defined(CPU_R4000)
+#define T_VEC (K0BASE+0x000) /* tlbmiss vector */
+#define X_VEC (K0BASE+0x080) /* xtlbmiss vector */
+#define C_VEC (K0BASE+0x100) /* cache error vector */
+#define E_VEC (K0BASE+0x180) /* exception vector */
+#endif
+#define R_VEC (K1BASE+0x1fc00000) /* reset vector */
+
+/*
+** Address conversion macros
+*/
+#ifdef CLANGUAGE
+#define CAST(as) (as)
+#else
+#define CAST(as)
+#endif
+#define K0_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */
+#define K1_TO_K0(x) (CAST(unsigned)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */
+#define K0_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg0 to physical */
+#define K1_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg1 to physical */
+#define PHYS_TO_K0(x) (CAST(unsigned)(x)|0x80000000) /* physical to kseg0 */
+#define PHYS_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* physical to kseg1 */
+
+/*
+** Cache size constants
+*/
+#define MINCACHE 0x200 /* 512 For 3041. */
+#define MAXCACHE 0x40000 /* 256*1024 256k */
+
+#if defined(CPU_R4000)
+/* R4000 configuration register definitions */
+#define CFG_CM 0x80000000 /* Master-Checker mode */
+#define CFG_ECMASK 0x70000000 /* System Clock Ratio */
+#define CFG_ECBY2 0x00000000 /* divide by 2 */
+#define CFG_ECBY3 0x10000000 /* divide by 3 */
+#define CFG_ECBY4 0x20000000 /* divide by 4 */
+#define CFG_EPMASK 0x0f000000 /* Transmit data pattern */
+#define CFG_EPD 0x00000000 /* D */
+#define CFG_EPDDX 0x01000000 /* DDX */
+#define CFG_EPDDXX 0x02000000 /* DDXX */
+#define CFG_EPDXDX 0x03000000 /* DXDX */
+#define CFG_EPDDXXX 0x04000000 /* DDXXX */
+#define CFG_EPDDXXXX 0x05000000 /* DDXXXX */
+#define CFG_EPDXXDXX 0x06000000 /* DXXDXX */
+#define CFG_EPDDXXXXX 0x07000000 /* DDXXXXX */
+#define CFG_EPDXXXDXXX 0x08000000 /* DXXXDXXX */
+#define CFG_SBMASK 0x00c00000 /* Secondary cache block size */
+#define CFG_SBSHIFT 22
+#define CFG_SB4 0x00000000 /* 4 words */
+#define CFG_SB8 0x00400000 /* 8 words */
+#define CFG_SB16 0x00800000 /* 16 words */
+#define CFG_SB32 0x00c00000 /* 32 words */
+#define CFG_SS 0x00200000 /* Split secondary cache */
+#define CFG_SW 0x00100000 /* Secondary cache port width */
+#define CFG_EWMASK 0x000c0000 /* System port width */
+#define CFG_EWSHIFT 18
+#define CFG_EW64 0x00000000 /* 64 bit */
+#define CFG_EW32 0x00010000 /* 32 bit */
+#define CFG_SC 0x00020000 /* Secondary cache absent */
+#define CFG_SM 0x00010000 /* Dirty Shared mode disabled */
+#define CFG_BE 0x00008000 /* Big Endian */
+#define CFG_EM 0x00004000 /* ECC mode enable */
+#define CFG_EB 0x00002000 /* Block ordering */
+#define CFG_ICMASK 0x00000e00 /* Instruction cache size */
+#define CFG_ICSHIFT 9
+#define CFG_DCMASK 0x000001c0 /* Data cache size */
+#define CFG_DCSHIFT 6
+#define CFG_IB 0x00000020 /* Instruction cache block size */
+#define CFG_DB 0x00000010 /* Data cache block size */
+#define CFG_CU 0x00000008 /* Update on Store Conditional */
+#define CFG_K0MASK 0x00000007 /* KSEG0 coherency algorithm */
+
+/*
+ * R4000 primary cache mode
+ */
+#define CFG_C_UNCACHED 2
+#define CFG_C_NONCOHERENT 3
+#define CFG_C_COHERENTXCL 4
+#define CFG_C_COHERENTXCLW 5
+#define CFG_C_COHERENTUPD 6
+
+/*
+ * R4000 cache operations (should be in assembler...?)
+ */
+#define Index_Invalidate_I 0x0 /* 0 0 */
+#define Index_Writeback_Inv_D 0x1 /* 0 1 */
+#define Index_Invalidate_SI 0x2 /* 0 2 */
+#define Index_Writeback_Inv_SD 0x3 /* 0 3 */
+#define Index_Load_Tag_I 0x4 /* 1 0 */
+#define Index_Load_Tag_D 0x5 /* 1 1 */
+#define Index_Load_Tag_SI 0x6 /* 1 2 */
+#define Index_Load_Tag_SD 0x7 /* 1 3 */
+#define Index_Store_Tag_I 0x8 /* 2 0 */
+#define Index_Store_Tag_D 0x9 /* 2 1 */
+#define Index_Store_Tag_SI 0xA /* 2 2 */
+#define Index_Store_Tag_SD 0xB /* 2 3 */
+#define Create_Dirty_Exc_D 0xD /* 3 1 */
+#define Create_Dirty_Exc_SD 0xF /* 3 3 */
+#define Hit_Invalidate_I 0x10 /* 4 0 */
+#define Hit_Invalidate_D 0x11 /* 4 1 */
+#define Hit_Invalidate_SI 0x12 /* 4 2 */
+#define Hit_Invalidate_SD 0x13 /* 4 3 */
+#define Hit_Writeback_Inv_D 0x15 /* 5 1 */
+#define Hit_Writeback_Inv_SD 0x17 /* 5 3 */
+#define Fill_I 0x14 /* 5 0 */
+#define Hit_Writeback_D 0x19 /* 6 1 */
+#define Hit_Writeback_SD 0x1B /* 6 3 */
+#define Hit_Writeback_I 0x18 /* 6 0 */
+#define Hit_Set_Virtual_SI 0x1E /* 7 2 */
+#define Hit_Set_Virtual_SD 0x1F /* 7 3 */
+
+#ifndef WAIT
+#define WAIT .word 0x42000020
+#endif WAIT
+
+#ifndef wait
+#define wait .word 0x42000020
+#endif wait
+
+#endif
+
+/*
+** TLB resource defines
+*/
+#if defined(CPU_R3000)
+#define N_TLB_ENTRIES 64
+#define TLB_PGSIZE 0x1000
+#define RANDBASE 8
+#define TLBLO_PFNMASK 0xfffff000
+#define TLBLO_PFNSHIFT 12
+#define TLBLO_N 0x800 /* non-cacheable */
+#define TLBLO_D 0x400 /* writeable */
+#define TLBLO_V 0x200 /* valid bit */
+#define TLBLO_G 0x100 /* global access bit */
+
+#define TLBHI_VPNMASK 0xfffff000
+#define TLBHI_VPNSHIFT 12
+#define TLBHI_PIDMASK 0xfc0
+#define TLBHI_PIDSHIFT 6
+#define TLBHI_NPID 64
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x00003f00
+#define TLBINX_INXSHIFT 8
+
+#define TLBRAND_RANDMASK 0x00003f00
+#define TLBRAND_RANDSHIFT 8
+
+#define TLBCTXT_BASEMASK 0xffe00000
+#define TLBCTXT_BASESHIFT 21
+
+#define TLBCTXT_VPNMASK 0x001ffffc
+#define TLBCTXT_VPNSHIFT 2
+#endif
+#if defined(CPU_R4000)
+#define N_TLB_ENTRIES 48
+
+#define TLBHI_VPN2MASK 0xffffe000
+#define TLBHI_PIDMASK 0x000000ff
+#define TLBHI_NPID 256
+
+#define TLBLO_PFNMASK 0x3fffffc0
+#define TLBLO_PFNSHIFT 6
+#define TLBLO_D 0x00000004 /* writeable */
+#define TLBLO_V 0x00000002 /* valid bit */
+#define TLBLO_G 0x00000001 /* global access bit */
+#define TLBLO_CMASK 0x00000038 /* cache algorithm mask */
+#define TLBLO_CSHIFT 3
+
+#define TLBLO_UNCACHED (CFG_C_UNCACHED<<TLBLO_CSHIFT)
+#define TLBLO_NONCOHERENT (CFG_C_NONCOHERENT<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCL (CFG_C_COHERENTXCL<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCLW (CFG_C_COHERENTXCLW<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTUPD (CFG_C_COHERENTUPD<<TLBLO_CSHIFT)
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x0000003f
+
+#define TLBRAND_RANDMASK 0x0000003f
+
+#define TLBCTXT_BASEMASK 0xff800000
+#define TLBCTXT_BASESHIFT 23
+
+#define TLBCTXT_VPN2MASK 0x007ffff0
+#define TLBCTXT_VPN2SHIFT 4
+
+#define TLBPGMASK_MASK 0x01ffe000
+#endif
+
+#if defined(CPU_R3000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_BEV 0x00400000 /* use boot exception vectors */
+
+/* Cache control bits */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_PE 0x00100000 /* cache parity error */
+#define SR_CM 0x00080000 /* cache miss */
+#define SR_PZ 0x00040000 /* cache parity zero */
+#define SR_SWC 0x00020000 /* swap cache */
+#define SR_ISC 0x00010000 /* Isolate data cache */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */
+#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */
+#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */
+#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */
+#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */
+#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */
+#endif
+
+#if defined(CPU_R4000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_RP 0x08000000 /* Reduced power operation */
+#define SR_FR 0x04000000 /* Additional floating point registers */
+#define SR_RE 0x02000000 /* Reverse endian in user mode */
+
+#define SR_BEV 0x00400000 /* Use boot exception vectors */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_SR 0x00100000 /* Soft reset */
+#define SR_CH 0x00040000 /* Cache hit */
+#define SR_CE 0x00020000 /* Use cache ECC */
+#define SR_DE 0x00010000 /* Disable cache exceptions */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KSMASK 0x00000018 /* Kernel mode mask */
+#define SR_KSUSER 0x00000010 /* User mode */
+#define SR_KSSUPER 0x00000008 /* Supervisor mode */
+#define SR_KSKERNEL 0x00000000 /* Kernel mode */
+#define SR_ERL 0x00000004 /* Error level */
+#define SR_EXL 0x00000002 /* Exception level */
+#define SR_IE 0x00000001 /* Interrupts enabled */
+#endif
+
+
+
+/*
+ * Cause Register
+ */
+#define CAUSE_BD 0x80000000 /* Branch delay slot */
+#define CAUSE_CEMASK 0x30000000 /* coprocessor error */
+#define CAUSE_CESHIFT 28
+
+
+#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */
+#define CAUSE_IPSHIFT 8
+
+#define CAUSE_EXCMASK 0x0000003C /* Cause code bits */
+#define CAUSE_EXCSHIFT 2
+
+#ifndef XDS
+/*
+** Coprocessor 0 registers
+*/
+#define C0_INX $0 /* tlb index */
+#define C0_RAND $1 /* tlb random */
+#if defined(CPU_R3000)
+#define C0_TLBLO $2 /* tlb entry low */
+#endif
+#if defined(CPU_R4000)
+#define C0_TLBLO0 $2 /* tlb entry low 0 */
+#define C0_TLBLO1 $3 /* tlb entry low 1 */
+#endif
+
+#define C0_CTXT $4 /* tlb context */
+
+#if defined(CPU_R4000)
+#define C0_PAGEMASK $5 /* tlb page mask */
+#define C0_WIRED $6 /* number of wired tlb entries */
+#endif
+
+#define C0_BADVADDR $8 /* bad virtual address */
+
+#if defined(CPU_R4000)
+#define C0_COUNT $9 /* cycle count */
+#endif
+
+#define C0_TLBHI $10 /* tlb entry hi */
+
+#if defined(CPU_R4000)
+#define C0_COMPARE $11 /* cyccle count comparator */
+#endif
+
+#define C0_SR $12 /* status register */
+#define C0_CAUSE $13 /* exception cause */
+#define C0_EPC $14 /* exception pc */
+#define C0_PRID $15 /* revision identifier */
+
+#if defined(CPU_R3000)
+#define C0_CONFIG $3 /* configuration register R3081*/
+#endif
+
+#if defined(CPU_R4000)
+#define C0_CONFIG $16 /* configuration register */
+#define C0_LLADDR $17 /* linked load address */
+#define C0_WATCHLO $18 /* watchpoint trap register */
+#define C0_WATCHHI $19 /* watchpoint trap register */
+#define C0_XCTXT $20 /* extended tlb context */
+#define C0_ECC $26 /* secondary cache ECC control */
+#define C0_CACHEERR $27 /* cache error status */
+#define C0_TAGLO $28 /* cache tag lo */
+#define C0_TAGHI $29 /* cache tag hi */
+#define C0_ERRPC $30 /* cache error pc */
+#endif
+
+#endif XDS
+
+#ifdef R4650
+#define IWATCH $18
+#define DWATCH $19
+#define IBASE $0
+#define IBOUND $1
+#define DBASE $2
+#define DBOUND $3
+#define CALG $17
+#endif
+
+#endif /* _IDTCPU_H__ */
+
diff --git a/c/src/exec/score/cpu/mips/idtmon.h b/c/src/exec/score/cpu/mips/idtmon.h
new file mode 100644
index 0000000000..b42211ed5c
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/idtmon.h
@@ -0,0 +1,171 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtmon.h - General header file for the IDT Prom Monitor
+**
+** Copyright 1989 Integrated Device Technology, Inc.
+** All Rights Reserved.
+**
+** June 1989 - D.Cahoon
+*/
+#ifndef __IDTMON_H__
+#define __IDTMON_H__
+
+/*
+** P_STACKSIZE is the size of the Prom Stack.
+** the prom stack grows downward
+*/
+#define P_STACKSIZE 0x2000 /* sets stack size to 8k */
+
+/*
+** M_BUSWIDTH
+** Memory bus width (including bank interleaving) in bytes
+** used when doing memory sizing to prevent bus capacitance
+** reporting ghost memory locations
+*/
+#if defined(CPU_R3000)
+#define M_BUSWIDTH 8 /* 32bit memory bank interleaved */
+#endif
+#if defined(CPU_R4000)
+#define M_BUSWIDTH 16 /* 64 bit memory bank interleaved */
+#endif
+
+/*
+** this is the default value for the number of bytes to add in calculating
+** the checksums in the checksum command
+*/
+#define CHK_SUM_CNT 0x20000 /* number of bytes to calc chksum for */
+
+/*
+** Monitor modes
+*/
+#define MODE_MONITOR 5 /* IDT Prom Monitor is executing */
+#define MODE_USER 0xa /* USER is executing */
+
+/*
+** memory reference widths
+*/
+#define SW_BYTE 1
+#define SW_HALFWORD 2
+#define SW_WORD 4
+#define SW_TRIBYTEL 12
+#define SW_TRIBYTER 20
+
+#ifdef CPU_R4000
+/*
+** definitions for select_cache call
+*/
+#define DCACHE 0
+#define ICACHE 1
+#define SCACHE 2
+
+#endif
+
+#if defined (CLANGUAGE) || defined(_LANGUAGE_C)
+typedef struct {
+ unsigned int mem_size;
+ unsigned int icache_size;
+ unsigned int dcache_size;
+#ifdef CPU_R4000
+ unsigned int scache_size;
+#endif
+
+ } mem_config;
+
+#endif CLANGUAGE || defined(_LANGUAGE_C)
+
+/*
+** general equates for diagnostics and boolean functions
+*/
+#define PASS 0
+#define FAIL 1
+
+#ifndef TRUE
+#define TRUE 1
+#endif TRUE
+#ifndef NULL
+#define NULL 0
+#endif NULL
+
+#ifndef FALSE
+#define FALSE 0
+#endif FALSE
+
+
+/*
+** portablility equates
+*/
+
+#ifndef BOOL
+#define BOOL unsigned int
+#endif BOOL
+
+#ifndef GLOBAL
+#define GLOBAL /**/
+#endif GLOBAL
+
+#ifndef MLOCAL
+#define MLOCAL static
+#endif MLOCAL
+
+
+#ifdef XDS
+#define CONST const
+#else
+#define CONST
+#endif XDS
+
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+/*
+** assembly instructions for compatability between xds and mips
+*/
+#ifndef XDS
+#define sllv sll
+#define srlv srl
+#endif XDS
+/*
+** debugger macros for assembly language routines. Allows the
+** programmer to set up the necessary stack frame info
+** required by debuggers to do stack traces.
+*/
+
+#ifndef XDS
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+#define ENDFRAME(name) \
+ .end name
+#else
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl _##name;\
+_##name:
+#define ENDFRAME(name)
+#endif XDS
+#endif /* __IDTMON_H__ */
diff --git a/c/src/exec/score/cpu/mips/iregdef.h b/c/src/exec/score/cpu/mips/iregdef.h
new file mode 100644
index 0000000000..f0953da852
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/iregdef.h
@@ -0,0 +1,325 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** iregdef.h - IDT R3000 register structure header file
+**
+** Copyright 1989 Integrated Device Technology, Inc
+** All Rights Reserved
+**
+*/
+#ifndef __IREGDEF_H__
+#define __IREGDEF_H__
+
+/*
+ * 950313: Ketan added sreg/lreg and R_SZ for 64-bit saves
+ * added Register definition for XContext reg.
+ * Look towards end of this file.
+ */
+/*
+** register names
+*/
+#define r0 $0
+#define r1 $1
+#define r2 $2
+#define r3 $3
+#define r4 $4
+#define r5 $5
+#define r6 $6
+#define r7 $7
+#define r8 $8
+#define r9 $9
+#define r10 $10
+#define r11 $11
+#define r12 $12
+#define r13 $13
+
+#define r14 $14
+#define r15 $15
+#define r16 $16
+#define r17 $17
+#define r18 $18
+#define r19 $19
+#define r20 $20
+#define r21 $21
+#define r22 $22
+#define r23 $23
+#define r24 $24
+#define r25 $25
+#define r26 $26
+#define r27 $27
+#define r28 $28
+#define r29 $29
+#define r30 $30
+#define r31 $31
+
+#define fp0 $f0
+#define fp1 $f1
+#define fp2 $f2
+#define fp3 $f3
+#define fp4 $f4
+#define fp5 $f5
+#define fp6 $f6
+#define fp7 $f7
+#define fp8 $f8
+#define fp9 $f9
+#define fp10 $f10
+#define fp11 $f11
+#define fp12 $f12
+#define fp13 $f13
+#define fp14 $f14
+#define fp15 $f15
+#define fp16 $f16
+#define fp17 $f17
+#define fp18 $f18
+#define fp19 $f19
+#define fp20 $f20
+#define fp21 $f21
+#define fp22 $f22
+#define fp23 $f23
+#define fp24 $f24
+#define fp25 $f25
+#define fp26 $f26
+#define fp27 $f27
+#define fp28 $f28
+#define fp29 $f29
+#define fp30 $f30
+#define fp31 $f31
+
+#define fcr0 $0
+#define fcr30 $30
+#define fcr31 $31
+
+#define zero $0 /* wired zero */
+#define AT $at /* assembler temp */
+#define v0 $2 /* return value */
+#define v1 $3
+#define a0 $4 /* argument registers a0-a3 */
+#define a1 $5
+#define a2 $6
+#define a3 $7
+#define t0 $8 /* caller saved t0-t9 */
+#define t1 $9
+#define t2 $10
+#define t3 $11
+#define t4 $12
+#define t5 $13
+#define t6 $14
+#define t7 $15
+#define s0 $16 /* callee saved s0-s8 */
+#define s1 $17
+#define s2 $18
+#define s3 $19
+#define s4 $20
+#define s5 $21
+#define s6 $22
+#define s7 $23
+#define t8 $24
+#define t9 $25
+#define k0 $26 /* kernel usage */
+#define k1 $27 /* kernel usage */
+#define gp $28 /* sdata pointer */
+#define sp $29 /* stack pointer */
+#define s8 $30 /* yet another saved reg for the callee */
+#define fp $30 /* frame pointer - this is being phased out by MIPS */
+#define ra $31 /* return address */
+
+
+/*
+** relative position of registers in save reg area
+*/
+#define R_R0 0
+#define R_R1 1
+#define R_R2 2
+#define R_R3 3
+#define R_R4 4
+#define R_R5 5
+#define R_R6 6
+#define R_R7 7
+#define R_R8 8
+#define R_R9 9
+#define R_R10 10
+#define R_R11 11
+#define R_R12 12
+#define R_R13 13
+#define R_R14 14
+#define R_R15 15
+#define R_R16 16
+#define R_R17 17
+#define R_R18 18
+#define R_R19 19
+#define R_R20 20
+#define R_R21 21
+#define R_R22 22
+#define R_R23 23
+#define R_R24 24
+#define R_R25 25
+#define R_R26 26
+#define R_R27 27
+#define R_R28 28
+#define R_R29 29
+#define R_R30 30
+#define R_R31 31
+#define R_F0 32
+#define R_F1 33
+#define R_F2 34
+#define R_F3 35
+#define R_F4 36
+#define R_F5 37
+#define R_F6 38
+#define R_F7 39
+#define R_F8 40
+#define R_F9 41
+#define R_F10 42
+#define R_F11 43
+#define R_F12 44
+#define R_F13 45
+#define R_F14 46
+#define R_F15 47
+#define R_F16 48
+#define R_F17 49
+#define R_F18 50
+#define R_F19 51
+#define R_F20 52
+#define R_F21 53
+#define R_F22 54
+#define R_F23 55
+#define R_F24 56
+#define R_F25 57
+#define R_F26 58
+#define R_F27 59
+#define R_F28 60
+#define R_F29 61
+#define R_F30 62
+#define R_F31 63
+#define NCLIENTREGS 64
+#define R_EPC 64
+#define R_MDHI 65
+#define R_MDLO 66
+#define R_SR 67
+#define R_CAUSE 68
+#define R_TLBHI 69
+#if defined(CPU_R3000)
+#define R_TLBLO 70
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO0 70
+#endif
+#define R_BADVADDR 71
+#define R_INX 72
+#define R_RAND 73
+#define R_CTXT 74
+#define R_EXCTYPE 75
+#define R_MODE 76
+#define R_PRID 77
+#define R_FCSR 78
+#define R_FEIR 79
+#if defined(CPU_R3000)
+#define NREGS 80
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO1 80
+#define R_PAGEMASK 81
+#define R_WIRED 82
+#define R_COUNT 83
+#define R_COMPARE 84
+#define R_CONFIG 85
+#define R_LLADDR 86
+#define R_WATCHLO 87
+#define R_WATCHHI 88
+#define R_ECC 89
+#define R_CACHEERR 90
+#define R_TAGLO 91
+#define R_TAGHI 92
+#define R_ERRPC 93
+#define R_XCTXT 94 /* Ketan added from SIM64bit */
+
+#define NREGS 95
+#endif
+
+/*
+** For those who like to think in terms of the compiler names for the regs
+*/
+#define R_ZERO R_R0
+#define R_AT R_R1
+#define R_V0 R_R2
+#define R_V1 R_R3
+#define R_A0 R_R4
+#define R_A1 R_R5
+#define R_A2 R_R6
+#define R_A3 R_R7
+#define R_T0 R_R8
+#define R_T1 R_R9
+#define R_T2 R_R10
+#define R_T3 R_R11
+#define R_T4 R_R12
+#define R_T5 R_R13
+#define R_T6 R_R14
+#define R_T7 R_R15
+#define R_S0 R_R16
+#define R_S1 R_R17
+#define R_S2 R_R18
+#define R_S3 R_R19
+#define R_S4 R_R20
+#define R_S5 R_R21
+#define R_S6 R_R22
+#define R_S7 R_R23
+#define R_T8 R_R24
+#define R_T9 R_R25
+#define R_K0 R_R26
+#define R_K1 R_R27
+#define R_GP R_R28
+#define R_SP R_R29
+#define R_FP R_R30
+#define R_RA R_R31
+
+/* Ketan added the following */
+#ifdef CPU_R3000
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#endif CPU_R3000
+
+#ifdef CPU_R4000
+#if __mips < 3
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#else
+#define sreg sd
+#define lreg ld
+#define rmfc0 dmfc0
+#define rmtc0 dmtc0
+#define R_SZ 8
+#endif
+#endif CPU_R4000
+/* Ketan till here */
+
+#endif /* __IREGDEF_H__ */
+
diff --git a/c/src/exec/score/cpu/mips/rtems.c b/c/src/exec/score/cpu/mips/rtems.c
new file mode 100644
index 0000000000..07d01ec65b
--- /dev/null
+++ b/c/src/exec/score/cpu/mips/rtems.c
@@ -0,0 +1,53 @@
+/* rtems.c ===> rtems.S or rtems.s
+ *
+ * This file contains the single entry point code for
+ * the XXX implementation of RTEMS.
+ *
+ * NOTE: This is supposed to be a .S or .s file NOT a C file.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)rtems.c 03/15/96 1.1\n";
+ */
+
+
+/*
+ * This is supposed to be an assembly file. This means that system.h
+ * and cpu.h should not be included in a "real" rtems file.
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+/* #include "asm.h> */
+
+/*
+ * RTEMS
+ *
+ * This routine jumps to the directive indicated in the
+ * CPU defined register. This routine is used when RTEMS is
+ * linked by itself and placed in ROM. This routine is the
+ * first address in the ROM space for RTEMS. The user "calls"
+ * this address with the directive arguments in the normal place.
+ * This routine then jumps indirectly to the correct directive
+ * preserving the arguments. The directive should not realize
+ * it has been "wrapped" in this way. The table "_Entry_points"
+ * is used to look up the directive.
+ */
+
+void RTEMS()
+{
+}
+
diff --git a/c/src/exec/score/cpu/mips64orion/Makefile.in b/c/src/exec/score/cpu/mips64orion/Makefile.in
new file mode 100644
index 0000000000..9ebff0d60e
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/Makefile.in
@@ -0,0 +1,81 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+# Normally cpu_asm and rtems are assembly files
+C_PIECES=cpu rtems
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/mips64orion.h $(srcdir)/mipstypes.h \
+ $(srcdir)/idtcpu.h $(srcdir)/iregdef.h $(srcdir)/idtmon.h
+
+# H_FILES that get installed externally
+EXTERNAL_H_FILES = $(srcdir)/asm.h
+
+# Assembly source names, if any, go here -- minus the .s
+# Normally cpu_asm and rtems are assembly files
+S_PIECES=cpu_asm
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+ $(INSTALL_VARIANT) -m 444 $(RELS) ${PROJECT_RELEASE}/lib
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/mips64orion/asm.h b/c/src/exec/score/cpu/mips64orion/asm.h
new file mode 100644
index 0000000000..fccd89069f
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/asm.h
@@ -0,0 +1,102 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+/* @(#)asm.h 03/15/96 1.1 */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/exec/score/cpu/mips64orion/cpu.c b/c/src/exec/score/cpu/mips64orion/cpu.c
new file mode 100644
index 0000000000..0b3d787bdf
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/cpu.c
@@ -0,0 +1,219 @@
+/*
+ * Mips CPU Dependent Source
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)cpu.c 08/20/96 1.5\n";
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+
+
+ISR_Handler_entry _ISR_Vector_table[ ISR_NUMBER_OF_VECTORS ];
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void null_handler( void )
+{
+}
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ unsigned int i = ISR_NUMBER_OF_VECTORS;
+
+ while ( i-- )
+ {
+ _ISR_Vector_table[i] = (ISR_Handler_entry)null_handler;
+ }
+
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0 /* located in cpu_asm.S */
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+
+#if 0 /* not necessary */
+/* use IDT/Sim to set interrupt vector. Needed to co-exist with debugger. */
+ add_ext_int_func( vector, new_handler );
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+/* we don't support this yet */
+}
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+#if 0 /* located in cpu_asm.S */
+void _CPU_Thread_Idle_body( void )
+{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+}
+#endif
+
+extern void mips_break( int error );
+
+#include <stdio.h>
+
+void mips_fatal_error( int error )
+{
+ printf("fatal error 0x%x %d\n",error,error);
+ mips_break( error );
+}
diff --git a/c/src/exec/score/cpu/mips64orion/cpu.h b/c/src/exec/score/cpu/mips64orion/cpu.h
new file mode 100644
index 0000000000..9ab59afa06
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/cpu.h
@@ -0,0 +1,957 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the IDT 4650
+ * processor.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)cpu.h 08/29/96 1.7 */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mips64orion.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/mipstypes.h>
+#endif
+
+extern int mips_disable_interrupts( void );
+extern void mips_enable_interrupts( int _level );
+extern int mips_disable_global_interrupts( void );
+extern void mips_enable_global_interrupts( void );
+extern void mips_fatal_error ( int error );
+
+/* conditional compilation parameters */
+
+/*
+ * Should the calls to _Thread_Enable_dispatch be inlined?
+ *
+ * If TRUE, then they are inlined.
+ * If FALSE, then a subroutine call is made.
+ *
+ * Basically this is an example of the classic trade-off of size
+ * versus speed. Inlining the call (TRUE) typically increases the
+ * size of RTEMS while speeding up the enabling of dispatching.
+ * [NOTE: In general, the _Thread_Dispatch_disable_level will
+ * only be 0 or 1 unless you are in an interrupt handler and that
+ * interrupt handler invokes the executive.] When not inlined
+ * something calls _Thread_Enable_dispatch which in turns calls
+ * _Thread_Dispatch. If the enable dispatch is inlined, then
+ * one subroutine call is avoided entirely.]
+ */
+
+#define CPU_INLINE_ENABLE_DISPATCH TRUE
+
+/*
+ * Should the body of the search loops in _Thread_queue_Enqueue_priority
+ * be unrolled one time? In unrolled each iteration of the loop examines
+ * two "nodes" on the chain being searched. Otherwise, only one node
+ * is examined per iteration.
+ *
+ * If TRUE, then the loops are unrolled.
+ * If FALSE, then the loops are not unrolled.
+ *
+ * The primary factor in making this decision is the cost of disabling
+ * and enabling interrupts (_ISR_Flash) versus the cost of rest of the
+ * body of the loop. On some CPUs, the flash is more expensive than
+ * one iteration of the loop body. In this case, it might be desirable
+ * to unroll the loop. It is important to note that on some CPUs, this
+ * code is the longest interrupt disable period in RTEMS. So it is
+ * necessary to strike a balance when setting this parameter.
+ */
+
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+
+/*
+ * Does RTEMS manage a dedicated interrupt stack in software?
+ *
+ * If TRUE, then a stack is allocated in _Interrupt_Manager_initialization.
+ * If FALSE, nothing is done.
+ *
+ * If the CPU supports a dedicated interrupt stack in hardware,
+ * then it is generally the responsibility of the BSP to allocate it
+ * and set it up.
+ *
+ * If the CPU does not support a dedicated interrupt stack, then
+ * the porter has two options: (1) execute interrupts on the
+ * stack of the interrupted task, and (2) have RTEMS manage a dedicated
+ * interrupt stack.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Does this CPU have hardware support for a dedicated interrupt stack?
+ *
+ * If TRUE, then it must be installed during initialization.
+ * If FALSE, then no installation is performed.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
+ *
+ * If TRUE, then the memory is allocated during initialization.
+ * If FALSE, then the memory is allocated during initialization.
+ *
+ * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE
+ * or CPU_INSTALL_HARDWARE_INTERRUPT_STACK is TRUE.
+ */
+
+#define CPU_ALLOCATE_INTERRUPT_STACK FALSE
+
+/*
+ * Does the CPU have hardware floating point?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
+ *
+ * If there is a FP coprocessor such as the i387 or mc68881, then
+ * the answer is TRUE.
+ *
+ * The macro name "MIPS64ORION_HAS_FPU" should be made CPU specific.
+ * It indicates whether or not this CPU model has FP support. For
+ * example, it would be possible to have an i386_nofp CPU model
+ * which set this to false to indicate that you have an i386 without
+ * an i387 and wish to leave floating point support out of RTEMS.
+ */
+
+#if ( MIPS64ORION_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+/*
+ * Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
+ *
+ * So far, the only CPU in which this option has been used is the
+ * HP PA-RISC. The HP C compiler and gcc both implicitly use the
+ * floating point registers to perform integer multiplies. If
+ * a function which you would not think utilize the FP unit DOES,
+ * then one can not easily predict which tasks will use the FP hardware.
+ * In this case, this option should be TRUE.
+ *
+ * If CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
+ */
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+
+/*
+ * Should the IDLE task have a floating point context?
+ *
+ * If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
+ * and it has a floating point context which is switched in and out.
+ * If FALSE, then the IDLE task does not have a floating point context.
+ *
+ * Setting this to TRUE negatively impacts the time required to preempt
+ * the IDLE task from an interrupt because the floating point context
+ * must be saved as part of the preemption.
+ */
+
+#define CPU_IDLE_TASK_IS_FP FALSE
+
+/*
+ * Should the saving of the floating point registers be deferred
+ * until a context switch is made to another different floating point
+ * task?
+ *
+ * If TRUE, then the floating point context will not be stored until
+ * necessary. It will remain in the floating point registers and not
+ * disturned until another floating point task is switched to.
+ *
+ * If FALSE, then the floating point context is saved when a floating
+ * point task is switched out and restored when the next floating point
+ * task is restored. The state of the floating point registers between
+ * those two operations is not specified.
+ *
+ * If the floating point context does NOT have to be saved as part of
+ * interrupt dispatching, then it should be safe to set this to TRUE.
+ *
+ * Setting this flag to TRUE results in using a different algorithm
+ * for deciding when to save and restore the floating point context.
+ * The deferred FP switch algorithm minimizes the number of times
+ * the FP context is saved and restored. The FP context is not saved
+ * until a context switch is made to another, different FP task.
+ * Thus in a system with only one FP task, the FP context will never
+ * be saved or restored.
+ */
+
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+/*
+ * Does this port provide a CPU dependent IDLE task implementation?
+ *
+ * If TRUE, then the routine _CPU_Internal_threads_Idle_thread_body
+ * must be provided and is the default IDLE thread body instead of
+ * _Internal_threads_Idle_thread_body.
+ *
+ * If FALSE, then use the generic IDLE thread body if the BSP does
+ * not provide one.
+ *
+ * This is intended to allow for supporting processors which have
+ * a low power or idle mode. When the IDLE thread is executed, then
+ * the CPU can be powered down.
+ *
+ * The order of precedence for selecting the IDLE thread body is:
+ *
+ * 1. BSP provided
+ * 2. CPU dependent (if provided)
+ * 3. generic (if no BSP and no CPU dependent)
+ */
+
+/* we can use the low power wait instruction for the IDLE thread */
+#define CPU_PROVIDES_IDLE_THREAD_BODY TRUE
+
+/*
+ * Does the stack grow up (toward higher addresses) or down
+ * (toward lower addresses)?
+ *
+ * If TRUE, then the grows upward.
+ * If FALSE, then the grows toward smaller addresses.
+ */
+
+/* our stack grows down */
+#define CPU_STACK_GROWS_UP FALSE
+
+/*
+ * The following is the variable attribute used to force alignment
+ * of critical RTEMS structures. On some processors it may make
+ * sense to have these aligned on tighter boundaries than
+ * the minimum requirements of the compiler in order to have as
+ * much of the critical data area as possible in a cache line.
+ *
+ * The placement of this macro in the declaration of the variables
+ * is based on the syntactically requirements of the GNU C
+ * "__attribute__" extension. For example with GNU C, use
+ * the following to force a structures to a 32 byte boundary.
+ *
+ * __attribute__ ((aligned (32)))
+ *
+ * NOTE: Currently only the Priority Bit Map table uses this feature.
+ * To benefit from using this, the data must be heavily
+ * used so it will stay in the cache and used frequently enough
+ * in the executive to justify turning this on.
+ */
+
+/* our cache line size is 16 bytes */
+#if __GNUC__
+#define CPU_STRUCTURE_ALIGNMENT __attribute__ ((aligned (16)))
+#else
+#define CPU_STRUCTURE_ALIGNMENT
+#endif
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+/*
+ * The following defines the number of bits actually used in the
+ * interrupt field of the task mode. How those bits map to the
+ * CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
+ */
+
+#define CPU_MODES_INTERRUPT_MASK 0x00000001
+
+/*
+ * Processor defined structures
+ *
+ * Examples structures include the descriptor tables from the i386
+ * and the processor control structure on the i960ca.
+ */
+
+/* may need to put some structures here. */
+
+/*
+ * Contexts
+ *
+ * Generally there are 2 types of context to save.
+ * 1. Interrupt registers to save
+ * 2. Task level registers to save
+ *
+ * This means we have the following 3 context items:
+ * 1. task level context stuff:: Context_Control
+ * 2. floating point task stuff:: Context_Control_fp
+ * 3. special interrupt level context :: Context_Control_interrupt
+ *
+ * On some processors, it is cost-effective to save only the callee
+ * preserved registers during a task context switch. This means
+ * that the ISR code needs to save those registers which do not
+ * persist across function calls. It is not mandatory to make this
+ * distinctions between the caller/callee saves registers for the
+ * purpose of minimizing context saved during task switch and on interrupts.
+ * If the cost of saving extra registers is minimal, simplicity is the
+ * choice. Save the same context on interrupt entry as for tasks in
+ * this case.
+ *
+ * Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
+ * care should be used in designing the context area.
+ *
+ * On some CPUs with hardware floating point support, the Context_Control_fp
+ * structure will not be used or it simply consist of an array of a
+ * fixed number of bytes. This is done when the floating point context
+ * is dumped by a "FP save context" type instruction and the format
+ * is not really defined by the CPU. In this case, there is no need
+ * to figure out the exact format -- only the size. Of course, although
+ * this is enough information for RTEMS, it is probably not enough for
+ * a debugger such as gdb. But that is another problem.
+ */
+
+/* WARNING: If this structure is modified, the constants in cpu.h must be updated. */
+typedef struct {
+ unsigned64 s0;
+ unsigned64 s1;
+ unsigned64 s2;
+ unsigned64 s3;
+ unsigned64 s4;
+ unsigned64 s5;
+ unsigned64 s6;
+ unsigned64 s7;
+ unsigned64 sp;
+ unsigned64 fp;
+ unsigned64 ra;
+ unsigned64 c0_sr;
+ unsigned64 c0_epc;
+} Context_Control;
+
+/* WARNING: If this structure is modified, the constants in cpu.h must be updated. */
+typedef struct {
+ unsigned32 fp0;
+ unsigned32 fp1;
+ unsigned32 fp2;
+ unsigned32 fp3;
+ unsigned32 fp4;
+ unsigned32 fp5;
+ unsigned32 fp6;
+ unsigned32 fp7;
+ unsigned32 fp8;
+ unsigned32 fp9;
+ unsigned32 fp10;
+ unsigned32 fp11;
+ unsigned32 fp12;
+ unsigned32 fp13;
+ unsigned32 fp14;
+ unsigned32 fp15;
+ unsigned32 fp16;
+ unsigned32 fp17;
+ unsigned32 fp18;
+ unsigned32 fp19;
+ unsigned32 fp20;
+ unsigned32 fp21;
+ unsigned32 fp22;
+ unsigned32 fp23;
+ unsigned32 fp24;
+ unsigned32 fp25;
+ unsigned32 fp26;
+ unsigned32 fp27;
+ unsigned32 fp28;
+ unsigned32 fp29;
+ unsigned32 fp30;
+ unsigned32 fp31;
+} Context_Control_fp;
+
+typedef struct {
+ unsigned32 special_interrupt_register;
+} CPU_Interrupt_frame;
+
+
+/*
+ * The following table contains the information required to configure
+ * the mips processor specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ unsigned32 some_other_cpu_dependent_info;
+} rtems_cpu_table;
+
+/*
+ * This variable is optional. It is used on CPUs on which it is difficult
+ * to generate an "uninitialized" FP context. It is filled in by
+ * _CPU_Initialize and copied into the task's FP context area during
+ * _CPU_Context_Initialize.
+ */
+
+SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
+
+/*
+ * On some CPUs, RTEMS supports a software managed interrupt stack.
+ * This stack is allocated by the Interrupt Manager and the switch
+ * is performed in _ISR_Handler. These variables contain pointers
+ * to the lowest and highest addresses in the chunk of memory allocated
+ * for the interrupt stack. Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent
+ * code the option of picking the version it wants to use.
+ *
+ * NOTE: These two variables are required if the macro
+ * CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+ */
+
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+/*
+ * With some compilation systems, it is difficult if not impossible to
+ * call a high-level language routine from assembly language. This
+ * is especially true of commercial Ada compilers and name mangling
+ * C++ ones. This variable can be optionally defined by the CPU porter
+ * and contains the address of the routine _Thread_Dispatch. This
+ * can make it easier to invoke that routine at the end of the interrupt
+ * sequence (if a dispatch is necessary).
+ */
+
+SCORE_EXTERN void (*_CPU_Thread_dispatch_pointer)();
+
+/*
+ * Nothing prevents the porter from declaring more CPU specific variables.
+ */
+
+/* XXX: if needed, put more variables here */
+
+/*
+ * The size of the floating point context area. On some CPUs this
+ * will not be a "sizeof" because the format of the floating point
+ * area is not defined -- only the size is. This is usually on
+ * CPUs with a "floating point save context" instruction.
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/*
+ * Amount of extra stack (above minimum stack size) required by
+ * system initialization thread. Remember that in a multiprocessor
+ * system the system intialization thread becomes the MP server thread.
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
+
+/*
+ * This defines the number of entries in the ISR_Vector_table managed
+ * by RTEMS.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 8
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Should be large enough to run all RTEMS tests. This insures
+ * that a "reasonable" small application should not have any problems.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE (2048*sizeof(unsigned32))
+
+/*
+ * CPU's worst alignment requirement for data types on a byte boundary. This
+ * alignment does not take into account the requirements for the stack.
+ */
+
+#define CPU_ALIGNMENT 8
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * heap handler. This alignment requirement may be stricter than that
+ * for the data types alignment specified by CPU_ALIGNMENT. It is
+ * common for the heap to follow the same alignment requirement as
+ * CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict enough for the heap,
+ * then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for memory
+ * buffers allocated by the partition manager. This alignment requirement
+ * may be stricter than that for the data types alignment specified by
+ * CPU_ALIGNMENT. It is common for the partition to follow the same
+ * alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict
+ * enough for the partition, then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * stack. This alignment requirement may be stricter than that for the
+ * data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
+ * is strict enough for the stack, then this should be set to 0.
+ *
+ * NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
+ */
+
+#define CPU_STACK_ALIGNMENT CPU_ALIGNMENT
+
+/* ISR handler macros */
+
+/*
+ * Disable all interrupts for an RTEMS critical section. The previous
+ * level is returned in _level.
+ */
+
+#define _CPU_ISR_Disable( _int_level ) \
+ do{ \
+ _int_level = mips_disable_interrupts(); \
+ }while(0)
+
+/*
+ * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
+ * This indicates the end of an RTEMS critical section. The parameter
+ * _level is not modified.
+ */
+
+#define _CPU_ISR_Enable( _level ) \
+ do{ \
+ mips_enable_interrupts(_level); \
+ }while(0)
+
+/*
+ * This temporarily restores the interrupt to _level before immediately
+ * disabling them again. This is used to divide long RTEMS critical
+ * sections into two or more parts. The parameter _level is not
+ * modified.
+ */
+
+#define _CPU_ISR_Flash( _xlevel ) \
+ do{ \
+ int _scratch; \
+ _CPU_ISR_Enable( _xlevel ); \
+ _CPU_ISR_Disable( _scratch ); \
+ }while(0)
+
+/*
+ * Map interrupt level in task mode onto the hardware that the CPU
+ * actually provides. Currently, interrupt levels which do not
+ * map onto the CPU in a generic fashion are undefined. Someday,
+ * it would be nice if these were "mapped" by the application
+ * via a callout. For example, m68k has 8 levels 0 - 7, levels
+ * 8 - 255 would be available for bsp/application specific meaning.
+ * This could be used to manage a programmable interrupt controller
+ * via the rtems_task_mode directive.
+ */
+extern void _CPU_ISR_Set_level( unsigned32 _new_level );
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/* Context handler macros */
+
+/*
+ * Initialize the context to a state suitable for starting a
+ * task after a context restore operation. Generally, this
+ * involves:
+ *
+ * - setting a starting address
+ * - preparing the stack
+ * - preparing the stack and frame pointers
+ * - setting the proper interrupt level in the context
+ * - initializing the floating point context
+ *
+ * This routine generally does not set any unnecessary register
+ * in the context. The state of the "general data" registers is
+ * undefined at task start time.
+ *
+ * NOTE: This is_fp parameter is TRUE if the thread is to be a floating
+ * point thread. This is typically only used on CPUs where the
+ * FPU may be easily disabled by software such as on the SPARC
+ * where the PSR contains an enable FPU bit.
+ */
+
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point, _is_fp ) \
+ { \
+ unsigned32 _stack_tmp = (unsigned32)(_stack_base) + (_size) - CPU_STACK_ALIGNMENT; \
+ _stack_tmp &= ~(CPU_STACK_ALIGNMENT - 1); \
+ (_the_context)->sp = _stack_tmp; \
+ (_the_context)->fp = _stack_tmp; \
+ (_the_context)->ra = (unsigned64)_entry_point; \
+ (_the_context)->c0_sr = 0; \
+ }
+
+/*
+ * This routine is responsible for somehow restarting the currently
+ * executing task. If you are lucky, then all that is necessary
+ * is restoring the context. Otherwise, there will need to be
+ * a special assembly routine which does something special in this
+ * case. Context_Restore should work most of the time. It will
+ * not work if restarting self conflicts with the stack frame
+ * assumptions of restoring a context.
+ */
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+/*
+ * The purpose of this macro is to allow the initial pointer into
+ * A floating point context area (used to save the floating point
+ * context) to be at an arbitrary place in the floating point
+ * context area.
+ *
+ * This is necessary because some FP units are designed to have
+ * their context saved as a stack which grows into lower addresses.
+ * Other FP units can be saved by simply moving registers into offsets
+ * from the base of the context area. Finally some FP units provide
+ * a "dump context" instruction which could fill in from high to low
+ * or low to high based on the whim of the CPU designers.
+ */
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+/*
+ * This routine initializes the FP context area passed to it to.
+ * There are a few standard ways in which to initialize the
+ * floating point context. The code included for this macro assumes
+ * that this is a CPU in which a "initial" FP context was saved into
+ * _CPU_Null_fp_context and it simply copies it to the destination
+ * context passed to it.
+ *
+ * Other models include (1) not doing anything, and (2) putting
+ * a "null FP status word" in the correct place in the FP context.
+ */
+
+#define _CPU_Context_Initialize_fp( _destination ) \
+ { \
+ *((Context_Control_fp *) *((void **) _destination)) = _CPU_Null_fp_context; \
+ }
+
+/* end of Context handler macros */
+
+/* Fatal Error manager macros */
+
+/*
+ * This routine copies _error into a known place -- typically a stack
+ * location or a register, optionally disables interrupts, and
+ * halts/stops the CPU.
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ { \
+ mips_disable_global_interrupts(); \
+ mips_fatal_error(_error); \
+ }
+
+/* end of Fatal Error manager macros */
+
+/* Bitfield handler macros */
+
+/*
+ * This routine sets _output to the bit number of the first bit
+ * set in _value. _value is of CPU dependent type Priority_Bit_map_control.
+ * This type may be either 16 or 32 bits wide although only the 16
+ * least significant bits will be used.
+ *
+ * There are a number of variables in using a "find first bit" type
+ * instruction.
+ *
+ * (1) What happens when run on a value of zero?
+ * (2) Bits may be numbered from MSB to LSB or vice-versa.
+ * (3) The numbering may be zero or one based.
+ * (4) The "find first bit" instruction may search from MSB or LSB.
+ *
+ * RTEMS guarantees that (1) will never happen so it is not a concern.
+ * (2),(3), (4) are handled by the macros _CPU_Priority_mask() and
+ * _CPU_Priority_bits_index(). These three form a set of routines
+ * which must logically operate together. Bits in the _value are
+ * set and cleared based on masks built by _CPU_Priority_mask().
+ * The basic major and minor values calculated by _Priority_Major()
+ * and _Priority_Minor() are "massaged" by _CPU_Priority_bits_index()
+ * to properly range between the values returned by the "find first bit"
+ * instruction. This makes it possible for _Priority_Get_highest() to
+ * calculate the major and directly index into the minor table.
+ * This mapping is necessary to ensure that 0 (a high priority major/minor)
+ * is the first bit found.
+ *
+ * This entire "find first bit" and mapping process depends heavily
+ * on the manner in which a priority is broken into a major and minor
+ * components with the major being the 4 MSB of a priority and minor
+ * the 4 LSB. Thus (0 << 4) + 0 corresponds to priority 0 -- the highest
+ * priority. And (15 << 4) + 14 corresponds to priority 254 -- the next
+ * to the lowest priority.
+ *
+ * If your CPU does not have a "find first bit" instruction, then
+ * there are ways to make do without it. Here are a handful of ways
+ * to implement this in software:
+ *
+ * - a series of 16 bit test instructions
+ * - a "binary search using if's"
+ * - _number = 0
+ * if _value > 0x00ff
+ * _value >>=8
+ * _number = 8;
+ *
+ * if _value > 0x0000f
+ * _value >=8
+ * _number += 4
+ *
+ * _number += bit_set_table[ _value ]
+ *
+ * where bit_set_table[ 16 ] has values which indicate the first
+ * bit set
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ (_output) = 0; /* do something to prevent warnings */ \
+ }
+
+#endif
+
+/* end of Bitfield handler macros */
+
+/*
+ * This routine builds the mask which corresponds to the bit fields
+ * as searched by _CPU_Bitfield_Find_first_bit(). See the discussion
+ * for that routine.
+ */
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 1 << (_bit_number) )
+
+#endif
+
+/*
+ * This routine translates the bit numbers returned by
+ * _CPU_Bitfield_Find_first_bit() into something suitable for use as
+ * a major or minor component of a priority. See the discussion
+ * for that routine.
+ */
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+#endif
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Install_interrupt_stack
+ *
+ * This routine installs the hardware interrupt stack pointer.
+ *
+ * NOTE: It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
+ * is TRUE.
+ */
+
+void _CPU_Install_interrupt_stack( void );
+
+/*
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * This routine is the CPU dependent IDLE thread body.
+ *
+ * NOTE: It need only be provided if CPU_PROVIDES_IDLE_THREAD_BODY
+ * is TRUE.
+ */
+
+void _CPU_Thread_Idle_body( void );
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+/* The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version will work on any processor, but if there is a better
+ * way for your CPU PLEASE use it. The most common way to do this is to:
+ *
+ * swap least significant two bytes with 16-bit rotate
+ * swap upper and lower 16-bits
+ * swap most significant two bytes with 16-bit rotate
+ *
+ * Some CPUs have special instructions which swap a 32-bit quantity in
+ * a single instruction (e.g. i486). It is probably best to avoid
+ * an "endian swapping control bit" in the CPU. One good reason is
+ * that interrupts would probably have to be disabled to insure that
+ * an interrupt does not try to access the same "chunk" with the wrong
+ * endian. Another good reason is that on some CPUs, the endian bit
+ * endianness for ALL fetches -- both code and data -- so the code
+ * will be fetched incorrectly.
+ */
+
+static inline unsigned int CPU_swap_u32(
+ unsigned int value
+)
+{
+ unsigned32 byte1, byte2, byte3, byte4, swapped;
+
+ byte4 = (value >> 24) & 0xff;
+ byte3 = (value >> 16) & 0xff;
+ byte2 = (value >> 8) & 0xff;
+ byte1 = value & 0xff;
+
+ swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
+ return( swapped );
+}
+
+/*
+ * Miscellaneous prototypes
+ *
+ * NOTE: The names should have mips64orion in them.
+ */
+
+void disable_int( unsigned32 mask );
+void enable_int( unsigned32 mask );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/exec/score/cpu/mips64orion/cpu_asm.S b/c/src/exec/score/cpu/mips64orion/cpu_asm.S
new file mode 100644
index 0000000000..1f23a9ca15
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/cpu_asm.S
@@ -0,0 +1,972 @@
+/* cpu_asm.S
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.s:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)cpu_asm.S 08/20/96 1.15 */
+
+#include "cpu_asm.h"
+
+#include "iregdef.h"
+#include "idtcpu.h"
+
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+#define ENDFRAME(name) \
+ .end name
+
+
+#define EXCP_STACK_SIZE (NREGS*R_SZ)
+
+#if __ghs__
+#define sd sw
+#define ld lw
+#define dmtc0 mtc0
+#define dsll sll
+#define dmfc0 mfc0
+#endif
+
+#if 1 /* 32 bit unsigned32 types */
+#define sint sw
+#define lint lw
+#define stackadd addiu
+#define intadd addu
+#define SZ_INT 4
+#define SZ_INT_POW2 2
+#else /* 64 bit unsigned32 types */
+#define sint dw
+#define lint dw
+#define stackadd daddiu
+#define intadd daddu
+#define SZ_INT 8
+#define SZ_INT_POW2 3
+#endif
+
+#ifdef __GNUC__
+#define EXTERN(x,size) .extern x,size
+#else
+#define EXTERN(x,size)
+#endif
+
+/* NOTE: these constants must match the Context_Control structure in cpu.h */
+#define S0_OFFSET 0
+#define S1_OFFSET 1
+#define S2_OFFSET 2
+#define S3_OFFSET 3
+#define S4_OFFSET 4
+#define S5_OFFSET 5
+#define S6_OFFSET 6
+#define S7_OFFSET 7
+#define SP_OFFSET 8
+#define FP_OFFSET 9
+#define RA_OFFSET 10
+#define C0_SR_OFFSET 11
+#define C0_EPC_OFFSET 12
+
+/* NOTE: these constants must match the Context_Control_fp structure in cpu.h */
+#define FP0_OFFSET 0
+#define FP1_OFFSET 1
+#define FP2_OFFSET 2
+#define FP3_OFFSET 3
+#define FP4_OFFSET 4
+#define FP5_OFFSET 5
+#define FP6_OFFSET 6
+#define FP7_OFFSET 7
+#define FP8_OFFSET 8
+#define FP9_OFFSET 9
+#define FP10_OFFSET 10
+#define FP11_OFFSET 11
+#define FP12_OFFSET 12
+#define FP13_OFFSET 13
+#define FP14_OFFSET 14
+#define FP15_OFFSET 15
+#define FP16_OFFSET 16
+#define FP17_OFFSET 17
+#define FP18_OFFSET 18
+#define FP19_OFFSET 19
+#define FP20_OFFSET 20
+#define FP21_OFFSET 21
+#define FP22_OFFSET 22
+#define FP23_OFFSET 23
+#define FP24_OFFSET 24
+#define FP25_OFFSET 25
+#define FP26_OFFSET 26
+#define FP27_OFFSET 27
+#define FP28_OFFSET 28
+#define FP29_OFFSET 29
+#define FP30_OFFSET 30
+#define FP31_OFFSET 31
+
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+/* return the current exception level for the 4650 */
+FRAME(_CPU_ISR_Get_level,sp,0,ra)
+ mfc0 v0,C0_SR
+ nop
+ andi v0,SR_EXL
+ srl v0,1
+ j ra
+ENDFRAME(_CPU_ISR_Get_level)
+
+FRAME(_CPU_ISR_Set_level,sp,0,ra)
+ nop
+ mfc0 a0,C0_SR
+ nop
+ andi a0,SR_EXL
+ beqz a0,_CPU_ISR_Set_1 /* normalize a0 */
+ nop
+ li a0,1
+_CPU_ISR_Set_1:
+ beq v0,a0,_CPU_ISR_Set_exit /* if (current_level != new_level ) */
+ nop
+ bnez a0,_CPU_ISR_Set_2
+ nop
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_EXL
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* disable exception level */
+ nop
+ j ra
+ nop
+_CPU_ISR_Set_2:
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_IE
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ nop
+ ori t0,SR_EXL|SR_IE /* enable exception level */
+ nop
+ mtc0 t0,C0_SR
+ nop
+_CPU_ISR_Set_exit:
+ j ra
+ nop
+ENDFRAME(_CPU_ISR_Set_level)
+
+/*
+ * _CPU_Context_save_fp_context
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_save_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_save_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ swc1 $f0,FP0_OFFSET*4(a1)
+ swc1 $f1,FP1_OFFSET*4(a1)
+ swc1 $f2,FP2_OFFSET*4(a1)
+ swc1 $f3,FP3_OFFSET*4(a1)
+ swc1 $f4,FP4_OFFSET*4(a1)
+ swc1 $f5,FP5_OFFSET*4(a1)
+ swc1 $f6,FP6_OFFSET*4(a1)
+ swc1 $f7,FP7_OFFSET*4(a1)
+ swc1 $f8,FP8_OFFSET*4(a1)
+ swc1 $f9,FP9_OFFSET*4(a1)
+ swc1 $f10,FP10_OFFSET*4(a1)
+ swc1 $f11,FP11_OFFSET*4(a1)
+ swc1 $f12,FP12_OFFSET*4(a1)
+ swc1 $f13,FP13_OFFSET*4(a1)
+ swc1 $f14,FP14_OFFSET*4(a1)
+ swc1 $f15,FP15_OFFSET*4(a1)
+ swc1 $f16,FP16_OFFSET*4(a1)
+ swc1 $f17,FP17_OFFSET*4(a1)
+ swc1 $f18,FP18_OFFSET*4(a1)
+ swc1 $f19,FP19_OFFSET*4(a1)
+ swc1 $f20,FP20_OFFSET*4(a1)
+ swc1 $f21,FP21_OFFSET*4(a1)
+ swc1 $f22,FP22_OFFSET*4(a1)
+ swc1 $f23,FP23_OFFSET*4(a1)
+ swc1 $f24,FP24_OFFSET*4(a1)
+ swc1 $f25,FP25_OFFSET*4(a1)
+ swc1 $f26,FP26_OFFSET*4(a1)
+ swc1 $f27,FP27_OFFSET*4(a1)
+ swc1 $f28,FP28_OFFSET*4(a1)
+ swc1 $f29,FP29_OFFSET*4(a1)
+ swc1 $f30,FP30_OFFSET*4(a1)
+ swc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_save_fp)
+
+/*
+ * _CPU_Context_restore_fp_context
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_restore_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_restore_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ lwc1 $f0,FP0_OFFSET*4(a1)
+ lwc1 $f1,FP1_OFFSET*4(a1)
+ lwc1 $f2,FP2_OFFSET*4(a1)
+ lwc1 $f3,FP3_OFFSET*4(a1)
+ lwc1 $f4,FP4_OFFSET*4(a1)
+ lwc1 $f5,FP5_OFFSET*4(a1)
+ lwc1 $f6,FP6_OFFSET*4(a1)
+ lwc1 $f7,FP7_OFFSET*4(a1)
+ lwc1 $f8,FP8_OFFSET*4(a1)
+ lwc1 $f9,FP9_OFFSET*4(a1)
+ lwc1 $f10,FP10_OFFSET*4(a1)
+ lwc1 $f11,FP11_OFFSET*4(a1)
+ lwc1 $f12,FP12_OFFSET*4(a1)
+ lwc1 $f13,FP13_OFFSET*4(a1)
+ lwc1 $f14,FP14_OFFSET*4(a1)
+ lwc1 $f15,FP15_OFFSET*4(a1)
+ lwc1 $f16,FP16_OFFSET*4(a1)
+ lwc1 $f17,FP17_OFFSET*4(a1)
+ lwc1 $f18,FP18_OFFSET*4(a1)
+ lwc1 $f19,FP19_OFFSET*4(a1)
+ lwc1 $f20,FP20_OFFSET*4(a1)
+ lwc1 $f21,FP21_OFFSET*4(a1)
+ lwc1 $f22,FP22_OFFSET*4(a1)
+ lwc1 $f23,FP23_OFFSET*4(a1)
+ lwc1 $f24,FP24_OFFSET*4(a1)
+ lwc1 $f25,FP25_OFFSET*4(a1)
+ lwc1 $f26,FP26_OFFSET*4(a1)
+ lwc1 $f27,FP27_OFFSET*4(a1)
+ lwc1 $f28,FP28_OFFSET*4(a1)
+ lwc1 $f29,FP29_OFFSET*4(a1)
+ lwc1 $f30,FP30_OFFSET*4(a1)
+ lwc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_restore_fp)
+
+/* _CPU_Context_switch
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+/* void _CPU_Context_switch(
+ * Context_Control *run,
+ * Context_Control *heir
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_switch,sp,0,ra)
+
+ mfc0 t0,C0_SR
+ li t1,~SR_IE
+ sd t0,C0_SR_OFFSET*8(a0) /* save status register */
+ and t0,t1
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ ori t0,SR_EXL|SR_IE /* enable exception level to disable interrupts */
+ mtc0 t0,C0_SR
+
+ sd ra,RA_OFFSET*8(a0) /* save current context */
+ sd sp,SP_OFFSET*8(a0)
+ sd fp,FP_OFFSET*8(a0)
+ sd s0,S0_OFFSET*8(a0)
+ sd s1,S1_OFFSET*8(a0)
+ sd s2,S2_OFFSET*8(a0)
+ sd s3,S3_OFFSET*8(a0)
+ sd s4,S4_OFFSET*8(a0)
+ sd s5,S5_OFFSET*8(a0)
+ sd s6,S6_OFFSET*8(a0)
+ sd s7,S7_OFFSET*8(a0)
+ dmfc0 t0,C0_EPC
+ sd t0,C0_EPC_OFFSET*8(a0)
+
+_CPU_Context_switch_restore:
+ ld s0,S0_OFFSET*8(a1) /* restore context */
+ ld s1,S1_OFFSET*8(a1)
+ ld s2,S2_OFFSET*8(a1)
+ ld s3,S3_OFFSET*8(a1)
+ ld s4,S4_OFFSET*8(a1)
+ ld s5,S5_OFFSET*8(a1)
+ ld s6,S6_OFFSET*8(a1)
+ ld s7,S7_OFFSET*8(a1)
+ ld fp,FP_OFFSET*8(a1)
+ ld sp,SP_OFFSET*8(a1)
+ ld ra,RA_OFFSET*8(a1)
+ ld t0,C0_EPC_OFFSET*8(a1)
+ dmtc0 t0,C0_EPC
+ ld t0,C0_SR_OFFSET*8(a1)
+ andi t0,SR_EXL
+ bnez t0,_CPU_Context_1 /* set exception level from restore context */
+ li t0,~SR_EXL
+ mfc0 t1,C0_SR
+ nop
+ and t1,t0
+ mtc0 t1,C0_SR
+_CPU_Context_1:
+ j ra
+ nop
+ENDFRAME(_CPU_Context_switch)
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generally used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+#if 0
+void _CPU_Context_restore(
+ Context_Control *new_context
+)
+{
+}
+#endif
+
+FRAME(_CPU_Context_restore,sp,0,ra)
+ dadd a1,a0,zero
+ j _CPU_Context_switch_restore
+ nop
+ENDFRAME(_CPU_Context_restore)
+
+EXTERN(_ISR_Nest_level, SZ_INT)
+EXTERN(_Thread_Dispatch_disable_level,SZ_INT)
+EXTERN(_Context_Switch_necessary,SZ_INT)
+EXTERN(_ISR_Signals_to_thread_executing,SZ_INT)
+.extern _Thread_Dispatch
+.extern _ISR_Vector_table
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ */
+
+#if 0
+void _ISR_Handler()
+{
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ */
+#endif
+FRAME(_ISR_Handler,sp,0,ra)
+.set noreorder
+#if USE_IDTKIT
+/* IDT/Kit incorrectly adds 4 to EPC before returning. This compensates */
+ lreg k0, R_EPC*R_SZ(sp)
+ daddiu k0,k0,-4
+ sreg k0, R_EPC*R_SZ(sp)
+ lreg k0, R_CAUSE*R_SZ(sp)
+ li k1, ~CAUSE_BD
+ and k0, k1
+ sreg k0, R_CAUSE*R_SZ(sp)
+#endif
+
+/* save registers not already saved by IDT/sim */
+ stackadd sp,sp,-EXCP_STACK_SIZE /* store ra on the stack */
+
+ sreg ra, R_RA*R_SZ(sp)
+ sreg v0, R_V0*R_SZ(sp)
+ sreg v1, R_V1*R_SZ(sp)
+ sreg a0, R_A0*R_SZ(sp)
+ sreg a1, R_A1*R_SZ(sp)
+ sreg a2, R_A2*R_SZ(sp)
+ sreg a3, R_A3*R_SZ(sp)
+ sreg t0, R_T0*R_SZ(sp)
+ sreg t1, R_T1*R_SZ(sp)
+ sreg t2, R_T2*R_SZ(sp)
+ sreg t3, R_T3*R_SZ(sp)
+ sreg t4, R_T4*R_SZ(sp)
+ sreg t5, R_T5*R_SZ(sp)
+ sreg t6, R_T6*R_SZ(sp)
+ sreg t7, R_T7*R_SZ(sp)
+ mflo k0
+ sreg t8, R_T8*R_SZ(sp)
+ sreg k0, R_MDLO*R_SZ(sp)
+ sreg t9, R_T9*R_SZ(sp)
+ mfhi k0
+ sreg gp, R_GP*R_SZ(sp)
+ sreg fp, R_FP*R_SZ(sp)
+ sreg k0, R_MDHI*R_SZ(sp)
+ .set noat
+ sreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,-40 /* store ra on the stack */
+ sd ra,32(sp)
+
+/* determine if an interrupt generated this exception */
+ mfc0 k0,C0_CAUSE
+ and k1,k0,CAUSE_EXCMASK
+ bnez k1,_ISR_Handler_prom_exit /* not an external interrupt, pass exception to Monitor */
+ mfc0 k1,C0_SR
+ and k0,k1
+ and k0,CAUSE_IPMASK
+ beq k0,zero,_ISR_Handler_quick_exit /* external interrupt not enabled, ignore */
+ nop
+
+ /*
+ * save some or all context on stack
+ * may need to save some special interrupt information for exit
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ */
+#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ lint t0,_ISR_Nest_level
+ beq t0, zero, _ISR_Handler_1
+ nop
+ /* switch stacks */
+_ISR_Handler_1:
+#else
+ lint t0,_ISR_Nest_level
+#endif
+ /*
+ * _ISR_Nest_level++;
+ */
+ addi t0,t0,1
+ sint t0,_ISR_Nest_level
+ /*
+ * _Thread_Dispatch_disable_level++;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,1
+ sint t1,_Thread_Dispatch_disable_level
+#if 0
+ nop
+ j _ISR_Handler_4
+ nop
+ /*
+ * while ( interrupts_pending(cause_reg) ) {
+ * vector = BITFIELD_TO_INDEX(cause_reg);
+ * (*_ISR_Vector_table[ vector ])( vector );
+ * }
+ */
+_ISR_Handler_2:
+/* software interrupt priorities can be applied here */
+ li t1,-1
+/* convert bit field into interrupt index */
+_ISR_Handler_3:
+ andi t2,t0,1
+ addi t1,1
+ beql t2,zero,_ISR_Handler_3
+ dsrl t0,1
+ li t1,7
+ dsll t1,3 /* convert index to byte offset (*8) */
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+ j _ISR_Handler_5
+ nop
+_ISR_Handler_4:
+ mfc0 t0,C0_CAUSE
+ andi t0,CAUSE_IPMASK
+ bne t0,zero,_ISR_Handler_2
+ dsrl t0,t0,8
+_ISR_Handler_5:
+#else
+ nop
+ li t1,7
+ dsll t1,t1,SZ_INT_POW2
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+#endif
+ /*
+ * --_ISR_Nest_level;
+ */
+ lint t2,_ISR_Nest_level
+ addi t2,t2,-1
+ sint t2,_ISR_Nest_level
+ /*
+ * --_Thread_Dispatch_disable_level;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,-1
+ sint t1,_Thread_Dispatch_disable_level
+ /*
+ * if ( _Thread_Dispatch_disable_level || _ISR_Nest_level )
+ * goto the label "exit interrupt (simple case)"
+ */
+ or t0,t2,t1
+ bne t0,zero,_ISR_Handler_exit
+ nop
+ /*
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * restore stack
+ * #endif
+ *
+ * if ( !_Context_Switch_necessary && !_ISR_Signals_to_thread_executing )
+ * goto the label "exit interrupt (simple case)"
+ */
+ lint t0,_Context_Switch_necessary
+ lint t1,_ISR_Signals_to_thread_executing
+ or t0,t0,t1
+ beq t0,zero,_ISR_Handler_exit
+ nop
+
+ /*
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ */
+ jal _Thread_Dispatch
+ nop
+ /*
+ * prepare to get out of interrupt
+ * return from interrupt (maybe to _ISR_Dispatch)
+ *
+ * LABEL "exit interrupt (simple case):
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+_ISR_Handler_exit:
+ ld ra,32(sp)
+ stackadd sp,sp,40
+
+/* restore interrupt context from stack */
+ lreg k0, R_MDLO*R_SZ(sp)
+ mtlo k0
+ lreg k0, R_MDHI*R_SZ(sp)
+ lreg a2, R_A2*R_SZ(sp)
+ mthi k0
+ lreg a3, R_A3*R_SZ(sp)
+ lreg t0, R_T0*R_SZ(sp)
+ lreg t1, R_T1*R_SZ(sp)
+ lreg t2, R_T2*R_SZ(sp)
+ lreg t3, R_T3*R_SZ(sp)
+ lreg t4, R_T4*R_SZ(sp)
+ lreg t5, R_T5*R_SZ(sp)
+ lreg t6, R_T6*R_SZ(sp)
+ lreg t7, R_T7*R_SZ(sp)
+ lreg t8, R_T8*R_SZ(sp)
+ lreg t9, R_T9*R_SZ(sp)
+ lreg gp, R_GP*R_SZ(sp)
+ lreg fp, R_FP*R_SZ(sp)
+ lreg ra, R_RA*R_SZ(sp)
+ lreg a0, R_A0*R_SZ(sp)
+ lreg a1, R_A1*R_SZ(sp)
+ lreg v1, R_V1*R_SZ(sp)
+ lreg v0, R_V0*R_SZ(sp)
+ .set noat
+ lreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,EXCP_STACK_SIZE /* store ra on the stack */
+
+#if USE_IDTKIT
+/* we handled exception, so return non-zero value */
+ li v0,1
+#endif
+
+_ISR_Handler_quick_exit:
+#ifdef USE_IDTKIT
+ j ra
+#else
+ eret
+#endif
+ nop
+
+_ISR_Handler_prom_exit:
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ .set reorder
+
+ENDFRAME(_ISR_Handler)
+
+
+FRAME(mips_enable_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ or t0,t0,a0
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_interrupts)
+
+FRAME(mips_disable_interrupts,sp,0,ra)
+ mfc0 v0,C0_SR /* get status reg */
+ li t1,SR_IMASK /* t1 = load interrupt mask word */
+ not t0,t1 /* t0 = ~t1 */
+ and t0,v0 /* clear imask bits */
+ mtc0 t0,C0_SR /* save status reg */
+ and v0,t1 /* mask return value (only return imask bits) */
+ jr ra
+ nop
+ENDFRAME(mips_disable_interrupts)
+
+FRAME(mips_enable_global_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ ori t0,SR_IE
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_global_interrupts)
+
+FRAME(mips_disable_global_interrupts,sp,0,ra)
+ li t1,SR_IE
+ mfc0 t0,C0_SR /* get status reg */
+ not t1
+ and t0,t1
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_disable_global_interrupts)
+
+/* return the value of the status register in v0. Used for debugging */
+FRAME(mips_get_sr,sp,0,ra)
+ mfc0 v0,C0_SR
+ j ra
+ nop
+ENDFRAME(mips_get_sr)
+
+FRAME(mips_break,sp,0,ra)
+#if 1
+ break 0x0
+ j mips_break
+#else
+ j ra
+#endif
+ nop
+ENDFRAME(mips_break)
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+FRAME(_CPU_Thread_Idle_body,sp,0,ra)
+ wait /* enter low power mode */
+ j _CPU_Thread_Idle_body
+ nop
+ENDFRAME(_CPU_Thread_Idle_body)
+
+#define VEC_CODE_LENGTH 10*4
+
+/**************************************************************************
+**
+** init_exc_vecs() - moves the exception code into the addresses
+** reserved for exception vectors
+**
+** UTLB Miss exception vector at address 0x80000000
+**
+** General exception vector at address 0x80000080
+**
+** RESET exception vector is at address 0xbfc00000
+**
+***************************************************************************/
+
+#define INITEXCFRM ((2*4)+4) /* ra + 2 arguments */
+FRAME(init_exc_vecs,sp,0,ra)
+/* This code yanked from SIM */
+#if defined(CPU_R3000)
+ .set noreorder
+ la t1,exc_utlb_code
+ la t2,exc_norm_code
+ li t3,UT_VEC
+ li t4,E_VEC
+ li t5,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ lw t7,0(t2)
+ sw t6,0(t3)
+ sw t7,0(t4)
+ addiu t1,4
+ addiu t3,4
+ addiu t4,4
+ subu t5,4
+ bne t5,zero,1b
+ addiu t2,4
+ move t5,ra # assumes clear_cache doesnt use t5
+ li a0,UT_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ nop
+ li a0,E_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ move ra,t5 # restore ra
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ .set reorder
+ move t5,ra # assumes clear_cache doesnt use t5
+
+ /* TLB exception vector */
+ la t1,exc_tlb_code
+ li t2,T_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,T_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ la t1,exc_xtlb_code
+ li t2,X_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ /* extended TLB exception vector */
+ li a0,X_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* cache error exception vector */
+ la t1,exc_cache_code
+ li t2,C_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,C_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* normal exception vector */
+ la t1,exc_norm_code
+ li t2,E_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,E_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ move ra,t5 # restore ra
+ j ra
+#endif
+ENDFRAME(init_exc_vecs)
+
+
+#if defined(CPU_R4000)
+FRAME(exc_tlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_tlb_code)
+
+
+FRAME(exc_xtlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_xtlb_code)
+
+
+FRAME(exc_cache_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_cache_code)
+
+
+FRAME(exc_norm_code,sp,0,ra)
+ la k0, _ISR_Handler /* generic external int hndlr */
+ j k0
+ nop
+ subu sp, EXCP_STACK_SIZE /* set up local stack frame */
+ENDFRAME(exc_norm_code)
+#endif
+
+/**************************************************************************
+**
+** enable_int(mask) - enables interrupts - mask is positioned so it only
+** needs to be or'ed into the status reg. This
+** also does some other things !!!! caution should
+** be used if invoking this while in the middle
+** of a debugging session where the client may have
+** nested interrupts.
+**
+****************************************************************************/
+FRAME(enable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ or a0,1
+ or t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ .set reorder
+ENDFRAME(enable_int)
+
+
+/***************************************************************************
+**
+** disable_int(mask) - disable the interrupt - mask is the complement
+** of the bits to be cleared - i.e. to clear ext int
+** 5 the mask would be - 0xffff7fff
+**
+****************************************************************************/
+FRAME(disable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ nop
+ and t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ENDFRAME(disable_int)
+
+
diff --git a/c/src/exec/score/cpu/mips64orion/cpu_asm.h b/c/src/exec/score/cpu/mips64orion/cpu_asm.h
new file mode 100644
index 0000000000..f443c55b00
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/cpu_asm.h
@@ -0,0 +1,115 @@
+/*
+ * cpu_asm.h
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+/* @(#)cpu_asm.h 08/20/96 1.2 */
+
+#ifndef __CPU_ASM_h
+#define __CPU_ASM_h
+
+/* pull in the generated offsets */
+
+/* #include <rtems/score/offsets.h> */
+
+/*
+ * Hardware General Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Floating Point Registers
+ */
+
+#define R_FP0 0
+#define R_FP1 1
+#define R_FP2 2
+#define R_FP3 3
+#define R_FP4 4
+#define R_FP5 5
+#define R_FP6 6
+#define R_FP7 7
+#define R_FP8 8
+#define R_FP9 9
+#define R_FP10 10
+#define R_FP11 11
+#define R_FP12 12
+#define R_FP13 13
+#define R_FP14 14
+#define R_FP15 15
+#define R_FP16 16
+#define R_FP17 17
+#define R_FP18 18
+#define R_FP19 19
+#define R_FP20 20
+#define R_FP21 21
+#define R_FP22 22
+#define R_FP23 23
+#define R_FP24 24
+#define R_FP25 25
+#define R_FP26 26
+#define R_FP27 27
+#define R_FP28 28
+#define R_FP29 29
+#define R_FP30 30
+#define R_FP31 31
+
+/*
+ * Hardware Control Registers
+ */
+
+/* put something here */
+
+/*
+ * Calling Convention
+ */
+
+/* put something here */
+
+/*
+ * Temporary registers
+ */
+
+/* put something here */
+
+/*
+ * Floating Point Registers - SW Conventions
+ */
+
+/* put something here */
+
+/*
+ * Temporary floating point registers
+ */
+
+/* put something here */
+
+#endif
+
+/* end of file */
diff --git a/c/src/exec/score/cpu/mips64orion/idtcpu.h b/c/src/exec/score/cpu/mips64orion/idtcpu.h
new file mode 100644
index 0000000000..f921e85ef6
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/idtcpu.h
@@ -0,0 +1,440 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtcpu.h -- cpu related defines
+*/
+
+#ifndef _IDTCPU_H__
+#define _IDTCPU_H__
+
+/*
+ * 950313: Ketan added Register definition for XContext reg.
+ * added define for WAIT instruction.
+ * 950421: Ketan added Register definition for Config reg (R3081)
+ */
+
+/*
+** memory configuration and mapping
+*/
+#define K0BASE 0x80000000
+#define K0SIZE 0x20000000
+#define K1BASE 0xa0000000
+#define K1SIZE 0x20000000
+#define K2BASE 0xc0000000
+#define K2SIZE 0x20000000
+#if defined(CPU_R4000)
+#define KSBASE 0xe0000000
+#define KSSIZE 0x20000000
+#endif
+
+#define KUBASE 0
+#define KUSIZE 0x80000000
+
+/*
+** Exception Vectors
+*/
+#if defined(CPU_R3000)
+#define UT_VEC K0BASE /* utlbmiss vector */
+#define E_VEC (K0BASE+0x80) /* exception vevtor */
+#endif
+#if defined(CPU_R4000)
+#define T_VEC (K0BASE+0x000) /* tlbmiss vector */
+#define X_VEC (K0BASE+0x080) /* xtlbmiss vector */
+#define C_VEC (K0BASE+0x100) /* cache error vector */
+#define E_VEC (K0BASE+0x180) /* exception vector */
+#endif
+#define R_VEC (K1BASE+0x1fc00000) /* reset vector */
+
+/*
+** Address conversion macros
+*/
+#ifdef CLANGUAGE
+#define CAST(as) (as)
+#else
+#define CAST(as)
+#endif
+#define K0_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */
+#define K1_TO_K0(x) (CAST(unsigned)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */
+#define K0_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg0 to physical */
+#define K1_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg1 to physical */
+#define PHYS_TO_K0(x) (CAST(unsigned)(x)|0x80000000) /* physical to kseg0 */
+#define PHYS_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* physical to kseg1 */
+
+/*
+** Cache size constants
+*/
+#define MINCACHE 0x200 /* 512 For 3041. */
+#define MAXCACHE 0x40000 /* 256*1024 256k */
+
+#if defined(CPU_R4000)
+/* R4000 configuration register definitions */
+#define CFG_CM 0x80000000 /* Master-Checker mode */
+#define CFG_ECMASK 0x70000000 /* System Clock Ratio */
+#define CFG_ECBY2 0x00000000 /* divide by 2 */
+#define CFG_ECBY3 0x10000000 /* divide by 3 */
+#define CFG_ECBY4 0x20000000 /* divide by 4 */
+#define CFG_EPMASK 0x0f000000 /* Transmit data pattern */
+#define CFG_EPD 0x00000000 /* D */
+#define CFG_EPDDX 0x01000000 /* DDX */
+#define CFG_EPDDXX 0x02000000 /* DDXX */
+#define CFG_EPDXDX 0x03000000 /* DXDX */
+#define CFG_EPDDXXX 0x04000000 /* DDXXX */
+#define CFG_EPDDXXXX 0x05000000 /* DDXXXX */
+#define CFG_EPDXXDXX 0x06000000 /* DXXDXX */
+#define CFG_EPDDXXXXX 0x07000000 /* DDXXXXX */
+#define CFG_EPDXXXDXXX 0x08000000 /* DXXXDXXX */
+#define CFG_SBMASK 0x00c00000 /* Secondary cache block size */
+#define CFG_SBSHIFT 22
+#define CFG_SB4 0x00000000 /* 4 words */
+#define CFG_SB8 0x00400000 /* 8 words */
+#define CFG_SB16 0x00800000 /* 16 words */
+#define CFG_SB32 0x00c00000 /* 32 words */
+#define CFG_SS 0x00200000 /* Split secondary cache */
+#define CFG_SW 0x00100000 /* Secondary cache port width */
+#define CFG_EWMASK 0x000c0000 /* System port width */
+#define CFG_EWSHIFT 18
+#define CFG_EW64 0x00000000 /* 64 bit */
+#define CFG_EW32 0x00010000 /* 32 bit */
+#define CFG_SC 0x00020000 /* Secondary cache absent */
+#define CFG_SM 0x00010000 /* Dirty Shared mode disabled */
+#define CFG_BE 0x00008000 /* Big Endian */
+#define CFG_EM 0x00004000 /* ECC mode enable */
+#define CFG_EB 0x00002000 /* Block ordering */
+#define CFG_ICMASK 0x00000e00 /* Instruction cache size */
+#define CFG_ICSHIFT 9
+#define CFG_DCMASK 0x000001c0 /* Data cache size */
+#define CFG_DCSHIFT 6
+#define CFG_IB 0x00000020 /* Instruction cache block size */
+#define CFG_DB 0x00000010 /* Data cache block size */
+#define CFG_CU 0x00000008 /* Update on Store Conditional */
+#define CFG_K0MASK 0x00000007 /* KSEG0 coherency algorithm */
+
+/*
+ * R4000 primary cache mode
+ */
+#define CFG_C_UNCACHED 2
+#define CFG_C_NONCOHERENT 3
+#define CFG_C_COHERENTXCL 4
+#define CFG_C_COHERENTXCLW 5
+#define CFG_C_COHERENTUPD 6
+
+/*
+ * R4000 cache operations (should be in assembler...?)
+ */
+#define Index_Invalidate_I 0x0 /* 0 0 */
+#define Index_Writeback_Inv_D 0x1 /* 0 1 */
+#define Index_Invalidate_SI 0x2 /* 0 2 */
+#define Index_Writeback_Inv_SD 0x3 /* 0 3 */
+#define Index_Load_Tag_I 0x4 /* 1 0 */
+#define Index_Load_Tag_D 0x5 /* 1 1 */
+#define Index_Load_Tag_SI 0x6 /* 1 2 */
+#define Index_Load_Tag_SD 0x7 /* 1 3 */
+#define Index_Store_Tag_I 0x8 /* 2 0 */
+#define Index_Store_Tag_D 0x9 /* 2 1 */
+#define Index_Store_Tag_SI 0xA /* 2 2 */
+#define Index_Store_Tag_SD 0xB /* 2 3 */
+#define Create_Dirty_Exc_D 0xD /* 3 1 */
+#define Create_Dirty_Exc_SD 0xF /* 3 3 */
+#define Hit_Invalidate_I 0x10 /* 4 0 */
+#define Hit_Invalidate_D 0x11 /* 4 1 */
+#define Hit_Invalidate_SI 0x12 /* 4 2 */
+#define Hit_Invalidate_SD 0x13 /* 4 3 */
+#define Hit_Writeback_Inv_D 0x15 /* 5 1 */
+#define Hit_Writeback_Inv_SD 0x17 /* 5 3 */
+#define Fill_I 0x14 /* 5 0 */
+#define Hit_Writeback_D 0x19 /* 6 1 */
+#define Hit_Writeback_SD 0x1B /* 6 3 */
+#define Hit_Writeback_I 0x18 /* 6 0 */
+#define Hit_Set_Virtual_SI 0x1E /* 7 2 */
+#define Hit_Set_Virtual_SD 0x1F /* 7 3 */
+
+#ifndef WAIT
+#define WAIT .word 0x42000020
+#endif WAIT
+
+#ifndef wait
+#define wait .word 0x42000020
+#endif wait
+
+#endif
+
+/*
+** TLB resource defines
+*/
+#if defined(CPU_R3000)
+#define N_TLB_ENTRIES 64
+#define TLB_PGSIZE 0x1000
+#define RANDBASE 8
+#define TLBLO_PFNMASK 0xfffff000
+#define TLBLO_PFNSHIFT 12
+#define TLBLO_N 0x800 /* non-cacheable */
+#define TLBLO_D 0x400 /* writeable */
+#define TLBLO_V 0x200 /* valid bit */
+#define TLBLO_G 0x100 /* global access bit */
+
+#define TLBHI_VPNMASK 0xfffff000
+#define TLBHI_VPNSHIFT 12
+#define TLBHI_PIDMASK 0xfc0
+#define TLBHI_PIDSHIFT 6
+#define TLBHI_NPID 64
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x00003f00
+#define TLBINX_INXSHIFT 8
+
+#define TLBRAND_RANDMASK 0x00003f00
+#define TLBRAND_RANDSHIFT 8
+
+#define TLBCTXT_BASEMASK 0xffe00000
+#define TLBCTXT_BASESHIFT 21
+
+#define TLBCTXT_VPNMASK 0x001ffffc
+#define TLBCTXT_VPNSHIFT 2
+#endif
+#if defined(CPU_R4000)
+#define N_TLB_ENTRIES 48
+
+#define TLBHI_VPN2MASK 0xffffe000
+#define TLBHI_PIDMASK 0x000000ff
+#define TLBHI_NPID 256
+
+#define TLBLO_PFNMASK 0x3fffffc0
+#define TLBLO_PFNSHIFT 6
+#define TLBLO_D 0x00000004 /* writeable */
+#define TLBLO_V 0x00000002 /* valid bit */
+#define TLBLO_G 0x00000001 /* global access bit */
+#define TLBLO_CMASK 0x00000038 /* cache algorithm mask */
+#define TLBLO_CSHIFT 3
+
+#define TLBLO_UNCACHED (CFG_C_UNCACHED<<TLBLO_CSHIFT)
+#define TLBLO_NONCOHERENT (CFG_C_NONCOHERENT<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCL (CFG_C_COHERENTXCL<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCLW (CFG_C_COHERENTXCLW<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTUPD (CFG_C_COHERENTUPD<<TLBLO_CSHIFT)
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x0000003f
+
+#define TLBRAND_RANDMASK 0x0000003f
+
+#define TLBCTXT_BASEMASK 0xff800000
+#define TLBCTXT_BASESHIFT 23
+
+#define TLBCTXT_VPN2MASK 0x007ffff0
+#define TLBCTXT_VPN2SHIFT 4
+
+#define TLBPGMASK_MASK 0x01ffe000
+#endif
+
+#if defined(CPU_R3000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_BEV 0x00400000 /* use boot exception vectors */
+
+/* Cache control bits */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_PE 0x00100000 /* cache parity error */
+#define SR_CM 0x00080000 /* cache miss */
+#define SR_PZ 0x00040000 /* cache parity zero */
+#define SR_SWC 0x00020000 /* swap cache */
+#define SR_ISC 0x00010000 /* Isolate data cache */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */
+#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */
+#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */
+#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */
+#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */
+#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */
+#endif
+
+#if defined(CPU_R4000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_RP 0x08000000 /* Reduced power operation */
+#define SR_FR 0x04000000 /* Additional floating point registers */
+#define SR_RE 0x02000000 /* Reverse endian in user mode */
+
+#define SR_BEV 0x00400000 /* Use boot exception vectors */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_SR 0x00100000 /* Soft reset */
+#define SR_CH 0x00040000 /* Cache hit */
+#define SR_CE 0x00020000 /* Use cache ECC */
+#define SR_DE 0x00010000 /* Disable cache exceptions */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KSMASK 0x00000018 /* Kernel mode mask */
+#define SR_KSUSER 0x00000010 /* User mode */
+#define SR_KSSUPER 0x00000008 /* Supervisor mode */
+#define SR_KSKERNEL 0x00000000 /* Kernel mode */
+#define SR_ERL 0x00000004 /* Error level */
+#define SR_EXL 0x00000002 /* Exception level */
+#define SR_IE 0x00000001 /* Interrupts enabled */
+#endif
+
+
+
+/*
+ * Cause Register
+ */
+#define CAUSE_BD 0x80000000 /* Branch delay slot */
+#define CAUSE_CEMASK 0x30000000 /* coprocessor error */
+#define CAUSE_CESHIFT 28
+
+
+#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */
+#define CAUSE_IPSHIFT 8
+
+#define CAUSE_EXCMASK 0x0000003C /* Cause code bits */
+#define CAUSE_EXCSHIFT 2
+
+#ifndef XDS
+/*
+** Coprocessor 0 registers
+*/
+#define C0_INX $0 /* tlb index */
+#define C0_RAND $1 /* tlb random */
+#if defined(CPU_R3000)
+#define C0_TLBLO $2 /* tlb entry low */
+#endif
+#if defined(CPU_R4000)
+#define C0_TLBLO0 $2 /* tlb entry low 0 */
+#define C0_TLBLO1 $3 /* tlb entry low 1 */
+#endif
+
+#define C0_CTXT $4 /* tlb context */
+
+#if defined(CPU_R4000)
+#define C0_PAGEMASK $5 /* tlb page mask */
+#define C0_WIRED $6 /* number of wired tlb entries */
+#endif
+
+#define C0_BADVADDR $8 /* bad virtual address */
+
+#if defined(CPU_R4000)
+#define C0_COUNT $9 /* cycle count */
+#endif
+
+#define C0_TLBHI $10 /* tlb entry hi */
+
+#if defined(CPU_R4000)
+#define C0_COMPARE $11 /* cyccle count comparator */
+#endif
+
+#define C0_SR $12 /* status register */
+#define C0_CAUSE $13 /* exception cause */
+#define C0_EPC $14 /* exception pc */
+#define C0_PRID $15 /* revision identifier */
+
+#if defined(CPU_R3000)
+#define C0_CONFIG $3 /* configuration register R3081*/
+#endif
+
+#if defined(CPU_R4000)
+#define C0_CONFIG $16 /* configuration register */
+#define C0_LLADDR $17 /* linked load address */
+#define C0_WATCHLO $18 /* watchpoint trap register */
+#define C0_WATCHHI $19 /* watchpoint trap register */
+#define C0_XCTXT $20 /* extended tlb context */
+#define C0_ECC $26 /* secondary cache ECC control */
+#define C0_CACHEERR $27 /* cache error status */
+#define C0_TAGLO $28 /* cache tag lo */
+#define C0_TAGHI $29 /* cache tag hi */
+#define C0_ERRPC $30 /* cache error pc */
+#endif
+
+#endif XDS
+
+#ifdef R4650
+#define IWATCH $18
+#define DWATCH $19
+#define IBASE $0
+#define IBOUND $1
+#define DBASE $2
+#define DBOUND $3
+#define CALG $17
+#endif
+
+#endif /* _IDTCPU_H__ */
+
diff --git a/c/src/exec/score/cpu/mips64orion/idtmon.h b/c/src/exec/score/cpu/mips64orion/idtmon.h
new file mode 100644
index 0000000000..b42211ed5c
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/idtmon.h
@@ -0,0 +1,171 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtmon.h - General header file for the IDT Prom Monitor
+**
+** Copyright 1989 Integrated Device Technology, Inc.
+** All Rights Reserved.
+**
+** June 1989 - D.Cahoon
+*/
+#ifndef __IDTMON_H__
+#define __IDTMON_H__
+
+/*
+** P_STACKSIZE is the size of the Prom Stack.
+** the prom stack grows downward
+*/
+#define P_STACKSIZE 0x2000 /* sets stack size to 8k */
+
+/*
+** M_BUSWIDTH
+** Memory bus width (including bank interleaving) in bytes
+** used when doing memory sizing to prevent bus capacitance
+** reporting ghost memory locations
+*/
+#if defined(CPU_R3000)
+#define M_BUSWIDTH 8 /* 32bit memory bank interleaved */
+#endif
+#if defined(CPU_R4000)
+#define M_BUSWIDTH 16 /* 64 bit memory bank interleaved */
+#endif
+
+/*
+** this is the default value for the number of bytes to add in calculating
+** the checksums in the checksum command
+*/
+#define CHK_SUM_CNT 0x20000 /* number of bytes to calc chksum for */
+
+/*
+** Monitor modes
+*/
+#define MODE_MONITOR 5 /* IDT Prom Monitor is executing */
+#define MODE_USER 0xa /* USER is executing */
+
+/*
+** memory reference widths
+*/
+#define SW_BYTE 1
+#define SW_HALFWORD 2
+#define SW_WORD 4
+#define SW_TRIBYTEL 12
+#define SW_TRIBYTER 20
+
+#ifdef CPU_R4000
+/*
+** definitions for select_cache call
+*/
+#define DCACHE 0
+#define ICACHE 1
+#define SCACHE 2
+
+#endif
+
+#if defined (CLANGUAGE) || defined(_LANGUAGE_C)
+typedef struct {
+ unsigned int mem_size;
+ unsigned int icache_size;
+ unsigned int dcache_size;
+#ifdef CPU_R4000
+ unsigned int scache_size;
+#endif
+
+ } mem_config;
+
+#endif CLANGUAGE || defined(_LANGUAGE_C)
+
+/*
+** general equates for diagnostics and boolean functions
+*/
+#define PASS 0
+#define FAIL 1
+
+#ifndef TRUE
+#define TRUE 1
+#endif TRUE
+#ifndef NULL
+#define NULL 0
+#endif NULL
+
+#ifndef FALSE
+#define FALSE 0
+#endif FALSE
+
+
+/*
+** portablility equates
+*/
+
+#ifndef BOOL
+#define BOOL unsigned int
+#endif BOOL
+
+#ifndef GLOBAL
+#define GLOBAL /**/
+#endif GLOBAL
+
+#ifndef MLOCAL
+#define MLOCAL static
+#endif MLOCAL
+
+
+#ifdef XDS
+#define CONST const
+#else
+#define CONST
+#endif XDS
+
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+/*
+** assembly instructions for compatability between xds and mips
+*/
+#ifndef XDS
+#define sllv sll
+#define srlv srl
+#endif XDS
+/*
+** debugger macros for assembly language routines. Allows the
+** programmer to set up the necessary stack frame info
+** required by debuggers to do stack traces.
+*/
+
+#ifndef XDS
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+#define ENDFRAME(name) \
+ .end name
+#else
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl _##name;\
+_##name:
+#define ENDFRAME(name)
+#endif XDS
+#endif /* __IDTMON_H__ */
diff --git a/c/src/exec/score/cpu/mips64orion/iregdef.h b/c/src/exec/score/cpu/mips64orion/iregdef.h
new file mode 100644
index 0000000000..f0953da852
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/iregdef.h
@@ -0,0 +1,325 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** iregdef.h - IDT R3000 register structure header file
+**
+** Copyright 1989 Integrated Device Technology, Inc
+** All Rights Reserved
+**
+*/
+#ifndef __IREGDEF_H__
+#define __IREGDEF_H__
+
+/*
+ * 950313: Ketan added sreg/lreg and R_SZ for 64-bit saves
+ * added Register definition for XContext reg.
+ * Look towards end of this file.
+ */
+/*
+** register names
+*/
+#define r0 $0
+#define r1 $1
+#define r2 $2
+#define r3 $3
+#define r4 $4
+#define r5 $5
+#define r6 $6
+#define r7 $7
+#define r8 $8
+#define r9 $9
+#define r10 $10
+#define r11 $11
+#define r12 $12
+#define r13 $13
+
+#define r14 $14
+#define r15 $15
+#define r16 $16
+#define r17 $17
+#define r18 $18
+#define r19 $19
+#define r20 $20
+#define r21 $21
+#define r22 $22
+#define r23 $23
+#define r24 $24
+#define r25 $25
+#define r26 $26
+#define r27 $27
+#define r28 $28
+#define r29 $29
+#define r30 $30
+#define r31 $31
+
+#define fp0 $f0
+#define fp1 $f1
+#define fp2 $f2
+#define fp3 $f3
+#define fp4 $f4
+#define fp5 $f5
+#define fp6 $f6
+#define fp7 $f7
+#define fp8 $f8
+#define fp9 $f9
+#define fp10 $f10
+#define fp11 $f11
+#define fp12 $f12
+#define fp13 $f13
+#define fp14 $f14
+#define fp15 $f15
+#define fp16 $f16
+#define fp17 $f17
+#define fp18 $f18
+#define fp19 $f19
+#define fp20 $f20
+#define fp21 $f21
+#define fp22 $f22
+#define fp23 $f23
+#define fp24 $f24
+#define fp25 $f25
+#define fp26 $f26
+#define fp27 $f27
+#define fp28 $f28
+#define fp29 $f29
+#define fp30 $f30
+#define fp31 $f31
+
+#define fcr0 $0
+#define fcr30 $30
+#define fcr31 $31
+
+#define zero $0 /* wired zero */
+#define AT $at /* assembler temp */
+#define v0 $2 /* return value */
+#define v1 $3
+#define a0 $4 /* argument registers a0-a3 */
+#define a1 $5
+#define a2 $6
+#define a3 $7
+#define t0 $8 /* caller saved t0-t9 */
+#define t1 $9
+#define t2 $10
+#define t3 $11
+#define t4 $12
+#define t5 $13
+#define t6 $14
+#define t7 $15
+#define s0 $16 /* callee saved s0-s8 */
+#define s1 $17
+#define s2 $18
+#define s3 $19
+#define s4 $20
+#define s5 $21
+#define s6 $22
+#define s7 $23
+#define t8 $24
+#define t9 $25
+#define k0 $26 /* kernel usage */
+#define k1 $27 /* kernel usage */
+#define gp $28 /* sdata pointer */
+#define sp $29 /* stack pointer */
+#define s8 $30 /* yet another saved reg for the callee */
+#define fp $30 /* frame pointer - this is being phased out by MIPS */
+#define ra $31 /* return address */
+
+
+/*
+** relative position of registers in save reg area
+*/
+#define R_R0 0
+#define R_R1 1
+#define R_R2 2
+#define R_R3 3
+#define R_R4 4
+#define R_R5 5
+#define R_R6 6
+#define R_R7 7
+#define R_R8 8
+#define R_R9 9
+#define R_R10 10
+#define R_R11 11
+#define R_R12 12
+#define R_R13 13
+#define R_R14 14
+#define R_R15 15
+#define R_R16 16
+#define R_R17 17
+#define R_R18 18
+#define R_R19 19
+#define R_R20 20
+#define R_R21 21
+#define R_R22 22
+#define R_R23 23
+#define R_R24 24
+#define R_R25 25
+#define R_R26 26
+#define R_R27 27
+#define R_R28 28
+#define R_R29 29
+#define R_R30 30
+#define R_R31 31
+#define R_F0 32
+#define R_F1 33
+#define R_F2 34
+#define R_F3 35
+#define R_F4 36
+#define R_F5 37
+#define R_F6 38
+#define R_F7 39
+#define R_F8 40
+#define R_F9 41
+#define R_F10 42
+#define R_F11 43
+#define R_F12 44
+#define R_F13 45
+#define R_F14 46
+#define R_F15 47
+#define R_F16 48
+#define R_F17 49
+#define R_F18 50
+#define R_F19 51
+#define R_F20 52
+#define R_F21 53
+#define R_F22 54
+#define R_F23 55
+#define R_F24 56
+#define R_F25 57
+#define R_F26 58
+#define R_F27 59
+#define R_F28 60
+#define R_F29 61
+#define R_F30 62
+#define R_F31 63
+#define NCLIENTREGS 64
+#define R_EPC 64
+#define R_MDHI 65
+#define R_MDLO 66
+#define R_SR 67
+#define R_CAUSE 68
+#define R_TLBHI 69
+#if defined(CPU_R3000)
+#define R_TLBLO 70
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO0 70
+#endif
+#define R_BADVADDR 71
+#define R_INX 72
+#define R_RAND 73
+#define R_CTXT 74
+#define R_EXCTYPE 75
+#define R_MODE 76
+#define R_PRID 77
+#define R_FCSR 78
+#define R_FEIR 79
+#if defined(CPU_R3000)
+#define NREGS 80
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO1 80
+#define R_PAGEMASK 81
+#define R_WIRED 82
+#define R_COUNT 83
+#define R_COMPARE 84
+#define R_CONFIG 85
+#define R_LLADDR 86
+#define R_WATCHLO 87
+#define R_WATCHHI 88
+#define R_ECC 89
+#define R_CACHEERR 90
+#define R_TAGLO 91
+#define R_TAGHI 92
+#define R_ERRPC 93
+#define R_XCTXT 94 /* Ketan added from SIM64bit */
+
+#define NREGS 95
+#endif
+
+/*
+** For those who like to think in terms of the compiler names for the regs
+*/
+#define R_ZERO R_R0
+#define R_AT R_R1
+#define R_V0 R_R2
+#define R_V1 R_R3
+#define R_A0 R_R4
+#define R_A1 R_R5
+#define R_A2 R_R6
+#define R_A3 R_R7
+#define R_T0 R_R8
+#define R_T1 R_R9
+#define R_T2 R_R10
+#define R_T3 R_R11
+#define R_T4 R_R12
+#define R_T5 R_R13
+#define R_T6 R_R14
+#define R_T7 R_R15
+#define R_S0 R_R16
+#define R_S1 R_R17
+#define R_S2 R_R18
+#define R_S3 R_R19
+#define R_S4 R_R20
+#define R_S5 R_R21
+#define R_S6 R_R22
+#define R_S7 R_R23
+#define R_T8 R_R24
+#define R_T9 R_R25
+#define R_K0 R_R26
+#define R_K1 R_R27
+#define R_GP R_R28
+#define R_SP R_R29
+#define R_FP R_R30
+#define R_RA R_R31
+
+/* Ketan added the following */
+#ifdef CPU_R3000
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#endif CPU_R3000
+
+#ifdef CPU_R4000
+#if __mips < 3
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#else
+#define sreg sd
+#define lreg ld
+#define rmfc0 dmfc0
+#define rmtc0 dmtc0
+#define R_SZ 8
+#endif
+#endif CPU_R4000
+/* Ketan till here */
+
+#endif /* __IREGDEF_H__ */
+
diff --git a/c/src/exec/score/cpu/mips64orion/mips64orion.h b/c/src/exec/score/cpu/mips64orion/mips64orion.h
new file mode 100644
index 0000000000..413fc607ea
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/mips64orion.h
@@ -0,0 +1,74 @@
+/* mips64orion.h
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/no_cpu.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)mips64orion.h 08/29/96 1.3 */
+
+#ifndef _INCLUDE_MIPS64ORION_h
+#define _INCLUDE_MIPS64ORION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the "no cpu"
+ * family when executing in protected mode. It does
+ * this by setting variables to indicate which implementation
+ * dependent features are present in a particular member
+ * of the family.
+ */
+
+#if defined(R4650)
+
+#define CPU_MODEL_NAME "R4650"
+#define MIPS64ORION_HAS_FPU 1
+
+#elif defined(R4600)
+
+#define CPU_MODEL_NAME "R4600"
+#define MIPS64ORION_HAS_FPU 1
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "MIPS R46xxx"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_MIPS64ORION_h */
+/* end of include file */
diff --git a/c/src/exec/score/cpu/mips64orion/mipstypes.h b/c/src/exec/score/cpu/mips64orion/mipstypes.h
new file mode 100644
index 0000000000..eaa07581ba
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/mipstypes.h
@@ -0,0 +1,73 @@
+/* mipstypes.h
+ *
+ * This include file contains type definitions pertaining to the IDT 4650
+ * processor family.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)mipstypes.h 08/20/96 1.4 */
+
+#ifndef __MIPS_TYPES_h
+#define __MIPS_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void mips_isr;
+typedef void ( *mips_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/mips64orion/rtems.c b/c/src/exec/score/cpu/mips64orion/rtems.c
new file mode 100644
index 0000000000..07d01ec65b
--- /dev/null
+++ b/c/src/exec/score/cpu/mips64orion/rtems.c
@@ -0,0 +1,53 @@
+/* rtems.c ===> rtems.S or rtems.s
+ *
+ * This file contains the single entry point code for
+ * the XXX implementation of RTEMS.
+ *
+ * NOTE: This is supposed to be a .S or .s file NOT a C file.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)rtems.c 03/15/96 1.1\n";
+ */
+
+
+/*
+ * This is supposed to be an assembly file. This means that system.h
+ * and cpu.h should not be included in a "real" rtems file.
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+/* #include "asm.h> */
+
+/*
+ * RTEMS
+ *
+ * This routine jumps to the directive indicated in the
+ * CPU defined register. This routine is used when RTEMS is
+ * linked by itself and placed in ROM. This routine is the
+ * first address in the ROM space for RTEMS. The user "calls"
+ * this address with the directive arguments in the normal place.
+ * This routine then jumps indirectly to the correct directive
+ * preserving the arguments. The directive should not realize
+ * it has been "wrapped" in this way. The table "_Entry_points"
+ * is used to look up the directive.
+ */
+
+void RTEMS()
+{
+}
+
diff --git a/c/src/exec/score/cpu/no_cpu/Makefile.in b/c/src/exec/score/cpu/no_cpu/Makefile.in
new file mode 100644
index 0000000000..4bbad5b532
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/Makefile.in
@@ -0,0 +1,90 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+# Normally cpu_asm and rtems are assembly files
+C_PIECES=cpu cpu_asm rtems
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/no_cputypes.h
+
+# H_FILES that get installed externally
+# no_cpu.h is handled separately
+EXTERNAL_H_FILES = $(srcdir)/asm.h
+
+# Assembly source names, if any, go here -- minus the .s
+# Normally cpu_asm and rtems are assembly files
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+install: all
+
+# Real ports using the gnu tools will need to have bsp_specs!!!
+# ${PROJECT_RELEASE}/lib/bsp_specs
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/no_cpu.h \
+ ${PROJECT_RELEASE}/include/rtems/score/targopts.h
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/no_cpu.h: $(srcdir)/no_cpu.h
+ $(SED) -e 's?REPLACE_THIS_WITH_THE_CPU_MODEL?$(RTEMS_CPU_MODEL)?' \
+ -e 's?REPLACE_THIS_WITH_THE_BSP?$(RTEMS_BSP)?' \
+ <$(srcdir)/no_cpu.h >$(ARCH)/no_cpu.h.tmp
+ $(INSTALL) -m 444 $(ARCH)/no_cpu.h.tmp $@
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+# Real ports using the gnu tools will need to have bsp_specs!!!
+#${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+# $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/no_cpu/asm.h b/c/src/exec/score/cpu/no_cpu/asm.h
new file mode 100644
index 0000000000..1ca7fd435b
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/asm.h
@@ -0,0 +1,101 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/exec/score/cpu/no_cpu/cpu.c b/c/src/exec/score/cpu/no_cpu/cpu.c
new file mode 100644
index 0000000000..b546ba2158
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/cpu.c
@@ -0,0 +1,162 @@
+/*
+ * XXX CPU Dependent Source
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, new_handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Thread_Idle_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+void _CPU_Thread_Idle_body( void )
+{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+}
diff --git a/c/src/exec/score/cpu/no_cpu/cpu.h b/c/src/exec/score/cpu/no_cpu/cpu.h
new file mode 100644
index 0000000000..44103b919b
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/cpu.h
@@ -0,0 +1,866 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the XXX
+ * processor.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/no_cpu.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/no_cputypes.h>
+#endif
+
+/* conditional compilation parameters */
+
+/*
+ * Should the calls to _Thread_Enable_dispatch be inlined?
+ *
+ * If TRUE, then they are inlined.
+ * If FALSE, then a subroutine call is made.
+ *
+ * Basically this is an example of the classic trade-off of size
+ * versus speed. Inlining the call (TRUE) typically increases the
+ * size of RTEMS while speeding up the enabling of dispatching.
+ * [NOTE: In general, the _Thread_Dispatch_disable_level will
+ * only be 0 or 1 unless you are in an interrupt handler and that
+ * interrupt handler invokes the executive.] When not inlined
+ * something calls _Thread_Enable_dispatch which in turns calls
+ * _Thread_Dispatch. If the enable dispatch is inlined, then
+ * one subroutine call is avoided entirely.]
+ */
+
+#define CPU_INLINE_ENABLE_DISPATCH FALSE
+
+/*
+ * Should the body of the search loops in _Thread_queue_Enqueue_priority
+ * be unrolled one time? In unrolled each iteration of the loop examines
+ * two "nodes" on the chain being searched. Otherwise, only one node
+ * is examined per iteration.
+ *
+ * If TRUE, then the loops are unrolled.
+ * If FALSE, then the loops are not unrolled.
+ *
+ * The primary factor in making this decision is the cost of disabling
+ * and enabling interrupts (_ISR_Flash) versus the cost of rest of the
+ * body of the loop. On some CPUs, the flash is more expensive than
+ * one iteration of the loop body. In this case, it might be desirable
+ * to unroll the loop. It is important to note that on some CPUs, this
+ * code is the longest interrupt disable period in RTEMS. So it is
+ * necessary to strike a balance when setting this parameter.
+ */
+
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+
+/*
+ * Does RTEMS manage a dedicated interrupt stack in software?
+ *
+ * If TRUE, then a stack is allocated in _Interrupt_Manager_initialization.
+ * If FALSE, nothing is done.
+ *
+ * If the CPU supports a dedicated interrupt stack in hardware,
+ * then it is generally the responsibility of the BSP to allocate it
+ * and set it up.
+ *
+ * If the CPU does not support a dedicated interrupt stack, then
+ * the porter has two options: (1) execute interrupts on the
+ * stack of the interrupted task, and (2) have RTEMS manage a dedicated
+ * interrupt stack.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Does this CPU have hardware support for a dedicated interrupt stack?
+ *
+ * If TRUE, then it must be installed during initialization.
+ * If FALSE, then no installation is performed.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
+
+/*
+ * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
+ *
+ * If TRUE, then the memory is allocated during initialization.
+ * If FALSE, then the memory is allocated during initialization.
+ *
+ * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE
+ * or CPU_INSTALL_HARDWARE_INTERRUPT_STACK is TRUE.
+ */
+
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+
+/*
+ * Does the CPU have hardware floating point?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
+ *
+ * If there is a FP coprocessor such as the i387 or mc68881, then
+ * the answer is TRUE.
+ *
+ * The macro name "NO_CPU_HAS_FPU" should be made CPU specific.
+ * It indicates whether or not this CPU model has FP support. For
+ * example, it would be possible to have an i386_nofp CPU model
+ * which set this to false to indicate that you have an i386 without
+ * an i387 and wish to leave floating point support out of RTEMS.
+ */
+
+#if ( NO_CPU_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+/*
+ * Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
+ *
+ * So far, the only CPU in which this option has been used is the
+ * HP PA-RISC. The HP C compiler and gcc both implicitly use the
+ * floating point registers to perform integer multiplies. If
+ * a function which you would not think utilize the FP unit DOES,
+ * then one can not easily predict which tasks will use the FP hardware.
+ * In this case, this option should be TRUE.
+ *
+ * If CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
+ */
+
+#define CPU_ALL_TASKS_ARE_FP TRUE
+
+/*
+ * Should the IDLE task have a floating point context?
+ *
+ * If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
+ * and it has a floating point context which is switched in and out.
+ * If FALSE, then the IDLE task does not have a floating point context.
+ *
+ * Setting this to TRUE negatively impacts the time required to preempt
+ * the IDLE task from an interrupt because the floating point context
+ * must be saved as part of the preemption.
+ */
+
+#define CPU_IDLE_TASK_IS_FP FALSE
+
+/*
+ * Should the saving of the floating point registers be deferred
+ * until a context switch is made to another different floating point
+ * task?
+ *
+ * If TRUE, then the floating point context will not be stored until
+ * necessary. It will remain in the floating point registers and not
+ * disturned until another floating point task is switched to.
+ *
+ * If FALSE, then the floating point context is saved when a floating
+ * point task is switched out and restored when the next floating point
+ * task is restored. The state of the floating point registers between
+ * those two operations is not specified.
+ *
+ * If the floating point context does NOT have to be saved as part of
+ * interrupt dispatching, then it should be safe to set this to TRUE.
+ *
+ * Setting this flag to TRUE results in using a different algorithm
+ * for deciding when to save and restore the floating point context.
+ * The deferred FP switch algorithm minimizes the number of times
+ * the FP context is saved and restored. The FP context is not saved
+ * until a context switch is made to another, different FP task.
+ * Thus in a system with only one FP task, the FP context will never
+ * be saved or restored.
+ */
+
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+/*
+ * Does this port provide a CPU dependent IDLE task implementation?
+ *
+ * If TRUE, then the routine _CPU_Thread_Idle_body
+ * must be provided and is the default IDLE thread body instead of
+ * _CPU_Thread_Idle_body.
+ *
+ * If FALSE, then use the generic IDLE thread body if the BSP does
+ * not provide one.
+ *
+ * This is intended to allow for supporting processors which have
+ * a low power or idle mode. When the IDLE thread is executed, then
+ * the CPU can be powered down.
+ *
+ * The order of precedence for selecting the IDLE thread body is:
+ *
+ * 1. BSP provided
+ * 2. CPU dependent (if provided)
+ * 3. generic (if no BSP and no CPU dependent)
+ */
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY TRUE
+
+/*
+ * Does the stack grow up (toward higher addresses) or down
+ * (toward lower addresses)?
+ *
+ * If TRUE, then the grows upward.
+ * If FALSE, then the grows toward smaller addresses.
+ */
+
+#define CPU_STACK_GROWS_UP TRUE
+
+/*
+ * The following is the variable attribute used to force alignment
+ * of critical RTEMS structures. On some processors it may make
+ * sense to have these aligned on tighter boundaries than
+ * the minimum requirements of the compiler in order to have as
+ * much of the critical data area as possible in a cache line.
+ *
+ * The placement of this macro in the declaration of the variables
+ * is based on the syntactically requirements of the GNU C
+ * "__attribute__" extension. For example with GNU C, use
+ * the following to force a structures to a 32 byte boundary.
+ *
+ * __attribute__ ((aligned (32)))
+ *
+ * NOTE: Currently only the Priority Bit Map table uses this feature.
+ * To benefit from using this, the data must be heavily
+ * used so it will stay in the cache and used frequently enough
+ * in the executive to justify turning this on.
+ */
+
+#define CPU_STRUCTURE_ALIGNMENT
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+/*
+ * The following defines the number of bits actually used in the
+ * interrupt field of the task mode. How those bits map to the
+ * CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
+ */
+
+#define CPU_MODES_INTERRUPT_MASK 0x00000001
+
+/*
+ * Processor defined structures
+ *
+ * Examples structures include the descriptor tables from the i386
+ * and the processor control structure on the i960ca.
+ */
+
+/* may need to put some structures here. */
+
+/*
+ * Contexts
+ *
+ * Generally there are 2 types of context to save.
+ * 1. Interrupt registers to save
+ * 2. Task level registers to save
+ *
+ * This means we have the following 3 context items:
+ * 1. task level context stuff:: Context_Control
+ * 2. floating point task stuff:: Context_Control_fp
+ * 3. special interrupt level context :: Context_Control_interrupt
+ *
+ * On some processors, it is cost-effective to save only the callee
+ * preserved registers during a task context switch. This means
+ * that the ISR code needs to save those registers which do not
+ * persist across function calls. It is not mandatory to make this
+ * distinctions between the caller/callee saves registers for the
+ * purpose of minimizing context saved during task switch and on interrupts.
+ * If the cost of saving extra registers is minimal, simplicity is the
+ * choice. Save the same context on interrupt entry as for tasks in
+ * this case.
+ *
+ * Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
+ * care should be used in designing the context area.
+ *
+ * On some CPUs with hardware floating point support, the Context_Control_fp
+ * structure will not be used or it simply consist of an array of a
+ * fixed number of bytes. This is done when the floating point context
+ * is dumped by a "FP save context" type instruction and the format
+ * is not really defined by the CPU. In this case, there is no need
+ * to figure out the exact format -- only the size. Of course, although
+ * this is enough information for RTEMS, it is probably not enough for
+ * a debugger such as gdb. But that is another problem.
+ */
+
+typedef struct {
+ unsigned32 some_integer_register;
+ unsigned32 some_system_register;
+} Context_Control;
+
+typedef struct {
+ double some_float_register;
+} Context_Control_fp;
+
+typedef struct {
+ unsigned32 special_interrupt_register;
+} CPU_Interrupt_frame;
+
+
+/*
+ * The following table contains the information required to configure
+ * the XXX processor specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ unsigned32 some_other_cpu_dependent_info;
+} rtems_cpu_table;
+
+/*
+ * This variable is optional. It is used on CPUs on which it is difficult
+ * to generate an "uninitialized" FP context. It is filled in by
+ * _CPU_Initialize and copied into the task's FP context area during
+ * _CPU_Context_Initialize.
+ */
+
+SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
+
+/*
+ * On some CPUs, RTEMS supports a software managed interrupt stack.
+ * This stack is allocated by the Interrupt Manager and the switch
+ * is performed in _ISR_Handler. These variables contain pointers
+ * to the lowest and highest addresses in the chunk of memory allocated
+ * for the interrupt stack. Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent
+ * code the option of picking the version it wants to use.
+ *
+ * NOTE: These two variables are required if the macro
+ * CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+ */
+
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+/*
+ * With some compilation systems, it is difficult if not impossible to
+ * call a high-level language routine from assembly language. This
+ * is especially true of commercial Ada compilers and name mangling
+ * C++ ones. This variable can be optionally defined by the CPU porter
+ * and contains the address of the routine _Thread_Dispatch. This
+ * can make it easier to invoke that routine at the end of the interrupt
+ * sequence (if a dispatch is necessary).
+ */
+
+SCORE_EXTERN void (*_CPU_Thread_dispatch_pointer)();
+
+/*
+ * Nothing prevents the porter from declaring more CPU specific variables.
+ */
+
+/* XXX: if needed, put more variables here */
+
+/*
+ * The size of the floating point context area. On some CPUs this
+ * will not be a "sizeof" because the format of the floating point
+ * area is not defined -- only the size is. This is usually on
+ * CPUs with a "floating point save context" instruction.
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/*
+ * Amount of extra stack (above minimum stack size) required by
+ * MPCI receive server thread. Remember that in a multiprocessor
+ * system this thread must exist and be able to process all directives.
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
+
+/*
+ * This defines the number of entries in the ISR_Vector_table managed
+ * by RTEMS.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 32
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Should be large enough to run all RTEMS tests. This insures
+ * that a "reasonable" small application should not have any problems.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE (1024*4)
+
+/*
+ * CPU's worst alignment requirement for data types on a byte boundary. This
+ * alignment does not take into account the requirements for the stack.
+ */
+
+#define CPU_ALIGNMENT 8
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * heap handler. This alignment requirement may be stricter than that
+ * for the data types alignment specified by CPU_ALIGNMENT. It is
+ * common for the heap to follow the same alignment requirement as
+ * CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict enough for the heap,
+ * then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for memory
+ * buffers allocated by the partition manager. This alignment requirement
+ * may be stricter than that for the data types alignment specified by
+ * CPU_ALIGNMENT. It is common for the partition to follow the same
+ * alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict
+ * enough for the partition, then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * stack. This alignment requirement may be stricter than that for the
+ * data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
+ * is strict enough for the stack, then this should be set to 0.
+ *
+ * NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
+ */
+
+#define CPU_STACK_ALIGNMENT 0
+
+/* ISR handler macros */
+
+/*
+ * Disable all interrupts for an RTEMS critical section. The previous
+ * level is returned in _level.
+ */
+
+#define _CPU_ISR_Disable( _isr_cookie ) \
+ { \
+ (_isr_cookie) = 0; /* do something to prevent warnings */ \
+ }
+
+/*
+ * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
+ * This indicates the end of an RTEMS critical section. The parameter
+ * _level is not modified.
+ */
+
+#define _CPU_ISR_Enable( _isr_cookie ) \
+ { \
+ }
+
+/*
+ * This temporarily restores the interrupt to _level before immediately
+ * disabling them again. This is used to divide long RTEMS critical
+ * sections into two or more parts. The parameter _level is not
+ * modified.
+ */
+
+#define _CPU_ISR_Flash( _isr_cookie ) \
+ { \
+ }
+
+/*
+ * Map interrupt level in task mode onto the hardware that the CPU
+ * actually provides. Currently, interrupt levels which do not
+ * map onto the CPU in a generic fashion are undefined. Someday,
+ * it would be nice if these were "mapped" by the application
+ * via a callout. For example, m68k has 8 levels 0 - 7, levels
+ * 8 - 255 would be available for bsp/application specific meaning.
+ * This could be used to manage a programmable interrupt controller
+ * via the rtems_task_mode directive.
+ *
+ * The get routine usually must be implemented as a subroutine.
+ */
+
+#define _CPU_ISR_Set_level( new_level ) \
+ { \
+ }
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/* Context handler macros */
+
+/*
+ * Initialize the context to a state suitable for starting a
+ * task after a context restore operation. Generally, this
+ * involves:
+ *
+ * - setting a starting address
+ * - preparing the stack
+ * - preparing the stack and frame pointers
+ * - setting the proper interrupt level in the context
+ * - initializing the floating point context
+ *
+ * This routine generally does not set any unnecessary register
+ * in the context. The state of the "general data" registers is
+ * undefined at task start time.
+ *
+ * NOTE: This is_fp parameter is TRUE if the thread is to be a floating
+ * point thread. This is typically only used on CPUs where the
+ * FPU may be easily disabled by software such as on the SPARC
+ * where the PSR contains an enable FPU bit.
+ */
+
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point, _is_fp ) \
+ { \
+ }
+
+/*
+ * This routine is responsible for somehow restarting the currently
+ * executing task. If you are lucky, then all that is necessary
+ * is restoring the context. Otherwise, there will need to be
+ * a special assembly routine which does something special in this
+ * case. Context_Restore should work most of the time. It will
+ * not work if restarting self conflicts with the stack frame
+ * assumptions of restoring a context.
+ */
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+/*
+ * The purpose of this macro is to allow the initial pointer into
+ * a floating point context area (used to save the floating point
+ * context) to be at an arbitrary place in the floating point
+ * context area.
+ *
+ * This is necessary because some FP units are designed to have
+ * their context saved as a stack which grows into lower addresses.
+ * Other FP units can be saved by simply moving registers into offsets
+ * from the base of the context area. Finally some FP units provide
+ * a "dump context" instruction which could fill in from high to low
+ * or low to high based on the whim of the CPU designers.
+ */
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+/*
+ * This routine initializes the FP context area passed to it to.
+ * There are a few standard ways in which to initialize the
+ * floating point context. The code included for this macro assumes
+ * that this is a CPU in which a "initial" FP context was saved into
+ * _CPU_Null_fp_context and it simply copies it to the destination
+ * context passed to it.
+ *
+ * Other models include (1) not doing anything, and (2) putting
+ * a "null FP status word" in the correct place in the FP context.
+ */
+
+#define _CPU_Context_Initialize_fp( _destination ) \
+ { \
+ *((Context_Control_fp *) *((void **) _destination)) = _CPU_Null_fp_context; \
+ }
+
+/* end of Context handler macros */
+
+/* Fatal Error manager macros */
+
+/*
+ * This routine copies _error into a known place -- typically a stack
+ * location or a register, optionally disables interrupts, and
+ * halts/stops the CPU.
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ { \
+ }
+
+/* end of Fatal Error manager macros */
+
+/* Bitfield handler macros */
+
+/*
+ * This routine sets _output to the bit number of the first bit
+ * set in _value. _value is of CPU dependent type Priority_Bit_map_control.
+ * This type may be either 16 or 32 bits wide although only the 16
+ * least significant bits will be used.
+ *
+ * There are a number of variables in using a "find first bit" type
+ * instruction.
+ *
+ * (1) What happens when run on a value of zero?
+ * (2) Bits may be numbered from MSB to LSB or vice-versa.
+ * (3) The numbering may be zero or one based.
+ * (4) The "find first bit" instruction may search from MSB or LSB.
+ *
+ * RTEMS guarantees that (1) will never happen so it is not a concern.
+ * (2),(3), (4) are handled by the macros _CPU_Priority_mask() and
+ * _CPU_Priority_bits_index(). These three form a set of routines
+ * which must logically operate together. Bits in the _value are
+ * set and cleared based on masks built by _CPU_Priority_mask().
+ * The basic major and minor values calculated by _Priority_Major()
+ * and _Priority_Minor() are "massaged" by _CPU_Priority_bits_index()
+ * to properly range between the values returned by the "find first bit"
+ * instruction. This makes it possible for _Priority_Get_highest() to
+ * calculate the major and directly index into the minor table.
+ * This mapping is necessary to ensure that 0 (a high priority major/minor)
+ * is the first bit found.
+ *
+ * This entire "find first bit" and mapping process depends heavily
+ * on the manner in which a priority is broken into a major and minor
+ * components with the major being the 4 MSB of a priority and minor
+ * the 4 LSB. Thus (0 << 4) + 0 corresponds to priority 0 -- the highest
+ * priority. And (15 << 4) + 14 corresponds to priority 254 -- the next
+ * to the lowest priority.
+ *
+ * If your CPU does not have a "find first bit" instruction, then
+ * there are ways to make do without it. Here are a handful of ways
+ * to implement this in software:
+ *
+ * - a series of 16 bit test instructions
+ * - a "binary search using if's"
+ * - _number = 0
+ * if _value > 0x00ff
+ * _value >>=8
+ * _number = 8;
+ *
+ * if _value > 0x0000f
+ * _value >=8
+ * _number += 4
+ *
+ * _number += bit_set_table[ _value ]
+ *
+ * where bit_set_table[ 16 ] has values which indicate the first
+ * bit set
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ (_output) = 0; /* do something to prevent warnings */ \
+ }
+
+#endif
+
+/* end of Bitfield handler macros */
+
+/*
+ * This routine builds the mask which corresponds to the bit fields
+ * as searched by _CPU_Bitfield_Find_first_bit(). See the discussion
+ * for that routine.
+ */
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 1 << (_bit_number) )
+
+#endif
+
+/*
+ * This routine translates the bit numbers returned by
+ * _CPU_Bitfield_Find_first_bit() into something suitable for use as
+ * a major or minor component of a priority. See the discussion
+ * for that routine.
+ */
+
+#if (CPU_USE_GENERIC_BITFIELD_CODE == FALSE)
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+#endif
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Install_interrupt_stack
+ *
+ * This routine installs the hardware interrupt stack pointer.
+ *
+ * NOTE: It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
+ * is TRUE.
+ */
+
+void _CPU_Install_interrupt_stack( void );
+
+/*
+ * _CPU_Thread_Idle_body
+ *
+ * This routine is the CPU dependent IDLE thread body.
+ *
+ * NOTE: It need only be provided if CPU_PROVIDES_IDLE_THREAD_BODY
+ * is TRUE.
+ */
+
+void _CPU_Thread_Idle_body( void );
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+/* The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version will work on any processor, but if there is a better
+ * way for your CPU PLEASE use it. The most common way to do this is to:
+ *
+ * swap least significant two bytes with 16-bit rotate
+ * swap upper and lower 16-bits
+ * swap most significant two bytes with 16-bit rotate
+ *
+ * Some CPUs have special instructions which swap a 32-bit quantity in
+ * a single instruction (e.g. i486). It is probably best to avoid
+ * an "endian swapping control bit" in the CPU. One good reason is
+ * that interrupts would probably have to be disabled to insure that
+ * an interrupt does not try to access the same "chunk" with the wrong
+ * endian. Another good reason is that on some CPUs, the endian bit
+ * endianness for ALL fetches -- both code and data -- so the code
+ * will be fetched incorrectly.
+ */
+
+static inline unsigned int CPU_swap_u32(
+ unsigned int value
+)
+{
+ unsigned32 byte1, byte2, byte3, byte4, swapped;
+
+ byte4 = (value >> 24) & 0xff;
+ byte3 = (value >> 16) & 0xff;
+ byte2 = (value >> 8) & 0xff;
+ byte1 = value & 0xff;
+
+ swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
+ return( swapped );
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/exec/score/cpu/no_cpu/cpu_asm.c b/c/src/exec/score/cpu/no_cpu/cpu_asm.c
new file mode 100644
index 0000000000..4b788b014c
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/cpu_asm.c
@@ -0,0 +1,165 @@
+/* cpu_asm.c ===> cpu_asm.S or cpu_asm.s
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language
+ *
+ * NOTE: This is supposed to be a .S or .s file NOT a C file.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * This is supposed to be an assembly file. This means that system.h
+ * and cpu.h should not be included in a "real" cpu_asm file. An
+ * implementation in assembly should include "cpu_asm.h>
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+/* #include "cpu_asm.h> */
+
+/*
+ * _CPU_Context_save_fp_context
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+)
+{
+}
+
+/*
+ * _CPU_Context_restore_fp_context
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+)
+{
+}
+
+/* _CPU_Context_switch
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+)
+{
+}
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+)
+{
+}
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ */
+
+void _ISR_Handler()
+{
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ * save some or all context on stack
+ * may need to save some special interrupt information for exit
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ *
+ * _ISR_Nest_level++;
+ *
+ * _Thread_Dispatch_disable_level++;
+ *
+ * (*_ISR_Vector_table[ vector ])( vector );
+ *
+ * --_ISR_Nest_level;
+ *
+ * if ( _ISR_Nest_level )
+ * goto the label "exit interrupt (simple case)"
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * restore stack
+ * #endif
+ *
+ * if ( !_Context_Switch_necessary )
+ * goto the label "exit interrupt (simple case)"
+ *
+ * if ( !_ISR_Signals_to_thread_executing )
+ * _ISR_Signals_to_thread_executing = FALSE;
+ * goto the label "exit interrupt (simple case)"
+ *
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ *
+ * prepare to get out of interrupt
+ * return from interrupt (maybe to _ISR_Dispatch)
+ *
+ * LABEL "exit interrupt (simple case):
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+}
+
diff --git a/c/src/exec/score/cpu/no_cpu/cpu_asm.h b/c/src/exec/score/cpu/no_cpu/cpu_asm.h
new file mode 100644
index 0000000000..d1fa17b582
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/cpu_asm.h
@@ -0,0 +1,70 @@
+/*
+ * cpu_asm.h
+ *
+ * Very loose template for an include file for the cpu_asm.? file
+ * if it is implemented as a ".S" file (preprocessed by cpp) instead
+ * of a ".s" file (preprocessed by gm4 or gasp).
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef __CPU_ASM_h
+#define __CPU_ASM_h
+
+/* pull in the generated offsets */
+
+#include <rtems/score/offsets.h>
+
+/*
+ * Hardware General Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Floating Point Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Control Registers
+ */
+
+/* put something here */
+
+/*
+ * Calling Convention
+ */
+
+/* put something here */
+
+/*
+ * Temporary registers
+ */
+
+/* put something here */
+
+/*
+ * Floating Point Registers - SW Conventions
+ */
+
+/* put something here */
+
+/*
+ * Temporary floating point registers
+ */
+
+/* put something here */
+
+#endif
+
+/* end of file */
diff --git a/c/src/exec/score/cpu/no_cpu/no_cpu.h b/c/src/exec/score/cpu/no_cpu/no_cpu.h
new file mode 100644
index 0000000000..03bfb215f4
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/no_cpu.h
@@ -0,0 +1,56 @@
+/* no_cpu.h
+ *
+ * This file is an example (i.e. "no CPU") of the file which is
+ * created for each CPU family port of RTEMS.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+#ifndef _INCLUDE_NO_CPU_h
+#define _INCLUDE_NO_CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the "no cpu"
+ * family when executing in protected mode. It does
+ * this by setting variables to indicate which implementation
+ * dependent features are present in a particular member
+ * of the family.
+ */
+
+#if defined(no_cpu)
+
+#define CPU_MODEL_NAME "no_cpu"
+#define NOCPU_HAS_FPU 1
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "NO CPU"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_NO_CPU_h */
+/* end of include file */
diff --git a/c/src/exec/score/cpu/no_cpu/no_cputypes.h b/c/src/exec/score/cpu/no_cpu/no_cputypes.h
new file mode 100644
index 0000000000..cf79fe180b
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/no_cputypes.h
@@ -0,0 +1,57 @@
+/* no_cputypes.h
+ *
+ * This include file contains type definitions pertaining to the Intel
+ * no_cpu processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __NO_CPU_TYPES_h
+#define __NO_CPU_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void no_cpu_isr;
+typedef void ( *no_cpu_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/no_cpu/rtems.c b/c/src/exec/score/cpu/no_cpu/rtems.c
new file mode 100644
index 0000000000..fad4f79870
--- /dev/null
+++ b/c/src/exec/score/cpu/no_cpu/rtems.c
@@ -0,0 +1,45 @@
+/* rtems.c ===> rtems.S or rtems.s
+ *
+ * This file contains the single entry point code for
+ * the XXX implementation of RTEMS.
+ *
+ * NOTE: This is supposed to be a .S or .s file NOT a C file.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * This is supposed to be an assembly file. This means that system.h
+ * and cpu.h should not be included in a "real" rtems file.
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+/* #include "asm.h> */
+
+/*
+ * RTEMS
+ *
+ * This routine jumps to the directive indicated in the
+ * CPU defined register. This routine is used when RTEMS is
+ * linked by itself and placed in ROM. This routine is the
+ * first address in the ROM space for RTEMS. The user "calls"
+ * this address with the directive arguments in the normal place.
+ * This routine then jumps indirectly to the correct directive
+ * preserving the arguments. The directive should not realize
+ * it has been "wrapped" in this way. The table "_Entry_points"
+ * is used to look up the directive.
+ */
+
+void RTEMS()
+{
+}
+
diff --git a/c/src/exec/score/cpu/powerpc/Makefile.in b/c/src/exec/score/cpu/powerpc/Makefile.in
new file mode 100644
index 0000000000..114ca43be3
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/Makefile.in
@@ -0,0 +1,92 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+# Normally cpu_asm and rtems are assembly files
+C_PIECES=cpu
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/ppctypes.h
+
+# H_FILES that get installed externally
+# ppc.h is handled separately
+EXTERNAL_H_FILES = $(srcdir)/asm.h
+
+# Assembly source names, if any, go here -- minus the .s
+# Normally cpu_asm and rtems are assembly files
+S_PIECES=cpu_asm rtems
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+$(ARCH)/cpu_asm.o: irq_stub.s
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+install: all
+
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/ppc.h \
+ ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+# make a link in case we are not compiling in the source directory
+ test -f irq_stub.s || $(LN) -s $(srcdir)/irq_stub.s irq_stub.s
+
+${PROJECT_RELEASE}/include/rtems/score/ppc.h: ppc.h
+ $(SED) -e 's?REPLACE_THIS_WITH_THE_CPU_MODEL?$(RTEMS_CPU_MODEL)?' \
+ -e 's?REPLACE_THIS_WITH_THE_BSP?$(RTEMS_BSP)?' \
+ < $< >$(ARCH)/ppc.h.tmp
+ $(INSTALL) -m 444 $(ARCH)/ppc.h.tmp $@
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/powerpc/README b/c/src/exec/score/cpu/powerpc/README
new file mode 100644
index 0000000000..fc0dd9c7d7
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/README
@@ -0,0 +1,71 @@
+#
+# $Id$
+#
+
+There are various issues regarding this port:
+
+
+
+1) Legal
+
+This port is written by Andrew Bray <andy@i-cubed.co.uk>, and
+is copyright 1995 i-cubed ltd.
+
+
+
+2) CPU support.
+
+This release fully supports the IBM PPC403GA and PPC403GB processors.
+
+It has only been tested on the PPC403GA (using software floating
+point).
+
+With the gratefully acknowledged assistance of IBM and Blue Micro,
+this release contains code to support the following processors
+ PPC601, PPC603, PPC603e, PPC604, and PPC602.
+
+The support for these processors is incomplete, especially that for
+the PPC602 for which only sketchy data is currently available.
+
+
+
+3) Application Binary INterface
+
+In the context of RTEMS, the ABI is of interest for the following
+aspects:
+
+a) Register usage. Which registers are used to provide static variable
+ linkage, stack pointer etc.
+
+b) Function calling convention. How parameters are passed, how function
+ variables should be invoked, how values are returned, etc.
+
+c) Stack frame layout.
+
+I am aware of a number of ABIs for the PowerPC:
+
+a) The PowerOpen ABI. This is the original Power ABI used on the RS/6000.
+ This is the only ABI supported by versions of GCC before 2.7.0.
+
+b) The SVR4 ABI. This is the ABI defined by SunSoft for the Solaris port
+ to the PowerPC.
+
+c) The Embedded ABI. This is an embedded ABI for PowerPC use, which has no
+ operating system interface defined. It is promoted by SunSoft, Motorola,
+ and Cygnus Support. Cygnus are porting the GNU toolchain to this ABI.
+
+d) GCC 2.7.0. This compiler is partway along the road to supporting the EABI,
+ but is currently halfway in between.
+
+This port was built and tested using the PowerOpen ABI, with the following
+caveat: we used an ELF assembler and linker. So some attention may be required
+on the assembler files to get them through a traditional (XCOFF) PowerOpen
+assembler.
+
+This port contains support for the other ABIs, but this may prove to be incomplete
+as it is untested.
+
+In the long term, the RTEMS PowerPC port should move to the EABI as its primary
+or only port. This should wait on a true EABI version of GCC.
+
+Andrew Bray 4/December/1995
diff --git a/c/src/exec/score/cpu/powerpc/TODO b/c/src/exec/score/cpu/powerpc/TODO
new file mode 100644
index 0000000000..6e3e04e6ca
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/TODO
@@ -0,0 +1,7 @@
+#
+# $Id$
+#
+
+Todo list:
+
+Maybe decode external interrupts like the HPPA does.
diff --git a/c/src/exec/score/cpu/powerpc/cpu.c b/c/src/exec/score/cpu/powerpc/cpu.c
new file mode 100644
index 0000000000..30ddc9e58a
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/cpu.c
@@ -0,0 +1,264 @@
+/*
+ * PowerPC CPU Dependent Source
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/cpu/no_cpu/cpu.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/context.h>
+#include <rtems/score/thread.h>
+
+/*
+ * These are for testing purposes.
+ */
+#undef Testing
+
+#ifdef Testing
+static unsigned32 msr;
+#ifdef ppc403
+static unsigned32 evpr;
+static unsigned32 exier;
+#endif
+#endif
+
+/*
+ * ppc_interrupt_level_to_msr
+ *
+ * This routine converts a two bit interrupt level to an MSR bit map.
+ */
+
+const unsigned32 _CPU_msrs[4] =
+ { PPC_MSR_0, PPC_MSR_1, PPC_MSR_2, PPC_MSR_3 };
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+static void ppc_spurious(int, CPU_Interrupt_frame *);
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ proc_ptr handler = (proc_ptr)ppc_spurious;
+ int i;
+#if (PPC_ABI != PPC_ABI_POWEROPEN)
+ register unsigned32 r2;
+#if (PPC_ABI != PPC_ABI_GCC27)
+ register unsigned32 r13;
+
+ asm ("mr %0,13" : "=r" ((r13)) : "0" ((r13)));
+ _CPU_IRQ_info.Default_r13 = r13;
+#endif
+
+ asm ("mr %0,2" : "=r" ((r2)) : "0" ((r2)));
+ _CPU_IRQ_info.Default_r2 = r2;
+#endif
+
+ _CPU_IRQ_info.Nest_level = &_ISR_Nest_level;
+ _CPU_IRQ_info.Disable_level = &_Thread_Dispatch_disable_level;
+ _CPU_IRQ_info.Vector_table = _ISR_Vector_table;
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ _CPU_IRQ_info.Dispatch_r2 = ((unsigned32 *)_Thread_Dispatch)[1];
+#endif
+ _CPU_IRQ_info.Switch_necessary = &_Context_Switch_necessary;
+ _CPU_IRQ_info.Signal = &_ISR_Signals_to_thread_executing;
+
+ i = (int)&_CPU_IRQ_info;
+ asm volatile("mtspr 0x113, %0" : "=r" (i) : "0" (i)); /* SPRG 3 */
+
+ i = PPC_MSR_INITIAL & ~PPC_MSR_DISABLE_MASK;
+ asm volatile("mtspr 0x112, %0" : "=r" (i) : "0" (i)); /* SPRG 2 */
+
+#ifdef Testing
+ {
+ unsigned32 tmp;
+
+ asm volatile ("mfmsr %0" : "=r" (tmp));
+ msr = tmp;
+#ifdef ppc403
+ asm volatile ("mfspr %0, 0x3d6" : "=r" (tmp)); /* EVPR */
+ evpr = tmp;
+ asm volatile ("mfdcr %0, 0x42" : "=r" (tmp)); /* EXIER */
+ exier = tmp;
+ asm volatile ("mtspr 0x3d6, %0" :: "r" (0)); /* EVPR */
+#endif
+ }
+#endif
+
+ if ( cpu_table->spurious_handler )
+ handler = (proc_ptr)cpu_table->spurious_handler;
+
+ for (i = 0; i < PPC_INTERRUPT_MAX; i++)
+ _ISR_Vector_table[i] = handler;
+
+ _CPU_Table = *cpu_table;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ *
+ * COMMENTS FROM Andrew Bray <andy@i-cubed.co.uk>:
+ *
+ * The PowerPC puts its interrupt enable status in the MSR register
+ * which also contains things like endianness control. To be more
+ * awkward, the layout varies from processor to processor. This
+ * is why I adopted a table approach in my interrupt handling.
+ * Thus the inverse process is slow, because it requires a table
+ * search.
+ *
+ * This could fail, and return 4 (an invalid level) if the MSR has been
+ * set to a value not in the table. This is also quite an expensive
+ * operation - I do hope its not too common.
+ *
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 level, msr;
+
+ asm volatile("mfmsr %0" : "=r" ((msr)));
+
+ msr &= PPC_MSR_DISABLE_MASK;
+
+ for (level = 0; level < 4; level++)
+ if ((_CPU_msrs[level] & PPC_MSR_DISABLE_MASK) == msr)
+ break;
+
+ return level;
+}
+
+/* _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler ? (ISR_Handler_entry)new_handler :
+ _CPU_Table.spurious_handler ?
+ (ISR_Handler_entry)_CPU_Table.spurious_handler :
+ (ISR_Handler_entry)ppc_spurious;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+ _CPU_IRQ_info.Stack = _CPU_Interrupt_stack_high - 56;
+#else
+ _CPU_IRQ_info.Stack = _CPU_Interrupt_stack_high - 8;
+#endif
+}
+
+/* Handle a spurious interrupt */
+static void ppc_spurious(int v, CPU_Interrupt_frame *i)
+{
+#if 0
+ printf("Spurious interrupt on vector %d from %08.8x\n",
+ v, i->pc);
+#endif
+#ifdef ppc403
+ if (v == PPC_IRQ_EXTERNAL)
+ {
+ register int r = 0;
+
+ asm volatile("mtdcr 0x42, %0" : "=r" ((r)) : "0" ((r))); /* EXIER */
+ }
+ else if (v == PPC_IRQ_PIT)
+ {
+ register int r = 0x08000000;
+
+ asm volatile("mtspr 0x3d8, %0" : "=r" ((r)) : "0" ((r))); /* TSR */
+ }
+ else if (v == PPC_IRQ_FIT)
+ {
+ register int r = 0x04000000;
+
+ asm volatile("mtspr 0x3d8, %0" : "=r" ((r)) : "0" ((r))); /* TSR */
+ }
+#endif
+}
+
+void _CPU_Fatal_error(unsigned32 _error)
+{
+#ifdef Testing
+ unsigned32 tmp;
+
+ tmp = msr;
+ asm volatile ("mtmsr %0" :: "r" (tmp));
+#ifdef ppc403
+ tmp = evpr;
+ asm volatile ("mtspr 0x3d6, %0" :: "r" (tmp)); /* EVPR */
+ tmp = exier;
+ asm volatile ("mtdcr 0x42, %0" :: "r" (tmp)); /* EXIER */
+#endif
+#endif
+ asm volatile ("mr 3, %0" : : "r" ((_error)));
+ asm volatile ("tweq 5,5");
+ asm volatile ("li 0,0; mtmsr 0");
+ while (1) ;
+}
diff --git a/c/src/exec/score/cpu/powerpc/cpu.h b/c/src/exec/score/cpu/powerpc/cpu.h
new file mode 100644
index 0000000000..ba419b0256
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/cpu.h
@@ -0,0 +1,1027 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the PowerPC
+ * processor.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/cpu/no_cpu/cpu.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/ppc.h> /* pick up machine definitions */
+#ifndef ASM
+struct CPU_Interrupt_frame;
+
+#include <rtems/score/ppctypes.h>
+#endif
+
+/* conditional compilation parameters */
+
+/*
+ * Should the calls to _Thread_Enable_dispatch be inlined?
+ *
+ * If TRUE, then they are inlined.
+ * If FALSE, then a subroutine call is made.
+ *
+ * Basically this is an example of the classic trade-off of size
+ * versus speed. Inlining the call (TRUE) typically increases the
+ * size of RTEMS while speeding up the enabling of dispatching.
+ * [NOTE: In general, the _Thread_Dispatch_disable_level will
+ * only be 0 or 1 unless you are in an interrupt handler and that
+ * interrupt handler invokes the executive.] When not inlined
+ * something calls _Thread_Enable_dispatch which in turns calls
+ * _Thread_Dispatch. If the enable dispatch is inlined, then
+ * one subroutine call is avoided entirely.]
+ */
+
+#define CPU_INLINE_ENABLE_DISPATCH FALSE
+
+/*
+ * Should the body of the search loops in _Thread_queue_Enqueue_priority
+ * be unrolled one time? In unrolled each iteration of the loop examines
+ * two "nodes" on the chain being searched. Otherwise, only one node
+ * is examined per iteration.
+ *
+ * If TRUE, then the loops are unrolled.
+ * If FALSE, then the loops are not unrolled.
+ *
+ * The primary factor in making this decision is the cost of disabling
+ * and enabling interrupts (_ISR_Flash) versus the cost of rest of the
+ * body of the loop. On some CPUs, the flash is more expensive than
+ * one iteration of the loop body. In this case, it might be desirable
+ * to unroll the loop. It is important to note that on some CPUs, this
+ * code is the longest interrupt disable period in RTEMS. So it is
+ * necessary to strike a balance when setting this parameter.
+ */
+
+#define CPU_UNROLL_ENQUEUE_PRIORITY FALSE
+
+/*
+ * Does RTEMS manage a dedicated interrupt stack in software?
+ *
+ * If TRUE, then a stack is allocated in _Interrupt_Manager_initialization.
+ * If FALSE, nothing is done.
+ *
+ * If the CPU supports a dedicated interrupt stack in hardware,
+ * then it is generally the responsibility of the BSP to allocate it
+ * and set it up.
+ *
+ * If the CPU does not support a dedicated interrupt stack, then
+ * the porter has two options: (1) execute interrupts on the
+ * stack of the interrupted task, and (2) have RTEMS manage a dedicated
+ * interrupt stack.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Does this CPU have hardware support for a dedicated interrupt stack?
+ *
+ * If TRUE, then it must be installed during initialization.
+ * If FALSE, then no installation is performed.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+/*
+ * ACB: This is a lie, but it gets us a handle on a call to set up
+ * a variable derived from the top of the interrupt stack.
+ */
+
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
+
+/*
+ * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
+ *
+ * If TRUE, then the memory is allocated during initialization.
+ * If FALSE, then the memory is allocated during initialization.
+ *
+ * This should be TRUE is CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE
+ * or CPU_INSTALL_HARDWARE_INTERRUPT_STACK is TRUE.
+ */
+
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+
+/*
+ * Does the CPU have hardware floating point?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
+ *
+ * If there is a FP coprocessor such as the i387 or mc68881, then
+ * the answer is TRUE.
+ *
+ * The macro name "PPC_HAS_FPU" should be made CPU specific.
+ * It indicates whether or not this CPU model has FP support. For
+ * example, it would be possible to have an i386_nofp CPU model
+ * which set this to false to indicate that you have an i386 without
+ * an i387 and wish to leave floating point support out of RTEMS.
+ */
+
+#if ( PPC_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+/*
+ * Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
+ *
+ * So far, the only CPU in which this option has been used is the
+ * HP PA-RISC. The HP C compiler and gcc both implicitly use the
+ * floating point registers to perform integer multiplies. If
+ * a function which you would not think utilize the FP unit DOES,
+ * then one can not easily predict which tasks will use the FP hardware.
+ * In this case, this option should be TRUE.
+ *
+ * If CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
+ */
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+
+/*
+ * Should the IDLE task have a floating point context?
+ *
+ * If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
+ * and it has a floating point context which is switched in and out.
+ * If FALSE, then the IDLE task does not have a floating point context.
+ *
+ * Setting this to TRUE negatively impacts the time required to preempt
+ * the IDLE task from an interrupt because the floating point context
+ * must be saved as part of the preemption.
+ */
+
+#define CPU_IDLE_TASK_IS_FP FALSE
+
+/*
+ * Should the saving of the floating point registers be deferred
+ * until a context switch is made to another different floating point
+ * task?
+ *
+ * If TRUE, then the floating point context will not be stored until
+ * necessary. It will remain in the floating point registers and not
+ * disturned until another floating point task is switched to.
+ *
+ * If FALSE, then the floating point context is saved when a floating
+ * point task is switched out and restored when the next floating point
+ * task is restored. The state of the floating point registers between
+ * those two operations is not specified.
+ *
+ * If the floating point context does NOT have to be saved as part of
+ * interrupt dispatching, then it should be safe to set this to TRUE.
+ *
+ * Setting this flag to TRUE results in using a different algorithm
+ * for deciding when to save and restore the floating point context.
+ * The deferred FP switch algorithm minimizes the number of times
+ * the FP context is saved and restored. The FP context is not saved
+ * until a context switch is made to another, different FP task.
+ * Thus in a system with only one FP task, the FP context will never
+ * be saved or restored.
+ */
+/*
+ * ACB Note: This could make debugging tricky..
+ */
+
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+/*
+ * Does this port provide a CPU dependent IDLE task implementation?
+ *
+ * If TRUE, then the routine _CPU_Thread_Idle_body
+ * must be provided and is the default IDLE thread body instead of
+ * _CPU_Thread_Idle_body.
+ *
+ * If FALSE, then use the generic IDLE thread body if the BSP does
+ * not provide one.
+ *
+ * This is intended to allow for supporting processors which have
+ * a low power or idle mode. When the IDLE thread is executed, then
+ * the CPU can be powered down.
+ *
+ * The order of precedence for selecting the IDLE thread body is:
+ *
+ * 1. BSP provided
+ * 2. CPU dependent (if provided)
+ * 3. generic (if no BSP and no CPU dependent)
+ */
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY FALSE
+
+/*
+ * Does the stack grow up (toward higher addresses) or down
+ * (toward lower addresses)?
+ *
+ * If TRUE, then the grows upward.
+ * If FALSE, then the grows toward smaller addresses.
+ */
+
+#define CPU_STACK_GROWS_UP FALSE
+
+/*
+ * The following is the variable attribute used to force alignment
+ * of critical RTEMS structures. On some processors it may make
+ * sense to have these aligned on tighter boundaries than
+ * the minimum requirements of the compiler in order to have as
+ * much of the critical data area as possible in a cache line.
+ *
+ * The placement of this macro in the declaration of the variables
+ * is based on the syntactically requirements of the GNU C
+ * "__attribute__" extension. For example with GNU C, use
+ * the following to force a structures to a 32 byte boundary.
+ *
+ * __attribute__ ((aligned (32)))
+ *
+ * NOTE: Currently only the Priority Bit Map table uses this feature.
+ * To benefit from using this, the data must be heavily
+ * used so it will stay in the cache and used frequently enough
+ * in the executive to justify turning this on.
+ */
+
+#define CPU_STRUCTURE_ALIGNMENT \
+ __attribute__ ((aligned (PPC_CACHE_ALIGNMENT)))
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+/*
+ * The following defines the number of bits actually used in the
+ * interrupt field of the task mode. How those bits map to the
+ * CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
+ */
+/*
+ * ACB Note: Levels are:
+ * 0: All maskable interrupts enabled
+ * 1: Other critical exceptions enabled
+ * 2: Machine check enabled
+ * 3: All maskable IRQs disabled
+ */
+
+#define CPU_MODES_INTERRUPT_MASK 0x00000003
+
+/*
+ * Processor defined structures
+ *
+ * Examples structures include the descriptor tables from the i386
+ * and the processor control structure on the i960ca.
+ */
+
+/* may need to put some structures here. */
+
+/*
+ * Contexts
+ *
+ * Generally there are 2 types of context to save.
+ * 1. Interrupt registers to save
+ * 2. Task level registers to save
+ *
+ * This means we have the following 3 context items:
+ * 1. task level context stuff:: Context_Control
+ * 2. floating point task stuff:: Context_Control_fp
+ * 3. special interrupt level context :: Context_Control_interrupt
+ *
+ * On some processors, it is cost-effective to save only the callee
+ * preserved registers during a task context switch. This means
+ * that the ISR code needs to save those registers which do not
+ * persist across function calls. It is not mandatory to make this
+ * distinctions between the caller/callee saves registers for the
+ * purpose of minimizing context saved during task switch and on interrupts.
+ * If the cost of saving extra registers is minimal, simplicity is the
+ * choice. Save the same context on interrupt entry as for tasks in
+ * this case.
+ *
+ * Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
+ * care should be used in designing the context area.
+ *
+ * On some CPUs with hardware floating point support, the Context_Control_fp
+ * structure will not be used or it simply consist of an array of a
+ * fixed number of bytes. This is done when the floating point context
+ * is dumped by a "FP save context" type instruction and the format
+ * is not really defined by the CPU. In this case, there is no need
+ * to figure out the exact format -- only the size. Of course, although
+ * this is enough information for RTEMS, it is probably not enough for
+ * a debugger such as gdb. But that is another problem.
+ */
+
+typedef struct {
+ unsigned32 gpr1; /* Stack pointer for all */
+ unsigned32 gpr2; /* TOC in PowerOpen, reserved SVR4, section ptr EABI + */
+ unsigned32 gpr13; /* First non volatile PowerOpen, section ptr SVR4/EABI */
+ unsigned32 gpr14; /* Non volatile for all */
+ unsigned32 gpr15; /* Non volatile for all */
+ unsigned32 gpr16; /* Non volatile for all */
+ unsigned32 gpr17; /* Non volatile for all */
+ unsigned32 gpr18; /* Non volatile for all */
+ unsigned32 gpr19; /* Non volatile for all */
+ unsigned32 gpr20; /* Non volatile for all */
+ unsigned32 gpr21; /* Non volatile for all */
+ unsigned32 gpr22; /* Non volatile for all */
+ unsigned32 gpr23; /* Non volatile for all */
+ unsigned32 gpr24; /* Non volatile for all */
+ unsigned32 gpr25; /* Non volatile for all */
+ unsigned32 gpr26; /* Non volatile for all */
+ unsigned32 gpr27; /* Non volatile for all */
+ unsigned32 gpr28; /* Non volatile for all */
+ unsigned32 gpr29; /* Non volatile for all */
+ unsigned32 gpr30; /* Non volatile for all */
+ unsigned32 gpr31; /* Non volatile for all */
+ unsigned32 cr; /* PART of the CR is non volatile for all */
+ unsigned32 pc; /* Program counter/Link register */
+ unsigned32 msr; /* Initial interrupt level */
+} Context_Control;
+
+typedef struct {
+ /* The ABIs (PowerOpen/SVR4/EABI) only require saving f14-f31 over
+ * procedure calls. However, this would mean that the interrupt
+ * frame had to hold f0-f13, and the fpscr. And as the majority
+ * of tasks will not have an FP context, we will save the whole
+ * context here.
+ */
+#if (PPC_HAS_DOUBLE == 1)
+ double f[32];
+ double fpscr;
+#else
+ float f[32];
+ float fpscr;
+#endif
+} Context_Control_fp;
+
+typedef struct CPU_Interrupt_frame {
+ unsigned32 stacklink; /* Ensure this is a real frame (also reg1 save) */
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+ unsigned32 dummy[13]; /* Used by callees: PowerOpen ABI */
+#else
+ unsigned32 dummy[1]; /* Used by callees: SVR4/EABI */
+#endif
+ /* This is what is left out of the primary contexts */
+ unsigned32 gpr0;
+ unsigned32 gpr2; /* play safe */
+ unsigned32 gpr3;
+ unsigned32 gpr4;
+ unsigned32 gpr5;
+ unsigned32 gpr6;
+ unsigned32 gpr7;
+ unsigned32 gpr8;
+ unsigned32 gpr9;
+ unsigned32 gpr10;
+ unsigned32 gpr11;
+ unsigned32 gpr12;
+ unsigned32 gpr13; /* Play safe */
+ unsigned32 gpr28; /* For internal use by the IRQ handler */
+ unsigned32 gpr29; /* For internal use by the IRQ handler */
+ unsigned32 gpr30; /* For internal use by the IRQ handler */
+ unsigned32 gpr31; /* For internal use by the IRQ handler */
+ unsigned32 cr; /* Bits of this are volatile, so no-one may save */
+ unsigned32 ctr;
+ unsigned32 xer;
+ unsigned32 lr;
+ unsigned32 pc;
+ unsigned32 msr;
+ unsigned32 pad[3];
+} CPU_Interrupt_frame;
+
+
+/*
+ * The following table contains the information required to configure
+ * the PowerPC processor specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+ unsigned32 clicks_per_usec; /* Timer clicks per microsecond */
+ unsigned32 serial_per_sec; /* Serial clocks per second */
+ boolean serial_external_clock;
+ boolean serial_xon_xoff;
+ boolean serial_cts_rts;
+ unsigned32 serial_rate;
+ unsigned32 timer_average_overhead; /* Average overhead of timer in ticks */
+ unsigned32 timer_least_valid; /* Least valid number from timer */
+ void (*spurious_handler)(unsigned32 vector, CPU_Interrupt_frame *);
+} rtems_cpu_table;
+
+/*
+ * This variable is optional. It is used on CPUs on which it is difficult
+ * to generate an "uninitialized" FP context. It is filled in by
+ * _CPU_Initialize and copied into the task's FP context area during
+ * _CPU_Context_Initialize.
+ */
+
+/* EXTERN Context_Control_fp _CPU_Null_fp_context; */
+
+/*
+ * On some CPUs, RTEMS supports a software managed interrupt stack.
+ * This stack is allocated by the Interrupt Manager and the switch
+ * is performed in _ISR_Handler. These variables contain pointers
+ * to the lowest and highest addresses in the chunk of memory allocated
+ * for the interrupt stack. Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent
+ * code the option of picking the version it wants to use.
+ *
+ * NOTE: These two variables are required if the macro
+ * CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+ */
+
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+/*
+ * With some compilation systems, it is difficult if not impossible to
+ * call a high-level language routine from assembly language. This
+ * is especially true of commercial Ada compilers and name mangling
+ * C++ ones. This variable can be optionally defined by the CPU porter
+ * and contains the address of the routine _Thread_Dispatch. This
+ * can make it easier to invoke that routine at the end of the interrupt
+ * sequence (if a dispatch is necessary).
+ */
+
+/* EXTERN void (*_CPU_Thread_dispatch_pointer)(); */
+
+/*
+ * Nothing prevents the porter from declaring more CPU specific variables.
+ */
+
+SCORE_EXTERN struct {
+ unsigned32 *Nest_level;
+ unsigned32 *Disable_level;
+ void *Vector_table;
+ void *Stack;
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ unsigned32 Dispatch_r2;
+#else
+ unsigned32 Default_r2;
+#if (PPC_ABI != PPC_ABI_GCC27)
+ unsigned32 Default_r13;
+#endif
+#endif
+ volatile boolean *Switch_necessary;
+ boolean *Signal;
+} _CPU_IRQ_info CPU_STRUCTURE_ALIGNMENT;
+
+/*
+ * The size of the floating point context area. On some CPUs this
+ * will not be a "sizeof" because the format of the floating point
+ * area is not defined -- only the size is. This is usually on
+ * CPUs with a "floating point save context" instruction.
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/*
+ * (Optional) # of bytes for libmisc/stackchk to check
+ * If not specifed, then it defaults to something reasonable
+ * for most architectures.
+ */
+
+#define CPU_STACK_CHECK_SIZE (128)
+
+/*
+ * Amount of extra stack (above minimum stack size) required by
+ * MPCI receive server thread. Remember that in a multiprocessor
+ * system this thread must exist and be able to process all directives.
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
+
+/*
+ * This defines the number of entries in the ISR_Vector_table managed
+ * by RTEMS.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS (PPC_INTERRUPT_MAX)
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Should be large enough to run all RTEMS tests. This insures
+ * that a "reasonable" small application should not have any problems.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE (1024*3)
+
+/*
+ * CPU's worst alignment requirement for data types on a byte boundary. This
+ * alignment does not take into account the requirements for the stack.
+ */
+
+#define CPU_ALIGNMENT (PPC_ALIGNMENT)
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * heap handler. This alignment requirement may be stricter than that
+ * for the data types alignment specified by CPU_ALIGNMENT. It is
+ * common for the heap to follow the same alignment requirement as
+ * CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict enough for the heap,
+ * then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_HEAP_ALIGNMENT (PPC_ALIGNMENT)
+
+/*
+ * This number corresponds to the byte alignment requirement for memory
+ * buffers allocated by the partition manager. This alignment requirement
+ * may be stricter than that for the data types alignment specified by
+ * CPU_ALIGNMENT. It is common for the partition to follow the same
+ * alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict
+ * enough for the partition, then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_PARTITION_ALIGNMENT (PPC_ALIGNMENT)
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * stack. This alignment requirement may be stricter than that for the
+ * data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
+ * is strict enough for the stack, then this should be set to 0.
+ *
+ * NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
+ */
+
+#define CPU_STACK_ALIGNMENT (PPC_STACK_ALIGNMENT)
+
+/* ISR handler macros */
+
+/*
+ * Disable all interrupts for an RTEMS critical section. The previous
+ * level is returned in _level.
+ */
+
+#define loc_string(a,b) a " (" #b ")\n"
+
+#define _CPU_ISR_Disable( _isr_cookie ) \
+ { \
+ asm volatile ( \
+ "mfmsr %0; andc %1,%0,%1; mtmsr %1" : \
+ "=r" ((_isr_cookie)) : "r" ((PPC_MSR_DISABLE_MASK)) \
+ ); \
+ }
+
+/*
+ * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
+ * This indicates the end of an RTEMS critical section. The parameter
+ * _level is not modified.
+ */
+
+#define _CPU_ISR_Enable( _isr_cookie ) \
+ { \
+ asm volatile ( "mtmsr %0" : \
+ "=r" ((_isr_cookie)) : "0" ((_isr_cookie))); \
+ }
+
+/*
+ * This temporarily restores the interrupt to _level before immediately
+ * disabling them again. This is used to divide long RTEMS critical
+ * sections into two or more parts. The parameter _level is not
+ * modified.
+ */
+
+#define _CPU_ISR_Flash( _isr_cookie ) \
+ { \
+ asm volatile ( \
+ "mtmsr %0; andc %1,%0,%1; mtmsr %1" : \
+ "=r" ((_isr_cookie)) : \
+ "r" ((PPC_MSR_DISABLE_MASK)), "0" ((_isr_cookie)) \
+ ); \
+ }
+
+/*
+ * Map interrupt level in task mode onto the hardware that the CPU
+ * actually provides. Currently, interrupt levels which do not
+ * map onto the CPU in a generic fashion are undefined. Someday,
+ * it would be nice if these were "mapped" by the application
+ * via a callout. For example, m68k has 8 levels 0 - 7, levels
+ * 8 - 255 would be available for bsp/application specific meaning.
+ * This could be used to manage a programmable interrupt controller
+ * via the rtems_task_mode directive.
+ */
+
+#define _CPU_ISR_Set_level( new_level ) \
+ { \
+ register unsigned32 tmp = 0; \
+ asm volatile ( \
+ "mfmsr %0; andc %0,%0,%1; and %2, %2, %1; or %0, %0, %2; mtmsr %0" : \
+ "=r" ((tmp)) : \
+ "r" ((PPC_MSR_DISABLE_MASK)), "r" ((_CPU_msrs[new_level])), "0" ((tmp)) \
+ ); \
+ }
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/* Context handler macros */
+
+/*
+ * Initialize the context to a state suitable for starting a
+ * task after a context restore operation. Generally, this
+ * involves:
+ *
+ * - setting a starting address
+ * - preparing the stack
+ * - preparing the stack and frame pointers
+ * - setting the proper interrupt level in the context
+ * - initializing the floating point context
+ *
+ * This routine generally does not set any unnecessary register
+ * in the context. The state of the "general data" registers is
+ * undefined at task start time.
+ */
+
+#if PPC_ABI == PPC_ABI_POWEROPEN
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point, _is_fp ) \
+ { \
+ unsigned32 sp, *desc; \
+ \
+ sp = ((unsigned32)_stack_base) + (_size) - 56; \
+ *((unsigned32 *)sp) = 0; \
+ \
+ desc = (unsigned32 *)_entry_point; \
+ \
+ (_the_context)->msr = PPC_MSR_INITIAL | \
+ _CPU_msrs[ _isr ]; \
+ (_the_context)->pc = desc[0]; \
+ (_the_context)->gpr1 = sp; \
+ (_the_context)->gpr2 = desc[1]; \
+ }
+#endif
+#if PPC_ABI == PPC_ABI_SVR4
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point ) \
+ { \
+ unsigned32 sp, r13; \
+ \
+ sp = ((unsigned32)_stack_base) + (_size) - 8; \
+ *((unsigned32 *)sp) = 0; \
+ \
+ asm volatile ("mr %0, 13" : "=r" ((r13))); \
+ \
+ (_the_context->msr) = PPC_MSR_INITIAL | \
+ _CPU_msrs[ _isr ]; \
+ (_the_context->pc) = _entry_point; \
+ (_the_context->gpr1) = sp; \
+ (_the_context->gpr13) = r13; \
+ }
+#endif
+#if PPC_ABI == PPC_ABI_EABI
+#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
+ _isr, _entry_point ) \
+ { \
+ unsigned32 sp, r2, r13; \
+ \
+ sp = ((unsigned32)_stack_base) + (_size) - 8; \
+ *((unsigned32 *)sp) = 0; \
+ \
+ asm volatile ("mr %0,2; mr %1,13" : "=r" ((r2)), "=r" ((r13))); \
+ \
+ (_the_context)->msr = PPC_MSR_INITIAL | \
+ _CPU_msrs[ _isr ]; \
+ (_the_context->pc) = _entry_point; \
+ (_the_context->gpr1) = sp; \
+ (_the_context->gpr2) = r2; \
+ (_the_context->gpr13) = r13; \
+ }
+#endif
+
+/*
+ * This routine is responsible for somehow restarting the currently
+ * executing task. If you are lucky, then all that is necessary
+ * is restoring the context. Otherwise, there will need to be
+ * a special assembly routine which does something special in this
+ * case. Context_Restore should work most of the time. It will
+ * not work if restarting self conflicts with the stack frame
+ * assumptions of restoring a context.
+ */
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+/*
+ * The purpose of this macro is to allow the initial pointer into
+ * a floating point context area (used to save the floating point
+ * context) to be at an arbitrary place in the floating point
+ * context area.
+ *
+ * This is necessary because some FP units are designed to have
+ * their context saved as a stack which grows into lower addresses.
+ * Other FP units can be saved by simply moving registers into offsets
+ * from the base of the context area. Finally some FP units provide
+ * a "dump context" instruction which could fill in from high to low
+ * or low to high based on the whim of the CPU designers.
+ */
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+/*
+ * This routine initializes the FP context area passed to it to.
+ * There are a few standard ways in which to initialize the
+ * floating point context. The code included for this macro assumes
+ * that this is a CPU in which a "initial" FP context was saved into
+ * _CPU_Null_fp_context and it simply copies it to the destination
+ * context passed to it.
+ *
+ * Other models include (1) not doing anything, and (2) putting
+ * a "null FP status word" in the correct place in the FP context.
+ */
+
+#define _CPU_Context_Initialize_fp( _destination ) \
+ { \
+ ((Context_Control_fp *) *((void **) _destination))->fpscr = PPC_INIT_FPSCR; \
+ }
+
+/* end of Context handler macros */
+
+/* Fatal Error manager macros */
+
+/*
+ * This routine copies _error into a known place -- typically a stack
+ * location or a register, optionally disables interrupts, and
+ * halts/stops the CPU.
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ _CPU_Fatal_error(_error)
+
+/* end of Fatal Error manager macros */
+
+/* Bitfield handler macros */
+
+/*
+ * This routine sets _output to the bit number of the first bit
+ * set in _value. _value is of CPU dependent type Priority_Bit_map_control.
+ * This type may be either 16 or 32 bits wide although only the 16
+ * least significant bits will be used.
+ *
+ * There are a number of variables in using a "find first bit" type
+ * instruction.
+ *
+ * (1) What happens when run on a value of zero?
+ * (2) Bits may be numbered from MSB to LSB or vice-versa.
+ * (3) The numbering may be zero or one based.
+ * (4) The "find first bit" instruction may search from MSB or LSB.
+ *
+ * RTEMS guarantees that (1) will never happen so it is not a concern.
+ * (2),(3), (4) are handled by the macros _CPU_Priority_mask() and
+ * _CPU_Priority_Bits_index(). These three form a set of routines
+ * which must logically operate together. Bits in the _value are
+ * set and cleared based on masks built by _CPU_Priority_mask().
+ * The basic major and minor values calculated by _Priority_Major()
+ * and _Priority_Minor() are "massaged" by _CPU_Priority_Bits_index()
+ * to properly range between the values returned by the "find first bit"
+ * instruction. This makes it possible for _Priority_Get_highest() to
+ * calculate the major and directly index into the minor table.
+ * This mapping is necessary to ensure that 0 (a high priority major/minor)
+ * is the first bit found.
+ *
+ * This entire "find first bit" and mapping process depends heavily
+ * on the manner in which a priority is broken into a major and minor
+ * components with the major being the 4 MSB of a priority and minor
+ * the 4 LSB. Thus (0 << 4) + 0 corresponds to priority 0 -- the highest
+ * priority. And (15 << 4) + 14 corresponds to priority 254 -- the next
+ * to the lowest priority.
+ *
+ * If your CPU does not have a "find first bit" instruction, then
+ * there are ways to make do without it. Here are a handful of ways
+ * to implement this in software:
+ *
+ * - a series of 16 bit test instructions
+ * - a "binary search using if's"
+ * - _number = 0
+ * if _value > 0x00ff
+ * _value >>=8
+ * _number = 8;
+ *
+ * if _value > 0x0000f
+ * _value >=8
+ * _number += 4
+ *
+ * _number += bit_set_table[ _value ]
+ *
+ * where bit_set_table[ 16 ] has values which indicate the first
+ * bit set
+ */
+
+#define _CPU_Bitfield_Find_first_bit( _value, _output ) \
+ { \
+ asm volatile ("cntlzw %0, %1" : "=r" ((_output)), "=r" ((_value)) : \
+ "1" ((_value))); \
+ }
+
+/* end of Bitfield handler macros */
+
+/*
+ * This routine builds the mask which corresponds to the bit fields
+ * as searched by _CPU_Bitfield_Find_first_bit(). See the discussion
+ * for that routine.
+ */
+
+#define _CPU_Priority_Mask( _bit_number ) \
+ ( 0x80000000 >> (_bit_number) )
+
+/*
+ * This routine translates the bit numbers returned by
+ * _CPU_Bitfield_Find_first_bit() into something suitable for use as
+ * a major or minor component of a priority. See the discussion
+ * for that routine.
+ */
+
+#define _CPU_Priority_bits_index( _priority ) \
+ (_priority)
+
+/* end of Priority handler macros */
+
+/* variables */
+
+extern const unsigned32 _CPU_msrs[4];
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Install_interrupt_stack
+ *
+ * This routine installs the hardware interrupt stack pointer.
+ *
+ * NOTE: It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
+ * is TRUE.
+ */
+
+void _CPU_Install_interrupt_stack( void );
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+void _CPU_Fatal_error(
+ unsigned32 _error
+);
+
+/* The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version will work on any processor, but if there is a better
+ * way for your CPU PLEASE use it. The most common way to do this is to:
+ *
+ * swap least significant two bytes with 16-bit rotate
+ * swap upper and lower 16-bits
+ * swap most significant two bytes with 16-bit rotate
+ *
+ * Some CPUs have special instructions which swap a 32-bit quantity in
+ * a single instruction (e.g. i486). It is probably best to avoid
+ * an "endian swapping control bit" in the CPU. One good reason is
+ * that interrupts would probably have to be disabled to insure that
+ * an interrupt does not try to access the same "chunk" with the wrong
+ * endian. Another good reason is that on some CPUs, the endian bit
+ * endianness for ALL fetches -- both code and data -- so the code
+ * will be fetched incorrectly.
+ */
+
+static inline unsigned int CPU_swap_u32(
+ unsigned int value
+)
+{
+ unsigned32 swapped;
+
+ asm volatile("rlwimi %0,%1,8,24,31;"
+ "rlwimi %0,%1,24,16,23;"
+ "rlwimi %0,%1,8,8,15;"
+ "rlwimi %0,%1,24,0,7;" :
+ "=r" ((swapped)) : "r" ((value)));
+
+ return( swapped );
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/exec/score/cpu/powerpc/cpu_asm.s b/c/src/exec/score/cpu/powerpc/cpu_asm.s
new file mode 100644
index 0000000000..9fd2885b93
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/cpu_asm.s
@@ -0,0 +1,749 @@
+
+/* cpu_asm.s 1.1 - 95/12/04
+ *
+ * This file contains the assembly code for the PowerPC implementation
+ * of RTEMS.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/cpu/no_cpu/cpu_asm.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+
+/*
+ * Offsets for various Contexts
+ */
+ .set GP_1, 0
+ .set GP_2, (GP_1 + 4)
+ .set GP_13, (GP_2 + 4)
+ .set GP_14, (GP_13 + 4)
+
+ .set GP_15, (GP_14 + 4)
+ .set GP_16, (GP_15 + 4)
+ .set GP_17, (GP_16 + 4)
+ .set GP_18, (GP_17 + 4)
+
+ .set GP_19, (GP_18 + 4)
+ .set GP_20, (GP_19 + 4)
+ .set GP_21, (GP_20 + 4)
+ .set GP_22, (GP_21 + 4)
+
+ .set GP_23, (GP_22 + 4)
+ .set GP_24, (GP_23 + 4)
+ .set GP_25, (GP_24 + 4)
+ .set GP_26, (GP_25 + 4)
+
+ .set GP_27, (GP_26 + 4)
+ .set GP_28, (GP_27 + 4)
+ .set GP_29, (GP_28 + 4)
+ .set GP_30, (GP_29 + 4)
+
+ .set GP_31, (GP_30 + 4)
+ .set GP_CR, (GP_31 + 4)
+ .set GP_PC, (GP_CR + 4)
+ .set GP_MSR, (GP_PC + 4)
+
+#if (PPC_HAS_DOUBLE == 1)
+ .set FP_0, 0
+ .set FP_1, (FP_0 + 8)
+ .set FP_2, (FP_1 + 8)
+ .set FP_3, (FP_2 + 8)
+ .set FP_4, (FP_3 + 8)
+ .set FP_5, (FP_4 + 8)
+ .set FP_6, (FP_5 + 8)
+ .set FP_7, (FP_6 + 8)
+ .set FP_8, (FP_7 + 8)
+ .set FP_9, (FP_8 + 8)
+ .set FP_10, (FP_9 + 8)
+ .set FP_11, (FP_10 + 8)
+ .set FP_12, (FP_11 + 8)
+ .set FP_13, (FP_12 + 8)
+ .set FP_14, (FP_13 + 8)
+ .set FP_15, (FP_14 + 8)
+ .set FP_16, (FP_15 + 8)
+ .set FP_17, (FP_16 + 8)
+ .set FP_18, (FP_17 + 8)
+ .set FP_19, (FP_18 + 8)
+ .set FP_20, (FP_19 + 8)
+ .set FP_21, (FP_20 + 8)
+ .set FP_22, (FP_21 + 8)
+ .set FP_23, (FP_22 + 8)
+ .set FP_24, (FP_23 + 8)
+ .set FP_25, (FP_24 + 8)
+ .set FP_26, (FP_25 + 8)
+ .set FP_27, (FP_26 + 8)
+ .set FP_28, (FP_27 + 8)
+ .set FP_29, (FP_28 + 8)
+ .set FP_30, (FP_29 + 8)
+ .set FP_31, (FP_30 + 8)
+ .set FP_FPSCR, (FP_31 + 8)
+#else
+ .set FP_0, 0
+ .set FP_1, (FP_0 + 4)
+ .set FP_2, (FP_1 + 4)
+ .set FP_3, (FP_2 + 4)
+ .set FP_4, (FP_3 + 4)
+ .set FP_5, (FP_4 + 4)
+ .set FP_6, (FP_5 + 4)
+ .set FP_7, (FP_6 + 4)
+ .set FP_8, (FP_7 + 4)
+ .set FP_9, (FP_8 + 4)
+ .set FP_10, (FP_9 + 4)
+ .set FP_11, (FP_10 + 4)
+ .set FP_12, (FP_11 + 4)
+ .set FP_13, (FP_12 + 4)
+ .set FP_14, (FP_13 + 4)
+ .set FP_15, (FP_14 + 4)
+ .set FP_16, (FP_15 + 4)
+ .set FP_17, (FP_16 + 4)
+ .set FP_18, (FP_17 + 4)
+ .set FP_19, (FP_18 + 4)
+ .set FP_20, (FP_19 + 4)
+ .set FP_21, (FP_20 + 4)
+ .set FP_22, (FP_21 + 4)
+ .set FP_23, (FP_22 + 4)
+ .set FP_24, (FP_23 + 4)
+ .set FP_25, (FP_24 + 4)
+ .set FP_26, (FP_25 + 4)
+ .set FP_27, (FP_26 + 4)
+ .set FP_28, (FP_27 + 4)
+ .set FP_29, (FP_28 + 4)
+ .set FP_30, (FP_29 + 4)
+ .set FP_31, (FP_30 + 4)
+ .set FP_FPSCR, (FP_31 + 4)
+#endif
+
+ .set IP_LINK, 0
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+ .set IP_0, (IP_LINK + 56)
+#else
+ .set IP_0, (IP_LINK + 8)
+#endif
+ .set IP_2, (IP_0 + 4)
+
+ .set IP_3, (IP_2 + 4)
+ .set IP_4, (IP_3 + 4)
+ .set IP_5, (IP_4 + 4)
+ .set IP_6, (IP_5 + 4)
+
+ .set IP_7, (IP_6 + 4)
+ .set IP_8, (IP_7 + 4)
+ .set IP_9, (IP_8 + 4)
+ .set IP_10, (IP_9 + 4)
+
+ .set IP_11, (IP_10 + 4)
+ .set IP_12, (IP_11 + 4)
+ .set IP_13, (IP_12 + 4)
+ .set IP_28, (IP_13 + 4)
+
+ .set IP_29, (IP_28 + 4)
+ .set IP_30, (IP_29 + 4)
+ .set IP_31, (IP_30 + 4)
+ .set IP_CR, (IP_31 + 4)
+
+ .set IP_CTR, (IP_CR + 4)
+ .set IP_XER, (IP_CTR + 4)
+ .set IP_LR, (IP_XER + 4)
+ .set IP_PC, (IP_LR + 4)
+
+ .set IP_MSR, (IP_PC + 4)
+ .set IP_END, (IP_MSR + 16)
+
+ /* _CPU_IRQ_info offsets */
+ /* These must be in this order */
+ .set Nest_level, 0
+ .set Disable_level, 4
+ .set Vector_table, 8
+ .set Stack, 12
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ .set Dispatch_r2, 16
+ .set Switch_necessary, 20
+#else
+ .set Default_r2, 16
+#if (PPC_ABI != PPC_ABI_GCC27)
+ .set Default_r13, 20
+ .set Switch_necessary, 24
+#else
+ .set Switch_necessary, 20
+#endif
+#endif
+ .set Signal, Switch_necessary + 4
+
+ BEGIN_CODE
+/*
+ * _CPU_Context_save_fp_context
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+ ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
+ PUBLIC_PROC (_CPU_Context_save_fp)
+PROC (_CPU_Context_save_fp):
+#if (PPC_HAS_FPU == 1)
+ lwz r3, 0(r3)
+#if (PPC_HAS_DOUBLE == 1)
+ stfd f0, FP_0(r3)
+ stfd f1, FP_1(r3)
+ stfd f2, FP_2(r3)
+ stfd f3, FP_3(r3)
+ stfd f4, FP_4(r3)
+ stfd f5, FP_5(r3)
+ stfd f6, FP_6(r3)
+ stfd f7, FP_7(r3)
+ stfd f8, FP_8(r3)
+ stfd f9, FP_9(r3)
+ stfd f10, FP_10(r3)
+ stfd f11, FP_11(r3)
+ stfd f12, FP_12(r3)
+ stfd f13, FP_13(r3)
+ stfd f14, FP_14(r3)
+ stfd f15, FP_15(r3)
+ stfd f16, FP_16(r3)
+ stfd f17, FP_17(r3)
+ stfd f18, FP_18(r3)
+ stfd f19, FP_19(r3)
+ stfd f20, FP_20(r3)
+ stfd f21, FP_21(r3)
+ stfd f22, FP_22(r3)
+ stfd f23, FP_23(r3)
+ stfd f24, FP_24(r3)
+ stfd f25, FP_25(r3)
+ stfd f26, FP_26(r3)
+ stfd f27, FP_27(r3)
+ stfd f28, FP_28(r3)
+ stfd f29, FP_29(r3)
+ stfd f30, FP_30(r3)
+ stfd f31, FP_31(r3)
+ mffs f2
+ stfd f2, FP_FPSCR(r3)
+#else
+ stfs f0, FP_0(r3)
+ stfs f1, FP_1(r3)
+ stfs f2, FP_2(r3)
+ stfs f3, FP_3(r3)
+ stfs f4, FP_4(r3)
+ stfs f5, FP_5(r3)
+ stfs f6, FP_6(r3)
+ stfs f7, FP_7(r3)
+ stfs f8, FP_8(r3)
+ stfs f9, FP_9(r3)
+ stfs f10, FP_10(r3)
+ stfs f11, FP_11(r3)
+ stfs f12, FP_12(r3)
+ stfs f13, FP_13(r3)
+ stfs f14, FP_14(r3)
+ stfs f15, FP_15(r3)
+ stfs f16, FP_16(r3)
+ stfs f17, FP_17(r3)
+ stfs f18, FP_18(r3)
+ stfs f19, FP_19(r3)
+ stfs f20, FP_20(r3)
+ stfs f21, FP_21(r3)
+ stfs f22, FP_22(r3)
+ stfs f23, FP_23(r3)
+ stfs f24, FP_24(r3)
+ stfs f25, FP_25(r3)
+ stfs f26, FP_26(r3)
+ stfs f27, FP_27(r3)
+ stfs f28, FP_28(r3)
+ stfs f29, FP_29(r3)
+ stfs f30, FP_30(r3)
+ stfs f31, FP_31(r3)
+ mffs f2
+ stfs f2, FP_FPSCR(r3)
+#endif
+#endif
+ blr
+
+/*
+ * _CPU_Context_restore_fp_context
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+ ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
+ PUBLIC_PROC (_CPU_Context_restore_fp)
+PROC (_CPU_Context_restore_fp):
+#if (PPC_HAS_FPU == 1)
+ lwz r3, 0(r3)
+#if (PPC_HAS_DOUBLE == 1)
+ lfd f2, FP_FPSCR(r3)
+ mtfsf 255, f2
+ lfd f0, FP_0(r3)
+ lfd f1, FP_1(r3)
+ lfd f2, FP_2(r3)
+ lfd f3, FP_3(r3)
+ lfd f4, FP_4(r3)
+ lfd f5, FP_5(r3)
+ lfd f6, FP_6(r3)
+ lfd f7, FP_7(r3)
+ lfd f8, FP_8(r3)
+ lfd f9, FP_9(r3)
+ lfd f10, FP_10(r3)
+ lfd f11, FP_11(r3)
+ lfd f12, FP_12(r3)
+ lfd f13, FP_13(r3)
+ lfd f14, FP_14(r3)
+ lfd f15, FP_15(r3)
+ lfd f16, FP_16(r3)
+ lfd f17, FP_17(r3)
+ lfd f18, FP_18(r3)
+ lfd f19, FP_19(r3)
+ lfd f20, FP_20(r3)
+ lfd f21, FP_21(r3)
+ lfd f22, FP_22(r3)
+ lfd f23, FP_23(r3)
+ lfd f24, FP_24(r3)
+ lfd f25, FP_25(r3)
+ lfd f26, FP_26(r3)
+ lfd f27, FP_27(r3)
+ lfd f28, FP_28(r3)
+ lfd f29, FP_29(r3)
+ lfd f30, FP_30(r3)
+ lfd f31, FP_31(r3)
+#else
+ lfs f2, FP_FPSCR(r3)
+ mtfsf 255, f2
+ lfs f0, FP_0(r3)
+ lfs f1, FP_1(r3)
+ lfs f2, FP_2(r3)
+ lfs f3, FP_3(r3)
+ lfs f4, FP_4(r3)
+ lfs f5, FP_5(r3)
+ lfs f6, FP_6(r3)
+ lfs f7, FP_7(r3)
+ lfs f8, FP_8(r3)
+ lfs f9, FP_9(r3)
+ lfs f10, FP_10(r3)
+ lfs f11, FP_11(r3)
+ lfs f12, FP_12(r3)
+ lfs f13, FP_13(r3)
+ lfs f14, FP_14(r3)
+ lfs f15, FP_15(r3)
+ lfs f16, FP_16(r3)
+ lfs f17, FP_17(r3)
+ lfs f18, FP_18(r3)
+ lfs f19, FP_19(r3)
+ lfs f20, FP_20(r3)
+ lfs f21, FP_21(r3)
+ lfs f22, FP_22(r3)
+ lfs f23, FP_23(r3)
+ lfs f24, FP_24(r3)
+ lfs f25, FP_25(r3)
+ lfs f26, FP_26(r3)
+ lfs f27, FP_27(r3)
+ lfs f28, FP_28(r3)
+ lfs f29, FP_29(r3)
+ lfs f30, FP_30(r3)
+ lfs f31, FP_31(r3)
+#endif
+#endif
+ blr
+
+
+/* _CPU_Context_switch
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+ ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
+ PUBLIC_PROC (_CPU_Context_switch)
+PROC (_CPU_Context_switch):
+ sync
+ isync
+#if (PPC_CACHE_ALIGNMENT == 4) /* No cache */
+ stw r1, GP_1(r3)
+ lwz r1, GP_1(r4)
+ stw r2, GP_2(r3)
+ lwz r2, GP_2(r4)
+#if (PPC_USE_MULTIPLE == 1)
+ stmw r13, GP_13(r3)
+ lmw r13, GP_13(r4)
+#else
+ stw r13, GP_13(r3)
+ lwz r13, GP_13(r4)
+ stw r14, GP_14(r3)
+ lwz r14, GP_14(r4)
+ stw r15, GP_15(r3)
+ lwz r15, GP_15(r4)
+ stw r16, GP_16(r3)
+ lwz r16, GP_16(r4)
+ stw r17, GP_17(r3)
+ lwz r17, GP_17(r4)
+ stw r18, GP_18(r3)
+ lwz r18, GP_18(r4)
+ stw r19, GP_19(r3)
+ lwz r19, GP_19(r4)
+ stw r20, GP_20(r3)
+ lwz r20, GP_20(r4)
+ stw r21, GP_21(r3)
+ lwz r21, GP_21(r4)
+ stw r22, GP_22(r3)
+ lwz r22, GP_22(r4)
+ stw r23, GP_23(r3)
+ lwz r23, GP_23(r4)
+ stw r24, GP_24(r3)
+ lwz r24, GP_24(r4)
+ stw r25, GP_25(r3)
+ lwz r25, GP_25(r4)
+ stw r26, GP_26(r3)
+ lwz r26, GP_26(r4)
+ stw r27, GP_27(r3)
+ lwz r27, GP_27(r4)
+ stw r28, GP_28(r3)
+ lwz r28, GP_28(r4)
+ stw r29, GP_29(r3)
+ lwz r29, GP_29(r4)
+ stw r30, GP_30(r3)
+ lwz r30, GP_30(r4)
+ stw r31, GP_31(r3)
+ lwz r31, GP_31(r4)
+#endif
+ mfcr r5
+ stw r5, GP_CR(r3)
+ lwz r5, GP_CR(r4)
+ mflr r6
+ mtcrf 255, r5
+ stw r6, GP_PC(r3)
+ lwz r6, GP_PC(r4)
+ mfmsr r7
+ mtlr r6
+ stw r7, GP_MSR(r3)
+ lwz r7, GP_MSR(r4)
+ mtmsr r7
+#endif
+#if (PPC_CACHE_ALIGNMENT == 16)
+ /* This assumes that all the registers are in the given order */
+ li r5, 16
+ addi r3,r3,-4
+ dcbz r5, r3
+ stw r1, GP_1+4(r3)
+ stw r2, GP_2+4(r3)
+#if (PPC_USE_MULTIPLE == 1)
+ addi r3, r3, GP_14+4
+ dcbz r5, r3
+ addi r3, r3, GP_18-GP_14
+ dcbz r5, r3
+ addi r3, r3, GP_22-GP_18
+ dcbz r5, r3
+ addi r3, r3, GP_26-GP_22
+ dcbz r5, r3
+ stmw r13, GP_13-GP_26(r3)
+#else
+ stw r13, GP_13+4(r3)
+ stwu r14, GP_14+4(r3)
+ dcbz r5, r3
+ stw r15, GP_15-GP_14(r3)
+ stw r16, GP_16-GP_14(r3)
+ stw r17, GP_17-GP_14(r3)
+ stwu r18, GP_18-GP_14(r3)
+ dcbz r5, r3
+ stw r19, GP_19-GP_18(r3)
+ stw r20, GP_20-GP_18(r3)
+ stw r21, GP_21-GP_18(r3)
+ stwu r22, GP_22-GP_18(r3)
+ dcbz r5, r3
+ stw r23, GP_23-GP_22(r3)
+ stw r24, GP_24-GP_22(r3)
+ stw r25, GP_25-GP_22(r3)
+ stwu r26, GP_26-GP_22(r3)
+ dcbz r5, r3
+ stw r27, GP_27-GP_26(r3)
+ stw r28, GP_28-GP_26(r3)
+ stw r29, GP_29-GP_26(r3)
+ stw r30, GP_30-GP_26(r3)
+ stw r31, GP_31-GP_26(r3)
+#endif
+ dcbt r0, r4
+ mfcr r6
+ stw r6, GP_CR-GP_26(r3)
+ mflr r7
+ stw r7, GP_PC-GP_26(r3)
+ mfmsr r8
+ stw r8, GP_MSR-GP_26(r3)
+
+ dcbt r5, r4
+ lwz r1, GP_1(r4)
+ lwz r2, GP_2(r4)
+#if (PPC_USE_MULTIPLE == 1)
+ addi r4, r4, GP_15
+ dcbt r5, r4
+ addi r4, r4, GP_19-GP_15
+ dcbt r5, r4
+ addi r4, r4, GP_23-GP_19
+ dcbt r5, r4
+ addi r4, r4, GP_27-GP_23
+ dcbt r5, r4
+ lmw r13, GP_13-GP_27(r4)
+#else
+ lwz r13, GP_13(r4)
+ lwz r14, GP_14(r4)
+ lwzu r15, GP_15(r4)
+ dcbt r5, r4
+ lwz r16, GP_16-GP_15(r4)
+ lwz r17, GP_17-GP_15(r4)
+ lwz r18, GP_18-GP_15(r4)
+ lwzu r19, GP_19-GP_15(r4)
+ dcbt r5, r4
+ lwz r20, GP_20-GP_19(r4)
+ lwz r21, GP_21-GP_19(r4)
+ lwz r22, GP_22-GP_19(r4)
+ lwzu r23, GP_23-GP_19(r4)
+ dcbt r5, r4
+ lwz r24, GP_24-GP_23(r4)
+ lwz r25, GP_25-GP_23(r4)
+ lwz r26, GP_26-GP_23(r4)
+ lwzu r27, GP_27-GP_23(r4)
+ dcbt r5, r4
+ lwz r28, GP_28-GP_27(r4)
+ lwz r29, GP_29-GP_27(r4)
+ lwz r30, GP_30-GP_27(r4)
+ lwz r31, GP_31-GP_27(r4)
+#endif
+ lwz r6, GP_CR-GP_27(r4)
+ lwz r7, GP_PC-GP_27(r4)
+ lwz r8, GP_MSR-GP_27(r4)
+ mtcrf 255, r6
+ mtlr r7
+ mtmsr r8
+#endif
+#if (PPC_CACHE_ALIGNMENT == 32)
+ /* This assumes that all the registers are in the given order */
+ li r5, 32
+ addi r3,r3,-4
+ dcbz r5, r3
+ stw r1, GP_1+4(r3)
+ stw r2, GP_2+4(r3)
+#if (PPC_USE_MULTIPLE == 1)
+ addi r3, r3, GP_18+4
+ dcbz r5, r3
+ stmw r13, GP_13-GP_18(r3)
+#else
+ stw r13, GP_13+4(r3)
+ stw r14, GP_14+4(r3)
+ stw r15, GP_15+4(r3)
+ stw r16, GP_16+4(r3)
+ stw r17, GP_17+4(r3)
+ stwu r18, GP_18+4(r3)
+ dcbz r5, r3
+ stw r19, GP_19-GP_18(r3)
+ stw r20, GP_20-GP_18(r3)
+ stw r21, GP_21-GP_18(r3)
+ stw r22, GP_22-GP_18(r3)
+ stw r23, GP_23-GP_18(r3)
+ stw r24, GP_24-GP_18(r3)
+ stw r25, GP_25-GP_18(r3)
+ stw r26, GP_26-GP_18(r3)
+ stw r27, GP_27-GP_18(r3)
+ stw r28, GP_28-GP_18(r3)
+ stw r29, GP_29-GP_18(r3)
+ stw r30, GP_30-GP_18(r3)
+ stw r31, GP_31-GP_18(r3)
+#endif
+ dcbt r0, r4
+ mfcr r6
+ stw r6, GP_CR-GP_18(r3)
+ mflr r7
+ stw r7, GP_PC-GP_18(r3)
+ mfmsr r8
+ stw r8, GP_MSR-GP_18(r3)
+
+ dcbt r5, r4
+ lwz r1, GP_1(r4)
+ lwz r2, GP_2(r4)
+#if (PPC_USE_MULTIPLE == 1)
+ addi r4, r4, GP_19
+ dcbt r5, r4
+ lmw r13, GP_13-GP_19(r4)
+#else
+ lwz r13, GP_13(r4)
+ lwz r14, GP_14(r4)
+ lwz r15, GP_15(r4)
+ lwz r16, GP_16(r4)
+ lwz r17, GP_17(r4)
+ lwz r18, GP_18(r4)
+ lwzu r19, GP_19(r4)
+ dcbt r5, r4
+ lwz r20, GP_20-GP_19(r4)
+ lwz r21, GP_21-GP_19(r4)
+ lwz r22, GP_22-GP_19(r4)
+ lwz r23, GP_23-GP_19(r4)
+ lwz r24, GP_24-GP_19(r4)
+ lwz r25, GP_25-GP_19(r4)
+ lwz r26, GP_26-GP_19(r4)
+ lwz r27, GP_27-GP_19(r4)
+ lwz r28, GP_28-GP_19(r4)
+ lwz r29, GP_29-GP_19(r4)
+ lwz r30, GP_30-GP_19(r4)
+ lwz r31, GP_31-GP_19(r4)
+#endif
+ lwz r6, GP_CR-GP_19(r4)
+ lwz r7, GP_PC-GP_19(r4)
+ lwz r8, GP_MSR-GP_19(r4)
+ mtcrf 255, r6
+ mtlr r7
+ mtmsr r8
+#endif
+ blr
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+/*
+ * ACB: Don't worry about cache optimisation here - this is not THAT critical.
+ */
+ ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
+ PUBLIC_PROC (_CPU_Context_restore)
+PROC (_CPU_Context_restore):
+ lwz r5, GP_CR(r3)
+ lwz r6, GP_PC(r3)
+ lwz r7, GP_MSR(r3)
+ mtcrf 255, r5
+ mtlr r6
+ mtmsr r7
+ lwz r1, GP_1(r3)
+ lwz r2, GP_2(r3)
+#if (PPC_USE_MULTIPLE == 1)
+ lmw r13, GP_13(r3)
+#else
+ lwz r13, GP_13(r3)
+ lwz r14, GP_14(r3)
+ lwz r15, GP_15(r3)
+ lwz r16, GP_16(r3)
+ lwz r17, GP_17(r3)
+ lwz r18, GP_18(r3)
+ lwz r19, GP_19(r3)
+ lwz r20, GP_20(r3)
+ lwz r21, GP_21(r3)
+ lwz r22, GP_22(r3)
+ lwz r23, GP_23(r3)
+ lwz r24, GP_24(r3)
+ lwz r25, GP_25(r3)
+ lwz r26, GP_26(r3)
+ lwz r27, GP_27(r3)
+ lwz r28, GP_28(r3)
+ lwz r29, GP_29(r3)
+ lwz r30, GP_30(r3)
+ lwz r31, GP_31(r3)
+#endif
+
+ blr
+
+/* Individual interrupt prologues look like this:
+ * #if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+ * #if (PPC_HAS_FPU)
+ * stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+ * #else
+ * stwu r1, -(20*4 + IP_END)(r1)
+ * #endif
+ * #else
+ * stwu r1, -(IP_END)(r1)
+ * #endif
+ * stw r0, IP_0(r1)
+ *
+ * li r0, vectornum
+ * b PROC (_ISR_Handler{,C})
+ */
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ * The vector number is in r0. R0 has already been stacked.
+ *
+ */
+ ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
+ PUBLIC_PROC (_ISR_Handler)
+PROC (_ISR_Handler):
+#define LABEL(x) x
+#define MTSAVE(x) mtspr sprg0, x
+#define MFSAVE(x) mfspr x, sprg0
+#define MTPC(x) mtspr srr0, x
+#define MFPC(x) mfspr x, srr0
+#define MTMSR(x) mtspr srr1, x
+#define MFMSR(x) mfspr x, srr1
+ #include "irq_stub.s"
+ rfi
+
+#if (PPC_HAS_RFCI == 1)
+/* void __ISR_HandlerC()
+ *
+ * This routine provides the RTEMS interrupt management.
+ * For critical interrupts
+ *
+ */
+ ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
+ PUBLIC_PROC (_ISR_HandlerC)
+PROC (_ISR_HandlerC):
+#undef LABEL
+#undef MTSAVE
+#undef MFSAVE
+#undef MTPC
+#undef MFPC
+#undef MTMSR
+#undef MFMSR
+#define LABEL(x) x##_C
+#define MTSAVE(x) mtspr sprg1, x
+#define MFSAVE(x) mfspr x, sprg1
+#define MTPC(x) mtspr srr2, x
+#define MFPC(x) mfspr x, srr2
+#define MTMSR(x) mtspr srr3, x
+#define MFMSR(x) mfspr x, srr3
+ #include "irq_stub.s"
+ rfci
+#endif
+
+/* PowerOpen descriptors for indirect function calls.
+ */
+
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ DESCRIPTOR (_CPU_Context_save_fp)
+ DESCRIPTOR (_CPU_Context_restore_fp)
+ DESCRIPTOR (_CPU_Context_switch)
+ DESCRIPTOR (_CPU_Context_restore)
+ DESCRIPTOR (_ISR_Handler)
+#if (PPC_HAS_RFCI == 1)
+ DESCRIPTOR (_ISR_HandlerC)
+#endif
+#endif
diff --git a/c/src/exec/score/cpu/powerpc/irq_stub.s b/c/src/exec/score/cpu/powerpc/irq_stub.s
new file mode 100644
index 0000000000..42a63e991f
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/irq_stub.s
@@ -0,0 +1,228 @@
+/* irq_stub.s 1.1 - 95/12/04
+ *
+ * This file contains the interrupt handler assembly code for the PowerPC
+ * implementation of RTEMS. It is #included from cpu_asm.s.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ * The vector number is in r0. R0 has already been stacked.
+ *
+ */
+ /* Finish off the interrupt frame */
+ stw r2, IP_2(r1)
+ stw r3, IP_3(r1)
+ stw r4, IP_4(r1)
+ stw r5, IP_5(r1)
+ stw r6, IP_6(r1)
+ stw r7, IP_7(r1)
+ stw r8, IP_8(r1)
+ stw r9, IP_9(r1)
+ stw r10, IP_10(r1)
+ stw r11, IP_11(r1)
+ stw r12, IP_12(r1)
+ stw r13, IP_13(r1)
+ stmw r28, IP_28(r1)
+ mfcr r5
+ mfctr r6
+ mfxer r7
+ mflr r8
+ MFPC (r9)
+ MFMSR (r10)
+ /* Establish addressing */
+ mfspr r11, sprg3
+ dcbt r0, r11
+ stw r5, IP_CR(r1)
+ stw r6, IP_CTR(r1)
+ stw r7, IP_XER(r1)
+ stw r8, IP_LR(r1)
+ stw r9, IP_PC(r1)
+ stw r10, IP_MSR(r1)
+
+ lwz r30, Vector_table(r11)
+ slwi r4,r0,2
+ lwz r28, Nest_level(r11)
+ add r4, r4, r30
+
+ lwz r30, 0(r28)
+ mr r3, r0
+ lwz r31, Stack(r11)
+ /*
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ */
+ /* Switch stacks, here we must prevent ALL interrupts */
+ mfmsr r5
+ mfspr r6, sprg2
+ mtmsr r6
+ cmpwi r30, 0
+ lwz r29, Disable_level(r11)
+ subf r31,r1,r31
+ bne LABEL (nested)
+ stwux r1,r1,r31
+LABEL (nested):
+ /*
+ * _ISR_Nest_level++;
+ */
+ lwz r31, 0(r29)
+ addi r30,r30,1
+ stw r30,0(r28)
+ /* From here on out, interrupts can be re-enabled. RTEMS
+ * convention says not.
+ */
+ lwz r4,0(r4)
+ /*
+ * _Thread_Dispatch_disable_level++;
+ */
+ addi r31,r31,1
+ stw r31, 0(r29)
+ mtmsr r5
+ /*
+ * (*_ISR_Vector_table[ vector ])( vector );
+ */
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ lwz r6,0(r4)
+ lwz r2,4(r4)
+ mtlr r6
+ lwz r11,8(r4)
+#endif
+#if (PPC_ABI == PPC_ABI_GCC27)
+ lwz r2, Default_r2(r11)
+ mtlr r4
+ lwz r2, 0(r2)
+#endif
+#if (PPC_ABI == PPC_ABI_SVR4 || PPC_ABI == PPC_ABI_EABI)
+ mtlr r4
+ lwz r2, Default_r2(r11)
+ lwz r13, Default_r13(r11)
+ lwz r2, 0(r2)
+ lwz r13, 0(r13)
+#endif
+ mr r4,r1
+ blrl
+ /* NOP marker for debuggers */
+ or r6,r6,r6
+
+ /* We must re-disable the interrupts */
+ mfspr r11, sprg3
+ mfspr r0, sprg2
+ mtmsr r0
+ lwz r30, 0(r28)
+ lwz r31, 0(r29)
+
+ /*
+ * if (--Thread_Dispatch_disable,--_ISR_Nest_level)
+ * goto easy_exit;
+ */
+ addi r30, r30, -1
+ cmpwi r30, 0
+ addi r31, r31, -1
+ stw r30, 0(r28)
+ stw r31, 0(r29)
+ bne LABEL (easy_exit)
+ cmpwi r31, 0
+
+ lwz r30, Switch_necessary(r11)
+
+ /*
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * restore stack
+ * #endif
+ */
+ lwz r1,0(r1)
+ bne LABEL (easy_exit)
+ lwz r30, 0(r30)
+ lwz r31, Signal(r11)
+
+ /*
+ * if ( _Context_Switch_necessary )
+ * goto switch
+ */
+ cmpwi r30, 0
+ lwz r28, 0(r31)
+ li r6,0
+ bne LABEL (switch)
+ /*
+ * if ( !_ISR_Signals_to_thread_executing )
+ * goto easy_exit
+ * _ISR_Signals_to_thread_executing = 0;
+ */
+ cmpwi r28, 0
+ beq LABEL (easy_exit)
+
+ /*
+ * switch:
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ */
+LABEL (switch):
+ stw r6, 0(r31)
+ /* Re-enable interrupts */
+ lwz r0, IP_MSR(r1)
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ lwz r2, Dispatch_r2(r11)
+#else
+ /* R2 and R13 still hold their values from the last call */
+#endif
+ mtmsr r0
+ bl SYM (_Thread_Dispatch)
+ /* NOP marker for debuggers */
+ or r6,r6,r6
+ /*
+ * prepare to get out of interrupt
+ */
+ /* Re-disable IRQs */
+ mfspr r0, sprg2
+ mtmsr r0
+ /*
+ * easy_exit:
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+LABEL (easy_exit):
+ lwz r5, IP_CR(r1)
+ lwz r6, IP_CTR(r1)
+ lwz r7, IP_XER(r1)
+ lwz r8, IP_LR(r1)
+ lwz r9, IP_PC(r1)
+ lwz r10, IP_MSR(r1)
+ mtcrf 255,r5
+ mtctr r6
+ mtxer r7
+ mtlr r8
+ MTPC (r9)
+ MTMSR (r10)
+ lwz r0, IP_0(r1)
+ lwz r2, IP_2(r1)
+ lwz r3, IP_3(r1)
+ lwz r4, IP_4(r1)
+ lwz r5, IP_5(r1)
+ lwz r6, IP_6(r1)
+ lwz r7, IP_7(r1)
+ lwz r8, IP_8(r1)
+ lwz r9, IP_9(r1)
+ lwz r10, IP_10(r1)
+ lwz r11, IP_11(r1)
+ lwz r12, IP_12(r1)
+ lwz r13, IP_13(r1)
+ lmw r28, IP_28(r1)
+ lwz r1, 0(r1)
diff --git a/c/src/exec/score/cpu/powerpc/ppc.h b/c/src/exec/score/cpu/powerpc/ppc.h
new file mode 100644
index 0000000000..b76aa16338
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/ppc.h
@@ -0,0 +1,296 @@
+/* ppc.h
+ *
+ * This file contains definitions for the IBM/Motorola PowerPC
+ * family members.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/cpu/no_cpu/no_cpu.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ *
+ * Note:
+ * This file is included by both C and assembler code ( -DASM )
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_PPC_h
+#define _INCLUDE_PPC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the "no cpu"
+ * family when executing in protected mode. It does
+ * this by setting variables to indicate which implementation
+ * dependent features are present in a particular member
+ * of the family.
+ */
+
+#if defined(ppc403)
+
+#define CPU_MODEL_NAME "PowerPC 403"
+
+#define PPC_ALIGNMENT 4
+#define PPC_CACHE_ALIGNMENT 16
+#define PPC_CACHE_ALIGN_POWER 4
+#define PPC_INTERRUPT_MAX 16
+#define PPC_HAS_FPU 0
+#define PPC_HAS_DOUBLE 0
+#define PPC_HAS_RFCI 1
+#define PPC_MSR_DISABLE_MASK 0x00029200
+#define PPC_MSR_INITIAL 0x00000000
+#define PPC_INIT_FPSCR 0x00000000
+#define PPC_USE_MULTIPLE 1
+#define PPC_I_CACHE 2048
+#define PPC_D_CACHE 1024
+
+#define PPC_MSR_0 0x00029200
+#define PPC_MSR_1 0x00021200
+#define PPC_MSR_2 0x00021000
+#define PPC_MSR_3 0x00000000
+
+#elif defined(ppc601)
+
+#define CPU_MODEL_NAME "PowerPC 601"
+
+#define PPC_ALIGNMENT 8
+#define PPC_CACHE_ALIGNMENT 32
+#define PPC_CACHE_ALIGN_POWER 5
+#define PPC_INTERRUPT_MAX 16
+#define PPC_HAS_FPU 1
+#define PPC_HAS_DOUBLE 1
+#define PPC_HAS_RFCI 0
+#define PPC_MSR_DISABLE_MASK 0x00009900
+#define PPC_MSR_INITIAL 0x00002000
+#define PPC_INIT_FPSCR 0x000000f8
+#define PPC_USE_MULTIPLE 1
+#define PPC_I_CACHE 0
+#define PPC_D_CACHE 32768
+
+#define PPC_MSR_0 0x00009900
+#define PPC_MSR_1 0x00001000
+#define PPC_MSR_2 0x00001000
+#define PPC_MSR_3 0x00000000
+
+#elif defined(ppc602)
+
+#define CPU_MODEL_NAME "PowerPC 602"
+
+#define PPC_ALIGNMENT 4
+#define PPC_CACHE_ALIGNMENT 32
+#define PPC_CACHE_ALIGN_POWER 5
+#define PPC_INTERRUPT_MAX 16
+#define PPC_HAS_FPU 1
+#define PPC_HAS_DOUBLE 0
+#define PPC_HAS_RFCI 0
+#define PPC_MSR_DISABLE_MASK
+#define PPC_MSR_INITIAL
+#define PPC_INIT_FPSCR
+#define PPC_USE_MULTIPLE 0
+#define PPC_I_CACHE 4096
+#define PPC_D_CACHE 4096
+
+#elif defined(ppc603)
+
+#define CPU_MODEL_NAME "PowerPC 603"
+
+#define PPC_ALIGNMENT 8
+#define PPC_CACHE_ALIGNMENT 32
+#define PPC_CACHE_ALIGN_POWER 5
+#define PPC_INTERRUPT_MAX 16
+#define PPC_HAS_FPU 1
+#define PPC_HAS_DOUBLE 1
+#define PPC_HAS_RFCI 0
+#define PPC_MSR_DISABLE_MASK 0x00009900
+#define PPC_MSR_INITIAL 0x00002000
+#define PPC_INIT_FPSCR 0x000000f8
+#define PPC_USE_MULTIPLE 0
+#define PPC_I_CACHE 8192
+#define PPC_D_CACHE 8192
+
+#define PPC_MSR_0 0x00009900
+#define PPC_MSR_1 0x00001000
+#define PPC_MSR_2 0x00001000
+#define PPC_MSR_3 0x00000000
+
+#elif defined(ppc603e)
+
+#define CPU_MODEL_NAME "PowerPC 603e"
+
+#define PPC_ALIGNMENT 8
+#define PPC_CACHE_ALIGNMENT 32
+#define PPC_CACHE_ALIGN_POWER 5
+#define PPC_INTERRUPT_MAX 16
+#define PPC_HAS_FPU 1
+#define PPC_HAS_DOUBLE 1
+#define PPC_HAS_RFCI 0
+#define PPC_MSR_DISABLE_MASK 0x00009900
+#define PPC_MSR_INITIAL 0x00002000
+#define PPC_INIT_FPSCR 0x000000f8
+#define PPC_USE_MULTIPLE 0
+#define PPC_I_CACHE 16384
+#define PPC_D_CACHE 16384
+
+#define PPC_MSR_0 0x00009900
+#define PPC_MSR_1 0x00001000
+#define PPC_MSR_2 0x00001000
+#define PPC_MSR_3 0x00000000
+
+#elif defined(ppc604)
+
+#define CPU_MODEL_NAME "PowerPC 604"
+
+#define PPC_ALIGNMENT 8
+#define PPC_CACHE_ALIGNMENT 32
+#define PPC_CACHE_ALIGN_POWER 5
+#define PPC_INTERRUPT_MAX 16
+#define PPC_HAS_FPU 1
+#define PPC_HAS_DOUBLE 1
+#define PPC_HAS_RFCI 0
+#define PPC_MSR_DISABLE_MASK 0x00009900
+#define PPC_MSR_INITIAL 0x00002000
+#define PPC_INIT_FPSCR 0x000000f8
+#define PPC_USE_MULTIPLE 0
+#define PPC_I_CACHE 16384
+#define PPC_D_CACHE 16384
+
+#define PPC_MSR_0 0x00009900
+#define PPC_MSR_1 0x00001000
+#define PPC_MSR_2 0x00001000
+#define PPC_MSR_3 0x00000000
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Application binary interfaces.
+ * PPC_ABI MUST be defined as one of these.
+ * Only PPC_ABI_POWEROPEN is currently fully supported.
+ * Only EABI will be supported in the end when
+ * the tools are there.
+ * Only big endian is currently supported.
+ */
+/*
+ * PowerOpen ABI. This is Andy's hack of the
+ * PowerOpen ABI to ELF. ELF rather than a
+ * XCOFF assembler is used. This may work
+ * if PPC_ASM == PPC_ASM_XCOFF is defined.
+ */
+#define PPC_ABI_POWEROPEN 0
+/*
+ * GCC 2.7.0 munched version of EABI, with
+ * PowerOpen calling convention and stack frames,
+ * but EABI style indirect function calls.
+ */
+#define PPC_ABI_GCC27 1
+/*
+ * SVR4 ABI
+ */
+#define PPC_ABI_SVR4 2
+/*
+ * Embedded ABI
+ */
+#define PPC_ABI_EABI 3
+
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+#define PPC_STACK_ALIGNMENT 8
+#elif (PPC_ABI == PPC_ABI_GCC27)
+#define PPC_STACK_ALIGNMENT 8
+#elif (PPC_ABI == PPC_ABI_SVR4)
+#define PPC_STACK_ALIGNMENT 16
+#elif (PPC_ABI == PPC_ABI_EABI)
+#define PPC_STACK_ALIGNMENT 8
+#else
+#error "PPC_ABI is not properly defined"
+#endif
+#ifndef PPC_ABI
+#error "PPC_ABI is not properly defined"
+#endif
+
+/*
+ * Assemblers.
+ * PPC_ASM MUST be defined as one of these.
+ * Only PPC_ABI_ELF is currently fully supported.
+ */
+/*
+ * ELF assembler. Currently used for all ABIs.
+ */
+#define PPC_ASM_ELF 0
+/*
+ * XCOFF assembler, may be needed for PowerOpen ABI.
+ */
+#define PPC_ASM_XCOFF 1
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "PowerPC"
+
+/*
+ * Interrupt vectors.
+ */
+/* Machine check */
+#define PPC_IRQ_MCHECK 0
+/* Protection violation */
+#define PPC_IRQ_PROTECT 1
+/* External interrupt */
+#define PPC_IRQ_EXTERNAL 2
+/* Program exception */
+#define PPC_IRQ_PROGRAM 3
+/* System call */
+#define PPC_IRQ_SCALL 4
+/* Floating point unavailable */
+#define PPC_IRQ_NOFP 5
+/* Program interval timer */
+#define PPC_IRQ_PIT 6
+/* Fixed interval timer */
+#define PPC_IRQ_FIT 7
+/* Critical interrupt pin */
+#define PPC_IRQ_CRIT 8
+/* Watchdog timer */
+#define PPC_IRQ_WATCHDOG 9
+/* Debug exceptions */
+#define PPC_IRQ_DEBUG 10
+
+/*
+ * The following exceptions are not maskable, and are not
+ * necessarily predictable, so cannot be offered to RTEMS:
+ * Alignment exception - handled by the CPU module
+ * Data exceptions.
+ * Instruction exceptions.
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_PPC_h */
+/* end of include file */
diff --git a/c/src/exec/score/cpu/powerpc/ppctypes.h b/c/src/exec/score/cpu/powerpc/ppctypes.h
new file mode 100644
index 0000000000..71f1b814b2
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/ppctypes.h
@@ -0,0 +1,74 @@
+/* ppctypes.h
+ *
+ * This include file contains type definitions pertaining to the PowerPC
+ * processor family.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/cpu/no_cpu/no_cputypes.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PPC_TYPES_h
+#define __PPC_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned32 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void ppc_isr;
+typedef void ( *ppc_isr_entry )( int, struct CPU_Interrupt_frame * );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/powerpc/rtems.s b/c/src/exec/score/cpu/powerpc/rtems.s
new file mode 100644
index 0000000000..b653152411
--- /dev/null
+++ b/c/src/exec/score/cpu/powerpc/rtems.s
@@ -0,0 +1,132 @@
+/* rtems.s
+ *
+ * This file contains the single entry point code for
+ * the PowerPC implementation of RTEMS.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/cpu/no_cpu/rtems.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+
+ BEGIN_CODE
+/*
+ * RTEMS
+ *
+ * This routine jumps to the directive indicated in r11.
+ * This routine is used when RTEMS is linked by itself and placed
+ * in ROM. This routine is the first address in the ROM space for
+ * RTEMS. The user "calls" this address with the directive arguments
+ * in the normal place.
+ * This routine then jumps indirectly to the correct directive
+ * preserving the arguments. The directive should not realize
+ * it has been "wrapped" in this way. The table "_Entry_points"
+ * is used to look up the directive.
+ */
+
+ ALIGN (4, 2)
+ PUBLIC_PROC (RTEMS)
+PROC (RTEMS):
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ mflr r0
+ stw r0, 8(r1)
+ stwu r1, -64(r1)
+
+ /* Establish addressing */
+ bl base
+base:
+ mflr r12
+ addi r12, r12, tabaddr - base
+
+ lwz r12, Entry_points-abase(r12)
+ slwi r11, r11, 2
+ lwzx r12, r12, r11
+
+ stw r2, 56(r1)
+ lwz r0, 0(r12)
+ mtlr r0
+ lwz r2, 4(r12)
+ lwz r11, 8(r12)
+ blrl
+ lwz r2, 56(r1)
+ addi r1, r1, 64
+ lwz r0, 8(r1)
+ mtlr r0
+#else
+ mflr r0
+ stw r0, 4(r1)
+ stwu r1, -16(r1)
+
+ /* Establish addressing */
+ bl base
+base:
+ mflr r12
+ addi r12, r12, tabaddr - base
+
+ lwz r12, Entry_points-abase(r12)
+ slwi r11, r11, 2
+ lwzx r11, r12, r11
+
+ stw r2, 8(r1)
+#if (PPC_ABI != PPC_ABI_GCC27)
+ stw r13, 12(r1)
+#endif
+ mtlr r11
+ lwz r11, irqinfo-abase(r12)
+ lwz r2, 0(r11)
+#if (PPC_ABI != PPC_ABI_GCC27)
+ lwz r13, 4(r11)
+#endif
+ blrl
+ lwz r2, 8(r1)
+#if (PPC_ABI != PPC_ABI_GCC27)
+ lwz r13, 12(r1)
+#endif
+ addi r1, r1, 16
+ lwz r0, 4(r1)
+ mtlr r0
+#endif
+ blr
+
+
+ /* Addressability stuff */
+tabaddr:
+abase:
+ EXTERN_VAR (_Entry_points)
+Entry_points:
+ EXT_SYM_REF (_Entry_points)
+#if (PPC_ABI != PPC_ABI_POWEROPEN)
+ EXTERN_VAR (_CPU_IRQ_info)
+irqinfo:
+ EXT_SYM_REF (_CPU_IRQ_info)
+#endif
+
+#if (PPC_ABI == PPC_ABI_POWEROPEN)
+ DESCRIPTOR (RTEMS)
+#endif
+
+
diff --git a/c/src/exec/score/cpu/sparc/Makefile.in b/c/src/exec/score/cpu/sparc/Makefile.in
new file mode 100644
index 0000000000..1d133232b0
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/Makefile.in
@@ -0,0 +1,74 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpu
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/sparc.h $(srcdir)/sparctypes.h
+
+# H_FILES that get installed externally
+EXTERNAL_H_FILES = $(srcdir)/asm.h $(srcdir)/erc32.h
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=cpu_asm rtems
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) $(EXTERNAL_H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) preinstall $(OBJS) $(RELS)
+
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/targopts.h \
+ ${PROJECT_RELEASE}/lib/bsp_specs
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+# we will share the basic cpu file
+ $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+ $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/sparc/README b/c/src/exec/score/cpu/sparc/README
new file mode 100644
index 0000000000..c4c2200075
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/README
@@ -0,0 +1,110 @@
+#
+# $Id$
+#
+
+This file discusses SPARC specific issues which are important to
+this port. The primary topics in this file are:
+
+ + Global Register Usage
+ + Stack Frame
+ + EF bit in the PSR
+
+
+Global Register Usage
+=====================
+
+This information on register usage is based heavily on a comment in the
+file gcc-2.7.0/config/sparc/sparc.h in the the gcc 2.7.0 source.
+
+ + g0 is hardwired to 0
+ + On non-v9 systems:
+ - g1 is free to use as temporary.
+ - g2-g4 are reserved for applications. Gcc normally uses them as
+ temporaries, but this can be disabled via the -mno-app-regs option.
+ - g5 through g7 are reserved for the operating system.
+ + On v9 systems:
+ - g1 and g5 are free to use as temporaries.
+ - g2-g4 are reserved for applications (the compiler will not normally use
+ them, but they can be used as temporaries with -mapp-regs).
+ - g6-g7 are reserved for the operating system.
+
+ NOTE: As of gcc 2.7.0 register g1 was used in the following scenarios:
+
+ + as a temporary by the 64 bit sethi pattern
+ + when restoring call-preserved registers in large stack frames
+
+RTEMS places no constraints on the usage of the global registers. Although
+gcc assumes that either g5-g7 (non-V9) or g6-g7 (V9) are reserved for the
+operating system, RTEMS does not assume any special use for them.
+
+
+
+Stack Frame
+===========
+
+The stack grows downward (i.e. to lower addresses) on the SPARC architecture.
+
+The following is the organization of the stack frame:
+
+
+
+ | ............... |
+ fp | |
+ +-------------------------------+
+ | |
+ | Local registers, temporaries, |
+ | and saved floats | x bytes
+ | |
+ sp + x +-------------------------------+
+ | |
+ | outgoing parameters past |
+ | the sixth one | x bytes
+ | |
+ sp + 92 +-------------------------------+ *
+ | | *
+ | area for callee to save | *
+ | register arguments | * 24 bytes
+ | | *
+ sp + 68 +-------------------------------+ *
+ | | *
+ | structure return pointer | * 4 bytes
+ | | *
+ sp + 64 +-------------------------------+ *
+ | | *
+ | local register set | * 32 bytes
+ | | *
+ sp + 32 +-------------------------------+ *
+ | | *
+ | input register set | * 32 bytes
+ | | *
+ sp +-------------------------------+ *
+
+
+* = minimal stack frame
+
+x = optional components
+
+EF bit in the PSR
+=================
+
+The EF (enable floating point unit) in the PSR is utilized in this port to
+prevent non-floating point tasks from performing floating point
+operations. This bit is maintained as part of the integer context.
+However, the floating point context is switched BEFORE the integer
+context. Thus the EF bit in place at the time of the FP switch may
+indicate that FP operations are disabled. This occurs on certain task
+switches, when the EF bit will be 0 for the outgoing task and thus a fault
+will be generated on the first FP operation of the FP context save.
+
+The remedy for this is to enable FP access as the first step in both the
+save and restore of the FP context area. This bit will be subsequently
+reloaded by the integer context switch.
+
+Two of the scenarios which demonstrate this problem are outlined below:
+
+1. When the first FP task is switched to. The system tasks are not FP and
+thus would be unable to restore the FP context of the incoming task.
+
+2. On a deferred FP context switch. In this case, the system might switch
+from FP Task A to non-FP Task B and then to FP Task C. In this scenario,
+the floating point state must technically be saved by a non-FP task.
diff --git a/c/src/exec/score/cpu/sparc/asm.h b/c/src/exec/score/cpu/sparc/asm.h
new file mode 100644
index 0000000000..b9a3aabeea
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/asm.h
@@ -0,0 +1,123 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted.
+ *
+ * $Id$
+ */
+
+#ifndef __SPARC_ASM_h
+#define __SPARC_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+
+#include <rtems/score/targopts.h>
+#include <rtems/score/cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+/* XXX __USER_LABEL_PREFIX__ and __REGISTER_PREFIX__ do not work on gcc 2.7.0 */
+/* XXX The following ifdef magic fixes the problem but results in a warning */
+/* XXX when compiling assembly code. */
+#undef __USER_LABEL_PREFIX__
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+/*
+ * Entry for traps which jump to a programmer-specified trap handler.
+ */
+
+#define TRAP(_vector, _handler) \
+ mov %psr, %l0 ; \
+ sethi %hi(_handler), %l4 ; \
+ jmp %l4+%lo(_handler); \
+ mov _vector, %l3
+
+/*
+ * Used for the reset trap for ERC32 to avoid a supervisor instruction
+ */
+
+#define RTRAP(_vector, _handler) \
+ mov %g0, %l0 ; \
+ sethi %hi(_handler), %l4 ; \
+ jmp %l4+%lo(_handler); \
+ mov _vector, %l3
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/exec/score/cpu/sparc/cpu.c b/c/src/exec/score/cpu/sparc/cpu.c
new file mode 100644
index 0000000000..1cf96a4bb7
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/cpu.c
@@ -0,0 +1,409 @@
+/*
+ * SPARC Dependent Source
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+#if defined(erc32)
+#include <erc32.h>
+#endif
+
+/*
+ * This initializes the set of opcodes placed in each trap
+ * table entry. The routine which installs a handler is responsible
+ * for filling in the fields for the _handler address and the _vector
+ * trap type.
+ *
+ * The constants following this structure are masks for the fields which
+ * must be filled in when the handler is installed.
+ */
+
+const CPU_Trap_table_entry _CPU_Trap_slot_template = {
+ 0xa1480000, /* mov %psr, %l0 */
+ 0x29000000, /* sethi %hi(_handler), %l4 */
+ 0x81c52000, /* jmp %l4 + %lo(_handler) */
+ 0xa6102000 /* mov _vector, %l3 */
+};
+
+/*PAGE
+ *
+ * _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * Input Parameters:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ *
+ * Output Parameters: NONE
+ *
+ * NOTE: There is no need to save the pointer to the thread dispatch routine.
+ * The SPARC's assembly code can reference it directly with no problems.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ void *pointer;
+
+#ifndef NO_TABLE_MOVE
+ unsigned32 trap_table_start;
+ unsigned32 tbr_value;
+ CPU_Trap_table_entry *old_tbr;
+ CPU_Trap_table_entry *trap_table;
+
+ /*
+ * Install the executive's trap table. All entries from the original
+ * trap table are copied into the executive's trap table. This is essential
+ * since this preserves critical trap handlers such as the window underflow
+ * and overflow handlers. It is the responsibility of the BSP to provide
+ * install these in the initial trap table.
+ */
+
+
+ trap_table_start = (unsigned32) &_CPU_Trap_Table_area;
+ if (trap_table_start & (SPARC_TRAP_TABLE_ALIGNMENT-1))
+ trap_table_start = (trap_table_start + SPARC_TRAP_TABLE_ALIGNMENT) &
+ ~(SPARC_TRAP_TABLE_ALIGNMENT-1);
+
+ trap_table = (CPU_Trap_table_entry *) trap_table_start;
+
+ sparc_get_tbr( tbr_value );
+
+ old_tbr = (CPU_Trap_table_entry *) (tbr_value & 0xfffff000);
+
+ memcpy( trap_table, (void *) old_tbr, 256 * sizeof( CPU_Trap_table_entry ) );
+
+ sparc_set_tbr( trap_table_start );
+
+#endif
+
+ /*
+ * This seems to be the most appropriate way to obtain an initial
+ * FP context on the SPARC. The NULL fp context is copied it to
+ * the task's FP context during Context_Initialize.
+ */
+
+ pointer = &_CPU_Null_fp_context;
+ _CPU_Context_save_fp( &pointer );
+
+ /*
+ * Grab our own copy of the user's CPU table.
+ */
+
+ _CPU_Table = *cpu_table;
+
+#if defined(erc32)
+
+ /*
+ * ERC32 specific initialization
+ */
+
+ _ERC32_MEC_Timer_Control_Mirror = 0;
+ ERC32_MEC.Timer_Control = 0;
+
+ ERC32_MEC.Control |= ERC32_CONFIGURATION_POWER_DOWN_ALLOWED;
+
+#endif
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ *
+ * Input Parameters: NONE
+ *
+ * Output Parameters:
+ * returns the current interrupt level (PIL field of the PSR)
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 level;
+
+ sparc_get_interrupt_level( level );
+
+ return level;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs the specified handler as a "raw" non-executive
+ * supported trap handler (a.k.a. interrupt service routine).
+ *
+ * Input Parameters:
+ * vector - trap table entry number plus synchronous
+ * vs. asynchronous information
+ * new_handler - address of the handler to be installed
+ * old_handler - pointer to an address of the handler previously installed
+ *
+ * Output Parameters: NONE
+ * *new_handler - address of the handler previously installed
+ *
+ * NOTE:
+ *
+ * On the SPARC, there are really only 256 vectors. However, the executive
+ * has no easy, fast, reliable way to determine which traps are synchronous
+ * and which are asynchronous. By default, synchronous traps return to the
+ * instruction which caused the interrupt. So if you install a software
+ * trap handler as an executive interrupt handler (which is desirable since
+ * RTEMS takes care of window and register issues), then the executive needs
+ * to know that the return address is to the trap rather than the instruction
+ * following the trap.
+ *
+ * So vectors 0 through 255 are treated as regular asynchronous traps which
+ * provide the "correct" return address. Vectors 256 through 512 are assumed
+ * by the executive to be synchronous and to require that the return address
+ * be fudged.
+ *
+ * If you use this mechanism to install a trap handler which must reexecute
+ * the instruction which caused the trap, then it should be installed as
+ * an asynchronous trap. This will avoid the executive changing the return
+ * address.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ unsigned32 real_vector;
+ CPU_Trap_table_entry *tbr;
+ CPU_Trap_table_entry *slot;
+ unsigned32 u32_tbr;
+ unsigned32 u32_handler;
+
+ /*
+ * Get the "real" trap number for this vector ignoring the synchronous
+ * versus asynchronous indicator included with our vector numbers.
+ */
+
+ real_vector = SPARC_REAL_TRAP_NUMBER( vector );
+
+ /*
+ * Get the current base address of the trap table and calculate a pointer
+ * to the slot we are interested in.
+ */
+
+ sparc_get_tbr( u32_tbr );
+
+ u32_tbr &= 0xfffff000;
+
+ tbr = (CPU_Trap_table_entry *) u32_tbr;
+
+ slot = &tbr[ real_vector ];
+
+ /*
+ * Get the address of the old_handler from the trap table.
+ *
+ * NOTE: The old_handler returned will be bogus if it does not follow
+ * the RTEMS model.
+ */
+
+#define HIGH_BITS_MASK 0xFFFFFC00
+#define HIGH_BITS_SHIFT 10
+#define LOW_BITS_MASK 0x000003FF
+
+ if ( slot->mov_psr_l0 == _CPU_Trap_slot_template.mov_psr_l0 ) {
+ u32_handler =
+ ((slot->sethi_of_handler_to_l4 & HIGH_BITS_MASK) << HIGH_BITS_SHIFT) |
+ (slot->jmp_to_low_of_handler_plus_l4 & LOW_BITS_MASK);
+ *old_handler = (proc_ptr) u32_handler;
+ } else
+ *old_handler = 0;
+
+ /*
+ * Copy the template to the slot and then fix it.
+ */
+
+ *slot = _CPU_Trap_slot_template;
+
+ u32_handler = (unsigned32) new_handler;
+
+ slot->mov_vector_l3 |= vector;
+ slot->sethi_of_handler_to_l4 |=
+ (u32_handler & HIGH_BITS_MASK) >> HIGH_BITS_SHIFT;
+ slot->jmp_to_low_of_handler_plus_l4 |= (u32_handler & LOW_BITS_MASK);
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * new_handler - replacement ISR for this vector number
+ * old_handler - pointer to former ISR for this vector number
+ *
+ * Output parameters:
+ * *old_handler - former ISR for this vector number
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ unsigned32 real_vector;
+ proc_ptr ignored;
+
+ /*
+ * Get the "real" trap number for this vector ignoring the synchronous
+ * versus asynchronous indicator included with our vector numbers.
+ */
+
+ real_vector = SPARC_REAL_TRAP_NUMBER( vector );
+
+ /*
+ * Return the previous ISR handler.
+ */
+
+ *old_handler = _ISR_Vector_table[ real_vector ];
+
+ /*
+ * Install the wrapper so this ISR can be invoked properly.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ real_vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Context_Initialize
+ *
+ * This kernel routine initializes the basic non-FP context area associated
+ * with each thread.
+ *
+ * Input parameters:
+ * the_context - pointer to the context area
+ * stack_base - address of memory for the SPARC
+ * size - size in bytes of the stack area
+ * new_level - interrupt level for this context area
+ * entry_point - the starting execution point for this this context
+ * is_fp - TRUE if this context is associated with an FP thread
+ *
+ * Output parameters: NONE
+ */
+
+void _CPU_Context_Initialize(
+ Context_Control *the_context,
+ unsigned32 *stack_base,
+ unsigned32 size,
+ unsigned32 new_level,
+ void *entry_point,
+ boolean is_fp
+)
+{
+ unsigned32 stack_high; /* highest "stack aligned" address */
+ unsigned32 the_size;
+ unsigned32 tmp_psr;
+
+ /*
+ * On CPUs with stacks which grow down (i.e. SPARC), we build the stack
+ * based on the stack_high address.
+ */
+
+ stack_high = ((unsigned32)(stack_base) + size);
+ stack_high &= ~(CPU_STACK_ALIGNMENT - 1);
+
+ the_size = size & ~(CPU_STACK_ALIGNMENT - 1);
+
+ /*
+ * See the README in this directory for a diagram of the stack.
+ */
+
+ the_context->o7 = ((unsigned32) entry_point) - 8;
+ the_context->o6_sp = stack_high - CPU_MINIMUM_STACK_FRAME_SIZE;
+ the_context->i6_fp = stack_high;
+
+ /*
+ * Build the PSR for the task. Most everything can be 0 and the
+ * CWP is corrected during the context switch.
+ *
+ * The EF bit determines if the floating point unit is available.
+ * The FPU is ONLY enabled if the context is associated with an FP task
+ * and this SPARC model has an FPU.
+ */
+
+ sparc_get_psr( tmp_psr );
+ tmp_psr &= ~SPARC_PSR_PIL_MASK;
+ tmp_psr |= (new_level << 8) & SPARC_PSR_PIL_MASK;
+ tmp_psr &= ~SPARC_PSR_EF_MASK; /* disabled by default */
+
+#if (SPARC_HAS_FPU == 1)
+ /*
+ * If this bit is not set, then a task gets a fault when it accesses
+ * a floating point register. This is a nice way to detect floating
+ * point tasks which are not currently declared as such.
+ */
+
+ if ( is_fp )
+ tmp_psr |= SPARC_PSR_EF_MASK;
+#endif
+ the_context->psr = tmp_psr;
+}
+
+/*PAGE
+ *
+ * _CPU_Thread_Idle_body
+ *
+ * Some SPARC implementations have low power, sleep, or idle modes. This
+ * tries to take advantage of those models.
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == TRUE)
+
+/*
+ * This is the implementation for the erc32.
+ *
+ * NOTE: Low power mode was enabled at initialization time.
+ */
+
+#if defined(erc32)
+
+void _CPU_Thread_Idle_body( void )
+{
+ while (1) {
+ ERC32_MEC.Power_Down = 0; /* value is irrelevant */
+ }
+}
+
+#endif
+
+#endif /* CPU_PROVIDES_IDLE_THREAD_BODY */
diff --git a/c/src/exec/score/cpu/sparc/cpu.h b/c/src/exec/score/cpu/sparc/cpu.h
new file mode 100644
index 0000000000..7969b9aa0c
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/cpu.h
@@ -0,0 +1,1003 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the port of
+ * the executive to the SPARC processor.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/sparc.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/sparctypes.h>
+#endif
+
+/* conditional compilation parameters */
+
+/*
+ * Should the calls to _Thread_Enable_dispatch be inlined?
+ *
+ * If TRUE, then they are inlined.
+ * If FALSE, then a subroutine call is made.
+ */
+
+#define CPU_INLINE_ENABLE_DISPATCH TRUE
+
+/*
+ * Should the body of the search loops in _Thread_queue_Enqueue_priority
+ * be unrolled one time? In unrolled each iteration of the loop examines
+ * two "nodes" on the chain being searched. Otherwise, only one node
+ * is examined per iteration.
+ *
+ * If TRUE, then the loops are unrolled.
+ * If FALSE, then the loops are not unrolled.
+ *
+ * This parameter could go either way on the SPARC. The interrupt flash
+ * code is relatively lengthy given the requirements for nops following
+ * writes to the psr. But if the clock speed were high enough, this would
+ * not represent a great deal of time.
+ */
+
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+
+/*
+ * Does the executive manage a dedicated interrupt stack in software?
+ *
+ * If TRUE, then a stack is allocated in _Interrupt_Manager_initialization.
+ * If FALSE, nothing is done.
+ *
+ * The SPARC does not have a dedicated HW interrupt stack and one has
+ * been implemented in SW.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK TRUE
+
+/*
+ * Does this CPU have hardware support for a dedicated interrupt stack?
+ *
+ * If TRUE, then it must be installed during initialization.
+ * If FALSE, then no installation is performed.
+ *
+ * The SPARC does not have a dedicated HW interrupt stack.
+ */
+
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Do we allocate a dedicated interrupt stack in the Interrupt Manager?
+ *
+ * If TRUE, then the memory is allocated during initialization.
+ * If FALSE, then the memory is allocated during initialization.
+ */
+
+#define CPU_ALLOCATE_INTERRUPT_STACK TRUE
+
+/*
+ * Does the CPU have hardware floating point?
+ *
+ * If TRUE, then the FLOATING_POINT task attribute is supported.
+ * If FALSE, then the FLOATING_POINT task attribute is ignored.
+ */
+
+#if ( SPARC_HAS_FPU == 1 )
+#define CPU_HARDWARE_FP TRUE
+#else
+#define CPU_HARDWARE_FP FALSE
+#endif
+
+/*
+ * Are all tasks FLOATING_POINT tasks implicitly?
+ *
+ * If TRUE, then the FLOATING_POINT task attribute is assumed.
+ * If FALSE, then the FLOATING_POINT task attribute is followed.
+ */
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+
+/*
+ * Should the IDLE task have a floating point context?
+ *
+ * If TRUE, then the IDLE task is created as a FLOATING_POINT task
+ * and it has a floating point context which is switched in and out.
+ * If FALSE, then the IDLE task does not have a floating point context.
+ */
+
+#define CPU_IDLE_TASK_IS_FP FALSE
+
+/*
+ * Should the saving of the floating point registers be deferred
+ * until a context switch is made to another different floating point
+ * task?
+ *
+ * If TRUE, then the floating point context will not be stored until
+ * necessary. It will remain in the floating point registers and not
+ * disturned until another floating point task is switched to.
+ *
+ * If FALSE, then the floating point context is saved when a floating
+ * point task is switched out and restored when the next floating point
+ * task is restored. The state of the floating point registers between
+ * those two operations is not specified.
+ */
+
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+/*
+ * Does this port provide a CPU dependent IDLE task implementation?
+ *
+ * If TRUE, then the routine _CPU_Thread_Idle_body
+ * must be provided and is the default IDLE thread body instead of
+ * _CPU_Thread_Idle_body.
+ *
+ * If FALSE, then use the generic IDLE thread body if the BSP does
+ * not provide one.
+ */
+
+#if (SPARC_HAS_LOW_POWER_MODE == 1)
+#define CPU_PROVIDES_IDLE_THREAD_BODY TRUE
+#else
+#define CPU_PROVIDES_IDLE_THREAD_BODY FALSE
+#endif
+
+/*
+ * Does the stack grow up (toward higher addresses) or down
+ * (toward lower addresses)?
+ *
+ * If TRUE, then the grows upward.
+ * If FALSE, then the grows toward smaller addresses.
+ *
+ * The stack grows to lower addresses on the SPARC.
+ */
+
+#define CPU_STACK_GROWS_UP FALSE
+
+/*
+ * The following is the variable attribute used to force alignment
+ * of critical data structures. On some processors it may make
+ * sense to have these aligned on tighter boundaries than
+ * the minimum requirements of the compiler in order to have as
+ * much of the critical data area as possible in a cache line.
+ *
+ * The SPARC does not appear to have particularly strict alignment
+ * requirements. This value was chosen to take advantages of caches.
+ */
+
+#define CPU_STRUCTURE_ALIGNMENT __attribute__ ((aligned (16)))
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+
+/*
+ * The following defines the number of bits actually used in the
+ * interrupt field of the task mode. How those bits map to the
+ * CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
+ *
+ * The SPARC has 16 interrupt levels in the PIL field of the PSR.
+ */
+
+#define CPU_MODES_INTERRUPT_MASK 0x0000000F
+
+/*
+ * This structure represents the organization of the minimum stack frame
+ * for the SPARC. More framing information is required in certain situaions
+ * such as when there are a large number of out parameters or when the callee
+ * must save floating point registers.
+ */
+
+#ifndef ASM
+
+typedef struct {
+ unsigned32 l0;
+ unsigned32 l1;
+ unsigned32 l2;
+ unsigned32 l3;
+ unsigned32 l4;
+ unsigned32 l5;
+ unsigned32 l6;
+ unsigned32 l7;
+ unsigned32 i0;
+ unsigned32 i1;
+ unsigned32 i2;
+ unsigned32 i3;
+ unsigned32 i4;
+ unsigned32 i5;
+ unsigned32 i6_fp;
+ unsigned32 i7;
+ void *structure_return_address;
+ /*
+ * The following are for the callee to save the register arguments in
+ * should this be necessary.
+ */
+ unsigned32 saved_arg0;
+ unsigned32 saved_arg1;
+ unsigned32 saved_arg2;
+ unsigned32 saved_arg3;
+ unsigned32 saved_arg4;
+ unsigned32 saved_arg5;
+ unsigned32 pad0;
+} CPU_Minimum_stack_frame;
+
+#endif /* ASM */
+
+#define CPU_STACK_FRAME_L0_OFFSET 0x00
+#define CPU_STACK_FRAME_L1_OFFSET 0x04
+#define CPU_STACK_FRAME_L2_OFFSET 0x08
+#define CPU_STACK_FRAME_L3_OFFSET 0x0c
+#define CPU_STACK_FRAME_L4_OFFSET 0x10
+#define CPU_STACK_FRAME_L5_OFFSET 0x14
+#define CPU_STACK_FRAME_L6_OFFSET 0x18
+#define CPU_STACK_FRAME_L7_OFFSET 0x1c
+#define CPU_STACK_FRAME_I0_OFFSET 0x20
+#define CPU_STACK_FRAME_I1_OFFSET 0x24
+#define CPU_STACK_FRAME_I2_OFFSET 0x28
+#define CPU_STACK_FRAME_I3_OFFSET 0x2c
+#define CPU_STACK_FRAME_I4_OFFSET 0x30
+#define CPU_STACK_FRAME_I5_OFFSET 0x34
+#define CPU_STACK_FRAME_I6_FP_OFFSET 0x38
+#define CPU_STACK_FRAME_I7_OFFSET 0x3c
+#define CPU_STRUCTURE_RETURN_ADDRESS_OFFSET 0x40
+#define CPU_STACK_FRAME_SAVED_ARG0_OFFSET 0x44
+#define CPU_STACK_FRAME_SAVED_ARG1_OFFSET 0x48
+#define CPU_STACK_FRAME_SAVED_ARG2_OFFSET 0x4c
+#define CPU_STACK_FRAME_SAVED_ARG3_OFFSET 0x50
+#define CPU_STACK_FRAME_SAVED_ARG4_OFFSET 0x54
+#define CPU_STACK_FRAME_SAVED_ARG5_OFFSET 0x58
+#define CPU_STACK_FRAME_PAD0_OFFSET 0x5c
+
+#define CPU_MINIMUM_STACK_FRAME_SIZE 0x60
+
+/*
+ * Contexts
+ *
+ * Generally there are 2 types of context to save.
+ * 1. Interrupt registers to save
+ * 2. Task level registers to save
+ *
+ * This means we have the following 3 context items:
+ * 1. task level context stuff:: Context_Control
+ * 2. floating point task stuff:: Context_Control_fp
+ * 3. special interrupt level context :: Context_Control_interrupt
+ *
+ * On the SPARC, we are relatively conservative in that we save most
+ * of the CPU state in the context area. The ET (enable trap) bit and
+ * the CWP (current window pointer) fields of the PSR are considered
+ * system wide resources and are not maintained on a per-thread basis.
+ */
+
+#ifndef ASM
+
+typedef struct {
+ /*
+ * Using a double g0_g1 will put everything in this structure on a
+ * double word boundary which allows us to use double word loads
+ * and stores safely in the context switch.
+ */
+ double g0_g1;
+ unsigned32 g2;
+ unsigned32 g3;
+ unsigned32 g4;
+ unsigned32 g5;
+ unsigned32 g6;
+ unsigned32 g7;
+
+ unsigned32 l0;
+ unsigned32 l1;
+ unsigned32 l2;
+ unsigned32 l3;
+ unsigned32 l4;
+ unsigned32 l5;
+ unsigned32 l6;
+ unsigned32 l7;
+
+ unsigned32 i0;
+ unsigned32 i1;
+ unsigned32 i2;
+ unsigned32 i3;
+ unsigned32 i4;
+ unsigned32 i5;
+ unsigned32 i6_fp;
+ unsigned32 i7;
+
+ unsigned32 o0;
+ unsigned32 o1;
+ unsigned32 o2;
+ unsigned32 o3;
+ unsigned32 o4;
+ unsigned32 o5;
+ unsigned32 o6_sp;
+ unsigned32 o7;
+
+ unsigned32 psr;
+} Context_Control;
+
+#endif /* ASM */
+
+/*
+ * Offsets of fields with Context_Control for assembly routines.
+ */
+
+#define G0_OFFSET 0x00
+#define G1_OFFSET 0x04
+#define G2_OFFSET 0x08
+#define G3_OFFSET 0x0C
+#define G4_OFFSET 0x10
+#define G5_OFFSET 0x14
+#define G6_OFFSET 0x18
+#define G7_OFFSET 0x1C
+
+#define L0_OFFSET 0x20
+#define L1_OFFSET 0x24
+#define L2_OFFSET 0x28
+#define L3_OFFSET 0x2C
+#define L4_OFFSET 0x30
+#define L5_OFFSET 0x34
+#define L6_OFFSET 0x38
+#define L7_OFFSET 0x3C
+
+#define I0_OFFSET 0x40
+#define I1_OFFSET 0x44
+#define I2_OFFSET 0x48
+#define I3_OFFSET 0x4C
+#define I4_OFFSET 0x50
+#define I5_OFFSET 0x54
+#define I6_FP_OFFSET 0x58
+#define I7_OFFSET 0x5C
+
+#define O0_OFFSET 0x60
+#define O1_OFFSET 0x64
+#define O2_OFFSET 0x68
+#define O3_OFFSET 0x6C
+#define O4_OFFSET 0x70
+#define O5_OFFSET 0x74
+#define O6_SP_OFFSET 0x78
+#define O7_OFFSET 0x7C
+
+#define PSR_OFFSET 0x80
+
+#define CONTEXT_CONTROL_SIZE 0x84
+
+/*
+ * The floating point context area.
+ */
+
+#ifndef ASM
+
+typedef struct {
+ double f0_f1;
+ double f2_f3;
+ double f4_f5;
+ double f6_f7;
+ double f8_f9;
+ double f10_f11;
+ double f12_f13;
+ double f14_f15;
+ double f16_f17;
+ double f18_f19;
+ double f20_f21;
+ double f22_f23;
+ double f24_f25;
+ double f26_f27;
+ double f28_f29;
+ double f30_f31;
+ unsigned32 fsr;
+} Context_Control_fp;
+
+#endif /* ASM */
+
+/*
+ * Offsets of fields with Context_Control_fp for assembly routines.
+ */
+
+#define FO_F1_OFFSET 0x00
+#define F2_F3_OFFSET 0x08
+#define F4_F5_OFFSET 0x10
+#define F6_F7_OFFSET 0x18
+#define F8_F9_OFFSET 0x20
+#define F1O_F11_OFFSET 0x28
+#define F12_F13_OFFSET 0x30
+#define F14_F15_OFFSET 0x38
+#define F16_F17_OFFSET 0x40
+#define F18_F19_OFFSET 0x48
+#define F2O_F21_OFFSET 0x50
+#define F22_F23_OFFSET 0x58
+#define F24_F25_OFFSET 0x60
+#define F26_F27_OFFSET 0x68
+#define F28_F29_OFFSET 0x70
+#define F3O_F31_OFFSET 0x78
+#define FSR_OFFSET 0x80
+
+#define CONTEXT_CONTROL_FP_SIZE 0x84
+
+#ifndef ASM
+
+/*
+ * Context saved on stack for an interrupt.
+ *
+ * NOTE: The PSR, PC, and NPC are only saved in this structure for the
+ * benefit of the user's handler.
+ */
+
+typedef struct {
+ CPU_Minimum_stack_frame Stack_frame;
+ unsigned32 psr;
+ unsigned32 pc;
+ unsigned32 npc;
+ unsigned32 g1;
+ unsigned32 g2;
+ unsigned32 g3;
+ unsigned32 g4;
+ unsigned32 g5;
+ unsigned32 g6;
+ unsigned32 g7;
+ unsigned32 i0;
+ unsigned32 i1;
+ unsigned32 i2;
+ unsigned32 i3;
+ unsigned32 i4;
+ unsigned32 i5;
+ unsigned32 i6_fp;
+ unsigned32 i7;
+ unsigned32 y;
+ unsigned32 pad0_offset;
+} CPU_Interrupt_frame;
+
+#endif /* ASM */
+
+/*
+ * Offsets of fields with CPU_Interrupt_frame for assembly routines.
+ */
+
+#define ISF_STACK_FRAME_OFFSET 0x00
+#define ISF_PSR_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x00
+#define ISF_PC_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x04
+#define ISF_NPC_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x08
+#define ISF_G1_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x0c
+#define ISF_G2_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x10
+#define ISF_G3_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x14
+#define ISF_G4_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x18
+#define ISF_G5_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x1c
+#define ISF_G6_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x20
+#define ISF_G7_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x24
+#define ISF_I0_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x28
+#define ISF_I1_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x2c
+#define ISF_I2_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x30
+#define ISF_I3_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x34
+#define ISF_I4_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x38
+#define ISF_I5_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x3c
+#define ISF_I6_FP_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x40
+#define ISF_I7_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x44
+#define ISF_Y_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x48
+#define ISF_PAD0_OFFSET CPU_MINIMUM_STACK_FRAME_SIZE + 0x4c
+
+#define CONTEXT_CONTROL_INTERRUPT_FRAME_SIZE CPU_MINIMUM_STACK_FRAME_SIZE + 0x50
+#ifndef ASM
+
+/*
+ * The following table contains the information required to configure
+ * the processor specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of fields required on all CPUs */
+
+} rtems_cpu_table;
+
+/*
+ * This variable is contains the initialize context for the FP unit.
+ * It is filled in by _CPU_Initialize and copied into the task's FP
+ * context area during _CPU_Context_Initialize.
+ */
+
+SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context CPU_STRUCTURE_ALIGNMENT;
+
+/*
+ * This stack is allocated by the Interrupt Manager and the switch
+ * is performed in _ISR_Handler. These variables contain pointers
+ * to the lowest and highest addresses in the chunk of memory allocated
+ * for the interrupt stack. Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent
+ * code the option of picking the version it wants to use. Thus
+ * both must be present if either is.
+ *
+ * The SPARC supports a software based interrupt stack and these
+ * are required.
+ */
+
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+#if defined(erc32)
+
+/*
+ * ERC32 Specific Variables
+ */
+
+SCORE_EXTERN unsigned32 _ERC32_MEC_Timer_Control_Mirror;
+
+#endif
+
+/*
+ * The following type defines an entry in the SPARC's trap table.
+ *
+ * NOTE: The instructions chosen are RTEMS dependent although one is
+ * obligated to use two of the four instructions to perform a
+ * long jump. The other instructions load one register with the
+ * trap type (a.k.a. vector) and another with the psr.
+ */
+
+typedef struct {
+ unsigned32 mov_psr_l0; /* mov %psr, %l0 */
+ unsigned32 sethi_of_handler_to_l4; /* sethi %hi(_handler), %l4 */
+ unsigned32 jmp_to_low_of_handler_plus_l4; /* jmp %l4 + %lo(_handler) */
+ unsigned32 mov_vector_l3; /* mov _vector, %l3 */
+} CPU_Trap_table_entry;
+
+/*
+ * This is the set of opcodes for the instructions loaded into a trap
+ * table entry. The routine which installs a handler is responsible
+ * for filling in the fields for the _handler address and the _vector
+ * trap type.
+ *
+ * The constants following this structure are masks for the fields which
+ * must be filled in when the handler is installed.
+ */
+
+extern const CPU_Trap_table_entry _CPU_Trap_slot_template;
+
+/*
+ * This is the executive's trap table which is installed into the TBR
+ * register.
+ *
+ * NOTE: Unfortunately, this must be aligned on a 4096 byte boundary.
+ * The GNU tools as of binutils 2.5.2 and gcc 2.7.0 would not
+ * align an entity to anything greater than a 512 byte boundary.
+ *
+ * Because of this, we pull a little bit of a trick. We allocate
+ * enough memory so we can grab an address on a 4096 byte boundary
+ * from this area.
+ */
+
+#define SPARC_TRAP_TABLE_ALIGNMENT 4096
+
+#ifndef NO_TABLE_MOVE
+
+SCORE_EXTERN unsigned8 _CPU_Trap_Table_area[ 8192 ]
+ __attribute__ ((aligned (SPARC_TRAP_TABLE_ALIGNMENT)));
+#endif
+
+
+/*
+ * The size of the floating point context area.
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+#endif
+
+/*
+ * Amount of extra stack (above minimum stack size) required by
+ * MPCI receive server thread. Remember that in a multiprocessor
+ * system this thread must exist and be able to process all directives.
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 1024
+
+/*
+ * This defines the number of entries in the ISR_Vector_table managed
+ * by the executive.
+ *
+ * On the SPARC, there are really only 256 vectors. However, the executive
+ * has no easy, fast, reliable way to determine which traps are synchronous
+ * and which are asynchronous. By default, synchronous traps return to the
+ * instruction which caused the interrupt. So if you install a software
+ * trap handler as an executive interrupt handler (which is desirable since
+ * RTEMS takes care of window and register issues), then the executive needs
+ * to know that the return address is to the trap rather than the instruction
+ * following the trap.
+ *
+ * So vectors 0 through 255 are treated as regular asynchronous traps which
+ * provide the "correct" return address. Vectors 256 through 512 are assumed
+ * by the executive to be synchronous and to require that the return address
+ * be fudged.
+ *
+ * If you use this mechanism to install a trap handler which must reexecute
+ * the instruction which caused the trap, then it should be installed as
+ * an asynchronous trap. This will avoid the executive changing the return
+ * address.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 256
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER 511
+
+#define SPARC_SYNCHRONOUS_TRAP_BIT_MASK 0x100
+#define SPARC_ASYNCHRONOUS_TRAP( _trap ) (_trap)
+#define SPARC_SYNCHRONOUS_TRAP( _trap ) ((_trap) + 256 )
+
+#define SPARC_REAL_TRAP_NUMBER( _trap ) ((_trap) % 256)
+
+/*
+ * Should be large enough to run all tests. This insures
+ * that a "reasonable" small application should not have any problems.
+ *
+ * This appears to be a fairly generous number for the SPARC since
+ * represents a call depth of about 20 routines based on the minimum
+ * stack frame.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE (1024*2 + 512)
+
+/*
+ * CPU's worst alignment requirement for data types on a byte boundary. This
+ * alignment does not take into account the requirements for the stack.
+ *
+ * On the SPARC, this is required for double word loads and stores.
+ */
+
+#define CPU_ALIGNMENT 8
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * heap handler. This alignment requirement may be stricter than that
+ * for the data types alignment specified by CPU_ALIGNMENT. It is
+ * common for the heap to follow the same alignment requirement as
+ * CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict enough for the heap,
+ * then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for memory
+ * buffers allocated by the partition manager. This alignment requirement
+ * may be stricter than that for the data types alignment specified by
+ * CPU_ALIGNMENT. It is common for the partition to follow the same
+ * alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict
+ * enough for the partition, then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * stack. This alignment requirement may be stricter than that for the
+ * data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
+ * is strict enough for the stack, then this should be set to 0.
+ *
+ * NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
+ *
+ * The alignment restrictions for the SPARC are not that strict but this
+ * should unsure that the stack is always sufficiently alignment that the
+ * window overflow, underflow, and flush routines can use double word loads
+ * and stores.
+ */
+
+#define CPU_STACK_ALIGNMENT 16
+
+#ifndef ASM
+
+/* ISR handler macros */
+
+/*
+ * Disable all interrupts for a critical section. The previous
+ * level is returned in _level.
+ */
+
+#define _CPU_ISR_Disable( _level ) \
+ sparc_disable_interrupts( _level )
+
+/*
+ * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
+ * This indicates the end of a critical section. The parameter
+ * _level is not modified.
+ */
+
+#define _CPU_ISR_Enable( _level ) \
+ sparc_enable_interrupts( _level )
+
+/*
+ * This temporarily restores the interrupt to _level before immediately
+ * disabling them again. This is used to divide long critical
+ * sections into two or more parts. The parameter _level is not
+ * modified.
+ */
+
+#define _CPU_ISR_Flash( _level ) \
+ sparc_flash_interrupts( _level )
+
+/*
+ * Map interrupt level in task mode onto the hardware that the CPU
+ * actually provides. Currently, interrupt levels which do not
+ * map onto the CPU in a straight fashion are undefined.
+ */
+
+#define _CPU_ISR_Set_level( _newlevel ) \
+ sparc_set_interrupt_level( _newlevel )
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/* Context handler macros */
+
+/*
+ * Initialize the context to a state suitable for starting a
+ * task after a context restore operation. Generally, this
+ * involves:
+ *
+ * - setting a starting address
+ * - preparing the stack
+ * - preparing the stack and frame pointers
+ * - setting the proper interrupt level in the context
+ * - initializing the floating point context
+ *
+ * NOTE: Implemented as a subroutine for the SPARC port.
+ */
+
+void _CPU_Context_Initialize(
+ Context_Control *the_context,
+ unsigned32 *stack_base,
+ unsigned32 size,
+ unsigned32 new_level,
+ void *entry_point,
+ boolean is_fp
+);
+
+/*
+ * This routine is responsible for somehow restarting the currently
+ * executing task.
+ *
+ * On the SPARC, this is is relatively painless but requires a small
+ * amount of wrapper code before using the regular restore code in
+ * of the context switch.
+ */
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+/*
+ * The FP context area for the SPARC is a simple structure and nothing
+ * special is required to find the "starting load point"
+ */
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+/*
+ * This routine initializes the FP context area passed to it to.
+ *
+ * The SPARC allows us to use the simple initialization model
+ * in which an "initial" FP context was saved into _CPU_Null_fp_context
+ * at CPU initialization and it is simply copied into the destination
+ * context.
+ */
+
+#define _CPU_Context_Initialize_fp( _destination ) \
+ do { \
+ *((Context_Control_fp *) *((void **) _destination)) = _CPU_Null_fp_context; \
+ } while (0)
+
+/* end of Context handler macros */
+
+/* Fatal Error manager macros */
+
+/*
+ * This routine copies _error into a known place -- typically a stack
+ * location or a register, optionally disables interrupts, and
+ * halts/stops the CPU.
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ do { \
+ unsigned32 level; \
+ \
+ sparc_disable_interrupts( level ); \
+ asm volatile ( "mov %0, %%g1 " : "=r" (level) : "0" (level) ); \
+ while (1); /* loop forever */ \
+ } while (0)
+
+/* end of Fatal Error manager macros */
+
+/* Bitfield handler macros */
+
+/*
+ * The SPARC port uses the generic C algorithm for bitfield scan if the
+ * CPU model does not have a scan instruction.
+ */
+
+#if ( SPARC_HAS_BITSCAN == 0 )
+#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+#else
+#error "scan instruction not currently supported by RTEMS!!"
+#endif
+
+/* end of Bitfield handler macros */
+
+/* Priority handler handler macros */
+
+/*
+ * The SPARC port uses the generic C algorithm for bitfield scan if the
+ * CPU model does not have a scan instruction.
+ */
+
+#if ( SPARC_HAS_BITSCAN == 1 )
+#error "scan instruction not currently supported by RTEMS!!"
+#endif
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs new_handler to be directly called from the trap
+ * table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == TRUE)
+
+/*
+ * _CPU_Thread_Idle_body
+ *
+ * Some SPARC implementations have low power, sleep, or idle modes. This
+ * tries to take advantage of those models.
+ */
+
+void _CPU_Thread_Idle_body( void );
+
+#endif /* CPU_PROVIDES_IDLE_THREAD_BODY */
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Context_save_fp
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * _CPU_Context_restore_fp
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+);
+
+/*
+ * CPU_swap_u32
+ *
+ * The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version will work on any processor, but if you come across a better
+ * way for the SPARC PLEASE use it. The most common way to swap a 32-bit
+ * entity as shown below is not any more efficient on the SPARC.
+ *
+ * swap least significant two bytes with 16-bit rotate
+ * swap upper and lower 16-bits
+ * swap most significant two bytes with 16-bit rotate
+ *
+ * It is not obvious how the SPARC can do significantly better than the
+ * generic code. gcc 2.7.0 only generates about 12 instructions for the
+ * following code at optimization level four (i.e. -O4).
+ */
+
+static inline unsigned int CPU_swap_u32(
+ unsigned int value
+)
+{
+ unsigned32 byte1, byte2, byte3, byte4, swapped;
+
+ byte4 = (value >> 24) & 0xff;
+ byte3 = (value >> 16) & 0xff;
+ byte2 = (value >> 8) & 0xff;
+ byte1 = value & 0xff;
+
+ swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
+ return( swapped );
+}
+
+#endif ASM
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/exec/score/cpu/sparc/cpu_asm.s b/c/src/exec/score/cpu/sparc/cpu_asm.s
new file mode 100644
index 0000000000..9209e79081
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/cpu_asm.s
@@ -0,0 +1,709 @@
+/* cpu_asm.s
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+
+#if (SPARC_HAS_FPU == 1)
+
+/*
+ * void _CPU_Context_save_fp(
+ * void **fp_context_ptr
+ * )
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * NOTE: See the README in this directory for information on the
+ * management of the "EF" bit in the PSR.
+ */
+
+ .align 4
+ PUBLIC(_CPU_Context_save_fp)
+SYM(_CPU_Context_save_fp):
+ save %sp, -CPU_MINIMUM_STACK_FRAME_SIZE, %sp
+
+ /*
+ * The following enables the floating point unit.
+ */
+
+ mov %psr, %l0
+ sethi %hi(SPARC_PSR_EF_MASK), %l1
+ or %l1, %lo(SPARC_PSR_EF_MASK), %l1
+ or %l0, %l1, %l0
+ mov %l0, %psr ! **** ENABLE FLOAT ACCESS ****
+
+ ld [%i0], %l0
+ std %f0, [%l0 + FO_F1_OFFSET]
+ std %f2, [%l0 + F2_F3_OFFSET]
+ std %f4, [%l0 + F4_F5_OFFSET]
+ std %f6, [%l0 + F6_F7_OFFSET]
+ std %f8, [%l0 + F8_F9_OFFSET]
+ std %f10, [%l0 + F1O_F11_OFFSET]
+ std %f12, [%l0 + F12_F13_OFFSET]
+ std %f14, [%l0 + F14_F15_OFFSET]
+ std %f16, [%l0 + F16_F17_OFFSET]
+ std %f18, [%l0 + F18_F19_OFFSET]
+ std %f20, [%l0 + F2O_F21_OFFSET]
+ std %f22, [%l0 + F22_F23_OFFSET]
+ std %f24, [%l0 + F24_F25_OFFSET]
+ std %f26, [%l0 + F26_F27_OFFSET]
+ std %f28, [%l0 + F28_F29_OFFSET]
+ std %f30, [%l0 + F3O_F31_OFFSET]
+ st %fsr, [%l0 + FSR_OFFSET]
+ ret
+ restore
+
+/*
+ * void _CPU_Context_restore_fp(
+ * void **fp_context_ptr
+ * )
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * NOTE: See the README in this directory for information on the
+ * management of the "EF" bit in the PSR.
+ */
+
+ .align 4
+ PUBLIC(_CPU_Context_restore_fp)
+SYM(_CPU_Context_restore_fp):
+ save %sp, -CPU_MINIMUM_STACK_FRAME_SIZE , %sp
+
+ /*
+ * The following enables the floating point unit.
+ */
+
+ mov %psr, %l0
+ sethi %hi(SPARC_PSR_EF_MASK), %l1
+ or %l1, %lo(SPARC_PSR_EF_MASK), %l1
+ or %l0, %l1, %l0
+ mov %l0, %psr ! **** ENABLE FLOAT ACCESS ****
+
+ ld [%i0], %l0
+ ldd [%l0 + FO_F1_OFFSET], %f0
+ ldd [%l0 + F2_F3_OFFSET], %f2
+ ldd [%l0 + F4_F5_OFFSET], %f4
+ ldd [%l0 + F6_F7_OFFSET], %f6
+ ldd [%l0 + F8_F9_OFFSET], %f8
+ ldd [%l0 + F1O_F11_OFFSET], %f10
+ ldd [%l0 + F12_F13_OFFSET], %f12
+ ldd [%l0 + F14_F15_OFFSET], %f14
+ ldd [%l0 + F16_F17_OFFSET], %f16
+ ldd [%l0 + F18_F19_OFFSET], %f18
+ ldd [%l0 + F2O_F21_OFFSET], %f20
+ ldd [%l0 + F22_F23_OFFSET], %f22
+ ldd [%l0 + F24_F25_OFFSET], %f24
+ ldd [%l0 + F26_F27_OFFSET], %f26
+ ldd [%l0 + F28_F29_OFFSET], %f28
+ ldd [%l0 + F3O_F31_OFFSET], %f30
+ ld [%l0 + FSR_OFFSET], %fsr
+ ret
+ restore
+
+#endif /* SPARC_HAS_FPU */
+
+/*
+ * void _CPU_Context_switch(
+ * Context_Control *run,
+ * Context_Control *heir
+ * )
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+ .align 4
+ PUBLIC(_CPU_Context_switch)
+SYM(_CPU_Context_switch):
+ ! skip g0
+ st %g1, [%o0 + G1_OFFSET] ! save the global registers
+ std %g2, [%o0 + G2_OFFSET]
+ std %g4, [%o0 + G4_OFFSET]
+ std %g6, [%o0 + G6_OFFSET]
+
+ std %l0, [%o0 + L0_OFFSET] ! save the local registers
+ std %l2, [%o0 + L2_OFFSET]
+ std %l4, [%o0 + L4_OFFSET]
+ std %l6, [%o0 + L6_OFFSET]
+
+ std %i0, [%o0 + I0_OFFSET] ! save the input registers
+ std %i2, [%o0 + I2_OFFSET]
+ std %i4, [%o0 + I4_OFFSET]
+ std %i6, [%o0 + I6_FP_OFFSET]
+
+ std %o0, [%o0 + O0_OFFSET] ! save the output registers
+ std %o2, [%o0 + O2_OFFSET]
+ std %o4, [%o0 + O4_OFFSET]
+ std %o6, [%o0 + O6_SP_OFFSET]
+
+ rd %psr, %o2
+ st %o2, [%o0 + PSR_OFFSET] ! save status register
+
+ /*
+ * This is entered from _CPU_Context_restore with:
+ * o1 = context to restore
+ * o2 = psr
+ */
+
+ PUBLIC(_CPU_Context_restore_heir)
+SYM(_CPU_Context_restore_heir):
+ /*
+ * Flush all windows with valid contents except the current one.
+ * In examining the set register windows, one may logically divide
+ * the windows into sets (some of which may be empty) based on their
+ * current status:
+ *
+ * + current (i.e. in use),
+ * + used (i.e. a restore would not trap)
+ * + invalid (i.e. 1 in corresponding bit in WIM)
+ * + unused
+ *
+ * Either the used or unused set of windows may be empty.
+ *
+ * NOTE: We assume only one bit is set in the WIM at a time.
+ *
+ * Given a CWP of 5 and a WIM of 0x1, the registers are divided
+ * into sets as follows:
+ *
+ * + 0 - invalid
+ * + 1-4 - unused
+ * + 5 - current
+ * + 6-7 - used
+ *
+ * In this case, we only would save the used windows -- 6 and 7.
+ *
+ * Traps are disabled for the same logical period as in a
+ * flush all windows trap handler.
+ *
+ * Register Usage while saving the windows:
+ * g1 = current PSR
+ * g2 = current wim
+ * g3 = CWP
+ * g4 = wim scratch
+ * g5 = scratch
+ */
+
+ ld [%o1 + PSR_OFFSET], %g1 ! g1 = saved psr
+
+ and %o2, SPARC_PSR_CWP_MASK, %g3 ! g3 = CWP
+ ! g1 = psr w/o cwp
+ andn %g1, SPARC_PSR_ET_MASK | SPARC_PSR_CWP_MASK, %g1
+ or %g1, %g3, %g1 ! g1 = heirs psr
+ mov %g1, %psr ! restore status register and
+ ! **** DISABLE TRAPS ****
+ mov %wim, %g2 ! g2 = wim
+ mov 1, %g4
+ sll %g4, %g3, %g4 ! g4 = WIM mask for CW invalid
+
+save_frame_loop:
+ sll %g4, 1, %g5 ! rotate the "wim" left 1
+ srl %g4, SPARC_NUMBER_OF_REGISTER_WINDOWS - 1, %g4
+ or %g4, %g5, %g4 ! g4 = wim if we do one restore
+
+ /*
+ * If a restore would not underflow, then continue.
+ */
+
+ andcc %g4, %g2, %g0 ! Any windows to flush?
+ bnz done_flushing ! No, then continue
+ nop
+
+ restore ! back one window
+
+ /*
+ * Now save the window just as if we overflowed to it.
+ */
+
+ std %l0, [%sp + CPU_STACK_FRAME_L0_OFFSET]
+ std %l2, [%sp + CPU_STACK_FRAME_L2_OFFSET]
+ std %l4, [%sp + CPU_STACK_FRAME_L4_OFFSET]
+ std %l6, [%sp + CPU_STACK_FRAME_L6_OFFSET]
+
+ std %i0, [%sp + CPU_STACK_FRAME_I0_OFFSET]
+ std %i2, [%sp + CPU_STACK_FRAME_I2_OFFSET]
+ std %i4, [%sp + CPU_STACK_FRAME_I4_OFFSET]
+ std %i6, [%sp + CPU_STACK_FRAME_I6_FP_OFFSET]
+
+ ba save_frame_loop
+ nop
+
+done_flushing:
+
+ add %g3, 1, %g3 ! calculate desired WIM
+ and %g3, SPARC_NUMBER_OF_REGISTER_WINDOWS - 1, %g3
+ mov 1, %g4
+ sll %g4, %g3, %g4 ! g4 = new WIM
+ mov %g4, %wim
+
+ or %g1, SPARC_PSR_ET_MASK, %g1
+ mov %g1, %psr ! **** ENABLE TRAPS ****
+ ! and restore CWP
+ nop
+ nop
+ nop
+
+ ! skip g0
+ ld [%o1 + G1_OFFSET], %g1 ! restore the global registers
+ ldd [%o1 + G2_OFFSET], %g2
+ ldd [%o1 + G4_OFFSET], %g4
+ ldd [%o1 + G6_OFFSET], %g6
+
+ ldd [%o1 + L0_OFFSET], %l0 ! restore the local registers
+ ldd [%o1 + L2_OFFSET], %l2
+ ldd [%o1 + L4_OFFSET], %l4
+ ldd [%o1 + L6_OFFSET], %l6
+
+ ldd [%o1 + I0_OFFSET], %i0 ! restore the output registers
+ ldd [%o1 + I2_OFFSET], %i2
+ ldd [%o1 + I4_OFFSET], %i4
+ ldd [%o1 + I6_FP_OFFSET], %i6
+
+ ldd [%o1 + O2_OFFSET], %o2 ! restore the output registers
+ ldd [%o1 + O4_OFFSET], %o4
+ ldd [%o1 + O6_SP_OFFSET], %o6
+ ! do o0/o1 last to avoid destroying heir context pointer
+ ldd [%o1 + O0_OFFSET], %o0 ! overwrite heir pointer
+
+ jmp %o7 + 8 ! return
+ nop ! delay slot
+
+/*
+ * void _CPU_Context_restore(
+ * Context_Control *new_context
+ * )
+ *
+ * This routine is generally used only to perform restart self.
+ *
+ * NOTE: It is unnecessary to reload some registers.
+ */
+
+ .align 4
+ PUBLIC(_CPU_Context_restore)
+SYM(_CPU_Context_restore):
+ save %sp, -CPU_MINIMUM_STACK_FRAME_SIZE, %sp
+ rd %psr, %o2
+ ba SYM(_CPU_Context_restore_heir)
+ mov %i0, %o1 ! in the delay slot
+
+/*
+ * void _ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ * We enter this handler from the 4 instructions in the trap table with
+ * the following registers assumed to be set as shown:
+ *
+ * l0 = PSR
+ * l1 = PC
+ * l2 = nPC
+ * l3 = trap type
+ *
+ * NOTE: By an executive defined convention, trap type is between 0 and 255 if
+ * it is an asynchonous trap and 256 and 511 if it is synchronous.
+ */
+
+ .align 4
+ PUBLIC(_ISR_Handler)
+SYM(_ISR_Handler):
+ /*
+ * Fix the return address for synchronous traps.
+ */
+
+ andcc %l3, SPARC_SYNCHRONOUS_TRAP_BIT_MASK, %g0
+ ! Is this a synchronous trap?
+ be,a win_ovflow ! No, then skip the adjustment
+ nop ! DELAY
+ mov %l2, %l1 ! do not return to the instruction
+ add %l2, 4, %l2 ! indicated
+
+win_ovflow:
+ /*
+ * Save the globals this block uses.
+ *
+ * These registers are not restored from the locals. Their contents
+ * are saved directly from the locals into the ISF below.
+ */
+
+ mov %g4, %l4 ! save the globals this block uses
+ mov %g5, %l5
+
+ /*
+ * When at a "window overflow" trap, (wim == (1 << cwp)).
+ * If we get here like that, then process a window overflow.
+ */
+
+ rd %wim, %g4
+ srl %g4, %l0, %g5 ! g5 = win >> cwp ; shift count and CWP
+ ! are LS 5 bits ; how convenient :)
+ cmp %g5, 1 ! Is this an invalid window?
+ bne dont_do_the_window ! No, then skip all this stuff
+ ! we are using the delay slot
+
+ /*
+ * The following is same as a 1 position right rotate of WIM
+ */
+
+ srl %g4, 1, %g5 ! g5 = WIM >> 1
+ sll %g4, SPARC_NUMBER_OF_REGISTER_WINDOWS-1 , %g4
+ ! g4 = WIM << (Number Windows - 1)
+ or %g4, %g5, %g4 ! g4 = (WIM >> 1) |
+ ! (WIM << (Number Windows - 1))
+
+ /*
+ * At this point:
+ *
+ * g4 = the new WIM
+ * g5 is free
+ */
+
+ /*
+ * Since we are tinkering with the register windows, we need to
+ * make sure that all the required information is in global registers.
+ */
+
+ save ! Save into the window
+ wr %g4, 0, %wim ! WIM = new WIM
+ nop ! delay slots
+ nop
+ nop
+
+ /*
+ * Now save the window just as if we overflowed to it.
+ */
+
+ std %l0, [%sp + CPU_STACK_FRAME_L0_OFFSET]
+ std %l2, [%sp + CPU_STACK_FRAME_L2_OFFSET]
+ std %l4, [%sp + CPU_STACK_FRAME_L4_OFFSET]
+ std %l6, [%sp + CPU_STACK_FRAME_L6_OFFSET]
+
+ std %i0, [%sp + CPU_STACK_FRAME_I0_OFFSET]
+ std %i2, [%sp + CPU_STACK_FRAME_I2_OFFSET]
+ std %i4, [%sp + CPU_STACK_FRAME_I4_OFFSET]
+ std %i6, [%sp + CPU_STACK_FRAME_I6_FP_OFFSET]
+
+ restore
+ nop
+
+dont_do_the_window:
+ /*
+ * Global registers %g4 and %g5 are saved directly from %l4 and
+ * %l5 directly into the ISF below.
+ */
+
+save_isf:
+
+ /*
+ * Save the state of the interrupted task -- especially the global
+ * registers -- in the Interrupt Stack Frame. Note that the ISF
+ * includes a regular minimum stack frame which will be used if
+ * needed by register window overflow and underflow handlers.
+ *
+ * REGISTERS SAME AS AT _ISR_Handler
+ */
+
+ sub %fp, CONTEXT_CONTROL_INTERRUPT_FRAME_SIZE, %sp
+ ! make space for ISF
+
+ std %l0, [%sp + ISF_PSR_OFFSET] ! save psr, PC
+ st %l2, [%sp + ISF_NPC_OFFSET] ! save nPC
+ st %g1, [%sp + ISF_G1_OFFSET] ! save g1
+ std %g2, [%sp + ISF_G2_OFFSET] ! save g2, g3
+ std %l4, [%sp + ISF_G4_OFFSET] ! save g4, g5 -- see above
+ std %g6, [%sp + ISF_G6_OFFSET] ! save g6, g7
+
+ std %i0, [%sp + ISF_I0_OFFSET] ! save i0, i1
+ std %i2, [%sp + ISF_I2_OFFSET] ! save i2, i3
+ std %i4, [%sp + ISF_I4_OFFSET] ! save i4, i5
+ std %i6, [%sp + ISF_I6_FP_OFFSET] ! save i6/fp, i7
+
+ rd %y, %g1
+ st %g1, [%sp + ISF_Y_OFFSET] ! save y
+
+ mov %sp, %o1 ! 2nd arg to ISR Handler
+
+ /*
+ * Increment ISR nest level and Thread dispatch disable level.
+ *
+ * Register usage for this section:
+ *
+ * l4 = _Thread_Dispatch_disable_level pointer
+ * l5 = _ISR_Nest_level pointer
+ * l6 = _Thread_Dispatch_disable_level value
+ * l7 = _ISR_Nest_level value
+ *
+ * NOTE: It is assumed that l4 - l7 will be preserved until the ISR
+ * nest and thread dispatch disable levels are unnested.
+ */
+
+ sethi %hi(SYM(_Thread_Dispatch_disable_level)), %l4
+ ld [%l4 + %lo(SYM(_Thread_Dispatch_disable_level))], %l6
+ sethi %hi(SYM(_ISR_Nest_level)), %l5
+ ld [%l5 + %lo(SYM(_ISR_Nest_level))], %l7
+
+ add %l6, 1, %l6
+ st %l6, [%l4 + %lo(SYM(_Thread_Dispatch_disable_level))]
+
+ add %l7, 1, %l7
+ st %l7, [%l5 + %lo(SYM(_ISR_Nest_level))]
+
+ /*
+ * If ISR nest level was zero (now 1), then switch stack.
+ */
+
+ mov %sp, %fp
+ subcc %l7, 1, %l7 ! outermost interrupt handler?
+ bnz dont_switch_stacks ! No, then do not switch stacks
+
+ sethi %hi(SYM(_CPU_Interrupt_stack_high)), %g4
+ ld [%g4 + %lo(SYM(_CPU_Interrupt_stack_high))], %sp
+
+dont_switch_stacks:
+ /*
+ * Make sure we have a place on the stack for the window overflow
+ * trap handler to write into. At this point it is safe to
+ * enable traps again.
+ */
+
+ sub %sp, CPU_MINIMUM_STACK_FRAME_SIZE, %sp
+
+ wr %l0, SPARC_PSR_ET_MASK, %psr ! **** ENABLE TRAPS ****
+
+ /*
+ * Vector to user's handler.
+ *
+ * NOTE: TBR may no longer have vector number in it since
+ * we just enabled traps. It is definitely in l3.
+ */
+
+ sethi %hi(SYM(_ISR_Vector_table)), %g4
+ or %g4, %lo(SYM(_ISR_Vector_table)), %g4
+ and %l3, 0xFF, %g5 ! remove synchronous trap indicator
+ sll %g5, 2, %g5 ! g5 = offset into table
+ ld [%g4 + %g5], %g4 ! g4 = _ISR_Vector_table[ vector ]
+
+
+ ! o1 = 2nd arg = address of the ISF
+ ! WAS LOADED WHEN ISF WAS SAVED!!!
+ mov %l3, %o0 ! o0 = 1st arg = vector number
+ call %g4, 0
+ nop ! delay slot
+
+ /*
+ * Redisable traps so we can finish up the interrupt processing.
+ * This is a VERY conservative place to do this.
+ *
+ * NOTE: %l0 has the PSR which was in place when we took the trap.
+ */
+
+ mov %l0, %psr ! **** DISABLE TRAPS ****
+
+ /*
+ * Decrement ISR nest level and Thread dispatch disable level.
+ *
+ * Register usage for this section:
+ *
+ * l4 = _Thread_Dispatch_disable_level pointer
+ * l5 = _ISR_Nest_level pointer
+ * l6 = _Thread_Dispatch_disable_level value
+ * l7 = _ISR_Nest_level value
+ */
+
+ sub %l6, 1, %l6
+ st %l6, [%l4 + %lo(SYM(_Thread_Dispatch_disable_level))]
+
+ st %l7, [%l5 + %lo(SYM(_ISR_Nest_level))]
+
+ /*
+ * If dispatching is disabled (includes nested interrupt case),
+ * then do a "simple" exit.
+ */
+
+ orcc %l6, %g0, %g0 ! Is dispatching disabled?
+ bnz simple_return ! Yes, then do a "simple" exit
+ nop ! delay slot
+
+ /*
+ * If a context switch is necessary, then do fudge stack to
+ * return to the interrupt dispatcher.
+ */
+
+ sethi %hi(SYM(_Context_Switch_necessary)), %l4
+ ld [%l4 + %lo(SYM(_Context_Switch_necessary))], %l5
+
+ orcc %l5, %g0, %g0 ! Is thread switch necessary?
+ bnz SYM(_ISR_Dispatch) ! yes, then invoke the dispatcher
+ nop ! delay slot
+
+ /*
+ * Finally, check to see if signals were sent to the currently
+ * executing task. If so, we need to invoke the interrupt dispatcher.
+ */
+
+ sethi %hi(SYM(_ISR_Signals_to_thread_executing)), %l6
+ ld [%l6 + %lo(SYM(_ISR_Signals_to_thread_executing))], %l7
+
+ orcc %l7, %g0, %g0 ! Were signals sent to the currently
+ ! executing thread?
+ bz simple_return ! yes, then invoke the dispatcher
+ ! use the delay slot to clear the signals
+ ! to the currently executing task flag
+ st %g0, [%l6 + %lo(SYM(_ISR_Signals_to_thread_executing))]
+
+
+ /*
+ * Invoke interrupt dispatcher.
+ */
+
+ PUBLIC(_ISR_Dispatch)
+SYM(_ISR_Dispatch):
+
+ /*
+ * The following subtract should get us back on the interrupted
+ * tasks stack and add enough room to invoke the dispatcher.
+ * When we enable traps, we are mostly back in the context
+ * of the task and subsequent interrupts can operate normally.
+ */
+
+ sub %fp, CPU_MINIMUM_STACK_FRAME_SIZE, %sp
+
+ or %l0, SPARC_PSR_ET_MASK, %l7 ! l7 = PSR with ET=1
+ mov %l7, %psr ! **** ENABLE TRAPS ****
+ nop
+ nop
+ nop
+
+ call SYM(_Thread_Dispatch), 0
+ nop
+
+ /*
+ * The CWP in place at this point may be different from
+ * that which was in effect at the beginning of the ISR if we
+ * have been context switched between the beginning of this invocation
+ * of _ISR_Handler and this point. Thus the CWP and WIM should
+ * not be changed back to their values at ISR entry time. Any
+ * changes to the PSR must preserve the CWP.
+ */
+
+simple_return:
+ ld [%fp + ISF_Y_OFFSET], %l5 ! restore y
+ wr %l5, 0, %y
+
+ ldd [%fp + ISF_PSR_OFFSET], %l0 ! restore psr, PC
+ ld [%fp + ISF_NPC_OFFSET], %l2 ! restore nPC
+ rd %psr, %l3
+ and %l3, SPARC_PSR_CWP_MASK, %l3 ! want "current" CWP
+ andn %l0, SPARC_PSR_CWP_MASK, %l0 ! want rest from task
+ or %l3, %l0, %l0 ! install it later...
+ andn %l0, SPARC_PSR_ET_MASK, %l0
+
+ /*
+ * Restore tasks global and out registers
+ */
+
+ mov %fp, %g1
+
+ ! g1 is restored later
+ ldd [%fp + ISF_G2_OFFSET], %g2 ! restore g2, g3
+ ldd [%fp + ISF_G4_OFFSET], %g4 ! restore g4, g5
+ ldd [%fp + ISF_G6_OFFSET], %g6 ! restore g6, g7
+
+ ldd [%fp + ISF_I0_OFFSET], %i0 ! restore i0, i1
+ ldd [%fp + ISF_I2_OFFSET], %i2 ! restore i2, i3
+ ldd [%fp + ISF_I4_OFFSET], %i4 ! restore i4, i5
+ ldd [%fp + ISF_I6_FP_OFFSET], %i6 ! restore i6/fp, i7
+
+ /*
+ * Registers:
+ *
+ * ALL global registers EXCEPT G1 and the input registers have
+ * already been restored and thuse off limits.
+ *
+ * The following is the contents of the local registers:
+ *
+ * l0 = original psr
+ * l1 = return address (i.e. PC)
+ * l2 = nPC
+ * l3 = CWP
+ */
+
+ /*
+ * if (CWP + 1) is an invalid window then we need to reload it.
+ *
+ * WARNING: Traps should now be disabled
+ */
+
+ mov %l0, %psr ! **** DISABLE TRAPS ****
+ nop
+ nop
+ nop
+ rd %wim, %l4
+ add %l0, 1, %l6 ! l6 = cwp + 1
+ and %l6, SPARC_PSR_CWP_MASK, %l6 ! do the modulo on it
+ srl %l4, %l6, %l5 ! l5 = win >> cwp + 1 ; shift count
+ ! and CWP are conveniently LS 5 bits
+ cmp %l5, 1 ! Is tasks window invalid?
+ bne good_task_window
+
+ /*
+ * The following code is the same as a 1 position left rotate of WIM.
+ */
+
+ sll %l4, 1, %l5 ! l5 = WIM << 1
+ srl %l4, SPARC_NUMBER_OF_REGISTER_WINDOWS-1 , %l4
+ ! l4 = WIM >> (Number Windows - 1)
+ or %l4, %l5, %l4 ! l4 = (WIM << 1) |
+ ! (WIM >> (Number Windows - 1))
+
+ /*
+ * Now restore the window just as if we underflowed to it.
+ */
+
+ wr %l4, 0, %wim ! WIM = new WIM
+ nop ! must delay after writing WIM
+ nop
+ nop
+ restore ! now into the tasks window
+
+ ldd [%g1 + CPU_STACK_FRAME_L0_OFFSET], %l0
+ ldd [%g1 + CPU_STACK_FRAME_L2_OFFSET], %l2
+ ldd [%g1 + CPU_STACK_FRAME_L4_OFFSET], %l4
+ ldd [%g1 + CPU_STACK_FRAME_L6_OFFSET], %l6
+ ldd [%g1 + CPU_STACK_FRAME_I0_OFFSET], %i0
+ ldd [%g1 + CPU_STACK_FRAME_I2_OFFSET], %i2
+ ldd [%g1 + CPU_STACK_FRAME_I4_OFFSET], %i4
+ ldd [%g1 + CPU_STACK_FRAME_I6_FP_OFFSET], %i6
+ ! reload of sp clobbers ISF
+ save ! Back to ISR dispatch window
+
+good_task_window:
+
+ mov %l0, %psr ! **** DISABLE TRAPS ****
+ ! and restore condition codes.
+ ld [%g1 + ISF_G1_OFFSET], %g1 ! restore g1
+ jmp %l1 ! transfer control and
+ rett %l2 ! go back to tasks window
+
+/* end of file */
diff --git a/c/src/exec/score/cpu/sparc/erc32.h b/c/src/exec/score/cpu/sparc/erc32.h
new file mode 100644
index 0000000000..d8d70e3e30
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/erc32.h
@@ -0,0 +1,521 @@
+/* erc32.h
+ *
+ * This include file contains information pertaining to the ERC32.
+ * The ERC32 is a custom SPARC V7 implementation based on the Cypress
+ * 601/602 chipset. This CPU has a number of on-board peripherals and
+ * was developed by the European Space Agency to target space applications.
+ *
+ * NOTE: Other than where absolutely required, this version currently
+ * supports only the peripherals and bits used by the basic board
+ * support package. This includes at least significant pieces of
+ * the following items:
+ *
+ * + UART Channels A and B
+ * + General Purpose Timer
+ * + Real Time Clock
+ * + Watchdog Timer (so it can be disabled)
+ * + Control Register (so powerdown mode can be enabled)
+ * + Memory Control Register
+ * + Interrupt Control
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ERC32_h
+#define _INCLUDE_ERC32_h
+
+#include <rtems/score/sparc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Interrupt Sources
+ *
+ * The interrupt source numbers directly map to the trap type and to
+ * the bits used in the Interrupt Clear, Interrupt Force, Interrupt Mask,
+ * and the Interrupt Pending Registers.
+ */
+
+#define ERC32_INTERRUPT_MASKED_ERRORS 1
+#define ERC32_INTERRUPT_EXTERNAL_1 2
+#define ERC32_INTERRUPT_EXTERNAL_2 3
+#define ERC32_INTERRUPT_UART_A_RX_TX 4
+#define ERC32_INTERRUPT_UART_B_RX_TX 5
+#define ERC32_INTERRUPT_CORRECTABLE_MEMORY_ERROR 6
+#define ERC32_INTERRUPT_UART_ERROR 7
+#define ERC32_INTERRUPT_DMA_ACCESS_ERROR 8
+#define ERC32_INTERRUPT_DMA_TIMEOUT 9
+#define ERC32_INTERRUPT_EXTERNAL_3 10
+#define ERC32_INTERRUPT_EXTERNAL_4 11
+#define ERC32_INTERRUPT_GENERAL_PURPOSE_TIMER 12
+#define ERC32_INTERRUPT_REAL_TIME_CLOCK 13
+#define ERC32_INTERRUPT_EXTERNAL_5 14
+#define ERC32_INTERRUPT_WATCHDOG_TIMEOUT 15
+
+#ifndef ASM
+
+/*
+ * Trap Types for on-chip peripherals
+ *
+ * Source: Table 8 - Interrupt Trap Type and Default Priority Assignments
+ *
+ * NOTE: The priority level for each source corresponds to the least
+ * significant nibble of the trap type.
+ */
+
+#define ERC32_TRAP_TYPE( _source ) SPARC_ASYNCHRONOUS_TRAP((_source) + 0x10)
+
+#define ERC32_TRAP_SOURCE( _trap ) ((_trap) - 0x10)
+
+#define ERC32_Is_MEC_Trap( _trap ) \
+ ( (_trap) >= ERC32_TRAP_TYPE( ERC32_INTERRUPT_MASKED_ERRORS ) && \
+ (_trap) <= ERC32_TRAP_TYPE( ERC32_INTERRUPT_WATCHDOG_TIMEOUT ) )
+
+/*
+ * Structure for ERC32 memory mapped registers.
+ *
+ * Source: Section 3.25.2 - Register Address Map
+ *
+ * NOTE: There is only one of these structures per CPU, its base address
+ * is 0x01f80000, and the variable MEC is placed there by the
+ * linkcmds file.
+ */
+
+typedef struct {
+ volatile unsigned32 Control; /* offset 0x00 */
+ volatile unsigned32 Software_Reset; /* offset 0x04 */
+ volatile unsigned32 Power_Down; /* offset 0x08 */
+ volatile unsigned32 Unimplemented_0; /* offset 0x0c */
+ volatile unsigned32 Memory_Configuration; /* offset 0x10 */
+ volatile unsigned32 IO_Configuration; /* offset 0x14 */
+ volatile unsigned32 Wait_State_Configuration; /* offset 0x18 */
+ volatile unsigned32 Unimplemented_1; /* offset 0x1c */
+ volatile unsigned32 Memory_Access_0; /* offset 0x20 */
+ volatile unsigned32 Memory_Access_1; /* offset 0x24 */
+ volatile unsigned32 Unimplemented_2[ 7 ]; /* offset 0x28 */
+ volatile unsigned32 Interrupt_Shape; /* offset 0x44 */
+ volatile unsigned32 Interrupt_Pending; /* offset 0x48 */
+ volatile unsigned32 Interrupt_Mask; /* offset 0x4c */
+ volatile unsigned32 Interrupt_Clear; /* offset 0x50 */
+ volatile unsigned32 Interrupt_Force; /* offset 0x54 */
+ volatile unsigned32 Unimplemented_3[ 2 ]; /* offset 0x58 */
+ /* offset 0x60 */
+ volatile unsigned32 Watchdog_Program_and_Timeout_Acknowledge;
+ volatile unsigned32 Watchdog_Trap_Door_Set; /* offset 0x64 */
+ volatile unsigned32 Unimplemented_4[ 6 ]; /* offset 0x68 */
+ volatile unsigned32 Real_Time_Clock_Counter; /* offset 0x80 */
+ volatile unsigned32 Real_Time_Clock_Scalar; /* offset 0x84 */
+ volatile unsigned32 General_Purpose_Timer_Counter; /* offset 0x88 */
+ volatile unsigned32 General_Purpose_Timer_Scalar; /* offset 0x8c */
+ volatile unsigned32 Unimplemented_5[ 2 ]; /* offset 0x90 */
+ volatile unsigned32 Timer_Control; /* offset 0x98 */
+ volatile unsigned32 Unimplemented_6; /* offset 0x9c */
+ volatile unsigned32 System_Fault_Status; /* offset 0xa0 */
+ volatile unsigned32 First_Failing_Address; /* offset 0xa4 */
+ volatile unsigned32 First_Failing_Data; /* offset 0xa8 */
+ volatile unsigned32 First_Failing_Syndrome_and_Check_Bits;/* offset 0xac */
+ volatile unsigned32 Error_and_Reset_Status; /* offset 0xb0 */
+ volatile unsigned32 Error_Mask; /* offset 0xb4 */
+ volatile unsigned32 Unimplemented_7[ 2 ]; /* offset 0xb8 */
+ volatile unsigned32 Debug_Control; /* offset 0xc0 */
+ volatile unsigned32 Breakpoint; /* offset 0xc4 */
+ volatile unsigned32 Watchpoint; /* offset 0xc8 */
+ volatile unsigned32 Unimplemented_8; /* offset 0xcc */
+ volatile unsigned32 Test_Control; /* offset 0xd0 */
+ volatile unsigned32 Test_Data; /* offset 0xd4 */
+ volatile unsigned32 Unimplemented_9[ 2 ]; /* offset 0xd8 */
+ volatile unsigned32 UART_Channel_A; /* offset 0xe0 */
+ volatile unsigned32 UART_Channel_B; /* offset 0xe4 */
+ volatile unsigned32 UART_Status; /* offset 0xe8 */
+} ERC32_Register_Map;
+
+#endif
+
+/*
+ * The following constants are intended to be used ONLY in assembly
+ * language files.
+ *
+ * NOTE: The intended style of usage is to load the address of MEC
+ * into a register and then use these as displacements from
+ * that register.
+ */
+
+#ifdef ASM
+
+#define ERC32_MEC_CONTROL_OFFSET 0x00
+#define ERC32_MEC_SOFTWARE_RESET_OFFSET 0x04
+#define ERC32_MEC_POWER_DOWN_OFFSET 0x08
+#define ERC32_MEC_UNIMPLEMENTED_0_OFFSET 0x0C
+#define ERC32_MEC_MEMORY_CONFIGURATION_OFFSET 0x10
+#define ERC32_MEC_IO_CONFIGURATION_OFFSET 0x14
+#define ERC32_MEC_WAIT_STATE_CONFIGURATION_OFFSET 0x18
+#define ERC32_MEC_UNIMPLEMENTED_1_OFFSET 0x1C
+#define ERC32_MEC_MEMORY_ACCESS_0_OFFSET 0x20
+#define ERC32_MEC_MEMORY_ACCESS_1_OFFSET 0x24
+#define ERC32_MEC_UNIMPLEMENTED_2_OFFSET 0x28
+#define ERC32_MEC_INTERRUPT_SHAPE_OFFSET 0x44
+#define ERC32_MEC_INTERRUPT_PENDING_OFFSET 0x48
+#define ERC32_MEC_INTERRUPT_MASK_OFFSET 0x4C
+#define ERC32_MEC_INTERRUPT_CLEAR_OFFSET 0x50
+#define ERC32_MEC_INTERRUPT_FORCE_OFFSET 0x54
+#define ERC32_MEC_UNIMPLEMENTED_3_OFFSET 0x58
+#define ERC32_MEC_WATCHDOG_PROGRAM_AND_TIMEOUT_ACKNOWLEDGE_OFFSET 0x60
+#define ERC32_MEC_WATCHDOG_TRAP_DOOR_SET_OFFSET 0x64
+#define ERC32_MEC_UNIMPLEMENTED_4_OFFSET 0x6C
+#define ERC32_MEC_REAL_TIME_CLOCK_COUNTER_OFFSET 0x80
+#define ERC32_MEC_REAL_TIME_CLOCK_SCALAR_OFFSET 0x84
+#define ERC32_MEC_GENERAL_PURPOSE_TIMER_COUNTER_OFFSET 0x88
+#define ERC32_MEC_GENERAL_PURPOSE_TIMER_SCALAR_OFFSET 0x8C
+#define ERC32_MEC_UNIMPLEMENTED_5_OFFSET 0x90
+#define ERC32_MEC_TIMER_CONTROL_OFFSET 0x98
+#define ERC32_MEC_UNIMPLEMENTED_6_OFFSET 0x9C
+#define ERC32_MEC_SYSTEM_FAULT_STATUS_OFFSET 0xA0
+#define ERC32_MEC_FIRST_FAILING_ADDRESS_OFFSET 0xA4
+#define ERC32_MEC_FIRST_FAILING_DATA_OFFSET 0xA8
+#define ERC32_MEC_FIRST_FAILING_SYNDROME_AND_CHECK_BITS_OFFSET 0xAC
+#define ERC32_MEC_ERROR_AND_RESET_STATUS_OFFSET 0xB0
+#define ERC32_MEC_ERROR_MASK_OFFSET 0xB4
+#define ERC32_MEC_UNIMPLEMENTED_7_OFFSET 0xB8
+#define ERC32_MEC_DEBUG_CONTROL_OFFSET 0xC0
+#define ERC32_MEC_BREAKPOINT_OFFSET 0xC4
+#define ERC32_MEC_WATCHPOINT_OFFSET 0xC8
+#define ERC32_MEC_UNIMPLEMENTED_8_OFFSET 0xCC
+#define ERC32_MEC_TEST_CONTROL_OFFSET 0xD0
+#define ERC32_MEC_TEST_DATA_OFFSET 0xD4
+#define ERC32_MEC_UNIMPLEMENTED_9_OFFSET 0xD8
+#define ERC32_MEC_UART_CHANNEL_A_OFFSET 0xE0
+#define ERC32_MEC_UART_CHANNEL_B_OFFSET 0xE4
+#define ERC32_MEC_UART_STATUS_OFFSET 0xE8
+
+#endif
+
+/*
+ * The following defines the bits in the Configuration Register.
+ */
+
+#define ERC32_CONFIGURATION_POWER_DOWN_MASK 0x00000001
+#define ERC32_CONFIGURATION_POWER_DOWN_ALLOWED 0x00000001
+#define ERC32_CONFIGURATION_POWER_DOWN_DISABLED 0x00000000
+
+#define ERC32_CONFIGURATION_SOFTWARE_RESET_MASK 0x00000002
+#define ERC32_CONFIGURATION_SOFTWARE_RESET_ALLOWED 0x00000002
+#define ERC32_CONFIGURATION_SOFTWARE_RESET_DISABLED 0x00000000
+
+#define ERC32_CONFIGURATION_BUS_TIMEOUT_MASK 0x00000004
+#define ERC32_CONFIGURATION_BUS_TIMEOUT_ENABLED 0x00000004
+#define ERC32_CONFIGURATION_BUS_TIMEOUT_DISABLED 0x00000000
+
+#define ERC32_CONFIGURATION_ACCESS_PROTECTION_MASK 0x00000008
+#define ERC32_CONFIGURATION_ACCESS_PROTECTION_ENABLED 0x00000008
+#define ERC32_CONFIGURATION_ACCESS_PROTECTION_DISABLED 0x00000000
+
+
+/*
+ * The following defines the bits in the Memory Configuration Register.
+ */
+
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_MASK 0x00001C00
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_256K ( 0 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_512K ( 1 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_1MB ( 2 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_2MB ( 3 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_4MB ( 4 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_8MB ( 5 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_16MB ( 6 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_32MB ( 7 << 10 )
+
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_MASK 0x001C0000
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_128K ( 0 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_256K ( 1 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_512K ( 2 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_1M ( 3 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_2M ( 4 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_4M ( 5 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_8M ( 6 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_16M ( 7 << 18 )
+
+/*
+ * The following defines the bits in the Timer Control Register.
+ */
+
+#define ERC32_MEC_TIMER_CONTROL_GCR 0x00000001 /* 1 = reload at 0 */
+ /* 0 = stop at 0 */
+#define ERC32_MEC_TIMER_CONTROL_GCL 0x00000002 /* 1 = load and start */
+ /* 0 = no function */
+#define ERC32_MEC_TIMER_CONTROL_GSE 0x00000004 /* 1 = enable counting */
+ /* 0 = hold scalar and counter */
+#define ERC32_MEC_TIMER_CONTROL_GSL 0x00000008 /* 1 = load scalar and start */
+ /* 0 = no function */
+
+#define ERC32_MEC_TIMER_CONTROL_RTCCR 0x00000100 /* 1 = reload at 0 */
+ /* 0 = stop at 0 */
+#define ERC32_MEC_TIMER_CONTROL_RTCCL 0x00000200 /* 1 = load and start */
+ /* 0 = no function */
+#define ERC32_MEC_TIMER_CONTROL_RTCSE 0x00000400 /* 1 = enable counting */
+ /* 0 = hold scalar and counter */
+#define ERC32_MEC_TIMER_CONTROL_RTCSL 0x00000800 /* 1 = load scalar and start */
+ /* 0 = no function */
+
+/*
+ * The following defines the bits in the UART Control Registers.
+ *
+ */
+
+#define ERC32_MEC_UART_CONTROL_RTD 0x000000FF /* RX/TX data */
+
+/*
+ * The following defines the bits in the MEC UART Control Registers.
+ */
+
+#define ERC32_MEC_UART_STATUS_DR 0x00000001 /* Data Ready */
+#define ERC32_MEC_UART_STATUS_TSE 0x00000002 /* TX Send Register Empty */
+#define ERC32_MEC_UART_STATUS_THE 0x00000004 /* TX Hold Register Empty */
+#define ERC32_MEC_UART_STATUS_FE 0x00000010 /* RX Framing Error */
+#define ERC32_MEC_UART_STATUS_PE 0x00000020 /* RX Parity Error */
+#define ERC32_MEC_UART_STATUS_OE 0x00000040 /* RX Overrun Error */
+#define ERC32_MEC_UART_STATUS_CU 0x00000080 /* Clear Errors */
+#define ERC32_MEC_UART_STATUS_TXE 0x00000006 /* TX Empty */
+#define ERC32_MEC_UART_STATUS_CLRA 0x00000080 /* Clear UART A */
+#define ERC32_MEC_UART_STATUS_CLRB 0x00800000 /* Clear UART B */
+#define ERC32_MEC_UART_STATUS_ERRA 0x00000070 /* Error in UART A */
+#define ERC32_MEC_UART_STATUS_ERRB 0x00700000 /* Error in UART B */
+
+#define ERC32_MEC_UART_STATUS_DRA (ERC32_MEC_UART_STATUS_DR << 0)
+#define ERC32_MEC_UART_STATUS_TSEA (ERC32_MEC_UART_STATUS_TSE << 0)
+#define ERC32_MEC_UART_STATUS_THEA (ERC32_MEC_UART_STATUS_THE << 0)
+#define ERC32_MEC_UART_STATUS_FEA (ERC32_MEC_UART_STATUS_FE << 0)
+#define ERC32_MEC_UART_STATUS_PEA (ERC32_MEC_UART_STATUS_PE << 0)
+#define ERC32_MEC_UART_STATUS_OEA (ERC32_MEC_UART_STATUS_OE << 0)
+#define ERC32_MEC_UART_STATUS_CUA (ERC32_MEC_UART_STATUS_CU << 0)
+#define ERC32_MEC_UART_STATUS_TXEA (ERC32_MEC_UART_STATUS_TXE << 0)
+
+#define ERC32_MEC_UART_STATUS_DRB (ERC32_MEC_UART_STATUS_DR << 16)
+#define ERC32_MEC_UART_STATUS_TSEB (ERC32_MEC_UART_STATUS_TSE << 16)
+#define ERC32_MEC_UART_STATUS_THEB (ERC32_MEC_UART_STATUS_THE << 16)
+#define ERC32_MEC_UART_STATUS_FEB (ERC32_MEC_UART_STATUS_FE << 16)
+#define ERC32_MEC_UART_STATUS_PEB (ERC32_MEC_UART_STATUS_PE << 16)
+#define ERC32_MEC_UART_STATUS_OEB (ERC32_MEC_UART_STATUS_OE << 16)
+#define ERC32_MEC_UART_STATUS_CUB (ERC32_MEC_UART_STATUS_CU << 16)
+#define ERC32_MEC_UART_STATUS_TXEB (ERC32_MEC_UART_STATUS_TXE << 16)
+
+#ifndef ASM
+
+/*
+ * This is used to manipulate the on-chip registers.
+ *
+ * The following symbol must be defined in the linkcmds file and point
+ * to the correct location.
+ */
+
+extern ERC32_Register_Map ERC32_MEC;
+
+/*
+ * Macros to manipulate the Interrupt Clear, Interrupt Force, Interrupt Mask,
+ * and the Interrupt Pending Registers.
+ *
+ * NOTE: For operations which are not atomic, this code disables interrupts
+ * to guarantee there are no intervening accesses to the same register.
+ * The operations which read the register, modify the value and then
+ * store the result back are vulnerable.
+ */
+
+#define ERC32_Clear_interrupt( _source ) \
+ do { \
+ ERC32_MEC.Interrupt_Clear = (1 << (_source)); \
+ } while (0)
+
+#define ERC32_Force_interrupt( _source ) \
+ do { \
+ unsigned32 _level; \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Test_Control = ERC32_MEC.Test_Control | 0x80000; \
+ ERC32_MEC.Interrupt_Force = (1 << (_source)); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+#define ERC32_Is_interrupt_pending( _source ) \
+ (ERC32_MEC.Interrupt_Pending & (1 << (_source)))
+
+#define ERC32_Is_interrupt_masked( _source ) \
+ (ERC32_MEC.Interrupt_Masked & (1 << (_source)))
+
+#define ERC32_Mask_interrupt( _source ) \
+ do { \
+ unsigned32 _level; \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Interrupt_Mask |= (1 << (_source)); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+#define ERC32_Unmask_interrupt( _source ) \
+ do { \
+ unsigned32 _level; \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Interrupt_Mask &= ~(1 << (_source)); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+#define ERC32_Disable_interrupt( _source, _previous ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _mask = 1 << (_source); \
+ \
+ sparc_disable_interrupts( _level ); \
+ (_previous) = ERC32_MEC.Interrupt_Mask; \
+ ERC32_MEC.Interrupt_Mask = _previous | _mask; \
+ sparc_enable_interrupts( _level ); \
+ (_previous) &= ~_mask; \
+ } while (0)
+
+#define ERC32_Restore_interrupt( _source, _previous ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _mask = 1 << (_source); \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Interrupt_Mask = \
+ (ERC32_MEC.Interrupt_Mask & ~_mask) | (_previous); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+/*
+ * The following macros attempt to hide the fact that the General Purpose
+ * Timer and Real Time Clock Timer share the Timer Control Register. Because
+ * the Timer Control Register is write only, we must mirror it in software
+ * and insure that writes to one timer do not alter the current settings
+ * and status of the other timer.
+ *
+ * This code promotes the view that the two timers are completely independent.
+ * By exclusively using the routines below to access the Timer Control
+ * Register, the application can view the system as having a General Purpose
+ * Timer Control Register and a Real Time Clock Timer Control Register
+ * rather than the single shared value.
+ *
+ * Each logical timer control register is organized as follows:
+ *
+ * D0 - Counter Reload
+ * 1 = reload counter at zero and restart
+ * 0 = stop counter at zero
+ *
+ * D1 - Counter Load
+ * 1 = load counter with preset value and restart
+ * 0 = no function
+ *
+ * D2 - Enable
+ * 1 = enable counting
+ * 0 = hold scaler and counter
+ *
+ * D3 - Scaler Load
+ * 1 = load scalar with preset value and restart
+ * 0 = no function
+ *
+ * To insure the management of the mirror is atomic, we disable interrupts
+ * around updates.
+ */
+
+#define ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO 0x00000001
+#define ERC32_MEC_TIMER_COUNTER_STOP_AT_ZERO 0x00000000
+
+#define ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER 0x00000002
+
+#define ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING 0x00000004
+#define ERC32_MEC_TIMER_COUNTER_DISABLE_COUNTING 0x00000000
+
+#define ERC32_MEC_TIMER_COUNTER_LOAD_SCALER 0x00000008
+
+#define ERC32_MEC_TIMER_COUNTER_RELOAD_MASK 0x00000001
+#define ERC32_MEC_TIMER_COUNTER_ENABLE_MASK 0x00000004
+
+#define ERC32_MEC_TIMER_COUNTER_DEFINED_MASK 0x0000000F
+#define ERC32_MEC_TIMER_COUNTER_CURRENT_MODE_MASK 0x00000005
+
+extern unsigned32 _ERC32_MEC_Timer_Control_Mirror;
+
+/*
+ * This macros manipulate the General Purpose Timer portion of the
+ * Timer Control register and promote the view that there are actually
+ * two independent Timer Control Registers.
+ */
+
+#define ERC32_MEC_Set_General_Purpose_Timer_Control( _value ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _control; \
+ unsigned32 __value; \
+ \
+ __value = ((_value) & 0x0f); \
+ sparc_disable_interrupts( _level ); \
+ _control = _ERC32_MEC_Timer_Control_Mirror; \
+ _control &= ERC32_MEC_TIMER_COUNTER_DEFINED_MASK << 8; \
+ _ERC32_MEC_Timer_Control_Mirror = _control | _value; \
+ _control &= (ERC32_MEC_TIMER_COUNTER_CURRENT_MODE_MASK << 8); \
+ _control |= __value; \
+ /* printf( "GPT 0x%x 0x%x 0x%x\n", _value, __value, _control ); */ \
+ ERC32_MEC.Timer_Control = _control; \
+ sparc_enable_interrupts( _level ); \
+ } while ( 0 )
+
+#define ERC32_MEC_Get_General_Purpose_Timer_Control( _value ) \
+ do { \
+ (_value) = _ERC32_MEC_Timer_Control_Mirror & 0xf; \
+ } while ( 0 )
+
+/*
+ * This macros manipulate the Real Timer Clock Timer portion of the
+ * Timer Control register and promote the view that there are actually
+ * two independent Timer Control Registers.
+ */
+
+#define ERC32_MEC_Set_Real_Time_Clock_Timer_Control( _value ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _control; \
+ unsigned32 __value; \
+ \
+ __value = ((_value) & 0x0f) << 8; \
+ sparc_disable_interrupts( _level ); \
+ _control = _ERC32_MEC_Timer_Control_Mirror; \
+ _control &= ERC32_MEC_TIMER_COUNTER_DEFINED_MASK; \
+ _ERC32_MEC_Timer_Control_Mirror = _control | __value; \
+ _control &= ERC32_MEC_TIMER_COUNTER_CURRENT_MODE_MASK; \
+ _control |= __value; \
+ /* printf( "RTC 0x%x 0x%x 0x%x\n", _value, __value, _control ); */ \
+ ERC32_MEC.Timer_Control = _control; \
+ sparc_enable_interrupts( _level ); \
+ } while ( 0 )
+
+#define ERC32_MEC_Get_Real_Time_Clock_Timer_Control( _value ) \
+ do { \
+ (_value) = (_ERC32_MEC_Timer_Control_Mirror >> 8) & 0xf; \
+ } while ( 0 )
+
+
+#endif /* !ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_INCLUDE_ERC32_h */
+/* end of include file */
+
diff --git a/c/src/exec/score/cpu/sparc/rtems.s b/c/src/exec/score/cpu/sparc/rtems.s
new file mode 100644
index 0000000000..25418bdd6e
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/rtems.s
@@ -0,0 +1,58 @@
+/* rtems.s
+ *
+ * This file contains the single entry point code for
+ * the SPARC port of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+
+/*
+ * RTEMS
+ *
+ * This routine jumps to the directive indicated in the
+ * CPU defined register. This routine is used when RTEMS is
+ * linked by itself and placed in ROM. This routine is the
+ * first address in the ROM space for RTEMS. The user "calls"
+ * this address with the directive arguments in the normal place.
+ * This routine then jumps indirectly to the correct directive
+ * preserving the arguments. The directive should not realize
+ * it has been "wrapped" in this way. The table "_Entry_points"
+ * is used to look up the directive.
+ *
+ * void RTEMS()
+ */
+
+ .align 4
+ PUBLIC(RTEMS)
+SYM(RTEMS):
+ /*
+ * g2 was chosen because gcc uses it as a scratch register in
+ * similar code scenarios and the other locals, ins, and outs
+ * are off limits to this routine unless it does a "save" and
+ * copies its in registers to the outs which only works up until
+ * 6 parameters. Best to take the simple approach in this case.
+ */
+ sethi SYM(_Entry_points), %g2
+ or %g2, %lo(SYM(_Entry_points)), %g2
+ sll %g1, 2, %g1
+ add %g1, %g2, %g2
+ jmp %g2
+ nop
+
diff --git a/c/src/exec/score/cpu/sparc/sparc.h b/c/src/exec/score/cpu/sparc/sparc.h
new file mode 100644
index 0000000000..2e1efec392
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/sparc.h
@@ -0,0 +1,253 @@
+/* sparc.h
+ *
+ * This include file contains information pertaining to the SPARC
+ * processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_SPARC_h
+#define _INCLUDE_SPARC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the "sparc" family. It does
+ * this by setting variables to indicate which implementation
+ * dependent features are present in a particular member
+ * of the family.
+ *
+ * Currently recognized feature flags:
+ *
+ * + SPARC_HAS_FPU
+ * 0 - no HW FPU
+ * 1 - has HW FPU (assumed to be compatible w/90C602)
+ *
+ * + SPARC_HAS_BITSCAN
+ * 0 - does not have scan instructions
+ * 1 - has scan instruction (not currently implemented)
+ *
+ * + SPARC_NUMBER_OF_REGISTER_WINDOWS
+ * 8 is the most common number supported by SPARC implementations.
+ * SPARC_PSR_CWP_MASK is derived from this value.
+ *
+ * + SPARC_HAS_LOW_POWER_MODE
+ * 0 - does not have low power mode support (or not supported)
+ * 1 - has low power mode and thus a CPU model dependent idle task.
+ *
+ */
+
+#if defined(erc32)
+
+#define CPU_MODEL_NAME "erc32"
+#define SPARC_HAS_FPU 1
+#define SPARC_HAS_BITSCAN 0
+#define SPARC_NUMBER_OF_REGISTER_WINDOWS 8
+#define SPARC_HAS_LOW_POWER_MODE 1
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+/*
+ * Define the name of the CPU family.
+ */
+
+#define CPU_NAME "SPARC"
+
+/*
+ * Miscellaneous constants
+ */
+
+/*
+ * PSR masks and starting bit positions
+ *
+ * NOTE: Reserved bits are ignored.
+ */
+
+#if (SPARC_NUMBER_OF_REGISTER_WINDOWS == 8)
+#define SPARC_PSR_CWP_MASK 0x07 /* bits 0 - 4 */
+#elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 16)
+#define SPARC_PSR_CWP_MASK 0x0F /* bits 0 - 4 */
+#elif (SPARC_NUMBER_OF_REGISTER_WINDOWS == 32)
+#define SPARC_PSR_CWP_MASK 0x1F /* bits 0 - 4 */
+#else
+#error "Unsupported number of register windows for this cpu"
+#endif
+
+#define SPARC_PSR_ET_MASK 0x00000020 /* bit 5 */
+#define SPARC_PSR_PS_MASK 0x00000040 /* bit 6 */
+#define SPARC_PSR_S_MASK 0x00000080 /* bit 7 */
+#define SPARC_PSR_PIL_MASK 0x00000F00 /* bits 8 - 11 */
+#define SPARC_PSR_EF_MASK 0x00001000 /* bit 12 */
+#define SPARC_PSR_EC_MASK 0x00002000 /* bit 13 */
+#define SPARC_PSR_ICC_MASK 0x00F00000 /* bits 20 - 23 */
+#define SPARC_PSR_VER_MASK 0x0F000000 /* bits 24 - 27 */
+#define SPARC_PSR_IMPL_MASK 0xF0000000 /* bits 28 - 31 */
+
+#define SPARC_PSR_CWP_BIT_POSITION 0 /* bits 0 - 4 */
+#define SPARC_PSR_ET_BIT_POSITION 5 /* bit 5 */
+#define SPARC_PSR_PS_BIT_POSITION 6 /* bit 6 */
+#define SPARC_PSR_S_BIT_POSITION 7 /* bit 7 */
+#define SPARC_PSR_PIL_BIT_POSITION 8 /* bits 8 - 11 */
+#define SPARC_PSR_EF_BIT_POSITION 12 /* bit 12 */
+#define SPARC_PSR_EC_BIT_POSITION 13 /* bit 13 */
+#define SPARC_PSR_ICC_BIT_POSITION 20 /* bits 20 - 23 */
+#define SPARC_PSR_VER_BIT_POSITION 24 /* bits 24 - 27 */
+#define SPARC_PSR_IMPL_BIT_POSITION 28 /* bits 28 - 31 */
+
+#ifndef ASM
+
+/*
+ * Standard nop
+ */
+
+#define nop() \
+ do { \
+ asm volatile ( "nop" ); \
+ } while ( 0 )
+
+/*
+ * Get and set the PSR
+ */
+
+#define sparc_get_psr( _psr ) \
+ do { \
+ (_psr) = 0; \
+ asm volatile( "rd %%psr, %0" : "=r" (_psr) : "0" (_psr) ); \
+ } while ( 0 )
+
+#define sparc_set_psr( _psr ) \
+ do { \
+ asm volatile ( "mov %0, %%psr " : "=r" ((_psr)) : "0" ((_psr)) ); \
+ nop(); \
+ nop(); \
+ nop(); \
+ } while ( 0 )
+
+/*
+ * Get and set the TBR
+ */
+
+#define sparc_get_tbr( _tbr ) \
+ do { \
+ (_tbr) = 0; /* to avoid unitialized warnings */ \
+ asm volatile( "rd %%tbr, %0" : "=r" (_tbr) : "0" (_tbr) ); \
+ } while ( 0 )
+
+#define sparc_set_tbr( _tbr ) \
+ do { \
+ asm volatile( "wr %0, 0, %%tbr" : "=r" (_tbr) : "0" (_tbr) ); \
+ } while ( 0 )
+
+/*
+ * Get and set the WIM
+ */
+
+#define sparc_get_wim( _wim ) \
+ do { \
+ asm volatile( "rd %%wim, %0" : "=r" (_wim) : "0" (_wim) ); \
+ } while ( 0 )
+
+#define sparc_set_wim( _wim ) \
+ do { \
+ asm volatile( "wr %0, %%wim" : "=r" (_wim) : "0" (_wim) ); \
+ nop(); \
+ nop(); \
+ nop(); \
+ } while ( 0 )
+
+/*
+ * Get and set the Y
+ */
+
+#define sparc_get_y( _y ) \
+ do { \
+ asm volatile( "rd %%y, %0" : "=r" (_y) : "0" (_y) ); \
+ } while ( 0 )
+
+#define sparc_set_y( _y ) \
+ do { \
+ asm volatile( "wr %0, %%y" : "=r" (_y) : "0" (_y) ); \
+ } while ( 0 )
+
+/*
+ * Manipulate the interrupt level in the psr
+ *
+ */
+
+#define sparc_disable_interrupts( _level ) \
+ do { \
+ register unsigned int _newlevel; \
+ \
+ sparc_get_psr( _level ); \
+ (_newlevel) = (_level) | SPARC_PSR_PIL_MASK; \
+ sparc_set_psr( _newlevel ); \
+ } while ( 0 )
+
+#define sparc_enable_interrupts( _level ) \
+ do { \
+ unsigned int _tmp; \
+ \
+ sparc_get_psr( _tmp ); \
+ _tmp &= ~SPARC_PSR_PIL_MASK; \
+ _tmp |= (_level) & SPARC_PSR_PIL_MASK; \
+ sparc_set_psr( _tmp ); \
+ } while ( 0 )
+
+#define sparc_flash_interrupts( _level ) \
+ do { \
+ register unsigned32 _ignored = 0; \
+ \
+ sparc_enable_interrupts( (_level) ); \
+ sparc_disable_interrupts( _ignored ); \
+ } while ( 0 )
+
+#define sparc_set_interrupt_level( _new_level ) \
+ do { \
+ register unsigned32 _new_psr_level = 0; \
+ \
+ sparc_get_psr( _new_psr_level ); \
+ _new_psr_level &= ~SPARC_PSR_PIL_MASK; \
+ _new_psr_level |= \
+ (((_new_level) << SPARC_PSR_PIL_BIT_POSITION) & SPARC_PSR_PIL_MASK); \
+ sparc_set_psr( _new_psr_level ); \
+ } while ( 0 )
+
+#define sparc_get_interrupt_level( _level ) \
+ do { \
+ register unsigned32 _psr_level = 0; \
+ \
+ sparc_get_psr( _psr_level ); \
+ (_level) = \
+ (_psr_level & SPARC_PSR_PIL_MASK) >> SPARC_PSR_PIL_BIT_POSITION; \
+ } while ( 0 )
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_SPARC_h */
+/* end of include file */
diff --git a/c/src/exec/score/cpu/sparc/sparctypes.h b/c/src/exec/score/cpu/sparc/sparctypes.h
new file mode 100644
index 0000000000..16ca4eae59
--- /dev/null
+++ b/c/src/exec/score/cpu/sparc/sparctypes.h
@@ -0,0 +1,64 @@
+/* sparctypes.h
+ *
+ * This include file contains type definitions pertaining to the
+ * SPARC processor family.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#ifndef __SPARC_TYPES_h
+#define __SPARC_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void sparc_isr;
+typedef void ( *sparc_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/cpu/unix/Makefile.in b/c/src/exec/score/cpu/unix/Makefile.in
new file mode 100644
index 0000000000..6ac9ac0544
--- /dev/null
+++ b/c/src/exec/score/cpu/unix/Makefile.in
@@ -0,0 +1,90 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+RELS=$(ARCH)/rtems-cpu.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpu
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/cpu.h $(srcdir)/unixtypes.h
+
+# Assembly source names, if any, go here -- minus the .S
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V) -DCPU_SYNC_IO
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(ARCH)/unixsize.h: $(ARCH) cpu.h $(PROJECT_RELEASE)/bin/gensize
+ $(RM) $@
+ $(PROJECT_RELEASE)/bin/gensize > $@
+ $(CHMOD) -w $@
+
+$(ARCH)/rtems-cpu.rel: $(OBJS)
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(ARCH)/unixsize.h preinstall $(RELS)
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+install: all
+
+# Real ports using the gnu tools will need to have bsp_specs!!!
+# ${PROJECT_RELEASE}/lib/bsp_specs
+preinstall: ${PROJECT_RELEASE}/include/rtems/score/unix.h $(ARCH)/unixsize.h \
+ ${PROJECT_RELEASE}/include/rtems/score/targopts.h
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+ $(INSTALL) -m 444 ${ARCH}/unixsize.h ${PROJECT_RELEASE}/include/rtems/score
+
+${PROJECT_RELEASE}/include/rtems/score/unix.h: unix.h
+ $(SED) -e 's?REPLACE_THIS_WITH_THE_CPU_MODEL?$(RTEMS_CPU_MODEL)?' \
+ -e 's?REPLACE_THIS_WITH_THE_BSP?$(RTEMS_BSP)?' \
+ -e 's?REPLACE_THIS_WITH_THE_CPU_FAMILY?$(RTEMS_CPU_FAMILY)?' \
+ -e 's?REPLACE_THIS_WITH_THE_UNIX_FLAVOR?$(RTEMS_UNIX_FLAVOR)?' \
+ <$(srcdir)/unix.h >$(ARCH)/unix.h.tmp
+ $(INSTALL) -m 444 $(ARCH)/unix.h.tmp $@
+
+${PROJECT_RELEASE}/include/rtems/score/targopts.h: $(ARCH)/targopts.h-tmp
+ $(INSTALL) -m 444 $(ARCH)/targopts.h-tmp $@
+
+# $(ARCH)/targopts.h-tmp rule is in leaf.cfg
+
+# Real ports using the gnu tools will need to have bsp_specs!!!
+#${PROJECT_RELEASE}/lib/bsp_specs: $(ARCH)/bsp_specs.tmp
+# $(INSTALL) -m 444 $(ARCH)/bsp_specs.tmp $@
+#
+# $(ARCH)/bsp_specs.tmp rule is in leaf.cfg
diff --git a/c/src/exec/score/cpu/unix/cpu.c b/c/src/exec/score/cpu/unix/cpu.c
new file mode 100644
index 0000000000..1efd9df54b
--- /dev/null
+++ b/c/src/exec/score/cpu/unix/cpu.c
@@ -0,0 +1,1105 @@
+/*
+ * UNIX Simulator Dependent Source
+ *
+ * COPYRIGHT (c) 1994,95 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/interr.h>
+
+#if defined(solaris2)
+/*
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 3
+#undef __STRICT_ANSI__
+#define __STRICT_ANSI__
+*/
+#define __EXTENSIONS__
+#endif
+
+#if defined(__linux__)
+#define MALLOC_0_RETURNS_NULL
+#endif
+
+#include <sys/types.h>
+#include <sys/times.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/sem.h>
+#include <string.h> /* memset */
+
+#ifndef SA_RESTART
+#define SA_RESTART 0
+#endif
+
+typedef struct {
+ jmp_buf regs;
+ unsigned32 isr_level;
+} Context_Control_overlay;
+
+void _CPU_Signal_initialize(void);
+void _CPU_Stray_signal(int);
+void _CPU_ISR_Handler(int);
+
+static sigset_t _CPU_Signal_mask;
+static Context_Control_overlay
+ _CPU_Context_Default_with_ISRs_enabled CPU_STRUCTURE_ALIGNMENT;
+static Context_Control_overlay
+ _CPU_Context_Default_with_ISRs_disabled CPU_STRUCTURE_ALIGNMENT;
+
+/*
+ * Sync IO support, an entry for each fd that can be set
+ */
+
+void _CPU_Sync_io_Init();
+
+static rtems_sync_io_handler _CPU_Sync_io_handlers[FD_SETSIZE];
+static int sync_io_nfds;
+static fd_set sync_io_readfds;
+static fd_set sync_io_writefds;
+static fd_set sync_io_exceptfds;
+
+/*
+ * Which cpu are we? Used by libcpu and libbsp.
+ */
+
+int cpu_number;
+
+/*PAGE
+ *
+ * _CPU_ISR_From_CPU_Init
+ */
+
+sigset_t posix_empty_mask;
+
+void _CPU_ISR_From_CPU_Init()
+{
+ unsigned32 i;
+ proc_ptr old_handler;
+
+ /*
+ * Generate an empty mask to be used by disable_support
+ */
+
+ sigemptyset(&posix_empty_mask);
+
+ /*
+ * Block all the signals except SIGTRAP for the debugger
+ * and fatal error signals.
+ */
+
+ (void) sigfillset(&_CPU_Signal_mask);
+ (void) sigdelset(&_CPU_Signal_mask, SIGTRAP);
+ (void) sigdelset(&_CPU_Signal_mask, SIGABRT);
+ (void) sigdelset(&_CPU_Signal_mask, SIGIOT);
+ (void) sigdelset(&_CPU_Signal_mask, SIGCONT);
+ (void) sigdelset(&_CPU_Signal_mask, SIGSEGV);
+ (void) sigdelset(&_CPU_Signal_mask, SIGBUS);
+ (void) sigdelset(&_CPU_Signal_mask, SIGFPE);
+
+ _CPU_ISR_Enable(1);
+
+ /*
+ * Set the handler for all signals to be signal_handler
+ * which will then vector out to the correct handler
+ * for whichever signal actually happened. Initially
+ * set the vectors to the stray signal handler.
+ */
+
+ for (i = 0; i < CPU_INTERRUPT_NUMBER_OF_VECTORS; i++)
+ (void)_CPU_ISR_install_vector(i, _CPU_Stray_signal, &old_handler);
+
+ _CPU_Signal_initialize();
+}
+
+void _CPU_Signal_initialize( void )
+{
+ struct sigaction act;
+ sigset_t mask;
+
+ /* mark them all active except for TraceTrap and Abort */
+
+ mask = _CPU_Signal_mask;
+ sigprocmask(SIG_UNBLOCK, &mask, 0);
+
+ act.sa_handler = _CPU_ISR_Handler;
+ act.sa_mask = mask;
+ act.sa_flags = SA_RESTART;
+
+ sigaction(SIGHUP, &act, 0);
+ sigaction(SIGINT, &act, 0);
+ sigaction(SIGQUIT, &act, 0);
+ sigaction(SIGILL, &act, 0);
+#ifdef SIGEMT
+ sigaction(SIGEMT, &act, 0);
+#endif
+ sigaction(SIGFPE, &act, 0);
+ sigaction(SIGKILL, &act, 0);
+ sigaction(SIGBUS, &act, 0);
+ sigaction(SIGSEGV, &act, 0);
+#ifdef SIGSYS
+ sigaction(SIGSYS, &act, 0);
+#endif
+ sigaction(SIGPIPE, &act, 0);
+ sigaction(SIGALRM, &act, 0);
+ sigaction(SIGTERM, &act, 0);
+ sigaction(SIGUSR1, &act, 0);
+ sigaction(SIGUSR2, &act, 0);
+ sigaction(SIGCHLD, &act, 0);
+ sigaction(SIGCLD, &act, 0);
+ sigaction(SIGPWR, &act, 0);
+ sigaction(SIGVTALRM, &act, 0);
+ sigaction(SIGPROF, &act, 0);
+ sigaction(SIGIO, &act, 0);
+ sigaction(SIGWINCH, &act, 0);
+ sigaction(SIGSTOP, &act, 0);
+ sigaction(SIGTTIN, &act, 0);
+ sigaction(SIGTTOU, &act, 0);
+ sigaction(SIGURG, &act, 0);
+#ifdef SIGLOST
+ sigaction(SIGLOST, &act, 0);
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_Context_From_CPU_Init
+ */
+
+void _CPU_Context_From_CPU_Init()
+{
+
+#if defined(hppa1_1) && defined(RTEMS_UNIXLIB_SETJMP)
+ /*
+ * HACK - set the _SYSTEM_ID to 0x20c so that setjmp/longjmp
+ * will handle the full 32 floating point registers.
+ */
+
+ {
+ extern unsigned32 _SYSTEM_ID;
+
+ _SYSTEM_ID = 0x20c;
+ }
+#endif
+
+ /*
+ * get default values to use in _CPU_Context_Initialize()
+ */
+
+
+ (void) memset(
+ &_CPU_Context_Default_with_ISRs_enabled,
+ 0,
+ sizeof(Context_Control)
+ );
+ (void) memset(
+ &_CPU_Context_Default_with_ISRs_disabled,
+ 0,
+ sizeof(Context_Control)
+ );
+
+ _CPU_ISR_Set_level( 0 );
+ _CPU_Context_switch(
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_enabled,
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_enabled
+ );
+
+ _CPU_ISR_Set_level( 1 );
+ _CPU_Context_switch(
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_disabled,
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_disabled
+ );
+}
+
+/*PAGE
+ *
+ * _CPU_Sync_io_Init
+ */
+
+void _CPU_Sync_io_Init()
+{
+ int fd;
+
+ for (fd = 0; fd < FD_SETSIZE; fd++)
+ _CPU_Sync_io_handlers[fd] = NULL;
+
+ sync_io_nfds = 0;
+ FD_ZERO(&sync_io_readfds);
+ FD_ZERO(&sync_io_writefds);
+ FD_ZERO(&sync_io_exceptfds);
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ sigset_t old_mask;
+
+ sigprocmask(SIG_BLOCK, 0, &old_mask);
+
+ if (memcmp((void *)&posix_empty_mask, (void *)&old_mask, sizeof(sigset_t)))
+ return 1;
+
+ return 0;
+}
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * XXX; If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* XXX: FP context initialization support */
+
+ _CPU_Table = *cpu_table;
+
+ _CPU_ISR_From_CPU_Init();
+
+ _CPU_Sync_io_Init();
+
+ _CPU_Context_From_CPU_Init();
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ _CPU_Fatal_halt( 0xdeaddead );
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _CPU_ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Thread_Idle_body
+ *
+ * Stop until we get a signal which is the logically the same thing
+ * entering low-power or sleep mode on a real processor and waiting for
+ * an interrupt. This significantly reduces the consumption of host
+ * CPU cycles which is again similar to low power mode.
+ */
+
+void _CPU_Thread_Idle_body( void )
+{
+#if CPU_SYNC_IO
+ extern void _Thread_Dispatch(void);
+ int fd;
+#endif
+
+ while (1) {
+#ifdef RTEMS_DEBUG
+ /* interrupts had better be enabled at this point! */
+ if (_CPU_ISR_Get_level() != 0)
+ abort();
+#endif
+
+ /*
+ * Block on a select statement, the CPU interface added allow the
+ * user to add new descriptors which are to be blocked on
+ */
+
+#if CPU_SYNC_IO
+ if (sync_io_nfds) {
+ int result;
+
+ result = select(sync_io_nfds,
+ &sync_io_readfds,
+ &sync_io_writefds,
+ &sync_io_exceptfds,
+ NULL);
+
+ if ((result < 0) && (errno != EINTR))
+ _CPU_Fatal_error(0x200); /* FIXME : what number should go here !! */
+
+ for (fd = 0; fd < sync_io_nfds; fd++) {
+ boolean read = FD_ISSET(fd, &sync_io_readfds);
+ boolean write = FD_ISSET(fd, &sync_io_writefds);
+ boolean except = FD_ISSET(fd, &sync_io_exceptfds);
+
+ if (_CPU_Sync_io_handlers[fd] && (read || write || except))
+ _CPU_Sync_io_handlers[fd](fd, read, write, except);
+
+ _Thread_Dispatch();
+ }
+ } else
+ pause();
+#else
+ pause();
+#endif
+
+ }
+
+}
+
+/*PAGE
+ *
+ * _CPU_Context_Initialize
+ */
+
+void _CPU_Context_Initialize(
+ Context_Control *_the_context,
+ unsigned32 *_stack_base,
+ unsigned32 _size,
+ unsigned32 _new_level,
+ void *_entry_point,
+ boolean _is_fp
+)
+{
+ unsigned32 *addr;
+ unsigned32 jmp_addr;
+ unsigned32 _stack_low; /* lowest "stack aligned" address */
+ unsigned32 _stack_high; /* highest "stack aligned" address */
+ unsigned32 _the_size;
+
+ jmp_addr = (unsigned32) _entry_point;
+
+ /*
+ * On CPUs with stacks which grow down, we build the stack
+ * based on the _stack_high address. On CPUs with stacks which
+ * grow up, we build the stack based on the _stack_low address.
+ */
+
+ _stack_low = (unsigned32)(_stack_base) + CPU_STACK_ALIGNMENT - 1;
+ _stack_low &= ~(CPU_STACK_ALIGNMENT - 1);
+
+ _stack_high = (unsigned32)(_stack_base) + _size;
+ _stack_high &= ~(CPU_STACK_ALIGNMENT - 1);
+
+ if (_stack_high > _stack_low)
+ _the_size = _stack_high - _stack_low;
+ else
+ _the_size = _stack_low - _stack_high;
+
+ /*
+ * Slam our jmp_buf template into the context we are creating
+ */
+
+ if ( _new_level == 0 )
+ *_the_context = *(Context_Control *)
+ &_CPU_Context_Default_with_ISRs_enabled;
+ else
+ *_the_context = *(Context_Control *)
+ &_CPU_Context_Default_with_ISRs_disabled;
+
+ addr = (unsigned32 *)_the_context;
+
+#if defined(hppa1_1)
+ *(addr + RP_OFF) = jmp_addr;
+ *(addr + SP_OFF) = (unsigned32)(_stack_low + CPU_FRAME_SIZE);
+
+ /*
+ * See if we are using shared libraries by checking
+ * bit 30 in 24 off of newp. If bit 30 is set then
+ * we are using shared libraries and the jump address
+ * points to the pointer, so we put that into rp instead.
+ */
+
+ if (jmp_addr & 0x40000000) {
+ jmp_addr &= 0xfffffffc;
+ *(addr + RP_OFF) = *(unsigned32 *)jmp_addr;
+ }
+#elif defined(sparc)
+
+ /*
+ * See /usr/include/sys/stack.h in Solaris 2.3 for a nice
+ * diagram of the stack.
+ */
+
+ asm ("ta 0x03"); /* flush registers */
+
+ *(addr + RP_OFF) = jmp_addr + ADDR_ADJ_OFFSET;
+ *(addr + SP_OFF) = (unsigned32)(_stack_high - CPU_FRAME_SIZE);
+ *(addr + FP_OFF) = (unsigned32)(_stack_high);
+
+#elif defined(i386) || defined(__i386__)
+
+ /*
+ * This information was gathered by disassembling setjmp().
+ */
+
+ {
+ unsigned32 stack_ptr;
+
+ stack_ptr = _stack_high - CPU_FRAME_SIZE;
+
+ *(addr + EBX_OFF) = 0xFEEDFEED;
+ *(addr + ESI_OFF) = 0xDEADDEAD;
+ *(addr + EDI_OFF) = 0xDEAFDEAF;
+ *(addr + EBP_OFF) = stack_ptr;
+ *(addr + ESP_OFF) = stack_ptr;
+ *(addr + RET_OFF) = jmp_addr;
+
+ addr = (unsigned32 *) stack_ptr;
+
+ addr[ 0 ] = jmp_addr;
+ addr[ 1 ] = (unsigned32) stack_ptr;
+ addr[ 2 ] = (unsigned32) stack_ptr;
+ }
+
+#else
+#error "UNKNOWN CPU!!!"
+#endif
+
+}
+
+/*PAGE
+ *
+ * _CPU_Context_restore
+ */
+
+void _CPU_Context_restore(
+ Context_Control *next
+)
+{
+ Context_Control_overlay *nextp = (Context_Control_overlay *)next;
+
+ _CPU_ISR_Enable(nextp->isr_level);
+ longjmp( nextp->regs, 0 );
+}
+
+/*PAGE
+ *
+ * _CPU_Context_switch
+ */
+
+static void do_jump(
+ Context_Control_overlay *currentp,
+ Context_Control_overlay *nextp
+);
+
+void _CPU_Context_switch(
+ Context_Control *current,
+ Context_Control *next
+)
+{
+ Context_Control_overlay *currentp = (Context_Control_overlay *)current;
+ Context_Control_overlay *nextp = (Context_Control_overlay *)next;
+#if 0
+ int status;
+#endif
+
+ currentp->isr_level = _CPU_ISR_Disable_support();
+
+ do_jump( currentp, nextp );
+
+#if 0
+ if (sigsetjmp(currentp->regs, 1) == 0) { /* Save the current context */
+ siglongjmp(nextp->regs, 0); /* Switch to the new context */
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+ }
+#endif
+
+#ifdef RTEMS_DEBUG
+ if (_CPU_ISR_Get_level() == 0)
+ abort();
+#endif
+
+ _CPU_ISR_Enable(currentp->isr_level);
+}
+
+static void do_jump(
+ Context_Control_overlay *currentp,
+ Context_Control_overlay *nextp
+)
+{
+ int status;
+
+ if (setjmp(currentp->regs) == 0) { /* Save the current context */
+ longjmp(nextp->regs, 0); /* Switch to the new context */
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_Save_float_context
+ */
+
+void _CPU_Save_float_context(
+ Context_Control_fp *fp_context
+)
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Restore_float_context
+ */
+
+void _CPU_Restore_float_context(
+ Context_Control_fp *fp_context
+)
+{
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Disable_support
+ */
+
+unsigned32 _CPU_ISR_Disable_support(void)
+{
+ int status;
+ sigset_t old_mask;
+
+ status = sigprocmask(SIG_BLOCK, &_CPU_Signal_mask, &old_mask);
+ if ( status )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+
+ if (memcmp((void *)&posix_empty_mask, (void *)&old_mask, sizeof(sigset_t)))
+ return 1;
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Enable
+ */
+
+void _CPU_ISR_Enable(
+ unsigned32 level
+)
+{
+ int status;
+
+ if (level == 0)
+ status = sigprocmask(SIG_UNBLOCK, &_CPU_Signal_mask, 0);
+ else
+ status = sigprocmask(SIG_BLOCK, &_CPU_Signal_mask, 0);
+
+ if ( status )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Handler
+ *
+ * External interrupt handler.
+ * This is installed as a UNIX signal handler.
+ * It vectors out to specific user interrupt handlers.
+ */
+
+void _CPU_ISR_Handler(int vector)
+{
+ extern void _Thread_Dispatch(void);
+ extern unsigned32 _Thread_Dispatch_disable_level;
+ extern boolean _Context_Switch_necessary;
+
+ if (_ISR_Nest_level++ == 0) {
+ /* switch to interrupt stack */
+ }
+
+ _Thread_Dispatch_disable_level++;
+
+ if (_ISR_Vector_table[vector]) {
+ _ISR_Vector_table[vector](vector);
+ } else {
+ _CPU_Stray_signal(vector);
+ }
+
+ if (_ISR_Nest_level-- == 0) {
+ /* switch back to original stack */
+ }
+
+ _Thread_Dispatch_disable_level--;
+
+ if (_Thread_Dispatch_disable_level == 0 &&
+ (_Context_Switch_necessary || _ISR_Signals_to_thread_executing)) {
+ _ISR_Signals_to_thread_executing = FALSE;
+ _CPU_ISR_Enable(0);
+ _Thread_Dispatch();
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_Stray_signal
+ */
+
+void _CPU_Stray_signal(int sig_num)
+{
+ char buffer[ 4 ];
+
+ /*
+ * print "stray" msg about ones which that might mean something
+ * Avoid using the stdio section of the library.
+ * The following is generally safe.
+ */
+
+ switch (sig_num)
+ {
+ case SIGCLD:
+ break;
+
+ default:
+ {
+ /*
+ * We avoid using the stdio section of the library.
+ * The following is generally safe
+ */
+
+ int digit;
+ int number = sig_num;
+ int len = 0;
+
+ digit = number / 100;
+ number %= 100;
+ if (digit) buffer[len++] = '0' + digit;
+
+ digit = number / 10;
+ number %= 10;
+ if (digit || len) buffer[len++] = '0' + digit;
+
+ digit = number;
+ buffer[len++] = '0' + digit;
+
+ buffer[ len++ ] = '\n';
+
+ write( 2, "Stray signal ", 13 );
+ write( 2, buffer, len );
+
+ }
+ }
+
+ /*
+ * If it was a "fatal" signal, then exit here
+ * If app code has installed a hander for one of these, then
+ * we won't call _CPU_Stray_signal, so this is ok.
+ */
+
+ switch (sig_num) {
+ case SIGINT:
+ case SIGHUP:
+ case SIGQUIT:
+ case SIGILL:
+#ifdef SIGEMT
+ case SIGEMT:
+#endif
+ case SIGKILL:
+ case SIGBUS:
+ case SIGSEGV:
+ case SIGTERM:
+ case SIGIOT:
+ _CPU_Fatal_error(0x100 + sig_num);
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_Fatal_error
+ */
+
+void _CPU_Fatal_error(unsigned32 error)
+{
+ setitimer(ITIMER_REAL, 0, 0);
+
+ if ( error ) {
+#ifdef RTEMS_DEBUG
+ abort();
+#endif
+ if (getenv("RTEMS_DEBUG"))
+ abort();
+ }
+
+ _exit(error);
+}
+
+/*
+ * Special Purpose Routines to hide the use of UNIX system calls.
+ */
+
+int _CPU_Set_sync_io_handler(
+ int fd,
+ boolean read,
+ boolean write,
+ boolean except,
+ rtems_sync_io_handler handler
+)
+{
+ if ((fd < FD_SETSIZE) && (_CPU_Sync_io_handlers[fd] == NULL)) {
+ if (read)
+ FD_SET(fd, &sync_io_readfds);
+ else
+ FD_CLR(fd, &sync_io_readfds);
+ if (write)
+ FD_SET(fd, &sync_io_writefds);
+ else
+ FD_CLR(fd, &sync_io_writefds);
+ if (except)
+ FD_SET(fd, &sync_io_exceptfds);
+ else
+ FD_CLR(fd, &sync_io_exceptfds);
+ _CPU_Sync_io_handlers[fd] = handler;
+ if ((fd + 1) > sync_io_nfds)
+ sync_io_nfds = fd + 1;
+ return 0;
+ }
+ return -1;
+}
+
+int _CPU_Clear_sync_io_handler(
+ int fd
+)
+{
+ if ((fd < FD_SETSIZE) && _CPU_Sync_io_handlers[fd]) {
+ FD_CLR(fd, &sync_io_readfds);
+ FD_CLR(fd, &sync_io_writefds);
+ FD_CLR(fd, &sync_io_exceptfds);
+ _CPU_Sync_io_handlers[fd] = NULL;
+ sync_io_nfds = 0;
+ for (fd = 0; fd < FD_SETSIZE; fd++)
+ if (FD_ISSET(fd, &sync_io_readfds) ||
+ FD_ISSET(fd, &sync_io_writefds) ||
+ FD_ISSET(fd, &sync_io_exceptfds))
+ sync_io_nfds = fd;
+ return 0;
+ }
+ return -1;
+}
+
+int _CPU_Get_clock_vector( void )
+{
+ return SIGALRM;
+}
+
+void _CPU_Start_clock(
+ int microseconds
+)
+{
+ struct itimerval new;
+
+ new.it_value.tv_sec = 0;
+ new.it_value.tv_usec = microseconds;
+ new.it_interval.tv_sec = 0;
+ new.it_interval.tv_usec = microseconds;
+
+ setitimer(ITIMER_REAL, &new, 0);
+}
+
+void _CPU_Stop_clock( void )
+{
+ struct itimerval new;
+ struct sigaction act;
+
+ /*
+ * Set the SIGALRM signal to ignore any last
+ * signals that might come in while we are
+ * disarming the timer and removing the interrupt
+ * vector.
+ */
+
+ (void) memset(&act, 0, sizeof(act));
+ act.sa_handler = SIG_IGN;
+
+ sigaction(SIGALRM, &act, 0);
+
+ (void) memset(&new, 0, sizeof(new));
+ setitimer(ITIMER_REAL, &new, 0);
+}
+
+int _CPU_SHM_Semid;
+extern void fix_syscall_errno( void );
+
+void _CPU_SHM_Init(
+ unsigned32 maximum_nodes,
+ boolean is_master_node,
+ void **shm_address,
+ unsigned32 *shm_length
+)
+{
+ int i;
+ int shmid;
+ char *shm_addr;
+ key_t shm_key;
+ key_t sem_key;
+ int status = 0; /* to avoid unitialized warnings */
+ int shm_size;
+
+ if (getenv("RTEMS_SHM_KEY"))
+ shm_key = strtol(getenv("RTEMS_SHM_KEY"), 0, 0);
+ else
+#ifdef RTEMS_SHM_KEY
+ shm_key = RTEMS_SHM_KEY;
+#else
+ shm_key = 0xa000;
+#endif
+
+ if (getenv("RTEMS_SHM_SIZE"))
+ shm_size = strtol(getenv("RTEMS_SHM_SIZE"), 0, 0);
+ else
+#ifdef RTEMS_SHM_SIZE
+ shm_size = RTEMS_SHM_SIZE;
+#else
+ shm_size = 64 * 1024;
+#endif
+
+ if (getenv("RTEMS_SHM_SEMAPHORE_KEY"))
+ sem_key = strtol(getenv("RTEMS_SHM_SEMAPHORE_KEY"), 0, 0);
+ else
+#ifdef RTEMS_SHM_SEMAPHORE_KEY
+ sem_key = RTEMS_SHM_SEMAPHORE_KEY;
+#else
+ sem_key = 0xa001;
+#endif
+
+ shmid = shmget(shm_key, shm_size, IPC_CREAT | 0660);
+ if ( shmid == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ perror( "shmget" );
+ _CPU_Fatal_halt( 0xdead0001 );
+ }
+
+ shm_addr = shmat(shmid, (char *)0, SHM_RND);
+ if ( shm_addr == (void *)-1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ perror( "shmat" );
+ _CPU_Fatal_halt( 0xdead0002 );
+ }
+
+ _CPU_SHM_Semid = semget(sem_key, maximum_nodes + 1, IPC_CREAT | 0660);
+ if ( _CPU_SHM_Semid == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ perror( "semget" );
+ _CPU_Fatal_halt( 0xdead0003 );
+ }
+
+ if ( is_master_node ) {
+ for ( i=0 ; i <= maximum_nodes ; i++ ) {
+#if defined(solaris2)
+ union semun {
+ int val;
+ struct semid_ds *buf;
+ ushort *array;
+ } help;
+
+ help.val = 1;
+ status = semctl( _CPU_SHM_Semid, i, SETVAL, help );
+#elif defined(hpux) || defined(__linux__)
+ status = semctl( _CPU_SHM_Semid, i, SETVAL, 1 );
+#else
+#error "Not a supported unix variant"
+#endif
+
+ fix_syscall_errno(); /* in case of newlib */
+ if ( status == -1 ) {
+ _CPU_Fatal_halt( 0xdead0004 );
+ }
+ }
+ }
+
+ *shm_address = shm_addr;
+ *shm_length = shm_size;
+
+}
+
+int _CPU_Get_pid( void )
+{
+ return getpid();
+}
+
+/*
+ * Define this to use signals for MPCI shared memory driver.
+ * If undefined, the shared memory driver will poll from the
+ * clock interrupt.
+ * Ref: ../shmsupp/getcfg.c
+ *
+ * BEWARE:: many UN*X kernels and debuggers become severely confused when
+ * debugging programs which use signals. The problem is *much*
+ * worse when using multiple signals, since ptrace(2) tends to
+ * drop all signals except 1 in the case of multiples.
+ * On hpux9, this problem was so bad, we couldn't use interrupts
+ * with the shared memory driver if we ever hoped to debug
+ * RTEMS programs.
+ * Maybe systems that use /proc don't have this problem...
+ */
+
+
+int _CPU_SHM_Get_vector( void )
+{
+#ifdef CPU_USE_SHM_INTERRUPTS
+ return SIGUSR1;
+#else
+ return 0;
+#endif
+}
+
+void _CPU_SHM_Send_interrupt(
+ int pid,
+ int vector
+)
+{
+ kill((pid_t) pid, vector);
+}
+
+void _CPU_SHM_Lock(
+ int semaphore
+)
+{
+ struct sembuf sb;
+
+ sb.sem_num = semaphore;
+ sb.sem_op = -1;
+ sb.sem_flg = 0;
+
+ while (1) {
+ int status = -1;
+
+ status = semop(_CPU_SHM_Semid, &sb, 1);
+ if ( status >= 0 )
+ break;
+ if ( status == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ if (errno == EINTR)
+ continue;
+ perror("shm lock");
+ _CPU_Fatal_halt( 0xdead0005 );
+ }
+ }
+
+}
+
+void _CPU_SHM_Unlock(
+ int semaphore
+)
+{
+ struct sembuf sb;
+ int status;
+
+ sb.sem_num = semaphore;
+ sb.sem_op = 1;
+ sb.sem_flg = 0;
+
+ while (1) {
+ status = semop(_CPU_SHM_Semid, &sb, 1);
+ if ( status >= 0 )
+ break;
+
+ if ( status == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ if (errno == EINTR)
+ continue;
+ perror("shm unlock");
+ _CPU_Fatal_halt( 0xdead0006 );
+ }
+ }
+
+}
diff --git a/c/src/exec/score/cpu/unix/cpu.h b/c/src/exec/score/cpu/unix/cpu.h
new file mode 100644
index 0000000000..01cbdaaa5c
--- /dev/null
+++ b/c/src/exec/score/cpu/unix/cpu.h
@@ -0,0 +1,1060 @@
+/* cpu.h
+ *
+ * This include file contains information pertaining to the HP
+ * PA-RISC processor (Level 1.1).
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CPU_h
+#define __CPU_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/unix.h> /* pick up machine definitions */
+#ifndef ASM
+#include <rtems/score/unixtypes.h>
+#endif
+
+#include <rtems/score/unixsize.h>
+
+#if defined(solaris2)
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 3
+#undef __STRICT_ANSI__
+#define __STRICT_ANSI__
+#endif
+
+#if defined(linux)
+#define MALLOC_0_RETURNS_NULL
+#endif
+
+/* conditional compilation parameters */
+
+/*
+ * Should the calls to _Thread_Enable_dispatch be inlined?
+ *
+ * If TRUE, then they are inlined.
+ * If FALSE, then a subroutine call is made.
+ *
+ * Basically this is an example of the classic trade-off of size
+ * versus speed. Inlining the call (TRUE) typically increases the
+ * size of RTEMS while speeding up the enabling of dispatching.
+ * [NOTE: In general, the _Thread_Dispatch_disable_level will
+ * only be 0 or 1 unless you are in an interrupt handler and that
+ * interrupt handler invokes the executive.] When not inlined
+ * something calls _Thread_Enable_dispatch which in turns calls
+ * _Thread_Dispatch. If the enable dispatch is inlined, then
+ * one subroutine call is avoided entirely.]
+ */
+
+#define CPU_INLINE_ENABLE_DISPATCH FALSE
+
+/*
+ * Should the body of the search loops in _Thread_queue_Enqueue_priority
+ * be unrolled one time? In unrolled each iteration of the loop examines
+ * two "nodes" on the chain being searched. Otherwise, only one node
+ * is examined per iteration.
+ *
+ * If TRUE, then the loops are unrolled.
+ * If FALSE, then the loops are not unrolled.
+ *
+ * The primary factor in making this decision is the cost of disabling
+ * and enabling interrupts (_ISR_Flash) versus the cost of rest of the
+ * body of the loop. On some CPUs, the flash is more expensive than
+ * one iteration of the loop body. In this case, it might be desirable
+ * to unroll the loop. It is important to note that on some CPUs, this
+ * code is the longest interrupt disable period in RTEMS. So it is
+ * necessary to strike a balance when setting this parameter.
+ */
+
+#define CPU_UNROLL_ENQUEUE_PRIORITY TRUE
+
+/*
+ * Does RTEMS manage a dedicated interrupt stack in software?
+ *
+ * If TRUE, then a stack is allocated in _Interrupt_Manager_initialization.
+ * If FALSE, nothing is done.
+ *
+ * If the CPU supports a dedicated interrupt stack in hardware,
+ * then it is generally the responsibility of the BSP to allocate it
+ * and set it up.
+ *
+ * If the CPU does not support a dedicated interrupt stack, then
+ * the porter has two options: (1) execute interrupts on the
+ * stack of the interrupted task, and (2) have RTEMS manage a dedicated
+ * interrupt stack.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_SOFTWARE_INTERRUPT_STACK FALSE
+
+/*
+ * Does this CPU have hardware support for a dedicated interrupt stack?
+ *
+ * If TRUE, then it must be installed during initialization.
+ * If FALSE, then no installation is performed.
+ *
+ * If this is TRUE, CPU_ALLOCATE_INTERRUPT_STACK should also be TRUE.
+ *
+ * Only one of CPU_HAS_SOFTWARE_INTERRUPT_STACK and
+ * CPU_HAS_HARDWARE_INTERRUPT_STACK should be set to TRUE. It is
+ * possible that both are FALSE for a particular CPU. Although it
+ * is unclear what that would imply about the interrupt processing
+ * procedure on that CPU.
+ */
+
+#define CPU_HAS_HARDWARE_INTERRUPT_STACK TRUE
+
+/*
+ * Does RTEMS allocate a dedicated interrupt stack in the Interrupt Manager?
+ *
+ * If TRUE, then the memory is allocated during initialization.
+ * If FALSE, then the memory is allocated during initialization.
+ *
+ * This should be TRUE if CPU_HAS_SOFTWARE_INTERRUPT_STACK is TRUE
+ * or CPU_INSTALL_HARDWARE_INTERRUPT_STACK is TRUE.
+ */
+
+#define CPU_ALLOCATE_INTERRUPT_STACK FALSE
+
+/*
+ * Does the CPU have hardware floating point?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is supported.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is ignored.
+ *
+ * If there is a FP coprocessor such as the i387 or mc68881, then
+ * the answer is TRUE.
+ *
+ * The macro name "NO_CPU_HAS_FPU" should be made CPU specific.
+ * It indicates whether or not this CPU model has FP support. For
+ * example, it would be possible to have an i386_nofp CPU model
+ * which set this to false to indicate that you have an i386 without
+ * an i387 and wish to leave floating point support out of RTEMS.
+ */
+
+#define CPU_HARDWARE_FP TRUE
+
+/*
+ * Are all tasks RTEMS_FLOATING_POINT tasks implicitly?
+ *
+ * If TRUE, then the RTEMS_FLOATING_POINT task attribute is assumed.
+ * If FALSE, then the RTEMS_FLOATING_POINT task attribute is followed.
+ *
+ * So far, the only CPU in which this option has been used is the
+ * HP PA-RISC. The HP C compiler and gcc both implicitly use the
+ * floating point registers to perform integer multiplies. If
+ * a function which you would not think utilize the FP unit DOES,
+ * then one can not easily predict which tasks will use the FP hardware.
+ * In this case, this option should be TRUE.
+ *
+ * If CPU_HARDWARE_FP is FALSE, then this should be FALSE as well.
+ */
+
+#define CPU_ALL_TASKS_ARE_FP FALSE
+
+/*
+ * Should the IDLE task have a floating point context?
+ *
+ * If TRUE, then the IDLE task is created as a RTEMS_FLOATING_POINT task
+ * and it has a floating point context which is switched in and out.
+ * If FALSE, then the IDLE task does not have a floating point context.
+ *
+ * Setting this to TRUE negatively impacts the time required to preempt
+ * the IDLE task from an interrupt because the floating point context
+ * must be saved as part of the preemption.
+ */
+
+#define CPU_IDLE_TASK_IS_FP FALSE
+
+/*
+ * Should the saving of the floating point registers be deferred
+ * until a context switch is made to another different floating point
+ * task?
+ *
+ * If TRUE, then the floating point context will not be stored until
+ * necessary. It will remain in the floating point registers and not
+ * disturned until another floating point task is switched to.
+ *
+ * If FALSE, then the floating point context is saved when a floating
+ * point task is switched out and restored when the next floating point
+ * task is restored. The state of the floating point registers between
+ * those two operations is not specified.
+ *
+ * If the floating point context does NOT have to be saved as part of
+ * interrupt dispatching, then it should be safe to set this to TRUE.
+ *
+ * Setting this flag to TRUE results in using a different algorithm
+ * for deciding when to save and restore the floating point context.
+ * The deferred FP switch algorithm minimizes the number of times
+ * the FP context is saved and restored. The FP context is not saved
+ * until a context switch is made to another, different FP task.
+ * Thus in a system with only one FP task, the FP context will never
+ * be saved or restored.
+ */
+
+#define CPU_USE_DEFERRED_FP_SWITCH TRUE
+
+/*
+ * Does this port provide a CPU dependent IDLE task implementation?
+ *
+ * If TRUE, then the routine _CPU_Thread_Idle_body
+ * must be provided and is the default IDLE thread body instead of
+ * _CPU_Thread_Idle_body.
+ *
+ * If FALSE, then use the generic IDLE thread body if the BSP does
+ * not provide one.
+ *
+ * This is intended to allow for supporting processors which have
+ * a low power or idle mode. When the IDLE thread is executed, then
+ * the CPU can be powered down.
+ *
+ * The order of precedence for selecting the IDLE thread body is:
+ *
+ * 1. BSP provided
+ * 2. CPU dependent (if provided)
+ * 3. generic (if no BSP and no CPU dependent)
+ */
+
+#define CPU_PROVIDES_IDLE_THREAD_BODY TRUE
+
+/*
+ * Does the stack grow up (toward higher addresses) or down
+ * (toward lower addresses)?
+ *
+ * If TRUE, then the grows upward.
+ * If FALSE, then the grows toward smaller addresses.
+ */
+
+#if defined(hppa1_1)
+#define CPU_STACK_GROWS_UP TRUE
+#elif defined(sparc) || defined(i386) || defined(__i386__)
+#define CPU_STACK_GROWS_UP FALSE
+#else
+#error "unknown CPU!!"
+#endif
+
+
+/*
+ * The following is the variable attribute used to force alignment
+ * of critical RTEMS structures. On some processors it may make
+ * sense to have these aligned on tighter boundaries than
+ * the minimum requirements of the compiler in order to have as
+ * much of the critical data area as possible in a cache line.
+ *
+ * The placement of this macro in the declaration of the variables
+ * is based on the syntactically requirements of the GNU C
+ * "__attribute__" extension. For example with GNU C, use
+ * the following to force a structures to a 32 byte boundary.
+ *
+ * __attribute__ ((aligned (32)))
+ *
+ * NOTE: Currently only the Priority Bit Map table uses this feature.
+ * To benefit from using this, the data must be heavily
+ * used so it will stay in the cache and used frequently enough
+ * in the executive to justify turning this on.
+ */
+
+#ifdef __GNUC__
+#define CPU_STRUCTURE_ALIGNMENT __attribute__ ((aligned (32)))
+#else
+#define CPU_STRUCTURE_ALIGNMENT
+#endif
+
+/*
+ * Define what is required to specify how the network to host conversion
+ * routines are handled.
+ */
+
+#if defined(hppa1_1) || defined(sparc)
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN TRUE
+#define CPU_LITTLE_ENDIAN FALSE
+#elif defined(i386) || defined(__i386__)
+#define CPU_CPU_HAS_OWN_HOST_TO_NETWORK_ROUTINES FALSE
+#define CPU_BIG_ENDIAN FALSE
+#define CPU_LITTLE_ENDIAN TRUE
+#else
+#error "Unknown CPU!!!"
+#endif
+
+/*
+ * The following defines the number of bits actually used in the
+ * interrupt field of the task mode. How those bits map to the
+ * CPU interrupt levels is defined by the routine _CPU_ISR_Set_level().
+ */
+
+#define CPU_MODES_INTERRUPT_MASK 0x00000001
+
+#define CPU_NAME "UNIX"
+
+/*
+ * Processor defined structures
+ *
+ * Examples structures include the descriptor tables from the i386
+ * and the processor control structure on the i960ca.
+ */
+
+/* may need to put some structures here. */
+
+#if defined(hppa1_1)
+/*
+ * Word indices within a jmp_buf structure
+ */
+
+#ifdef RTEMS_NEWLIB_SETJMP
+#define RP_OFF 6
+#define SP_OFF 2
+#define R3_OFF 10
+#define R4_OFF 11
+#define R5_OFF 12
+#define R6_OFF 13
+#define R7_OFF 14
+#define R8_OFF 15
+#define R9_OFF 16
+#define R10_OFF 17
+#define R11_OFF 18
+#define R12_OFF 19
+#define R13_OFF 20
+#define R14_OFF 21
+#define R15_OFF 22
+#define R16_OFF 23
+#define R17_OFF 24
+#define R18_OFF 25
+#define DP_OFF 26
+#endif
+
+#ifdef RTEMS_UNIXLIB_SETJMP
+#define RP_OFF 0
+#define SP_OFF 1
+#define R3_OFF 4
+#define R4_OFF 5
+#define R5_OFF 6
+#define R6_OFF 7
+#define R7_OFF 8
+#define R8_OFF 9
+#define R9_OFF 10
+#define R10_OFF 11
+#define R11_OFF 12
+#define R12_OFF 13
+#define R13_OFF 14
+#define R14_OFF 15
+#define R15_OFF 16
+#define R16_OFF 17
+#define R17_OFF 18
+#define R18_OFF 19
+#define DP_OFF 20
+#endif
+#endif
+
+#if defined(i386) || defined(__i386__)
+
+#ifdef RTEMS_NEWLIB
+#error "Newlib not installed"
+#endif
+
+/*
+ * For Linux 1.1
+ */
+
+#ifdef RTEMS_UNIXLIB
+#define EBX_OFF 0
+#define ESI_OFF 1
+#define EDI_OFF 2
+#define EBP_OFF 3
+#define ESP_OFF 4
+#define RET_OFF 5
+#endif
+
+#endif
+
+#if defined(sparc)
+
+/*
+ * Word indices within a jmp_buf structure
+ */
+
+#ifdef RTEMS_NEWLIB
+#define ADDR_ADJ_OFFSET -8
+#define SP_OFF 0
+#define RP_OFF 1
+#define FP_OFF 2
+#endif
+
+#ifdef RTEMS_UNIXLIB
+#define ADDR_ADJ_OFFSET 0
+#define G0_OFF 0
+#define SP_OFF 1
+#define RP_OFF 2
+#define FP_OFF 3
+#define I7_OFF 4
+#endif
+
+#endif
+
+/*
+ * Contexts
+ *
+ * Generally there are 2 types of context to save.
+ * 1. Interrupt registers to save
+ * 2. Task level registers to save
+ *
+ * This means we have the following 3 context items:
+ * 1. task level context stuff:: Context_Control
+ * 2. floating point task stuff:: Context_Control_fp
+ * 3. special interrupt level context :: Context_Control_interrupt
+ *
+ * On some processors, it is cost-effective to save only the callee
+ * preserved registers during a task context switch. This means
+ * that the ISR code needs to save those registers which do not
+ * persist across function calls. It is not mandatory to make this
+ * distinctions between the caller/callee saves registers for the
+ * purpose of minimizing context saved during task switch and on interrupts.
+ * If the cost of saving extra registers is minimal, simplicity is the
+ * choice. Save the same context on interrupt entry as for tasks in
+ * this case.
+ *
+ * Additionally, if gdb is to be made aware of RTEMS tasks for this CPU, then
+ * care should be used in designing the context area.
+ *
+ * On some CPUs with hardware floating point support, the Context_Control_fp
+ * structure will not be used or it simply consist of an array of a
+ * fixed number of bytes. This is done when the floating point context
+ * is dumped by a "FP save context" type instruction and the format
+ * is not really defined by the CPU. In this case, there is no need
+ * to figure out the exact format -- only the size. Of course, although
+ * this is enough information for RTEMS, it is probably not enough for
+ * a debugger such as gdb. But that is another problem.
+ */
+
+/*
+ * This is really just the area for the following fields.
+ *
+ * jmp_buf regs;
+ * unsigned32 isr_level;
+ *
+ * Doing it this way avoids conflicts between the native stuff and the
+ * RTEMS stuff.
+ *
+ * NOTE:
+ * hpux9 setjmp is optimized for the case where the setjmp buffer
+ * is 8 byte aligned. In a RISC world, this seems likely to enable
+ * 8 byte copies, especially for the float registers.
+ * So we always align them on 8 byte boundaries.
+ */
+
+#ifdef __GNUC__
+#define CONTEXT_STRUCTURE_ALIGNMENT __attribute__ ((aligned (8)))
+#else
+#define CONTEXT_STRUCTURE_ALIGNMENT
+#endif
+
+typedef struct {
+ char Area[ CPU_CONTEXT_SIZE_IN_BYTES ] CONTEXT_STRUCTURE_ALIGNMENT;
+} Context_Control;
+
+typedef struct {
+} Context_Control_fp;
+
+typedef struct {
+} CPU_Interrupt_frame;
+
+
+/*
+ * The following table contains the information required to configure
+ * the UNIX Simulator specific parameters.
+ */
+
+typedef struct {
+ void (*pretasking_hook)( void );
+ void (*predriver_hook)( void );
+ void (*postdriver_hook)( void );
+ void (*idle_task)( void );
+ boolean do_zero_of_workspace;
+ unsigned32 interrupt_stack_size;
+ unsigned32 extra_mpci_receive_server_stack;
+ void * (*stack_allocate_hook)( unsigned32 );
+ void (*stack_free_hook)( void* );
+ /* end of required fields */
+} rtems_cpu_table;
+
+/*
+ * This variable is optional. It is used on CPUs on which it is difficult
+ * to generate an "uninitialized" FP context. It is filled in by
+ * _CPU_Initialize and copied into the task's FP context area during
+ * _CPU_Context_Initialize.
+ */
+
+SCORE_EXTERN Context_Control_fp _CPU_Null_fp_context;
+
+/*
+ * On some CPUs, RTEMS supports a software managed interrupt stack.
+ * This stack is allocated by the Interrupt Manager and the switch
+ * is performed in _ISR_Handler. These variables contain pointers
+ * to the lowest and highest addresses in the chunk of memory allocated
+ * for the interrupt stack. Since it is unknown whether the stack
+ * grows up or down (in general), this give the CPU dependent
+ * code the option of picking the version it wants to use.
+ *
+ * NOTE: These two variables are required if the macro
+ * CPU_HAS_SOFTWARE_INTERRUPT_STACK is defined as TRUE.
+ */
+
+SCORE_EXTERN void *_CPU_Interrupt_stack_low;
+SCORE_EXTERN void *_CPU_Interrupt_stack_high;
+
+/*
+ * With some compilation systems, it is difficult if not impossible to
+ * call a high-level language routine from assembly language. This
+ * is especially true of commercial Ada compilers and name mangling
+ * C++ ones. This variable can be optionally defined by the CPU porter
+ * and contains the address of the routine _Thread_Dispatch. This
+ * can make it easier to invoke that routine at the end of the interrupt
+ * sequence (if a dispatch is necessary).
+ */
+
+SCORE_EXTERN void (*_CPU_Thread_dispatch_pointer)();
+
+/*
+ * Nothing prevents the porter from declaring more CPU specific variables.
+ */
+
+/* XXX: if needed, put more variables here */
+
+/*
+ * The size of the floating point context area. On some CPUs this
+ * will not be a "sizeof" because the format of the floating point
+ * area is not defined -- only the size is. This is usually on
+ * CPUs with a "floating point save context" instruction.
+ */
+
+#define CPU_CONTEXT_FP_SIZE sizeof( Context_Control_fp )
+
+/*
+ * The size of a frame on the stack
+ */
+
+#if defined(hppa1_1)
+#define CPU_FRAME_SIZE (32 * 4)
+#elif defined(sparc)
+#define CPU_FRAME_SIZE (112) /* based on disassembled test code */
+#elif defined(i386) || defined(__i386__)
+#define CPU_FRAME_SIZE (24) /* return address, sp, and bp pushed plus fudge */
+#else
+#error "Unknown CPU!!!"
+#endif
+
+/*
+ * Amount of extra stack (above minimum stack size) required by
+ * MPCI receive server thread. Remember that in a multiprocessor
+ * system this thread must exist and be able to process all directives.
+ */
+
+#define CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK 0
+
+/*
+ * This defines the number of entries in the ISR_Vector_table managed
+ * by RTEMS.
+ */
+
+#define CPU_INTERRUPT_NUMBER_OF_VECTORS 64
+#define CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER (CPU_INTERRUPT_NUMBER_OF_VECTORS - 1)
+
+/*
+ * Should be large enough to run all RTEMS tests. This insures
+ * that a "reasonable" small application should not have any problems.
+ */
+
+#define CPU_STACK_MINIMUM_SIZE (16 * 1024)
+
+/*
+ * CPU's worst alignment requirement for data types on a byte boundary. This
+ * alignment does not take into account the requirements for the stack.
+ */
+
+#define CPU_ALIGNMENT 8
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * heap handler. This alignment requirement may be stricter than that
+ * for the data types alignment specified by CPU_ALIGNMENT. It is
+ * common for the heap to follow the same alignment requirement as
+ * CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict enough for the heap,
+ * then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_HEAP_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for memory
+ * buffers allocated by the partition manager. This alignment requirement
+ * may be stricter than that for the data types alignment specified by
+ * CPU_ALIGNMENT. It is common for the partition to follow the same
+ * alignment requirement as CPU_ALIGNMENT. If the CPU_ALIGNMENT is strict
+ * enough for the partition, then this should be set to CPU_ALIGNMENT.
+ *
+ * NOTE: This does not have to be a power of 2. It does have to
+ * be greater or equal to than CPU_ALIGNMENT.
+ */
+
+#define CPU_PARTITION_ALIGNMENT CPU_ALIGNMENT
+
+/*
+ * This number corresponds to the byte alignment requirement for the
+ * stack. This alignment requirement may be stricter than that for the
+ * data types alignment specified by CPU_ALIGNMENT. If the CPU_ALIGNMENT
+ * is strict enough for the stack, then this should be set to 0.
+ *
+ * NOTE: This must be a power of 2 either 0 or greater than CPU_ALIGNMENT.
+ */
+
+#define CPU_STACK_ALIGNMENT 64
+
+/* ISR handler macros */
+
+/*
+ * Disable all interrupts for an RTEMS critical section. The previous
+ * level is returned in _level.
+ */
+
+extern unsigned32 _CPU_ISR_Disable_support(void);
+
+#define _CPU_ISR_Disable( _level ) \
+ do { \
+ (_level) = _CPU_ISR_Disable_support(); \
+ } while ( 0 )
+
+/*
+ * Enable interrupts to the previous level (returned by _CPU_ISR_Disable).
+ * This indicates the end of an RTEMS critical section. The parameter
+ * _level is not modified.
+ */
+
+void _CPU_ISR_Enable(unsigned32 level);
+
+/*
+ * This temporarily restores the interrupt to _level before immediately
+ * disabling them again. This is used to divide long RTEMS critical
+ * sections into two or more parts. The parameter _level is not
+ * modified.
+ */
+
+#define _CPU_ISR_Flash( _level ) \
+ do { \
+ register _ignored = 0; \
+ _CPU_ISR_Enable( (_level) ); \
+ _CPU_ISR_Disable( _ignored ); \
+ } while ( 0 )
+
+/*
+ * Map interrupt level in task mode onto the hardware that the CPU
+ * actually provides. Currently, interrupt levels which do not
+ * map onto the CPU in a generic fashion are undefined. Someday,
+ * it would be nice if these were "mapped" by the application
+ * via a callout. For example, m68k has 8 levels 0 - 7, levels
+ * 8 - 255 would be available for bsp/application specific meaning.
+ * This could be used to manage a programmable interrupt controller
+ * via the rtems_task_mode directive.
+ */
+
+#define _CPU_ISR_Set_level( new_level ) \
+ { \
+ if ( new_level == 0 ) _CPU_ISR_Enable( 0 ); \
+ else _CPU_ISR_Enable( 1 ); \
+ }
+
+unsigned32 _CPU_ISR_Get_level( void );
+
+/* end of ISR handler macros */
+
+/* Context handler macros */
+
+/*
+ * This routine is responsible for somehow restarting the currently
+ * executing task. If you are lucky, then all that is necessary
+ * is restoring the context. Otherwise, there will need to be
+ * a special assembly routine which does something special in this
+ * case. Context_Restore should work most of the time. It will
+ * not work if restarting self conflicts with the stack frame
+ * assumptions of restoring a context.
+ */
+
+#define _CPU_Context_Restart_self( _the_context ) \
+ _CPU_Context_restore( (_the_context) );
+
+/*
+ * The purpose of this macro is to allow the initial pointer into
+ * a floating point context area (used to save the floating point
+ * context) to be at an arbitrary place in the floating point
+ * context area.
+ *
+ * This is necessary because some FP units are designed to have
+ * their context saved as a stack which grows into lower addresses.
+ * Other FP units can be saved by simply moving registers into offsets
+ * from the base of the context area. Finally some FP units provide
+ * a "dump context" instruction which could fill in from high to low
+ * or low to high based on the whim of the CPU designers.
+ */
+
+#define _CPU_Context_Fp_start( _base, _offset ) \
+ ( (void *) _Addresses_Add_offset( (_base), (_offset) ) )
+
+/*
+ * This routine initializes the FP context area passed to it to.
+ * There are a few standard ways in which to initialize the
+ * floating point context. The code included for this macro assumes
+ * that this is a CPU in which a "initial" FP context was saved into
+ * _CPU_Null_fp_context and it simply copies it to the destination
+ * context passed to it.
+ *
+ * Other models include (1) not doing anything, and (2) putting
+ * a "null FP status word" in the correct place in the FP context.
+ */
+
+#define _CPU_Context_Initialize_fp( _destination ) \
+ { \
+ *((Context_Control_fp *) *((void **) _destination)) = _CPU_Null_fp_context; \
+ }
+
+#define _CPU_Context_save_fp( _fp_context ) \
+ _CPU_Save_float_context( *(Context_Control_fp **)(_fp_context))
+
+#define _CPU_Context_restore_fp( _fp_context ) \
+ _CPU_Restore_float_context( *(Context_Control_fp **)(_fp_context))
+
+extern void _CPU_Context_Initialize(
+ Context_Control *_the_context,
+ unsigned32 *_stack_base,
+ unsigned32 _size,
+ unsigned32 _new_level,
+ void *_entry_point,
+ boolean _is_fp
+);
+
+/* end of Context handler macros */
+
+/* Fatal Error manager macros */
+
+/*
+ * This routine copies _error into a known place -- typically a stack
+ * location or a register, optionally disables interrupts, and
+ * halts/stops the CPU.
+ */
+
+#define _CPU_Fatal_halt( _error ) \
+ _CPU_Fatal_error( _error )
+
+/* end of Fatal Error manager macros */
+
+/* Bitfield handler macros */
+
+/*
+ * This routine sets _output to the bit number of the first bit
+ * set in _value. _value is of CPU dependent type Priority_Bit_map_control.
+ * This type may be either 16 or 32 bits wide although only the 16
+ * least significant bits will be used.
+ *
+ * There are a number of variables in using a "find first bit" type
+ * instruction.
+ *
+ * (1) What happens when run on a value of zero?
+ * (2) Bits may be numbered from MSB to LSB or vice-versa.
+ * (3) The numbering may be zero or one based.
+ * (4) The "find first bit" instruction may search from MSB or LSB.
+ *
+ * RTEMS guarantees that (1) will never happen so it is not a concern.
+ * (2),(3), (4) are handled by the macros _CPU_Priority_mask() and
+ * _CPU_Priority_bits_index(). These three form a set of routines
+ * which must logically operate together. Bits in the _value are
+ * set and cleared based on masks built by _CPU_Priority_mask().
+ * The basic major and minor values calculated by _Priority_Major()
+ * and _Priority_Minor() are "massaged" by _CPU_Priority_bits_index()
+ * to properly range between the values returned by the "find first bit"
+ * instruction. This makes it possible for _Priority_Get_highest() to
+ * calculate the major and directly index into the minor table.
+ * This mapping is necessary to ensure that 0 (a high priority major/minor)
+ * is the first bit found.
+ *
+ * This entire "find first bit" and mapping process depends heavily
+ * on the manner in which a priority is broken into a major and minor
+ * components with the major being the 4 MSB of a priority and minor
+ * the 4 LSB. Thus (0 << 4) + 0 corresponds to priority 0 -- the highest
+ * priority. And (15 << 4) + 14 corresponds to priority 254 -- the next
+ * to the lowest priority.
+ *
+ * If your CPU does not have a "find first bit" instruction, then
+ * there are ways to make do without it. Here are a handful of ways
+ * to implement this in software:
+ *
+ * - a series of 16 bit test instructions
+ * - a "binary search using if's"
+ * - _number = 0
+ * if _value > 0x00ff
+ * _value >>=8
+ * _number = 8;
+ *
+ * if _value > 0x0000f
+ * _value >=8
+ * _number += 4
+ *
+ * _number += bit_set_table[ _value ]
+ *
+ * where bit_set_table[ 16 ] has values which indicate the first
+ * bit set
+ */
+
+/*
+ * The UNIX port uses the generic C algorithm for bitfield scan to avoid
+ * dependencies on either a native bitscan instruction or an ffs() in the
+ * C library.
+ */
+
+#define CPU_USE_GENERIC_BITFIELD_CODE TRUE
+#define CPU_USE_GENERIC_BITFIELD_DATA TRUE
+
+/* end of Bitfield handler macros */
+
+/* Priority handler handler macros */
+
+/*
+ * The UNIX port uses the generic C algorithm for bitfield scan to avoid
+ * dependencies on either a native bitscan instruction or an ffs() in the
+ * C library.
+ */
+
+/* end of Priority handler macros */
+
+/* functions */
+
+/*
+ * _CPU_Initialize
+ *
+ * This routine performs CPU dependent initialization.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)
+);
+
+/*
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs a "raw" interrupt handler directly into the
+ * processor's vector table.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_ISR_install_vector
+ *
+ * This routine installs an interrupt vector.
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+);
+
+/*
+ * _CPU_Install_interrupt_stack
+ *
+ * This routine installs the hardware interrupt stack pointer.
+ *
+ * NOTE: It need only be provided if CPU_HAS_HARDWARE_INTERRUPT_STACK
+ * is TRUE.
+ */
+
+void _CPU_Install_interrupt_stack( void );
+
+/*
+ * _CPU_Thread_Idle_body
+ *
+ * This routine is the CPU dependent IDLE thread body.
+ *
+ * NOTE: It need only be provided if CPU_PROVIDES_IDLE_THREAD_BODY
+ * is TRUE.
+ */
+
+void _CPU_Thread_Idle_body( void );
+
+/*
+ * _CPU_Context_switch
+ *
+ * This routine switches from the run context to the heir context.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+);
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+);
+
+/*
+ * _CPU_Save_float_context
+ *
+ * This routine saves the floating point context passed to it.
+ */
+
+void _CPU_Save_float_context(
+ Context_Control_fp *fp_context_ptr
+);
+
+/*
+ * _CPU_Restore_float_context
+ *
+ * This routine restores the floating point context passed to it.
+ */
+
+void _CPU_Restore_float_context(
+ Context_Control_fp *fp_context_ptr
+);
+
+
+void _CPU_ISR_Set_signal_level(
+ unsigned32 level
+);
+
+void _CPU_Fatal_error(
+ unsigned32 _error
+);
+
+/* The following routine swaps the endian format of an unsigned int.
+ * It must be static because it is referenced indirectly.
+ *
+ * This version will work on any processor, but if there is a better
+ * way for your CPU PLEASE use it. The most common way to do this is to:
+ *
+ * swap least significant two bytes with 16-bit rotate
+ * swap upper and lower 16-bits
+ * swap most significant two bytes with 16-bit rotate
+ *
+ * Some CPUs have special instructions which swap a 32-bit quantity in
+ * a single instruction (e.g. i486). It is probably best to avoid
+ * an "endian swapping control bit" in the CPU. One good reason is
+ * that interrupts would probably have to be disabled to insure that
+ * an interrupt does not try to access the same "chunk" with the wrong
+ * endian. Another good reason is that on some CPUs, the endian bit
+ * endianness for ALL fetches -- both code and data -- so the code
+ * will be fetched incorrectly.
+ */
+
+static inline unsigned int CPU_swap_u32(
+ unsigned int value
+)
+{
+ unsigned32 byte1, byte2, byte3, byte4, swapped;
+
+ byte4 = (value >> 24) & 0xff;
+ byte3 = (value >> 16) & 0xff;
+ byte2 = (value >> 8) & 0xff;
+ byte1 = value & 0xff;
+
+ swapped = (byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4;
+ return( swapped );
+}
+
+/*
+ * Special Purpose Routines to hide the use of UNIX system calls.
+ */
+
+
+/*
+ * Pointer to a sync io Handler
+ */
+
+typedef void ( *rtems_sync_io_handler )(
+ int fd,
+ boolean read,
+ boolean wrtie,
+ boolean except
+);
+
+/* returns -1 if fd to large, 0 is successful */
+int _CPU_Set_sync_io_handler(
+ int fd,
+ boolean read,
+ boolean write,
+ boolean except,
+ rtems_sync_io_handler handler
+);
+
+/* returns -1 if fd to large, o if successful */
+int _CPU_Clear_sync_io_handler(
+ int fd
+);
+
+int _CPU_Get_clock_vector( void );
+
+void _CPU_Start_clock(
+ int microseconds
+);
+
+void _CPU_Stop_clock( void );
+
+void _CPU_SHM_Init(
+ unsigned32 maximum_nodes,
+ boolean is_master_node,
+ void **shm_address,
+ unsigned32 *shm_length
+);
+
+int _CPU_Get_pid( void );
+
+int _CPU_SHM_Get_vector( void );
+
+void _CPU_SHM_Send_interrupt(
+ int pid,
+ int vector
+);
+
+void _CPU_SHM_Lock(
+ int semaphore
+);
+
+void _CPU_SHM_Unlock(
+ int semaphore
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/exec/score/cpu/unix/unix.h b/c/src/exec/score/cpu/unix/unix.h
new file mode 100644
index 0000000000..2fd9072b24
--- /dev/null
+++ b/c/src/exec/score/cpu/unix/unix.h
@@ -0,0 +1,61 @@
+/* unix.h
+ *
+ * This include file contains the definitions required by RTEMS
+ * which are typical for a modern UNIX computer using GCC.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __UNIX_h
+#define __UNIX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This file contains the information required to build
+ * RTEMS for a particular member of the "unix"
+ * family when executing in protected mode. It does
+ * this by setting variables to indicate which implementation
+ * dependent features are present in a particular member
+ * of the family.
+ */
+
+#if defined(hpux)
+
+#define CPU_MODEL_NAME "HP-UX"
+
+#elif defined(solaris)
+
+#define CPU_MODEL_NAME "Solaris"
+
+#elif defined(__linux__)
+
+#define CPU_MODEL_NAME "Linux"
+
+#elif defined(linux)
+
+#define CPU_MODEL_NAME "Linux"
+
+#else
+
+#error "Unsupported CPU Model"
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/score/cpu/unix/unixtypes.h b/c/src/exec/score/cpu/unix/unixtypes.h
new file mode 100644
index 0000000000..052853ccba
--- /dev/null
+++ b/c/src/exec/score/cpu/unix/unixtypes.h
@@ -0,0 +1,72 @@
+/* unixtypes.h
+ *
+ * This include file contains type definitions which are appropriate
+ * for a typical modern UNIX box using GNU C for the RTEMS simulator.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __UNIX_TYPES_h
+#define __UNIX_TYPES_h
+
+#ifndef ASM
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * some C++ compilers (eg: HP's) don't do 'signed' or 'volatile'
+ */
+#if defined(__cplusplus) && !defined(__GNUC__)
+#define signed
+#define volatile
+#endif
+
+/*
+ * This section defines the basic types for this processor.
+ */
+
+typedef unsigned char unsigned8; /* unsigned 8-bit integer */
+typedef unsigned short unsigned16; /* unsigned 16-bit integer */
+typedef unsigned int unsigned32; /* unsigned 32-bit integer */
+
+typedef unsigned16 Priority_Bit_map_control;
+
+typedef signed char signed8; /* 8-bit signed integer */
+typedef signed short signed16; /* 16-bit signed integer */
+typedef signed int signed32; /* 32-bit signed integer */
+
+/*
+ * some C++ compilers (eg: HP's) don't do 'long long'
+ */
+#if defined(__GNUC__)
+typedef unsigned long long unsigned64; /* unsigned 64-bit integer */
+typedef signed long long signed64; /* 64 bit signed integer */
+#endif
+
+typedef unsigned32 boolean; /* Boolean value */
+
+typedef float single_precision; /* single precision float */
+typedef double double_precision; /* double precision float */
+
+typedef void unix_isr;
+
+typedef unix_isr ( *unix_isr_entry )( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ASM */
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/Makefile.in b/c/src/exec/score/headers/Makefile.in
new file mode 100644
index 0000000000..1be9ef5221
--- /dev/null
+++ b/c/src/exec/score/headers/Makefile.in
@@ -0,0 +1,47 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# H_FILES that get installed in the rtems/score subdirectoy
+H_PIECES= address apiext bitfield chain context copyrt coremsg coremutex \
+ coresem heap interr isr mpci mppkt object objectmp \
+ priority stack states sysstate thread threadmp threadq \
+ tod tqdata userext watchdog wkspace
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed in the rtems subdirectoy
+SAPI_H_PIECES=debug system
+SAPI_H_FILES=$(SAPI_H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed at the top level
+EXTERNAL_H_PIECES =
+EXTERNAL_H_FILES=$(EXTERNAL_H_PIECES:%=$(srcdir)/%.h)
+
+NET_H_PIECES = in
+NET_H_FILES=$(NET_H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES) $(SAPI_H_FILES) $(EXTERNAL_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+ $(INSTALL) -m 444 ${SAPI_H_FILES} ${PROJECT_RELEASE}/include/rtems/
+ $(INSTALL) -m 444 ${NET_H_FILES} ${PROJECT_RELEASE}/include/netinet
+# $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/exec/score/headers/address.h b/c/src/exec/score/headers/address.h
new file mode 100644
index 0000000000..b94483df34
--- /dev/null
+++ b/c/src/exec/score/headers/address.h
@@ -0,0 +1,31 @@
+/* address.h
+ *
+ * This include file contains the information required to manipulate
+ * physical addresses.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ADDRESSES_h
+#define __RTEMS_ADDRESSES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/apiext.h b/c/src/exec/score/headers/apiext.h
new file mode 100644
index 0000000000..ae45348303
--- /dev/null
+++ b/c/src/exec/score/headers/apiext.h
@@ -0,0 +1,102 @@
+/* apiext.h
+ *
+ * XXX
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __API_EXTENSIONS_h
+#define __API_EXTENSIONS_h
+
+#include <rtems/score/chain.h>
+#include <rtems/score/thread.h>
+
+/*
+ * The control structure which defines the points at which an API
+ * can add an extension to the system initialization thread.
+ */
+
+typedef void (*API_extensions_Predriver_hook)(void);
+typedef void (*API_extensions_Postdriver_hook)(void);
+typedef void (*API_extensions_Postswitch_hook)(
+ Thread_Control *
+ );
+
+
+typedef struct {
+ Chain_Node Node;
+ API_extensions_Predriver_hook predriver_hook;
+ API_extensions_Postdriver_hook postdriver_hook;
+ API_extensions_Postswitch_hook postswitch_hook;
+} API_extensions_Control;
+
+/*
+ * This is the list of API extensions to the system initialization.
+ */
+
+SCORE_EXTERN Chain_Control _API_extensions_List;
+
+/*
+ * _API_extensions_Initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the API extension handler.
+ *
+ */
+
+void _API_extensions_Initialization( void );
+
+/*
+ * _API_extensions_Add
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Add(
+ API_extensions_Control *the_extension
+);
+
+/*
+ * _API_extensions_Run_predriver
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_predriver( void );
+
+/*
+ * _API_extensions_Run_postdriver
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_postdriver( void );
+
+/*
+ * _API_extensions_Run_postswitch
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_postswitch( void );
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/bitfield.h b/c/src/exec/score/headers/bitfield.h
new file mode 100644
index 0000000000..da84344af8
--- /dev/null
+++ b/c/src/exec/score/headers/bitfield.h
@@ -0,0 +1,98 @@
+/* bitfield.h
+ *
+ * This include file contains all bit field manipulation routines.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_BITFIELD_h
+#define __RTEMS_BITFIELD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * _Bitfield_Find_first_bit
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the bit_number of the first bit set
+ * in the specified value. The correspondence between bit_number
+ * and actual bit position is processor dependent. The search for
+ * the first bit set may run from most to least significant bit
+ * or vice-versa.
+ *
+ * NOTE:
+ *
+ * This routine is used when the executing thread is removed
+ * from the ready state and, as a result, its performance has a
+ * significant impact on the performance of the executive as a whole.
+ */
+
+#if ( CPU_USE_GENERIC_BITFIELD_DATA == TRUE )
+
+#ifndef SCORE_INIT
+extern const unsigned char __log2table[256];
+#else
+const unsigned char __log2table[256] = {
+ 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif
+
+#endif
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == FALSE )
+
+#define _Bitfield_Find_first_bit( _value, _bit_number ) \
+ _CPU_Bitfield_Find_first_bit( _value, _bit_number )
+
+#else
+
+/*
+ * The following must be a macro because if a CPU specific version
+ * is used it will most likely use inline assembly.
+ */
+
+#define _Bitfield_Find_first_bit( _value, _bit_number ) \
+ { \
+ register unsigned32 __value = (unsigned32) (_value); \
+ register const unsigned char *__p = __log2table; \
+ \
+ if ( __value < 0x100 ) \
+ (_bit_number) = __p[ __value ] + 8; \
+ else \
+ (_bit_number) = __p[ __value >> 8 ]; \
+ }
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/chain.h b/c/src/exec/score/headers/chain.h
new file mode 100644
index 0000000000..a1c8675fae
--- /dev/null
+++ b/c/src/exec/score/headers/chain.h
@@ -0,0 +1,168 @@
+/* chain.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Doubly Linked Chain Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CHAIN_h
+#define __RTEMS_CHAIN_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.h>
+
+/*
+ * This is used to manage each element (node) which is placed
+ * on a chain.
+ *
+ * NOTE: Typically, a more complicated structure will use the
+ * chain package. The more complicated structure will
+ * include a chain node as the first element in its
+ * control structure. It will then call the chain package
+ * with a pointer to that node element. The node pointer
+ * and the higher level structure start at the same address
+ * so the user can cast the pointers back and forth.
+ *
+ */
+
+typedef struct Chain_Node_struct Chain_Node;
+
+struct Chain_Node_struct {
+ Chain_Node *next;
+ Chain_Node *previous;
+};
+
+/*
+ * This is used to manage a chain. A chain consists of a doubly
+ * linked list of zero or more nodes.
+ *
+ * NOTE: This implementation does not require special checks for
+ * manipulating the first and last elements on the chain.
+ * To accomplish this the chain control structure is
+ * treated as two overlapping chain nodes. The permanent
+ * head of the chain overlays a node structure on the
+ * first and permanent_null fields. The permanent tail
+ * of the chain overlays a node structure on the
+ * permanent_null and last elements of the structure.
+ *
+ */
+
+typedef struct {
+ Chain_Node *first;
+ Chain_Node *permanent_null;
+ Chain_Node *last;
+} Chain_Control;
+
+/*
+ * _Chain_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_chain structure to manage the
+ * contiguous array of number_nodes nodes which starts at
+ * starting_address. Each node is of node_size bytes.
+ *
+ */
+
+void _Chain_Initialize(
+ Chain_Control *the_chain,
+ void *starting_address,
+ unsigned32 number_nodes,
+ unsigned32 node_size
+);
+
+/*
+ * _Chain_Get_first_unprotected
+ */
+
+#ifndef USE_INLINES
+Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+);
+#endif
+
+/*
+ * _Chain_Extract
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It disables interrupts to insure the atomicity of the
+ * extract operation.
+ *
+ */
+
+void _Chain_Extract(
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It disables interrupts to insure the atomicity of the
+ * get operation.
+ *
+ */
+
+Chain_Node *_Chain_Get(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Insert
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It disables interrupts to insure the atomicity
+ * of the extract operation.
+ *
+ */
+
+void _Chain_Insert(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Append
+ *
+ * DESCRIPTION:
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * append operation.
+ *
+ */
+
+void _Chain_Append(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/chain.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/context.h b/c/src/exec/score/headers/context.h
new file mode 100644
index 0000000000..4b4ac5960c
--- /dev/null
+++ b/c/src/exec/score/headers/context.h
@@ -0,0 +1,134 @@
+/* context.h
+ *
+ * This include file contains all information about a context.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CONTEXT_h
+#define __RTEMS_CONTEXT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/cpu.h>
+
+/*
+ * The following constant defines the number of bytes required
+ * to store a full floating point context.
+ */
+
+#define CONTEXT_FP_SIZE CPU_CONTEXT_FP_SIZE
+
+/*
+ * The following variable is set to TRUE when a reschedule operation
+ * has determined that the processor should be taken away from the
+ * currently executing thread and given to the heir thread.
+ */
+
+SCORE_EXTERN volatile boolean _Context_Switch_necessary;
+
+/*
+ * _Context_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes THE_CONTEXT such that the stack
+ * pointer, interrupt level, and entry point are correct for the
+ * thread's initial state.
+ */
+
+#define \
+ _Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp ) \
+ _CPU_Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp )
+
+/*
+ * _Context_Switch
+ *
+ * DESCRIPTION:
+ *
+ * This routine saves the current context into the EXECUTING
+ * context record and restores the context specified by HEIR.
+ */
+
+#define _Context_Switch( _executing, _heir ) \
+ _CPU_Context_switch( _executing, _heir )
+
+/*
+ * _Context_Restart_self
+ *
+ * DESCRIPTION:
+ *
+ * This routine restarts the calling thread by restoring its initial
+ * stack pointer and returning to the thread's entry point.
+ */
+
+#define _Context_Restart_self( _the_context ) \
+ _CPU_Context_Restart_self( _the_context )
+
+/*
+ * _Context_Fp_start
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the starting address of the floating
+ * point context save area. It is assumed that the are reserved
+ * for the floating point save area is large enough.
+ */
+
+#define _Context_Fp_start( _base, _offset ) \
+ _CPU_Context_Fp_start( (_base), (_offset) )
+
+/*
+ * _Context_Initialize_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the floating point context save
+ * area to contain an initial known state.
+ */
+
+#define _Context_Initialize_fp( _fp_area ) \
+ _CPU_Context_Initialize_fp( _fp_area )
+
+/*
+ * _Context_Restore_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine restores the floating point context contained
+ * in the FP_CONTEXT area. It is assumed that the current
+ * floating point context has been saved by a previous invocation
+ * of SAVE_FP.
+ */
+
+#define _Context_Restore_fp( _fp ) \
+ _CPU_Context_restore_fp( _fp )
+
+/*
+ * _Context_Save_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine saves the current floating point context
+ * in the FP_CONTEXT area.
+ */
+
+#define _Context_Save_fp( _fp ) \
+ _CPU_Context_save_fp( _fp )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/copyrt.h b/c/src/exec/score/headers/copyrt.h
new file mode 100644
index 0000000000..659f328661
--- /dev/null
+++ b/c/src/exec/score/headers/copyrt.h
@@ -0,0 +1,42 @@
+/* copyrt.h
+ *
+ * This include file contains the copyright notice for RTEMS
+ * which is included in every binary copy of the executive.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_COPYRIGHT_h
+#define __RTEMS_COPYRIGHT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SCORE_INIT
+
+const char _Copyright_Notice[] =
+"COPYRIGHT (c) 1989-1997.\n\
+On-Line Applications Research Corporation (OAR).\n\
+Copyright assigned to U.S. Government, 1994.\n";
+
+#else
+
+extern const char _Copyright_Notice[];
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/coremsg.h b/c/src/exec/score/headers/coremsg.h
new file mode 100644
index 0000000000..a5052a7ffd
--- /dev/null
+++ b/c/src/exec/score/headers/coremsg.h
@@ -0,0 +1,267 @@
+/* coremsg.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Message queue Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_MESSAGE_QUEUE_h
+#define __RTEMS_CORE_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following type defines the callout which the API provides
+ * to support global/multiprocessor operations on message_queues.
+ */
+
+typedef void ( *CORE_message_queue_API_mp_support_callout )(
+ Thread_Control *,
+ Objects_Id
+ );
+
+/*
+ * The following defines the data types needed to manipulate
+ * the contents of message buffers.
+ *
+ * NOTE: The buffer field is normally longer than a single unsigned32.
+ * but since messages are variable length we just make a ptr to 1.
+ */
+
+typedef struct {
+ unsigned32 size;
+ unsigned32 buffer[1];
+} CORE_message_queue_Buffer;
+
+/*
+ * The following records define the organization of a message
+ * buffer.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ CORE_message_queue_Buffer Contents;
+} CORE_message_queue_Buffer_control;
+
+/*
+ * Blocking disciplines for a message_queue.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO,
+ CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY
+} CORE_message_queue_Disciplines;
+
+/*
+ * The following enumerated type details the modes in which a message
+ * may be submitted to a message queue. The message may be posted
+ * in a send or urgent fashion.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_SEND_REQUEST = 0,
+ CORE_MESSAGE_QUEUE_URGENT_REQUEST = 1
+} CORE_message_queue_Submit_types;
+
+/*
+ * Core Message queue handler return statuses.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL,
+ CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE,
+ CORE_MESSAGE_QUEUE_STATUS_TOO_MANY,
+ CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED,
+ CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT,
+ CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED,
+ CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
+} CORE_message_queue_Status;
+
+/*
+ * The following defines the control block used to manage the
+ * attributes of each message queue.
+ */
+
+typedef struct {
+ CORE_message_queue_Disciplines discipline;
+} CORE_message_queue_Attributes;
+
+/*
+ * The following defines the type for a Notification handler. A notification
+ * handler is invoked when the message queue makes a 0->1 transition on
+ * pending messages.
+ */
+
+typedef void (*CORE_message_queue_Notify_Handler)( void * );
+
+/*
+ * The following defines the control block used to manage each
+ * counting message_queue.
+ */
+
+typedef struct {
+ Thread_queue_Control Wait_queue;
+ CORE_message_queue_Attributes Attributes;
+ unsigned32 maximum_pending_messages;
+ unsigned32 number_of_pending_messages;
+ unsigned32 maximum_message_size;
+ Chain_Control Pending_messages;
+ CORE_message_queue_Buffer *message_buffers;
+ CORE_message_queue_Notify_Handler notify_handler;
+ void *notify_argument;
+ Chain_Control Inactive_messages;
+} CORE_message_queue_Control;
+
+/*
+ * _CORE_message_queue_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the message_queue based on the parameters passed.
+ */
+
+boolean _CORE_message_queue_Initialize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Classes the_class,
+ CORE_message_queue_Attributes *the_message_queue_attributes,
+ unsigned32 maximum_pending_messages,
+ unsigned32 maximum_message_size,
+ Thread_queue_Extract_callout proxy_extract_callout
+);
+
+/*
+ * _CORE_message_queue_Close
+ *
+ * DESCRIPTION:
+ *
+ * This function closes a message by returning all allocated space and
+ * flushing the message_queue's task wait queue.
+ */
+
+void _CORE_message_queue_Close(
+ CORE_message_queue_Control *the_message_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ *
+ * _CORE_message_queue_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This function flushes the message_queue's task wait queue. The number
+ * messages flushed from the queue is returned.
+ *
+ */
+
+unsigned32 _CORE_message_queue_Flush(
+ CORE_message_queue_Control *the_message_queue
+);
+
+/*
+ * _CORE_message_queue_Flush_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine flushes all outstanding messages and returns
+ * them to the inactive message chain.
+ */
+
+unsigned32 _CORE_message_queue_Flush_support(
+ CORE_message_queue_Control *the_message_queue
+);
+
+/*
+ *
+ * _CORE_message_queue_Broadcast
+ *
+ * DESCRIPTION:
+ *
+ * This function sends a message for every thread waiting on the queue and
+ * returns the number of threads made ready by the message.
+ *
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Broadcast(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ unsigned32 *count
+);
+
+/*
+ *
+ * _CORE_message_queue_Submit
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the send and urgent message functions. It
+ * processes a message that is to be submitted to the designated
+ * message queue. The message will either be processed as a
+ * send message which it will be inserted at the rear of the queue
+ * or it will be processed as an urgent message which will be inserted
+ * at the front of the queue.
+ *
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Submit(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ CORE_message_queue_Submit_types submit_type
+);
+
+/*
+ *
+ * _CORE_message_queue_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This kernel routine dequeues a message, copies the message buffer to
+ * a given destination buffer, and frees the message buffer to the
+ * inactive message pool. The thread will be blocked if wait is TRUE,
+ * otherwise an error will be given to the thread if no messages are available.
+ *
+ */
+
+void _CORE_message_queue_Seize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coremsg.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/score/headers/coremutex.h b/c/src/exec/score/headers/coremutex.h
new file mode 100644
index 0000000000..9f3ad2b46d
--- /dev/null
+++ b/c/src/exec/score/headers/coremutex.h
@@ -0,0 +1,172 @@
+/* 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_MUTEX_h
+#define __RTEMS_CORE_MUTEX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/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_CEILING_VIOLATED
+} 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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coremutex.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/score/headers/coresem.h b/c/src/exec/score/headers/coresem.h
new file mode 100644
index 0000000000..f98673d514
--- /dev/null
+++ b/c/src/exec/score/headers/coresem.h
@@ -0,0 +1,156 @@
+/* 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_COUNTING_SEMAPHORE_h
+#define __RTEMS_CORE_COUNTING_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coresem.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/score/headers/debug.h b/c/src/exec/score/headers/debug.h
new file mode 100644
index 0000000000..37b3a053a5
--- /dev/null
+++ b/c/src/exec/score/headers/debug.h
@@ -0,0 +1,98 @@
+/* debug.h
+ *
+ * This include file contains the information pertaining to the debug
+ * support within RTEMS. It is currently cast in the form of a
+ * Manager since it is externally accessible.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DEBUG_h
+#define __RTEMS_DEBUG_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type is used to manage the debug mask.
+ */
+
+typedef unsigned32 rtems_debug_control;
+
+/*
+ * These constants represent various classes of debugging.
+ */
+
+#define RTEMS_DEBUG_ALL_MASK 0xffffffff
+#define RTEMS_DEBUG_REGION 0x00000001
+
+/*
+ * This variable contains the current debug level.
+ */
+
+SCORE_EXTERN rtems_debug_control _Debug_Level;
+
+/*
+ * _Debug_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Debug_Manager_initialization( void );
+
+/*
+ * rtems_debug_enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables the specified types of debug checks.
+ */
+
+void rtems_debug_enable (
+ rtems_debug_control to_be_enabled
+);
+
+/*
+ * rtems_debug_disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables the specified types of debug checks.
+ */
+
+void rtems_debug_disable (
+ rtems_debug_control to_be_disabled
+);
+
+/*
+ *
+ * _Debug_Is_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the requested debug level is
+ * enabled, and FALSE otherwise.
+ */
+
+boolean _Debug_Is_enabled(
+ rtems_debug_control level
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/heap.h b/c/src/exec/score/headers/heap.h
new file mode 100644
index 0000000000..a5a8d3f0c2
--- /dev/null
+++ b/c/src/exec/score/headers/heap.h
@@ -0,0 +1,226 @@
+/* heap.h
+ *
+ * This include file contains the information pertaining to the Heap
+ * Handler. A heap is a doubly linked list of variable size
+ * blocks which are allocated using the first fit method. Garbage
+ * collection is performed each time a block is returned to the heap by
+ * coalescing neighbor blocks. Control information for both allocated
+ * and unallocated blocks is contained in the heap space. A heap header
+ * contains control information for the heap.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_HEAP_h
+#define __RTEMS_HEAP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Status codes for heap_extend
+ */
+
+typedef enum {
+ HEAP_EXTEND_SUCCESSFUL,
+ HEAP_EXTEND_ERROR,
+ HEAP_EXTEND_NOT_IMPLEMENTED
+} Heap_Extend_status;
+
+/*
+ * Constants used in the size/used field of each heap block to
+ * indicate when a block is free or in use.
+ */
+
+#define HEAP_BLOCK_USED 1 /* indicates block is in use */
+#define HEAP_BLOCK_FREE 0 /* indicates block is free */
+
+/*
+ * The size/used field value for the dummy front and back flags.
+ */
+
+#define HEAP_DUMMY_FLAG (0 + HEAP_BLOCK_USED)
+
+/*
+ * The following constants reflect various requirements of the
+ * heap data structures which impact the management of a heap.
+ *
+ * NOTE: Because free block overhead is greater than used block
+ * overhead AND a portion of the allocated space is from
+ * the extra free block overhead, the absolute lower bound
+ * of the minimum fragment size is equal to the size of
+ * the free block overhead.
+ */
+
+#define HEAP_OVERHEAD \
+ (sizeof( unsigned32 ) * 2) /* size dummy first and last blocks */
+#define HEAP_BLOCK_USED_OVERHEAD \
+ (sizeof( void * ) * 2) /* num bytes overhead in used block */
+#define HEAP_MINIMUM_SIZE \
+ (HEAP_OVERHEAD + sizeof (Heap_Block))
+ /* min number of bytes the user may */
+ /* specify for the heap size */
+
+/*
+ * The following defines the data structure used to manage
+ * individual blocks in a heap. When the block is allocated, the
+ * next and previous fields are not used by the Heap Handler
+ * and thus the address returned for the block starts at
+ * the address of the next field.
+ *
+ * NOTE: The next and previous pointers are only valid when the
+ * block is free. Caution must be exercised to insure that
+ * allocated blocks are large enough to contain them and
+ * that they are not accidentally overwritten when the
+ * block is actually allocated.
+ */
+
+typedef struct Heap_Block_struct Heap_Block;
+
+struct Heap_Block_struct {
+ unsigned32 back_flag; /* size and status of prev block */
+ unsigned32 front_flag; /* size and status of block */
+ Heap_Block *next; /* pointer to next block */
+ Heap_Block *previous; /* pointer to previous block */
+};
+
+/*
+ * The following defines the control block used to manage each heap.
+ *
+ * NOTE:
+ *
+ * This structure is layed out such that it can be used a a dummy
+ * first and last block on the free block chain. The extra padding
+ * insures the dummy last block is the correct size.
+ *
+ * The first Heap_Block starts at first while the second starts at
+ * final. This is effectively the same trick as is used in the Chain
+ * Handler.
+ */
+
+typedef struct {
+ Heap_Block *start; /* first valid block address in heap */
+ Heap_Block *final; /* last valid block address in heap */
+
+ Heap_Block *first; /* pointer to first block in heap */
+ Heap_Block *permanent_null; /* always NULL pointer */
+ Heap_Block *last; /* pointer to last block in heap */
+ unsigned32 page_size; /* allocation unit */
+ unsigned32 reserved;
+} Heap_Control;
+
+/*
+ * _Heap_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_heap record to manage the
+ * contiguous heap of size bytes which starts at starting_address.
+ * Blocks of memory are allocated from the heap in multiples of
+ * page_size byte units.
+ */
+
+unsigned32 _Heap_Initialize(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 page_size
+);
+
+/*
+ * _Heap_Extend
+ *
+ * DESCRIPTION:
+ *
+ * This routine grows the_heap memory area using the size bytes which
+ * begin at starting_address.
+ */
+
+Heap_Extend_status _Heap_Extend(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 *amount_extended
+);
+
+/*
+ * _Heap_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a block of size bytes from
+ * the_heap. If insufficient memory is free in the_heap to allocate
+ * a block of the requested size, then NULL is returned.
+ */
+
+void *_Heap_Allocate(
+ Heap_Control *the_heap,
+ unsigned32 size
+);
+
+/*
+ * _Heap_Size_of_user_area
+ *
+ * DESCRIPTION:
+ *
+ * This kernel routine sets size to the size of the given heap block.
+ * It returns TRUE if the starting_address is in the heap, and FALSE
+ * otherwise.
+ */
+
+boolean _Heap_Size_of_user_area(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 *size
+);
+
+/*
+ * _Heap_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the block of memory which begins
+ * at starting_address to the_heap. Any coalescing which is
+ * possible with the freeing of this routine is performed.
+ */
+
+boolean _Heap_Free(
+ Heap_Control *the_heap,
+ void *start_address
+);
+
+/*
+ * _Heap_Walk
+ *
+ * DESCRIPTION:
+ *
+ * This routine walks the heap to verify its integrity.
+ */
+
+void _Heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/heap.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/interr.h b/c/src/exec/score/headers/interr.h
new file mode 100644
index 0000000000..b322aefe73
--- /dev/null
+++ b/c/src/exec/score/headers/interr.h
@@ -0,0 +1,95 @@
+/* interr.h
+ *
+ * This include file contains constants and prototypes related
+ * to the Internal Error Handler.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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_ERROR_POSIX_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_ERROR_BAD_STACK_HOOK
+} 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.
+ */
+
+SCORE_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/c/src/exec/score/headers/isr.h b/c/src/exec/score/headers/isr.h
new file mode 100644
index 0000000000..4e6c5c6f94
--- /dev/null
+++ b/c/src/exec/score/headers/isr.h
@@ -0,0 +1,224 @@
+/* isr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the management of processor interrupt levels. This handler
+ * supports interrupt critical sections, vectoring of user interrupt
+ * handlers, nesting of interrupts, and manipulating interrupt levels.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_h
+#define __ISR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * the interrupt level portion of the status register.
+ */
+
+typedef unsigned32 ISR_Level;
+
+/*
+ * The following type defines the type used to manage the vectors.
+ */
+
+typedef unsigned32 ISR_Vector_number;
+
+/*
+ * Return type for ISR Handler
+ */
+
+typedef void ISR_Handler;
+
+/*
+ * Pointer to an ISR Handler
+ */
+
+typedef ISR_Handler ( *ISR_Handler_entry )(
+ ISR_Vector_number
+ );
+/*
+ * This constant promotes out the number of vectors truly supported by
+ * the current CPU being used. This is usually the number of distinct vectors
+ * the cpu can vector.
+ */
+
+#define ISR_NUMBER_OF_VECTORS CPU_INTERRUPT_NUMBER_OF_VECTORS
+
+/*
+ * This constant promotes out the highest valid interrupt vector number.
+ */
+
+#define ISR_INTERRUPT_MAXIMUM_VECTOR_NUMBER CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER
+
+/*
+ * The following is TRUE if signals have been sent to the currently
+ * executing thread by an ISR handler.
+ */
+
+SCORE_EXTERN boolean _ISR_Signals_to_thread_executing;
+
+/*
+ * The following contains the interrupt service routine nest level.
+ * When this variable is zero, a thread is executing.
+ */
+
+SCORE_EXTERN unsigned32 _ISR_Nest_level;
+
+/*
+ * The following declares the Vector Table. Application
+ * interrupt service routines are vectored by the ISR Handler via this table.
+ */
+
+SCORE_EXTERN ISR_Handler_entry _ISR_Vector_table[ ISR_NUMBER_OF_VECTORS ];
+
+/*
+ * _ISR_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _ISR_Handler_initialization ( void );
+
+/*
+ * _ISR_Disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables all interrupts so that a critical section
+ * of code can be executing without being interrupted. Upon return,
+ * the argument _level will contain the previous interrupt mask level.
+ */
+
+#define _ISR_Disable( _level ) \
+ _CPU_ISR_Disable( _level )
+
+/*
+ * _ISR_Enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables interrupts to the previous interrupt mask
+ * LEVEL. It is used at the end of a critical section of code to
+ * enable interrupts so they can be processed again.
+ */
+
+#define _ISR_Enable( _level ) \
+ _CPU_ISR_Enable( _level )
+
+/*
+ * _ISR_Flash
+ *
+ * DESCRIPTION:
+ *
+ * This routine temporarily enables interrupts to the previous
+ * interrupt mask level and then disables all interrupts so that
+ * the caller can continue into the second part of a critical
+ * section. This routine is used to temporarily enable interrupts
+ * during a long critical section. It is used in long sections of
+ * critical code when a point is reached at which interrupts can
+ * be temporarily enabled. Deciding where to flash interrupts
+ * in a long critical section is often difficult and the point
+ * must be selected with care to insure that the critical section
+ * properly protects itself.
+ */
+
+#define _ISR_Flash( _level ) \
+ _CPU_ISR_Flash( _level )
+
+/*
+ * _ISR_Install_vector
+ *
+ * DESCRIPTION:
+ *
+ * This routine installs new_handler as the interrupt service routine
+ * for the specified vector. The previous interrupt service routine is
+ * returned as old_handler.
+ */
+
+#define _ISR_Install_vector( _vector, _new_handler, _old_handler ) \
+ _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:
+ *
+ * This routine sets the current interrupt level to that specified
+ * by new_level. The new interrupt level is effective when the
+ * routine exits.
+ */
+
+#define _ISR_Set_level( _new_level ) \
+ _CPU_ISR_Set_level( _new_level )
+
+/*
+ * _ISR_Handler
+ *
+ * DESCRIPTION:
+ *
+ * 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
+ * interrupt service routine returns control to this routine, it
+ * will determine if a thread dispatch is necessary. If so, it will
+ * insure that the necessary thread scheduling operations are
+ * performed when the outermost interrupt service routine exits.
+ *
+ * NOTE: Implemented in assembly language.
+ */
+
+void _ISR_Handler( void );
+
+/*
+ * _ISR_Dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine provides a wrapper so that the routine
+ * _Thread_Dispatch can be invoked when a reschedule is necessary
+ * at the end of the outermost interrupt service routine. This
+ * wrapper is necessary to establish the processor context needed
+ * by _Thread_Dispatch and to save the processor context which is
+ * corrupted by _Thread_Dispatch. This context typically consists
+ * of registers which are not preserved across routine invocations.
+ *
+ * NOTE: Implemented in assembly language.
+ */
+
+void _ISR_Dispatch( void );
+
+#include <rtems/score/isr.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/mpci.h b/c/src/exec/score/headers/mpci.h
new file mode 100644
index 0000000000..1d5578b21e
--- /dev/null
+++ b/c/src/exec/score/headers/mpci.h
@@ -0,0 +1,412 @@
+/* mpci.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the MPCI layer. It provides mechanisms to utilize packets.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MPCI_h
+#define __MPCI_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/coresem.h>
+
+/*
+ * The following constants define the stack size requirements for
+ * the system threads.
+ */
+
+#define MPCI_RECEIVE_SERVER_STACK_SIZE \
+ ( STACK_MINIMUM_SIZE + \
+ CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK + \
+ _CPU_Table.extra_mpci_receive_server_stack \
+ )
+
+/*
+ * The following defines the node number used when a broadcast is desired.
+ */
+
+#define MPCI_ALL_NODES 0
+
+/*
+ * For packets associated with requests that don't already have a timeout,
+ * use the one specified by this MPCI driver. The value specified by
+ * the MPCI driver sets an upper limit on how long a remote request
+ * should take to complete.
+ */
+
+#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 * );
+
+/*
+ * The following enumerated type defines the list of
+ * internal MP operations.
+ */
+
+typedef enum {
+ MPCI_PACKETS_SYSTEM_VERIFY = 0
+} MPCI_Internal_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote event operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ MPCI_Internal_Remote_operations operation;
+ unsigned32 maximum_nodes;
+ unsigned32 maximum_global_objects;
+} MPCI_Internal_packet;
+
+/*
+ * This is the core semaphore which the MPCI Receive Server blocks on.
+ */
+
+SCORE_EXTERN CORE_semaphore_Control _MPCI_Semaphore;
+/*
+ * The following thread queue is used to maintain a list of tasks
+ * which currently have outstanding remote requests.
+ */
+
+SCORE_EXTERN Thread_queue_Control _MPCI_Remote_blocked_threads;
+
+/*
+ * The following define the internal pointers to the user's
+ * configuration information.
+ */
+
+SCORE_EXTERN MPCI_Control *_MPCI_table;
+
+/*
+ * The following points to the MPCI Receive Server.
+ */
+
+SCORE_EXTERN Thread_Control *_MPCI_Receive_server_tcb;
+
+/*
+ * The following table contains the process packet routines provided
+ * by each object that supports MP operations.
+ */
+
+SCORE_EXTERN MPCI_Packet_processor
+ _MPCI_Packet_processors[MP_PACKET_CLASSES_LAST+1];
+
+/*
+ * _MPCI_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table,
+ unsigned32 timeout_status
+);
+
+/*
+ * _MPCI_Create_server
+ *
+ * DESCRIPTION:
+ *
+ * This routine creates the packet receive server used in MP systems.
+ */
+
+void _MPCI_Create_server( void );
+
+/*
+ * _MPCI_Initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the MPCI driver by
+ * invoking the user provided MPCI initialization callout.
+ */
+
+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_class,
+ MPCI_Packet_processor the_packet_processor
+
+);
+
+/*
+ * _MPCI_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+MP_packet_Prefix *_MPCI_Get_packet ( void );
+
+/*
+ * _MPCI_Return_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a packet by invoking the user provided
+ * MPCI return packet callout.
+ */
+
+void _MPCI_Return_packet (
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a process packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_process_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a request packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+unsigned32 _MPCI_Send_request_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet,
+ States_Control extra_state
+);
+
+/*
+ * _MPCI_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a response packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_response_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Receive_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine receives a packet by invoking the user provided
+ * MPCI receive callout.
+ */
+
+MP_packet_Prefix *_MPCI_Receive_packet ( void );
+
+/*
+ * _MPCI_Process_response
+ *
+ * DESCRIPTION:
+ *
+ * This routine obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+Thread_Control *_MPCI_Process_response (
+ MP_packet_Prefix *the_packet
+);
+
+/*PAGE
+ *
+ * _MPCI_Receive_server
+ *
+ */
+
+Thread _MPCI_Receive_server(
+ unsigned32 ignored
+);
+
+/*PAGE
+ *
+ * _MPCI_Announce
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _MPCI_Announce ( void );
+
+/*
+ * _MPCI_Internal_packets_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _MPCI_Internal_packets_Send_process_packet (
+ MPCI_Internal_Remote_operations operation
+);
+
+/*
+ * _MPCI_Internal_packets_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ *
+ * This routine is not needed since there are no request
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ *
+ * This routine is not needed since there are no response
+ * packets to be sent by this manager.
+ */
+
+/*
+ *
+ * _MPCI_Internal_packets_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _MPCI_Internal_packets_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _MPCI_Internal_packets_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to obtain a internal threads mp packet.
+ */
+
+ MPCI_Internal_packet *_MPCI_Internal_packets_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/mppkt.h b/c/src/exec/score/headers/mppkt.h
new file mode 100644
index 0000000000..2e98357afe
--- /dev/null
+++ b/c/src/exec/score/headers/mppkt.h
@@ -0,0 +1,101 @@
+/* mppkt.h
+ *
+ * This package is the specification for the Packet Handler.
+ * 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MP_PACKET_h
+#define __MP_PACKET_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the packet classes.
+ *
+ * NOTE: In general, each class corresponds to a manager
+ * which supports global operations. Each manager
+ * defines the set of supported operations.
+ */
+
+typedef enum {
+ MP_PACKET_MPCI_INTERNAL = 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_MPCI_INTERNAL
+#define MP_PACKET_CLASSES_LAST MP_PACKET_SIGNAL
+
+/*
+ * The following record contains the prefix for every packet
+ * 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
+ * encountered yet (i960CA).
+ */
+
+typedef struct {
+ MP_packet_Classes the_class;
+ Objects_Id id;
+ Objects_Id source_tid;
+ Priority_Control source_priority;
+ unsigned32 return_code;
+ unsigned32 length;
+ unsigned32 to_convert;
+ Watchdog_Interval timeout;
+} MP_packet_Prefix;
+
+/*
+ * An MPCI must support packets of at least this size.
+ */
+
+#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
+ * MP_PACKET_MINIMUN_HETERO_CONVERSION unsigned32's, some of the "extra" data
+ * may a user message buffer which is not automatically endian swapped.
+ */
+
+#define MP_PACKET_MINIMUN_HETERO_CONVERSION \
+ ( sizeof( MP_packet_Prefix ) / sizeof( unsigned32 ) )
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/mppkt.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/object.h b/c/src/exec/score/headers/object.h
new file mode 100644
index 0000000000..7364639391
--- /dev/null
+++ b/c/src/exec/score/headers/object.h
@@ -0,0 +1,397 @@
+/* object.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Object Handler. This Handler provides mechanisms which
+ * can be used to initialize and manipulate all objects which have
+ * ids.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_h
+#define __OBJECTS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/chain.h>
+
+/*
+ * The following type defines the control block used to manage
+ * object names.
+ */
+
+typedef void * Objects_Name;
+
+/*
+ * Space for object names is allocated in multiples of this.
+ *
+ * NOTE: Must be a power of 2. Matches the name manipulation routines.
+ */
+
+#define OBJECTS_NAME_ALIGNMENT sizeof( unsigned32 )
+
+/*
+ * Functions which compare names are prototyped like this.
+ */
+
+typedef boolean (*Objects_Name_comparators)(
+ void * /* name_1 */,
+ void * /* name_2 */,
+ unsigned32 /* length */
+);
+
+/*
+ * The following type defines the control block used to manage
+ * object IDs. The format is as follows (0=LSB):
+ *
+ * Bits 0 .. 15 = index
+ * Bits 16 .. 25 = node
+ * Bits 26 .. 31 = class
+ */
+
+typedef unsigned32 Objects_Id;
+
+#define OBJECTS_INDEX_START_BIT 0
+#define OBJECTS_NODE_START_BIT 16
+#define OBJECTS_CLASS_START_BIT 26
+
+#define OBJECTS_INDEX_MASK 0x0000ffff
+#define OBJECTS_NODE_MASK 0x03ff0000
+#define OBJECTS_CLASS_MASK 0xfc000000
+
+#define OBJECTS_INDEX_VALID_BITS 0x0000ffff
+#define OBJECTS_NODE_VALID_BITS 0x000003ff
+#define OBJECTS_CLASS_VALID_BITS 0x000000cf
+
+/*
+ * This enumerated type is used in the class field of the object ID.
+ */
+
+typedef enum {
+ OBJECTS_NO_CLASS = 0,
+ OBJECTS_INTERNAL_THREADS = 1,
+ OBJECTS_RTEMS_TASKS = 2,
+ OBJECTS_POSIX_THREADS = 3,
+ OBJECTS_RTEMS_TIMERS = 4,
+ OBJECTS_RTEMS_SEMAPHORES = 5,
+ OBJECTS_RTEMS_MESSAGE_QUEUES = 6,
+ OBJECTS_RTEMS_PARTITIONS = 7,
+ OBJECTS_RTEMS_REGIONS = 8,
+ OBJECTS_RTEMS_PORTS = 9,
+ OBJECTS_RTEMS_PERIODS = 10,
+ OBJECTS_RTEMS_EXTENSIONS = 11,
+ OBJECTS_POSIX_KEYS = 12,
+ OBJECTS_POSIX_INTERRUPTS = 13,
+ OBJECTS_POSIX_MESSAGE_QUEUES = 14,
+ OBJECTS_POSIX_MUTEXES = 15,
+ OBJECTS_POSIX_SEMAPHORES = 16,
+ OBJECTS_POSIX_CONDITION_VARIABLES = 17
+} Objects_Classes;
+
+#define OBJECTS_CLASSES_FIRST OBJECTS_NO_CLASS
+#define OBJECTS_CLASSES_LAST OBJECTS_POSIX_CONDITION_VARIABLES
+#define OBJECTS_CLASSES_FIRST_THREAD_CLASS OBJECTS_INTERNAL_THREADS
+#define OBJECTS_CLASSES_LAST_THREAD_CLASS OBJECTS_POSIX_THREADS
+
+/*
+ * This enumerated type lists the locations which may be returned
+ * by _Objects_Get. These codes indicate the success of locating
+ * an object with the specified ID.
+ */
+
+typedef enum {
+ OBJECTS_LOCAL = 0, /* object is local */
+ OBJECTS_REMOTE = 1, /* object is remote */
+ OBJECTS_ERROR = 2 /* id was invalid */
+} Objects_Locations;
+
+/*
+ * The following defines the Object Control Block used to manage
+ * each object local to this node.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ Objects_Id id;
+ Objects_Name name;
+} Objects_Control;
+
+/*
+ * The following defines the structure for the information used to
+ * manage each class of objects.
+ */
+
+typedef struct {
+ Objects_Classes the_class; /* Class of this object */
+ Objects_Id minimum_id; /* minimum valid id of this type */
+ Objects_Id maximum_id; /* maximum valid id of this type */
+ unsigned32 maximum; /* maximum number of objects */
+ Objects_Control **local_table; /* table of local object pointers */
+ Objects_Name *name_table; /* table of local object names */
+ Chain_Control *global_table; /* pointer to global table */
+ Chain_Control Inactive; /* chain of inactive ctl blocks */
+ boolean is_string; /* TRUE if names are strings */
+ unsigned32 name_length; /* maximum length of names */
+ boolean is_thread; /* TRUE if these are threads */
+ /* irregardless of API */
+} Objects_Information;
+
+/*
+ * The following defines the data storage which contains the
+ * node number of the local node.
+ */
+
+SCORE_EXTERN unsigned32 _Objects_Local_node;
+SCORE_EXTERN unsigned32 _Objects_Maximum_nodes;
+
+/*
+ * The following is the list of information blocks for each object
+ * class. From the ID, we can go to one of these information blocks,
+ * and obtain a pointer to the appropriate object control block.
+ */
+
+SCORE_EXTERN Objects_Information
+ *_Objects_Information_table[OBJECTS_CLASSES_LAST + 1];
+
+/*
+ * The following defines the constant which may be used
+ * with _Objects_Get to manipulate the calling task.
+ *
+ */
+
+#define OBJECTS_ID_OF_SELF ((Objects_Id) 0)
+
+/*
+ * The following define the constants which may be used in name searches.
+ */
+
+#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 OBJECTS_ID_INITIAL_INDEX (0)
+#define OBJECTS_ID_FINAL_INDEX (0xffff)
+
+#define OBJECTS_ID_INITIAL(_class, _node) \
+ _Objects_Build_id( (_class), (_node), OBJECTS_ID_INITIAL_INDEX )
+
+#define OBJECTS_ID_FINAL ((Objects_Id)~0)
+
+/*
+ * _Objects_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This function performs the initialization necessary for this handler.
+ *
+ */
+
+void _Objects_Handler_initialization(
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+);
+
+/*
+ * _Objects_Initialize_information
+ *
+ * DESCRIPTION:
+ *
+ * This function initializes an object class information record.
+ * SUPPORTS_GLOBAL is TRUE if the object class supports global
+ * objects, and FALSE otherwise. Maximum indicates the number
+ * of objects required in this class and size indicates the size
+ * in bytes of each control block for this object class. The
+ * name length and string designator are also set. In addition,
+ * the class may be a task, therefore this information is also included.
+ */
+
+void _Objects_Initialize_information (
+ Objects_Information *information,
+ Objects_Classes the_class,
+ boolean supports_global,
+ unsigned32 maximum,
+ unsigned32 size,
+ boolean is_string,
+ unsigned32 maximum_name_length,
+ boolean is_task
+);
+
+/*
+ * _Objects_Clear_name
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Clear_name(
+ void *name,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Copy_name_string
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_string(
+ void *source,
+ void *destination
+);
+
+/*
+ * _Objects_Copy_name_raw
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_raw(
+ void *source,
+ void *destination,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Compare_name_string
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_string(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Compare_name_raw
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_raw(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+);
+/*
+ * _Objects_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * This function implements the common portion of the object
+ * identification directives. This directive returns the object
+ * id associated with name. If more than one object of this class
+ * is named name, then the object to which the id belongs is
+ * arbitrary. Node indicates the extent of the search for the
+ * id of the object named name. If the object class supports global
+ * objects, then the search can be limited to a particular node
+ * or allowed to encompass all nodes.
+ *
+ */
+
+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,
+ Objects_Id *id
+);
+
+/*
+ * _Objects_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps object ids to object control blocks.
+ * If id corresponds to a local object, then it returns
+ * the_object control pointer which maps to id and location
+ * is set to OBJECTS_LOCAL. If the object class supports global
+ * objects and the object id is global and resides on a remote
+ * node, then location is set to OBJECTS_REMOTE, and the_object
+ * is undefined. Otherwise, location is set to OBJECTS_ERROR
+ * and the_object is undefined.
+ *
+ */
+
+Objects_Control *_Objects_Get (
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _Objects_Get_next
+ *
+ * DESCRIPTION:
+ *
+ * Like _Objects_Get, but is used to find "next" open object.
+ *
+ */
+
+Objects_Control *_Objects_Get_next(
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location_p,
+ Objects_Id *next_id_p
+);
+
+/*
+ * _Objects_Get_information
+ *
+ * DESCRIPTION:
+ *
+ * Returns the information control block for the class of objects
+ * corresponding to this id.
+ */
+
+Objects_Information *_Objects_Get_information(
+ Objects_Id id
+);
+
+/*
+ * Pieces of object.inl are promoted out to the user
+ */
+
+#include <rtems/score/object.inl>
+#include <rtems/score/objectmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/objectmp.h b/c/src/exec/score/headers/objectmp.h
new file mode 100644
index 0000000000..d84f4c3caa
--- /dev/null
+++ b/c/src/exec/score/headers/objectmp.h
@@ -0,0 +1,152 @@
+/* objectmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the manipulation of Global RTEMS Objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_OBJECTS_MP_h
+#define __RTEMS_OBJECTS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This defines the Global Object Control Block used to manage
+ * objects resident on other nodes.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ unsigned32 name; /* XXX broken but works */
+ /* XXX If any API is MP with variable length names .. BOOM!!!! */
+} Objects_MP_Control;
+
+/*
+ * _Objects_MP_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine intializes the inactive global object chain
+ * based on the maximum number of global objects configured.
+ */
+
+void _Objects_MP_Handler_initialization (
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+);
+
+/*PAGE
+ *
+ * _Objects_MP_Open
+ *
+ * DESCRIPTION:
+ *
+ * This routine place the specified global object in the
+ * specified information table.
+ */
+
+void _Objects_MP_Open (
+ Objects_Information *information,
+ Objects_MP_Control *the_global_object,
+ unsigned32 the_name, /* XXX -- wrong for variable */
+ Objects_Id the_id
+);
+
+/*
+ * _Objects_MP_Allocate_and_open
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a global object control block
+ * and places it in the specified information table. If the
+ * allocation fails, then is_fatal_error determines the
+ * error processing actions taken.
+ */
+
+boolean _Objects_MP_Allocate_and_open (
+ Objects_Information *information,
+ unsigned32 the_name, /* XXX -- wrong for variable length */
+ Objects_Id the_id,
+ boolean is_fatal_error
+);
+
+/*
+ * _Objects_MP_Close
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes a global object from the specified
+ * information table and deallocates the global object control block.
+ */
+
+void _Objects_MP_Close (
+ Objects_Information *information,
+ Objects_Id the_id
+);
+
+/*
+ * _Objects_MP_Global_name_search
+ *
+ * DESCRIPTION:
+ *
+ * This routine looks for the object with the_name in the global
+ * object tables indicated by information. It returns the ID of the
+ * object with that name if one is found.
+ */
+
+Objects_Name_to_id_errors _Objects_MP_Global_name_search (
+ Objects_Information *information,
+ Objects_Name the_name,
+ unsigned32 nodes_to_search,
+ Objects_Id *the_id
+);
+
+/*
+ * _Objects_MP_Is_remote
+ *
+ * DESCRIPTION:
+ *
+ * This function searches the Global Object Table managed
+ * by information for the object indicated by ID. If the object
+ * is found, then location is set to objects_remote, otherwise
+ * location is set to objects_error. In both cases, the_object
+ * is undefined.
+ */
+
+void _Objects_MP_Is_remote (
+ Objects_Information *information,
+ Objects_Id the_id,
+ Objects_Locations *location,
+ Objects_Control **the_object
+);
+
+/*
+ * The following chain header is used to manage the set of
+ * inactive global object control blocks.
+ */
+
+SCORE_EXTERN unsigned32 _Objects_MP_Maximum_global_objects;
+SCORE_EXTERN Chain_Control _Objects_MP_Inactive_global_objects;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/objectmp.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/priority.h b/c/src/exec/score/headers/priority.h
new file mode 100644
index 0000000000..f1fb7b5f01
--- /dev/null
+++ b/c/src/exec/score/headers/priority.h
@@ -0,0 +1,97 @@
+/* priority.h
+ *
+ * This include file contains all thread priority manipulation routines.
+ * This Handler provides mechanisms which can be used to
+ * initialize and manipulate thread priorities.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_h
+#define __PRIORITY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * thread priorities.
+ *
+ * NOTE: Priority 0 is reserved for internal threads only.
+ */
+
+typedef unsigned32 Priority_Control;
+
+#define PRIORITY_MINIMUM 0 /* highest thread priority */
+#define PRIORITY_MAXIMUM 255 /* lowest thread priority */
+
+/*
+ * The following record defines the information associated with
+ * each thread to manage its interaction with the priority bit maps.
+ */
+
+typedef struct {
+ Priority_Bit_map_control *minor; /* addr of minor bit map slot */
+ Priority_Bit_map_control ready_major; /* priority bit map ready mask */
+ Priority_Bit_map_control ready_minor; /* priority bit map ready mask */
+ Priority_Bit_map_control block_major; /* priority bit map block mask */
+ Priority_Bit_map_control block_minor; /* priority bit map block mask */
+} Priority_Information;
+
+/*
+ * The following data items are the priority bit map.
+ * Each of the sixteen bits used in the _Priority_Major_bit_map is
+ * associated with one of the sixteen entries in the _Priority_Bit_map.
+ * Each bit in the _Priority_Bit_map indicates whether or not there are
+ * threads ready at a particular priority. The mapping of
+ * individual priority levels to particular bits is processor
+ * dependent as is the value of each bit used to indicate that
+ * threads are ready at that priority.
+ */
+
+SCORE_EXTERN volatile Priority_Bit_map_control _Priority_Major_bit_map;
+SCORE_EXTERN Priority_Bit_map_control
+ _Priority_Bit_map[16] CPU_STRUCTURE_ALIGNMENT;
+
+/*
+ * The definition of the Priority_Bit_map_control type is CPU dependent.
+ *
+ */
+
+/*
+ * Priority Bitfield Manipulation Routines
+ *
+ * NOTE:
+ *
+ * These may simply be pass throughs to CPU dependent routines.
+ */
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == FALSE )
+
+#define _Priority_Mask( _bit_number ) \
+ _CPU_Priority_Mask( _bit_number )
+
+#define _Priority_Bits_index( _priority ) \
+ _CPU_Priority_bits_index( _priority )
+
+#endif
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/priority.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/stack.h b/c/src/exec/score/headers/stack.h
new file mode 100644
index 0000000000..eb9a68fe8c
--- /dev/null
+++ b/c/src/exec/score/headers/stack.h
@@ -0,0 +1,50 @@
+/* stack.h
+ *
+ * This include file contains all information about the thread
+ * Stack Handler. This Handler provides mechanisms which can be used to
+ * initialize and utilize stacks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_h
+#define __STACK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following constant defines the minimum stack size which every
+ * thread must exceed.
+ */
+
+#define STACK_MINIMUM_SIZE CPU_STACK_MINIMUM_SIZE
+
+/*
+ * The following defines the control block used to manage each stack.
+ */
+
+typedef struct {
+ unsigned32 size; /* stack size */
+ void *area; /* low memory addr of stack */
+} Stack_Control;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/stack.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/states.h b/c/src/exec/score/headers/states.h
new file mode 100644
index 0000000000..02c0f0c590
--- /dev/null
+++ b/c/src/exec/score/headers/states.h
@@ -0,0 +1,84 @@
+/* states.h
+ *
+ * This include file contains thread execution state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_STATES_h
+#define __RTEMS_STATES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage a
+ * thread's state.
+ */
+
+typedef unsigned32 States_Control;
+
+/*
+ * The following constants define the individual states which may be
+ * be used to compose and manipulate a thread's state.
+ */
+
+#define STATES_ALL_SET 0xfffff /* all states */
+#define STATES_READY 0x00000 /* ready to run */
+#define STATES_DORMANT 0x00001 /* created not started */
+#define STATES_SUSPENDED 0x00002 /* waiting for resume */
+#define STATES_TRANSIENT 0x00004 /* in transition */
+#define STATES_DELAYING 0x00008 /* wait for timeout */
+#define STATES_WAITING_FOR_TIME 0x00010 /* wait for TOD */
+#define STATES_WAITING_FOR_BUFFER 0x00020
+#define STATES_WAITING_FOR_SEGMENT 0x00040
+#define STATES_WAITING_FOR_MESSAGE 0x00080
+#define STATES_WAITING_FOR_EVENT 0x00100
+#define STATES_WAITING_FOR_SEMAPHORE 0x00200
+#define STATES_WAITING_FOR_MUTEX 0x00400
+#define STATES_WAITING_FOR_CONDITION_VARIABLE 0x00800
+#define STATES_WAITING_FOR_JOIN_AT_EXIT 0x01000
+#define STATES_WAITING_FOR_RPC_REPLY 0x02000
+#define STATES_WAITING_FOR_PERIOD 0x04000
+#define STATES_WAITING_FOR_SIGNAL 0x08000
+#define STATES_INTERRUPTIBLE_BY_SIGNAL 0x10000
+
+#define STATES_LOCALLY_BLOCKED ( STATES_WAITING_FOR_BUFFER | \
+ STATES_WAITING_FOR_SEGMENT | \
+ STATES_WAITING_FOR_MESSAGE | \
+ STATES_WAITING_FOR_SEMAPHORE | \
+ STATES_WAITING_FOR_MUTEX | \
+ STATES_WAITING_FOR_CONDITION_VARIABLE | \
+ STATES_WAITING_FOR_JOIN_AT_EXIT | \
+ STATES_WAITING_FOR_SIGNAL )
+
+#define STATES_WAITING_ON_THREAD_QUEUE \
+ ( STATES_LOCALLY_BLOCKED | \
+ STATES_WAITING_FOR_RPC_REPLY )
+
+#define STATES_BLOCKED ( STATES_DELAYING | \
+ STATES_WAITING_FOR_TIME | \
+ STATES_WAITING_FOR_PERIOD | \
+ STATES_WAITING_FOR_EVENT | \
+ STATES_WAITING_ON_THREAD_QUEUE | \
+ STATES_INTERRUPTIBLE_BY_SIGNAL )
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/states.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/sysstate.h b/c/src/exec/score/headers/sysstate.h
new file mode 100644
index 0000000000..38e6ce36f1
--- /dev/null
+++ b/c/src/exec/score/headers/sysstate.h
@@ -0,0 +1,67 @@
+/* sysstates.h
+ *
+ * This include file contains information regarding the system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SYSTEM_STATE_h
+#define __RTEMS_SYSTEM_STATE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+/* enumerated constants */
+
+/*
+ * The following type defines the possible system states.
+ */
+
+typedef enum {
+ SYSTEM_STATE_BEFORE_INITIALIZATION, /* start -> end of 1st init part */
+ SYSTEM_STATE_BEFORE_MULTITASKING, /* end of 1st -> beginning of 2nd */
+ SYSTEM_STATE_BEGIN_MULTITASKING, /* just before multitasking starts */
+ SYSTEM_STATE_UP, /* normal operation */
+ SYSTEM_STATE_SHUTDOWN, /* shutdown */
+ SYSTEM_STATE_FAILED /* fatal error occurred */
+} System_state_Codes;
+
+#define SYSTEM_STATE_CODES_FIRST SYSTEM_STATE_BEFORE_INITIALIZATION
+#define SYSTEM_STATE_CODES_LAST SYSTEM_STATE_FAILED
+
+/*
+ * The following variable indicates whether or not this is
+ * an multiprocessing system.
+ */
+
+SCORE_EXTERN boolean _System_state_Is_multiprocessing;
+
+/*
+ * The following variable contains the current system state.
+ */
+
+SCORE_EXTERN System_state_Codes _System_state_Current;
+
+/*
+ * Make it possible for the application to get the system state information.
+ */
+
+#include <rtems/score/sysstate.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/system.h b/c/src/exec/score/headers/system.h
new file mode 100644
index 0000000000..b9255d45d5
--- /dev/null
+++ b/c/src/exec/score/headers/system.h
@@ -0,0 +1,153 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the executive. This must be the first include file
+ * included in all internal RTEMS files.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SYSTEM_h
+#define __RTEMS_SYSTEM_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The target options include file defines all target dependent
+ * parameters for this build of RTEMS. It must be included
+ * first so the basic macro definitions are in place.
+ */
+
+#include <rtems/score/targopts.h>
+
+/*
+ * The following insures that all data is declared in the space
+ * of the initialization routine for either the Initialization Manager
+ * or the initialization file for the appropriate API. It is
+ * referenced as "external" in every other file.
+ */
+
+#ifdef SCORE_INIT
+#undef SCORE_EXTERN
+#define SCORE_EXTERN
+#else
+#undef SCORE_EXTERN
+#define SCORE_EXTERN extern
+#endif
+
+#ifdef SAPI_INIT
+#undef SAPI_EXTERN
+#define SAPI_EXTERN
+#else
+#undef SAPI_EXTERN
+#define SAPI_EXTERN extern
+#endif
+
+#ifdef RTEMS_API_INIT
+#undef RTEMS_EXTERN
+#define RTEMS_EXTERN
+#else
+#undef RTEMS_EXTERN
+#define RTEMS_EXTERN extern
+#endif
+
+#ifdef POSIX_API_INIT
+#undef POSIX_EXTERN
+#define POSIX_EXTERN
+#else
+#undef POSIX_EXTERN
+#define POSIX_EXTERN extern
+#endif
+
+/*
+ * The following (in conjunction with compiler arguments) are used
+ * to choose between the use of static inline functions and macro
+ * functions. The static inline implementation allows better
+ * type checking with no cost in code size or execution speed.
+ */
+
+#ifdef USE_INLINES
+# ifdef __GNUC__
+# define RTEMS_INLINE_ROUTINE static __inline__
+# else
+# define RTEMS_INLINE_ROUTINE static inline
+# endif
+#else
+# define RTEMS_INLINE_ROUTINE
+#endif
+
+/*
+ * Include a base set of files.
+ */
+
+/*
+ * XXX: Eventually proc_ptr needs to disappear!!!
+ */
+
+typedef void * proc_ptr;
+
+#include <rtems/score/cpu.h> /* processor specific information */
+
+/*
+ * Define NULL
+ */
+
+#ifndef NULL
+#define NULL 0 /* NULL value */
+#endif
+
+/*
+ * Boolean constants
+ */
+
+#if !defined( TRUE ) || (TRUE != 1)
+#undef TRUE
+#define TRUE (1)
+#endif
+
+#if !defined( FALSE ) || (FALSE != 0)
+#undef FALSE
+#define FALSE (0)
+#endif
+
+#define stringify( _x ) # _x
+
+#define RTEMS_offsetof(type, field) \
+ ((unsigned32) &(((type *) 0)->field))
+
+/*
+ * The following is the extern for the RTEMS version string.
+ * The contents of this string are CPU specific.
+ */
+
+extern const char _RTEMS_version[]; /* RTEMS version string */
+extern const char _Copyright_Notice[]; /* RTEMS copyright string */
+
+/*
+ * The following defines the CPU dependent information table.
+ */
+
+SCORE_EXTERN rtems_cpu_table _CPU_Table; /* CPU dependent info */
+
+/*
+ * XXX weird RTEMS stuff
+ */
+
+#define RTEMS_MAXIMUM_NAME_LENGTH 4
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/thread.h b/c/src/exec/score/headers/thread.h
new file mode 100644
index 0000000000..23b1242c0d
--- /dev/null
+++ b/c/src/exec/score/headers/thread.h
@@ -0,0 +1,630 @@
+/* thread.h
+ *
+ * This include file contains all constants and structures associated
+ * with the thread control block.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_h
+#define __THREAD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/context.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/states.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following defines the "return type" of a thread.
+ */
+
+typedef void 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 enum {
+ THREAD_START_NUMERIC,
+ THREAD_START_POINTER,
+ THREAD_START_BOTH_POINTER_FIRST,
+ THREAD_START_BOTH_NUMERIC_FIRST
+} Thread_Start_types;
+
+typedef Thread ( *Thread_Entry )(); /* basic type */
+
+typedef Thread ( *Thread_Entry_numeric )( unsigned32 );
+typedef Thread ( *Thread_Entry_pointer )( void * );
+typedef Thread ( *Thread_Entry_both_pointer_first )( void *, unsigned32 );
+typedef Thread ( *Thread_Entry_both_numeric_first )( unsigned32, void * );
+
+/*
+ * The following lists the algorithms used to manage the thread cpu budget.
+ *
+ * Reset Timeslice: At each context switch, reset the time quantum.
+ * Exhaust Timeslice: Only reset the quantum once it is consumed.
+ * Callout: Execute routine when budget is consumed.
+ */
+
+typedef enum {
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE,
+ THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE,
+ THREAD_CPU_BUDGET_ALGORITHM_CALLOUT
+} Thread_CPU_budget_algorithms;
+
+typedef struct Thread_Control_struct Thread_Control;
+
+typedef void (*Thread_CPU_budget_algorithm_callout )( Thread_Control * );
+
+/*
+ * The following structure contains the information which defines
+ * the starting state of a thread.
+ */
+
+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 */
+ /* initial execution modes */
+ boolean is_preemptible;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ unsigned32 isr_level;
+ Priority_Control initial_priority; /* initial priority */
+ boolean core_allocated_stack;
+ Stack_Control Initial_stack; /* stack information */
+ void *fp_context; /* initial FP context area address */
+ void *stack; /* initial FP context area address */
+} Thread_Start_information;
+
+/*
+ * The following structure contains the information necessary to manage
+ * a thread which it is waiting for a resource.
+ */
+
+#define THREAD_STATUS_PROXY_BLOCKING 0x1111111
+
+typedef struct {
+ Objects_Id id; /* waiting on this object */
+ 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;
+
+/*
+ * The following defines the control block used to manage
+ * each thread proxy.
+ *
+ * NOTE: It is critical that proxies and threads have identical
+ * memory images for the shared part.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ States_Control current_state;
+ Priority_Control current_priority;
+ Priority_Control real_priority;
+ unsigned32 resource_count;
+ Thread_Wait_information Wait;
+ Watchdog_Control Timer;
+ MP_packet_Prefix *receive_packet;
+ /****************** end of common block ********************/
+ Chain_Node Active;
+} Thread_Proxy_control;
+
+
+/*
+ * The following record defines the control block used
+ * to manage each thread.
+ *
+ * NOTE: It is critical that proxies and threads have identical
+ * memory images for the shared part.
+ */
+
+typedef enum {
+ THREAD_API_RTEMS,
+ THREAD_API_POSIX
+} Thread_APIs;
+
+#define THREAD_API_FIRST THREAD_API_RTEMS
+#define THREAD_API_LAST THREAD_API_POSIX
+
+struct Thread_Control_struct {
+ Objects_Control Object;
+ States_Control current_state;
+ Priority_Control current_priority;
+ Priority_Control real_priority;
+ unsigned32 resource_count;
+ Thread_Wait_information Wait;
+ Watchdog_Control Timer;
+ MP_packet_Prefix *receive_packet;
+ /****************** end of common block ********************/
+ boolean is_global;
+ boolean do_post_task_switch_extension;
+
+ boolean is_preemptible;
+ unsigned32 cpu_time_budget;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+
+ unsigned32 ticks_executed;
+ Chain_Control *ready;
+ Priority_Information Priority_map;
+ Thread_Start_information Start;
+ Context_Control Registers;
+ void *fp_context;
+ void *API_Extensions[ THREAD_API_LAST + 1 ];
+ void **extensions;
+};
+
+/*
+ * The following constants define the stack size requirements for
+ * the idle thread.
+ */
+
+
+#define THREAD_IDLE_STACK_SIZE STACK_MINIMUM_SIZE
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+SCORE_EXTERN Objects_Information _Thread_Internal_information;
+
+/*
+ * The following define the thread control pointers used to access
+ * and manipulate the idle thread.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Idle;
+
+/*
+ * 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.
+ */
+
+SCORE_EXTERN Context_Control _Thread_BSP_context;
+
+/*
+ * The following declares the dispatch critical section nesting
+ * counter which is used to prevent context switches at inopportune
+ * moments.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Dispatch_disable_level;
+
+/*
+ * If this is non-zero, then the post-task switch extension
+ * is run regardless of the state of the per thread flag.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Do_post_task_switch_extension;
+
+/*
+ * 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.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Maximum_extensions;
+
+/*
+ * The following is used to manage the length of a timeslice quantum.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Ticks_per_timeslice;
+
+/*
+ * The following points to the array of FIFOs used to manage the
+ * set of ready threads.
+ */
+
+SCORE_EXTERN Chain_Control *_Thread_Ready_chain;
+
+/*
+ * The following points to the thread which is currently executing.
+ * This thread is implicitly manipulated by numerous directives.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Executing;
+
+/*
+ * The following points to the highest priority ready thread
+ * in the system. Unless the current thread is not preemptibl,
+ * then this thread will be context switched to when the next
+ * dispatch occurs.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Heir;
+
+/*
+ * The following points to the thread whose floating point
+ * context is currently loaded.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Allocated_fp;
+
+/*
+ * _Thread_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _Thread_Handler_initialization (
+ unsigned32 ticks_per_timeslice,
+ unsigned32 maximum_extensions,
+ unsigned32 maximum_proxies
+);
+
+/*
+ * _Thread_Create_idle
+ *
+ * DESCRIPTION:
+ *
+ * This routine creates the idle thread.
+ *
+ * WARNING!! No thread should be created before this one.
+ */
+
+void _Thread_Create_idle( void );
+
+/*
+ * _Thread_Start_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This routine initiates multitasking. It is invoked only as
+ * part of initialization and its invocation is the last act of
+ * the non-multitasking part of the system initialization.
+ */
+
+void _Thread_Start_multitasking( void );
+
+/*
+ * _Thread_Dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine is responsible for transferring control of the
+ * processor from the executing thread to the heir thread. As part
+ * of this process, it is responsible for the following actions:
+ *
+ * + saving the context of the executing thread
+ * + restoring the context of the heir thread
+ * + dispatching any signals for the resulting executing thread
+ */
+
+void _Thread_Dispatch( void );
+
+/*
+ * _Thread_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ *
+ * NOTES:
+ *
+ * If stack_area is NULL, it is allocated from the workspace.
+ *
+ * If the stack is allocated from the workspace, then it is guaranteed to be
+ * of at least minimum size.
+ */
+
+boolean _Thread_Initialize(
+ Objects_Information *information,
+ Thread_Control *the_thread,
+ void *stack_area,
+ unsigned32 stack_size,
+ boolean is_fp,
+ Priority_Control priority,
+ boolean is_preemptible,
+ Thread_CPU_budget_algorithms budget_algorithm,
+ Thread_CPU_budget_algorithm_callout budget_callout,
+ unsigned32 isr_level,
+ Objects_Name name
+);
+
+/*
+ * _Thread_Start
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Thread_Start(
+ Thread_Control *the_thread,
+ Thread_Start_types the_prototype,
+ void *entry_point,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+);
+
+/*
+ * _Thread_Restart
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+/* XXX multiple task arg profiles */
+
+boolean _Thread_Restart(
+ Thread_Control *the_thread,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+);
+
+/*
+ * _Thread_Close
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Thread_Close(
+ Objects_Information *information,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Ready
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes any set states for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Ready(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Clear_state
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the indicated STATES for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Clear_state(
+ Thread_Control *the_thread,
+ States_Control state
+);
+
+/*
+ * _Thread_Set_state
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the indicated states for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ *
+ */
+
+void _Thread_Set_state(
+ Thread_Control *the_thread,
+ States_Control state
+);
+
+/*
+ * _Thread_Set_transient
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the TRANSIENT state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Set_transient(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Reset_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked upon expiration of the currently
+ * executing thread's timeslice. If no other thread's are ready
+ * 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
+ * FIFO for this priority and a new heir is selected.
+ */
+
+void _Thread_Reset_timeslice( void );
+
+/*
+ * _Thread_Tickle_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked as part of processing each clock tick.
+ * It is responsible for determining if the current thread allows
+ * timeslicing and, if so, when its timeslice expires.
+ */
+
+void _Thread_Tickle_timeslice( void );
+
+/*
+ * _Thread_Yield_processor
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a thread wishes to voluntarily
+ * transfer control of the processor to another thread of equal
+ * or greater priority.
+ */
+
+void _Thread_Yield_processor( void );
+
+/*
+ * _Thread_Load_environment
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the context of the_thread to its
+ * appropriate starting state.
+ */
+
+void _Thread_Load_environment(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Handler
+ *
+ * DESCRIPTION:
+ *
+ * This routine is the wrapper function for all threads. It is
+ * the starting point for all threads. The user provided thread
+ * entry point is invoked by this routine. Operations
+ * which must be performed immediately before and after the user's
+ * thread executes are found here.
+ */
+
+void _Thread_Handler( void );
+
+/*
+ * _Thread_Delay_ended
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a thread must be unblocked at the
+ * end of a time based delay (i.e. wake after or wake when).
+ */
+
+void _Thread_Delay_ended(
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * _Thread_Change_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine changes the current priority of the_thread to
+ * new_priority. It performs any necessary scheduling operations
+ * including the selection of a new heir thread.
+ */
+
+void _Thread_Change_priority (
+ Thread_Control *the_thread,
+ Priority_Control new_priority,
+ boolean prepend_it
+);
+
+/*
+ * _Thread_Set_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine updates the priority related fields in the_thread
+ * control block to indicate the current priority is now new_priority.
+ */
+
+void _Thread_Set_priority(
+ Thread_Control *the_thread,
+ Priority_Control new_priority
+);
+
+/*
+ * _Thread_Evaluate_mode
+ *
+ * DESCRIPTION:
+ *
+ * This routine XXX
+ */
+
+boolean _Thread_Evaluate_mode( void );
+
+/*
+ * _Thread_Get
+ *
+ * NOTE: If we are not using static inlines, this must be a real
+ * subroutine call.
+ */
+
+#ifndef USE_INLINES
+Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+#endif
+
+/*
+ * _Thread_Idle_body
+ *
+ * DESCRIPTION:
+ *
+ * This routine is the body of the system idle thread.
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE)
+Thread _Thread_Idle_body(
+ unsigned32 ignored
+);
+#endif
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/thread.inl>
+#endif
+#include <rtems/score/threadmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/threadmp.h b/c/src/exec/score/headers/threadmp.h
new file mode 100644
index 0000000000..bcaa423d70
--- /dev/null
+++ b/c/src/exec/score/headers/threadmp.h
@@ -0,0 +1,89 @@
+/* threadmp.h
+ *
+ * This include file contains the specification for all routines
+ * and data specific to the multiprocessing portion of the thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_THREAD_MP_h
+#define __RTEMS_THREAD_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * _Thread_MP_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the multiprocessing portion of the Thread Handler.
+ */
+
+void _Thread_MP_Handler_initialization (
+ unsigned32 maximum_proxies
+);
+
+/*
+ * _Thread_MP_Allocate_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This allocates a proxy control block from
+ * the inactive chain of free proxy control blocks.
+ *
+ * NOTE: This function returns a thread control pointer
+ * because proxies are substitutes for remote threads.
+ */
+
+Thread_Control *_Thread_MP_Allocate_proxy (
+ States_Control the_state
+);
+
+/*
+ * _Thread_MP_Find_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the proxy control block for the specified
+ * id from the active chain of proxy control blocks.
+ */
+
+Thread_Control *_Thread_MP_Find_proxy (
+ Objects_Id the_id
+);
+
+/*
+ * The following is used to determine when the multiprocessing receive
+ * thread is executing so that a proxy can be allocated instead of
+ * blocking the multiprocessing receive thread.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_MP_Receive;
+
+/*
+ * The following chains are used to manage proxies.
+ */
+
+SCORE_EXTERN Chain_Control _Thread_MP_Active_proxies;
+SCORE_EXTERN Chain_Control _Thread_MP_Inactive_proxies;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/threadmp.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/threadq.h b/c/src/exec/score/headers/threadq.h
new file mode 100644
index 0000000000..943eaf10f8
--- /dev/null
+++ b/c/src/exec/score/headers/threadq.h
@@ -0,0 +1,301 @@
+/* threadq.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the manipulation of objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_h
+#define __THREAD_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/tqdata.h>
+
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * Constant for indefinite wait.
+ */
+
+#define THREAD_QUEUE_WAIT_FOREVER WATCHDOG_NO_TIMEOUT
+
+/*
+ * The following type defines the callout used when a remote task
+ * is extracted from a local thread queue.
+ */
+
+typedef void ( *Thread_queue_Flush_callout )(
+ Thread_Control *
+ );
+
+/*
+ * The following type defines the callout used when a local task
+ * is extracted from a remote thread queue (i.e. it's proxy must
+ * extracted from the remote queue).
+ */
+
+typedef void ( *Thread_queue_Extract_callout )(
+ Thread_Control *
+ );
+
+SCORE_EXTERN Thread_queue_Extract_callout
+ _Thread_queue_Extract_table[ OBJECTS_CLASSES_LAST + 1 ];
+
+/*
+ * _Thread_queue_Dequeue
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to a thread waiting on
+ * the_thread_queue. The selection of this thread is based on
+ * the discipline of the_thread_queue. If no threads are waiting
+ * on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout.
+ */
+
+void _Thread_queue_Enqueue(
+ Thread_queue_Control *the_thread_queue,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_Extract_with_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_thread from the_thread_queue
+ * and insures that if there is a proxy for this task on
+ * another node, it is also dealt with.
+ */
+
+boolean _Thread_queue_Extract_with_proxy(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The "first" thread is selected
+ * based on the discipline of the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine unblocks all threads blocked on the_thread_queue
+ * and cancels any associated timeouts.
+ */
+
+void _Thread_queue_Flush(
+ Thread_queue_Control *the_thread_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ * _Thread_queue_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_thread_queue based on the
+ * discipline indicated in attribute_set. The state set on
+ * threads which block on the_thread_queue is state.
+ */
+
+void _Thread_queue_Initialize(
+ Thread_queue_Control *the_thread_queue,
+ Objects_Classes the_class,
+ Thread_queue_Disciplines the_discipline,
+ States_Control state,
+ Thread_queue_Extract_callout proxy_extract_callout,
+ unsigned32 timeout_status
+);
+
+/*
+ * _Thread_queue_Dequeue_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the highest priority
+ * thread waiting on the_thread_queue. If no threads are waiting
+ * on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue_priority(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout using the
+ * priority discipline.
+ */
+
+void _Thread_queue_Enqueue_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The "first" thread is the highest
+ * priority thread waiting on the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First_priority(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Dequeue_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the thread which has
+ * been waiting the longest on the_thread_queue. If no
+ * threads are waiting on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue_fifo(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout using the
+ * FIFO discipline.
+ */
+
+void _Thread_queue_Enqueue_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The first thread is the thread
+ * which has been waiting longest on the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First_fifo(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task's request has not
+ * been satisfied after the timeout interval specified to
+ * enqueue. The task represented by ID will be unblocked and
+ * its status code will be set in it's control block to indicate
+ * that a timeout has occurred.
+ */
+
+void _Thread_queue_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/tod.h b/c/src/exec/score/headers/tod.h
new file mode 100644
index 0000000000..36d0097669
--- /dev/null
+++ b/c/src/exec/score/headers/tod.h
@@ -0,0 +1,277 @@
+/* tod.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_h
+#define __TIME_OF_DAY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following constants are related to the time of day.
+ */
+
+#define TOD_SECONDS_PER_MINUTE 60
+#define TOD_MINUTES_PER_HOUR 60
+#define TOD_MONTHS_PER_YEAR 12
+#define TOD_DAYS_PER_YEAR 365
+#define TOD_HOURS_PER_DAY 24
+#define TOD_SECONDS_PER_DAY (TOD_SECONDS_PER_MINUTE * \
+ TOD_MINUTES_PER_HOUR * \
+ TOD_HOURS_PER_DAY)
+
+#define TOD_SECONDS_PER_NON_LEAP_YEAR (365 * TOD_SECONDS_PER_DAY)
+
+#define TOD_MILLISECONDS_PER_SECOND 1000
+#define TOD_MICROSECONDS_PER_SECOND 1000000
+#define TOD_NANOSECONDS_PER_SECOND 1000000000
+#define TOD_NANOSECONDS_PER_MICROSECOND 1000
+
+/*
+ * The following constant define the earliest year to which an
+ * time of day can be initialized. This is considered the
+ * epoch.
+ */
+
+#define TOD_BASE_YEAR 1988
+
+/*
+ * The following record defines the time of control block. This
+ * control block is used to maintain the current time of day.
+ */
+
+typedef struct { /* RTEID style time/date */
+ unsigned32 year; /* year, A.D. */
+ unsigned32 month; /* month, 1 -> 12 */
+ unsigned32 day; /* day, 1 -> 31 */
+ unsigned32 hour; /* hour, 0 -> 23 */
+ unsigned32 minute; /* minute, 0 -> 59 */
+ unsigned32 second; /* second, 0 -> 59 */
+ unsigned32 ticks; /* elapsed ticks between secs */
+} TOD_Control;
+
+/*
+ * The following is TRUE if the application has set the current
+ * time of day, and FALSE otherwise.
+ */
+
+SCORE_EXTERN boolean _TOD_Is_set;
+
+/*
+ * The following contains the current time of day.
+ */
+
+SCORE_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.
+ */
+
+SCORE_EXTERN Watchdog_Interval _TOD_Seconds_since_epoch;
+
+/*
+ * The following contains the number of microseconds per tick.
+ */
+
+SCORE_EXTERN unsigned32 _TOD_Microseconds_per_tick;
+
+/*
+ * The following contains the number of clock ticks per second.
+ *
+ * NOTE:
+ *
+ * If one second is NOT evenly divisible by the number of microseconds
+ * per clock tick, this value will contain only the integer portion
+ * of the division. This means that the interval between clock ticks
+ * can be a source of error in the current time of day.
+ */
+
+SCORE_EXTERN unsigned32 _TOD_Ticks_per_second;
+
+/*
+ * This is the control structure for the watchdog timer which
+ * fires to service the seconds chain.
+ */
+
+SCORE_EXTERN Watchdog_Control _TOD_Seconds_watchdog;
+
+#ifdef SCORE_INIT
+
+/*
+ * The following array contains the number of days in all months.
+ * The first dimension should be 1 for leap years, and 0 otherwise.
+ * The second dimension should range from 1 to 12 for January to
+ * February, respectively.
+ */
+
+const unsigned32 _TOD_Days_per_month[ 2 ][ 13 ] = {
+ { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+/*
+ * The following array contains the number of days in all months
+ * up to the month indicated by the index of the second dimension.
+ * The first dimension should be 1 for leap years, and 0 otherwise.
+ */
+
+const unsigned16 _TOD_Days_to_date[2][13] = {
+ { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 },
+ { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }
+};
+
+/*
+ * The following array contains the number of days in the years
+ * since the last leap year. The index should be 0 for leap
+ * years, and the number of years since the beginning of a leap
+ * year otherwise.
+ */
+
+const unsigned16 _TOD_Days_since_last_leap_year[4] = { 0, 366, 761, 1126 };
+
+#else
+
+extern const unsigned16 _TOD_Days_to_date[2][13]; /* Julian days */
+extern const unsigned16 _TOD_Days_since_last_leap_year[4];
+extern const unsigned32 _TOD_Days_per_month[2][13];
+
+#endif
+
+/*
+ * _TOD_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _TOD_Handler_initialization(
+ unsigned32 microseconds_per_tick
+);
+
+/*
+ * _TOD_Set
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current time of day to THE_TOD and
+ * the equivalent SECONDS_SINCE_EPOCH.
+ */
+
+void _TOD_Set(
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
+);
+
+/*
+ * _TOD_Validate
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if THE_TOD contains
+ * a valid time of day, and FALSE otherwise.
+ */
+
+boolean _TOD_Validate(
+ TOD_Control *the_tod
+);
+
+/*
+ * _TOD_To_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the number seconds between the epoch and THE_TOD.
+ */
+
+Watchdog_Interval _TOD_To_seconds(
+ TOD_Control *the_tod
+);
+
+/*
+ * _TOD_Tickle
+ *
+ * DESCRIPTION:
+ *
+ * This routine is scheduled as a watchdog function and is invoked at
+ * each second boundary. It updates the current time of day to indicate
+ * that a second has passed and processes the seconds watchdog chain.
+ */
+
+void _TOD_Tickle(
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * TOD_MILLISECONDS_TO_MICROSECONDS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in milliseconds to microseconds.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MILLISECONDS_TO_MICROSECONDS(_ms) ((_ms) * 1000)
+
+/*
+ * TOD_MICROSECONDS_TO_TICKS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in microseconds to ticks.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MICROSECONDS_TO_TICKS(_us) \
+ ((_us) / _TOD_Microseconds_per_tick)
+
+/*
+ * TOD_MILLISECONDS_TO_TICKS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in milliseconds to ticks.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MILLISECONDS_TO_TICKS(_ms) \
+ (TOD_MILLISECONDS_TO_MICROSECONDS(_ms) / _TOD_Microseconds_per_tick)
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/tod.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/tqdata.h b/c/src/exec/score/headers/tqdata.h
new file mode 100644
index 0000000000..0011b62766
--- /dev/null
+++ b/c/src/exec/score/headers/tqdata.h
@@ -0,0 +1,90 @@
+/* tqdata.h
+ *
+ * This include file contains all the constants and structures
+ * needed to declare a thread queue.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_h
+#define __THREAD_QUEUE_DATA_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/chain.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/states.h>
+
+/*
+ * The following enumerated type details all of the disciplines
+ * supported by the Thread Queue Handler.
+ */
+
+typedef enum {
+ THREAD_QUEUE_DISCIPLINE_FIFO, /* FIFO queue discipline */
+ THREAD_QUEUE_DISCIPLINE_PRIORITY /* PRIORITY queue discipline */
+} Thread_queue_Disciplines;
+
+/*
+ * The following enumerated types indicate what happened while the thread
+ * queue was in the synchronization window.
+ */
+
+typedef enum {
+ THREAD_QUEUE_SYNCHRONIZED,
+ THREAD_QUEUE_NOTHING_HAPPENED,
+ THREAD_QUEUE_TIMEOUT,
+ THREAD_QUEUE_SATISFIED
+} Thread_queue_States;
+
+/*
+ * The following constants are used to manage the priority queues.
+ *
+ * There are four chains used to maintain a priority -- each chain
+ * manages a distinct set of task priorities. The number of chains
+ * is determined by TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS.
+ * The following set must be consistent.
+ *
+ * The set below configures 4 headers -- each contains 64 priorities.
+ * Header x manages priority range (x*64) through ((x*64)+63). If
+ * the priority is more than half way through the priority range it
+ * is in, then the search is performed from the rear of the chain.
+ * This halves the search time to find the insertion point.
+ */
+
+#define TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS 4
+#define TASK_QUEUE_DATA_PRIORITIES_PER_HEADER 64
+#define TASK_QUEUE_DATA_REVERSE_SEARCH_MASK 0x20
+
+typedef struct {
+ union {
+ Chain_Control Fifo; /* FIFO discipline list */
+ Chain_Control Priority[TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS];
+ /* priority discipline list */
+ } Queues;
+ Thread_queue_States sync_state; /* 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;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/tqdata.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/userext.h b/c/src/exec/score/headers/userext.h
new file mode 100644
index 0000000000..4b4290ab4d
--- /dev/null
+++ b/c/src/exec/score/headers/userext.h
@@ -0,0 +1,213 @@
+/* userext.h
+ *
+ * This include file contains all information about user extensions. This
+ * Handler provides mechanisms which can be used to initialize and manipulate
+ * all user extensions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_h
+#define __USER_EXTENSIONS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/interr.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/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_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_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;
+ User_extensions_Table Callouts;
+} User_extensions_Control;
+
+/*
+ * The following contains the static extension set which may be
+ * configured by the application.
+ */
+
+SCORE_EXTERN User_extensions_Control _User_extensions_Initial;
+
+/*
+ * The following is used to manage the list of active extensions.
+ */
+
+SCORE_EXTERN Chain_Control _User_extensions_List;
+
+/*
+ * _User_extensions_Thread_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread creation operate.
+ */
+
+boolean _User_extensions_Thread_create (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread deletion operation.
+ */
+
+void _User_extensions_Thread_delete (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_start
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread start operation.
+ */
+
+void _User_extensions_Thread_start (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_restart
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread restart operation.
+ */
+
+void _User_extensions_Thread_restart (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_begin
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a thread begins.
+ */
+
+void _User_extensions_Thread_begin (
+ Thread_Control *executing
+);
+
+/*
+ * _User_extensions_Thread_exitted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a thread exits.
+ */
+
+void _User_extensions_Thread_exitted (
+ Thread_Control *executing
+);
+
+/*
+ * _User_extensions_Fatal
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension invoked
+ * when a fatal error occurs.
+ */
+
+void _User_extensions_Fatal (
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ unsigned32 the_error
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/userext.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/watchdog.h b/c/src/exec/score/headers/watchdog.h
new file mode 100644
index 0000000000..697ae9bcc0
--- /dev/null
+++ b/c/src/exec/score/headers/watchdog.h
@@ -0,0 +1,194 @@
+/* watchdog.h
+ *
+ * This include file contains all the constants and structures associated
+ * with watchdog timers. This Handler provides mechanisms which can be
+ * used to initialize and manipulate watchdog timers.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_h
+#define __WATCHDOG_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+
+/*
+ * The following type defines the control block used to manage
+ * intervals.
+ */
+
+typedef unsigned32 Watchdog_Interval;
+
+/*
+ * The following types define a pointer to a watchdog service routine.
+ */
+
+typedef void Watchdog_Service_routine;
+
+typedef Watchdog_Service_routine ( *Watchdog_Service_routine_entry )(
+ Objects_Id,
+ void *
+ );
+
+/*
+ * Constant for indefinite wait. (actually an illegal interval)
+ */
+
+#define WATCHDOG_NO_TIMEOUT 0
+
+/*
+ * The following enumerated type lists the states in which a
+ * watchdog timer may be at any given time.
+ */
+
+typedef enum {
+ WATCHDOG_INACTIVE, /* off all chains */
+ WATCHDOG_BEING_INSERTED, /* off all chains, searching for insertion point */
+ WATCHDOG_ACTIVE, /* on chain, allowed to fire */
+ WATCHDOG_REMOVE_IT /* on chain, remove without firing if expires */
+} Watchdog_States;
+
+/*
+ * The following enumerated type details the manner in which
+ * a watchdog chain may be adjusted by the Watchdog_Adjust
+ * routine. The direction indicates a movement FORWARD
+ * or BACKWARD in time.
+ */
+
+typedef enum {
+ WATCHDOG_FORWARD, /* adjust delta value forward */
+ WATCHDOG_BACKWARD /* adjust delta value backward */
+} Watchdog_Adjust_directions;
+
+/*
+ * The following record defines the control block used
+ * to manage each watchdog timer.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ Watchdog_States state;
+ Watchdog_Interval initial;
+ Watchdog_Interval delta_interval;
+ Watchdog_Interval start_time;
+ Watchdog_Interval stop_time;
+ Watchdog_Service_routine_entry routine;
+ Objects_Id id;
+ void *user_data;
+} Watchdog_Control;
+
+/*
+ * The following are used for synchronization purposes
+ * during an insert on a watchdog delta chain.
+ */
+
+SCORE_EXTERN volatile unsigned32 _Watchdog_Sync_level;
+SCORE_EXTERN volatile unsigned32 _Watchdog_Sync_count;
+
+/*
+ * The following contains the number of ticks since the
+ * system was booted.
+ */
+
+SCORE_EXTERN Watchdog_Interval _Watchdog_Ticks_since_boot;
+
+/*
+ * The following defines the watchdog chains which are managed
+ * on ticks and second boundaries.
+ */
+
+SCORE_EXTERN Chain_Control _Watchdog_Ticks_chain;
+SCORE_EXTERN Chain_Control _Watchdog_Seconds_chain;
+
+/*
+ * _Watchdog_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the watchdog handler. The watchdog
+ * synchronization flag is initialized and the watchdog chains are
+ * initialized and emptied.
+ */
+
+void _Watchdog_Handler_initialization( void );
+
+/*
+ * _Watchdog_Remove
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes THE_WATCHDOG from the watchdog chain on which
+ * it resides and returns the state THE_WATCHDOG timer was in.
+ */
+
+Watchdog_States _Watchdog_Remove (
+ Watchdog_Control *the_watchdog
+);
+
+/*
+ * _Watchdog_Adjust
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the HEADER watchdog chain in the forward
+ * or backward DIRECTION for UNITS ticks.
+ */
+
+void _Watchdog_Adjust (
+ Chain_Control *header,
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+);
+
+/*
+ * _Watchdog_Insert
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the HEADER watchdog chain
+ * for a time of UNITS. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ *
+ */
+
+void _Watchdog_Insert (
+ Chain_Control *header,
+ Watchdog_Control *the_watchdog
+);
+
+/*
+ * _Watchdog_Tickle
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at appropriate intervals to update
+ * the HEADER watchdog chain.
+ */
+
+void _Watchdog_Tickle (
+ Chain_Control *header
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/watchdog.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/headers/wkspace.h b/c/src/exec/score/headers/wkspace.h
new file mode 100644
index 0000000000..8de23a6c61
--- /dev/null
+++ b/c/src/exec/score/headers/wkspace.h
@@ -0,0 +1,71 @@
+/* wkspace.h
+ *
+ * This include file contains information related to the
+ * RAM Workspace. This Handler provides mechanisms which can be used to
+ * define, initialize and manipulate the workspace.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_h
+#define __WORKSPACE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/heap.h>
+#include <rtems/score/interr.h>
+
+/*
+ * The following is used to manage the Workspace.
+ *
+ */
+
+SCORE_EXTERN Heap_Control _Workspace_Area; /* executive heap header */
+
+/*
+ * _Workspace_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _Workspace_Handler_initialization(
+ void *starting_address,
+ unsigned32 size
+);
+
+/*
+ * _Workspace_Allocate_or_fatal_error
+ *
+ * DESCRIPTION:
+ *
+ * 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 internal error handler is invoked.
+ */
+
+void *_Workspace_Allocate_or_fatal_error(
+ unsigned32 size
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/wkspace.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/debug.h b/c/src/exec/score/include/rtems/debug.h
new file mode 100644
index 0000000000..37b3a053a5
--- /dev/null
+++ b/c/src/exec/score/include/rtems/debug.h
@@ -0,0 +1,98 @@
+/* debug.h
+ *
+ * This include file contains the information pertaining to the debug
+ * support within RTEMS. It is currently cast in the form of a
+ * Manager since it is externally accessible.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DEBUG_h
+#define __RTEMS_DEBUG_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type is used to manage the debug mask.
+ */
+
+typedef unsigned32 rtems_debug_control;
+
+/*
+ * These constants represent various classes of debugging.
+ */
+
+#define RTEMS_DEBUG_ALL_MASK 0xffffffff
+#define RTEMS_DEBUG_REGION 0x00000001
+
+/*
+ * This variable contains the current debug level.
+ */
+
+SCORE_EXTERN rtems_debug_control _Debug_Level;
+
+/*
+ * _Debug_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Debug_Manager_initialization( void );
+
+/*
+ * rtems_debug_enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables the specified types of debug checks.
+ */
+
+void rtems_debug_enable (
+ rtems_debug_control to_be_enabled
+);
+
+/*
+ * rtems_debug_disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables the specified types of debug checks.
+ */
+
+void rtems_debug_disable (
+ rtems_debug_control to_be_disabled
+);
+
+/*
+ *
+ * _Debug_Is_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the requested debug level is
+ * enabled, and FALSE otherwise.
+ */
+
+boolean _Debug_Is_enabled(
+ rtems_debug_control level
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/Makefile.in b/c/src/exec/score/include/rtems/score/Makefile.in
new file mode 100644
index 0000000000..1be9ef5221
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/Makefile.in
@@ -0,0 +1,47 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# H_FILES that get installed in the rtems/score subdirectoy
+H_PIECES= address apiext bitfield chain context copyrt coremsg coremutex \
+ coresem heap interr isr mpci mppkt object objectmp \
+ priority stack states sysstate thread threadmp threadq \
+ tod tqdata userext watchdog wkspace
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed in the rtems subdirectoy
+SAPI_H_PIECES=debug system
+SAPI_H_FILES=$(SAPI_H_PIECES:%=$(srcdir)/%.h)
+
+# H_FILES that get installed at the top level
+EXTERNAL_H_PIECES =
+EXTERNAL_H_FILES=$(EXTERNAL_H_PIECES:%=$(srcdir)/%.h)
+
+NET_H_PIECES = in
+NET_H_FILES=$(NET_H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES) $(SAPI_H_FILES) $(EXTERNAL_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems/score
+ $(INSTALL) -m 444 ${SAPI_H_FILES} ${PROJECT_RELEASE}/include/rtems/
+ $(INSTALL) -m 444 ${NET_H_FILES} ${PROJECT_RELEASE}/include/netinet
+# $(INSTALL) -m 444 ${EXTERNAL_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/exec/score/include/rtems/score/address.h b/c/src/exec/score/include/rtems/score/address.h
new file mode 100644
index 0000000000..b94483df34
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/address.h
@@ -0,0 +1,31 @@
+/* address.h
+ *
+ * This include file contains the information required to manipulate
+ * physical addresses.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ADDRESSES_h
+#define __RTEMS_ADDRESSES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/apiext.h b/c/src/exec/score/include/rtems/score/apiext.h
new file mode 100644
index 0000000000..ae45348303
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/apiext.h
@@ -0,0 +1,102 @@
+/* apiext.h
+ *
+ * XXX
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __API_EXTENSIONS_h
+#define __API_EXTENSIONS_h
+
+#include <rtems/score/chain.h>
+#include <rtems/score/thread.h>
+
+/*
+ * The control structure which defines the points at which an API
+ * can add an extension to the system initialization thread.
+ */
+
+typedef void (*API_extensions_Predriver_hook)(void);
+typedef void (*API_extensions_Postdriver_hook)(void);
+typedef void (*API_extensions_Postswitch_hook)(
+ Thread_Control *
+ );
+
+
+typedef struct {
+ Chain_Node Node;
+ API_extensions_Predriver_hook predriver_hook;
+ API_extensions_Postdriver_hook postdriver_hook;
+ API_extensions_Postswitch_hook postswitch_hook;
+} API_extensions_Control;
+
+/*
+ * This is the list of API extensions to the system initialization.
+ */
+
+SCORE_EXTERN Chain_Control _API_extensions_List;
+
+/*
+ * _API_extensions_Initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the API extension handler.
+ *
+ */
+
+void _API_extensions_Initialization( void );
+
+/*
+ * _API_extensions_Add
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Add(
+ API_extensions_Control *the_extension
+);
+
+/*
+ * _API_extensions_Run_predriver
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_predriver( void );
+
+/*
+ * _API_extensions_Run_postdriver
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_postdriver( void );
+
+/*
+ * _API_extensions_Run_postswitch
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_postswitch( void );
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/bitfield.h b/c/src/exec/score/include/rtems/score/bitfield.h
new file mode 100644
index 0000000000..da84344af8
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/bitfield.h
@@ -0,0 +1,98 @@
+/* bitfield.h
+ *
+ * This include file contains all bit field manipulation routines.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_BITFIELD_h
+#define __RTEMS_BITFIELD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * _Bitfield_Find_first_bit
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the bit_number of the first bit set
+ * in the specified value. The correspondence between bit_number
+ * and actual bit position is processor dependent. The search for
+ * the first bit set may run from most to least significant bit
+ * or vice-versa.
+ *
+ * NOTE:
+ *
+ * This routine is used when the executing thread is removed
+ * from the ready state and, as a result, its performance has a
+ * significant impact on the performance of the executive as a whole.
+ */
+
+#if ( CPU_USE_GENERIC_BITFIELD_DATA == TRUE )
+
+#ifndef SCORE_INIT
+extern const unsigned char __log2table[256];
+#else
+const unsigned char __log2table[256] = {
+ 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif
+
+#endif
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == FALSE )
+
+#define _Bitfield_Find_first_bit( _value, _bit_number ) \
+ _CPU_Bitfield_Find_first_bit( _value, _bit_number )
+
+#else
+
+/*
+ * The following must be a macro because if a CPU specific version
+ * is used it will most likely use inline assembly.
+ */
+
+#define _Bitfield_Find_first_bit( _value, _bit_number ) \
+ { \
+ register unsigned32 __value = (unsigned32) (_value); \
+ register const unsigned char *__p = __log2table; \
+ \
+ if ( __value < 0x100 ) \
+ (_bit_number) = __p[ __value ] + 8; \
+ else \
+ (_bit_number) = __p[ __value >> 8 ]; \
+ }
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/chain.h b/c/src/exec/score/include/rtems/score/chain.h
new file mode 100644
index 0000000000..a1c8675fae
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/chain.h
@@ -0,0 +1,168 @@
+/* chain.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Doubly Linked Chain Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CHAIN_h
+#define __RTEMS_CHAIN_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.h>
+
+/*
+ * This is used to manage each element (node) which is placed
+ * on a chain.
+ *
+ * NOTE: Typically, a more complicated structure will use the
+ * chain package. The more complicated structure will
+ * include a chain node as the first element in its
+ * control structure. It will then call the chain package
+ * with a pointer to that node element. The node pointer
+ * and the higher level structure start at the same address
+ * so the user can cast the pointers back and forth.
+ *
+ */
+
+typedef struct Chain_Node_struct Chain_Node;
+
+struct Chain_Node_struct {
+ Chain_Node *next;
+ Chain_Node *previous;
+};
+
+/*
+ * This is used to manage a chain. A chain consists of a doubly
+ * linked list of zero or more nodes.
+ *
+ * NOTE: This implementation does not require special checks for
+ * manipulating the first and last elements on the chain.
+ * To accomplish this the chain control structure is
+ * treated as two overlapping chain nodes. The permanent
+ * head of the chain overlays a node structure on the
+ * first and permanent_null fields. The permanent tail
+ * of the chain overlays a node structure on the
+ * permanent_null and last elements of the structure.
+ *
+ */
+
+typedef struct {
+ Chain_Node *first;
+ Chain_Node *permanent_null;
+ Chain_Node *last;
+} Chain_Control;
+
+/*
+ * _Chain_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_chain structure to manage the
+ * contiguous array of number_nodes nodes which starts at
+ * starting_address. Each node is of node_size bytes.
+ *
+ */
+
+void _Chain_Initialize(
+ Chain_Control *the_chain,
+ void *starting_address,
+ unsigned32 number_nodes,
+ unsigned32 node_size
+);
+
+/*
+ * _Chain_Get_first_unprotected
+ */
+
+#ifndef USE_INLINES
+Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+);
+#endif
+
+/*
+ * _Chain_Extract
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It disables interrupts to insure the atomicity of the
+ * extract operation.
+ *
+ */
+
+void _Chain_Extract(
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It disables interrupts to insure the atomicity of the
+ * get operation.
+ *
+ */
+
+Chain_Node *_Chain_Get(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Insert
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It disables interrupts to insure the atomicity
+ * of the extract operation.
+ *
+ */
+
+void _Chain_Insert(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Append
+ *
+ * DESCRIPTION:
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * append operation.
+ *
+ */
+
+void _Chain_Append(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/chain.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/context.h b/c/src/exec/score/include/rtems/score/context.h
new file mode 100644
index 0000000000..4b4ac5960c
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/context.h
@@ -0,0 +1,134 @@
+/* context.h
+ *
+ * This include file contains all information about a context.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CONTEXT_h
+#define __RTEMS_CONTEXT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/cpu.h>
+
+/*
+ * The following constant defines the number of bytes required
+ * to store a full floating point context.
+ */
+
+#define CONTEXT_FP_SIZE CPU_CONTEXT_FP_SIZE
+
+/*
+ * The following variable is set to TRUE when a reschedule operation
+ * has determined that the processor should be taken away from the
+ * currently executing thread and given to the heir thread.
+ */
+
+SCORE_EXTERN volatile boolean _Context_Switch_necessary;
+
+/*
+ * _Context_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes THE_CONTEXT such that the stack
+ * pointer, interrupt level, and entry point are correct for the
+ * thread's initial state.
+ */
+
+#define \
+ _Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp ) \
+ _CPU_Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp )
+
+/*
+ * _Context_Switch
+ *
+ * DESCRIPTION:
+ *
+ * This routine saves the current context into the EXECUTING
+ * context record and restores the context specified by HEIR.
+ */
+
+#define _Context_Switch( _executing, _heir ) \
+ _CPU_Context_switch( _executing, _heir )
+
+/*
+ * _Context_Restart_self
+ *
+ * DESCRIPTION:
+ *
+ * This routine restarts the calling thread by restoring its initial
+ * stack pointer and returning to the thread's entry point.
+ */
+
+#define _Context_Restart_self( _the_context ) \
+ _CPU_Context_Restart_self( _the_context )
+
+/*
+ * _Context_Fp_start
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the starting address of the floating
+ * point context save area. It is assumed that the are reserved
+ * for the floating point save area is large enough.
+ */
+
+#define _Context_Fp_start( _base, _offset ) \
+ _CPU_Context_Fp_start( (_base), (_offset) )
+
+/*
+ * _Context_Initialize_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the floating point context save
+ * area to contain an initial known state.
+ */
+
+#define _Context_Initialize_fp( _fp_area ) \
+ _CPU_Context_Initialize_fp( _fp_area )
+
+/*
+ * _Context_Restore_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine restores the floating point context contained
+ * in the FP_CONTEXT area. It is assumed that the current
+ * floating point context has been saved by a previous invocation
+ * of SAVE_FP.
+ */
+
+#define _Context_Restore_fp( _fp ) \
+ _CPU_Context_restore_fp( _fp )
+
+/*
+ * _Context_Save_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine saves the current floating point context
+ * in the FP_CONTEXT area.
+ */
+
+#define _Context_Save_fp( _fp ) \
+ _CPU_Context_save_fp( _fp )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/copyrt.h b/c/src/exec/score/include/rtems/score/copyrt.h
new file mode 100644
index 0000000000..659f328661
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/copyrt.h
@@ -0,0 +1,42 @@
+/* copyrt.h
+ *
+ * This include file contains the copyright notice for RTEMS
+ * which is included in every binary copy of the executive.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_COPYRIGHT_h
+#define __RTEMS_COPYRIGHT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SCORE_INIT
+
+const char _Copyright_Notice[] =
+"COPYRIGHT (c) 1989-1997.\n\
+On-Line Applications Research Corporation (OAR).\n\
+Copyright assigned to U.S. Government, 1994.\n";
+
+#else
+
+extern const char _Copyright_Notice[];
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/coremsg.h b/c/src/exec/score/include/rtems/score/coremsg.h
new file mode 100644
index 0000000000..a5052a7ffd
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/coremsg.h
@@ -0,0 +1,267 @@
+/* coremsg.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Message queue Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_MESSAGE_QUEUE_h
+#define __RTEMS_CORE_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following type defines the callout which the API provides
+ * to support global/multiprocessor operations on message_queues.
+ */
+
+typedef void ( *CORE_message_queue_API_mp_support_callout )(
+ Thread_Control *,
+ Objects_Id
+ );
+
+/*
+ * The following defines the data types needed to manipulate
+ * the contents of message buffers.
+ *
+ * NOTE: The buffer field is normally longer than a single unsigned32.
+ * but since messages are variable length we just make a ptr to 1.
+ */
+
+typedef struct {
+ unsigned32 size;
+ unsigned32 buffer[1];
+} CORE_message_queue_Buffer;
+
+/*
+ * The following records define the organization of a message
+ * buffer.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ CORE_message_queue_Buffer Contents;
+} CORE_message_queue_Buffer_control;
+
+/*
+ * Blocking disciplines for a message_queue.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO,
+ CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY
+} CORE_message_queue_Disciplines;
+
+/*
+ * The following enumerated type details the modes in which a message
+ * may be submitted to a message queue. The message may be posted
+ * in a send or urgent fashion.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_SEND_REQUEST = 0,
+ CORE_MESSAGE_QUEUE_URGENT_REQUEST = 1
+} CORE_message_queue_Submit_types;
+
+/*
+ * Core Message queue handler return statuses.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL,
+ CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE,
+ CORE_MESSAGE_QUEUE_STATUS_TOO_MANY,
+ CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED,
+ CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT,
+ CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED,
+ CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
+} CORE_message_queue_Status;
+
+/*
+ * The following defines the control block used to manage the
+ * attributes of each message queue.
+ */
+
+typedef struct {
+ CORE_message_queue_Disciplines discipline;
+} CORE_message_queue_Attributes;
+
+/*
+ * The following defines the type for a Notification handler. A notification
+ * handler is invoked when the message queue makes a 0->1 transition on
+ * pending messages.
+ */
+
+typedef void (*CORE_message_queue_Notify_Handler)( void * );
+
+/*
+ * The following defines the control block used to manage each
+ * counting message_queue.
+ */
+
+typedef struct {
+ Thread_queue_Control Wait_queue;
+ CORE_message_queue_Attributes Attributes;
+ unsigned32 maximum_pending_messages;
+ unsigned32 number_of_pending_messages;
+ unsigned32 maximum_message_size;
+ Chain_Control Pending_messages;
+ CORE_message_queue_Buffer *message_buffers;
+ CORE_message_queue_Notify_Handler notify_handler;
+ void *notify_argument;
+ Chain_Control Inactive_messages;
+} CORE_message_queue_Control;
+
+/*
+ * _CORE_message_queue_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the message_queue based on the parameters passed.
+ */
+
+boolean _CORE_message_queue_Initialize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Classes the_class,
+ CORE_message_queue_Attributes *the_message_queue_attributes,
+ unsigned32 maximum_pending_messages,
+ unsigned32 maximum_message_size,
+ Thread_queue_Extract_callout proxy_extract_callout
+);
+
+/*
+ * _CORE_message_queue_Close
+ *
+ * DESCRIPTION:
+ *
+ * This function closes a message by returning all allocated space and
+ * flushing the message_queue's task wait queue.
+ */
+
+void _CORE_message_queue_Close(
+ CORE_message_queue_Control *the_message_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ *
+ * _CORE_message_queue_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This function flushes the message_queue's task wait queue. The number
+ * messages flushed from the queue is returned.
+ *
+ */
+
+unsigned32 _CORE_message_queue_Flush(
+ CORE_message_queue_Control *the_message_queue
+);
+
+/*
+ * _CORE_message_queue_Flush_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine flushes all outstanding messages and returns
+ * them to the inactive message chain.
+ */
+
+unsigned32 _CORE_message_queue_Flush_support(
+ CORE_message_queue_Control *the_message_queue
+);
+
+/*
+ *
+ * _CORE_message_queue_Broadcast
+ *
+ * DESCRIPTION:
+ *
+ * This function sends a message for every thread waiting on the queue and
+ * returns the number of threads made ready by the message.
+ *
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Broadcast(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ unsigned32 *count
+);
+
+/*
+ *
+ * _CORE_message_queue_Submit
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the send and urgent message functions. It
+ * processes a message that is to be submitted to the designated
+ * message queue. The message will either be processed as a
+ * send message which it will be inserted at the rear of the queue
+ * or it will be processed as an urgent message which will be inserted
+ * at the front of the queue.
+ *
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Submit(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ CORE_message_queue_Submit_types submit_type
+);
+
+/*
+ *
+ * _CORE_message_queue_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This kernel routine dequeues a message, copies the message buffer to
+ * a given destination buffer, and frees the message buffer to the
+ * inactive message pool. The thread will be blocked if wait is TRUE,
+ * otherwise an error will be given to the thread if no messages are available.
+ *
+ */
+
+void _CORE_message_queue_Seize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coremsg.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/score/include/rtems/score/coremutex.h b/c/src/exec/score/include/rtems/score/coremutex.h
new file mode 100644
index 0000000000..9f3ad2b46d
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/coremutex.h
@@ -0,0 +1,172 @@
+/* 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_MUTEX_h
+#define __RTEMS_CORE_MUTEX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/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_CEILING_VIOLATED
+} 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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coremutex.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/score/include/rtems/score/coresem.h b/c/src/exec/score/include/rtems/score/coresem.h
new file mode 100644
index 0000000000..f98673d514
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/coresem.h
@@ -0,0 +1,156 @@
+/* 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_COUNTING_SEMAPHORE_h
+#define __RTEMS_CORE_COUNTING_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coresem.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/exec/score/include/rtems/score/heap.h b/c/src/exec/score/include/rtems/score/heap.h
new file mode 100644
index 0000000000..a5a8d3f0c2
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/heap.h
@@ -0,0 +1,226 @@
+/* heap.h
+ *
+ * This include file contains the information pertaining to the Heap
+ * Handler. A heap is a doubly linked list of variable size
+ * blocks which are allocated using the first fit method. Garbage
+ * collection is performed each time a block is returned to the heap by
+ * coalescing neighbor blocks. Control information for both allocated
+ * and unallocated blocks is contained in the heap space. A heap header
+ * contains control information for the heap.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_HEAP_h
+#define __RTEMS_HEAP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Status codes for heap_extend
+ */
+
+typedef enum {
+ HEAP_EXTEND_SUCCESSFUL,
+ HEAP_EXTEND_ERROR,
+ HEAP_EXTEND_NOT_IMPLEMENTED
+} Heap_Extend_status;
+
+/*
+ * Constants used in the size/used field of each heap block to
+ * indicate when a block is free or in use.
+ */
+
+#define HEAP_BLOCK_USED 1 /* indicates block is in use */
+#define HEAP_BLOCK_FREE 0 /* indicates block is free */
+
+/*
+ * The size/used field value for the dummy front and back flags.
+ */
+
+#define HEAP_DUMMY_FLAG (0 + HEAP_BLOCK_USED)
+
+/*
+ * The following constants reflect various requirements of the
+ * heap data structures which impact the management of a heap.
+ *
+ * NOTE: Because free block overhead is greater than used block
+ * overhead AND a portion of the allocated space is from
+ * the extra free block overhead, the absolute lower bound
+ * of the minimum fragment size is equal to the size of
+ * the free block overhead.
+ */
+
+#define HEAP_OVERHEAD \
+ (sizeof( unsigned32 ) * 2) /* size dummy first and last blocks */
+#define HEAP_BLOCK_USED_OVERHEAD \
+ (sizeof( void * ) * 2) /* num bytes overhead in used block */
+#define HEAP_MINIMUM_SIZE \
+ (HEAP_OVERHEAD + sizeof (Heap_Block))
+ /* min number of bytes the user may */
+ /* specify for the heap size */
+
+/*
+ * The following defines the data structure used to manage
+ * individual blocks in a heap. When the block is allocated, the
+ * next and previous fields are not used by the Heap Handler
+ * and thus the address returned for the block starts at
+ * the address of the next field.
+ *
+ * NOTE: The next and previous pointers are only valid when the
+ * block is free. Caution must be exercised to insure that
+ * allocated blocks are large enough to contain them and
+ * that they are not accidentally overwritten when the
+ * block is actually allocated.
+ */
+
+typedef struct Heap_Block_struct Heap_Block;
+
+struct Heap_Block_struct {
+ unsigned32 back_flag; /* size and status of prev block */
+ unsigned32 front_flag; /* size and status of block */
+ Heap_Block *next; /* pointer to next block */
+ Heap_Block *previous; /* pointer to previous block */
+};
+
+/*
+ * The following defines the control block used to manage each heap.
+ *
+ * NOTE:
+ *
+ * This structure is layed out such that it can be used a a dummy
+ * first and last block on the free block chain. The extra padding
+ * insures the dummy last block is the correct size.
+ *
+ * The first Heap_Block starts at first while the second starts at
+ * final. This is effectively the same trick as is used in the Chain
+ * Handler.
+ */
+
+typedef struct {
+ Heap_Block *start; /* first valid block address in heap */
+ Heap_Block *final; /* last valid block address in heap */
+
+ Heap_Block *first; /* pointer to first block in heap */
+ Heap_Block *permanent_null; /* always NULL pointer */
+ Heap_Block *last; /* pointer to last block in heap */
+ unsigned32 page_size; /* allocation unit */
+ unsigned32 reserved;
+} Heap_Control;
+
+/*
+ * _Heap_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_heap record to manage the
+ * contiguous heap of size bytes which starts at starting_address.
+ * Blocks of memory are allocated from the heap in multiples of
+ * page_size byte units.
+ */
+
+unsigned32 _Heap_Initialize(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 page_size
+);
+
+/*
+ * _Heap_Extend
+ *
+ * DESCRIPTION:
+ *
+ * This routine grows the_heap memory area using the size bytes which
+ * begin at starting_address.
+ */
+
+Heap_Extend_status _Heap_Extend(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 *amount_extended
+);
+
+/*
+ * _Heap_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a block of size bytes from
+ * the_heap. If insufficient memory is free in the_heap to allocate
+ * a block of the requested size, then NULL is returned.
+ */
+
+void *_Heap_Allocate(
+ Heap_Control *the_heap,
+ unsigned32 size
+);
+
+/*
+ * _Heap_Size_of_user_area
+ *
+ * DESCRIPTION:
+ *
+ * This kernel routine sets size to the size of the given heap block.
+ * It returns TRUE if the starting_address is in the heap, and FALSE
+ * otherwise.
+ */
+
+boolean _Heap_Size_of_user_area(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 *size
+);
+
+/*
+ * _Heap_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the block of memory which begins
+ * at starting_address to the_heap. Any coalescing which is
+ * possible with the freeing of this routine is performed.
+ */
+
+boolean _Heap_Free(
+ Heap_Control *the_heap,
+ void *start_address
+);
+
+/*
+ * _Heap_Walk
+ *
+ * DESCRIPTION:
+ *
+ * This routine walks the heap to verify its integrity.
+ */
+
+void _Heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/heap.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/interr.h b/c/src/exec/score/include/rtems/score/interr.h
new file mode 100644
index 0000000000..b322aefe73
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/interr.h
@@ -0,0 +1,95 @@
+/* interr.h
+ *
+ * This include file contains constants and prototypes related
+ * to the Internal Error Handler.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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_ERROR_POSIX_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_ERROR_BAD_STACK_HOOK
+} 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.
+ */
+
+SCORE_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/c/src/exec/score/include/rtems/score/isr.h b/c/src/exec/score/include/rtems/score/isr.h
new file mode 100644
index 0000000000..4e6c5c6f94
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/isr.h
@@ -0,0 +1,224 @@
+/* isr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the management of processor interrupt levels. This handler
+ * supports interrupt critical sections, vectoring of user interrupt
+ * handlers, nesting of interrupts, and manipulating interrupt levels.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_h
+#define __ISR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * the interrupt level portion of the status register.
+ */
+
+typedef unsigned32 ISR_Level;
+
+/*
+ * The following type defines the type used to manage the vectors.
+ */
+
+typedef unsigned32 ISR_Vector_number;
+
+/*
+ * Return type for ISR Handler
+ */
+
+typedef void ISR_Handler;
+
+/*
+ * Pointer to an ISR Handler
+ */
+
+typedef ISR_Handler ( *ISR_Handler_entry )(
+ ISR_Vector_number
+ );
+/*
+ * This constant promotes out the number of vectors truly supported by
+ * the current CPU being used. This is usually the number of distinct vectors
+ * the cpu can vector.
+ */
+
+#define ISR_NUMBER_OF_VECTORS CPU_INTERRUPT_NUMBER_OF_VECTORS
+
+/*
+ * This constant promotes out the highest valid interrupt vector number.
+ */
+
+#define ISR_INTERRUPT_MAXIMUM_VECTOR_NUMBER CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER
+
+/*
+ * The following is TRUE if signals have been sent to the currently
+ * executing thread by an ISR handler.
+ */
+
+SCORE_EXTERN boolean _ISR_Signals_to_thread_executing;
+
+/*
+ * The following contains the interrupt service routine nest level.
+ * When this variable is zero, a thread is executing.
+ */
+
+SCORE_EXTERN unsigned32 _ISR_Nest_level;
+
+/*
+ * The following declares the Vector Table. Application
+ * interrupt service routines are vectored by the ISR Handler via this table.
+ */
+
+SCORE_EXTERN ISR_Handler_entry _ISR_Vector_table[ ISR_NUMBER_OF_VECTORS ];
+
+/*
+ * _ISR_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _ISR_Handler_initialization ( void );
+
+/*
+ * _ISR_Disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables all interrupts so that a critical section
+ * of code can be executing without being interrupted. Upon return,
+ * the argument _level will contain the previous interrupt mask level.
+ */
+
+#define _ISR_Disable( _level ) \
+ _CPU_ISR_Disable( _level )
+
+/*
+ * _ISR_Enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables interrupts to the previous interrupt mask
+ * LEVEL. It is used at the end of a critical section of code to
+ * enable interrupts so they can be processed again.
+ */
+
+#define _ISR_Enable( _level ) \
+ _CPU_ISR_Enable( _level )
+
+/*
+ * _ISR_Flash
+ *
+ * DESCRIPTION:
+ *
+ * This routine temporarily enables interrupts to the previous
+ * interrupt mask level and then disables all interrupts so that
+ * the caller can continue into the second part of a critical
+ * section. This routine is used to temporarily enable interrupts
+ * during a long critical section. It is used in long sections of
+ * critical code when a point is reached at which interrupts can
+ * be temporarily enabled. Deciding where to flash interrupts
+ * in a long critical section is often difficult and the point
+ * must be selected with care to insure that the critical section
+ * properly protects itself.
+ */
+
+#define _ISR_Flash( _level ) \
+ _CPU_ISR_Flash( _level )
+
+/*
+ * _ISR_Install_vector
+ *
+ * DESCRIPTION:
+ *
+ * This routine installs new_handler as the interrupt service routine
+ * for the specified vector. The previous interrupt service routine is
+ * returned as old_handler.
+ */
+
+#define _ISR_Install_vector( _vector, _new_handler, _old_handler ) \
+ _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:
+ *
+ * This routine sets the current interrupt level to that specified
+ * by new_level. The new interrupt level is effective when the
+ * routine exits.
+ */
+
+#define _ISR_Set_level( _new_level ) \
+ _CPU_ISR_Set_level( _new_level )
+
+/*
+ * _ISR_Handler
+ *
+ * DESCRIPTION:
+ *
+ * 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
+ * interrupt service routine returns control to this routine, it
+ * will determine if a thread dispatch is necessary. If so, it will
+ * insure that the necessary thread scheduling operations are
+ * performed when the outermost interrupt service routine exits.
+ *
+ * NOTE: Implemented in assembly language.
+ */
+
+void _ISR_Handler( void );
+
+/*
+ * _ISR_Dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine provides a wrapper so that the routine
+ * _Thread_Dispatch can be invoked when a reschedule is necessary
+ * at the end of the outermost interrupt service routine. This
+ * wrapper is necessary to establish the processor context needed
+ * by _Thread_Dispatch and to save the processor context which is
+ * corrupted by _Thread_Dispatch. This context typically consists
+ * of registers which are not preserved across routine invocations.
+ *
+ * NOTE: Implemented in assembly language.
+ */
+
+void _ISR_Dispatch( void );
+
+#include <rtems/score/isr.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/mpci.h b/c/src/exec/score/include/rtems/score/mpci.h
new file mode 100644
index 0000000000..1d5578b21e
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/mpci.h
@@ -0,0 +1,412 @@
+/* mpci.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the MPCI layer. It provides mechanisms to utilize packets.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MPCI_h
+#define __MPCI_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/coresem.h>
+
+/*
+ * The following constants define the stack size requirements for
+ * the system threads.
+ */
+
+#define MPCI_RECEIVE_SERVER_STACK_SIZE \
+ ( STACK_MINIMUM_SIZE + \
+ CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK + \
+ _CPU_Table.extra_mpci_receive_server_stack \
+ )
+
+/*
+ * The following defines the node number used when a broadcast is desired.
+ */
+
+#define MPCI_ALL_NODES 0
+
+/*
+ * For packets associated with requests that don't already have a timeout,
+ * use the one specified by this MPCI driver. The value specified by
+ * the MPCI driver sets an upper limit on how long a remote request
+ * should take to complete.
+ */
+
+#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 * );
+
+/*
+ * The following enumerated type defines the list of
+ * internal MP operations.
+ */
+
+typedef enum {
+ MPCI_PACKETS_SYSTEM_VERIFY = 0
+} MPCI_Internal_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote event operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ MPCI_Internal_Remote_operations operation;
+ unsigned32 maximum_nodes;
+ unsigned32 maximum_global_objects;
+} MPCI_Internal_packet;
+
+/*
+ * This is the core semaphore which the MPCI Receive Server blocks on.
+ */
+
+SCORE_EXTERN CORE_semaphore_Control _MPCI_Semaphore;
+/*
+ * The following thread queue is used to maintain a list of tasks
+ * which currently have outstanding remote requests.
+ */
+
+SCORE_EXTERN Thread_queue_Control _MPCI_Remote_blocked_threads;
+
+/*
+ * The following define the internal pointers to the user's
+ * configuration information.
+ */
+
+SCORE_EXTERN MPCI_Control *_MPCI_table;
+
+/*
+ * The following points to the MPCI Receive Server.
+ */
+
+SCORE_EXTERN Thread_Control *_MPCI_Receive_server_tcb;
+
+/*
+ * The following table contains the process packet routines provided
+ * by each object that supports MP operations.
+ */
+
+SCORE_EXTERN MPCI_Packet_processor
+ _MPCI_Packet_processors[MP_PACKET_CLASSES_LAST+1];
+
+/*
+ * _MPCI_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table,
+ unsigned32 timeout_status
+);
+
+/*
+ * _MPCI_Create_server
+ *
+ * DESCRIPTION:
+ *
+ * This routine creates the packet receive server used in MP systems.
+ */
+
+void _MPCI_Create_server( void );
+
+/*
+ * _MPCI_Initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the MPCI driver by
+ * invoking the user provided MPCI initialization callout.
+ */
+
+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_class,
+ MPCI_Packet_processor the_packet_processor
+
+);
+
+/*
+ * _MPCI_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+MP_packet_Prefix *_MPCI_Get_packet ( void );
+
+/*
+ * _MPCI_Return_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a packet by invoking the user provided
+ * MPCI return packet callout.
+ */
+
+void _MPCI_Return_packet (
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a process packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_process_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a request packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+unsigned32 _MPCI_Send_request_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet,
+ States_Control extra_state
+);
+
+/*
+ * _MPCI_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a response packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_response_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Receive_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine receives a packet by invoking the user provided
+ * MPCI receive callout.
+ */
+
+MP_packet_Prefix *_MPCI_Receive_packet ( void );
+
+/*
+ * _MPCI_Process_response
+ *
+ * DESCRIPTION:
+ *
+ * This routine obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+Thread_Control *_MPCI_Process_response (
+ MP_packet_Prefix *the_packet
+);
+
+/*PAGE
+ *
+ * _MPCI_Receive_server
+ *
+ */
+
+Thread _MPCI_Receive_server(
+ unsigned32 ignored
+);
+
+/*PAGE
+ *
+ * _MPCI_Announce
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _MPCI_Announce ( void );
+
+/*
+ * _MPCI_Internal_packets_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _MPCI_Internal_packets_Send_process_packet (
+ MPCI_Internal_Remote_operations operation
+);
+
+/*
+ * _MPCI_Internal_packets_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ *
+ * This routine is not needed since there are no request
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ *
+ * This routine is not needed since there are no response
+ * packets to be sent by this manager.
+ */
+
+/*
+ *
+ * _MPCI_Internal_packets_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _MPCI_Internal_packets_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _MPCI_Internal_packets_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to obtain a internal threads mp packet.
+ */
+
+ MPCI_Internal_packet *_MPCI_Internal_packets_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/mppkt.h b/c/src/exec/score/include/rtems/score/mppkt.h
new file mode 100644
index 0000000000..2e98357afe
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/mppkt.h
@@ -0,0 +1,101 @@
+/* mppkt.h
+ *
+ * This package is the specification for the Packet Handler.
+ * 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MP_PACKET_h
+#define __MP_PACKET_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the packet classes.
+ *
+ * NOTE: In general, each class corresponds to a manager
+ * which supports global operations. Each manager
+ * defines the set of supported operations.
+ */
+
+typedef enum {
+ MP_PACKET_MPCI_INTERNAL = 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_MPCI_INTERNAL
+#define MP_PACKET_CLASSES_LAST MP_PACKET_SIGNAL
+
+/*
+ * The following record contains the prefix for every packet
+ * 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
+ * encountered yet (i960CA).
+ */
+
+typedef struct {
+ MP_packet_Classes the_class;
+ Objects_Id id;
+ Objects_Id source_tid;
+ Priority_Control source_priority;
+ unsigned32 return_code;
+ unsigned32 length;
+ unsigned32 to_convert;
+ Watchdog_Interval timeout;
+} MP_packet_Prefix;
+
+/*
+ * An MPCI must support packets of at least this size.
+ */
+
+#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
+ * MP_PACKET_MINIMUN_HETERO_CONVERSION unsigned32's, some of the "extra" data
+ * may a user message buffer which is not automatically endian swapped.
+ */
+
+#define MP_PACKET_MINIMUN_HETERO_CONVERSION \
+ ( sizeof( MP_packet_Prefix ) / sizeof( unsigned32 ) )
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/mppkt.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/object.h b/c/src/exec/score/include/rtems/score/object.h
new file mode 100644
index 0000000000..7364639391
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/object.h
@@ -0,0 +1,397 @@
+/* object.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Object Handler. This Handler provides mechanisms which
+ * can be used to initialize and manipulate all objects which have
+ * ids.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_h
+#define __OBJECTS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/chain.h>
+
+/*
+ * The following type defines the control block used to manage
+ * object names.
+ */
+
+typedef void * Objects_Name;
+
+/*
+ * Space for object names is allocated in multiples of this.
+ *
+ * NOTE: Must be a power of 2. Matches the name manipulation routines.
+ */
+
+#define OBJECTS_NAME_ALIGNMENT sizeof( unsigned32 )
+
+/*
+ * Functions which compare names are prototyped like this.
+ */
+
+typedef boolean (*Objects_Name_comparators)(
+ void * /* name_1 */,
+ void * /* name_2 */,
+ unsigned32 /* length */
+);
+
+/*
+ * The following type defines the control block used to manage
+ * object IDs. The format is as follows (0=LSB):
+ *
+ * Bits 0 .. 15 = index
+ * Bits 16 .. 25 = node
+ * Bits 26 .. 31 = class
+ */
+
+typedef unsigned32 Objects_Id;
+
+#define OBJECTS_INDEX_START_BIT 0
+#define OBJECTS_NODE_START_BIT 16
+#define OBJECTS_CLASS_START_BIT 26
+
+#define OBJECTS_INDEX_MASK 0x0000ffff
+#define OBJECTS_NODE_MASK 0x03ff0000
+#define OBJECTS_CLASS_MASK 0xfc000000
+
+#define OBJECTS_INDEX_VALID_BITS 0x0000ffff
+#define OBJECTS_NODE_VALID_BITS 0x000003ff
+#define OBJECTS_CLASS_VALID_BITS 0x000000cf
+
+/*
+ * This enumerated type is used in the class field of the object ID.
+ */
+
+typedef enum {
+ OBJECTS_NO_CLASS = 0,
+ OBJECTS_INTERNAL_THREADS = 1,
+ OBJECTS_RTEMS_TASKS = 2,
+ OBJECTS_POSIX_THREADS = 3,
+ OBJECTS_RTEMS_TIMERS = 4,
+ OBJECTS_RTEMS_SEMAPHORES = 5,
+ OBJECTS_RTEMS_MESSAGE_QUEUES = 6,
+ OBJECTS_RTEMS_PARTITIONS = 7,
+ OBJECTS_RTEMS_REGIONS = 8,
+ OBJECTS_RTEMS_PORTS = 9,
+ OBJECTS_RTEMS_PERIODS = 10,
+ OBJECTS_RTEMS_EXTENSIONS = 11,
+ OBJECTS_POSIX_KEYS = 12,
+ OBJECTS_POSIX_INTERRUPTS = 13,
+ OBJECTS_POSIX_MESSAGE_QUEUES = 14,
+ OBJECTS_POSIX_MUTEXES = 15,
+ OBJECTS_POSIX_SEMAPHORES = 16,
+ OBJECTS_POSIX_CONDITION_VARIABLES = 17
+} Objects_Classes;
+
+#define OBJECTS_CLASSES_FIRST OBJECTS_NO_CLASS
+#define OBJECTS_CLASSES_LAST OBJECTS_POSIX_CONDITION_VARIABLES
+#define OBJECTS_CLASSES_FIRST_THREAD_CLASS OBJECTS_INTERNAL_THREADS
+#define OBJECTS_CLASSES_LAST_THREAD_CLASS OBJECTS_POSIX_THREADS
+
+/*
+ * This enumerated type lists the locations which may be returned
+ * by _Objects_Get. These codes indicate the success of locating
+ * an object with the specified ID.
+ */
+
+typedef enum {
+ OBJECTS_LOCAL = 0, /* object is local */
+ OBJECTS_REMOTE = 1, /* object is remote */
+ OBJECTS_ERROR = 2 /* id was invalid */
+} Objects_Locations;
+
+/*
+ * The following defines the Object Control Block used to manage
+ * each object local to this node.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ Objects_Id id;
+ Objects_Name name;
+} Objects_Control;
+
+/*
+ * The following defines the structure for the information used to
+ * manage each class of objects.
+ */
+
+typedef struct {
+ Objects_Classes the_class; /* Class of this object */
+ Objects_Id minimum_id; /* minimum valid id of this type */
+ Objects_Id maximum_id; /* maximum valid id of this type */
+ unsigned32 maximum; /* maximum number of objects */
+ Objects_Control **local_table; /* table of local object pointers */
+ Objects_Name *name_table; /* table of local object names */
+ Chain_Control *global_table; /* pointer to global table */
+ Chain_Control Inactive; /* chain of inactive ctl blocks */
+ boolean is_string; /* TRUE if names are strings */
+ unsigned32 name_length; /* maximum length of names */
+ boolean is_thread; /* TRUE if these are threads */
+ /* irregardless of API */
+} Objects_Information;
+
+/*
+ * The following defines the data storage which contains the
+ * node number of the local node.
+ */
+
+SCORE_EXTERN unsigned32 _Objects_Local_node;
+SCORE_EXTERN unsigned32 _Objects_Maximum_nodes;
+
+/*
+ * The following is the list of information blocks for each object
+ * class. From the ID, we can go to one of these information blocks,
+ * and obtain a pointer to the appropriate object control block.
+ */
+
+SCORE_EXTERN Objects_Information
+ *_Objects_Information_table[OBJECTS_CLASSES_LAST + 1];
+
+/*
+ * The following defines the constant which may be used
+ * with _Objects_Get to manipulate the calling task.
+ *
+ */
+
+#define OBJECTS_ID_OF_SELF ((Objects_Id) 0)
+
+/*
+ * The following define the constants which may be used in name searches.
+ */
+
+#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 OBJECTS_ID_INITIAL_INDEX (0)
+#define OBJECTS_ID_FINAL_INDEX (0xffff)
+
+#define OBJECTS_ID_INITIAL(_class, _node) \
+ _Objects_Build_id( (_class), (_node), OBJECTS_ID_INITIAL_INDEX )
+
+#define OBJECTS_ID_FINAL ((Objects_Id)~0)
+
+/*
+ * _Objects_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This function performs the initialization necessary for this handler.
+ *
+ */
+
+void _Objects_Handler_initialization(
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+);
+
+/*
+ * _Objects_Initialize_information
+ *
+ * DESCRIPTION:
+ *
+ * This function initializes an object class information record.
+ * SUPPORTS_GLOBAL is TRUE if the object class supports global
+ * objects, and FALSE otherwise. Maximum indicates the number
+ * of objects required in this class and size indicates the size
+ * in bytes of each control block for this object class. The
+ * name length and string designator are also set. In addition,
+ * the class may be a task, therefore this information is also included.
+ */
+
+void _Objects_Initialize_information (
+ Objects_Information *information,
+ Objects_Classes the_class,
+ boolean supports_global,
+ unsigned32 maximum,
+ unsigned32 size,
+ boolean is_string,
+ unsigned32 maximum_name_length,
+ boolean is_task
+);
+
+/*
+ * _Objects_Clear_name
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Clear_name(
+ void *name,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Copy_name_string
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_string(
+ void *source,
+ void *destination
+);
+
+/*
+ * _Objects_Copy_name_raw
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_raw(
+ void *source,
+ void *destination,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Compare_name_string
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_string(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Compare_name_raw
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_raw(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+);
+/*
+ * _Objects_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * This function implements the common portion of the object
+ * identification directives. This directive returns the object
+ * id associated with name. If more than one object of this class
+ * is named name, then the object to which the id belongs is
+ * arbitrary. Node indicates the extent of the search for the
+ * id of the object named name. If the object class supports global
+ * objects, then the search can be limited to a particular node
+ * or allowed to encompass all nodes.
+ *
+ */
+
+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,
+ Objects_Id *id
+);
+
+/*
+ * _Objects_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps object ids to object control blocks.
+ * If id corresponds to a local object, then it returns
+ * the_object control pointer which maps to id and location
+ * is set to OBJECTS_LOCAL. If the object class supports global
+ * objects and the object id is global and resides on a remote
+ * node, then location is set to OBJECTS_REMOTE, and the_object
+ * is undefined. Otherwise, location is set to OBJECTS_ERROR
+ * and the_object is undefined.
+ *
+ */
+
+Objects_Control *_Objects_Get (
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _Objects_Get_next
+ *
+ * DESCRIPTION:
+ *
+ * Like _Objects_Get, but is used to find "next" open object.
+ *
+ */
+
+Objects_Control *_Objects_Get_next(
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location_p,
+ Objects_Id *next_id_p
+);
+
+/*
+ * _Objects_Get_information
+ *
+ * DESCRIPTION:
+ *
+ * Returns the information control block for the class of objects
+ * corresponding to this id.
+ */
+
+Objects_Information *_Objects_Get_information(
+ Objects_Id id
+);
+
+/*
+ * Pieces of object.inl are promoted out to the user
+ */
+
+#include <rtems/score/object.inl>
+#include <rtems/score/objectmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/objectmp.h b/c/src/exec/score/include/rtems/score/objectmp.h
new file mode 100644
index 0000000000..d84f4c3caa
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/objectmp.h
@@ -0,0 +1,152 @@
+/* objectmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the manipulation of Global RTEMS Objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_OBJECTS_MP_h
+#define __RTEMS_OBJECTS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This defines the Global Object Control Block used to manage
+ * objects resident on other nodes.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ unsigned32 name; /* XXX broken but works */
+ /* XXX If any API is MP with variable length names .. BOOM!!!! */
+} Objects_MP_Control;
+
+/*
+ * _Objects_MP_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine intializes the inactive global object chain
+ * based on the maximum number of global objects configured.
+ */
+
+void _Objects_MP_Handler_initialization (
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+);
+
+/*PAGE
+ *
+ * _Objects_MP_Open
+ *
+ * DESCRIPTION:
+ *
+ * This routine place the specified global object in the
+ * specified information table.
+ */
+
+void _Objects_MP_Open (
+ Objects_Information *information,
+ Objects_MP_Control *the_global_object,
+ unsigned32 the_name, /* XXX -- wrong for variable */
+ Objects_Id the_id
+);
+
+/*
+ * _Objects_MP_Allocate_and_open
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a global object control block
+ * and places it in the specified information table. If the
+ * allocation fails, then is_fatal_error determines the
+ * error processing actions taken.
+ */
+
+boolean _Objects_MP_Allocate_and_open (
+ Objects_Information *information,
+ unsigned32 the_name, /* XXX -- wrong for variable length */
+ Objects_Id the_id,
+ boolean is_fatal_error
+);
+
+/*
+ * _Objects_MP_Close
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes a global object from the specified
+ * information table and deallocates the global object control block.
+ */
+
+void _Objects_MP_Close (
+ Objects_Information *information,
+ Objects_Id the_id
+);
+
+/*
+ * _Objects_MP_Global_name_search
+ *
+ * DESCRIPTION:
+ *
+ * This routine looks for the object with the_name in the global
+ * object tables indicated by information. It returns the ID of the
+ * object with that name if one is found.
+ */
+
+Objects_Name_to_id_errors _Objects_MP_Global_name_search (
+ Objects_Information *information,
+ Objects_Name the_name,
+ unsigned32 nodes_to_search,
+ Objects_Id *the_id
+);
+
+/*
+ * _Objects_MP_Is_remote
+ *
+ * DESCRIPTION:
+ *
+ * This function searches the Global Object Table managed
+ * by information for the object indicated by ID. If the object
+ * is found, then location is set to objects_remote, otherwise
+ * location is set to objects_error. In both cases, the_object
+ * is undefined.
+ */
+
+void _Objects_MP_Is_remote (
+ Objects_Information *information,
+ Objects_Id the_id,
+ Objects_Locations *location,
+ Objects_Control **the_object
+);
+
+/*
+ * The following chain header is used to manage the set of
+ * inactive global object control blocks.
+ */
+
+SCORE_EXTERN unsigned32 _Objects_MP_Maximum_global_objects;
+SCORE_EXTERN Chain_Control _Objects_MP_Inactive_global_objects;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/objectmp.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/priority.h b/c/src/exec/score/include/rtems/score/priority.h
new file mode 100644
index 0000000000..f1fb7b5f01
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/priority.h
@@ -0,0 +1,97 @@
+/* priority.h
+ *
+ * This include file contains all thread priority manipulation routines.
+ * This Handler provides mechanisms which can be used to
+ * initialize and manipulate thread priorities.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_h
+#define __PRIORITY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * thread priorities.
+ *
+ * NOTE: Priority 0 is reserved for internal threads only.
+ */
+
+typedef unsigned32 Priority_Control;
+
+#define PRIORITY_MINIMUM 0 /* highest thread priority */
+#define PRIORITY_MAXIMUM 255 /* lowest thread priority */
+
+/*
+ * The following record defines the information associated with
+ * each thread to manage its interaction with the priority bit maps.
+ */
+
+typedef struct {
+ Priority_Bit_map_control *minor; /* addr of minor bit map slot */
+ Priority_Bit_map_control ready_major; /* priority bit map ready mask */
+ Priority_Bit_map_control ready_minor; /* priority bit map ready mask */
+ Priority_Bit_map_control block_major; /* priority bit map block mask */
+ Priority_Bit_map_control block_minor; /* priority bit map block mask */
+} Priority_Information;
+
+/*
+ * The following data items are the priority bit map.
+ * Each of the sixteen bits used in the _Priority_Major_bit_map is
+ * associated with one of the sixteen entries in the _Priority_Bit_map.
+ * Each bit in the _Priority_Bit_map indicates whether or not there are
+ * threads ready at a particular priority. The mapping of
+ * individual priority levels to particular bits is processor
+ * dependent as is the value of each bit used to indicate that
+ * threads are ready at that priority.
+ */
+
+SCORE_EXTERN volatile Priority_Bit_map_control _Priority_Major_bit_map;
+SCORE_EXTERN Priority_Bit_map_control
+ _Priority_Bit_map[16] CPU_STRUCTURE_ALIGNMENT;
+
+/*
+ * The definition of the Priority_Bit_map_control type is CPU dependent.
+ *
+ */
+
+/*
+ * Priority Bitfield Manipulation Routines
+ *
+ * NOTE:
+ *
+ * These may simply be pass throughs to CPU dependent routines.
+ */
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == FALSE )
+
+#define _Priority_Mask( _bit_number ) \
+ _CPU_Priority_Mask( _bit_number )
+
+#define _Priority_Bits_index( _priority ) \
+ _CPU_Priority_bits_index( _priority )
+
+#endif
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/priority.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/stack.h b/c/src/exec/score/include/rtems/score/stack.h
new file mode 100644
index 0000000000..eb9a68fe8c
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/stack.h
@@ -0,0 +1,50 @@
+/* stack.h
+ *
+ * This include file contains all information about the thread
+ * Stack Handler. This Handler provides mechanisms which can be used to
+ * initialize and utilize stacks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_h
+#define __STACK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following constant defines the minimum stack size which every
+ * thread must exceed.
+ */
+
+#define STACK_MINIMUM_SIZE CPU_STACK_MINIMUM_SIZE
+
+/*
+ * The following defines the control block used to manage each stack.
+ */
+
+typedef struct {
+ unsigned32 size; /* stack size */
+ void *area; /* low memory addr of stack */
+} Stack_Control;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/stack.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/states.h b/c/src/exec/score/include/rtems/score/states.h
new file mode 100644
index 0000000000..02c0f0c590
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/states.h
@@ -0,0 +1,84 @@
+/* states.h
+ *
+ * This include file contains thread execution state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_STATES_h
+#define __RTEMS_STATES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage a
+ * thread's state.
+ */
+
+typedef unsigned32 States_Control;
+
+/*
+ * The following constants define the individual states which may be
+ * be used to compose and manipulate a thread's state.
+ */
+
+#define STATES_ALL_SET 0xfffff /* all states */
+#define STATES_READY 0x00000 /* ready to run */
+#define STATES_DORMANT 0x00001 /* created not started */
+#define STATES_SUSPENDED 0x00002 /* waiting for resume */
+#define STATES_TRANSIENT 0x00004 /* in transition */
+#define STATES_DELAYING 0x00008 /* wait for timeout */
+#define STATES_WAITING_FOR_TIME 0x00010 /* wait for TOD */
+#define STATES_WAITING_FOR_BUFFER 0x00020
+#define STATES_WAITING_FOR_SEGMENT 0x00040
+#define STATES_WAITING_FOR_MESSAGE 0x00080
+#define STATES_WAITING_FOR_EVENT 0x00100
+#define STATES_WAITING_FOR_SEMAPHORE 0x00200
+#define STATES_WAITING_FOR_MUTEX 0x00400
+#define STATES_WAITING_FOR_CONDITION_VARIABLE 0x00800
+#define STATES_WAITING_FOR_JOIN_AT_EXIT 0x01000
+#define STATES_WAITING_FOR_RPC_REPLY 0x02000
+#define STATES_WAITING_FOR_PERIOD 0x04000
+#define STATES_WAITING_FOR_SIGNAL 0x08000
+#define STATES_INTERRUPTIBLE_BY_SIGNAL 0x10000
+
+#define STATES_LOCALLY_BLOCKED ( STATES_WAITING_FOR_BUFFER | \
+ STATES_WAITING_FOR_SEGMENT | \
+ STATES_WAITING_FOR_MESSAGE | \
+ STATES_WAITING_FOR_SEMAPHORE | \
+ STATES_WAITING_FOR_MUTEX | \
+ STATES_WAITING_FOR_CONDITION_VARIABLE | \
+ STATES_WAITING_FOR_JOIN_AT_EXIT | \
+ STATES_WAITING_FOR_SIGNAL )
+
+#define STATES_WAITING_ON_THREAD_QUEUE \
+ ( STATES_LOCALLY_BLOCKED | \
+ STATES_WAITING_FOR_RPC_REPLY )
+
+#define STATES_BLOCKED ( STATES_DELAYING | \
+ STATES_WAITING_FOR_TIME | \
+ STATES_WAITING_FOR_PERIOD | \
+ STATES_WAITING_FOR_EVENT | \
+ STATES_WAITING_ON_THREAD_QUEUE | \
+ STATES_INTERRUPTIBLE_BY_SIGNAL )
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/states.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/sysstate.h b/c/src/exec/score/include/rtems/score/sysstate.h
new file mode 100644
index 0000000000..38e6ce36f1
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/sysstate.h
@@ -0,0 +1,67 @@
+/* sysstates.h
+ *
+ * This include file contains information regarding the system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SYSTEM_STATE_h
+#define __RTEMS_SYSTEM_STATE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+/* enumerated constants */
+
+/*
+ * The following type defines the possible system states.
+ */
+
+typedef enum {
+ SYSTEM_STATE_BEFORE_INITIALIZATION, /* start -> end of 1st init part */
+ SYSTEM_STATE_BEFORE_MULTITASKING, /* end of 1st -> beginning of 2nd */
+ SYSTEM_STATE_BEGIN_MULTITASKING, /* just before multitasking starts */
+ SYSTEM_STATE_UP, /* normal operation */
+ SYSTEM_STATE_SHUTDOWN, /* shutdown */
+ SYSTEM_STATE_FAILED /* fatal error occurred */
+} System_state_Codes;
+
+#define SYSTEM_STATE_CODES_FIRST SYSTEM_STATE_BEFORE_INITIALIZATION
+#define SYSTEM_STATE_CODES_LAST SYSTEM_STATE_FAILED
+
+/*
+ * The following variable indicates whether or not this is
+ * an multiprocessing system.
+ */
+
+SCORE_EXTERN boolean _System_state_Is_multiprocessing;
+
+/*
+ * The following variable contains the current system state.
+ */
+
+SCORE_EXTERN System_state_Codes _System_state_Current;
+
+/*
+ * Make it possible for the application to get the system state information.
+ */
+
+#include <rtems/score/sysstate.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/thread.h b/c/src/exec/score/include/rtems/score/thread.h
new file mode 100644
index 0000000000..23b1242c0d
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/thread.h
@@ -0,0 +1,630 @@
+/* thread.h
+ *
+ * This include file contains all constants and structures associated
+ * with the thread control block.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_h
+#define __THREAD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/context.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/states.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following defines the "return type" of a thread.
+ */
+
+typedef void 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 enum {
+ THREAD_START_NUMERIC,
+ THREAD_START_POINTER,
+ THREAD_START_BOTH_POINTER_FIRST,
+ THREAD_START_BOTH_NUMERIC_FIRST
+} Thread_Start_types;
+
+typedef Thread ( *Thread_Entry )(); /* basic type */
+
+typedef Thread ( *Thread_Entry_numeric )( unsigned32 );
+typedef Thread ( *Thread_Entry_pointer )( void * );
+typedef Thread ( *Thread_Entry_both_pointer_first )( void *, unsigned32 );
+typedef Thread ( *Thread_Entry_both_numeric_first )( unsigned32, void * );
+
+/*
+ * The following lists the algorithms used to manage the thread cpu budget.
+ *
+ * Reset Timeslice: At each context switch, reset the time quantum.
+ * Exhaust Timeslice: Only reset the quantum once it is consumed.
+ * Callout: Execute routine when budget is consumed.
+ */
+
+typedef enum {
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE,
+ THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE,
+ THREAD_CPU_BUDGET_ALGORITHM_CALLOUT
+} Thread_CPU_budget_algorithms;
+
+typedef struct Thread_Control_struct Thread_Control;
+
+typedef void (*Thread_CPU_budget_algorithm_callout )( Thread_Control * );
+
+/*
+ * The following structure contains the information which defines
+ * the starting state of a thread.
+ */
+
+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 */
+ /* initial execution modes */
+ boolean is_preemptible;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ unsigned32 isr_level;
+ Priority_Control initial_priority; /* initial priority */
+ boolean core_allocated_stack;
+ Stack_Control Initial_stack; /* stack information */
+ void *fp_context; /* initial FP context area address */
+ void *stack; /* initial FP context area address */
+} Thread_Start_information;
+
+/*
+ * The following structure contains the information necessary to manage
+ * a thread which it is waiting for a resource.
+ */
+
+#define THREAD_STATUS_PROXY_BLOCKING 0x1111111
+
+typedef struct {
+ Objects_Id id; /* waiting on this object */
+ 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;
+
+/*
+ * The following defines the control block used to manage
+ * each thread proxy.
+ *
+ * NOTE: It is critical that proxies and threads have identical
+ * memory images for the shared part.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ States_Control current_state;
+ Priority_Control current_priority;
+ Priority_Control real_priority;
+ unsigned32 resource_count;
+ Thread_Wait_information Wait;
+ Watchdog_Control Timer;
+ MP_packet_Prefix *receive_packet;
+ /****************** end of common block ********************/
+ Chain_Node Active;
+} Thread_Proxy_control;
+
+
+/*
+ * The following record defines the control block used
+ * to manage each thread.
+ *
+ * NOTE: It is critical that proxies and threads have identical
+ * memory images for the shared part.
+ */
+
+typedef enum {
+ THREAD_API_RTEMS,
+ THREAD_API_POSIX
+} Thread_APIs;
+
+#define THREAD_API_FIRST THREAD_API_RTEMS
+#define THREAD_API_LAST THREAD_API_POSIX
+
+struct Thread_Control_struct {
+ Objects_Control Object;
+ States_Control current_state;
+ Priority_Control current_priority;
+ Priority_Control real_priority;
+ unsigned32 resource_count;
+ Thread_Wait_information Wait;
+ Watchdog_Control Timer;
+ MP_packet_Prefix *receive_packet;
+ /****************** end of common block ********************/
+ boolean is_global;
+ boolean do_post_task_switch_extension;
+
+ boolean is_preemptible;
+ unsigned32 cpu_time_budget;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+
+ unsigned32 ticks_executed;
+ Chain_Control *ready;
+ Priority_Information Priority_map;
+ Thread_Start_information Start;
+ Context_Control Registers;
+ void *fp_context;
+ void *API_Extensions[ THREAD_API_LAST + 1 ];
+ void **extensions;
+};
+
+/*
+ * The following constants define the stack size requirements for
+ * the idle thread.
+ */
+
+
+#define THREAD_IDLE_STACK_SIZE STACK_MINIMUM_SIZE
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+SCORE_EXTERN Objects_Information _Thread_Internal_information;
+
+/*
+ * The following define the thread control pointers used to access
+ * and manipulate the idle thread.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Idle;
+
+/*
+ * 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.
+ */
+
+SCORE_EXTERN Context_Control _Thread_BSP_context;
+
+/*
+ * The following declares the dispatch critical section nesting
+ * counter which is used to prevent context switches at inopportune
+ * moments.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Dispatch_disable_level;
+
+/*
+ * If this is non-zero, then the post-task switch extension
+ * is run regardless of the state of the per thread flag.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Do_post_task_switch_extension;
+
+/*
+ * 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.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Maximum_extensions;
+
+/*
+ * The following is used to manage the length of a timeslice quantum.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Ticks_per_timeslice;
+
+/*
+ * The following points to the array of FIFOs used to manage the
+ * set of ready threads.
+ */
+
+SCORE_EXTERN Chain_Control *_Thread_Ready_chain;
+
+/*
+ * The following points to the thread which is currently executing.
+ * This thread is implicitly manipulated by numerous directives.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Executing;
+
+/*
+ * The following points to the highest priority ready thread
+ * in the system. Unless the current thread is not preemptibl,
+ * then this thread will be context switched to when the next
+ * dispatch occurs.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Heir;
+
+/*
+ * The following points to the thread whose floating point
+ * context is currently loaded.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Allocated_fp;
+
+/*
+ * _Thread_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _Thread_Handler_initialization (
+ unsigned32 ticks_per_timeslice,
+ unsigned32 maximum_extensions,
+ unsigned32 maximum_proxies
+);
+
+/*
+ * _Thread_Create_idle
+ *
+ * DESCRIPTION:
+ *
+ * This routine creates the idle thread.
+ *
+ * WARNING!! No thread should be created before this one.
+ */
+
+void _Thread_Create_idle( void );
+
+/*
+ * _Thread_Start_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This routine initiates multitasking. It is invoked only as
+ * part of initialization and its invocation is the last act of
+ * the non-multitasking part of the system initialization.
+ */
+
+void _Thread_Start_multitasking( void );
+
+/*
+ * _Thread_Dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine is responsible for transferring control of the
+ * processor from the executing thread to the heir thread. As part
+ * of this process, it is responsible for the following actions:
+ *
+ * + saving the context of the executing thread
+ * + restoring the context of the heir thread
+ * + dispatching any signals for the resulting executing thread
+ */
+
+void _Thread_Dispatch( void );
+
+/*
+ * _Thread_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ *
+ * NOTES:
+ *
+ * If stack_area is NULL, it is allocated from the workspace.
+ *
+ * If the stack is allocated from the workspace, then it is guaranteed to be
+ * of at least minimum size.
+ */
+
+boolean _Thread_Initialize(
+ Objects_Information *information,
+ Thread_Control *the_thread,
+ void *stack_area,
+ unsigned32 stack_size,
+ boolean is_fp,
+ Priority_Control priority,
+ boolean is_preemptible,
+ Thread_CPU_budget_algorithms budget_algorithm,
+ Thread_CPU_budget_algorithm_callout budget_callout,
+ unsigned32 isr_level,
+ Objects_Name name
+);
+
+/*
+ * _Thread_Start
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Thread_Start(
+ Thread_Control *the_thread,
+ Thread_Start_types the_prototype,
+ void *entry_point,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+);
+
+/*
+ * _Thread_Restart
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+/* XXX multiple task arg profiles */
+
+boolean _Thread_Restart(
+ Thread_Control *the_thread,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+);
+
+/*
+ * _Thread_Close
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Thread_Close(
+ Objects_Information *information,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Ready
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes any set states for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Ready(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Clear_state
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the indicated STATES for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Clear_state(
+ Thread_Control *the_thread,
+ States_Control state
+);
+
+/*
+ * _Thread_Set_state
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the indicated states for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ *
+ */
+
+void _Thread_Set_state(
+ Thread_Control *the_thread,
+ States_Control state
+);
+
+/*
+ * _Thread_Set_transient
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the TRANSIENT state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Set_transient(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Reset_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked upon expiration of the currently
+ * executing thread's timeslice. If no other thread's are ready
+ * 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
+ * FIFO for this priority and a new heir is selected.
+ */
+
+void _Thread_Reset_timeslice( void );
+
+/*
+ * _Thread_Tickle_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked as part of processing each clock tick.
+ * It is responsible for determining if the current thread allows
+ * timeslicing and, if so, when its timeslice expires.
+ */
+
+void _Thread_Tickle_timeslice( void );
+
+/*
+ * _Thread_Yield_processor
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a thread wishes to voluntarily
+ * transfer control of the processor to another thread of equal
+ * or greater priority.
+ */
+
+void _Thread_Yield_processor( void );
+
+/*
+ * _Thread_Load_environment
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the context of the_thread to its
+ * appropriate starting state.
+ */
+
+void _Thread_Load_environment(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Handler
+ *
+ * DESCRIPTION:
+ *
+ * This routine is the wrapper function for all threads. It is
+ * the starting point for all threads. The user provided thread
+ * entry point is invoked by this routine. Operations
+ * which must be performed immediately before and after the user's
+ * thread executes are found here.
+ */
+
+void _Thread_Handler( void );
+
+/*
+ * _Thread_Delay_ended
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a thread must be unblocked at the
+ * end of a time based delay (i.e. wake after or wake when).
+ */
+
+void _Thread_Delay_ended(
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * _Thread_Change_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine changes the current priority of the_thread to
+ * new_priority. It performs any necessary scheduling operations
+ * including the selection of a new heir thread.
+ */
+
+void _Thread_Change_priority (
+ Thread_Control *the_thread,
+ Priority_Control new_priority,
+ boolean prepend_it
+);
+
+/*
+ * _Thread_Set_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine updates the priority related fields in the_thread
+ * control block to indicate the current priority is now new_priority.
+ */
+
+void _Thread_Set_priority(
+ Thread_Control *the_thread,
+ Priority_Control new_priority
+);
+
+/*
+ * _Thread_Evaluate_mode
+ *
+ * DESCRIPTION:
+ *
+ * This routine XXX
+ */
+
+boolean _Thread_Evaluate_mode( void );
+
+/*
+ * _Thread_Get
+ *
+ * NOTE: If we are not using static inlines, this must be a real
+ * subroutine call.
+ */
+
+#ifndef USE_INLINES
+Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+#endif
+
+/*
+ * _Thread_Idle_body
+ *
+ * DESCRIPTION:
+ *
+ * This routine is the body of the system idle thread.
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE)
+Thread _Thread_Idle_body(
+ unsigned32 ignored
+);
+#endif
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/thread.inl>
+#endif
+#include <rtems/score/threadmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/threadmp.h b/c/src/exec/score/include/rtems/score/threadmp.h
new file mode 100644
index 0000000000..bcaa423d70
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/threadmp.h
@@ -0,0 +1,89 @@
+/* threadmp.h
+ *
+ * This include file contains the specification for all routines
+ * and data specific to the multiprocessing portion of the thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_THREAD_MP_h
+#define __RTEMS_THREAD_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * _Thread_MP_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the multiprocessing portion of the Thread Handler.
+ */
+
+void _Thread_MP_Handler_initialization (
+ unsigned32 maximum_proxies
+);
+
+/*
+ * _Thread_MP_Allocate_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This allocates a proxy control block from
+ * the inactive chain of free proxy control blocks.
+ *
+ * NOTE: This function returns a thread control pointer
+ * because proxies are substitutes for remote threads.
+ */
+
+Thread_Control *_Thread_MP_Allocate_proxy (
+ States_Control the_state
+);
+
+/*
+ * _Thread_MP_Find_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the proxy control block for the specified
+ * id from the active chain of proxy control blocks.
+ */
+
+Thread_Control *_Thread_MP_Find_proxy (
+ Objects_Id the_id
+);
+
+/*
+ * The following is used to determine when the multiprocessing receive
+ * thread is executing so that a proxy can be allocated instead of
+ * blocking the multiprocessing receive thread.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_MP_Receive;
+
+/*
+ * The following chains are used to manage proxies.
+ */
+
+SCORE_EXTERN Chain_Control _Thread_MP_Active_proxies;
+SCORE_EXTERN Chain_Control _Thread_MP_Inactive_proxies;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/threadmp.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/threadq.h b/c/src/exec/score/include/rtems/score/threadq.h
new file mode 100644
index 0000000000..943eaf10f8
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/threadq.h
@@ -0,0 +1,301 @@
+/* threadq.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the manipulation of objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_h
+#define __THREAD_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/tqdata.h>
+
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * Constant for indefinite wait.
+ */
+
+#define THREAD_QUEUE_WAIT_FOREVER WATCHDOG_NO_TIMEOUT
+
+/*
+ * The following type defines the callout used when a remote task
+ * is extracted from a local thread queue.
+ */
+
+typedef void ( *Thread_queue_Flush_callout )(
+ Thread_Control *
+ );
+
+/*
+ * The following type defines the callout used when a local task
+ * is extracted from a remote thread queue (i.e. it's proxy must
+ * extracted from the remote queue).
+ */
+
+typedef void ( *Thread_queue_Extract_callout )(
+ Thread_Control *
+ );
+
+SCORE_EXTERN Thread_queue_Extract_callout
+ _Thread_queue_Extract_table[ OBJECTS_CLASSES_LAST + 1 ];
+
+/*
+ * _Thread_queue_Dequeue
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to a thread waiting on
+ * the_thread_queue. The selection of this thread is based on
+ * the discipline of the_thread_queue. If no threads are waiting
+ * on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout.
+ */
+
+void _Thread_queue_Enqueue(
+ Thread_queue_Control *the_thread_queue,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_Extract_with_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_thread from the_thread_queue
+ * and insures that if there is a proxy for this task on
+ * another node, it is also dealt with.
+ */
+
+boolean _Thread_queue_Extract_with_proxy(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The "first" thread is selected
+ * based on the discipline of the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine unblocks all threads blocked on the_thread_queue
+ * and cancels any associated timeouts.
+ */
+
+void _Thread_queue_Flush(
+ Thread_queue_Control *the_thread_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ * _Thread_queue_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_thread_queue based on the
+ * discipline indicated in attribute_set. The state set on
+ * threads which block on the_thread_queue is state.
+ */
+
+void _Thread_queue_Initialize(
+ Thread_queue_Control *the_thread_queue,
+ Objects_Classes the_class,
+ Thread_queue_Disciplines the_discipline,
+ States_Control state,
+ Thread_queue_Extract_callout proxy_extract_callout,
+ unsigned32 timeout_status
+);
+
+/*
+ * _Thread_queue_Dequeue_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the highest priority
+ * thread waiting on the_thread_queue. If no threads are waiting
+ * on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue_priority(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout using the
+ * priority discipline.
+ */
+
+void _Thread_queue_Enqueue_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The "first" thread is the highest
+ * priority thread waiting on the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First_priority(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Dequeue_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the thread which has
+ * been waiting the longest on the_thread_queue. If no
+ * threads are waiting on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue_fifo(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout using the
+ * FIFO discipline.
+ */
+
+void _Thread_queue_Enqueue_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The first thread is the thread
+ * which has been waiting longest on the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First_fifo(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task's request has not
+ * been satisfied after the timeout interval specified to
+ * enqueue. The task represented by ID will be unblocked and
+ * its status code will be set in it's control block to indicate
+ * that a timeout has occurred.
+ */
+
+void _Thread_queue_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/tod.h b/c/src/exec/score/include/rtems/score/tod.h
new file mode 100644
index 0000000000..36d0097669
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/tod.h
@@ -0,0 +1,277 @@
+/* tod.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_h
+#define __TIME_OF_DAY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following constants are related to the time of day.
+ */
+
+#define TOD_SECONDS_PER_MINUTE 60
+#define TOD_MINUTES_PER_HOUR 60
+#define TOD_MONTHS_PER_YEAR 12
+#define TOD_DAYS_PER_YEAR 365
+#define TOD_HOURS_PER_DAY 24
+#define TOD_SECONDS_PER_DAY (TOD_SECONDS_PER_MINUTE * \
+ TOD_MINUTES_PER_HOUR * \
+ TOD_HOURS_PER_DAY)
+
+#define TOD_SECONDS_PER_NON_LEAP_YEAR (365 * TOD_SECONDS_PER_DAY)
+
+#define TOD_MILLISECONDS_PER_SECOND 1000
+#define TOD_MICROSECONDS_PER_SECOND 1000000
+#define TOD_NANOSECONDS_PER_SECOND 1000000000
+#define TOD_NANOSECONDS_PER_MICROSECOND 1000
+
+/*
+ * The following constant define the earliest year to which an
+ * time of day can be initialized. This is considered the
+ * epoch.
+ */
+
+#define TOD_BASE_YEAR 1988
+
+/*
+ * The following record defines the time of control block. This
+ * control block is used to maintain the current time of day.
+ */
+
+typedef struct { /* RTEID style time/date */
+ unsigned32 year; /* year, A.D. */
+ unsigned32 month; /* month, 1 -> 12 */
+ unsigned32 day; /* day, 1 -> 31 */
+ unsigned32 hour; /* hour, 0 -> 23 */
+ unsigned32 minute; /* minute, 0 -> 59 */
+ unsigned32 second; /* second, 0 -> 59 */
+ unsigned32 ticks; /* elapsed ticks between secs */
+} TOD_Control;
+
+/*
+ * The following is TRUE if the application has set the current
+ * time of day, and FALSE otherwise.
+ */
+
+SCORE_EXTERN boolean _TOD_Is_set;
+
+/*
+ * The following contains the current time of day.
+ */
+
+SCORE_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.
+ */
+
+SCORE_EXTERN Watchdog_Interval _TOD_Seconds_since_epoch;
+
+/*
+ * The following contains the number of microseconds per tick.
+ */
+
+SCORE_EXTERN unsigned32 _TOD_Microseconds_per_tick;
+
+/*
+ * The following contains the number of clock ticks per second.
+ *
+ * NOTE:
+ *
+ * If one second is NOT evenly divisible by the number of microseconds
+ * per clock tick, this value will contain only the integer portion
+ * of the division. This means that the interval between clock ticks
+ * can be a source of error in the current time of day.
+ */
+
+SCORE_EXTERN unsigned32 _TOD_Ticks_per_second;
+
+/*
+ * This is the control structure for the watchdog timer which
+ * fires to service the seconds chain.
+ */
+
+SCORE_EXTERN Watchdog_Control _TOD_Seconds_watchdog;
+
+#ifdef SCORE_INIT
+
+/*
+ * The following array contains the number of days in all months.
+ * The first dimension should be 1 for leap years, and 0 otherwise.
+ * The second dimension should range from 1 to 12 for January to
+ * February, respectively.
+ */
+
+const unsigned32 _TOD_Days_per_month[ 2 ][ 13 ] = {
+ { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+/*
+ * The following array contains the number of days in all months
+ * up to the month indicated by the index of the second dimension.
+ * The first dimension should be 1 for leap years, and 0 otherwise.
+ */
+
+const unsigned16 _TOD_Days_to_date[2][13] = {
+ { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 },
+ { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }
+};
+
+/*
+ * The following array contains the number of days in the years
+ * since the last leap year. The index should be 0 for leap
+ * years, and the number of years since the beginning of a leap
+ * year otherwise.
+ */
+
+const unsigned16 _TOD_Days_since_last_leap_year[4] = { 0, 366, 761, 1126 };
+
+#else
+
+extern const unsigned16 _TOD_Days_to_date[2][13]; /* Julian days */
+extern const unsigned16 _TOD_Days_since_last_leap_year[4];
+extern const unsigned32 _TOD_Days_per_month[2][13];
+
+#endif
+
+/*
+ * _TOD_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _TOD_Handler_initialization(
+ unsigned32 microseconds_per_tick
+);
+
+/*
+ * _TOD_Set
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current time of day to THE_TOD and
+ * the equivalent SECONDS_SINCE_EPOCH.
+ */
+
+void _TOD_Set(
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
+);
+
+/*
+ * _TOD_Validate
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if THE_TOD contains
+ * a valid time of day, and FALSE otherwise.
+ */
+
+boolean _TOD_Validate(
+ TOD_Control *the_tod
+);
+
+/*
+ * _TOD_To_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the number seconds between the epoch and THE_TOD.
+ */
+
+Watchdog_Interval _TOD_To_seconds(
+ TOD_Control *the_tod
+);
+
+/*
+ * _TOD_Tickle
+ *
+ * DESCRIPTION:
+ *
+ * This routine is scheduled as a watchdog function and is invoked at
+ * each second boundary. It updates the current time of day to indicate
+ * that a second has passed and processes the seconds watchdog chain.
+ */
+
+void _TOD_Tickle(
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * TOD_MILLISECONDS_TO_MICROSECONDS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in milliseconds to microseconds.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MILLISECONDS_TO_MICROSECONDS(_ms) ((_ms) * 1000)
+
+/*
+ * TOD_MICROSECONDS_TO_TICKS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in microseconds to ticks.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MICROSECONDS_TO_TICKS(_us) \
+ ((_us) / _TOD_Microseconds_per_tick)
+
+/*
+ * TOD_MILLISECONDS_TO_TICKS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in milliseconds to ticks.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MILLISECONDS_TO_TICKS(_ms) \
+ (TOD_MILLISECONDS_TO_MICROSECONDS(_ms) / _TOD_Microseconds_per_tick)
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/tod.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/tqdata.h b/c/src/exec/score/include/rtems/score/tqdata.h
new file mode 100644
index 0000000000..0011b62766
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/tqdata.h
@@ -0,0 +1,90 @@
+/* tqdata.h
+ *
+ * This include file contains all the constants and structures
+ * needed to declare a thread queue.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_h
+#define __THREAD_QUEUE_DATA_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/chain.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/states.h>
+
+/*
+ * The following enumerated type details all of the disciplines
+ * supported by the Thread Queue Handler.
+ */
+
+typedef enum {
+ THREAD_QUEUE_DISCIPLINE_FIFO, /* FIFO queue discipline */
+ THREAD_QUEUE_DISCIPLINE_PRIORITY /* PRIORITY queue discipline */
+} Thread_queue_Disciplines;
+
+/*
+ * The following enumerated types indicate what happened while the thread
+ * queue was in the synchronization window.
+ */
+
+typedef enum {
+ THREAD_QUEUE_SYNCHRONIZED,
+ THREAD_QUEUE_NOTHING_HAPPENED,
+ THREAD_QUEUE_TIMEOUT,
+ THREAD_QUEUE_SATISFIED
+} Thread_queue_States;
+
+/*
+ * The following constants are used to manage the priority queues.
+ *
+ * There are four chains used to maintain a priority -- each chain
+ * manages a distinct set of task priorities. The number of chains
+ * is determined by TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS.
+ * The following set must be consistent.
+ *
+ * The set below configures 4 headers -- each contains 64 priorities.
+ * Header x manages priority range (x*64) through ((x*64)+63). If
+ * the priority is more than half way through the priority range it
+ * is in, then the search is performed from the rear of the chain.
+ * This halves the search time to find the insertion point.
+ */
+
+#define TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS 4
+#define TASK_QUEUE_DATA_PRIORITIES_PER_HEADER 64
+#define TASK_QUEUE_DATA_REVERSE_SEARCH_MASK 0x20
+
+typedef struct {
+ union {
+ Chain_Control Fifo; /* FIFO discipline list */
+ Chain_Control Priority[TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS];
+ /* priority discipline list */
+ } Queues;
+ Thread_queue_States sync_state; /* 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;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/tqdata.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/userext.h b/c/src/exec/score/include/rtems/score/userext.h
new file mode 100644
index 0000000000..4b4290ab4d
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/userext.h
@@ -0,0 +1,213 @@
+/* userext.h
+ *
+ * This include file contains all information about user extensions. This
+ * Handler provides mechanisms which can be used to initialize and manipulate
+ * all user extensions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_h
+#define __USER_EXTENSIONS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/interr.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/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_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_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;
+ User_extensions_Table Callouts;
+} User_extensions_Control;
+
+/*
+ * The following contains the static extension set which may be
+ * configured by the application.
+ */
+
+SCORE_EXTERN User_extensions_Control _User_extensions_Initial;
+
+/*
+ * The following is used to manage the list of active extensions.
+ */
+
+SCORE_EXTERN Chain_Control _User_extensions_List;
+
+/*
+ * _User_extensions_Thread_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread creation operate.
+ */
+
+boolean _User_extensions_Thread_create (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread deletion operation.
+ */
+
+void _User_extensions_Thread_delete (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_start
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread start operation.
+ */
+
+void _User_extensions_Thread_start (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_restart
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread restart operation.
+ */
+
+void _User_extensions_Thread_restart (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_begin
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a thread begins.
+ */
+
+void _User_extensions_Thread_begin (
+ Thread_Control *executing
+);
+
+/*
+ * _User_extensions_Thread_exitted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a thread exits.
+ */
+
+void _User_extensions_Thread_exitted (
+ Thread_Control *executing
+);
+
+/*
+ * _User_extensions_Fatal
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension invoked
+ * when a fatal error occurs.
+ */
+
+void _User_extensions_Fatal (
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ unsigned32 the_error
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/userext.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/watchdog.h b/c/src/exec/score/include/rtems/score/watchdog.h
new file mode 100644
index 0000000000..697ae9bcc0
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/watchdog.h
@@ -0,0 +1,194 @@
+/* watchdog.h
+ *
+ * This include file contains all the constants and structures associated
+ * with watchdog timers. This Handler provides mechanisms which can be
+ * used to initialize and manipulate watchdog timers.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_h
+#define __WATCHDOG_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+
+/*
+ * The following type defines the control block used to manage
+ * intervals.
+ */
+
+typedef unsigned32 Watchdog_Interval;
+
+/*
+ * The following types define a pointer to a watchdog service routine.
+ */
+
+typedef void Watchdog_Service_routine;
+
+typedef Watchdog_Service_routine ( *Watchdog_Service_routine_entry )(
+ Objects_Id,
+ void *
+ );
+
+/*
+ * Constant for indefinite wait. (actually an illegal interval)
+ */
+
+#define WATCHDOG_NO_TIMEOUT 0
+
+/*
+ * The following enumerated type lists the states in which a
+ * watchdog timer may be at any given time.
+ */
+
+typedef enum {
+ WATCHDOG_INACTIVE, /* off all chains */
+ WATCHDOG_BEING_INSERTED, /* off all chains, searching for insertion point */
+ WATCHDOG_ACTIVE, /* on chain, allowed to fire */
+ WATCHDOG_REMOVE_IT /* on chain, remove without firing if expires */
+} Watchdog_States;
+
+/*
+ * The following enumerated type details the manner in which
+ * a watchdog chain may be adjusted by the Watchdog_Adjust
+ * routine. The direction indicates a movement FORWARD
+ * or BACKWARD in time.
+ */
+
+typedef enum {
+ WATCHDOG_FORWARD, /* adjust delta value forward */
+ WATCHDOG_BACKWARD /* adjust delta value backward */
+} Watchdog_Adjust_directions;
+
+/*
+ * The following record defines the control block used
+ * to manage each watchdog timer.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ Watchdog_States state;
+ Watchdog_Interval initial;
+ Watchdog_Interval delta_interval;
+ Watchdog_Interval start_time;
+ Watchdog_Interval stop_time;
+ Watchdog_Service_routine_entry routine;
+ Objects_Id id;
+ void *user_data;
+} Watchdog_Control;
+
+/*
+ * The following are used for synchronization purposes
+ * during an insert on a watchdog delta chain.
+ */
+
+SCORE_EXTERN volatile unsigned32 _Watchdog_Sync_level;
+SCORE_EXTERN volatile unsigned32 _Watchdog_Sync_count;
+
+/*
+ * The following contains the number of ticks since the
+ * system was booted.
+ */
+
+SCORE_EXTERN Watchdog_Interval _Watchdog_Ticks_since_boot;
+
+/*
+ * The following defines the watchdog chains which are managed
+ * on ticks and second boundaries.
+ */
+
+SCORE_EXTERN Chain_Control _Watchdog_Ticks_chain;
+SCORE_EXTERN Chain_Control _Watchdog_Seconds_chain;
+
+/*
+ * _Watchdog_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the watchdog handler. The watchdog
+ * synchronization flag is initialized and the watchdog chains are
+ * initialized and emptied.
+ */
+
+void _Watchdog_Handler_initialization( void );
+
+/*
+ * _Watchdog_Remove
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes THE_WATCHDOG from the watchdog chain on which
+ * it resides and returns the state THE_WATCHDOG timer was in.
+ */
+
+Watchdog_States _Watchdog_Remove (
+ Watchdog_Control *the_watchdog
+);
+
+/*
+ * _Watchdog_Adjust
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the HEADER watchdog chain in the forward
+ * or backward DIRECTION for UNITS ticks.
+ */
+
+void _Watchdog_Adjust (
+ Chain_Control *header,
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+);
+
+/*
+ * _Watchdog_Insert
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the HEADER watchdog chain
+ * for a time of UNITS. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ *
+ */
+
+void _Watchdog_Insert (
+ Chain_Control *header,
+ Watchdog_Control *the_watchdog
+);
+
+/*
+ * _Watchdog_Tickle
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at appropriate intervals to update
+ * the HEADER watchdog chain.
+ */
+
+void _Watchdog_Tickle (
+ Chain_Control *header
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/watchdog.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/score/wkspace.h b/c/src/exec/score/include/rtems/score/wkspace.h
new file mode 100644
index 0000000000..8de23a6c61
--- /dev/null
+++ b/c/src/exec/score/include/rtems/score/wkspace.h
@@ -0,0 +1,71 @@
+/* wkspace.h
+ *
+ * This include file contains information related to the
+ * RAM Workspace. This Handler provides mechanisms which can be used to
+ * define, initialize and manipulate the workspace.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_h
+#define __WORKSPACE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/heap.h>
+#include <rtems/score/interr.h>
+
+/*
+ * The following is used to manage the Workspace.
+ *
+ */
+
+SCORE_EXTERN Heap_Control _Workspace_Area; /* executive heap header */
+
+/*
+ * _Workspace_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _Workspace_Handler_initialization(
+ void *starting_address,
+ unsigned32 size
+);
+
+/*
+ * _Workspace_Allocate_or_fatal_error
+ *
+ * DESCRIPTION:
+ *
+ * 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 internal error handler is invoked.
+ */
+
+void *_Workspace_Allocate_or_fatal_error(
+ unsigned32 size
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/wkspace.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/include/rtems/system.h b/c/src/exec/score/include/rtems/system.h
new file mode 100644
index 0000000000..b9255d45d5
--- /dev/null
+++ b/c/src/exec/score/include/rtems/system.h
@@ -0,0 +1,153 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the executive. This must be the first include file
+ * included in all internal RTEMS files.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SYSTEM_h
+#define __RTEMS_SYSTEM_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The target options include file defines all target dependent
+ * parameters for this build of RTEMS. It must be included
+ * first so the basic macro definitions are in place.
+ */
+
+#include <rtems/score/targopts.h>
+
+/*
+ * The following insures that all data is declared in the space
+ * of the initialization routine for either the Initialization Manager
+ * or the initialization file for the appropriate API. It is
+ * referenced as "external" in every other file.
+ */
+
+#ifdef SCORE_INIT
+#undef SCORE_EXTERN
+#define SCORE_EXTERN
+#else
+#undef SCORE_EXTERN
+#define SCORE_EXTERN extern
+#endif
+
+#ifdef SAPI_INIT
+#undef SAPI_EXTERN
+#define SAPI_EXTERN
+#else
+#undef SAPI_EXTERN
+#define SAPI_EXTERN extern
+#endif
+
+#ifdef RTEMS_API_INIT
+#undef RTEMS_EXTERN
+#define RTEMS_EXTERN
+#else
+#undef RTEMS_EXTERN
+#define RTEMS_EXTERN extern
+#endif
+
+#ifdef POSIX_API_INIT
+#undef POSIX_EXTERN
+#define POSIX_EXTERN
+#else
+#undef POSIX_EXTERN
+#define POSIX_EXTERN extern
+#endif
+
+/*
+ * The following (in conjunction with compiler arguments) are used
+ * to choose between the use of static inline functions and macro
+ * functions. The static inline implementation allows better
+ * type checking with no cost in code size or execution speed.
+ */
+
+#ifdef USE_INLINES
+# ifdef __GNUC__
+# define RTEMS_INLINE_ROUTINE static __inline__
+# else
+# define RTEMS_INLINE_ROUTINE static inline
+# endif
+#else
+# define RTEMS_INLINE_ROUTINE
+#endif
+
+/*
+ * Include a base set of files.
+ */
+
+/*
+ * XXX: Eventually proc_ptr needs to disappear!!!
+ */
+
+typedef void * proc_ptr;
+
+#include <rtems/score/cpu.h> /* processor specific information */
+
+/*
+ * Define NULL
+ */
+
+#ifndef NULL
+#define NULL 0 /* NULL value */
+#endif
+
+/*
+ * Boolean constants
+ */
+
+#if !defined( TRUE ) || (TRUE != 1)
+#undef TRUE
+#define TRUE (1)
+#endif
+
+#if !defined( FALSE ) || (FALSE != 0)
+#undef FALSE
+#define FALSE (0)
+#endif
+
+#define stringify( _x ) # _x
+
+#define RTEMS_offsetof(type, field) \
+ ((unsigned32) &(((type *) 0)->field))
+
+/*
+ * The following is the extern for the RTEMS version string.
+ * The contents of this string are CPU specific.
+ */
+
+extern const char _RTEMS_version[]; /* RTEMS version string */
+extern const char _Copyright_Notice[]; /* RTEMS copyright string */
+
+/*
+ * The following defines the CPU dependent information table.
+ */
+
+SCORE_EXTERN rtems_cpu_table _CPU_Table; /* CPU dependent info */
+
+/*
+ * XXX weird RTEMS stuff
+ */
+
+#define RTEMS_MAXIMUM_NAME_LENGTH 4
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/Makefile.in b/c/src/exec/score/inline/Makefile.in
new file mode 100644
index 0000000000..147df5ad0f
--- /dev/null
+++ b/c/src/exec/score/inline/Makefile.in
@@ -0,0 +1,31 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= address chain coremsg coremutex coresem heap \
+ isr mppkt object objectmp priority stack states sysstate thread \
+ threadmp tod tqdata userext watchdog wkspace
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/score
diff --git a/c/src/exec/score/inline/address.inl b/c/src/exec/score/inline/address.inl
new file mode 100644
index 0000000000..e30ca616fa
--- /dev/null
+++ b/c/src/exec/score/inline/address.inl
@@ -0,0 +1,120 @@
+/* inline/address.inl
+ *
+ * This include file contains the bodies of the routines
+ * about addresses which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ADDRESSES_inl
+#define __INLINE_ADDRESSES_inl
+
+/*PAGE
+ *
+ * _Addresses_Add_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to add an offset to a base address.
+ * It returns the resulting address. This address is typically
+ * converted to an access type before being used further.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (void *)((char *)base + offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract an offset from a base
+ * address. It returns the resulting address. This address is
+ * typically converted to an access type before being used further.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Addresses_Subtract_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (void *)((char *)base - offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract two addresses. It returns the
+ * resulting offset.
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Addresses_Subtract (
+ void *left,
+ void *right
+)
+{
+ return ((char *) left - (char *) right);
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is correctly
+ * aligned for this processor and FALSE otherwise. Proper alignment
+ * is based on correctness and efficiency.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Addresses_Is_aligned (
+ void *address
+)
+{
+ return ( ( (unsigned32)address % CPU_ALIGNMENT ) == 0 );
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_in_range
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is within the
+ * memory range specified and FALSE otherwise. base is the address
+ * of the first byte in the memory range and limit is the address
+ * of the last byte in the memory range. The base address is
+ * assumed to be lower than the limit address.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Addresses_Is_in_range (
+ void *address,
+ void *base,
+ void *limit
+)
+{
+ return ( address >= base && address <= limit );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/chain.inl b/c/src/exec/score/inline/chain.inl
new file mode 100644
index 0000000000..732010099f
--- /dev/null
+++ b/c/src/exec/score/inline/chain.inl
@@ -0,0 +1,390 @@
+/* inline/chain.inl
+ *
+ * This include file contains the bodies of the routines which are
+ * associated with doubly linked chains and inlined.
+ *
+ * NOTE: The routines in this file are ordered from simple
+ * to complex. No other Chain Handler routine is referenced
+ * unless it has already been defined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CHAIN_inl
+#define __INLINE_CHAIN_inl
+
+/*PAGE
+ *
+ * _Chain_Are_nodes_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if LEFT and RIGHT are equal,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Are_nodes_equal(
+ Chain_Node *left,
+ Chain_Node *right
+)
+{
+ return left == right;
+}
+
+/*PAGE
+ *
+ * _Chain_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_chain is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_null(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_null_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_null_node(
+ Chain_Node *the_node
+)
+{
+ return ( the_node == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the first node on the chain.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Head(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) the_chain;
+}
+
+/*PAGE
+ *
+ * _Chain_Tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the last node on the chain.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) &the_chain->permanent_null;
+}
+
+/*PAGE
+ *
+ * _Chain_Is_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there a no nodes on the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_first
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the first node on a chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_first(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->previous == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_last
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the last node on a chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_last(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->next == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Has_only_one_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there is only one node on the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Has_only_one_node(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == the_chain->last );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the head of the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_head(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Head( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the tail of the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_tail(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * Chain_Initialize_empty
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the specified chain to contain zero nodes.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
+ Chain_Control *the_chain
+)
+{
+ the_chain->first = _Chain_Tail( the_chain );
+ the_chain->permanent_null = NULL;
+ the_chain->last = _Chain_Head( the_chain );
+}
+
+/*PAGE
+ *
+ * _Chain_Extract_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * extract operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Extract_unprotected(
+ Chain_Node *the_node
+)
+{
+ Chain_Node *next;
+ Chain_Node *previous;
+
+ next = the_node->next;
+ previous = the_node->previous;
+ next->previous = previous;
+ previous->next = next;
+}
+
+/*PAGE
+ *
+ * _Chain_Get_first_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. It does NOT disable interrupts to insure
+ * the atomicity of the get operation.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+)
+{
+ Chain_Node *return_node;
+ Chain_Node *new_first;
+
+ return_node = the_chain->first;
+ new_first = return_node->next;
+ the_chain->first = new_first;
+ new_first->previous = _Chain_Head( the_chain );
+
+ return return_node;
+}
+
+/*PAGE
+ *
+ * Chain_Get_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * get operation.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
+ Chain_Control *the_chain
+)
+{
+ if ( !_Chain_Is_empty( the_chain ) )
+ return _Chain_Get_first_unprotected( the_chain );
+ else
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Chain_Insert_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It does NOT disable interrupts to insure the atomicity
+ * of the extract operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Insert_unprotected(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *before_node;
+
+ the_node->previous = after_node;
+ before_node = after_node->next;
+ after_node->next = the_node;
+ the_node->next = before_node;
+ before_node->previous = the_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Append_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * append operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *old_last_node;
+
+ the_node->next = _Chain_Tail( the_chain );
+ old_last_node = the_chain->last;
+ the_chain->last = the_node;
+ old_last_node->next = the_node;
+ the_node->previous = old_last_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert_unprotected( _Chain_Head( the_chain ), the_node );
+
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend
+ *
+ * DESCRIPTION:
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Prepend(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert( _Chain_Head( the_chain ), the_node );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/coremsg.inl b/c/src/exec/score/inline/coremsg.inl
new file mode 100644
index 0000000000..9037e38d8c
--- /dev/null
+++ b/c/src/exec/score/inline/coremsg.inl
@@ -0,0 +1,260 @@
+/* coremsg.inl
+ *
+ * This include file contains the static inline implementation of all
+ * inlined routines in the Core Message Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CORE_MESSAGE_QUEUE_inl
+#define __CORE_MESSAGE_QUEUE_inl
+
+#include <string.h> /* needed for memcpy */
+
+/*PAGE
+ *
+ * _CORE_message_queue_Send
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a message to the end of the specified message queue.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Status _CORE_message_queue_Send(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support
+)
+{
+ return _CORE_message_queue_Submit(
+ the_message_queue,
+ buffer,
+ size,
+ id,
+ api_message_queue_mp_support,
+ CORE_MESSAGE_QUEUE_SEND_REQUEST
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Urgent
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a message to the front of the specified message queue.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Status _CORE_message_queue_Urgent(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support
+)
+{
+ return _CORE_message_queue_Submit(
+ the_message_queue,
+ buffer,
+ size,
+ id,
+ api_message_queue_mp_support,
+ CORE_MESSAGE_QUEUE_URGENT_REQUEST
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Copy_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine copies the contents of the source message buffer
+ * to the destination message buffer.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Copy_buffer (
+ void *source,
+ void *destination,
+ unsigned32 size
+)
+{
+ memcpy(destination, source, size);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Allocate_message_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message buffer from the inactive
+ * message buffer chain.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Buffer_control *
+_CORE_message_queue_Allocate_message_buffer (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (CORE_message_queue_Buffer_control *)
+ _Chain_Get( &the_message_queue->Inactive_messages );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Free_message_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a message buffer to the inactive
+ * message buffer chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Get_pending_message
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first message from the_message_queue
+ * and returns a pointer to it.
+ */
+
+RTEMS_INLINE_ROUTINE
+ CORE_message_queue_Buffer_control *_CORE_message_queue_Get_pending_message (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (CORE_message_queue_Buffer_control *)
+ _Chain_Get_unprotected( &the_message_queue->Pending_messages );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_priority(
+ CORE_message_queue_Attributes *the_attribute
+)
+{
+ return (the_attribute->discipline == CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Append
+ *
+ * DESCRIPTION:
+ *
+ * This routine places the_message at the rear of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Append (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Append( &the_message_queue->Pending_messages, &the_message->Node );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Prepend
+ *
+ * DESCRIPTION:
+ *
+ * This routine places the_message at the front of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Prepend (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Prepend(
+ &the_message_queue->Pending_messages,
+ &the_message->Node
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_message_queue is TRUE and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_null (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return ( the_message_queue == NULL );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_notify_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if notification is enabled on this message
+ * queue and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_notify_enabled (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (the_message_queue->notify_handler != NULL);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Set_notify
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the notification information for the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Set_notify (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Notify_Handler the_handler,
+ void *the_argument
+)
+{
+ the_message_queue->notify_handler = the_handler;
+ the_message_queue->notify_argument = the_argument;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/coremutex.inl b/c/src/exec/score/inline/coremutex.inl
new file mode 100644
index 0000000000..411c1d3a22
--- /dev/null
+++ b/c/src/exec/score/inline/coremutex.inl
@@ -0,0 +1,124 @@
+/* inline/coremutex.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE mutexes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CORE_MUTEX_inl
+#define __INLINE_CORE_MUTEX_inl
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_locked
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex specified is locked and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_locked(
+ CORE_mutex_Control *the_mutex
+)
+{
+ return the_mutex->lock == CORE_MUTEX_LOCKED;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_fifo
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is FIFO and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_fifo(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_FIFO;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is PRIORITY and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_priority(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_inherit_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * INHERIT_PRIORITY and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE 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
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * PRIORITY_CEILING and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE 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.
+ */
+
+RTEMS_INLINE_ROUTINE 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/c/src/exec/score/inline/coresem.inl b/c/src/exec/score/inline/coresem.inl
new file mode 100644
index 0000000000..dcca1761f1
--- /dev/null
+++ b/c/src/exec/score/inline/coresem.inl
@@ -0,0 +1,54 @@
+/* inline/coresem.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE semaphore.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CORE_SEMAPHORE_inl
+#define __INLINE_CORE_SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _CORE_semaphore_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_semaphore_Is_priority(
+ CORE_semaphore_Attributes *the_attribute
+)
+{
+ return ( the_attribute->discipline == CORE_SEMAPHORE_DISCIPLINES_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _CORE_semaphore_Get_count
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the current count associated with the semaphore.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _CORE_semaphore_Get_count(
+ CORE_semaphore_Control *the_semaphore
+)
+{
+ return the_semaphore->count;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/heap.inl b/c/src/exec/score/inline/heap.inl
new file mode 100644
index 0000000000..bca2e3ee92
--- /dev/null
+++ b/c/src/exec/score/inline/heap.inl
@@ -0,0 +1,274 @@
+/* heap.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the heap handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __HEAP_inl
+#define __HEAP_inl
+
+#include <rtems/score/address.h>
+
+/*PAGE
+ *
+ * _Heap_Head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the head of the specified heap.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Head (
+ Heap_Control *the_heap
+)
+{
+ return (Heap_Block *)&the_heap->start;
+}
+
+/*PAGE
+ *
+ * _Heap_Tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the tail of the specified heap.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Tail (
+ Heap_Control *the_heap
+)
+{
+ return (Heap_Block *)&the_heap->final;
+}
+
+/*PAGE
+ *
+ * _Heap_Previous_block
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the address of the block which physically
+ * precedes the_block in memory.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Previous_block (
+ Heap_Block *the_block
+)
+{
+ return (Heap_Block *) _Addresses_Subtract_offset(
+ (void *)the_block,
+ the_block->back_flag & ~ HEAP_BLOCK_USED
+ );
+}
+
+/*PAGE
+ *
+ * _Heap_Next_block
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the address of the block which physically
+ * follows the_block in memory.
+ *
+ * NOTE: Next_block assumes that the block is free.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Next_block (
+ Heap_Block *the_block
+)
+{
+ return (Heap_Block *) _Addresses_Add_offset(
+ (void *)the_block,
+ the_block->front_flag & ~ HEAP_BLOCK_USED
+ );
+}
+
+/*PAGE
+ *
+ * _Heap_Block_at
+ *
+ * DESCRIPTION:
+ *
+ * This function calculates and returns a block's location (address)
+ * in the heap based upad a base address and an offset.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
+ void *base,
+ unsigned32 offset
+)
+{
+ return (Heap_Block *) _Addresses_Add_offset( (void *)base, offset );
+}
+
+/*PAGE
+ *
+ * _Heap_User_block_at
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_User_block_at(
+ void *base
+)
+{
+ unsigned32 offset;
+
+ offset = *(((unsigned32 *) base) - 1);
+ return _Heap_Block_at( base, -offset + -HEAP_BLOCK_USED_OVERHEAD);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_previous_block_free
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the previous block of the_block
+ * is free, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_previous_block_free (
+ Heap_Block *the_block
+)
+{
+ return !(the_block->back_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_free
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the block is free, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_free (
+ Heap_Block *the_block
+)
+{
+ return !(the_block->front_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_used
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the block is currently allocated,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_used (
+ Heap_Block *the_block
+)
+{
+ return (the_block->front_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Block_size
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the size of the_block in bytes.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Heap_Block_size (
+ Heap_Block *the_block
+)
+{
+ return (the_block->front_flag & ~HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Start_of_user_area
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the starting address of the portion of the block
+ * which the user may access.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Heap_Start_of_user_area (
+ Heap_Block *the_block
+)
+{
+ return (void *) &the_block->next;
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_in
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_block is within the memory area
+ * managed by the_heap, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_in (
+ Heap_Control *the_heap,
+ Heap_Block *the_block
+)
+{
+ return _Addresses_Is_in_range( the_block, the_heap->start, the_heap->final );
+}
+
+/*PAGE
+ *
+ * _Heap_Is_page_size_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function validates a specified heap page size. If the page size
+ * is 0 or if lies outside a page size alignment boundary it is invalid
+ * and FALSE is returned. Otherwise, the page size is valid and TRUE is
+ * returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_page_size_valid(
+ unsigned32 page_size
+)
+{
+ return ((page_size != 0) &&
+ ((page_size % CPU_HEAP_ALIGNMENT) == 0));
+}
+
+/*PAGE
+ *
+ * _Heap_Build_flag
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the block flag composed of size and in_use_flag.
+ * The flag returned is suitable for use as a back or front flag in a
+ * heap block.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Heap_Build_flag (
+ unsigned32 size,
+ unsigned32 in_use_flag
+)
+{
+ return size | in_use_flag;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/isr.inl b/c/src/exec/score/inline/isr.inl
new file mode 100644
index 0000000000..2cfbe6e1b9
--- /dev/null
+++ b/c/src/exec/score/inline/isr.inl
@@ -0,0 +1,73 @@
+/* isr.inl
+ *
+ * This include file contains the static implementation of all
+ * inlined routines in the Interrupt Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_inl
+#define __ISR_inl
+
+/*PAGE
+ *
+ * _ISR_Is_in_progress
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the processor is currently servicing
+ * and interrupt and FALSE otherwise. A return value of TRUE indicates
+ * that the caller is an interrupt service routine, NOT a thread. The
+ * directives available to an interrupt service routine are restricted.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_in_progress( void )
+{
+ return (_ISR_Nest_level != 0);
+}
+
+/*PAGE
+ *
+ * _ISR_Is_vector_number_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the vector is a valid vector number
+ * for this processor and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_vector_number_valid (
+ unsigned32 vector
+)
+{
+ return ( vector <= CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER );
+}
+
+/*PAGE
+ *
+ * _ISR_Is_valid_user_handler
+ *
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if handler is the entry point of a valid
+ * use interrupt service routine and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_valid_user_handler (
+ void *handler
+)
+{
+ return ( handler != NULL);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/mppkt.inl b/c/src/exec/score/inline/mppkt.inl
new file mode 100644
index 0000000000..a805e24ac7
--- /dev/null
+++ b/c/src/exec/score/inline/mppkt.inl
@@ -0,0 +1,58 @@
+/* inline/mppkt.inl
+ *
+ * This package is the implementation of the Packet Handler
+ * routines which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_PACKET_inl
+#define __INLINE_MP_PACKET_inl
+
+/*PAGE
+ *
+ * _Mp_packet_Is_valid_packet_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the the_packet_class is valid,
+ * and FALSE otherwise.
+ *
+ * NOTE: Check for lower bounds (MP_PACKET_CLASSES_FIRST ) is unnecessary
+ * because this enum starts at lower bound of zero.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Mp_packet_Is_valid_packet_class (
+ MP_packet_Classes the_packet_class
+)
+{
+ return ( the_packet_class <= MP_PACKET_CLASSES_LAST );
+}
+
+/*PAGE
+ *
+ * _Mp_packet_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the the_packet_class is null,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Mp_packet_Is_null (
+ MP_packet_Prefix *the_packet
+)
+{
+ return the_packet == NULL;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/object.inl b/c/src/exec/score/inline/object.inl
new file mode 100644
index 0000000000..9e71164068
--- /dev/null
+++ b/c/src/exec/score/inline/object.inl
@@ -0,0 +1,244 @@
+/* object.inl
+ *
+ * This include file contains the static inline implementation of all
+ * of the inlined routines in the Object Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_inl
+#define __OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_Build_id
+ *
+ * DESCRIPTION:
+ *
+ * This function builds an object's id from the processor node and index
+ * values specified.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id(
+ Objects_Classes the_class,
+ unsigned32 node,
+ unsigned32 index
+)
+{
+ return ( (the_class << OBJECTS_CLASS_START_BIT) |
+ (node << OBJECTS_NODE_START_BIT) |
+ (index << OBJECTS_INDEX_START_BIT) );
+}
+
+/*PAGE
+ *
+ * _Objects_Get_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the class portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Classes _Objects_Get_class(
+ Objects_Id id
+)
+{
+ return (Objects_Classes)
+ ((id >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS);
+}
+
+
+/*PAGE
+ *
+ * _Objects_Get_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the node portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Objects_Get_node(
+ Objects_Id id
+)
+{
+ return (id >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS;
+}
+
+/*PAGE
+ *
+ * _Objects_Get_index
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the index portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Objects_Get_index(
+ Objects_Id id
+)
+{
+ return (id >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS;
+}
+
+/*PAGE
+ *
+ * _Objects_Is_class_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is valid.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_class_valid(
+ Objects_Classes the_class
+)
+{
+ return the_class <= OBJECTS_CLASSES_LAST;
+}
+
+/*PAGE
+ *
+ * _Objects_Is_local_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the node is of the local object, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_local_node(
+ unsigned32 node
+)
+{
+ return ( node == _Objects_Local_node );
+}
+
+/*PAGE
+ *
+ * _Objects_Is_local_id
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the id is of a local object, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_local_id(
+ Objects_Id id
+)
+{
+ return _Objects_Is_local_node( _Objects_Get_node(id) );
+}
+
+/*PAGE
+ *
+ * _Objects_Are_ids_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if left and right are equal,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Are_ids_equal(
+ Objects_Id left,
+ Objects_Id right
+)
+{
+ return ( left == right );
+}
+
+/*PAGE
+ *
+ * _Objects_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a object control block from
+ * the inactive chain of free object control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Control *_Objects_Allocate(
+ Objects_Information *information
+)
+{
+ return (Objects_Control *) _Chain_Get( &information->Inactive );
+}
+
+/*PAGE
+ *
+ * _Objects_Free
+ *
+ * DESCRIPTION:
+ *
+ * This function frees a object control block to the
+ * inactive chain of free object control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Free(
+ Objects_Information *information,
+ Objects_Control *the_object
+)
+{
+ _Chain_Append( &information->Inactive, &the_object->Node );
+}
+
+/*PAGE
+ *
+ * _Objects_Open
+ *
+ * DESCRIPTION:
+ *
+ * This function places the_object control pointer and object name
+ * in the Local Pointer and Local Name Tables, respectively.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Open(
+ Objects_Information *information,
+ Objects_Control *the_object,
+ Objects_Name name
+)
+{
+ unsigned32 index;
+
+ index = _Objects_Get_index( the_object->id );
+ information->local_table[ index ] = the_object;
+
+ if ( information->is_string )
+ _Objects_Copy_name_string( name, the_object->name );
+ else
+ _Objects_Copy_name_raw( name, the_object->name, information->name_length );
+}
+
+/*PAGE
+ *
+ * _Objects_Close
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the_object control pointer and object name
+ * in the Local Pointer and Local Name Tables.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Close(
+ Objects_Information *information,
+ Objects_Control *the_object
+)
+{
+ unsigned32 index;
+
+ index = _Objects_Get_index( the_object->id );
+ information->local_table[ index ] = NULL;
+ _Objects_Clear_name( the_object->name, information->name_length );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/objectmp.inl b/c/src/exec/score/inline/objectmp.inl
new file mode 100644
index 0000000000..12b0df642a
--- /dev/null
+++ b/c/src/exec/score/inline/objectmp.inl
@@ -0,0 +1,73 @@
+/* inline/objectmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * which deal with global objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_OBJECTS_inl
+#define __INLINE_MP_OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a Global Object control block.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_MP_Control *_Objects_MP_Allocate_global_object (
+ void
+)
+{
+ return (Objects_MP_Control *)
+ _Chain_Get( &_Objects_MP_Inactive_global_objects );
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Free_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This routine deallocates a Global Object control block.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_MP_Free_global_object (
+ Objects_MP_Control *the_object
+)
+{
+ _Chain_Append(
+ &_Objects_MP_Inactive_global_objects,
+ &the_object->Object.Node
+ );
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Is_null_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This function returns whether the global object is NULL or not.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_MP_Is_null_global_object (
+ Objects_MP_Control *the_object
+)
+{
+ return( the_object == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/priority.inl b/c/src/exec/score/inline/priority.inl
new file mode 100644
index 0000000000..1dfa53057e
--- /dev/null
+++ b/c/src/exec/score/inline/priority.inl
@@ -0,0 +1,247 @@
+/* priority.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the Priority Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_inl
+#define __PRIORITY_inl
+
+#include <rtems/score/bitfield.h>
+
+/*PAGE
+ *
+ * _Priority_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Handler_initialization( void )
+{
+ unsigned32 index;
+
+ _Priority_Major_bit_map = 0;
+ for ( index=0 ; index <16 ; index++ )
+ _Priority_Bit_map[ index ] = 0;
+}
+
+/*PAGE
+ *
+ * _Priority_Is_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority if valid for a
+ * user task, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Priority_Is_valid (
+ Priority_Control the_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
+ *
+ * _Priority_Major
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the major portion of the_priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Major (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority / 16 );
+}
+
+/*PAGE
+ *
+ * _Priority_Minor
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the minor portion of the_priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Minor (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority % 16 );
+}
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
+
+/*PAGE
+ *
+ * _Priority_Mask
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the mask associated with the major or minor
+ * number passed to it.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Mask (
+ unsigned32 bit_number
+)
+{
+ return (0x8000 >> bit_number);
+}
+
+
+/*PAGE
+ *
+ * _Priority_Bits_index
+ *
+ * DESCRIPTION:
+ *
+ * This function translates the bit numbers returned by the bit scan
+ * of a priority bit field into something suitable for use as
+ * a major or minor component of a priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Bits_index (
+ unsigned32 bit_number
+)
+{
+ return bit_number;
+}
+
+#endif
+
+/*PAGE
+ *
+ * _Priority_Add_to_bit_map
+ *
+ * DESCRIPTION:
+ *
+ * This routine uses the_priority_map to update the priority
+ * bit maps to indicate that a thread has been readied.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map (
+ Priority_Information *the_priority_map
+)
+{
+ *the_priority_map->minor |= the_priority_map->ready_minor;
+ _Priority_Major_bit_map |= the_priority_map->ready_major;
+}
+
+/*PAGE
+ *
+ * _Priority_Remove_from_bit_map
+ *
+ * DESCRIPTION:
+ *
+ * This routine uses the_priority_map to update the priority
+ * bit maps to indicate that a thread has been removed from the
+ * ready state.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Remove_from_bit_map (
+ Priority_Information *the_priority_map
+)
+{
+ *the_priority_map->minor &= the_priority_map->block_minor;
+ if ( *the_priority_map->minor == 0 )
+ _Priority_Major_bit_map &= the_priority_map->block_major;
+}
+
+/*PAGE
+ *
+ * _Priority_Get_highest
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the priority of the highest priority
+ * ready thread.
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_highest( void )
+{
+ Priority_Bit_map_control minor;
+ Priority_Bit_map_control major;
+
+ _Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
+ _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
+
+ return (_Priority_Bits_index( major ) << 4) +
+ _Priority_Bits_index( minor );
+}
+
+/*PAGE
+ *
+ * _Priority_Initialize_information
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_priority_map so that it
+ * contains the information necessary to manage a thread
+ * at new_priority.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Initialize_information(
+ Priority_Information *the_priority_map,
+ Priority_Control new_priority
+)
+{
+ Priority_Bit_map_control major;
+ Priority_Bit_map_control minor;
+ Priority_Bit_map_control mask;
+
+ major = _Priority_Major( new_priority );
+ minor = _Priority_Minor( new_priority );
+
+ the_priority_map->minor =
+ &_Priority_Bit_map[ _Priority_Bits_index(major) ];
+
+ mask = _Priority_Mask( major );
+ the_priority_map->ready_major = mask;
+ the_priority_map->block_major = ~mask;
+
+ mask = _Priority_Mask( minor );
+ the_priority_map->ready_minor = mask;
+ the_priority_map->block_minor = ~mask;
+}
+
+/*PAGE
+ *
+ * _Priority_Is_group_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority GROUP is empty, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Priority_Is_group_empty (
+ Priority_Control the_priority
+)
+{
+ return the_priority == 0;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/Makefile.in b/c/src/exec/score/inline/rtems/score/Makefile.in
new file mode 100644
index 0000000000..147df5ad0f
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/Makefile.in
@@ -0,0 +1,31 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= address chain coremsg coremutex coresem heap \
+ isr mppkt object objectmp priority stack states sysstate thread \
+ threadmp tod tqdata userext watchdog wkspace
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/score
diff --git a/c/src/exec/score/inline/rtems/score/address.inl b/c/src/exec/score/inline/rtems/score/address.inl
new file mode 100644
index 0000000000..e30ca616fa
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/address.inl
@@ -0,0 +1,120 @@
+/* inline/address.inl
+ *
+ * This include file contains the bodies of the routines
+ * about addresses which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ADDRESSES_inl
+#define __INLINE_ADDRESSES_inl
+
+/*PAGE
+ *
+ * _Addresses_Add_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to add an offset to a base address.
+ * It returns the resulting address. This address is typically
+ * converted to an access type before being used further.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (void *)((char *)base + offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract an offset from a base
+ * address. It returns the resulting address. This address is
+ * typically converted to an access type before being used further.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Addresses_Subtract_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (void *)((char *)base - offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract two addresses. It returns the
+ * resulting offset.
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Addresses_Subtract (
+ void *left,
+ void *right
+)
+{
+ return ((char *) left - (char *) right);
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is correctly
+ * aligned for this processor and FALSE otherwise. Proper alignment
+ * is based on correctness and efficiency.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Addresses_Is_aligned (
+ void *address
+)
+{
+ return ( ( (unsigned32)address % CPU_ALIGNMENT ) == 0 );
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_in_range
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is within the
+ * memory range specified and FALSE otherwise. base is the address
+ * of the first byte in the memory range and limit is the address
+ * of the last byte in the memory range. The base address is
+ * assumed to be lower than the limit address.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Addresses_Is_in_range (
+ void *address,
+ void *base,
+ void *limit
+)
+{
+ return ( address >= base && address <= limit );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/chain.inl b/c/src/exec/score/inline/rtems/score/chain.inl
new file mode 100644
index 0000000000..732010099f
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/chain.inl
@@ -0,0 +1,390 @@
+/* inline/chain.inl
+ *
+ * This include file contains the bodies of the routines which are
+ * associated with doubly linked chains and inlined.
+ *
+ * NOTE: The routines in this file are ordered from simple
+ * to complex. No other Chain Handler routine is referenced
+ * unless it has already been defined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CHAIN_inl
+#define __INLINE_CHAIN_inl
+
+/*PAGE
+ *
+ * _Chain_Are_nodes_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if LEFT and RIGHT are equal,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Are_nodes_equal(
+ Chain_Node *left,
+ Chain_Node *right
+)
+{
+ return left == right;
+}
+
+/*PAGE
+ *
+ * _Chain_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_chain is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_null(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_null_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_null_node(
+ Chain_Node *the_node
+)
+{
+ return ( the_node == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the first node on the chain.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Head(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) the_chain;
+}
+
+/*PAGE
+ *
+ * _Chain_Tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the last node on the chain.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) &the_chain->permanent_null;
+}
+
+/*PAGE
+ *
+ * _Chain_Is_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there a no nodes on the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_first
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the first node on a chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_first(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->previous == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_last
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the last node on a chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_last(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->next == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Has_only_one_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there is only one node on the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Has_only_one_node(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == the_chain->last );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the head of the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_head(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Head( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the tail of the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_tail(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * Chain_Initialize_empty
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the specified chain to contain zero nodes.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
+ Chain_Control *the_chain
+)
+{
+ the_chain->first = _Chain_Tail( the_chain );
+ the_chain->permanent_null = NULL;
+ the_chain->last = _Chain_Head( the_chain );
+}
+
+/*PAGE
+ *
+ * _Chain_Extract_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * extract operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Extract_unprotected(
+ Chain_Node *the_node
+)
+{
+ Chain_Node *next;
+ Chain_Node *previous;
+
+ next = the_node->next;
+ previous = the_node->previous;
+ next->previous = previous;
+ previous->next = next;
+}
+
+/*PAGE
+ *
+ * _Chain_Get_first_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. It does NOT disable interrupts to insure
+ * the atomicity of the get operation.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+)
+{
+ Chain_Node *return_node;
+ Chain_Node *new_first;
+
+ return_node = the_chain->first;
+ new_first = return_node->next;
+ the_chain->first = new_first;
+ new_first->previous = _Chain_Head( the_chain );
+
+ return return_node;
+}
+
+/*PAGE
+ *
+ * Chain_Get_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * get operation.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
+ Chain_Control *the_chain
+)
+{
+ if ( !_Chain_Is_empty( the_chain ) )
+ return _Chain_Get_first_unprotected( the_chain );
+ else
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Chain_Insert_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It does NOT disable interrupts to insure the atomicity
+ * of the extract operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Insert_unprotected(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *before_node;
+
+ the_node->previous = after_node;
+ before_node = after_node->next;
+ after_node->next = the_node;
+ the_node->next = before_node;
+ before_node->previous = the_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Append_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * append operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *old_last_node;
+
+ the_node->next = _Chain_Tail( the_chain );
+ old_last_node = the_chain->last;
+ the_chain->last = the_node;
+ old_last_node->next = the_node;
+ the_node->previous = old_last_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert_unprotected( _Chain_Head( the_chain ), the_node );
+
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend
+ *
+ * DESCRIPTION:
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Prepend(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert( _Chain_Head( the_chain ), the_node );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/coremsg.inl b/c/src/exec/score/inline/rtems/score/coremsg.inl
new file mode 100644
index 0000000000..9037e38d8c
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/coremsg.inl
@@ -0,0 +1,260 @@
+/* coremsg.inl
+ *
+ * This include file contains the static inline implementation of all
+ * inlined routines in the Core Message Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CORE_MESSAGE_QUEUE_inl
+#define __CORE_MESSAGE_QUEUE_inl
+
+#include <string.h> /* needed for memcpy */
+
+/*PAGE
+ *
+ * _CORE_message_queue_Send
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a message to the end of the specified message queue.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Status _CORE_message_queue_Send(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support
+)
+{
+ return _CORE_message_queue_Submit(
+ the_message_queue,
+ buffer,
+ size,
+ id,
+ api_message_queue_mp_support,
+ CORE_MESSAGE_QUEUE_SEND_REQUEST
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Urgent
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a message to the front of the specified message queue.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Status _CORE_message_queue_Urgent(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support
+)
+{
+ return _CORE_message_queue_Submit(
+ the_message_queue,
+ buffer,
+ size,
+ id,
+ api_message_queue_mp_support,
+ CORE_MESSAGE_QUEUE_URGENT_REQUEST
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Copy_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine copies the contents of the source message buffer
+ * to the destination message buffer.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Copy_buffer (
+ void *source,
+ void *destination,
+ unsigned32 size
+)
+{
+ memcpy(destination, source, size);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Allocate_message_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message buffer from the inactive
+ * message buffer chain.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Buffer_control *
+_CORE_message_queue_Allocate_message_buffer (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (CORE_message_queue_Buffer_control *)
+ _Chain_Get( &the_message_queue->Inactive_messages );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Free_message_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a message buffer to the inactive
+ * message buffer chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Get_pending_message
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first message from the_message_queue
+ * and returns a pointer to it.
+ */
+
+RTEMS_INLINE_ROUTINE
+ CORE_message_queue_Buffer_control *_CORE_message_queue_Get_pending_message (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (CORE_message_queue_Buffer_control *)
+ _Chain_Get_unprotected( &the_message_queue->Pending_messages );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_priority(
+ CORE_message_queue_Attributes *the_attribute
+)
+{
+ return (the_attribute->discipline == CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Append
+ *
+ * DESCRIPTION:
+ *
+ * This routine places the_message at the rear of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Append (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Append( &the_message_queue->Pending_messages, &the_message->Node );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Prepend
+ *
+ * DESCRIPTION:
+ *
+ * This routine places the_message at the front of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Prepend (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Prepend(
+ &the_message_queue->Pending_messages,
+ &the_message->Node
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_message_queue is TRUE and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_null (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return ( the_message_queue == NULL );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_notify_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if notification is enabled on this message
+ * queue and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_notify_enabled (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (the_message_queue->notify_handler != NULL);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Set_notify
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the notification information for the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Set_notify (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Notify_Handler the_handler,
+ void *the_argument
+)
+{
+ the_message_queue->notify_handler = the_handler;
+ the_message_queue->notify_argument = the_argument;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/coremutex.inl b/c/src/exec/score/inline/rtems/score/coremutex.inl
new file mode 100644
index 0000000000..411c1d3a22
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/coremutex.inl
@@ -0,0 +1,124 @@
+/* inline/coremutex.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE mutexes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CORE_MUTEX_inl
+#define __INLINE_CORE_MUTEX_inl
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_locked
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex specified is locked and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_locked(
+ CORE_mutex_Control *the_mutex
+)
+{
+ return the_mutex->lock == CORE_MUTEX_LOCKED;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_fifo
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is FIFO and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_fifo(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_FIFO;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is PRIORITY and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_priority(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_inherit_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * INHERIT_PRIORITY and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE 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
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * PRIORITY_CEILING and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE 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.
+ */
+
+RTEMS_INLINE_ROUTINE 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/c/src/exec/score/inline/rtems/score/coresem.inl b/c/src/exec/score/inline/rtems/score/coresem.inl
new file mode 100644
index 0000000000..dcca1761f1
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/coresem.inl
@@ -0,0 +1,54 @@
+/* inline/coresem.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE semaphore.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CORE_SEMAPHORE_inl
+#define __INLINE_CORE_SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _CORE_semaphore_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_semaphore_Is_priority(
+ CORE_semaphore_Attributes *the_attribute
+)
+{
+ return ( the_attribute->discipline == CORE_SEMAPHORE_DISCIPLINES_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _CORE_semaphore_Get_count
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the current count associated with the semaphore.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _CORE_semaphore_Get_count(
+ CORE_semaphore_Control *the_semaphore
+)
+{
+ return the_semaphore->count;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/heap.inl b/c/src/exec/score/inline/rtems/score/heap.inl
new file mode 100644
index 0000000000..bca2e3ee92
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/heap.inl
@@ -0,0 +1,274 @@
+/* heap.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the heap handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __HEAP_inl
+#define __HEAP_inl
+
+#include <rtems/score/address.h>
+
+/*PAGE
+ *
+ * _Heap_Head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the head of the specified heap.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Head (
+ Heap_Control *the_heap
+)
+{
+ return (Heap_Block *)&the_heap->start;
+}
+
+/*PAGE
+ *
+ * _Heap_Tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the tail of the specified heap.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Tail (
+ Heap_Control *the_heap
+)
+{
+ return (Heap_Block *)&the_heap->final;
+}
+
+/*PAGE
+ *
+ * _Heap_Previous_block
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the address of the block which physically
+ * precedes the_block in memory.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Previous_block (
+ Heap_Block *the_block
+)
+{
+ return (Heap_Block *) _Addresses_Subtract_offset(
+ (void *)the_block,
+ the_block->back_flag & ~ HEAP_BLOCK_USED
+ );
+}
+
+/*PAGE
+ *
+ * _Heap_Next_block
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the address of the block which physically
+ * follows the_block in memory.
+ *
+ * NOTE: Next_block assumes that the block is free.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Next_block (
+ Heap_Block *the_block
+)
+{
+ return (Heap_Block *) _Addresses_Add_offset(
+ (void *)the_block,
+ the_block->front_flag & ~ HEAP_BLOCK_USED
+ );
+}
+
+/*PAGE
+ *
+ * _Heap_Block_at
+ *
+ * DESCRIPTION:
+ *
+ * This function calculates and returns a block's location (address)
+ * in the heap based upad a base address and an offset.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
+ void *base,
+ unsigned32 offset
+)
+{
+ return (Heap_Block *) _Addresses_Add_offset( (void *)base, offset );
+}
+
+/*PAGE
+ *
+ * _Heap_User_block_at
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_User_block_at(
+ void *base
+)
+{
+ unsigned32 offset;
+
+ offset = *(((unsigned32 *) base) - 1);
+ return _Heap_Block_at( base, -offset + -HEAP_BLOCK_USED_OVERHEAD);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_previous_block_free
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the previous block of the_block
+ * is free, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_previous_block_free (
+ Heap_Block *the_block
+)
+{
+ return !(the_block->back_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_free
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the block is free, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_free (
+ Heap_Block *the_block
+)
+{
+ return !(the_block->front_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_used
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the block is currently allocated,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_used (
+ Heap_Block *the_block
+)
+{
+ return (the_block->front_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Block_size
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the size of the_block in bytes.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Heap_Block_size (
+ Heap_Block *the_block
+)
+{
+ return (the_block->front_flag & ~HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Start_of_user_area
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the starting address of the portion of the block
+ * which the user may access.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Heap_Start_of_user_area (
+ Heap_Block *the_block
+)
+{
+ return (void *) &the_block->next;
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_in
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_block is within the memory area
+ * managed by the_heap, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_in (
+ Heap_Control *the_heap,
+ Heap_Block *the_block
+)
+{
+ return _Addresses_Is_in_range( the_block, the_heap->start, the_heap->final );
+}
+
+/*PAGE
+ *
+ * _Heap_Is_page_size_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function validates a specified heap page size. If the page size
+ * is 0 or if lies outside a page size alignment boundary it is invalid
+ * and FALSE is returned. Otherwise, the page size is valid and TRUE is
+ * returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_page_size_valid(
+ unsigned32 page_size
+)
+{
+ return ((page_size != 0) &&
+ ((page_size % CPU_HEAP_ALIGNMENT) == 0));
+}
+
+/*PAGE
+ *
+ * _Heap_Build_flag
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the block flag composed of size and in_use_flag.
+ * The flag returned is suitable for use as a back or front flag in a
+ * heap block.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Heap_Build_flag (
+ unsigned32 size,
+ unsigned32 in_use_flag
+)
+{
+ return size | in_use_flag;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/isr.inl b/c/src/exec/score/inline/rtems/score/isr.inl
new file mode 100644
index 0000000000..2cfbe6e1b9
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/isr.inl
@@ -0,0 +1,73 @@
+/* isr.inl
+ *
+ * This include file contains the static implementation of all
+ * inlined routines in the Interrupt Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_inl
+#define __ISR_inl
+
+/*PAGE
+ *
+ * _ISR_Is_in_progress
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the processor is currently servicing
+ * and interrupt and FALSE otherwise. A return value of TRUE indicates
+ * that the caller is an interrupt service routine, NOT a thread. The
+ * directives available to an interrupt service routine are restricted.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_in_progress( void )
+{
+ return (_ISR_Nest_level != 0);
+}
+
+/*PAGE
+ *
+ * _ISR_Is_vector_number_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the vector is a valid vector number
+ * for this processor and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_vector_number_valid (
+ unsigned32 vector
+)
+{
+ return ( vector <= CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER );
+}
+
+/*PAGE
+ *
+ * _ISR_Is_valid_user_handler
+ *
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if handler is the entry point of a valid
+ * use interrupt service routine and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_valid_user_handler (
+ void *handler
+)
+{
+ return ( handler != NULL);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/mppkt.inl b/c/src/exec/score/inline/rtems/score/mppkt.inl
new file mode 100644
index 0000000000..a805e24ac7
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/mppkt.inl
@@ -0,0 +1,58 @@
+/* inline/mppkt.inl
+ *
+ * This package is the implementation of the Packet Handler
+ * routines which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_PACKET_inl
+#define __INLINE_MP_PACKET_inl
+
+/*PAGE
+ *
+ * _Mp_packet_Is_valid_packet_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the the_packet_class is valid,
+ * and FALSE otherwise.
+ *
+ * NOTE: Check for lower bounds (MP_PACKET_CLASSES_FIRST ) is unnecessary
+ * because this enum starts at lower bound of zero.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Mp_packet_Is_valid_packet_class (
+ MP_packet_Classes the_packet_class
+)
+{
+ return ( the_packet_class <= MP_PACKET_CLASSES_LAST );
+}
+
+/*PAGE
+ *
+ * _Mp_packet_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the the_packet_class is null,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Mp_packet_Is_null (
+ MP_packet_Prefix *the_packet
+)
+{
+ return the_packet == NULL;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/object.inl b/c/src/exec/score/inline/rtems/score/object.inl
new file mode 100644
index 0000000000..9e71164068
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/object.inl
@@ -0,0 +1,244 @@
+/* object.inl
+ *
+ * This include file contains the static inline implementation of all
+ * of the inlined routines in the Object Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_inl
+#define __OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_Build_id
+ *
+ * DESCRIPTION:
+ *
+ * This function builds an object's id from the processor node and index
+ * values specified.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id(
+ Objects_Classes the_class,
+ unsigned32 node,
+ unsigned32 index
+)
+{
+ return ( (the_class << OBJECTS_CLASS_START_BIT) |
+ (node << OBJECTS_NODE_START_BIT) |
+ (index << OBJECTS_INDEX_START_BIT) );
+}
+
+/*PAGE
+ *
+ * _Objects_Get_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the class portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Classes _Objects_Get_class(
+ Objects_Id id
+)
+{
+ return (Objects_Classes)
+ ((id >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS);
+}
+
+
+/*PAGE
+ *
+ * _Objects_Get_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the node portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Objects_Get_node(
+ Objects_Id id
+)
+{
+ return (id >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS;
+}
+
+/*PAGE
+ *
+ * _Objects_Get_index
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the index portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Objects_Get_index(
+ Objects_Id id
+)
+{
+ return (id >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS;
+}
+
+/*PAGE
+ *
+ * _Objects_Is_class_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is valid.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_class_valid(
+ Objects_Classes the_class
+)
+{
+ return the_class <= OBJECTS_CLASSES_LAST;
+}
+
+/*PAGE
+ *
+ * _Objects_Is_local_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the node is of the local object, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_local_node(
+ unsigned32 node
+)
+{
+ return ( node == _Objects_Local_node );
+}
+
+/*PAGE
+ *
+ * _Objects_Is_local_id
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the id is of a local object, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_local_id(
+ Objects_Id id
+)
+{
+ return _Objects_Is_local_node( _Objects_Get_node(id) );
+}
+
+/*PAGE
+ *
+ * _Objects_Are_ids_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if left and right are equal,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Are_ids_equal(
+ Objects_Id left,
+ Objects_Id right
+)
+{
+ return ( left == right );
+}
+
+/*PAGE
+ *
+ * _Objects_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a object control block from
+ * the inactive chain of free object control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Control *_Objects_Allocate(
+ Objects_Information *information
+)
+{
+ return (Objects_Control *) _Chain_Get( &information->Inactive );
+}
+
+/*PAGE
+ *
+ * _Objects_Free
+ *
+ * DESCRIPTION:
+ *
+ * This function frees a object control block to the
+ * inactive chain of free object control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Free(
+ Objects_Information *information,
+ Objects_Control *the_object
+)
+{
+ _Chain_Append( &information->Inactive, &the_object->Node );
+}
+
+/*PAGE
+ *
+ * _Objects_Open
+ *
+ * DESCRIPTION:
+ *
+ * This function places the_object control pointer and object name
+ * in the Local Pointer and Local Name Tables, respectively.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Open(
+ Objects_Information *information,
+ Objects_Control *the_object,
+ Objects_Name name
+)
+{
+ unsigned32 index;
+
+ index = _Objects_Get_index( the_object->id );
+ information->local_table[ index ] = the_object;
+
+ if ( information->is_string )
+ _Objects_Copy_name_string( name, the_object->name );
+ else
+ _Objects_Copy_name_raw( name, the_object->name, information->name_length );
+}
+
+/*PAGE
+ *
+ * _Objects_Close
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the_object control pointer and object name
+ * in the Local Pointer and Local Name Tables.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Close(
+ Objects_Information *information,
+ Objects_Control *the_object
+)
+{
+ unsigned32 index;
+
+ index = _Objects_Get_index( the_object->id );
+ information->local_table[ index ] = NULL;
+ _Objects_Clear_name( the_object->name, information->name_length );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/objectmp.inl b/c/src/exec/score/inline/rtems/score/objectmp.inl
new file mode 100644
index 0000000000..12b0df642a
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/objectmp.inl
@@ -0,0 +1,73 @@
+/* inline/objectmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * which deal with global objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_OBJECTS_inl
+#define __INLINE_MP_OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a Global Object control block.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_MP_Control *_Objects_MP_Allocate_global_object (
+ void
+)
+{
+ return (Objects_MP_Control *)
+ _Chain_Get( &_Objects_MP_Inactive_global_objects );
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Free_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This routine deallocates a Global Object control block.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_MP_Free_global_object (
+ Objects_MP_Control *the_object
+)
+{
+ _Chain_Append(
+ &_Objects_MP_Inactive_global_objects,
+ &the_object->Object.Node
+ );
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Is_null_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This function returns whether the global object is NULL or not.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_MP_Is_null_global_object (
+ Objects_MP_Control *the_object
+)
+{
+ return( the_object == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/priority.inl b/c/src/exec/score/inline/rtems/score/priority.inl
new file mode 100644
index 0000000000..1dfa53057e
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/priority.inl
@@ -0,0 +1,247 @@
+/* priority.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the Priority Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_inl
+#define __PRIORITY_inl
+
+#include <rtems/score/bitfield.h>
+
+/*PAGE
+ *
+ * _Priority_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Handler_initialization( void )
+{
+ unsigned32 index;
+
+ _Priority_Major_bit_map = 0;
+ for ( index=0 ; index <16 ; index++ )
+ _Priority_Bit_map[ index ] = 0;
+}
+
+/*PAGE
+ *
+ * _Priority_Is_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority if valid for a
+ * user task, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Priority_Is_valid (
+ Priority_Control the_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
+ *
+ * _Priority_Major
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the major portion of the_priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Major (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority / 16 );
+}
+
+/*PAGE
+ *
+ * _Priority_Minor
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the minor portion of the_priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Minor (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority % 16 );
+}
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
+
+/*PAGE
+ *
+ * _Priority_Mask
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the mask associated with the major or minor
+ * number passed to it.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Mask (
+ unsigned32 bit_number
+)
+{
+ return (0x8000 >> bit_number);
+}
+
+
+/*PAGE
+ *
+ * _Priority_Bits_index
+ *
+ * DESCRIPTION:
+ *
+ * This function translates the bit numbers returned by the bit scan
+ * of a priority bit field into something suitable for use as
+ * a major or minor component of a priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Bits_index (
+ unsigned32 bit_number
+)
+{
+ return bit_number;
+}
+
+#endif
+
+/*PAGE
+ *
+ * _Priority_Add_to_bit_map
+ *
+ * DESCRIPTION:
+ *
+ * This routine uses the_priority_map to update the priority
+ * bit maps to indicate that a thread has been readied.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map (
+ Priority_Information *the_priority_map
+)
+{
+ *the_priority_map->minor |= the_priority_map->ready_minor;
+ _Priority_Major_bit_map |= the_priority_map->ready_major;
+}
+
+/*PAGE
+ *
+ * _Priority_Remove_from_bit_map
+ *
+ * DESCRIPTION:
+ *
+ * This routine uses the_priority_map to update the priority
+ * bit maps to indicate that a thread has been removed from the
+ * ready state.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Remove_from_bit_map (
+ Priority_Information *the_priority_map
+)
+{
+ *the_priority_map->minor &= the_priority_map->block_minor;
+ if ( *the_priority_map->minor == 0 )
+ _Priority_Major_bit_map &= the_priority_map->block_major;
+}
+
+/*PAGE
+ *
+ * _Priority_Get_highest
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the priority of the highest priority
+ * ready thread.
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_highest( void )
+{
+ Priority_Bit_map_control minor;
+ Priority_Bit_map_control major;
+
+ _Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
+ _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
+
+ return (_Priority_Bits_index( major ) << 4) +
+ _Priority_Bits_index( minor );
+}
+
+/*PAGE
+ *
+ * _Priority_Initialize_information
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_priority_map so that it
+ * contains the information necessary to manage a thread
+ * at new_priority.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Initialize_information(
+ Priority_Information *the_priority_map,
+ Priority_Control new_priority
+)
+{
+ Priority_Bit_map_control major;
+ Priority_Bit_map_control minor;
+ Priority_Bit_map_control mask;
+
+ major = _Priority_Major( new_priority );
+ minor = _Priority_Minor( new_priority );
+
+ the_priority_map->minor =
+ &_Priority_Bit_map[ _Priority_Bits_index(major) ];
+
+ mask = _Priority_Mask( major );
+ the_priority_map->ready_major = mask;
+ the_priority_map->block_major = ~mask;
+
+ mask = _Priority_Mask( minor );
+ the_priority_map->ready_minor = mask;
+ the_priority_map->block_minor = ~mask;
+}
+
+/*PAGE
+ *
+ * _Priority_Is_group_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority GROUP is empty, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Priority_Is_group_empty (
+ Priority_Control the_priority
+)
+{
+ return the_priority == 0;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/stack.inl b/c/src/exec/score/inline/rtems/score/stack.inl
new file mode 100644
index 0000000000..03eb35b554
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/stack.inl
@@ -0,0 +1,81 @@
+/* stack.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the Stack Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_inl
+#define __STACK_inl
+
+/*PAGE
+ *
+ * _Stack_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_stack record to indicate that
+ * size bytes of memory starting at starting_address have been
+ * reserved for a stack.
+ */
+
+RTEMS_INLINE_ROUTINE void _Stack_Initialize (
+ Stack_Control *the_stack,
+ void *starting_address,
+ unsigned32 size
+)
+{
+ the_stack->area = starting_address;
+ the_stack->size = size;
+}
+
+/*PAGE
+ *
+ * _Stack_Is_enough
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if size bytes is enough memory for
+ * a valid stack area on this processor, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Stack_Is_enough (
+ unsigned32 size
+)
+{
+ return ( size >= STACK_MINIMUM_SIZE );
+}
+
+/*PAGE
+ *
+ * _Stack_Adjust_size
+ *
+ * DESCRIPTION:
+ *
+ * This function increases the stack size to insure that the thread
+ * has the desired amount of stack space after the initial stack
+ * pointer is determined based on alignment restrictions.
+ *
+ * NOTE:
+ *
+ * The amount of adjustment for alignment is CPU dependent.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Stack_Adjust_size (
+ unsigned32 size
+)
+{
+ return size + CPU_STACK_ALIGNMENT;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/states.inl b/c/src/exec/score/inline/rtems/score/states.inl
new file mode 100644
index 0000000000..c65e9f90c8
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/states.inl
@@ -0,0 +1,384 @@
+/* states.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines associated with thread state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STATES_inl
+#define __STATES_inl
+
+/*PAGE
+ *
+ * _States_Set
+ *
+ * DESCRIPTION:
+ *
+ * This function sets the given states_to_set into the current_state
+ * passed in. The result is returned to the user in current_state.
+ */
+
+RTEMS_INLINE_ROUTINE States_Control _States_Set (
+ States_Control states_to_set,
+ States_Control current_state
+)
+{
+ return (current_state | states_to_set);
+}
+
+/*PAGE
+ *
+ * _States_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function clears the given states_to_clear into the current_state
+ * passed in. The result is returned to the user in current_state.
+ */
+
+RTEMS_INLINE_ROUTINE States_Control _States_Clear (
+ States_Control states_to_clear,
+ States_Control current_state
+)
+{
+ return (current_state & ~states_to_clear);
+}
+
+/*PAGE
+ *
+ * _States_Is_ready
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_states indicates that the
+ * state is READY, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_ready (
+ States_Control the_states
+)
+{
+ return (the_states == STATES_READY);
+}
+
+/*PAGE
+ *
+ * _States_Is_only_dormant
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DORMANT state is the ONLY state
+ * set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_only_dormant (
+ States_Control the_states
+)
+{
+ return (the_states == STATES_DORMANT);
+}
+
+/*PAGE
+ *
+ * _States_Is_dormant
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DORMANT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_dormant (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_DORMANT);
+}
+
+/*PAGE
+ *
+ * _States_Is_suspended
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the SUSPENDED state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_suspended (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_SUSPENDED);
+}
+
+/*PAGE
+ *
+ * _States_Is_Transient
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the TRANSIENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_transient (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_TRANSIENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_delaying
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DELAYING state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_delaying (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_DELAYING);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_BUFFER state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_buffer (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_BUFFER);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_SEGMENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_segment (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_SEGMENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_message
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_MESSAGE state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_message (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_MESSAGE);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_event
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_EVENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_event (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_EVENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_mutex
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_MUTEX state
+ * is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_mutex (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_MUTEX);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_semaphore
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_SEMAPHORE state
+ * is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_semaphore (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_SEMAPHORE);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_time
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_TIME state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_time (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_TIME);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_rpc_reply
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_TIME state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_rpc_reply (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_RPC_REPLY);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_period
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_PERIOD state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_period (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_PERIOD);
+}
+
+/*PAGE
+ *
+ * _States_Is_locally_blocked
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked waiting for a local resource is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_locally_blocked (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_LOCALLY_BLOCKED);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_on_thread_queue
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked waiting for a local resource is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_on_thread_queue (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
+}
+
+/*PAGE
+ *
+ * _States_Is_blocked
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_blocked (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_BLOCKED);
+}
+
+/*PAGE
+ *
+ *
+ * _States_Are_set
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if any of the states in the mask
+ * are set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Are_set (
+ States_Control the_states,
+ States_Control mask
+)
+{
+ return ( (the_states & mask) != STATES_READY);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/sysstate.inl b/c/src/exec/score/inline/rtems/score/sysstate.inl
new file mode 100644
index 0000000000..bef8a6d8cd
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/sysstate.inl
@@ -0,0 +1,154 @@
+/* sysstates.inl
+ *
+ * This file contains the inline implementation of routines regarding the
+ * system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SYSTEM_STATE_inl
+#define __SYSTEM_STATE_inl
+
+/*PAGE
+ *
+ * _System_state_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the system state handler.
+ */
+
+RTEMS_INLINE_ROUTINE 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
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current system state to that specified by
+ * the called.
+ */
+
+RTEMS_INLINE_ROUTINE void _System_state_Set (
+ System_state_Codes state
+)
+{
+ _System_state_Current = state;
+}
+
+/*PAGE
+ *
+ * _System_state_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the current system state.
+ */
+
+RTEMS_INLINE_ROUTINE System_state_Codes _System_state_Get ( void )
+{
+ return _System_state_Current;
+}
+
+/*PAGE
+ *
+ * _System_state_Is_before_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "before initialization" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_before_initialization (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEFORE_INITIALIZATION);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_before_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "before multitasking" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_before_multitasking (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEFORE_MULTITASKING);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_begin_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "begin multitasking" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_begin_multitasking (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEGIN_MULTITASKING);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_up
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "up" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_up (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_UP);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_failed
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "failed" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_failed (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_FAILED);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/thread.inl b/c/src/exec/score/inline/rtems/score/thread.inl
new file mode 100644
index 0000000000..8f969358dd
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/thread.inl
@@ -0,0 +1,404 @@
+/* thread.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Thread handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_inl
+#define __THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_Stop_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This routine halts multitasking and returns control to
+ * the "thread" (i.e. the BSP) which initially invoked the
+ * routine which initialized the system.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Stop_multitasking( void )
+{
+ _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_executing
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is the currently executing
+ * thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Executing );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is the heir
+ * thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_heir (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Heir );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_executing_also_the_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the currently executing thread
+ * is also the heir thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing_also_the_heir( void )
+{
+ return ( _Thread_Executing == _Thread_Heir );
+}
+
+/*PAGE
+ *
+ * _Thread_Resume
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the SUSPENDED state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Resume (
+ Thread_Control *the_thread
+)
+{
+ _Thread_Clear_state( the_thread, STATES_SUSPENDED );
+}
+
+/*PAGE
+ *
+ * _Thread_Unblock
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears any blocking state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Unblock (
+ Thread_Control *the_thread
+)
+{
+ _Thread_Clear_state( the_thread, STATES_BLOCKED );
+}
+
+/*PAGE
+ *
+ * _Thread_Restart_self
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets the current context of the calling thread
+ * to that of its initial state.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void )
+{
+ if ( _Thread_Executing->fp_context != NULL )
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+
+ _CPU_Context_Restart_self( &_Thread_Executing->Registers );
+}
+
+/*PAGE
+ *
+ * _Thread_Calculate_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the highest priority
+ * ready thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void )
+{
+ _Thread_Heir = (Thread_Control *)
+ _Thread_Ready_chain[ _Priority_Get_highest() ].first;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_allocated_fp
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the floating point context of
+ * the_thread is currently loaded in the floating point unit, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_allocated_fp (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Allocated_fp );
+}
+
+/*PAGE
+ *
+ * _Thread_Deallocate_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when the currently loaded floating
+ * point context is now longer associated with an active thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Deallocate_fp( void )
+{
+ _Thread_Allocated_fp = NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_Disable_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine prevents dispatching.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Disable_dispatch( void )
+{
+ _Thread_Dispatch_disable_level += 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Enable_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine allows dispatching to occur again. If this is
+ * the outer most dispatching critical section, then a dispatching
+ * operation will be performed and, if necessary, control of the
+ * processor will be transferred to the heir thread.
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == TRUE )
+RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch()
+{
+ if ( (--_Thread_Dispatch_disable_level) == 0 )
+ _Thread_Dispatch();
+}
+#endif
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void );
+#endif
+
+/*PAGE
+ *
+ * _Thread_Unnest_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine allows dispatching to occur again. However,
+ * no dispatching operation is performed even if this is the outer
+ * most dispatching critical section.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
+{
+ _Thread_Dispatch_disable_level -= 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_dispatching_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if dispatching is disabled, and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_dispatching_enabled( void )
+{
+ return ( _Thread_Dispatch_disable_level == 0 );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_context_switch_necessary
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if dispatching is disabled, and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_context_switch_necessary( void )
+{
+ return ( _Context_Switch_necessary );
+}
+
+/*PAGE
+ *
+ * _Thread_Dispatch_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the thread dispatching subsystem.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Dispatch_initialization( void )
+{
+ _Thread_Dispatch_disable_level = 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_null (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == NULL );
+}
+
+/*PAGE
+ *
+ * _Thread_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps thread IDs to thread control
+ * blocks. If ID corresponds to a local thread, then it
+ * returns the_thread control pointer which maps to ID
+ * and location is set to OBJECTS_LOCAL. If the thread ID is
+ * global and resides on a remote node, then location is set
+ * to OBJECTS_REMOTE, and the_thread is undefined.
+ * Otherwise, location is set to OBJECTS_ERROR and
+ * the_thread is undefined.
+ *
+ * NOTE: XXX... This routine may be able to be optimized.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ Objects_Classes the_class;
+ Objects_Information *information;
+ Thread_Control *tp = (Thread_Control *) 0;
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
+ _Thread_Disable_dispatch();
+ *location = OBJECTS_LOCAL;
+ tp = _Thread_Executing;
+ goto done;
+ }
+
+ the_class = _Objects_Get_class( id );
+
+ if ( the_class > OBJECTS_CLASSES_LAST ) {
+ *location = OBJECTS_ERROR;
+ goto done;
+ }
+
+ information = _Objects_Information_table[ the_class ];
+
+ if ( !information || !information->is_thread ) {
+ *location = OBJECTS_ERROR;
+ goto done;
+ }
+
+ tp = (Thread_Control *) _Objects_Get( information, id, location );
+
+done:
+ return tp;
+}
+
+
+/*
+ * _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.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_proxy_blocking (
+ unsigned32 code
+)
+{
+ return (code == THREAD_STATUS_PROXY_BLOCKING);
+}
+
+/*PAGE
+ *
+ * _Thread_Internal_allocate
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates an internal thread.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_Thread_Internal_information );
+}
+
+/*PAGE
+ *
+ * _Thread_Internal_free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees an internal thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Internal_free (
+ Thread_Control *the_task
+)
+{
+ _Objects_Free( &_Thread_Internal_information, &the_task->Object );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/threadmp.inl b/c/src/exec/score/inline/rtems/score/threadmp.inl
new file mode 100644
index 0000000000..0da7dbad7e
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/threadmp.inl
@@ -0,0 +1,61 @@
+/* inline/threadmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * for the multiprocessing part of thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_THREAD_inl
+#define __INLINE_MP_THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_MP_Is_receive
+ *
+ * DESCRIPTION:
+ *
+ * This function returns true if the thread in question is the
+ * multiprocessing receive thread.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_MP_Is_receive (
+ Thread_Control *the_thread
+)
+{
+ return the_thread == _Thread_MP_Receive;
+}
+
+/*PAGE
+ *
+ * _Thread_MP_Free_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a proxy control block to the
+ * inactive chain of free proxy control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_MP_Free_proxy (
+ Thread_Control *the_thread
+)
+{
+ Thread_Proxy_control *the_proxy;
+
+ the_proxy = (Thread_Proxy_control *) the_thread;
+
+ _Chain_Extract( &the_proxy->Active );
+
+ _Chain_Append( &_Thread_MP_Inactive_proxies, &the_thread->Object.Node );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/tod.inl b/c/src/exec/score/inline/rtems/score/tod.inl
new file mode 100644
index 0000000000..3072393224
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/tod.inl
@@ -0,0 +1,67 @@
+/* tod.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_inl
+#define __TIME_OF_DAY_inl
+
+/*PAGE
+ *
+ * _TOD_Tickle_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine increments the ticks field of the current time of
+ * day at each clock tick.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Tickle_ticks( void )
+{
+ _TOD_Current.ticks += 1;
+ _Watchdog_Ticks_since_boot += 1;
+}
+
+/*PAGE
+ *
+ * _TOD_Deactivate
+ *
+ * DESCRIPTION:
+ *
+ * This routine deactivates updating of the current time of day.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Deactivate( void )
+{
+ _Watchdog_Remove( &_TOD_Seconds_watchdog );
+}
+
+/*PAGE
+ *
+ * _TOD_Activate
+ *
+ * DESCRIPTION:
+ *
+ * This routine activates updating of the current time of day.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Activate(
+ Watchdog_Interval ticks
+)
+{
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, ticks );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/tqdata.inl b/c/src/exec/score/inline/rtems/score/tqdata.inl
new file mode 100644
index 0000000000..4da6629b27
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/tqdata.inl
@@ -0,0 +1,73 @@
+/* tqdata.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines needed to support the Thread Queue Data.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_inl
+#define __THREAD_QUEUE_DATA_inl
+
+/*PAGE
+ *
+ * _Thread_queue_Header_number
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the index of the priority chain on which
+ * a thread of the_priority should be placed.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Thread_queue_Header_number (
+ Priority_Control the_priority
+)
+{
+ return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Is_reverse_search
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority indicates that the
+ * enqueue search should start at the front of this priority
+ * group chain, and FALSE if the search should start at the rear.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_queue_Is_reverse_search (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enter_critical_section
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked to indicate that the specified thread queue is
+ * entering a critical section.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
+ Thread_queue_Control *the_thread_queue
+)
+{
+ the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/userext.inl b/c/src/exec/score/inline/rtems/score/userext.inl
new file mode 100644
index 0000000000..4f3e0fd42a
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/userext.inl
@@ -0,0 +1,121 @@
+/* userext.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the User Extension Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_inl
+#define __USER_EXTENSIONS_inl
+
+/*PAGE
+ *
+ * _User_extensions_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Handler_initialization (
+ User_extensions_Table *initial_extensions
+)
+{
+ _Chain_Initialize_empty( &_User_extensions_List );
+
+ if ( initial_extensions ) {
+ _User_extensions_Initial.Callouts = *initial_extensions;
+ _Chain_Append( &_User_extensions_List, &_User_extensions_Initial.Node );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Add_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to add a user extension set to the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Add_set (
+ User_extensions_Control *the_extension,
+ User_extensions_Table *extension_table
+)
+{
+ the_extension->Callouts = *extension_table;
+
+ _Chain_Append( &_User_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Add_API_set
+ * DESCRIPTION:
+ *
+ * This routine is used to add an API extension set to the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Add_API_set (
+ User_extensions_Control *the_extension
+)
+{
+ _Chain_Prepend( &_User_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Remove_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to remove a user extension set from the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Remove_set (
+ User_extensions_Control *the_extension
+)
+{
+ _Chain_Extract( &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_switch
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a context switch occurs.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Thread_switch (
+ Thread_Control *executing,
+ Thread_Control *heir
+)
+{
+ 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.thread_switch != NULL )
+ (*the_extension->Callouts.thread_switch)( executing, heir );
+ }
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/watchdog.inl b/c/src/exec/score/inline/rtems/score/watchdog.inl
new file mode 100644
index 0000000000..a9f5087f8a
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/watchdog.inl
@@ -0,0 +1,324 @@
+/* watchdog.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the Watchdog Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_inl
+#define __WATCHDOG_inl
+
+/*PAGE
+ *
+ * _Watchdog_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the specified watchdog. The watchdog is
+ * made inactive, the watchdog id and handler routine are set to the
+ * specified values.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Initialize(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Service_routine_entry routine,
+ Objects_Id id,
+ void *user_data
+)
+{
+ the_watchdog->state = WATCHDOG_INACTIVE;
+ the_watchdog->routine = routine;
+ the_watchdog->id = id;
+ the_watchdog->user_data = user_data;
+}
+
+/*PAGE
+ *
+ * _Watchdog_Is_active
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the watchdog timer is in the ACTIVE
+ * state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Watchdog_Is_active(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( the_watchdog->state == WATCHDOG_ACTIVE );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Activate
+ *
+ * DESCRIPTION:
+ *
+ * This routine activates THE_WATCHDOG timer which is already
+ * on a watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ the_watchdog->state = WATCHDOG_ACTIVE;
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Deactivate
+ *
+ * DESCRIPTION:
+ *
+ * This routine deactivates THE_WATCHDOG timer which will remain
+ * on a watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ the_watchdog->state = WATCHDOG_REMOVE_IT;
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at each clock tick to update the ticks
+ * watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void )
+{
+
+ _Watchdog_Tickle( &_Watchdog_Ticks_chain );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at each clock tick to update the seconds
+ * watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void )
+{
+
+ _Watchdog_Tickle( &_Watchdog_Seconds_chain );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the ticks watchdog chain
+ * for a time of UNITS ticks. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Insert_ticks(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Interval units
+)
+{
+
+ the_watchdog->initial = units;
+
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the seconds watchdog chain
+ * for a time of UNITS seconds. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Insert_seconds(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Interval units
+)
+{
+
+ the_watchdog->initial = units;
+
+ _Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the seconds watchdog chain in the forward
+ * or backward DIRECTION for UNITS seconds. This is invoked when the
+ * current time of day is changed.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_seconds(
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+
+ _Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the ticks watchdog chain in the forward
+ * or backward DIRECTION for UNITS ticks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_ticks(
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+
+ _Watchdog_Adjust( &_Watchdog_Ticks_chain, direction, units );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets THE_WATCHDOG timer to its state at INSERT
+ * time. This routine is valid only on interval watchdog timers
+ * and is used to make an interval watchdog timer fire "every" so
+ * many ticks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Reset(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ (void) _Watchdog_Remove( the_watchdog );
+
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Next
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the watchdog timer following
+ * THE_WATCHDOG on the watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Next(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( (Watchdog_Control *) the_watchdog->Node.next );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Previous
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the watchdog timer preceding
+ * THE_WATCHDOG on the watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Previous(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( (Watchdog_Control *) the_watchdog->Node.previous );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_First
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the first watchdog timer
+ * on the watchdog chain HEADER.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
+ Chain_Control *header
+)
+{
+
+ return ( (Watchdog_Control *) header->first );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Last
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the last watchdog timer
+ * on the watchdog chain HEADER.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Last(
+ Chain_Control *header
+)
+{
+
+ return ( (Watchdog_Control *) header->last );
+
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/rtems/score/wkspace.inl b/c/src/exec/score/inline/rtems/score/wkspace.inl
new file mode 100644
index 0000000000..b71c648aae
--- /dev/null
+++ b/c/src/exec/score/inline/rtems/score/wkspace.inl
@@ -0,0 +1,57 @@
+/* wkspace.inl
+ *
+ * This include file contains the bodies of the routines which contains
+ * information related to the RAM Workspace.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_inl
+#define __WORKSPACE_inl
+
+/*PAGE
+ *
+ * _Workspace_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * 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 NULL is returned.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Workspace_Allocate(
+ unsigned32 size
+)
+{
+ return _Heap_Allocate( &_Workspace_Area, size );
+}
+
+/*PAGE
+ *
+ * _Workspace_Free
+ *
+ * DESCRIPTION:
+ *
+ * This function frees the specified block of memory. If the block
+ * belongs to the Workspace and can be successfully freed, then
+ * TRUE is returned. Otherwise FALSE is returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Workspace_Free(
+ void *block
+)
+{
+ return _Heap_Free( &_Workspace_Area, block );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/stack.inl b/c/src/exec/score/inline/stack.inl
new file mode 100644
index 0000000000..03eb35b554
--- /dev/null
+++ b/c/src/exec/score/inline/stack.inl
@@ -0,0 +1,81 @@
+/* stack.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the Stack Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_inl
+#define __STACK_inl
+
+/*PAGE
+ *
+ * _Stack_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_stack record to indicate that
+ * size bytes of memory starting at starting_address have been
+ * reserved for a stack.
+ */
+
+RTEMS_INLINE_ROUTINE void _Stack_Initialize (
+ Stack_Control *the_stack,
+ void *starting_address,
+ unsigned32 size
+)
+{
+ the_stack->area = starting_address;
+ the_stack->size = size;
+}
+
+/*PAGE
+ *
+ * _Stack_Is_enough
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if size bytes is enough memory for
+ * a valid stack area on this processor, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Stack_Is_enough (
+ unsigned32 size
+)
+{
+ return ( size >= STACK_MINIMUM_SIZE );
+}
+
+/*PAGE
+ *
+ * _Stack_Adjust_size
+ *
+ * DESCRIPTION:
+ *
+ * This function increases the stack size to insure that the thread
+ * has the desired amount of stack space after the initial stack
+ * pointer is determined based on alignment restrictions.
+ *
+ * NOTE:
+ *
+ * The amount of adjustment for alignment is CPU dependent.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Stack_Adjust_size (
+ unsigned32 size
+)
+{
+ return size + CPU_STACK_ALIGNMENT;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/states.inl b/c/src/exec/score/inline/states.inl
new file mode 100644
index 0000000000..c65e9f90c8
--- /dev/null
+++ b/c/src/exec/score/inline/states.inl
@@ -0,0 +1,384 @@
+/* states.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines associated with thread state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STATES_inl
+#define __STATES_inl
+
+/*PAGE
+ *
+ * _States_Set
+ *
+ * DESCRIPTION:
+ *
+ * This function sets the given states_to_set into the current_state
+ * passed in. The result is returned to the user in current_state.
+ */
+
+RTEMS_INLINE_ROUTINE States_Control _States_Set (
+ States_Control states_to_set,
+ States_Control current_state
+)
+{
+ return (current_state | states_to_set);
+}
+
+/*PAGE
+ *
+ * _States_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function clears the given states_to_clear into the current_state
+ * passed in. The result is returned to the user in current_state.
+ */
+
+RTEMS_INLINE_ROUTINE States_Control _States_Clear (
+ States_Control states_to_clear,
+ States_Control current_state
+)
+{
+ return (current_state & ~states_to_clear);
+}
+
+/*PAGE
+ *
+ * _States_Is_ready
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_states indicates that the
+ * state is READY, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_ready (
+ States_Control the_states
+)
+{
+ return (the_states == STATES_READY);
+}
+
+/*PAGE
+ *
+ * _States_Is_only_dormant
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DORMANT state is the ONLY state
+ * set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_only_dormant (
+ States_Control the_states
+)
+{
+ return (the_states == STATES_DORMANT);
+}
+
+/*PAGE
+ *
+ * _States_Is_dormant
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DORMANT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_dormant (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_DORMANT);
+}
+
+/*PAGE
+ *
+ * _States_Is_suspended
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the SUSPENDED state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_suspended (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_SUSPENDED);
+}
+
+/*PAGE
+ *
+ * _States_Is_Transient
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the TRANSIENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_transient (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_TRANSIENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_delaying
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DELAYING state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_delaying (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_DELAYING);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_BUFFER state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_buffer (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_BUFFER);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_SEGMENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_segment (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_SEGMENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_message
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_MESSAGE state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_message (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_MESSAGE);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_event
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_EVENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_event (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_EVENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_mutex
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_MUTEX state
+ * is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_mutex (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_MUTEX);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_semaphore
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_SEMAPHORE state
+ * is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_semaphore (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_SEMAPHORE);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_time
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_TIME state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_time (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_TIME);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_rpc_reply
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_TIME state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_rpc_reply (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_RPC_REPLY);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_period
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_PERIOD state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_period (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_PERIOD);
+}
+
+/*PAGE
+ *
+ * _States_Is_locally_blocked
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked waiting for a local resource is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_locally_blocked (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_LOCALLY_BLOCKED);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_on_thread_queue
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked waiting for a local resource is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_on_thread_queue (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
+}
+
+/*PAGE
+ *
+ * _States_Is_blocked
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_blocked (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_BLOCKED);
+}
+
+/*PAGE
+ *
+ *
+ * _States_Are_set
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if any of the states in the mask
+ * are set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Are_set (
+ States_Control the_states,
+ States_Control mask
+)
+{
+ return ( (the_states & mask) != STATES_READY);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/sysstate.inl b/c/src/exec/score/inline/sysstate.inl
new file mode 100644
index 0000000000..bef8a6d8cd
--- /dev/null
+++ b/c/src/exec/score/inline/sysstate.inl
@@ -0,0 +1,154 @@
+/* sysstates.inl
+ *
+ * This file contains the inline implementation of routines regarding the
+ * system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SYSTEM_STATE_inl
+#define __SYSTEM_STATE_inl
+
+/*PAGE
+ *
+ * _System_state_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the system state handler.
+ */
+
+RTEMS_INLINE_ROUTINE 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
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current system state to that specified by
+ * the called.
+ */
+
+RTEMS_INLINE_ROUTINE void _System_state_Set (
+ System_state_Codes state
+)
+{
+ _System_state_Current = state;
+}
+
+/*PAGE
+ *
+ * _System_state_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the current system state.
+ */
+
+RTEMS_INLINE_ROUTINE System_state_Codes _System_state_Get ( void )
+{
+ return _System_state_Current;
+}
+
+/*PAGE
+ *
+ * _System_state_Is_before_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "before initialization" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_before_initialization (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEFORE_INITIALIZATION);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_before_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "before multitasking" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_before_multitasking (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEFORE_MULTITASKING);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_begin_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "begin multitasking" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_begin_multitasking (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEGIN_MULTITASKING);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_up
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "up" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_up (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_UP);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_failed
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "failed" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_failed (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_FAILED);
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/thread.inl b/c/src/exec/score/inline/thread.inl
new file mode 100644
index 0000000000..8f969358dd
--- /dev/null
+++ b/c/src/exec/score/inline/thread.inl
@@ -0,0 +1,404 @@
+/* thread.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Thread handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_inl
+#define __THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_Stop_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This routine halts multitasking and returns control to
+ * the "thread" (i.e. the BSP) which initially invoked the
+ * routine which initialized the system.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Stop_multitasking( void )
+{
+ _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_executing
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is the currently executing
+ * thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Executing );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is the heir
+ * thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_heir (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Heir );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_executing_also_the_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the currently executing thread
+ * is also the heir thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing_also_the_heir( void )
+{
+ return ( _Thread_Executing == _Thread_Heir );
+}
+
+/*PAGE
+ *
+ * _Thread_Resume
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the SUSPENDED state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Resume (
+ Thread_Control *the_thread
+)
+{
+ _Thread_Clear_state( the_thread, STATES_SUSPENDED );
+}
+
+/*PAGE
+ *
+ * _Thread_Unblock
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears any blocking state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Unblock (
+ Thread_Control *the_thread
+)
+{
+ _Thread_Clear_state( the_thread, STATES_BLOCKED );
+}
+
+/*PAGE
+ *
+ * _Thread_Restart_self
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets the current context of the calling thread
+ * to that of its initial state.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void )
+{
+ if ( _Thread_Executing->fp_context != NULL )
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+
+ _CPU_Context_Restart_self( &_Thread_Executing->Registers );
+}
+
+/*PAGE
+ *
+ * _Thread_Calculate_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the highest priority
+ * ready thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void )
+{
+ _Thread_Heir = (Thread_Control *)
+ _Thread_Ready_chain[ _Priority_Get_highest() ].first;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_allocated_fp
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the floating point context of
+ * the_thread is currently loaded in the floating point unit, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_allocated_fp (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Allocated_fp );
+}
+
+/*PAGE
+ *
+ * _Thread_Deallocate_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when the currently loaded floating
+ * point context is now longer associated with an active thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Deallocate_fp( void )
+{
+ _Thread_Allocated_fp = NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_Disable_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine prevents dispatching.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Disable_dispatch( void )
+{
+ _Thread_Dispatch_disable_level += 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Enable_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine allows dispatching to occur again. If this is
+ * the outer most dispatching critical section, then a dispatching
+ * operation will be performed and, if necessary, control of the
+ * processor will be transferred to the heir thread.
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == TRUE )
+RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch()
+{
+ if ( (--_Thread_Dispatch_disable_level) == 0 )
+ _Thread_Dispatch();
+}
+#endif
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void );
+#endif
+
+/*PAGE
+ *
+ * _Thread_Unnest_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine allows dispatching to occur again. However,
+ * no dispatching operation is performed even if this is the outer
+ * most dispatching critical section.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
+{
+ _Thread_Dispatch_disable_level -= 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_dispatching_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if dispatching is disabled, and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_dispatching_enabled( void )
+{
+ return ( _Thread_Dispatch_disable_level == 0 );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_context_switch_necessary
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if dispatching is disabled, and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_context_switch_necessary( void )
+{
+ return ( _Context_Switch_necessary );
+}
+
+/*PAGE
+ *
+ * _Thread_Dispatch_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the thread dispatching subsystem.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Dispatch_initialization( void )
+{
+ _Thread_Dispatch_disable_level = 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_null (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == NULL );
+}
+
+/*PAGE
+ *
+ * _Thread_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps thread IDs to thread control
+ * blocks. If ID corresponds to a local thread, then it
+ * returns the_thread control pointer which maps to ID
+ * and location is set to OBJECTS_LOCAL. If the thread ID is
+ * global and resides on a remote node, then location is set
+ * to OBJECTS_REMOTE, and the_thread is undefined.
+ * Otherwise, location is set to OBJECTS_ERROR and
+ * the_thread is undefined.
+ *
+ * NOTE: XXX... This routine may be able to be optimized.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ Objects_Classes the_class;
+ Objects_Information *information;
+ Thread_Control *tp = (Thread_Control *) 0;
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
+ _Thread_Disable_dispatch();
+ *location = OBJECTS_LOCAL;
+ tp = _Thread_Executing;
+ goto done;
+ }
+
+ the_class = _Objects_Get_class( id );
+
+ if ( the_class > OBJECTS_CLASSES_LAST ) {
+ *location = OBJECTS_ERROR;
+ goto done;
+ }
+
+ information = _Objects_Information_table[ the_class ];
+
+ if ( !information || !information->is_thread ) {
+ *location = OBJECTS_ERROR;
+ goto done;
+ }
+
+ tp = (Thread_Control *) _Objects_Get( information, id, location );
+
+done:
+ return tp;
+}
+
+
+/*
+ * _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.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_proxy_blocking (
+ unsigned32 code
+)
+{
+ return (code == THREAD_STATUS_PROXY_BLOCKING);
+}
+
+/*PAGE
+ *
+ * _Thread_Internal_allocate
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates an internal thread.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_Thread_Internal_information );
+}
+
+/*PAGE
+ *
+ * _Thread_Internal_free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees an internal thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Internal_free (
+ Thread_Control *the_task
+)
+{
+ _Objects_Free( &_Thread_Internal_information, &the_task->Object );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/threadmp.inl b/c/src/exec/score/inline/threadmp.inl
new file mode 100644
index 0000000000..0da7dbad7e
--- /dev/null
+++ b/c/src/exec/score/inline/threadmp.inl
@@ -0,0 +1,61 @@
+/* inline/threadmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * for the multiprocessing part of thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_THREAD_inl
+#define __INLINE_MP_THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_MP_Is_receive
+ *
+ * DESCRIPTION:
+ *
+ * This function returns true if the thread in question is the
+ * multiprocessing receive thread.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_MP_Is_receive (
+ Thread_Control *the_thread
+)
+{
+ return the_thread == _Thread_MP_Receive;
+}
+
+/*PAGE
+ *
+ * _Thread_MP_Free_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a proxy control block to the
+ * inactive chain of free proxy control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_MP_Free_proxy (
+ Thread_Control *the_thread
+)
+{
+ Thread_Proxy_control *the_proxy;
+
+ the_proxy = (Thread_Proxy_control *) the_thread;
+
+ _Chain_Extract( &the_proxy->Active );
+
+ _Chain_Append( &_Thread_MP_Inactive_proxies, &the_thread->Object.Node );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/tod.inl b/c/src/exec/score/inline/tod.inl
new file mode 100644
index 0000000000..3072393224
--- /dev/null
+++ b/c/src/exec/score/inline/tod.inl
@@ -0,0 +1,67 @@
+/* tod.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_inl
+#define __TIME_OF_DAY_inl
+
+/*PAGE
+ *
+ * _TOD_Tickle_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine increments the ticks field of the current time of
+ * day at each clock tick.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Tickle_ticks( void )
+{
+ _TOD_Current.ticks += 1;
+ _Watchdog_Ticks_since_boot += 1;
+}
+
+/*PAGE
+ *
+ * _TOD_Deactivate
+ *
+ * DESCRIPTION:
+ *
+ * This routine deactivates updating of the current time of day.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Deactivate( void )
+{
+ _Watchdog_Remove( &_TOD_Seconds_watchdog );
+}
+
+/*PAGE
+ *
+ * _TOD_Activate
+ *
+ * DESCRIPTION:
+ *
+ * This routine activates updating of the current time of day.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Activate(
+ Watchdog_Interval ticks
+)
+{
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, ticks );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/tqdata.inl b/c/src/exec/score/inline/tqdata.inl
new file mode 100644
index 0000000000..4da6629b27
--- /dev/null
+++ b/c/src/exec/score/inline/tqdata.inl
@@ -0,0 +1,73 @@
+/* tqdata.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines needed to support the Thread Queue Data.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_inl
+#define __THREAD_QUEUE_DATA_inl
+
+/*PAGE
+ *
+ * _Thread_queue_Header_number
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the index of the priority chain on which
+ * a thread of the_priority should be placed.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Thread_queue_Header_number (
+ Priority_Control the_priority
+)
+{
+ return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Is_reverse_search
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority indicates that the
+ * enqueue search should start at the front of this priority
+ * group chain, and FALSE if the search should start at the rear.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_queue_Is_reverse_search (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enter_critical_section
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked to indicate that the specified thread queue is
+ * entering a critical section.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
+ Thread_queue_Control *the_thread_queue
+)
+{
+ the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED;
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/userext.inl b/c/src/exec/score/inline/userext.inl
new file mode 100644
index 0000000000..4f3e0fd42a
--- /dev/null
+++ b/c/src/exec/score/inline/userext.inl
@@ -0,0 +1,121 @@
+/* userext.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the User Extension Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_inl
+#define __USER_EXTENSIONS_inl
+
+/*PAGE
+ *
+ * _User_extensions_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Handler_initialization (
+ User_extensions_Table *initial_extensions
+)
+{
+ _Chain_Initialize_empty( &_User_extensions_List );
+
+ if ( initial_extensions ) {
+ _User_extensions_Initial.Callouts = *initial_extensions;
+ _Chain_Append( &_User_extensions_List, &_User_extensions_Initial.Node );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Add_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to add a user extension set to the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Add_set (
+ User_extensions_Control *the_extension,
+ User_extensions_Table *extension_table
+)
+{
+ the_extension->Callouts = *extension_table;
+
+ _Chain_Append( &_User_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Add_API_set
+ * DESCRIPTION:
+ *
+ * This routine is used to add an API extension set to the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Add_API_set (
+ User_extensions_Control *the_extension
+)
+{
+ _Chain_Prepend( &_User_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Remove_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to remove a user extension set from the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Remove_set (
+ User_extensions_Control *the_extension
+)
+{
+ _Chain_Extract( &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_switch
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a context switch occurs.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Thread_switch (
+ Thread_Control *executing,
+ Thread_Control *heir
+)
+{
+ 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.thread_switch != NULL )
+ (*the_extension->Callouts.thread_switch)( executing, heir );
+ }
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/watchdog.inl b/c/src/exec/score/inline/watchdog.inl
new file mode 100644
index 0000000000..a9f5087f8a
--- /dev/null
+++ b/c/src/exec/score/inline/watchdog.inl
@@ -0,0 +1,324 @@
+/* watchdog.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the Watchdog Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_inl
+#define __WATCHDOG_inl
+
+/*PAGE
+ *
+ * _Watchdog_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the specified watchdog. The watchdog is
+ * made inactive, the watchdog id and handler routine are set to the
+ * specified values.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Initialize(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Service_routine_entry routine,
+ Objects_Id id,
+ void *user_data
+)
+{
+ the_watchdog->state = WATCHDOG_INACTIVE;
+ the_watchdog->routine = routine;
+ the_watchdog->id = id;
+ the_watchdog->user_data = user_data;
+}
+
+/*PAGE
+ *
+ * _Watchdog_Is_active
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the watchdog timer is in the ACTIVE
+ * state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Watchdog_Is_active(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( the_watchdog->state == WATCHDOG_ACTIVE );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Activate
+ *
+ * DESCRIPTION:
+ *
+ * This routine activates THE_WATCHDOG timer which is already
+ * on a watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ the_watchdog->state = WATCHDOG_ACTIVE;
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Deactivate
+ *
+ * DESCRIPTION:
+ *
+ * This routine deactivates THE_WATCHDOG timer which will remain
+ * on a watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ the_watchdog->state = WATCHDOG_REMOVE_IT;
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at each clock tick to update the ticks
+ * watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void )
+{
+
+ _Watchdog_Tickle( &_Watchdog_Ticks_chain );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at each clock tick to update the seconds
+ * watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void )
+{
+
+ _Watchdog_Tickle( &_Watchdog_Seconds_chain );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the ticks watchdog chain
+ * for a time of UNITS ticks. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Insert_ticks(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Interval units
+)
+{
+
+ the_watchdog->initial = units;
+
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the seconds watchdog chain
+ * for a time of UNITS seconds. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Insert_seconds(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Interval units
+)
+{
+
+ the_watchdog->initial = units;
+
+ _Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the seconds watchdog chain in the forward
+ * or backward DIRECTION for UNITS seconds. This is invoked when the
+ * current time of day is changed.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_seconds(
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+
+ _Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the ticks watchdog chain in the forward
+ * or backward DIRECTION for UNITS ticks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_ticks(
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+
+ _Watchdog_Adjust( &_Watchdog_Ticks_chain, direction, units );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets THE_WATCHDOG timer to its state at INSERT
+ * time. This routine is valid only on interval watchdog timers
+ * and is used to make an interval watchdog timer fire "every" so
+ * many ticks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Reset(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ (void) _Watchdog_Remove( the_watchdog );
+
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Next
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the watchdog timer following
+ * THE_WATCHDOG on the watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Next(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( (Watchdog_Control *) the_watchdog->Node.next );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Previous
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the watchdog timer preceding
+ * THE_WATCHDOG on the watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Previous(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( (Watchdog_Control *) the_watchdog->Node.previous );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_First
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the first watchdog timer
+ * on the watchdog chain HEADER.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
+ Chain_Control *header
+)
+{
+
+ return ( (Watchdog_Control *) header->first );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Last
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the last watchdog timer
+ * on the watchdog chain HEADER.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Last(
+ Chain_Control *header
+)
+{
+
+ return ( (Watchdog_Control *) header->last );
+
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/inline/wkspace.inl b/c/src/exec/score/inline/wkspace.inl
new file mode 100644
index 0000000000..b71c648aae
--- /dev/null
+++ b/c/src/exec/score/inline/wkspace.inl
@@ -0,0 +1,57 @@
+/* wkspace.inl
+ *
+ * This include file contains the bodies of the routines which contains
+ * information related to the RAM Workspace.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_inl
+#define __WORKSPACE_inl
+
+/*PAGE
+ *
+ * _Workspace_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * 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 NULL is returned.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Workspace_Allocate(
+ unsigned32 size
+)
+{
+ return _Heap_Allocate( &_Workspace_Area, size );
+}
+
+/*PAGE
+ *
+ * _Workspace_Free
+ *
+ * DESCRIPTION:
+ *
+ * This function frees the specified block of memory. If the block
+ * belongs to the Workspace and can be successfully freed, then
+ * TRUE is returned. Otherwise FALSE is returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Workspace_Free(
+ void *block
+)
+{
+ return _Heap_Free( &_Workspace_Area, block );
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/Makefile.in b/c/src/exec/score/macros/Makefile.in
new file mode 100644
index 0000000000..147df5ad0f
--- /dev/null
+++ b/c/src/exec/score/macros/Makefile.in
@@ -0,0 +1,31 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= address chain coremsg coremutex coresem heap \
+ isr mppkt object objectmp priority stack states sysstate thread \
+ threadmp tod tqdata userext watchdog wkspace
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/score
diff --git a/c/src/exec/score/macros/README b/c/src/exec/score/macros/README
new file mode 100644
index 0000000000..b2f0c4d481
--- /dev/null
+++ b/c/src/exec/score/macros/README
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+
+The files in this directory are not considered the "primary" source
+of inlined routines for RTEMS. The "inline" directory contains
+the implementations of the inlined basis which are regularly
+tested. In general, an effort is made to keep the contents of
+this directory up to date but testing is only performed irregularly
+and even then it is usually with a single target processor and BSP.
+
+The primary purpose of the code in this directory is to insure
+that RTEMS can be compiled using a C compiler which does not support
+static inline routines.
+
+These were last successfully tested on 2/1/95 on a prerelease version
+of 3.2.0. The testing was done only on the Force CPU386 i386 target board.
+No testing was done on version of the code in the final release.
diff --git a/c/src/exec/score/macros/address.inl b/c/src/exec/score/macros/address.inl
new file mode 100644
index 0000000000..ec748b7534
--- /dev/null
+++ b/c/src/exec/score/macros/address.inl
@@ -0,0 +1,68 @@
+/* macros/address.h
+ *
+ * This include file contains the bodies of the routines
+ * about addresses which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_ADDRESSES_h
+#define __MACROS_ADDRESSES_h
+
+/*PAGE
+ *
+ * _Addresses_Add_offset
+ *
+ */
+
+#define _Addresses_Add_offset( _base, _offset ) \
+ ((void *)((char *)(_base) + (_offset)))
+
+/*PAGE
+ *
+ * _Addresses_Subtract_offset
+ *
+ */
+
+#define _Addresses_Subtract_offset( _base, _offset ) \
+ ((void *)((char *)(_base) - (_offset)))
+
+/*PAGE
+ *
+ * _Addresses_Subtract
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+#define _Addresses_Subtract( _left, _right ) \
+ ((void *)(_left) - (void *)(_right))
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ */
+
+#define _Addresses_Is_aligned( _address ) \
+ ( ( (unsigned32)(_address) % 4 ) == 0 )
+
+/*PAGE
+ *
+ * _Addresses_Is_in_range
+ *
+ */
+
+#define _Addresses_Is_in_range( _address, _base, _limit ) \
+ ( (_address) >= (_base) && (_address) <= (_limit) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/chain.inl b/c/src/exec/score/macros/chain.inl
new file mode 100644
index 0000000000..bfd3f0ac96
--- /dev/null
+++ b/c/src/exec/score/macros/chain.inl
@@ -0,0 +1,200 @@
+/* macros/chain.h
+ *
+ * This include file contains the bodies of the routines which are
+ * associated with doubly linked chains and inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_CHAIN_h
+#define __MACROS_CHAIN_h
+
+/*PAGE
+ *
+ * _Chain_Are_nodes_equal
+ */
+
+#define _Chain_Are_nodes_equal( _left, _right ) \
+ ( (_left) == (_right) )
+
+/*PAGE
+ *
+ * _Chain_Is_null
+ */
+
+#define _Chain_Is_null( _the_chain ) \
+ ( (_the_chain) == NULL )
+
+/*PAGE
+ *
+ * _Chain_Is_null_node
+ */
+
+#define _Chain_Is_null_node( _the_node ) \
+ ( (_the_node) == NULL )
+
+/*PAGE
+ *
+ * _Chain_Head
+ */
+
+#define _Chain_Head( _the_chain ) \
+ ((Chain_Node *) (_the_chain))
+
+/*PAGE
+ *
+ * _Chain_Tail
+ */
+
+#define _Chain_Tail( _the_chain ) \
+ ((Chain_Node *) &(_the_chain)->permanent_null)
+
+/*PAGE
+ *
+ * _Chain_Is_empty
+ */
+
+#define _Chain_Is_empty( _the_chain ) \
+ ( (_the_chain)->first == _Chain_Tail( (_the_chain) ) )
+
+/*PAGE
+ *
+ * _Chain_Is_first
+ */
+
+#define _Chain_Is_first( _the_node ) \
+ ( (the_node)->previous == NULL )
+
+/*PAGE
+ *
+ * _Chain_Is_last
+ */
+
+#define _Chain_Is_last( _the_node ) \
+ ( (_the_node)->next == NULL )
+
+/*PAGE
+ *
+ * _Chain_Has_only_one_node
+ */
+
+#define _Chain_Has_only_one_node( _the_chain ) \
+ ( (_the_chain)->first == (_the_chain)->last )
+
+/*PAGE
+ *
+ * _Chain_Is_head
+ */
+
+#define _Chain_Is_head( _the_chain, _the_node ) \
+ ( (_the_node) == _Chain_Head( (_the_chain) ) )
+
+/*PAGE
+ *
+ * _Chain_Is_tail
+ */
+
+#define _Chain_Is_tail( _the_chain, _the_node ) \
+ ( (_the_node) == _Chain_Tail( (_the_chain) ) )
+
+/*PAGE
+ *
+ * Chain_Initialize_empty
+ */
+
+#define _Chain_Initialize_empty( _the_chain ) \
+{ \
+ (_the_chain)->first = _Chain_Tail( (_the_chain) ); \
+ (_the_chain)->permanent_null = NULL; \
+ (_the_chain)->last = _Chain_Head( (_the_chain) ); \
+}
+
+/*PAGE
+ *
+ * _Chain_Extract_unprotected
+ */
+
+#define _Chain_Extract_unprotected( _the_node ) \
+{ \
+ Chain_Node *_next; \
+ Chain_Node *_previous; \
+ \
+ _next = (_the_node)->next; \
+ _previous = (_the_node)->previous; \
+ _next->previous = _previous; \
+ _previous->next = _next; \
+}
+
+/*PAGE
+ *
+ * _Chain_Get_unprotected
+ */
+
+/*PAGE
+ *
+ * Chain_Get_unprotected
+ */
+
+#define _Chain_Get_unprotected( _the_chain ) \
+ (( !_Chain_Is_empty( (_the_chain) ) ) \
+ ? _Chain_Get_first_unprotected( (_the_chain) ) \
+ : NULL)
+
+/*PAGE
+ *
+ * _Chain_Insert_unprotected
+ */
+
+#define _Chain_Insert_unprotected( _after_node, _the_node ) \
+do { \
+ Chain_Node *_before_node; \
+ \
+ (_the_node)->previous = (_after_node); \
+ _before_node = (_after_node)->next; \
+ (_after_node)->next = (_the_node); \
+ (_the_node)->next = _before_node; \
+ _before_node->previous = (_the_node); \
+} while (0)
+
+/*PAGE
+ *
+ * _Chain_Append_unprotected
+ */
+
+#define _Chain_Append_unprotected( _the_chain, _the_node ) \
+{ \
+ Chain_Node *_old_last_node; \
+ \
+ (_the_node)->next = _Chain_Tail( (_the_chain) ); \
+ _old_last_node = (_the_chain)->last; \
+ (_the_chain)->last = (_the_node); \
+ _old_last_node->next = (_the_node); \
+ (_the_node)->previous = _old_last_node; \
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend_unprotected
+ */
+
+#define _Chain_Prepend_unprotected( _the_chain, _the_node ) \
+ _Chain_Insert_unprotected( _Chain_Head( (_the_chain) ), (_the_node) )
+
+/*PAGE
+ *
+ * _Chain_Prepend
+ */
+
+#define _Chain_Prepend( _the_chain, _the_node ) \
+ _Chain_Insert( _Chain_Head( (_the_chain) ), (_the_node) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/coremsg.inl b/c/src/exec/score/macros/coremsg.inl
new file mode 100644
index 0000000000..9f7135aa91
--- /dev/null
+++ b/c/src/exec/score/macros/coremsg.inl
@@ -0,0 +1,143 @@
+/* coremsg.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Core Message Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CORE_MESSAGE_QUEUE_inl
+#define __CORE_MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _CORE_message_queue_Send
+ *
+ */
+
+#define _CORE_message_queue_Send( _the_message_queue, _buffer, _size, \
+_id, _api_message_queue_mp_support ) \
+ _CORE_message_queue_Submit( (_the_message_queue), (_buffer), (_size), \
+ (_id), (_api_message_queue_mp_support), CORE_MESSAGE_QUEUE_SEND_REQUEST )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Urgent
+ *
+ */
+
+#define _CORE_message_queue_Urgent( _the_message_queue, _buffer, _size, \
+_id, _api_message_queue_mp_support ) \
+ _CORE_message_queue_Submit( (_the_message_queue), (_buffer), (_size), \
+ (_id), (_api_message_queue_mp_support), CORE_MESSAGE_QUEUE_URGENT_REQUEST )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Copy_buffer
+ */
+
+#define _CORE_message_queue_Copy_buffer( _source, _destination, _size ) \
+ memcpy( _destination, _source, _size)
+
+/*PAGE
+ *
+ * _CORE_message_queue_Allocate_message_buffer
+ *
+ */
+
+#define _CORE_message_queue_Allocate_message_buffer( _the_message_queue ) \
+ (CORE_message_queue_Buffer_control *) \
+ _Chain_Get( &(_the_message_queue)->Inactive_messages )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Free_message_buffer
+ *
+ */
+
+#define _CORE_message_queue_Free_message_buffer( _the_message_queue, _the_message ) \
+ _Chain_Append( \
+ &(_the_message_queue)->Inactive_messages, \
+ &(_the_message)->Node \
+ )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_priority
+ *
+ */
+
+#define _CORE_message_queue_Is_priority( _the_attribute ) \
+ ((_the_attribute)->discipline == CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY)
+
+/*PAGE
+ *
+ * _CORE_message_queue_Get_pending_message
+ *
+ */
+
+#define _CORE_message_queue_Get_pending_message( _the_message_queue ) \
+ (CORE_message_queue_Buffer_control *) \
+ _Chain_Get_unprotected( &(_the_message_queue)->Pending_messages )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Append
+ *
+ */
+
+#define _CORE_message_queue_Append( _the_message_queue, _the_message ) \
+ _Chain_Append( &(_the_message_queue)->Pending_messages, \
+ &(_the_message)->Node )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Prepend
+ *
+ */
+
+#define _CORE_message_queue_Prepend( _the_message_queue, _the_message ) \
+ _Chain_Prepend( &(_the_message_queue)->Pending_messages, \
+ &(_the_message)->Node )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_null
+ *
+ */
+
+#define _CORE_message_queue_Is_null( _the_message_queue ) \
+ ( (_the_message_queue) == NULL )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_notify_enabled
+ *
+ */
+
+#define _CORE_message_queue_Is_notify_enabled( _the_message_queue ) \
+ ( (_the_message_queue)->notify_handler != NULL )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Set_notify
+ *
+ */
+
+#define _CORE_message_queue_Set_notify( \
+ _the_message_queue, _the_handler, _the_argument ) \
+ do { \
+ (_the_message_queue)->notify_handler = (_the_handler); \
+ (_the_message_queue)->notify_argument = (_the_argument); \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/coremutex.inl b/c/src/exec/score/macros/coremutex.inl
new file mode 100644
index 0000000000..91126301f8
--- /dev/null
+++ b/c/src/exec/score/macros/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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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/c/src/exec/score/macros/coresem.inl b/c/src/exec/score/macros/coresem.inl
new file mode 100644
index 0000000000..a053fcd5f5
--- /dev/null
+++ b/c/src/exec/score/macros/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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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/c/src/exec/score/macros/heap.inl b/c/src/exec/score/macros/heap.inl
new file mode 100644
index 0000000000..26f8145245
--- /dev/null
+++ b/c/src/exec/score/macros/heap.inl
@@ -0,0 +1,150 @@
+/* heap.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the heap handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __HEAP_inl
+#define __HEAP_inl
+
+#include <rtems/score/address.h>
+
+/*PAGE
+ *
+ * _Heap_Head
+ */
+
+#define _Heap_Head( _the_heap ) \
+ ((Heap_Block *)&(_the_heap)->start)
+
+/*PAGE
+ *
+ * _Heap_Tail
+ */
+
+#define _Heap_Tail( _the_heap ) \
+ ((Heap_Block *)&(_the_heap)->final)
+
+/*PAGE
+ *
+ * _Heap_Previous_block
+ */
+
+#define _Heap_Previous_block( _the_block ) \
+ ( (Heap_Block *) _Addresses_Subtract_offset( \
+ (void *)(_the_block), \
+ (_the_block)->back_flag & ~ HEAP_BLOCK_USED \
+ ) \
+ )
+
+/*PAGE
+ *
+ * _Heap_Next_block
+ */
+
+#define _Heap_Next_block( _the_block ) \
+ ( (Heap_Block *) _Addresses_Add_offset( \
+ (void *)(_the_block), \
+ (_the_block)->front_flag & ~ HEAP_BLOCK_USED \
+ ) \
+ )
+
+/*PAGE
+ *
+ * _Heap_Block_at
+ */
+
+#define _Heap_Block_at( _base, _offset ) \
+ ( (Heap_Block *) \
+ _Addresses_Add_offset( (void *)(_base), (_offset) ) )
+
+/*PAGE
+ *
+ * _Heap_User_block_at
+ *
+ */
+
+#define _Heap_User_block_at( _base ) \
+ _Heap_Block_at( \
+ (_base), \
+ -*(((unsigned32 *) (_base)) - 1) + -HEAP_BLOCK_USED_OVERHEAD \
+ )
+
+/*PAGE
+ *
+ * _Heap_Is_previous_block_free
+ */
+
+#define _Heap_Is_previous_block_free( _the_block ) \
+ ( !((_the_block)->back_flag & HEAP_BLOCK_USED) )
+
+/*PAGE
+ *
+ * _Heap_Is_block_free
+ */
+
+#define _Heap_Is_block_free( _the_block ) \
+ ( !((_the_block)->front_flag & HEAP_BLOCK_USED) )
+
+/*PAGE
+ *
+ * _Heap_Is_block_used
+ */
+
+#define _Heap_Is_block_used( _the_block ) \
+ ((_the_block)->front_flag & HEAP_BLOCK_USED)
+
+/*PAGE
+ *
+ * _Heap_Block_size
+ */
+
+#define _Heap_Block_size( _the_block ) \
+ ((_the_block)->front_flag & ~HEAP_BLOCK_USED)
+
+/*PAGE
+ *
+ * _Heap_Start_of_user_area
+ */
+
+#define _Heap_Start_of_user_area( _the_block ) \
+ ((void *) &(_the_block)->next)
+
+/*PAGE
+ *
+ * _Heap_Is_block_in
+ */
+
+#define _Heap_Is_block_in( _the_heap, _the_block ) \
+ ( ((_the_block) >= (_the_heap)->start) && \
+ ((_the_block) <= (_the_heap)->final) )
+
+/*PAGE
+ *
+ * _Heap_Is_page_size_valid
+ */
+
+#define _Heap_Is_page_size_valid( _page_size ) \
+ ( ((_page_size) != 0) && \
+ (((_page_size) % CPU_HEAP_ALIGNMENT) == 0) )
+
+/*PAGE
+ *
+ * _Heap_Build_flag
+ */
+
+#define _Heap_Build_flag( _size, _in_use_flag ) \
+ ( (_size) | (_in_use_flag))
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/isr.inl b/c/src/exec/score/macros/isr.inl
new file mode 100644
index 0000000000..69ae8fe690
--- /dev/null
+++ b/c/src/exec/score/macros/isr.inl
@@ -0,0 +1,48 @@
+/* isr.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Interrupt Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_inl
+#define __ISR_inl
+
+/*PAGE
+ *
+ * _ISR_Is_in_progress
+ *
+ */
+
+#define _ISR_Is_in_progress() \
+ (_ISR_Nest_level != 0)
+
+/*PAGE
+ *
+ * _ISR_Is_vector_number_valid
+ *
+ */
+
+#define _ISR_Is_vector_number_valid( _vector ) \
+ ( (_vector) <= CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER )
+
+/*PAGE
+ *
+ * _ISR_Is_valid_user_handler
+ *
+ */
+
+#define _ISR_Is_valid_user_handler( _handler ) \
+ ((_handler) != NULL)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/mppkt.inl b/c/src/exec/score/macros/mppkt.inl
new file mode 100644
index 0000000000..22832c6748
--- /dev/null
+++ b/c/src/exec/score/macros/mppkt.inl
@@ -0,0 +1,41 @@
+/* macros/mppkt.h
+ *
+ * This package is the implementation of the Packet Handler
+ * routines which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_PACKET_h
+#define __MACROS_MP_PACKET_h
+
+/*PAGE
+ *
+ * _Mp_packet_Is_valid_packet_class
+ *
+ * NOTE: Check for lower bounds (MP_PACKET_CLASSES_FIRST ) is unnecessary
+ * because this enum starts at lower bound of zero.
+ */
+
+#define _Mp_packet_Is_valid_packet_class( _the_packet_class ) \
+ ( (_the_packet_class) <= MP_PACKET_CLASSES_LAST )
+
+/*PAGE
+ *
+ * _Mp_packet_Is_null
+ *
+ */
+
+#define _Mp_packet_Is_null ( _the_packet ) \
+ ( (_the_packet) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/object.inl b/c/src/exec/score/macros/object.inl
new file mode 100644
index 0000000000..de1c9f256c
--- /dev/null
+++ b/c/src/exec/score/macros/object.inl
@@ -0,0 +1,148 @@
+/* object.inl
+ *
+ * This include file contains the macro implementation of all
+ * of the inlined routines in the Object Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_inl
+#define __OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_Build_id
+ *
+ */
+
+#define _Objects_Build_id( _the_class, _node, _index ) \
+ ( ((_the_class) << OBJECTS_CLASS_START_BIT) | \
+ ((_node) << OBJECTS_NODE_START_BIT) | \
+ ((_index) << OBJECTS_INDEX_START_BIT) )
+
+/*PAGE
+ *
+ * _Objects_Get_class
+ */
+
+#define _Objects_Get_class( _id ) \
+ (Objects_Classes) \
+ (((_id) >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Get_node
+ *
+ */
+
+#define _Objects_Get_node( _id ) \
+ (((_id) >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Get_index
+ *
+ */
+
+#define _Objects_Get_index( _id ) \
+ (((_id) >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Is_class_valid
+ *
+ */
+
+#define _Objects_Is_class_valid( _the_class ) \
+ ( (_the_class) <= OBJECTS_CLASSES_LAST )
+
+/*PAGE
+ *
+ * _Objects_Is_local_node
+ *
+ */
+
+#define _Objects_Is_local_node( _node ) \
+ ( (_node) == _Objects_Local_node )
+
+/*PAGE
+ *
+ * _Objects_Is_local_id
+ *
+ */
+
+#define _Objects_Is_local_id( _id ) \
+ _Objects_Is_local_node( _Objects_Get_node(_id) )
+
+/*PAGE
+ *
+ * _Objects_Are_ids_equal
+ *
+ */
+
+#define _Objects_Are_ids_equal( _left, _right ) \
+ ( (_left) == (_right) )
+
+/*PAGE
+ *
+ * _Objects_Allocate
+ *
+ */
+
+#define _Objects_Allocate( _information ) \
+ (Objects_Control *) _Chain_Get( &(_information)->Inactive )
+
+/*PAGE
+ *
+ * _Objects_Free
+ *
+ */
+
+#define _Objects_Free( _information, _the_object ) \
+ _Chain_Append( &(_information)->Inactive, &(_the_object)->Node )
+
+/*PAGE
+ *
+ * _Objects_Open
+ *
+ */
+
+#define _Objects_Open( _information, _the_object, _name ) \
+ { \
+ unsigned32 _index; \
+ \
+ _index = _Objects_Get_index( (_the_object)->id ); \
+ (_information)->local_table[ _index ] = (_the_object); \
+ \
+ if ( (_information)->is_string ) \
+ _Objects_Copy_name_string( (_name), (_the_object)->name ); \
+ else \
+ _Objects_Copy_name_raw( \
+ (_name), (_the_object)->name, (_information)->name_length ); \
+ }
+
+/*PAGE
+ *
+ * _Objects_Close
+ *
+ */
+
+#define _Objects_Close( _information, _the_object ) \
+ { \
+ unsigned32 _index; \
+ \
+ _index = _Objects_Get_index( (_the_object)->id ); \
+ (_information)->local_table[ _index ] = NULL; \
+ _Objects_Clear_name( (_the_object)->name, (_information)->name_length ); \
+ }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/objectmp.inl b/c/src/exec/score/macros/objectmp.inl
new file mode 100644
index 0000000000..2b499e70e5
--- /dev/null
+++ b/c/src/exec/score/macros/objectmp.inl
@@ -0,0 +1,50 @@
+/* macros/objectmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * which deal with global objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_OBJECTS_inl
+#define __MACROS_MP_OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_global_object
+ *
+ */
+
+#define _Objects_MP_Allocate_global_object() \
+ (Objects_MP_Control *) \
+ _Chain_Get( &_Objects_MP_Inactive_global_objects )
+
+/*PAGE
+ * _Objects_MP_Free_global_object
+ *
+ */
+
+#define _Objects_MP_Free_global_object( _the_object ) \
+ _Chain_Append( \
+ &_Objects_MP_Inactive_global_objects, \
+ &(_the_object)->Object.Node \
+ )
+
+/*PAGE
+ * _Objects_MP_Is_null_global_object
+ *
+ */
+
+#define _Objects_MP_Is_null_global_object( _the_object ) \
+ ( (_the_object) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/priority.inl b/c/src/exec/score/macros/priority.inl
new file mode 100644
index 0000000000..e18567ba8c
--- /dev/null
+++ b/c/src/exec/score/macros/priority.inl
@@ -0,0 +1,170 @@
+/* priority.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Priority Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_inl
+#define __PRIORITY_inl
+
+#include <rtems/score/bitfield.h>
+
+/*PAGE
+ *
+ * _Priority_Handler_initialization
+ *
+ */
+
+#define _Priority_Handler_initialization() \
+ { \
+ unsigned32 index; \
+ \
+ _Priority_Major_bit_map = 0; \
+ for ( index=0 ; index <16 ; index++ ) \
+ _Priority_Bit_map[ index ] = 0; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Is_valid
+ *
+ */
+
+ /*
+ * 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) <= PRIORITY_MAXIMUM )
+
+/*PAGE
+ *
+ * _Priority_Major
+ *
+ */
+
+#define _Priority_Major( _the_priority ) ( (_the_priority) / 16 )
+
+/*PAGE
+ *
+ * _Priority_Minor
+ *
+ */
+
+#define _Priority_Minor( _the_priority ) ( (_the_priority) % 16 )
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
+
+/*PAGE
+ *
+ * _Priority_Mask
+ *
+ */
+
+#define _Priority_Mask( _bit_number ) \
+ (0x8000 >> _bit_number)
+
+/*PAGE
+ *
+ * _Priority_Bits_index
+ *
+ */
+
+#define _Priority_Bits_index( _bit_number ) \
+ (_bit_number)
+
+#endif
+
+/*PAGE
+ *
+ * _Priority_Add_to_bit_map
+ *
+ */
+
+#define _Priority_Add_to_bit_map( _the_priority_map ) \
+ { \
+ *(_the_priority_map)->minor |= (_the_priority_map)->ready_minor; \
+ _Priority_Major_bit_map |= (_the_priority_map)->ready_major; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Remove_from_bit_map
+ *
+ */
+
+#define _Priority_Remove_from_bit_map( _the_priority_map ) \
+ { \
+ *(_the_priority_map)->minor &= (_the_priority_map)->block_minor; \
+ if ( *(_the_priority_map)->minor == 0 ) \
+ _Priority_Major_bit_map &= (_the_priority_map)->block_major; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Get_highest
+ *
+ */
+
+#define _Priority_Get_highest( _high_priority ) \
+ { \
+ Priority_Bit_map_control minor; \
+ Priority_Bit_map_control major; \
+ \
+ _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); \
+ _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); \
+ \
+ (_high_priority) = (_Priority_Bits_index( major ) * 16) + \
+ _Priority_Bits_index( minor ); \
+ }
+
+/*PAGE
+ *
+ * _Priority_Initialize_information
+ *
+ */
+
+#define _Priority_Initialize_information( \
+ _the_priority_map, _new_priority ) \
+ { \
+ Priority_Bit_map_control _major; \
+ Priority_Bit_map_control _minor; \
+ Priority_Bit_map_control _mask; \
+ \
+ _major = _Priority_Major( (_new_priority) ); \
+ _minor = _Priority_Minor( (_new_priority) ); \
+ \
+ (_the_priority_map)->minor = \
+ &_Priority_Bit_map[ _Priority_Bits_index(_major) ]; \
+ \
+ _mask = _Priority_Mask( _major ); \
+ (_the_priority_map)->ready_major = _mask; \
+ (_the_priority_map)->block_major = ~_mask; \
+ \
+ _mask = _Priority_Mask( _minor ); \
+ (_the_priority_map)->ready_minor = _mask; \
+ (_the_priority_map)->block_minor = ~_mask; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Is_group_empty
+ *
+ */
+
+#define _Priority_Is_group_empty ( _the_priority ) \
+ ( (_the_priority) == 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/Makefile.in b/c/src/exec/score/macros/rtems/score/Makefile.in
new file mode 100644
index 0000000000..147df5ad0f
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/Makefile.in
@@ -0,0 +1,31 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+I_PIECES= address chain coremsg coremutex coresem heap \
+ isr mppkt object objectmp priority stack states sysstate thread \
+ threadmp tod tqdata userext watchdog wkspace
+I_FILES=$(I_PIECES:%=$(srcdir)/%.inl)
+
+SRCS=$(I_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 ${I_FILES} ${PROJECT_RELEASE}/include/rtems/score
diff --git a/c/src/exec/score/macros/rtems/score/README b/c/src/exec/score/macros/rtems/score/README
new file mode 100644
index 0000000000..b2f0c4d481
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/README
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+
+The files in this directory are not considered the "primary" source
+of inlined routines for RTEMS. The "inline" directory contains
+the implementations of the inlined basis which are regularly
+tested. In general, an effort is made to keep the contents of
+this directory up to date but testing is only performed irregularly
+and even then it is usually with a single target processor and BSP.
+
+The primary purpose of the code in this directory is to insure
+that RTEMS can be compiled using a C compiler which does not support
+static inline routines.
+
+These were last successfully tested on 2/1/95 on a prerelease version
+of 3.2.0. The testing was done only on the Force CPU386 i386 target board.
+No testing was done on version of the code in the final release.
diff --git a/c/src/exec/score/macros/rtems/score/address.inl b/c/src/exec/score/macros/rtems/score/address.inl
new file mode 100644
index 0000000000..ec748b7534
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/address.inl
@@ -0,0 +1,68 @@
+/* macros/address.h
+ *
+ * This include file contains the bodies of the routines
+ * about addresses which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_ADDRESSES_h
+#define __MACROS_ADDRESSES_h
+
+/*PAGE
+ *
+ * _Addresses_Add_offset
+ *
+ */
+
+#define _Addresses_Add_offset( _base, _offset ) \
+ ((void *)((char *)(_base) + (_offset)))
+
+/*PAGE
+ *
+ * _Addresses_Subtract_offset
+ *
+ */
+
+#define _Addresses_Subtract_offset( _base, _offset ) \
+ ((void *)((char *)(_base) - (_offset)))
+
+/*PAGE
+ *
+ * _Addresses_Subtract
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+#define _Addresses_Subtract( _left, _right ) \
+ ((void *)(_left) - (void *)(_right))
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ */
+
+#define _Addresses_Is_aligned( _address ) \
+ ( ( (unsigned32)(_address) % 4 ) == 0 )
+
+/*PAGE
+ *
+ * _Addresses_Is_in_range
+ *
+ */
+
+#define _Addresses_Is_in_range( _address, _base, _limit ) \
+ ( (_address) >= (_base) && (_address) <= (_limit) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/chain.inl b/c/src/exec/score/macros/rtems/score/chain.inl
new file mode 100644
index 0000000000..bfd3f0ac96
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/chain.inl
@@ -0,0 +1,200 @@
+/* macros/chain.h
+ *
+ * This include file contains the bodies of the routines which are
+ * associated with doubly linked chains and inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_CHAIN_h
+#define __MACROS_CHAIN_h
+
+/*PAGE
+ *
+ * _Chain_Are_nodes_equal
+ */
+
+#define _Chain_Are_nodes_equal( _left, _right ) \
+ ( (_left) == (_right) )
+
+/*PAGE
+ *
+ * _Chain_Is_null
+ */
+
+#define _Chain_Is_null( _the_chain ) \
+ ( (_the_chain) == NULL )
+
+/*PAGE
+ *
+ * _Chain_Is_null_node
+ */
+
+#define _Chain_Is_null_node( _the_node ) \
+ ( (_the_node) == NULL )
+
+/*PAGE
+ *
+ * _Chain_Head
+ */
+
+#define _Chain_Head( _the_chain ) \
+ ((Chain_Node *) (_the_chain))
+
+/*PAGE
+ *
+ * _Chain_Tail
+ */
+
+#define _Chain_Tail( _the_chain ) \
+ ((Chain_Node *) &(_the_chain)->permanent_null)
+
+/*PAGE
+ *
+ * _Chain_Is_empty
+ */
+
+#define _Chain_Is_empty( _the_chain ) \
+ ( (_the_chain)->first == _Chain_Tail( (_the_chain) ) )
+
+/*PAGE
+ *
+ * _Chain_Is_first
+ */
+
+#define _Chain_Is_first( _the_node ) \
+ ( (the_node)->previous == NULL )
+
+/*PAGE
+ *
+ * _Chain_Is_last
+ */
+
+#define _Chain_Is_last( _the_node ) \
+ ( (_the_node)->next == NULL )
+
+/*PAGE
+ *
+ * _Chain_Has_only_one_node
+ */
+
+#define _Chain_Has_only_one_node( _the_chain ) \
+ ( (_the_chain)->first == (_the_chain)->last )
+
+/*PAGE
+ *
+ * _Chain_Is_head
+ */
+
+#define _Chain_Is_head( _the_chain, _the_node ) \
+ ( (_the_node) == _Chain_Head( (_the_chain) ) )
+
+/*PAGE
+ *
+ * _Chain_Is_tail
+ */
+
+#define _Chain_Is_tail( _the_chain, _the_node ) \
+ ( (_the_node) == _Chain_Tail( (_the_chain) ) )
+
+/*PAGE
+ *
+ * Chain_Initialize_empty
+ */
+
+#define _Chain_Initialize_empty( _the_chain ) \
+{ \
+ (_the_chain)->first = _Chain_Tail( (_the_chain) ); \
+ (_the_chain)->permanent_null = NULL; \
+ (_the_chain)->last = _Chain_Head( (_the_chain) ); \
+}
+
+/*PAGE
+ *
+ * _Chain_Extract_unprotected
+ */
+
+#define _Chain_Extract_unprotected( _the_node ) \
+{ \
+ Chain_Node *_next; \
+ Chain_Node *_previous; \
+ \
+ _next = (_the_node)->next; \
+ _previous = (_the_node)->previous; \
+ _next->previous = _previous; \
+ _previous->next = _next; \
+}
+
+/*PAGE
+ *
+ * _Chain_Get_unprotected
+ */
+
+/*PAGE
+ *
+ * Chain_Get_unprotected
+ */
+
+#define _Chain_Get_unprotected( _the_chain ) \
+ (( !_Chain_Is_empty( (_the_chain) ) ) \
+ ? _Chain_Get_first_unprotected( (_the_chain) ) \
+ : NULL)
+
+/*PAGE
+ *
+ * _Chain_Insert_unprotected
+ */
+
+#define _Chain_Insert_unprotected( _after_node, _the_node ) \
+do { \
+ Chain_Node *_before_node; \
+ \
+ (_the_node)->previous = (_after_node); \
+ _before_node = (_after_node)->next; \
+ (_after_node)->next = (_the_node); \
+ (_the_node)->next = _before_node; \
+ _before_node->previous = (_the_node); \
+} while (0)
+
+/*PAGE
+ *
+ * _Chain_Append_unprotected
+ */
+
+#define _Chain_Append_unprotected( _the_chain, _the_node ) \
+{ \
+ Chain_Node *_old_last_node; \
+ \
+ (_the_node)->next = _Chain_Tail( (_the_chain) ); \
+ _old_last_node = (_the_chain)->last; \
+ (_the_chain)->last = (_the_node); \
+ _old_last_node->next = (_the_node); \
+ (_the_node)->previous = _old_last_node; \
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend_unprotected
+ */
+
+#define _Chain_Prepend_unprotected( _the_chain, _the_node ) \
+ _Chain_Insert_unprotected( _Chain_Head( (_the_chain) ), (_the_node) )
+
+/*PAGE
+ *
+ * _Chain_Prepend
+ */
+
+#define _Chain_Prepend( _the_chain, _the_node ) \
+ _Chain_Insert( _Chain_Head( (_the_chain) ), (_the_node) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/coremsg.inl b/c/src/exec/score/macros/rtems/score/coremsg.inl
new file mode 100644
index 0000000000..9f7135aa91
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/coremsg.inl
@@ -0,0 +1,143 @@
+/* coremsg.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Core Message Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CORE_MESSAGE_QUEUE_inl
+#define __CORE_MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _CORE_message_queue_Send
+ *
+ */
+
+#define _CORE_message_queue_Send( _the_message_queue, _buffer, _size, \
+_id, _api_message_queue_mp_support ) \
+ _CORE_message_queue_Submit( (_the_message_queue), (_buffer), (_size), \
+ (_id), (_api_message_queue_mp_support), CORE_MESSAGE_QUEUE_SEND_REQUEST )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Urgent
+ *
+ */
+
+#define _CORE_message_queue_Urgent( _the_message_queue, _buffer, _size, \
+_id, _api_message_queue_mp_support ) \
+ _CORE_message_queue_Submit( (_the_message_queue), (_buffer), (_size), \
+ (_id), (_api_message_queue_mp_support), CORE_MESSAGE_QUEUE_URGENT_REQUEST )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Copy_buffer
+ */
+
+#define _CORE_message_queue_Copy_buffer( _source, _destination, _size ) \
+ memcpy( _destination, _source, _size)
+
+/*PAGE
+ *
+ * _CORE_message_queue_Allocate_message_buffer
+ *
+ */
+
+#define _CORE_message_queue_Allocate_message_buffer( _the_message_queue ) \
+ (CORE_message_queue_Buffer_control *) \
+ _Chain_Get( &(_the_message_queue)->Inactive_messages )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Free_message_buffer
+ *
+ */
+
+#define _CORE_message_queue_Free_message_buffer( _the_message_queue, _the_message ) \
+ _Chain_Append( \
+ &(_the_message_queue)->Inactive_messages, \
+ &(_the_message)->Node \
+ )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_priority
+ *
+ */
+
+#define _CORE_message_queue_Is_priority( _the_attribute ) \
+ ((_the_attribute)->discipline == CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY)
+
+/*PAGE
+ *
+ * _CORE_message_queue_Get_pending_message
+ *
+ */
+
+#define _CORE_message_queue_Get_pending_message( _the_message_queue ) \
+ (CORE_message_queue_Buffer_control *) \
+ _Chain_Get_unprotected( &(_the_message_queue)->Pending_messages )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Append
+ *
+ */
+
+#define _CORE_message_queue_Append( _the_message_queue, _the_message ) \
+ _Chain_Append( &(_the_message_queue)->Pending_messages, \
+ &(_the_message)->Node )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Prepend
+ *
+ */
+
+#define _CORE_message_queue_Prepend( _the_message_queue, _the_message ) \
+ _Chain_Prepend( &(_the_message_queue)->Pending_messages, \
+ &(_the_message)->Node )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_null
+ *
+ */
+
+#define _CORE_message_queue_Is_null( _the_message_queue ) \
+ ( (_the_message_queue) == NULL )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_notify_enabled
+ *
+ */
+
+#define _CORE_message_queue_Is_notify_enabled( _the_message_queue ) \
+ ( (_the_message_queue)->notify_handler != NULL )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Set_notify
+ *
+ */
+
+#define _CORE_message_queue_Set_notify( \
+ _the_message_queue, _the_handler, _the_argument ) \
+ do { \
+ (_the_message_queue)->notify_handler = (_the_handler); \
+ (_the_message_queue)->notify_argument = (_the_argument); \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/coremutex.inl b/c/src/exec/score/macros/rtems/score/coremutex.inl
new file mode 100644
index 0000000000..91126301f8
--- /dev/null
+++ b/c/src/exec/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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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/c/src/exec/score/macros/rtems/score/coresem.inl b/c/src/exec/score/macros/rtems/score/coresem.inl
new file mode 100644
index 0000000000..a053fcd5f5
--- /dev/null
+++ b/c/src/exec/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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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/c/src/exec/score/macros/rtems/score/heap.inl b/c/src/exec/score/macros/rtems/score/heap.inl
new file mode 100644
index 0000000000..26f8145245
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/heap.inl
@@ -0,0 +1,150 @@
+/* heap.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the heap handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __HEAP_inl
+#define __HEAP_inl
+
+#include <rtems/score/address.h>
+
+/*PAGE
+ *
+ * _Heap_Head
+ */
+
+#define _Heap_Head( _the_heap ) \
+ ((Heap_Block *)&(_the_heap)->start)
+
+/*PAGE
+ *
+ * _Heap_Tail
+ */
+
+#define _Heap_Tail( _the_heap ) \
+ ((Heap_Block *)&(_the_heap)->final)
+
+/*PAGE
+ *
+ * _Heap_Previous_block
+ */
+
+#define _Heap_Previous_block( _the_block ) \
+ ( (Heap_Block *) _Addresses_Subtract_offset( \
+ (void *)(_the_block), \
+ (_the_block)->back_flag & ~ HEAP_BLOCK_USED \
+ ) \
+ )
+
+/*PAGE
+ *
+ * _Heap_Next_block
+ */
+
+#define _Heap_Next_block( _the_block ) \
+ ( (Heap_Block *) _Addresses_Add_offset( \
+ (void *)(_the_block), \
+ (_the_block)->front_flag & ~ HEAP_BLOCK_USED \
+ ) \
+ )
+
+/*PAGE
+ *
+ * _Heap_Block_at
+ */
+
+#define _Heap_Block_at( _base, _offset ) \
+ ( (Heap_Block *) \
+ _Addresses_Add_offset( (void *)(_base), (_offset) ) )
+
+/*PAGE
+ *
+ * _Heap_User_block_at
+ *
+ */
+
+#define _Heap_User_block_at( _base ) \
+ _Heap_Block_at( \
+ (_base), \
+ -*(((unsigned32 *) (_base)) - 1) + -HEAP_BLOCK_USED_OVERHEAD \
+ )
+
+/*PAGE
+ *
+ * _Heap_Is_previous_block_free
+ */
+
+#define _Heap_Is_previous_block_free( _the_block ) \
+ ( !((_the_block)->back_flag & HEAP_BLOCK_USED) )
+
+/*PAGE
+ *
+ * _Heap_Is_block_free
+ */
+
+#define _Heap_Is_block_free( _the_block ) \
+ ( !((_the_block)->front_flag & HEAP_BLOCK_USED) )
+
+/*PAGE
+ *
+ * _Heap_Is_block_used
+ */
+
+#define _Heap_Is_block_used( _the_block ) \
+ ((_the_block)->front_flag & HEAP_BLOCK_USED)
+
+/*PAGE
+ *
+ * _Heap_Block_size
+ */
+
+#define _Heap_Block_size( _the_block ) \
+ ((_the_block)->front_flag & ~HEAP_BLOCK_USED)
+
+/*PAGE
+ *
+ * _Heap_Start_of_user_area
+ */
+
+#define _Heap_Start_of_user_area( _the_block ) \
+ ((void *) &(_the_block)->next)
+
+/*PAGE
+ *
+ * _Heap_Is_block_in
+ */
+
+#define _Heap_Is_block_in( _the_heap, _the_block ) \
+ ( ((_the_block) >= (_the_heap)->start) && \
+ ((_the_block) <= (_the_heap)->final) )
+
+/*PAGE
+ *
+ * _Heap_Is_page_size_valid
+ */
+
+#define _Heap_Is_page_size_valid( _page_size ) \
+ ( ((_page_size) != 0) && \
+ (((_page_size) % CPU_HEAP_ALIGNMENT) == 0) )
+
+/*PAGE
+ *
+ * _Heap_Build_flag
+ */
+
+#define _Heap_Build_flag( _size, _in_use_flag ) \
+ ( (_size) | (_in_use_flag))
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/isr.inl b/c/src/exec/score/macros/rtems/score/isr.inl
new file mode 100644
index 0000000000..69ae8fe690
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/isr.inl
@@ -0,0 +1,48 @@
+/* isr.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Interrupt Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_inl
+#define __ISR_inl
+
+/*PAGE
+ *
+ * _ISR_Is_in_progress
+ *
+ */
+
+#define _ISR_Is_in_progress() \
+ (_ISR_Nest_level != 0)
+
+/*PAGE
+ *
+ * _ISR_Is_vector_number_valid
+ *
+ */
+
+#define _ISR_Is_vector_number_valid( _vector ) \
+ ( (_vector) <= CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER )
+
+/*PAGE
+ *
+ * _ISR_Is_valid_user_handler
+ *
+ */
+
+#define _ISR_Is_valid_user_handler( _handler ) \
+ ((_handler) != NULL)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/mppkt.inl b/c/src/exec/score/macros/rtems/score/mppkt.inl
new file mode 100644
index 0000000000..22832c6748
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/mppkt.inl
@@ -0,0 +1,41 @@
+/* macros/mppkt.h
+ *
+ * This package is the implementation of the Packet Handler
+ * routines which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_PACKET_h
+#define __MACROS_MP_PACKET_h
+
+/*PAGE
+ *
+ * _Mp_packet_Is_valid_packet_class
+ *
+ * NOTE: Check for lower bounds (MP_PACKET_CLASSES_FIRST ) is unnecessary
+ * because this enum starts at lower bound of zero.
+ */
+
+#define _Mp_packet_Is_valid_packet_class( _the_packet_class ) \
+ ( (_the_packet_class) <= MP_PACKET_CLASSES_LAST )
+
+/*PAGE
+ *
+ * _Mp_packet_Is_null
+ *
+ */
+
+#define _Mp_packet_Is_null ( _the_packet ) \
+ ( (_the_packet) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/object.inl b/c/src/exec/score/macros/rtems/score/object.inl
new file mode 100644
index 0000000000..de1c9f256c
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/object.inl
@@ -0,0 +1,148 @@
+/* object.inl
+ *
+ * This include file contains the macro implementation of all
+ * of the inlined routines in the Object Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_inl
+#define __OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_Build_id
+ *
+ */
+
+#define _Objects_Build_id( _the_class, _node, _index ) \
+ ( ((_the_class) << OBJECTS_CLASS_START_BIT) | \
+ ((_node) << OBJECTS_NODE_START_BIT) | \
+ ((_index) << OBJECTS_INDEX_START_BIT) )
+
+/*PAGE
+ *
+ * _Objects_Get_class
+ */
+
+#define _Objects_Get_class( _id ) \
+ (Objects_Classes) \
+ (((_id) >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Get_node
+ *
+ */
+
+#define _Objects_Get_node( _id ) \
+ (((_id) >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Get_index
+ *
+ */
+
+#define _Objects_Get_index( _id ) \
+ (((_id) >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Is_class_valid
+ *
+ */
+
+#define _Objects_Is_class_valid( _the_class ) \
+ ( (_the_class) <= OBJECTS_CLASSES_LAST )
+
+/*PAGE
+ *
+ * _Objects_Is_local_node
+ *
+ */
+
+#define _Objects_Is_local_node( _node ) \
+ ( (_node) == _Objects_Local_node )
+
+/*PAGE
+ *
+ * _Objects_Is_local_id
+ *
+ */
+
+#define _Objects_Is_local_id( _id ) \
+ _Objects_Is_local_node( _Objects_Get_node(_id) )
+
+/*PAGE
+ *
+ * _Objects_Are_ids_equal
+ *
+ */
+
+#define _Objects_Are_ids_equal( _left, _right ) \
+ ( (_left) == (_right) )
+
+/*PAGE
+ *
+ * _Objects_Allocate
+ *
+ */
+
+#define _Objects_Allocate( _information ) \
+ (Objects_Control *) _Chain_Get( &(_information)->Inactive )
+
+/*PAGE
+ *
+ * _Objects_Free
+ *
+ */
+
+#define _Objects_Free( _information, _the_object ) \
+ _Chain_Append( &(_information)->Inactive, &(_the_object)->Node )
+
+/*PAGE
+ *
+ * _Objects_Open
+ *
+ */
+
+#define _Objects_Open( _information, _the_object, _name ) \
+ { \
+ unsigned32 _index; \
+ \
+ _index = _Objects_Get_index( (_the_object)->id ); \
+ (_information)->local_table[ _index ] = (_the_object); \
+ \
+ if ( (_information)->is_string ) \
+ _Objects_Copy_name_string( (_name), (_the_object)->name ); \
+ else \
+ _Objects_Copy_name_raw( \
+ (_name), (_the_object)->name, (_information)->name_length ); \
+ }
+
+/*PAGE
+ *
+ * _Objects_Close
+ *
+ */
+
+#define _Objects_Close( _information, _the_object ) \
+ { \
+ unsigned32 _index; \
+ \
+ _index = _Objects_Get_index( (_the_object)->id ); \
+ (_information)->local_table[ _index ] = NULL; \
+ _Objects_Clear_name( (_the_object)->name, (_information)->name_length ); \
+ }
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/objectmp.inl b/c/src/exec/score/macros/rtems/score/objectmp.inl
new file mode 100644
index 0000000000..2b499e70e5
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/objectmp.inl
@@ -0,0 +1,50 @@
+/* macros/objectmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * which deal with global objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_OBJECTS_inl
+#define __MACROS_MP_OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_global_object
+ *
+ */
+
+#define _Objects_MP_Allocate_global_object() \
+ (Objects_MP_Control *) \
+ _Chain_Get( &_Objects_MP_Inactive_global_objects )
+
+/*PAGE
+ * _Objects_MP_Free_global_object
+ *
+ */
+
+#define _Objects_MP_Free_global_object( _the_object ) \
+ _Chain_Append( \
+ &_Objects_MP_Inactive_global_objects, \
+ &(_the_object)->Object.Node \
+ )
+
+/*PAGE
+ * _Objects_MP_Is_null_global_object
+ *
+ */
+
+#define _Objects_MP_Is_null_global_object( _the_object ) \
+ ( (_the_object) == NULL )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/priority.inl b/c/src/exec/score/macros/rtems/score/priority.inl
new file mode 100644
index 0000000000..e18567ba8c
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/priority.inl
@@ -0,0 +1,170 @@
+/* priority.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Priority Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_inl
+#define __PRIORITY_inl
+
+#include <rtems/score/bitfield.h>
+
+/*PAGE
+ *
+ * _Priority_Handler_initialization
+ *
+ */
+
+#define _Priority_Handler_initialization() \
+ { \
+ unsigned32 index; \
+ \
+ _Priority_Major_bit_map = 0; \
+ for ( index=0 ; index <16 ; index++ ) \
+ _Priority_Bit_map[ index ] = 0; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Is_valid
+ *
+ */
+
+ /*
+ * 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) <= PRIORITY_MAXIMUM )
+
+/*PAGE
+ *
+ * _Priority_Major
+ *
+ */
+
+#define _Priority_Major( _the_priority ) ( (_the_priority) / 16 )
+
+/*PAGE
+ *
+ * _Priority_Minor
+ *
+ */
+
+#define _Priority_Minor( _the_priority ) ( (_the_priority) % 16 )
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
+
+/*PAGE
+ *
+ * _Priority_Mask
+ *
+ */
+
+#define _Priority_Mask( _bit_number ) \
+ (0x8000 >> _bit_number)
+
+/*PAGE
+ *
+ * _Priority_Bits_index
+ *
+ */
+
+#define _Priority_Bits_index( _bit_number ) \
+ (_bit_number)
+
+#endif
+
+/*PAGE
+ *
+ * _Priority_Add_to_bit_map
+ *
+ */
+
+#define _Priority_Add_to_bit_map( _the_priority_map ) \
+ { \
+ *(_the_priority_map)->minor |= (_the_priority_map)->ready_minor; \
+ _Priority_Major_bit_map |= (_the_priority_map)->ready_major; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Remove_from_bit_map
+ *
+ */
+
+#define _Priority_Remove_from_bit_map( _the_priority_map ) \
+ { \
+ *(_the_priority_map)->minor &= (_the_priority_map)->block_minor; \
+ if ( *(_the_priority_map)->minor == 0 ) \
+ _Priority_Major_bit_map &= (_the_priority_map)->block_major; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Get_highest
+ *
+ */
+
+#define _Priority_Get_highest( _high_priority ) \
+ { \
+ Priority_Bit_map_control minor; \
+ Priority_Bit_map_control major; \
+ \
+ _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); \
+ _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); \
+ \
+ (_high_priority) = (_Priority_Bits_index( major ) * 16) + \
+ _Priority_Bits_index( minor ); \
+ }
+
+/*PAGE
+ *
+ * _Priority_Initialize_information
+ *
+ */
+
+#define _Priority_Initialize_information( \
+ _the_priority_map, _new_priority ) \
+ { \
+ Priority_Bit_map_control _major; \
+ Priority_Bit_map_control _minor; \
+ Priority_Bit_map_control _mask; \
+ \
+ _major = _Priority_Major( (_new_priority) ); \
+ _minor = _Priority_Minor( (_new_priority) ); \
+ \
+ (_the_priority_map)->minor = \
+ &_Priority_Bit_map[ _Priority_Bits_index(_major) ]; \
+ \
+ _mask = _Priority_Mask( _major ); \
+ (_the_priority_map)->ready_major = _mask; \
+ (_the_priority_map)->block_major = ~_mask; \
+ \
+ _mask = _Priority_Mask( _minor ); \
+ (_the_priority_map)->ready_minor = _mask; \
+ (_the_priority_map)->block_minor = ~_mask; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Is_group_empty
+ *
+ */
+
+#define _Priority_Is_group_empty ( _the_priority ) \
+ ( (_the_priority) == 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/stack.inl b/c/src/exec/score/macros/rtems/score/stack.inl
new file mode 100644
index 0000000000..31ad922bd3
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/stack.inl
@@ -0,0 +1,50 @@
+/* stack.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Stack Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_inl
+#define __STACK_inl
+
+/*PAGE
+ *
+ * _Stack_Initialize
+ *
+ */
+
+#define _Stack_Initialize( _the_stack, _starting_address, _size ) \
+ { \
+ (_the_stack)->area = (_starting_address); \
+ (_the_stack)->size = (_size); \
+ }
+
+/*PAGE
+ *
+ * _Stack_Is_enough
+ *
+ */
+
+#define _Stack_Is_enough( _size ) \
+ ( (_size) >= STACK_MINIMUM_SIZE )
+
+/*PAGE
+ *
+ * _Stack_Adjust_size
+ */
+
+#define _Stack_Adjust_size( _size ) \
+ ((_size) + CPU_STACK_ALIGNMENT)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/states.inl b/c/src/exec/score/macros/rtems/score/states.inl
new file mode 100644
index 0000000000..993f6841ea
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/states.inl
@@ -0,0 +1,210 @@
+/* states.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines associated with thread state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STATES_inl
+#define __STATES_inl
+
+/*PAGE
+ *
+ * _States_Set
+ *
+ */
+
+#define _States_Set( _states_to_set, _current_state ) \
+ ((_current_state) | (_states_to_set))
+
+/*PAGE
+ *
+ * _States_Clear
+ *
+ */
+
+#define _States_Clear( _states_to_clear, _current_state ) \
+ ((_current_state) & ~(_states_to_clear))
+
+/*PAGE
+ *
+ * _States_Is_ready
+ *
+ */
+
+#define _States_Is_ready( _the_states ) \
+ ( (_the_states) == STATES_READY )
+
+/*PAGE
+ *
+ * _States_Is_only_dormant
+ *
+ */
+
+#define _States_Is_only_dormant( _the_states ) \
+ ( (_the_states) == STATES_DORMANT )
+
+/*PAGE
+ *
+ * _States_Is_dormant
+ *
+ */
+
+#define _States_Is_dormant( _the_states ) \
+ ( (_the_states) & STATES_DORMANT )
+
+/*PAGE
+ *
+ * _States_Is_suspended
+ *
+ */
+
+#define _States_Is_suspended( _the_states ) \
+ ( (_the_states) & STATES_SUSPENDED )
+
+/*PAGE
+ *
+ * _States_Is_Transient
+ *
+ */
+
+#define _States_Is_transient( _the_states ) \
+ ( (_the_states) & STATES_TRANSIENT )
+
+/*PAGE
+ *
+ * _States_Is_delaying
+ *
+ */
+
+#define _States_Is_delaying( _the_states ) \
+ ( (_the_states) & STATES_DELAYING )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_buffer
+ *
+ */
+
+#define _States_Is_waiting_for_buffer( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_BUFFER )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_segment
+ *
+ */
+
+#define _States_Is_waiting_for_segment( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_SEGMENT )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_message
+ *
+ */
+
+#define _States_Is_waiting_for_message( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_MESSAGE )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_event
+ *
+ */
+
+#define _States_Is_waiting_for_event( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_EVENT )
+
+/*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
+ *
+ */
+
+#define _States_Is_waiting_for_semaphore( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_SEMAPHORE )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_time
+ *
+ */
+
+#define _States_Is_waiting_for_time( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_TIME )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_rpc_reply
+ *
+ */
+
+#define _States_Is_waiting_for_rpc_reply( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_RPC_REPLY )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_period
+ *
+ */
+
+#define _States_Is_waiting_for_period( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_PERIOD )
+
+/*PAGE
+ *
+ * _States_Is_locally_blocked
+ *
+ */
+
+#define _States_Is_locally_blocked( _the_states ) \
+ ( (_the_states) & STATES_LOCALLY_BLOCKED )
+
+/*PAGE
+ *
+ * _States_Is_waiting_on_thread_queue
+ *
+ */
+
+#define _States_Is_waiting_on_thread_queue( _the_states ) \
+ ( (_the_states) & STATES_WAITING_ON_THREAD_QUEUE )
+
+/*PAGE
+ *
+ * _States_Is_blocked
+ *
+ */
+
+#define _States_Is_blocked( _the_states ) \
+ ( (_the_states) & STATES_BLOCKED )
+
+/*PAGE
+ *
+ * _States_Are_set
+ *
+ */
+
+#define _States_Are_set( _the_states, _mask ) \
+ ( ((_the_states) & (_mask)) != STATES_READY )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/sysstate.inl b/c/src/exec/score/macros/rtems/score/sysstate.inl
new file mode 100644
index 0000000000..8d5e02a1e3
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/sysstate.inl
@@ -0,0 +1,90 @@
+/* sysstates.inl
+ *
+ * This file contains the macro implementation of routines regarding the
+ * system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SYSTEM_STATE_inl
+#define __SYSTEM_STATE_inl
+
+/*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 ) \
+ do { \
+ _System_state_Current = (_state); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _System_state_Get
+ */
+
+#define _System_state_Get() \
+ (_System_state_Current)
+
+/*PAGE
+ *
+ * _System_state_Is_before_initialization
+ */
+
+#define _System_state_Is_before_initialization( _state ) \
+ ((_state) == SYSTEM_STATE_BEFORE_INITIALIZATION)
+
+/*PAGE
+ *
+ * _System_state_Is_before_multitasking
+ */
+
+#define _System_state_Is_before_multitasking( _state ) \
+ ((_state) == SYSTEM_STATE_BEFORE_MULTITASKING)
+
+/*PAGE
+ *
+ * _System_state_Is_begin_multitasking
+ */
+
+#define _System_state_Is_begin_multitasking( _state ) \
+ ((_state) == SYSTEM_STATE_BEGIN_MULTITASKING)
+
+/*PAGE
+ *
+ * _System_state_Is_up
+ */
+
+#define _System_state_Is_up( _state ) \
+ ((_state) == SYSTEM_STATE_UP)
+
+/*PAGE
+ *
+ * _System_state_Is_failed
+ */
+
+#define _System_state_Is_failed( _state ) \
+ ((_state) == SYSTEM_STATE_FAILED)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/thread.inl b/c/src/exec/score/macros/rtems/score/thread.inl
new file mode 100644
index 0000000000..c792941026
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/thread.inl
@@ -0,0 +1,217 @@
+/* thread.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Thread handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_inl
+#define __THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_Stop_multitasking
+ *
+ */
+
+#define _Thread_Stop_multitasking() \
+ _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context );
+
+/*PAGE
+ *
+ * _Thread_Is_executing
+ *
+ */
+
+#define _Thread_Is_executing( _the_thread ) \
+ ( (_the_thread) == _Thread_Executing )
+
+/*PAGE
+ *
+ * _Thread_Is_heir
+ *
+ */
+
+#define _Thread_Is_heir( _the_thread ) \
+ ( (_the_thread) == _Thread_Heir )
+
+/*PAGE
+ *
+ * _Thread_Is_executing_also_the_heir
+ *
+ */
+
+#define _Thread_Is_executing_also_the_heir() \
+ ( _Thread_Executing == _Thread_Heir )
+
+/*PAGE
+ *
+ * _Thread_Resume
+ *
+ */
+
+#define _Thread_Resume( _the_thread ) \
+ _Thread_Clear_state( (_the_thread), STATES_SUSPENDED )
+
+/*PAGE
+ *
+ * _Thread_Unblock
+ *
+ */
+
+#define _Thread_Unblock( _the_thread ) \
+ _Thread_Clear_state( (_the_thread), STATES_BLOCKED );
+
+/*PAGE
+ *
+ * _Thread_Restart_self
+ *
+ */
+
+#define _Thread_Restart_self() \
+ { \
+ if ( _Thread_Executing->fp_context != NULL ) \
+ _Context_Restore_fp( &_Thread_Executing->fp_context ); \
+ \
+ _CPU_Context_Restart_self( &_Thread_Executing->Registers ); \
+ }
+
+/*PAGE
+ *
+ * _Thread_Calculate_heir
+ *
+ */
+
+#define _Thread_Calculate_heir() \
+ { \
+ Priority_Control highest; \
+ \
+ _Priority_Get_highest( highest ); \
+ \
+ _Thread_Heir = (Thread_Control *) _Thread_Ready_chain[ highest ].first; \
+ }
+
+/*PAGE
+ *
+ * _Thread_Is_allocated_fp
+ *
+ */
+
+#define _Thread_Is_allocated_fp( _the_thread ) \
+ ( (_the_thread) == _Thread_Allocated_fp )
+
+/*PAGE
+ *
+ * _Thread_Deallocate_fp
+ *
+ */
+
+#define _Thread_Deallocate_fp() \
+ _Thread_Allocated_fp = NULL
+
+/*PAGE
+ *
+ * _Thread_Disable_dispatch
+ *
+ */
+
+#define _Thread_Disable_dispatch() \
+ _Thread_Dispatch_disable_level += 1
+
+/*PAGE
+ *
+ * _Thread_Enable_dispatch
+ *
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == TRUE )
+#define _Thread_Enable_dispatch() \
+ { if ( (--_Thread_Dispatch_disable_level) == 0 ) \
+ _Thread_Dispatch(); \
+ }
+#endif
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void );
+#endif
+
+/*PAGE
+ *
+ * _Thread_Unnest_dispatch
+ *
+ */
+
+#define _Thread_Unnest_dispatch() \
+ _Thread_Dispatch_disable_level -= 1
+
+/*PAGE
+ *
+ * _Thread_Is_dispatching_enabled
+ *
+ */
+
+#define _Thread_Is_dispatching_enabled() \
+ ( _Thread_Dispatch_disable_level == 0 )
+
+/*PAGE
+ *
+ * _Thread_Is_context_switch_necessary
+ *
+ */
+
+#define _Thread_Is_context_switch_necessary() \
+ ( _Context_Switch_necessary == TRUE )
+
+/*PAGE
+ *
+ * _Thread_Dispatch_initialization
+ *
+ */
+
+#define _Thread_Dispatch_initialization() \
+ _Thread_Dispatch_disable_level = 1
+
+/*PAGE
+ *
+ * _Thread_Is_null
+ *
+ */
+
+#define _Thread_Is_null( _the_thread ) \
+ ( (_the_thread) == NULL )
+
+/*
+ * _Thread_Is_proxy_blocking
+ *
+ */
+
+#define _Thread_Is_proxy_blocking( _code ) \
+ ( (_code) == THREAD_STATUS_PROXY_BLOCKING )
+
+/*
+ * _Thread_Internal_allocate
+ *
+ */
+
+#define _Thread_Internal_allocate() \
+ ((Thread_Control *) _Objects_Allocate( &_Thread_Internal_information ))
+
+/*
+ * _Thread_Internal_free
+ *
+ */
+
+#define _Thread_Internal_free( _the_task ) \
+ _Objects_Free( &_Thread_Internal_information, &(_the_task)->Object )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/threadmp.inl b/c/src/exec/score/macros/rtems/score/threadmp.inl
new file mode 100644
index 0000000000..89f5deeaba
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/threadmp.inl
@@ -0,0 +1,50 @@
+/* macros/threadmp.h
+ *
+ * This include file contains the bodies of all inlined routines
+ * for the multiprocessing part of thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_THREAD_h
+#define __MACROS_MP_THREAD_h
+
+/*PAGE
+ *
+ * _Thread_MP_Is_receive
+ *
+ */
+
+#define _Thread_MP_Is_receive( _the_thread ) \
+ ( (_the_thread) == _Thread_MP_Receive)
+
+/*PAGE
+ *
+ * _Thread_MP_Free_proxy
+ *
+ */
+
+#define _Thread_MP_Free_proxy( _the_thread ) \
+{ \
+ Thread_Proxy_control *_the_proxy; \
+ \
+ _the_proxy = (Thread_Proxy_control *) (_the_thread); \
+ \
+ _Chain_Extract( &_the_proxy->Active ); \
+ \
+ _Chain_Append( \
+ &_Thread_MP_Inactive_proxies, \
+ &(_the_thread)->Object.Node \
+ ); \
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/tod.inl b/c/src/exec/score/macros/rtems/score/tod.inl
new file mode 100644
index 0000000000..65a4de5017
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/tod.inl
@@ -0,0 +1,49 @@
+/* tod.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_inl
+#define __TIME_OF_DAY_inl
+
+/*PAGE
+ *
+ * _TOD_Tickle_ticks
+ *
+ */
+
+#define _TOD_Tickle_ticks() \
+ _TOD_Current.ticks++; \
+ _Watchdog_Ticks_since_boot++
+
+/*PAGE
+ *
+ * _TOD_Deactivate
+ *
+ */
+
+#define _TOD_Deactivate() \
+ _Watchdog_Remove( &_TOD_Seconds_watchdog )
+
+/*PAGE
+ *
+ * _TOD_Activate
+ *
+ */
+
+#define _TOD_Activate( _ticks ) \
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, (_ticks) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/tqdata.inl b/c/src/exec/score/macros/rtems/score/tqdata.inl
new file mode 100644
index 0000000000..0431840846
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/tqdata.inl
@@ -0,0 +1,50 @@
+/* tqdata.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines needed to support the Thread Queue Data.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_inl
+#define __THREAD_QUEUE_DATA_inl
+
+/*PAGE
+ *
+ * _Thread_queue_Header_number
+ *
+ */
+
+#define _Thread_queue_Header_number( _the_priority ) \
+ ((_the_priority) / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER)
+
+/*PAGE
+ *
+ * _Thread_queue_Is_reverse_search
+ *
+ */
+
+#define _Thread_queue_Is_reverse_search( _the_priority ) \
+ ( (_the_priority) & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK )
+
+/*PAGE
+ *
+ * _Thread_queue_Enter_critical_section
+ *
+ */
+
+#define _Thread_queue_Enter_critical_section( _the_thread_queue ) \
+ do { \
+ (_the_thread_queue)->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/userext.inl b/c/src/exec/score/macros/rtems/score/userext.inl
new file mode 100644
index 0000000000..6d69edb096
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/userext.inl
@@ -0,0 +1,126 @@
+/* userext.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the User Extension Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_inl
+#define __USER_EXTENSIONS_inl
+
+/*PAGE
+ *
+ * _User_extensions_Handler_initialization
+ *
+ */
+
+#define _User_extensions_Handler_initialization( _initial_extensions ) \
+ { \
+ _Chain_Initialize_empty( &_User_extensions_List ); \
+ \
+ if ( (_initial_extensions) ) { \
+ _User_extensions_Initial.Callouts = *(_initial_extensions); \
+ _Chain_Append( \
+ &_User_extensions_List, &_User_extensions_Initial.Node ); \
+ } \
+ }
+
+/*PAGE
+ *
+ * _User_extensions_Add_set
+ */
+
+#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
+ *
+ * _User_extensions_Remove_set
+ */
+
+#define _User_extensions_Remove_set( _the_extension ) \
+ _Chain_Extract( &(_the_extension)->Node )
+
+/*PAGE
+ *
+ * _User_extensions_Run_list_forward
+ *
+ * NOTE: No parentheses around macro names here to avoid
+ * messing up the name and function call expansion.
+ */
+
+#define _User_extensions_Run_list_forward( _name, _arguments ) \
+ do { \
+ 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.## _name != NULL ) \
+ (*the_extension->Callouts.## _name) _arguments; \
+ \
+ } \
+ \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _User_extensions_Run_list_backward
+ *
+ * NOTE: No parentheses around macro names here to avoid
+ * messing up the name and function call expansion.
+ */
+
+#define _User_extensions_Run_list_backward( _name, _arguments ) \
+ do { \
+ 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.## _name != NULL ) \
+ (*the_extension->Callouts.## _name) _arguments; \
+ \
+ } \
+ \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _User_extensions_Thread_switch
+ *
+ */
+
+#define _User_extensions_Thread_switch( _executing, _heir ) \
+ _User_extensions_Run_list_forward(thread_switch, (_executing, _heir) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/watchdog.inl b/c/src/exec/score/macros/rtems/score/watchdog.inl
new file mode 100644
index 0000000000..5c75565080
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/watchdog.inl
@@ -0,0 +1,172 @@
+/* watchdog.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Watchdog Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_inl
+#define __WATCHDOG_inl
+
+#include <rtems/score/object.h>
+
+/*PAGE
+ *
+ * _Watchdog_Initialize
+ *
+ */
+
+#define _Watchdog_Initialize( _the_watchdog, _routine, _id, _user_data ) \
+ { \
+ (_the_watchdog)->state = WATCHDOG_INACTIVE; \
+ (_the_watchdog)->routine = (_routine); \
+ (_the_watchdog)->id = (_id); \
+ (_the_watchdog)->user_data = (_user_data); \
+ }
+
+/*PAGE
+ *
+ * _Watchdog_Is_active
+ *
+ */
+
+#define _Watchdog_Is_active( _the_watchdog ) \
+ ( (_the_watchdog)->state == WATCHDOG_ACTIVE )
+
+/*PAGE
+ *
+ * _Watchdog_Activate
+ *
+ */
+
+#define _Watchdog_Activate( _the_watchdog ) \
+ (_the_watchdog)->state = WATCHDOG_ACTIVE
+
+/*PAGE
+ *
+ * _Watchdog_Deactivate
+ *
+ */
+
+#define _Watchdog_Deactivate( _the_watchdog ) \
+ (_the_watchdog)->state = WATCHDOG_REMOVE_IT
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_ticks
+ *
+ */
+
+#define _Watchdog_Tickle_ticks() \
+ _Watchdog_Tickle( &_Watchdog_Ticks_chain )
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_seconds
+ *
+ */
+
+#define _Watchdog_Tickle_seconds() \
+ _Watchdog_Tickle( &_Watchdog_Seconds_chain )
+
+/*PAGE
+ *
+ * _Watchdog_Insert_ticks
+ *
+ */
+
+#define _Watchdog_Insert_ticks( _the_watchdog, _units ) \
+ do { \
+ (_the_watchdog)->initial = (_units); \
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, (_the_watchdog) ); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _Watchdog_Insert_seconds
+ *
+ */
+
+#define _Watchdog_Insert_seconds( _the_watchdog, _units ) \
+ do { \
+ (_the_watchdog)->initial = (_units); \
+ _Watchdog_Insert( &_Watchdog_Seconds_chain, (_the_watchdog) ); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_seconds
+ *
+ */
+
+#define _Watchdog_Adjust_seconds( _direction, _units ) \
+ _Watchdog_Adjust( &_Watchdog_Seconds_chain, (_direction), (_units) )
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_ticks
+ *
+ */
+
+#define _Watchdog_Adjust_ticks( _direction, _units ) \
+ _Watchdog_Adjust( &_Watchdog_Ticks_chain, (_direction), (_units) )
+
+/*PAGE
+ *
+ * _Watchdog_Reset
+ *
+ */
+
+#define _Watchdog_Reset( _the_watchdog ) \
+ { \
+ (void) _Watchdog_Remove( (_the_watchdog) ); \
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, (_the_watchdog) ); \
+ }
+
+/*PAGE
+ *
+ * _Watchdog_Next
+ *
+ */
+
+#define _Watchdog_Next( _watchdog ) \
+ ((Watchdog_Control *) (_watchdog)->Node.next)
+
+/*PAGE
+ *
+ * _Watchdog_Previous
+ *
+ */
+
+#define _Watchdog_Previous( _watchdog ) \
+ ((Watchdog_Control *) (_watchdog)->Node.previous)
+
+/*PAGE
+ *
+ * _Watchdog_First
+ *
+ */
+
+#define _Watchdog_First( _header ) \
+ ((Watchdog_Control *) (_header)->first)
+
+/*PAGE
+ *
+ * _Watchdog_Last
+ *
+ */
+
+#define _Watchdog_Last( _header ) \
+ ((Watchdog_Control *) (_header)->last)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/rtems/score/wkspace.inl b/c/src/exec/score/macros/rtems/score/wkspace.inl
new file mode 100644
index 0000000000..c47993f752
--- /dev/null
+++ b/c/src/exec/score/macros/rtems/score/wkspace.inl
@@ -0,0 +1,39 @@
+/* wkspace.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the RAM Workspace Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_inl
+#define __WORKSPACE_inl
+
+/*PAGE
+ *
+ * _Workspace_Allocate
+ *
+ */
+
+#define _Workspace_Allocate( _size ) \
+ _Heap_Allocate( &_Workspace_Area, (_size) )
+
+/*PAGE
+ *
+ * _Workspace_Free
+ *
+ */
+
+#define _Workspace_Free( _block ) \
+ _Heap_Free( &_Workspace_Area, (_block) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/stack.inl b/c/src/exec/score/macros/stack.inl
new file mode 100644
index 0000000000..31ad922bd3
--- /dev/null
+++ b/c/src/exec/score/macros/stack.inl
@@ -0,0 +1,50 @@
+/* stack.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Stack Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_inl
+#define __STACK_inl
+
+/*PAGE
+ *
+ * _Stack_Initialize
+ *
+ */
+
+#define _Stack_Initialize( _the_stack, _starting_address, _size ) \
+ { \
+ (_the_stack)->area = (_starting_address); \
+ (_the_stack)->size = (_size); \
+ }
+
+/*PAGE
+ *
+ * _Stack_Is_enough
+ *
+ */
+
+#define _Stack_Is_enough( _size ) \
+ ( (_size) >= STACK_MINIMUM_SIZE )
+
+/*PAGE
+ *
+ * _Stack_Adjust_size
+ */
+
+#define _Stack_Adjust_size( _size ) \
+ ((_size) + CPU_STACK_ALIGNMENT)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/states.inl b/c/src/exec/score/macros/states.inl
new file mode 100644
index 0000000000..993f6841ea
--- /dev/null
+++ b/c/src/exec/score/macros/states.inl
@@ -0,0 +1,210 @@
+/* states.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines associated with thread state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STATES_inl
+#define __STATES_inl
+
+/*PAGE
+ *
+ * _States_Set
+ *
+ */
+
+#define _States_Set( _states_to_set, _current_state ) \
+ ((_current_state) | (_states_to_set))
+
+/*PAGE
+ *
+ * _States_Clear
+ *
+ */
+
+#define _States_Clear( _states_to_clear, _current_state ) \
+ ((_current_state) & ~(_states_to_clear))
+
+/*PAGE
+ *
+ * _States_Is_ready
+ *
+ */
+
+#define _States_Is_ready( _the_states ) \
+ ( (_the_states) == STATES_READY )
+
+/*PAGE
+ *
+ * _States_Is_only_dormant
+ *
+ */
+
+#define _States_Is_only_dormant( _the_states ) \
+ ( (_the_states) == STATES_DORMANT )
+
+/*PAGE
+ *
+ * _States_Is_dormant
+ *
+ */
+
+#define _States_Is_dormant( _the_states ) \
+ ( (_the_states) & STATES_DORMANT )
+
+/*PAGE
+ *
+ * _States_Is_suspended
+ *
+ */
+
+#define _States_Is_suspended( _the_states ) \
+ ( (_the_states) & STATES_SUSPENDED )
+
+/*PAGE
+ *
+ * _States_Is_Transient
+ *
+ */
+
+#define _States_Is_transient( _the_states ) \
+ ( (_the_states) & STATES_TRANSIENT )
+
+/*PAGE
+ *
+ * _States_Is_delaying
+ *
+ */
+
+#define _States_Is_delaying( _the_states ) \
+ ( (_the_states) & STATES_DELAYING )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_buffer
+ *
+ */
+
+#define _States_Is_waiting_for_buffer( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_BUFFER )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_segment
+ *
+ */
+
+#define _States_Is_waiting_for_segment( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_SEGMENT )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_message
+ *
+ */
+
+#define _States_Is_waiting_for_message( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_MESSAGE )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_event
+ *
+ */
+
+#define _States_Is_waiting_for_event( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_EVENT )
+
+/*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
+ *
+ */
+
+#define _States_Is_waiting_for_semaphore( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_SEMAPHORE )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_time
+ *
+ */
+
+#define _States_Is_waiting_for_time( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_TIME )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_rpc_reply
+ *
+ */
+
+#define _States_Is_waiting_for_rpc_reply( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_RPC_REPLY )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_period
+ *
+ */
+
+#define _States_Is_waiting_for_period( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_PERIOD )
+
+/*PAGE
+ *
+ * _States_Is_locally_blocked
+ *
+ */
+
+#define _States_Is_locally_blocked( _the_states ) \
+ ( (_the_states) & STATES_LOCALLY_BLOCKED )
+
+/*PAGE
+ *
+ * _States_Is_waiting_on_thread_queue
+ *
+ */
+
+#define _States_Is_waiting_on_thread_queue( _the_states ) \
+ ( (_the_states) & STATES_WAITING_ON_THREAD_QUEUE )
+
+/*PAGE
+ *
+ * _States_Is_blocked
+ *
+ */
+
+#define _States_Is_blocked( _the_states ) \
+ ( (_the_states) & STATES_BLOCKED )
+
+/*PAGE
+ *
+ * _States_Are_set
+ *
+ */
+
+#define _States_Are_set( _the_states, _mask ) \
+ ( ((_the_states) & (_mask)) != STATES_READY )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/sysstate.inl b/c/src/exec/score/macros/sysstate.inl
new file mode 100644
index 0000000000..8d5e02a1e3
--- /dev/null
+++ b/c/src/exec/score/macros/sysstate.inl
@@ -0,0 +1,90 @@
+/* sysstates.inl
+ *
+ * This file contains the macro implementation of routines regarding the
+ * system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SYSTEM_STATE_inl
+#define __SYSTEM_STATE_inl
+
+/*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 ) \
+ do { \
+ _System_state_Current = (_state); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _System_state_Get
+ */
+
+#define _System_state_Get() \
+ (_System_state_Current)
+
+/*PAGE
+ *
+ * _System_state_Is_before_initialization
+ */
+
+#define _System_state_Is_before_initialization( _state ) \
+ ((_state) == SYSTEM_STATE_BEFORE_INITIALIZATION)
+
+/*PAGE
+ *
+ * _System_state_Is_before_multitasking
+ */
+
+#define _System_state_Is_before_multitasking( _state ) \
+ ((_state) == SYSTEM_STATE_BEFORE_MULTITASKING)
+
+/*PAGE
+ *
+ * _System_state_Is_begin_multitasking
+ */
+
+#define _System_state_Is_begin_multitasking( _state ) \
+ ((_state) == SYSTEM_STATE_BEGIN_MULTITASKING)
+
+/*PAGE
+ *
+ * _System_state_Is_up
+ */
+
+#define _System_state_Is_up( _state ) \
+ ((_state) == SYSTEM_STATE_UP)
+
+/*PAGE
+ *
+ * _System_state_Is_failed
+ */
+
+#define _System_state_Is_failed( _state ) \
+ ((_state) == SYSTEM_STATE_FAILED)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/thread.inl b/c/src/exec/score/macros/thread.inl
new file mode 100644
index 0000000000..c792941026
--- /dev/null
+++ b/c/src/exec/score/macros/thread.inl
@@ -0,0 +1,217 @@
+/* thread.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Thread handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_inl
+#define __THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_Stop_multitasking
+ *
+ */
+
+#define _Thread_Stop_multitasking() \
+ _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context );
+
+/*PAGE
+ *
+ * _Thread_Is_executing
+ *
+ */
+
+#define _Thread_Is_executing( _the_thread ) \
+ ( (_the_thread) == _Thread_Executing )
+
+/*PAGE
+ *
+ * _Thread_Is_heir
+ *
+ */
+
+#define _Thread_Is_heir( _the_thread ) \
+ ( (_the_thread) == _Thread_Heir )
+
+/*PAGE
+ *
+ * _Thread_Is_executing_also_the_heir
+ *
+ */
+
+#define _Thread_Is_executing_also_the_heir() \
+ ( _Thread_Executing == _Thread_Heir )
+
+/*PAGE
+ *
+ * _Thread_Resume
+ *
+ */
+
+#define _Thread_Resume( _the_thread ) \
+ _Thread_Clear_state( (_the_thread), STATES_SUSPENDED )
+
+/*PAGE
+ *
+ * _Thread_Unblock
+ *
+ */
+
+#define _Thread_Unblock( _the_thread ) \
+ _Thread_Clear_state( (_the_thread), STATES_BLOCKED );
+
+/*PAGE
+ *
+ * _Thread_Restart_self
+ *
+ */
+
+#define _Thread_Restart_self() \
+ { \
+ if ( _Thread_Executing->fp_context != NULL ) \
+ _Context_Restore_fp( &_Thread_Executing->fp_context ); \
+ \
+ _CPU_Context_Restart_self( &_Thread_Executing->Registers ); \
+ }
+
+/*PAGE
+ *
+ * _Thread_Calculate_heir
+ *
+ */
+
+#define _Thread_Calculate_heir() \
+ { \
+ Priority_Control highest; \
+ \
+ _Priority_Get_highest( highest ); \
+ \
+ _Thread_Heir = (Thread_Control *) _Thread_Ready_chain[ highest ].first; \
+ }
+
+/*PAGE
+ *
+ * _Thread_Is_allocated_fp
+ *
+ */
+
+#define _Thread_Is_allocated_fp( _the_thread ) \
+ ( (_the_thread) == _Thread_Allocated_fp )
+
+/*PAGE
+ *
+ * _Thread_Deallocate_fp
+ *
+ */
+
+#define _Thread_Deallocate_fp() \
+ _Thread_Allocated_fp = NULL
+
+/*PAGE
+ *
+ * _Thread_Disable_dispatch
+ *
+ */
+
+#define _Thread_Disable_dispatch() \
+ _Thread_Dispatch_disable_level += 1
+
+/*PAGE
+ *
+ * _Thread_Enable_dispatch
+ *
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == TRUE )
+#define _Thread_Enable_dispatch() \
+ { if ( (--_Thread_Dispatch_disable_level) == 0 ) \
+ _Thread_Dispatch(); \
+ }
+#endif
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void );
+#endif
+
+/*PAGE
+ *
+ * _Thread_Unnest_dispatch
+ *
+ */
+
+#define _Thread_Unnest_dispatch() \
+ _Thread_Dispatch_disable_level -= 1
+
+/*PAGE
+ *
+ * _Thread_Is_dispatching_enabled
+ *
+ */
+
+#define _Thread_Is_dispatching_enabled() \
+ ( _Thread_Dispatch_disable_level == 0 )
+
+/*PAGE
+ *
+ * _Thread_Is_context_switch_necessary
+ *
+ */
+
+#define _Thread_Is_context_switch_necessary() \
+ ( _Context_Switch_necessary == TRUE )
+
+/*PAGE
+ *
+ * _Thread_Dispatch_initialization
+ *
+ */
+
+#define _Thread_Dispatch_initialization() \
+ _Thread_Dispatch_disable_level = 1
+
+/*PAGE
+ *
+ * _Thread_Is_null
+ *
+ */
+
+#define _Thread_Is_null( _the_thread ) \
+ ( (_the_thread) == NULL )
+
+/*
+ * _Thread_Is_proxy_blocking
+ *
+ */
+
+#define _Thread_Is_proxy_blocking( _code ) \
+ ( (_code) == THREAD_STATUS_PROXY_BLOCKING )
+
+/*
+ * _Thread_Internal_allocate
+ *
+ */
+
+#define _Thread_Internal_allocate() \
+ ((Thread_Control *) _Objects_Allocate( &_Thread_Internal_information ))
+
+/*
+ * _Thread_Internal_free
+ *
+ */
+
+#define _Thread_Internal_free( _the_task ) \
+ _Objects_Free( &_Thread_Internal_information, &(_the_task)->Object )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/threadmp.inl b/c/src/exec/score/macros/threadmp.inl
new file mode 100644
index 0000000000..89f5deeaba
--- /dev/null
+++ b/c/src/exec/score/macros/threadmp.inl
@@ -0,0 +1,50 @@
+/* macros/threadmp.h
+ *
+ * This include file contains the bodies of all inlined routines
+ * for the multiprocessing part of thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_THREAD_h
+#define __MACROS_MP_THREAD_h
+
+/*PAGE
+ *
+ * _Thread_MP_Is_receive
+ *
+ */
+
+#define _Thread_MP_Is_receive( _the_thread ) \
+ ( (_the_thread) == _Thread_MP_Receive)
+
+/*PAGE
+ *
+ * _Thread_MP_Free_proxy
+ *
+ */
+
+#define _Thread_MP_Free_proxy( _the_thread ) \
+{ \
+ Thread_Proxy_control *_the_proxy; \
+ \
+ _the_proxy = (Thread_Proxy_control *) (_the_thread); \
+ \
+ _Chain_Extract( &_the_proxy->Active ); \
+ \
+ _Chain_Append( \
+ &_Thread_MP_Inactive_proxies, \
+ &(_the_thread)->Object.Node \
+ ); \
+}
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/tod.inl b/c/src/exec/score/macros/tod.inl
new file mode 100644
index 0000000000..65a4de5017
--- /dev/null
+++ b/c/src/exec/score/macros/tod.inl
@@ -0,0 +1,49 @@
+/* tod.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_inl
+#define __TIME_OF_DAY_inl
+
+/*PAGE
+ *
+ * _TOD_Tickle_ticks
+ *
+ */
+
+#define _TOD_Tickle_ticks() \
+ _TOD_Current.ticks++; \
+ _Watchdog_Ticks_since_boot++
+
+/*PAGE
+ *
+ * _TOD_Deactivate
+ *
+ */
+
+#define _TOD_Deactivate() \
+ _Watchdog_Remove( &_TOD_Seconds_watchdog )
+
+/*PAGE
+ *
+ * _TOD_Activate
+ *
+ */
+
+#define _TOD_Activate( _ticks ) \
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, (_ticks) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/tqdata.inl b/c/src/exec/score/macros/tqdata.inl
new file mode 100644
index 0000000000..0431840846
--- /dev/null
+++ b/c/src/exec/score/macros/tqdata.inl
@@ -0,0 +1,50 @@
+/* tqdata.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines needed to support the Thread Queue Data.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_inl
+#define __THREAD_QUEUE_DATA_inl
+
+/*PAGE
+ *
+ * _Thread_queue_Header_number
+ *
+ */
+
+#define _Thread_queue_Header_number( _the_priority ) \
+ ((_the_priority) / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER)
+
+/*PAGE
+ *
+ * _Thread_queue_Is_reverse_search
+ *
+ */
+
+#define _Thread_queue_Is_reverse_search( _the_priority ) \
+ ( (_the_priority) & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK )
+
+/*PAGE
+ *
+ * _Thread_queue_Enter_critical_section
+ *
+ */
+
+#define _Thread_queue_Enter_critical_section( _the_thread_queue ) \
+ do { \
+ (_the_thread_queue)->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/userext.inl b/c/src/exec/score/macros/userext.inl
new file mode 100644
index 0000000000..6d69edb096
--- /dev/null
+++ b/c/src/exec/score/macros/userext.inl
@@ -0,0 +1,126 @@
+/* userext.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the User Extension Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_inl
+#define __USER_EXTENSIONS_inl
+
+/*PAGE
+ *
+ * _User_extensions_Handler_initialization
+ *
+ */
+
+#define _User_extensions_Handler_initialization( _initial_extensions ) \
+ { \
+ _Chain_Initialize_empty( &_User_extensions_List ); \
+ \
+ if ( (_initial_extensions) ) { \
+ _User_extensions_Initial.Callouts = *(_initial_extensions); \
+ _Chain_Append( \
+ &_User_extensions_List, &_User_extensions_Initial.Node ); \
+ } \
+ }
+
+/*PAGE
+ *
+ * _User_extensions_Add_set
+ */
+
+#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
+ *
+ * _User_extensions_Remove_set
+ */
+
+#define _User_extensions_Remove_set( _the_extension ) \
+ _Chain_Extract( &(_the_extension)->Node )
+
+/*PAGE
+ *
+ * _User_extensions_Run_list_forward
+ *
+ * NOTE: No parentheses around macro names here to avoid
+ * messing up the name and function call expansion.
+ */
+
+#define _User_extensions_Run_list_forward( _name, _arguments ) \
+ do { \
+ 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.## _name != NULL ) \
+ (*the_extension->Callouts.## _name) _arguments; \
+ \
+ } \
+ \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _User_extensions_Run_list_backward
+ *
+ * NOTE: No parentheses around macro names here to avoid
+ * messing up the name and function call expansion.
+ */
+
+#define _User_extensions_Run_list_backward( _name, _arguments ) \
+ do { \
+ 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.## _name != NULL ) \
+ (*the_extension->Callouts.## _name) _arguments; \
+ \
+ } \
+ \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _User_extensions_Thread_switch
+ *
+ */
+
+#define _User_extensions_Thread_switch( _executing, _heir ) \
+ _User_extensions_Run_list_forward(thread_switch, (_executing, _heir) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/watchdog.inl b/c/src/exec/score/macros/watchdog.inl
new file mode 100644
index 0000000000..5c75565080
--- /dev/null
+++ b/c/src/exec/score/macros/watchdog.inl
@@ -0,0 +1,172 @@
+/* watchdog.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Watchdog Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_inl
+#define __WATCHDOG_inl
+
+#include <rtems/score/object.h>
+
+/*PAGE
+ *
+ * _Watchdog_Initialize
+ *
+ */
+
+#define _Watchdog_Initialize( _the_watchdog, _routine, _id, _user_data ) \
+ { \
+ (_the_watchdog)->state = WATCHDOG_INACTIVE; \
+ (_the_watchdog)->routine = (_routine); \
+ (_the_watchdog)->id = (_id); \
+ (_the_watchdog)->user_data = (_user_data); \
+ }
+
+/*PAGE
+ *
+ * _Watchdog_Is_active
+ *
+ */
+
+#define _Watchdog_Is_active( _the_watchdog ) \
+ ( (_the_watchdog)->state == WATCHDOG_ACTIVE )
+
+/*PAGE
+ *
+ * _Watchdog_Activate
+ *
+ */
+
+#define _Watchdog_Activate( _the_watchdog ) \
+ (_the_watchdog)->state = WATCHDOG_ACTIVE
+
+/*PAGE
+ *
+ * _Watchdog_Deactivate
+ *
+ */
+
+#define _Watchdog_Deactivate( _the_watchdog ) \
+ (_the_watchdog)->state = WATCHDOG_REMOVE_IT
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_ticks
+ *
+ */
+
+#define _Watchdog_Tickle_ticks() \
+ _Watchdog_Tickle( &_Watchdog_Ticks_chain )
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_seconds
+ *
+ */
+
+#define _Watchdog_Tickle_seconds() \
+ _Watchdog_Tickle( &_Watchdog_Seconds_chain )
+
+/*PAGE
+ *
+ * _Watchdog_Insert_ticks
+ *
+ */
+
+#define _Watchdog_Insert_ticks( _the_watchdog, _units ) \
+ do { \
+ (_the_watchdog)->initial = (_units); \
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, (_the_watchdog) ); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _Watchdog_Insert_seconds
+ *
+ */
+
+#define _Watchdog_Insert_seconds( _the_watchdog, _units ) \
+ do { \
+ (_the_watchdog)->initial = (_units); \
+ _Watchdog_Insert( &_Watchdog_Seconds_chain, (_the_watchdog) ); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_seconds
+ *
+ */
+
+#define _Watchdog_Adjust_seconds( _direction, _units ) \
+ _Watchdog_Adjust( &_Watchdog_Seconds_chain, (_direction), (_units) )
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_ticks
+ *
+ */
+
+#define _Watchdog_Adjust_ticks( _direction, _units ) \
+ _Watchdog_Adjust( &_Watchdog_Ticks_chain, (_direction), (_units) )
+
+/*PAGE
+ *
+ * _Watchdog_Reset
+ *
+ */
+
+#define _Watchdog_Reset( _the_watchdog ) \
+ { \
+ (void) _Watchdog_Remove( (_the_watchdog) ); \
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, (_the_watchdog) ); \
+ }
+
+/*PAGE
+ *
+ * _Watchdog_Next
+ *
+ */
+
+#define _Watchdog_Next( _watchdog ) \
+ ((Watchdog_Control *) (_watchdog)->Node.next)
+
+/*PAGE
+ *
+ * _Watchdog_Previous
+ *
+ */
+
+#define _Watchdog_Previous( _watchdog ) \
+ ((Watchdog_Control *) (_watchdog)->Node.previous)
+
+/*PAGE
+ *
+ * _Watchdog_First
+ *
+ */
+
+#define _Watchdog_First( _header ) \
+ ((Watchdog_Control *) (_header)->first)
+
+/*PAGE
+ *
+ * _Watchdog_Last
+ *
+ */
+
+#define _Watchdog_Last( _header ) \
+ ((Watchdog_Control *) (_header)->last)
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/macros/wkspace.inl b/c/src/exec/score/macros/wkspace.inl
new file mode 100644
index 0000000000..c47993f752
--- /dev/null
+++ b/c/src/exec/score/macros/wkspace.inl
@@ -0,0 +1,39 @@
+/* wkspace.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the RAM Workspace Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_inl
+#define __WORKSPACE_inl
+
+/*PAGE
+ *
+ * _Workspace_Allocate
+ *
+ */
+
+#define _Workspace_Allocate( _size ) \
+ _Heap_Allocate( &_Workspace_Area, (_size) )
+
+/*PAGE
+ *
+ * _Workspace_Free
+ *
+ */
+
+#define _Workspace_Free( _block ) \
+ _Heap_Free( &_Workspace_Area, (_block) )
+
+#endif
+/* end of include file */
diff --git a/c/src/exec/score/src/Makefile.in b/c/src/exec/score/src/Makefile.in
new file mode 100644
index 0000000000..c9290f9a14
--- /dev/null
+++ b/c/src/exec/score/src/Makefile.in
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C and C++ source names, if any, go here -- minus the .c or .cc
+C_PIECES=apiext chain coremsg coremutex coresem heap interr \
+ isr mpci object objectmp thread threadmp threadq tod userext \
+ watchdog wkspace
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+SRCS=$(C_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) ${OBJS}
diff --git a/c/src/exec/score/src/apiext.c b/c/src/exec/score/src/apiext.c
new file mode 100644
index 0000000000..8c7c956ff9
--- /dev/null
+++ b/c/src/exec/score/src/apiext.c
@@ -0,0 +1,105 @@
+/* apiext.c
+ *
+ * XXX
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems/system.h>
+#include <rtems/score/apiext.h>
+
+/*PAGE
+ *
+ * _API_extensions_Initialization
+ */
+
+void _API_extensions_Initialization( void )
+{
+ _Chain_Initialize_empty( &_API_extensions_List );
+}
+
+/*PAGE
+ *
+ * _API_extensions_Add
+ */
+
+void _API_extensions_Add(
+ API_extensions_Control *the_extension
+)
+{
+ _Chain_Append( &_API_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _API_extensions_Run_predriver
+ */
+
+void _API_extensions_Run_predriver( void )
+{
+ Chain_Node *the_node;
+ API_extensions_Control *the_extension;
+
+ for ( the_node = _API_extensions_List.first ;
+ !_Chain_Is_tail( &_API_extensions_List, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_extension = (API_extensions_Control *) the_node;
+
+ if ( the_extension->predriver_hook )
+ (*the_extension->predriver_hook)();
+ }
+}
+
+/*PAGE
+ *
+ * _API_extensions_Run_postdriver
+ */
+
+void _API_extensions_Run_postdriver( void )
+{
+ Chain_Node *the_node;
+ API_extensions_Control *the_extension;
+
+ for ( the_node = _API_extensions_List.first ;
+ !_Chain_Is_tail( &_API_extensions_List, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_extension = (API_extensions_Control *) the_node;
+
+ if ( the_extension->postdriver_hook )
+ (*the_extension->postdriver_hook)();
+ }
+}
+
+/*PAGE
+ *
+ * _API_extensions_Run_postswitch
+ */
+
+void _API_extensions_Run_postswitch( void )
+{
+ Chain_Node *the_node;
+ API_extensions_Control *the_extension;
+
+ for ( the_node = _API_extensions_List.first ;
+ !_Chain_Is_tail( &_API_extensions_List, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_extension = (API_extensions_Control *) the_node;
+
+ if ( the_extension->postswitch_hook )
+ (*the_extension->postswitch_hook)( _Thread_Executing );
+ }
+}
+
+/* end of file */
diff --git a/c/src/exec/score/src/chain.c b/c/src/exec/score/src/chain.c
new file mode 100644
index 0000000000..747728b64d
--- /dev/null
+++ b/c/src/exec/score/src/chain.c
@@ -0,0 +1,202 @@
+/*
+ * Chain Handler
+ *
+ * NOTE:
+ *
+ * The order of this file is to allow proper compilation due to the
+ * order of inlining required by the compiler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/address.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _Chain_Initialize
+ *
+ * This kernel routine initializes a doubly linked chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ * starting_address - starting address of first node
+ * number_nodes - number of nodes in chain
+ * node_size - size of node in bytes
+ *
+ * Output parameters: NONE
+ */
+
+void _Chain_Initialize(
+ Chain_Control *the_chain,
+ void *starting_address,
+ unsigned32 number_nodes,
+ unsigned32 node_size
+)
+{
+ unsigned32 count;
+ Chain_Node *current;
+ Chain_Node *next;
+
+ count = number_nodes;
+ current = _Chain_Head( the_chain );
+ the_chain->permanent_null = NULL;
+ next = (Chain_Node *)starting_address;
+ while ( count-- ) {
+ current->next = next;
+ next->previous = current;
+ current = next;
+ next = (Chain_Node *)
+ _Addresses_Add_offset( (void *) next, node_size );
+ }
+ current->next = _Chain_Tail( the_chain );
+ the_chain->last = current;
+}
+
+/*PAGE
+ *
+ * _Chain_Get_first_unprotected
+ */
+
+#ifndef USE_INLINES
+Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+)
+{
+ Chain_Node *return_node;
+ Chain_Node *new_first;
+
+ return_node = the_chain->first;
+ new_first = return_node->next;
+ the_chain->first = new_first;
+ new_first->previous = _Chain_Head( the_chain );
+
+ return return_node;
+}
+#endif /* USE_INLINES */
+
+/*PAGE
+ *
+ * _Chain_Get
+ *
+ * This kernel routine returns a pointer to a node taken from the
+ * given chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ *
+ * Output parameters:
+ * return_node - pointer to node in chain allocated
+ * CHAIN_END - if no nodes available
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+Chain_Node *_Chain_Get(
+ Chain_Control *the_chain
+)
+{
+ ISR_Level level;
+ Chain_Node *return_node;
+
+ return_node = NULL;
+ _ISR_Disable( level );
+ if ( !_Chain_Is_empty( the_chain ) )
+ return_node = _Chain_Get_first_unprotected( the_chain );
+ _ISR_Enable( level );
+ return return_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Append
+ *
+ * This kernel routine puts a node on the end of the specified chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ * node - address of node to put at rear of chain
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Append(
+ Chain_Control *the_chain,
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Append_unprotected( the_chain, node );
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Chain_Extract
+ *
+ * This kernel routine deletes the given node from a chain.
+ *
+ * Input parameters:
+ * node - pointer to node in chain to be deleted
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Extract(
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Extract_unprotected( node );
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Chain_Insert
+ *
+ * This kernel routine inserts a given node after a specified node
+ * a requested chain.
+ *
+ * Input parameters:
+ * after_node - pointer to node in chain to be inserted after
+ * node - pointer to node to be inserted
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Insert(
+ Chain_Node *after_node,
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Insert_unprotected( after_node, node );
+ _ISR_Enable( level );
+}
diff --git a/c/src/exec/score/src/coremsg.c b/c/src/exec/score/src/coremsg.c
new file mode 100644
index 0000000000..b40e6a0e7c
--- /dev/null
+++ b/c/src/exec/score/src/coremsg.c
@@ -0,0 +1,432 @@
+/*
+ * CORE Message Queue Handler
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the CORE Message Queue Handler.
+ * This core object provides task synchronization and communication functions
+ * via messages passed to queue objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/coremsg.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/mpci.h>
+
+/*PAGE
+ *
+ * _CORE_message_queue_Initialize
+ *
+ * This routine initializes a newly created message queue based on the
+ * specified data.
+ *
+ * Input parameters:
+ * the_message_queue - the message queue to initialize
+ * the_class - the API specific object class
+ * the_message_queue_attributes - the message queue's attributes
+ * maximum_pending_messages - maximum message and reserved buffer count
+ * maximum_message_size - maximum size of each message
+ * proxy_extract_callout - remote extract support
+ *
+ * Output parameters:
+ * TRUE - if the message queue is initialized
+ * FALSE - if the message queue is NOT initialized
+ */
+
+boolean _CORE_message_queue_Initialize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Classes the_class,
+ CORE_message_queue_Attributes *the_message_queue_attributes,
+ unsigned32 maximum_pending_messages,
+ unsigned32 maximum_message_size,
+ Thread_queue_Extract_callout proxy_extract_callout
+)
+{
+ unsigned32 message_buffering_required;
+ unsigned32 allocated_message_size;
+
+ the_message_queue->maximum_pending_messages = maximum_pending_messages;
+ the_message_queue->number_of_pending_messages = 0;
+ the_message_queue->maximum_message_size = maximum_message_size;
+ _CORE_message_queue_Set_notify( the_message_queue, NULL, NULL );
+
+ /*
+ * round size up to multiple of a ptr for chain init
+ */
+
+ allocated_message_size = maximum_message_size;
+ if (allocated_message_size & (sizeof(unsigned32) - 1)) {
+ allocated_message_size += sizeof(unsigned32);
+ allocated_message_size &= ~(sizeof(unsigned32) - 1);
+ }
+
+ message_buffering_required = maximum_pending_messages *
+ (allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
+
+ the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
+ _Workspace_Allocate( message_buffering_required );
+
+ if (the_message_queue->message_buffers == 0)
+ return FALSE;
+
+ _Chain_Initialize (
+ &the_message_queue->Inactive_messages,
+ the_message_queue->message_buffers,
+ maximum_pending_messages,
+ allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
+ );
+
+ _Chain_Initialize_empty( &the_message_queue->Pending_messages );
+
+ _Thread_queue_Initialize(
+ &the_message_queue->Wait_queue,
+ the_class,
+ _CORE_message_queue_Is_priority( the_message_queue_attributes ) ?
+ THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_MESSAGE,
+ proxy_extract_callout,
+ CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
+ );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Close
+ *
+ * This function closes a message by returning all allocated space and
+ * flushing the message_queue's task wait queue.
+ *
+ * Input parameters:
+ * the_message_queue - the message_queue to be flushed
+ * remote_extract_callout - function to invoke remotely
+ * status - status to pass to thread
+ *
+ * Output parameters: NONE
+ */
+
+void _CORE_message_queue_Close(
+ CORE_message_queue_Control *the_message_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+)
+{
+
+ if ( the_message_queue->number_of_pending_messages != 0 )
+ (void) _CORE_message_queue_Flush_support( the_message_queue );
+ else
+ _Thread_queue_Flush(
+ &the_message_queue->Wait_queue,
+ remote_extract_callout,
+ status
+ );
+
+ (void) _Workspace_Free( the_message_queue->message_buffers );
+
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Flush
+ *
+ * This function flushes the message_queue's task wait queue. The number
+ * of messages flushed from the queue is returned.
+ *
+ * Input parameters:
+ * the_message_queue - the message_queue to be flushed
+ *
+ * Output parameters:
+ * returns - the number of messages flushed from the queue
+ */
+
+unsigned32 _CORE_message_queue_Flush(
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ if ( the_message_queue->number_of_pending_messages != 0 )
+ return _CORE_message_queue_Flush_support( the_message_queue );
+ else
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Broadcast
+ *
+ * This function sends a message for every thread waiting on the queue and
+ * returns the number of threads made ready by the message.
+ *
+ * Input parameters:
+ * the_message_queue - message is submitted to this message queue
+ * buffer - pointer to message buffer
+ * size - size in bytes of message to send
+ * id - id of message queue
+ * api_message_queue_mp_support - api specific mp support callout
+ * count - area to store number of threads made ready
+ *
+ * Output parameters:
+ * count - number of threads made ready
+ * CORE_MESSAGE_QUEUE_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Broadcast(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ unsigned32 *count
+)
+{
+ Thread_Control *the_thread;
+ unsigned32 number_broadcasted;
+ Thread_Wait_information *waitp;
+ unsigned32 constrained_size;
+
+ number_broadcasted = 0;
+ while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
+ waitp = &the_thread->Wait;
+ number_broadcasted += 1;
+
+ constrained_size = size;
+ if ( size > the_message_queue->maximum_message_size )
+ constrained_size = the_message_queue->maximum_message_size;
+
+ _CORE_message_queue_Copy_buffer(
+ buffer,
+ waitp->return_argument,
+ constrained_size
+ );
+
+ *(unsigned32 *)the_thread->Wait.return_argument_1 = size;
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ (*api_message_queue_mp_support) ( the_thread, id );
+
+ }
+ *count = number_broadcasted;
+ return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Seize
+ *
+ * This kernel routine dequeues a message, copies the message buffer to
+ * a given destination buffer, and frees the message buffer to the
+ * inactive message pool. The thread will be blocked if wait is TRUE,
+ * otherwise an error will be given to the thread if no messages are available.
+ *
+ * Input parameters:
+ * the_message_queue - pointer to message queue
+ * id - id of object we are waitig on
+ * buffer - pointer to message buffer to be filled
+ * size - pointer to the size of buffer to be filled
+ * wait - TRUE if wait is allowed, FALSE otherwise
+ * timeout - time to wait for a message
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: Dependent on BUFFER_LENGTH
+ *
+ * INTERRUPT LATENCY:
+ * available
+ * wait
+ */
+
+void _CORE_message_queue_Seize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ boolean wait,
+ Watchdog_Interval timeout
+)
+{
+ ISR_Level level;
+ CORE_message_queue_Buffer_control *the_message;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+ executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+ _ISR_Disable( level );
+ if ( the_message_queue->number_of_pending_messages != 0 ) {
+ the_message_queue->number_of_pending_messages -= 1;
+
+ the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
+ _ISR_Enable( level );
+ *size = the_message->Contents.size;
+ _CORE_message_queue_Copy_buffer(the_message->Contents.buffer,buffer,*size );
+ _CORE_message_queue_Free_message_buffer(the_message_queue, the_message );
+ return;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
+ executing->Wait.queue = &the_message_queue->Wait_queue;
+ executing->Wait.id = id;
+ executing->Wait.return_argument = (void *)buffer;
+ executing->Wait.return_argument_1 = (void *)size;
+ _ISR_Enable( level );
+
+ _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Flush_support
+ *
+ * This message handler routine removes all messages from a message queue
+ * and returns them to the inactive message pool. The number of messages
+ * flushed from the queue is returned
+ *
+ * Input parameters:
+ * the_message_queue - pointer to message queue
+ *
+ * Output parameters:
+ * returns - number of messages placed on inactive chain
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+unsigned32 _CORE_message_queue_Flush_support(
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ ISR_Level level;
+ Chain_Node *inactive_first;
+ Chain_Node *message_queue_first;
+ Chain_Node *message_queue_last;
+ unsigned32 count;
+
+ _ISR_Disable( level );
+ inactive_first = the_message_queue->Inactive_messages.first;
+ message_queue_first = the_message_queue->Pending_messages.first;
+ message_queue_last = the_message_queue->Pending_messages.last;
+
+ the_message_queue->Inactive_messages.first = message_queue_first;
+ message_queue_last->next = inactive_first;
+ inactive_first->previous = message_queue_last;
+ message_queue_first->previous =
+ _Chain_Head( &the_message_queue->Inactive_messages );
+
+ _Chain_Initialize_empty( &the_message_queue->Pending_messages );
+
+ count = the_message_queue->number_of_pending_messages;
+ the_message_queue->number_of_pending_messages = 0;
+ _ISR_Enable( level );
+ return count;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Submit
+ *
+ * This routine implements the send and urgent message functions. It
+ * processes a message that is to be submitted to the designated
+ * message queue. The message will either be processed as a
+ * send message which it will be inserted at the rear of the queue
+ * or it will be processed as an urgent message which will be inserted
+ * at the front of the queue.
+ *
+ * Input parameters:
+ * the_message_queue - message is submitted to this message queue
+ * buffer - pointer to message buffer
+ * size - size in bytes of message to send
+ * id - id of message queue
+ * api_message_queue_mp_support - api specific mp support callout
+ * submit_type - send or urgent message
+ *
+ * Output parameters:
+ * CORE_MESSAGE_QUEUE_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Submit(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ CORE_message_queue_Submit_types submit_type
+)
+{
+ CORE_message_queue_Buffer_control *the_message;
+ Thread_Control *the_thread;
+
+ if ( size > the_message_queue->maximum_message_size )
+ return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
+
+ /*
+ * Is there a thread currently waiting on this message queue?
+ */
+
+ the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
+ if ( the_thread )
+ {
+ _CORE_message_queue_Copy_buffer(
+ buffer,
+ the_thread->Wait.return_argument,
+ size
+ );
+ *(unsigned32 *)the_thread->Wait.return_argument_1 = size;
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ (*api_message_queue_mp_support) ( the_thread, id );
+
+ return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+ }
+
+ /*
+ * No one waiting on this one currently.
+ * Allocate a message buffer and store it away
+ */
+
+ if ( the_message_queue->number_of_pending_messages ==
+ the_message_queue->maximum_pending_messages ) {
+ return CORE_MESSAGE_QUEUE_STATUS_TOO_MANY;
+ }
+
+ the_message = _CORE_message_queue_Allocate_message_buffer(the_message_queue);
+ if ( the_message == 0)
+ return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
+
+ _CORE_message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size );
+ the_message->Contents.size = size;
+
+ the_message_queue->number_of_pending_messages += 1;
+
+ switch ( submit_type ) {
+ case CORE_MESSAGE_QUEUE_SEND_REQUEST:
+ _CORE_message_queue_Append( the_message_queue, the_message );
+ break;
+ case CORE_MESSAGE_QUEUE_URGENT_REQUEST:
+ _CORE_message_queue_Prepend( the_message_queue, the_message );
+ break;
+ }
+
+ return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+}
diff --git a/c/src/exec/score/src/coremutex.c b/c/src/exec/score/src/coremutex.c
new file mode 100644
index 0000000000..a056a35d5c
--- /dev/null
+++ b/c/src/exec/score/src/coremutex.c
@@ -0,0 +1,330 @@
+/*
+ * Mutex Handler
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the Mutex Handler.
+ * This handler provides synchronization and mutual exclusion capabilities.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/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_fifo( the_mutex_attributes ) ?
+ THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
+ 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;
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ if ( executing->current_priority <
+ the_mutex->Attributes.priority_ceiling) {
+ executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
+ return;
+ }
+ }
+ 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 );
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ /* already the highest priority */
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ if ( the_mutex->Attributes.priority_ceiling <
+ executing->current_priority ) {
+ _Thread_Change_priority(
+ the_mutex->holder,
+ the_mutex->Attributes.priority_ceiling,
+ FALSE
+ );
+ }
+ }
+ 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;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ _Thread_queue_Enter_critical_section( &the_mutex->Wait_queue );
+ executing->Wait.queue = &the_mutex->Wait_queue;
+ executing->Wait.id = id;
+ _ISR_Enable( level );
+
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ if ( the_mutex->holder->current_priority > executing->current_priority ) {
+ _Thread_Change_priority(
+ the_mutex->holder,
+ executing->current_priority,
+ FALSE
+ );
+ }
+ break;
+ }
+
+ _Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout );
+
+ if ( _Thread_Executing->Wait.return_code == CORE_MUTEX_STATUS_SUCCESSFUL ) {
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ if ( the_mutex->Attributes.priority_ceiling <
+ executing->current_priority ) {
+ _Thread_Change_priority(
+ executing,
+ the_mutex->Attributes.priority_ceiling,
+ FALSE
+ );
+ };
+ break;
+ }
+ }
+}
+
+/*
+ * _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;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ 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.
+ */
+
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ if ( executing->resource_count == 0 &&
+ executing->real_priority != executing->current_priority ) {
+ _Thread_Change_priority( executing, executing->real_priority, TRUE );
+ }
+ break;
+ }
+
+
+ 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 or priority ceiling
+ * 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/c/src/exec/score/src/coresem.c b/c/src/exec/score/src/coresem.c
new file mode 100644
index 0000000000..ac7d82f21b
--- /dev/null
+++ b/c/src/exec/score/src/coresem.c
@@ -0,0 +1,184 @@
+/*
+ * 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/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;
+ _ISR_Enable( level );
+ return;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ _Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
+ 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/c/src/exec/score/src/coretod.c b/c/src/exec/score/src/coretod.c
new file mode 100644
index 0000000000..5cc9031024
--- /dev/null
+++ b/c/src/exec/score/src/coretod.c
@@ -0,0 +1,238 @@
+/*
+ * Time of Day (TOD) Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _TOD_Handler_initialization
+ *
+ * This routine initializes the time of day handler.
+ *
+ * Input parameters:
+ * microseconds_per_tick - microseconds between clock ticks
+ *
+ * Output parameters: NONE
+ */
+
+void _TOD_Handler_initialization(
+ unsigned32 microseconds_per_tick
+)
+{
+ _TOD_Microseconds_per_tick = microseconds_per_tick;
+
+ _TOD_Seconds_since_epoch = 0;
+
+ _TOD_Current.year = TOD_BASE_YEAR;
+ _TOD_Current.month = 1;
+ _TOD_Current.day = 1;
+ _TOD_Current.hour = 0;
+ _TOD_Current.minute = 0;
+ _TOD_Current.second = 0;
+ _TOD_Current.ticks = 0;
+
+ if ( microseconds_per_tick == 0 )
+ _TOD_Ticks_per_second = 0;
+ else
+ _TOD_Ticks_per_second =
+ TOD_MICROSECONDS_PER_SECOND / microseconds_per_tick;
+
+ _Watchdog_Initialize( &_TOD_Seconds_watchdog, _TOD_Tickle, 0, NULL );
+
+ _TOD_Is_set = FALSE;
+ _TOD_Activate( _TOD_Ticks_per_second );
+}
+
+/*PAGE
+ *
+ * _TOD_Set
+ *
+ * This rountine sets the current date and time with the specified
+ * new date and time structure.
+ *
+ * Input parameters:
+ * the_tod - pointer to the time and date structure
+ * seconds_since_epoch - seconds since system epoch
+ *
+ * Output parameters: NONE
+ */
+
+void _TOD_Set(
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
+)
+{
+ Watchdog_Interval ticks_until_next_second;
+
+ _Thread_Disable_dispatch();
+ _TOD_Deactivate();
+
+ if ( seconds_since_epoch < _TOD_Seconds_since_epoch )
+ _Watchdog_Adjust_seconds( WATCHDOG_BACKWARD,
+ _TOD_Seconds_since_epoch - seconds_since_epoch );
+ else
+ _Watchdog_Adjust_seconds( WATCHDOG_FORWARD,
+ seconds_since_epoch - _TOD_Seconds_since_epoch );
+
+ ticks_until_next_second = _TOD_Ticks_per_second;
+ if ( ticks_until_next_second > _TOD_Current.ticks )
+ ticks_until_next_second -= _TOD_Current.ticks;
+
+ _TOD_Current = *the_tod;
+ _TOD_Seconds_since_epoch = seconds_since_epoch;
+ _TOD_Is_set = TRUE;
+ _TOD_Activate( ticks_until_next_second );
+
+ _Thread_Enable_dispatch();
+}
+
+/*PAGE
+ *
+ * _TOD_Validate
+ *
+ * This kernel routine checks the validity of a date and time structure.
+ *
+ * Input parameters:
+ * the_tod - pointer to a time and date structure
+ *
+ * Output parameters:
+ * 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.
+ */
+
+boolean _TOD_Validate(
+ TOD_Control *the_tod
+)
+{
+ unsigned32 days_in_month;
+
+ if ((the_tod->ticks >= _TOD_Ticks_per_second) ||
+ (the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
+ (the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
+ (the_tod->hour >= TOD_HOURS_PER_DAY) ||
+ (the_tod->month == 0) ||
+ (the_tod->month > TOD_MONTHS_PER_YEAR) ||
+ (the_tod->year < TOD_BASE_YEAR) ||
+ (the_tod->day == 0) )
+ return FALSE;
+
+ if ( (the_tod->year % 4) == 0 )
+ days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
+ else
+ days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
+
+ if ( the_tod->day > days_in_month )
+ return FALSE;
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _TOD_To_seconds
+ *
+ * This routine returns the seconds from the epoch until the
+ * current date and time.
+ *
+ * Input parameters:
+ * the_tod - pointer to the time and date structure
+ *
+ * Output parameters:
+ * returns - seconds since epoch until the_tod
+ */
+
+unsigned32 _TOD_To_seconds(
+ TOD_Control *the_tod
+)
+{
+ unsigned32 time;
+ unsigned32 year_mod_4;
+
+ time = the_tod->day - 1;
+ year_mod_4 = the_tod->year & 3;
+
+ if ( year_mod_4 == 0 )
+ time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
+ else
+ time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
+
+ time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
+ ( (TOD_DAYS_PER_YEAR * 4) + 1);
+
+ time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
+
+ time *= TOD_SECONDS_PER_DAY;
+
+ time += ((the_tod->hour * TOD_MINUTES_PER_HOUR) + the_tod->minute)
+ * TOD_SECONDS_PER_MINUTE;
+
+ time += the_tod->second;
+
+ return( time );
+}
+
+/*PAGE
+ *
+ * _TOD_Tickle
+ *
+ * This routine updates the calendar time and tickles the
+ * per second watchdog timer chain.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine only works for leap-years through 2099.
+ */
+
+void _TOD_Tickle(
+ Objects_Id id,
+ void *ignored
+)
+{
+ unsigned32 leap;
+
+ _TOD_Current.ticks = 0;
+ ++_TOD_Seconds_since_epoch;
+ if ( ++_TOD_Current.second >= TOD_SECONDS_PER_MINUTE ) {
+ _TOD_Current.second = 0;
+ if ( ++_TOD_Current.minute >= TOD_MINUTES_PER_HOUR ) {
+ _TOD_Current.minute = 0;
+ if ( ++_TOD_Current.hour >= TOD_HOURS_PER_DAY ) {
+ _TOD_Current.hour = 0;
+ if ( _TOD_Current.year & 0x3 ) leap = 0;
+ else leap = 1;
+ if ( ++_TOD_Current.day >
+ _TOD_Days_per_month[ leap ][ _TOD_Current.month ]) {
+ _TOD_Current.day = 1;
+ if ( ++_TOD_Current.month > TOD_MONTHS_PER_YEAR ) {
+ _TOD_Current.month = 1;
+ _TOD_Current.year++;
+ }
+ }
+ }
+ }
+ }
+
+ _Watchdog_Tickle_seconds();
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, _TOD_Ticks_per_second );
+}
diff --git a/c/src/exec/score/src/heap.c b/c/src/exec/score/src/heap.c
new file mode 100644
index 0000000000..284991f0ef
--- /dev/null
+++ b/c/src/exec/score/src/heap.c
@@ -0,0 +1,538 @@
+/*
+ * Heap Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems/system.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/heap.h>
+
+/*PAGE
+ *
+ * _Heap_Initialize
+ *
+ * This kernel routine initializes a heap.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * starting_address - starting address of heap
+ * size - size of heap
+ * page_size - allocatable unit of memory
+ *
+ * Output parameters:
+ * returns - maximum memory available if RTEMS_SUCCESSFUL
+ * 0 - otherwise
+ *
+ * This is what a heap looks like in memory immediately
+ * after initialization:
+ *
+ * +--------------------------------+
+ * 0 | size = 0 | status = used | a.k.a. dummy back flag
+ * +--------------------------------+
+ * 4 | size = size-8 | status = free | a.k.a. front flag
+ * +--------------------------------+
+ * 8 | next = PERM HEAP_TAIL |
+ * +--------------------------------+
+ * 12 | previous = PERM HEAP_HEAD |
+ * +--------------------------------+
+ * | |
+ * | memory available |
+ * | for allocation |
+ * | |
+ * +--------------------------------+
+ * size - 8 | size = size-8 | status = free | a.k.a. back flag
+ * +--------------------------------+
+ * size - 4 | size = 0 | status = used | a.k.a. dummy front flag
+ * +--------------------------------+
+ */
+
+unsigned32 _Heap_Initialize(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 page_size
+)
+{
+ Heap_Block *the_block;
+ unsigned32 the_size;
+
+ if ( !_Heap_Is_page_size_valid( page_size ) ||
+ (size < HEAP_MINIMUM_SIZE) )
+ return 0;
+
+ the_heap->page_size = page_size;
+ the_size = size - HEAP_OVERHEAD;
+
+ the_block = (Heap_Block *) starting_address;
+ the_block->back_flag = HEAP_DUMMY_FLAG;
+ the_block->front_flag = the_size;
+ the_block->next = _Heap_Tail( the_heap );
+ the_block->previous = _Heap_Head( the_heap );
+
+ the_heap->start = the_block;
+ the_heap->first = the_block;
+ the_heap->permanent_null = NULL;
+ the_heap->last = the_block;
+
+ the_block = _Heap_Next_block( the_block );
+ the_block->back_flag = the_size;
+ the_block->front_flag = HEAP_DUMMY_FLAG;
+ the_heap->final = the_block;
+
+ return ( the_size - HEAP_BLOCK_USED_OVERHEAD );
+}
+
+/*PAGE
+ *
+ * _Heap_Extend
+ *
+ * This routine grows the_heap memory area using the size bytes which
+ * begin at starting_address.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header.
+ * starting_address - pointer to the memory area.
+ * size - size in bytes of the memory block to allocate.
+ *
+ * Output parameters:
+ * *amount_extended - amount of memory added to the_heap
+ */
+
+Heap_Extend_status _Heap_Extend(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 *amount_extended
+)
+{
+ Heap_Block *the_block;
+ unsigned32 *p;
+
+ /*
+ * The overhead was taken from the original heap memory.
+ */
+
+ Heap_Block *old_final;
+ Heap_Block *new_final;
+
+ /*
+ * There are five possibilities for the location of starting
+ * address:
+ *
+ * 1. non-contiguous lower address (NOT SUPPORTED)
+ * 2. contiguous lower address (NOT SUPPORTED)
+ * 3. in the heap (ERROR)
+ * 4. contiguous higher address (SUPPORTED)
+ * 5. non-contiguous higher address (NOT SUPPORTED)
+ *
+ * As noted, this code only supports (4).
+ */
+
+ if ( starting_address >= (void *) the_heap->start && /* case 3 */
+ starting_address <= (void *) the_heap->final
+ )
+ return HEAP_EXTEND_ERROR;
+
+ if ( starting_address < (void *) the_heap->start ) { /* cases 1 and 2 */
+
+ return HEAP_EXTEND_NOT_IMPLEMENTED; /* cases 1 and 2 */
+
+ } else { /* cases 4 and 5 */
+
+ the_block = (Heap_Block *)
+ _Addresses_Subtract_offset( starting_address, HEAP_OVERHEAD );
+ if ( the_block != the_heap->final )
+ return HEAP_EXTEND_NOT_IMPLEMENTED; /* case 5 */
+ }
+
+ /*
+ * Currently only case 4 should make it to this point.
+ * The basic trick is to make the extend area look like a used
+ * block and free it.
+ */
+
+ *amount_extended = size;
+
+ old_final = the_heap->final;
+ new_final = _Addresses_Add_offset( old_final, size );
+ /* SAME AS: _Addresses_Add_offset( starting_address, size-HEAP_OVERHEAD ); */
+
+ the_heap->final = new_final;
+
+ old_final->front_flag =
+ new_final->back_flag = _Heap_Build_flag( size, HEAP_BLOCK_USED );
+ new_final->front_flag = HEAP_DUMMY_FLAG;
+
+ /*
+ * Must pass in address of "user" area
+ * So add in the offset field.
+ */
+
+ p = (unsigned32 *) &old_final->next;
+ *p = sizeof(unsigned32);
+ p++;
+ _Heap_Free( the_heap, p );
+
+ return HEAP_EXTEND_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Heap_Allocate
+ *
+ * This kernel routine allocates the requested size of memory
+ * from the specified heap.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header.
+ * size - size in bytes of the memory block to allocate.
+ *
+ * Output parameters:
+ * returns - starting address of memory block allocated
+ */
+
+void *_Heap_Allocate(
+ Heap_Control *the_heap,
+ unsigned32 size
+)
+{
+ unsigned32 excess;
+ unsigned32 the_size;
+ Heap_Block *the_block;
+ Heap_Block *next_block;
+ Heap_Block *temporary_block;
+ void *ptr;
+ unsigned32 offset;
+
+ excess = size % the_heap->page_size;
+ the_size = size + the_heap->page_size + HEAP_BLOCK_USED_OVERHEAD;
+
+ if ( excess )
+ the_size += the_heap->page_size - excess;
+
+ if ( the_size < sizeof( Heap_Block ) )
+ the_size = sizeof( Heap_Block );
+
+ for ( the_block = the_heap->first;
+ ;
+ the_block = the_block->next ) {
+ if ( the_block == _Heap_Tail( the_heap ) )
+ return( NULL );
+ if ( the_block->front_flag >= the_size )
+ break;
+ }
+
+ if ( (the_block->front_flag - the_size) >
+ (the_heap->page_size + HEAP_BLOCK_USED_OVERHEAD) ) {
+ the_block->front_flag -= the_size;
+ next_block = _Heap_Next_block( the_block );
+ next_block->back_flag = the_block->front_flag;
+
+ temporary_block = _Heap_Block_at( next_block, the_size );
+ temporary_block->back_flag =
+ next_block->front_flag = _Heap_Build_flag( the_size,
+ HEAP_BLOCK_USED );
+ ptr = _Heap_Start_of_user_area( next_block );
+ } else {
+ next_block = _Heap_Next_block( the_block );
+ next_block->back_flag = _Heap_Build_flag( the_block->front_flag,
+ HEAP_BLOCK_USED );
+ the_block->front_flag = next_block->back_flag;
+ the_block->next->previous = the_block->previous;
+ the_block->previous->next = the_block->next;
+ ptr = _Heap_Start_of_user_area( the_block );
+ }
+
+ /*
+ * round ptr up to a multiple of page size
+ * Have to save the bump amount in the buffer so that free can figure it out
+ */
+
+ offset = the_heap->page_size - (((unsigned32) ptr) & (the_heap->page_size - 1));
+ ptr = _Addresses_Add_offset( ptr, offset );
+ *(((unsigned32 *) ptr) - 1) = offset;
+
+#ifdef RTEMS_DEBUG
+ {
+ unsigned32 ptr_u32;
+ ptr_u32 = (unsigned32) ptr;
+ if (ptr_u32 & (the_heap->page_size - 1))
+ abort();
+ }
+#endif
+
+ return ptr;
+}
+
+/*PAGE
+ *
+ * _Heap_Size_of_user_area
+ *
+ * This kernel routine returns the size of the memory area
+ * given heap block.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * starting_address - starting address of the memory block to free.
+ * size - pointer to size of area
+ *
+ * Output parameters:
+ * size - size of area filled in
+ * TRUE - if starting_address is valid heap address
+ * FALSE - if starting_address is invalid heap address
+ */
+
+boolean _Heap_Size_of_user_area(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 *size
+)
+{
+ Heap_Block *the_block;
+ Heap_Block *next_block;
+ unsigned32 the_size;
+
+ the_block = _Heap_User_block_at( starting_address );
+
+ if ( !_Heap_Is_block_in( the_heap, the_block ) ||
+ _Heap_Is_block_free( the_block ) )
+ return( FALSE );
+
+ the_size = _Heap_Block_size( the_block );
+ next_block = _Heap_Block_at( the_block, the_size );
+
+ if ( !_Heap_Is_block_in( the_heap, next_block ) ||
+ (the_block->front_flag != next_block->back_flag) )
+ return( FALSE );
+
+ *size = the_size;
+ return( TRUE );
+}
+
+/*PAGE
+ *
+ * _Heap_Free
+ *
+ * This kernel routine returns the memory designated by the
+ * given heap and given starting address to the memory pool.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * starting_address - starting address of the memory block to free.
+ *
+ * Output parameters:
+ * TRUE - if starting_address is valid heap address
+ * FALSE - if starting_address is invalid heap address
+ */
+
+boolean _Heap_Free(
+ Heap_Control *the_heap,
+ void *starting_address
+)
+{
+ Heap_Block *the_block;
+ Heap_Block *next_block;
+ Heap_Block *new_next_block;
+ Heap_Block *previous_block;
+ Heap_Block *temporary_block;
+ unsigned32 the_size;
+
+ the_block = _Heap_User_block_at( starting_address );
+
+ if ( !_Heap_Is_block_in( the_heap, the_block ) ||
+ _Heap_Is_block_free( the_block ) ) {
+ return( FALSE );
+ }
+
+ the_size = _Heap_Block_size( the_block );
+ next_block = _Heap_Block_at( the_block, the_size );
+
+ if ( !_Heap_Is_block_in( the_heap, next_block ) ||
+ (the_block->front_flag != next_block->back_flag) ) {
+ return( FALSE );
+ }
+
+ if ( _Heap_Is_previous_block_free( the_block ) ) {
+ previous_block = _Heap_Previous_block( the_block );
+
+ if ( !_Heap_Is_block_in( the_heap, previous_block ) ) {
+ return( FALSE );
+ }
+
+ if ( _Heap_Is_block_free( next_block ) ) { /* coalesce both */
+ previous_block->front_flag += next_block->front_flag + the_size;
+ temporary_block = _Heap_Next_block( previous_block );
+ temporary_block->back_flag = previous_block->front_flag;
+ next_block->next->previous = next_block->previous;
+ next_block->previous->next = next_block->next;
+ }
+ else { /* coalesce prev */
+ previous_block->front_flag =
+ next_block->back_flag = previous_block->front_flag + the_size;
+ }
+ }
+ else if ( _Heap_Is_block_free( next_block ) ) { /* coalesce next */
+ the_block->front_flag = the_size + next_block->front_flag;
+ new_next_block = _Heap_Next_block( the_block );
+ new_next_block->back_flag = the_block->front_flag;
+ the_block->next = next_block->next;
+ the_block->previous = next_block->previous;
+ next_block->previous->next = the_block;
+ next_block->next->previous = the_block;
+
+ if (the_heap->first == next_block)
+ the_heap->first = the_block;
+ }
+ else { /* no coalesce */
+ next_block->back_flag =
+ the_block->front_flag = the_size;
+ the_block->previous = _Heap_Head( the_heap );
+ the_block->next = the_heap->first;
+ the_heap->first = the_block;
+ the_block->next->previous = the_block;
+ }
+
+ return( TRUE );
+}
+
+/*PAGE
+ *
+ * _Heap_Walk
+ *
+ * This kernel routine walks the heap and verifies its correctness.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * source - a numeric indicator of the invoker of this routine
+ * do_dump - when TRUE print the information
+ *
+ * Output parameters: NONE
+ */
+
+#ifndef RTEMS_DEBUG
+
+void _Heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+)
+{
+}
+
+#else
+
+#include <stdio.h>
+#include <unistd.h>
+
+void _Heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+)
+{
+ Heap_Block *the_block = 0; /* avoid warnings */
+ Heap_Block *next_block = 0; /* avoid warnings */
+ int notdone = 1;
+ int error = 0;
+ int passes = 0;
+
+ /*
+ * We don't want to allow walking the heap until we have
+ * transferred control to the user task so we watch the
+ * system state.
+ */
+
+ if ( !_System_state_Is_up( _System_state_Get() ) )
+ return;
+
+ the_block = the_heap->start;
+
+ if (do_dump == TRUE) {
+ printf("\nPASS: %d start @ 0x%p final 0x%p, first 0x%p last 0x%p\n",
+ source, the_heap->start, the_heap->final,
+ the_heap->first, the_heap->last
+ );
+ }
+
+ /*
+ * Handle the 1st block
+ */
+
+ if (the_block->back_flag != HEAP_DUMMY_FLAG) {
+ printf("PASS: %d Back flag of 1st block isn't HEAP_DUMMY_FLAG\n", source);
+ error = 1;
+ }
+
+ while (notdone) {
+ passes++;
+ if (error && (passes > 10))
+ abort();
+
+ if (do_dump == TRUE) {
+ printf("PASS: %d Block @ 0x%p Back %d, Front %d",
+ source, the_block,
+ the_block->back_flag, the_block->front_flag);
+ if ( _Heap_Is_block_free(the_block) ) {
+ printf( " Prev 0x%p, Next 0x%p\n",
+ the_block->previous, the_block->next);
+ } else {
+ printf("\n");
+ }
+ }
+
+ /*
+ * Handle the last block
+ */
+
+ if ( the_block->front_flag != HEAP_DUMMY_FLAG ) {
+ next_block = _Heap_Next_block(the_block);
+ if ( the_block->front_flag != next_block->back_flag ) {
+ error = 1;
+ printf("PASS: %d Front and back flags don't match\n", source);
+ printf(" Current Block (%p): Back - %d, Front - %d",
+ the_block, the_block->back_flag, the_block->front_flag);
+ if (do_dump == TRUE) {
+ if (_Heap_Is_block_free(the_block)) {
+ printf(" Prev 0x%p, Next 0x%p\n",
+ the_block->previous, the_block->next);
+ } else {
+ printf("\n");
+ }
+ } else {
+ printf("\n");
+ }
+ printf(" Next Block (%p): Back - %d, Front - %d",
+ next_block, next_block->back_flag, next_block->front_flag);
+ if (do_dump == TRUE) {
+ if (_Heap_Is_block_free(next_block)) {
+ printf(" Prev 0x%p, Next 0x%p\n",
+ the_block->previous, the_block->next);
+ } else {
+ printf("\n");
+ }
+ } else {
+ printf("\n");
+ }
+ }
+ }
+
+ if (the_block->front_flag == HEAP_DUMMY_FLAG)
+ notdone = 0;
+ else
+ the_block = next_block;
+ }
+
+ if (error)
+ abort();
+}
+#endif
diff --git a/c/src/exec/score/src/interr.c b/c/src/exec/score/src/interr.c
new file mode 100644
index 0000000000..2011e653af
--- /dev/null
+++ b/c/src/exec/score/src/interr.c
@@ -0,0 +1,61 @@
+/*
+ * Internal Error Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/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/c/src/exec/score/src/isr.c b/c/src/exec/score/src/isr.c
new file mode 100644
index 0000000000..712696b97c
--- /dev/null
+++ b/c/src/exec/score/src/isr.c
@@ -0,0 +1,60 @@
+/*
+ * ISR Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/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/c/src/exec/score/src/mpci.c b/c/src/exec/score/src/mpci.c
new file mode 100644
index 0000000000..5730e93353
--- /dev/null
+++ b/c/src/exec/score/src/mpci.c
@@ -0,0 +1,525 @@
+/*
+ * Multiprocessing Communications Interface (MPCI) Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/sysstate.h>
+
+#include <rtems/score/coresem.h>
+
+/*PAGE
+ *
+ * _MPCI_Handler_initialization
+ *
+ * This subprogram performs the initialization necessary for this handler.
+ */
+
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table,
+ unsigned32 timeout_status
+)
+{
+ 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;
+
+ if ( !_System_state_Is_multiprocessing )
+ return;
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_MPCI_INTERNAL,
+ _MPCI_Internal_packets_Process_packet
+ );
+
+ /*
+ * Create the counting semaphore used by the MPCI Receive Server.
+ */
+
+ 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,
+ timeout_status
+ );
+}
+
+/*PAGE
+ *
+ * _MPCI_Create_server
+ *
+ * This subprogram creates the MPCI receive server.
+ */
+
+char *_MPCI_Internal_name = "MPCI";
+
+void _MPCI_Create_server( void )
+{
+
+ if ( !_System_state_Is_multiprocessing )
+ return;
+
+ /*
+ * Initialize the MPCI Receive Server
+ */
+
+ _MPCI_Receive_server_tcb = _Thread_Internal_allocate();
+
+ _Thread_Initialize(
+ &_Thread_Internal_information,
+ _MPCI_Receive_server_tcb,
+ NULL, /* allocate the stack */
+ MPCI_RECEIVE_SERVER_STACK_SIZE,
+ CPU_ALL_TASKS_ARE_FP,
+ PRIORITY_MINIMUM,
+ FALSE, /* no preempt */
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ NULL, /* no budget algorithm callout */
+ 0, /* all interrupts enabled */
+ _MPCI_Internal_name
+ );
+
+ _Thread_Start(
+ _MPCI_Receive_server_tcb,
+ THREAD_START_NUMERIC,
+ (void *) _MPCI_Receive_server,
+ NULL,
+ 0
+ );
+}
+
+/*PAGE
+ *
+ * _MPCI_Initialization
+ *
+ * This subprogram initializes the MPCI driver by
+ * invoking the user provided MPCI initialization callout.
+ */
+
+void _MPCI_Initialization ( void )
+{
+ (*_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(
+ MP_packet_Classes the_class,
+ MPCI_Packet_processor the_packet_processor
+
+)
+{
+ _MPCI_Packet_processors[ the_class ] = the_packet_processor;
+}
+
+/*PAGE
+ *
+ * _MPCI_Get_packet
+ *
+ * This subprogram obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+MP_packet_Prefix *_MPCI_Get_packet ( void )
+{
+ MP_packet_Prefix *the_packet;
+
+ (*_MPCI_table->get_packet)( &the_packet );
+
+ if ( the_packet == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_PACKETS
+ );
+
+ /*
+ * Put in a default timeout that will be used for
+ * all packets that do not otherwise have a timeout.
+ */
+
+ the_packet->timeout = MPCI_DEFAULT_TIMEOUT;
+
+ return the_packet;
+}
+
+/*PAGE
+ *
+ * _MPCI_Return_packet
+ *
+ * This subprogram returns a packet by invoking the user provided
+ * MPCI return packet callout.
+ */
+
+void _MPCI_Return_packet (
+ MP_packet_Prefix *the_packet
+)
+{
+ (*_MPCI_table->return_packet)( the_packet );
+}
+
+/*PAGE
+ *
+ * _MPCI_Send_process_packet
+ *
+ * This subprogram sends a process packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_process_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ the_packet->source_tid = _Thread_Executing->Object.id;
+ the_packet->to_convert =
+ ( the_packet->to_convert - sizeof(MP_packet_Prefix) ) /
+ sizeof(unsigned32);
+
+ (*_MPCI_table->send_packet)( destination, the_packet );
+}
+
+/*PAGE
+ *
+ * _MPCI_Send_request_packet
+ *
+ * This subprogram sends a request packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+unsigned32 _MPCI_Send_request_packet (
+ unsigned32 destination,
+ 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(MP_packet_Prefix) ) /
+ sizeof(unsigned32);
+
+ _Thread_Executing->Wait.id = the_packet->id;
+
+ _Thread_Executing->Wait.queue = &_MPCI_Remote_blocked_threads;
+
+ _Thread_Disable_dispatch();
+
+ (*_MPCI_table->send_packet)( destination, the_packet );
+
+ _Thread_queue_Enter_critical_section( &_MPCI_Remote_blocked_threads );
+
+ /*
+ * See if we need a default timeout
+ */
+
+ if (the_packet->timeout == MPCI_DEFAULT_TIMEOUT)
+ the_packet->timeout = _MPCI_table->default_timeout;
+
+ _Thread_queue_Enqueue( &_MPCI_Remote_blocked_threads, the_packet->timeout );
+
+ _Thread_Executing->current_state =
+ _States_Set( extra_state, _Thread_Executing->current_state );
+
+ _Thread_Enable_dispatch();
+
+ return _Thread_Executing->Wait.return_code;
+}
+
+/*PAGE
+ *
+ * _MPCI_Send_response_packet
+ *
+ * This subprogram sends a response packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_response_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ the_packet->source_tid = _Thread_Executing->Object.id;
+
+ (*_MPCI_table->send_packet)( destination, the_packet );
+}
+
+/*PAGE
+ *
+ * _MPCI_Receive_packet
+ *
+ * This subprogram receives a packet by invoking the user provided
+ * MPCI receive callout.
+ */
+
+MP_packet_Prefix *_MPCI_Receive_packet ( void )
+{
+ MP_packet_Prefix *the_packet;
+
+ (*_MPCI_table->receive_packet)( &the_packet );
+
+ return the_packet;
+}
+
+/*PAGE
+ *
+ * _MPCI_Process_response
+ *
+ * This subprogram obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+Thread_Control *_MPCI_Process_response (
+ MP_packet_Prefix *the_packet
+)
+{
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( the_packet->id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ the_thread = NULL; /* IMPOSSIBLE */
+ break;
+ case OBJECTS_LOCAL:
+ _Thread_queue_Extract( &_MPCI_Remote_blocked_threads, the_thread );
+ the_thread->Wait.return_code = the_packet->return_code;
+ _Thread_Unnest_dispatch();
+ break;
+ }
+
+ return the_thread;
+}
+
+/*PAGE
+ *
+ * _MPCI_Receive_server
+ *
+ */
+
+Thread _MPCI_Receive_server(
+ unsigned32 ignored
+)
+{
+
+ MP_packet_Prefix *the_packet;
+ MPCI_Packet_processor the_function;
+ Thread_Control *executing;
+
+ executing = _Thread_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();
+}
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_process_packet
+ *
+ */
+
+void _MPCI_Internal_packets_Send_process_packet (
+ MPCI_Internal_Remote_operations operation
+)
+{
+ MPCI_Internal_packet *the_packet;
+
+ switch ( operation ) {
+
+ case MPCI_PACKETS_SYSTEM_VERIFY:
+
+ the_packet = _MPCI_Internal_packets_Get_packet();
+ the_packet->Prefix.the_class = MP_PACKET_MPCI_INTERNAL;
+ the_packet->Prefix.length = sizeof ( MPCI_Internal_packet );
+ the_packet->Prefix.to_convert = sizeof ( MPCI_Internal_packet );
+ the_packet->operation = operation;
+
+ the_packet->maximum_nodes = _Objects_Maximum_nodes;
+
+ the_packet->maximum_global_objects = _Objects_MP_Maximum_global_objects;
+
+ _MPCI_Send_process_packet( MPCI_ALL_NODES, &the_packet->Prefix );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_request_packet
+ *
+ * This subprogram is not needed since there are no request
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_response_packet
+ *
+ * This subprogram is not needed since there are no response
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ *
+ * _MPCI_Internal_packets_Process_packet
+ *
+ */
+
+void _MPCI_Internal_packets_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+)
+{
+ MPCI_Internal_packet *the_packet;
+ unsigned32 maximum_nodes;
+ unsigned32 maximum_global_objects;
+
+ the_packet = (MPCI_Internal_packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case MPCI_PACKETS_SYSTEM_VERIFY:
+
+ maximum_nodes = the_packet->maximum_nodes;
+ maximum_global_objects = the_packet->maximum_global_objects;
+ if ( maximum_nodes != _Objects_Maximum_nodes ||
+ maximum_global_objects != _Objects_MP_Maximum_global_objects ) {
+
+ _MPCI_Return_packet( the_packet_prefix );
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION
+ );
+ }
+
+ _MPCI_Return_packet( the_packet_prefix );
+
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_object_was_deleted
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_extract_proxy
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Get_packet
+ *
+ */
+
+MPCI_Internal_packet *_MPCI_Internal_packets_Get_packet ( void )
+{
+ return ( (MPCI_Internal_packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/c/src/exec/score/src/object.c b/c/src/exec/score/src/object.c
new file mode 100644
index 0000000000..05339f3d13
--- /dev/null
+++ b/c/src/exec/score/src/object.c
@@ -0,0 +1,516 @@
+/*
+ * Object Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/object.h>
+#include <rtems/score/objectmp.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/sysstate.h>
+
+/*PAGE
+ *
+ * _Objects_Handler_initialization
+ *
+ * This routine initializes the object handler.
+ *
+ * Input parameters:
+ * node - local node
+ * maximum_nodes - number of nodes in the system
+ * maximum_global_objects - number of configured global objects
+ *
+ * Output parameters: NONE
+ */
+
+void _Objects_Handler_initialization(
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+)
+{
+ 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(
+ node,
+ maximum_nodes,
+ maximum_global_objects
+ );
+}
+
+/*PAGE
+ *
+ * _Objects_Initialize_information
+ *
+ * This routine initializes all object information related data structures.
+ *
+ * Input parameters:
+ * information - object information table
+ * the_class - object class
+ * supports_global - TRUE if this is a global object class
+ * maximum - maximum objects of this class
+ * is_string - TRUE if names for this object are strings
+ * size - size of this object's control block
+ * is_thread - TRUE if this class is threads
+ *
+ * Output parameters: NONE
+ */
+
+void _Objects_Initialize_information(
+ Objects_Information *information,
+ Objects_Classes the_class,
+ boolean supports_global,
+ unsigned32 maximum,
+ unsigned32 size,
+ boolean is_string,
+ unsigned32 maximum_name_length,
+ boolean is_thread
+)
+{
+ unsigned32 minimum_index;
+ unsigned32 index;
+ Objects_Control *the_object;
+ unsigned32 name_length;
+ void *name_area;
+
+ information->maximum = maximum;
+ information->the_class = the_class;
+ information->is_string = is_string;
+ information->is_thread = is_thread;
+
+ /*
+ * Set the entry in the object information table.
+ */
+
+ _Objects_Information_table[ the_class ] = information;
+
+ /*
+ * Calculate minimum and maximum Id's
+ */
+
+ if ( maximum == 0 ) minimum_index = 0;
+ else minimum_index = 1;
+
+ information->minimum_id =
+ _Objects_Build_id( the_class, _Objects_Local_node, minimum_index );
+
+ information->maximum_id =
+ _Objects_Build_id( the_class, _Objects_Local_node, maximum );
+
+ /*
+ * Allocate local pointer table
+ */
+
+ information->local_table =
+ (Objects_Control **) _Workspace_Allocate_or_fatal_error(
+ (maximum + 1) * sizeof(Objects_Control *)
+ );
+
+ /*
+ * Allocate name table
+ */
+
+ name_length = maximum_name_length;
+
+ if (name_length & (OBJECTS_NAME_ALIGNMENT-1))
+ name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
+ ~(OBJECTS_NAME_ALIGNMENT-1);
+
+ information->name_length = name_length;
+
+ name_area = (Objects_Name *)
+ _Workspace_Allocate_or_fatal_error( (maximum + 1) * name_length );
+ information->name_table = name_area;
+
+ /*
+ * Initialize local pointer table
+ */
+
+ for ( index=0 ; index <= maximum ; index++ ) {
+ information->local_table[ index ] = NULL;
+ }
+
+ /*
+ * Initialize objects .. if there are any
+ */
+
+ if ( maximum == 0 ) {
+ _Chain_Initialize_empty( &information->Inactive );
+ } else {
+
+ _Chain_Initialize(
+ &information->Inactive,
+ _Workspace_Allocate_or_fatal_error( maximum * size ),
+ maximum,
+ size
+ );
+
+ the_object = (Objects_Control *) information->Inactive.first;
+ for ( index=1; index <= maximum ; index++ ) {
+ the_object->id =
+ _Objects_Build_id( the_class, _Objects_Local_node, index );
+
+ the_object->name = (void *) name_area;
+
+ name_area = _Addresses_Add_offset( name_area, name_length );
+
+ the_object = (Objects_Control *) the_object->Node.next;
+ }
+
+ }
+
+ /*
+ * Take care of multiprocessing
+ */
+
+ if ( supports_global == TRUE && _System_state_Is_multiprocessing ) {
+
+ information->global_table =
+ (Chain_Control *) _Workspace_Allocate_or_fatal_error(
+ (_Objects_Maximum_nodes + 1) * sizeof(Chain_Control)
+ );
+
+ for ( index=1; index <= _Objects_Maximum_nodes ; index++ )
+ _Chain_Initialize_empty( &information->global_table[ index ] );
+ }
+ else
+ information->global_table = NULL;
+}
+
+/*PAGE
+ *
+ * _Objects_Clear_name
+ *
+ * XXX
+ */
+
+void _Objects_Clear_name(
+ void *name,
+ unsigned32 length
+)
+{
+ unsigned32 index;
+ unsigned32 maximum = length / OBJECTS_NAME_ALIGNMENT;
+ unsigned32 *name_ptr = (unsigned32 *) name;
+
+ for ( index=0 ; index < maximum ; index++ )
+ *name_ptr++ = 0;
+}
+
+/*PAGE
+ *
+ * _Objects_Copy_name_string
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_string(
+ void *source,
+ void *destination
+)
+{
+ unsigned8 *source_p = (unsigned8 *) source;
+ unsigned8 *destination_p = (unsigned8 *) destination;
+
+ do {
+ *destination_p++ = *source_p;
+ } while ( *source_p++ );
+}
+
+/*PAGE
+ *
+ * _Objects_Copy_name_raw
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_raw(
+ void *source,
+ void *destination,
+ unsigned32 length
+)
+{
+ unsigned32 *source_p = (unsigned32 *) source;
+ unsigned32 *destination_p = (unsigned32 *) destination;
+ unsigned32 tmp_length = length / OBJECTS_NAME_ALIGNMENT;
+
+ while ( tmp_length-- )
+ *destination_p++ = *source_p++;
+}
+
+/*PAGE
+ *
+ * _Objects_Compare_name_string
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_string(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+)
+{
+ unsigned8 *name_1_p = (unsigned8 *) name_1;
+ unsigned8 *name_2_p = (unsigned8 *) name_2;
+ unsigned32 tmp_length = length;
+
+ do {
+ if ( *name_1_p++ != *name_2_p++ )
+ return FALSE;
+ if ( !tmp_length-- )
+ return FALSE;
+ } while ( *name_1_p );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _Objects_Compare_name_raw
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_raw(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+)
+{
+ unsigned32 *name_1_p = (unsigned32 *) name_1;
+ unsigned32 *name_2_p = (unsigned32 *) name_2;
+ unsigned32 tmp_length = length / OBJECTS_NAME_ALIGNMENT;
+
+ while ( tmp_length-- )
+ if ( *name_1_p++ != *name_2_p++ )
+ return FALSE;
+
+ return TRUE;
+}
+
+
+/*PAGE
+ *
+ * _Objects_Name_to_id
+ *
+ * These kernel routines search the object table(s) for the given
+ * object name and returns the associated object id.
+ *
+ * Input parameters:
+ * information - object information
+ * name - user defined object name
+ * node - node indentifier (0 indicates any node)
+ * id - address of return ID
+ *
+ * Output parameters:
+ * id - object id
+ * OBJECTS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+Objects_Name_to_id_errors _Objects_Name_to_id(
+ Objects_Information *information,
+ Objects_Name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ boolean search_local_node;
+ Objects_Control **objects;
+ Objects_Control *the_object;
+ unsigned32 index;
+ unsigned32 name_length;
+ Objects_Name_comparators compare_them;
+
+ if ( name == 0 )
+ return OBJECTS_INVALID_NAME;
+
+ search_local_node = FALSE;
+
+ if ( information->maximum != 0 &&
+ (node == OBJECTS_SEARCH_ALL_NODES || node == OBJECTS_SEARCH_LOCAL_NODE ||
+ _Objects_Is_local_node( node ) ) )
+ search_local_node = TRUE;
+
+ if ( search_local_node ) {
+ objects = information->local_table;
+
+ name_length = information->name_length;
+
+ if ( information->is_string ) compare_them = _Objects_Compare_name_string;
+ else compare_them = _Objects_Compare_name_raw;
+
+ for ( index = 1; index <= information->maximum; index++ ) {
+
+ the_object = objects[ index ];
+
+ if ( !the_object || !the_object->name )
+ continue;
+
+ if ( (*compare_them)( name, the_object->name, name_length ) ) {
+ *id = the_object->id;
+ return OBJECTS_SUCCESSFUL;
+ }
+ }
+ }
+
+ 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 ) );
+}
+
+/*PAGE
+ *
+ * _Objects_Get
+ *
+ * This routine sets the object pointer for the given
+ * object id based on the given object information structure.
+ *
+ * Input parameters:
+ * information - pointer to entry in table for this class
+ * id - object id to search for
+ * location - address of where to store the location
+ *
+ * Output parameters:
+ * returns - address of object if local
+ * location - one of the following:
+ * OBJECTS_ERROR - invalid object ID
+ * OBJECTS_REMOTE - remote object
+ * OBJECTS_LOCAL - local object
+ */
+
+Objects_Control *_Objects_Get(
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ Objects_Control *the_object;
+ unsigned32 index;
+
+ index = id - information->minimum_id;
+
+ if ( information->maximum >= index ) {
+ _Thread_Disable_dispatch();
+ if ( (the_object = information->local_table[index+1]) != NULL ) {
+ *location = OBJECTS_LOCAL;
+ return( the_object );
+ }
+ _Thread_Enable_dispatch();
+ *location = OBJECTS_ERROR;
+ return( NULL );
+ }
+ *location = OBJECTS_ERROR;
+ _Objects_MP_Is_remote( information, id, location, &the_object );
+ return the_object;
+}
+
+
+/*PAGE
+ *
+ * _Objects_Get_next
+ *
+ * Like _Objects_Get, but considers the 'id' as a "hint" and
+ * finds next valid one after that point.
+ * Mostly used for monitor and debug traversal of an object.
+ *
+ * Input parameters:
+ * information - pointer to entry in table for this class
+ * id - object id to search for
+ * location - address of where to store the location
+ * next_id - address to store next id to try
+ *
+ * Output parameters:
+ * returns - address of object if local
+ * location - one of the following:
+ * OBJECTS_ERROR - invalid object ID
+ * OBJECTS_REMOTE - remote object
+ * OBJECTS_LOCAL - local object
+ * next_id - will contain a reasonable "next" id to continue traversal
+ *
+ * NOTE:
+ * assumes can add '1' to an id to get to next index.
+ */
+
+Objects_Control *
+_Objects_Get_next(
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location_p,
+ Objects_Id *next_id_p
+)
+{
+ Objects_Control *object;
+ Objects_Id next_id;
+
+ 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 (_Objects_Get_index(next_id) > information->maximum)
+ {
+ *location_p = OBJECTS_ERROR;
+ goto final;
+ }
+
+ /* try to grab one */
+ object = _Objects_Get(information, next_id, location_p);
+
+ next_id++;
+
+ } while (*location_p != OBJECTS_LOCAL);
+
+ *next_id_p = next_id;
+ return object;
+
+final:
+ *next_id_p = OBJECTS_ID_FINAL;
+ return 0;
+}
+
+/*PAGE
+ *
+ * _Objects_Get_information
+ *
+ * XXX
+ */
+
+Objects_Information *_Objects_Get_information(
+ Objects_Id id
+)
+{
+ Objects_Classes the_class;
+
+ the_class = _Objects_Get_class( id );
+
+ if ( !_Objects_Is_class_valid( the_class ) )
+ return NULL;
+
+ return _Objects_Information_table[ the_class ];
+}
+
diff --git a/c/src/exec/score/src/objectmp.c b/c/src/exec/score/src/objectmp.c
new file mode 100644
index 0000000000..db784abfa4
--- /dev/null
+++ b/c/src/exec/score/src/objectmp.c
@@ -0,0 +1,275 @@
+/*
+ * Multiprocessing Support for the Object Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/thread.h>
+
+/*PAGE
+ *
+ * _Objects_MP_Handler_initialization
+ *
+ */
+
+void _Objects_MP_Handler_initialization (
+ 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 );
+ return;
+ }
+
+ _Chain_Initialize(
+ &_Objects_MP_Inactive_global_objects,
+ _Workspace_Allocate_or_fatal_error(
+ maximum_global_objects * sizeof( Objects_MP_Control )
+ ),
+ maximum_global_objects,
+ sizeof( Objects_MP_Control )
+ );
+
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Open
+ *
+ */
+
+void _Objects_MP_Open (
+ Objects_Information *information,
+ Objects_MP_Control *the_global_object,
+ unsigned32 the_name, /* XXX -- wrong for variable */
+ Objects_Id the_id
+)
+{
+ the_global_object->Object.id = the_id;
+ the_global_object->name = the_name;
+
+ _Chain_Prepend(
+ &information->global_table[ _Objects_Get_node( the_id ) ],
+ &the_global_object->Object.Node
+ );
+
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_and_open
+ *
+ */
+
+boolean _Objects_MP_Allocate_and_open (
+ Objects_Information *information,
+ unsigned32 the_name, /* XXX -- wrong for variable */
+ Objects_Id the_id,
+ boolean is_fatal_error
+)
+{
+ Objects_MP_Control *the_global_object;
+
+ the_global_object = _Objects_MP_Allocate_global_object();
+ if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
+
+ if ( is_fatal_error == FALSE )
+ return FALSE;
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS
+ );
+
+ }
+
+ _Objects_MP_Open( information, the_global_object, the_name, the_id );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Close
+ *
+ */
+
+void _Objects_MP_Close (
+ Objects_Information *information,
+ Objects_Id the_id
+)
+{
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ Objects_MP_Control *the_object;
+
+ the_chain = &information->global_table[ _Objects_Get_node( the_id ) ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_object = (Objects_MP_Control *) the_node;
+
+ if ( _Objects_Are_ids_equal( the_object->Object.id, the_id ) ) {
+
+ _Chain_Extract( the_node );
+ _Objects_MP_Free_global_object( the_object );
+ return;
+ }
+
+ }
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INVALID_GLOBAL_ID
+ );
+}
+
+/*PAGE
+ *
+ * _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,
+ Objects_Id *the_id
+)
+{
+ unsigned32 low_node;
+ unsigned32 high_node;
+ unsigned32 node_index;
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ Objects_MP_Control *the_object;
+ unsigned32 name_to_use = *(unsigned32 *)the_name; /* XXX variable */
+
+ if ( nodes_to_search > _Objects_Maximum_nodes )
+ return OBJECTS_INVALID_NODE;
+
+ if ( information->global_table == NULL )
+ return OBJECTS_INVALID_NAME;
+
+ if ( nodes_to_search == OBJECTS_SEARCH_ALL_NODES ||
+ nodes_to_search == OBJECTS_SEARCH_OTHER_NODES ) {
+ low_node = 1;
+ high_node = _Objects_Maximum_nodes;
+ } else {
+ low_node =
+ high_node = nodes_to_search;
+ }
+
+ _Thread_Disable_dispatch();
+
+ for ( node_index = low_node ; node_index <= high_node ; node_index++ ) {
+
+ /*
+ * NOTE: The local node was search (if necessary) by
+ * _Objects_Name_to_id before this was invoked.
+ */
+
+ if ( !_Objects_Is_local_node( node_index ) ) {
+ the_chain = &information->global_table[ node_index ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_object = (Objects_MP_Control *) the_node;
+
+ if ( the_object->name == name_to_use ) {
+ *the_id = the_object->Object.id;
+ _Thread_Enable_dispatch();
+ return OBJECTS_SUCCESSFUL;
+ }
+ }
+ }
+ }
+
+ _Thread_Enable_dispatch();
+ return OBJECTS_INVALID_NAME;
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Is_remote
+ *
+ */
+
+void _Objects_MP_Is_remote (
+ Objects_Information *information,
+ Objects_Id the_id,
+ Objects_Locations *location,
+ Objects_Control **the_object
+)
+{
+ unsigned32 node;
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ Objects_MP_Control *the_global_object;
+
+ node = _Objects_Get_node( the_id );
+
+ /*
+ * NOTE: The local node was search (if necessary) by
+ * _Objects_Name_to_id before this was invoked.
+ *
+ * The NODE field of an object id cannot be 0
+ * because 0 is an invalid node number.
+ */
+
+ if ( node == 0 ||
+ _Objects_Is_local_node( node ) ||
+ node > _Objects_Maximum_nodes ||
+ information->global_table == NULL ) {
+
+ *location = OBJECTS_ERROR;
+ *the_object = NULL;
+ return;
+ }
+
+ _Thread_Disable_dispatch();
+
+ the_chain = &information->global_table[ node ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_global_object = (Objects_MP_Control *) the_node;
+
+ if ( _Objects_Are_ids_equal( the_global_object->Object.id, the_id ) ) {
+ _Thread_Unnest_dispatch();
+ *location = OBJECTS_REMOTE;
+ *the_object = (Objects_Control *) the_global_object;
+ return;
+ }
+ }
+
+ _Thread_Enable_dispatch();
+ *location = OBJECTS_ERROR;
+ *the_object = NULL;
+
+}
diff --git a/c/src/exec/score/src/thread.c b/c/src/exec/score/src/thread.c
new file mode 100644
index 0000000000..e4a3614a53
--- /dev/null
+++ b/c/src/exec/score/src/thread.c
@@ -0,0 +1,1395 @@
+/*
+ * Thread Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/context.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/states.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+
+/*PAGE
+ *
+ * _Thread_Handler_initialization
+ *
+ * This routine initializes all thread manager related data structures.
+ *
+ * Input parameters:
+ * ticks_per_timeslice - clock ticks per quantum
+ * maximum_proxies - number of proxies to initialize
+ *
+ * Output parameters: NONE
+ */
+
+char *_Thread_Idle_name = "IDLE";
+
+void _Thread_Handler_initialization(
+ unsigned32 ticks_per_timeslice,
+ unsigned32 maximum_extensions,
+ unsigned32 maximum_proxies
+)
+{
+ unsigned32 index;
+
+ /*
+ * BOTH stacks hooks must be set or both must be NULL.
+ * Do not allow mixture.
+ */
+
+ if ( !( ( _CPU_Table.stack_allocate_hook == 0 )
+ == ( _CPU_Table.stack_free_hook == 0 ) ) )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_BAD_STACK_HOOK
+ );
+
+ _Context_Switch_necessary = FALSE;
+ _Thread_Executing = NULL;
+ _Thread_Heir = NULL;
+ _Thread_Allocated_fp = NULL;
+
+ _Thread_Do_post_task_switch_extension = 0;
+
+ _Thread_Maximum_extensions = maximum_extensions;
+
+ _Thread_Ticks_per_timeslice = ticks_per_timeslice;
+
+ _Thread_Ready_chain = (Chain_Control *) _Workspace_Allocate_or_fatal_error(
+ (PRIORITY_MAXIMUM + 1) * sizeof(Chain_Control)
+ );
+
+ for ( index=0; index <= PRIORITY_MAXIMUM ; index++ )
+ _Chain_Initialize_empty( &_Thread_Ready_chain[ index ] );
+
+ _Thread_MP_Handler_initialization( maximum_proxies );
+
+ /*
+ * Initialize this class of objects.
+ */
+
+ _Objects_Initialize_information(
+ &_Thread_Internal_information,
+ OBJECTS_INTERNAL_THREADS,
+ FALSE,
+ ( _System_state_Is_multiprocessing ) ? 2 : 1,
+ sizeof( Thread_Control ),
+ TRUE,
+ 8,
+ TRUE
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Create_idle
+ */
+
+void _Thread_Create_idle( void )
+{
+ void *idle;
+
+ /*
+ * The entire workspace is zeroed during its initialization. Thus, all
+ * fields not explicitly assigned were explicitly zeroed by
+ * _Workspace_Initialization.
+ */
+
+ _Thread_Idle = _Thread_Internal_allocate();
+
+ /*
+ * Initialize the IDLE task.
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == TRUE)
+ idle = (void *) _CPU_Thread_Idle_body;
+#else
+ idle = (void *) _Thread_Idle_body;
+#endif
+
+ if ( _CPU_Table.idle_task )
+ idle = _CPU_Table.idle_task;
+
+ _Thread_Initialize(
+ &_Thread_Internal_information,
+ _Thread_Idle,
+ NULL, /* allocate the stack */
+ THREAD_IDLE_STACK_SIZE,
+ CPU_IDLE_TASK_IS_FP,
+ PRIORITY_MAXIMUM,
+ TRUE, /* preemptable */
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ NULL, /* no budget algorithm callout */
+ 0, /* all interrupts enabled */
+ _Thread_Idle_name
+ );
+
+ /*
+ * WARNING!!! This is necessary to "kick" start the system and
+ * MUST be done before _Thread_Start is invoked.
+ */
+
+ _Thread_Heir =
+ _Thread_Executing = _Thread_Idle;
+
+ _Thread_Start(
+ _Thread_Idle,
+ THREAD_START_NUMERIC,
+ idle,
+ NULL,
+ 0
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Start_multitasking
+ *
+ * This kernel routine readies the requested thread, the thread chain
+ * is adjusted. A new heir thread may be selected.
+ *
+ * Input parameters:
+ * system_thread - pointer to system initialization thread control block
+ * idle_thread - pointer to idle thread control block
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine uses the "blocking" heir selection mechanism.
+ * This insures the correct heir after a thread restart.
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Start_multitasking( void )
+{
+ /*
+ * The system is now multitasking and completely initialized.
+ * This system thread now either "goes away" in a single processor
+ * system or "turns into" the server thread in an MP system.
+ */
+
+ _System_state_Set( SYSTEM_STATE_UP );
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Executing = _Thread_Heir;
+
+ /*
+ * Get the init task(s) running.
+ *
+ * Note: Thread_Dispatch() is normally used to dispatch threads. As
+ * part of its work, Thread_Dispatch() restores floating point
+ * state for the heir task.
+ *
+ * This code avoids Thread_Dispatch(), and so we have to restore
+ * (actually initialize) the floating point state "by hand".
+ *
+ * Ignore the CPU_USE_DEFERRED_FP_SWITCH because we must always
+ * switch in the first thread if it is FP.
+ */
+
+
+#if ( CPU_HARDWARE_FP == TRUE )
+ /*
+ * don't need to worry about saving BSP's floating point state
+ */
+
+ if ( _Thread_Heir->fp_context != NULL )
+ _Context_Restore_fp( &_Thread_Heir->fp_context );
+#endif
+
+ _Context_Switch( &_Thread_BSP_context, &_Thread_Heir->Registers );
+}
+
+/*PAGE
+ *
+ * _Thread_Dispatch
+ *
+ * This kernel routine determines if a dispatch is needed, and if so
+ * dispatches to the heir thread. Once the heir is running an attempt
+ * is made to dispatch any ASRs.
+ *
+ * ALTERNATE ENTRY POINTS:
+ * void _Thread_Enable_dispatch();
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * dispatch thread
+ * no dispatch thread
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void )
+{
+ if ( --_Thread_Dispatch_disable_level )
+ return;
+ _Thread_Dispatch();
+}
+#endif
+
+void _Thread_Dispatch( void )
+{
+ Thread_Control *executing;
+ Thread_Control *heir;
+ ISR_Level level;
+
+ executing = _Thread_Executing;
+ _ISR_Disable( level );
+ while ( _Context_Switch_necessary == TRUE ) {
+ heir = _Thread_Heir;
+ _Thread_Dispatch_disable_level = 1;
+ _Context_Switch_necessary = FALSE;
+ _Thread_Executing = heir;
+ _ISR_Enable( level );
+
+ heir->ticks_executed++;
+
+ _User_extensions_Thread_switch( executing, heir );
+
+ if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
+ heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
+
+ /*
+ * If the CPU has hardware floating point, then we must address saving
+ * and restoring it as part of the context switch.
+ *
+ * The second conditional compilation section selects the algorithm used
+ * to context switch between floating point tasks. The deferred algorithm
+ * can be significantly better in a system with few floating point tasks
+ * because it reduces the total number of save and restore FP context
+ * operations. However, this algorithm can not be used on all CPUs due
+ * to unpredictable use of FP registers by some compilers for integer
+ * operations.
+ */
+
+#if ( CPU_HARDWARE_FP == TRUE )
+#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
+ if ( (heir->fp_context != NULL) && !_Thread_Is_allocated_fp( heir ) ) {
+ if ( _Thread_Allocated_fp != NULL )
+ _Context_Save_fp( &_Thread_Allocated_fp->fp_context );
+ _Context_Restore_fp( &heir->fp_context );
+ _Thread_Allocated_fp = heir;
+ }
+#else
+ if ( executing->fp_context != NULL )
+ _Context_Save_fp( &executing->fp_context );
+
+ if ( heir->fp_context != NULL )
+ _Context_Restore_fp( &heir->fp_context );
+#endif
+#endif
+
+ _Context_Switch( &executing->Registers, &heir->Registers );
+
+ executing = _Thread_Executing;
+
+ _ISR_Disable( level );
+ }
+
+ _Thread_Dispatch_disable_level = 0;
+
+ _ISR_Enable( level );
+
+ if ( _Thread_Do_post_task_switch_extension ||
+ executing->do_post_task_switch_extension ) {
+ executing->do_post_task_switch_extension = FALSE;
+ _API_extensions_Run_postswitch();
+ }
+
+}
+
+/*PAGE
+ *
+ * _Thread_Stack_Allocate
+ *
+ * Allocate the requested stack space for the thread.
+ * return the actual size allocated after any adjustment
+ * or return zero if the allocation failed.
+ * Set the Start.stack field to the address of the stack
+ */
+
+static unsigned32 _Thread_Stack_Allocate(
+ Thread_Control *the_thread,
+ unsigned32 stack_size)
+{
+ void *stack_addr = 0;
+
+ if ( !_Stack_Is_enough( stack_size ) )
+ stack_size = STACK_MINIMUM_SIZE;
+
+ /*
+ * Call ONLY the CPU table stack allocate hook, _or_ the
+ * the RTEMS workspace allocate. This is so the stack free
+ * routine can call the correct deallocation routine.
+ */
+
+ if ( _CPU_Table.stack_allocate_hook )
+ {
+ stack_addr = (*_CPU_Table.stack_allocate_hook)( stack_size );
+ } else {
+
+ /*
+ * First pad the requested size so we allocate enough memory
+ * so the context initialization can align it properly. The address
+ * returned the workspace allocate must be directly stored in the
+ * stack control block because it is later used in the free sequence.
+ *
+ * Thus it is the responsibility of the CPU dependent code to
+ * get and keep the stack adjust factor, the stack alignment, and
+ * the context initialization sequence in sync.
+ */
+
+ stack_size = _Stack_Adjust_size( stack_size );
+ stack_addr = _Workspace_Allocate( stack_size );
+ }
+
+ if ( !stack_addr )
+ stack_size = 0;
+
+ the_thread->Start.stack = stack_addr;
+
+ return stack_size;
+}
+
+/*
+ * _Thread_Stack_Free
+ *
+ * Deallocate the Thread's stack.
+ */
+
+static void _Thread_Stack_Free(
+ Thread_Control *the_thread
+)
+{
+ /*
+ * If the API provided the stack space, then don't free it.
+ */
+
+ if ( !the_thread->Start.core_allocated_stack )
+ return;
+
+ /*
+ * Call ONLY the CPU table stack free hook, or the
+ * the RTEMS workspace free. This is so the free
+ * routine properly matches the allocation of the stack.
+ */
+
+ if ( _CPU_Table.stack_free_hook )
+ (*_CPU_Table.stack_free_hook)( the_thread->Start.Initial_stack.area );
+ else
+ _Workspace_Free( the_thread->Start.Initial_stack.area );
+}
+
+/*PAGE
+ *
+ * _Thread_Initialize
+ *
+ * XXX
+ */
+
+boolean _Thread_Initialize(
+ Objects_Information *information,
+ Thread_Control *the_thread,
+ void *stack_area,
+ unsigned32 stack_size,
+ boolean is_fp,
+ Priority_Control priority,
+ boolean is_preemptible,
+ Thread_CPU_budget_algorithms budget_algorithm,
+ Thread_CPU_budget_algorithm_callout budget_callout,
+ unsigned32 isr_level,
+ Objects_Name name
+)
+{
+ unsigned32 actual_stack_size = 0;
+ void *stack = NULL;
+ void *fp_area;
+ void *extensions_area;
+
+ /*
+ * Allocate and Initialize the stack for this thread.
+ */
+
+
+ if ( !stack ) {
+ if ( !_Stack_Is_enough( stack_size ) )
+ actual_stack_size = STACK_MINIMUM_SIZE;
+ else
+ actual_stack_size = stack_size;
+
+ actual_stack_size = _Stack_Adjust_size( actual_stack_size );
+ stack = stack_area;
+
+ actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
+
+ if ( !actual_stack_size )
+ return FALSE; /* stack allocation failed */
+
+ stack = the_thread->Start.stack;
+
+ the_thread->Start.core_allocated_stack = TRUE;
+ } else {
+ stack = stack_area;
+ actual_stack_size = stack_size;
+ the_thread->Start.core_allocated_stack = FALSE;
+ }
+
+ _Stack_Initialize(
+ &the_thread->Start.Initial_stack,
+ stack,
+ actual_stack_size
+ );
+
+ /*
+ * Allocate the floating point area for this thread
+ */
+
+ if ( is_fp ) {
+
+ fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
+ if ( !fp_area ) {
+ _Thread_Stack_Free( the_thread );
+ return FALSE;
+ }
+ fp_area = _Context_Fp_start( fp_area, 0 );
+
+ } else
+ fp_area = NULL;
+
+ the_thread->fp_context = fp_area;
+ the_thread->Start.fp_context = fp_area;
+
+ /*
+ * Allocate the extensions area for this thread
+ */
+
+ 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 );
+
+ _Thread_Stack_Free( the_thread );
+
+ return FALSE;
+ }
+ } else
+ extensions_area = NULL;
+
+ the_thread->extensions = (void **) extensions_area;
+
+ /*
+ * General initialization
+ */
+
+ the_thread->Start.is_preemptible = is_preemptible;
+ the_thread->Start.budget_algorithm = budget_algorithm;
+ the_thread->Start.budget_callout = budget_callout;
+ the_thread->Start.isr_level = isr_level;
+
+ the_thread->current_state = STATES_DORMANT;
+ the_thread->resource_count = 0;
+ the_thread->real_priority = priority;
+ the_thread->Start.initial_priority = priority;
+ the_thread->ticks_executed = 0;
+
+ _Thread_Set_priority( the_thread, priority );
+
+ /*
+ * Open the object
+ */
+
+ _Objects_Open( information, &the_thread->Object, name );
+
+ /*
+ * Invoke create extensions
+ */
+
+ if ( !_User_extensions_Thread_create( the_thread ) ) {
+
+ if ( extensions_area )
+ (void) _Workspace_Free( extensions_area );
+
+ if ( fp_area )
+ (void) _Workspace_Free( fp_area );
+
+ _Thread_Stack_Free( the_thread );
+
+ return FALSE;
+ }
+
+ return TRUE;
+
+}
+
+/*
+ * _Thread_Start
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Thread_Start(
+ Thread_Control *the_thread,
+ Thread_Start_types the_prototype,
+ void *entry_point,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+)
+{
+ if ( _States_Is_dormant( the_thread->current_state ) ) {
+
+ the_thread->Start.entry_point = (Thread_Entry) entry_point;
+
+ the_thread->Start.prototype = the_prototype;
+ the_thread->Start.pointer_argument = pointer_argument;
+ the_thread->Start.numeric_argument = numeric_argument;
+
+ _Thread_Load_environment( the_thread );
+
+ _Thread_Ready( the_thread );
+
+ _User_extensions_Thread_start( the_thread );
+
+ return TRUE;
+ }
+
+ return FALSE;
+
+}
+
+/*
+ * _Thread_Restart
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Thread_Restart(
+ Thread_Control *the_thread,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+)
+{
+ if ( !_States_Is_dormant( the_thread->current_state ) ) {
+
+ _Thread_Set_transient( the_thread );
+ the_thread->resource_count = 0;
+ the_thread->is_preemptible = the_thread->Start.is_preemptible;
+ the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
+ the_thread->budget_callout = the_thread->Start.budget_callout;
+
+ the_thread->Start.pointer_argument = pointer_argument;
+ the_thread->Start.numeric_argument = numeric_argument;
+
+ if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
+
+ if ( _Watchdog_Is_active( &the_thread->Timer ) )
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ }
+
+ if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
+ the_thread->real_priority = the_thread->Start.initial_priority;
+ _Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
+ }
+
+ _Thread_Load_environment( the_thread );
+
+ _Thread_Ready( the_thread );
+
+ _User_extensions_Thread_restart( the_thread );
+
+ if ( _Thread_Is_executing ( the_thread ) )
+ _Thread_Restart_self();
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*
+ * _Thread_Close
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Thread_Close(
+ Objects_Information *information,
+ Thread_Control *the_thread
+)
+{
+ _Objects_Close( information, &the_thread->Object );
+
+ _Thread_Set_state( the_thread, STATES_TRANSIENT );
+
+ if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
+
+ if ( _Watchdog_Is_active( &the_thread->Timer ) )
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ }
+
+ _User_extensions_Thread_delete( the_thread );
+
+#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
+ if ( _Thread_Is_allocated_fp( the_thread ) )
+ _Thread_Deallocate_fp();
+#endif
+ the_thread->fp_context = NULL;
+
+ if ( the_thread->Start.fp_context )
+ (void) _Workspace_Free( the_thread->Start.fp_context );
+
+ _Thread_Stack_Free( the_thread );
+
+ if ( the_thread->extensions )
+ (void) _Workspace_Free( the_thread->extensions );
+
+ the_thread->Start.stack = NULL;
+ the_thread->extensions = NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_Ready
+ *
+ * This kernel routine readies the requested thread, the thread chain
+ * is adjusted. A new heir thread may be selected.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine uses the "blocking" heir selection mechanism.
+ * This insures the correct heir after a thread restart.
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Ready(
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ Thread_Control *heir;
+
+ _ISR_Disable( level );
+
+ the_thread->current_state = STATES_READY;
+
+ _Priority_Add_to_bit_map( &the_thread->Priority_map );
+
+ _Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
+
+ _ISR_Flash( level );
+
+ _Thread_Calculate_heir();
+
+ heir = _Thread_Heir;
+
+ if ( !_Thread_Is_executing( heir ) && _Thread_Executing->is_preemptible )
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Clear_state
+ *
+ * This kernel routine clears the appropriate states in the
+ * requested thread. The thread ready chain is adjusted if
+ * necessary and the Heir thread is set accordingly.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ * state - state set to clear
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * priority map
+ * select heir
+ */
+
+
+void _Thread_Clear_state(
+ Thread_Control *the_thread,
+ States_Control state
+)
+{
+ ISR_Level level;
+ States_Control current_state;
+
+ _ISR_Disable( level );
+ current_state = the_thread->current_state;
+
+ if ( current_state & state ) {
+ current_state =
+ the_thread->current_state = _States_Clear( state, current_state );
+
+ if ( _States_Is_ready( current_state ) ) {
+
+ _Priority_Add_to_bit_map( &the_thread->Priority_map );
+
+ _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node);
+
+ _ISR_Flash( level );
+
+ if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
+ _Thread_Heir = the_thread;
+ if ( _Thread_Executing->is_preemptible ||
+ the_thread->current_priority == 0 )
+ _Context_Switch_necessary = TRUE;
+ }
+ }
+ }
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Set_state
+ *
+ * This kernel routine sets the requested state in the THREAD. The
+ * THREAD chain is adjusted if necessary.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ * state - state to be set
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select map
+ */
+
+void _Thread_Set_state(
+ Thread_Control *the_thread,
+ States_Control state
+)
+{
+ ISR_Level level;
+ Chain_Control *ready;
+
+ ready = the_thread->ready;
+ _ISR_Disable( level );
+ if ( !_States_Is_ready( the_thread->current_state ) ) {
+ the_thread->current_state =
+ _States_Set( state, the_thread->current_state );
+ _ISR_Enable( level );
+ return;
+ }
+
+ the_thread->current_state = state;
+
+ if ( _Chain_Has_only_one_node( ready ) ) {
+
+ _Chain_Initialize_empty( ready );
+ _Priority_Remove_from_bit_map( &the_thread->Priority_map );
+
+ } else
+ _Chain_Extract_unprotected( &the_thread->Object.Node );
+
+ _ISR_Flash( level );
+
+ if ( _Thread_Is_heir( the_thread ) )
+ _Thread_Calculate_heir();
+
+ if ( _Thread_Is_executing( the_thread ) )
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Set_transient
+ *
+ * This kernel routine places the requested thread in the transient state
+ * which will remove it from the ready queue, if necessary. No
+ * rescheduling is necessary because it is assumed that the transient
+ * state will be cleared before dispatching is enabled.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Thread_Set_transient(
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ unsigned32 old_state;
+ Chain_Control *ready;
+
+ ready = the_thread->ready;
+ _ISR_Disable( level );
+
+ old_state = the_thread->current_state;
+ the_thread->current_state = _States_Set( STATES_TRANSIENT, old_state );
+
+ if ( _States_Is_ready( old_state ) ) {
+ if ( _Chain_Has_only_one_node( ready ) ) {
+
+ _Chain_Initialize_empty( ready );
+ _Priority_Remove_from_bit_map( &the_thread->Priority_map );
+
+ } else
+ _Chain_Extract_unprotected( &the_thread->Object.Node );
+ }
+
+ _ISR_Enable( level );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Reset_timeslice
+ *
+ * This routine will remove the running thread from the ready chain
+ * and place it immediately at the rear of this chain and then the
+ * timeslice counter is reset. The heir THREAD will be updated if
+ * the running is also the currently the heir.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Reset_timeslice( void )
+{
+ ISR_Level level;
+ Thread_Control *executing;
+ Chain_Control *ready;
+
+ executing = _Thread_Executing;
+ ready = executing->ready;
+ _ISR_Disable( level );
+ if ( _Chain_Has_only_one_node( ready ) ) {
+ _ISR_Enable( level );
+ return;
+ }
+ _Chain_Extract_unprotected( &executing->Object.Node );
+ _Chain_Append_unprotected( ready, &executing->Object.Node );
+
+ _ISR_Flash( level );
+
+ if ( _Thread_Is_heir( executing ) )
+ _Thread_Heir = (Thread_Control *) ready->first;
+
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Tickle_timeslice
+ *
+ * This scheduler routine determines if timeslicing is enabled
+ * for the currently executing thread and, if so, updates the
+ * timeslice count and checks for timeslice expiration.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Tickle_timeslice( void )
+{
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ /*
+ * Increment the number of ticks this thread has been executing
+ */
+
+ executing->ticks_executed++;
+
+ /*
+ * If the thread is not preemptible or is not ready, then
+ * just return.
+ */
+
+ if ( !executing->is_preemptible )
+ return;
+
+ if ( !_States_Is_ready( executing->current_state ) )
+ return;
+
+ /*
+ * The cpu budget algorithm determines what happens next.
+ */
+
+ switch ( executing->budget_algorithm ) {
+ case THREAD_CPU_BUDGET_ALGORITHM_NONE:
+ break;
+
+ case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
+ case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
+ if ( --executing->cpu_time_budget == 0 ) {
+ _Thread_Reset_timeslice();
+ executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
+ }
+ break;
+
+ case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
+ if ( --executing->cpu_time_budget == 0 )
+ (*executing->budget_callout)( executing );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_Yield_processor
+ *
+ * This kernel routine will remove the running THREAD from the ready chain
+ * and place it immediatly at the rear of this chain. Reset timeslice
+ * and yield the processor functions both use this routine, therefore if
+ * reset is TRUE and this is the only thread on the chain then the
+ * timeslice counter is reset. The heir THREAD will be updated if the
+ * running is also the currently the heir.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Yield_processor( void )
+{
+ ISR_Level level;
+ Thread_Control *executing;
+ Chain_Control *ready;
+
+ executing = _Thread_Executing;
+ ready = executing->ready;
+ _ISR_Disable( level );
+ if ( !_Chain_Has_only_one_node( ready ) ) {
+ _Chain_Extract_unprotected( &executing->Object.Node );
+ _Chain_Append_unprotected( ready, &executing->Object.Node );
+
+ _ISR_Flash( level );
+
+ if ( _Thread_Is_heir( executing ) )
+ _Thread_Heir = (Thread_Control *) ready->first;
+ _Context_Switch_necessary = TRUE;
+ }
+ else if ( !_Thread_Is_heir( executing ) )
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Load_environment
+ *
+ * Load starting environment for another thread from its start area in the
+ * thread. Only called from t_restart and t_start.
+ *
+ * Input parameters:
+ * the_thread - thread control block pointer
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Load_environment(
+ Thread_Control *the_thread
+)
+{
+ boolean is_fp = FALSE;
+
+ if ( the_thread->Start.fp_context ) {
+ the_thread->fp_context = the_thread->Start.fp_context;
+ _Context_Initialize_fp( &the_thread->fp_context );
+ is_fp = TRUE;
+ }
+
+ the_thread->do_post_task_switch_extension = FALSE;
+ the_thread->is_preemptible = the_thread->Start.is_preemptible;
+ the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
+ the_thread->budget_callout = the_thread->Start.budget_callout;
+
+ _Context_Initialize(
+ &the_thread->Registers,
+ the_thread->Start.Initial_stack.area,
+ the_thread->Start.Initial_stack.size,
+ the_thread->Start.isr_level,
+ _Thread_Handler,
+ is_fp
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Handler
+ *
+ * This routine is the "primal" entry point for all threads.
+ * _Context_Initialize() dummies up the thread's initial context
+ * to cause the first Context_Switch() to jump to _Thread_Handler().
+ *
+ * This routine is the default thread exitted error handler. It is
+ * returned to when a thread exits. The configured fatal error handler
+ * is invoked to process the exit.
+ *
+ * NOTE:
+ *
+ * On entry, it is assumed all interrupts are blocked and that this
+ * routine needs to set the initial isr level. This may or may not
+ * actually be needed by the context switch routine and as a result
+ * interrupts may already be at there proper level. Either way,
+ * setting the initial isr level properly here is safe.
+ *
+ * Currently this is only really needed for the posix port,
+ * ref: _Context_Switch in unix/cpu.c
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Handler( void )
+{
+ ISR_Level level;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ /*
+ * have to put level into a register for those cpu's that use
+ * inline asm here
+ */
+
+ level = executing->Start.isr_level;
+ _ISR_Set_level(level);
+
+ /*
+ * Take care that 'begin' extensions get to complete before
+ * 'switch' extensions can run. This means must keep dispatch
+ * disabled until all 'begin' extensions complete.
+ */
+
+ _User_extensions_Thread_begin( executing );
+
+ /*
+ * At this point, the dispatch disable level BETTER be 1.
+ */
+
+ _Thread_Enable_dispatch();
+
+ switch ( executing->Start.prototype ) {
+ case THREAD_START_NUMERIC:
+ (*(Thread_Entry_numeric) executing->Start.entry_point)(
+ executing->Start.numeric_argument
+ );
+ break;
+ case THREAD_START_POINTER:
+ (*(Thread_Entry_pointer) executing->Start.entry_point)(
+ executing->Start.pointer_argument
+ );
+ break;
+ case THREAD_START_BOTH_POINTER_FIRST:
+ (*(Thread_Entry_both_pointer_first) executing->Start.entry_point)(
+ executing->Start.pointer_argument,
+ executing->Start.numeric_argument
+ );
+ break;
+ case THREAD_START_BOTH_NUMERIC_FIRST:
+ (*(Thread_Entry_both_numeric_first) executing->Start.entry_point)(
+ executing->Start.numeric_argument,
+ executing->Start.pointer_argument
+ );
+ break;
+ }
+
+ _User_extensions_Thread_exitted( executing );
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_THREAD_EXITTED
+ );
+}
+
+/*PAGE
+ *
+ * _Thread_Delay_ended
+ *
+ * This routine processes a thread whose delay period has ended.
+ * It is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Delay_ended(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+ _Thread_Unblock( the_thread );
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_Change_priority
+ *
+ * This kernel routine changes the priority of the thread. The
+ * thread chain is adjusted if necessary.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ * new_priority - ultimate priority
+ * prepend_it - TRUE if the thread should be prepended to the chain
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Change_priority(
+ Thread_Control *the_thread,
+ Priority_Control new_priority,
+ boolean prepend_it
+)
+{
+ ISR_Level level;
+ /* boolean do_prepend = FALSE; */
+
+ /*
+ * If this is a case where prepending the task to its priority is
+ * potentially desired, then we need to consider whether to do it.
+ * This usually occurs when a task lowers its priority implcitly as
+ * the result of losing inherited priority. Normal explicit priority
+ * change calls (e.g. rtems_task_set_priority) should always do an
+ * append not a prepend.
+ */
+
+ /*
+ * Techically, the prepend should conditional on the thread lowering
+ * its priority but that does allow cxd2004 of the acvc 2.0.1 to
+ * pass with rtems 4.0.0. This should change when gnat redoes its
+ * priority scheme.
+ */
+/*
+ if ( prepend_it &&
+ _Thread_Is_executing( the_thread ) &&
+ new_priority >= the_thread->current_priority )
+ prepend_it = TRUE;
+*/
+
+ _Thread_Set_transient( the_thread );
+
+ if ( the_thread->current_priority != new_priority )
+ _Thread_Set_priority( the_thread, new_priority );
+
+ _ISR_Disable( level );
+
+ the_thread->current_state =
+ _States_Clear( STATES_TRANSIENT, the_thread->current_state );
+
+ if ( ! _States_Is_ready( the_thread->current_state ) ) {
+ _ISR_Enable( level );
+ return;
+ }
+
+ _Priority_Add_to_bit_map( &the_thread->Priority_map );
+ if ( prepend_it )
+ _Chain_Prepend_unprotected( the_thread->ready, &the_thread->Object.Node );
+ else
+ _Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
+
+ _ISR_Flash( level );
+
+ _Thread_Calculate_heir();
+
+ if ( !_Thread_Is_executing_also_the_heir() &&
+ _Thread_Executing->is_preemptible )
+ _Context_Switch_necessary = TRUE;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Set_priority
+ *
+ * This directive enables and disables several modes of
+ * execution for the requesting thread.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread priority
+ * new_priority - new priority
+ *
+ * Output: NONE
+ */
+
+void _Thread_Set_priority(
+ Thread_Control *the_thread,
+ Priority_Control new_priority
+)
+{
+ the_thread->current_priority = new_priority;
+ the_thread->ready = &_Thread_Ready_chain[ new_priority ];
+
+ _Priority_Initialize_information( &the_thread->Priority_map, new_priority );
+}
+
+/*PAGE
+ *
+ * _Thread_Evaluate_mode
+ *
+ * XXX
+ */
+
+boolean _Thread_Evaluate_mode( void )
+{
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ if ( !_States_Is_ready( executing->current_state ) ||
+ ( !_Thread_Is_heir( executing ) && executing->is_preemptible ) ) {
+ _Context_Switch_necessary = TRUE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*PAGE
+ *
+ * _Thread_Get
+ *
+ * NOTE: If we are not using static inlines, this must be a real
+ * subroutine call.
+ *
+ * NOTE: XXX... This routine may be able to be optimized.
+ */
+
+#ifndef USE_INLINES
+
+Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ Objects_Classes the_class;
+ Objects_Information *information;
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
+ _Thread_Disable_dispatch();
+ *location = OBJECTS_LOCAL;
+ return( _Thread_Executing );
+ }
+
+ the_class = _Objects_Get_class( id );
+
+ if ( the_class > OBJECTS_CLASSES_LAST ) {
+ *location = OBJECTS_ERROR;
+ return (Thread_Control *) 0;
+ }
+
+ information = _Objects_Information_table[ the_class ];
+
+ if ( !information || !information->is_thread ) {
+ *location = OBJECTS_ERROR;
+ return (Thread_Control *) 0;
+ }
+
+ return (Thread_Control *) _Objects_Get( information, id, location );
+}
+
+#endif
+
+/*PAGE
+ *
+ * _Thread_Idle_body
+ *
+ * This kernel routine is the idle thread. The idle thread runs any time
+ * no other thread is ready to run. This thread loops forever with
+ * interrupts enabled.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE)
+Thread _Thread_Idle_body(
+ unsigned32 ignored
+)
+{
+ for( ; ; ) ;
+}
+#endif
diff --git a/c/src/exec/score/src/threadmp.c b/c/src/exec/score/src/threadmp.c
new file mode 100644
index 0000000000..c34d89d7bc
--- /dev/null
+++ b/c/src/exec/score/src/threadmp.c
@@ -0,0 +1,164 @@
+/*
+ * Multiprocessing Support for the Thread Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _Thread_MP_Handler_initialization
+ *
+ */
+
+void _Thread_MP_Handler_initialization (
+ unsigned32 maximum_proxies
+)
+{
+
+ _Chain_Initialize_empty( &_Thread_MP_Active_proxies );
+
+ if ( maximum_proxies == 0 ) {
+ _Chain_Initialize_empty( &_Thread_MP_Inactive_proxies );
+ return;
+ }
+
+
+ _Chain_Initialize(
+ &_Thread_MP_Inactive_proxies,
+ _Workspace_Allocate_or_fatal_error(
+ maximum_proxies * sizeof( Thread_Proxy_control )
+ ),
+ maximum_proxies,
+ sizeof( Thread_Proxy_control )
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_MP_Allocate_proxy
+ *
+ */
+
+Thread_Control *_Thread_MP_Allocate_proxy (
+ States_Control the_state
+)
+{
+ Thread_Control *the_thread;
+ Thread_Proxy_control *the_proxy;
+
+ the_thread = (Thread_Control *)_Chain_Get( &_Thread_MP_Inactive_proxies );
+
+ if ( !_Thread_Is_null( the_thread ) ) {
+
+ the_proxy = (Thread_Proxy_control *) the_thread;
+
+ _Thread_Executing->Wait.return_code = THREAD_STATUS_PROXY_BLOCKING;
+
+ the_proxy->receive_packet = _Thread_MP_Receive->receive_packet;
+
+ the_proxy->Object.id = _Thread_MP_Receive->receive_packet->source_tid;
+
+ the_proxy->current_priority =
+ _Thread_MP_Receive->receive_packet->source_priority;
+
+ the_proxy->current_state = _States_Set( STATES_DORMANT, the_state );
+
+ the_proxy->Wait = _Thread_Executing->Wait;
+
+ _Chain_Append( &_Thread_MP_Active_proxies, &the_proxy->Active );
+
+ return the_thread;
+ }
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_PROXIES
+ );
+
+ /*
+ * NOTE: The following return insures that the compiler will
+ * think that all paths return a value.
+ */
+
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_MP_Find_proxy
+ *
+ */
+
+/*
+ * The following macro provides the offset of the Active element
+ * in the Thread_Proxy_control structure. This is the logical
+ * equivalent of the POSITION attribute in Ada.
+ */
+
+#define _Thread_MP_Proxy_Active_offset \
+ ((unsigned32)&(((Thread_Proxy_control *)0))->Active)
+
+Thread_Control *_Thread_MP_Find_proxy (
+ Objects_Id the_id
+)
+{
+
+ Chain_Node *proxy_node;
+ Thread_Control *the_thread;
+ ISR_Level level;
+
+restart:
+
+ _ISR_Disable( level );
+
+ for ( proxy_node = _Thread_MP_Active_proxies.first;
+ !_Chain_Is_tail( &_Thread_MP_Active_proxies, proxy_node ) ;
+ ) {
+
+ the_thread = (Thread_Control *) _Addresses_Subtract_offset(
+ proxy_node,
+ _Thread_MP_Proxy_Active_offset
+ );
+
+ if ( _Objects_Are_ids_equal( the_thread->Object.id, the_id ) ) {
+ _ISR_Enable( level );
+ return the_thread;
+ }
+
+ _ISR_Flash( level );
+
+ proxy_node = proxy_node->next;
+
+ /*
+ * A proxy which is only dormant is not in a blocking state.
+ * Therefore, we are looking at proxy which has been moved from
+ * active to inactive chain (by an ISR) and need to restart
+ * the search.
+ */
+
+ if ( _States_Is_only_dormant( the_thread->current_state ) ) {
+ _ISR_Enable( level );
+ goto restart;
+ }
+ }
+
+ _ISR_Enable( level );
+ return NULL;
+}
diff --git a/c/src/exec/score/src/threadq.c b/c/src/exec/score/src/threadq.c
new file mode 100644
index 0000000000..b5039d719b
--- /dev/null
+++ b/c/src/exec/score/src/threadq.c
@@ -0,0 +1,967 @@
+/*
+ * Thread Queue Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+
+/*PAGE
+ *
+ * _Thread_queue_Initialize
+ *
+ * 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
+ * proxy_extract_callout - MP specific callout
+ * timeout_status - return on a timeout
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_queue_Initialize(
+ Thread_queue_Control *the_thread_queue,
+ Objects_Classes the_class,
+ Thread_queue_Disciplines the_discipline,
+ States_Control state,
+ 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->timeout_status = timeout_status;
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ switch ( the_discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ _Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++)
+ _Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
+ break;
+ }
+
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enqueue
+ *
+ * This routine blocks a thread, places it on a thread, and optionally
+ * starts a timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ * timeout - interval to wait
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Thread_queue_Enqueue(
+ Thread_queue_Control *the_thread_queue,
+ Watchdog_Interval timeout
+)
+{
+ Thread_Control *the_thread;
+
+ the_thread = _Thread_Executing;
+
+ 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 );
+
+ if ( timeout ) {
+ _Watchdog_Initialize(
+ &the_thread->Timer,
+ _Thread_queue_Timeout,
+ the_thread->Object.id,
+ NULL
+ );
+
+ _Watchdog_Insert_ticks( &the_thread->Timer, timeout );
+ }
+
+ switch( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ _Thread_queue_Enqueue_fifo( the_thread_queue, the_thread, timeout );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ _Thread_queue_Enqueue_priority( the_thread_queue, the_thread, timeout );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Dequeue
+ *
+ * This routine removes a thread from the specified threadq. If the
+ * threadq discipline is FIFO, it unblocks a thread, and cancels its
+ * timeout timer. Priority discipline is processed elsewhere.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ *
+ * Output parameters:
+ * returns - thread dequeued or NULL
+ *
+ * INTERRUPT LATENCY:
+ * check sync
+ */
+
+Thread_Control *_Thread_queue_Dequeue(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ Thread_Control *the_thread;
+
+ switch ( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ the_thread = _Thread_queue_Dequeue_fifo( the_thread_queue );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ the_thread = _Thread_queue_Dequeue_priority( the_thread_queue );
+ break;
+ default: /* this is only to prevent warnings */
+ the_thread = NULL;
+ break;
+ }
+
+ return( the_thread );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract_with_proxy
+ *
+ * This routine extracts the_thread from the_thread_queue
+ * and insures that if there is a proxy for this task on
+ * another node, it is also dealt with.
+ *
+ * XXX
+ */
+
+boolean _Thread_queue_Extract_with_proxy(
+ Thread_Control *the_thread
+)
+{
+ States_Control state;
+ Objects_Classes the_class;
+ Thread_queue_Extract_callout proxy_extract_callout;
+
+ 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 ) ) {
+
+ the_class = _Objects_Get_class( the_thread->Wait.id );
+
+ proxy_extract_callout = _Thread_queue_Extract_table[ the_class ];
+
+ if ( proxy_extract_callout )
+ (*proxy_extract_callout)( the_thread );
+ }
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract
+ *
+ * This routine removes a specific thread from the specified threadq,
+ * deletes any timeout, and unblocks the thread.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to a threadq header
+ * the_thread - pointer to a thread control block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY: NONE
+ */
+
+void _Thread_queue_Extract(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+)
+{
+ switch ( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ _Thread_queue_Extract_fifo( the_thread_queue, the_thread );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ _Thread_queue_Extract_priority( the_thread_queue, the_thread );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Flush
+ *
+ * This kernel routine flushes the given thread queue.
+ *
+ * Input parameters:
+ * 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,
+ 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 = status;
+ else
+ ( *remote_extract_callout )( the_thread );
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_First
+ *
+ * This routines returns a pointer to the first thread on the
+ * specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to thread queue
+ *
+ * Output parameters:
+ * returns - first thread or NULL
+ */
+
+Thread_Control *_Thread_queue_First(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ Thread_Control *the_thread;
+
+ switch ( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ the_thread = _Thread_queue_First_fifo( the_thread_queue );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ the_thread = _Thread_queue_First_priority( the_thread_queue );
+ break;
+ default: /* this is only to prevent warnings */
+ the_thread = NULL;
+ break;
+ }
+
+ return the_thread;
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Timeout
+ *
+ * This routine processes a thread which timeouts while waiting on
+ * a thread queue. It is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_queue_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Thread_Control *the_thread;
+ Thread_queue_Control *the_thread_queue;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+ the_thread_queue = the_thread->Wait.queue;
+
+ /*
+ * If the_thread_queue is not synchronized, then it is either
+ * "nothing happened", "timeout", or "satisfied". If the_thread
+ * is the executing thread, then it is in the process of blocking
+ * and it is the thread which is responsible for the synchronization
+ * process.
+ *
+ * If it is not satisfied, then it is "nothing happened" and
+ * this is the "timeout" transition. After a request is satisfied,
+ * a timeout is not allowed to occur.
+ */
+
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_SYNCHRONIZED &&
+ _Thread_Is_executing( the_thread ) ) {
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_SATISFIED )
+ the_thread_queue->sync_state = THREAD_QUEUE_TIMEOUT;
+ } else {
+ the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+ }
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enqueue_fifo
+ *
+ * This routine blocks a thread, places it on a thread, and optionally
+ * starts a timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ * the_thread - pointer to the thread to block
+ * timeout - interval to wait
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Thread_queue_Enqueue_fifo (
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+)
+{
+ ISR_Level level;
+ Thread_queue_States sync_state;
+
+ _ISR_Disable( level );
+
+ sync_state = the_thread_queue->sync_state;
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ switch ( sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ /*
+ * This should never happen. It indicates that someone did not
+ * enter a thread queue critical section.
+ */
+ break;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ _Chain_Append_unprotected(
+ &the_thread_queue->Queues.Fifo,
+ &the_thread->Object.Node
+ );
+ _ISR_Enable( level );
+ return;
+
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
+ _ISR_Enable( level );
+ break;
+
+ case THREAD_QUEUE_SATISFIED:
+ if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ } else
+ _ISR_Enable( level );
+ break;
+ }
+
+ /*
+ * Global objects with thread queue's should not be operated on from an
+ * ISR. But the sync code still must allow short timeouts to be processed
+ * correctly.
+ */
+
+ _Thread_Unblock( the_thread );
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Dequeue_fifo
+ *
+ * This routine removes a thread from the specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ *
+ * Output parameters:
+ * returns - thread dequeued or NULL
+ *
+ * INTERRUPT LATENCY:
+ * check sync
+ * FIFO
+ */
+
+Thread_Control *_Thread_queue_Dequeue_fifo(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ ISR_Level level;
+ Thread_Control *the_thread;
+
+ _ISR_Disable( level );
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) {
+
+ the_thread = (Thread_Control *)
+ _Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo );
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+
+ return the_thread;
+ }
+
+ switch ( the_thread_queue->sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ case THREAD_QUEUE_SATISFIED:
+ _ISR_Enable( level );
+ return NULL;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread_queue->sync_state = THREAD_QUEUE_SATISFIED;
+ _ISR_Enable( level );
+ return _Thread_Executing;
+ }
+ return NULL; /* this is only to prevent warnings */
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract_fifo
+ *
+ * This routine removes a specific thread from the specified threadq,
+ * deletes any timeout, and unblocks the thread.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to a threadq header
+ * the_thread - pointer to the thread to block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * EXTRACT_FIFO
+ */
+
+void _Thread_queue_Extract_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+
+ if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
+ _ISR_Enable( level );
+ return;
+ }
+
+ _Chain_Extract_unprotected( &the_thread->Object.Node );
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ }
+
+ _Thread_Unblock( the_thread );
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+
+}
+
+/*PAGE
+ *
+ * _Thread_queue_First_fifo
+ *
+ * This routines returns a pointer to the first thread on the
+ * specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ *
+ * Output parameters:
+ * returns - first thread or NULL
+ */
+
+Thread_Control *_Thread_queue_First_fifo(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
+ return (Thread_Control *) the_thread_queue->Queues.Fifo.first;
+
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enqueue_priority
+ *
+ * This routine blocks a thread, places it on a thread, and optionally
+ * starts a timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ * thread - thread to insert
+ * timeout - timeout interval in ticks
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * forward less than
+ * forward equal
+ */
+
+void _Thread_queue_Enqueue_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+)
+{
+ Priority_Control search_priority;
+ Thread_Control *search_thread;
+ ISR_Level level;
+ Chain_Control *header;
+ unsigned32 header_index;
+ Chain_Node *the_node;
+ Chain_Node *next_node;
+ Chain_Node *previous_node;
+ Chain_Node *search_node;
+ Priority_Control priority;
+ States_Control block_state;
+ Thread_queue_States sync_state;
+
+ _Chain_Initialize_empty( &the_thread->Wait.Block2n );
+
+ priority = the_thread->current_priority;
+ header_index = _Thread_queue_Header_number( priority );
+ header = &the_thread_queue->Queues.Priority[ header_index ];
+ block_state = the_thread_queue->state;
+
+ if ( _Thread_queue_Is_reverse_search( priority ) )
+ goto restart_reverse_search;
+
+restart_forward_search:
+ search_priority = PRIORITY_MINIMUM - 1;
+ _ISR_Disable( level );
+ search_thread = (Thread_Control *) header->first;
+ while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
+ search_priority = search_thread->current_priority;
+ if ( priority <= search_priority )
+ break;
+
+#if ( CPU_UNROLL_ENQUEUE_PRIORITY == TRUE )
+ search_thread = (Thread_Control *) search_thread->Object.Node.next;
+ if ( _Chain_Is_tail( header, (Chain_Node *)search_thread ) )
+ break;
+ search_priority = search_thread->current_priority;
+ if ( priority <= search_priority )
+ break;
+#endif
+ _ISR_Flash( level );
+ if ( !_States_Are_set( search_thread->current_state, block_state) ) {
+ _ISR_Enable( level );
+ goto restart_forward_search;
+ }
+ search_thread =
+ (Thread_Control *)search_thread->Object.Node.next;
+ }
+
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_NOTHING_HAPPENED )
+ goto synchronize;
+
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ if ( priority == search_priority )
+ goto equal_priority;
+
+ search_node = (Chain_Node *) search_thread;
+ previous_node = search_node->previous;
+ the_node = (Chain_Node *) the_thread;
+
+ the_node->next = search_node;
+ the_node->previous = previous_node;
+ previous_node->next = the_node;
+ search_node->previous = the_node;
+ _ISR_Enable( level );
+ return;
+
+restart_reverse_search:
+ search_priority = PRIORITY_MAXIMUM + 1;
+
+ _ISR_Disable( level );
+ search_thread = (Thread_Control *) header->last;
+ while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
+ search_priority = search_thread->current_priority;
+ if ( priority >= search_priority )
+ break;
+#if ( CPU_UNROLL_ENQUEUE_PRIORITY == TRUE )
+ search_thread = (Thread_Control *) search_thread->Object.Node.previous;
+ if ( _Chain_Is_head( header, (Chain_Node *)search_thread ) )
+ break;
+ search_priority = search_thread->current_priority;
+ if ( priority >= search_priority )
+ break;
+#endif
+ _ISR_Flash( level );
+ if ( !_States_Are_set( search_thread->current_state, block_state) ) {
+ _ISR_Enable( level );
+ goto restart_reverse_search;
+ }
+ search_thread = (Thread_Control *)
+ search_thread->Object.Node.previous;
+ }
+
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_NOTHING_HAPPENED )
+ goto synchronize;
+
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ if ( priority == search_priority )
+ goto equal_priority;
+
+ search_node = (Chain_Node *) search_thread;
+ next_node = search_node->next;
+ the_node = (Chain_Node *) the_thread;
+
+ the_node->next = next_node;
+ the_node->previous = search_node;
+ search_node->next = the_node;
+ next_node->previous = the_node;
+ _ISR_Enable( level );
+ return;
+
+equal_priority: /* add at end of priority group */
+ search_node = _Chain_Tail( &search_thread->Wait.Block2n );
+ previous_node = search_node->previous;
+ the_node = (Chain_Node *) the_thread;
+
+ the_node->next = search_node;
+ the_node->previous = previous_node;
+ previous_node->next = the_node;
+ search_node->previous = the_node;
+ _ISR_Enable( level );
+ return;
+
+synchronize:
+
+ sync_state = the_thread_queue->sync_state;
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ switch ( sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ /*
+ * This should never happen. It indicates that someone did not
+ * enter a thread queue critical section.
+ */
+ break;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ /*
+ * This should never happen. All of this was dealt with above.
+ */
+ break;
+
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
+ _ISR_Enable( level );
+ break;
+
+ case THREAD_QUEUE_SATISFIED:
+ if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ } else
+ _ISR_Enable( level );
+ break;
+ }
+
+ /*
+ * Global objects with thread queue's should not be operated on from an
+ * ISR. But the sync code still must allow short timeouts to be processed
+ * correctly.
+ */
+
+ _Thread_Unblock( the_thread );
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Dequeue_priority
+ *
+ * This routine removes a thread from the specified PRIORITY based
+ * threadq, unblocks it, and cancels its timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to thread queue
+ *
+ * Output parameters:
+ * returns - thread dequeued or NULL
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+Thread_Control *_Thread_queue_Dequeue_priority(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ unsigned32 index;
+ ISR_Level level;
+ Thread_Control *the_thread = NULL; /* just to remove warnings */
+ Thread_Control *new_first_thread;
+ Chain_Node *new_first_node;
+ Chain_Node *new_second_node;
+ Chain_Node *last_node;
+ Chain_Node *next_node;
+ Chain_Node *previous_node;
+
+ _ISR_Disable( level );
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++ ) {
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
+ the_thread = (Thread_Control *)
+ the_thread_queue->Queues.Priority[ index ].first;
+ goto dequeue;
+ }
+ }
+
+ switch ( the_thread_queue->sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ case THREAD_QUEUE_SATISFIED:
+ _ISR_Enable( level );
+ return NULL;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread_queue->sync_state = THREAD_QUEUE_SATISFIED;
+ _ISR_Enable( level );
+ return _Thread_Executing;
+ }
+
+dequeue:
+ new_first_node = the_thread->Wait.Block2n.first;
+ new_first_thread = (Thread_Control *) new_first_node;
+ next_node = the_thread->Object.Node.next;
+ previous_node = the_thread->Object.Node.previous;
+
+ if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
+ last_node = the_thread->Wait.Block2n.last;
+ new_second_node = new_first_node->next;
+
+ previous_node->next = new_first_node;
+ next_node->previous = new_first_node;
+ new_first_node->next = next_node;
+ new_first_node->previous = previous_node;
+
+ if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
+ /* > two threads on 2-n */
+ new_second_node->previous =
+ _Chain_Head( &new_first_thread->Wait.Block2n );
+
+ new_first_thread->Wait.Block2n.first = new_second_node;
+ new_first_thread->Wait.Block2n.last = last_node;
+
+ last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n );
+ }
+ } else {
+ previous_node->next = next_node;
+ next_node->previous = previous_node;
+ }
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+ return( the_thread );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract_priority
+ *
+ * This routine removes a specific thread from the specified threadq,
+ * deletes any timeout, and unblocks the thread.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to a threadq header
+ * the_thread - pointer to a thread control block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * EXTRACT_PRIORITY
+ */
+
+void _Thread_queue_Extract_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ Chain_Node *the_node;
+ Chain_Node *next_node;
+ Chain_Node *previous_node;
+ Thread_Control *new_first_thread;
+ Chain_Node *new_first_node;
+ Chain_Node *new_second_node;
+ Chain_Node *last_node;
+
+ the_node = (Chain_Node *) the_thread;
+ _ISR_Disable( level );
+ if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
+ next_node = the_node->next;
+ previous_node = the_node->previous;
+
+ if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
+ new_first_node = the_thread->Wait.Block2n.first;
+ new_first_thread = (Thread_Control *) new_first_node;
+ last_node = the_thread->Wait.Block2n.last;
+ new_second_node = new_first_node->next;
+
+ previous_node->next = new_first_node;
+ next_node->previous = new_first_node;
+ new_first_node->next = next_node;
+ new_first_node->previous = previous_node;
+
+ if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
+ /* > two threads on 2-n */
+ new_second_node->previous =
+ _Chain_Head( &new_first_thread->Wait.Block2n );
+ new_first_thread->Wait.Block2n.first = new_second_node;
+
+ new_first_thread->Wait.Block2n.last = last_node;
+ last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n );
+ }
+ } else {
+ previous_node->next = next_node;
+ next_node->previous = previous_node;
+ }
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+ }
+ else
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_First_priority
+ *
+ * This routines returns a pointer to the first thread on the
+ * specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to thread queue
+ *
+ * Output parameters:
+ * returns - first thread or NULL
+ */
+
+Thread_Control *_Thread_queue_First_priority (
+ Thread_queue_Control *the_thread_queue
+)
+{
+ unsigned32 index;
+
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++ ) {
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) )
+ return (Thread_Control *)
+ the_thread_queue->Queues.Priority[ index ].first;
+ }
+ return NULL;
+}
diff --git a/c/src/exec/score/src/tod.c b/c/src/exec/score/src/tod.c
new file mode 100644
index 0000000000..5cc9031024
--- /dev/null
+++ b/c/src/exec/score/src/tod.c
@@ -0,0 +1,238 @@
+/*
+ * Time of Day (TOD) Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _TOD_Handler_initialization
+ *
+ * This routine initializes the time of day handler.
+ *
+ * Input parameters:
+ * microseconds_per_tick - microseconds between clock ticks
+ *
+ * Output parameters: NONE
+ */
+
+void _TOD_Handler_initialization(
+ unsigned32 microseconds_per_tick
+)
+{
+ _TOD_Microseconds_per_tick = microseconds_per_tick;
+
+ _TOD_Seconds_since_epoch = 0;
+
+ _TOD_Current.year = TOD_BASE_YEAR;
+ _TOD_Current.month = 1;
+ _TOD_Current.day = 1;
+ _TOD_Current.hour = 0;
+ _TOD_Current.minute = 0;
+ _TOD_Current.second = 0;
+ _TOD_Current.ticks = 0;
+
+ if ( microseconds_per_tick == 0 )
+ _TOD_Ticks_per_second = 0;
+ else
+ _TOD_Ticks_per_second =
+ TOD_MICROSECONDS_PER_SECOND / microseconds_per_tick;
+
+ _Watchdog_Initialize( &_TOD_Seconds_watchdog, _TOD_Tickle, 0, NULL );
+
+ _TOD_Is_set = FALSE;
+ _TOD_Activate( _TOD_Ticks_per_second );
+}
+
+/*PAGE
+ *
+ * _TOD_Set
+ *
+ * This rountine sets the current date and time with the specified
+ * new date and time structure.
+ *
+ * Input parameters:
+ * the_tod - pointer to the time and date structure
+ * seconds_since_epoch - seconds since system epoch
+ *
+ * Output parameters: NONE
+ */
+
+void _TOD_Set(
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
+)
+{
+ Watchdog_Interval ticks_until_next_second;
+
+ _Thread_Disable_dispatch();
+ _TOD_Deactivate();
+
+ if ( seconds_since_epoch < _TOD_Seconds_since_epoch )
+ _Watchdog_Adjust_seconds( WATCHDOG_BACKWARD,
+ _TOD_Seconds_since_epoch - seconds_since_epoch );
+ else
+ _Watchdog_Adjust_seconds( WATCHDOG_FORWARD,
+ seconds_since_epoch - _TOD_Seconds_since_epoch );
+
+ ticks_until_next_second = _TOD_Ticks_per_second;
+ if ( ticks_until_next_second > _TOD_Current.ticks )
+ ticks_until_next_second -= _TOD_Current.ticks;
+
+ _TOD_Current = *the_tod;
+ _TOD_Seconds_since_epoch = seconds_since_epoch;
+ _TOD_Is_set = TRUE;
+ _TOD_Activate( ticks_until_next_second );
+
+ _Thread_Enable_dispatch();
+}
+
+/*PAGE
+ *
+ * _TOD_Validate
+ *
+ * This kernel routine checks the validity of a date and time structure.
+ *
+ * Input parameters:
+ * the_tod - pointer to a time and date structure
+ *
+ * Output parameters:
+ * 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.
+ */
+
+boolean _TOD_Validate(
+ TOD_Control *the_tod
+)
+{
+ unsigned32 days_in_month;
+
+ if ((the_tod->ticks >= _TOD_Ticks_per_second) ||
+ (the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
+ (the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
+ (the_tod->hour >= TOD_HOURS_PER_DAY) ||
+ (the_tod->month == 0) ||
+ (the_tod->month > TOD_MONTHS_PER_YEAR) ||
+ (the_tod->year < TOD_BASE_YEAR) ||
+ (the_tod->day == 0) )
+ return FALSE;
+
+ if ( (the_tod->year % 4) == 0 )
+ days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
+ else
+ days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
+
+ if ( the_tod->day > days_in_month )
+ return FALSE;
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _TOD_To_seconds
+ *
+ * This routine returns the seconds from the epoch until the
+ * current date and time.
+ *
+ * Input parameters:
+ * the_tod - pointer to the time and date structure
+ *
+ * Output parameters:
+ * returns - seconds since epoch until the_tod
+ */
+
+unsigned32 _TOD_To_seconds(
+ TOD_Control *the_tod
+)
+{
+ unsigned32 time;
+ unsigned32 year_mod_4;
+
+ time = the_tod->day - 1;
+ year_mod_4 = the_tod->year & 3;
+
+ if ( year_mod_4 == 0 )
+ time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
+ else
+ time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
+
+ time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
+ ( (TOD_DAYS_PER_YEAR * 4) + 1);
+
+ time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
+
+ time *= TOD_SECONDS_PER_DAY;
+
+ time += ((the_tod->hour * TOD_MINUTES_PER_HOUR) + the_tod->minute)
+ * TOD_SECONDS_PER_MINUTE;
+
+ time += the_tod->second;
+
+ return( time );
+}
+
+/*PAGE
+ *
+ * _TOD_Tickle
+ *
+ * This routine updates the calendar time and tickles the
+ * per second watchdog timer chain.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine only works for leap-years through 2099.
+ */
+
+void _TOD_Tickle(
+ Objects_Id id,
+ void *ignored
+)
+{
+ unsigned32 leap;
+
+ _TOD_Current.ticks = 0;
+ ++_TOD_Seconds_since_epoch;
+ if ( ++_TOD_Current.second >= TOD_SECONDS_PER_MINUTE ) {
+ _TOD_Current.second = 0;
+ if ( ++_TOD_Current.minute >= TOD_MINUTES_PER_HOUR ) {
+ _TOD_Current.minute = 0;
+ if ( ++_TOD_Current.hour >= TOD_HOURS_PER_DAY ) {
+ _TOD_Current.hour = 0;
+ if ( _TOD_Current.year & 0x3 ) leap = 0;
+ else leap = 1;
+ if ( ++_TOD_Current.day >
+ _TOD_Days_per_month[ leap ][ _TOD_Current.month ]) {
+ _TOD_Current.day = 1;
+ if ( ++_TOD_Current.month > TOD_MONTHS_PER_YEAR ) {
+ _TOD_Current.month = 1;
+ _TOD_Current.year++;
+ }
+ }
+ }
+ }
+ }
+
+ _Watchdog_Tickle_seconds();
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, _TOD_Ticks_per_second );
+}
diff --git a/c/src/exec/score/src/userext.c b/c/src/exec/score/src/userext.c
new file mode 100644
index 0000000000..868be5578f
--- /dev/null
+++ b/c/src/exec/score/src/userext.c
@@ -0,0 +1,204 @@
+/*
+ * User Extension Handler
+ *
+ * NOTE: XXX
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/userext.h>
+
+/*PAGE
+ *
+ * _User_extensions_Thread_create
+ */
+
+boolean _User_extensions_Thread_create (
+ Thread_Control *the_thread
+)
+{
+ Chain_Node *the_node;
+ User_extensions_Control *the_extension;
+ boolean status;
+
+ 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.thread_create != NULL ) {
+ status = (*the_extension->Callouts.thread_create)(
+ _Thread_Executing,
+ the_thread
+ );
+ if ( !status )
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_delete
+ */
+
+void _User_extensions_Thread_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.thread_delete != NULL )
+ (*the_extension->Callouts.thread_delete)(
+ _Thread_Executing,
+ the_thread
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_start
+ *
+ */
+
+void _User_extensions_Thread_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.thread_start != NULL )
+ (*the_extension->Callouts.thread_start)(
+ _Thread_Executing,
+ the_thread
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_restart
+ *
+ */
+
+void _User_extensions_Thread_restart (
+ 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.thread_restart != NULL )
+ (*the_extension->Callouts.thread_restart)(
+ _Thread_Executing,
+ the_thread
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_begin
+ *
+ */
+
+void _User_extensions_Thread_begin (
+ 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.thread_begin != NULL )
+ (*the_extension->Callouts.thread_begin)( executing );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_exitted
+ */
+
+void _User_extensions_Thread_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.thread_exitted != NULL )
+ (*the_extension->Callouts.thread_exitted)( executing );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Fatal
+ */
+
+void _User_extensions_Fatal (
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ 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_source, is_internal, the_error );
+ }
+}
+
+
diff --git a/c/src/exec/score/src/watchdog.c b/c/src/exec/score/src/watchdog.c
new file mode 100644
index 0000000000..67aaf267e9
--- /dev/null
+++ b/c/src/exec/score/src/watchdog.c
@@ -0,0 +1,273 @@
+/*
+ * Watchdog Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _Watchdog_Handler_initialization
+ *
+ * This routine initializes the watchdog handler.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Watchdog_Handler_initialization( void )
+{
+ _Watchdog_Sync_count = 0;
+ _Watchdog_Sync_level = 0;
+ _Watchdog_Ticks_since_boot = 0;
+
+ _Chain_Initialize_empty( &_Watchdog_Ticks_chain );
+ _Chain_Initialize_empty( &_Watchdog_Seconds_chain );
+}
+
+/*PAGE
+ *
+ * _Watchdog_Remove
+ *
+ * The routine removes a watchdog from a delta chain and updates
+ * the delta counters of the remaining watchdogs.
+ */
+
+Watchdog_States _Watchdog_Remove(
+ Watchdog_Control *the_watchdog
+)
+{
+ ISR_Level level;
+ Watchdog_States previous_state;
+ Watchdog_Control *next_watchdog;
+
+ _ISR_Disable( level );
+ previous_state = the_watchdog->state;
+ switch ( previous_state ) {
+ case WATCHDOG_INACTIVE:
+ break;
+
+ case WATCHDOG_BEING_INSERTED:
+
+ /*
+ * It is not actually on the chain so just change the state and
+ * the Insert operation we interrupted will be aborted.
+ */
+ the_watchdog->state = WATCHDOG_INACTIVE;
+ break;
+
+ case WATCHDOG_ACTIVE:
+ case WATCHDOG_REMOVE_IT:
+
+ the_watchdog->state = WATCHDOG_INACTIVE;
+ next_watchdog = _Watchdog_Next( the_watchdog );
+
+ if ( _Watchdog_Next(next_watchdog) )
+ next_watchdog->delta_interval += the_watchdog->delta_interval;
+
+ if ( _Watchdog_Sync_count )
+ _Watchdog_Sync_level = _ISR_Nest_level;
+
+ _Chain_Extract_unprotected( &the_watchdog->Node );
+ break;
+ }
+ the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
+
+ _ISR_Enable( level );
+ return( previous_state );
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust
+ *
+ * This routine adjusts the delta chain backward or forward in response
+ * to a time change.
+ *
+ * Input parameters:
+ * header - pointer to the delta chain to be adjusted
+ * direction - forward or backward adjustment to delta chain
+ * units - units to adjust
+ *
+ * Output parameters:
+ */
+
+void _Watchdog_Adjust(
+ Chain_Control *header,
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+ if ( !_Chain_Is_empty( header ) ) {
+ switch ( direction ) {
+ case WATCHDOG_BACKWARD:
+ _Watchdog_First( header )->delta_interval += units;
+ break;
+ case WATCHDOG_FORWARD:
+ while ( units ) {
+ if ( units < _Watchdog_First( header )->delta_interval ) {
+ _Watchdog_First( header )->delta_interval -= units;
+ break;
+ } else {
+ units -= _Watchdog_First( header )->delta_interval;
+ _Watchdog_First( header )->delta_interval = 1;
+ _Watchdog_Tickle( header );
+ if ( _Chain_Is_empty( header ) )
+ break;
+ }
+ }
+ break;
+ }
+ }
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert
+ *
+ * This routine inserts a watchdog timer on to the appropriate delta
+ * chain while updating the delta interval counters.
+ */
+
+void _Watchdog_Insert(
+ Chain_Control *header,
+ Watchdog_Control *the_watchdog
+)
+{
+ ISR_Level level;
+ Watchdog_Control *after;
+ unsigned32 insert_isr_nest_level;
+ Watchdog_Interval delta_interval;
+
+
+ insert_isr_nest_level = _ISR_Nest_level;
+ the_watchdog->state = WATCHDOG_BEING_INSERTED;
+
+ _Watchdog_Sync_count++;
+restart:
+ delta_interval = the_watchdog->initial;
+
+ _ISR_Disable( level );
+
+ for ( after = _Watchdog_First( header ) ;
+ ;
+ after = _Watchdog_Next( after ) ) {
+
+ if ( delta_interval == 0 || !_Watchdog_Next( after ) )
+ break;
+
+ if ( delta_interval < after->delta_interval ) {
+ after->delta_interval -= delta_interval;
+ break;
+ }
+
+ delta_interval -= after->delta_interval;
+
+ /*
+ * If you experience problems comment out the _ISR_Flash line.
+ * 3.2.0 was the first release with this critical section redesigned.
+ * Under certain circumstances, the PREVIOUS critical section algorithm
+ * used around this flash point allowed interrupts to execute
+ * which violated the design assumptions. The critical section
+ * mechanism used here WAS redesigned to address this.
+ */
+
+ _ISR_Flash( level );
+
+ if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
+ goto exit_insert;
+ }
+
+ if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
+ _Watchdog_Sync_level = insert_isr_nest_level;
+ _ISR_Enable( level );
+ goto restart;
+ }
+ }
+
+ _Watchdog_Activate( the_watchdog );
+
+ the_watchdog->delta_interval = delta_interval;
+
+ _Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
+
+ the_watchdog->start_time = _Watchdog_Ticks_since_boot;
+
+exit_insert:
+ _Watchdog_Sync_level = insert_isr_nest_level;
+ _Watchdog_Sync_count--;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle
+ *
+ * This routine decrements the delta counter in response to a tick. The
+ * delta chain is updated accordingly.
+ *
+ * Input parameters:
+ * header - pointer to the delta chain to be tickled
+ *
+ * Output parameters: NONE
+ */
+
+void _Watchdog_Tickle(
+ Chain_Control *header
+)
+{
+ Watchdog_Control *the_watchdog;
+
+ if ( _Chain_Is_empty( header ) )
+ return;
+
+ the_watchdog = _Watchdog_First( header );
+ the_watchdog->delta_interval--;
+ if ( the_watchdog->delta_interval != 0 )
+ return;
+
+ do {
+ switch( _Watchdog_Remove( the_watchdog ) ) {
+ case WATCHDOG_ACTIVE:
+ (*the_watchdog->routine)(
+ the_watchdog->id,
+ the_watchdog->user_data
+ );
+ break;
+
+ case WATCHDOG_INACTIVE:
+ /*
+ * This state indicates that the watchdog is not on any chain.
+ * Thus, it is NOT on a chain being tickled. This case should
+ * never occur.
+ */
+ break;
+
+ case WATCHDOG_BEING_INSERTED:
+ /*
+ * This state indicates that the watchdog is in the process of
+ * BEING inserted on the chain. Thus, it can NOT be on a chain
+ * being tickled. This case should never occur.
+ */
+ break;
+
+ case WATCHDOG_REMOVE_IT:
+ break;
+ }
+ the_watchdog = _Watchdog_First( header );
+ } while ( !_Chain_Is_empty( header ) &&
+ (the_watchdog->delta_interval == 0) );
+}
diff --git a/c/src/exec/score/src/wkspace.c b/c/src/exec/score/src/wkspace.c
new file mode 100644
index 0000000000..b5c760c8b2
--- /dev/null
+++ b/c/src/exec/score/src/wkspace.c
@@ -0,0 +1,88 @@
+/*
+ * Workspace Handler
+ *
+ * XXX
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/interr.h>
+
+/*PAGE
+ *
+ * _Workspace_Handler_initialization
+ */
+
+void _Workspace_Handler_initialization(
+ void *starting_address,
+ unsigned32 size
+)
+{
+ unsigned32 *zero_out_array;
+ unsigned32 index;
+ unsigned32 memory_available;
+
+ 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 ;
+ index < size / sizeof( unsigned32 ) ;
+ index++ )
+ zero_out_array[ index ] = 0;
+ }
+
+ memory_available = _Heap_Initialize(
+ &_Workspace_Area,
+ starting_address,
+ size,
+ CPU_HEAP_ALIGNMENT
+ );
+
+ if ( memory_available == 0 )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
+ );
+}
+
+/*PAGE
+ *
+ * _Workspace_Allocate_or_fatal_error
+ *
+ */
+
+void *_Workspace_Allocate_or_fatal_error(
+ unsigned32 size
+)
+{
+ void *memory;
+
+ memory = _Workspace_Allocate( size );
+
+ if ( memory == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_WORKSPACE_ALLOCATION
+ );
+
+ return memory;
+}
diff --git a/c/src/exec/score/tools/Makefile.in b/c/src/exec/score/tools/Makefile.in
new file mode 100644
index 0000000000..185bdbb5e0
--- /dev/null
+++ b/c/src/exec/score/tools/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=generic $(wildcard $(RTEMS_CPU))
diff --git a/c/src/exec/score/tools/generic/Makefile.in b/c/src/exec/score/tools/generic/Makefile.in
new file mode 100644
index 0000000000..f673545ea1
--- /dev/null
+++ b/c/src/exec/score/tools/generic/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+# RTEMS build tools
+# NOTE: of course we can't use any of these tools
+# in this Makefile. Most notably: install-if-change
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/bin
+
+PGMS=size_rtems
+
+INSTALLED=$(PGMS:%=$(DESTDIR)/%)
+
+all: $(DESTDIR) $(PGMS) install
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
diff --git a/c/src/exec/score/tools/hppa1.1/Makefile.in b/c/src/exec/score/tools/hppa1.1/Makefile.in
new file mode 100644
index 0000000000..0ca40be647
--- /dev/null
+++ b/c/src/exec/score/tools/hppa1.1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# we use host compiler here for genoffsets. Hopefully it has same alignment!!
+USE_HOST_COMPILER=yes
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=genoffsets
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PGMS=${ARCH}/genoffsets
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+# We use files that have not been installed yet.
+CPU_DIR=../../cpu/$(RTEMS_CPU)
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I$(PROJECT_RELEASE)/include \
+ -I$(CPU_DIR)
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here.
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) preinstall $(PGMS)
+ $(INSTALL) -m 555 ${PGMS} ${PROJECT_RELEASE}/bin
+
+# Hack
+# we are #including files that haven't been installed yet.
+# Make sure they are available in the src tree (ie: checked
+# out from SCCS or RCS)
+preinstall: FORCEIT
+ cd $(CPU_DIR); $(MAKE) install-headers
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/c/src/exec/score/tools/hppa1.1/genoffsets.c b/c/src/exec/score/tools/hppa1.1/genoffsets.c
new file mode 100644
index 0000000000..44a31bc7b0
--- /dev/null
+++ b/c/src/exec/score/tools/hppa1.1/genoffsets.c
@@ -0,0 +1,348 @@
+/*
+ * genoffsets.c
+ *
+ * This file generates the offsets.h for the HP PA-RISC port of RTEMS.
+ *
+ * NOTE: It only prints the offset for structures actually used
+ * by the assembly code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+
+#if defined(__hpux__) && defined(__hppa__)
+#include <rtems/system.h>
+#endif
+
+void print_information( void );
+
+int main(
+ int argc,
+ char **argv
+)
+{
+#if defined(__hpux__) && defined(__hppa__)
+ unsigned int size = 0;
+#endif
+
+ /*
+ * Print the file header
+ */
+
+printf(
+ "/* offsets.h\n"
+ " *\n"
+ " * This include file contains the offsets of elements in the\n"
+ " * C data structures used by the assembly language code for the\n"
+ " * HP PA-RISC 1.1 port of RTEMS.\n"
+ " *\n"
+ " * NOTE: THIS FILE IS AUTOMATICALLY GENERATED!!!!\n"
+ " * DO NOT EDIT THIS BY HAND!!!!\n"
+ " *\n"
+ " * COPYRIGHT (c) 1989-1997.\n"
+ " * On-Line Applications Research Corporation (OAR).\n"
+ " * Copyright assigned to U.S. Government, 1994.\n"
+ " *\n"
+ " * The license and distribution terms for this file may in\n"
+ " * the file LICENSE in this distribution or at\n"
+ " * http://www.OARcorp.com/rtems/license.html.\n"
+ " */\n"
+ "\n"
+ "#ifndef __OFFSETS_h\n"
+ "#define __OFFSETS_h\n"
+ "\n"
+);
+
+#define PRINT_IT( STRING, TYPE, FIELD ) \
+ printf( "#define\t%s\t0x%p\t\t/* %d */\n", \
+ STRING, \
+ &((TYPE)0)->FIELD, \
+ (int) &((TYPE)0)->FIELD );
+
+#define PRINT_SIZE( STRING, item ) \
+ printf( "#ifdef ASM\n#define\t%s\t%d\t\t/* 0x%x */\n#endif\n", \
+ STRING, \
+ sizeof(item), \
+ sizeof(item) );
+
+#define PRINT_COMMENT( STRING ) \
+ printf( \
+ "\n" \
+ "/*\n" \
+ " * " STRING "\n" \
+ " */\n" \
+ "\n" \
+ );
+
+#if defined(__hpux__) && defined(__hppa__)
+
+/*
+ * Offsets of elements in the Context_control structure.
+ */
+
+ PRINT_COMMENT("Context_Control information");
+
+ PRINT_IT( "FLAGS_OFFSET", Context_Control *, flags );
+ PRINT_IT( "R1_OFFSET", Context_Control *, gr1 );
+ PRINT_IT( "R2_OFFSET", Context_Control *, gr2 );
+ PRINT_IT( "R3_OFFSET", Context_Control *, gr3 );
+ PRINT_IT( "R4_OFFSET", Context_Control *, gr4 );
+ PRINT_IT( "R5_OFFSET", Context_Control *, gr5 );
+ PRINT_IT( "R6_OFFSET", Context_Control *, gr6 );
+ PRINT_IT( "R7_OFFSET", Context_Control *, gr7 );
+ PRINT_IT( "R8_OFFSET", Context_Control *, gr8 );
+ PRINT_IT( "R9_OFFSET", Context_Control *, gr9 );
+ PRINT_IT( "R10_OFFSET", Context_Control *, gr10 );
+ PRINT_IT( "R11_OFFSET", Context_Control *, gr11 );
+ PRINT_IT( "R12_OFFSET", Context_Control *, gr12 );
+ PRINT_IT( "R13_OFFSET", Context_Control *, gr13 );
+ PRINT_IT( "R14_OFFSET", Context_Control *, gr14 );
+ PRINT_IT( "R15_OFFSET", Context_Control *, gr15 );
+ PRINT_IT( "R16_OFFSET", Context_Control *, gr16 );
+ PRINT_IT( "R17_OFFSET", Context_Control *, gr17 );
+ PRINT_IT( "R18_OFFSET", Context_Control *, gr18 );
+ PRINT_IT( "R19_OFFSET", Context_Control *, gr19 );
+ PRINT_IT( "R20_OFFSET", Context_Control *, gr20 );
+ PRINT_IT( "R21_OFFSET", Context_Control *, gr21 );
+ PRINT_IT( "R22_OFFSET", Context_Control *, gr22 );
+ PRINT_IT( "R23_OFFSET", Context_Control *, gr23 );
+ PRINT_IT( "R24_OFFSET", Context_Control *, gr24 );
+ PRINT_IT( "R25_OFFSET", Context_Control *, gr25 );
+ PRINT_IT( "R26_OFFSET", Context_Control *, gr26 );
+ PRINT_IT( "R27_OFFSET", Context_Control *, gr27 );
+ PRINT_IT( "R28_OFFSET", Context_Control *, gr28 );
+ PRINT_IT( "R29_OFFSET", Context_Control *, gr29 );
+ PRINT_IT( "R30_OFFSET", Context_Control *, sp );
+ PRINT_IT( "R31_OFFSET", Context_Control *, gr31 );
+
+ /*
+ * And common aliases for the above
+ */
+
+ PRINT_COMMENT("Common aliases for above");
+
+ PRINT_IT( "RP_OFFSET", Context_Control *, gr2 );
+ PRINT_IT( "ARG3_OFFSET", Context_Control *, gr23 );
+ PRINT_IT( "ARG2_OFFSET", Context_Control *, gr24 );
+ PRINT_IT( "ARG1_OFFSET", Context_Control *, gr25 );
+ PRINT_IT( "ARG0_OFFSET", Context_Control *, gr26 );
+ PRINT_IT( "SP_OFFSET", Context_Control *, sp );
+ PRINT_IT( "DP_OFFSET", Context_Control *, gr27 );
+ PRINT_IT( "RET0_OFFSET", Context_Control *, gr28 );
+ PRINT_IT( "RET1_OFFSET", Context_Control *, gr29 );
+
+ PRINT_SIZE("CPU_CONTEXT_SIZE", Context_Control);
+
+ PRINT_COMMENT("Context_Control_fp information");
+
+ PRINT_IT( "FR0_OFFSET", Context_Control_fp *, fr0 );
+ PRINT_IT( "FR1_OFFSET", Context_Control_fp *, fr1 );
+ PRINT_IT( "FR2_OFFSET", Context_Control_fp *, fr2 );
+ PRINT_IT( "FR3_OFFSET", Context_Control_fp *, fr3 );
+ PRINT_IT( "FR4_OFFSET", Context_Control_fp *, fr4 );
+ PRINT_IT( "FR5_OFFSET", Context_Control_fp *, fr5 );
+ PRINT_IT( "FR6_OFFSET", Context_Control_fp *, fr6 );
+ PRINT_IT( "FR7_OFFSET", Context_Control_fp *, fr7 );
+ PRINT_IT( "FR8_OFFSET", Context_Control_fp *, fr8 );
+ PRINT_IT( "FR9_OFFSET", Context_Control_fp *, fr9 );
+ PRINT_IT( "FR10_OFFSET", Context_Control_fp *, fr10 );
+ PRINT_IT( "FR11_OFFSET", Context_Control_fp *, fr11 );
+ PRINT_IT( "FR12_OFFSET", Context_Control_fp *, fr12 );
+ PRINT_IT( "FR13_OFFSET", Context_Control_fp *, fr13 );
+ PRINT_IT( "FR14_OFFSET", Context_Control_fp *, fr14 );
+ PRINT_IT( "FR15_OFFSET", Context_Control_fp *, fr15 );
+ PRINT_IT( "FR16_OFFSET", Context_Control_fp *, fr16 );
+ PRINT_IT( "FR17_OFFSET", Context_Control_fp *, fr17 );
+ PRINT_IT( "FR18_OFFSET", Context_Control_fp *, fr18 );
+ PRINT_IT( "FR19_OFFSET", Context_Control_fp *, fr19 );
+ PRINT_IT( "FR20_OFFSET", Context_Control_fp *, fr20 );
+ PRINT_IT( "FR21_OFFSET", Context_Control_fp *, fr21 );
+ PRINT_IT( "FR22_OFFSET", Context_Control_fp *, fr22 );
+ PRINT_IT( "FR23_OFFSET", Context_Control_fp *, fr23 );
+ PRINT_IT( "FR24_OFFSET", Context_Control_fp *, fr24 );
+ PRINT_IT( "FR25_OFFSET", Context_Control_fp *, fr25 );
+ PRINT_IT( "FR26_OFFSET", Context_Control_fp *, fr26 );
+ PRINT_IT( "FR27_OFFSET", Context_Control_fp *, fr27 );
+ PRINT_IT( "FR28_OFFSET", Context_Control_fp *, fr28 );
+ PRINT_IT( "FR29_OFFSET", Context_Control_fp *, fr29 );
+ PRINT_IT( "FR30_OFFSET", Context_Control_fp *, fr30 );
+ PRINT_IT( "FR31_OFFSET", Context_Control_fp *, fr31 );
+
+ PRINT_SIZE("CPU_CONTEXT_FP_SIZE", Context_Control_fp);
+
+ /*
+ * And the control registers
+ */
+
+ PRINT_COMMENT("Control register portion of context");
+
+ PRINT_IT( "SAR_OFFSET", Context_Control *, sar );
+ PRINT_IT( "IPSW_OFFSET", Context_Control *, ipsw );
+ PRINT_IT( "IIR_OFFSET", Context_Control *, iir );
+ PRINT_IT( "IOR_OFFSET", Context_Control *, ior );
+ PRINT_IT( "ISR_OFFSET", Context_Control *, isr );
+ PRINT_IT( "PCOQFRONT_OFFSET", Context_Control *, pcoqfront );
+ PRINT_IT( "PCOQBACK_OFFSET", Context_Control *, pcoqback );
+ PRINT_IT( "PCSQFRONT_OFFSET", Context_Control *, pcsqfront );
+ PRINT_IT( "PCSQBACK_OFFSET", Context_Control *, pcsqback );
+ PRINT_IT( "ITIMER_OFFSET", Context_Control *, itimer );
+
+ /*
+ * Full interrupt frame (integer + float)
+ */
+ PRINT_COMMENT("Interrupt frame information");
+
+ PRINT_IT( "INTEGER_CONTEXT_OFFSET", CPU_Interrupt_frame *, Integer );
+ PRINT_IT( "FP_CONTEXT_OFFSET", CPU_Interrupt_frame *, Floating_Point );
+ size = sizeof( CPU_Interrupt_frame );
+
+ if ( size % CPU_STACK_ALIGNMENT )
+ size += CPU_STACK_ALIGNMENT - (size % CPU_STACK_ALIGNMENT);
+
+ printf( "#define\tCPU_INTERRUPT_FRAME_SIZE\t%d\t\t/* 0x%x */\n", size, size );
+
+#else
+
+ print_information();
+
+#endif
+
+#undef PRINT_IT
+#undef PRINT_SIZE
+#undef PRINT_COMMENT
+
+ /*
+ * Print the end of file stuff
+ */
+
+ printf(
+ "\n"
+ "#endif /* __OFFSETS_h */\n"
+ "\n"
+ "/* end of include file */\n"
+ );
+
+ return 0;
+}
+
+void print_information( void )
+{
+
+#define PRINT_IT( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_SIZE( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_COMMENT( STRING ) \
+ printf( \
+ "\n" \
+ "/*\n" \
+ " * " STRING "\n" \
+ " */\n" \
+ "\n" \
+ );
+
+/*
+ * Offsets of elements in the Context_control structure.
+ */
+
+ PRINT_COMMENT("Context_Control information");
+
+ PRINT_IT( "FLAGS_OFFSET", 0x00 );
+ PRINT_IT( "R1_OFFSET", 0x04 );
+ PRINT_IT( "R2_OFFSET", 0x08 );
+ PRINT_IT( "R3_OFFSET", 0x0c );
+ PRINT_IT( "R4_OFFSET", 0x00 );
+ PRINT_IT( "R5_OFFSET", 0x14 );
+ PRINT_IT( "R6_OFFSET", 0x18 );
+ PRINT_IT( "R7_OFFSET", 0x1c );
+ PRINT_IT( "R8_OFFSET", 0x20 );
+ PRINT_IT( "R9_OFFSET", 0x24 );
+ PRINT_IT( "R10_OFFSET", 0x28 );
+ PRINT_IT( "R11_OFFSET", 0x2c );
+ PRINT_IT( "R12_OFFSET", 0x30 );
+ PRINT_IT( "R13_OFFSET", 0x34 );
+ PRINT_IT( "R14_OFFSET", 0x38 );
+ PRINT_IT( "R15_OFFSET", 0x3c );
+ PRINT_IT( "R16_OFFSET", 0x40 );
+ PRINT_IT( "R17_OFFSET", 0x44 );
+ PRINT_IT( "R18_OFFSET", 0x48 );
+ PRINT_IT( "R19_OFFSET", 0x4c );
+ PRINT_IT( "R20_OFFSET", 0x50 );
+ PRINT_IT( "R21_OFFSET", 0x54 );
+ PRINT_IT( "R22_OFFSET", 0x58 );
+ PRINT_IT( "R23_OFFSET", 0x5c );
+ PRINT_IT( "R24_OFFSET", 0x60 );
+ PRINT_IT( "R25_OFFSET", 0x64 );
+ PRINT_IT( "R26_OFFSET", 0x68 );
+ PRINT_IT( "R27_OFFSET", 0x6c );
+ PRINT_IT( "R28_OFFSET", 0x70 );
+ PRINT_IT( "R29_OFFSET", 0x74 );
+ PRINT_IT( "R30_OFFSET", 0x78 );
+ PRINT_IT( "R31_OFFSET", 0x7c );
+
+ /*
+ * And common aliases for the above
+ */
+
+ PRINT_COMMENT("Common aliases for above");
+
+ PRINT_IT( "RP_OFFSET", 0x08 );
+ PRINT_IT( "ARG3_OFFSET", 0x5c );
+ PRINT_IT( "ARG2_OFFSET", 0x60 );
+ PRINT_IT( "ARG1_OFFSET", 0x64 );
+ PRINT_IT( "ARG0_OFFSET", 0x68 );
+ PRINT_IT( "SP_OFFSET", 0x78 );
+ PRINT_IT( "DP_OFFSET", 0x6c );
+ PRINT_IT( "RET0_OFFSET", 0x74 );
+ PRINT_IT( "RET1_OFFSET", 0x74 );
+
+ PRINT_SIZE("CPU_CONTEXT_SIZE", 168 );
+
+ PRINT_COMMENT("Context_Control_fp information");
+
+ PRINT_SIZE("CPU_CONTEXT_FP_SIZE", 256);
+
+ /*
+ * And the control registers
+ */
+
+ PRINT_COMMENT("Control register portion of context");
+
+ PRINT_IT( "SAR_OFFSET", 0x80 );
+ PRINT_IT( "IPSW_OFFSET", 0x84 );
+ PRINT_IT( "IIR_OFFSET", 0x88 );
+ PRINT_IT( "IOR_OFFSET", 0x8c );
+ PRINT_IT( "ISR_OFFSET", 0x90 );
+ PRINT_IT( "PCOQFRONT_OFFSET", 0x94 );
+ PRINT_IT( "PCOQBACK_OFFSET", 0x98 );
+ PRINT_IT( "PCSQFRONT_OFFSET", 0x9c );
+ PRINT_IT( "PCSQBACK_OFFSET", 0xa0 );
+ PRINT_IT( "ITIMER_OFFSET", 0xa4 );
+
+ /*
+ * Full interrupt frame (integer + float)
+ */
+
+ PRINT_COMMENT("Interrupt frame information");
+
+ PRINT_IT( "INTEGER_CONTEXT_OFFSET", 0x00 );
+ PRINT_IT( "FP_CONTEXT_OFFSET", 0xa8 );
+ PRINT_SIZE( "CPU_INTERRUPT_FRAME_SIZE", 448 );
+
+}
diff --git a/c/src/exec/score/tools/unix/Makefile.in b/c/src/exec/score/tools/unix/Makefile.in
new file mode 100644
index 0000000000..f2703f098b
--- /dev/null
+++ b/c/src/exec/score/tools/unix/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# we use host compiler here for gensize. Hopefully it has same alignment!!
+USE_HOST_COMPILER=yes
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=gensize
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PGMS=${ARCH}/gensize
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+# We use files that have not been installed yet.
+CPU_DIR=../../cpu/$(RTEMS_CPU)
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I$(PROJECT_RELEASE)/include \
+ -I$(CPU_DIR)
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here.
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGMS)
+ $(INSTALL) -m 555 ${PGMS} ${PROJECT_RELEASE}/bin
+
+# Hack
+# we are #including files that haven't been installed yet.
+# Make sure they are available in the src tree (ie: checked
+# out from SCCS or RCS)
+preinstall:
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/c/src/exec/score/tools/unix/gensize.c b/c/src/exec/score/tools/unix/gensize.c
new file mode 100644
index 0000000000..bb9d3bd20a
--- /dev/null
+++ b/c/src/exec/score/tools/unix/gensize.c
@@ -0,0 +1,116 @@
+/*
+ * gensize.c
+ *
+ * This file generates the file unixsize.h
+ *
+ * NOTE: It only prints the minimal information required.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+/*
+ * This feels like a very crude way to determine if we are on a Solaris
+ * host but it does work.
+ */
+
+#if defined(__sun__) && defined(__sparc__) && \
+ defined(__unix__) && defined(__svr4__)
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 3
+#undef __STRICT_ANSI__
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <setjmp.h>
+#include <signal.h>
+
+typedef struct {
+ jmp_buf regs;
+ int isr_level;
+} Context_Control;
+
+int main(
+ int argc,
+ char **argv
+)
+{
+ Context_Control *cc = 0;
+
+ /*
+ * Print the file header
+ */
+
+printf(
+ "/* unixsize.h\n"
+ " *\n"
+ " * This include file contans the size of the context control block\n"
+ " * C data structure. This structure must be defined in such a way\n"
+ " * that files NOT including the native header files can work.\n"
+ " *\n"
+ " * NOTE: THIS FILE IS AUTOMATICALLY GENERATED!!!!\n"
+ " * DO NOT EDIT THIS BY HAND!!!!\n"
+ " *\n"
+ " * COPYRIGHT (c) 1989-1997.\n"
+ " * On-Line Applications Research Corporation (OAR).\n"
+ " * Copyright assigned to U.S. Government, 1994.\n"
+ " *\n"
+ " * The license and distribution terms for this file may in\n"
+ " * the file LICENSE in this distribution or at\n"
+ " * http://www.OARcorp.com/rtems/license.html.\n"
+ " */\n"
+ "\n"
+ "#ifndef __UNIXSIZE_h\n"
+ "#define __UNIXSIZE_h\n"
+ "\n"
+);
+
+#define PRINT_IT( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_SIZE( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_COMMENT( STRING ) \
+ printf( \
+ "\n" \
+ "/*\n" \
+ " * " STRING "\n" \
+ " */\n" \
+ "\n" \
+ );
+
+ PRINT_COMMENT("Context_Control information");
+
+ PRINT_SIZE("CPU_CONTEXT_SIZE_IN_BYTES", sizeof( Context_Control ) );
+ PRINT_SIZE("CPU_CONTEXT_REGISTERS_OFFSET_IN_BYTES", (int) &cc->regs );
+ PRINT_SIZE("CPU_CONTEXT_SIGNALS_OFFSET_IN_BYTES", (int) &cc->isr_level );
+
+ /*
+ * Print the end of file stuff
+ */
+
+ printf(
+ "\n"
+ "#endif /* __UNIXSIZE_h */\n"
+ "\n"
+ "/* end of include file */\n"
+ );
+
+ return 0;
+}
+
diff --git a/c/src/exec/wrapup/Makefile.in b/c/src/exec/wrapup/Makefile.in
new file mode 100644
index 0000000000..557407f298
--- /dev/null
+++ b/c/src/exec/wrapup/Makefile.in
@@ -0,0 +1,17 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+POSIX_DIRS_yes_V=posix
+POSIX_DIRS = $(POSIX_DIRS_$(HAS_POSIX_API)_V)
+
+SUB_DIRS=rtems $(POSIX_DIRS)
+
diff --git a/c/src/exec/wrapup/posix/Makefile.in b/c/src/exec/wrapup/posix/Makefile.in
new file mode 100644
index 0000000000..3f8c8f5149
--- /dev/null
+++ b/c/src/exec/wrapup/posix/Makefile.in
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+#
+# This is really temporary until posix is more an integral part of the tree.
+#
+#CPU_OBJS=$(wildcard ../../score/cpu/$(RTEMS_CPU)/$(ARCH)/*.rel)
+#CORE_OBJS=$(wildcard ../../score/src/$(ARCH)/*.o)
+#SAPI_OBJS=$(wildcard ../../sapi/src/$(ARCH)/*.o)
+POSIX_OBJS=$(wildcard ../../posix/src/$(ARCH)/*.o)
+
+OBJS=$(CPU_OBJS) $(CORE_OBJS) $(POSIX_OBJS) $(SAPI_OBJS)
+LIB=$(ARCH)/libposix.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/exec/wrapup/rtems/Makefile.in b/c/src/exec/wrapup/rtems/Makefile.in
new file mode 100644
index 0000000000..e56e2f3469
--- /dev/null
+++ b/c/src/exec/wrapup/rtems/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+CPU_OBJS=$(wildcard ../../score/cpu/$(RTEMS_CPU)/$(ARCH)/*.rel)
+CORE_OBJS=$(wildcard ../../score/src/$(ARCH)/*.o)
+SAPI_OBJS=$(wildcard ../../sapi/src/$(ARCH)/*.o)
+RTEMS_OBJS=$(wildcard ../../rtems/src/$(ARCH)/*.o)
+
+OBJS=$(CPU_OBJS) $(CORE_OBJS) $(RTEMS_OBJS) $(SAPI_OBJS)
+LIB=$(ARCH)/librtems.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/Makefile.in b/c/src/lib/Makefile.in
new file mode 100644
index 0000000000..55ca6e925e
--- /dev/null
+++ b/c/src/lib/Makefile.in
@@ -0,0 +1,17 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# General Hardware API library
+LIBHWAPI=$(wildcard libhwapi)
+
+SUB_DIRS=start include libmisc libc libcpu libbsp \
+ $(LIBHWAPI) wrapup
diff --git a/c/src/lib/include/Makefile.in b/c/src/lib/include/Makefile.in
new file mode 100644
index 0000000000..c15472cbc0
--- /dev/null
+++ b/c/src/lib/include/Makefile.in
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES=console clockdrv iosupp ringbuf \
+ spurious timerdrv vmeintr z8036 z8530 z8536
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SYS_H_FILES=
+
+SRCS=$(H_FILES) $(SYS_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(SYS_H_FILES) ${PROJECT_RELEASE}/include/sys
diff --git a/c/src/lib/include/clockdrv.h b/c/src/lib/include/clockdrv.h
new file mode 100644
index 0000000000..368c292f8f
--- /dev/null
+++ b/c/src/lib/include/clockdrv.h
@@ -0,0 +1,51 @@
+/* clock.h
+ *
+ * This file describes the Clock Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CLOCK_DRIVER_h
+#define __CLOCK_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* variables */
+
+extern volatile rtems_unsigned32 Clock_driver_ticks;
+extern rtems_device_major_number rtems_clock_major;
+extern rtems_device_minor_number rtems_clock_minor;
+
+/* default clock driver entry */
+
+#define CLOCK_DRIVER_TABLE_ENTRY \
+ { Clock_initialize, NULL, NULL, NULL, NULL, Clock_control }
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/include/console.h b/c/src/lib/include/console.h
new file mode 100644
index 0000000000..b3437eed91
--- /dev/null
+++ b/c/src/lib/include/console.h
@@ -0,0 +1,69 @@
+/* console.h
+ *
+ * This file describes the Console Device Driver for all boards.
+ * This driver provides support for the standard C Library.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef _CONSOLE_DRIVER_h
+#define _CONSOLE_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CONSOLE_DRIVER_TABLE_ENTRY \
+ { 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_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
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/include/iosupp.h b/c/src/lib/include/iosupp.h
new file mode 100644
index 0000000000..69e6195a2f
--- /dev/null
+++ b/c/src/lib/include/iosupp.h
@@ -0,0 +1,44 @@
+/* iosupp.h
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __IOSUPP_h
+#define __IOSUPP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* character constants */
+
+#define BS 0x08 /* backspace */
+#define LF 0x0a /* line feed */
+#define CR 0x0d /* carriage return */
+#define XON 0x11 /* control-Q */
+#define XOFF 0x13 /* control-S */
+
+/* structures */
+
+#ifdef IOSUPP_INIT
+#define IOSUPP_EXTERN
+#else
+#undef IOSUPP_EXTERN
+#define IOSUPP_EXTERN extern
+#endif
+
+/* functions */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/lib/include/ringbuf.h b/c/src/lib/include/ringbuf.h
new file mode 100644
index 0000000000..8c80aaf9c8
--- /dev/null
+++ b/c/src/lib/include/ringbuf.h
@@ -0,0 +1,53 @@
+/*
+ * ringbuf.h
+ *
+ * This file provides simple ring buffer functionality.
+ *
+ * $Id$
+ */
+
+#ifndef __RINGBUF_H__
+#define __RINGBUF_H__
+
+#ifndef RINGBUF_QUEUE_LENGTH
+#define RINGBUF_QUEUE_LENGTH 128
+#endif
+
+typedef struct {
+ char buffer[RINGBUF_QUEUE_LENGTH];
+ volatile int head;
+ volatile int tail;
+} Ring_buffer_t;
+
+#define Ring_buffer_Initialize( _buffer ) \
+ do { \
+ (_buffer)->head = (_buffer)->tail = 0; \
+ } while ( 0 )
+
+#define Ring_buffer_Is_empty( _buffer ) \
+ ( (_buffer)->head == (_buffer)->tail )
+
+#define Ring_buffer_Is_full( _buffer ) \
+ ( (_buffer)->head == ((_buffer)->tail + 1) % RINGBUF_QUEUE_LENGTH )
+
+#define Ring_buffer_Add_character( _buffer, _ch ) \
+ do { \
+ rtems_unsigned32 isrlevel; \
+ \
+ rtems_interrupt_disable( isrlevel ); \
+ (_buffer)->tail = ((_buffer)->tail+1) % RINGBUF_QUEUE_LENGTH; \
+ (_buffer)->buffer[ (_buffer)->tail ] = (_ch); \
+ rtems_interrupt_enable( isrlevel ); \
+ } while ( 0 )
+
+#define Ring_buffer_Remove_character( _buffer, _ch ) \
+ do { \
+ rtems_unsigned32 isrlevel; \
+ \
+ rtems_interrupt_disable( isrlevel ); \
+ (_buffer)->head = ((_buffer)->head+1) % RINGBUF_QUEUE_LENGTH; \
+ (_ch) = (_buffer)->buffer[ (_buffer)->head ]; \
+ rtems_interrupt_enable( isrlevel ); \
+ } while ( 0 )
+
+#endif
diff --git a/c/src/lib/include/rtems/assoc.h b/c/src/lib/include/rtems/assoc.h
new file mode 100644
index 0000000000..1982d654ac
--- /dev/null
+++ b/c/src/lib/include/rtems/assoc.h
@@ -0,0 +1,42 @@
+/*
+ *
+ * Rtems associativity routines. Mainly used to convert a value from
+ * one space to another (eg: our errno's to host errno's and v.v)
+ *
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ASSOC_H
+#define _INCLUDE_ASSOC_H
+
+typedef struct {
+ const char *name;
+ unsigned32 local_value;
+ unsigned32 remote_value;
+} rtems_assoc_t;
+
+/*
+ * Flag/marker for optional default value in each table
+ */
+
+#define RTEMS_ASSOC_DEFAULT_NAME "(default)"
+
+const rtems_assoc_t *rtems_assoc_ptr_by_name(const rtems_assoc_t *, const char *);
+const rtems_assoc_t *rtems_assoc_ptr_by_value(const rtems_assoc_t *, unsigned32);
+const rtems_assoc_t *rtems_assoc_ptr_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_local_by_remote(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_remote_by_name(const rtems_assoc_t *, const char *);
+unsigned32 rtems_assoc_local_by_name(const rtems_assoc_t *, const char *);
+const char *rtems_assoc_name_by_local(const rtems_assoc_t *, unsigned32);
+const char *rtems_assoc_name_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(const rtems_assoc_t *, unsigned32);
+char *rtems_assoc_name_by_local_bitfield(const rtems_assoc_t *, unsigned32, char *);
+char *rtems_assoc_name_by_remote_bitfield(const rtems_assoc_t *, unsigned32, char *);
+unsigned32 rtems_assoc_local_by_remote_bitfield(const rtems_assoc_t *, unsigned32);
+
+
+#endif /* ! _INCLUDE_ASSOC_H */
diff --git a/c/src/lib/include/rtems/error.h b/c/src/lib/include/rtems/error.h
new file mode 100644
index 0000000000..a0698afb5d
--- /dev/null
+++ b/c/src/lib/include/rtems/error.h
@@ -0,0 +1,38 @@
+/*
+ * Defines and externs for rtems error reporting
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ERROR_h
+#define __RTEMS_ERROR_h
+
+/*
+ * rtems_error() and rtems_panic() support
+ */
+
+#define RTEMS_ERROR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */
+#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */
+
+#define RTEMS_ERROR_MASK (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \
+ RTEMS_ERROR_PANIC) /* all */
+
+const char *rtems_status_text(rtems_status_code);
+int rtems_error(int error_code, const char *printf_format, ...);
+#ifdef __GNUC__
+void rtems_panic(const char *printf_format, ...);
+/*
+ * We should be able to use this attribute but gcc complains that
+ * rtems_panic does in fact return. :(
+ *
+ * __attribute__ ((__noreturn__));
+ */
+#else
+void rtems_panic(const char *printf_format, ...);
+#endif
+
+extern int rtems_panic_in_progress;
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/include/rtems/libcsupport.h b/c/src/lib/include/rtems/libcsupport.h
new file mode 100644
index 0000000000..470a35b51a
--- /dev/null
+++ b/c/src/lib/include/rtems/libcsupport.h
@@ -0,0 +1,43 @@
+/* libcsupport.h
+ *
+ * This include file contains the information regarding the
+ * RTEMS specific support for the standard C library.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __LIBC_SUPPORT_h
+#define __LIBC_SUPPORT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+
+void RTEMS_Malloc_Initialize(
+ void *start,
+ size_t length,
+ size_t sbrk_amount
+);
+
+extern void malloc_dump(void);
+extern void malloc_walk(size_t source, size_t printf_enabled);
+extern void libc_init(int reentrant);
+extern int host_errno(void);
+extern void fix_syscall_errno(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/include/rtems/libio.h b/c/src/lib/include/rtems/libio.h
new file mode 100644
index 0000000000..c79dfc2e33
--- /dev/null
+++ b/c/src/lib/include/rtems/libio.h
@@ -0,0 +1,124 @@
+/*
+ * General purpose communication channel for RTEMS to allow UNIX/POSIX
+ * system call behavior on top of RTEMS IO devices.
+ *
+ * TODO
+ * stat(2)
+ * unlink(2)
+ * rename(2)
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_LIBIO_H
+#define _RTEMS_LIBIO_H
+
+#include <sys/stat.h>
+
+typedef unsigned32 rtems_libio_offset_t;
+
+/*
+ * An open file data structure, indexed by 'fd'
+ * TODO:
+ * should really have a separate per/file data structure that this
+ * points to (eg: size, offset, driver, pathname should be in that)
+ */
+
+typedef struct {
+ rtems_driver_name_t *driver;
+ rtems_libio_offset_t size; /* size of file */
+ rtems_libio_offset_t offset; /* current offset into the file */
+ unsigned32 flags;
+ char *pathname; /* opened pathname */
+ Objects_Id sem;
+ unsigned32 data0; /* private to "driver" */
+ unsigned32 data1; /* ... */
+} rtems_libio_t;
+
+
+/*
+ * param block for read/write
+ * Note: it must include 'offset' instead of using iop's offset since
+ * we can have multiple outstanding i/o's on a device.
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ rtems_libio_offset_t offset;
+ unsigned8 *buffer;
+ unsigned32 count;
+ unsigned32 flags;
+ unsigned32 bytes_moved;
+} rtems_libio_rw_args_t;
+
+/*
+ * param block for open/close
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 flags;
+ unsigned32 mode;
+} rtems_libio_open_close_args_t;
+
+/*
+ * param block for ioctl
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 command;
+ void *buffer;
+ unsigned32 ioctl_return;
+} rtems_libio_ioctl_args_t;
+
+
+/*
+ * Values for 'flag'
+ */
+
+#define LIBIO_FLAGS_NO_DELAY 0x0001 /* return immediately if no data */
+#define LIBIO_FLAGS_READ 0x0002 /* reading */
+#define LIBIO_FLAGS_WRITE 0x0004 /* writing */
+#define LIBIO_FLAGS_LINE_BUFFERED 0x0008 /* line buffered io (^h, ^u, etc) */
+#define LIBIO_FLAGS_OPEN 0x0100 /* device is open */
+#define LIBIO_FLAGS_APPEND 0x0200 /* all writes append */
+#define LIBIO_FLAGS_CREATE 0x0400 /* create file */
+
+#define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE)
+
+void rtems_libio_config(rtems_configuration_table *config, unsigned32 max_fds);
+void rtems_libio_init(void);
+
+int __rtems_open(const char *pathname, unsigned32 flag, unsigned32 mode);
+int __rtems_close(int fd);
+int __rtems_read(int fd, void *buffer, unsigned32 count);
+int __rtems_write(int fd, const void *buffer, unsigned32 count);
+int __rtems_ioctl(int fd, unsigned32 command, void *buffer);
+int __rtems_lseek(int fd, rtems_libio_offset_t offset, int whence);
+int __rtems_fstat(int _fd, struct stat* _sbuf);
+int __rtems_isatty(int _fd);
+
+/*
+ * External I/O handlers
+ */
+typedef struct {
+ int (*open)(const char *pathname, unsigned32 flag, unsigned32 mode);
+ int (*close)(int fd);
+ int (*read)(int fd, void *buffer, unsigned32 count);
+ int (*write)(int fd, const void *buffer, unsigned32 count);
+ int (*ioctl)(int fd, unsigned32 command, void *buffer);
+ int (*lseek)(int fd, rtems_libio_offset_t offset, int whence);
+} rtems_libio_handler_t;
+
+void rtems_register_libio_handler(int handler_flag,
+ const rtems_libio_handler_t *handler);
+
+#define RTEMS_FILE_DESCRIPTOR_TYPE_FILE 0x0000
+#define RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET 0x1000
+#define rtems_make_file_descriptor(fd,flags) ((fd)|(flags))
+#define rtems_file_descriptor_base(fd) ((fd) & 0x0FFF)
+#define rtems_file_descriptor_type(fd) ((fd) & 0xF000)
+#define rtems_file_descriptor_type_index(fd) ((((fd) & 0xF000) >> 12) - 1)
+
+#endif /* _RTEMS_LIBIO_H */
diff --git a/c/src/lib/include/spurious.h b/c/src/lib/include/spurious.h
new file mode 100644
index 0000000000..1250b60d56
--- /dev/null
+++ b/c/src/lib/include/spurious.h
@@ -0,0 +1,38 @@
+/* spurious.h
+ *
+ * This file describes the Spurious Interrupt Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SPURIOUS_h
+#define __SPURIOUS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SPURIOUS_DRIVER_TABLE_ENTRY \
+ { Spurious_Initialize, NULL, NULL, NULL, NULL, NULL }
+
+rtems_device_driver Spurious_Initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *,
+ rtems_id,
+ rtems_unsigned32 *
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/include/sys/utsname.h b/c/src/lib/include/sys/utsname.h
new file mode 100644
index 0000000000..ca15230d40
--- /dev/null
+++ b/c/src/lib/include/sys/utsname.h
@@ -0,0 +1,49 @@
+/* sys/utsname.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SYS_UTSNAME_h
+#define __POSIX_SYS_UTSNAME_h
+
+#include <sys/times.h>
+#include <sys/types.h>
+
+/*
+ * 4.4.1 Get System Name (Table 4-1), P1003.1b-1993, p. 90
+ *
+ * NOTE: The lengths of the strings in this structure are
+ * just long enough to reliably contain the RTEMS information.
+ * For example, the fields are not long enough to support
+ * Internet hostnames.
+ */
+
+struct utsname {
+ char sysname[ 32 ]; /* Name of this implementation of the operating system */
+ char nodename[ 32 ]; /* Name of this node within an implementation */
+ /* specified communication network */
+ char release[ 32 ]; /* Current release level of this implementation */
+ char version[ 32 ]; /* Current version level of this release */
+ char machine[ 32 ]; /* Name of the hardware type on which the system */
+ /* is running */
+};
+
+/*
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+);
+
+/*
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+);
+
+#endif
+/* end of include file */
+
diff --git a/c/src/lib/include/timerdrv.h b/c/src/lib/include/timerdrv.h
new file mode 100644
index 0000000000..e7dd1c37a3
--- /dev/null
+++ b/c/src/lib/include/timerdrv.h
@@ -0,0 +1,40 @@
+/* timerdrv.h
+ *
+ * This file describes the Timer Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_DRIVER_h
+#define __TIMER_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* functions */
+
+void Timer_initialize( void );
+
+rtems_unsigned32 Read_timer( void );
+
+rtems_status_code Empty_function( void );
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/include/vmeintr.h b/c/src/lib/include/vmeintr.h
new file mode 100644
index 0000000000..2052acecbb
--- /dev/null
+++ b/c/src/lib/include/vmeintr.h
@@ -0,0 +1,58 @@
+/*
+ * vmeintr.h
+ *
+ * This file is the specification for the VMEbus interface library
+ * which should be provided by all BSPs for VMEbus Single Board
+ * Computers but currently only a few do so.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __VME_INTERRUPT_h
+#define __VME_INTERRUPT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This defines the mask which is used to determine which
+ * interrupt levels are affected by a call to this package.
+ * The LSB corresponds to VME interrupt 0 and the MSB
+ * to VME interrupt 7.
+ *
+ */
+
+typedef rtems_unsigned8 VME_interrupt_Mask;
+
+/*
+ * VME_interrupt_Disable
+ *
+ */
+
+void VME_interrupt_Disable (
+ VME_interrupt_Mask mask /* IN */
+);
+
+/*
+ * VME_interrupt_Disable
+ *
+ */
+
+void VME_interrupt_Enable (
+ VME_interrupt_Mask mask /* IN */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* end of include file */
diff --git a/c/src/lib/libbsp/Makefile.in b/c/src/lib/libbsp/Makefile.in
new file mode 100644
index 0000000000..11cd9d8605
--- /dev/null
+++ b/c/src/lib/libbsp/Makefile.in
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# mptests are the multiprocessing test suite
+# We only build them if HAS_MP was defined
+
+MP_DRIVERS_yes_V = shmdr
+MP_DRIVERS = $(MP_DRIVERS_$(HAS_MP)_V)
+
+# Descend into the $(RTEMS_CPU) directory if it exists
+SUB_DIRS=$(MP_DRIVERS) $(wildcard $(RTEMS_CPU))
diff --git a/c/src/lib/libbsp/README b/c/src/lib/libbsp/README
new file mode 100644
index 0000000000..c3b978b6cb
--- /dev/null
+++ b/c/src/lib/libbsp/README
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+
+Board Support Package library
+
+This directory contains the source for the libbsp.a library.
+For each supported board $(RTEMS_BSP) there is a standard
+set of functions which must be provided in the BSP:
+
+ + start up initialization
+ + exit support
+ + set vector
+ + console IO support
+ + drivers
+
+In addition, the BSP also determines the memory usage by providing
+any necessary linker scripts.
+
+There are also "generic" drivers in this directory. Currently
+they are shmdr and stubdr.
+
+Some of the supplied generic drivers (for example, shared memory) require
+target board specific support routines.
+
+NOTE: The library libbsp.a is actually built by $(RTEMS_BSP)/wrapup/Makefile.
+
+To execute all of the test in the RTEMS Tests Suites the following
+device drivers must be supplied:
+
+ + Clock Tick
+ + IO Driver Support
+ + Timer
+ + Shared Memory Driver Support
+
+The Timer Driver is used only by the Timing Test Suite (c/src/tests/tmtests/*).
+These tests are used to generate the execution times for RTEMS found in the
+flyers. It is recommended that these tests be run to verify a port to a new
+CPU or with a newly developed BSP. Looking at the times as compared to a
+known CPU and target can yield insights into potential performance problems
+in either the port, the BSP, or the target hardware.
+
+The Shared Memory Support is only required to execute the Multiprocessor
+Test Suite (c/src/tests/mptests/*). Multiprocessing is not a required part
+of a BSP.
+
diff --git a/c/src/lib/libbsp/a29k/Makefile.in b/c/src/lib/libbsp/a29k/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/a29k/portsw/Makefile.in b/c/src/lib/libbsp/a29k/portsw/Makefile.in
new file mode 100644
index 0000000000..5f233da39d
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/Makefile.in
@@ -0,0 +1,19 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SRCS=README
+
+all: $(SRCS)
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup console wrapup
diff --git a/c/src/lib/libbsp/a29k/portsw/README b/c/src/lib/libbsp/a29k/portsw/README
new file mode 100644
index 0000000000..f18b4f65b6
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/README
@@ -0,0 +1,71 @@
+#
+# README,v 1.2 1995/05/31 16:56:03 joel Exp
+#
+# This is a sample hardware description file for a BSP. This comment
+# block does not have to appear in a real one. The intention of this
+# file is to provide a central place to look when searching for
+# information about a board when starting a new BSP. For example,
+# you may want to find an existing timer driver for the chip you are
+# using on your board. It is easier to grep for the chip name in
+# all of the HARDWARE files than to peruse the source tree. Hopefully,
+# making the HARDDWARE files accurate will also alleviate the common
+# problem of not knowing anything about a board based on its BSP
+# name.
+#
+# NOTE: If you have a class of peripheral chip on board which
+# is not in this list please add it to this file so
+# others will also use the same name.
+#
+# Timer resolution is the way it is configured in this BSP.
+# On a counting timer, this is the length of time which
+# corresponds to 1 count.
+#
+# $Id$
+
+
+BSP NAME: fastsbc1
+BOARD: Fasssst Computers, Fast SBC-1
+BUS: SchoolBus
+CPU FAMILY: i386
+CPU: Intel Hexium
+COPROCESSORS: Witch Hex87
+MODE: 32 bit mode
+
+DEBUG MONITOR: HexBug
+
+PERIPHERALS
+===========
+TIMERS: Intel i8254
+ RESOLUTION: .0001 microseconds
+SERIAL PORTS: Zilog Z8530 (with 2 ports)
+REAL-TIME CLOCK: RTC-4
+DMA: Intel i8259
+VIDEO: none
+SCSI: none
+NETWORKING: none
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: RTC-4
+IOSUPP DRIVER: Zilog Z8530 port A
+SHMSUPP: polled and interrupts
+TIMER DRIVER: Intel i8254
+TTY DRIVER: stub only
+
+STDIO
+=====
+PORT: Console port 0
+ELECTRICAL: RS-232
+BAUD: 9600
+BITS PER CHARACTER: 8
+PARITY: None
+STOP BITS: 1
+
+NOTES
+=====
+
+(1) 900 Mhz and 950 Mhz versions.
+
+(2) 1 Gb or 2 Gb RAM.
+
+(3) PC compatible if HexBug not enabled.
diff --git a/c/src/lib/libbsp/a29k/portsw/console/Makefile.in b/c/src/lib/libbsp/a29k/portsw/console/Makefile.in
new file mode 100644
index 0000000000..4ba37cd168
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console serial
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/concntl.h
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
diff --git a/c/src/lib/libbsp/a29k/portsw/console/concntl.h b/c/src/lib/libbsp/a29k/portsw/console/concntl.h
new file mode 100644
index 0000000000..f3b3f5e4d7
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/concntl.h
@@ -0,0 +1,16 @@
+/*
+ * $Id$
+ */
+
+typedef enum
+{
+ CON_KBHIT,
+ CON_GET_RAW_BYTE,
+ CON_SEND_RAW_BYTE
+} console_ioctl_t;
+
+typedef struct
+{
+ console_ioctl_t ioctl_type;
+ unsigned32 param;
+} console_ioctl_request_t;
diff --git a/c/src/lib/libbsp/a29k/portsw/console/console.c b/c/src/lib/libbsp/a29k/portsw/console/console.c
new file mode 100644
index 0000000000..6b34b22dea
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/console.c
@@ -0,0 +1,302 @@
+/*
+ * This file contains the template for a console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define NO_BSP_INIT
+
+
+/* only one of the following can be defined */
+#define SERIAL_INPUT /* use serial input */
+/* #define HIF_INPUT */ /* use HIF input */
+
+#if defined(SERIAL_INPUT) && defined(HIF_INPUT)
+#error SERIAL_INPUT and HIF_INPUT cannot both be defined!!!
+#endif
+
+/* both of the following can be defined */
+#define SERIAL_OUTPUT /* remove to disable serial port console output */
+/* #define HIF_OUTPUT */ /* remove to disable HIF console output */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include "serial.h"
+#include "concntl.h"
+
+#ifndef lint
+static char _sccsid[] = "@(#)console.c 09/12/96 1.13\n";
+#endif
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ if ( arg )
+ {
+ if ( console_duartinit(minor,*(unsigned32*)arg) )
+ return RTEMS_INVALID_NUMBER;
+ }
+ else
+ {
+ if ( console_duartinit(1,9600) || console_duartinit(0,9600) )
+ {
+ return RTEMS_INVALID_NUMBER;
+ }
+ }
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ *ch = '\0'; /* return NULL for no particular reason */
+ return(TRUE);
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SOURCE.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SOURCE
+ */
+
+char inbyte( unsigned int minor )
+{
+ /*
+ * If polling, wait until a character is available.
+ */
+#ifdef HIF_INPUT
+ char retch;
+ _read( 1, &retch, 1 );
+ return retch;
+#endif
+#ifdef SERIAL_INPUT
+ return console_sps_getc( minor );
+#endif
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SOURCE. It may support
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte( unsigned int minor,
+ char ch
+)
+{
+ /*
+ * If polling, wait for the transmitter to be ready.
+ * Check for flow control requests and process.
+ * Then output the character.
+ */
+
+#ifdef SERIAL_OUTPUT
+ console_sps_putc( minor, ch );
+#endif
+
+ /*
+ * Carriage Return/New line translation.
+ */
+
+ if ( ch == '\n' )
+ outbyte( minor, '\r' );
+}
+
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ unsigned8 *buffer;
+ unsigned32 maximum;
+ unsigned32 count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte(minor);
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ outbyte( minor, '\n' ); /* newline */
+ break;
+ }
+ else if (buffer[ count ] == '\b' && count > 0 )
+ {
+ outbyte( minor, '\b' ); /* move back one space */
+ outbyte( minor, ' ' ); /* erase the character */
+ outbyte( minor, '\b' ); /* move back one space */
+ count-=2;
+ }
+ else
+ outbyte( minor, buffer[ count ] ); /* echo the character */
+ }
+
+ rw_args->bytes_moved = count;
+ return (count > 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ unsigned8 *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+#ifdef HIF_OUTPUT
+ _write( 0, buffer, maximum );
+#endif
+#ifdef SERIAL_OUTPUT
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte(minor,'\r');
+ }
+ outbyte( minor,buffer[ count ] );
+ }
+#endif
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ if (!arg)
+ return RTEMS_INVALID_ADDRESS;
+
+ switch( ((console_ioctl_request_t *)arg)->ioctl_type )
+ {
+ case CON_KBHIT:
+ /* check if keyboard was hit */
+ ((console_ioctl_request_t *)arg)->param = console_sps_kbhit(minor);
+ break;
+
+ case CON_GET_RAW_BYTE:
+ ((console_ioctl_request_t *)arg)->param = inbyte(minor);
+ break;
+
+ case CON_SEND_RAW_BYTE:
+ outbyte(minor, ((console_ioctl_request_t *)arg)->param);
+ break;
+
+ default:
+ break;
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/console/serial.c b/c/src/lib/libbsp/a29k/portsw/console/serial.c
new file mode 100644
index 0000000000..4b07dd19ae
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/serial.c
@@ -0,0 +1,217 @@
+/*
+ * $Id$
+ */
+
+#include "serial.h"
+#include "rtems.h"
+
+
+typedef unsigned char uchar ; /* Abbreviations */
+typedef unsigned short ushort ;
+typedef unsigned long ulong ;
+
+#if 0
+#define BAUDRate 9600 /* Fixed Uart baud rate */
+#endif
+
+#define SEND_WAIT 0x0100 /* Waiting to send character */
+
+#define TDR(i)
+
+
+/********************************************************************
+ *** 16552 specific DUART definitions.
+ *******************************************************************/
+
+
+typedef struct uart_16552 DUART ;
+
+#ifndef notdef
+struct uart_16552
+{
+ short u_short[8*2] ;
+} ;
+#define u_reg(n) u_short[2*(n)]
+
+#else
+
+struct uart_16552
+{
+ int u_int[8] ;
+} ;
+
+#define u_reg(n) u_int[(n)]
+#endif
+
+#define u_tdr u_reg(0) /* Transmit Data Register (write) */
+#define u_rdr u_reg(0) /* Receive Data Register (read) */
+#define u_dlr0 u_reg(0) /* Divisor Latch Register (lsb) */
+
+#define u_ier u_reg(1) /* Interrupt Enable Register */
+#define u_dlr1 u_reg(1) /* Divisor Latch Register (msb) */
+
+#define u_iir u_reg(2) /* Interrupt ID Register (read) */
+#define u_fcr u_reg(2) /* FIFO Control Register (write) */
+#define u_afr u_reg(2) /* Alternate Funct Reg (read/write) */
+
+#define u_lcr u_reg(3) /* Line Control Register */
+
+#define u_mcr u_reg(4) /* Modem Control Register */
+
+#define u_lsr u_reg(5) /* Line Status Register */
+
+#define u_msr u_reg(6) /* Modem Status Register */
+
+#define u_spr u_reg(7) /* Scratch Pad Register */
+
+#define uart1 ((volatile DUART *)0x90000380)
+#define uart2 ((volatile DUART *)0x90000300)
+
+#define NUM_UARTS 2
+static volatile DUART * duart[NUM_UARTS] = { uart1, uart2 };
+
+
+extern void display_msg(void);
+/*extern int sprintf();*/
+
+
+#define board_rev_reg ((volatile short *)0x90000080)
+
+static unsigned int shift_val = 0;
+
+/***********************************************************************
+ *** 16552 DUART initialization routine.
+ ***********************************************************************/
+
+int
+console_duartinit(unsigned int uart_num, unsigned int BAUDRate)
+{
+ register uchar tmp;
+ unsigned int board_rev = *board_rev_reg & 0xff;
+
+ switch( BAUDRate )
+ {
+ case 1200:
+ case 2400:
+ case 9600:
+ case 19200:
+ case 38400:
+ case 57600:
+ break;
+ default:
+ /* unknown baud rate */
+ return FALSE;
+ }
+
+ /* the board rev register should never be 0xff.
+ if it equals 0xff, assume that we're on old hardware
+ that needs all values shifted by 8. */
+ if ( board_rev == 0xff )
+ shift_val = 8;
+ else
+ shift_val = 0;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ duart[uart_num]->u_lcr = 0x80<<shift_val ; /* Set DLAB bit to 1 */
+
+ duart[uart_num]->u_dlr0 = ((115200 / BAUDRate) >> 0)<<shift_val ; /* Set baud */
+ duart[uart_num]->u_dlr1 = ((115200 / BAUDRate) >> 8)<<shift_val ; /* rate */
+
+ duart[uart_num]->u_lcr = 0x03<<shift_val ; /* 8 bits, no parity, 1 stop */
+
+ duart[uart_num]->u_mcr = 0x0b<<shift_val ; /* Assert RTS, DTR & OUT2 */
+
+ duart[uart_num]->u_fcr = 0x00<<shift_val ; /* Clear 16552 FIFOs */
+ /* Is the following write of 0x01 needed? */
+ /* Let's try it without... */
+ duart[uart_num]->u_fcr = 0xc7<<shift_val ; /* Enable 16552 FIFOs */
+
+ duart[uart_num]->u_ier = 0x07<<shift_val ; /* Enable transmit/receive ints */
+
+ tmp = duart[uart_num]->u_lsr ; /* Re-arm interrupts */
+ tmp = duart[uart_num]->u_rdr ;
+ tmp = duart[uart_num]->u_msr ;
+
+ return(0);
+}
+
+ /*------------ end of duartinit function ----------------*/
+
+
+ /***********************************************************************
+ *** Transmit character to host.
+ ***********************************************************************/
+
+int console_sps_putc(unsigned int uart_num, int ch)
+{
+ register unsigned short stat;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ /*
+ * Pause until there is room in the UART transmit
+ * buffer.
+ */
+
+ do {
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ } while (!(stat & 0x40));
+
+ /*
+ * Transmit data. (Junk)
+ */
+
+ TDR(ch)
+
+ duart[uart_num]->u_tdr = ch<<shift_val ;
+
+ return ch;
+
+}
+
+
+ /***********************************************************************
+ *** Read character from host.
+ ***********************************************************************/
+
+int console_sps_getc(unsigned int uart_num)
+{
+ register unsigned short stat;
+ register int ch;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ while (!(stat & 0x01))
+ {
+ rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ }
+
+ ch = duart[uart_num]->u_rdr>>shift_val;
+
+ return ch;
+}
+
+ /***********************************************************************
+ *** check character from host.
+ ***********************************************************************/
+
+int console_sps_kbhit(unsigned int uart_num)
+{
+ register unsigned short stat;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ return ((stat & 0x01));
+}
+
+
+
+
diff --git a/c/src/lib/libbsp/a29k/portsw/console/serial.h b/c/src/lib/libbsp/a29k/portsw/console/serial.h
new file mode 100644
index 0000000000..f57787dc17
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/serial.h
@@ -0,0 +1,8 @@
+/*
+ * $Id$
+ */
+
+int console_duartinit(unsigned int uart_num, unsigned int BAUDRate);
+int console_sps_putc(unsigned int uart_num, int ch);
+int console_sps_getc(unsigned int uart_num);
+int console_sps_kbhit(unsigned int uart_num);
diff --git a/c/src/lib/libbsp/a29k/portsw/include/Makefile.in b/c/src/lib/libbsp/a29k/portsw/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/a29k/portsw/include/bsp.h b/c/src/lib/libbsp/a29k/portsw/include/bsp.h
new file mode 100644
index 0000000000..ec571c6fc5
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/include/bsp.h
@@ -0,0 +1,106 @@
+/* bsp.h
+ *
+ * This include file contains all board IO definitions.
+ *
+ * XXX : put yours in here
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __NO_BSP_h
+#define __NO_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Stuff for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 0, 1 )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { \
+ }
+
+/* Constants */
+#define CPU_CLOCK_RATE_MHZ 25
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+no_cpu_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/a29k/portsw/include/coverhd.h b/c/src/lib/libbsp/a29k/portsw/include/coverhd.h
new file mode 100644
index 0000000000..16d7ee639c
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/include/coverhd.h
@@ -0,0 +1,115 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/a29k/portsw/shmsupp/Makefile.in b/c/src/lib/libbsp/a29k/portsw/shmsupp/Makefile.in
new file mode 100644
index 0000000000..c91ccb5214
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/shmsupp/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/a29k/portsw/shmsupp/addrconv.c b/c/src/lib/libbsp/a29k/portsw/shmsupp/addrconv.c
new file mode 100644
index 0000000000..3a180c437c
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/shmsupp/addrconv.c
@@ -0,0 +1,35 @@
+/* Shm_Convert_address
+ *
+ * No address range conversion is required.
+ *
+ * Input parameters:
+ * address - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+#ifndef lint
+static char _sccsid[] = "@(#)addrconv.c 04/08/96 1.1\n";
+#endif
+
+void *Shm_Convert_address(
+ void *address
+)
+{
+ return ( address );
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/shmsupp/getcfg.c b/c/src/lib/libbsp/a29k/portsw/shmsupp/getcfg.c
new file mode 100644
index 0000000000..7445c44168
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/shmsupp/getcfg.c
@@ -0,0 +1,81 @@
+/* void Shm_Get_configuration( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the XXX target.
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+XXX: FIX THE COMMENTS BELOW WHEN THE CPU IS KNOWN
+ * NOTES: The XYZ does not have an interprocessor interrupt.
+ *
+ * The following table illustrates the configuration limitations:
+ *
+ * BUS MAX
+ * MODE ENDIAN NODES
+ * ========= ====== =======
+ * POLLED BIG 2+
+ * INTERRUPT **** NOT SUPPORTED ****
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+#ifndef lint
+static char _sccsid[] = "@(#)getcfg.c 04/08/96 1.1\n";
+#endif
+
+/*
+ * configured if currently polling of interrupt driven
+ */
+
+#define INTERRUPT 0 /* XXX: */
+#define POLLING 1 /* XXX: fix me -- is polling ONLY!!! */
+
+
+shm_config_table BSP_shm_cfgtbl;
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+ BSP_shm_cfgtbl.base = 0x0;
+ BSP_shm_cfgtbl.length = 1 * MEGABYTE;
+ BSP_shm_cfgtbl.format = SHM_BIG;
+
+ /*
+ * Override cause_intr or shm_isr if your target has
+ * special requirements.
+ */
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#else
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
+#endif
+
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+
+ *shmcfg = &BSP_shm_cfgtbl;
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/shmsupp/lock.c b/c/src/lib/libbsp/a29k/portsw/shmsupp/lock.c
new file mode 100644
index 0000000000..8e16b727fd
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/shmsupp/lock.c
@@ -0,0 +1,90 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+#ifndef lint
+static char _sccsid[] = "@(#)lock.c 04/08/96 1.1\n";
+#endif
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = LQ_UNLOCKED;
+}
+
+/* void _Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+ rtems_unsigned32 *lockptr = &lq_cb->lock;
+ rtems_unsigned32 lock_value;
+
+ lock_value = 0x80000000;
+ rtems_interrupt_disable( isr_level );
+
+ Shm_isrstat = isr_level;
+ while ( lock_value ) {
+ asm volatile( ""
+ : "=r" (lockptr), "=r" (lock_value)
+ : "0" (lockptr), "1" (lock_value)
+ );
+ /*
+ * If not available, then may want to delay to reduce load on lock.
+ */
+
+ if ( lock_value )
+ delay( 10 ); /* approximately 10 microseconds */
+ }
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ lq_cb->lock = SHM_UNLOCK_VALUE;
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
+
diff --git a/c/src/lib/libbsp/a29k/portsw/shmsupp/mpisr.c b/c/src/lib/libbsp/a29k/portsw/shmsupp/mpisr.c
new file mode 100644
index 0000000000..3f6dfb2876
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/shmsupp/mpisr.c
@@ -0,0 +1,51 @@
+/* Shm_isr_nobsp()
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+#ifndef lint
+static char _sccsid[] = "@(#)mpisr.c 04/08/96 1.1\n";
+#endif
+
+rtems_isr Shm_isr_nobsp( void )
+{
+ /*
+ * If this routine has to do anything other than the mpisr.c
+ * found in the generic driver, then copy the contents of the generic
+ * mpisr.c and augment it to satisfy this particular board. Typically,
+ * you need to have a board specific mpisr.c when the interrupt
+ * must be cleared.
+ *
+ * If the generic mpisr.c satisifies your requirements, then
+ * remove this routine from your target's shmsupp/mpisb.c file.
+ * Then simply install the generic Shm_isr in the Shm_setvec
+ * routine below.
+ */
+}
+
+/* Shm_setvec
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void Shm_setvec( void )
+{
+ /* XXX: FIX ME!!! */
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/start/Makefile.in b/c/src/lib/libbsp/a29k/portsw/start/Makefile.in
new file mode 100644
index 0000000000..12f1cbfc6d
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/start/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=crt0 register
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+PGM=${ARCH}/crt0.o ${ARCH}/register.o
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/a29k/portsw/start/amd.ah b/c/src/lib/libbsp/a29k/portsw/start/amd.ah
new file mode 100644
index 0000000000..69f34f173e
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/start/amd.ah
@@ -0,0 +1,517 @@
+; /* @(#)amd.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Initialization values for registers after RESET
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+;
+;* File information and includes.
+
+ .file "amd.ah"
+ .ident "@(#)amd.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+
+;
+;* AMD PROCESSOR SPECIFIC VALUES...
+;
+
+;
+;* Processor revision levels...
+;
+
+; PRL values: 31-28 27-24
+; Am29000 0 x
+; Am29005 1 x
+; Am29050 2 x
+; Am29035 3 x
+; Am29030 4 x
+; Am29200 5 x
+; Am29205 5 1x
+; Am29240 6 0
+; Manx 7 0
+; Cougar 8 0
+
+
+ .equ AM29000_PRL, 0x00
+
+ .equ AM29005_PRL, 0x10
+
+ .equ AM29050_PRL, 0x20
+
+ .equ AM29035_PRL, 0x30
+
+ .equ AM29030_PRL, 0x40
+
+ .equ AM29200_PRL, 0x50
+
+ .equ AM29205_PRL, 0x58
+
+ .equ AM29240_PRL, 0x60
+
+ .equ AM29040_PRL, 0x70
+
+ .equ MANX_PRL, 0x70
+
+ .equ COUGAR_PRL, 0x80
+
+;
+;* data structures sizes.
+;
+ .equ CFGINFO_SIZE, 16*4
+
+ .equ PGMINFO_SIZE, 16*4
+
+ .equ VARARGS_SPACE, 16*4
+
+ .equ WINDOWSIZE, 0x80
+;
+;* Am29027 Mode registers
+;
+
+ .equ Am29027Mode1, 0x0fc00820
+
+ .equ Am29027Mode2, 0x00001375
+
+
+
+;* Processor Based Equates and Defines
+
+ .equ SIG_SYNC, -1
+
+ .equ ENABLE, (SM)
+
+ .equ DISABLE, (ENABLE | DI | DA)
+
+ .equ DISABLE_FZ, (FZ | ENABLE | DI | DA)
+
+ .equ CLR_TRAP, (FZ | DA)
+
+ .equ InitOPS, (TD | SM | (3<<IMShift) | DI | DA)
+
+ .equ InitCPS, (TD | SM | (0<<IMShift) | DI | DA)
+
+ .equ InitCPS1, (TD | SM | (0<<IMShift) | DI )
+
+ .equ CPS_TMR, (SM | (0<<IMShift) | DI)
+
+ .equ CPS_INT0, (TD | SM | (0<<IMShift))
+
+ .equ CPS_TMRINT0, (SM | (0<<IMShift))
+
+ .equ InitCFG, 0x0
+
+ .equ InitRBP, (B0|B1|B2|B3|B4|B5)
+
+ .equ TMC_VALUE, 0xFFFFFF
+
+ .equ TMR_VALUE, (IE | TMC_VALUE)
+
+
+
+
+
+
+;* 29205 specific (internal) peripheral initialization constants.
+
+; Current Processor Status (CPS) Register.
+; Old Processor Status Register (OPS).
+
+ .equ DA, 0x00001
+ .equ DI, 0x00002
+ .equ IMShift,0x2
+ .equ SM, 0x00010
+ .equ PI, 0x00020
+ .equ PD, 0x00040
+ .equ WM, 0x00080
+ .equ RE, 0x00100
+ .equ LK, 0x00200
+ .equ FZ, 0x00400
+ .equ TU, 0x00800
+ .equ TP, 0x01000
+ .equ TE, 0x02000
+ .equ IP, 0x04000
+ .equ CA, 0x08000
+ .equ MM, 0x10000
+ .equ TD, 0x20000
+
+; Configuration Register (CFG)
+
+ .equ CD, 0x01
+ .equ CP, 0x02
+ .equ BO, 0x04
+ .equ RV, 0x08
+ .equ VF, 0x10
+ .equ DW, 0x20
+ .equ CO, 0x40
+ .equ EE, 0x80
+ .equ IDShift, 8
+ .equ CFG_ID, 0x100
+ .equ ILShift, 9
+ .equ CFG_ILMask, 0x600
+ .equ DDShift, 11
+ .equ CFG_DD, 0x800
+ .equ DLShift, 12
+ .equ CFG_DLMask, 0x3000
+ .equ PCEShift, 14
+ .equ CFG_PCE, 0x4000
+ .equ PMBShift, 16
+ .equ D16, 0x8000
+ .equ TBOShift, 23
+ .equ PRLShift, 24
+
+; Channel Control Register (CHC)
+
+ .equ CV, 0x1
+ .equ NN, 0x2
+ .equ TRShift, 2
+ .equ TF, 0x400
+ .equ PER, 0x800
+ .equ LA, 0x1000
+ .equ ST, 0x2000
+ .equ ML, 0x4000
+ .equ LS, 0x8000
+ .equ CRShift, 16
+ .equ CNTLShift, 24
+ .equ CEShift, 31
+ .equ WBERShift, 31
+
+; Register Bank Protect (RBP)
+ .equ B0, 0x1
+ .equ B1, 0x2
+ .equ B2, 0x4
+ .equ B3, 0x8
+ .equ B4, 0x10
+ .equ B5, 0x20
+ .equ B6, 0x40
+ .equ B7, 0x80
+ .equ B8, 0x100
+ .equ B9, 0x200
+ .equ B10, 0x400
+ .equ B11, 0x800
+ .equ B12, 0x1000
+ .equ B13, 0x2000
+ .equ B14, 0x4000
+ .equ B15, 0x8000
+
+; Timer Counter
+
+ .equ TCVMask, 0xffffff
+
+; Timer Reload Register
+
+ .equ IE, 0x1000000
+ .equ IN, 0x2000000
+ .equ OV, 0x4000000
+ .equ TRVMAsk, 0xffffff
+
+; MMU Configuration
+
+ .equ PSShift, 8
+ .equ PS0Shift, 8
+ .equ PS1Shift, 12
+
+; LRU Recommendation (LRU)
+ .equ LRUMask, 0xff
+
+; Reason Vector (RSN)
+ .equ RSNMask, 0xff
+
+; Region Mapping Address (RMA0 | RMA1)
+ .equ PBAMask,0xffff
+ .equ VBAShift, 16
+
+; Region Mapping Control (RMC0 | RMC1)
+ .equ TIDMask, 0xff
+ .equ RMC_UE, 0x100
+ .equ RMC_UW, 0x200
+ .equ RMC_UR, 0x400
+ .equ RMC_SE, 0x800
+ .equ RMC_SW, 0x1000
+ .equ RMC_SR, 0x2000
+ .equ RMC_VE, 0x4000
+ .equ RMC_IO, 0x10000
+ .equ RGSShift, 17
+ .equ RMC_PGMShift, 22
+
+; Instruction breakpoint Control (IBC0 | IBC1)
+ .equ BPIDMask, 0xff
+ .equ BTE, 0x100
+ .equ BRM, 0x200
+ .equ IBC_BSY, 0x400
+ .equ BEN, 0x800
+ .equ BHO, 0x1000
+
+; Cache Data Register (CDR)
+ .equ CDR_US, 0x1
+ .equ P, 0x2
+ .equ CDR_V, 0x4
+ .equ IATAGShift, 20
+
+; Cache Interface Register (CIR)
+ .equ CPTRShift, 2
+ .equ CIR_RW, 0x1000000
+ .equ FSELShift, 28
+
+; Indirect Pointer A, B, C (IPA, IPB, IPC)
+ .equ IPShift, 2
+
+; ALU Status (ALU)
+ .equ FCMask, 0x1F
+ .equ BPShift, 5
+ .equ C, 0x80
+ .equ Z, 0x100
+ .equ N, 0x200
+ .equ ALU_V, 0x400
+ .equ DF, 0x800
+
+; Byte Pointer
+ .equ BPMask, 0x3
+
+; Load/Store Count Remaining (CR)
+ .equ CRMask, 0xff
+
+; Floating Point Environment (FPE)
+ .equ NM, 0x1
+ .equ RM, 0x2
+ .equ VM, 0x4
+ .equ UM, 0x8
+ .equ XM, 0x10
+ .equ DM, 0x20
+ .equ FRMShift, 6
+ .equ FF, 0x100
+ .equ ACFShift, 9
+
+; Integer Environment (INTE)
+ .equ MO, 0x1
+ .equ DO, 0x2
+
+; Floating Point Status (FPS)
+ .equ NS, 0x1
+ .equ RS, 0x2
+ .equ VS, 0x4
+ .equ FPS_US, 0x8
+ .equ XS, 0x10
+ .equ DS, 0x20
+ .equ NT, 0x100
+ .equ RT, 0x200
+ .equ VT, 0x400
+ .equ UT, 0x800
+ .equ XT, 0x1000
+ .equ DT, 0x2000
+
+; Exception Opcode (EXOP)
+ .equ IOPMask, 0xff
+
+; TLB Entry Word 0
+; .equ TIDMask, 0xff already defined above
+ .equ TLB_UE, 0x100
+ .equ TLB_UW, 0x200
+ .equ TLB_UR, 0x400
+ .equ TLB_SE, 0x800
+ .equ TLB_SW, 0x1000
+ .equ TLB_SR, 0x2000
+ .equ TLB_VE, 0x4000
+ .equ VTAGShift, 15
+
+; TLB Entry Word 1
+ .equ TLB_IO, 0x1
+ .equ U, 0x2
+ .equ TLB_PGMShift, 6
+ .equ RPNShift, 10
+
+; Am29200 ROM Control bits.
+ .equ RMCT_DW0Shift, 29
+ .equ RMCT_DW1Shift, 21
+ .equ RMCT_DW2Shift, 13
+ .equ RMCT_DW3Shift, 5
+
+; Am29200 DRAM Control bits.
+ .equ DW3, (1<<18)
+ .equ DW2, (1<<22)
+ .equ DW1, (1<<26)
+ .equ DW0, (1<<30)
+
+ ; Internal peripheral address assignments.
+ .equ RMCT, 0x80000000
+ .equ RMCF, 0x80000004
+ .equ DRCT, 0x80000008
+ .equ DRCF, 0x8000000C
+ .equ DRM0, 0x80000010
+ .equ DRM1, 0x80000014
+ .equ DRM2, 0x80000018
+ .equ DRM3, 0x8000001C
+ .equ PIACT0, 0x80000020
+ .equ PIACT1, 0x80000020
+ .equ ICT, 0x80000028
+ .equ DMCT0, 0x80000030
+ .equ DMAD0, 0x80000034
+ .ifdef revA
+ .equ TAD0, 0x80000036
+ .equ TCN0, 0x8000003A
+ .else
+ .equ TAD0, 0x80000070 ; default
+ .equ TCN0, 0x8000003C ; default
+ .endif
+ .equ DMCN0, 0x80000038
+ .equ DMCT1, 0x80000040
+ .equ DMAD1, 0x80000044
+ .equ DMCN1, 0x80000048
+ .equ SPCT, 0x80000080
+ .equ SPST, 0x80000084
+ .equ SPTH, 0x80000088
+ .equ SPRB, 0x8000008C
+ .equ BAUD, 0x80000090
+ .equ PPCT, 0x800000C0
+ .equ PPST, 0x800000C1
+ .equ PPDT, 0x800000C4
+ .equ POCT, 0x800000D0
+ .equ PIN, 0x800000D4
+ .equ POUT, 0x800000D8
+ .equ POEN, 0x800000DC
+ .equ VCT, 0x800000E0
+ .equ TOP, 0x800000E4
+ .equ SIDE, 0x800000E8
+ .equ VDT, 0x800000EC
+
+ ; Interrupt Controller Register bits.
+ .equ TXDI, (1<<5)
+ .equ RXDI, (1<<6)
+ .equ RXSI, (1<<7)
+ .equ PPI, (1<<11)
+ .equ DMA1I, (1<<13)
+ .equ DMA0I, (1<<14)
+ .equ IOPIMask, (0xFF<<16)
+ .equ VDI, (1<<27)
+ .equ ICT200_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+ .equ ICT205_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+
+ ; Serial port Initialization bits
+ .equ NO_PARITY, 0
+
+
+ ; SPST bits
+ .equ THREShift, 22
+
+;* REGISTER Addresses
+
+ .equ ROMCntlRegAddr, 0x80000000
+
+ .equ ROMCfgRegAddr, 0x80000004
+
+ .equ DRAMCntlRegAddr, 0x80000008
+
+ .equ DRAMCfgRegAddr, 0x8000000C
+
+ .equ DRAMMap0RegAddr, 0x80000010
+
+ .equ DRAMMap1RegAddr, 0x80000014
+
+ .equ DRAMMap2RegAddr, 0x80000018
+
+ .equ DRAMMap3RegAddr, 0x8000001C
+
+ .equ PIACntl0RegAddr, 0x80000020
+
+ .equ PIACntl1RegAddr, 0x80000024
+
+ .equ INTRCntlRegAddr, 0x80000028
+
+ .equ DMACntl0RegAddr, 0x80000030
+
+ .equ DMACntl1RegAddr, 0x80000040
+
+ .equ SERPortCntlRegAddr, 0x80000080
+
+ .equ SERPortStatRegAddr, 0x80000084
+
+ .equ SERPortTHLDRegAddr, 0x80000088
+
+ .equ SERPortRbufRegAddr, 0x8000008C
+
+ .equ SERPortBaudRegAddr, 0x80000090
+
+ .equ PARPortCntlRegAddr, 0x800000C0
+
+ .equ PIOCntlRegAddr, 0x800000D0
+
+ .equ PIOInpRegAddr, 0x800000D4
+
+ .equ PIOOutRegAddr, 0x800000D8
+
+ .equ PIOOutEnaRegAddr, 0x800000DC
+
+ .equ VCTCntlRegAddr, 0x800000E0
+
+;
+;* Control constants
+;
+
+;* AM29030 Timer related constants.
+
+ .equ TMR_IE, 0x01000000
+
+ .equ TMR_IN, 0x02000000
+
+ .equ TMR_OV, 0x04000000
+
+ .equ TMC_INITCNT, 1613
+
+;
+;* System initialization values.
+;
+
+ .equ __os_version, 0x0001 ;
+
+ .equ STACKSize, 0x8000 ;
+
+ .equ PGMExecMode, 0x0000 ;
+
+ .equ TSTCK_OFST, 28 * 4
+
+ .equ CSTCK_OFST, 29 * 4
+
+ .equ TMSTCK_OFST, 30 * 4
+
+ .equ CMSTCK_OFST, 31 * 4
+
+ .equ CTXSW_OK, 0xA55A ; ctx switch ok
+
+ .set NV_STARTOFST, 0x20 ; 32 bytes
+
+ .set NV_BAUDOFST, 0x00 ; 00 bytes
+
+ .set reg_cir, 29
+
+ .set reg_cdr, 30
+
+ .equ MSG_BUFSIZE, 0x1000 ; serial buffer size
+
+ .equ ILLOPTRAP, 0
+
+ .equ UATRAP, 1
+
+ .equ PVTRAP, 5
+
+ .equ UITLBMISSTRAP, 8
+
+ .equ UDTLBMISSTRAP, 9
+
+ .equ TIMERTRAP, 14
+
+ .equ TRACETRAP, 15
+
+ .equ XLINXTRAP, 16
+
+ .equ SERIALTRAP, 17
+
+ .equ SLOWTMRTRAP, 18
+
+ .equ PORTTRAP, 19
+
+ .equ SVSCTRAP, 80
+
+ .equ SVSCTRAP1, 81
+
+ .equ V_CACHETRAP, 66 ;
+
+ .equ V_SETSERVICE, 67 ;
diff --git a/c/src/lib/libbsp/a29k/portsw/start/pswmacro.ah b/c/src/lib/libbsp/a29k/portsw/start/pswmacro.ah
new file mode 100644
index 0000000000..a994719c58
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/start/pswmacro.ah
@@ -0,0 +1,442 @@
+; /* @(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; macros: Do_install and init_TLB
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+
+;* File information and includes.
+
+ .file "macro.ah"
+ .ident "@(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+ .macro CONST32, RegName, RegValue
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endm
+
+ .macro CONSTX, RegName, RegValue
+ .if (RegValue) <= 0x0000ffff
+ const RegName, RegValue
+ .else
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endif
+ .endm
+
+ .macro PRODEV, RegName
+ srl RegName, RegName, 24
+ .endm
+
+;
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+;
+
+;* Assumes vector table address in v0
+
+ .macro _setvec, trapnum, trapaddr
+ mfsr v0, vab ;
+ const v2, trapnum ;
+ sll v1, v2, 2 ;
+ add v1, v1, v0 ; v0 has location of vector tab
+
+ const v2, trapaddr ;
+ consth v2, trapaddr ;
+ store 0, 0, v2, v1 ;
+ nop ;
+ .endm
+
+ .macro syscall, name
+ const tav, HIF_@name ;
+ asneq V_SYSCALL, gr1, gr1 ;
+ nop ;
+ nop ;
+ .endm
+
+
+
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+
+ .macro Do_Install, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_Install
+ nop
+ .endm
+
+ .macro Do_InstallX, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_InstallX
+ nop
+ .endm
+
+
+
+; push a register onto the stack
+ .macro pushreg, reg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ store 0, 0, reg, sp ; push register
+ .endm
+
+ .macro push, sp, reg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop the register from stack
+ .macro popreg, reg, sp
+ load 0, 0, reg, sp ; pop register
+ add sp, sp, 4 ; adjust stack pointer
+ .endm
+ .macro pop, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ .endm
+
+; push a special register onto stack
+ .macro pushspcl, spcl, tmpreg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ mfsr tmpreg, spcl ; get spcl reg
+ store 0, 0, tmpreg, sp ; push onto stack
+ .endm
+
+ .macro pushsr, sp, reg, sreg
+ mfsr reg, sreg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop a special register from stack
+ .macro popspcl, spcl, tmpreg, sp
+ load 0, 0, tmpreg, sp ; pop from stack
+ add sp, sp, 4 ; adjust stack pointer
+ mtsr spcl, tmpreg ; set spcl reg
+ .endm
+
+ .macro popsr, sreg, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ mtsr sreg, reg
+ .endm
+
+;
+; save freeze mode registers on memory stack.
+;
+
+ .macro SaveFZState, tmp1, tmp2
+
+ ; save freeze mode registers.
+
+ pushspcl pc0, tmp1, msp
+ pushspcl pc1, tmp1, msp
+ pushspcl alu, tmp1, msp
+
+ pushspcl cha, tmp1, msp
+ pushspcl chd, tmp1, msp
+ pushspcl chc, tmp1, msp
+
+ pushspcl ops, tmp1, msp
+
+ ; turn freeze off
+
+ const tmp2, FZ
+ mfsr tmp1, cps
+ andn tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+ .endm
+
+; restore freeze mode registers from memory stack.
+
+ .macro RestoreFZState, tmp1, tmp2
+
+ ; turn freeze on
+
+ const tmp2, (FZ|DI|DA)
+ mfsr tmp1, cps
+ or tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+
+ ; restore freeze mode registers.
+
+ popspcl ops, tmp1, msp
+ popspcl chc, tmp1, msp
+ popspcl chd, tmp1, msp
+ popspcl cha, tmp1, msp
+ popspcl alu, tmp1, msp
+ popspcl pc1, tmp1, msp
+ popspcl pc0, tmp1, msp
+ .endm
+
+;
+;*
+;
+ .equ WS, 512 ; window size
+ .equ RALLOC, 4 * 4 ; stack alloc for C
+ .equ SIGCTX_UM_SIZE, 40 * 4 ;
+ .equ SIGCTX_RFB, (38) * 4 ; user mode saved
+ .equ SIGCTX_SM_SIZE, 12 * 4 ;
+ .equ SIGCTX_SIG, (11)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_GR1, (10)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_RAB, (9)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC0, (8)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC1, (7)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC2, (6)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_CHC, (3)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_OPS, (1)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_TAV, (0)*4 + SIGCTX_UM_SIZE ;
+
+ .macro sup_sv
+ add it2, trapreg, 0 ; transfer signal #
+ sub msp, msp, 4 ;
+ store 0, 0, it2, msp ; save signal number
+ sub msp, msp, 4 ; push gr1
+
+ store 0, 0, gr1, msp ;
+ sub msp, msp, 4 ; push rab
+ store 0, 0, rab, msp ;
+ const it0, WS ; Window size
+
+ sub rab, rfb, it0 ; set rab = rfb-512
+ pushsr msp, it0, PC0 ; save program counter0
+ pushsr msp, it0, PC1 ; save program counter1
+ pushsr msp, it0, PC2 ; save program counter2
+
+ pushsr msp, it0, CHA ; save channel address
+ pushsr msp, it0, CHD ; save channel data
+ pushsr msp, it0, CHC ; save channel control
+ pushsr msp, it0, ALU ; save alu
+
+ pushsr msp, it0, OPS ; save ops
+ sub msp, msp, 4 ;
+ store 0, 0, tav, msp ; push tav
+ mtsrim chc, 0 ; no loadm/storem
+
+ mfsr it0, ops ; get ops value
+ const it1, (TD | DI) ; disable interrupts
+ consth it1, (TD | DI) ; disable interrupts
+ or it0, it0, it1 ; set bits
+
+ mtsr ops, it0 ; set new ops
+ const it0, sigcode ; signal handler
+ consth it0, sigcode ; signal handler
+ mtsr pc1, it0 ; store pc1
+
+ add it1, it0, 4 ; next addr
+ mtsr pc0, it1 ; store pc1 location
+ iret ; return
+ nop ; ALIGN
+ .endm
+
+ .macro sig_return
+ mfsr it0, cps ; get processor status
+ const it1, FZ|DA ; Freeze + traps disable
+ or it0, it0, it1 ; to set FZ+DA
+ mtsr cps, it0 ; in freeze mode
+
+ load 0, 0, tav, msp ; restore tav
+ add msp, msp, 4 ;
+
+ popsr OPS,it0, msp ;
+ popsr ALU,it0, msp ;
+ popsr CHC,it0, msp ;
+ popsr CHD,it0, msp ;
+
+ popsr CHA,it0, msp ;
+ popsr PC2,it0, msp ;
+ popsr PC1,it0, msp ;
+ popsr PC0,it0, msp ;
+
+ load 0, 0, rab, msp ;
+ add msp, msp, 4 ;
+ load 0, 0, it0, msp ;
+ add gr1, it0, 0 ; pop rsp
+
+ add msp, msp, 8 ; discount signal #
+ iret
+ .endm
+
+ .macro repair_R_stack
+ add v0, msp, SIGCTX_GR1 ; interrupted gr1
+ load 0, 0, v2, v0 ;
+ add v0, msp, SIGCTX_RFB ;
+ load 0, 0, v3, v0 ; interupted rfb
+
+ const v1, WS ;
+ sub v1, v3, v1 ; rfb-512
+ cpltu v0, v2, v1 ; test gr1 < rfb-512
+ jmpf v0, $1 ;
+
+ add gr1, rab, 0 ;
+ add v2, v1, 0 ; set LB = rfb-512
+$1:
+;* if gr1 < rfb-512 yes LB = rfb-512 signalled during spill
+;* if no, LB=gr1 interrupted cache < 126 registers
+ cpleu v0, v2, rfb ; test LB<=rfb
+ jmpf v0, $2 ;
+ nop ;
+ add v2, rfb, 0 ;
+$2:
+ cpeq v0, v3, rfb ; fill rfb->'rfb
+ jmpt v0, $3 ; if rfb==rfb'
+ const tav, (0x80<<2) ; prepare for fill
+ or tav, tav, v2 ;
+
+ mtsr IPA, tav ; IPA=LA<<2
+ sub tav, v3, gr98 ; cache fill LA->rfb
+ srl tav, tav, 2 ; convert to words
+ sub tav, tav, 1 ;
+
+ mtsr cr, tav ;
+ loadm 0, 0, gr0, v2 ; fill from LA->rfb
+$3:
+ add rfb, v3, 0 ; move rfb upto 'rfb
+ sub rab, v1, 0 ; assign rab to rfb-512
+
+ add v0, msp, SIGCTX_GR1 ;
+ load 0, 0, v2, v0 ; v0 = interrupted gr1
+ add gr1, v2, 0 ; move gr1 upto 'gr1
+ nop ;
+ .endm
+
+ .macro repair_regs
+ mtsrim cr, 29 - 1 ; to restore locals
+ loadm 0, 0, v0, msp ;
+ add msp, msp, 29*4 ;
+ popsr Q, tav, msp ;
+
+ popsr IPC, tav, msp ;
+ popsr IPB, tav, msp ;
+ popsr IPA, tav, msp ;
+ pop FPStat3, msp ; floating point regs
+
+ pop FPStat2, msp ; floating point regs
+ pop FPStat1, msp ; floating point regs
+ pop FPStat0, msp ; floating point regs
+
+ add msp, msp, 3*4 ; R-stack repaired
+ .endm
+
+;
+;*HIF related...
+;
+
+
+
+
+; send the message in bufaddr to Montip.
+ .macro SendMessageToMontip, bufaddr
+ const lr2, bufaddr
+$1:
+ call lr0, _msg_send
+ consth lr2, bufaddr
+ cpeq gr96, gr96, 0
+ jmpf gr96, $1
+ const lr2, bufaddr
+ .endm
+
+; build a HIF_CALL message in bufaddr to send to montip.
+ .macro BuildHIFCALLMsg, bufaddr, tmp1, tmp2
+ const tmp1, bufaddr
+ consth tmp1, bufaddr
+ const tmp2, HIF_CALL_MSGCODE
+ store 0, 0, tmp2, tmp1 ; msg code
+ add tmp1, tmp1, 4
+ const tmp2, HIF_CALL_MSGLEN
+ store 0, 0, tmp2, tmp1 ; msg len
+ add tmp1, tmp1, 4
+ store 0, 0, gr121, tmp1 ; service number
+ add tmp1, tmp1, 4
+ store 0, 0, lr2, tmp1 ; lr2
+ add tmp1, tmp1, 4
+ store 0, 0, lr3, tmp1 ; lr3
+ add tmp1, tmp1, 4
+ store 0, 0, lr4, tmp1 ; lr4
+ .endm
+
+;
+;*
+;* All the funky AMD style macros go in here...simply for
+;* compatility
+;
+;
+ .macro IMPORT, symbol
+ .extern symbol
+ .endm
+
+ .macro GLOBAL, symbol
+ .global symbol
+ .endm
+
+ .macro USESECT, name, type
+ .sect name, type
+ .use name
+ .endm
+
+ .macro SECTION, name, type
+ .sect name, type
+ .endm
+
+ .macro FUNC, fname, lineno
+ .global fname
+fname:
+ .endm
+
+ .macro ENDFUNC, fname, lineno
+ .endm
+
+;*************************************LONG
+ .macro LONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************UNSIGNED LONG
+ .macro ULONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************SHORT
+ .macro SHORT, varname
+varname:
+ .block 2
+ .endm
+
+;*************************************CHAR
+ .macro CHAR, varname
+varname:
+ .block 1
+ .endm
+
+;*************************************LONGARRAY
+ .macro LONGARRAY, name, count
+name:
+ .block count*4
+ .endm
+
+;*************************************SHORTARRAY
+
+ .macro SHORTARRAY, name, count
+name:
+ .block count*2
+ .endm
+
+;*************************************CHARARRAY
+
+ .macro CHARARRAY, name, count
+name:
+ .block count
+ .endm
+
+
+;*************************************VOID_FPTR
+
+ .macro VOID_FPTR, name
+name:
+ .block 4
+ .endm
diff --git a/c/src/lib/libbsp/a29k/portsw/start/register.ah b/c/src/lib/libbsp/a29k/portsw/start/register.ah
new file mode 100644
index 0000000000..1dced5b043
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/start/register.ah
@@ -0,0 +1,214 @@
+; /* @(#)register.ah 1.1 96/05/23 08:56:57, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; naming of various registers
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+
+;* File information and includes.
+
+ .file "register.ah"
+ .ident "@(#)register.ah 1.1 96/05/23 08:56:57, TEI\n"
+
+;* Register Stack pointer and frame pointer registers.
+
+ .extern Rrsp, Rfp
+
+ .reg regsp, %%Rrsp
+ .reg fp, %%Rfp
+
+
+ .extern RTrapReg
+ .extern Rtrapreg
+
+ .reg TrapReg, %%RTrapReg
+ .reg trapreg, %%Rtrapreg
+
+
+;* Operating system Interrupt handler registers (gr64-gr67)
+
+ .extern ROSint0, ROSint1, ROSint2, ROSint3
+
+ .reg OSint0, %%ROSint0
+ .reg OSint1, %%ROSint1
+ .reg OSint2, %%ROSint2
+ .reg OSint3, %%ROSint3
+
+ .reg it0, %%ROSint0
+ .reg it1, %%ROSint1
+ .reg it2, %%ROSint2
+ .reg it3, %%ROSint3
+
+
+
+;* Operating system temporary (or scratch) registers (gr68-gr79)
+
+ .extern ROStmp0, ROStmp1, ROStmp2, ROStmp3
+ .extern ROStmp4, ROStmp5, ROStmp6, ROStmp7
+ .extern ROStmp8, ROStmp9, ROStmp10, ROStmp11
+
+ .reg OStmp0, %%ROStmp0
+ .reg OStmp1, %%ROStmp1
+ .reg OStmp2, %%ROStmp2
+ .reg OStmp3, %%ROStmp3
+
+ .reg OStmp4, %%ROStmp4
+ .reg OStmp5, %%ROStmp5
+ .reg OStmp6, %%ROStmp6
+ .reg OStmp7, %%ROStmp7
+
+ .reg OStmp8, %%ROStmp8
+ .reg OStmp9, %%ROStmp9
+ .reg OStmp10, %%ROStmp10
+ .reg OStmp11, %%ROStmp11
+
+
+ .reg kt0, %%ROStmp0
+ .reg kt1, %%ROStmp1
+ .reg kt2, %%ROStmp2
+ .reg kt3, %%ROStmp3
+
+ .reg kt4, %%ROStmp4
+ .reg kt5, %%ROStmp5
+ .reg kt6, %%ROStmp6
+ .reg kt7, %%ROStmp7
+
+ .reg kt8, %%ROStmp8
+ .reg kt9, %%ROStmp9
+ .reg kt10, %%ROStmp10
+ .reg kt11, %%ROStmp11
+
+
+ .reg TempReg0, %%ROSint0
+ .reg TempReg1, %%ROSint1
+ .reg TempReg2, %%ROSint2
+ .reg TempReg3, %%ROSint3
+
+ .reg TempReg4, %%ROStmp0
+ .reg TempReg5, %%ROStmp1
+ .reg TempReg6, %%ROStmp2
+ .reg TempReg7, %%ROStmp3
+
+ .reg TempReg8, %%ROStmp4
+ .reg TempReg9, %%ROStmp5
+ .reg TempReg10, %%ROStmp6
+ .reg TempReg11, %%ROStmp7
+
+ .reg TempReg12, %%ROStmp8
+ .reg TempReg13, %%ROStmp9
+ .reg TempReg14, %%ROStmp10
+ .reg TempReg15, %%ROStmp11
+
+
+;* Assigned static registers
+
+ .extern RSpillAddrReg, RFillAddrReg, RSignalAddrReg
+ .extern Rpcb, Retc
+ .extern RTimerExt, RTimerUtil, RLEDReg, RERRReg
+ .extern Ret0, Ret1, Ret2, Ret3, Ret4, Ret5, Ret6, Ret7, Reta, Retb
+ .extern Retx, Rety, Retz
+
+
+ .reg SpillAddrReg, %%RSpillAddrReg
+ .reg FillAddrReg, %%RFillAddrReg
+ .reg SignalAddrReg, %%RSignalAddrReg
+ .reg pcb, %%Rpcb
+
+ .reg etx, %%Retx
+ .reg ety, %%Rety
+ .reg etz, %%Retz
+ .reg eta, %%Reta
+
+ .reg etb, %%Retb
+ .reg etc, %%Retc
+ .reg TimerExt, %%RTimerExt
+ .reg TimerUtil, %%RTimerUtil
+
+ .reg LEDReg, %%RLEDReg
+ .reg ERRReg, %%RERRReg
+
+
+ .reg et0, %%Ret0
+ .reg et1, %%Ret1
+ .reg et2, %%Ret2
+ .reg et3, %%Ret3
+
+ .reg et4, %%Ret4
+ .reg et5, %%Ret5
+ .reg et6, %%Ret6
+ .reg et7, %%Ret7
+
+;
+ .equ SCB1REG_NUM, 88
+ .reg SCB1REG_PTR, %%Ret0
+
+; The floating point trap handlers need a few static registers
+
+ .extern RFPStat0, RFPStat1, RFPStat2, RFPStat3
+ .extern Rheapptr, RHeapPtr, RArgvPtr
+
+ .reg FPStat0, %%RFPStat0
+ .reg FPStat1, %%RFPStat1
+ .reg FPStat2, %%RFPStat2
+ .reg FPStat3, %%RFPStat3
+
+ .reg heapptr, %%Rheapptr
+ .reg HeapPtr, %%RHeapPtr
+ .reg ArgvPtr, %%RArgvPtr
+
+ .extern RXLINXReg, RVMBCReg, RUARTReg, RETHERReg
+
+ .reg XLINXReg, %%RXLINXReg
+ .reg VMBCReg, %%RVMBCReg
+ .reg UARTReg, %%RUARTReg
+ .reg ETHERReg, %%RXLINXReg
+
+;* Compiler and programmer registers. (gr96-gr127)
+
+ .extern Rv0, Rv1, Rv2, Rv3, Rv4, Rv5, Rv6, Rv7, Rv8, Rv9
+ .extern Rv10, Rv11, Rv12, Rv13, Rv14, Rv15
+
+ .reg v0, %%Rv0
+ .reg v1, %%Rv1
+ .reg v2, %%Rv2
+ .reg v3, %%Rv3
+
+ .reg v4, %%Rv4
+ .reg v5, %%Rv5
+ .reg v6, %%Rv6
+ .reg v7, %%Rv7
+
+ .reg v8, %%Rv8
+ .reg v9, %%Rv9
+ .reg v10, %%Rv10
+ .reg v11, %%Rv11
+
+ .reg v12, %%Rv12
+ .reg v13, %%Rv13
+ .reg v14, %%Rv14
+ .reg v15, %%Rv15
+
+ .extern Rtv0, Rtv1, Rtv2, Rtv3, Rtv4
+
+ .reg tv0, %%Rtv0
+ .reg tv1, %%Rtv1
+ .reg tv2, %%Rtv2
+ .reg tv3, %%Rtv3
+ .reg tv4, %%Rtv4
+
+; ****************************************************************************
+; For uatrap
+; register definitions -- since this trap handler must allow for
+; nested traps and interrupts such as TLB miss, protection violation,
+; or Data Access Exception, and these trap handlers use the shared
+; Temp registers, we must maintain our own that are safe over user-
+; mode loads and stores. The following must be assigned global
+; registers which are not used in INTR[0-3], TRAP[0-1], TLB miss,
+; TLB protection violation, or data exception trap handlers.
+
+; .reg cha_cpy, OStmp4 ; copy of CHA
+; .reg chd_cpy, OStmp5 ; copy of CHD
+; .reg chc_cpy, OStmp6 ; copy of CHC
+; .reg LTemp0, OStmp7 ; local temp 0
+; .reg LTemp1, OStmp8 ; local temp 1
+
+; ****************************************************************************
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/Makefile.in b/c/src/lib/libbsp/a29k/portsw/startup/Makefile.in
new file mode 100644
index 0000000000..5d63825093
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart main sbrk setvec iface
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=ramlink romlink $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) ramlink romlink ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/bspclean.c b/c/src/lib/libbsp/a29k/portsw/startup/bspclean.c
new file mode 100644
index 0000000000..5243205870
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/bspclean.c
@@ -0,0 +1,30 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and usually returns
+ * control to a monitor.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+#ifndef lint
+static char _sccsid[] = "@(#)bspclean.c 04/08/96 1.1\n";
+#endif
+
+void bsp_cleanup( void )
+{
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/bspstart.c b/c/src/lib/libbsp/a29k/portsw/startup/bspstart.c
new file mode 100644
index 0000000000..695a4e25ca
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/bspstart.c
@@ -0,0 +1,293 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+#ifndef lint
+static char _sccsid[] = "@(#)bspstart.c 09/11/96 1.15\n";
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+#define HEAP_BLOCK_SIZE (16 * 1024)
+
+rtems_unsigned32 heap_size = 0;
+rtems_unsigned32 heap_start;
+
+void bsp_libc_init()
+{
+ heap_size = 2 * 1024 * 1024; /* allocate a maximum of 2 megabytes for the heap */
+
+ /* allocate all remaining memory to the heap */
+ do {
+ heap_size -= HEAP_BLOCK_SIZE;
+ heap_start = _sysalloc( heap_size );
+ } while ( !heap_start );
+
+ if (!heap_start)
+ rtems_fatal_error_occurred( heap_size );
+
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /*
+ * The last parameter to RTEMS_Malloc_Initialize is the "chunk"
+ * size which a multiple of will be requested on each sbrk()
+ * call by malloc(). A value of 0 indicates that sbrk() should
+ * not be called to extend the heap.
+ */
+
+ RTEMS_Malloc_Initialize((void *) heap_start, heap_size, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+
+ printf("allocated %d heap size, %d work space size\n",
+ heap_size, BSP_Configuration.work_space_size);
+ printf(" work space start 0x%x\n",(unsigned int)BSP_Configuration.work_space_start);
+}
+
+
+int bsp_start(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /* set the PIA0 register wait states */
+ *(volatile unsigned32 *)0x80000020 = 0x04080000;
+
+ /*
+ * Allocate the memory for the RTEMS Work Space. This can come from
+ * a variety of places: hard coded address, malloc'ed from outside
+ * RTEMS world (e.g. simulator or primitive memory manager), or (as
+ * typically done by stock BSPs) by subtracting the required amount
+ * of work space from the last physical address on the CPU board.
+ */
+
+ /*
+ * Copy the Configuration Table .. so we can change it
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Add 1 extension for stack checker
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ /*
+ * Need to "allocate" the memory for the RTEMS Workspace and
+ * tell the RTEMS configuration where it is. This memory is
+ * not malloc'ed. It is just "pulled from the air".
+ */
+
+ BSP_Configuration.work_space_start = _sysalloc( BSP_Configuration.work_space_size + 512 );
+ if (!BSP_Configuration.work_space_start)
+ rtems_fatal_error_occurred( BSP_Configuration.work_space_size );
+
+ BSP_Configuration.work_space_start = (void *) ((unsigned int)((char *)BSP_Configuration.work_space_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1));
+
+ /*
+ * initialize the CPU table for this BSP
+ */
+
+ /*
+ * we do not use the pretasking_hook
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_system_initialization_stack = 0;
+
+ /*
+ * Don't forget the other CPU Table entries.
+ */
+
+ _settrap( 109,&a29k_enable_sup);
+ _settrap( 110,&a29k_disable_sup);
+ _settrap( 111,&a29k_enable_all_sup);
+ _settrap( 112,&a29k_disable_all_sup);
+ _settrap( 106,&a29k_context_switch_sup);
+ _settrap( 107,&a29k_context_restore_sup);
+ _settrap( 108,&a29k_context_save_sup);
+ _settrap( 105,&a29k_sigdfl_sup);
+
+ /*
+ * Start RTEMS
+ */
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/iface.c b/c/src/lib/libbsp/a29k/portsw/startup/iface.c
new file mode 100644
index 0000000000..90ab480037
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/iface.c
@@ -0,0 +1,96 @@
+/*
+ * glue.c -- all the code to make GCC and the libraries run on
+ * a target board running RTEMS. These should work with
+ * any target which conforms to the RTEMS BSP.
+ *
+ * $Id$
+ */
+
+#ifndef lint
+static char _sccsid[] = "@(#)iface.c 04/12/96 1.1\n";
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+int
+read(int fd,
+ char *buf,
+ int nbytes)
+{
+ return __rtems_read(fd, buf, nbytes);
+}
+
+int
+write(int fd,
+ char *buf,
+ int nbytes)
+{
+ return __rtems_write(fd, buf, nbytes);
+}
+
+int
+open(char *buf,
+ int flags,
+ int mode)
+{
+ return __rtems_open(buf, flags, mode);
+}
+
+int
+close(int fd)
+{
+ return __rtems_close(fd);
+}
+
+/*
+ * isatty -- returns 1 if connected to a terminal device,
+ * returns 0 if not.
+ */
+int
+isatty(int fd)
+{
+ return __rtems_isatty(fd);
+}
+
+/*
+ * lseek -- move read/write pointer. Since a serial port
+ * is non-seekable, we return an error.
+ */
+off_t
+lseek(int fd,
+ off_t offset,
+ int whence)
+{
+ return __rtems_lseek(fd, offset, whence);
+}
+
+/*
+ * fstat -- get status of a file. Since we have no file
+ * system, we just return an error.
+ */
+int
+fstat(int fd,
+ struct stat *buf)
+{
+ return __rtems_fstat(fd, buf);
+}
+
+int
+getpid()
+{
+ return __rtems_getpid();
+}
+
+/*
+ * kill -- go out via exit...
+ */
+int
+kill(int pid,
+ int sig)
+{
+ return __rtems_kill(pid, sig);
+}
+
+
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/main.c b/c/src/lib/libbsp/a29k/portsw/startup/main.c
new file mode 100644
index 0000000000..e6029d05fe
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/main.c
@@ -0,0 +1,39 @@
+/* main()
+ *
+ * This is the entry point for the application. It calls
+ * the bsp_start routine to the actual dirty work.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+#ifndef lint
+static char _sccsid[] = "@(#)main.c 06/30/96 1.2\n";
+#endif
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ bsp_start( argc, argv, environp );
+
+ /*
+ * May be able to return to the "crt/start.s" code but also
+ * may not be able to. Do something here which is board dependent.
+ */
+
+ _exit(0);
+ rtems_fatal_error_occurred( 0 );
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/ramlink b/c/src/lib/libbsp/a29k/portsw/startup/ramlink
new file mode 100644
index 0000000000..8f48e3b395
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/ramlink
@@ -0,0 +1,11 @@
+;@(#)ez030.cmd 1.1 93/04/06 20:00:10, Copyright 1993 AMD.
+;Linker command file header for EZ-030 evaluation board.
+;Usage: ld29 -c .../29k/lib/ez030.cmd -o ...
+; -or-
+; hc29 -cmdez030.cmd ...
+;
+; $Id$
+;
+ALIGN .text=8192
+ALIGN .data=8192
+ORDER .text=0x40005000,!text,!data,!lit,!bss
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/romlink b/c/src/lib/libbsp/a29k/portsw/startup/romlink
new file mode 100644
index 0000000000..043b2ed32c
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/romlink
@@ -0,0 +1,146 @@
+;
+; $Id$
+;
+;#{
+;# SCCS INFORMATION:
+;# SID = @(#)sa29200.lnk 4.1; DLU=95/09/14-11:05:57
+;# Q = @(#) Copyright (C) 1995 Advanced Micro Devices, Inc.
+;# Module Type = @(#) OSBOOT/DBG_CORE absolute liker file (AMD-EPD-29K, AMIR)
+;# SCCS Path = %P\%
+;# SCCS File = %F\%
+;# FileName = sa29200.lnk
+;# SCCS ID = 4.1
+;# Date Update = 14 Sep 1995, (DLU=95/09/14-11:05:57)
+;# Date Extract = 12 Oct 1995, (DLE=95/10/12-16:27:31)
+;#}
+; @(#)sa29200.lnk 3.6 94/08/22 11:58:54, Srini, AMD.
+; This is the linker command file used to bind the inrementally linked
+; osboot.o module to a memory map. This also defines some link-time constants
+; used in the code. These constants are genral for all 29K family members.
+; You only need to customize, if necessary, the definitions that affect
+; your target processor, and leave the rest alone.
+; The default values in this file are for binding osboot.o for use with
+; SA29200 stand-alone board with the -29200/-29205 option.
+;
+; Order the code segments according to the memory map structure.
+; The defaul OSBOOT has only .text and .bss sections. You need to ORDER
+; other sections of your applications that are not included below.
+; We use separate ORDER statements below to distinguish the two memory
+; regions used. The text section is bound to ROM memory region, and the
+; data region to RAM memory space.
+; MAKE SURE to order the BSS section at the very end. This is because the
+; BSS section size could get adjusted after linking with raminit.o (produced
+; by romcoff utility) or other initialization routines. This change in size
+; could affect the offsets used by the program to refer to the remaining data
+; sections that follow BSS.
+ALIGN ProcInit=16
+ORDER Reset=0x0
+ORDER ProcInit,OsbText,.text,!text
+ORDER .lit,!lit
+ORDER vectable=0x40000000
+ORDER msg_data=0x40000400
+ORDER .data,!data
+ORDER OsbBss,dbg_030,dbg_bss,cfg_bss,.bss,!bss
+ORDER HeapBase
+ORDER .comment
+; For Stand-Alone application out of ROM use the ORDER statements below:
+; For Stand-Alone application out of RAM use the ORDER statement below:
+;ORDER Reset=0x40010000,ProcInit,OsbText,.text,!text,.lit,!lit,.data,!data,msg_data,dbg_dat,.bss,!bss,HeapBase,.comment
+;
+; definitions of link time constants used in code.
+;
+; Definition of the initial value of CPS register.
+; The value below is for an Am29200 processor. It sets TU, SM,DI, DA,IM fields
+; bits in the register. You may modify it to suit your target environment.
+; Like, changing the IM field for instance. IM is 0x11 by default enabling
+; all INTR[0-3] lines.
+;public _init_CPS=0x87F
+public _init_CPS=0x20813
+;public _init_CPS=0x2081F
+;public _init_CPS=0x081F
+; Define the memory map in general values. The code - except for simulators -
+; configures the external RAM at run-time and updates the DMemSize value.
+; DMemStart and DMemSize are the most important values below. DMemStart is
+; used to initialize the vector base address register (VAB). And DMemSize
+; is used to find the highest addressable data memory to place the register
+; and memory stacks. Remember, DMemSize is configured at run-time for hardware
+; targets and updated.
+public VectorBaseAddress=0x40000000
+public IMemStart=0x0000000
+public IMemSize=0xfffff
+public DMemStart=0x40000000
+#public DMemStart=0x100000
+public DMemSize=0xfffff
+#public DMemSize=0x17ffff
+#public DMemSize=0x3fffffff
+public RMemStart=0x0
+public RMemSize=0xfffff
+public EnableDRAMSizing=1
+;
+; For the 29K Microcontrollers, you need to define the ROM Control register
+; value (RMCT_VALUE), the ROM Configuration register value (RMCF_VALUE), and
+; the DRAM Control register value (DRCT_VALUE) based on DMemSize specified
+; above. This could be overwritten in software targets such as the simulator.
+; ROM and RAM Control registers. ROM COnfiguration. (not valid for Am2900X,
+; Am29050, and Am2903X processors)
+; The DRAM REFRATE value (in DRCT) must be specified here. To disable
+; DRAM refreshing (on a system with no DRAM), set REFRATE field in DRCT
+; to zero. Otherwise, set it to the desired frequency. The default is 0xFF
+; The default values in this file are for Am2920X processors.
+;public RMCT_VALUE=0x03030303
+;public DRCT_VALUE=0x888800FF
+;public RMCF_VALUE=0x00f8f8f8
+;
+public RMCT_VALUE=0x4a424300
+public DRCT_VALUE=0xccc000f0
+public RMCF_VALUE=0x011121ff
+;
+;
+; Execute trap handlers from ROM? If your trap handlers are in ROM space,
+; then set _TRAPINROM to TWO (0x2). It is used to modify the tarp vector
+; address installed to set the R bit when fetched. If the trap handlers in
+; ROM or if there is no ROM-space (no RE bit in CPS), set _TRAPINROM to ZERO.
+; The default in this file is for SA29200 board and _TRAPINROM is set to ZERO.
+public _TRAPINROM=0
+;
+; Define the processor clock frequencies. These values are used by the HIF
+; kernel to provide some HIF services.
+public TicksPerMillisecond=16000
+public ClockFrequency=16000000
+;
+; There are some C functions which are not leaf functions. However, they are
+; no expected to spill or fill registers. We ensure that by setting up a
+; pseudo register stack before calling those functions. The code generated
+; for those functions however do have the prologue and epilogue which refer
+; to the symbols V_SPILL and V_FILL. The linker does not know about these
+; symbols. So we define it here so that it does not complain.
+; If you use the hc29 compiler driver to link the objects it will warn that
+; the definitions here are already internally defined. You
+; can use hc29 with -nocrt0 option to do the linking for linear memory spaces.
+; public V_SPILL=64
+; public V_FILL=65
+;
+; Set the UART debug/monitor port serial communications baud rate.
+;
+public UCLK=32000000
+; INITBAUD defines the cold start baud rate. This is the baud rate
+; the monitor would use when powered up. This can be overridden by
+; defining BAUDRATE on the assembler/compiler command line.
+public INITBAUD=9600
+;
+; Is there a SCC 8530 on the target?
+; If there is an 8530 SC on target, define the symbols below appropriately.
+; The routines in scc8530.s use these values to access the registers of
+; SCC and program it. The default values are for EZ030 target.
+; Baudrate can be specified on the command-line to override the default
+; baud rate defined in scc8530.s.
+; scc channel A control
+;public SCC8530_CHA_CONTROL=0xC0000007
+; scc channel B control
+;public SCC8530_CHB_CONTROL=0xC0000003
+; scc channel A data
+;public SCC8530_CHA_DATA=0xC000000F
+; scc channel B data
+;public SCC8530_CHB_DATA=0xC000000B
+; scc baud clock generator
+;public SCC8530_BAUD_CLK_ENBL=3
diff --git a/c/src/lib/libbsp/a29k/portsw/startup/setvec.c b/c/src/lib/libbsp/a29k/portsw/startup/setvec.c
new file mode 100644
index 0000000000..d0246590df
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/startup/setvec.c
@@ -0,0 +1,49 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the target Board/CPU.
+ * This routine is allowed to be as board dependent as necessary.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+#ifndef lint
+static char _sccsid[] = "@(#)setvec.c 06/30/96 1.2\n";
+#endif
+
+no_cpu_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ no_cpu_isr_entry previous_isr;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ /* XXX: install non-RTEMS ISR as "raw" interupt */
+ _settrap( vector, handler );
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/a29k/portsw/times b/c/src/lib/libbsp/a29k/portsw/times
new file mode 100644
index 0000000000..110130b214
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/times
@@ -0,0 +1,195 @@
+#
+# Timing Test Suite Results for the NO_BSP
+#
+# NOTE: This is just a template. The times are irrelevant since this BSP
+# can only be compiled -- not executed.
+#
+# $Id$
+#
+
+
+Board:
+CPU: include coprocessor if applicable
+Clock Speed:
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column X:
+Column Y:
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/a29k/portsw/wrapup/Makefile.in b/c/src/lib/libbsp/a29k/portsw/wrapup/Makefile.in
new file mode 100644
index 0000000000..d78af51ae7
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/wrapup/Makefile.in
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup console iic ethernet flash nvram
+CPU_PIECES=clock timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(CPU_PIECES), ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/hppa1.1/Makefile.in b/c/src/lib/libbsp/hppa1.1/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/hppa1.1/pxfl/Makefile.in b/c/src/lib/libbsp/hppa1.1/pxfl/Makefile.in
new file mode 100644
index 0000000000..000c6435cb
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/pxfl/Makefile.in
@@ -0,0 +1,49 @@
+#
+# Build the pixelflow bsp by cd'ing into another floss tree and
+# building it there.
+#
+# NOTE: we also jump sideways in rtems tree and install test/support/include
+# so that floss tests can use the rtems test structures
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+SRCS=$(srcdir)/floss-bsp.h
+
+# HACK alert
+# on a 'make -k' we don't want to bomb out of build
+EXIT_CMD=exit 1
+ifeq (k, $(findstring k, $(MAKEFLAGS)))
+EXIT_CMD=true
+endif
+
+
+all install::
+ @$(ECHO); $(ECHO)
+ @if [ ! -d $(FLOSS_ROOT) ]; \
+ then \
+ $(ECHO) "*** ERROR FLOSS_ROOT ($(FLOSS_ROOT)) points to nonexistent directory"; \
+ $(ECHO); $(ECHO); \
+ $(EXIT_CMD); \
+ fi
+ @if [ -f $(FLOSS_ROOT)/PURE ]; \
+ then \
+ $(ECHO) "*** Assuming $(FLOSS_HOME) up to date since ./PURE exists"; \
+ else \
+ cmd="cd $(RTEMS_ROOT)/c/src/tests/support/include; $(MAKE) install"; \
+ $(ECHO) $$cmd; \
+ eval $$cmd || $(EXIT_CMD); \
+ cmd="cd $(FLOSS_ROOT); $(MAKE) $@"; \
+ $(ECHO) $$cmd; \
+ eval $$cmd || $(EXIT_CMD); \
+ fi
+ @$(ECHO); $(ECHO)
+ $(INSTALL) -m 444 $(srcdir)/floss-bsp.h $(PROJECT_RELEASE)/include/bsp.h
diff --git a/c/src/lib/libbsp/hppa1.1/pxfl/README b/c/src/lib/libbsp/hppa1.1/pxfl/README
new file mode 100644
index 0000000000..df3c872a34
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/pxfl/README
@@ -0,0 +1,8 @@
+#
+# $Id$
+#
+
+This is included just to give rtems users an example of how a Makefile
+can "jump" out of the rtems source tree into another one. This was
+used by the developer of the pxfl bsp to allow them to keep their bsp
+outside the normal rtems tree.
diff --git a/c/src/lib/libbsp/hppa1.1/pxfl/floss-bsp.h b/c/src/lib/libbsp/hppa1.1/pxfl/floss-bsp.h
new file mode 100644
index 0000000000..52a22d686b
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/pxfl/floss-bsp.h
@@ -0,0 +1,11 @@
+/*
+ * we need a bsp.h in the rtems tree to keep the src/tests/...
+ * happy.
+ * But our bsp.h really lives in floss tree.
+ *
+ * Fake it out by installing this one in rtems
+ *
+ # $Id$
+ */
+
+#include <floss/bsp.h>
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/Makefile.in b/c/src/lib/libbsp/hppa1.1/simhppa/Makefile.in
new file mode 100644
index 0000000000..8894da86a3
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/Makefile.in
@@ -0,0 +1,16 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+# NOTE: we pick up HPPA clock and timer from libcpu/hppa
+SUB_DIRS=tools include startup tty shmsupp wrapup
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/bsp_specs b/c/src/lib/libbsp/hppa1.1/simhppa/bsp_specs
new file mode 100644
index 0000000000..827767f3d6
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/include/Makefile.in b/c/src/lib/libbsp/hppa1.1/simhppa/include/Makefile.in
new file mode 100644
index 0000000000..6362ab657e
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/include/Makefile.in
@@ -0,0 +1,40 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES = bsp coverhd
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+RTEMS_H_PIECES = ttydrv
+RTEMS_H_FILES=$(RTEMS_H_PIECES:%=$(srcdir)/%.h)
+
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+# If you add equate files, don't forget to uncomment the install line
+# below.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(RTEMS_H_FILES) ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h b/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h
new file mode 100644
index 0000000000..5b53da8b6c
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/include/bsp.h
@@ -0,0 +1,121 @@
+/* bsp.h
+ *
+ * This include file contains all HP PA-RISC simulator definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PXFL_BSP_h
+#define __PXFL_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <rtems/ttydrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 3 /* 3 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 1
+
+#define Install_tm27_vector( handler ) \
+ ( void ) set_vector( handler, HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER, 1 );
+
+#define Cause_tm27_intr() \
+ set_itimer( get_itimer() + 20 )
+
+#define Clear_tm27_intr() \
+ set_eirr( 0x80000000 )
+
+#define Lower_tm27_intr() \
+ { \
+ register unsigned32 ignored; \
+ HPPA_ASM_SSM( HPPA_PSW_I, ignored ); \
+ }
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+extern void Clock_delay(rtems_unsigned32 microseconds);
+#define delay( microseconds ) \
+ Clock_delay(microseconds);
+
+/*
+ * Todo: this should be put somewhere else
+ */
+
+#undef CLOCK_DRIVER_TABLE_ENTRY
+#define CLOCK_DRIVER_TABLE_ENTRY { Clock_initialize, NULL, NULL, NULL, NULL, Clock_control }
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+);
+
+/*
+ * We printf() to a buffer if multiprocessing, *or* if this is set.
+ * ref: src/lib/libbsp/hppa/pxfl/iosupp/consupp.c
+ */
+
+extern int use_print_buffer;
+
+/*
+ * When not doing printf to a buffer, we do printf thru RTEMS libio
+ * and our tty driver. Set it up so that console is right.
+ */
+
+#define CONSOLE_DRIVER_TABLE_ENTRY \
+ { tty_initialize, tty_open, tty_close, tty_read, tty_write, tty_control }
+
+/*
+ * How many libio files we want
+ */
+#define BSP_LIBIO_MAX_FDS 20
+
+#define HPPA_INTERRUPT_EXTERNAL_MPCI HPPA_INTERRUPT_EXTERNAL_10
+
+rtems_isr_entry set_vector(rtems_isr_entry, rtems_vector_number, int);
+
+void bsp_start( void );
+void bsp_cleanup( void );
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration; /* owned by BSP */
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+extern rtems_unsigned32 bsp_isr_level;
+
+extern int cpu_number; /* from 0; cpu number in a multi cpu system */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/include/coverhd.h b/c/src/lib/libbsp/hppa1.1/simhppa/include/coverhd.h
new file mode 100644
index 0000000000..c0abf6bf3d
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C for this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/include/ttydrv.h b/c/src/lib/libbsp/hppa1.1/simhppa/include/ttydrv.h
new file mode 100644
index 0000000000..b20878d99c
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/include/ttydrv.h
@@ -0,0 +1,54 @@
+/*
+ * $Id$
+ */
+
+/*
+ * definitions for the tty driver
+ */
+
+#ifndef _RTEMS_TTYDRV_H
+#define _RTEMS_TTYDRV_H
+
+rtems_device_driver
+tty_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ );
+
+rtems_device_driver
+tty_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ );
+
+rtems_device_driver
+tty_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ );
+
+rtems_device_driver
+tty_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ );
+
+rtems_device_driver
+tty_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ );
+
+rtems_device_driver
+tty_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ );
+
+#endif /* _RTEMS_TTYDRV_H */
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/Makefile.in b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/Makefile.in
new file mode 100644
index 0000000000..f0836ef414
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg intr lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/README b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/README
new file mode 100644
index 0000000000..cf60698ca4
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/README
@@ -0,0 +1,9 @@
+#
+# $Id$
+#
+
+This directory contains the SHM driver support files for the
+HP PA-RISC simulator for the 72000 processor.
+
+WARNING: The interrupt support in this directory currently will
+ only work in a homogeneous system.
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/addrconv.c b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/addrconv.c
new file mode 100644
index 0000000000..cb1d3ec2f1
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/addrconv.c
@@ -0,0 +1,30 @@
+/* Shm_Convert_address
+ *
+ * No address range conversion is required.
+ *
+ * Input parameters:
+ * address - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+
+void *Shm_Convert_address(
+ void *address
+)
+{
+ return ( address );
+}
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c
new file mode 100644
index 0000000000..5be4975624
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/getcfg.c
@@ -0,0 +1,89 @@
+/* void Shm_Get_configuration( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the HP PA-RISC
+ * simulator.
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+ * NOTES: The MP interrupt used is the Runway bus' ability to directly
+ * address the control registers of up to four CPUs and cause
+ * interrupts on them.
+ *
+ * The following table illustrates the configuration limitations:
+ *
+ * BUS MAX
+ * MODE ENDIAN NODES
+ * ========= ====== =======
+ * POLLED BIG 2+
+ * INTERRUPT BIG 2..4 (on Runway)
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include <shm.h>
+
+#define INTERRUPT 0 /* can be interrupt or polling */
+#define POLLING 1
+
+#define HPPA_RUNWAY_PROC_HPA_BASE ((void *) 0xFFFA0000)
+
+/* given a processor number, where is its HPA? */
+#define HPPA_RUNWAY_HPA(cpu) \
+ ((rtems_unsigned32) (HPPA_RUNWAY_PROC_HPA_BASE + ((cpu) * 0x2000)))
+
+#define HPPA_RUNWAY_REG_IO_EIR_OFFSET 0x000
+
+shm_config_table BSP_shm_cfgtbl;
+
+extern void Shm_Cause_interrupt_pxfl( rtems_unsigned32 node );
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+ BSP_shm_cfgtbl.base = (vol_u32 *) 0x44000000;
+ BSP_shm_cfgtbl.length = 16 * KILOBYTE;
+ BSP_shm_cfgtbl.format = SHM_BIG;
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt_pxfl;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#else
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
+#endif
+
+#if ( POLLING == 1 )
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+#else
+ BSP_shm_cfgtbl.poll_intr = INTR_MODE;
+ BSP_shm_cfgtbl.Intr.address =
+ (vol_u32 *) (HPPA_RUNWAY_HPA( localnode - 1) +
+ HPPA_RUNWAY_REG_IO_EIR_OFFSET);
+ BSP_shm_cfgtbl.Intr.value = HPPA_INTERRUPT_EXTERNAL_MPCI;
+ BSP_shm_cfgtbl.Intr.length = LONG;
+#endif
+
+ *shmcfg = &BSP_shm_cfgtbl;
+}
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c
new file mode 100644
index 0000000000..81c329898a
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/intr.c
@@ -0,0 +1,51 @@
+/* void Shm_Cause_interrupt_pxfl( node )
+ *
+ * This routine is the shared memory driver routine which
+ * generates interrupts to other CPUs.
+ *
+ * Input parameters:
+ * node - destination of this packet (0 = broadcast)
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+
+#include <rtems.h>
+#include <rtems/error.h>
+
+#include <shm.h>
+
+void Shm_Cause_interrupt_pxfl(
+ rtems_unsigned32 node
+)
+{
+ Shm_Interrupt_information *intr;
+ rtems_unsigned32 *u32;
+ rtems_unsigned32 value;
+
+ intr = &Shm_Interrupt_table[node];
+ value = intr->value;
+
+ switch ( intr->length ) {
+ case NO_INTERRUPT:
+ break;
+
+ case LONG:
+ u32 = (rtems_unsigned32 *)intr->address;
+ HPPA_ASM_STWAS( value, 0, u32 );
+ break;
+ default:
+ fprintf( stderr, "Shm_Cause_interrupt_pxfl: Unsupported length!!!\n" );
+ }
+}
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/lock.c b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/lock.c
new file mode 100644
index 0000000000..b42918249b
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/lock.c
@@ -0,0 +1,75 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = LQ_UNLOCKED;
+}
+
+/* Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+ vol_u32 *lockptr = &lq_cb->lock;
+ rtems_unsigned32 lock_value;
+
+ rtems_interrupt_disable( isr_level );
+
+ Shm_isrstat = isr_level;
+
+ do {
+ HPPA_ASM_LDCWS( 0, 0, lockptr, lock_value );
+ } while (lock_value == SHM_LOCK_VALUE);
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ lq_cb->lock = SHM_UNLOCK_VALUE;
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/mpisr.c b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/mpisr.c
new file mode 100644
index 0000000000..da22325789
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/shmsupp/mpisr.c
@@ -0,0 +1,27 @@
+/* Shm_setvec
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+
+void Shm_setvec( void )
+{
+ set_vector( Shm_isr, HPPA_INTERRUPT_EXTERNAL_MPCI, 1 );
+}
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/start/start.s b/c/src/lib/libbsp/hppa1.1/simhppa/start/start.s
new file mode 100644
index 0000000000..92fda897d9
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/start/start.s
@@ -0,0 +1,169 @@
+/*
+ * crt0.S -- startup file for hppa on RTEMS
+ *
+ * $Id$
+ */
+
+ .COPYRIGHT "crt0.S for hppa"
+
+ .DATA
+
+_progname .STRINGZ "simhppa"
+_crt0_argv .WORD _progname, 0
+
+/*
+ * Set up the standard spaces (sections) These definitions come
+ * from /lib/pcc_prefix.s.
+ */
+ .TEXT
+
+/*
+ * stuff we need that is defined elsewhere.
+ */
+ .IMPORT main, CODE
+ .IMPORT _bss_start, DATA
+ .IMPORT _bss_end, DATA
+ .IMPORT environ, DATA
+
+/*
+ * start -- set things up so the application will run.
+ *
+ */
+ .PROC
+ .CALLINFO SAVE_SP, FRAME=48
+ .EXPORT $START$,ENTRY
+ .EXPORT start,ENTRY
+$START$
+start:
+
+/*
+ * Get a stack
+ */
+
+ ldil L%crt_stack+48,%r30
+ ldo R%crt_stack+48(%r30),%r30
+
+/*
+ * we need to set %r27 (global data pointer) here
+ */
+
+ ldil L%$global$,%r27
+ ldo R%$global$(%r27),%r27
+
+/*
+ * zerobss -- zero out the bss section
+ * XXX We don't do this since simulator and boot rom will do this for us.
+ */
+#if 0
+ ; load the start of bss
+ ldil L%_bss_start,%r4
+ ldo R%_bss_start(%r4),%r4
+
+ ; load the end of bss
+ ldil L%_bss_end,%r5
+ ldo R%_bss_end(%r5),%r5
+
+
+bssloop
+ addi -1,%r5,%r5 ; decrement _bss_end
+ stb %r0,0(0,%r5) ; we do this by bytes for now even
+ ; though it is slower, it is safer
+ combf,= %r4,%r5, bssloop
+ nop
+#endif
+
+ ldi 1,%ret0
+
+/*
+ * Call the "main" routine from the application to get it going.
+ * We call it as main(1, argv, 0)
+ */
+
+ copy %r0, %r24
+
+ ldil L%_crt0_argv,%r25
+ ldo R%_crt0_argv(%r25),%r25
+
+ bl main,%r2
+ ldo 1(%r0), %r26
+
+ .PROCEND
+/*
+ * _exit -- Exit from the application. Normally we cause a user trap
+ * to return to the ROM monitor for another run, but with
+ * this monitor we can not. Still, "C" wants this symbol, it
+ * should be here. Jumping to 0xF0000004 jumps back into the
+ * firmware, while writing a 5 to 0xFFFE0030 causes a reset.
+ */
+_exit_fallthru
+ .PROC
+ .CALLINFO
+ .ENTRY
+
+ ;; This just causes a breakpoint exception
+ break 0x0,0x0
+ bv,n (%rp)
+ nop
+ .EXIT
+ .PROCEND
+
+/*
+ * _sr4export -- support for called functions. (mostly for GDB)
+ */
+ .EXPORT _sr4export, ENTRY
+_sr4export:
+ .PROC
+ .CALLINFO
+ .ENTRY
+
+ ble 0(%sr4,%r22)
+ copy %r31,%rp
+ ldw -18(%sr0,%sp),%rp
+ ldsid (%sr0,%rp),%r1
+ mtsp %r1,%sr0
+ be,n 0(%sr0,%rp)
+ nop
+ .EXIT
+ .PROCEND
+
+
+ .subspa $UNWIND_START$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=56
+ .export $UNWIND_START
+$UNWIND_START
+ .subspa $UNWIND$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=64
+ .subspa $UNWIND_END$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=72
+ .export $UNWIND_END
+$UNWIND_END
+ .subspa $RECOVER_START$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=73
+ .export $RECOVER_START
+$RECOVER_START
+ .subspa $RECOVER$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=80
+ .subspa $RECOVER_END$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=88
+ .export $RECOVER_END
+$RECOVER_END
+
+/*
+ * Here we set up the standard date sub spaces.
+ *
+ * Set up some room for a stack. We just grab a chunk of memory.
+ * We also setup some space for the global variable space, which
+ * must be done using the reserved name "$global$" so "C" code
+ * can find it. The stack grows towards the higher addresses.
+ */
+
+ .subspa $DATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=16
+ .subspa $SHORTDATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=24
+ .subspa $GLOBAL$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=40
+ .export $global$
+$global$
+ .subspa $SHORTBSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=80,ZERO
+ .subspa $BSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=82,ZERO
+
+ .subspa $STACK$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=88,ZERO
+
+ .export crt_stack
+crt_stack
+ .comm 0x1000
+
+ .end
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/startup/Makefile.in b/c/src/lib/libbsp/hppa1.1/simhppa/startup/Makefile.in
new file mode 100644
index 0000000000..126cf30f27
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/startup/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+CC_PIECES=rtems-ctor
+CC_FILES=$(CC_PIECES:%=%.cc)
+CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+# We install the RTEMS constructor as a separate .o
+# so it can be easily place correctly by the compiler config file.
+INSTALLED_O_FILES=$(ARCH)/rtems-ctor.o
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(INSTALLED_O_FILES) $(PGM)
+ $(INSTALL_VARIANT) $(INSTALLED_O_FILES) ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspclean.c b/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspclean.c
new file mode 100644
index 0000000000..910640ed2c
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspclean.c
@@ -0,0 +1,36 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and returns
+ * control to a monitor but on the HP PA-RISC simulator
+ * we do that directly from main.c.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+/*
+ * The app has "exited" (called rtems_shutdown_executive)
+ */
+
+void bsp_cleanup( void )
+{
+ /*
+ * Invoke any fatal error extension and "halt"
+ * By definition, rtems_fatal_error_occurred does not return.
+ */
+
+ rtems_fatal_error_occurred(0);
+}
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c b/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c
new file mode 100644
index 0000000000..a77c43c822
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/startup/bspstart.c
@@ -0,0 +1,439 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * Called by RTEMS::RTEMS constructor in startup-ctor.cc
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+extern rtems_configuration_table Configuration;
+
+rtems_configuration_table BSP_Configuration;
+rtems_cpu_table Cpu_table;
+rtems_unsigned32 bsp_isr_level;
+
+int cpu_number;
+
+#define WORKSPACE_SIZE (1024 * 1024)
+rtems_unsigned8 MY_WORK_SPACE[ WORKSPACE_SIZE ];
+
+/*
+ * Amount to increment itimer by each pass
+ * It is a variable instead of a #define to allow the 'looptest'
+ * script to bump it without recompiling rtems
+ */
+
+rtems_unsigned32 CPU_HPPA_CLICKS_PER_TICK;
+
+#if SIMHPPA_FAST_IDLE
+
+/*
+ * Many of the tests are very slow on the simulator because they have
+ * have 5 second delays hardwired in.
+ * Try to speed those tests up by speeding up the clock when in idle
+ */
+
+rtems_extension
+fast_idle_switch_hook(rtems_tcb *current_task,
+ rtems_tcb *heir_task)
+{
+ static rtems_unsigned32 normal_clock = ~0;
+ static rtems_unsigned32 fast_clock;
+
+ /* init our params on first call */
+ if (normal_clock == (rtems_unsigned32) ~0)
+ {
+ normal_clock = CPU_HPPA_CLICKS_PER_TICK;
+ fast_clock = CPU_HPPA_CLICKS_PER_TICK / 0x100;
+ if (fast_clock == 0) /* who? me? pathological? never! */
+ fast_clock++;
+ }
+
+ /*
+ * Checking for 'name' field of 'IDLE' is not the best/safest,
+ * but its the best we could think of at the moment.
+ */
+
+ if (heir_task == _Thread_Idle)
+ CPU_HPPA_CLICKS_PER_TICK = fast_clock;
+ else if (current_task == _Thread_Idle)
+ CPU_HPPA_CLICKS_PER_TICK = normal_clock;
+}
+
+#endif
+
+/*
+ * Function: bsp_libc_init
+ * Created: 94/12/6
+ *
+ * Description:
+ * Initialize whatever libc we are using
+ * called from bsp_postdriver_hook
+ *
+ *
+ * Parameters:
+ * none
+ *
+ * Returns:
+ * none.
+ *
+ * Side Effects:
+ *
+ *
+ * Notes:
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+void
+bsp_libc_init(void)
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ * XXX; this should allow for case of some other non-clock interrupts
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+
+ /*
+ * on MP systems, always use the print buffer
+ * instead of the (broken) system calls
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ use_print_buffer = 1;
+
+#ifdef SIMHPPA_ROM
+ use_print_buffer = 1;
+#endif
+}
+
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * Parameters:
+ * none
+ *
+ * Returns:
+ * nada
+ *
+ * Side Effects:
+ * installs a few extensions
+ *
+ * Notes:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#if SIMHPPA_FAST_IDLE
+ /*
+ * Install the fast idle task switch extension
+ *
+ * on MP systems, might now want to do this; it confuses at least
+ * one test (mp06)
+ */
+
+#if 0
+ if (BSP_Configuration.User_multiprocessing_table == 0)
+#endif
+ {
+ rtems_extensions_table fast_idle_extension;
+ rtems_id extension_id;
+ rtems_status_code rc;
+
+ memset(&fast_idle_extension, 0, sizeof(fast_idle_extension));
+
+ fast_idle_extension.thread_switch = fast_idle_switch_hook;
+
+ rc = rtems_extension_create(rtems_build_name('F', 'D', 'L', 'E'),
+ &fast_idle_extension, &extension_id);
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+ }
+#endif
+
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+}
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+/*
+ * Function: bsp_start
+ * Created: 94/12/6
+ *
+ * Description:
+ * called by crt0 as our "main" equivalent
+ *
+ *
+ *
+ * Parameters:
+ *
+ *
+ * Returns:
+ *
+ *
+ * Side Effects:
+ *
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+
+void
+bsp_start(void)
+{
+ /*
+ * Set cpu_number to accurately reflect our cpu number
+ */
+
+#ifdef hppa7200
+ /*
+ * Use HPPA_DR0 if supported
+ */
+ {
+ int dr0;
+ HPPA_ASM_MFCPU(HPPA_DR0, dr0);
+ cpu_number = (dr0 >> 4) & 0x7;
+ }
+#else
+ if (Configuration.User_multiprocessing_table)
+ cpu_number = Configuration.User_multiprocessing_table->node - 1;
+ else
+ cpu_number = 0;
+#endif
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)MY_WORK_SPACE;
+ if (BSP_Configuration.work_space_size)
+ BSP_Configuration.work_space_size = WORKSPACE_SIZE;
+
+ /*
+ * Set up our hooks
+ * Make sure libc_init is done before drivers init'd so that
+ * they can use atexit()
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook; /* register drivers */
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ /*
+ * Don't zero out the workspace. The simulator did it for us.
+ */
+
+ Cpu_table.do_zero_of_workspace = FALSE;
+
+ Cpu_table.interrupt_stack_size = (12 * 1024);
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Set this artificially low for the simulator
+ */
+
+ Cpu_table.itimer_clicks_per_microsecond = 1;
+
+#if 0
+ /*
+ * Commented by DIVISION INC. External interrupt
+ * processing is now divorced from RTEMS for HPPA.
+ */
+
+ /*
+ * Determine the external interrupt processing order
+ * the external interrupt handler walks thru this table, in
+ * order checking for posted interrupts.
+ */
+
+ Cpu_table.external_interrupts = 0;
+
+ Cpu_table.external_interrupt[ Cpu_table.external_interrupts ] =
+ HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER;
+ Cpu_table.external_interrupts++;
+
+ if ( Configuration.User_multiprocessing_table ) {
+ Cpu_table.external_interrupt[ Cpu_table.external_interrupts ] =
+ HPPA_INTERRUPT_EXTERNAL_10;
+ Cpu_table.external_interrupts++;
+ }
+#endif
+
+ /*
+ * Add 1 region for RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+#ifdef RTEMS_NEWLIB
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Add 1 extension for stack checker
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+#if SIMHPPA_FAST_IDLE
+ /*
+ * Add 1 extension for fast idle
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ /*
+ * Add 1 extension for MPCI_fatal
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ BSP_Configuration.maximum_extensions++;
+
+ /*
+ * Set the "clicks per tick" for the simulator
+ * used by libcpu/hppa/clock/clock.c to schedule interrupts
+ *
+ * Set it only if 0 to allow for simulator setting it via script
+ * on test startup.
+ */
+
+ if (CPU_HPPA_CLICKS_PER_TICK == 0)
+ CPU_HPPA_CLICKS_PER_TICK = 0x4000;
+
+ /*
+ * Start most of RTEMS
+ * main() will start the rest
+ */
+
+ bsp_isr_level = rtems_initialize_executive_early(
+ &BSP_Configuration,
+ &Cpu_table
+ );
+}
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c b/c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c
new file mode 100644
index 0000000000..3da6284ab6
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/startup/setvec.c
@@ -0,0 +1,66 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the HP PA-RISC simulator.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * NOTE 'type' is ignored on hppa; all interrupts are owned by RTEMS
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+/*
+ * Install an interrupt handler in the right place
+ * given its vector number from cpu/hppa.h
+ * There are 2 places an interrupt can be installed
+ * _ISR_Vector_table
+ * bsp interrupt XXX: nyi
+ *
+ * We decide which based on the vector number
+ */
+
+rtems_isr_entry
+set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ rtems_isr_entry previous_isr;
+
+ /* is it an on chip interrupt? */
+ /* XXX this should say CPU_INTERRUPT_NUMBER_OF_VECTORS */
+ if (vector < HPPA_INTERRUPT_MAX)
+ {
+ rtems_interrupt_catch(handler, vector, &previous_isr);
+ }
+#if 0 /* XXX */
+ else if ((vector >= HPPA_INTERRUPT_BSP_BASE) &&
+ (vector < (HPPA_INTERRUPT_BSP_BASE + HPPA_BSP_INTERRUPTS)))
+ {
+ pxfl_interrupt_install(handler,
+ vector - HPPA_INTERRUPT_BSP_BASE,
+ (rtems_isr_entry *) &previous_isr);
+ }
+#endif
+
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/times b/c/src/lib/libbsp/hppa1.1/simhppa/times
new file mode 100644
index 0000000000..272488a8c0
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/times
@@ -0,0 +1,7 @@
+#
+# Timing Test Suite Results for the PA-RISC Simulator.
+#
+# $Id$
+#
+
+Times are not available for the PA-RISC Simulator.
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/tools/Makefile.in b/c/src/lib/libbsp/hppa1.1/simhppa/tools/Makefile.in
new file mode 100644
index 0000000000..57315a8cda
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/tools/Makefile.in
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# we use host compiler here for genoffsets. Hopefully it has same alignment!!
+USE_HOST_COMPILER=yes
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=print_dump
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PGMS=${ARCH}/print_dump
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here.
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGMS)
+ $(INSTALL) -m 555 ${PGMS} ${PROJECT_RELEASE}/bin
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/tools/print_dump.c b/c/src/lib/libbsp/hppa1.1/simhppa/tools/print_dump.c
new file mode 100644
index 0000000000..7e210f8804
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/tools/print_dump.c
@@ -0,0 +1,325 @@
+/*
+ * print_dump
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "v"
+
+char *USAGE = "\
+usage: print_dump [ -v ] \n\
+ -v -- verbose\n\
+ Reads HP simulator 'memdump' output of 'print_buffer' structure
+ on stdin. Dumps it out in vanilla ASCII.
+";
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define Failed(x) (((int) (x)) == -1)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+
+typedef union uval {
+ u8 uv_chars[4];
+ u16 uv_words[2];
+ u32 uv_long;
+ void *uv_ptr[sizeof(long) / sizeof(void *)];
+} uval_t;
+
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+void error(int errn, ...);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* error is fatal; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+int process(void);
+void prchar(unsigned int ch);
+
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ return process();
+}
+
+
+/*
+ * process(arg)
+ *
+ * Input looks like this
+ *
+ * Starting address: 00000001.480035a0
+ * -----------------------------------
+
++0000 / 0d0a0d0a 2a2a2a20 53454d20 54455354 202d2d20 4e4f4445 2032202a 2a2a0d0a
++0020 / 73703a20 30783433 30303030 31300d0a 30783438 30613161 38383a20 676f7420
+ ....
++0b40 / xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
+
+ *
+ * The 'xxxxxxxxx' shows up if the page has not been allocated.
+ */
+
+int
+process(void)
+{
+ uval_t b[8];
+ u32 ignore;
+ char *p;
+ int i;
+ int failed_once;
+
+ char line[1024];
+
+#define PRINT_BUFFER_SIZE (16 * 1024)
+ struct {
+ int index;
+ int size;
+ u8 buffer[PRINT_BUFFER_SIZE];
+ } print_buffer;
+
+ /* we stuff the data into print_buffer using memcpy() */
+ p = (char *) &print_buffer;
+
+ failed_once = 0;
+
+ while (gets(line))
+ {
+ char *cp;
+
+ /* hack; deal with the 'xxxxxxxx' problem noted above */
+ for (cp=line; *cp; cp++)
+ if (*cp == 'x')
+ *cp = '0';
+
+ if (*line != '+')
+ continue;
+ if (sscanf(line, "+%x / %x %x %x %x %x %x %x %x\n",
+ &ignore,
+ &b[0].uv_long,
+ &b[1].uv_long,
+ &b[2].uv_long,
+ &b[3].uv_long,
+ &b[4].uv_long,
+ &b[5].uv_long,
+ &b[6].uv_long,
+ &b[7].uv_long) != 9)
+ {
+ if (failed_once)
+ error(ERR_FATAL, "2nd format problem; giving up");
+ error(0, "format problem in line: `%s`", line);
+ failed_once = 1;
+ }
+
+ memcpy((void *) p, (void *) b, sizeof(b));
+ p += sizeof(b);
+ }
+
+ if (verbose)
+ printf("buffer size: %d\n", print_buffer.size);
+
+ if (print_buffer.size < 0)
+ error(ERR_FATAL, "size is too small");
+
+ if (print_buffer.size != sizeof(print_buffer.buffer))
+ {
+ error(ERR_FATAL, "buffer size mismatch, expected %d",
+ sizeof(print_buffer.buffer));
+ /* XXX we really should just dynamically allocate the buffer */
+ }
+
+ i = print_buffer.index + 1;
+ while (i != print_buffer.index)
+ {
+ unsigned int c;
+ c = print_buffer.buffer[i++];
+ if (c && (c != '\r'))
+ prchar(c);
+ i %= print_buffer.size;
+ }
+ printf("\n");
+ return 0;
+}
+
+/* de-controlify */
+char *de_control[] = {
+ "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G", "^H", "^I", "^J", "^K",
+ "^L", "^M", "^N", "^O", "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W",
+ "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_",
+ " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-",
+ ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";",
+ "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I",
+ "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
+ "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e",
+ "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
+ "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "^?",
+ "M-^@", "M-^A", "M-^B", "M-^C", "M-^D", "M-^E", "M-^F", "M-^G",
+ "M-^H", "M-^I", "M-^J", "M-^K", "M-^L", "M-^M", "M-^N", "M-^O",
+ "M-^P", "M-^Q", "M-^R", "M-^S", "M-^T", "M-^U", "M-^V", "M-^W",
+ "M-^X", "M-^Y", "M-^Z", "M-^[", "M-^\\", "M-^]", "M-^~", "M-^_",
+ "M- ", "M-!", "M-\"", "M-#", "M-$", "M-%", "M-&", "M-'",
+ "M-(", "M-)", "M-*", "M-+", "M-,", "M--", "M-.", "M-/",
+ "M-0", "M-1", "M-2", "M-3", "M-4", "M-5", "M-6", "M-7",
+ "M-8", "M-9", "M-:", "M-;", "M-<", "M-=", "M->", "M-?",
+ "M-@", "M-A", "M-B", "M-C", "M-D", "M-E", "M-F", "M-G",
+ "M-H", "M-I", "M-J", "M-K", "M-L", "M-M", "M-N", "M-O",
+ "M-P", "M-Q", "M-R", "M-S", "M-T", "M-U", "M-V", "M-W",
+ "M-X", "M-Y", "M-Z", "M-[", "M-\\", "M-]", "M-^", "M-_",
+ "M-`", "M-a", "M-b", "M-c", "M-d", "M-e", "M-f", "M-g",
+ "M-h", "M-i", "M-j", "M-k", "M-l", "M-m", "M-n", "M-o",
+ "M-p", "M-q", "M-r", "M-s", "M-t", "M-u", "M-v", "M-w",
+ "M-x", "M-y", "M-z", "M-{", "M-|", "M-}", "M-~", "M-^?"
+};
+
+/*
+ * prchar(ch); print ch in a readable format, ie ^X or X or ~^X or DEL, etc.
+ */
+
+void
+prchar(unsigned int ch)
+{
+ if (isprint(ch) || isspace(ch))
+ putchar(ch);
+ else
+ printf("%s", de_control[ch]);
+}
+
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_EXIT bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, local_errno ? "fatal error, exiting" : "exiting");
+ exit(local_errno);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/tty/Makefile.in b/c/src/lib/libbsp/hppa1.1/simhppa/tty/Makefile.in
new file mode 100644
index 0000000000..ddaf3924e5
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/tty/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/tty.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=tty
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/tty/tty.c b/c/src/lib/libbsp/hppa1.1/simhppa/tty/tty.c
new file mode 100644
index 0000000000..b89a707739
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/tty/tty.c
@@ -0,0 +1,247 @@
+/*
+ * Tty IO Driver
+ * This is a "libio" driver based on libc/support/generic/libio interface
+ * which is on top of the RTEMS IO manager.
+ *
+ * These provide UNIX-like read and write calls for the C library.
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <errno.h>
+
+#define PRINT_BUFFER_SIZE (16 * 1024)
+
+/*
+ * NOTE: this structure is dumplicated in print_dump.c utility
+ */
+
+struct {
+ int index;
+ int size;
+ char buffer[PRINT_BUFFER_SIZE];
+} print_buffer;
+
+/* always use printf buffer if non-zero */
+int use_print_buffer;
+
+static int host_read_syscall(int fd, char *buffer, int count);
+static int host_write_syscall(int fd, char *buffer, int count);
+
+rtems_device_driver
+tty_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ )
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name("/dev/tty00",
+ major,
+ (rtems_device_minor_number) 0);
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver
+tty_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver
+tty_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver
+tty_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+
+rtems_device_driver
+tty_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ )
+{
+ rtems_libio_rw_args_t *rw_args;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ /*
+ * If we are printing to a buffer, then just return newline on all
+ * read's. If we return 0 bytes read, then the pause() calls in
+ * the RTEMS tests get hosed (pause() does a gets())
+ */
+
+ if ( use_print_buffer )
+ {
+ *rw_args->buffer = '\n';
+ count = 1;
+ }
+ else
+ {
+ count = host_read_syscall(0, rw_args->buffer, rw_args->count);
+ }
+
+ if (count >= 0)
+ {
+ rw_args->bytes_moved = count;
+ return RTEMS_SUCCESSFUL;
+ }
+ return RTEMS_UNSATISFIED;
+}
+
+rtems_device_driver
+tty_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+ )
+{
+ unsigned32 level;
+ rtems_libio_rw_args_t *rw_args;
+ int count = 0;
+ int fd = 1; /* XXX fixme; needs to be saved in iop */
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ /*
+ * HACK alert
+ *
+ * Some of the simulators have real problems when multi cpu and
+ * using the system calls. Until this is fixed, if we are multi
+ * cpu then we write to a printf buffer
+ */
+
+ if ( use_print_buffer )
+ {
+ /* save size in memory for dumper */
+ if (print_buffer.size == 0)
+ print_buffer.size = PRINT_BUFFER_SIZE;
+
+ while (rw_args->count-- > 0)
+ {
+ rtems_interrupt_disable(level);
+ print_buffer.buffer[print_buffer.index] = *rw_args->buffer++;
+ print_buffer.index++;
+ print_buffer.index &= (PRINT_BUFFER_SIZE - 1);
+ print_buffer.buffer[print_buffer.index] = 0;
+ rtems_interrupt_enable(level);
+ count++;
+ }
+ }
+ else
+ {
+#if 1
+ /*
+ * if on a multi cpu system and writing to stdout, redirect to stderr
+ * so we can keep them separate
+ */
+
+ if ((cpu_number == 1) && (fd == 1))
+ fd = 2;
+#endif
+ count = host_write_syscall(fd, rw_args->buffer, rw_args->count);
+ }
+
+ if (count >= 0)
+ {
+ rw_args->bytes_moved = count;
+ return RTEMS_SUCCESSFUL;
+ }
+ return RTEMS_UNSATISFIED;
+}
+
+
+/*
+ * Host system call hack.
+ * This little trick gets all the args in the right registers
+ * for the system call and permits simpler inline asm.
+ * Since this whole thing (syscalls under simulator) is a hack,
+ * this little bit more is not going to hurt anything.
+ */
+
+
+static int
+host_read_syscall(
+ int fd,
+ char *buffer,
+ int count
+ )
+{
+ unsigned32 level;
+ int rc;
+
+ rtems_interrupt_disable(level);
+
+ /* This is an HPUX system call, with return value copied out */
+ asm volatile (" stw %%r19,-28(0,%%r30)\n\
+ ldil L%%0xc0000000,%%r1\n\
+ ble 4(7,%%r1)\n\
+ ldi 3,%%r22\n\
+ ldw -28(0,%%r30),%%r19\n\
+ copy %%r28, %0"
+ : "=r" (rc)
+ : );
+
+ rtems_interrupt_enable(level);
+ return rc;
+}
+
+static int
+host_write_syscall(
+ int fd,
+ char *buffer,
+ int count
+ )
+{
+ unsigned32 level;
+ int rc;
+
+ rtems_interrupt_disable(level);
+
+ /* This is an HPUX system call, with return value copied out */
+ asm volatile (" stw %%r19,-28(0,%%r30)\n\
+ ldil L%%0xc0000000,%%r1\n\
+ ble 4(7,%%r1)\n\
+ ldi 4,%%r22\n\
+ ldw -28(0,%%r30),%%r19\n\
+ copy %%r28, %0"
+ : "=r" (rc)
+ : );
+
+ rtems_interrupt_enable(level);
+ return rc;
+}
+
diff --git a/c/src/lib/libbsp/hppa1.1/simhppa/wrapup/Makefile.in b/c/src/lib/libbsp/hppa1.1/simhppa/wrapup/Makefile.in
new file mode 100644
index 0000000000..ffcb245350
--- /dev/null
+++ b/c/src/lib/libbsp/hppa1.1/simhppa/wrapup/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup tty shmsupp
+# pieces to pick up out of libcpu/hppa
+CPU_PIECES=clock milli timer
+GENERIC_PIECES=shmdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(CPU_PIECES), \
+ ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), \
+ ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/i386/Makefile.in b/c/src/lib/libbsp/i386/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/i386/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/i386/force386/Makefile.in b/c/src/lib/libbsp/i386/force386/Makefile.in
new file mode 100644
index 0000000000..1280bbaad6
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console shmsupp timer wrapup
diff --git a/c/src/lib/libbsp/i386/force386/bsp_specs b/c/src/lib/libbsp/i386/force386/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/i386/force386/clock/Makefile.in b/c/src/lib/libbsp/i386/force386/clock/Makefile.in
new file mode 100644
index 0000000000..e2def59237
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/clock/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/force386/clock/ckinit.c b/c/src/lib/libbsp/i386/force386/clock/ckinit.c
new file mode 100644
index 0000000000..49644a2edc
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/clock/ckinit.c
@@ -0,0 +1,135 @@
+/* Clock_initialize
+ *
+ * This routine initializes the Motorola MFP 68901 on the
+ * FORCE CPU386 board. The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include <rtems/libio.h>
+
+#include <stdlib.h>
+
+#define CLOCK_VECTOR 0x38
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_major_number rtems_clock_minor = 0;
+
+/*
+ * This is the ISR handler.
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ /* enable_tracing(); */
+ Clock_driver_ticks += 1;
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ outport_byte( TBCR, 0x14 ); /* reset it, delay mode, 50X */
+ outport_byte( TBDR, 0x50 ); /* 1 millisecond */
+ outport_byte( IERA, 0x41 ); /* enable interrupt for B */
+ }
+ atexit( Clock_exit );
+}
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ outport_byte( TBCR, 0x00 ); /* initial value */
+ outport_byte( IERA, 0x40 ); /* disable interrupt */
+ /* ??? Is "do not restore old vector" causing problems? */
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/i386/force386/console/Makefile.in b/c/src/lib/libbsp/i386/force386/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/force386/console/console.c b/c/src/lib/libbsp/i386/force386/console/console.c
new file mode 100644
index 0000000000..63f6e0fb30
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/console/console.c
@@ -0,0 +1,286 @@
+/*
+ * This file contains the Force CPU386 console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define F386_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <stdlib.h>
+
+/* console_cleanup
+ *
+ * This routine is called at exit to clean up the console hardware.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+void console_cleanup( void )
+{
+ register rtems_unsigned8 ignored;
+ /*
+ * FORCE technical support mentioned that it may be necessary to
+ * read the DUSCC RX_BUFFER port four times to remove all junk.
+ * This code is a little more paranoid.
+ */
+
+ inport_byte( RX_BUFFER, ignored );
+ inport_byte( RX_BUFFER, ignored );
+ inport_byte( RX_BUFFER, ignored );
+ inport_byte( RX_BUFFER, ignored );
+ inport_byte( RX_BUFFER, ignored );
+}
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ /*
+ * flush the console now and at exit. Just in case.
+ */
+
+ console_cleanup();
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ atexit( console_cleanup );
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ register rtems_unsigned8 status;
+
+ inport_byte( RX_STATUS, status );
+
+ if ( Is_rx_ready( status ) ) {
+ inport_byte( RX_BUFFER, status );
+ *ch = status;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the UART.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char inbyte( void )
+{
+ register rtems_unsigned8 status;
+ char ch;
+
+ do {
+ inport_byte( RX_STATUS, status );
+ } while ( !Is_rx_ready( status ) );
+
+#if ( PORTB == 1 )
+ /*
+ * Force example code resets the Channel B Receiver here.
+ * It appears to cause XON's to be lost.
+ */
+
+ /* outport_byte( RX_STATUS, 0x10 ); */
+#endif
+
+ inport_byte( RX_BUFFER, ch );
+
+ return ch;
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the port. It supports
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ rtems_unsigned8 status;
+
+ do {
+ inport_byte( TX_STATUS, status );
+ } while ( !Is_tx_ready( status ) );
+
+#if 0
+ while ( is_character_ready( &status ) == TRUE ) { /* must be an XOFF */
+ if ( status == XOFF )
+ do {
+ while ( is_character_ready( &status ) == FALSE ) ;
+ } while ( status != XON );
+ }
+#endif
+
+ outport_byte( TX_BUFFER, ch );
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/i386/force386/include/Makefile.in b/c/src/lib/libbsp/i386/force386/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/i386/force386/include/bsp.h b/c/src/lib/libbsp/i386/force386/include/bsp.h
new file mode 100644
index 0000000000..501103e646
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/include/bsp.h
@@ -0,0 +1,176 @@
+/* bsp.h
+ *
+ * This include file definitions related to the Force CPU-386 board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __FORCE386_h
+#define __FORCE386_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <iosupp.h>
+#include <console.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Use a software interrupt for the i386.
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 0x90, 1 )
+
+#define Cause_tm27_intr() asm volatile( "int $0x90" : : );
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( _microseconds ) \
+ { \
+ rtems_unsigned32 _counter; \
+ \
+ _counter = (_microseconds); \
+ \
+ asm volatile ( "0: nop;" \
+ " mov %0,%0 ;" \
+ " loop 0b" : "=c" (_counter) \
+ : "0" (_counter) \
+ ); \
+ \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+/* I/O addressing */
+
+/*
+ * The following determines whether Port B or the Console should
+ * be used for test I/O. Setting ONE (and only ONE) of these to 1
+ * enables I/O on that port.
+ *
+ * PORT A - DUSCC MC68562 Channel A
+ * PORT B - DUSCC MC68562 Channel B
+ * PORT C - MFP MC68901 Channel (*** FORCEbug console ***)
+ */
+
+#define PORTB 1 /* use port b as test port */
+#define PORTC 0 /* use console port as test port */
+
+#if ( PORTB == 1 )
+#define TX_STATUS 0x1b6 /* DUSCC General Status Register */
+#define RX_STATUS 0x1b6 /* DUSCC General Status Register */
+#define TX_BUFFER 0x1e0 /* DUSCC Transmitter Channel B */
+#define RX_BUFFER 0x1e8 /* DUSCC Receiver Channel B */
+#define Is_tx_ready( _status ) ( (_status) & 0x20 )
+#define Is_rx_ready( _status ) ( (_status) & 0x10 )
+#endif
+
+#if ( PORTC == 1 )
+#define TX_STATUS 0x12c /* MFP Transmit Status Register */
+#define RX_STATUS 0x12a /* MFP Receive Status Register */
+#define TX_BUFFER 0x12e /* MFP Transmitter Channel */
+#define RX_BUFFER 0x12e /* MFP Receiver Channel */
+#define Is_tx_ready( _status ) ( (_status) & 0x80 )
+#define Is_rx_ready( _status ) ( (_status) & 0x80 )
+#endif
+
+/* Timer constants */
+
+#define IERA 0x106 /* Interrupt Enable Register A */
+#define IMRA 0x112 /* Interrupt Mask Register A */
+#define TACR 0x118 /* Timer A Control Register */
+#define TADR 0x11e /* Timer A Data Register */
+
+#define IERB 0x108 /* Interrupt Enable Register B */
+#define TBCR 0x11a /* Timer B Control Register */
+#define TBDR 0x120 /* Timer B Data Register */
+
+/* Structures */
+
+#ifdef F386_INIT
+#undef BSP_EXTERN
+#define BSP_EXTERN
+#else
+#undef BSP_EXTERN
+#define BSP_EXTERN extern
+#endif
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern i386_IDT_slot Interrupt_descriptor_table[ 256 ];
+extern i386_GDT_slot Global_descriptor_table[ 8192 ];
+
+BSP_EXTERN unsigned short Idt[3]; /* Interrupt Descriptor Table Address */
+BSP_EXTERN unsigned short Gdt[3]; /* Global Descriptor Table Address */
+BSP_EXTERN unsigned int Idt_base;
+BSP_EXTERN unsigned int Gdt_base;
+
+/* routines */
+
+i386_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/i386/force386/include/coverhd.h b/c/src/lib/libbsp/i386/force386/include/coverhd.h
new file mode 100644
index 0000000000..2d4e6f5a85
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 3
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 3
+#define CALLING_OVERHEAD_TASK_CREATE 4
+#define CALLING_OVERHEAD_TASK_IDENT 4
+#define CALLING_OVERHEAD_TASK_START 4
+#define CALLING_OVERHEAD_TASK_RESTART 3
+#define CALLING_OVERHEAD_TASK_DELETE 3
+#define CALLING_OVERHEAD_TASK_SUSPEND 3
+#define CALLING_OVERHEAD_TASK_RESUME 3
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 4
+#define CALLING_OVERHEAD_TASK_MODE 4
+#define CALLING_OVERHEAD_TASK_GET_NOTE 4
+#define CALLING_OVERHEAD_TASK_SET_NOTE 4
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 7
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 3
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 4
+#define CALLING_OVERHEAD_CLOCK_GET 7
+#define CALLING_OVERHEAD_CLOCK_SET 7
+#define CALLING_OVERHEAD_CLOCK_TICK 2
+
+#define CALLING_OVERHEAD_TIMER_CREATE 3
+#define CALLING_OVERHEAD_TIMER_IDENT 3
+#define CALLING_OVERHEAD_TIMER_DELETE 3
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 4
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 8
+#define CALLING_OVERHEAD_TIMER_RESET 3
+#define CALLING_OVERHEAD_TIMER_CANCEL 3
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 4
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 3
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 4
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 4
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 3
+
+#define CALLING_OVERHEAD_EVENT_SEND 4
+#define CALLING_OVERHEAD_EVENT_RECEIVE 4
+#define CALLING_OVERHEAD_SIGNAL_CATCH 3
+#define CALLING_OVERHEAD_SIGNAL_SEND 3
+#define CALLING_OVERHEAD_PARTITION_CREATE 4
+#define CALLING_OVERHEAD_PARTITION_IDENT 4
+#define CALLING_OVERHEAD_PARTITION_DELETE 3
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 4
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 4
+#define CALLING_OVERHEAD_REGION_CREATE 4
+#define CALLING_OVERHEAD_REGION_IDENT 3
+#define CALLING_OVERHEAD_REGION_DELETE 3
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 4
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 4
+#define CALLING_OVERHEAD_PORT_CREATE 4
+#define CALLING_OVERHEAD_PORT_IDENT 3
+#define CALLING_OVERHEAD_PORT_DELETE 3
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 4
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 4
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 4
+#define CALLING_OVERHEAD_IO_OPEN 4
+#define CALLING_OVERHEAD_IO_CLOSE 4
+#define CALLING_OVERHEAD_IO_READ 4
+#define CALLING_OVERHEAD_IO_WRITE 4
+#define CALLING_OVERHEAD_IO_CONTROL 4
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 3
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 2
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/i386/force386/shmsupp/Makefile.in b/c/src/lib/libbsp/i386/force386/shmsupp/Makefile.in
new file mode 100644
index 0000000000..113ab8109a
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/shmsupp/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/i386/force386/shmsupp/addrconv.c b/c/src/lib/libbsp/i386/force386/shmsupp/addrconv.c
new file mode 100644
index 0000000000..945f8ad26b
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/shmsupp/addrconv.c
@@ -0,0 +1,32 @@
+/* Shm_Convert_address
+ *
+ * The CPU386 has a "normal" view of the VME address space.
+ * No address range conversion is required.
+ *
+ * Input parameters:
+ * address - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+void *Shm_Convert_address(
+ void *address
+)
+{
+ return ( address );
+}
diff --git a/c/src/lib/libbsp/i386/force386/shmsupp/getcfg.c b/c/src/lib/libbsp/i386/force386/shmsupp/getcfg.c
new file mode 100644
index 0000000000..6a9399657d
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/shmsupp/getcfg.c
@@ -0,0 +1,73 @@
+/* void Shm_Get_configuration( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the FORCE CPU-386
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+ * NOTES: The FORCE CPU-386 does not have an interprocessor interrupt.
+ *
+ * The following table illustrates the configuration limitations:
+ *
+ * BUS MAX
+ * MODE ENDIAN NODES
+ * ========= ====== =======
+ * POLLED BIG 2+
+ * INTERRUPT **** NOT SUPPORTED ****
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <shm.h>
+#include <bsp.h>
+
+#define INTERRUPT 0
+#define POLLING 1 /* FORCE CPU-386 target is polling ONLY!!! */
+
+
+shm_config_table BSP_shm_cfgtbl;
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+ set_segment( get_ds(), 0x00002000, 0xffffd000 );
+
+ BSP_shm_cfgtbl.base = i386_Physical_to_logical(
+ get_ds(),
+ (void *) 0x20000000
+ );
+
+ BSP_shm_cfgtbl.length = 1 * MEGABYTE;
+ BSP_shm_cfgtbl.format = SHM_BIG;
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#else
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
+#endif
+
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+
+ *shmcfg = &BSP_shm_cfgtbl;
+}
diff --git a/c/src/lib/libbsp/i386/force386/shmsupp/lock.c b/c/src/lib/libbsp/i386/force386/shmsupp/lock.c
new file mode 100644
index 0000000000..04d28b3d33
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/shmsupp/lock.c
@@ -0,0 +1,83 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = LQ_UNLOCKED;
+}
+
+/* void _Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+ volatile rtems_unsigned32 *lockptr = &lq_cb->lock;
+ rtems_unsigned32 lock_value;
+
+ lock_value = SHM_LOCK_VALUE;
+ rtems_interrupt_disable( isr_level );
+
+ Shm_isrstat = isr_level;
+ while ( 1 ) {
+ asm volatile( "lock ; xchg (%0),%1"
+ : "=r" (lockptr), "=r" (lock_value)
+ : "0" (lockptr), "1" (lock_value)
+ );
+ if ( lock_value == SHM_UNLOCK_VALUE )
+ break;
+ delay( 10 ); /* approximately 10 microseconds */
+ }
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ lq_cb->lock = SHM_UNLOCK_VALUE;
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
+
diff --git a/c/src/lib/libbsp/i386/force386/shmsupp/mpisr.c b/c/src/lib/libbsp/i386/force386/shmsupp/mpisr.c
new file mode 100644
index 0000000000..451485acfc
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/shmsupp/mpisr.c
@@ -0,0 +1,31 @@
+/* Shm_setvec
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * NOTE: This routine is not used by the FORCE CPU-386 because it
+ * only supports polling mode.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+void Shm_setvec()
+{
+ /* NOT USED ON FORCE CPU-386!!! */
+}
diff --git a/c/src/lib/libbsp/i386/force386/startup/Makefile.in b/c/src/lib/libbsp/i386/force386/startup/Makefile.in
new file mode 100644
index 0000000000..1ea8dbec67
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/startup/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=ldsegs
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(srcdir)/linkcmds $(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/i386/force386/startup/bspstart.c b/c/src/lib/libbsp/i386/force386/startup/bspstart.c
new file mode 100644
index 0000000000..94071a8217
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/startup/bspstart.c
@@ -0,0 +1,225 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * FORCE documentation incorrectly states that the bus request
+ * level is initialized to 3. It is actually initialized by
+ * FORCEbug to 0.
+ */
+
+ outport_byte( 0x00, 0x3f ); /* resets VMEbus request level */
+
+ /*
+ * we do not use the pretasking_hook.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_table_segment = get_ds();
+
+ Cpu_table.interrupt_table_offset = (void *)Interrupt_descriptor_table;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ RAM_END - BSP_Configuration.work_space_size;
+
+ /*
+ * Add 1 region for Malloc in libc_low
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+ /* no cleanup necessary for Force CPU-386 */
+ return 0;
+}
diff --git a/c/src/lib/libbsp/i386/force386/startup/exit.c b/c/src/lib/libbsp/i386/force386/startup/exit.c
new file mode 100644
index 0000000000..e1b8c807e7
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/startup/exit.c
@@ -0,0 +1,29 @@
+/*
+ * exit
+ *
+ * This routine returns control to FORCEbug.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <clockdrv.h>
+#include <iodrv.h>
+
+void _exit( )
+{
+ /* Clock or Timer cleanup is run by at_exit() */
+
+ Io_cleanup();
+
+ bsp_cleanup();
+}
diff --git a/c/src/lib/libbsp/i386/force386/startup/ldsegs.s b/c/src/lib/libbsp/i386/force386/startup/ldsegs.s
new file mode 100644
index 0000000000..7eeff26e81
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/startup/ldsegs.s
@@ -0,0 +1,86 @@
+/* _load_segments
+ *
+ * This file assists the board independent startup code by
+ * loading the proper segment register values. The values
+ * loaded are board dependent.
+ *
+ * NOTE: No stack has been established when this routine
+ * is invoked. It returns by jumping back to bspentry.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+
+/*
+ * FORCEBUG loads us into a virtual address space which
+ * really starts at PHYSICAL_ADDRESS_BASE.
+ */
+
+.set PHYSICAL_ADDRESS_BASE, 0x00002000
+
+/*
+ * At reset time, FORCEBUG normally has the segment selectors preloaded.
+ * If a human resets the instruction pointer, this will not have occurred.
+ * However, no guarantee can be made of the other registers if cs:ip was
+ * modified to restart the program. Because of this, the BSP reloads all
+ * segment registers (except cs) with the values they have following
+ * a reset.
+ */
+
+
+.set RESET_SS, 0x40 # initial value of stack segment register
+.set RESET_DS, 0x40 # initial value of data segment register
+.set RESET_ES, 0x40 # initial value of extra segment register
+.set RESET_FS, 0x40 # initial value of "f" segment register
+.set RESET_GS, 0x30 # initial value of "g" segment register
+
+
+#define LOAD_SEGMENTS(_value,_segment) \
+ movw $ ## _value, ax ; \
+ movw ax, _segment
+
+ EXTERN (establish_stack)
+
+ PUBLIC (_load_segments)
+SYM (_load_segments):
+ LOAD_SEGMENTS( RESET_SS, ss )
+ LOAD_SEGMENTS( RESET_DS, ds )
+ LOAD_SEGMENTS( RESET_ES, es )
+ LOAD_SEGMENTS( RESET_FS, fs )
+ LOAD_SEGMENTS( RESET_GS, gs )
+
+ jmp SYM (_establish_stack) # return to the bsp entry code
+
+ PUBLIC (_return_to_monitor)
+SYM (_return_to_monitor):
+
+ call SYM (Clock_exit)
+ movb $0,al
+ int $0x20 # restart FORCEbug
+ jmp SYM (start) # FORCEbug does not reset PC
+
+END_CODE
+
+BEGIN_DATA
+
+ PUBLIC (_Do_Load_IDT)
+SYM (_Do_Load_IDT):
+ .byte 1
+
+ PUBLIC (_Do_Load_GDT)
+SYM (_Do_Load_GDT):
+ .byte 0
+
+END_DATA
+END
diff --git a/c/src/lib/libbsp/i386/force386/startup/linkcmds b/c/src/lib/libbsp/i386/force386/startup/linkcmds
new file mode 100644
index 0000000000..d404986df6
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/startup/linkcmds
@@ -0,0 +1,44 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the FORCE CPU386 board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x0, l = 1M
+ }
+
+SECTIONS
+{
+ .text 0x0 :
+ {
+ _text_start = . ;
+ *(.text)
+ _etext = ALIGN( 0x10 ) ;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ _data_start = . ;
+ *(.data)
+ _edata = ALIGN( 0x10 ) ;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ __end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/i386/force386/startup/setvec.c b/c/src/lib/libbsp/i386/force386/startup/setvec.c
new file mode 100644
index 0000000000..88cf40a289
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/startup/setvec.c
@@ -0,0 +1,59 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the Force CPU-386.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+i386_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ i386_isr_entry previous_isr;
+ i386_IDT_slot idt;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ /* get the address of the old handler */
+
+ idt = Interrupt_descriptor_table[ vector ];
+
+ previous_isr = (i386_isr_entry)
+ ((idt.offset_16_31 << 16) | idt.offset_0_15);
+
+ /* build the IDT entry */
+ idt.offset_0_15 = ((rtems_unsigned32) handler) & 0xffff;
+ idt.segment_selector = get_cs();
+ idt.reserved = 0x00;
+ idt.p_dpl = 0x8e; /* present, ISR */
+ idt.offset_16_31 = ((rtems_unsigned32) handler) >> 16;
+
+ /* install the IDT entry */
+ Interrupt_descriptor_table[ vector ] = idt;
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/i386/force386/timer/Makefile.in b/c/src/lib/libbsp/i386/force386/timer/Makefile.in
new file mode 100644
index 0000000000..c2ba3476d3
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/force386/timer/timer.c b/c/src/lib/libbsp/i386/force386/timer/timer.c
new file mode 100644
index 0000000000..e5c4eff942
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/timer/timer.c
@@ -0,0 +1,96 @@
+/* Timer_init()
+ *
+ * This routine initializes the timer on the FORCE CPU-386 board.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine will not work if the optimizer is enabled
+ * for some compilers. The multiple writes to the Z8036
+ * may be optimized away.
+ *
+ * It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+int Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+void Timer_initialize()
+{
+
+ (void) set_vector( timerisr, 0x38, 0 ); /* install ISR */
+
+ Ttimer_val = 0; /* clear timer ISR count */
+
+ outport_byte( IERA, 0x40 ); /* disable interrupt */
+ outport_byte( TBCR, 0x40 ); /* stop the timer */
+ outport_byte( TBDR, 250 ); /* 250 units */
+
+ outport_byte( TBCR, 0x11 ); /* reset it, delay mode, 4X */
+#if 0
+ outport_byte( TBCR, 0x13 ); /* reset it, delay mode, 16X */
+#endif
+
+ outport_byte( IERA, 0x41 ); /* enable interrupt */
+
+}
+
+#define AVG_OVERHEAD 3 /* It typically takes 3.0 microseconds */
+ /* (3 ticks) to start/stop the timer. */
+#define LEAST_VALID 4 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ register rtems_unsigned32 clicks;
+ register rtems_unsigned32 total;
+
+ outport_byte( TBCR, 0x00 ); /* stop the timer */
+
+ inport_byte( TBDR, clicks );
+
+ total = Ttimer_val + 250 - clicks;
+
+ outport_byte( TBCR, 0x00 ); /* initial value */
+ outport_byte( IERA, 0x40 ); /* disable interrupt */
+
+ /* ??? Is "do not restore old vector" causing problems? */
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in one microsecond units */
+
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ return (total - AVG_OVERHEAD);
+ }
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/i386/force386/timer/timerisr.s b/c/src/lib/libbsp/i386/force386/timer/timerisr.s
new file mode 100644
index 0000000000..5a6b2d1c6b
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/timer/timerisr.s
@@ -0,0 +1,34 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the Z8036 timer on the MVME136
+ * board. The timer is set up to generate an interrupt at maximum
+ * intervals.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+ BEGIN_CODE
+
+ EXTERN (Ttimer_val)
+
+ PUBLIC (timerisr)
+SYM (timerisr):
+ addl $250, SYM (Ttimer_val) # another 250 microseconds
+ iret
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/i386/force386/times b/c/src/lib/libbsp/i386/force386/times
new file mode 100644
index 0000000000..2c953246ac
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/times
@@ -0,0 +1,191 @@
+#
+# Timing Test Suite Results for the Force CPU386 BSP
+#
+# $Id$
+#
+
+Board: Force CPU-386
+CPU: i386/DX + i387
+Clock Speed: 16 Mhz
+Memory Configuration: DRAM, no cache
+Wait States: 0 wait states
+
+Times Reported in: microseconds
+Timer Source: count-down timer provided by a Motorola MC68901
+
+Column A: 3.5.1
+Column B: 3.5.17 - pre-release
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 73 64
+ rtems_semaphore_delete 69 60
+ rtems_semaphore_obtain: available 50 41
+ rtems_semaphore_obtain: not available -- NO_WAIT 50 40
+ rtems_semaphore_release: no waiting tasks 55 47
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 126 123
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 104 95
+
+ 4 rtems_task_restart: blocked task -- preempts caller 164 162
+ rtems_task_restart: ready task -- preempts caller 158 156
+ rtems_semaphore_release: task readied -- returns to caller 79 70
+ rtems_task_create 164 157
+ rtems_task_start 93 86
+ rtems_task_restart: suspended task -- returns to caller 109 103
+ rtems_task_delete: suspended task 154 147
+ rtems_task_restart: ready task -- returns to caller 111 105
+ rtems_task_restart: blocked task -- returns to caller 144 138
+ rtems_task_delete: blocked task 162 153
+
+ 5 rtems_task_suspend: calling task 87 81
+ rtems_task_resume: task readied -- preempts caller 79 71
+
+ 6 rtems_task_restart: calling task 121 118
+ rtems_task_suspend: returns to caller 54 45
+ rtems_task_resume: task readied -- returns to caller 54 46
+ rtems_task_delete: ready task 164 157
+
+ 7 rtems_task_restart: suspended task -- preempts caller 151 149
+
+ 8 rtems_task_set_priority: obtain current priority 40 30
+ rtems_task_set_priority: returns to caller 75 67
+ rtems_task_mode: obtain current mode 20 19
+ rtems_task_mode: no reschedule 22 21
+ rtems_task_mode: reschedule -- returns to caller 27 27
+ rtems_task_mode: reschedule -- preempts caller 74 66
+ rtems_task_set_note 41 32
+ rtems_task_get_note 42 32
+ rtems_clock_set 95 85
+ rtems_clock_get 2 2
+
+ 9 rtems_message_queue_create 304 294
+ rtems_message_queue_send: no waiting tasks 124 117
+ rtems_message_queue_urgent: no waiting tasks 123 117
+ rtems_message_queue_receive: available 101 93
+ rtems_message_queue_flush: no messages flushed 38 29
+ rtems_message_queue_flush: messages flushed 50 41
+ rtems_message_queue_delete 88 81
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 54 45
+ rtems_message_queue_receive: not available -- caller blocks 131 127
+
+11 rtems_message_queue_send: task readied -- preempts caller 152 144
+
+12 rtems_message_queue_send: task readied -- returns to caller 126 118
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 152 144
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 126 116
+
+15 rtems_event_receive: obtain current events 0 <1
+ rtems_event_receive: not available -- NO_WAIT 37 25
+ rtems_event_receive: not available -- caller blocks 102 94
+ rtems_event_send: no task readied 37 26
+ rtems_event_receive: available 39 27
+ rtems_event_send: task readied -- returns to caller 68 60
+
+16 rtems_event_send: task readied -- preempts caller 96 89
+
+17 rtems_task_set_priority: preempts caller 119 115
+
+18 rtems_task_delete: calling task 192 187
+
+19 rtems_signal_catch 23 13
+ rtems_signal_send: returns to caller 43 34
+ rtems_signal_send: signal to self 57 59
+ exit ASR overhead: returns to calling task 39 39
+ exit ASR overhead: returns to preempting task 70 60
+
+20 rtems_partition_create 96 83
+ rtems_region_create 78 68
+ rtems_partition_get_buffer: available 42 34
+ rtems_partition_get_buffer: not available 42 33
+ rtems_partition_return_buffer 49 40
+ rtems_partition_delete 50 49
+ rtems_region_get_segment: available 57 45
+ rtems_region_get_segment: not available -- NO_WAIT 54 52
+ rtems_region_return_segment: no waiting tasks 62 52
+ rtems_region_get_segment: not available -- caller blocks 131 127
+ rtems_region_return_segment: task readied -- preempts caller 147 138
+ rtems_region_return_segment: task readied -- returns to caller 123 113
+ rtems_region_delete 48 39
+ rtems_io_initialize 4 4
+ rtems_io_open 1 1
+ rtems_io_close 1 0
+ rtems_io_read 1 1
+ rtems_io_write 1 1
+ rtems_io_control 1 1
+
+21 rtems_task_ident 671 748
+ rtems_message_queue_ident 656 730
+ rtems_semaphore_ident 699 787
+ rtems_partition_ident 655 730
+ rtems_region_ident 670 739
+ rtems_port_ident 657 728
+ rtems_timer_ident 658 729
+ rtems_rate_monotonic_ident 659 729
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 129 122
+ rtems_message_queue_broadcast: no waiting tasks 61 53
+ rtems_message_queue_broadcast: task readied -- preempts caller 155 146
+
+23 rtems_timer_create 45 34
+ rtems_timer_fire_after: inactive 70 65
+ rtems_timer_fire_after: active 75 69
+ rtems_timer_cancel: active 45 37
+ rtems_timer_cancel: inactive 41 32
+ rtems_timer_reset: inactive 65 58
+ rtems_timer_reset: active 69 63
+ rtems_timer_fire_when: inactive 100 92
+ rtems_timer_fire_when: active 100 92
+ rtems_timer_delete: active 60 52
+ rtems_timer_delete: inactive 56 48
+ rtems_task_wake_when 132 128
+
+24 rtems_task_wake_after: yield -- returns to caller 29 18
+ rtems_task_wake_after: yields -- preempts caller 71 63
+
+25 rtems_clock_tick 14 16
+
+26 _ISR_Disable 2 1
+ _ISR_Flash 2 1
+ _ISR_Enable 1 1
+ _Thread_Disable_dispatch 1 1
+ _Thread_Enable_dispatch 22 10
+ _Thread_Set_state 25 26
+ _Thread_Disptach (NO FP) 55 48
+ context switch: no floating point contexts 42 34
+ context switch: self 8 9
+ context switch: to another task 10 10
+ context switch: restore 1st FP task 65 57
+ fp context switch: save idle, restore idle 93 83
+ fp context switch: save idle, restore initialized 60 59
+ fp context switch: save initialized, restore initialized 60 59
+ _Thread_Resume 19 19
+ _Thread_Unblock 19 19
+ _Thread_Ready 22 22
+ _Thread_Get 14 15
+ _Semaphore_Get 11 13
+ _Thread_Get: invalid id 3 3
+
+27 interrupt entry overhead: returns to interrupted task 13 13
+ interrupt exit overhead: returns to interrupted task 11 11
+ interrupt entry overhead: returns to nested interrupt 12 12
+ interrupt exit overhead: returns to nested interrupt 10 10
+ interrupt entry overhead: returns to preempting task 12 12
+ interrupt exit overhead: returns to preempting task 65 58
+
+28 rtems_port_create 48 39
+ rtems_port_external_to_internal 36 26
+ rtems_port_internal_to_external 36 26
+ rtems_port_delete 48 39
+
+29 rtems_rate_monotonic_create 47 36
+ rtems_rate_monotonic_period: initiate period -- returns to caller 60 53
+ rtems_rate_monotonic_period: obtain status 38 30
+ rtems_rate_monotonic_cancel 48 39
+ rtems_rate_monotonic_delete: inactive 57 49
+ rtems_rate_monotonic_delete: active 61 53
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 88 82
diff --git a/c/src/lib/libbsp/i386/force386/wrapup/Makefile.in b/c/src/lib/libbsp/i386/force386/wrapup/Makefile.in
new file mode 100644
index 0000000000..0e6fe816b0
--- /dev/null
+++ b/c/src/lib/libbsp/i386/force386/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console shmsupp timer
+GENERIC_PIECES=shmdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/i386/go32/Makefile.in b/c/src/lib/libbsp/i386/go32/Makefile.in
new file mode 100644
index 0000000000..1590a95a1e
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console timer wrapup
diff --git a/c/src/lib/libbsp/i386/go32/README b/c/src/lib/libbsp/i386/go32/README
new file mode 100644
index 0000000000..fa0d3efd29
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/README
@@ -0,0 +1,38 @@
+#
+# $Id$
+#
+
+1. This is based on djgpp v1.x which has been superceded. That version
+ is still available but is no longer supported. It would be greatly
+ appreciated if someone would update this bsp to the current version.
+
+2. In general the regular instructions for building a cross GNU toolset
+ apply to the i386-go32-rtems toolset. However, you will need some items
+ from the djgpp distribution. Here is the list of djgpp files we use:
+
+ djeoe112.zip - files required on target PC
+ djdev112.zip - libraries and include files required on host
+
+3. We attempt to minimize what we copy into our built and installed GNU
+ toolset from the binary distribution of the GNU tools. Here is what
+ we do by hand. You will need to localize this to meet your directory
+ structure. All paths are starting at the toolset install point.
+
+ a. Copy go32.h, dpmi.h, dos.h. and pc.h in the i386-go32-rtems/include
+ directory. These files only include sys/types.h and newlib has that.
+
+ b. copy crt0.o to i386-go32-rtems/gcc-lib/i386-go32-rtems/2.7.2
+ c. copy libc.a to i386-go32-rtems/gcc-lib/i386-go32-rtems/2.7.2/libcgo32.a
+ d. copy libpc.a to i386-go32-rtems/gcc-lib/i386-go32-rtems/2.7.2/libpc.a
+
+ It is almost a certainty that libcgo32.a and libpc.a have symbols and
+ routines which duplicate those in newlib. In post 3.6.0 RTEMS versions,
+ the --start-group and --end-group GNU ld options are used to group
+ the non-GO32 supplied libraries. This attempts to resolve every symbolic
+ reference from RTEMS specific libraries before getting them from
+ GO32 libraries.
+
+4. This configuration is built on a UNIX host by the RTEMS Team using
+ cross configurations of the tools. Building it under DOS requires
+ special effort.
+
diff --git a/c/src/lib/libbsp/i386/go32/bsp_specs b/c/src/lib/libbsp/i386/go32/bsp_specs
new file mode 100644
index 0000000000..3a0cb4c93a
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: crt0.o%s
+{!pg:
+g: crt0.o%s
+{!g:
+p: crt0.o%s
+!p: crt0.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -) -lcgo32 -lpc
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/i386/go32/clock/Makefile.in b/c/src/lib/libbsp/i386/go32/clock/Makefile.in
new file mode 100644
index 0000000000..6444b837e1
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/clock/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit rtc
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/go32/clock/ckinit.c b/c/src/lib/libbsp/i386/go32/clock/ckinit.c
new file mode 100644
index 0000000000..70c564fabc
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/clock/ckinit.c
@@ -0,0 +1,199 @@
+/* Clock_initialize
+ *
+ * This routine initializes the 8254 timer under GO32.
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <stdlib.h>
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+rtems_unsigned32 Clock_isrs_per_tick; /* ISRs per tick */
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+rtems_isr_entry Old_ticker;
+
+#define CLOCK_VECTOR 0x8
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ /* touch interrupt controller for irq0 (0x20+0) */
+ outport_byte( 0x20, 0x20 );
+
+ Clock_driver_ticks += 1;
+
+#if 0 && defined(pentium)
+ {
+ extern long long Last_RDTSC;
+ __asm __volatile( ".byte 0x0F, 0x31" : "=A" (Last_RDTSC) );
+ }
+#endif
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = Clock_isrs_per_tick;
+ } else {
+ Clock_isrs -= 1;
+ }
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ unsigned int microseconds_per_isr;
+
+#if 0
+ /* Initialize clock from on-board real time clock. This breaks the */
+ /* test code which assumes which assumes the application will do it. */
+ {
+ rtems_time_of_day Now;
+ extern void init_rtc( void );
+ extern long rtc_read( rtems_time_of_day * tod );
+ init_rtc();
+ if ( rtc_read( &Now ) >= 0 )
+ clock_set( &Now );
+ }
+#endif
+
+ /* Start by assuming hardware counter is large enough, then */
+ /* scale it until it actually fits. */
+ Clock_driver_ticks = 0;
+ Clock_isrs_per_tick = 1;
+
+ if ( BSP_Configuration.microseconds_per_tick == 0 )
+ microseconds_per_isr = 10000; /* default 10 ms */
+ else
+ microseconds_per_isr = BSP_Configuration.microseconds_per_tick;
+ while ( US_TO_TICK(microseconds_per_isr) > 65535 ) {
+ Clock_isrs_per_tick *= 10;
+ microseconds_per_isr /= 10;
+ }
+
+ /* Initialize count in ckisr.c */
+ Clock_isrs = Clock_isrs_per_tick;
+
+#if 0
+ /* This was dropped in the last revision. Its a nice thing to know. */
+ TICKS_PER_SECOND = 1000000 / (Clock_isrs_per_tick * microseconds_per_isr);
+#endif
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ /* 105/88 approximates TIMER_TICK*1e-6 */
+ unsigned int count = US_TO_TICK( microseconds_per_isr );
+
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
+ outport_byte( TIMER_CNTR0, count >> 0 & 0xff );
+ outport_byte( TIMER_CNTR0, count >> 8 & 0xff );
+ }
+ atexit( Clock_exit );
+}
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ extern void rtc_set_dos_date( void );
+
+ /* reset to DOS value: */
+ outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
+ outport_byte( TIMER_CNTR0, 0 );
+ outport_byte( TIMER_CNTR0, 0 );
+
+ /* reset time-of-day */
+ rtc_set_dos_date();
+
+ /* re-enable old handler: assume it was one of ours */
+ set_vector( (rtems_isr_entry)Old_ticker, CLOCK_VECTOR, 1 );
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
+#if 0 && defined(pentium)
+/* This can be used to get extremely accurate timing on a pentium. */
+/* It isn't supported. [bryce] */
+#define HZ 90.0
+volatile long long Last_RDTSC;
+#define RDTSC()\
+ ({ long long _now; __asm __volatile (".byte 0x0F,0x31":"=A"(_now)); _now; })
+
+long long Kernel_Time_ns( void )
+{
+ extern rtems_unsigned32 _TOD_Ticks_per_second;
+ unsigned isrs_per_second = Clock_isrs_per_tick * _TOD_Ticks_per_second;
+ long long now;
+ int flags;
+ disable_intr( flags );
+ now = 1e9 * Clock_driver_ticks / isrs_per_second
+ + (RDTSC() - Last_RDTSC) * (1000.0/HZ);
+ enable_intr( flags );
+ return now;
+}
+#endif
diff --git a/c/src/lib/libbsp/i386/go32/clock/rtc.c b/c/src/lib/libbsp/i386/go32/clock/rtc.c
new file mode 100644
index 0000000000..38e9497000
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/clock/rtc.c
@@ -0,0 +1,212 @@
+/*
+ * $Id$
+ */
+
+#define IO_RTC 0x70 /* RTC */
+
+#define RTC_SEC 0x00 /* seconds */
+#define RTC_SECALRM 0x01 /* seconds alarm */
+#define RTC_MIN 0x02 /* minutes */
+#define RTC_MINALRM 0x03 /* minutes alarm */
+#define RTC_HRS 0x04 /* hours */
+#define RTC_HRSALRM 0x05 /* hours alarm */
+#define RTC_WDAY 0x06 /* week day */
+#define RTC_DAY 0x07 /* day of month */
+#define RTC_MONTH 0x08 /* month of year */
+#define RTC_YEAR 0x09 /* month of year */
+#define RTC_STATUSA 0x0a /* status register A */
+#define RTCSA_TUP 0x80 /* time update, don't look now */
+
+#define RTC_STATUSB 0x0b /* status register B */
+
+#define RTC_INTR 0x0c /* status register C (R) interrupt source */
+#define RTCIR_UPDATE 0x10 /* update intr */
+#define RTCIR_ALARM 0x20 /* alarm intr */
+#define RTCIR_PERIOD 0x40 /* periodic intr */
+#define RTCIR_INT 0x80 /* interrupt output signal */
+
+#define RTC_STATUSD 0x0d /* status register D (R) Lost Power */
+#define RTCSD_PWR 0x80 /* clock lost power */
+
+#define RTC_DIAG 0x0e /* status register E - bios diagnostic */
+#define RTCDG_BITS "\020\010clock_battery\007ROM_cksum\006config_unit\005memory_size\004fixed_disk\003invalid_time"
+
+#define RTC_CENTURY 0x32 /* current century - increment in Dec99 */
+
+
+
+#include <rtems.h>
+#include <string.h>
+
+void init_rtc( void )
+{
+ int s;
+
+ /* initialize brain-dead battery powered clock */
+ outport_byte( IO_RTC, RTC_STATUSA );
+ outport_byte( IO_RTC+1, 0x26 );
+ outport_byte( IO_RTC, RTC_STATUSB );
+ outport_byte( IO_RTC+1, 2 );
+
+ outport_byte( IO_RTC, RTC_DIAG );
+ inport_byte( IO_RTC+1, s );
+#if 0
+ if (s) printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS);
+#endif
+}
+
+
+/* convert 2 digit BCD number */
+static int bcd( unsigned int i )
+{
+ return ((i/16)*10 + (i%16));
+}
+
+/* convert years to seconds (from 1970) */
+static unsigned long ytos( int y )
+{
+ int i;
+ unsigned long ret;
+
+ ret = 0;
+ for(i = 1970; i < y; i++) {
+ if (i % 4) ret += 365*24*60*60;
+ else ret += 366*24*60*60;
+ }
+ return ret;
+}
+
+/* convert months to seconds */
+static unsigned long mtos( int m, int leap )
+{
+ int i;
+ unsigned long ret;
+
+ ret = 0;
+ for(i=1;i<m;i++) {
+ switch(i){
+ case 1: case 3: case 5: case 7: case 8: case 10: case 12:
+ ret += 31*24*60*60;
+ break;
+ case 4: case 6: case 9: case 11:
+ ret += 30*24*60*60;
+ break;
+ case 2:
+ if (leap)
+ ret += 29*24*60*60;
+ else
+ ret += 28*24*60*60;
+ }
+ }
+ return ret;
+}
+
+
+static inline unsigned int rtcin( unsigned int what )
+{
+ unsigned int r;
+ outport_byte( IO_RTC, what );
+ inport_byte( IO_RTC+1, r );
+ return r;
+}
+
+
+/*
+ * Initialize the time of day register, based on the time base which is, e.g.
+ * from a filesystem.
+ */
+long rtc_read( rtems_time_of_day * tod )
+{
+ int sa;
+ unsigned long sec = 0;
+
+ memset( tod, 0, sizeof *tod );
+
+ /* do we have a realtime clock present? (otherwise we loop below) */
+ sa = rtcin(RTC_STATUSA);
+ if (sa == 0xff || sa == 0)
+ return -1;
+
+ /* ready for a read? */
+ while ((sa&RTCSA_TUP) == RTCSA_TUP)
+ sa = rtcin(RTC_STATUSA);
+
+ tod->year = bcd(rtcin(RTC_YEAR)) + 1900; /* year */
+ if (tod->year < 1970) tod->year += 100;
+ tod->month = bcd(rtcin(RTC_MONTH)); /* month */
+ tod->day = bcd(rtcin(RTC_DAY)); /* day */
+ (void) bcd(rtcin(RTC_WDAY)); /* weekday */
+ tod->hour = bcd(rtcin(RTC_HRS)); /* hour */
+ tod->minute = bcd(rtcin(RTC_MIN)); /* minutes */
+ tod->second = bcd(rtcin(RTC_SEC)); /* seconds */
+ tod->ticks = 0;
+#if 0
+ sec = ytos( tod->year );
+ sec += mtos( tod->month, tod->year % 4 == 0 );
+ sec += tod->day * 24*60*60;
+ sec += tod->hour * 60*60; /* hour */
+ sec += tod->minute * 60; /* minutes */
+ sec += tod->second; /* seconds */
+#else
+ sec = 0;
+#endif
+ return sec;
+}
+
+
+
+/* from djgpp: include before rtems.h to avoid conflicts */
+#undef delay
+#include <dos.h>
+
+void rtc_set_dos_date( void )
+{
+ int s;
+ struct date date;
+ struct time time;
+
+ /* initialize brain-dead battery powered clock */
+ outport_byte( IO_RTC, RTC_STATUSA );
+ outport_byte( IO_RTC+1, 0x26 );
+ outport_byte( IO_RTC, RTC_STATUSB );
+ outport_byte( IO_RTC+1, 2 );
+
+ outport_byte( IO_RTC, RTC_DIAG );
+ inport_byte( IO_RTC+1, s );
+ if (s) {
+#if 0
+ printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS);
+#else
+ return;
+#endif
+ }
+
+ /* check for presence of clock */
+ s = rtcin(RTC_STATUSA);
+ if ( s == 0xff || s == 0 ) {
+#if 0
+ printf( "Real-time clock not found\n" );
+#endif
+ return;
+ }
+
+ /* ready for a read? */
+ while ((s & RTCSA_TUP) == RTCSA_TUP)
+ s = rtcin(RTC_STATUSA);
+
+ date.da_year = bcd(rtcin(RTC_YEAR)) + 1900; /* year */
+ if ( date.da_year < 1970) date.da_year += 100;
+ date.da_year -= 1980;
+ date.da_mon = bcd(rtcin(RTC_MONTH)); /* month */
+ date.da_day = bcd(rtcin(RTC_DAY)); /* day */
+
+ (void)bcd(rtcin(RTC_WDAY)); /* weekday */
+
+ time.ti_hour = bcd(rtcin(RTC_HRS)); /* hour */
+ time.ti_min = bcd(rtcin(RTC_MIN)); /* minutes */
+ time.ti_sec = bcd(rtcin(RTC_SEC)); /* seconds */
+ time.ti_hund = 0;
+
+ setdate( & date );
+ settime( & time );
+}
diff --git a/c/src/lib/libbsp/i386/go32/console/Makefile.in b/c/src/lib/libbsp/i386/go32/console/Makefile.in
new file mode 100644
index 0000000000..808b2cd200
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console inch outch
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/go32/console/console.c b/c/src/lib/libbsp/i386/go32/console/console.c
new file mode 100644
index 0000000000..0649326846
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/console/console.c
@@ -0,0 +1,257 @@
+/*
+ * This file contains the go32 console IO package.
+ *
+ * $Id$
+ */
+
+#define IBMPC_INIT
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <dpmi.h>
+#include <go32.h>
+
+/* console_cleanup
+ *
+ * This routine is called at exit to clean up the console hardware.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+void console_cleanup( void )
+{
+ /* nothing */
+}
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+/* Set this if console I/O should use go32 (DOS) read/write calls. */
+/* Otherwise, direct hardware accesses will be used. */
+
+int _IBMPC_Use_Go32_IO = 0;
+
+static rtems_isr_entry old_keyboard_isr = NULL;
+
+extern void _IBMPC_keyboard_isr( rtems_unsigned32 interrupt );
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ if ( _IBMPC_Use_Go32_IO ) {
+ /* Nothing. We let DOS and go32 do all the work. */
+ } else {
+ /* Grap the keyboard interrupt so DOS doesn't steal our */
+ /* keystrokes. */
+ rtems_status_code status;
+
+ status =
+ rtems_interrupt_catch( _IBMPC_keyboard_isr, 9, &old_keyboard_isr );
+
+ if ( status ) {
+ int write( int, void *, int );
+ void exit( int );
+
+ char msg[] = "error initializing keyboard\n";
+ write( 2, msg, sizeof msg - 1 );
+ exit( 1 );
+ }
+ }
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ atexit( console_cleanup );
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ return _IBMPC_chrdy( ch ) ? TRUE : FALSE;
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the UART.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char inbyte( void )
+{
+ char ch = _IBMPC_inch();
+#if 1
+ /* Echo character to screen */
+ void outbyte( char ch );
+ outbyte( ch );
+ if ( ch == '\r' )
+ outbyte( '\n' );
+#endif
+ return ch;
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the port.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte( char ch )
+{
+ _IBMPC_outch( ch );
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ /* What if this goes past the end of the buffer? We're hosed. [bhc] */
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/i386/go32/console/inch.c b/c/src/lib/libbsp/i386/go32/console/inch.c
new file mode 100644
index 0000000000..e3bbbd7105
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/console/inch.c
@@ -0,0 +1,162 @@
+/*
+ * $Id$
+ */
+
+#include <pc.h>
+#include <go32.h>
+#include <bsp.h>
+
+/*
+ * Ports for PC keyboard
+ */
+#define KBD_CTL 0x61
+#define KBD_DATA 0x60
+#define KBD_STATUS 0x64
+
+static char key_map[] = {
+0,033,'1','2','3','4','5','6','7','8','9','0','-','=','\b','\t',
+'q','w','e','r','t','y','u','i','o','p','[',']',015,0x80,
+'a','s','d','f','g','h','j','k','l',';',047,0140,0x80,
+0134,'z','x','c','v','b','n','m',',','.','/',0x80,
+'*',0x80,' ',0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,'0',0177
+};
+
+static char shift_map[] = {
+0,033,'!','@','#','$','%','^','&','*','(',')','_','+','\b','\t',
+'Q','W','E','R','T','Y','U','I','O','P','{','}',015,0x80,
+'A','S','D','F','G','H','J','K','L',':',042,'~',0x80,
+'|','Z','X','C','V','B','N','M','<','>','?',0x80,
+'*',0x80,' ',0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
+0x80,0x80,0x80,0x80,'7','8','9',0x80,'4','5','6',0x80,
+'1','2','3','0',177
+};
+
+extern int _IBMPC_Use_Go32_IO;
+
+#define KBD_BUF_SIZE 256
+static char kbd_buffer[ KBD_BUF_SIZE ];
+static unsigned int kbd_first = 0;
+static unsigned int kbd_last = 0;
+
+/* This function can be called during a poll for input, or by an ISR. */
+/* Basically any time you want to process a keypress. */
+int _IBMPC_scankey( char * ch )
+{
+ unsigned char c;
+ unsigned char outch;
+ static int shift_pressed = 0;
+ static int ctrl_pressed = 0;
+ static int caps_pressed = 0;
+
+ /* Read keyboard controller, toggle enable */
+ inport_byte( KBD_CTL, c );
+ outport_byte( KBD_CTL, c & ~0x80 );
+ outport_byte( KBD_CTL, c | 0x80 );
+ outport_byte( KBD_CTL, c & ~0x80 );
+
+ /* See if it has data */
+ inport_byte( KBD_STATUS, c );
+ if ( ( c & 0x01 ) == 0 )
+ return 0;
+
+ /* Read the data. Handle nonsense with shift, control, etc. */
+ inport_byte( KBD_DATA, c );
+ switch ( c ) {
+ case 0x36:
+ case 0x2a:
+ shift_pressed = 1;
+ return 0;
+ case 0x3a:
+ caps_pressed = 1;
+ return 0;
+ case 0x1d:
+ ctrl_pressed = 1;
+ return 0;
+ case 0xb6:
+ case 0xaa:
+ shift_pressed = 0;
+ return 0;
+ case 0xba:
+ caps_pressed = 0;
+ return 0;
+ case 0x9d:
+ ctrl_pressed = 0;
+ return 0;
+ /*
+ * Ignore unrecognized keys--usually arrow and such
+ */
+ default:
+ if ( c & 0x80 )
+ /* High-bit on means key is being released, not pressed */
+ return 0;
+ if ( c == 88 )
+ /* F12 - abort */
+ exit( 1 );
+ if ( c > 0x39 ) {
+ return 0;
+ }
+ }
+
+ /* Strip high bit, look up in our map */
+ c &= 127;
+ if ( ctrl_pressed ) {
+ outch = key_map[c];
+ outch &= 037;
+ } else {
+ outch = shift_pressed ? shift_map[c] : key_map[c];
+ if ( caps_pressed ) {
+ if ( outch >= 'A' && outch <= 'Z' ) outch += 'a' - 'A';
+ else if ( outch >= 'a' && outch <= 'z' ) outch -= 'a' - 'A';
+ }
+ }
+
+ *ch = outch;
+ return 1;
+}
+
+
+void _IBMPC_keyboard_isr( rtems_unsigned32 interrupt )
+{
+ if ( _IBMPC_scankey( & kbd_buffer[ kbd_last ] ) ) {
+ /* Got one; save it if there is enough room in buffer. */
+ unsigned int next = (kbd_last + 1) % KBD_BUF_SIZE;
+ if ( next != kbd_first )
+ kbd_last = next;
+ }
+
+ /* Mark interrupt as handled */
+ outport_byte( 0x20, 0x20 );
+}
+
+
+int _IBMPC_chrdy( char * ch )
+{
+ if ( _IBMPC_Use_Go32_IO ) {
+ /* Read keyboard via BIOS: raw mode. */
+ if ( kbhit() ) {
+ *ch = getkey();
+ return 1;
+ } else {
+ return 0;
+ }
+ } else {
+ /* Check buffer our ISR builds */
+ if ( kbd_first != kbd_last ) {
+ *ch = kbd_buffer[ kbd_first ];
+ kbd_first = (kbd_first + 1) % KBD_BUF_SIZE;
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+}
+
+int _IBMPC_inch( void )
+{
+ char Ch;
+ while ( ! _IBMPC_chrdy( & Ch ) )
+ continue;
+ return Ch;
+}
diff --git a/c/src/lib/libbsp/i386/go32/console/outch.c b/c/src/lib/libbsp/i386/go32/console/outch.c
new file mode 100644
index 0000000000..9f7df342db
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/console/outch.c
@@ -0,0 +1,151 @@
+/*
+ * $Id$
+ */
+
+#include <go32.h>
+#include <bsp.h>
+
+#include <string.h>
+#include <unistd.h>
+
+#define MAX_COL 80
+#define MAX_ROW 50
+
+static unsigned nrow = 25;
+static unsigned ncol = 80;
+static unsigned short * tvram = TVRAM;
+static unsigned char current_col = 0;
+static unsigned char current_row = 0;
+static unsigned short screen_copy[ MAX_ROW*MAX_COL ];
+
+static void init_cons( void );
+
+/*
+ * set_cursor_pos()
+ * Set cursor position based on current absolute screen offset
+ */
+static void
+set_cursor_pos(void)
+{
+ register unsigned short gdc_pos = current_row * ncol + current_col;
+ outport_byte( GDC_REG_PORT, 0xe );
+ outport_byte( GDC_VAL_PORT, (gdc_pos >> 8) & 0xff );
+ outport_byte( GDC_REG_PORT, 0xf );
+ outport_byte( GDC_VAL_PORT, gdc_pos & 0xff );
+}
+
+/*
+ * scroll_up()
+ * Scroll screen up one line
+ */
+static void
+scroll_up( unsigned short * tv, unsigned short * copy, unsigned int lines )
+{
+ if ( lines > nrow )
+ lines = nrow;
+
+ /* move everything up */
+ memmove( copy, copy+ncol*lines, (nrow-lines)*ncol*sizeof copy[0] );
+
+ /* fill bottom with blanks */
+ {
+ int loop = ncol*lines;
+ unsigned short * ptr = copy + ncol*(nrow-lines);
+ while ( --loop >= 0 )
+ *ptr++ = (WHITE<<8) | ' ';
+ }
+
+ /* copy new screen to video buffer */
+ dosmemput( copy, nrow*ncol*sizeof copy[0], (int)tv );
+}
+
+
+/*
+ * PUT()
+ * Write character at current screen location
+ */
+inline static void PUT( char c )
+{
+ unsigned short loc = current_row*ncol+current_col;
+ unsigned short val = (WHITE<<8) | c;
+ screen_copy[loc] = val;
+ dosmemput( &screen_copy[loc], sizeof screen_copy[0], (int)(tvram+loc) );
+}
+
+/*
+ * cons_putc()
+ * Place a character on next screen position
+ */
+static void
+cons_putc( unsigned char c )
+{
+ static int first = 1;
+ if ( first ) {
+ init_cons();
+ first = 0;
+ }
+
+ switch (c) {
+ case '\t':
+ while ( current_row % 8 )
+ cons_putc(' ');
+ break;
+ case '\r':
+ current_col = 0;
+ break;
+ case '\n':
+ if ( ++current_row >= nrow ) {
+ scroll_up( tvram, screen_copy, 1 );
+ current_row -= 1;
+ }
+ break;
+ case '\b':
+ if ( current_col > 0 ) {
+ --current_col;
+ PUT(' ');
+ }
+ break;
+ default:
+ PUT(c);
+ current_col += 1;
+ if ( current_col >= ncol ) {
+ current_col = 0;
+ current_row += 1;
+ if ( current_row >= nrow ) {
+ scroll_up( tvram, screen_copy, 1 );
+ current_row -= 1;
+ }
+ }
+ };
+ set_cursor_pos();
+}
+
+
+/*
+ * init_cons()
+ * Hook for any early setup
+ */
+static void
+init_cons( void )
+{
+#if 0
+ /* Get a copy of original screen */
+ dosmemget( (int)tvram, nrow*ncol*sizeof *tvram, screen_copy );
+#else
+ /* Clear entire screen */
+ scroll_up( tvram, screen_copy, nrow );
+#endif
+}
+
+
+
+void _IBMPC_outch( unsigned char ch )
+{
+ extern int _IBMPC_Use_Go32_IO;
+
+ if ( _IBMPC_Use_Go32_IO ) {
+ write( 1, &ch, 1 );
+ } else {
+ cons_putc( ch );
+ }
+}
diff --git a/c/src/lib/libbsp/i386/go32/include/Makefile.in b/c/src/lib/libbsp/i386/go32/include/Makefile.in
new file mode 100644
index 0000000000..20c100b31f
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/include/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
+
+install: all
diff --git a/c/src/lib/libbsp/i386/go32/include/bsp.h b/c/src/lib/libbsp/i386/go32/include/bsp.h
new file mode 100644
index 0000000000..9519c5d257
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/include/bsp.h
@@ -0,0 +1,172 @@
+/* bsp.h
+ *
+ * This include file definitions related to the ibm386 (go32) board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __IBMPC_h
+#define __IBMPC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <iosupp.h>
+#include <console.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Use a software interrupt for the i386 family.
+ */
+#define MUST_WAIT_FOR_INTERRUPT 0
+#define Install_tm27_vector( handler ) set_vector( (handler), 0x90, 1 )
+#define Cause_tm27_intr() asm volatile( "int $0x90" : : );
+#define Clear_tm27_intr()
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( _microseconds ) { \
+ rtems_unsigned32 _cnt = (_microseconds); \
+ asm volatile ("0: nop; mov %0,%0; loop 0b" : "=c"(_cnt) : "0"(_cnt) ); \
+}
+
+
+/* Constants */
+
+/* Assume color console */
+#define COLOR 1
+#if COLOR
+# define GDC_REG_PORT 0x3d4
+# define GDC_VAL_PORT 0x3d5
+# define TVRAM ((unsigned short *)0xb8000L)
+#else
+# define GDC_REG_PORT 0x3b4
+# define GDC_VAL_PORT 0x3b5
+# define TVRAM ((unsigned short *)0xb0000L)
+#endif
+
+/* White character attribute--works for MGA and CGA */
+#define WHITE 0x07
+
+/* Ports for PC keyboard */
+#define KBD_CTL 0x61
+#define KBD_DATA 0x60
+#define KBD_STATUS 0x64
+
+/* Constants relating to the 8254 (or 8253) programmable interval timers */
+ /* Port address of the control port and timer channels */
+/*
+ * Macros for specifying values to be written into a mode register.
+ */
+#define IO_TIMER1 0x40
+#define TIMER_CNTR0 (IO_TIMER1 + 0) /* timer 0 counter port */
+#define TIMER_CNTR1 (IO_TIMER1 + 1) /* timer 1 counter port */
+#define TIMER_CNTR2 (IO_TIMER1 + 2) /* timer 2 counter port */
+#define TIMER_MODE (IO_TIMER1 + 3) /* timer mode port */
+#define TIMER_SEL0 0x00 /* select counter 0 */
+#define TIMER_SEL1 0x40 /* select counter 1 */
+#define TIMER_SEL2 0x80 /* select counter 2 */
+#define TIMER_INTTC 0x00 /* mode 0, intr on terminal cnt */
+#define TIMER_ONESHOT 0x02 /* mode 1, one shot */
+#define TIMER_RATEGEN 0x04 /* mode 2, rate generator */
+#define TIMER_SQWAVE 0x06 /* mode 3, square wave */
+#define TIMER_SWSTROBE 0x08 /* mode 4, s/w triggered strobe */
+#define TIMER_HWSTROBE 0x0a /* mode 5, h/w triggered strobe */
+#define TIMER_LATCH 0x00 /* latch counter for reading */
+#define TIMER_LSB 0x10 /* r/w counter LSB */
+#define TIMER_MSB 0x20 /* r/w counter MSB */
+#define TIMER_16BIT 0x30 /* r/w counter 16 bits, LSB first */
+#define TIMER_BCD 0x01 /* count in BCD */
+
+#define CLOCK_DISABLE() \
+ ({ char mask; inport_byte( 0x21, mask ); outport_byte( 0x21, mask | 1 ); })
+#define CLOCK_ENABLE() \
+ ({ char mask; inport_byte( 0x21, mask ); outport_byte( 0x21, mask & ~1); })
+
+/* The internal tick rate in ticks per second */
+#define TIMER_TICK 1193182
+#define US_TO_TICK(us) (((us)*105+44)/88)
+#define TICK_TO_US(tk) (((tk)*88+52)/105)
+
+/* Structures */
+
+#ifdef IBMPC_INIT
+#undef BSP_EXTERN
+#define BSP_EXTERN
+#else
+#undef BSP_EXTERN
+#define BSP_EXTERN extern
+#endif
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+int _IBMPC_chrdy( char * ch );
+int _IBMPC_inch( void );
+void _IBMPC_outch( unsigned char );
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+/* routines */
+
+i386_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
+
diff --git a/c/src/lib/libbsp/i386/go32/include/coverhd.h b/c/src/lib/libbsp/i386/go32/include/coverhd.h
new file mode 100644
index 0000000000..6317db3e35
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/i386/go32/startup/Makefile.in b/c/src/lib/libbsp/i386/go32/startup/Makefile.in
new file mode 100644
index 0000000000..b43be7a622
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/i386/go32/startup/bspstart.c b/c/src/lib/libbsp/i386/go32/startup/bspstart.c
new file mode 100644
index 0000000000..d462c7a2ec
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/startup/bspstart.c
@@ -0,0 +1,234 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+#include <z8036.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ rtems_unsigned32 heap_start;
+
+#if 0
+ extern int end;
+ heap_start = (rtems_unsigned32) &end;
+#else
+ void * sbrk( int );
+ heap_start = (rtems_unsigned32) sbrk( 64 * 1024 + CPU_ALIGNMENT );
+#endif
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+/* This is the original command line passed from DOS */
+char ** Go32_Argv;
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ extern void * sbrk( int );
+ extern volatile void _exit( int );
+
+ /* Set up arguments that we can access later */
+ Go32_Argv = argv;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+ Cpu_table.predriver_hook = NULL;
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+ Cpu_table.do_zero_of_workspace = TRUE;
+ Cpu_table.interrupt_table_segment = 0;/* get_ds(); */
+ Cpu_table.interrupt_table_offset = (void *)0;
+ Cpu_table.interrupt_stack_size = 4096;
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = sbrk( Configuration.work_space_size );
+ if ( BSP_Configuration.work_space_start == 0 ) {
+ /* Big trouble */
+ int write( int, void *, int );
+ char msg[] = "bsp_start() couldn't sbrk() RTEMS work space\n";
+ write( 2, msg, sizeof msg - 1 );
+ _exit( 1 );
+ }
+
+ /*
+ * Add 1 region for Malloc in libc_low
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ /* We only return here if the executive has finished. This happens */
+ /* when the task has called exit(). */
+ /* At this point we call _exit() which resides in djgcc. */
+
+ for (;;)
+ _exit( 0 );
+
+ /* no cleanup necessary for GO32 */
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/i386/go32/startup/exit.c b/c/src/lib/libbsp/i386/go32/startup/exit.c
new file mode 100644
index 0000000000..bc78f7e7ba
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/startup/exit.c
@@ -0,0 +1,30 @@
+/*
+ * exit
+ *
+ * This routine returns control to DOS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <clockdrv.h>
+#include <iodrv.h>
+
+#if 0
+/* Prefer to pick up _exit() in djgcc */
+void _exit( )
+{
+ Io_cleanup();
+ bsp_cleanup();
+}
+#endif
+
diff --git a/c/src/lib/libbsp/i386/go32/startup/setvec.c b/c/src/lib/libbsp/i386/go32/startup/setvec.c
new file mode 100644
index 0000000000..1df27f075d
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/startup/setvec.c
@@ -0,0 +1,46 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector under go32.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+#include <dpmi.h>
+#include <go32.h>
+
+i386_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ i386_isr_entry previous_isr;
+
+ if ( type ) {
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr);
+ } else {
+ _CPU_ISR_install_raw_handler( vector, handler, (proc_ptr *)&previous_isr);
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/i386/go32/timer/Makefile.in b/c/src/lib/libbsp/i386/go32/timer/Makefile.in
new file mode 100644
index 0000000000..5327de40f1
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/go32/timer/timer.c b/c/src/lib/libbsp/i386/go32/timer/timer.c
new file mode 100644
index 0000000000..252c1a771f
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/timer/timer.c
@@ -0,0 +1,144 @@
+/* Timer_init()
+ *
+ * This routine initializes the timer on the IBM 386.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+volatile rtems_unsigned32 Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+#if defined(pentium)
+static inline unsigned long long rdtsc( void )
+{
+ /* Return the value of the on-chip cycle counter. */
+ unsigned long long result;
+ __asm __volatile( ".byte 0x0F, 0x31" : "=A" (result) );
+ return result;
+}
+#else
+#define US_PER_ISR 250
+extern rtems_isr timerisr();
+static rtems_isr_entry Old_Ticker;
+#endif
+
+static void Timer_exit( void )
+{
+#if defined(pentium)
+ CLOCK_ENABLE();
+#else /* pentium */
+ extern void rtc_set_dos_date( void );
+
+ /* reset to DOS value: */
+ outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
+ outport_byte( TIMER_CNTR0, 0 );
+ outport_byte( TIMER_CNTR0, 0 );
+
+ /* reset time-of-day */
+ rtc_set_dos_date();
+
+ /* re-enable old handler: assume it was one of ours */
+ set_vector( (rtems_isr_entry)Old_Ticker, 0x8, 0 );
+#endif /* pentium */
+}
+
+void Timer_initialize()
+{
+ extern int atexit( void (*)(void) );
+
+ static int First = 1;
+
+ if ( First ) {
+ First = 0;
+
+ /* Try not to hose the system on return to DOS. */
+ atexit( Timer_exit );
+
+#if defined(pentium)
+ /* Disable the programmable timer so ticks don't interfere. */
+ CLOCK_DISABLE();
+#else /* pentium */
+ /* install a timer ISR */
+ Old_Ticker = (rtems_isr_entry) set_vector( timerisr, 0x8, 0 );
+
+ /* Wait for ISR to be called at least once */
+ Ttimer_val = 0;
+ while ( Ttimer_val == 0 )
+ continue;
+
+ /* load timer for US_PER_ISR microsecond period */
+ outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_16BIT|TIMER_RATEGEN );
+ outport_byte( TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 0 & 0xff );
+ outport_byte( TIMER_CNTR0, US_TO_TICK(US_PER_ISR) >> 8 & 0xff );
+#endif /* PENTIUM */
+ }
+#if defined(pentium)
+ Ttimer_val = rdtsc(); /* read starting time */
+#else
+ /* Wait for ISR to be called at least once */
+ asm( "sti" );
+ Ttimer_val = 0;
+ while ( Ttimer_val == 0 )
+ continue;
+ Ttimer_val = 0;
+#endif
+}
+
+#define AVG_OVERHEAD 0 /* 0.1 microseconds to start/stop timer. */
+#define LEAST_VALID 1 /* Don't trust a value lower than this */
+
+
+int Read_timer()
+{
+ register rtems_unsigned32 total;
+#if defined(pentium)
+ total = rdtsc() - Ttimer_val;
+#else /* pentium */
+ register rtems_unsigned8 lsb, msb;
+ register rtems_unsigned32 clicks;
+ outport_byte( TIMER_MODE, TIMER_SEL0|TIMER_LATCH );
+ inport_byte( TIMER_CNTR0, lsb );
+ inport_byte( TIMER_CNTR0, msb );
+ clicks = msb << 8 | lsb;
+ total = (Ttimer_val * US_PER_ISR) + (US_PER_ISR - TICK_TO_US( clicks ));
+#endif /* pentium */
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total;
+ else if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ else
+ return total - AVG_OVERHEAD;
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
+
diff --git a/c/src/lib/libbsp/i386/go32/timer/timerisr.s b/c/src/lib/libbsp/i386/go32/timer/timerisr.s
new file mode 100644
index 0000000000..4264f32d9c
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/timer/timerisr.s
@@ -0,0 +1,41 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the timer. The timer is set up
+ * to generate an interrupt at maximum intervals.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+ BEGIN_CODE
+
+ EXTERN(_Ttimer_val)
+
+ PUBLIC(timerisr)
+
+SYM (timerisr):
+ addl $1,_Ttimer_val # another tick
+ push edx
+ push eax
+ movw $0x20,dx
+ mov edx,eax
+ outb al,(dx) # touch interrupt controller
+ pop eax
+ pop edx
+ iret
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/i386/go32/times_i486dx b/c/src/lib/libbsp/i386/go32/times_i486dx
new file mode 100644
index 0000000000..49601b31d0
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/times_i486dx
@@ -0,0 +1,191 @@
+#
+# Timing Test Suite Results for the go32 BSP using an i486DX
+#
+# $Id$
+#
+
+Board: PC/AT clone
+CPU: Intel i486DX
+Clock Speed: 33 Mhz
+Memory Configuration: DRAM w/256K cache
+Wait States: unknown
+
+Times Reported in: microseconds
+Timer Source: i8254
+
+Column A: 3.5.1 pre-release
+Column B: 3.5.17 pre-release
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 57 66
+ rtems_semaphore_delete 59 61
+ rtems_semaphore_obtain: available 9 7
+ rtems_semaphore_obtain: not available -- NO_WAIT 8 7
+ rtems_semaphore_release: no waiting tasks 9 8
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 39 37
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 25 24
+
+ 4 rtems_task_restart: blocked task -- preempts caller 124 102
+ rtems_task_restart: ready task -- preempts caller 55 111
+ rtems_semaphore_release: task readied -- returns to caller 16 15
+ rtems_task_create 31 30
+ rtems_task_start 19 18
+ rtems_task_restart: suspended task -- returns to caller 20 19
+ rtems_task_delete: suspended task 28 26
+ rtems_task_restart: ready task -- returns to caller 20 19
+ rtems_task_restart: blocked task -- returns to caller 28 26
+ rtems_task_delete: blocked task 34 28
+
+ 5 rtems_task_suspend: calling task 26 23
+ rtems_task_resume: task readied -- preempts caller 17 15
+
+ 6 rtems_task_restart: calling task 22 19
+ rtems_task_suspend: returns to caller 10 8
+ rtems_task_resume: task readied -- returns to caller 10 8
+ rtems_task_delete: ready task 34 33
+
+ 7 rtems_task_restart: suspended task -- preempts caller 37 34
+
+ 8 rtems_task_set_priority: obtain current priority 7 5
+ rtems_task_set_priority: returns to caller 13 12
+ rtems_task_mode: obtain current mode 3 3
+ rtems_task_mode: no reschedule 4 4
+ rtems_task_mode: reschedule -- returns to caller 20 17
+ rtems_task_mode: reschedule -- preempts caller 39 37
+ rtems_task_set_note 7 5
+ rtems_task_get_note 7 5
+ rtems_clock_set 17 16
+ rtems_clock_get 2 1
+
+ 9 rtems_message_queue_create 117 113
+ rtems_message_queue_send: no waiting tasks 22 19
+ rtems_message_queue_urgent: no waiting tasks 22 19
+ rtems_message_queue_receive: available 18 16
+ rtems_message_queue_flush: no messages flushed 15 14
+ rtems_message_queue_flush: messages flushed 17 17
+ rtems_message_queue_delete 63 63
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 10 8
+ rtems_message_queue_receive: not available -- caller blocks 42 40
+
+11 rtems_message_queue_send: task readied -- preempts caller 38 37
+
+12 rtems_message_queue_send: task readied -- returns to caller 27 24
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 38 36
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 26 24
+
+15 rtems_event_receive: obtain current events 0 0
+ rtems_event_receive: not available -- NO_WAIT 6 5
+ rtems_event_receive: not available -- caller blocks 34 33
+ rtems_event_send: no task readied 6 5
+ rtems_event_receive: available 21 19
+ rtems_event_send: task readied -- returns to caller 19 15
+
+16 rtems_event_send: task readied -- preempts caller 26 24
+
+17 rtems_task_set_priority: preempts caller 36 33
+
+18 rtems_task_delete: calling task 51 52
+
+19 rtems_signal_catch 17 18
+ rtems_signal_send: returns to caller 38 39
+ rtems_signal_send: signal to self 46 62
+ exit ASR overhead: returns to calling task 20 25
+ exit ASR overhead: returns to preempting task 29 29
+
+20 rtems_partition_create 65 67
+ rtems_region_create 59 54
+ rtems_partition_get_buffer: available 39 35
+ rtems_partition_get_buffer: not available 18 16
+ rtems_partition_return_buffer 36 30
+ rtems_partition_delete 32 30
+ rtems_region_get_segment: available 22 21
+ rtems_region_get_segment: not available -- NO_WAIT 29 25
+ rtems_region_return_segment: no waiting tasks 24 22
+ rtems_region_get_segment: not available -- caller blocks 83 81
+ rtems_region_return_segment: task readied -- preempts caller 85 84
+ rtems_region_return_segment: task readied -- returns to caller 39 41
+ rtems_region_delete 30 30
+ rtems_io_initialize 1 1
+ rtems_io_open 0 0
+ rtems_io_close 0 0
+ rtems_io_read 0 0
+ rtems_io_write 0 0
+ rtems_io_control 0 1
+
+21 rtems_task_ident 116 114
+ rtems_message_queue_ident 113 111
+ rtems_semaphore_ident 122 120
+ rtems_partition_ident 113 110
+ rtems_region_ident 115 111
+ rtems_port_ident 113 109
+ rtems_timer_ident 113 109
+ rtems_rate_monotonic_ident 113 111
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 82 85
+ rtems_message_queue_broadcast: no waiting tasks 11 9
+ rtems_message_queue_broadcast: task readied -- preempts caller 51 56
+
+23 rtems_timer_create 8 7
+ rtems_timer_fire_after: inactive 14 12
+ rtems_timer_fire_after: active 13 12
+ rtems_timer_cancel: active 8 7
+ rtems_timer_cancel: inactive 7 6
+ rtems_timer_reset: inactive 11 10
+ rtems_timer_reset: active 11 11
+ rtems_timer_fire_when: inactive 17 16
+ rtems_timer_fire_when: active 17 17
+ rtems_timer_delete: active 10 9
+ rtems_timer_delete: inactive 9 8
+ rtems_task_wake_when 36 34
+
+24 rtems_task_wake_after: yield -- returns to caller 5 3
+ rtems_task_wake_after: yields -- preempts caller 22 19
+
+25 rtems_clock_tick 31 31
+
+26 _ISR_Disable 11 12
+ _ISR_Flash 9 9
+ _ISR_Enable 31 67
+ _Thread_Disable_dispatch 11 10
+ _Thread_Enable_dispatch 18 18
+ _Thread_Set_state 20 22
+ _Thread_Disptach (NO FP) 37 41
+ context switch: no floating point contexts 29 26
+ context switch: self 14 10
+ context switch: to another task 12 12
+ context switch: restore 1st FP task 54 54
+ fp context switch: save idle, restore idle 47 46
+ fp context switch: save idle, restore initialized 25 25
+ fp context switch: save initialized, restore initialized 24 25
+ _Thread_Resume 23 24
+ _Thread_Unblock 14 14
+ _Thread_Ready 16 24
+ _Thread_Get 2 2
+ _Semaphore_Get 1 1
+ _Thread_Get: invalid id 0 0
+
+27 interrupt entry overhead: returns to interrupted task 25 23
+ interrupt exit overhead: returns to interrupted task 14 15
+ interrupt entry overhead: returns to nested interrupt 12 12
+ interrupt exit overhead: returns to nested interrupt 14 14
+ interrupt entry overhead: returns to preempting task 14 16
+ interrupt exit overhead: returns to preempting task 42 38
+
+28 rtems_port_create 43 42
+ rtems_port_external_to_internal 6 4
+ rtems_port_internal_to_external 6 4
+ rtems_port_delete 39 33
+
+29 rtems_rate_monotonic_create 48 42
+ rtems_rate_monotonic_period: initiate period -- returns to caller 61 65
+ rtems_rate_monotonic_period: obtain status 23 21
+ rtems_rate_monotonic_cancel 38 35
+ rtems_rate_monotonic_delete: inactive 32 32
+ rtems_rate_monotonic_delete: active 22 22
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 24 19
diff --git a/c/src/lib/libbsp/i386/go32/times_p5 b/c/src/lib/libbsp/i386/go32/times_p5
new file mode 100644
index 0000000000..977c4ec482
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/times_p5
@@ -0,0 +1,196 @@
+#
+# Timing Test Suite Results for the go32 BSP using a Pentium
+#
+# $Id$
+#
+
+NOTE: To obtain the execution time in microseconds, divide the number of
+ cycles by the clock speed. For example, if rtems_semaphore create
+ is reported to be 1164 cycles, then at 66 Mhz it takes 17.64
+ microseconds or 8.75 microseconds at 133 Mhz.
+
+Board: PC/AT clone
+CPU: Intel Pentium
+Clock Speed: 66 Mhz
+Memory Configuration: DRAM w/512 Kb cache
+Wait States: unknown
+
+Times Reported in: cycles
+Timer Source: on-CPU cycle counter
+
+Column A: 3.5.1 pre-release
+Column Y: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 1164
+ rtems_semaphore_delete 976
+ rtems_semaphore_obtain: available 300
+ rtems_semaphore_obtain: not available -- NO_WAIT 300
+ rtems_semaphore_release: no waiting tasks 291
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 1182
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 716
+
+ 4 rtems_task_restart: blocked task -- preempts caller 2130
+ rtems_task_restart: ready task -- preempts caller 1861
+ rtems_semaphore_release: task readied -- returns to caller 491
+ rtems_task_create 1017
+ rtems_task_start 965
+ rtems_task_restart: suspended task -- returns to caller 816
+ rtems_task_delete: suspended task 926
+ rtems_task_restart: ready task -- returns to caller 850
+ rtems_task_restart: blocked task -- returns to caller 1076
+ rtems_task_delete: blocked task 927
+
+ 5 rtems_task_suspend: calling task 714
+ rtems_task_resume: task readied -- preempts caller 575
+
+ 6 rtems_task_restart: calling task 646
+ rtems_task_suspend: returns to caller 309
+ rtems_task_resume: task readied -- returns to caller 320
+ rtems_task_delete: ready task 994
+
+ 7 rtems_task_restart: suspended task -- preempts caller 1025
+
+ 8 rtems_task_set_priority: obtain current priority 223
+ rtems_task_set_priority: returns to caller 468
+ rtems_task_mode: obtain current mode 99
+ rtems_task_mode: no reschedule 114
+ rtems_task_mode: reschedule -- returns to caller 264
+ rtems_task_mode: reschedule -- preempts caller 836
+ rtems_task_set_note 236
+ rtems_task_get_note 232
+ rtems_clock_set 569
+ rtems_clock_get 107
+
+ 9 rtems_message_queue_create 3287
+ rtems_message_queue_send: no waiting tasks 613
+ rtems_message_queue_urgent: no waiting tasks 615
+ rtems_message_queue_receive: available 534
+ rtems_message_queue_flush: no messages flushed 252
+ rtems_message_queue_flush: messages flushed 335
+ rtems_message_queue_delete 1195
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 333
+ rtems_message_queue_receive: not available -- caller blocks 1194
+
+11 rtems_message_queue_send: task readied -- preempts caller 957
+
+12 rtems_message_queue_send: task readied -- returns to caller 700
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 1261
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 697
+
+15 rtems_event_receive: obtain current events 27
+ rtems_event_receive: not available -- NO_WAIT 226
+ rtems_event_receive: not available -- caller blocks 888
+ rtems_event_send: no task readied 221
+ rtems_event_receive: available 393
+ rtems_event_send: task readied -- returns to caller 496
+
+16 rtems_event_send: task readied -- preempts caller 719
+
+17 rtems_task_set_priority: preempts caller 959
+
+18 rtems_task_delete: calling task 1295
+
+19 rtems_signal_catch 223
+ rtems_signal_send: returns to caller 628
+ rtems_signal_send: signal to self 821
+ exit ASR overhead: returns to calling task 401
+ exit ASR overhead: returns to preempting task 482
+
+20 rtems_partition_create 1337
+ rtems_region_create 1031
+ rtems_partition_get_buffer: available 680
+ rtems_partition_get_buffer: not available 303
+ rtems_partition_return_buffer 617
+ rtems_partition_delete 523
+ rtems_region_get_segment: available 458
+ rtems_region_get_segment: not available -- NO_WAIT 565
+ rtems_region_return_segment: no waiting tasks 388
+ rtems_region_get_segment: not available -- caller blocks 1683
+ rtems_region_return_segment: task readied -- preempts caller 1476
+ rtems_region_return_segment: task readied -- returns to caller 818
+ rtems_region_delete 477
+ rtems_io_initialize 48
+ rtems_io_open 22
+ rtems_io_close 22
+ rtems_io_read 22
+ rtems_io_write 22
+ rtems_io_control 23
+
+21 rtems_task_ident 3381
+ rtems_message_queue_ident 3328
+ rtems_semaphore_ident 3593
+ rtems_partition_ident 3286
+ rtems_region_ident 3343
+ rtems_port_ident 3278
+ rtems_timer_ident 3282
+ rtems_rate_monotonic_ident 3287
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 1322
+ rtems_message_queue_broadcast: no waiting tasks 347
+ rtems_message_queue_broadcast: task readied -- preempts caller 1385
+
+23 rtems_timer_create 306
+ rtems_timer_fire_after: inactive 475
+ rtems_timer_fire_after: active 475
+ rtems_timer_cancel: active 277
+ rtems_timer_cancel: inactive 251
+ rtems_timer_reset: inactive 391
+ rtems_timer_reset: active 465
+ rtems_timer_fire_when: inactive 577
+ rtems_timer_fire_when: active 578
+ rtems_timer_delete: active 377
+ rtems_timer_delete: inactive 350
+ rtems_task_wake_when 1080
+
+24 rtems_task_wake_after: yield -- returns to caller 159
+ rtems_task_wake_after: yields -- preempts caller 574
+
+25 rtems_clock_tick 505
+
+26 _ISR_Disable 33
+ _ISR_Flash 33
+ _ISR_Enable 26
+ _Thread_Disable_dispatch 36
+ _Thread_Enable_dispatch 240
+ _Thread_Set_state 315
+ _Thread_Disptach (NO FP) 623
+ context switch: no floating point contexts 594
+ context switch: self 89
+ context switch: to another task 122
+ context switch: restore 1st FP task 1043
+ fp context switch: save idle, restore idle 978
+ fp context switch: save idle, restore initialized 390
+ fp context switch: save initialized, restore initialized 392
+ _Thread_Resume 238
+ _Thread_Unblock 171
+ _Thread_Ready 176
+ _Thread_Get 71
+ _Semaphore_Get 61
+ _Thread_Get: invalid id 10
+
+27 interrupt entry overhead: returns to interrupted task 391
+ interrupt exit overhead: returns to interrupted task 110
+ interrupt entry overhead: returns to nested interrupt 167
+ interrupt exit overhead: returns to nested interrupt 120
+ interrupt entry overhead: returns to preempting task 193
+ interrupt exit overhead: returns to preempting task 961
+
+28 rtems_port_create 668
+ rtems_port_external_to_internal 215
+ rtems_port_internal_to_external 211
+ rtems_port_delete 491
+
+29 rtems_rate_monotonic_create 823
+ rtems_rate_monotonic_period: initiate period -- returns to caller 1094
+ rtems_rate_monotonic_period: obtain status 345
+ rtems_rate_monotonic_cancel 602
+ rtems_rate_monotonic_delete: inactive 553
+ rtems_rate_monotonic_delete: active 528
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 672
diff --git a/c/src/lib/libbsp/i386/go32/wrapup/Makefile.in b/c/src/lib/libbsp/i386/go32/wrapup/Makefile.in
new file mode 100644
index 0000000000..52d7e1abea
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/wrapup/Makefile.in
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
+install: all
+
diff --git a/c/src/lib/libbsp/i386/i386ex/Makefile.in b/c/src/lib/libbsp/i386/i386ex/Makefile.in
new file mode 100644
index 0000000000..372f1fd5be
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/Makefile.in
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+#was:
+#SUB_DIRS=include startup clock console shmsupp timer wrapup
+#is
+SUB_DIRS=include startup clock console timer wrapup
diff --git a/c/src/lib/libbsp/i386/i386ex/README b/c/src/lib/libbsp/i386/i386ex/README
new file mode 100644
index 0000000000..482ea73fce
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/README
@@ -0,0 +1,8 @@
+#
+# $Id$
+#
+
+This bsp was developed for rtems 3.2.1 and has not been updated.
+
+Some attempt has been made to update it but there is no way to no if it
+works.
diff --git a/c/src/lib/libbsp/i386/i386ex/bsp_specs b/c/src/lib/libbsp/i386/i386ex/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/i386/i386ex/clock/Makefile.in b/c/src/lib/libbsp/i386/i386ex/clock/Makefile.in
new file mode 100644
index 0000000000..3dd7213304
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/clock/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/i386ex/clock/ckinit.c b/c/src/lib/libbsp/i386/i386ex/clock/ckinit.c
new file mode 100644
index 0000000000..41b3a0e18c
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/clock/ckinit.c
@@ -0,0 +1,152 @@
+/* Clock_initialize
+ *
+ * This routine initializes the Timer/Counter on the Intel
+ * 386ex evaluation board.
+ *
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include <rtems/libio.h>
+
+#include <stdlib.h>
+
+#define CLOCK_VECTOR 0x20
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_major_number rtems_clock_minor = 0;
+
+/*
+ * This is the ISR handler.
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ /* enable_tracing(); */
+ Clock_driver_ticks += 1;
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = ( rtems_isr_entry ) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+
+/* The following is already set up in interns.s ->
+ ( This is test code only... production code will move the
+ TMRCFG stuff here )
+*/
+#define TMR0 0xF040
+#define TMR1 0xF041
+#define TMR2 0xF042
+#define TMRCON 0xF043
+#define TMRCFG 0xF834
+
+ outport_byte ( TMRCFG , 0x80 );
+
+ outport_byte ( TMRCON , 0x34 );
+ outport_byte ( TMR0 , 0xA8 );
+ outport_byte ( TMR0 , 0x04 );
+
+ outport_byte ( TMRCFG , 0x00 );
+ }
+ atexit( Clock_exit );
+}
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ /* should do something here */;
+ }
+}
+
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/i386/i386ex/console/Makefile.in b/c/src/lib/libbsp/i386/i386ex/console/Makefile.in
new file mode 100644
index 0000000000..e7ec245705
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/console/Makefile.in
@@ -0,0 +1,57 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/i386ex/console/console.c b/c/src/lib/libbsp/i386/i386ex/console/console.c
new file mode 100644
index 0000000000..859dfffdbe
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/console/console.c
@@ -0,0 +1,280 @@
+/*
+ * This file contains the i386ex console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define F386_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <stdlib.h>
+
+#include "../startup/80386ex.h"
+
+/* console_cleanup
+ *
+ * This routine is called at exit to clean up the console hardware.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+void console_cleanup( void )
+{
+ register rtems_unsigned8 ignored;
+
+/* clear the read buffer */
+
+ inport_byte( RBR0, ignored );
+
+}
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ /*
+ * flush the console now and at exit. Just in case.
+ */
+
+ console_cleanup();
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ atexit( console_cleanup );
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ register rtems_unsigned8 status;
+
+ inport_byte( LSR1, status );
+
+ if ( Is_rx_ready( status ) ) {
+ inport_byte( RBR1, status );
+ *ch = status;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the UART.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char inbyte( void )
+{
+ register rtems_unsigned8 status;
+ char ch;
+
+ do {
+ inport_byte( LSR1, status );
+ } while ( !( status & 0x01 ));/* s/b while ( !( Is_rx_ready( status ) ) ); */
+
+ inport_byte( RBR1, ch );
+
+ return ch;
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the port. It supports
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ rtems_unsigned8 status;
+
+ do {
+ inport_byte( LSR1, status );
+ } while ( ! ( 0x40 & status ) ); /* ( Is_tx_ready( status ) ) );*/
+
+/*
+ * GDB will NOT use XON/XOFF protocol
+ */
+
+
+#ifdef USE_XON
+
+ while ( is_character_ready( &status ) == TRUE ) {
+ if ( status == XOFF )
+ do {
+ while ( is_character_ready( &status ) == FALSE ) ;
+ } while ( status != XON );
+ }
+
+#endif
+
+ outport_byte( TBR1, ch );
+
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/i386/i386ex/include/Makefile.in b/c/src/lib/libbsp/i386/i386ex/include/Makefile.in
new file mode 100644
index 0000000000..20c100b31f
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/include/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
+
+install: all
diff --git a/c/src/lib/libbsp/i386/i386ex/include/bsp.h b/c/src/lib/libbsp/i386/i386ex/include/bsp.h
new file mode 100644
index 0000000000..a40f3c20eb
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/include/bsp.h
@@ -0,0 +1,146 @@
+/*
+ * This include file definitions related to an Intel i386ex board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __FORCE386_h
+#define __FORCE386_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <iosupp.h>
+#include <console.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Use a software interrupt for the i386.
+ */
+
+#define MUST_WAIT_FOR_INTERRUTPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 0x90, 1 )
+
+#define Cause_tm27_intr() asm volatile( "int $0x90" : : );
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( _microseconds ) \
+ { \
+ rtems_unsigned32 _counter; \
+ \
+ _counter = (_microseconds); \
+ \
+ asm volatile ( "0: nop;" \
+ " mov %0,%0 ;" \
+ " loop 0b" : "=c" (_counter) \
+ : "0" (_counter) \
+ ); \
+ \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+
+/* replaced the earlier EI kludge of 0xfffff */
+
+#define RAM_END 0x100000
+
+/* I/O addressing */
+
+/*
+ *#define Is_tx_ready( _status ) ( (_status) & 0x20 )
+ */
+/* dec 20. try the TE instead of TBE as the check */
+
+#define Is_tx_ready( _status ) ( (_status) & 0x40 )
+
+
+#define Is_rx_ready( _status ) ( (_status) & 0x01 )
+
+/* Structures */
+
+#ifdef F386_INIT
+#undef BSP_EXTERN
+#define BSP_EXTERN
+#else
+#undef BSP_EXTERN
+#define BSP_EXTERN extern
+#endif
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern i386_IDT_slot Interrupt_descriptor_table[ 256 ];
+extern i386_GDT_slot Global_descriptor_table[ 8192 ];
+
+BSP_EXTERN unsigned short Idt[3]; /* Interrupt Descriptor Table Address */
+BSP_EXTERN unsigned short Gdt[3]; /* Global Descriptor Table Address */
+BSP_EXTERN unsigned int Idt_base;
+BSP_EXTERN unsigned int Gdt_base;
+
+/* routines */
+
+i386_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/i386/i386ex/include/coverhd.h b/c/src/lib/libbsp/i386/i386ex/include/coverhd.h
new file mode 100644
index 0000000000..2d4e6f5a85
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 3
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 3
+#define CALLING_OVERHEAD_TASK_CREATE 4
+#define CALLING_OVERHEAD_TASK_IDENT 4
+#define CALLING_OVERHEAD_TASK_START 4
+#define CALLING_OVERHEAD_TASK_RESTART 3
+#define CALLING_OVERHEAD_TASK_DELETE 3
+#define CALLING_OVERHEAD_TASK_SUSPEND 3
+#define CALLING_OVERHEAD_TASK_RESUME 3
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 4
+#define CALLING_OVERHEAD_TASK_MODE 4
+#define CALLING_OVERHEAD_TASK_GET_NOTE 4
+#define CALLING_OVERHEAD_TASK_SET_NOTE 4
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 7
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 3
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 4
+#define CALLING_OVERHEAD_CLOCK_GET 7
+#define CALLING_OVERHEAD_CLOCK_SET 7
+#define CALLING_OVERHEAD_CLOCK_TICK 2
+
+#define CALLING_OVERHEAD_TIMER_CREATE 3
+#define CALLING_OVERHEAD_TIMER_IDENT 3
+#define CALLING_OVERHEAD_TIMER_DELETE 3
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 4
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 8
+#define CALLING_OVERHEAD_TIMER_RESET 3
+#define CALLING_OVERHEAD_TIMER_CANCEL 3
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 4
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 3
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 4
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 4
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 3
+
+#define CALLING_OVERHEAD_EVENT_SEND 4
+#define CALLING_OVERHEAD_EVENT_RECEIVE 4
+#define CALLING_OVERHEAD_SIGNAL_CATCH 3
+#define CALLING_OVERHEAD_SIGNAL_SEND 3
+#define CALLING_OVERHEAD_PARTITION_CREATE 4
+#define CALLING_OVERHEAD_PARTITION_IDENT 4
+#define CALLING_OVERHEAD_PARTITION_DELETE 3
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 4
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 4
+#define CALLING_OVERHEAD_REGION_CREATE 4
+#define CALLING_OVERHEAD_REGION_IDENT 3
+#define CALLING_OVERHEAD_REGION_DELETE 3
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 4
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 4
+#define CALLING_OVERHEAD_PORT_CREATE 4
+#define CALLING_OVERHEAD_PORT_IDENT 3
+#define CALLING_OVERHEAD_PORT_DELETE 3
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 4
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 4
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 4
+#define CALLING_OVERHEAD_IO_OPEN 4
+#define CALLING_OVERHEAD_IO_CLOSE 4
+#define CALLING_OVERHEAD_IO_READ 4
+#define CALLING_OVERHEAD_IO_WRITE 4
+#define CALLING_OVERHEAD_IO_CONTROL 4
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 3
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 3
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 2
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/Makefile.in b/c/src/lib/libbsp/i386/i386ex/startup/Makefile.in
new file mode 100644
index 0000000000..3479890d21
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/startup/Makefile.in
@@ -0,0 +1,64 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+# C_PIECES=bspstart sbrk setvec except i386-stub
+C_PIECES=bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+
+# Assembly source names, if any, go here -- minus the .s
+# removed initcsu piece, ldsegs piece and flush
+S_PIECES= gdt idt interrupts interns reset_jmp
+
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(srcdir)/linkcmds $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+#DEFINES += -DPRINTON
+DEFINES += -I$(srcdir)
+CPPFLAGS +=
+CFLAGS += -g
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/README b/c/src/lib/libbsp/i386/i386ex/startup/README
new file mode 100644
index 0000000000..44f8d1d63c
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/startup/README
@@ -0,0 +1,25 @@
+
+
+ The doit shell file cd's to $H, which refers to the directory
+that contains the hello world test. The console is a raw com port.
+Certain test programs behave differently with different com port speeds.
+To test the programs, it is required that you hook up a terminal
+( or minicom or procomm it doesn't really matter ) to the comm port of
+the target hardware. You must ensure that the baud rate, parity etc
+is set properly. This is done on the target hardware within interns.s .
+( Set your terminal emulator to match. ) Currently, the settings
+are 9600,8,n,1 .
+
+The format and layout of the file interns.s is taken from the
+intel ApBuilder software, freely distributed by Intel. Some
+easy macros ( SetExRegByte and SetExRegWord ) are basically lifted
+from the Intel macros. Similarly for the names of the IO ports.
+
+This "port" begain with the forceCPU bsp. Hence I am sure that
+there is some real trash that is not appropriate. For example
+the act of copying the Interrupt Descriptor tables and Global
+descriptor tables "into our space". ( in start.s I think )
+
+Erik
+
+ \ No newline at end of file
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/bspstart.c b/c/src/lib/libbsp/i386/i386ex/startup/bspstart.c
new file mode 100644
index 0000000000..604993ae87
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/startup/bspstart.c
@@ -0,0 +1,229 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <fcntl.h>
+
+#ifdef PRINTON
+extern char inbyte(void);
+extern void outbyte(char);
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+
+#ifdef PRINTON
+ outbyte('a');
+ outbyte('b');
+ outbyte('c');
+ outbyte ('S');
+#endif
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * we do not use the pretasking_hook.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_table_segment = get_ds();
+
+ Cpu_table.interrupt_table_offset = (void *)Interrupt_descriptor_table;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ RAM_END - BSP_Configuration.work_space_size;
+
+
+#ifdef SPRINTON
+ sprintf( x_buffer, "ram end : %u, work_space_size: %d\n",
+ RAM_END , BSP_Configuration.work_space_size );
+ do {
+ outbyte ( x_buffer[i] );
+ } while ( x_buffer[i++] != '\n');
+#endif
+
+ /*
+ * Add 1 region for Malloc in libc_low
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+ /* no cleanup necessary for i386ex */
+ for (;;); /* was return 0 to go to the debug monitor */
+}
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/linkcmds b/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
new file mode 100644
index 0000000000..308e313b40
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
@@ -0,0 +1,106 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Intel 386ex evaluation board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * linkcmds,v 1.0 1995/11/30 16:52:02 Erik Ivanenko
+ */
+
+
+ ENTRY(reset) ;
+SECTIONS
+{
+ _rom_ints = 0x3fb0000;
+ .ints 0x0100 :
+ AT ( _rom_ints ) /* was 0x3fb3300 */
+ {
+ _sints = .;
+ *(.ints);
+ _eints = ALIGN (0x010);
+ }
+ _cs4_ints_segment = 0x0010 ;
+ _cs4_ints_offset = 0x0000 ;
+ _cs6_t_ints_segment = 0xF000 ; /* was 0xF000 */
+ _cs6_t_ints_offset = 0x0000 ; /* was 0x3300 */
+ _cs6_t_ints_size = _eints - _sints ;
+
+ _rom_gdt = _rom_ints + _cs6_t_ints_size;
+ .gdt 0x1000 :
+ AT ( _rom_gdt )
+ {
+ _sgdt = .;
+ *(.gdt);
+ _egdt = ALIGN (0x10);
+ }
+ _cs4_gdt_segment = 0x0100 ; /* evaluates to 0x1000 */
+ _cs4_gdt_offset = 0x0000 ;
+ _cs6_t_gdt_segment = 0xF000;
+ _cs6_t_gdt_offset = _cs6_t_ints_size; /* was 0x0 */
+ _cs6_t_gdt_size = _egdt - _sgdt;
+
+ _rom_idt = _rom_gdt + _cs6_t_gdt_size + _cs6_t_ints_size ;
+ .idt 0x1200 :
+ AT ( _rom_idt )
+ {
+ _sidt = .;
+ *(.idt);
+ _eidt = ALIGN (0x10);
+ }
+ _cs4_idt_segment = 0x0120;
+ _cs4_idt_offset = 0x0000 ;
+ _cs6_t_idt_segment = 0xF000 ;
+ _cs6_t_idt_offset = _cs6_t_ints_size + _cs6_t_gdt_size ; /* was 0x1000 */
+ _cs6_t_idt_size = _eidt - _sidt;
+
+ _rom_data_start = _rom_idt + _cs6_t_idt_size ;
+ .data :
+ AT ( _rom_data_start ) /* was 0x3fd0000 */
+ {
+ _sdata = .;
+ *(.data);
+ _edata = ALIGN( 0x10 ) ;
+ }
+ _data_start = ADDR(.data) ;
+ _data_size = _edata - _sdata ;
+ _edata = _data_start + _data_size ;
+
+ .bss :
+ {
+ _bss_start = .;
+ *(.bss);
+ *(COMMON);
+ _ebss = ALIGN(0x10);
+ end = _ebss;
+ _end = end;
+ __end = end;
+ }
+ _bss_size = _ebss - _bss_start ;
+
+
+ .text ( 0x3f80000 ):
+ {
+ _text_start = . ;
+ *(.text ) ;
+ _etext = ALIGN( 0x10 );
+ }
+
+ .initial 0x3ff1000:
+ {
+ *(.initial);
+ }
+
+ .reset 0x3fffff0:
+ {
+ *(.reset);
+ }
+}
+
+
+
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/setvec.c b/c/src/lib/libbsp/i386/i386ex/startup/setvec.c
new file mode 100644
index 0000000000..88cf40a289
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/startup/setvec.c
@@ -0,0 +1,59 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the Force CPU-386.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+i386_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ i386_isr_entry previous_isr;
+ i386_IDT_slot idt;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ /* get the address of the old handler */
+
+ idt = Interrupt_descriptor_table[ vector ];
+
+ previous_isr = (i386_isr_entry)
+ ((idt.offset_16_31 << 16) | idt.offset_0_15);
+
+ /* build the IDT entry */
+ idt.offset_0_15 = ((rtems_unsigned32) handler) & 0xffff;
+ idt.segment_selector = get_cs();
+ idt.reserved = 0x00;
+ idt.p_dpl = 0x8e; /* present, ISR */
+ idt.offset_16_31 = ((rtems_unsigned32) handler) >> 16;
+
+ /* install the IDT entry */
+ Interrupt_descriptor_table[ vector ] = idt;
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/i386/i386ex/timer/Makefile.in b/c/src/lib/libbsp/i386/i386ex/timer/Makefile.in
new file mode 100644
index 0000000000..5327de40f1
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i386/i386ex/timer/timer.c b/c/src/lib/libbsp/i386/i386ex/timer/timer.c
new file mode 100644
index 0000000000..497343ee2c
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/timer/timer.c
@@ -0,0 +1,99 @@
+/* Timer_init()
+ *
+ * This routine initializes the timer on the FORCE CPU-386 board.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine will not work if the optimizer is enabled
+ * for some compilers. The multiple writes to the Z8036
+ * may be optimized away.
+ *
+ * It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+int Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+#define TMR0 0xF040
+#define TMR1 0xF041
+#define TMR2 0xF042
+#define TMRCON 0xF043
+#define TMRCFG 0xF834
+
+void Timer_initialize()
+{
+
+ (void) set_vector( timerisr, 0x2a, 0 ); /* install ISR ( IR2 ) was 0x38*/
+
+ Ttimer_val = 0; /* clear timer ISR count */
+
+ outport_byte ( TMRCON , 0xb0 ); /* select tmr2, stay in mode 0 */
+ outport_byte ( TMR1 , 0xd2 ); /* set to 250 usec interval */
+ outport_byte ( TMR1 , 0x00 );
+ outport_byte ( TMRCON , 0x64 ); /* change to mode 2 ( starts timer ) */
+ /* interrupts ARE enabled */
+/* outport_byte( IERA, 0x41 ); enable interrupt */
+
+}
+
+#define AVG_OVERHEAD 3 /* It typically takes 3.0 microseconds */
+ /* (3 ticks) to start/stop the timer. */
+#define LEAST_VALID 4 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ register rtems_unsigned32 clicks;
+ register rtems_unsigned32 total;
+
+/* outport_byte( TBCR, 0x00 ); stop the timer -- not needed on intel */
+
+ outport_byte ( TMRCON, 0x40 ); /* latch the count */
+ inport_byte ( TMR1, clicks ); /* read the count */
+
+ total = Ttimer_val + 250 - clicks;
+
+/* outport_byte( TBCR, 0x00 ); initial value */
+/* outport_byte( IERA, 0x40 ); disable interrupt */
+
+ /* ??? Is "do not restore old vector" causing problems? */
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in one microsecond units */
+
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ return (total - AVG_OVERHEAD);
+ }
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/i386/i386ex/timer/timerisr.s b/c/src/lib/libbsp/i386/i386ex/timer/timerisr.s
new file mode 100644
index 0000000000..5a6b2d1c6b
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/timer/timerisr.s
@@ -0,0 +1,34 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the Z8036 timer on the MVME136
+ * board. The timer is set up to generate an interrupt at maximum
+ * intervals.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+ BEGIN_CODE
+
+ EXTERN (Ttimer_val)
+
+ PUBLIC (timerisr)
+SYM (timerisr):
+ addl $250, SYM (Ttimer_val) # another 250 microseconds
+ iret
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/i386/i386ex/wrapup/Makefile.in b/c/src/lib/libbsp/i386/i386ex/wrapup/Makefile.in
new file mode 100644
index 0000000000..52d7e1abea
--- /dev/null
+++ b/c/src/lib/libbsp/i386/i386ex/wrapup/Makefile.in
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
+install: all
+
diff --git a/c/src/lib/libbsp/i960/Makefile.in b/c/src/lib/libbsp/i960/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/i960/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/i960/cvme961/Makefile.in b/c/src/lib/libbsp/i960/cvme961/Makefile.in
new file mode 100644
index 0000000000..1280bbaad6
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console shmsupp timer wrapup
diff --git a/c/src/lib/libbsp/i960/cvme961/bsp_specs b/c/src/lib/libbsp/i960/cvme961/bsp_specs
new file mode 100644
index 0000000000..866b9aeb8f
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e _start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/i960/cvme961/clock/Makefile.in b/c/src/lib/libbsp/i960/cvme961/clock/Makefile.in
new file mode 100644
index 0000000000..8e325402ca
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/clock/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i960/cvme961/clock/ckinit.c b/c/src/lib/libbsp/i960/cvme961/clock/ckinit.c
new file mode 100644
index 0000000000..22a4d43b89
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/clock/ckinit.c
@@ -0,0 +1,141 @@
+/* Clock_init()
+ *
+ * This routine initializes the timer on the VIC chip on the CVME961.
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#define CLOCK_VECTOR 5
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+i960_isr_entry Old_ticker;
+volatile rtems_unsigned32 Clock_driver_ticks;
+ /* ticks since initialization */
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+
+/* this is later in the file to avoid it being inlined */
+rtems_isr Clock_isr( rtems_vector_number vector );
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ volatile unsigned char *victimer;
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ victimer = (volatile unsigned char *) 0xa00000c3;
+ *victimer = 0x12;
+ *victimer = 0x92; /* 1000 HZ */
+ }
+}
+
+void Clock_exit()
+{
+ unsigned char *victimer;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ victimer = (unsigned char *) 0xa00000c3;
+ *victimer = 0x12;
+ i960_mask_intr( 5 );
+ /* do not restore old vector */
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ atexit( Clock_exit );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ /* enable_tracing(); */
+ Clock_driver_ticks += 1;
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+ i960_clear_intr( 5 );
+}
+
diff --git a/c/src/lib/libbsp/i960/cvme961/console/Makefile.in b/c/src/lib/libbsp/i960/cvme961/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i960/cvme961/console/console.c b/c/src/lib/libbsp/i960/cvme961/console/console.c
new file mode 100644
index 0000000000..85aea09c64
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/console/console.c
@@ -0,0 +1,212 @@
+/*
+ * This file contains the CVME961 console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define C961_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * NINDY_IO( ... )
+ *
+ * Interface to NINDY.
+ */
+
+#define NINDY_INPUT 0
+#define NINDY_OUTPUT 1
+
+void NINDY_IO();
+
+void ___NINDY_IO_WRAPPER( void ) /* never called */
+{
+ asm volatile ( " .text" );
+ asm volatile ( " .align 4" );
+ asm volatile ( " .globl _NINDY_IO" );
+ asm volatile ( "_NINDY_IO:" );
+ asm volatile ( " calls 0 /* call console routines */" );
+ asm volatile ( " ret" );
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the console using NINDY.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char inbyte( void )
+{
+ char ch;
+
+ NINDY_IO( NINDY_INPUT, &ch );
+ return ch;
+}
+
+
+/* outbyte
+ *
+ * This routine transmits a character out the console using NINDY.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ NINDY_IO( NINDY_OUTPUT, ch );
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/i960/cvme961/include/Makefile.in b/c/src/lib/libbsp/i960/cvme961/include/Makefile.in
new file mode 100644
index 0000000000..c9b50f69c3
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/include/Makefile.in
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+# If you add equate files, don't forget to uncomment the install line
+# below.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include/cpu
+
+install: all
diff --git a/c/src/lib/libbsp/i960/cvme961/include/bsp.h b/c/src/lib/libbsp/i960/cvme961/include/bsp.h
new file mode 100644
index 0000000000..802c3fc0cb
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/include/bsp.h
@@ -0,0 +1,149 @@
+/* bsp.h
+ *
+ * This include file contains some definitions specific to the
+ * Cyclone CVME960 and CVME961 boards. These boards are the
+ * same except the 960 uses SRAM and the 961 DRAM.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CVME961_h
+#define __CVME961_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <iosupp.h>
+#include <console.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Following are for i960CA and are board independent
+ *
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 6, 1 )
+
+#define Cause_tm27_intr() i960_cause_intr( 0x62 )
+
+#define Clear_tm27_intr() i960_clear_intr( 6 )
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { register rtems_unsigned32 _delay=(microseconds); \
+ register rtems_unsigned32 _tmp = 0; /* initialized to avoid warning */ \
+ asm volatile( "0: \
+ remo 3,31,%0 ; \
+ cmpo 0,%0 ; \
+ subo 1,%1,%1 ; \
+ cmpobne.t 0,%1,0b " \
+ : "=d" (_tmp), "=d" (_delay) \
+ : "0" (_tmp), "1" (_delay) ); \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+/* NINDY console I/O requests:
+ * CO sends a single character to stdout,
+ * CI reads one.
+ */
+
+#define NINDY_INPUT 0
+#define NINDY_OUTPUT 1
+
+/*
+ * get_prcb
+ *
+ * Returns the PRCB pointer.
+ */
+
+static inline i960ca_PRCB *get_prcb( void )
+{
+ register i960ca_PRCB *_prcb = 0;
+
+ asm volatile( "calls 5; \
+ mov g0,%0" \
+ : "=d" (_prcb) \
+ : "0" (_prcb) );
+ return ( _prcb );
+}
+
+#ifdef C961_INIT
+#undef BSP_EXTERN
+#define BSP_EXTERN
+#else
+#undef BSP_EXTERN
+#define BSP_EXTERN extern
+#endif
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+BSP_EXTERN i960ca_PRCB *Prcb;
+BSP_EXTERN i960ca_control_table *Ctl_tbl;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+i960_isr_entry set_vector( rtems_isr_entry, unsigned int, unsigned int );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/i960/cvme961/include/coverhd.h b/c/src/lib/libbsp/i960/cvme961/include/coverhd.h
new file mode 100644
index 0000000000..e83f387c82
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 3
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 3
+#define CALLING_OVERHEAD_CLOCK_SET 3
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 6
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/i960/cvme961/shmsupp/Makefile.in b/c/src/lib/libbsp/i960/cvme961/shmsupp/Makefile.in
new file mode 100644
index 0000000000..113ab8109a
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/shmsupp/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/i960/cvme961/shmsupp/addrconv.c b/c/src/lib/libbsp/i960/cvme961/shmsupp/addrconv.c
new file mode 100644
index 0000000000..86d465c499
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/shmsupp/addrconv.c
@@ -0,0 +1,37 @@
+/* Shm_Convert_address
+ *
+ * This routine takes into account the peculiar short VME address
+ * of the CVME961 board. The CVME961 maps short address space
+ * 0xffffxxxx to 0xb400xxxx.
+ *
+ * Input parameters:
+ * address - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include "shm.h"
+
+void *Shm_Convert_address(
+ void *address
+)
+{
+ rtems_unsigned32 workaddr = (rtems_unsigned32) address;
+
+ if ( workaddr >= 0xffff0000 )
+ workaddr = (workaddr & 0xffff) | 0xb4000000;
+ return ( (rtems_unsigned32 *)workaddr );
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/shmsupp/getcfg.c b/c/src/lib/libbsp/i960/cvme961/shmsupp/getcfg.c
new file mode 100644
index 0000000000..aac8d9c52b
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/shmsupp/getcfg.c
@@ -0,0 +1,98 @@
+/* void Shm_Get_configuration( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the Cyclone CVME961.
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+ * NOTES: CVME961 target system has onboard dual-ported memory. This
+ * file uses the USE_ONBOARD_RAM macro to determine if this
+ * RAM is to be used as the SHM. If so (i.e. USE_ONBOARD_RAM
+ * is set to 1), it is assumed that the master node's dual
+ * ported memory will be used and that it is configured
+ * correctly. The node owning the memory CANNOT access it
+ * using a local address. The "if" insures that the MASTER
+ * node uses a local address to access the dual-ported memory.
+ *
+ * The interprocessor interrupt used on the CVME961 is generated
+ * by the VIC068. The ICMS capablities of the VIC068 are used
+ * to generate interprocessor interrupts for up to eight nodes.
+ *
+ * The following table illustrates the configuration limitations:
+ *
+ * BUS MAX
+ * MODE ENDIAN NODES
+ * ========= ====== =======
+ * POLLED LITTLE 2+
+ * INTERRUPT LITTLE 2-8
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+#define USE_ONBOARD_RAM 0 /* use onboard (1) or VME RAM */
+ /* for SHM communications */
+
+#define INTERRUPT 1 /* CVME961 target supports both */
+#define POLLING 0 /* polling and interrupt modes */
+
+
+shm_config_table BSP_shm_cfgtbl;
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+#if ( USE_ONBOARD_RAM == 1 )
+ if ( Shm_RTEMS_MP_Configuration->node == MASTER )
+ BSP_shm_cfgtbl.base = (rtems_unsigned32 *)0x00300000;
+ else
+ BSP_shm_cfgtbl.base = (rtems_unsigned32 *)0x10300000;
+#else
+ BSP_shm_cfgtbl.base = (rtems_unsigned32 *)0x20000000;
+#endif
+
+ BSP_shm_cfgtbl.length = 1 * MEGABYTE;
+ BSP_shm_cfgtbl.format = SHM_LITTLE;
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = (void *)CPU_swap_u32;
+#else
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#endif
+
+#if (POLLING==1)
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+#else
+ BSP_shm_cfgtbl.poll_intr = INTR_MODE;
+ BSP_shm_cfgtbl.Intr.address =
+ (rtems_unsigned32 *) (0xffff0021|((localnode-1) << 12));
+ /* use ICMS0 */
+ BSP_shm_cfgtbl.Intr.value = 1;
+ BSP_shm_cfgtbl.Intr.length = BYTE;
+#endif
+
+ *shmcfg = &BSP_shm_cfgtbl;
+
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/shmsupp/lock.c b/c/src/lib/libbsp/i960/cvme961/shmsupp/lock.c
new file mode 100644
index 0000000000..f74188a1b3
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/shmsupp/lock.c
@@ -0,0 +1,76 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = LQ_UNLOCKED;
+}
+
+/* void _Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level, oldlock;
+
+ rtems_interrupt_disable( isr_level );
+ Shm_isrstat = isr_level;
+ while ( 1 ) {
+ atomic_modify( SHM_LOCK_VALUE, &lq_cb->lock, oldlock );
+ if ( !(oldlock & SHM_LOCK_VALUE) )
+ return;
+ delay( 28 ); /* delay 28 microseconds */
+ }
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ lq_cb->lock = SHM_UNLOCK_VALUE;
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
+
diff --git a/c/src/lib/libbsp/i960/cvme961/shmsupp/mpisr.c b/c/src/lib/libbsp/i960/cvme961/shmsupp/mpisr.c
new file mode 100644
index 0000000000..df7aac41bf
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/shmsupp/mpisr.c
@@ -0,0 +1,70 @@
+/* Shm_isr_cvme961()
+ *
+ * NOTE: This routine is not used when in polling mode. Either
+ * this routine OR Shm_clockisr is used in a particular system.
+ *
+ * There must be sufficient time after the IACK (read at
+ * 0xb600000x) for the VIC068 to clear the interrupt request
+ * before the interrupt request is cleared from IPND (sf0).
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include "shm.h"
+
+rtems_isr Shm_isr_cvme961(
+ rtems_vector_number vector
+)
+{
+ rtems_unsigned32 vic_vector;
+
+ /* enable_tracing(); */
+ vic_vector = (*(volatile rtems_unsigned8 *)0xb6000007);
+ /* reset intr by reading */
+ /* vector at IPL=3 */
+ Shm_Interrupt_count += 1;
+ rtems_multiprocessing_announce();
+ (*(volatile rtems_unsigned8 *)0xa000005f) = 0; /* clear ICMS0 */
+ i960_clear_intr( 6 );
+
+}
+
+/* void _Shm_setvec( )
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * NOTE: See pp. 21-22, 36-39 of the CVME961 Manual for more info.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void Shm_setvec()
+{
+ rtems_unsigned32 isrlevel;
+
+ rtems_interrupt_disable( isrlevel );
+ /* set SQSIO4 CTL REG for */
+ /* VME slave address */
+ (*(rtems_unsigned8 *)0xc00000b0) =
+ (Shm_RTEMS_MP_Configuration->node - 1) | 0x10;
+ set_vector( Shm_isr_cvme961, 6, 1 );
+ /* set ICMS Bector Base Register */
+ (*(rtems_unsigned8 *)0xa0000053) = 0x60; /* XINT6 vector is 0x62 */
+ /* set ICMS Intr Control Reg */
+ (*(rtems_unsigned8 *)0xa0000047) = 0xeb; /* ICMS0 enabled, IPL=0 */
+ (*(rtems_unsigned8 *)0xa000005f) = 0; /* clear ICMS0 */
+ rtems_interrupt_enable( isrlevel );
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/start/Makefile.in b/c/src/lib/libbsp/i960/cvme961/start/Makefile.in
new file mode 100644
index 0000000000..ca57ecd097
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/start/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=start
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+PGM=${ARCH}/start.o
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/i960/cvme961/startup/Makefile.in b/c/src/lib/libbsp/i960/cvme961/startup/Makefile.in
new file mode 100644
index 0000000000..9b6906ed4c
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/startup/Makefile.in
@@ -0,0 +1,55 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/i960/cvme961/startup/bspclean.c b/c/src/lib/libbsp/i960/cvme961/startup/bspclean.c
new file mode 100644
index 0000000000..35db01a0f7
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/startup/bspclean.c
@@ -0,0 +1,36 @@
+/*
+ * This routine is used to return control to the NINDY monitor
+ * and is automatically invoked at shutdown.
+ *
+ * NOTES: DOES NOT RETURN!!!
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "bsp.h"
+
+void bsp_cleanup( void )
+{
+ extern void start( void );
+
+ register volatile void *start_addr = 0;
+
+ asm volatile( "mov 0,g0;"
+ "fmark ;"
+ "syncf ;"
+ ".word 0xfeedface ; "
+ "bx (%0)" : "=r" (start_addr) : "0" (start_addr) );
+ /* The constant 0xfeedface is a magic word for break which
+ * is defined by NINDY. The branch extended restarts the
+ * application if the user types "go".
+ */
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/startup/bspstart.c b/c/src/lib/libbsp/i960/cvme961/startup/bspstart.c
new file mode 100644
index 0000000000..19e848490e
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/startup/bspstart.c
@@ -0,0 +1,245 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /* set node number in SQSIO4 CTL REG */
+
+ *((rtems_unsigned32 *)0xc00000b0) =
+ (Configuration.User_multiprocessing_table) ?
+ Configuration.User_multiprocessing_table->node : 0;
+
+ Prcb = get_prcb();
+ Ctl_tbl = Prcb->control_tbl;
+
+ /* following configures the data breakpoint (which must be set
+ * before this is executed) to break on writes only.
+ */
+
+ Ctl_tbl->bpcon &= ~0x00cc0000;
+ i960_reload_ctl_group( 6 );
+
+ /* bit 31 of the Register Cache Control can be set to
+ * enable an alternative caching algorithm. It does
+ * not appear to help RTEMS.
+ */
+
+ /* Configure Number of Register Caches */
+
+ Prcb->reg_cache_cfg = 8;
+ i960_soft_reset( Prcb );
+
+ /*
+ * we do not use the pretasking_hook.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ Cpu_table.Prcb = Prcb;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ bsp_cleanup();
+
+ return 0;
+
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/startup/exit.c b/c/src/lib/libbsp/i960/cvme961/startup/exit.c
new file mode 100644
index 0000000000..12aa1ab480
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/startup/exit.c
@@ -0,0 +1,38 @@
+/* exit
+ *
+ * This routine is used to return control to the NINDY monitor
+ * and is automatically invoked by the STDIO exit() routine.
+ *
+ * INPUT:
+ * status - exit status
+ *
+ * OUTPUT: NONE
+ *
+ * NOTES: DOES NOT RETURN!!!
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "bsp.h"
+
+void _exit( )
+{
+ asm volatile( "mov 0,g0; \
+ fmark ; \
+ syncf ; \
+ .word 0xfeedface ; \
+ bx start" : : );
+ /* The constant 0xfeedface is a magic word for break which
+ * is defined by NINDY. The branch extended restarts the
+ * application if the user types "go".
+ */
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/startup/linkcmds b/c/src/lib/libbsp/i960/cvme961/startup/linkcmds
new file mode 100644
index 0000000000..e209c433fb
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/startup/linkcmds
@@ -0,0 +1,48 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Cyclone CVME960/CVME961 boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x0, l = 1M
+ }
+
+SECTIONS
+{
+ .text 0x10000 :
+ {
+ text_start = . ;
+ _text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+/* _etext = .; -- conflicts */
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ _data_start = .;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+/* _edata = .; -- conflicts */
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/startup/setvec.c b/c/src/lib/libbsp/i960/cvme961/startup/setvec.c
new file mode 100644
index 0000000000..c4da27e22c
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/startup/setvec.c
@@ -0,0 +1,145 @@
+/* set_vector
+ *
+ * This routine attempts to perform all "generic" interrupt initialization
+ * for the specified XINT line. It is specific to the Cyclone CVME961 in
+ * that it knows which interrupts are initialized by the monitor, the
+ * characteristics of XINT5 (VIC068 clock tick), and that it assumes the
+ * i960 is processing interrupts in dedicated mode. It attempts to map
+ * XINTs to interrupt vectors in a fairly straght forward way.
+ *
+ * XINT USE VECTOR INTR TBL INDEX TRIGGERED
+ * ==== ============= ====== ============== =========
+ * 0 VMEbus ERROR 0x02 0x03 EDGE
+ * 1 DRAM PARITY 0x12 0x13 EDGE
+ * 2 Z8530 0x22 0x23 LEVEL
+ * 3 SQUALL 0 0x52 0x53 ----
+ * 4 Z8536 (SQSIO4) 0x72 0x73 LEVEL
+ * 5 TICK 0x32 0x33 EDGE
+ * 6 VIC068 0x62 0x63 LEVEL
+ * 7 UNUSED 0x42 0x43 LEVEL
+ *
+ * The interrupt handler is installed in both the cached and memory
+ * resident interrupt tables. The appropriate IMAP register is updated to
+ * reflect the vector selected by this routine. Global interrupts are
+ * enabled. If XINT5 is being installed, places it in trigger mode.
+ * Finally, set_vector_support() is invoked to install the new IMAP and
+ * ICON, unmask the XINT in IMASK, and lower the i960's interrupt
+ * level to 0.
+ *
+ * INPUT:
+ * func - interrupt handler entry point
+ * xint - external interrupt line
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+#include <stdio.h>
+
+void print_prcb();
+void print_intr_info();
+void print_ipnd_imsk();
+
+unsigned int Xint_2_Group_Map[8] = { 0, 1, 2, 5, 7, 3, 6, 4 };
+
+i960_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry func, /* isr routine */
+ unsigned int xint, /* XINT number */
+ unsigned int type /* RTEMS or RAW */
+)
+{
+ i960_isr_entry *intr_tbl, *cached_intr_tbl;
+ i960_isr_entry saved_intr;
+ unsigned int vector, group, nibble;
+ unsigned int *imap;
+
+ if ( xint > 7 )
+ exit( 0x80 );
+
+ cached_intr_tbl = (i960_isr_entry *) 0;
+ intr_tbl = (i960_isr_entry *) Prcb->intr_tbl;
+ group = Xint_2_Group_Map[xint]; /* remap XINT to group */
+ vector = (group << 4) + 2; /* direct vector num */
+
+ if ( type )
+ rtems_interrupt_catch( func, vector, (rtems_isr_entry *) &saved_intr );
+ else {
+ saved_intr = (i960_isr_entry) intr_tbl[ vector ];
+ /* return old vector */
+ intr_tbl[ vector + 1 ] = /* normal vector table */
+ cached_intr_tbl[ group ] = (i960_isr_entry) func; /* cached vector */
+ }
+
+ if ( xint <= 3 ) imap = &Ctl_tbl->imap0; /* updating IMAP0 */
+ else imap = &Ctl_tbl->imap1; /* updating IMAP1 */
+ nibble = (xint % 4) * 4;
+ *imap &= ~(0xf << nibble);
+ *imap |= group << nibble;
+
+ Ctl_tbl->icon &= ~0x00000400; /* enable global interrupts */
+ Ctl_tbl->icon |= 0x00004000; /* fast sampling mode */
+ switch ( xint ) {
+ case 0: Ctl_tbl->icon |= 0x00000004; break;
+ case 1: Ctl_tbl->icon |= 0x00000008; break;
+ case 2: Ctl_tbl->icon &= ~0x00000010; break;
+ case 4: Ctl_tbl->icon &= ~0x00000040; break;
+ case 5: Ctl_tbl->icon |= 0x00000080; break;
+ case 6: Ctl_tbl->icon &= ~0x00000100; break;
+ default: exit( 0x81 ); break; /* unsupported */
+ }
+
+ if ( xint == 4 ) { /* reprogram MCON for SQSIO4 */
+ Ctl_tbl->mcon12 = 0x00002012; /* MCON12 - 0xCxxxxxxx */
+ Ctl_tbl->mcon13 = 0x00000000; /* MCON13 - 0xDxxxxxxx */
+ i960_reload_ctl_group( 5 ); /* update MCON12-MCON15 */
+ }
+
+ i960_unmask_intr( xint ); /* update IMSK */
+ i960_reload_ctl_group( 1 ); /* update IMAP?/ICON */
+ return( saved_intr ); /* return old vector */
+}
+
+void print_prcb()
+{
+ printf( "fault_table =0x%p\n", Prcb->fault_tbl );
+ printf( "control_tbl =0x%p\n", Prcb->control_tbl );
+ printf( "AC mask ov =0x%x\n", Prcb->initial_ac );
+ printf( "fltconfig =0x%x\n", Prcb->fault_config );
+ printf( "intr tbl =0x%p\n", Prcb->intr_tbl );
+ printf( "systable =0x%p\n", Prcb->sys_proc_tbl );
+ printf( "reserved =0x%x\n", Prcb->reserved );
+ printf( "isr stk =0x%p\n", Prcb->intr_stack );
+ printf( "ins cache =0x%x\n", Prcb->ins_cache_cfg );
+ printf( "reg cache =0x%x\n", Prcb->reg_cache_cfg );
+}
+
+void print_intr_info()
+{
+ printf( "prcb =0x%p\n", Prcb );
+ printf( "ctl_tbl =0x%p\n", Ctl_tbl );
+ printf( "intr_tbl=0x%p\n", Prcb->intr_tbl );
+ printf( "IMAP0 = 0x%x\n", Ctl_tbl->imap0 );
+ printf( "IMAP1 = 0x%x\n", Ctl_tbl->imap1 );
+ print_ipnd_imsk();
+}
+
+void print_ipnd_imsk()
+{
+ printf(" IPEND = 0x%x\n", i960_pend_intrs() );
+ printf(" IMASK = 0x%x\n", i960_mask_intrs() );
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/timer/Makefile.in b/c/src/lib/libbsp/i960/cvme961/timer/Makefile.in
new file mode 100644
index 0000000000..c2ba3476d3
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/i960/cvme961/timer/timer.c b/c/src/lib/libbsp/i960/cvme961/timer/timer.c
new file mode 100644
index 0000000000..a931a8d6f3
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/timer/timer.c
@@ -0,0 +1,107 @@
+/* Timer_init()
+ *
+ * This routine initializes the Z8536 timer on the SQSIO4 SQUALL
+ * board for the CVME961 board. The timer is setup to provide a
+ * tick every 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine will not work if the optimizer is enabled
+ * for most compilers. The multiple writes to the Z8536
+ * will be optimized away.
+ *
+ * It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+#include "z8536.h"
+
+#define TIMER 0xc00000a0
+
+int Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+void flush_reg();
+rtems_isr timerisr();
+
+void Timer_initialize()
+{
+ set_vector( timerisr, 4, 0 ); /* install ISR */
+
+ i960_mask_intr( 5 ); /* disable VIC068 tick */
+ flush_reg(); /* timed code starts clean */
+ Ttimer_val = 0; /* clear timer ISR count */
+ Z8x36_WRITE( TIMER, MASTER_INTR, 0x01 ); /* reset */
+ Z8x36_WRITE( TIMER, MASTER_INTR, 0x00 ); /* clear reset */
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0x00 ); /* disable everything */
+ Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, 0x72 ); /* clear intr vector */
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0x20 ); /* clear intr info */
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0xe0 ); /* disable interrupts */
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0x20 ); /* clear intr info */
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0xe0 ); /* disable interrupts */
+ Z8x36_WRITE( TIMER, MASTER_INTR, 0xe2 ); /* disable lower chain, */
+ /* no vector, set right */
+ /* justified addr and */
+ /* master int enable */
+ Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x80 ); /* T1 continuous, and */
+ /* cycle/pulse output */
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_MSB, 0x00 );
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_LSB, 0x00 );
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xc0 ); /* set INTR enable (IE) */
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0x40 ); /* enable timer1 */
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x06 ); /* set trigger command */
+ /* (TCB) and gate */
+ /* command (GCB) bits */
+}
+
+#define AVG_OVERHEAD 11 /* It typically takes 5.5 microseconds */
+ /* (11 countdowns) to start/stop the timer. */
+#define LEAST_VALID 15 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ rtems_unsigned8 msb, lsb;
+ rtems_unsigned32 remaining, total;
+
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xce ); /* read the counter value */
+ Z8x36_READ( TIMER, CT1_CUR_CNT_MSB, msb );
+ Z8x36_READ( TIMER, CT1_CUR_CNT_LSB, lsb );
+
+ remaining = 0xffff - ((msb << 8) + lsb);
+ total = (Ttimer_val * 0x10000) + remaining;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in one-half microsecond units */
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ return (total-AVG_OVERHEAD) >> 1;
+ }
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/i960/cvme961/timer/timerisr.s b/c/src/lib/libbsp/i960/cvme961/timer/timerisr.s
new file mode 100644
index 0000000000..3c1368f130
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/timer/timerisr.s
@@ -0,0 +1,65 @@
+/* timer_isr()
+ *
+ * This routine initializes the Z8536 timer on the SQSIO4 SQUALL
+ * board for the CVME961 board. The timer is setup to provide a
+ * tick every 0x10000 / 2 milliseconds. This is used to time
+ * executing code.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+.set PORT_A, 0xc00000a8 # port A
+.set PORT_B, 0xc00000a4 # port B
+.set PORT_C, 0xc00000a0 # port C
+.set CTL_PORT, 0xc00000ac # control port
+
+.set T1CSR, 0x0a # T1 command/status reg
+.set RELOAD, 0x24 # clr IP & IUS,allow countdown
+
+/*
+ * Duplicating this symbol is stupid but eliminates
+ * toolset variation problems.
+ */
+ PUBLIC(timerisr)
+ PUBLIC(_timerisr)
+SYM (timerisr):
+SYM (_timerisr):
+ #ldconst 1,r4
+ #modpc 0,r4,r4 # enable tracing
+
+ ld _Ttimer_val,r6 # r6 = test timer
+
+ ldconst T1CSR,r4 # r4 = T1 control status reg
+ stob r4,CTL_PORT # select T1CSR
+ ldconst RELOAD,r5 # r5 = reset value
+ stob r5,CTL_PORT # reset countdown
+ addo 1,r6,r6
+ st r6,_Ttimer_val # increment test timer
+loop_til_cleared:
+ clrbit 4,sf0,sf0
+ bbs 4,sf0,loop_til_cleared
+leaf: ret
+
+ .leafproc _flush_reg, flush_reg.lf
+ .globl _flush_reg, flush_reg.lf
+_flush_reg:
+ lda leaf,g14 # g14 = exit address
+flush_reg.lf:
+ flushreg
+ mov g14,g0 # g0 = exit address
+ ldconst 0,g14 # set g14 for non-leaf
+ bx (g0)
diff --git a/c/src/lib/libbsp/i960/cvme961/times b/c/src/lib/libbsp/i960/cvme961/times
new file mode 100644
index 0000000000..2e742dd876
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/times
@@ -0,0 +1,191 @@
+#
+# Timing Test Suite Results for the Cyclone CVME961 BSP
+#
+# $Id$
+#
+
+Board: Cyclone CVME961
+CPU: Intel i960CA
+Clock Speed: 33 Mhz
+Memory Configuration: DRAM w/no cache
+Wait States: 2 wait states
+
+Times Reported in: microseconds
+Timer Source: Z8536 on SQUALL mezzanine module
+
+Column A: 3.5.1 pre-release
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/i960/cvme961/wrapup/Makefile.in b/c/src/lib/libbsp/i960/cvme961/wrapup/Makefile.in
new file mode 100644
index 0000000000..1f8b6feae9
--- /dev/null
+++ b/c/src/lib/libbsp/i960/cvme961/wrapup/Makefile.in
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console shmsupp timer
+GENERIC_PIECES=shmdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
+install: all
+
diff --git a/c/src/lib/libbsp/m68k/Makefile.in b/c/src/lib/libbsp/m68k/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/m68k/dmv152/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/Makefile.in
new file mode 100644
index 0000000000..85b2602471
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console spurious timer wrapup
diff --git a/c/src/lib/libbsp/m68k/dmv152/bsp_specs b/c/src/lib/libbsp/m68k/dmv152/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/dmv152/clock/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/clock/Makefile.in
new file mode 100644
index 0000000000..8e325402ca
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/clock/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c b/c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c
new file mode 100644
index 0000000000..c9fa0b7efc
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/clock/ckinit.c
@@ -0,0 +1,162 @@
+/* Clock_init()
+ *
+ * This routine initializes the Z80386 1 on the MVME136 board.
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+volatile rtems_unsigned32 Clock_driver_ticks;
+ /* ticks since initialization */
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+#define CLOCK_VECTOR TIMER_VECTOR
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * ISR Handler
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ Clock_driver_ticks += 1;
+
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xE2 );
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x22 );
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xC6 );
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ rtems_unsigned8 data;
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0xd4 );
+ Z8x36_READ ( TIMER, MASTER_INTR, data );
+ Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0x7E) );
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_MSB, 0x04 );
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_LSB, 0xCE );
+ Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x83 );
+ Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, CLOCK_VECTOR );
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x20 );
+ Z8x36_READ ( TIMER, MASTER_INTR, data );
+ Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0xDA) | 0x80 );
+
+ /*
+ * ACC_IC54 - interrupt 5 will be vectored and mapped to level 6
+ */
+
+ data = (*(rtems_unsigned8 *)0x0D00000B);
+ (*(rtems_unsigned8 *)0x0D00000B) = (data & 0x7F) | 0x60;
+
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xC6 );
+
+ atexit( Clock_exit );
+ }
+}
+
+void Clock_exit( void )
+{
+ rtems_unsigned8 data;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+
+ Z8x36_READ ( TIMER, MASTER_INTR, data );
+ Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0x01) );
+ /* do not restore old vector */
+
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/dmv152/console/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/dmv152/console/console.c b/c/src/lib/libbsp/m68k/dmv152/console/console.c
new file mode 100644
index 0000000000..24a54f7605
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/console/console.c
@@ -0,0 +1,222 @@
+/*
+ * This file contains the DMV152 console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define D152_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SCC.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SCC
+ */
+
+char inbyte( void )
+{
+ rtems_unsigned8 rr_0;
+ char ch;
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) != 0 )
+ break;
+ }
+
+ Z8x30_READ_DATA( CONSOLE_DATA, ch );
+ return ( ch );
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SCC. It supports
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ rtems_unsigned8 rr_0;
+ char flow_control;
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ if ( (rr_0 & RR_0_TX_BUFFER_EMPTY) != 0 )
+ break;
+ }
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 )
+ break;
+
+ Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
+
+ if ( flow_control == XOFF )
+ do {
+ do {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ } while ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 );
+ Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
+ } while ( flow_control != XON );
+ }
+
+ Z8x30_WRITE_DATA( CONSOLE_DATA, ch );
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/dmv152/include/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/dmv152/include/bsp.h b/c/src/lib/libbsp/m68k/dmv152/include/bsp.h
new file mode 100644
index 0000000000..d3a9fb6cf6
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/include/bsp.h
@@ -0,0 +1,190 @@
+/* bsp.h
+ *
+ * This include file contains all DMV152 board IO definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __DMV152_h
+#define __DMV152_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
+#include <iosupp.h>
+#include <vmeintr.h>
+#include <z8530.h>
+#include <z8536.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ */
+
+/* use a VMEbus interrupt */
+
+#define MUST_WAIT_FOR_INTERRUPT 1
+
+#define Install_tm27_vector( handler ) \
+ { \
+ set_vector( (handler), 0x50, 1 ); \
+ (*(volatile rtems_unsigned32 *)0x0d800024) = 0x50; /* set IVECT reg */ \
+ (*(volatile rtems_unsigned8 *)0x0d00000c) = 0x40; /* set VIE reg */ \
+ }
+
+#define Cause_tm27_intr() \
+ (*(volatile rtems_unsigned8 *)0x0d000003) = 0x0f /* set VINT */
+
+#define Clear_tm27_intr() /* no operation necessary */
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { register rtems_unsigned32 _delay=(microseconds); \
+ register rtems_unsigned32 _tmp=123; \
+ asm volatile( "0: \
+ nbcd %0 ; \
+ nbcd %0 ; \
+ dbf %1,0b" \
+ : "=d" (_tmp), "=d" (_delay) \
+ : "0" (_tmp), "1" (_delay) ); \
+ }
+
+/* macros */
+
+#undef Z8x36_STATE0
+#undef Z8x36_WRITE
+#undef Z8x36_READ
+
+#define Z8x36_STATE0 ( z8536 ) \
+ { char *garbage; \
+ (garbage) = *(VOL8(z8536+0x7)) \
+ }
+
+#define Z8x36_WRITE( z8536, reg, data ) \
+ *(VOL8(z8536+0x7)) = (reg); \
+ *(VOL8(z8536+0x7)) = (data)
+
+#define Z8x36_READ( z8536, reg, data ) \
+ *(VOL8(z8536+0x7)) = (reg); \
+ (data) = *(VOL8(z8536+0x7))
+
+/*
+ * ACC Register Addresses
+ */
+
+#define ACC_BASE 0x0D000000
+
+#define ACC_STAT0 ((volatile rtems_unsigned8 *) (ACC_BASE + 0x00))
+#define ACC_STAT1 ((volatile rtems_unsigned8 *) (ACC_BASE + 0x01))
+#define ACC_GENCTL ((volatile rtems_unsigned8 *) (ACC_BASE + 0x02))
+#define ACC_VINT ((volatile rtems_unsigned8 *) (ACC_BASE + 0x03))
+#define ACC_VREQ ((volatile rtems_unsigned8 *) (ACC_BASE + 0x04))
+#define ACC_VARB ((volatile rtems_unsigned8 *) (ACC_BASE + 0x05))
+#define ACC_ID ((volatile rtems_unsigned8 *) (ACC_BASE + 0x06))
+#define ACC_CTL2 ((volatile rtems_unsigned8 *) (ACC_BASE + 0x07))
+#define ACC_7IS ((volatile rtems_unsigned8 *) (ACC_BASE + 0x08))
+#define ACC_LIS ((volatile rtems_unsigned8 *) (ACC_BASE + 0x09))
+#define ACC_7IE ((volatile rtems_unsigned8 *) (ACC_BASE + 0x0A))
+#define ACC_LIE ((volatile rtems_unsigned8 *) (ACC_BASE + 0x0B))
+#define ACC_VIE ((volatile rtems_unsigned8 *) (ACC_BASE + 0x0C))
+#define ACC_IC10 ((volatile rtems_unsigned8 *) (ACC_BASE + 0x0D))
+#define ACC_IC32 ((volatile rtems_unsigned8 *) (ACC_BASE + 0x0E))
+#define ACC_IC54 ((volatile rtems_unsigned8 *) (ACC_BASE + 0x0F))
+
+/* constants */
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+#define USE_CHANNEL_A 0 /* 1 = use channel A for console */
+#define USE_CHANNEL_B 1 /* 1 = use channel B for console */
+
+#define TIMER 0x0c000000
+#define TIMER_VECTOR 0x4D
+
+#if (USE_CHANNEL_A == 1)
+#define CONSOLE_CONTROL 0x0C800007
+#define CONSOLE_DATA 0x0C800005
+#elif (USE_CHANNEL_B == 1)
+#define CONSOLE_CONTROL 0x0C800001
+#define CONSOLE_DATA 0x0C800003
+#endif
+
+/* Structures */
+
+#ifdef D152_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/dmv152/include/coverhd.h b/c/src/lib/libbsp/m68k/dmv152/include/coverhd.h
new file mode 100644
index 0000000000..25fd29af85
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 2
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
+#define CALLING_OVERHEAD_TASK_CREATE 3
+#define CALLING_OVERHEAD_TASK_IDENT 2
+#define CALLING_OVERHEAD_TASK_START 2
+#define CALLING_OVERHEAD_TASK_RESTART 2
+#define CALLING_OVERHEAD_TASK_DELETE 1
+#define CALLING_OVERHEAD_TASK_SUSPEND 1
+#define CALLING_OVERHEAD_TASK_RESUME 2
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 2
+#define CALLING_OVERHEAD_TASK_MODE 2
+#define CALLING_OVERHEAD_TASK_GET_NOTE 2
+#define CALLING_OVERHEAD_TASK_SET_NOTE 2
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 2
+#define CALLING_OVERHEAD_CLOCK_GET 4
+#define CALLING_OVERHEAD_CLOCK_SET 4
+#define CALLING_OVERHEAD_CLOCK_TICK 1
+
+#define CALLING_OVERHEAD_TIMER_CREATE 2
+#define CALLING_OVERHEAD_TIMER_IDENT 1
+#define CALLING_OVERHEAD_TIMER_DELETE 2
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
+#define CALLING_OVERHEAD_TIMER_RESET 1
+#define CALLING_OVERHEAD_TIMER_CANCEL 1
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 2
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 1
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 2
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 2
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 2
+
+#define CALLING_OVERHEAD_EVENT_SEND 2
+#define CALLING_OVERHEAD_EVENT_RECEIVE 2
+#define CALLING_OVERHEAD_SIGNAL_CATCH 2
+#define CALLING_OVERHEAD_SIGNAL_SEND 2
+#define CALLING_OVERHEAD_PARTITION_CREATE 3
+#define CALLING_OVERHEAD_PARTITION_IDENT 2
+#define CALLING_OVERHEAD_PARTITION_DELETE 2
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 2
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 2
+#define CALLING_OVERHEAD_REGION_CREATE 3
+#define CALLING_OVERHEAD_REGION_IDENT 2
+#define CALLING_OVERHEAD_REGION_DELETE 1
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 3
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 2
+#define CALLING_OVERHEAD_PORT_CREATE 3
+#define CALLING_OVERHEAD_PORT_IDENT 2
+#define CALLING_OVERHEAD_PORT_DELETE 2
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 2
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 3
+#define CALLING_OVERHEAD_IO_OPEN 2
+#define CALLING_OVERHEAD_IO_CLOSE 2
+#define CALLING_OVERHEAD_IO_READ 2
+#define CALLING_OVERHEAD_IO_WRITE 2
+#define CALLING_OVERHEAD_IO_CONTROL 2
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 2
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/dmv152/spurious/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/spurious/Makefile.in
new file mode 100644
index 0000000000..3c7819fce4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/spurious/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/spurious.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=spinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/dmv152/spurious/spinit.c b/c/src/lib/libbsp/m68k/dmv152/spurious/spinit.c
new file mode 100644
index 0000000000..e20dd875ce
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/spurious/spinit.c
@@ -0,0 +1,48 @@
+/* Spurious_driver
+ *
+ * This routine installs spurious interrupt handlers for the DMV152.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <stdio.h>
+
+rtems_isr Spurious_Isr(
+ rtems_vector_number vector
+)
+{
+ void *sp = 0;
+
+ asm volatile ( "movea.l %%sp,%0 " : "=a" (sp) : "0" (sp) );
+
+ fprintf( stderr, "Vector 0x%x sp=0x%p\n", vector, sp );
+}
+
+rtems_device_driver Spurious_Initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp,
+ rtems_id tid,
+ rtems_unsigned32 *rval
+)
+{
+ rtems_vector_number vector;
+
+ for ( vector = 0x40 ; vector <= 0xFF ; vector++ )
+ (void) set_vector( Spurious_Isr, vector, 1 );
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/dmv152/startup/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/startup/Makefile.in
new file mode 100644
index 0000000000..9cf7604999
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/startup/Makefile.in
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspstart sbrk setvec vmeintr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(srcdir)/linkcmds $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c b/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c
new file mode 100644
index 0000000000..77f181abdf
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c
@@ -0,0 +1,252 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ m68k_isr_entry *monitors_vector_table;
+ int index;
+ void *vbr;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ monitors_vector_table = (m68k_isr_entry *)0; /* Monitor Vectors are at 0 */
+ m68k_set_vbr( monitors_vector_table );
+
+ for ( index=2 ; index<=255 ; index++ )
+ M68Kvec[ index ] = monitors_vector_table[ 32 ];
+
+ M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */
+ M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */
+ M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */
+
+ /*
+ * Uncommenting this seems to confuse/break the monitor on this board.
+ * It probably assumes the vector table is at 0.
+ */
+
+ /* m68k_set_vbr( &M68Kvec ); */
+
+ /*
+ * Adjust the VMEbus mode to round-robin.
+ */
+
+ /*
+ * This is only apparent with the shared memory driver which has not
+ * yet been supported on this target.
+ */
+
+ m68k_enable_caching();
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ m68k_get_vbr( vbr );
+ Cpu_table.interrupt_vector_table = vbr;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ /*
+ * Add 1 region for Malloc in libc_low
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ /* Clock_exit is done as an atexit() function */
+
+ VME_interrupt_Disable( 0xff );
+
+ /* return like a "normal" subroutine to the monitor */
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/dmv152/startup/linkcmds b/c/src/lib/libbsp/m68k/dmv152/startup/linkcmds
new file mode 100644
index 0000000000..087d01e78a
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/startup/linkcmds
@@ -0,0 +1,48 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the DY-4 DMV152/SVME153 boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x12800, l = 1M
+ }
+
+SECTIONS
+{
+ .text 0x12800 :
+ {
+ text_start = . ;
+ _text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+ _etext = .;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ _data_start = . ;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+ _edata = .;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/dmv152/startup/vmeintr.c b/c/src/lib/libbsp/m68k/dmv152/startup/vmeintr.c
new file mode 100644
index 0000000000..1808d7a9d4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/startup/vmeintr.c
@@ -0,0 +1,60 @@
+/* vmeintr.c
+ *
+ * VMEbus support routines for the DMV152.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <vmeintr.h>
+
+/*PAGE
+ *
+ * VME_interrupt_Disable
+ *
+ */
+
+void VME_interrupt_Disable (
+ VME_interrupt_Mask mask /* IN */
+)
+{
+ volatile rtems_unsigned8 *VME_interrupt_enable;
+ rtems_unsigned8 value;
+
+ VME_interrupt_enable = ACC_VIE;
+ value = *VME_interrupt_enable;
+
+ value &= ~mask; /* turn off interrupts for all levels in mask */
+
+ *VME_interrupt_enable = value;
+}
+
+/*PAGE
+ *
+ * VME_interrupt_Enable
+ *
+ */
+
+void VME_interrupt_Enable (
+ VME_interrupt_Mask mask /* IN */
+)
+{
+ volatile rtems_unsigned8 *VME_interrupt_enable;
+ rtems_unsigned8 value;
+
+ VME_interrupt_enable = ACC_VIE;
+ value = *VME_interrupt_enable;
+
+ value |= mask; /* turn on interrupts for all levels in mask */
+
+ *VME_interrupt_enable = value;
+}
diff --git a/c/src/lib/libbsp/m68k/dmv152/timer/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/timer/Makefile.in
new file mode 100644
index 0000000000..c2ba3476d3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/dmv152/timer/timer.c b/c/src/lib/libbsp/m68k/dmv152/timer/timer.c
new file mode 100644
index 0000000000..4e8b2a5fc3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/timer/timer.c
@@ -0,0 +1,105 @@
+/* timer.c
+ *
+ * NOTE: These routines will not work if the optimizer is enabled
+ * for some compilers. The multiple writes to the Z8036
+ * may be optimized away.
+ *
+ * It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+int Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+void Timer_initialize()
+{
+ rtems_unsigned8 data;
+
+ (void) set_vector( timerisr, TIMER_VECTOR, 0 ); /* install ISR */
+
+ Ttimer_val = 0; /* clear timer ISR count */
+ Z8x36_READ ( TIMER, MASTER_INTR, data );
+ Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0x01) );
+
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0xd4 );
+ Z8x36_READ ( TIMER, MASTER_INTR, data );
+ Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0x7E) );
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_MSB, 0x00 );
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_LSB, 0x00 );
+ Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x87 );
+ Z8x36_WRITE( TIMER, CNT_TMR_VECTOR, TIMER_VECTOR );
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x20 );
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x26 );
+ Z8x36_READ ( TIMER, MASTER_INTR, data );
+ Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0xDA) | 0x80 );
+
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xC6 );
+
+ /*
+ * ACC_IC54 - interrupt 5 will be vectored and mapped to level 6
+ */
+
+ data = (*(rtems_unsigned8 *)0x0D00000B);
+ (*(rtems_unsigned8 *)0x0D00000B) = (data & 0x0F) | 0x60;
+
+}
+
+#define AVG_OVERHEAD 9 /* It typically takes 3.65 microseconds */
+ /* (9 countdowns) to start/stop the timer. */
+#define LEAST_VALID 10 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ rtems_unsigned8 data;
+ rtems_unsigned8 msb, lsb;
+ rtems_unsigned32 remaining, total;
+
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xce ); /* read the counter value */
+ Z8x36_READ( TIMER, CT1_CUR_CNT_MSB, msb );
+ Z8x36_READ( TIMER, CT1_CUR_CNT_LSB, lsb );
+
+ remaining = 0x10000 - ((msb << 8) + lsb);
+ total = (Ttimer_val * 0x10000) + remaining;
+
+ Z8x36_READ ( TIMER, MASTER_INTR, data );
+ Z8x36_WRITE( TIMER, MASTER_INTR, (data & 0x01) );
+
+ /* do not restore old vector */
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in countdown units */
+
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ /* Clocked at 2.4615 Mhz */
+
+ return (int)(((float)(total-AVG_OVERHEAD)) / 2.4615 * 2.0);
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/dmv152/timer/timerisr.s b/c/src/lib/libbsp/m68k/dmv152/timer/timerisr.s
new file mode 100644
index 0000000000..291d58b65a
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/timer/timerisr.s
@@ -0,0 +1,38 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the Z8536 timer on the DMV152
+ * board. The timer is set up to generate an interrupt at maximum
+ * intervals.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+
+.set TIMER, 0x0c000007 | port A
+.set CT1_CMD_STATUS, 0x0a | command status register
+.set RELOAD, 0x26 | clr IP & IUS,allow countdown
+
+ PUBLIC(timerisr)
+SYM (timerisr):
+ movb #CT1_CMD_STATUS,TIMER | set pointer to cmd status reg
+ movb #RELOAD,TIMER | reload countdown
+ addql #1, SYM (Ttimer_val) | increment timer value
+ rte
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/m68k/dmv152/times b/c/src/lib/libbsp/m68k/dmv152/times
new file mode 100644
index 0000000000..6d59b87862
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/times
@@ -0,0 +1,195 @@
+#
+# Timing Test Suite Results for the DY-4 DMV152 BSP
+#
+# NOTE: These times also also applicable to similar configurations of
+# the DY-4 SVME153 which is the commercial grade version of the
+# same board.
+#
+# $Id$
+#
+
+Board: DY-4 DMV152 / DY-4 SVME153
+CPU: Motorola MC68020
+Clock Speed: 20 Mhz
+Memory Configuration: SRAM
+Wait States: 0
+
+Times Reported in: microseconds
+Timer Source: Zilog Z8036 Count Down Timer
+
+Column A: 3.5.1 pre-release
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 67
+ rtems_semaphore_delete 63
+ rtems_semaphore_obtain: available 45
+ rtems_semaphore_obtain: not available -- NO_WAIT 44
+ rtems_semaphore_release: no waiting tasks 49
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 114
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 92
+
+ 4 rtems_task_restart: blocked task -- preempts caller 153
+ rtems_task_restart: ready task -- preempts caller 145
+ rtems_semaphore_release: task readied -- returns to caller 71
+ rtems_task_create 154
+ rtems_task_start 83
+ rtems_task_restart: suspended task -- returns to caller 95
+ rtems_task_delete: suspended task 144
+ rtems_task_restart: ready task -- returns to caller 98
+ rtems_task_restart: blocked task -- returns to caller 128
+ rtems_task_delete: blocked task 149
+
+ 5 rtems_task_suspend: calling task 76
+ rtems_task_resume: task readied -- preempts caller 72
+
+ 6 rtems_task_restart: calling task 100
+ rtems_task_suspend: returns to caller 49
+ rtems_task_resume: task readied -- returns to caller 50
+ rtems_task_delete: ready task 150
+
+ 7 rtems_task_restart: suspended task -- preempts caller 100
+
+ 8 rtems_task_set_priority: obtain current priority 37
+ rtems_task_set_priority: returns to caller 69
+ rtems_task_mode: obtain current mode 16
+ rtems_task_mode: no reschedule 18
+ rtems_task_mode: reschedule -- returns to caller 24
+ rtems_task_mode: reschedule -- preempts caller 66
+ rtems_task_set_note 39
+ rtems_task_get_note 39
+ rtems_clock_set 90
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 206
+ rtems_message_queue_send: no waiting tasks 103
+ rtems_message_queue_urgent: no waiting tasks 102
+ rtems_message_queue_receive: available 87
+ rtems_message_queue_flush: no messages flushed 37
+ rtems_message_queue_flush: messages flushed 46
+ rtems_message_queue_delete 85
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 52
+ rtems_message_queue_receive: not available -- caller blocks 119
+
+11 rtems_message_queue_send: task readied -- preempts caller 128
+
+12 rtems_message_queue_send: task readied -- returns to caller 106
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 128
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 106
+
+15 rtems_event_receive: obtain current events 0
+ rtems_event_receive: not available -- NO_WAIT 32
+ rtems_event_receive: not available -- caller blocks 91
+ rtems_event_send: no task readied 34
+ rtems_event_receive: available 37
+ rtems_event_send: task readied -- returns to caller 66
+
+16 rtems_event_send: task readied -- preempts caller 89
+
+17 rtems_task_set_priority: preempts caller 109
+
+18 rtems_task_delete: calling task 175
+
+19 rtems_signal_catch 24
+ rtems_signal_send: returns to caller 43
+ rtems_signal_send: signal to self 50
+ exit ASR overhead: returns to calling task 37
+ exit ASR overhead: returns to preempting task 64
+
+20 rtems_partition_create 79
+ rtems_region_create 72
+ rtems_partition_get_buffer: available 43
+ rtems_partition_get_buffer: not available 41
+ rtems_partition_return_buffer 51
+ rtems_partition_delete 47
+ rtems_region_get_segment: available 59
+ rtems_region_get_segment: not available -- NO_WAIT 55
+ rtems_region_return_segment: no waiting tasks 63
+ rtems_region_get_segment: not available -- caller blocks 127
+ rtems_region_return_segment: task readied -- preempts caller 143
+ rtems_region_return_segment: task readied -- returns to caller 121
+ rtems_region_delete 47
+ rtems_io_initialize 6
+ rtems_io_open 3
+ rtems_io_close 2
+ rtems_io_read 2
+ rtems_io_write 2
+ rtems_io_control 2
+
+21 rtems_task_ident 352
+ rtems_message_queue_ident 343
+ rtems_semaphore_ident 369
+ rtems_partition_ident 342
+ rtems_region_ident 349
+ rtems_port_ident 342
+ rtems_timer_ident 344
+ rtems_rate_monotonic_ident 343
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 114
+ rtems_message_queue_broadcast: no waiting tasks 58
+ rtems_message_queue_broadcast: task readied -- preempts caller 136
+
+23 rtems_timer_create 36
+ rtems_timer_fire_after: inactive 64
+ rtems_timer_fire_after: active 68
+ rtems_timer_cancel: active 41
+ rtems_timer_cancel: inactive 38
+ rtems_timer_reset: inactive 59
+ rtems_timer_reset: active 63
+ rtems_timer_fire_when: inactive 93
+ rtems_timer_fire_when: active 93
+ rtems_timer_delete: active 54
+ rtems_timer_delete: inactive 50
+ rtems_task_wake_when 120
+
+24 rtems_task_wake_after: yield -- returns to caller 25
+ rtems_task_wake_after: yields -- preempts caller 63
+
+25 rtems_clock_tick 13
+
+26 _ISR_Disable 1
+ _ISR_Flash 1
+ _ISR_Enable 0
+ _Thread_Disable_dispatch 1
+ _Thread_Enable_dispatch 20
+ _Thread_Set_state 24
+ _Thread_Disptach (NO FP) 52
+ context switch: no floating point contexts 43
+ context switch: self 9
+ context switch: to another task 9
+ context switch: restore 1st FP task 47
+ fp context switch: save idle, restore idle 73
+ fp context switch: save idle, restore initialized 60
+ fp context switch: save initialized, restore initialized 58
+ _Thread_Resume 17
+ _Thread_Unblock 17
+ _Thread_Ready 22
+ _Thread_Get 11
+ _Semaphore_Get 10
+ _Thread_Get: invalid id 2
+
+27 interrupt entry overhead: returns to interrupted task 10
+ interrupt exit overhead: returns to interrupted task 9
+ interrupt entry overhead: returns to nested interrupt 9
+ interrupt exit overhead: returns to nested interrupt 6
+ interrupt entry overhead: returns to preempting task 10
+ interrupt exit overhead: returns to preempting task 62
+
+28 rtems_port_create 44
+ rtems_port_external_to_internal 34
+ rtems_port_internal_to_external 34
+ rtems_port_delete 45
+
+29 rtems_rate_monotonic_create 41
+ rtems_rate_monotonic_period: initiate period -- returns to caller 61
+ rtems_rate_monotonic_period: obtain status 39
+ rtems_rate_monotonic_cancel 46
+ rtems_rate_monotonic_delete: inactive 55
+ rtems_rate_monotonic_delete: active 58
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 82
diff --git a/c/src/lib/libbsp/m68k/dmv152/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/dmv152/wrapup/Makefile.in
new file mode 100644
index 0000000000..a4444d9cb1
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/dmv152/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console spurious timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/efi332/Makefile.in b/c/src/lib/libbsp/m68k/efi332/Makefile.in
new file mode 100644
index 0000000000..4abe5b4ac5
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include start332 startup clock console spurious timer wrapup
diff --git a/c/src/lib/libbsp/m68k/efi332/README b/c/src/lib/libbsp/m68k/efi332/README
new file mode 100644
index 0000000000..097ce132ad
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/README
@@ -0,0 +1,36 @@
+#
+# $Id$
+#
+
+Description: efi68k
+============
+CPU: MC68332 @16MHz
+RAM: 256k max. (supports several configurations)
+ROM: 512k (supports several configurations)
+
+ This general purpose controller has been designed by a group of
+Internet subscribes to the mailing list "efi332" (an offshoot of the
+"diy_efi" mailing list). Although efi332 was initially designed for
+automotive research, it is a fairly generalized embedded controller
+when used without the companion EFI I/O board. It is patterned much after
+the the Motorola BCC but cost on the order of $250US. A 4x3 inch
+(approx.) printed circuit board is available (about $14US). For complete
+information see
+
+ http://efi332.eng.ohio-state.edu
+TODO:
+=====
+- integrate the interrupt driven stdin/stdout into RTEMS to (a) reduce
+ the interrupt priority and (2) to prevent it from blocking. (high
+ priority)
+- add a timer driver for the tmtest set.
+- generate include/coverhd.c to perform the tmtest.
+- add separate interrupt stack (low priority... may never happen :).
+
+ John S Gwynne
+ Gwynne.1@osu.edu
+_______________________________________________________________________________
+ T h e O h i o - S t a t e U n i v e r s i t y
+ ElectroScience Laboratory, 1320 Kinnear Road, Columbus, Ohio 43212, USA
+ Telephone: (614) 292-7981 * Fax: (614) 292-7297
+-------------------------------------------------------------------------------
diff --git a/c/src/lib/libbsp/m68k/efi332/bsp_specs b/c/src/lib/libbsp/m68k/efi332/bsp_specs
new file mode 100644
index 0000000000..5ba97705d5
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start332.o%s
+{!pg:
+g: start332.o%s
+{!g:
+p: start332.o%s
+!p: start332.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/efi332/clock/Makefile.in b/c/src/lib/libbsp/m68k/efi332/clock/Makefile.in
new file mode 100644
index 0000000000..8e325402ca
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/clock/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi332/clock/ckinit.c b/c/src/lib/libbsp/m68k/efi332/clock/ckinit.c
new file mode 100644
index 0000000000..6f4cdef439
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/clock/ckinit.c
@@ -0,0 +1,137 @@
+/* Clock_init()
+ *
+ * This routine initailizes the periodic interrupt timer on
+ * the Motorola 68332.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <efi332.h>
+
+#define CLOCK_VECTOR EFI_PIV
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+volatile rtems_unsigned32 Clock_driver_ticks;
+ /* ticks since initialization */
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+rtems_isr Clock_isr(rtems_vector_number vector)
+{
+ Clock_driver_ticks += 1;
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+
+ /* enable 1mS interrupts */
+ *PITR = (unsigned short int)( SAM(0x09,0,PITM) );/* load counter */
+ *PICR = (unsigned short int) /* enable interrupt */
+ ( SAM(ISRL_PIT,8,PIRQL) | SAM(CLOCK_VECTOR,0,PIV) );
+
+ atexit( Clock_exit );
+ }
+}
+
+void Clock_exit( void )
+{
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+
+ /* shutdown the periodic interrupt */
+ *PICR = (unsigned short int)
+ ( SAM(0,8,PIRQL) | SAM(CLOCK_VECTOR,0,PIV) );
+ /* ^^ zero disables interrupt */
+
+ /* do not restore old vector */
+
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/efi332/console/Makefile.in b/c/src/lib/libbsp/m68k/efi332/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi332/console/console.c b/c/src/lib/libbsp/m68k/efi332/console/console.c
new file mode 100644
index 0000000000..0c5ebe0512
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/console/console.c
@@ -0,0 +1,394 @@
+/*
+ * This file contains the efi332 console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+#include <bsp.h>
+#include <rtems/libio.h>
+
+/* BUFFER_LENGTH must be 2^n for n=1, 2, 3, .... */
+#define BUFFER_LENGTH 256
+#define RTS_STOP_SIZE BUFFER_LENGTH-64
+#define RTS_START_SIZE 16
+
+char xmt_buf[BUFFER_LENGTH];
+char rcv_buf[BUFFER_LENGTH];
+/* in: last entry into the buffer; always on a valid character */
+/* out: points to the next character to be pull from the buffer */
+/* in+1=out => buffer empty */
+/* in+2=out => buffer full */
+struct UART_buf {
+ char *offset;
+ char *in;
+ char *out;
+};
+static volatile struct UART_buf xmt = { xmt_buf, (char *)0, (char *)1};
+static volatile struct UART_buf rcv = { rcv_buf, (char *)0, (char *)1};
+static volatile char _debug_flag = 0;
+
+#define SET_RTS(a) {*PORTF0 = (*PORTF0 & ~0x4) | ( (a)? 0 : 0x4); }
+#define GET_CTS (!(*PORTF0 & 0x2))
+
+/* _catchSCIint, _catchCTSint, and _catchSPURIOUSint are the
+ interrupt front-ends */
+extern void _catchSCIint();
+asm(" .text
+ .align 2
+ .globl _catchSCIint
+_catchSCIint:
+ moveml %d0-%d7/%a0-%a6,%sp@- /* save registers */
+ jbsr uart_interrupt
+ moveml %sp@+,%d0-%d7/%a0-%a6
+ rte
+ ");
+
+extern void _catchCTSint();
+asm(" .text
+ .align 2
+ .globl _catchCTSint
+_catchCTSint:
+ moveml %d0-%d7/%a0-%a6,%sp@- /* save registers */
+ jbsr cts_interrupt
+ moveml %sp@+,%d0-%d7/%a0-%a6
+ rte
+ ");
+
+extern void _catchSPURIOUSint();
+asm(" .text
+ .align 2
+ .globl _catchSPURIOUSint
+_catchSPURIOUSint:
+ moveml %d0-%d7/%a0-%a6,%sp@- /* save registers */
+ jbsr spurious_interrupt
+ moveml %sp@+,%d0-%d7/%a0-%a6
+ rte
+ ");
+
+int _spurious_int_counter=0;
+
+/* note: cts uses int1. If it "bounces", a spurious interrupt is generated */
+void spurious_interrupt(void) {
+ _spurious_int_counter++; /* there should never be alot of these */
+}
+
+/* _fake_trap_1 will continue the UART interrupt (%sr *still*
+ UART_ISR_LEVEL) as a trap #1 to enter the debugger */
+
+/* *****fix me; this is for 68000 w/jsr ram exception table ******* */
+asm(" .text
+ .align 2
+_fake_trap_1:
+ unlk %a6 /* clear interrupt frame */
+ lea %sp@(4),%sp /* remove jbsr instruction */
+ moveml %sp@+,%d0-%d7/%a0-%a6 /* pop registers */
+ jmp (33*6-12) /* jump exception 1 */
+ ");
+
+/* dispatch UART interrupt */
+void xmit_interrupt(void);
+void rcvr_interrupt(void);
+void _fake_trap_1(void);
+
+void uart_interrupt(void) {
+ /* receiver status bits are cleared by a SCSR read followed
+ by a SCDR read. transmitter status bits are cleared by
+ a SCSR read followed by a SCDR write. */
+ if ((*SCSR) & (TDRE | TC))
+ xmit_interrupt();
+
+ if ((*SCSR) & (RDRF))
+ rcvr_interrupt();
+
+ if (_debug_flag) {
+ _debug_flag = 0; /* reset the flag */
+ _fake_trap_1(); /* fake a trap #1 */
+ }
+}
+
+/* transfer received character to the buffer */
+void rcvr_interrupt(void) {
+ register char *a, c;
+ register int length;
+
+ while((*SCSR) & (RDRF)) {
+ if ((c=*SCDR) == 0x1a) /* use ctl-z to reboot */
+ reboot();
+/* else if (c == 0x03) { */ /* use ctl-c to enter debugger */
+/* _debug_flag = 1; */
+/* continue; */
+/* } */
+
+ *(char *)((int)rcv.offset +(int)
+ (a=(char *)(((int)rcv.in+1) & ((int)BUFFER_LENGTH-1)))) = c;
+ if ((char *)(((int)rcv.in+2) & ((int)BUFFER_LENGTH-1)) != rcv.out)
+ rcv.in=a;
+ };
+
+ length = (BUFFER_LENGTH -1) & (
+ ( ((int)rcv.out <= (int)rcv.in) ? 0 : BUFFER_LENGTH) - (int)rcv.out
+ + (int)rcv.in + 1);
+ if (length >= RTS_STOP_SIZE)
+ SET_RTS(0);
+}
+
+/* tranfer buffered characters to the UART */
+void xmit_interrupt(void) {
+ register short int oldsr;
+
+ _CPU_ISR_Disable( oldsr ); /* for when outbyte or flush calls */
+ while ((*SCSR) & (TDRE)) {
+ if ((char *)(((int)xmt.in+1) & ((int)BUFFER_LENGTH-1)) != xmt.out)
+ /* xmit buffer not empty */
+ if (GET_CTS) {
+ /* send next char */
+ *SCDR=*(char *)((int)xmt.offset+(int)xmt.out);
+ xmt.out= (char *)(((int)xmt.out+1) & ((int)BUFFER_LENGTH-1));
+ *SCCR1 = (*SCCR1 & ~(TIE | TCIE)) | (TIE);
+ }
+ else {
+ /* configue CTS interrupt and shutdown xmit interrupts */
+ *SCCR1 &= ~(TIE | TCIE);
+ *PFPAR |= 0x2;
+ break;
+ }
+ else {
+ /* xmit buffer empty; shutdown interrupts */
+ *SCCR1 &= ~(TIE | TCIE);
+ break;
+ }
+ }
+ _CPU_ISR_Enable( oldsr );
+}
+
+void cts_interrupt(void) {
+ register short int oldsr;
+
+ _CPU_ISR_Disable( oldsr ); /* for when outbyte calls */
+
+ *PFPAR &= ~0x2;
+ *SCCR1 = (*SCCR1 & ~(TIE | TCIE)) | (TIE);
+
+ _CPU_ISR_Enable( oldsr );
+}
+
+
+
+/* transfer character from the buffer */
+char inbyte(void) {
+ register char a;
+ register int length;
+
+ while ((char *)(((int)rcv.in+1) & ((int)BUFFER_LENGTH-1))== rcv.out);
+ a=*(char *)((int)rcv.offset+(int)rcv.out);
+ rcv.out= (char *)(((int)rcv.out+1) & ((int)BUFFER_LENGTH-1));
+ length = (BUFFER_LENGTH -1) & (
+ ( ((int)rcv.out <= (int)rcv.in) ? 0 : BUFFER_LENGTH) - (int)rcv.out
+ + (int)rcv.in + 1);
+ if (length < RTS_START_SIZE)
+ SET_RTS(1);
+ return (a);
+}
+
+/* once room is avaliable in the buffer, transfer
+ the character into the buffer and enable
+ the xmtr interrupt */
+void outbyte(char c) {
+ register char *a;
+
+ while ((char *)(((int)xmt.in+2) & ((int)BUFFER_LENGTH-1)) == xmt.out);
+ *(char *)((int)xmt.offset+(int)
+ (a=(char *)(((int)xmt.in+1) & ((int)BUFFER_LENGTH-1))))=c;
+ xmt.in=a;
+
+ if (!(*SCCR1 & (TIE | TCIE)) && (!(*PFPAR & 0x2)) )
+ /* if neither interrupts are running, */
+ xmit_interrupt(); /* we need to restart the xmiter */
+}
+
+void _UART_flush(void) {
+ /* loop till xmt buffer empty. Works with interrupts disabled */
+ while ((char *)(((int)xmt.in+1) & ((int)BUFFER_LENGTH-1)) != xmt.out)
+ xmit_interrupt();
+ /* loop till UART buffer empty */
+ while ( (*SCSR & TC) == 0 );
+}
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+void console_init()
+{
+ *QSMCR = ( SAM(QSM_IARB,0,IARB) );
+ *QILR = ( SAM(ISRL_QSPI,4,ILQSPI) | SAM(ISRL_SCI,0,ILSCI) );
+ *QIVR = ( SAM(EFI_QIVR,0,INTV) );
+
+ *SCCR0 = ( (int)( SYS_CLOCK/SCI_BAUD/32.0+0.5 ) & 0x1fff );
+ *SCCR1 = ( RIE | TE | RE );
+
+ set_vector(_catchSPURIOUSint, EFI_SPINT, 0);
+ set_vector(_catchSCIint, EFI_QIVR, 0);
+ set_vector(_catchCTSint, EFI_INT1, 0);
+}
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ if ((char *)(((int)rcv.in+1) & ((int)BUFFER_LENGTH-1))== rcv.out)
+ return(FALSE);
+ else
+ return(TRUE);
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/efi332/include/Makefile.in b/c/src/lib/libbsp/m68k/efi332/include/Makefile.in
new file mode 100644
index 0000000000..1e9e4d7edf
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/efi332.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/efi332/include/bsp.h b/c/src/lib/libbsp/m68k/efi332/include/bsp.h
new file mode 100644
index 0000000000..2449449f93
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/include/bsp.h
@@ -0,0 +1,164 @@
+/* bsp.h
+ *
+ * This include file contains all efi332 board IO definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EFI332_BSP_h
+#define __EFI332_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+#include <efi332.h>
+#include <sim.h>
+#include <qsm.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ */
+
+/* XXX - JRS - I want to compile the tmtests */
+
+#define MUST_WAIT_FOR_INTERRUPT 1
+
+#define Install_tm27_vector( handler )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { register rtems_unsigned32 _delay=(microseconds); \
+ register rtems_unsigned32 _tmp=123; \
+ asm volatile( "0: \
+ nbcd %0 ; \
+ nbcd %0 ; \
+ dbf %1,0b" \
+ : "=d" (_tmp), "=d" (_delay) \
+ : "0" (_tmp), "1" (_delay) ); \
+ }
+
+/* externals */
+
+extern char _endtext[];
+extern char _sdata[];
+extern char _edata[];
+extern char __bss_start[];
+extern char _end[];
+extern char _copy_data_from_rom[];
+extern char __end_of_ram[];
+
+/* constants */
+
+#define RAM_END ((int)__end_of_ram)
+
+#ifdef __START_C__
+#define STACK_SIZE "#0x800"
+#else
+#define STACK_SIZE 0x800
+#endif
+
+/* macros */
+
+#define RAW_PUTS(str) \
+ { register char *ptr = str; \
+ while (*ptr) outbyte(*ptr++); \
+ }
+
+#define RAW_PUTI(n) { \
+ register int i, j; \
+ \
+ RAW_PUTS("0x"); \
+ for (i=28;i>=0;i -= 4) { \
+ j = (n>>i) & 0xf; \
+ outbyte( (j>9 ? j-10+'a' : j+'0') ); \
+ } \
+ }
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+extern int stack_size;
+
+extern int stack_start;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+void console_init(void);
+
+void Spurious_Initialize(void);
+
+void _UART_flush(void);
+
+void Clock_exit(void);
+
+void outbyte(char);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/efi332/include/coverhd.h b/c/src/lib/libbsp/m68k/efi332/include/coverhd.h
new file mode 100644
index 0000000000..48d824e5f4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/include/coverhd.h
@@ -0,0 +1,106 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#endif
diff --git a/c/src/lib/libbsp/m68k/efi332/include/efi332.h b/c/src/lib/libbsp/m68k/efi332/include/efi332.h
new file mode 100644
index 0000000000..f9a5584c1b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/include/efi332.h
@@ -0,0 +1,54 @@
+/* efi332.h
+ *
+ * $Id$
+ */
+
+#ifndef _EFI332_H_
+#define _EFI332_H_
+
+
+/* SIM_MM (SIM Module Mapping) determines the location of the control
+ register block. When MM=0, register addresses range fom 0x7ff000 to
+ 0x7FFFFF. When MM=1, register addresses range from 0xfff000 to
+ 0xffffff. */
+#define SIM_MM 1
+
+
+/* Interrupt related definitions */
+#define SIM_IARB 15
+#define QSM_IARB 10
+
+#define EFI_PIV 64
+#define ISRL_PIT 4 /* zero disables PIT */
+
+#define EFI_QIVR 66 /* 66=>SCI and 67=>QSPI interrupt */
+#define ISRL_QSPI 0
+
+#define EFI_SPINT 24 /* spurious interrupt */
+#define EFI_INT1 25 /* CTS interrupt */
+#define ISRL_SCI 6
+
+
+
+/* System Clock definitions */
+#define XTAL 32768.0 /* crystal frequency in Hz */
+#define EFI_W 0 /* system clock parameters */
+#define EFI_X 1
+#define EFI_Y 0x38
+#define SYS_CLOCK (XTAL*4.0*(EFI_Y+1)*(1 << (2*EFI_W+EFI_X)))
+#define SCI_BAUD 115200 /* RS232 Baud Rate */
+
+
+/* macros/functions */
+
+/*
+ * This prototype really should have the noreturn attribute but
+ * that causes a warning since it appears that the routine does
+ * return.
+ *
+ * void reboot(void) __attribute__ ((noreturn));
+ */
+
+void reboot(void);
+
+#endif /* _EFI332_H_ */
diff --git a/c/src/lib/libbsp/m68k/efi332/misc/dotests b/c/src/lib/libbsp/m68k/efi332/misc/dotests
new file mode 100644
index 0000000000..b9449bffc3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/misc/dotests
@@ -0,0 +1,15 @@
+#! /bin/bash
+#
+# $Id$
+#
+
+/bin/rm sp* &>/dev/null
+(cd ..; for f in sp*; do cp ${f}/o-efi332/${f}.nxe hold; done)
+
+stty 5:0:800008bf:0:0:0:0:0:0:1:1:0:0:0:0:0:0:0:0:0:0:0:0 </dev/cua0
+/bin/cp /dev/cua0 screen &
+
+for f in sp*; do m68k-bdm-coff-gdb ${f} </dev/null; done
+
+kill -9 `ps -efax | grep "/bin/cp /dev/cua0" | sed "/grep/D; s/ .*$//"`
+/bin/rm sp* &>/dev/null
diff --git a/c/src/lib/libbsp/m68k/efi332/misc/gdbinit68 b/c/src/lib/libbsp/m68k/efi332/misc/gdbinit68
new file mode 100644
index 0000000000..984af7d3eb
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/misc/gdbinit68
@@ -0,0 +1,13 @@
+echo Setting up the environment for efi332 debuging.\n
+
+target bdm /dev/pdbdm0
+bdm_setdelay 405
+bdm_autoreset on
+set remotecache off
+bdm_timetocomeup 0
+bdm_init
+bdm_reset
+set $sfc=5
+set $dfc=5
+r
+q
diff --git a/c/src/lib/libbsp/m68k/efi332/misc/interr.c b/c/src/lib/libbsp/m68k/efi332/misc/interr.c
new file mode 100644
index 0000000000..e3c3bd41aa
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/misc/interr.c
@@ -0,0 +1,95 @@
+/*
+ * Internal Error Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/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.
+ */
+
+/*
+ * Ugly hack.... _CPU_Fatal_halt() disonnects the bdm. Without this
+ * change, the_error is only known only to the cpu :).
+ *
+ * From "bsp.h" which is not yet available in the arch tree during
+ * this phase of install. jsg
+ */
+void outbyte(char);
+void bsp_cleanup( void );
+
+#define RAW_PUTS(str) \
+ { register char *ptr = str; \
+ while (*ptr) outbyte(*ptr++); \
+ }
+
+#define RAW_PUTI(n) { \
+ register int i, j; \
+ \
+ RAW_PUTS("0x"); \
+ for (i=28;i>=0;i -= 4) { \
+ j = (n>>i) & 0xf; \
+ outbyte( (j>9 ? j-10+'a' : j+'0') ); \
+ } \
+ }
+
+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 );
+
+ /* try to print error message to outbyte */
+ RAW_PUTS("\r\nRTEMS: A fatal error has occured.\r\n");
+ RAW_PUTS("RTEMS: fatal error ");
+ RAW_PUTI( the_error );
+ RAW_PUTS(".\r\n");
+
+ /* configure peripherals for a safe exit */
+ bsp_cleanup();
+
+ _CPU_Fatal_halt( the_error );
+
+ /* will not return from this routine */
+}
diff --git a/c/src/lib/libbsp/m68k/efi332/spurious/Makefile.in b/c/src/lib/libbsp/m68k/efi332/spurious/Makefile.in
new file mode 100644
index 0000000000..3c7819fce4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/spurious/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/spurious.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=spinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi332/spurious/spinit.c b/c/src/lib/libbsp/m68k/efi332/spurious/spinit.c
new file mode 100644
index 0000000000..ef355e780e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/spurious/spinit.c
@@ -0,0 +1,88 @@
+/* Spurious_driver
+ *
+ * This routine installs spurious interrupt handlers for the efi332.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <stdio.h>
+
+const char * const _Spurious_Error_[] = {"Reset","Bus Error","Address Error",
+ "Illegal Instruction","Zero Division","CHK, CHK2 Instruction",
+ "TRAPcc, TRAPV Instruction","Privilege Violation","Trace",
+ "Line 1010 Emulation","Line 1111 Emulation","Hardware Breakpoint",
+ "Coprocessor Protocal Violation",
+ "Format Error ans Uninitialized Interrupt","Unassigned",
+ "Spurious Interrupt","AVec1","AVec2","AVec3","AVec4","AVec5","AVec6",
+ "AVec7","Trap Instruction","Debug","Reboot","Reserved Coprocessor",
+ "Reserved Unassigned","User Defined"};
+
+rtems_isr Spurious_Isr(
+ rtems_vector_number vector
+)
+{
+ int sp = 0;
+ const char * const VectDescrip[] = {
+ _Spurious_Error_[0], _Spurious_Error_[0], _Spurious_Error_[1],
+ _Spurious_Error_[2], _Spurious_Error_[3], _Spurious_Error_[4],
+ _Spurious_Error_[5], _Spurious_Error_[6], _Spurious_Error_[7],
+ _Spurious_Error_[8], _Spurious_Error_[9], _Spurious_Error_[10],
+ _Spurious_Error_[11], _Spurious_Error_[12], _Spurious_Error_[13],
+ _Spurious_Error_[13], _Spurious_Error_[14], _Spurious_Error_[14],
+ _Spurious_Error_[14], _Spurious_Error_[14], _Spurious_Error_[14],
+ _Spurious_Error_[14], _Spurious_Error_[14], _Spurious_Error_[14],
+ _Spurious_Error_[15], _Spurious_Error_[16], _Spurious_Error_[17],
+ _Spurious_Error_[18], _Spurious_Error_[19], _Spurious_Error_[20],
+ _Spurious_Error_[21], _Spurious_Error_[22], _Spurious_Error_[23],
+ _Spurious_Error_[24], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[25],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[27],
+ _Spurious_Error_[27], _Spurious_Error_[27], _Spurious_Error_[27],
+ _Spurious_Error_[27], _Spurious_Error_[28]};
+
+ asm volatile ( "movea.l %%sp,%0 " : "=a" (sp) : "0" (sp) );
+
+ _CPU_ISR_Set_level( 7 );
+ _UART_flush();
+
+ RAW_PUTS("\n\rRTEMS: Spurious interrupt: ");
+ RAW_PUTS((char *)VectDescrip[( (vector>64) ? 64 : vector )]);
+ RAW_PUTS("\n\rRTEMS: Vector: ");
+ RAW_PUTI(vector);
+ RAW_PUTS(" sp: ");
+ RAW_PUTI(sp);
+ RAW_PUTS("\n\r");
+
+ bsp_cleanup();
+
+ /* BDM SIGEMT */
+ asm(" .word 0x4afa");
+
+ for(;;);
+}
+
+void Spurious_Initialize(void)
+{
+ rtems_vector_number vector;
+
+ for ( vector = 0x0 ; vector <= 0xFF ; vector++ )
+ (void) set_vector( Spurious_Isr, vector, 1 );
+}
diff --git a/c/src/lib/libbsp/m68k/efi332/start/Makefile.in b/c/src/lib/libbsp/m68k/efi332/start/Makefile.in
new file mode 100644
index 0000000000..e2dd13f0c8
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/start/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/start332.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=start332
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/m68k/efi332/start/start.c b/c/src/lib/libbsp/m68k/efi332/start/start.c
new file mode 100644
index 0000000000..63ed7be2f3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/start/start.c
@@ -0,0 +1,187 @@
+#include <efi332.h>
+#include <sim.h>
+#define __START_C__
+#include "bsp.h"
+
+m68k_isr_entry M68Kvec[256];
+m68k_isr_entry vectors[256];
+char * const __argv[]= {"main", ""};
+char * const __env[]= {""};
+
+int main(const int argc, char * const argv[], char * const env[]);
+
+/*
+ * This prototype really should have the noreturn attribute but
+ * that causes a warning since it appears that the routine does
+ * return.
+ *
+ * void dumby_start () __attribute__ ((noreturn));
+ */
+
+void dumby_start ();
+void dumby_start() {
+
+ /* We need to by-pass the link instruction since the RAM chip-
+ select pins are not yet configured. */
+ asm volatile ( ".global start ;
+ start:");
+
+ /* disable interrupts, load stack pointer */
+ asm volatile ( "oriw #0x0700, %sr;
+ moveal #M68Kvec, %a0;
+ movec %a0, %vbr;
+ movel #_end, %d0;
+ addl " STACK_SIZE ",%d0;
+ movel %d0,%sp;
+ link %a6, #0"
+ );
+
+ /* include in ram_init.S */
+ /*
+ * Initalize the SIM module.
+ * The stack pointer is not usable until the RAM chip select lines
+ * are configured. The following code must remain inline.
+ */
+
+ /* Module Configuration Register */
+ /* see section(s) 3.1.3-3.1.6 of the SIM Reference Manual */
+ *SIMCR = (unsigned short int)
+ (FRZSW | FRZBM | SAM(0,8,SHEN) | (MM*SIM_MM) | SAM(SIM_IARB,0,IARB));
+
+ /* Synthesizer Control Register */
+ /* see section(s) 4.8 */
+ /* end include in ram_init.S */
+ *SYNCR = (unsigned short int)
+ ( SAM(EFI_W,15,W) | SAM(0x0,14,X) | SAM(EFI_Y,8,Y) | STSIM );
+ while (! (*SYNCR & SLOCK)); /* protect from clock overshoot */
+ /* include in ram_init.S */
+ *SYNCR = (unsigned short int)
+ ( SAM(EFI_W,15,W) | SAM(EFI_X,14,X) | SAM(EFI_Y,8,Y) | STSIM );
+
+ /* System Protection Control Register */
+ /* !!! can only write to once after reset !!! */
+ /* see section 3.8.4 of the SIM Reference Manual */
+ *SYPCR = (unsigned char)( SAM(0x3,4,SWT) | HME | BME );
+
+ /* Periodic Interrupr Control Register */
+ /* see section 3.8.2 of the SIM Reference Manual */
+ *PICR = (unsigned short int)
+ ( SAM(0,8,PIRQL) | SAM(EFI_PIV,0,PIV) );
+ /* ^^^ zero disables interrupt, don't enable here or ram_init will
+ be wrong. It's enabled below. */
+
+ /* Periodic Interrupt Timer Register */
+ /* see section 3.8.3 of the SIM Reference Manual */
+ *PITR = (unsigned short int)( SAM(0x09,0,PITM) );
+ /* 1.098mS interrupt */
+
+ /* Port C Data */
+ /* load values before enabled */
+ *PORTC = (unsigned char) 0x0;
+
+ /* Chip-Select Base Address Register */
+ /* see section 7 of the SIM Reference Manual */
+ *CSBARBT = (unsigned short int)
+ (((0x000000 >> 8)&0xfff8) | BS_512K ); /* 512k bytes located at 0x0000 */
+ *CSBAR0 = (unsigned short int)
+ (((0x000000 >> 8)&0xfff8) | BS_1M ); /* 1M bytes located at 0x0000 */
+ *CSBAR1 = (unsigned short int)
+ (((0x080000 >> 8)&0xfff8) | BS_256K ); /* 256k bytes located at 0x80000 */
+ *CSBAR2 = (unsigned short int)
+ (((0x080000 >> 8)&0xfff8) | BS_256K ); /* 256 bytes located at 0x80000 */
+ *CSBAR3 = (unsigned short int)
+ (0xfff8 | BS_64K); /* AVEC interrupts */
+ *CSBAR10 = (unsigned short int)
+ (((0x000000 >> 8)&0xfff8) | BS_512K ); /* 512k bytes located at 0x0000 */
+
+ /* Chip-Select Options Registers */
+ /* see section 7 of the SIM Reference Manual */
+ *CSORBT = (unsigned short int)
+ ( BothBytes | ReadWrite | SyncAS | WaitStates_13 | UserSupSpace );
+ *CSOR0 = (unsigned short int)
+ ( BothBytes | ReadOnly | SyncAS | External | UserSupSpace );
+ *CSOR1 = (unsigned short int)
+ ( LowerByte | ReadWrite | SyncAS | FastTerm | UserSupSpace );
+ *CSOR2 = (unsigned short int)
+ ( UpperByte | ReadWrite | SyncAS | FastTerm | UserSupSpace );
+ *CSOR3 = (unsigned short int)
+ ( BothBytes | ReadWrite | SyncAS | CPUSpace | IPLevel_any | AVEC );
+ *CSOR10 = (unsigned short int)
+ ( BothBytes | ReadOnly | SyncAS | External | UserSupSpace );
+
+ /* Chip Select Pin Assignment Register 0 */
+ /* see section 7 of the SIM Reference Manual */
+ *CSPAR0 = (unsigned short int)(
+ SAM(DisOut,CS_5,0x3000) | /* PC2 */
+ SAM(DisOut,CS_4,0x0c00) | /* PC1 */
+ SAM(DisOut,CS_3,0x0300) | /* AVEC (internally) */
+ SAM(CS16bit,CS_2,0x00c0)| /* RAM UDS */
+ SAM(CS16bit,CS_1,0x0030)| /* RAM LDS */
+ SAM(CS16bit,CS_0,0x000c)| /* W/!R */
+ SAM(CS16bit,CSBOOT,0x0003) /* ROM DS */
+ );
+
+ /* Chip Select Pin Assignment Register 1 */
+ /* see section 7 of the SIM Reference Manual */
+ *CSPAR1 = (unsigned short int)(
+ SAM(CS16bit,CS_10,0x300)| /* ECLK */
+ SAM(DisOut,CS_9,0x0c0) | /* PC6 */
+ SAM(DisOut,CS_8,0x030) | /* PC5 */
+ SAM(DisOut,CS_7,0x00c) | /* PC4 */
+ SAM(DisOut,CS_6,0x003) /* PC3 */
+ );
+
+ /* Port E and F Data Register */
+ /* see section 9 of the SIM Reference Manual */
+ *PORTE0 = (unsigned char) 0;
+ *PORTF0 = (unsigned char) 0;
+
+ /* Port E and F Data Direction Register */
+ /* see section 9 of the SIM Reference Manual */
+ *DDRE = (unsigned char) 0xff;
+ *DDRF = (unsigned char) 0xfd;
+
+ /* Port E and F Pin Assignment Register */
+ /* see section 9 of the SIM Reference Manual */
+ *PEPAR = (unsigned char) 0;
+ *PFPAR = (unsigned char) 0;
+
+ /* end of SIM initalization code */
+ /* end include in ram_init.S */
+
+
+
+ /*
+ * Initialize RAM by copying the .data section out of ROM (if
+ * needed) and "zero-ing" the .bss section.
+ */
+ {
+ register char *src = _endtext;
+ register char *dst = _sdata;
+
+ if (_copy_data_from_rom)
+ /* ROM has data at end of text; copy it. */
+ while (dst < _edata)
+ *dst++ = *src++;
+
+ /* Zero bss */
+ for (dst = __bss_start; dst< _end; dst++)
+ *dst = 0;
+ }
+
+ /*
+ * Initalize the board.
+ */
+ Spurious_Initialize();
+ console_init();
+
+ /*
+ * Execute main with arguments argv and environment env
+ */
+ main(1, __argv, __env);
+
+ reboot();
+}
+
+void reboot() {asm("trap #15");}
+
diff --git a/c/src/lib/libbsp/m68k/efi332/start332/Makefile.in b/c/src/lib/libbsp/m68k/efi332/start332/Makefile.in
new file mode 100644
index 0000000000..e2dd13f0c8
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/start332/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/start332.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=start332
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/m68k/efi332/start332/start332.c b/c/src/lib/libbsp/m68k/efi332/start332/start332.c
new file mode 100644
index 0000000000..63ed7be2f3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/start332/start332.c
@@ -0,0 +1,187 @@
+#include <efi332.h>
+#include <sim.h>
+#define __START_C__
+#include "bsp.h"
+
+m68k_isr_entry M68Kvec[256];
+m68k_isr_entry vectors[256];
+char * const __argv[]= {"main", ""};
+char * const __env[]= {""};
+
+int main(const int argc, char * const argv[], char * const env[]);
+
+/*
+ * This prototype really should have the noreturn attribute but
+ * that causes a warning since it appears that the routine does
+ * return.
+ *
+ * void dumby_start () __attribute__ ((noreturn));
+ */
+
+void dumby_start ();
+void dumby_start() {
+
+ /* We need to by-pass the link instruction since the RAM chip-
+ select pins are not yet configured. */
+ asm volatile ( ".global start ;
+ start:");
+
+ /* disable interrupts, load stack pointer */
+ asm volatile ( "oriw #0x0700, %sr;
+ moveal #M68Kvec, %a0;
+ movec %a0, %vbr;
+ movel #_end, %d0;
+ addl " STACK_SIZE ",%d0;
+ movel %d0,%sp;
+ link %a6, #0"
+ );
+
+ /* include in ram_init.S */
+ /*
+ * Initalize the SIM module.
+ * The stack pointer is not usable until the RAM chip select lines
+ * are configured. The following code must remain inline.
+ */
+
+ /* Module Configuration Register */
+ /* see section(s) 3.1.3-3.1.6 of the SIM Reference Manual */
+ *SIMCR = (unsigned short int)
+ (FRZSW | FRZBM | SAM(0,8,SHEN) | (MM*SIM_MM) | SAM(SIM_IARB,0,IARB));
+
+ /* Synthesizer Control Register */
+ /* see section(s) 4.8 */
+ /* end include in ram_init.S */
+ *SYNCR = (unsigned short int)
+ ( SAM(EFI_W,15,W) | SAM(0x0,14,X) | SAM(EFI_Y,8,Y) | STSIM );
+ while (! (*SYNCR & SLOCK)); /* protect from clock overshoot */
+ /* include in ram_init.S */
+ *SYNCR = (unsigned short int)
+ ( SAM(EFI_W,15,W) | SAM(EFI_X,14,X) | SAM(EFI_Y,8,Y) | STSIM );
+
+ /* System Protection Control Register */
+ /* !!! can only write to once after reset !!! */
+ /* see section 3.8.4 of the SIM Reference Manual */
+ *SYPCR = (unsigned char)( SAM(0x3,4,SWT) | HME | BME );
+
+ /* Periodic Interrupr Control Register */
+ /* see section 3.8.2 of the SIM Reference Manual */
+ *PICR = (unsigned short int)
+ ( SAM(0,8,PIRQL) | SAM(EFI_PIV,0,PIV) );
+ /* ^^^ zero disables interrupt, don't enable here or ram_init will
+ be wrong. It's enabled below. */
+
+ /* Periodic Interrupt Timer Register */
+ /* see section 3.8.3 of the SIM Reference Manual */
+ *PITR = (unsigned short int)( SAM(0x09,0,PITM) );
+ /* 1.098mS interrupt */
+
+ /* Port C Data */
+ /* load values before enabled */
+ *PORTC = (unsigned char) 0x0;
+
+ /* Chip-Select Base Address Register */
+ /* see section 7 of the SIM Reference Manual */
+ *CSBARBT = (unsigned short int)
+ (((0x000000 >> 8)&0xfff8) | BS_512K ); /* 512k bytes located at 0x0000 */
+ *CSBAR0 = (unsigned short int)
+ (((0x000000 >> 8)&0xfff8) | BS_1M ); /* 1M bytes located at 0x0000 */
+ *CSBAR1 = (unsigned short int)
+ (((0x080000 >> 8)&0xfff8) | BS_256K ); /* 256k bytes located at 0x80000 */
+ *CSBAR2 = (unsigned short int)
+ (((0x080000 >> 8)&0xfff8) | BS_256K ); /* 256 bytes located at 0x80000 */
+ *CSBAR3 = (unsigned short int)
+ (0xfff8 | BS_64K); /* AVEC interrupts */
+ *CSBAR10 = (unsigned short int)
+ (((0x000000 >> 8)&0xfff8) | BS_512K ); /* 512k bytes located at 0x0000 */
+
+ /* Chip-Select Options Registers */
+ /* see section 7 of the SIM Reference Manual */
+ *CSORBT = (unsigned short int)
+ ( BothBytes | ReadWrite | SyncAS | WaitStates_13 | UserSupSpace );
+ *CSOR0 = (unsigned short int)
+ ( BothBytes | ReadOnly | SyncAS | External | UserSupSpace );
+ *CSOR1 = (unsigned short int)
+ ( LowerByte | ReadWrite | SyncAS | FastTerm | UserSupSpace );
+ *CSOR2 = (unsigned short int)
+ ( UpperByte | ReadWrite | SyncAS | FastTerm | UserSupSpace );
+ *CSOR3 = (unsigned short int)
+ ( BothBytes | ReadWrite | SyncAS | CPUSpace | IPLevel_any | AVEC );
+ *CSOR10 = (unsigned short int)
+ ( BothBytes | ReadOnly | SyncAS | External | UserSupSpace );
+
+ /* Chip Select Pin Assignment Register 0 */
+ /* see section 7 of the SIM Reference Manual */
+ *CSPAR0 = (unsigned short int)(
+ SAM(DisOut,CS_5,0x3000) | /* PC2 */
+ SAM(DisOut,CS_4,0x0c00) | /* PC1 */
+ SAM(DisOut,CS_3,0x0300) | /* AVEC (internally) */
+ SAM(CS16bit,CS_2,0x00c0)| /* RAM UDS */
+ SAM(CS16bit,CS_1,0x0030)| /* RAM LDS */
+ SAM(CS16bit,CS_0,0x000c)| /* W/!R */
+ SAM(CS16bit,CSBOOT,0x0003) /* ROM DS */
+ );
+
+ /* Chip Select Pin Assignment Register 1 */
+ /* see section 7 of the SIM Reference Manual */
+ *CSPAR1 = (unsigned short int)(
+ SAM(CS16bit,CS_10,0x300)| /* ECLK */
+ SAM(DisOut,CS_9,0x0c0) | /* PC6 */
+ SAM(DisOut,CS_8,0x030) | /* PC5 */
+ SAM(DisOut,CS_7,0x00c) | /* PC4 */
+ SAM(DisOut,CS_6,0x003) /* PC3 */
+ );
+
+ /* Port E and F Data Register */
+ /* see section 9 of the SIM Reference Manual */
+ *PORTE0 = (unsigned char) 0;
+ *PORTF0 = (unsigned char) 0;
+
+ /* Port E and F Data Direction Register */
+ /* see section 9 of the SIM Reference Manual */
+ *DDRE = (unsigned char) 0xff;
+ *DDRF = (unsigned char) 0xfd;
+
+ /* Port E and F Pin Assignment Register */
+ /* see section 9 of the SIM Reference Manual */
+ *PEPAR = (unsigned char) 0;
+ *PFPAR = (unsigned char) 0;
+
+ /* end of SIM initalization code */
+ /* end include in ram_init.S */
+
+
+
+ /*
+ * Initialize RAM by copying the .data section out of ROM (if
+ * needed) and "zero-ing" the .bss section.
+ */
+ {
+ register char *src = _endtext;
+ register char *dst = _sdata;
+
+ if (_copy_data_from_rom)
+ /* ROM has data at end of text; copy it. */
+ while (dst < _edata)
+ *dst++ = *src++;
+
+ /* Zero bss */
+ for (dst = __bss_start; dst< _end; dst++)
+ *dst = 0;
+ }
+
+ /*
+ * Initalize the board.
+ */
+ Spurious_Initialize();
+ console_init();
+
+ /*
+ * Execute main with arguments argv and environment env
+ */
+ main(1, __argv, __env);
+
+ reboot();
+}
+
+void reboot() {asm("trap #15");}
+
diff --git a/c/src/lib/libbsp/m68k/efi332/startup/Makefile.in b/c/src/lib/libbsp/m68k/efi332/startup/Makefile.in
new file mode 100644
index 0000000000..fafc7d4264
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspstart bspclean sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/efi332/startup/bspclean.c b/c/src/lib/libbsp/m68k/efi332/startup/bspclean.c
new file mode 100644
index 0000000000..7d165c208e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/startup/bspclean.c
@@ -0,0 +1,28 @@
+/* bsp_cleanup()
+ *
+ * This routine cleans up in the sense that it places the board
+ * in a safe state and flushes the I/O buffers before exiting.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+void bsp_cleanup(void)
+{
+ /* interrupt driven stdio must be flushed */
+ _CPU_ISR_Set_level( 7 );
+ _UART_flush();
+}
diff --git a/c/src/lib/libbsp/m68k/efi332/startup/bspstart.c b/c/src/lib/libbsp/m68k/efi332/startup/bspstart.c
new file mode 100644
index 0000000000..aac266aac0
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/startup/bspstart.c
@@ -0,0 +1,227 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+/* extern int end; */
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) BSP_Configuration.work_space_start +
+ (rtems_unsigned32) BSP_Configuration.work_space_size;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ if (heap_start > (rtems_unsigned32) RAM_END) {
+ /* rtems_fatal_error_occurred can not be used before initalization */
+ RAW_PUTS("\n\rRTEMS: Out of memory.\n\r");
+ RAW_PUTS("RTEMS: Check RAM_END and the size of the work space.\n\r");
+ }
+
+ RTEMS_Malloc_Initialize((void *) heap_start,
+ (RAM_END - heap_start), 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ void *vbr;
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook;
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ m68k_get_vbr( vbr );
+ Cpu_table.interrupt_vector_table = vbr;
+
+ Cpu_table.interrupt_stack_size = 0;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ (((unsigned int)_end + STACK_SIZE + 0x100) & 0xffffff00);
+
+ /*
+ * Add 1 region for Malloc in libc_low
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ /* Clock_exit is done as an atexit() function */
+
+ /* configure peripherals for safe exit */
+ bsp_cleanup();
+
+ /* return like a "normal" subroutine to the monitor */
+ return 0;
+}
+
diff --git a/c/src/lib/libbsp/m68k/efi332/startup/except_vect_332_ROM.S b/c/src/lib/libbsp/m68k/efi332/startup/except_vect_332_ROM.S
new file mode 100644
index 0000000000..0e5e11c085
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/startup/except_vect_332_ROM.S
@@ -0,0 +1,290 @@
+/*
+ * $Id$
+ */
+
+/* Exception Vector definitions follow */
+
+ /* !!! Warning !!! This table is not tested, and
+ the user must make sure it is complete. */
+
+ /* If we use TRAP #15 for reboot, note that group 0 and 1 exceptions
+ will have priority. */
+
+ /* Vector 0: RESET: Initial SSP */
+ .long __end_of_ram
+ /* Vector 1: RESET: Initial PC */
+ .long start
+
+ /* default action for undefined vectors is to re-boot */
+
+ /* Note group 0 and 1 exception (like trace) have priority
+ over other exceptions (like trap #15) that may call this. */
+
+ /* Vectors 2-255 */
+ .long reboot /* exception vector: 2 */
+ .long reboot /* exception vector: 3 */
+ .long reboot /* exception vector: 4 */
+ .long reboot /* exception vector: 5 */
+ .long reboot /* exception vector: 6 */
+ .long reboot /* exception vector: 7 */
+ .long reboot /* exception vector: 8 */
+ .long reboot /* exception vector: 9 */
+ .long reboot /* exception vector: 10 */
+ .long reboot /* exception vector: 11 */
+ .long reboot /* exception vector: 12 */
+ .long reboot /* exception vector: 13 */
+ .long reboot /* exception vector: 14 */
+ .long reboot /* exception vector: 15 */
+ .long reboot /* exception vector: 16 */
+ .long reboot /* exception vector: 17 */
+ .long reboot /* exception vector: 18 */
+ .long reboot /* exception vector: 19 */
+ .long reboot /* exception vector: 20 */
+ .long reboot /* exception vector: 21 */
+ .long reboot /* exception vector: 22 */
+ .long reboot /* exception vector: 23 */
+ .long reboot /* exception vector: 24 */
+ .long reboot /* exception vector: 25 */
+ .long reboot /* exception vector: 26 */
+ .long reboot /* exception vector: 27 */
+ .long reboot /* exception vector: 28 */
+ .long reboot /* exception vector: 29 */
+ .long reboot /* exception vector: 30 */
+ .long reboot /* exception vector: 31 */
+ .long reboot /* exception vector: 32 */
+ .long reboot /* exception vector: 33 */
+ .long reboot /* exception vector: 34 */
+ .long reboot /* exception vector: 35 */
+ .long reboot /* exception vector: 36 */
+ .long reboot /* exception vector: 37 */
+ .long reboot /* exception vector: 38 */
+ .long reboot /* exception vector: 39 */
+ .long reboot /* exception vector: 40 */
+ .long reboot /* exception vector: 41 */
+ .long reboot /* exception vector: 42 */
+ .long reboot /* exception vector: 43 */
+ .long reboot /* exception vector: 44 */
+ .long reboot /* exception vector: 45 */
+ .long reboot /* exception vector: 46 */
+ .long _reboot /* the reboot trap: 47 */
+ .long reboot /* exception vector: 48 */
+ .long reboot /* exception vector: 49 */
+ .long reboot /* exception vector: 50 */
+ .long reboot /* exception vector: 51 */
+ .long reboot /* exception vector: 52 */
+ .long reboot /* exception vector: 53 */
+ .long reboot /* exception vector: 54 */
+ .long reboot /* exception vector: 55 */
+ .long reboot /* exception vector: 56 */
+ .long reboot /* exception vector: 57 */
+ .long reboot /* exception vector: 58 */
+ .long reboot /* exception vector: 59 */
+ .long reboot /* exception vector: 60 */
+ .long reboot /* exception vector: 61 */
+ .long reboot /* exception vector: 62 */
+ .long reboot /* exception vector: 63 */
+ .long reboot /* exception vector: 64 */
+ .long reboot /* exception vector: 65 */
+ .long reboot /* exception vector: 66 */
+ .long reboot /* exception vector: 67 */
+ .long reboot /* exception vector: 68 */
+ .long reboot /* exception vector: 69 */
+ .long reboot /* exception vector: 70 */
+ .long reboot /* exception vector: 71 */
+ .long reboot /* exception vector: 72 */
+ .long reboot /* exception vector: 73 */
+ .long reboot /* exception vector: 74 */
+ .long reboot /* exception vector: 75 */
+ .long reboot /* exception vector: 76 */
+ .long reboot /* exception vector: 77 */
+ .long reboot /* exception vector: 78 */
+ .long reboot /* exception vector: 79 */
+ .long reboot /* exception vector: 80 */
+ .long reboot /* exception vector: 81 */
+ .long reboot /* exception vector: 82 */
+ .long reboot /* exception vector: 83 */
+ .long reboot /* exception vector: 84 */
+ .long reboot /* exception vector: 85 */
+ .long reboot /* exception vector: 86 */
+ .long reboot /* exception vector: 87 */
+ .long reboot /* exception vector: 88 */
+ .long reboot /* exception vector: 89 */
+ .long reboot /* exception vector: 90 */
+ .long reboot /* exception vector: 91 */
+ .long reboot /* exception vector: 92 */
+ .long reboot /* exception vector: 93 */
+ .long reboot /* exception vector: 94 */
+ .long reboot /* exception vector: 95 */
+ .long reboot /* exception vector: 96 */
+ .long reboot /* exception vector: 97 */
+ .long reboot /* exception vector: 98 */
+ .long reboot /* exception vector: 99 */
+ .long reboot /* exception vector: 100 */
+ .long reboot /* exception vector: 101 */
+ .long reboot /* exception vector: 102 */
+ .long reboot /* exception vector: 103 */
+ .long reboot /* exception vector: 104 */
+ .long reboot /* exception vector: 105 */
+ .long reboot /* exception vector: 106 */
+ .long reboot /* exception vector: 107 */
+ .long reboot /* exception vector: 108 */
+ .long reboot /* exception vector: 109 */
+ .long reboot /* exception vector: 110 */
+ .long reboot /* exception vector: 111 */
+ .long reboot /* exception vector: 112 */
+ .long reboot /* exception vector: 113 */
+ .long reboot /* exception vector: 114 */
+ .long reboot /* exception vector: 115 */
+ .long reboot /* exception vector: 116 */
+ .long reboot /* exception vector: 117 */
+ .long reboot /* exception vector: 118 */
+ .long reboot /* exception vector: 119 */
+ .long reboot /* exception vector: 120 */
+ .long reboot /* exception vector: 121 */
+ .long reboot /* exception vector: 122 */
+ .long reboot /* exception vector: 123 */
+ .long reboot /* exception vector: 124 */
+ .long reboot /* exception vector: 125 */
+ .long reboot /* exception vector: 126 */
+ .long reboot /* exception vector: 127 */
+ .long reboot /* exception vector: 128 */
+ .long reboot /* exception vector: 129 */
+ .long reboot /* exception vector: 130 */
+ .long reboot /* exception vector: 131 */
+ .long reboot /* exception vector: 132 */
+ .long reboot /* exception vector: 133 */
+ .long reboot /* exception vector: 134 */
+ .long reboot /* exception vector: 135 */
+ .long reboot /* exception vector: 136 */
+ .long reboot /* exception vector: 137 */
+ .long reboot /* exception vector: 138 */
+ .long reboot /* exception vector: 139 */
+ .long reboot /* exception vector: 140 */
+ .long reboot /* exception vector: 141 */
+ .long reboot /* exception vector: 142 */
+ .long reboot /* exception vector: 143 */
+ .long reboot /* exception vector: 144 */
+ .long reboot /* exception vector: 145 */
+ .long reboot /* exception vector: 146 */
+ .long reboot /* exception vector: 147 */
+ .long reboot /* exception vector: 148 */
+ .long reboot /* exception vector: 149 */
+ .long reboot /* exception vector: 150 */
+ .long reboot /* exception vector: 151 */
+ .long reboot /* exception vector: 152 */
+ .long reboot /* exception vector: 153 */
+ .long reboot /* exception vector: 154 */
+ .long reboot /* exception vector: 155 */
+ .long reboot /* exception vector: 156 */
+ .long reboot /* exception vector: 157 */
+ .long reboot /* exception vector: 158 */
+ .long reboot /* exception vector: 159 */
+ .long reboot /* exception vector: 160 */
+ .long reboot /* exception vector: 161 */
+ .long reboot /* exception vector: 162 */
+ .long reboot /* exception vector: 163 */
+ .long reboot /* exception vector: 164 */
+ .long reboot /* exception vector: 165 */
+ .long reboot /* exception vector: 166 */
+ .long reboot /* exception vector: 167 */
+ .long reboot /* exception vector: 168 */
+ .long reboot /* exception vector: 169 */
+ .long reboot /* exception vector: 170 */
+ .long reboot /* exception vector: 171 */
+ .long reboot /* exception vector: 172 */
+ .long reboot /* exception vector: 173 */
+ .long reboot /* exception vector: 174 */
+ .long reboot /* exception vector: 175 */
+ .long reboot /* exception vector: 176 */
+ .long reboot /* exception vector: 177 */
+ .long reboot /* exception vector: 178 */
+ .long reboot /* exception vector: 179 */
+ .long reboot /* exception vector: 180 */
+ .long reboot /* exception vector: 181 */
+ .long reboot /* exception vector: 182 */
+ .long reboot /* exception vector: 183 */
+ .long reboot /* exception vector: 184 */
+ .long reboot /* exception vector: 185 */
+ .long reboot /* exception vector: 186 */
+ .long reboot /* exception vector: 187 */
+ .long reboot /* exception vector: 188 */
+ .long reboot /* exception vector: 189 */
+ .long reboot /* exception vector: 190 */
+ .long reboot /* exception vector: 191 */
+ .long reboot /* exception vector: 192 */
+ .long reboot /* exception vector: 193 */
+ .long reboot /* exception vector: 194 */
+ .long reboot /* exception vector: 195 */
+ .long reboot /* exception vector: 196 */
+ .long reboot /* exception vector: 197 */
+ .long reboot /* exception vector: 198 */
+ .long reboot /* exception vector: 199 */
+ .long reboot /* exception vector: 200 */
+ .long reboot /* exception vector: 201 */
+ .long reboot /* exception vector: 202 */
+ .long reboot /* exception vector: 203 */
+ .long reboot /* exception vector: 204 */
+ .long reboot /* exception vector: 205 */
+ .long reboot /* exception vector: 206 */
+ .long reboot /* exception vector: 207 */
+ .long reboot /* exception vector: 208 */
+ .long reboot /* exception vector: 209 */
+ .long reboot /* exception vector: 210 */
+ .long reboot /* exception vector: 211 */
+ .long reboot /* exception vector: 212 */
+ .long reboot /* exception vector: 213 */
+ .long reboot /* exception vector: 214 */
+ .long reboot /* exception vector: 215 */
+ .long reboot /* exception vector: 216 */
+ .long reboot /* exception vector: 217 */
+ .long reboot /* exception vector: 218 */
+ .long reboot /* exception vector: 219 */
+ .long reboot /* exception vector: 220 */
+ .long reboot /* exception vector: 221 */
+ .long reboot /* exception vector: 222 */
+ .long reboot /* exception vector: 223 */
+ .long reboot /* exception vector: 224 */
+ .long reboot /* exception vector: 225 */
+ .long reboot /* exception vector: 226 */
+ .long reboot /* exception vector: 227 */
+ .long reboot /* exception vector: 228 */
+ .long reboot /* exception vector: 229 */
+ .long reboot /* exception vector: 230 */
+ .long reboot /* exception vector: 231 */
+ .long reboot /* exception vector: 232 */
+ .long reboot /* exception vector: 233 */
+ .long reboot /* exception vector: 234 */
+ .long reboot /* exception vector: 235 */
+ .long reboot /* exception vector: 236 */
+ .long reboot /* exception vector: 237 */
+ .long reboot /* exception vector: 238 */
+ .long reboot /* exception vector: 239 */
+ .long reboot /* exception vector: 240 */
+ .long reboot /* exception vector: 241 */
+ .long reboot /* exception vector: 242 */
+ .long reboot /* exception vector: 243 */
+ .long reboot /* exception vector: 244 */
+ .long reboot /* exception vector: 245 */
+ .long reboot /* exception vector: 246 */
+ .long reboot /* exception vector: 247 */
+ .long reboot /* exception vector: 248 */
+ .long reboot /* exception vector: 249 */
+ .long reboot /* exception vector: 250 */
+ .long reboot /* exception vector: 251 */
+ .long reboot /* exception vector: 252 */
+ .long reboot /* exception vector: 253 */
+ .long reboot /* exception vector: 254 */
+ .long reboot /* exception vector: 255 */
+
+
+_reboot:
+ move #0x2700,%sr /* mask interrupts */
+ movea.l (0x0).w,%a7 /* load stack */
+ movea.l (0x4).w,%a0 /* jmp to location of reset vector */
+ jmp (%a0)
+
+reboot:
+ trap #15 /* use trap exception to enter supervisor
+ state. Trace mode ( and other group 0
+ and 1 exceptions) *could* screw this up if
+ not vectored to reboot or did not return. */
diff --git a/c/src/lib/libbsp/m68k/efi332/startup/linkcmds b/c/src/lib/libbsp/m68k/efi332/startup/linkcmds
new file mode 100644
index 0000000000..85c0b20b5c
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/startup/linkcmds
@@ -0,0 +1,101 @@
+/* linkcmds
+ *
+ * $Id$
+ */
+
+OUTPUT_ARCH(m68k)
+__DYNAMIC = 0;
+
+/*
+ * The memory map looks like this:
+ * +--------------------+ <- low memory
+ * | .text |
+ * | etext |
+ * | ctor list | the ctor and dtor lists are for
+ * | dtor list | C++ support
+ * | _endtext |
+ * +--------------------+
+ * | .data | initialized data goes here
+ * | _sdata |
+ * | _edata |
+ * +--------------------+
+ * | .bss |
+ * | __bss_start | start of bss, cleared by crt0
+ * | _end | start of heap, used by sbrk()
+ * +--------------------+
+ * | heap space |
+ * | _ENDHEAP |
+ * | stack space |
+ * | __stack | top of stack
+ * +--------------------+ <- high memory
+ */
+
+MEMORY
+{
+ ram : ORIGIN = 0x80000, LENGTH = 256K
+}
+
+__end_of_ram = 0xc0000;
+_copy_data_from_rom = 0;
+
+/*
+ * stick everything in ram (of course)
+ */
+SECTIONS
+{
+ .text :
+ {
+ CREATE_OBJECT_SYMBOLS
+ text_start = .;
+ _text_start = .;
+ *(.text)
+ etext = ALIGN(0x10);
+ _etext = .;
+ __CTOR_LIST__ = .;
+ LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
+ *(.ctors)
+ LONG(0)
+ __CTOR_END__ = .;
+ __DTOR_LIST__ = .;
+ LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
+ *(.dtors)
+ LONG(0)
+ __DTOR_END__ = .;
+ *(.lit)
+ *(.shdata)
+ _endtext = .;
+ } > ram
+ .data :
+ {
+ data_start = .;
+ _data_start = .;
+ _sdata = . ;
+ *(.data)
+ CONSTRUCTORS
+ edata = ALIGN(0x10);
+ _edata = .;
+ } > ram
+ .shbss :
+ {
+ *(.shbss)
+ } > ram
+ .bss :
+ {
+ __bss_start = ALIGN(0x8);
+ bss_start = .;
+ _bss_start = .;
+ *(.bss)
+ *(COMMON)
+ end = .;
+ _end = ALIGN(0x8);
+ __end = ALIGN(0x8);
+ } > ram
+ .stab . (NOLOAD) :
+ {
+ [ .stab ]
+ }
+ .stabstr . (NOLOAD) :
+ {
+ [ .stabstr ]
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/efi332/startup/linkcmds_ROM b/c/src/lib/libbsp/m68k/efi332/startup/linkcmds_ROM
new file mode 100644
index 0000000000..e879396c8c
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/startup/linkcmds_ROM
@@ -0,0 +1,110 @@
+/* linkcmds
+ *
+ * linkcmds,v 1.1 1995/09/20 15:04:47 joel Exp
+ */
+
+OUTPUT_ARCH(m68k)
+STARTUP(except_vect_332_ROM.o)
+__DYNAMIC = 0;
+
+/*
+ * ROM:
+ * +--------------------+ <- low memory
+ * | .text |
+ * | etext |
+ * | ctor list | the ctor and dtor lists are for
+ * | dtor list | C++ support
+ * | _endtext |
+ * | temporary .data | .data is moved to RAM by crt0
+ * | |
+ * +--------------------+ <- high memory
+ *
+ *
+ * RAM:
+ * +--------------------+ <- low memory
+ * | .data | initialized data goes here
+ * | _sdata |
+ * | _edata |
+ * +--------------------+
+ * | .bss |
+ * | __bss_start | start of bss, cleared by crt0
+ * | _end | start of heap, used by sbrk()
+ * +--------------------+
+ * | heap space |
+ * | _ENDHEAP |
+ * | stack space |
+ * | __stack | top of stack
+ * +--------------------+ <- high memory
+ */
+
+MEMORY
+{
+ rom : ORIGIN = 0x00000, LENGTH = 256K
+ ram : ORIGIN = 0x80000, LENGTH = 256K
+}
+
+__end_of_ram = 0xc0000;
+_copy_data_from_rom = 1;
+
+/*
+ *
+ */
+SECTIONS
+{
+ .text :
+ {
+ CREATE_OBJECT_SYMBOLS
+ text_start = .;
+ _text_start = .;
+ *(.text)
+ etext = ALIGN(0x10);
+ _etext = .;
+ __CTOR_LIST__ = .;
+ LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
+ *(.ctors)
+ LONG(0)
+ __CTOR_END__ = .;
+ __DTOR_LIST__ = .;
+ LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
+ *(.dtors)
+ LONG(0)
+ __DTOR_END__ = .;
+ *(.lit)
+ *(.shdata)
+ _endtext = .;
+ } > rom
+ .data :
+ AT ( ADDR(.text) + SIZEOF( .text ) )
+ {
+ data_start = .;
+ _data_start = .;
+ _sdata = . ;
+ *(.data)
+ CONSTRUCTORS
+ edata = ALIGN(0x10);
+ _edata = .;
+ } > ram
+ .shbss :
+ {
+ *(.shbss)
+ } > ram
+ .bss :
+ {
+ __bss_start = ALIGN(0x8);
+ bss_start = .;
+ _bss_start = .;
+ *(.bss)
+ *(COMMON)
+ end = .;
+ _end = ALIGN(0x8);
+ __end = ALIGN(0x8);
+ } > ram
+ .stab . (NOLOAD) :
+ {
+ [ .stab ]
+ }
+ .stabstr . (NOLOAD) :
+ {
+ [ .stabstr ]
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/efi332/timer/Makefile.in b/c/src/lib/libbsp/m68k/efi332/timer/Makefile.in
new file mode 100644
index 0000000000..79c8438431
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/timer/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi332/timer/timer.c b/c/src/lib/libbsp/m68k/efi332/timer/timer.c
new file mode 100644
index 0000000000..19cea7fedb
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/timer/timer.c
@@ -0,0 +1,84 @@
+/* Timer_init()
+ *
+ * This routine initializes a timer in efi68k's DP8570A TCP
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <bsp.h>
+
+rtems_boolean Timer_driver_Find_average_overhead;
+
+extern rtems_isr Clock_isr();
+
+void Timer_initialize( void )
+{
+}
+
+/*
+ * The following controls the behavior of Read_timer().
+ *
+ * FIND_AVG_OVERHEAD * instructs the routine to return the "raw" count.
+ *
+ * AVG_OVEREHAD is the overhead for starting and stopping the timer. It
+ * is usually deducted from the number returned.
+ *
+ * LEAST_VALID is the lowest number this routine should trust. Numbers
+ * below this are "noise" and zero is returned.
+ */
+
+#define AVG_OVERHEAD 0 /* It typically takes X.X microseconds */
+ /* (Y countdowns) to start/stop the timer. */
+ /* This value is in microseconds. */
+#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */
+
+/*
+ * Return timer value in 1/2-microsecond units
+ */
+int Read_timer( void )
+{
+ rtems_unsigned32 total;
+ total = 0;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in XXX microsecond units */
+
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ return (total - AVG_OVERHEAD);
+}
+
+
+/*
+ * Empty function call used in loops to measure basic cost of looping
+ * in Timing Test Suite.
+ */
+
+rtems_status_code Empty_function(void)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/efi332/times b/c/src/lib/libbsp/m68k/efi332/times
new file mode 100644
index 0000000000..17ac20f2cf
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/times
@@ -0,0 +1,193 @@
+#
+# Timing Test Suite Results for the EFI332 BSP
+#
+# $Id$
+#
+
+NOTE: This BSP is used submitted and no information is currently available.
+
+Board: EFI332
+CPU: 68332
+Clock Speed: 20 Mhz
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column A: unused
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/m68k/efi332/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/efi332/wrapup/Makefile.in
new file mode 100644
index 0000000000..a4444d9cb1
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi332/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console spurious timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/efi68k/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/Makefile.in
new file mode 100644
index 0000000000..b3ba290d5e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include start68k startup clock console spurious timer wrapup
diff --git a/c/src/lib/libbsp/m68k/efi68k/README b/c/src/lib/libbsp/m68k/efi68k/README
new file mode 100644
index 0000000000..a4cc364c04
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/README
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+Description: efi68k
+============
+CPU: MC68HC000 @16MHz
+RAM: 256k
+ROM: 256k
+
+ Based upon a 16MHz 68HC000, efi332 is a minimally configured 4x6
+inch single board computer. It includes the following major
+components: (a) 256k SRAM (km681000l), (b) 256 EPROM (27C010),
+(c) DP8570A (clock/timer/calendar), (d) MAX791 (cpu supervisory chip
+with battery backup switch-over and watch dog timer), and
+(e) NS16550DN (UART). The following interrupt functions have also been
+incorporated: UART, TIMER, Watch Dog, and Low Line voltage (trips at
+4.85V; enough time to save the cpu reg before reset is asserted on
+power down).
+ The schematic for efi68k is freely available via e-mail. Send
+"index diy_efi" to majordomo@coulomb.eng.ohio-state.edu. Retrieve the
+files related to 68hc000-1.00 with the "get diy_efi <filename>"
+command. efi68k does not have an available printed circuit board, but
+can be wire-wrapped in about four days. Cost is about $100US.
+
+TODO:
+=====
+- add the "tm27 vector" ... can we use a trap instruction?
+- generate include/coverhd.c to perform the tmtest.
+- the interrupt drive I/O should be integrated into the RTEMS.
+- finish the ROM memory model.
+- add separate interrupt stack (low priority).
+
+ John S Gwynne
+ Gwynne.1@osu.edu
+_______________________________________________________________________________
+ T h e O h i o - S t a t e U n i v e r s i t y
+ ElectroScience Laboratory, 1320 Kinnear Road, Columbus, Ohio 43212, USA
+ Telephone: (614) 292-7981 * Fax: (614) 292-7297
+-------------------------------------------------------------------------------
+
diff --git a/c/src/lib/libbsp/m68k/efi68k/bsp_specs b/c/src/lib/libbsp/m68k/efi68k/bsp_specs
new file mode 100644
index 0000000000..8ca61fbb24
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start68k.o%s
+{!pg:
+g: start68k.o%s
+{!g:
+p: start68k.o%s
+!p: start68k.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/efi68k/clock/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/clock/Makefile.in
new file mode 100644
index 0000000000..8e325402ca
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/clock/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi68k/clock/ckinit.c b/c/src/lib/libbsp/m68k/efi68k/clock/ckinit.c
new file mode 100644
index 0000000000..fd44e47909
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/clock/ckinit.c
@@ -0,0 +1,157 @@
+/* Clock_init()
+ *
+ * This routine initializes the DP8570A periodic interrupt on the
+ * efi68k board. The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#define CLOCK_VECTOR (TCP_ISR_LEVEL+24)
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+volatile rtems_unsigned32 Clock_driver_ticks;
+ /* ticks since initialization */
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+
+void per_interrupt(void)
+{
+ Clock_driver_ticks += 1;
+
+ *MSR = PER;
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ unsigned char entry_msr, msr;
+
+ entry_msr = *MSR;
+ *MSR = 0;
+ while ( (msr=*MSR) & INT )
+ /* test enabled interrupt bits */
+ if (msr & PER)
+ per_interrupt();
+ else if (msr & T0) {
+ *MSR = T0; /* reset interrupt */
+ Timer_interrupts++; /* inc wrap around counter */
+ }
+ else
+ /* there has been an error if we reach this point */
+ /* default action: reset all the interrupts */
+ *MSR = ( PER | AL | T0 | T1 );
+ *MSR = entry_msr & (RS | PS);
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+
+ *MSR = RS; /* enable 1mS interrupts */
+ *ICR0 |= OME;
+
+ atexit( Clock_exit );
+ }
+}
+
+void Clock_exit( void )
+{
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+
+ /* shutdown periodic interrupt */
+ *MSR = RS;
+ *ICR0 &= 0xc0;
+ /* do not restore old vector */
+
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/console/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi68k/console/console.c b/c/src/lib/libbsp/m68k/efi68k/console/console.c
new file mode 100644
index 0000000000..c778d18a69
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/console/console.c
@@ -0,0 +1,366 @@
+/*
+ * This file contains the efi68k console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+#include <bsp.h>
+#include <rtems/libio.h>
+
+
+#define BAUD 38400
+#define CLK_FREQ 8000000.0
+
+/* BUFFER_LENGTH must be 2^n for n=1, 2, 3, .... */
+#define BUFFER_LENGTH 256
+#define RTS_STOP_SIZE BUFFER_LENGTH-64
+#define RTS_START_SIZE 16
+
+char xmt_buf[BUFFER_LENGTH];
+char rcv_buf[BUFFER_LENGTH];
+/* in: last entry into the buffer; always on a valid character */
+/* out: points to the next character to be pull from the buffer */
+/* in+1=out => buffer empty */
+/* in+2=out => buffer full */
+struct UART_buf {
+ char *offset;
+ char *in;
+ char *out;
+};
+static volatile struct UART_buf xmt = { xmt_buf, (char *)0, (char *)1};
+static volatile struct UART_buf rcv = { rcv_buf, (char *)0, (char *)1};
+static volatile char _debug_flag = 0;
+static volatile char _tx_stop = 0;
+
+/* _catchUARTint is the interrupt front-end */
+extern void _catchUARTint();
+asm(" .text
+ .align 2
+ .globl _catchUARTint
+_catchUARTint:
+ lea %sp@(4),%sp /* pop return address */
+ moveml %d0-%d7/%a0-%a6,%sp@- /* save registers */
+ jbsr uart_interrupt
+ moveml %sp@+,%d0-%d7/%a0-%a6
+ rte
+ ");
+
+/* _fake_trap_1 will continue the UART interrupt (%sr *still*
+ UART_ISR_LEVEL) as a trap #1 to enter the debugger */
+asm(" .text
+ .align 2
+_fake_trap_1:
+ unlk %a6 /* clear interrupt frame */
+ lea %sp@(4),%sp /* remove jbsr instruction */
+ moveml %sp@+,%d0-%d7/%a0-%a6 /* pop registers */
+ jmp (33*6-12+_VBR) /* jump exception 1 */
+ ");
+
+/* dispatch UART interrupt */
+void xmit_interrupt(void);
+void rcvr_interrupt(void);
+void modem_status(void);
+void _fake_trap_1(void);
+void uart_interrupt(void) {
+ register char a;
+
+ a=*IIR & (NIP | IID_MASK); /* read interrupt id register */
+ switch (a) {
+ case 0x04: case 0x0c:
+ rcvr_interrupt();
+ break;
+ case 0x02:
+ xmit_interrupt();
+ break;
+ case 0x00:
+ modem_status();
+ break;
+ default:
+ break;
+ }
+ if (_debug_flag) {
+ _debug_flag = 0; /* reset the flag */
+ _fake_trap_1(); /* fake a trap #1 */
+ }
+}
+
+/* transfer received character to the buffer */
+void rcvr_interrupt(void) {
+ register char *a, c;
+ register int length;
+
+ while ( (*LSR & DR) != 0) {
+ if ((c=*RBR) == 0x1a) /* use ctl-z to reboot */
+ reboot();
+ else if (c == 0x03) { /* use ctl-c to enter debugger */
+ _debug_flag = 1;
+ continue;
+ }
+ *(char *)((int)rcv.offset +(int)
+ (a=(char *)(((int)rcv.in+1) & ((int)BUFFER_LENGTH-1)))) = c;
+ if ((char *)(((int)rcv.in+2) & ((int)BUFFER_LENGTH-1)) != rcv.out)
+ rcv.in=a;
+ }
+ length = (BUFFER_LENGTH -1) & (
+ ( ((int)rcv.out <= (int)rcv.in) ? 0 : BUFFER_LENGTH) - (int)rcv.out
+ + (int)rcv.in + 1);
+ if (length >= RTS_STOP_SIZE)
+ *MCR &= (char) (~RTS);
+}
+
+/* tranfer buffered characters to the UART */
+void xmit_interrupt(void) {
+ register short int i, oldsr;
+
+ _CPU_ISR_Disable( oldsr ); /* for when outbyte calls */
+ if ( (*LSR & THRE) != 0 && _tx_stop == 0 )
+ for (i=0;i<16;i++) {
+ if ((char *)(((int)xmt.in+1) & ((int)BUFFER_LENGTH-1))== xmt.out)
+ break;
+ *THR=*(char *)((int)xmt.offset+(int)xmt.out);
+ xmt.out= (char *)(((int)xmt.out+1) & ((int)BUFFER_LENGTH-1));
+ }
+ _CPU_ISR_Enable( oldsr );
+}
+
+void modem_status(void) {
+ register char a;
+
+ if ( ((a=*MDSR) & DCTS) != 0 )
+ if ( (a & CTS) == 0)
+ _tx_stop = 1;
+ else {
+ _tx_stop = 0;
+ xmit_interrupt();
+ }
+}
+
+/* transfer character from the buffer */
+char inbyte(void) {
+ register char a;
+ register int length;
+
+ while ((char *)(((int)rcv.in+1) & ((int)BUFFER_LENGTH-1))== rcv.out);
+ a=*(char *)((int)rcv.offset+(int)rcv.out);
+ rcv.out= (char *)(((int)rcv.out+1) & ((int)BUFFER_LENGTH-1));
+ length = (BUFFER_LENGTH -1) & (
+ ( ((int)rcv.out <= (int)rcv.in) ? 0 : BUFFER_LENGTH) - (int)rcv.out
+ + (int)rcv.in + 1);
+ if (length < RTS_START_SIZE)
+ *MCR |= (char) RTS;
+ return (a);
+}
+
+/* once room is avaliable in the buffer, transfer
+ the character into the buffer and enable
+ the xmtr interrupt */
+void outbyte(char c) {
+ register char *a;
+
+ while ((char *)(((int)xmt.in+2) & ((int)BUFFER_LENGTH-1)) == xmt.out);
+ *(char *)((int)xmt.offset+(int)
+ (a=(char *)(((int)xmt.in+1) & ((int)BUFFER_LENGTH-1))))=c;
+ xmt.in=a;
+
+ if ( (*LSR & THRE) != 0 ) /* if THRE, uart has already interrupted */
+ xmit_interrupt(); /* and was ignored. Need to restart. */
+}
+
+void _UART_flush(void) {
+ /* loop till xmt buffer empty. Works with interrupts disabled */
+ while ((char *)(((int)xmt.in+1) & ((int)BUFFER_LENGTH-1)) != xmt.out)
+ xmit_interrupt();
+ /* loop till UART buffer empty */
+ while ( (*LSR & TEMT) == 0 );
+}
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+void console_init()
+{
+ /* set clock divisor */
+ *LCR = (char)(DLAB);
+ *DLL = (char)((int)(CLK_FREQ/BAUD/16.0+0.5) & 0xFF);
+ *DLM = (char)(((int)(CLK_FREQ/BAUD/16.0+0.5) & 0xFF00) >> 8);
+
+ /* Line control setup */
+ *LCR = (char)(WL_8 | NSB);
+
+ /* Interrupt setup */
+ *IER = (char) 0x0b; /* enable transmit, receive, modem stat int */
+
+ /* FIFO setup */
+ *FCR = (char)(FIFO_E | 0xc0);
+
+ /* Modem control setup */
+ *MCR = (char) RTS;
+
+ /* init tx_stop with CTS */
+ _tx_stop = ( (*MDSR & CTS) ? 0 : 1);
+
+ set_vector(_catchUARTint, UART_ISR_LEVEL+24, 0);
+}
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ if ((char *)(((int)rcv.in+1) & ((int)BUFFER_LENGTH-1))== rcv.out)
+ return(FALSE);
+ else
+ return(TRUE);
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/include/16550.h b/c/src/lib/libbsp/m68k/efi68k/include/16550.h
new file mode 100644
index 0000000000..5239ff11b4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/include/16550.h
@@ -0,0 +1,110 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * 16550 -- header file for National Semiconducor's 16550 UART
+ *
+ * This file has been created by John S. Gwynne for the efi68k
+ * project.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _16550_H_
+#define _16550_H_
+
+/* base address is the physical location of register 0 */
+#define UART_BASE_ADDRESS 0x0400001
+
+/* definitions of register addresses and associate bits */
+
+#define RBR (volatile unsigned char * const)(0*2+UART_BASE_ADDRESS)
+ /* Receiver Buffer Register (w/DLAB=0)*/
+ /* 8-bit data */
+
+#define THR (volatile unsigned char * const)(0*2+UART_BASE_ADDRESS)
+ /* Transmitter Holding Register (w/DLAB=0) */
+ /* 8-bit data */
+
+#define DLL (volatile unsigned char * const)(0*2+UART_BASE_ADDRESS)
+ /* Divisor Latch (LS) (w/DLAB=1) */
+ /* LSB of Divisor */
+
+#define DLM (volatile unsigned char * const)(1*2+UART_BASE_ADDRESS)
+ /* Divisor Latch (MS) (w/DLAB=1) */
+ /* MSB of Divisor */
+
+#define IER (volatile unsigned char * const)(1*2+UART_BASE_ADDRESS)
+ /* Interrupt Enable Register (w/DLAB=0) */
+#define ERBFI 0x01 /* Enable Recv Data Available Interrupt */
+#define ETBEI 0x02 /* Enable Trans Holding Reg Empty Inter */
+#define ELSI 0x04 /* Enable Recv Line Status Interrupt */
+#define EDSSI 0x08 /* Enable Modem Status Interrupt */
+
+#define IIR (volatile unsigned char * const)(2*2+UART_BASE_ADDRESS)
+ /* Interrupt Ident Register (read only) */
+#define NIP 0x01 /* No Interrupt Pending */
+#define IID_MASK 0x0e /* Interrupt ID mask */
+#define FE_MASK 0xc0 /* FIFO's Enabled */
+
+#define FCR (volatile unsigned char * const)(2*2+UART_BASE_ADDRESS)
+ /* FIFO Control Register (write only) */
+#define FIFO_E 0x01 /* FIFO Enable */
+#define RFR 0x02 /* RCVR FIFO Reset */
+#define XFR 0x04 /* XMIT FIFO Reset */
+#define DMAMS 0x08 /* DMA Mode Select */
+#define RCVRTG_MASK 0xC0 /* RCVR Triger MSBit/LSBit */
+
+#define LCR (volatile unsigned char * const)(3*2+UART_BASE_ADDRESS)
+ /* Line Control Register */
+#define WLS_MASK 0x03 /* Word Legth Select Mask */
+#define WL_5 0x00 /* 5 bits */
+#define WL_6 0x01 /* 6 bits */
+#define WL_7 0x02 /* 7 bits */
+#define WL_8 0x03 /* 8 bits */
+#define NSB 0x04 /* Number of Stop Bits (set is 2/1.5) */
+#define PEN 0x08 /* Parity Enable */
+#define EPS 0x10 /* Even Parity Select */
+#define STP 0x20 /* Stick Parity */
+#define SETBK 0x40 /* Set Break */
+#define DLAB 0x80 /* Divisor Latch Access Bit */
+
+#define MCR (volatile unsigned char * const)(4*2+UART_BASE_ADDRESS)
+ /* Modem Control Register */
+#define DTR 0x01 /* Data Terminal Ready */
+#define RTS 0x02 /* Request to Send */
+#define OUT1 0x04 /* Out 1 */
+#define OUT2 0x08 /* Out 2 */
+#define LOOP 0x10 /* Loop */
+
+#define LSR (volatile unsigned char * const)(5*2+UART_BASE_ADDRESS)
+ /* Line Status Register */
+#define DR 0x01 /* Data Ready */
+#define OE 0x02 /* Overrun error */
+#define PE 0x04 /* Parity error */
+#define FE 0x08 /* Framing error */
+#define BI 0x10 /* Break Interrupt */
+#define THRE 0x20 /* Transmitter Holding Register */
+#define TEMT 0x40 /* Transmitter Empty */
+#define RCVFIE 0x80 /* Recv FIFO Error */
+
+#define MDSR (volatile unsigned char * const)(6*2+UART_BASE_ADDRESS)
+ /* Modem Status Register */
+#define DCTS 0x01 /* Delta Clear to Send */
+#define DDSR 0x02 /* Delta Data Set Ready */
+#define TERI 0x04 /* Trailing Edge Ring Indicator */
+#define DDCD 0x08 /* Delta Data Carrier Detect */
+#define CTS 0x10 /* Clear to Send */
+#define DSR 0x20 /* Data Set Ready */
+#define RI 0x40 /* Ring Indicator */
+#define DCD 0x80 /* Data Carrier Detect */
+
+#define SCR (volatile unsigned char * const)(7*2+UART_BASE_ADDRESS)
+ /* Scratch Register */
+ /* 8-bit register */
+#endif
diff --git a/c/src/lib/libbsp/m68k/efi68k/include/DP8570A.h b/c/src/lib/libbsp/m68k/efi68k/include/DP8570A.h
new file mode 100644
index 0000000000..8739a4a793
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/include/DP8570A.h
@@ -0,0 +1,275 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * DP8570A -- header file for National Semiconducor's DP8570A TCP
+ *
+ * This file has been created by John S. Gwynne for the efi68k
+ * project.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _DP8570A_H_
+#define _DP8570A_H_
+
+/* base address is the physical location of register 0 */
+#define TCP_BASE_ADDRESS 0x0600001
+
+
+/* definitions of register addresses and associate bits */
+
+/* ********************************************************* */
+/* Control Registers */
+/* ********************************************************* */
+
+/* REMEMBER: if you are in an interrupt routine, you must
+ reset RS and PS of MSR to the value they had on entry
+ to the ISR before exiting */
+
+#define MSR (volatile unsigned char * const)(0x00*2+TCP_BASE_ADDRESS)
+ /* Main Status Register */
+#define INT 0x01 /* Interrupt Status */
+#define PF 0x02 /* Power Fail Interrupt */
+#define PER 0x04 /* Period Interrupt */
+#define AL 0x08 /* Alarm Interrupt */
+#define T0 0x10 /* Timer 0 Interrupt */
+#define T1 0x20 /* Timer 1 Interrupt */
+#define RS 0x40 /* Register Select Bit */
+#define PS 0x80 /* Page Select Bit */
+
+#define T0CR (volatile unsigned char * const)(0x01*2+TCP_BASE_ADDRESS)
+ /* Timer 0 Control Register */
+#define T1CR (volatile unsigned char * const)(0x02*2+TCP_BASE_ADDRESS)
+ /* Timer 1 Control Register */
+#define TSS 0x01 /* Timer Start/!Stop */
+#define M0 0x02 /* Mode Select */
+#define M1 0x04 /* Mode Select */
+#define C0 0x08 /* Input Clock Select */
+#define C1 0x10 /* Input Clock Select */
+#define C2 0x20 /* Input Clock Select */
+#define RD 0x40 /* Timer Read */
+#define CHG 0x80 /* Count Hold/Gate */
+
+#define PFR (volatile unsigned char * const)(0x03*2+TCP_BASE_ADDRESS)
+ /* Periodic Flag Register */
+#define R_1MIN 0x01 /* Minute Flage */
+#define R_10S 0x02 /* 10 Second Flag */
+#define R_1S 0x04 /* Second Flag */
+#define R_100MS 0x08 /* 100 Millisec Flag */
+#define R_10MS 0x10 /* 10 Millisec Flag */
+#define R_1MS 0x20 /* 1 Millisec Flag */
+#define OSF 0x40 /* Oscillator Failed/Single Supply */
+#define TMODE 0x80 /* Test Mode Enable */
+
+#define IRR (volatile unsigned char * const)(0x04*2+TCP_BASE_ADDRESS)
+ /* Interrupt Routing Register */
+#define PF_R 0x01 /* Power Fail Route */
+#define PR_R 0x02 /* Periodic Route */
+#define AL_R 0x04 /* Alarm Route */
+#define T0_R 0x08 /* Timer 0 Route */
+#define T1_R 0x10 /* Timer 1 Route */
+#define PFD 0x20 /* PF Delay Enable */
+#define LBF 0x40 /* Low Battery Flag */
+#define TMSE 0x80 /* Time Save Enable */
+
+#define RTMR (volatile unsigned char * const)(0x01*2+TCP_BASE_ADDRESS)
+ /* Real Time Mode Register */
+#define LY0 0x01 /* Leap Year LSB */
+#define LY1 0x02 /* Leap Year MSB */
+#define H12 0x04 /* 12/!24 Hour Mode */
+#define CSS 0x08 /* Clock Start/!Stop */
+#define IPF 0x10 /* Interrupt PF Operation */
+#define TPF 0x20 /* Timer PF Operation */
+#define XT0 0x40 /* Crystal Frequency LSB */
+#define XT1 0x80 /* Crystal Frequency MSB */
+
+#define OMR (volatile unsigned char * const)(0x02*2+TCP_BASE_ADDRESS)
+ /* Output Mode Register */
+#define TH 0x01 /* T1 Active Hi/!Low */
+#define TP 0x02 /* T1 Push Pull/!Open Drain */
+#define IH 0x04 /* INTR Active Hi/!Low */
+#define IP 0x08 /* INTR Push Pull/!Open Drain */
+#define MH 0x10 /* MFO Active Hi/!Low */
+#define MP 0x20 /* MFO Push Pull/!Open Drain */
+#define MT 0x40 /* MFO Pin as Timer 0 */
+#define MO 0x80 /* MFO Pin as Oscillator */
+
+#define ICR0 (volatile unsigned char * const)(0x03*2+TCP_BASE_ADDRESS)
+ /* Interrupt control Register 0 */
+#define ME 0x01 /* Minutes Enable */
+#define TSE 0x02 /* 10 Second Enable */
+#define SE 0x04 /* Seconds Enable */
+#define HME 0x08 /* 100 Millisec Enable */
+#define TME 0x10 /* 10 Millisec Enable */
+#define OME 0x20 /* Millisec Enable */
+#define T0E 0x40 /* Timer 0 Enable */
+#define T1E 0x80 /* Timer 1 Enable */
+
+#define ICR1 (volatile unsigned char * const)(0x04*2+TCP_BASE_ADDRESS)
+ /* Interrupt control Register 1 */
+#define SCE 0x01 /* Second Compare Enable */
+#define MNE 0x02 /* Minute Compare Enable */
+#define HRE 0x04 /* Hour Compare Enable */
+#define DOME 0x08 /* Day of Month Compare Enable */
+#define MOE 0x10 /* Month Compare Enable */
+#define DOWE 0x20 /* Day of Week Compare Enable */
+#define ALE 0x40 /* Alarm Interrupt Enable */
+#define PFE 0x80 /* Power Fail Interrupt Enable */
+
+
+
+/* ********************************************************* */
+/* Counters: Clock and Calendar (data is stored in BCD) */
+/* ********************************************************* */
+#define HOFS (volatile unsigned char * const)(0x05*2+TCP_BASE_ADDRESS)
+ /* Hundredth of Seconds */
+#define SEC (volatile unsigned char * const)(0x06*2+TCP_BASE_ADDRESS)
+ /* Seconds */
+#define MIN (volatile unsigned char * const)(0x07*2+TCP_BASE_ADDRESS)
+ /* Minutes */
+#define HRS (volatile unsigned char * const)(0x08*2+TCP_BASE_ADDRESS)
+ /* Hours */
+#define DOM (volatile unsigned char * const)(0x09*2+TCP_BASE_ADDRESS)
+ /* Day of Month */
+#define MON (volatile unsigned char * const)(0x0a*2+TCP_BASE_ADDRESS)
+ /* Month */
+#define YR (volatile unsigned char * const)(0x0b*2+TCP_BASE_ADDRESS)
+ /* Year */
+#define JD_LSB (volatile unsigned char * const)(0x0c*2+TCP_BASE_ADDRESS)
+ /* Julian Date (LSB) */
+#define JD_MSM (volatile unsigned char * const)(0x0d*2+TCP_BASE_ADDRESS)
+ /* Julian Date (MSB) */
+#define DOW (volatile unsigned char * const)(0x0e*2+TCP_BASE_ADDRESS)
+ /* Day of week */
+
+
+/* ********************************************************* */
+/* Timer Data Registers */
+/* ********************************************************* */
+#define T0_LSB (volatile unsigned char * const)(0x0f*2+TCP_BASE_ADDRESS)
+ /* Timer 0 LSB */
+#define T0_MSB (volatile unsigned char * const)(0x10*2+TCP_BASE_ADDRESS)
+ /* Timer 0 MSB */
+#define T1_LSB (volatile unsigned char * const)(0x11*2+TCP_BASE_ADDRESS)
+ /* Timer 1 LSB */
+#define T1_MSB (volatile unsigned char * const)(0x12*2+TCP_BASE_ADDRESS)
+ /* Timer 1 MSB */
+
+
+/* ********************************************************* */
+/* Timer Compare RAM */
+/* ********************************************************* */
+#define TC_SEC (volatile unsigned char * const)(0x13*2+TCP_BASE_ADDRESS)
+ /* Seconds Compare RAM */
+#define TC_MIN (volatile unsigned char * const)(0x14*2+TCP_BASE_ADDRESS)
+ /* Minutes Compare RAM */
+#define TC_HRS (volatile unsigned char * const)(0x15*2+TCP_BASE_ADDRESS)
+ /* Hours Compare RAM */
+#define TC_DOM (volatile unsigned char * const)(0x16*2+TCP_BASE_ADDRESS)
+ /* Day of Month Compare RAM */
+#define TC_MON (volatile unsigned char * const)(0x17*2+TCP_BASE_ADDRESS)
+ /* Month Compare RAM */
+#define TC_DOW (volatile unsigned char * const)(0x18*2+TCP_BASE_ADDRESS)
+ /* Day of Week Compare RAM */
+
+
+/* ********************************************************* */
+/* Time Save RAM */
+/* ********************************************************* */
+#define S_SEC (volatile unsigned char * const)(0x19*2+TCP_BASE_ADDRESS)
+ /* Seconds Save RAM */
+#define S_MIN (volatile unsigned char * const)(0x1a*2+TCP_BASE_ADDRESS)
+ /* Minutes Save RAM */
+#define S_HRS (volatile unsigned char * const)(0x1b*2+TCP_BASE_ADDRESS)
+ /* Hours Save RAM */
+#define S_DOM (volatile unsigned char * const)(0x1c*2+TCP_BASE_ADDRESS)
+ /* Day of Month Save RAM */
+#define S_MON (volatile unsigned char * const)(0x1d*2+TCP_BASE_ADDRESS)
+ /* Month Save RAM */
+
+
+/* ********************************************************* */
+/* Miscellaneous Registers */
+/* ********************************************************* */
+ /* rem: 0x1e is general purpose RAM */
+#define TMR (volatile unsigned char * const)(0x1F*2+TCP_BASE_ADDRESS)
+ /* RAM/Test Mode Register */
+
+
+
+/* ********************************************************* */
+/* RAM allocation */
+/* ********************************************************* */
+#define RAM_OSC_FAIL (volatile unsigned char * const)(0x01*2+TCP_BASE_ADDRESS)
+ /* 1: osc. failed time lost */
+#define RAM_POWERUP (volatile unsigned char * const)(0x02*2+TCP_BASE_ADDRESS)
+ /* 1: power was removed and the applied
+ before last TCP init */
+#define RAM_LOWBAT (volatile unsigned char * const)(0x03*2+TCP_BASE_ADDRESS)
+ /* 1: battery voltage is low (2.2V) */
+ /* not valid in single supply mode */
+#define RAM_SINGLE_SUP (volatile unsigned char * const)(0x04*2+TCP_BASE_ADDRESS)
+ /* 1: single supply mode */
+ /* note: single supply mode will be
+ selected when no backup battery is
+ present and/or the first time the
+ system is booted after the loss of
+ backup battery voltage. */
+#define RAM_TCP_FAILURE (volatile unsigned char * const)(0x05*2+TCP_BASE_ADDRESS)
+ /* 1: TCP failed to start oscillating */
+
+
+/* ********************************************************* */
+/* TCP data structures */
+/* ********************************************************* */
+
+struct clock_counters {
+ unsigned char hofs;
+ unsigned char d0; /* the dx's are place holders since */
+ unsigned char sec; /* the TCP is addressable only on */
+ unsigned char d1; /* odd addresses. */
+ unsigned char min;
+ unsigned char d2;
+ unsigned char hrs;
+ unsigned char d3;
+ unsigned char dom;
+ unsigned char d4;
+ unsigned char mon;
+ unsigned char d5;
+ unsigned char yr;
+ unsigned char d6;
+ unsigned char jd0;
+ unsigned char d7;
+ unsigned char jd1;
+ unsigned char d8;
+ unsigned char dow;
+};
+
+extern struct clock_ram * const tcp_power_up;
+
+struct clock_ram {
+ unsigned char sec;
+ unsigned char d0; /* the dx's are place holders since */
+ unsigned char min; /* the TCP is addressable only on */
+ unsigned char d1; /* odd addresses. */
+ unsigned char hrs;
+ unsigned char d2;
+ unsigned char dom;
+ unsigned char d3;
+ unsigned char mon;
+};
+
+extern struct clock_ram * const tcp_power_up;
+extern struct clock_ram * const tcp_power_down;
+extern struct clock_counters * const tcp_clock;
+extern struct clock_ram * const tcp_save_ram;
+
+void tcp_init(void);
+
+#endif /* _DP8570A_H_ */
diff --git a/c/src/lib/libbsp/m68k/efi68k/include/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/include/Makefile.in
new file mode 100644
index 0000000000..f4db4743ed
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/include/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/efi68k.h $(srcdir)/16550.h \
+ $(srcdir)/DP8570A.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/efi68k/include/bsp.h b/c/src/lib/libbsp/m68k/efi68k/include/bsp.h
new file mode 100644
index 0000000000..0c9e1c11ee
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/include/bsp.h
@@ -0,0 +1,170 @@
+/* bsp.h
+ *
+ * This include file contains all efi68k board IO definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EFI68K_BSP_h
+#define __EFI68K_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+#include <efi68k.h>
+#include <DP8570A.h>
+#include <16550.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ */
+
+/* XXX - JRS - I want to compile the tmtests */
+
+#define MUST_WAIT_FOR_INTERRUPT 1
+
+#define Install_tm27_vector( handler )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { register rtems_unsigned32 _delay=(microseconds); \
+ register rtems_unsigned32 _tmp=123; \
+ asm volatile( "0: \
+ nbcd %0 ; \
+ nbcd %0 ; \
+ dbf %1,0b" \
+ : "=d" (_tmp), "=d" (_delay) \
+ : "0" (_tmp), "1" (_delay) ); \
+ }
+
+/* externals */
+
+extern char _endtext[];
+extern char _sdata[];
+extern char _edata[];
+extern char __bss_start[];
+extern char _end[];
+extern char _copy_data_from_rom[];
+extern char __end_of_ram[];
+
+/* constants */
+
+#define RAM_END ((int)__end_of_ram)
+
+#ifdef __START_C__
+#define STACK_SIZE "#0x800"
+#else
+#define STACK_SIZE 0x800
+#endif
+
+/* macros */
+
+#define RAW_PUTS(str) \
+ { register char *ptr = str; \
+ while (*ptr) outbyte(*ptr++); \
+ }
+
+#define RAW_PUTI(n) { \
+ register int i, j; \
+ \
+ RAW_PUTS("0x"); \
+ for (i=28;i>=0;i -= 4) { \
+ j = (n>>i) & 0xf; \
+ outbyte( (j>9 ? j-10+'a' : j+'0') ); \
+ } \
+ }
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+extern int stack_size;
+
+extern int stack_start;
+
+extern rtems_unsigned32 Timer_interrupts;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+void console_init(void);
+
+void watch_dog_init(void);
+
+void tcp_init(void);
+
+void Spurious_Initialize(void);
+
+void _UART_flush(void);
+
+void Clock_exit(void);
+
+void outbyte(char);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/efi68k/include/coverhd.h b/c/src/lib/libbsp/m68k/efi68k/include/coverhd.h
new file mode 100644
index 0000000000..48d824e5f4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/include/coverhd.h
@@ -0,0 +1,106 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#endif
diff --git a/c/src/lib/libbsp/m68k/efi68k/include/efi68k.h b/c/src/lib/libbsp/m68k/efi68k/include/efi68k.h
new file mode 100644
index 0000000000..6aa16ce3c0
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/include/efi68k.h
@@ -0,0 +1,34 @@
+/* efi68k.h
+ *
+ * $Id$
+ */
+
+#ifndef _EFI68k_H_
+#define _EFI68k_H_
+
+
+/* interrupt levels */
+#define WD_ISR_LEVEL 1
+#define TCP_ISR_LEVEL 4
+#define UART_ISR_LEVEL 6
+#define INTR7 7
+
+
+/* macro/function definitions */
+#if 0
+/*
+ * This prototype really should have the noreturn attribute but
+ * that causes a warning since it appears that the routine does
+ * return.
+ *
+ * void dumby_start () __attribute__ ((noreturn));
+ */
+
+static void reboot(void);
+__inline__ static void reboot() {asm("trap #15");}
+#else
+#define reboot() do {asm("trap #15");} while(0)
+#endif
+
+
+#endif /* _EFI68k_H_ */
diff --git a/c/src/lib/libbsp/m68k/efi68k/spurious/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/spurious/Makefile.in
new file mode 100644
index 0000000000..3c7819fce4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/spurious/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/spurious.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=spinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi68k/spurious/spinit.c b/c/src/lib/libbsp/m68k/efi68k/spurious/spinit.c
new file mode 100644
index 0000000000..2ae1346be2
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/spurious/spinit.c
@@ -0,0 +1,85 @@
+/* Spurious_driver
+ *
+ * This routine installs spurious interrupt handlers for the efi68k.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <stdio.h>
+
+const char * const _Spurious_Error_[] = {"Reset","Bus Error","Address Error",
+ "Illegal Instruction","Zero Division","CHK, CHK2 Instruction",
+ "TRAPcc, TRAPV Instruction","Privilege Violation","Trace",
+ "Line 1010 Emulation","Line 1111 Emulation","Hardware Breakpoint",
+ "Coprocessor Protocal Violation",
+ "Format Error ans Uninitialized Interrupt","Unassigned",
+ "Spurious Interrupt","AVec1","AVec2","AVec3","AVec4","AVec5","AVec6",
+ "AVec7","Trap Instruction","Debug","Reboot","Reserved Coprocessor",
+ "Reserved Unassigned","User Defined"};
+
+rtems_isr Spurious_Isr(
+ rtems_vector_number vector
+)
+{
+ int sp = 0;
+ const char * const VectDescrip[] = {
+ _Spurious_Error_[0], _Spurious_Error_[0], _Spurious_Error_[1],
+ _Spurious_Error_[2], _Spurious_Error_[3], _Spurious_Error_[4],
+ _Spurious_Error_[5], _Spurious_Error_[6], _Spurious_Error_[7],
+ _Spurious_Error_[8], _Spurious_Error_[9], _Spurious_Error_[10],
+ _Spurious_Error_[11], _Spurious_Error_[12], _Spurious_Error_[13],
+ _Spurious_Error_[13], _Spurious_Error_[14], _Spurious_Error_[14],
+ _Spurious_Error_[14], _Spurious_Error_[14], _Spurious_Error_[14],
+ _Spurious_Error_[14], _Spurious_Error_[14], _Spurious_Error_[14],
+ _Spurious_Error_[15], _Spurious_Error_[16], _Spurious_Error_[17],
+ _Spurious_Error_[18], _Spurious_Error_[19], _Spurious_Error_[20],
+ _Spurious_Error_[21], _Spurious_Error_[22], _Spurious_Error_[23],
+ _Spurious_Error_[24], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[23],
+ _Spurious_Error_[23], _Spurious_Error_[23], _Spurious_Error_[25],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[26],
+ _Spurious_Error_[26], _Spurious_Error_[26], _Spurious_Error_[27],
+ _Spurious_Error_[27], _Spurious_Error_[27], _Spurious_Error_[27],
+ _Spurious_Error_[27], _Spurious_Error_[28]};
+
+ asm volatile ( "movea.l %%sp,%0 " : "=a" (sp) : "0" (sp) );
+
+ _CPU_ISR_Set_level( 7 );
+ _UART_flush();
+
+ RAW_PUTS("\n\rRTEMS: Spurious interrupt: ");
+ RAW_PUTS((char *)VectDescrip[( (vector>64) ? 64 : vector )]);
+ RAW_PUTS("\n\rRTEMS: Vector: ");
+ RAW_PUTI(vector);
+ RAW_PUTS(" sp: ");
+ RAW_PUTI(sp);
+ RAW_PUTS("\n\r");
+
+ bsp_cleanup();
+
+ for(;;);
+}
+
+void Spurious_Initialize(void)
+{
+ rtems_vector_number vector;
+
+ for ( vector = 0x0 ; vector <= 0xFF ; vector++ )
+ (void) set_vector( Spurious_Isr, vector, 1 );
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/start/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/start/Makefile.in
new file mode 100644
index 0000000000..1351c0e4e5
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/start/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/start68k.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=start68k
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/m68k/efi68k/start/start.c b/c/src/lib/libbsp/m68k/efi68k/start/start.c
new file mode 100644
index 0000000000..eaf15df758
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/start/start.c
@@ -0,0 +1,71 @@
+/*
+ * $Id$
+ */
+
+#include <efi68k.h>
+#define __START_C__
+#include "bsp.h"
+
+m68k_isr_entry M68Kvec[256];
+m68k_isr_entry vectors[256];
+char * const __argv[]= {"main", ""};
+char * const __env[]= {""};
+
+int main(const int argc, char * const argv[], char * const env[]);
+
+/*
+ * This prototype really should have the noreturn attribute but
+ * that causes a warning since it appears that the routine does
+ * return.
+ *
+ * void dumby_start () __attribute__ ((noreturn));
+ */
+
+void dumby_start ();
+void dumby_start() {
+
+ /* We need to by-pass the link instruction since the RAM chip-
+ select pins are not yet configured. */
+ asm volatile ( ".global start ;
+ start:");
+
+ /* disable interrupts, load stack pointer */
+ asm volatile ( "oriw #0x0700, %sr;
+ movel #_end, %d0;
+ addl " STACK_SIZE ",%d0;
+ movel %d0,%sp;
+ link %a6, #0"
+ );
+ /*
+ * Initialize RAM by copying the .data section out of ROM (if
+ * needed) and "zero-ing" the .bss section.
+ */
+ {
+ register char *src = _endtext;
+ register char *dst = _sdata;
+
+ if (_copy_data_from_rom)
+ /* ROM has data at end of text; copy it. */
+ while (dst < _edata)
+ *dst++ = *src++;
+
+ /* Zero bss */
+ for (dst = __bss_start; dst< _end; dst++)
+ *dst = 0;
+ }
+
+ /*
+ * Initalize the board.
+ */
+ Spurious_Initialize();
+ console_init();
+ watch_dog_init();
+ tcp_init();
+
+ /*
+ * Execute main with arguments argv and environment env
+ */
+ main(1, __argv, __env);
+
+ reboot();
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/start68k/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/start68k/Makefile.in
new file mode 100644
index 0000000000..1351c0e4e5
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/start68k/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/start68k.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=start68k
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/m68k/efi68k/start68k/start68k.c b/c/src/lib/libbsp/m68k/efi68k/start68k/start68k.c
new file mode 100644
index 0000000000..eaf15df758
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/start68k/start68k.c
@@ -0,0 +1,71 @@
+/*
+ * $Id$
+ */
+
+#include <efi68k.h>
+#define __START_C__
+#include "bsp.h"
+
+m68k_isr_entry M68Kvec[256];
+m68k_isr_entry vectors[256];
+char * const __argv[]= {"main", ""};
+char * const __env[]= {""};
+
+int main(const int argc, char * const argv[], char * const env[]);
+
+/*
+ * This prototype really should have the noreturn attribute but
+ * that causes a warning since it appears that the routine does
+ * return.
+ *
+ * void dumby_start () __attribute__ ((noreturn));
+ */
+
+void dumby_start ();
+void dumby_start() {
+
+ /* We need to by-pass the link instruction since the RAM chip-
+ select pins are not yet configured. */
+ asm volatile ( ".global start ;
+ start:");
+
+ /* disable interrupts, load stack pointer */
+ asm volatile ( "oriw #0x0700, %sr;
+ movel #_end, %d0;
+ addl " STACK_SIZE ",%d0;
+ movel %d0,%sp;
+ link %a6, #0"
+ );
+ /*
+ * Initialize RAM by copying the .data section out of ROM (if
+ * needed) and "zero-ing" the .bss section.
+ */
+ {
+ register char *src = _endtext;
+ register char *dst = _sdata;
+
+ if (_copy_data_from_rom)
+ /* ROM has data at end of text; copy it. */
+ while (dst < _edata)
+ *dst++ = *src++;
+
+ /* Zero bss */
+ for (dst = __bss_start; dst< _end; dst++)
+ *dst = 0;
+ }
+
+ /*
+ * Initalize the board.
+ */
+ Spurious_Initialize();
+ console_init();
+ watch_dog_init();
+ tcp_init();
+
+ /*
+ * Execute main with arguments argv and environment env
+ */
+ main(1, __argv, __env);
+
+ reboot();
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/startup/Makefile.in
new file mode 100644
index 0000000000..3a9c96f2b2
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspstart bspclean efi68k_tcp efi68k_wd sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/bspclean.c b/c/src/lib/libbsp/m68k/efi68k/startup/bspclean.c
new file mode 100644
index 0000000000..7d165c208e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/bspclean.c
@@ -0,0 +1,28 @@
+/* bsp_cleanup()
+ *
+ * This routine cleans up in the sense that it places the board
+ * in a safe state and flushes the I/O buffers before exiting.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+void bsp_cleanup(void)
+{
+ /* interrupt driven stdio must be flushed */
+ _CPU_ISR_Set_level( 7 );
+ _UART_flush();
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/bspstart.c b/c/src/lib/libbsp/m68k/efi68k/startup/bspstart.c
new file mode 100644
index 0000000000..37341ce248
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/bspstart.c
@@ -0,0 +1,236 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+rtems_unsigned32 Timer_interrupts;
+
+extern void set_debug_traps(void);
+extern void breakpoint(void);
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+/* extern int end; */
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) BSP_Configuration.work_space_start +
+ (rtems_unsigned32) BSP_Configuration.work_space_size;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ if (heap_start > (rtems_unsigned32) RAM_END) {
+ /* rtems_fatal_error_occurred can not be used before initalization */
+ RAW_PUTS("\n\rRTEMS: Out of memory.\n\r");
+ RAW_PUTS("RTEMS: Check RAM_END and the size of the work space.\n\r");
+ }
+
+ RTEMS_Malloc_Initialize((void *) heap_start,
+ (RAM_END - heap_start), 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ void *vbr;
+
+/* set_debug_traps(); */
+/* breakpoint(); */
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook;
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ m68k_get_vbr( vbr );
+ Cpu_table.interrupt_vector_table = vbr;
+
+ Cpu_table.interrupt_stack_size = 0;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ (((unsigned int)_end + STACK_SIZE + 0x100) & 0xffffff00);
+
+ /*
+ * Add 1 region for Malloc in libc_low
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ /* Clock_exit is done as an atexit() function */
+
+/* exit: */
+ /* configure peripherals for safe exit */
+ bsp_cleanup();
+
+ /* return like a "normal" subroutine to the monitor */
+ return 0;
+}
+
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/efi68k_tcp.c b/c/src/lib/libbsp/m68k/efi68k/startup/efi68k_tcp.c
new file mode 100644
index 0000000000..6173f6d706
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/efi68k_tcp.c
@@ -0,0 +1,238 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * This file contains the subroutines necessary to initalize
+ * the DP8750A TCP on the efi68k board.
+ *
+ * This file has been created by John S. Gwynne for the efi68k
+ * project.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+/* define tcp struct pointers */
+struct clock_ram * const tcp_power_up =
+ (struct clock_ram * const)(0x16*2+TCP_BASE_ADDRESS);
+
+struct clock_ram * const tcp_power_down =
+ (struct clock_ram * const)(0x1b*2+TCP_BASE_ADDRESS);
+
+struct clock_counters * const tcp_clock =
+ (struct clock_counters * const)(0x05*2+TCP_BASE_ADDRESS);
+
+struct clock_ram * const tcp_save_ram =
+ (struct clock_ram * const)(0x19*2+TCP_BASE_ADDRESS);
+
+#define X_DELAY 300 /* time-out delay for crystal start */
+#define X1_DELAY 100000
+
+void tcp_delay(int count)
+{
+ int i;
+ /* change latter to use a counter !!! */
+ for (i=0;i<count/4;i++);
+}
+
+void tcp_init()
+{
+ unsigned char low_bat, osc_fail, power_up;
+ unsigned char mon, dom, hrs, min, sec;
+ int i, count;
+
+ /* delay about 60us to ensure TCP is not locked-out */
+ tcp_delay(80);
+
+ /* set normal supply mode and reset test mode bit */
+ *MSR = 0;
+ *PFR = 0;
+
+ /* save oscillator failure condition */
+ *MSR = 0; /* set RS and PS to zero */
+ osc_fail = (*PFR & OSF ? 1 : 0);
+ *MSR = PS;
+ *RAM_OSC_FAIL = *RAM_OSC_FAIL || osc_fail;
+
+ *MSR = PS;
+ if (*RAM_OSC_FAIL) {
+ power_up = 1;
+ *MSR = PS;
+ *RAM_POWERUP = power_up;
+ /* clear time counters and power up & down ram */
+ *MSR = 0;
+ tcp_clock->hofs = 0;
+ tcp_clock->sec = 0;
+ tcp_clock->min = 0;
+ tcp_clock->hrs = 0;
+ tcp_clock->dom = 1;
+ tcp_clock->mon = 1;
+ tcp_clock->yr = 0x95;
+ tcp_clock->jd0 = 0x01;
+ tcp_clock->jd1 = 0;
+ tcp_clock->dow = 1;
+ *MSR = PS;
+ tcp_power_up->sec = 0;
+ tcp_power_up->min = 0;
+ tcp_power_up->hrs = 0;
+ tcp_power_up->dom = 0;
+ tcp_power_up->mon = 0;
+ tcp_power_down->sec = 0;
+ tcp_power_down->min = 0;
+ tcp_power_down->hrs = 0;
+ tcp_power_down->dom = 0;
+ tcp_power_down->mon = 0;
+ } else {
+ /* save for power-up test */
+ *MSR = 0;
+ power_up = (*IRR & TMSE ? 0 : 1);
+ *MSR = PS;
+ *RAM_POWERUP = power_up;
+
+ /* update tcp_power_up and tcp_power_down on power up */
+ if (power_up) {
+ *MSR = 0;
+ do {
+ *PFR;
+ sec = tcp_clock->sec;
+ min = tcp_clock->min;
+ hrs = tcp_clock->hrs;
+ dom = tcp_clock->dom;
+ mon = tcp_clock->mon;
+ } while (*PFR & R_1S);
+ *MSR = PS;
+ tcp_power_up->sec = sec;
+ tcp_power_up->min = min;
+ tcp_power_up->hrs = hrs;
+ tcp_power_up->dom = dom;
+ tcp_power_up->mon = ( (((mon>>4)*10)+(mon&0xf))>12 ? 0 : mon );
+ *MSR = 0; /* save ram is not running */
+ sec = tcp_save_ram->sec;
+ min = tcp_save_ram->min;
+ hrs = tcp_save_ram->hrs;
+ dom = tcp_save_ram->dom;
+ mon = tcp_save_ram->mon;
+ *MSR = PS;
+ tcp_power_down->sec = sec;
+ tcp_power_down->min = min;
+ tcp_power_down->hrs = hrs;
+ tcp_power_down->dom = dom;
+ tcp_power_down->mon = ( (((mon>>4)*10)+(mon&0xf))>12 ? 0 : mon );
+ }
+ }
+
+ /* load interrupt routing reg. PF must be enabled to test
+ for low battery, but I route it to MFO to avoid any
+ potential problems */
+ *MSR = 0;
+ *IRR = PF_R | TMSE;
+
+ /* initialize the output mode register */
+ *MSR = RS;
+ *OMR = IP | MP | MO; /* INTR active low and push/pull */
+
+ /* initialize interrupt control reg 0 */
+ *MSR = RS;
+ *ICR0 = 0; /* disable all interrupts */
+
+ /* initialize interrupt control reg 1 */
+ *MSR = RS;
+ *ICR1 = PFE; /* this also enables the low battery
+ detection circuit. */
+
+ /* I had trouble getting the tcp to be completely
+ flexible to supply modes (i.e., automatically
+ selecting single or normal battery backup modes based
+ on inputs at power-up. If single supply mode is
+ selected, the low battery detect is disabled and the
+ low battery detect in normal mode does not seem to
+ detect when no battery is present at all. If normal
+ mode is selected and no battery is present, the
+ crystal will stop, but only if reset after
+ power-up. It would seem that after a power-up reset,
+ with no battery, the chip may automaticlly switch to
+ single supply mode which disables the low battery
+ detection circuit.) The following software tests
+ works for all permiatations of low batt, reset,
+ power-on reset, battery, no battery, battery on after
+ Vcc,.... *except* for battery switched on for the
+ first time before power up in which case the chip
+ will still be in single suppy mode till restarted (a
+ second call to tcp_init such as when the time is set
+ or a reboot.) The timer/clock itself should always
+ be completely functional regardless of the supply
+ mode. */
+
+
+ /* initialize the real time mode register */
+ /* note: write mode bits *before* CSS, then set CSS */
+ *MSR = 0; /* clear roll-over */
+ *PFR;
+ count=1;
+ for (i=0;i<X_DELAY;i++) { /* loop till xtal starts */
+ *MSR = RS;
+ *RTMR = (*RTMR & (LY0 | LY1 )) | CSS;
+ *MSR = 0;
+ if (*PFR & R_1MS)
+ if (!(count--)) break;
+ }
+ if (i>=X_DELAY) {
+ {
+ /* xtal didn't start; try single supply mode */
+ *MSR = 0; /* single supply */
+ *PFR = OSF;
+ *MSR = 0; /* clear roll-over */
+ *PFR;
+ count=1;
+ for (i=0;i<X1_DELAY;i++) { /* loop till xtal starts */
+ *MSR = RS;
+ *RTMR = (*RTMR & (LY0 | LY1 )) | CSS;
+ *MSR = 0;
+ if (*PFR & R_1MS)
+ if (!(count--)) break;
+ }
+ if (i>=X1_DELAY) {
+ /* xtal didn't start; fail tcp */
+ *MSR = PS;
+ *RAM_TCP_FAILURE = 1;
+ *MSR = PS;
+ *RAM_SINGLE_SUP=1;
+ } else {
+ *MSR = PS;
+ *RAM_TCP_FAILURE = 0;
+ *MSR = PS;
+ *RAM_SINGLE_SUP=1;
+ }
+ }
+ } else {
+ *MSR = PS;
+ *RAM_TCP_FAILURE = 0;
+ *MSR = PS;
+ *RAM_SINGLE_SUP=0;
+ }
+
+ /* wait for low battery detection circuit to stabalize */
+ tcp_delay(1000);
+
+ /* battery test */
+ *MSR = 0;
+ low_bat = (*IRR & LBF ? 1 : 0 );
+ *MSR = PS;
+ *RAM_LOWBAT = low_bat & !(*RAM_SINGLE_SUP);
+
+ /* reset pending interrupts */
+ *MSR = ( PER | AL | T0 | T1 );
+
+ /* resync the time save ram with the clock */
+ tcp_save_ram->sec = 0;
+ tcp_save_ram->min = 0;
+ tcp_save_ram->hrs = 0;
+ tcp_save_ram->dom = 0;
+ tcp_save_ram->mon = 0;
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/efi68k_wd.c b/c/src/lib/libbsp/m68k/efi68k/startup/efi68k_wd.c
new file mode 100644
index 0000000000..78c3d1e00a
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/efi68k_wd.c
@@ -0,0 +1,45 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * This file contains the subroutines necessary to initalize
+ * and maintain the MAX791 based watchdog timer used on efi68k
+ *
+ * This file has been created by John S. Gwynne for the efi68k
+ * project.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+#include <bsp.h>
+
+void wd_interrupt(void) {
+ /* toggle WDI of the MAX791. A more sophisticated routine
+ can be inserted into the exception table after booting. */
+
+ /* 3 changes guaranty a pulse independent of initial state */
+ *MCR |= OUT1;
+ *MCR &= ~OUT1;
+ *MCR |= OUT1;
+}
+
+/* _catchWDint is the interrupt front-end */
+extern void _catchWDint();
+asm(" .text
+ .align 2
+ .globl _catchWDint
+_catchWDint:
+ lea %sp@(4),%sp /* pop return address */
+ moveml %d0-%d7/%a0-%a6,%sp@- /* save registers */
+ jbsr wd_interrupt
+ moveml %sp@+,%d0-%d7/%a0-%a6
+ rte
+ ");
+
+void watch_dog_init(void) {
+ set_vector(_catchWDint, WD_ISR_LEVEL+24, 0);
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/linkcmds b/c/src/lib/libbsp/m68k/efi68k/startup/linkcmds
new file mode 100644
index 0000000000..b980d87502
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/linkcmds
@@ -0,0 +1,109 @@
+/* linkcmds
+ *
+ * $Id$
+ */
+
+OUTPUT_ARCH(m68k)
+__DYNAMIC = 0;
+
+/*
+ * The memory map looks like this:
+ * +--------------------+ <- low memory
+ * | .text |
+ * | etext |
+ * | ctor list | the ctor and dtor lists are for
+ * | dtor list | C++ support
+ * | _endtext |
+ * +--------------------+
+ * | .data | initialized data goes here
+ * | _sdata |
+ * | _edata |
+ * +--------------------+
+ * | .bss |
+ * | __bss_start | start of bss, cleared by crt0
+ * | _end | start of heap, used by sbrk()
+ * +--------------------+
+ * | heap space |
+ * | _ENDHEAP |
+ * | stack space |
+ * | __stack | top of stack
+ * +--------------------+ <- high memory
+ */
+
+
+/*
+ * User modifiable values:
+ *
+ * _VBR location of VBR table
+ */
+
+MEMORY
+{
+ ram : ORIGIN = 0x203000, LENGTH = 256K
+}
+
+_VBR = 0x200000; /* location of the VBR table (in RAM) */
+__end_of_ram = 0x240000;
+_copy_data_from_rom = 0;
+
+/*
+ * stick everything in ram (of course)
+ */
+SECTIONS
+{
+ .text :
+ {
+ CREATE_OBJECT_SYMBOLS
+ text_start = .;
+ _text_start = .;
+ *(.text)
+ etext = ALIGN(0x10);
+ _etext = .;
+ __CTOR_LIST__ = .;
+ LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
+ *(.ctors)
+ LONG(0)
+ __CTOR_END__ = .;
+ __DTOR_LIST__ = .;
+ LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
+ *(.dtors)
+ LONG(0)
+ __DTOR_END__ = .;
+ *(.lit)
+ *(.shdata)
+ _endtext = .;
+ } > ram
+ .data :
+ {
+ data_start = .;
+ _data_start = .;
+ _sdata = . ;
+ *(.data)
+ CONSTRUCTORS
+ edata = ALIGN(0x10);
+ _edata = .;
+ } > ram
+ .shbss :
+ {
+ *(.shbss)
+ } > ram
+ .bss :
+ {
+ __bss_start = ALIGN(0x8);
+ bss_start = .;
+ _bss_start = .;
+ *(.bss)
+ *(COMMON)
+ end = .;
+ _end = ALIGN(0x8);
+ __end = ALIGN(0x8);
+ } > ram
+ .stab . (NOLOAD) :
+ {
+ [ .stab ]
+ }
+ .stabstr . (NOLOAD) :
+ {
+ [ .stabstr ]
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/m68k-stub.c b/c/src/lib/libbsp/m68k/efi68k/startup/m68k-stub.c
new file mode 100644
index 0000000000..a37cd2dc83
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/m68k-stub.c
@@ -0,0 +1,782 @@
+/* m68k-stub.c
+ *
+ * $Id$
+ */
+
+#include <efi68k.h>
+#include <rtems.h>
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+
+void (*exceptionHook)() = 0;
+
+void outbyte(char c);
+char putDebugChar( char c)
+{
+ outbyte(c);
+ return c;
+}
+
+char inbyte(void);
+char getDebugChar(void)
+{
+ return inbyte();
+}
+
+void flush_i_cache(void)
+{
+ return;
+}
+
+void *memset(void *p, int c, int n)
+{
+ register int i;
+ void *s=p;
+
+ for (i=0;i<n;i++) *((char *)p)++=(char)c;
+ return s;
+}
+
+char *db_strcpy(char *s, const char *t)
+{
+ char *save=s;
+ while((*s++ = *t++) != '\0');
+ return save;
+}
+
+int db_strlen(const char *s)
+{
+ int n;
+
+ for (n=0; *s!='\0'; s++) n++;
+ return n;
+}
+
+/************************************************************************
+ *
+ * external low-level support routines
+ */
+typedef void (*ExceptionHook)(int); /* pointer to function with int parm */
+typedef void (*Function)(); /* pointer to a function */
+
+/* extern Function exceptionHandler(); */ /* assign an exception handler */
+extern ExceptionHook exceptionHook; /* hook variable for errors/exceptions */
+/* extern void exceptionHandler(int vect, void (*function)()); */
+
+/************************/
+/* FORWARD DECLARATIONS */
+/************************/
+static void initializeRemcomErrorFrame();
+
+/************************************************************************/
+/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
+/* at least NUMREGBYTES*2 are needed for register packets */
+#define BUFMAX 400
+
+static char initialized; /* boolean flag. != 0 means we've been initialized */
+
+int remote_debug;
+/* debug > 0 prints ill-formed commands in valid packets & checksum errors */
+
+static const char hexchars[]="0123456789abcdef";
+
+/* there are 180 bytes of registers on a 68020 w/68881 */
+/* many of the fpa registers are 12 byte (96 bit) registers */
+#define NUMREGBYTES 180
+enum regnames {D0,D1,D2,D3,D4,D5,D6,D7,
+ A0,A1,A2,A3,A4,A5,A6,A7,
+ PS,PC,
+ FP0,FP1,FP2,FP3,FP4,FP5,FP6,FP7,
+ FPCONTROL,FPSTATUS,FPIADDR
+ };
+
+
+
+typedef struct FrameStruct
+{
+ struct FrameStruct *previous;
+ int exceptionPC; /* pc value when this frame created */
+ int exceptionVector; /* cpu vector causing exception */
+ short frameSize; /* size of cpu frame in words */
+ short sr; /* for 68000, this not always sr */
+ int pc;
+ short format;
+ int fsaveHeader;
+ int morejunk[0]; /* exception frame, fp save... */
+} Frame;
+
+#define FRAMESIZE 10
+int gdbFrameStack[FRAMESIZE];
+static Frame *lastFrame;
+
+/*
+ * these should not be static cuz they can be used outside this module
+ */
+int registers[NUMREGBYTES/4];
+int superStack;
+
+#define STACKSIZE 600
+int remcomStack[STACKSIZE/sizeof(int)];
+static int* stackPtr = &remcomStack[STACKSIZE/sizeof(int) - 1];
+
+static ExceptionHook oldExceptionHook;
+
+#define SAVE_FP_REGS()
+#define RESTORE_FP_REGS()
+
+void return_to_super();
+void return_to_user();
+
+asm("
+.text
+.align 2
+.globl return_to_super
+return_to_super:
+ oriw #0x0700,%sr
+ movel registers+60,%sp /* get new stack pointer */
+ movel lastFrame,%a0 /* get last frame info */
+ bra return_to_any
+
+.globl return_to_user
+return_to_user:
+ oriw #0x0700,%sr
+ movel registers+60,%a0 /* get usp */
+ movel %a0,%usp /* set usp */
+ movel superStack,%sp /* get original stack pointer */
+
+return_to_any:
+ movel lastFrame,%a0 /* get last frame info */
+ movel %a0@+,lastFrame /* link in previous frame */
+ addql #8,%a0 /* skip over pc, vector#*/
+ movew %a0@+,%d0 /* get # of words in cpu frame */
+ addw %d0,%a0 /* point to end of data */
+ addw %d0,%a0 /* point to end of data */
+ movel %a0,%a1
+#
+# copy the stack frame
+ subql #1,%d0
+copyUserLoop:
+ movew %a1@-,%sp@-
+ dbf %d0,copyUserLoop
+");
+ RESTORE_FP_REGS()
+ asm(" moveml registers,%d0-%d7/%a0-%a6");
+ asm(" rte"); /* pop and go! */
+
+#define DISABLE_INTERRUPTS() asm(" oriw #0x0700,%sr");
+#define BREAKPOINT() asm(" trap #1");
+
+/* this function is called immediately when a level 7 interrupt occurs */
+/* if the previous interrupt level was 7 then we're already servicing */
+/* this interrupt and an rte is in order to return to the debugger. */
+/* For the 68000, the offset for sr is 6 due to the jsr return address */
+asm("
+.text
+.align 2
+.globl _debug_level7
+_debug_level7:
+ movew %d0,%sp@-");
+asm(" movew %sp@(6),%d0");
+
+asm(" andiw #0x700,%d0
+ cmpiw #0x700,%d0
+ beq already7
+ movew %sp@+,%d0
+ bra _catchException
+already7:
+ movew %sp@+,%d0");
+asm(" lea %sp@(4),%sp"); /* pull off 68000 return address */
+
+asm(" rte");
+
+extern void _catchException ();
+
+/* This function is called when an exception occurs. It translates the
+ * return address found on the stack into an exception vector # which
+ * is then handled by either handle_exception or a system handler.
+ * _catchException provides a front end for both.
+ *
+ * stack on entry: stack on exit:
+ * Program counter MSWord exception # MSWord
+ * Program counter LSWord exception # MSWord
+ * Status Register
+ * Return Address MSWord
+ * Return Address LSWord
+ */
+
+asm("
+.text
+.align 2
+.globl _catchException
+_catchException:
+");
+DISABLE_INTERRUPTS();
+asm("
+ moveml %d0-%d7/%a0-%a6,registers /* save registers */
+ movel lastFrame,%a0 /* last frame pointer */
+
+ move.b #64,(0x00600001)
+ move.b (0x00600007),%d0
+ andib #-64,%d0
+ move.b %d0,(0x00600007)
+
+");
+SAVE_FP_REGS();
+asm("
+ lea registers,%a5 /* get address of registers */
+ movel %sp@+,%d2 /* pop return address */
+ addq.l #6,%d2
+ sub.l #0x200000,%d2
+ divs #6,%d2
+/* addl #1530,%d2 */ /* convert return addr to */
+/* divs #6,%d2 */ /* exception number */
+ extl %d2
+
+ moveql #3,%d3 /* assume a three word frame */
+
+ cmpiw #3,%d2 /* bus error or address error ? */
+ bgt normal /* if >3 then normal error */
+ movel %sp@+,%a0@- /* copy error info to frame buff*/
+ movel %sp@+,%a0@- /* these are never used */
+ moveql #7,%d3 /* this is a 7 word frame */
+
+normal:
+ movew %sp@+,%d1 /* pop status register */
+ movel %sp@+,%a4 /* pop program counter */
+ movew %d1,%a5@(66) /* save sr */
+ movel %a4,%a5@(68) /* save pc in _regisers[] */
+ movel %a4,%a0@- /* copy pc to frame buffer */
+ movew %d1,%a0@- /* copy sr to frame buffer */
+
+ movel %sp,superStack /* save supervisor sp */
+
+ andiw #0x2000,%d1 /* were we in supervisor mode ? */
+ beq userMode
+ movel %a7,%a5@(60) /* save a7 */
+ bra saveDone
+userMode:
+ movel %usp,%a1 /* save user stack pointer */
+ movel %a1,%a5@(60) /* save user stack pointer */
+saveDone:
+
+ movew %d3,%a0@- /* push frame size in words */
+ movel %d2,%a0@- /* push vector number */
+ movel %a4,%a0@- /* push exception pc */
+
+#
+# save old frame link and set the new value
+ movel lastFrame,%a1 /* last frame pointer */
+ movel %a1,%a0@- /* save pointer to prev frame */
+ movel %a0,lastFrame
+
+ movel %d2,%sp@- /* push exception num */
+ movel exceptionHook,%a0 /* get address of handler */
+ jbsr %a0@ /* and call it */
+ clrl %sp@ /* replace exception num parm with frame ptr*/
+ jbsr _returnFromException /* jbsr, but never returns */
+");
+
+
+/*
+ * remcomHandler is a front end for handle_exception. It moves the
+ * stack pointer into an area reserved for debugger use in case the
+ * breakpoint happened in supervisor mode.
+ */
+asm("remcomHandler:");
+asm(" addl #4,%sp"); /* pop off return address */
+asm(" movel %sp@+,%d0"); /* get the exception number */
+asm(" movel stackPtr,%sp"); /* move to remcom stack area */
+asm(" movel %d0,%sp@-"); /* push exception onto stack */
+asm(" andiw #0xf8ff,%sr");
+asm(" jbsr handle_exception"); /* this never returns */
+asm(" rts"); /* return */
+
+void _returnFromException( Frame *frame )
+{
+ /* if no passed in frame, use the last one */
+ if (! frame)
+ {
+ frame = lastFrame;
+ frame->frameSize = 4;
+ frame->format = 0;
+ frame->fsaveHeader = -1; /* restore regs, but we dont have fsave info*/
+ }
+
+
+ /* a 68000 cannot use the internal info pushed onto a bus error
+ * or address error frame when doing an RTE so don't put this info
+ * onto the stack or the stack will creep every time this happens.
+ */
+ frame->frameSize=3;
+
+
+ /* throw away any frames in the list after this frame */
+ lastFrame = frame;
+
+ frame->sr = registers[(int) PS];
+ frame->pc = registers[(int) PC];
+
+ if (registers[(int) PS] & 0x2000)
+ {
+ /* return to supervisor mode... */
+ return_to_super();
+ }
+ else
+ { /* return to user mode */
+ return_to_user();
+ }
+}
+
+int hex(ch)
+char ch;
+{
+ if ((ch >= 'a') && (ch <= 'f')) return (ch-'a'+10);
+ if ((ch >= '0') && (ch <= '9')) return (ch-'0');
+ if ((ch >= 'A') && (ch <= 'F')) return (ch-'A'+10);
+ return (-1);
+}
+
+
+/* scan for the sequence $<data>#<checksum> */
+void getpacket(buffer)
+char * buffer;
+{
+ unsigned char checksum;
+ unsigned char xmitcsum;
+ int i;
+ int count;
+ char ch;
+
+ do {
+ /* wait around for the start character, ignore all other characters */
+ while ((ch = getDebugChar()) != '$');
+ checksum = 0;
+ xmitcsum = -1;
+
+ count = 0;
+
+ /* now, read until a # or end of buffer is found */
+ while (count < BUFMAX) {
+ ch = getDebugChar();
+ if (ch == '#') break;
+ checksum = checksum + ch;
+ buffer[count] = ch;
+ count = count + 1;
+ }
+ buffer[count] = 0;
+
+ if (ch == '#') {
+ xmitcsum = hex(getDebugChar()) << 4;
+ xmitcsum += hex(getDebugChar());
+
+ if (checksum != xmitcsum) putDebugChar('-'); /* failed checksum */
+ else {
+ putDebugChar('+'); /* successful transfer */
+ /* if a sequence char is present, reply the sequence ID */
+ if (buffer[2] == ':') {
+ putDebugChar( buffer[0] );
+ putDebugChar( buffer[1] );
+ /* remove sequence chars from buffer */
+ count = db_strlen(buffer);
+ for (i=3; i <= count; i++) buffer[i-3] = buffer[i];
+ }
+ }
+ }
+ } while (checksum != xmitcsum);
+
+}
+
+/* send the packet in buffer. The host get's one chance to read it.
+ This routine does not wait for a positive acknowledge. */
+
+
+void putpacket(buffer)
+char * buffer;
+{
+ unsigned char checksum;
+ int count;
+ char ch;
+
+ /* $<packet info>#<checksum>. */
+ do {
+ putDebugChar('$');
+ checksum = 0;
+ count = 0;
+
+ while ((ch=buffer[count])) {
+ if (! putDebugChar(ch)) return;
+ checksum += ch;
+ count += 1;
+ }
+
+ putDebugChar('#');
+ putDebugChar(hexchars[checksum >> 4]);
+ putDebugChar(hexchars[checksum % 16]);
+
+ } while (1 == 0); /* (getDebugChar() != '+'); */
+
+}
+
+char remcomInBuffer[BUFMAX];
+char remcomOutBuffer[BUFMAX];
+static short error;
+
+
+void debug_error(format, parm)
+char * format;
+char * parm;
+{
+ return;
+}
+
+/* convert the memory pointed to by mem into hex, placing result in buf */
+/* return a pointer to the last char put in buf (null) */
+char* mem2hex(mem, buf, count)
+char* mem;
+char* buf;
+int count;
+{
+ int i;
+ unsigned char ch;
+ for (i=0;i<count;i++) {
+ ch = *mem++;
+ *buf++ = hexchars[ch >> 4];
+ *buf++ = hexchars[ch % 16];
+ }
+ *buf = 0;
+ return(buf);
+}
+
+/* convert the hex array pointed to by buf into binary to be placed in mem */
+/* return a pointer to the character AFTER the last byte written */
+char* hex2mem(buf, mem, count)
+char* buf;
+char* mem;
+int count;
+{
+ int i;
+ unsigned char ch;
+ for (i=0;i<count;i++) {
+ ch = hex(*buf++) << 4;
+ ch = ch + hex(*buf++);
+ *mem++ = ch;
+ }
+ return(mem);
+}
+
+/* this function takes the 68000 exception number and attempts to
+ translate this number into a unix compatible signal value */
+int computeSignal( exceptionVector )
+int exceptionVector;
+{
+ int sigval;
+ switch (exceptionVector) {
+ case 2 : sigval = 10; break; /* bus error */
+ case 3 : sigval = 10; break; /* address error */
+ case 4 : sigval = 4; break; /* illegal instruction */
+ case 5 : sigval = 8; break; /* zero divide */
+ case 6 : sigval = 8; break; /* chk instruction */
+ case 7 : sigval = 8; break; /* trapv instruction */
+ case 8 : sigval = 11; break; /* privilege violation */
+ case 9 : sigval = 5; break; /* trace trap */
+ case 10: sigval = 4; break; /* line 1010 emulator */
+ case 11: sigval = 4; break; /* line 1111 emulator */
+
+ /* Coprocessor protocol violation. Using a standard MMU or FPU
+ this cannot be triggered by software. Call it a SIGBUS. */
+ case 13: sigval = 10; break;
+
+ case 31: sigval = 2; break; /* interrupt */
+ case 33: sigval = 5; break; /* breakpoint */
+
+ /* This is a trap #8 instruction. Apparently it is someone's software
+ convention for some sort of SIGFPE condition. Whose? How many
+ people are being screwed by having this code the way it is?
+ Is there a clean solution? */
+ case 40: sigval = 8; break; /* floating point err */
+
+ case 48: sigval = 8; break; /* floating point err */
+ case 49: sigval = 8; break; /* floating point err */
+ case 50: sigval = 8; break; /* zero divide */
+ case 51: sigval = 8; break; /* underflow */
+ case 52: sigval = 8; break; /* operand error */
+ case 53: sigval = 8; break; /* overflow */
+ case 54: sigval = 8; break; /* NAN */
+ default:
+ sigval = 7; /* "software generated"*/
+ }
+ return (sigval);
+}
+
+/**********************************************/
+/* WHILE WE FIND NICE HEX CHARS, BUILD AN INT */
+/* RETURN NUMBER OF CHARS PROCESSED */
+/**********************************************/
+int hexToInt(char **ptr, int *intValue)
+{
+ int numChars = 0;
+ int hexValue;
+
+ *intValue = 0;
+
+ while (**ptr)
+ {
+ hexValue = hex(**ptr);
+ if (hexValue >=0)
+ {
+ *intValue = (*intValue <<4) | hexValue;
+ numChars ++;
+ }
+ else
+ break;
+
+ (*ptr)++;
+ }
+
+ return (numChars);
+}
+
+/*
+ * This function does all command procesing for interfacing to gdb.
+ */
+void handle_exception(int exceptionVector)
+{
+ int sigval;
+ int addr, length;
+ char * ptr;
+ int newPC;
+ Frame *frame;
+
+ /* reply to host that an exception has occurred */
+ sigval = computeSignal( exceptionVector );
+ remcomOutBuffer[0] = 'S';
+ remcomOutBuffer[1] = hexchars[sigval >> 4];
+ remcomOutBuffer[2] = hexchars[sigval % 16];
+ remcomOutBuffer[3] = 0;
+
+ putpacket(remcomOutBuffer);
+
+ while (1==1) {
+ error = 0;
+ remcomOutBuffer[0] = 0;
+ getpacket(remcomInBuffer);
+ switch (remcomInBuffer[0]) {
+ case '?' : remcomOutBuffer[0] = 'S';
+ remcomOutBuffer[1] = hexchars[sigval >> 4];
+ remcomOutBuffer[2] = hexchars[sigval % 16];
+ remcomOutBuffer[3] = 0;
+ break;
+ case 'd' : remote_debug = !(remote_debug); /* toggle debug flag */
+ break;
+ case 'g' : /* return the value of the CPU registers */
+ mem2hex((char*) registers, remcomOutBuffer, NUMREGBYTES);
+ break;
+ case 'G' : /* set the value of the CPU registers - return OK */
+ hex2mem(&remcomInBuffer[1], (char*) registers, NUMREGBYTES);
+ db_strcpy(remcomOutBuffer,"OK");
+ break;
+
+ /* mAA..AA,LLLL Read LLLL bytes at address AA..AA */
+ case 'm' :
+ /* TRY TO READ %x,%x. IF SUCCEED, SET PTR = 0 */
+ ptr = &remcomInBuffer[1];
+ if (hexToInt(&ptr,&addr))
+ if (*(ptr++) == ',')
+ if (hexToInt(&ptr,&length))
+ {
+ ptr = 0;
+ mem2hex((char*) addr, remcomOutBuffer, length);
+ }
+
+ if (ptr)
+ {
+ db_strcpy(remcomOutBuffer,"E01");
+ debug_error("malformed read memory command: %s",remcomInBuffer);
+ }
+ break;
+
+ /* MAA..AA,LLLL: Write LLLL bytes at address AA.AA return OK */
+ case 'M' :
+ /* TRY TO READ '%x,%x:'. IF SUCCEED, SET PTR = 0 */
+ ptr = &remcomInBuffer[1];
+ if (hexToInt(&ptr,&addr))
+ if (*(ptr++) == ',')
+ if (hexToInt(&ptr,&length))
+ if (*(ptr++) == ':')
+ {
+ hex2mem(ptr, (char*) addr, length);
+ ptr = 0;
+ db_strcpy(remcomOutBuffer,"OK");
+ }
+ if (ptr)
+ {
+ db_strcpy(remcomOutBuffer,"E02");
+ debug_error("malformed write memory command: %s",remcomInBuffer);
+ }
+ break;
+
+ /* cAA..AA Continue at address AA..AA(optional) */
+ /* sAA..AA Step one instruction from AA..AA(optional) */
+ case 'c' :
+ case 's' :
+ /* try to read optional parameter, pc unchanged if no parm */
+ ptr = &remcomInBuffer[1];
+ if (hexToInt(&ptr,&addr))
+ registers[ PC ] = addr;
+
+ newPC = registers[ PC];
+
+ /* clear the trace bit */
+ registers[ PS ] &= 0x7fff;
+
+ /* set the trace bit if we're stepping */
+ if (remcomInBuffer[0] == 's') registers[ PS ] |= 0x8000;
+
+ /*
+ * look for newPC in the linked list of exception frames.
+ * if it is found, use the old frame it. otherwise,
+ * fake up a dummy frame in returnFromException().
+ */
+ frame = lastFrame;
+ while (frame)
+ {
+ if (frame->exceptionPC == newPC) break; /* bingo! a match */
+ /*
+ * for a breakpoint instruction, the saved pc may
+ * be off by two due to re-executing the instruction
+ * replaced by the trap instruction. Check for this.
+ */
+ if ((frame->exceptionVector == 33) &&
+ (frame->exceptionPC == (newPC+2))) break;
+ if (frame == frame->previous)
+ {
+ frame = 0; /* no match found */
+ break;
+ }
+ frame = frame->previous;
+ }
+
+ /*
+ * If we found a match for the PC AND we are not returning
+ * as a result of a breakpoint (33),
+ * trace exception (9), nmi (31), jmp to
+ * the old exception handler as if this code never ran.
+ */
+ if (frame)
+ {
+ if ((frame->exceptionVector != 9) &&
+ (frame->exceptionVector != 31) &&
+ (frame->exceptionVector != 33))
+ {
+ /*
+ * invoke the previous handler.
+ */
+ if (oldExceptionHook)
+ (*oldExceptionHook) (frame->exceptionVector);
+ newPC = registers[ PC ]; /* pc may have changed */
+ if (newPC != frame->exceptionPC)
+ {
+ /* re-use the last frame, we're skipping it (longjump?)*/
+ frame = (Frame *) 0;
+ _returnFromException( frame ); /* this is a jump */
+ }
+ }
+ }
+
+ /* if we couldn't find a frame, create one */
+ if (frame == 0)
+ {
+ frame = lastFrame -1 ;
+
+ /* by using a bunch of print commands with breakpoints,
+ it's possible for the frame stack to creep down. If it creeps
+ too far, give up and reset it to the top. Normal use should
+ not see this happen.
+ */
+ if ((unsigned int) (frame-2) < (unsigned int) &gdbFrameStack)
+ {
+ initializeRemcomErrorFrame();
+ frame = lastFrame;
+ }
+ frame->previous = lastFrame;
+ lastFrame = frame;
+ frame = 0; /* null so _return... will properly initialize it */
+ }
+
+ _returnFromException( frame ); /* this is a jump */
+
+ break;
+
+ /* kill the program */
+ case 'k' : /* do nothing */
+ break;
+ } /* switch */
+
+ /* reply to the request */
+ putpacket(remcomOutBuffer);
+ }
+}
+
+
+void
+initializeRemcomErrorFrame()
+{
+ lastFrame = ((Frame *) &gdbFrameStack[FRAMESIZE-1]) - 1;
+ lastFrame->previous = lastFrame;
+}
+
+/* this function is used to set up exception handlers for tracing and
+ breakpoints */
+void set_debug_traps()
+{
+ extern void _debug_level7();
+ extern void remcomHandler();
+ int exception;
+
+ initializeRemcomErrorFrame();
+ stackPtr = &remcomStack[STACKSIZE/sizeof(int) - 1];
+
+ for (exception = 2; exception <= 23; exception++)
+ set_vector(_catchException,exception,0);
+
+ /* level 7 interrupt */
+ set_vector(_debug_level7,31,0);
+
+ /* breakpoint exception (trap #1) */
+ set_vector(_catchException,33,0);
+
+ /* This is a trap #8 instruction. Apparently it is someone's software
+ convention for some sort of SIGFPE condition. Whose? How many
+ people are being screwed by having this code the way it is?
+ Is there a clean solution? */
+ set_vector(_catchException,40,0);
+
+ /* 48 to 54 are floating point coprocessor errors */
+ for (exception = 48; exception <= 54; exception++)
+ set_vector(_catchException,exception,0);
+
+ if (oldExceptionHook != remcomHandler)
+ {
+ oldExceptionHook = exceptionHook;
+ exceptionHook = remcomHandler;
+ }
+
+ initialized = 1;
+
+}
+
+/* This function will generate a breakpoint exception. It is used at the
+ beginning of a program to sync up with a debugger and can be used
+ otherwise as a quick means to stop program execution and "break" into
+ the debugger. */
+
+void breakpoint()
+{
+ if (initialized) BREAKPOINT();
+}
+
diff --git a/c/src/lib/libbsp/m68k/efi68k/startup/setvec.c b/c/src/lib/libbsp/m68k/efi68k/startup/setvec.c
new file mode 100644
index 0000000000..2b3603007b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/startup/setvec.c
@@ -0,0 +1,45 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the efi68k.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+m68k_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ int *p;
+ m68k_isr_entry previous_isr;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ p = (int *)(vector*6-12+2+(int)_VBR);
+ previous_isr = (m68k_isr_entry) *p; /* return old ISR */
+ *p = (int) handler; /* install new ISR */
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/m68k/efi68k/timer/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/timer/Makefile.in
new file mode 100644
index 0000000000..79c8438431
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/timer/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/efi68k/timer/timer.c b/c/src/lib/libbsp/m68k/efi68k/timer/timer.c
new file mode 100644
index 0000000000..fdac13f106
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/timer/timer.c
@@ -0,0 +1,141 @@
+/* Timer_init()
+ *
+ * This routine initializes a timer in efi68k's DP8570A TCP
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <bsp.h>
+
+rtems_boolean Timer_driver_Find_average_overhead;
+
+extern rtems_isr Clock_isr();
+
+void Timer_initialize( void )
+{
+ /* stop counter */
+ *MSR = 0;
+ *T0CR = 0;
+
+ /*
+ * Make sure isr is installed
+ */
+
+ set_vector( Clock_isr, TCP_ISR_LEVEL+24, 1);
+
+ /* clear timer ISR count */
+ Timer_interrupts = 0;
+
+ /* load count (count down timer) */
+ *MSR = 0;
+ *T0_MSB = 0xff;
+ *T0_LSB = 0xff;
+
+ /* clear old interrupts */
+ *MSR = T0;
+
+ /* enable timer 0 interrupt */
+ *MSR = RS;
+ *ICR0 |= T0E;
+
+ /*
+ TSS = 1 starts the timer (timer resets on start)
+ M1/0 = 0/1 rate generator
+ C2/1/0 = 0/0/0 external clock (8MHz) (1/8 usec resolution)
+ RD = 0 read data (latchs count)
+ CHG = 0 hold
+ */
+ *MSR = 0;
+ *T0CR = (TSS | M0);
+}
+
+/*
+ * The following controls the behavior of Read_timer().
+ *
+ * FIND_AVG_OVERHEAD * instructs the routine to return the "raw" count.
+ *
+ * AVG_OVEREHAD is the overhead for starting and stopping the timer. It
+ * is usually deducted from the number returned.
+ *
+ * LEAST_VALID is the lowest number this routine should trust. Numbers
+ * below this are "noise" and zero is returned.
+ */
+
+#define AVG_OVERHEAD 0 /* It typically takes X.X microseconds */
+ /* (Y countdowns) to start/stop the timer. */
+ /* This value is in microseconds. */
+#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */
+
+/*
+ * Return timer value in 1/2-microsecond units
+ */
+int Read_timer( void )
+{
+ rtems_unsigned16 clicks;
+ rtems_unsigned32 total;
+ rtems_unsigned32 msb, lsb;
+
+
+ /*
+ * Read the timer and see how many clicks it has been since counter
+ * rolled over.
+ */
+
+ *MSR = 0;
+ *T0CR |= RD;
+ /* must read MSB first */
+ msb = *T0_MSB;
+ lsb = *T0_LSB;
+ clicks = 0xffff - ((msb << 8) | lsb);
+
+ /*
+ * Total is calculated by taking into account the number of timer overflow
+ * interrupts since the timer was initialized and clicks since the last
+ * interrupts.
+ */
+
+ total = (Timer_interrupts * 0x10000 + clicks + 4)/8; /* in micoseconds */
+ /* ^^^ round to nearest int */
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in XXX microsecond units */
+
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ return (total - AVG_OVERHEAD);
+}
+
+
+/*
+ * Empty function call used in loops to measure basic cost of looping
+ * in Timing Test Suite.
+ */
+
+rtems_status_code Empty_function(void)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/efi68k/times b/c/src/lib/libbsp/m68k/efi68k/times
new file mode 100644
index 0000000000..f13320d065
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/times
@@ -0,0 +1,193 @@
+#
+# Timing Test Suite Results for the EFI68k BSP
+#
+# $Id$
+#
+
+NOTE: This BSP is used submitted and no information is currently available.
+
+Board: EFI68k
+CPU: Motorola MC68HC000
+Clock Speed: 16 Mhz
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column A: unused
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/m68k/efi68k/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/efi68k/wrapup/Makefile.in
new file mode 100644
index 0000000000..a4444d9cb1
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/efi68k/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console spurious timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/gen68302/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/Makefile.in
new file mode 100644
index 0000000000..bd7ff1f784
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/Makefile.in
@@ -0,0 +1,19 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SRCS=README
+
+all: $(SRCS)
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include start302 startup clock console timer wrapup
diff --git a/c/src/lib/libbsp/m68k/gen68302/README b/c/src/lib/libbsp/m68k/gen68302/README
new file mode 100644
index 0000000000..0261083479
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/README
@@ -0,0 +1,154 @@
+#
+# $Id$
+#
+
+BSP NAME: gen68302
+BOARD: proprietary (see below for relevant information)
+BUS: none
+CPU FAMILY: MC68000
+COPROCESSORS: 68302 communications co-processor
+MODE: not applicable
+
+DEBUG MONITOR: none
+
+PERIPHERALS
+===========
+TIMERS: two 68302 timers, one 68302 watchdog timer
+ RESOLUTION: ?
+SERIAL PORTS: three 68302 SCCs
+REAL-TIME CLOCK:
+DMA: built-in 68302, not used
+VIDEO: none
+SCSI: none
+NETWORKING: none
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: 68302 (TIMER1)
+IOSUPP DRIVER: 68302 SCC2
+SHMSUPP: none
+TIMER DRIVER: 68302 TIMER2
+
+STDIO
+=====
+PORT: ?
+ELECTRICAL: EIA-232
+BAUD: 9600
+BITS PER CHARACTER: 8
+PARITY: None
+STOP BITS: 1
+
+NOTES
+=====
+
+Board description
+-----------------
+clock rate: 16 MHz
+bus width: 16 bits
+ROM: 128 kbyte (flash, 0 wait states, chip select 0)
+RAM: 256 kbyte (static, 0 wait states, chip select 1)
+
+The 68302's built-in DRAM refresh controller circuitry is neither used
+nor configured at startup.
+
+Host System
+-----------
+HP 9000/715, HP-UX 9.05
+gcc-2.6.3
+binutils-2.5.2
+
+
+Verification
+------------
+The 1-ms clock ISR rate was verified with an in-circuit emulator.
+
+Single processor tests:
+Multi-processort tests: not applicable
+Timing tests: see results in c/src/tests/tmtests/times
+
+Note: The board has 256 kbyte RAM, so the timing tests would not run
+with the standard executive RAM size configuration of 256 K.
+Modifying the conftbl.h files to specify 160 kbyte for workspace
+seemed to work.
+
+* Porting
+
+** Mod c/src/tests/tmtests/*/conftbl.h
+
+Modified to use 160 kbyte for executive RAM size.
+
+** Add c/make/custom/gen68302.cfg
+
+Based on m68k_no_bsp.cfg. Turned off multiprocessor support. Had to
+use a BSP-specific compiler configuration file in order to link the
+proper startup file.
+
+** Mod c/make/compilers/gcc-m68000.cfg
+
+Added "-m68000" to the AS macro so that non-68000 instructions are
+neither generated nor allowed (remember that the GNU assembler
+supports pseudo-assembler instructions (e.g. jbsr) that will be
+"intelligently" assembled.) Added "m68000/" before libgcc.a so that
+non-68000 instructions aren't included.
+
+** Add c/make/compilers/gcc-gen68302.cfg
+
+Based on modified gcc-m68000.cfg.
+
+Changed make-exe define to produce IEEE-695 output files for loading
+into the emulator.
+
+The board has no debug monitor, so I had to create a 68302-specific
+startup file (c/src/lib/libbsp/m68k/gen68302/start302/start302.s) to
+override the c/src/lib/start/m68k/start.s. START_FILE entry was
+modified to causes start302.s to be linked first (in lieu of start.s).
+
+** Mod c/src/exec/cpu/m68k/cpu.h
+
+Turned off software and hardware interrupt stack support. Added
+support in _CPU_Bitfield_Find_first_bit() and
+_CPU_Priority_Bits_index() to replace the bfffo instruction.
+
+TODO: add software-maintained interrupt stack.
+
+TODO: optimize things so that subtracting _priority from 15 isn't
+required in _CPU_Priority_Bits_index().
+
+** Mod c/src/exec/cpu/m68k/cpu.c
+
+Added the log base 2 table (__log2table) that's required by the BFFFO
+replacement in cpu.h.
+
+** Mod c/src/exec/cpu/m68k/cpu_asm.s
+
+Added _ISR_Exit that's currently used in TBD.... Added ifdef wrapper
+around ISR exit code that accessed the format nibble. Added some code
+to restore the status register and call _Thread_Dispatch.
+
+TODO: add software-maintained interrupt stack.
+
+** Mod c/src/exec/cpu/m68k/m68k.h
+
+Changed "typedef char signed8" to "typedef signed char signed8".
+
+** Add c/src/lib/libbsp/m68k/gen68302/...
+*** clock/
+
+TODO: Add set_vector support. Figure out what to do with Clock_exit().
+TODO: Pre-compute (BSP_Configuration.microseconds_per_tick/1000) so that
+it doesn't have to be re-computed on each Clock_isr().
+
+*** console/
+
+These files assume SCC2, but it shouldn't be too difficult to re-write
+these to use any of the other SCCs.
+
+*** include/
+*** start302/
+
+This contains the start302.s file that does some fairly tricky memory
+re-mapping so that RAM ends up at 0 and ROM ends up at 0xc00000.
+
+*** startup/
+*** timer/
+*** wrapup/
diff --git a/c/src/lib/libbsp/m68k/gen68302/bsp_specs b/c/src/lib/libbsp/m68k/gen68302/bsp_specs
new file mode 100644
index 0000000000..5bcccba7af
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start302.o%s
+{!pg:
+g: start302.o%s
+{!g:
+p: start302.o%s
+!p: start302.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/gen68302/clock/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/clock/Makefile.in
new file mode 100644
index 0000000000..8e325402ca
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/clock/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c b/c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c
new file mode 100644
index 0000000000..f5745821f4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/clock/ckinit.c
@@ -0,0 +1,162 @@
+/* Clock_init()
+ *
+ * This routine initializes Timer 1 for an MC68302.
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h> /* for atexit() */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include "m68302.h"
+
+#define CLOCK_VECTOR 137
+
+#define TMR1_VAL ( RBIT_TMR_RST /* software reset the timer */\
+ | RBIT_TMR_ICLK_MASTER16 /* master clock divided by 16 */\
+ | RBIT_TMR_FRR /* restart timer after ref reached */\
+ | RBIT_TMR_ORI) /* enable interrupt when ref reached */
+#define TRR1_VAL 1000 /* 1000 ticks @ 16MHz/16
+ * = 1 millisecond tick.
+ */
+
+/*
+ * Clock_driver_ticks is a monotonically increasing counter of the
+ * number of clock ticks since the driver was initialized.
+ */
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+/*
+ * Clock_isrs is the number of clock ISRs until the next invocation of
+ * the RTEMS clock tick routine. The clock tick device driver
+ * gets an interrupt once a millisecond and counts down until the
+ * length of time between the user configured microseconds per tick
+ * has passed.
+ */
+rtems_unsigned32 Clock_isrs;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * ISR Handler
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ Clock_driver_ticks += 1;
+
+ m302.reg.isr = RBIT_ISR_TIMER1; /* clear in-service bit */
+ m302.reg.ter1 = (RBIT_TER_REF | RBIT_TER_CAP); /* clear timer intr request */
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ set_vector( clock_isr, CLOCK_VECTOR, 1 );
+
+ m302.reg.trr1 = TRR1_VAL; /* set timer reference register */
+ m302.reg.tmr1 = TMR1_VAL; /* set timer mode register & enable */
+ /*
+ * Enable TIMER1 interrupts only.
+ */
+ m302.reg.imr = RBIT_IMR_TIMER1; /* set 68302 int-mask to allow ints */
+
+ atexit( Clock_exit );
+ }
+}
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ /* TODO: figure out what to do here */
+ /* do not restore old vector */
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr( CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/gen68302/console/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/gen68302/console/console.c b/c/src/lib/libbsp/m68k/gen68302/console/console.c
new file mode 100644
index 0000000000..4550d952b5
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/console/console.c
@@ -0,0 +1,304 @@
+/*
+ * Initialize the MC68302 SCC2 for console IO board support package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define GEN68302_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include "m68302.h"
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+ volatile m302_dualPortRAM_t *p = &m302;
+
+ p->reg.pacnt |= 0x0003; /* enable RXD2 and TXD2 signals */
+ /*
+ * TODO: Check assembly code. I think gcc's volatile semantics force
+ * this to not use a CLR.
+ */
+ p->reg.simode = 0; /* NMSI mode */
+
+ p->reg.scc[1].scon = 0x00d8; /* 9600 baud */
+ p->reg.scc[1].scm = 0x01b1;
+
+ p->scc2.parm.rfcr = 0x50; /* Rx buffers in supervisor data */
+ p->scc2.parm.tfcr = 0x50; /* Tx buffers in supervisor data */
+ p->scc2.parm.mrblr = 0x0001; /* Max Rx buffer length is 1 byte */
+
+ p->scc2.prot.uart.max_idl = 0x0000; /* 0 = maximum timeout value */
+ p->scc2.prot.uart.brkcr = 0x0001; /* send 1 break char on STOP TX cmd */
+ p->scc2.prot.uart.parec = 0x0000; /* reset parity error counter */
+ p->scc2.prot.uart.frmec = 0x0000; /* reset framing error counter */
+ p->scc2.prot.uart.nosec = 0x0000; /* reset noise error counter */
+ p->scc2.prot.uart.brkec = 0x0000; /* reset break condition counter */
+
+ p->scc2.prot.uart.character[0] = 0x0003; /* use <ctrl>c as control char */
+ p->scc2.prot.uart.character[1] = 0x8000; /* set end of cntrl char table */
+
+ p->scc2.bd.rx[0].status = 0xA000; /* RxBD0 empty, wrap, no intr */
+ p->scc2.bd.rx[0].length = 0x0000;
+ p->scc2.bd.rx[0].buffer =
+ (rtems_unsigned8 *) &m302.scc2.bd.rx[1]; /* RxBD1 is Rx buffer */
+
+ p->reg.scc[1].dsr = 0x7000; /* set full-length last stop bit */
+
+ p->scc2.bd.tx[0].status = 0x3000; /* TxBD0 not ready, wrap, intr */
+ p->scc2.bd.tx[0].length = 0x0001;
+ p->scc2.bd.tx[0].buffer =
+ (rtems_unsigned8 *) &m302.scc2.bd.tx[1]; /* TxBD1 is Tx buffer */
+
+ p->reg.scc[1].scce = 0xFF; /* clear all SCC event flags */
+ p->reg.scc[1].sccm = 0x03; /* enable only Tx & Rx interrupts */
+ p->reg.scc[1].scm = 0x01BD;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+
+}
+
+/* is_character_ready
+ *
+ * Check to see if a character is available on the MC68302's SCC2. If so,
+ * then return a TRUE (along with the character). Otherwise return FALSE.
+ *
+ * Input parameters: pointer to location in which to return character
+ *
+ * Output parameters: character (if available)
+ *
+ * Return values: TRUE - character available
+ * FALSE - no character available
+ */
+
+rtems_boolean is_character_ready(
+ char *ch /* -> character */
+)
+{
+#define RXS (m302.scc2.bd.rx[0].status)
+#define RXD (* ((volatile char *) m302.scc2.bd.rx[0].buffer))
+
+ for (;;) {
+ if (RXS & RBIT_HDLC_EMPTY_BIT)
+ return FALSE;
+
+ *ch = RXD;
+ RXS = RBIT_HDLC_EMPTY_BIT | RBIT_HDLC_WRAP_BIT;
+ if ( *ch >= ' ' && *ch <= '~' )
+ return TRUE;
+ }
+}
+
+
+/* inbyte
+ *
+ * Receive a character from the MC68302's SCC2.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values: character read
+ */
+
+char inbyte( void )
+{
+ char ch;
+
+#define RXS (m302.scc2.bd.rx[0].status)
+#define RXD (* ((volatile char *) m302.scc2.bd.rx[0].buffer))
+
+ do {
+ while (RXS & RBIT_HDLC_EMPTY_BIT)
+ /* Wait until character received */ ;
+
+ ch = RXD;
+ RXS = RBIT_HDLC_EMPTY_BIT | RBIT_HDLC_WRAP_BIT;
+
+ if (ch == '\r' || ch == '\n')
+ break;
+ } while (ch < ' ' || ch > '~');
+
+ return ch;
+}
+
+
+/* outbyte
+ *
+ * Transmit a character out on the MC68302's SCC2.
+ * It may support XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+#define TXS (m302.scc2.bd.tx[0].status)
+#define TXD (* ((volatile char *) m302.scc2.bd.tx[0].buffer))
+
+#define RXS (m302.scc2.bd.rx[0].status)
+#define RXD (* ((volatile char *) m302.scc2.bd.rx[0].buffer))
+
+ while (TXS & RBIT_HDLC_READY_BIT)
+ /* Wait until okay to transmit */ ;
+
+ /*
+ * Check for flow control requests and process.
+ */
+ while ( ! (RXS & RBIT_HDLC_EMPTY_BIT)) {
+ if (RXD == XOFF)
+ do {
+ RXS = RBIT_HDLC_EMPTY_BIT | RBIT_HDLC_WRAP_BIT;
+ while (RXS & RBIT_HDLC_EMPTY_BIT)
+ /* Wait until character received */ ;
+ } while (RXD != XON);
+ RXS = RBIT_HDLC_EMPTY_BIT | RBIT_HDLC_WRAP_BIT;
+ }
+
+ TXD = ch;
+ TXS = RBIT_HDLC_READY_BIT | RBIT_HDLC_WRAP_BIT;
+ if (ch == '\n')
+ outbyte('\r');
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/gen68302/include/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/gen68302/include/bsp.h b/c/src/lib/libbsp/m68k/gen68302/include/bsp.h
new file mode 100644
index 0000000000..2e0797a911
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/include/bsp.h
@@ -0,0 +1,125 @@
+/* bsp.h
+ *
+ * This include file contains all board IO definitions.
+ *
+ * XXX : put yours in here
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __GEN68302_BSP_h
+#define __GEN68302_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <console.h>
+#include <iosupp.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Stuff for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 0, 1 )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { register rtems_unsigned32 _delay=(microseconds); \
+ register rtems_unsigned32 _tmp=123; \
+ asm volatile( "0: \
+ nbcd %0 ; \
+ nbcd %0 ; \
+ dbf %1,0b" \
+ : "=d" (_tmp), "=d" (_delay) \
+ : "0" (_tmp), "1" (_delay) ); \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x040000
+
+/* Structures */
+
+#ifdef GEN68302_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/gen68302/include/coverhd.h b/c/src/lib/libbsp/m68k/gen68302/include/coverhd.h
new file mode 100644
index 0000000000..7b69ec046b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/include/coverhd.h
@@ -0,0 +1,115 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 14
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 11
+#define CALLING_OVERHEAD_TASK_CREATE 22
+#define CALLING_OVERHEAD_TASK_IDENT 17
+#define CALLING_OVERHEAD_TASK_START 18
+#define CALLING_OVERHEAD_TASK_RESTART 15
+#define CALLING_OVERHEAD_TASK_DELETE 12
+#define CALLING_OVERHEAD_TASK_SUSPEND 12
+#define CALLING_OVERHEAD_TASK_RESUME 12
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 16
+#define CALLING_OVERHEAD_TASK_MODE 15
+#define CALLING_OVERHEAD_TASK_GET_NOTE 16
+#define CALLING_OVERHEAD_TASK_SET_NOTE 16
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 31
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 11
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 17
+#define CALLING_OVERHEAD_CLOCK_GET 32
+#define CALLING_OVERHEAD_CLOCK_SET 31
+#define CALLING_OVERHEAD_CLOCK_TICK 8
+
+#define CALLING_OVERHEAD_TIMER_CREATE 13
+#define CALLING_OVERHEAD_TIMER_IDENT 12
+#define CALLING_OVERHEAD_TIMER_DELETE 14
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 19
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 39
+#define CALLING_OVERHEAD_TIMER_RESET 12
+#define CALLING_OVERHEAD_TIMER_CANCEL 12
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 18
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 12
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 17
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 17
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 12
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 18
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 17
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 12
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 14
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 14
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 17
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 19
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 14
+
+#define CALLING_OVERHEAD_EVENT_SEND 15
+#define CALLING_OVERHEAD_EVENT_RECEIVE 18
+#define CALLING_OVERHEAD_SIGNAL_CATCH 14
+#define CALLING_OVERHEAD_SIGNAL_SEND 14
+#define CALLING_OVERHEAD_PARTITION_CREATE 23
+#define CALLING_OVERHEAD_PARTITION_IDENT 17
+#define CALLING_OVERHEAD_PARTITION_DELETE 12
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 15
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 15
+#define CALLING_OVERHEAD_REGION_CREATE 23
+#define CALLING_OVERHEAD_REGION_IDENT 14
+#define CALLING_OVERHEAD_REGION_DELETE 12
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 21
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 15
+#define CALLING_OVERHEAD_PORT_CREATE 20
+#define CALLING_OVERHEAD_PORT_IDENT 14
+#define CALLING_OVERHEAD_PORT_DELETE 12
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 18
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 18
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 18
+#define CALLING_OVERHEAD_IO_OPEN 18
+#define CALLING_OVERHEAD_IO_CLOSE 18
+#define CALLING_OVERHEAD_IO_READ 18
+#define CALLING_OVERHEAD_IO_WRITE 18
+#define CALLING_OVERHEAD_IO_CONTROL 18
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 11
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 13
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 14
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 12
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 12
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 14
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 8
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/gen68302/start/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/start/Makefile.in
new file mode 100644
index 0000000000..114dd48226
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/start/Makefile.in
@@ -0,0 +1,56 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGMS=${ARCH}/start302.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=start302
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/c/src/lib/libbsp/m68k/gen68302/start/start302.s b/c/src/lib/libbsp/m68k/gen68302/start/start302.s
new file mode 100644
index 0000000000..ceafba807d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/start/start302.s
@@ -0,0 +1,267 @@
+/* entry.s
+ *
+ * This file contains the entry point for the application.
+ * The name of this entry point is compiler dependent.
+ * It jumps to the BSP which is responsible for performing
+ * all initialization.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+ .set BAR, 0xF2 | Base Address Register location
+ .set SCR, 0xF4 | System Control Register location
+ .set BAR_VAL, 0x0f7f | BAR value
+ .set SCR_VAL, 0x00080f00 | SCR value
+ .set GIMR_VAL, 0x8780 |Global Interrupt Mode Register. (MUST BE WRITTEN).
+ .set BaseAddr,(BAR_VAL&0x0fff)<<12 | MC68302 internal base address
+
+ .set oSYSRAM, 0x000 | 576 bytes of internal system RAM
+
+ .set oGIMR, 0x812
+
+ .set oCS0_Base, 0x830 | 16 bits, Chip Sel 0 Base Reg
+ .set oCS0_Option, 0x832 | 16 bits, Chip Sel 0 Option Reg
+ .set oCS1_Base, 0x834 | 16 bits, Chip Sel 1 Base Reg
+ .set oCS1_Option, 0x836 | 16 bits, Chip Sel 1 Option Reg
+ .set oCS2_Base, 0x838 | 16 bits, Chip Sel 2 Base Reg
+ .set oCS2_Option, 0x83a | 16 bits, Chip Sel 2 Option Reg
+ .set oCS3_Base, 0x83c | 16 bits, Chip Sel 3 Base Reg
+ .set oCS3_Option, 0x83e | 16 bits, Chip Sel 3 Option Reg
+
+ .set tmpSRAM_BASE, 0x400000 | start of temporary SRAM
+ .set FLASH_BASE, 0xc00000 | start of FLASH''s normal location
+
+
+BEGIN_CODE
+ PUBLIC (M68Kvec) | Vector Table
+SYM (M68Kvec): | standard location for vectors
+V___ISSP: .long 0x00001000 |00 0 Reset: Initial SSP
+V____IPC: .long SYM(start)-V___ISSP |04 1 Reset: Initial PC
+V_BUSERR: .long Bad-V___ISSP |08 2 Bus Error
+V_ADRERR: .long Bad-V___ISSP |0c 3 Address Error
+ .space 240 | reserve space for reset of vectors
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+SYM (lowintstack):
+ .space 4092 | reserve for interrupt stack
+SYM (hiintstack):
+ .space 4 | end of interrupt stack
+#endif
+
+ PUBLIC (start) | Default entry point for GNU
+SYM (start):
+ move.w #0x2700,sr | Disable all interrupts
+ move.w #BAR_VAL,BAR | Set Base Address Register
+ move.l #SCR_VAL,SCR | Set System Control Register
+ lea BaseAddr,a5
+ move.w #GIMR_VAL,a5@(oGIMR) | Set Global Interrupt Mode Register
+
+|
+| Set up chip select registers for the remapping process.
+|
+
+|
+| 0 X x x x x
+| 0 000 0 0-- - --- ---- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xc001,a5@(oCS0_Base) | Expand CS0 to full size (FLASH)
+ move.w #0x1f82,a5@(oCS0_Option) | 000000-03ffff, R, 0 WS
+
+|
+| X x x x x x
+| 0 100 0 0-- - --- ---- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xa801,a5@(oCS1_Base) | Set up and enable CS1 (SRAM)
+ move.w #0x1f80,a5@(oCS1_Option) | 400000-43ffff, RW, 0 WS
+
+|
+| Copy the initial boot FLASH area to the temporary SRAM location.
+|
+ moveq #0,d0
+ movea.l d0,a0 | a0 -> start of FLASH
+ lea tmpSRAM_BASE,a1 | a1 -> start of tmp SRAM
+| moveq #(endPreBoot-V___ISSP)/4,d0 | # longs to copy
+ moveq #127,d0
+cpy_flash: move.l (a0)+,(a1)+ | copy
+ subq.l #1,d0
+ bne cpy_flash
+
+|
+| Copy remap code to 68302''s internal system RAM.
+|
+ movea.w #begRemap-V___ISSP,a0 | a0 -> remap code
+ lea a5@(oSYSRAM),a1 | a1 -> internal system RAM
+| moveq #(endRemap-begRemap)/2-1,d0 | d0 = # words to copy
+ moveq #11,d0
+cpy_remap: move.w (a0)+,(a1)+ | copy
+ dbra d0,cpy_remap
+
+|
+| Jump to the remap code in the 68302''s internal system RAM.
+|
+ jmp a5@(oSYSRAM) | (effectively a jmp begRemap)
+
+|
+| This remap code, when executed from the 68302''s internal system RAM
+| will 1) remap CS1 so that SRAM is at 0
+| 2) remap CS0 so that FLASH is at FLASH_BASE
+| and 3) jump to executable code in the remapped FLASH.
+|
+begRemap: move.w #0xa001,a5@(oCS1_Base) | Move CS1 (SRAM)
+ move.w #0xd801,a5@(oCS0_Base) | Move CS0 (FLASH)
+ lea FLASH_BASE,a0
+ jmp a0@(endRemap-V___ISSP.w) | Jump back to FLASH
+endRemap:
+|
+| Now set up the remaining chip select registers.
+|
+
+|
+| 4 0 x x x x
+| 1 000 1 111 0 000 0--- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xb1e1,a5@(oCS2_Base) | Set up and enable CS2 (dpRAM)
+ move.w #0x1ff0,a5@(oCS2_Option) | 8f0000-8f07ff, RW, 0 WS
+
+|
+| 8 X x x x x
+| 1 000 0 0-- - --- ---- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xd001,a5@(oCS3_Base) | Set up and enable CS3 (IO)
+ move.w #0x1f80,a5@(oCS3_Option) | 800000-83ffff, RW, 0 WS
+
+endPreBoot:
+
+ move.b #0x30,0x800001 | set status LED amber
+
+ .set oPIOB_Ctrl, 0x824
+ .set oPIOB_DDR, 0x826
+ .set oPIOB_Data, 0x828
+
+ .set oPIOA_Ctrl, 0x81e
+ .set oPIOA_DDR, 0x820
+ .set oPIOA_Data, 0x822
+
+ move.w #0x0ff8,a5@(oPIOB_Data) | Make output follow resistors.
+ move.w #0x00ff,a5@(oPIOB_DDR) | Set up PB7-PB0 for output.
+ move.w #0x0080,a5@(oPIOB_Ctrl) | Set up WDOG* as dedicated
+ | peripheral pins.
+
+ move.w #0x1fff,a5@(oPIOA_Data) | Make output follow resistors.
+ move.w #0xea2a,a5@(oPIOA_DDR) | Set up PA15-PA0 for in/output.
+ move.w #0x0003,a5@(oPIOA_Ctrl) | Set up TXD2/RXD2 as dedicated
+ | peripheral pins.
+
+|
+| Place "Bad" in all vectors from 010 thru 0ec. Vectors 0f0 and 0f4
+| are not set because they are the 68302''s BAR and SCR.
+|
+ movea.w #0x010,a0
+ moveq #(0x0f0-0x010)/4-1,d0
+ move.l #Bad,d1
+cpy_Bad: move.l d1,(a0)+
+ dbra d0,cpy_Bad
+
+ .set vbase, 0x0200
+
+ lea vbase,a0
+ moveq #31,d0
+cpy_Bad1: move.l d1,(a0)+
+ dbra d0,cpy_Bad1
+
+|
+| Fill in special locations to configure OS
+|
+ move.l #Bad,0x008 | Bus Error
+ move.l #Bad,0x00c | Address Error
+ move.l #Bad,0x024 | Trace
+| move.l #KE_IRET,$0b4 | pSOS+ RET_I Call
+
+| move.l #_cnsl_isr,vbase+0x028 | SCC2
+ move.l #timerisr,vbase+0x018 | Timer ISR
+
+ |
+ | zero out uninitialized data area
+ |
+zerobss:
+ moveal # SYM (end),a0 | find end of .bss
+ moveal # SYM (bss_start),a1 | find beginning of .bss
+ moveq #0,d0
+
+loop: movel d0,a1@+ | to zero out uninitialized
+ cmpal a0,a1
+ jlt loop | loop until _end reached
+
+ movel # SYM (end),d0 | d0 = end of bss/start of heap
+ addl # SYM (heap_size),d0 | d0 = end of heap
+ movel d0, SYM (stack_start) | Save for brk() routine
+ addl # SYM (stack_size),d0 | make room for stack
+ andl #0xffffffc0,d0 | align it on 16 byte boundary
+ movw #0x3700,sr | SUPV MODE,INTERRUPTS OFF!!!
+ movel d0,a7 | set master stack pointer
+ movel d0,a6 | set base pointer
+
+ /*
+ * RTEMS should maintiain a separate interrupt stack on CPUs
+ * without one in hardware. This is currently not supported
+ * on versions of the m68k without a HW intr stack.
+ */
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ lea SYM (hiintstack),a0 | a0 = high end of intr stack
+ movec a0,isp | set interrupt stack
+#endif
+
+ move.l #0,a7@- | environp
+ move.l #0,a7@- | argv
+ move.l #0,a7@- | argc
+ jsr SYM (main)
+
+ nop
+Bad: bra Bad
+
+ nop
+END_CODE
+
+
+BEGIN_DATA
+
+ PUBLIC (start_frame)
+SYM (start_frame):
+ .space 4,0
+
+ PUBLIC (stack_start)
+SYM (stack_start):
+ .space 4,0
+END_DATA
+
+BEGIN_BSS
+
+ PUBLIC (environ)
+ .align 2
+SYM (environ):
+ .long 0
+
+ PUBLIC (heap_size)
+ .set SYM (heap_size),0x2000
+
+ PUBLIC (stack_size)
+ .set SYM (stack_size),0x1000
+
+
+END_DATA
+END
diff --git a/c/src/lib/libbsp/m68k/gen68302/start302/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/start302/Makefile.in
new file mode 100644
index 0000000000..114dd48226
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/start302/Makefile.in
@@ -0,0 +1,56 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGMS=${ARCH}/start302.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=start302
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/c/src/lib/libbsp/m68k/gen68302/start302/start302.s b/c/src/lib/libbsp/m68k/gen68302/start302/start302.s
new file mode 100644
index 0000000000..ceafba807d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/start302/start302.s
@@ -0,0 +1,267 @@
+/* entry.s
+ *
+ * This file contains the entry point for the application.
+ * The name of this entry point is compiler dependent.
+ * It jumps to the BSP which is responsible for performing
+ * all initialization.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+ .set BAR, 0xF2 | Base Address Register location
+ .set SCR, 0xF4 | System Control Register location
+ .set BAR_VAL, 0x0f7f | BAR value
+ .set SCR_VAL, 0x00080f00 | SCR value
+ .set GIMR_VAL, 0x8780 |Global Interrupt Mode Register. (MUST BE WRITTEN).
+ .set BaseAddr,(BAR_VAL&0x0fff)<<12 | MC68302 internal base address
+
+ .set oSYSRAM, 0x000 | 576 bytes of internal system RAM
+
+ .set oGIMR, 0x812
+
+ .set oCS0_Base, 0x830 | 16 bits, Chip Sel 0 Base Reg
+ .set oCS0_Option, 0x832 | 16 bits, Chip Sel 0 Option Reg
+ .set oCS1_Base, 0x834 | 16 bits, Chip Sel 1 Base Reg
+ .set oCS1_Option, 0x836 | 16 bits, Chip Sel 1 Option Reg
+ .set oCS2_Base, 0x838 | 16 bits, Chip Sel 2 Base Reg
+ .set oCS2_Option, 0x83a | 16 bits, Chip Sel 2 Option Reg
+ .set oCS3_Base, 0x83c | 16 bits, Chip Sel 3 Base Reg
+ .set oCS3_Option, 0x83e | 16 bits, Chip Sel 3 Option Reg
+
+ .set tmpSRAM_BASE, 0x400000 | start of temporary SRAM
+ .set FLASH_BASE, 0xc00000 | start of FLASH''s normal location
+
+
+BEGIN_CODE
+ PUBLIC (M68Kvec) | Vector Table
+SYM (M68Kvec): | standard location for vectors
+V___ISSP: .long 0x00001000 |00 0 Reset: Initial SSP
+V____IPC: .long SYM(start)-V___ISSP |04 1 Reset: Initial PC
+V_BUSERR: .long Bad-V___ISSP |08 2 Bus Error
+V_ADRERR: .long Bad-V___ISSP |0c 3 Address Error
+ .space 240 | reserve space for reset of vectors
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+SYM (lowintstack):
+ .space 4092 | reserve for interrupt stack
+SYM (hiintstack):
+ .space 4 | end of interrupt stack
+#endif
+
+ PUBLIC (start) | Default entry point for GNU
+SYM (start):
+ move.w #0x2700,sr | Disable all interrupts
+ move.w #BAR_VAL,BAR | Set Base Address Register
+ move.l #SCR_VAL,SCR | Set System Control Register
+ lea BaseAddr,a5
+ move.w #GIMR_VAL,a5@(oGIMR) | Set Global Interrupt Mode Register
+
+|
+| Set up chip select registers for the remapping process.
+|
+
+|
+| 0 X x x x x
+| 0 000 0 0-- - --- ---- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xc001,a5@(oCS0_Base) | Expand CS0 to full size (FLASH)
+ move.w #0x1f82,a5@(oCS0_Option) | 000000-03ffff, R, 0 WS
+
+|
+| X x x x x x
+| 0 100 0 0-- - --- ---- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xa801,a5@(oCS1_Base) | Set up and enable CS1 (SRAM)
+ move.w #0x1f80,a5@(oCS1_Option) | 400000-43ffff, RW, 0 WS
+
+|
+| Copy the initial boot FLASH area to the temporary SRAM location.
+|
+ moveq #0,d0
+ movea.l d0,a0 | a0 -> start of FLASH
+ lea tmpSRAM_BASE,a1 | a1 -> start of tmp SRAM
+| moveq #(endPreBoot-V___ISSP)/4,d0 | # longs to copy
+ moveq #127,d0
+cpy_flash: move.l (a0)+,(a1)+ | copy
+ subq.l #1,d0
+ bne cpy_flash
+
+|
+| Copy remap code to 68302''s internal system RAM.
+|
+ movea.w #begRemap-V___ISSP,a0 | a0 -> remap code
+ lea a5@(oSYSRAM),a1 | a1 -> internal system RAM
+| moveq #(endRemap-begRemap)/2-1,d0 | d0 = # words to copy
+ moveq #11,d0
+cpy_remap: move.w (a0)+,(a1)+ | copy
+ dbra d0,cpy_remap
+
+|
+| Jump to the remap code in the 68302''s internal system RAM.
+|
+ jmp a5@(oSYSRAM) | (effectively a jmp begRemap)
+
+|
+| This remap code, when executed from the 68302''s internal system RAM
+| will 1) remap CS1 so that SRAM is at 0
+| 2) remap CS0 so that FLASH is at FLASH_BASE
+| and 3) jump to executable code in the remapped FLASH.
+|
+begRemap: move.w #0xa001,a5@(oCS1_Base) | Move CS1 (SRAM)
+ move.w #0xd801,a5@(oCS0_Base) | Move CS0 (FLASH)
+ lea FLASH_BASE,a0
+ jmp a0@(endRemap-V___ISSP.w) | Jump back to FLASH
+endRemap:
+|
+| Now set up the remaining chip select registers.
+|
+
+|
+| 4 0 x x x x
+| 1 000 1 111 0 000 0--- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xb1e1,a5@(oCS2_Base) | Set up and enable CS2 (dpRAM)
+ move.w #0x1ff0,a5@(oCS2_Option) | 8f0000-8f07ff, RW, 0 WS
+
+|
+| 8 X x x x x
+| 1 000 0 0-- - --- ---- ---- ----
+| x xxx x xxx x xx
+|
+ move.w #0xd001,a5@(oCS3_Base) | Set up and enable CS3 (IO)
+ move.w #0x1f80,a5@(oCS3_Option) | 800000-83ffff, RW, 0 WS
+
+endPreBoot:
+
+ move.b #0x30,0x800001 | set status LED amber
+
+ .set oPIOB_Ctrl, 0x824
+ .set oPIOB_DDR, 0x826
+ .set oPIOB_Data, 0x828
+
+ .set oPIOA_Ctrl, 0x81e
+ .set oPIOA_DDR, 0x820
+ .set oPIOA_Data, 0x822
+
+ move.w #0x0ff8,a5@(oPIOB_Data) | Make output follow resistors.
+ move.w #0x00ff,a5@(oPIOB_DDR) | Set up PB7-PB0 for output.
+ move.w #0x0080,a5@(oPIOB_Ctrl) | Set up WDOG* as dedicated
+ | peripheral pins.
+
+ move.w #0x1fff,a5@(oPIOA_Data) | Make output follow resistors.
+ move.w #0xea2a,a5@(oPIOA_DDR) | Set up PA15-PA0 for in/output.
+ move.w #0x0003,a5@(oPIOA_Ctrl) | Set up TXD2/RXD2 as dedicated
+ | peripheral pins.
+
+|
+| Place "Bad" in all vectors from 010 thru 0ec. Vectors 0f0 and 0f4
+| are not set because they are the 68302''s BAR and SCR.
+|
+ movea.w #0x010,a0
+ moveq #(0x0f0-0x010)/4-1,d0
+ move.l #Bad,d1
+cpy_Bad: move.l d1,(a0)+
+ dbra d0,cpy_Bad
+
+ .set vbase, 0x0200
+
+ lea vbase,a0
+ moveq #31,d0
+cpy_Bad1: move.l d1,(a0)+
+ dbra d0,cpy_Bad1
+
+|
+| Fill in special locations to configure OS
+|
+ move.l #Bad,0x008 | Bus Error
+ move.l #Bad,0x00c | Address Error
+ move.l #Bad,0x024 | Trace
+| move.l #KE_IRET,$0b4 | pSOS+ RET_I Call
+
+| move.l #_cnsl_isr,vbase+0x028 | SCC2
+ move.l #timerisr,vbase+0x018 | Timer ISR
+
+ |
+ | zero out uninitialized data area
+ |
+zerobss:
+ moveal # SYM (end),a0 | find end of .bss
+ moveal # SYM (bss_start),a1 | find beginning of .bss
+ moveq #0,d0
+
+loop: movel d0,a1@+ | to zero out uninitialized
+ cmpal a0,a1
+ jlt loop | loop until _end reached
+
+ movel # SYM (end),d0 | d0 = end of bss/start of heap
+ addl # SYM (heap_size),d0 | d0 = end of heap
+ movel d0, SYM (stack_start) | Save for brk() routine
+ addl # SYM (stack_size),d0 | make room for stack
+ andl #0xffffffc0,d0 | align it on 16 byte boundary
+ movw #0x3700,sr | SUPV MODE,INTERRUPTS OFF!!!
+ movel d0,a7 | set master stack pointer
+ movel d0,a6 | set base pointer
+
+ /*
+ * RTEMS should maintiain a separate interrupt stack on CPUs
+ * without one in hardware. This is currently not supported
+ * on versions of the m68k without a HW intr stack.
+ */
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ lea SYM (hiintstack),a0 | a0 = high end of intr stack
+ movec a0,isp | set interrupt stack
+#endif
+
+ move.l #0,a7@- | environp
+ move.l #0,a7@- | argv
+ move.l #0,a7@- | argc
+ jsr SYM (main)
+
+ nop
+Bad: bra Bad
+
+ nop
+END_CODE
+
+
+BEGIN_DATA
+
+ PUBLIC (start_frame)
+SYM (start_frame):
+ .space 4,0
+
+ PUBLIC (stack_start)
+SYM (stack_start):
+ .space 4,0
+END_DATA
+
+BEGIN_BSS
+
+ PUBLIC (environ)
+ .align 2
+SYM (environ):
+ .long 0
+
+ PUBLIC (heap_size)
+ .set SYM (heap_size),0x2000
+
+ PUBLIC (stack_size)
+ .set SYM (stack_size),0x1000
+
+
+END_DATA
+END
diff --git a/c/src/lib/libbsp/m68k/gen68302/startup/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/startup/Makefile.in
new file mode 100644
index 0000000000..fafc7d4264
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspstart bspclean sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/gen68302/startup/bspclean.c b/c/src/lib/libbsp/m68k/gen68302/startup/bspclean.c
new file mode 100644
index 0000000000..90f64272a3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/startup/bspclean.c
@@ -0,0 +1,26 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and usually returns
+ * control to a monitor.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+void bsp_cleanup( void )
+{
+}
diff --git a/c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c b/c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c
new file mode 100644
index 0000000000..7d03b0f646
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/startup/bspstart.c
@@ -0,0 +1,251 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /*
+ * The last parameter to RTEMS_Malloc_Initialize is the "chunk"
+ * size which a multiple of will be requested on each sbrk()
+ * call by malloc(). A value of 0 indicates that sbrk() should
+ * not be called to extend the heap.
+ */
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * Allocate the memory for the RTEMS Work Space. This can come from
+ * a variety of places: hard coded address, malloc'ed from outside
+ * RTEMS world (e.g. simulator or primitive memory manager), or (as
+ * typically done by stock BSPs) by subtracting the required amount
+ * of work space from the last physical address on the CPU board.
+ */
+#if 0
+ Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
+#endif
+
+
+ /*
+ * Copy the Configuration Table .. so we can change it
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ /*
+ * Need to "allocate" the memory for the RTEMS Workspace and
+ * tell the RTEMS configuration where it is. This memory is
+ * not malloc'ed. It is just "pulled from the air".
+ */
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ /*
+ * initialize the CPU table for this BSP
+ */
+
+ /*
+ * we do not use the pretasking_hook
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Don't forget the other CPU Table entries.
+ */
+
+ /*
+ * Start RTEMS
+ */
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds b/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds
new file mode 100644
index 0000000000..cabf3a2adc
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/startup/linkcmds
@@ -0,0 +1,46 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Generic MC68302 board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x0000, l = 16M
+ }
+
+m302 = 0xf7f000;
+_VBR = 0x000000; /* location of the VBR table (in RAM) */
+
+SECTIONS
+{
+ .text 0xc00000 :
+ {
+ text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+ }
+ .data 0x010000 :
+ {
+ data_start = . ;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/gen68302/timer/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/timer/Makefile.in
new file mode 100644
index 0000000000..c2ba3476d3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/gen68302/timer/timer.c b/c/src/lib/libbsp/m68k/gen68302/timer/timer.c
new file mode 100644
index 0000000000..83a10c4803
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/timer/timer.c
@@ -0,0 +1,130 @@
+/* Timer_init()
+ *
+ * This routine initializes TIMER 2 for an MC68302.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+#include "m68302.h"
+
+
+#define TMR2_VAL 0x071b /* Timer mode register
+ * (section 3.5.2.1 in 68302 manual)
+ * 15-8: "7" prescaler divide by 8 (x+1)
+ * 7-6: 00 dis. intr. on capture event
+ * 5: 0 active-low pulse
+ * 4: 1 intr. on reaching reference
+ * 3: 1 restart counter on reference
+ * 2-1: 01 master clock input source
+ * 0: 1 enable timer
+ */
+#define TRR2_VAL 2000 /* Timer reference register
+ * (section 3.5.2.2 in 68302 manual)
+ * 2000 ticks @ (16MHz/1)/8 = 1-ms count
+ */
+
+rtems_unsigned32 Timer_interrupts;
+
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+void Timer_initialize( void )
+{
+ m302.reg.tmr2 = 0; /* disable timer */
+
+ Timer_interrupts = 0; /* clear timer ISR count */
+
+ m302.reg.trr2 = TRR2_VAL; /* set timer reference register */
+ m302.reg.tmr2 = TMR2_VAL; /* set timer mode register */
+ m302.reg.imr |= RBIT_IMR_TIMER2; /* set 68302 int-mask to allow ints */
+}
+
+/*
+ * The following controls the behavior of Read_timer().
+ *
+ * FIND_AVG_OVERHEAD * instructs the routine to return the "raw" count.
+ *
+ * AVG_OVEREHAD is the overhead for starting and stopping the timer. It
+ * is usually deducted from the number returned.
+ *
+ * LEAST_VALID is the lowest number this routine should trust. Numbers
+ * below this are "noise" and zero is returned.
+ */
+
+#define AVG_OVERHEAD 0 /* It typically takes X.X microseconds */
+ /* (Y countdowns) to start/stop the timer. */
+ /* This value is in microseconds. */
+#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */
+
+/*
+ * Return timer value in 1/2-microsecond units
+ */
+int Read_timer( void )
+{
+ rtems_unsigned16 clicks;
+ rtems_unsigned32 total;
+
+ /*
+ * Read the timer and see how many clicks it has been since counter
+ * rolled over.
+ */
+
+ clicks = m302.reg.tcn2;
+
+ /*
+ * Total is calculated by taking into account the number of timer overflow
+ * interrupts since the timer was initialized and clicks since the last
+ * interrupts.
+ */
+
+ total = (Timer_interrupts * TRR2_VAL) + clicks;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in XXX microsecond units */
+
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ /*
+ * Convert 1/2-microsecond count into microseconds
+ */
+
+ return (total - AVG_OVERHEAD) >> 1;
+}
+
+
+/*
+ * Empty function call used in loops to measure basic cost of looping
+ * in Timing Test Suite.
+ */
+
+rtems_status_code Empty_function(void)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/gen68302/timer/timerisr.s b/c/src/lib/libbsp/m68k/gen68302/timer/timerisr.s
new file mode 100644
index 0000000000..c804b9dfa6
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/timer/timerisr.s
@@ -0,0 +1,28 @@
+/*
+ * Handle 68302 TIMER2 interrupts.
+ *
+ * All code in this routine is pure overhead which can perturb the
+ * accuracy of RTEMS' timing test suite.
+ *
+ * See also: Read_timer()
+ *
+ * To reduce overhead this is best to be the "rawest" hardware interupt
+ * handler you can write. This should be the only interrupt which can
+ * occur during the measured time period.
+ *
+ * An external counter, Timer_interrupts, is incremented.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+ PUBLIC(timerisr)
+SYM(timerisr):
+ move.w #0x0040,SYM(m302)+2072 | clear interrupt in-service bit
+ move.b #3,SYM(m302)+2137 | clear timer interrupt event register
+ addq.l #1,SYM(Timer_interrupts) | increment timer value
+ rte
+END_CODE
+END
diff --git a/c/src/lib/libbsp/m68k/gen68302/times b/c/src/lib/libbsp/m68k/gen68302/times
new file mode 100644
index 0000000000..dcb4aec1bd
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/times
@@ -0,0 +1,193 @@
+#
+# Timing Test Suite Results for the generic 68302 BSP
+#
+# $Id$
+#
+
+NOTE: This BSP is used submitted and no information is currently available.
+
+Board: gen68302
+CPU: Motorola 68302
+Clock Speed: 16 Mhz
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column A: unused
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/m68k/gen68302/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/gen68302/wrapup/Makefile.in
new file mode 100644
index 0000000000..bd06f5f90f
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68302/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/gen68360/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/Makefile.in
new file mode 100644
index 0000000000..9581a49c3b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/Makefile.in
@@ -0,0 +1,19 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SRCS=README
+
+all: $(SRCS)
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include start360 startup clock console timer wrapup
diff --git a/c/src/lib/libbsp/m68k/gen68360/README b/c/src/lib/libbsp/m68k/gen68360/README
new file mode 100644
index 0000000000..f0dd2a1bf0
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/README
@@ -0,0 +1,302 @@
+#
+# $Id$
+#
+
+#
+# This package works best with a version of GCC that has been modified
+# to support the `-mcpu32' argument. I have submitted the required
+# changes to the GCC maintainers.
+#
+
+#
+# Please send any comments, improvements, or bug reports to:
+# W. Eric Norum
+# Saskatchewan Accelerator Laboratory
+# 107 North Road
+# University of Saskatchewan
+# Saskatoon, Saskatchewan, CANADA
+# S7N 5C6
+# eric@skatter.usask.ca
+#
+
+#
+# This board support package works with several different versions of
+# MC68360 systems. The choice of hardware is made at the final link-edit
+# phase by setting the Makefile LDFLAGS definition appropriately.
+#
+# Decisions made at compile time include:
+# - If the CPU is a member of the 68040 family, the BSP is
+# compiled for a generic 68040/68360 system as described
+# in Chapter 9 of the MC68360 User's Manual.
+# - If the preprocessor symbol M68360_ATLAS_HSB is defined,
+# the BSP is compiled for an Atlas HSB card.
+# - Otherwise, the BSP is compiled for a generic 68360 system
+# as described in Chapter 9 of the MC68360 User's Manual.
+#
+# Decisions to be made a link-edit time are:
+# - The amount of dynamic RAM in the system. This value applies
+# only to hardware versions which support different sizes of RAM.
+# The default value is 4 Mbytes. To specify 16 Mbytes of memory,
+# --defsym RamSize=0x1000000
+#
+# - The size of the memory allocator heap. The default value is
+# 64 kbytes. To choose a heap size of 256 kbytes,
+# --defsym HeapSize=0x40000
+#
+# - The Ethernet address for network boot proms.
+
+BSP NAME: gen68360 or gen68360_040
+BOARD: Generic 68360 as described in Motorola MC68360 User's Manual
+BOARD: Atlas Computer Equipment Inc. High Speed Bridge (HSB)
+BOARD: Atlas Computer Equipment Inc. Advanced Communication Engine (ACE)
+BOARD: Arnewsh SBC360 68040/68360 card
+BUS: none
+CPU FAMILY: Motorola CPU32+, Motorola 68040
+COPROCESSORS: none
+MODE: not applicable
+
+DEBUG MONITOR: none (Hardware provides BDM)
+
+PERIPHERALS
+===========
+TIMERS: PIT, Watchdog, 4 general purpose, 16 RISC
+ RESOLUTION: one microsecond
+SERIAL PORTS: 4 SCC, 2 SMC, 1 SPI
+REAL-TIME CLOCK:
+DMA: Each serial port, 2 general purpose
+VIDEO: none
+SCSI: none
+NETWORKING: Ethernet on SCC1.
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: Programmable Interval Timer
+IOSUPP DRIVER: Serial Management Controller 1
+SHMSUPP: none
+TIMER DRIVER: Timer 1
+
+STDIO
+=====
+PORT: SMC1
+ELECTRICAL: EIA-232 (if board supplies level shifter)
+BAUD: 9600
+BITS PER CHARACTER: 8
+PARITY: None
+STOP BITS: 1
+
+NOTES
+=====
+
+Board description
+-----------------
+clock rate: 25 MHz
+bus width: 8-bit PROM, 32-bit DRAM
+ROM: To 1 MByte, 180 nsec (3 wait states), chip select 0
+RAM: 1 to 64 MByte DRAM SIMM, 60 nsec (0 wait states), parity or nonparity
+
+Host System
+-----------
+NEXTSTEP 3.3 (Intel and Motorola), Solaris 2.5
+gcc-2.7.2
+binutils-2.6
+
+Verification (Standalone 68360)
+-------------------------------
+Single processor tests: Passed
+Multi-processort tests: not applicable
+Timing tests:
+ Context Switch
+
+ context switch: self 10
+ context switch: to another task 11
+ context switch: no floating point contexts 40
+ fp context switch: restore 1st FP task 41
+ fp context switch: save initialized, restore initialized 14
+ fp context switch: save idle, restore initialized 14
+ fp context switch: save idle, restore idle 43
+
+ Task Manager
+
+ rtems_task_create 133
+ rtems_task_ident 351
+ rtems_task_start 77
+ rtems_task_restart: calling task 93
+ rtems_task_restart: suspended task -- returns to caller 90
+ rtems_task_restart: blocked task -- returns to caller 120
+ rtems_task_restart: ready task -- returns to caller 92
+ rtems_task_restart: suspended task -- preempts caller 121
+ rtems_task_restart: blocked task -- preempts caller 143
+ rtems_task_restart: ready task -- preempts caller 138
+ rtems_task_delete: calling task 158
+ rtems_task_delete: suspended task 129
+ rtems_task_delete: blocked task 134
+ rtems_task_delete: ready task 136
+ rtems_task_suspend: calling task 71
+ rtems_task_suspend: returns to caller 47
+ rtems_task_resume: task readied -- returns to caller 48
+ rtems_task_resume: task readied -- preempts caller 67
+ rtems_task_set_priority: obtain current priority 36
+ rtems_task_set_priority: returns to caller 65
+ rtems_task_set_priority: preempts caller 102
+ rtems_task_mode: obtain current mode 13
+ rtems_task_mode: no reschedule 15
+ rtems_task_mode: reschedule -- returns to caller 22
+ rtems_task_mode: reschedule -- preempts caller 61
+ rtems_task_get_note 38
+ rtems_task_set_note 37
+ rtems_task_wake_after: yield -- returns to caller 22
+ rtems_task_wake_after: yields -- preempts caller 56
+ rtems_task_wake_when 110
+
+ Interrupt Manager
+
+ interrupt entry overhead: returns to nested interrupt 8
+ interrupt entry overhead: returns to interrupted task 8
+ interrupt entry overhead: returns to preempting task 8
+ interrupt exit overhead: returns to nested interrupt 7
+ interrupt exit overhead: returns to interrupted task 8
+ interrupt exit overhead: returns to preempting task 52
+
+ Clock Manager
+
+ rtems_clock_set 82
+ rtems_clock_get 2
+ rtems_clock_tick 15
+
+ Timer Manager
+
+ rtems_timer_create 33
+ rtems_timer_ident 343
+ rtems_timer_delete: inactive 47
+ rtems_timer_delete: active 50
+ rtems_timer_fire_after: inactive 59
+ rtems_timer_fire_after: active 63
+ rtems_timer_fire_when: inactive 83
+ rtems_timer_fire_when: active 83
+ rtems_timer_reset: inactive 55
+ rtems_timer_reset: active 58
+ rtems_timer_cancel: inactive 35
+ rtems_timer_cancel: active 38
+
+ Semaphore Manager
+
+ rtems_semaphore_create 62
+ rtems_semaphore_ident 368
+ rtems_semaphore_delete 61
+ rtems_semaphore_obtain: available 42
+ rtems_semaphore_obtain: not available -- NO_WAIT 42
+ rtems_semaphore_obtain: not available -- caller blocks 105
+ rtems_semaphore_release: no waiting tasks 46
+ rtems_semaphore_release: task readied -- returns to caller 64
+ rtems_semaphore_release: task readied -- preempts caller 84
+
+ Message Queue Manager
+
+ rtems_message_queue_create 240
+ rtems_message_queue_ident 342
+ rtems_message_queue_delete 79
+ rtems_message_queue_send: no waiting tasks 93
+ rtems_message_queue_send: task readied -- returns to caller 96
+ rtems_message_queue_send: task readied -- preempts caller 116
+ rtems_message_queue_urgent: no waiting tasks 93
+ rtems_message_queue_urgent: task readied -- returns to caller 97
+ rtems_message_queue_urgent: task readied -- preempts caller 117
+ rtems_message_queue_broadcast: no waiting tasks 54
+ rtems_message_queue_broadcast: task readied -- returns to caller 106
+ rtems_message_queue_broadcast: task readied -- preempts caller 126
+ rtems_message_queue_receive: available 79
+ rtems_message_queue_receive: not available -- NO_WAIT 48
+ rtems_message_queue_receive: not available -- caller blocks 111
+ rtems_message_queue_flush: no messages flushed 35
+ rtems_message_queue_flush: messages flushed 44
+
+ Event Manager
+
+ rtems_event_send: no task readied 30
+ rtems_event_send: task readied -- returns to caller 59
+ rtems_event_send: task readied -- preempts caller 81
+ rtems_event_receive: obtain current events 1
+ rtems_event_receive: available 34
+ rtems_event_receive: not available -- NO_WAIT 31
+ rtems_event_receive: not available -- caller blocks 84
+
+ Signal Manager
+
+ rtems_signal_catch 24
+ rtems_signal_send: returns to caller 42
+ rtems_signal_send: signal to self 47
+ exit ASR overhead: returns to calling task 33
+ exit ASR overhead: returns to preempting task 58
+
+ Partition Manager
+
+ rtems_partition_create 78
+ rtems_partition_ident 342
+ rtems_partition_delete 46
+ rtems_partition_get_buffer: available 40
+ rtems_partition_get_buffer: not available 39
+ rtems_partition_return_buffer 47
+
+ Region Manager
+
+ rtems_region_create 65
+ rtems_region_ident 349
+ rtems_region_delete 45
+ rtems_region_get_segment: available 55
+ rtems_region_get_segment: not available -- NO_WAIT 52
+ rtems_region_get_segment: not available -- caller blocks 119
+ rtems_region_return_segment: no waiting tasks 57
+ rtems_region_return_segment: task readied -- returns to caller 106
+ rtems_region_return_segment: task readied -- preempts caller 127
+
+ Dual-Ported Memory Manager
+
+ rtems_port_create 40
+ rtems_port_ident 342
+ rtems_port_delete 44
+ rtems_port_internal_to_external 32
+ rtems_port_external_to_internal 32
+
+ IO Manager
+
+ rtems_io_initialize 4
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+ Rate Monotonic Manager
+
+ rtems_rate_monotonic_create 39
+ rtems_rate_monotonic_ident 343
+ rtems_rate_monotonic_cancel 43
+ rtems_rate_monotonic_delete: active 54
+ rtems_rate_monotonic_delete: inactive 52
+ rtems_rate_monotonic_period: obtain status 37
+ rtems_rate_monotonic_period: initiate period -- returns to caller 58
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 75
+
+Porting
+-------
+This board support package is written for a 68360 system similar to that
+described in chapter 9 of the Motorola MC68360 Quad Integrated Communication
+Processor Users' Manual. The salient features of this hardware are:
+
+ 25 MHz external clock
+ DRAM address multiplexing provided by 68360
+ 8-bit 180nsec PROM to CS0*
+ 4 MBytes of 60 nsec parity DRAM (1Mx36) to RAS1*/CAS1*
+ Console serial port on SMC1
+ Ethernet interface on SCC1
+
+The board support package has been tested with:
+ A home-built 68360 board
+ An ACE360A and an HSB board produced by:
+ Atlas Computer Equipment
+ 703 Colina Lane
+ Santa Barbara, CA 93103
+ A 68040/68360 board (SBC360) produced by:
+ Arnewsh Inc.
+ P.O. Box 270352
+ Fort Collins, CO 80527-0352
diff --git a/c/src/lib/libbsp/m68k/gen68360/bsp_specs b/c/src/lib/libbsp/m68k/gen68360/bsp_specs
new file mode 100644
index 0000000000..d5abc9edac
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start360.o%s
+{!pg:
+g: start360.o%s
+{!g:
+p: start360.o%s
+!p: start360.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/gen68360/clock/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/clock/Makefile.in
new file mode 100644
index 0000000000..8e325402ca
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/clock/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c b/c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c
new file mode 100644
index 0000000000..041226f48b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/clock/ckinit.c
@@ -0,0 +1,158 @@
+/*
+ * This routine initializes the MC68360 Periodic Interval Timer
+ *
+ * The PIT has rather poor resolution, but it is easy to set up
+ * and requires no housekeeping once it is going.
+ *
+ * Based on the `gen68302' board support package, and covered by the
+ * original distribution terms.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+/*
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ */
+
+#include <stdlib.h> /* for atexit() */
+#include <bsp.h>
+#include <rtems/libio.h>
+#include "m68360.h"
+
+#define CLOCK_VECTOR 120
+#define CLOCK_IRQ_LEVEL 6
+
+/*
+ * Clock_driver_ticks is a monotonically increasing counter of the
+ * number of clock ticks since the driver was initialized.
+ */
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * Periodic interval timer interrupt handler
+ */
+rtems_isr
+Clock_isr (rtems_vector_number vector)
+{
+ /*
+ * Perform a dummy read of DPRAM.
+ * This works around a bug in Rev. B of the 68360
+ */
+ m360.dpram0[0];
+
+ /*
+ * Announce the clock tick
+ */
+ Clock_driver_ticks++;
+ rtems_clock_tick();
+}
+
+void
+Clock_exit (void)
+{
+ if (BSP_Configuration.ticks_per_timeslice ) {
+ /*
+ * Turn off periodic interval timer
+ */
+ m360.pitr &= ~0xFF;
+ }
+}
+
+static void
+Install_clock (rtems_isr_entry clock_isr)
+{
+ Clock_driver_ticks = 0;
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ int pitr;
+
+ /*
+ * Choose periodic interval timer register value
+ * For a 25 MHz external clock the basic clock rate is
+ * 40 nsec * 128 * 4 = 20.48 usec/tick
+ */
+ pitr = ((BSP_Configuration.microseconds_per_tick * 100) + 1023) / 2048;
+ if (pitr >= 256) {
+ pitr = (pitr + 255) / 512;
+ if (pitr >= 256)
+ pitr = 255;
+ else if (pitr == 0)
+ pitr = 1;
+ pitr |= 0x100;
+ }
+ else if (pitr == 0) {
+ pitr = 1;
+ }
+ m360.pitr &= ~0x1FF;
+ m360.picr = (CLOCK_IRQ_LEVEL << 8) | CLOCK_VECTOR;
+ set_vector (clock_isr, CLOCK_VECTOR, 1);
+ m360.pitr |= pitr;
+ atexit (Clock_exit);
+ }
+}
+
+rtems_device_driver
+Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock (Clock_isr);
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args) {
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+ if (args->command == rtems_build_name('I', 'S', 'R', ' ')) {
+ Clock_isr( CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' ')) {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+ }
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/console/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/gen68360/console/console.c b/c/src/lib/libbsp/m68k/gen68360/console/console.c
new file mode 100644
index 0000000000..c392c2e6b4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/console/console.c
@@ -0,0 +1,308 @@
+/*
+ * Initialize SMC1 for console IO.
+ *
+ * Based on the `gen68302' board support package, and covered by the
+ * original distribution terms.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ */
+
+#define GEN68360_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include "m68360.h"
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+/*
+ * I/O buffers can be in ordindary RAM
+ */
+static volatile char rxBuf, txBuf;
+static volatile m360BufferDescriptor_t *consoleRxBd, *consoleTxBd;
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ /*
+ * Allocate buffer descriptors
+ */
+ consoleRxBd = M360AllocateBufferDescriptors (1);
+ consoleTxBd = M360AllocateBufferDescriptors (1);
+
+ /*
+ * Configure port B pins to enable SMTXD1 and SMRXD1 pins
+ */
+ m360.pbpar |= 0xC0;
+ m360.pbdir &= ~0xC0;
+ m360.pbodr &= ~0xC0;
+
+ /*
+ * Set up BRG1 (9,600 baud)
+ */
+ m360.brgc1 = M360_BRG_RST;
+ m360.brgc1 = M360_BRG_EN | M360_BRG_EXTC_BRGCLK | M360_BRG_9600;
+
+ /*
+ * Put SMC1 in NMSI mode, connect SMC1 to BRG1
+ */
+ m360.simode |= M360_SI_SMC1_BRG1;
+
+ /*
+ * Set up SMC1 parameter RAM common to all protocols
+ */
+ m360.smc1p.rbase = (char *)consoleRxBd - (char *)&m360;
+ m360.smc1p.tbase = (char *)consoleTxBd - (char *)&m360;
+ m360.smc1p.rfcr = M360_RFCR_MOT | M360_RFCR_DMA_SPACE;
+ m360.smc1p.tfcr = M360_TFCR_MOT | M360_TFCR_DMA_SPACE;
+ m360.smc1p.mrblr = 1;
+
+ /*
+ * Set up SMC1 parameter RAM UART-specific parameters
+ */
+ m360.smc1p.un.uart.max_idl = 0;
+ m360.smc1p.un.uart.brklen = 0;
+ m360.smc1p.un.uart.brkec = 0;
+ m360.smc1p.un.uart.brkcr = 0;
+
+ /*
+ * Set up the Receive Buffer Descriptor
+ */
+ consoleRxBd->status = M360_BD_EMPTY | M360_BD_WRAP;
+ consoleRxBd->length = 0;
+ consoleRxBd->buffer = &rxBuf;
+
+ /*
+ * Setup the Transmit Buffer Descriptor
+ */
+ consoleTxBd->length = 1;
+ consoleTxBd->status = M360_BD_WRAP;
+ consoleTxBd->buffer = &txBuf;
+
+ /*
+ * Set up SMC1 general and protocol-specific mode registers
+ */
+ m360.smc1.smce = ~0; /* Clear any pending events */
+ m360.smc1.smcm = 0; /* Mask all interrupt/event sources */
+ m360.smc1.smcmr = M360_SMCMR_CLEN(9) | M360_SMCMR_SM_UART;
+
+ /*
+ * Send "Init parameters" command
+ */
+ M360ExecuteRISC (M360_CR_OP_INIT_RX_TX | M360_CR_CHAN_SMC1);
+
+ /*
+ * Enable receiver and transmitter
+ */
+ m360.smc1.smcmr |= M360_SMCMR_TEN | M360_SMCMR_REN;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number)0);
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+ return RTEMS_SUCCESSFUL;
+}
+
+/* is_character_ready
+ *
+ * Check to see if a character is available on the console port. If so,
+ * then return a TRUE (along with the character). Otherwise return FALSE.
+ *
+ * Input parameters: pointer to location in which to return character
+ *
+ * Output parameters: character (if available)
+ *
+ * Return values: TRUE - character available
+ * FALSE - no character available
+ */
+
+rtems_boolean is_character_ready(
+ char *ch /* -> character */
+)
+{
+ if (consoleRxBd->status & M360_BD_EMPTY)
+ return FALSE;
+ *ch = rxBuf;
+ consoleRxBd->status = M360_BD_EMPTY | M360_BD_WRAP;
+ return TRUE;
+}
+
+
+/* inbyte
+ *
+ * Receive a character from the console port
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values: character read
+ */
+
+char inbyte( void )
+{
+ char ch;
+
+ while (is_character_ready (&ch) == FALSE)
+ continue;
+ return ch;
+}
+
+
+/* outbyte
+ *
+ * Transmit a character to the console serial port
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ if (ch == '\n')
+ outbyte('\r');
+ while (consoleTxBd->status & M360_BD_READY)
+ continue;
+ txBuf = ch;
+ consoleTxBd->status = M360_BD_READY | M360_BD_WRAP;
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/include/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/gen68360/include/bsp.h b/c/src/lib/libbsp/m68k/gen68360/include/bsp.h
new file mode 100644
index 0000000000..bcb0044401
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/include/bsp.h
@@ -0,0 +1,150 @@
+/*
+ * Board Support Package for `Generic' Motorola MC68360
+ *
+ * Based on the `gen68302' board support package, and covered by the
+ * original distribution terms.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+/* bsp.h
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ */
+
+#ifndef __GEN68360_BSP_h
+#define __GEN68360_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <console.h>
+#include <iosupp.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Stuff for Time Test 27
+ * Don't bother with hardware -- just use a software-interrupt
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 34, 1 )
+
+#define Cause_tm27_intr() asm volatile ("trap #2");
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { register rtems_unsigned32 _delay=(microseconds); \
+ register rtems_unsigned32 _tmp=123; \
+ asm volatile( "0: \
+ nbcd %0 ; \
+ nbcd %0 ; \
+ dbf %1,0b" \
+ : "=d" (_tmp), "=d" (_delay) \
+ : "0" (_tmp), "1" (_delay) ); \
+ }
+
+/* Constants */
+
+/* Structures */
+
+#ifdef GEN68360_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/* functions */
+
+void bsp_cleanup( void );
+
+void M360ExecuteRISC( rtems_unsigned16 command );
+void *M360AllocateBufferDescriptors( int count );
+void *M360AllocateRiscTimers( int count );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+/*
+ * Values assigned by link editor
+ */
+extern void *_RomBase, *_RamBase, *_RamSize;
+
+/*
+ * Definitions for Atlas Computer Equipment Inc. High Speed Bridge (HSB)
+ */
+#define ATLASHSB_ESR 0x20010000L
+#define ATLASHSB_USICR 0x20010001L
+#define ATLASHSB_DSRR 0x20010002L
+#define ATLASHSB_LED4 0x20010004L
+#define ATLASHSB_ROM_U6 0xFF080000L /* U6 flash ROM socket */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/gen68360/include/coverhd.h b/c/src/lib/libbsp/m68k/gen68360/include/coverhd.h
new file mode 100644
index 0000000000..020543466f
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/include/coverhd.h
@@ -0,0 +1,76 @@
+/*
+ * This file was machine-generated from the tmoverhd.exe output
+ *
+ * $Id$
+ */
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 2
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 2
+#define CALLING_OVERHEAD_TASK_CREATE 3
+#define CALLING_OVERHEAD_TASK_IDENT 3
+#define CALLING_OVERHEAD_TASK_START 3
+#define CALLING_OVERHEAD_TASK_RESTART 2
+#define CALLING_OVERHEAD_TASK_DELETE 2
+#define CALLING_OVERHEAD_TASK_SUSPEND 2
+#define CALLING_OVERHEAD_TASK_RESUME 2
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 3
+#define CALLING_OVERHEAD_TASK_MODE 3
+#define CALLING_OVERHEAD_TASK_GET_NOTE 3
+#define CALLING_OVERHEAD_TASK_SET_NOTE 3
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 5
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 2
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 3
+#define CALLING_OVERHEAD_CLOCK_GET 6
+#define CALLING_OVERHEAD_CLOCK_SET 5
+#define CALLING_OVERHEAD_CLOCK_TICK 1
+#define CALLING_OVERHEAD_TIMER_CREATE 2
+#define CALLING_OVERHEAD_TIMER_DELETE 2
+#define CALLING_OVERHEAD_TIMER_IDENT 2
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 3
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 7
+#define CALLING_OVERHEAD_TIMER_RESET 2
+#define CALLING_OVERHEAD_TIMER_CANCEL 2
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 3
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 2
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 3
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 3
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 3
+#define CALLING_OVERHEAD_EVENT_SEND 3
+#define CALLING_OVERHEAD_EVENT_RECEIVE 3
+#define CALLING_OVERHEAD_SIGNAL_CATCH 2
+#define CALLING_OVERHEAD_SIGNAL_SEND 3
+#define CALLING_OVERHEAD_PARTITION_CREATE 4
+#define CALLING_OVERHEAD_PARTITION_IDENT 3
+#define CALLING_OVERHEAD_PARTITION_DELETE 2
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 3
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 3
+#define CALLING_OVERHEAD_REGION_CREATE 4
+#define CALLING_OVERHEAD_REGION_IDENT 2
+#define CALLING_OVERHEAD_REGION_DELETE 2
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 3
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 3
+#define CALLING_OVERHEAD_PORT_CREATE 4
+#define CALLING_OVERHEAD_PORT_IDENT 2
+#define CALLING_OVERHEAD_PORT_DELETE 2
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 3
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 3
+#define CALLING_OVERHEAD_IO_INITIALIZE 3
+#define CALLING_OVERHEAD_IO_OPEN 3
+#define CALLING_OVERHEAD_IO_CLOSE 3
+#define CALLING_OVERHEAD_IO_READ 3
+#define CALLING_OVERHEAD_IO_WRITE 3
+#define CALLING_OVERHEAD_IO_CONTROL 3
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 2
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
diff --git a/c/src/lib/libbsp/m68k/gen68360/include/sio.h b/c/src/lib/libbsp/m68k/gen68360/include/sio.h
new file mode 100644
index 0000000000..a93544c312
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/include/sio.h
@@ -0,0 +1,62 @@
+/* sio.h
+ *
+ * sio device driver for UART SCC and SMC
+ *
+ * COPYRIGHT (c) 1997 Pacific Computing
+ *
+ * $Id$
+ */
+
+#ifndef _SIO_DRIVER_h
+#define _SIO_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SIO_DRIVER_TABLE_ENTRY \
+ { sio_initialize, sio_open, sio_close, \
+ sio_read, sio_write, sio_control }
+
+rtems_device_driver sio_initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver sio_open(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver sio_close(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver sio_read(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver sio_write(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver sio_control(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/gen68360/start/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/start/Makefile.in
new file mode 100644
index 0000000000..9b6dd903ea
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/start/Makefile.in
@@ -0,0 +1,56 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGMS=${ARCH}/start360.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=start360
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/c/src/lib/libbsp/m68k/gen68360/start/start360.s b/c/src/lib/libbsp/m68k/gen68360/start/start360.s
new file mode 100644
index 0000000000..a384912254
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/start/start360.s
@@ -0,0 +1,424 @@
+/*
+ *
+ * This file contains the entry point for the application.
+ * The name of this entry point is compiler dependent.
+ * It jumps to the BSP which is responsible for performing
+ * all initialization.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Based on the `gen68302' board support package, and covered by the
+ * original distribution terms.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+ /*
+ * Step 1: Decide on Reset Stack Pointer and Initial Program Counter
+ */
+Entry:
+ .long SYM(m360)+1024 | 0: Initial SSP
+ .long start | 1: Initial PC
+ .long uhoh | 2: Bus error
+ .long uhoh | 3: Address error
+ .long uhoh | 4: Illegal instruction
+ .long uhoh | 5: Zero division
+ .long uhoh | 6: CHK, CHK2 instruction
+ .long uhoh | 7: TRAPcc, TRAPV instructions
+ .long uhoh | 8: Privilege violation
+ .long uhoh | 9: Trace
+ .long uhoh | 10: Line 1010 emulator
+ .long uhoh | 11: Line 1111 emulator
+ .long uhoh | 12: Hardware breakpoint
+ .long uhoh | 13: Reserved for coprocessor violation
+ .long uhoh | 14: Format error
+ .long uhoh | 15: Uninitialized interrupt
+ .long uhoh | 16: Unassigned, reserved
+ .long uhoh | 17:
+ .long uhoh | 18:
+ .long uhoh | 19:
+ .long uhoh | 20:
+ .long uhoh | 21:
+ .long uhoh | 22:
+ .long uhoh | 23:
+ .long spurious_interrupt | 24: Spurious interrupt
+ .long uhoh | 25: Level 1 interrupt autovector
+ .long uhoh | 26: Level 2 interrupt autovector
+ .long uhoh | 27: Level 3 interrupt autovector
+ .long uhoh | 28: Level 4 interrupt autovector
+ .long uhoh | 29: Level 5 interrupt autovector
+ .long uhoh | 30: Level 6 interrupt autovector
+ .long uhoh | 31: Level 7 interrupt autovector
+ .long uhoh | 32: Trap instruction (0-15)
+ .long uhoh | 33:
+ .long uhoh | 34:
+ .long uhoh | 35:
+ .long uhoh | 36:
+ .long uhoh | 37:
+ .long uhoh | 38:
+ .long uhoh | 39:
+ .long uhoh | 40:
+ .long uhoh | 41:
+ .long uhoh | 42:
+ .long uhoh | 43:
+ .long uhoh | 44:
+ .long uhoh | 45:
+ .long uhoh | 46:
+ .long uhoh | 47:
+ .long uhoh | 48: Reserved for coprocessor
+ .long uhoh | 49:
+ .long uhoh | 50:
+ .long uhoh | 51:
+ .long uhoh | 52:
+ .long uhoh | 53:
+ .long uhoh | 54:
+ .long uhoh | 55:
+ .long uhoh | 56:
+ .long uhoh | 57:
+ .long uhoh | 58:
+ .long uhoh | 59: Unassigned, reserved
+ .long uhoh | 60:
+ .long uhoh | 61:
+ .long uhoh | 62:
+ .long uhoh | 63:
+ .long uhoh | 64: User defined vectors (192)
+ .long uhoh | 65:
+ .long uhoh | 66:
+ .long uhoh | 67:
+ .long uhoh | 68:
+ .long uhoh | 69:
+ .long uhoh | 70:
+ .long uhoh | 71:
+ .long uhoh | 72:
+ .long uhoh | 73:
+ .long uhoh | 74:
+ .long uhoh | 75:
+ .long uhoh | 76:
+ .long uhoh | 77:
+ .long uhoh | 78:
+ .long uhoh | 79:
+ .long uhoh | 80:
+ .long uhoh | 81:
+ .long uhoh | 82:
+ .long uhoh | 83:
+ .long uhoh | 84:
+ .long uhoh | 85:
+ .long uhoh | 86:
+ .long uhoh | 87:
+ .long uhoh | 88:
+ .long uhoh | 89:
+ .long uhoh | 90:
+ .long uhoh | 91:
+ .long uhoh | 92:
+ .long uhoh | 93:
+ .long uhoh | 94:
+ .long uhoh | 95:
+ .long uhoh | 96:
+ .long uhoh | 97:
+ .long uhoh | 98:
+ .long uhoh | 99:
+ .long uhoh | 100:
+ .long uhoh | 101:
+ .long uhoh | 102:
+ .long uhoh | 103:
+ .long uhoh | 104:
+ .long uhoh | 105:
+ .long uhoh | 106:
+ .long uhoh | 107:
+ .long uhoh | 108:
+ .long uhoh | 109:
+ .long uhoh | 110:
+ .long uhoh | 111:
+ .long uhoh | 112:
+ .long uhoh | 113:
+ .long uhoh | 114:
+ .long uhoh | 115:
+ .long uhoh | 116:
+ .long uhoh | 117:
+ .long uhoh | 118:
+ .long uhoh | 119:
+ .long uhoh | 120:
+ .long uhoh | 121:
+ .long uhoh | 122:
+ .long uhoh | 123:
+ .long uhoh | 124:
+ .long uhoh | 125:
+ .long uhoh | 126:
+ .long uhoh | 127:
+ .long uhoh | 128:
+ .long uhoh | 129:
+ .long uhoh | 130:
+ .long uhoh | 131:
+ .long uhoh | 132:
+ .long uhoh | 133:
+ .long uhoh | 134:
+ .long uhoh | 135:
+ .long uhoh | 136:
+ .long uhoh | 137:
+ .long uhoh | 138:
+ .long uhoh | 139:
+ .long uhoh | 140:
+ .long uhoh | 141:
+ .long uhoh | 142:
+ .long uhoh | 143:
+ .long uhoh | 144:
+ .long uhoh | 145:
+ .long uhoh | 146:
+ .long uhoh | 147:
+ .long uhoh | 148:
+ .long uhoh | 149:
+ .long uhoh | 150:
+ .long uhoh | 151:
+ .long uhoh | 152:
+ .long uhoh | 153:
+ .long uhoh | 154:
+ .long uhoh | 155:
+ .long uhoh | 156:
+ .long uhoh | 157:
+ .long uhoh | 158:
+ .long uhoh | 159:
+ .long uhoh | 160:
+ .long uhoh | 161:
+ .long uhoh | 162:
+ .long uhoh | 163:
+ .long uhoh | 164:
+ .long uhoh | 165:
+ .long uhoh | 166:
+ .long uhoh | 167:
+ .long uhoh | 168:
+ .long uhoh | 169:
+ .long uhoh | 170:
+ .long uhoh | 171:
+ .long uhoh | 172:
+ .long uhoh | 173:
+ .long uhoh | 174:
+ .long uhoh | 175:
+ .long uhoh | 176:
+ .long uhoh | 177:
+ .long uhoh | 178:
+ .long uhoh | 179:
+ .long uhoh | 180:
+ .long uhoh | 181:
+ .long uhoh | 182:
+ .long uhoh | 183:
+ .long uhoh | 184:
+ .long uhoh | 185:
+ .long uhoh | 186:
+ .long uhoh | 187:
+ .long uhoh | 188:
+ .long uhoh | 189:
+ .long uhoh | 190:
+ .long uhoh | 191:
+ .long uhoh | 192:
+ .long uhoh | 193:
+ .long uhoh | 194:
+ .long uhoh | 195:
+ .long uhoh | 196:
+ .long uhoh | 197:
+ .long uhoh | 198:
+ .long uhoh | 199:
+ .long uhoh | 200:
+ .long uhoh | 201:
+ .long uhoh | 202:
+ .long uhoh | 203:
+ .long uhoh | 204:
+ .long uhoh | 205:
+ .long uhoh | 206:
+ .long uhoh | 207:
+ .long uhoh | 208:
+ .long uhoh | 209:
+ .long uhoh | 210:
+ .long uhoh | 211:
+ .long uhoh | 212:
+ .long uhoh | 213:
+ .long uhoh | 214:
+ .long uhoh | 215:
+ .long uhoh | 216:
+ .long uhoh | 217:
+ .long uhoh | 218:
+ .long uhoh | 219:
+ .long uhoh | 220:
+ .long uhoh | 221:
+ .long uhoh | 222:
+ .long uhoh | 223:
+ .long uhoh | 224:
+ .long uhoh | 225:
+ .long uhoh | 226:
+ .long uhoh | 227:
+ .long uhoh | 228:
+ .long uhoh | 229:
+ .long uhoh | 230:
+ .long uhoh | 231:
+ .long uhoh | 232:
+ .long uhoh | 233:
+ .long uhoh | 234:
+ .long uhoh | 235:
+ .long uhoh | 236:
+ .long uhoh | 237:
+ .long uhoh | 238:
+ .long uhoh | 239:
+ .long uhoh | 240:
+ .long uhoh | 241:
+ .long uhoh | 242:
+ .long uhoh | 243:
+ .long uhoh | 244:
+ .long uhoh | 245:
+ .long uhoh | 246:
+ .long uhoh | 247:
+ .long uhoh | 248:
+ .long uhoh | 249:
+ .long uhoh | 250:
+ .long uhoh | 251:
+ .long uhoh | 252:
+ .long uhoh | 253:
+ .long uhoh | 254:
+ .long uhoh | 255:
+
+/*
+ * Default trap handler
+ * With an oscilloscope you can see AS* stop
+ */
+uhoh: nop | Leave spot for breakpoint
+ stop #0x2700 | Stop with interrupts disabled
+ bra.s uhoh | Stuck forever
+
+/*
+ * Log, but otherwise ignore, spurious interrupts
+ */
+spurious_interrupt:
+ addql #1,SYM(_M68kSpuriousInterruptCount)
+ rte
+
+/*
+ * Place the low-order 3 octets of the board's ethernet address at
+ * a `well-known' fixed location relative to the beginning of ROM.
+ */
+ .align 2
+ .long ETHERNET_ADDRESS | Low-order 3 octets of ethernet address
+
+ .global start
+/*
+ * Initial PC
+ */
+start:
+ /*
+ * Step 2: Stay in Supervisor Mode
+ */
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ oriw #0x3000,sr | Switch to Master Stack Pointer
+ lea SYM(m360)+1024-64,a7 | Load stack pointer with space
+ | for the Interrupt Stack
+#endif
+
+ /*
+ * Step 3: Write the VBR
+ */
+ lea Entry,a0 | Get base of vector table
+ movec a0,vbr | Set up the VBR
+
+ /*
+ * Step 4: Write the MBAR
+ */
+ movec dfc,d1 | Save destination register
+ moveq #7,d0 | CPU-space funcction code
+ movec d0,dfc | Set destination function code register
+ movel #SYM(m360)+0x101,d0 | MBAR value (mask CPU space accesses)
+ movesl d0,0x3FF00 | Set MBAR
+ movec d1,dfc | Restore destination register
+
+ /*
+ * Step 5: Verify a dual-port RAM location
+ */
+ lea SYM(m360),a0 | Point a0 to first DPRAM location
+ moveb #0x33,d0 | Set the test value
+ moveb d0,a0@ | Set the memory location
+ cmpb a0@,d0 | Does it read back?
+ bne uhoh | If not, bad news!
+ notb d0 | Flip bits
+ moveb d0,a0@ | Set the memory location
+ cmpb a0@,d0 | Does it read back?
+ bne uhoh | If not, bad news!
+
+ /*
+ * Remaining steps are handled by C code
+ */
+ jmp SYM(_Init68360) | Start C code (which never returns)
+
+/*
+ * Copy DATA segment, clear BSS segment, set up real stack,
+ * initialize heap, start C program.
+ * Assume that DATA and BSS sizes are multiples of 4.
+ */
+ PUBLIC (_CopyDataClearBSSAndStart)
+SYM(_CopyDataClearBSSAndStart):
+ lea copy_start,a0 | Get start of DATA in RAM
+ lea SYM(etext),a2 | Get start of DATA in ROM
+ cmpl a0,a2 | Are they the same?
+ beq.s NOCOPY | Yes, no copy necessary
+ lea copy_end,a1 | Get end of DATA in RAM
+ bra.s COPYLOOPTEST | Branch into copy loop
+COPYLOOP:
+ movel a2@+,a0@+ | Copy word from ROM to RAM
+COPYLOOPTEST:
+ cmpl a1,a0 | Done?
+ bcs.s COPYLOOP | No, skip
+NOCOPY:
+
+ lea clear_start,a0 | Get start of BSS
+ lea clear_end,a1 | Get end of BSS
+ clrl d0 | Value to set
+ bra.s ZEROLOOPTEST | Branch into clear loop
+ZEROLOOP:
+ movel d0,a0@+ | Clear a word
+ZEROLOOPTEST:
+ cmpl a1,a0 | Done?
+ bcs.s ZEROLOOP | No, skip
+
+ movel #stack_init,a7 | set master stack pointer
+ movel d0,a7@- | environp
+ movel d0,a7@- | argv
+ movel d0,a7@- | argc
+ jsr SYM(main) | Call C main
+
+ | Should this just force a reset?
+mainDone: nop | Leave spot for breakpoint
+ movew #1,a7 | Force a double bus error
+ movel d0,a7@- | This should cause a RESET
+ stop #0x2700 | Stop with interrupts disabled
+ bra.s mainDone | Stuck forever
+
+ .align 2
+ PUBLIC (_HeapSize)
+SYM (_HeapSize):
+ .long HeapSize
+ PUBLIC (_StackSize)
+SYM (_StackSize):
+ .long StackSize
+END_CODE
+
+BEGIN_DATA_DCL
+ .align 2
+ PUBLIC (environ)
+SYM (environ):
+ .long 0
+ PUBLIC (_M68kSpuriousInterruptCount)
+SYM (_M68kSpuriousInterruptCount):
+ .long 0
+END_DATA_DCL
+
+END
diff --git a/c/src/lib/libbsp/m68k/gen68360/start360/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/start360/Makefile.in
new file mode 100644
index 0000000000..9b6dd903ea
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/start360/Makefile.in
@@ -0,0 +1,56 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGMS=${ARCH}/start360.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=start360
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/c/src/lib/libbsp/m68k/gen68360/start360/start360.s b/c/src/lib/libbsp/m68k/gen68360/start360/start360.s
new file mode 100644
index 0000000000..a384912254
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/start360/start360.s
@@ -0,0 +1,424 @@
+/*
+ *
+ * This file contains the entry point for the application.
+ * The name of this entry point is compiler dependent.
+ * It jumps to the BSP which is responsible for performing
+ * all initialization.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Based on the `gen68302' board support package, and covered by the
+ * original distribution terms.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+ /*
+ * Step 1: Decide on Reset Stack Pointer and Initial Program Counter
+ */
+Entry:
+ .long SYM(m360)+1024 | 0: Initial SSP
+ .long start | 1: Initial PC
+ .long uhoh | 2: Bus error
+ .long uhoh | 3: Address error
+ .long uhoh | 4: Illegal instruction
+ .long uhoh | 5: Zero division
+ .long uhoh | 6: CHK, CHK2 instruction
+ .long uhoh | 7: TRAPcc, TRAPV instructions
+ .long uhoh | 8: Privilege violation
+ .long uhoh | 9: Trace
+ .long uhoh | 10: Line 1010 emulator
+ .long uhoh | 11: Line 1111 emulator
+ .long uhoh | 12: Hardware breakpoint
+ .long uhoh | 13: Reserved for coprocessor violation
+ .long uhoh | 14: Format error
+ .long uhoh | 15: Uninitialized interrupt
+ .long uhoh | 16: Unassigned, reserved
+ .long uhoh | 17:
+ .long uhoh | 18:
+ .long uhoh | 19:
+ .long uhoh | 20:
+ .long uhoh | 21:
+ .long uhoh | 22:
+ .long uhoh | 23:
+ .long spurious_interrupt | 24: Spurious interrupt
+ .long uhoh | 25: Level 1 interrupt autovector
+ .long uhoh | 26: Level 2 interrupt autovector
+ .long uhoh | 27: Level 3 interrupt autovector
+ .long uhoh | 28: Level 4 interrupt autovector
+ .long uhoh | 29: Level 5 interrupt autovector
+ .long uhoh | 30: Level 6 interrupt autovector
+ .long uhoh | 31: Level 7 interrupt autovector
+ .long uhoh | 32: Trap instruction (0-15)
+ .long uhoh | 33:
+ .long uhoh | 34:
+ .long uhoh | 35:
+ .long uhoh | 36:
+ .long uhoh | 37:
+ .long uhoh | 38:
+ .long uhoh | 39:
+ .long uhoh | 40:
+ .long uhoh | 41:
+ .long uhoh | 42:
+ .long uhoh | 43:
+ .long uhoh | 44:
+ .long uhoh | 45:
+ .long uhoh | 46:
+ .long uhoh | 47:
+ .long uhoh | 48: Reserved for coprocessor
+ .long uhoh | 49:
+ .long uhoh | 50:
+ .long uhoh | 51:
+ .long uhoh | 52:
+ .long uhoh | 53:
+ .long uhoh | 54:
+ .long uhoh | 55:
+ .long uhoh | 56:
+ .long uhoh | 57:
+ .long uhoh | 58:
+ .long uhoh | 59: Unassigned, reserved
+ .long uhoh | 60:
+ .long uhoh | 61:
+ .long uhoh | 62:
+ .long uhoh | 63:
+ .long uhoh | 64: User defined vectors (192)
+ .long uhoh | 65:
+ .long uhoh | 66:
+ .long uhoh | 67:
+ .long uhoh | 68:
+ .long uhoh | 69:
+ .long uhoh | 70:
+ .long uhoh | 71:
+ .long uhoh | 72:
+ .long uhoh | 73:
+ .long uhoh | 74:
+ .long uhoh | 75:
+ .long uhoh | 76:
+ .long uhoh | 77:
+ .long uhoh | 78:
+ .long uhoh | 79:
+ .long uhoh | 80:
+ .long uhoh | 81:
+ .long uhoh | 82:
+ .long uhoh | 83:
+ .long uhoh | 84:
+ .long uhoh | 85:
+ .long uhoh | 86:
+ .long uhoh | 87:
+ .long uhoh | 88:
+ .long uhoh | 89:
+ .long uhoh | 90:
+ .long uhoh | 91:
+ .long uhoh | 92:
+ .long uhoh | 93:
+ .long uhoh | 94:
+ .long uhoh | 95:
+ .long uhoh | 96:
+ .long uhoh | 97:
+ .long uhoh | 98:
+ .long uhoh | 99:
+ .long uhoh | 100:
+ .long uhoh | 101:
+ .long uhoh | 102:
+ .long uhoh | 103:
+ .long uhoh | 104:
+ .long uhoh | 105:
+ .long uhoh | 106:
+ .long uhoh | 107:
+ .long uhoh | 108:
+ .long uhoh | 109:
+ .long uhoh | 110:
+ .long uhoh | 111:
+ .long uhoh | 112:
+ .long uhoh | 113:
+ .long uhoh | 114:
+ .long uhoh | 115:
+ .long uhoh | 116:
+ .long uhoh | 117:
+ .long uhoh | 118:
+ .long uhoh | 119:
+ .long uhoh | 120:
+ .long uhoh | 121:
+ .long uhoh | 122:
+ .long uhoh | 123:
+ .long uhoh | 124:
+ .long uhoh | 125:
+ .long uhoh | 126:
+ .long uhoh | 127:
+ .long uhoh | 128:
+ .long uhoh | 129:
+ .long uhoh | 130:
+ .long uhoh | 131:
+ .long uhoh | 132:
+ .long uhoh | 133:
+ .long uhoh | 134:
+ .long uhoh | 135:
+ .long uhoh | 136:
+ .long uhoh | 137:
+ .long uhoh | 138:
+ .long uhoh | 139:
+ .long uhoh | 140:
+ .long uhoh | 141:
+ .long uhoh | 142:
+ .long uhoh | 143:
+ .long uhoh | 144:
+ .long uhoh | 145:
+ .long uhoh | 146:
+ .long uhoh | 147:
+ .long uhoh | 148:
+ .long uhoh | 149:
+ .long uhoh | 150:
+ .long uhoh | 151:
+ .long uhoh | 152:
+ .long uhoh | 153:
+ .long uhoh | 154:
+ .long uhoh | 155:
+ .long uhoh | 156:
+ .long uhoh | 157:
+ .long uhoh | 158:
+ .long uhoh | 159:
+ .long uhoh | 160:
+ .long uhoh | 161:
+ .long uhoh | 162:
+ .long uhoh | 163:
+ .long uhoh | 164:
+ .long uhoh | 165:
+ .long uhoh | 166:
+ .long uhoh | 167:
+ .long uhoh | 168:
+ .long uhoh | 169:
+ .long uhoh | 170:
+ .long uhoh | 171:
+ .long uhoh | 172:
+ .long uhoh | 173:
+ .long uhoh | 174:
+ .long uhoh | 175:
+ .long uhoh | 176:
+ .long uhoh | 177:
+ .long uhoh | 178:
+ .long uhoh | 179:
+ .long uhoh | 180:
+ .long uhoh | 181:
+ .long uhoh | 182:
+ .long uhoh | 183:
+ .long uhoh | 184:
+ .long uhoh | 185:
+ .long uhoh | 186:
+ .long uhoh | 187:
+ .long uhoh | 188:
+ .long uhoh | 189:
+ .long uhoh | 190:
+ .long uhoh | 191:
+ .long uhoh | 192:
+ .long uhoh | 193:
+ .long uhoh | 194:
+ .long uhoh | 195:
+ .long uhoh | 196:
+ .long uhoh | 197:
+ .long uhoh | 198:
+ .long uhoh | 199:
+ .long uhoh | 200:
+ .long uhoh | 201:
+ .long uhoh | 202:
+ .long uhoh | 203:
+ .long uhoh | 204:
+ .long uhoh | 205:
+ .long uhoh | 206:
+ .long uhoh | 207:
+ .long uhoh | 208:
+ .long uhoh | 209:
+ .long uhoh | 210:
+ .long uhoh | 211:
+ .long uhoh | 212:
+ .long uhoh | 213:
+ .long uhoh | 214:
+ .long uhoh | 215:
+ .long uhoh | 216:
+ .long uhoh | 217:
+ .long uhoh | 218:
+ .long uhoh | 219:
+ .long uhoh | 220:
+ .long uhoh | 221:
+ .long uhoh | 222:
+ .long uhoh | 223:
+ .long uhoh | 224:
+ .long uhoh | 225:
+ .long uhoh | 226:
+ .long uhoh | 227:
+ .long uhoh | 228:
+ .long uhoh | 229:
+ .long uhoh | 230:
+ .long uhoh | 231:
+ .long uhoh | 232:
+ .long uhoh | 233:
+ .long uhoh | 234:
+ .long uhoh | 235:
+ .long uhoh | 236:
+ .long uhoh | 237:
+ .long uhoh | 238:
+ .long uhoh | 239:
+ .long uhoh | 240:
+ .long uhoh | 241:
+ .long uhoh | 242:
+ .long uhoh | 243:
+ .long uhoh | 244:
+ .long uhoh | 245:
+ .long uhoh | 246:
+ .long uhoh | 247:
+ .long uhoh | 248:
+ .long uhoh | 249:
+ .long uhoh | 250:
+ .long uhoh | 251:
+ .long uhoh | 252:
+ .long uhoh | 253:
+ .long uhoh | 254:
+ .long uhoh | 255:
+
+/*
+ * Default trap handler
+ * With an oscilloscope you can see AS* stop
+ */
+uhoh: nop | Leave spot for breakpoint
+ stop #0x2700 | Stop with interrupts disabled
+ bra.s uhoh | Stuck forever
+
+/*
+ * Log, but otherwise ignore, spurious interrupts
+ */
+spurious_interrupt:
+ addql #1,SYM(_M68kSpuriousInterruptCount)
+ rte
+
+/*
+ * Place the low-order 3 octets of the board's ethernet address at
+ * a `well-known' fixed location relative to the beginning of ROM.
+ */
+ .align 2
+ .long ETHERNET_ADDRESS | Low-order 3 octets of ethernet address
+
+ .global start
+/*
+ * Initial PC
+ */
+start:
+ /*
+ * Step 2: Stay in Supervisor Mode
+ */
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ oriw #0x3000,sr | Switch to Master Stack Pointer
+ lea SYM(m360)+1024-64,a7 | Load stack pointer with space
+ | for the Interrupt Stack
+#endif
+
+ /*
+ * Step 3: Write the VBR
+ */
+ lea Entry,a0 | Get base of vector table
+ movec a0,vbr | Set up the VBR
+
+ /*
+ * Step 4: Write the MBAR
+ */
+ movec dfc,d1 | Save destination register
+ moveq #7,d0 | CPU-space funcction code
+ movec d0,dfc | Set destination function code register
+ movel #SYM(m360)+0x101,d0 | MBAR value (mask CPU space accesses)
+ movesl d0,0x3FF00 | Set MBAR
+ movec d1,dfc | Restore destination register
+
+ /*
+ * Step 5: Verify a dual-port RAM location
+ */
+ lea SYM(m360),a0 | Point a0 to first DPRAM location
+ moveb #0x33,d0 | Set the test value
+ moveb d0,a0@ | Set the memory location
+ cmpb a0@,d0 | Does it read back?
+ bne uhoh | If not, bad news!
+ notb d0 | Flip bits
+ moveb d0,a0@ | Set the memory location
+ cmpb a0@,d0 | Does it read back?
+ bne uhoh | If not, bad news!
+
+ /*
+ * Remaining steps are handled by C code
+ */
+ jmp SYM(_Init68360) | Start C code (which never returns)
+
+/*
+ * Copy DATA segment, clear BSS segment, set up real stack,
+ * initialize heap, start C program.
+ * Assume that DATA and BSS sizes are multiples of 4.
+ */
+ PUBLIC (_CopyDataClearBSSAndStart)
+SYM(_CopyDataClearBSSAndStart):
+ lea copy_start,a0 | Get start of DATA in RAM
+ lea SYM(etext),a2 | Get start of DATA in ROM
+ cmpl a0,a2 | Are they the same?
+ beq.s NOCOPY | Yes, no copy necessary
+ lea copy_end,a1 | Get end of DATA in RAM
+ bra.s COPYLOOPTEST | Branch into copy loop
+COPYLOOP:
+ movel a2@+,a0@+ | Copy word from ROM to RAM
+COPYLOOPTEST:
+ cmpl a1,a0 | Done?
+ bcs.s COPYLOOP | No, skip
+NOCOPY:
+
+ lea clear_start,a0 | Get start of BSS
+ lea clear_end,a1 | Get end of BSS
+ clrl d0 | Value to set
+ bra.s ZEROLOOPTEST | Branch into clear loop
+ZEROLOOP:
+ movel d0,a0@+ | Clear a word
+ZEROLOOPTEST:
+ cmpl a1,a0 | Done?
+ bcs.s ZEROLOOP | No, skip
+
+ movel #stack_init,a7 | set master stack pointer
+ movel d0,a7@- | environp
+ movel d0,a7@- | argv
+ movel d0,a7@- | argc
+ jsr SYM(main) | Call C main
+
+ | Should this just force a reset?
+mainDone: nop | Leave spot for breakpoint
+ movew #1,a7 | Force a double bus error
+ movel d0,a7@- | This should cause a RESET
+ stop #0x2700 | Stop with interrupts disabled
+ bra.s mainDone | Stuck forever
+
+ .align 2
+ PUBLIC (_HeapSize)
+SYM (_HeapSize):
+ .long HeapSize
+ PUBLIC (_StackSize)
+SYM (_StackSize):
+ .long StackSize
+END_CODE
+
+BEGIN_DATA_DCL
+ .align 2
+ PUBLIC (environ)
+SYM (environ):
+ .long 0
+ PUBLIC (_M68kSpuriousInterruptCount)
+SYM (_M68kSpuriousInterruptCount):
+ .long 0
+END_DATA_DCL
+
+END
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/startup/Makefile.in
new file mode 100644
index 0000000000..0f17670444
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/Makefile.in
@@ -0,0 +1,55 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=alloc360 bspstart bspclean init68360 sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(srcdir)/linkcmds $(srcdir)/linkcmds.prom $(srcdir)/linkcmds.bootp \
+ $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds $(srcdir)/linkcmds.prom ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/alloc360.c b/c/src/lib/libbsp/m68k/gen68360/startup/alloc360.c
new file mode 100644
index 0000000000..99bfb3352e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/alloc360.c
@@ -0,0 +1,96 @@
+/*
+ * MC68360 buffer descriptor allocation routines
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <m68360.h>
+#include <rtems/error.h>
+
+/*
+ * Allocation order:
+ * - Dual-Port RAM section 1
+ * - Dual-Port RAM section 3
+ * - Dual-Port RAM section 0
+ * - Dual-Port RAM section 2
+ */
+static struct {
+ char *base;
+ unsigned int size;
+ unsigned int used;
+} bdregions[] = {
+ { (char *)&m360.dpram1[0], sizeof m360.dpram1, 0 },
+ { (char *)&m360.dpram3[0], sizeof m360.dpram3, 0 },
+ { (char *)&m360.dpram0[0], sizeof m360.dpram0, 0 },
+ { (char *)&m360.dpram2[0], sizeof m360.dpram2, 0 },
+};
+
+/*
+ * Send a command to the CPM RISC processer
+ */
+void *
+M360AllocateBufferDescriptors (int count)
+{
+ unsigned int i;
+ ISR_Level level;
+ void *bdp = NULL;
+ unsigned int want = count * sizeof(m360BufferDescriptor_t);
+
+ /*
+ * Running with interrupts disabled is usually considered bad
+ * form, but this routine is probably being run as part of an
+ * initialization sequence so the effect shouldn't be too severe.
+ */
+ _ISR_Disable (level);
+ for (i = 0 ; i < sizeof(bdregions) / sizeof(bdregions[0]) ; i++) {
+ /*
+ * Verify that the region exists.
+ * This test is necessary since some chips have
+ * less dual-port RAM.
+ */
+ if (bdregions[i].used == 0) {
+ volatile unsigned char *cp = bdregions[i].base;
+ *cp = 0xAA;
+ if (*cp != 0xAA) {
+ bdregions[i].used = bdregions[i].size;
+ continue;
+ }
+ *cp = 0x55;
+ if (*cp != 0x55) {
+ bdregions[i].used = bdregions[i].size;
+ continue;
+ }
+ *cp = 0x0;
+ }
+ if (bdregions[i].size - bdregions[i].used >= want) {
+ bdp = bdregions[i].base + bdregions[i].used;
+ bdregions[i].used += want;
+ break;
+ }
+ }
+ _ISR_Enable (level);
+ if (bdp == NULL)
+ rtems_panic ("Can't allocate %d buffer descriptor(s).\n", count);
+ return bdp;
+}
+
+void *
+M360AllocateRiscTimers (int count)
+{
+ /*
+ * Convert the count to the number of buffer descriptors
+ * of equal or larger size. This ensures that all buffer
+ * descriptors are allocated with appropriate alignment.
+ */
+ return M360AllocateBufferDescriptors (((count * 4) +
+ sizeof(m360BufferDescriptor_t) - 1) /
+ sizeof(m360BufferDescriptor_t));
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/bspclean.c b/c/src/lib/libbsp/m68k/gen68360/startup/bspclean.c
new file mode 100644
index 0000000000..0fba254933
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/bspclean.c
@@ -0,0 +1,27 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and usually returns
+ * control to a monitor.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+void bsp_cleanup( void )
+{
+ /* Cause double bus fault to force reset? */
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/bspstart.c b/c/src/lib/libbsp/m68k/gen68360/startup/bspstart.c
new file mode 100644
index 0000000000..9ad122e18f
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/bspstart.c
@@ -0,0 +1,247 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern void *_HeapStart;
+ extern rtems_unsigned32 _HeapSize;
+
+ /*
+ * The last parameter to RTEMS_Malloc_Initialize is the "chunk"
+ * size which a multiple of will be requested on each sbrk()
+ * call by malloc(). A value of 0 indicates that sbrk() should
+ * not be called to extend the heap.
+ */
+
+ RTEMS_Malloc_Initialize(&_HeapStart, _HeapSize, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ extern void *_WorkspaceBase;
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * Allocate the memory for the RTEMS Work Space. This can come from
+ * a variety of places: hard coded address, malloc'ed from outside
+ * RTEMS world (e.g. simulator or primitive memory manager), or (as
+ * typically done by stock BSPs) by subtracting the required amount
+ * of work space from the last physical address on the CPU board.
+ */
+#if 0
+ Cpu_table.interrupt_vector_table = (mc68000_isr *) 0/*&M68Kvec*/;
+#endif
+
+
+ /*
+ * Copy the Configuration Table .. so we can change it
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ /*
+ * Need to "allocate" the memory for the RTEMS Workspace and
+ * tell the RTEMS configuration where it is. This memory is
+ * not malloc'ed. It is just "pulled from the air".
+ */
+
+ BSP_Configuration.work_space_start = (void *)&_WorkspaceBase;
+
+ /*
+ * initialize the CPU table for this BSP
+ */
+
+ /*
+ * we do not use the pretasking_hook
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Don't forget the other CPU Table entries.
+ */
+
+ /*
+ * Start RTEMS
+ */
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/init68360.c b/c/src/lib/libbsp/m68k/gen68360/startup/init68360.c
new file mode 100644
index 0000000000..a4adde7582
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/init68360.c
@@ -0,0 +1,534 @@
+/*
+ * MC68360 support routines
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <m68360.h>
+
+/*
+ * Send a command to the CPM RISC processer
+ */
+
+void M360ExecuteRISC(rtems_unsigned16 command)
+{
+ rtems_unsigned16 sr;
+
+ m68k_disable_interrupts (sr);
+ while (m360.cr & M360_CR_FLG)
+ continue;
+ m360.cr = command | M360_CR_FLG;
+ m68k_enable_interrupts (sr);
+}
+
+/*
+ * Initialize MC68360
+ */
+void _Init68360 (void)
+{
+ int i;
+ m68k_isr_entry *vbr;
+ extern void _CopyDataClearBSSAndStart (void);
+
+#if (defined (m68040) || defined (m68lc040) || defined (m68ec040))
+ /*
+ *******************************************
+ * Motorola 68040 and companion-mode 68360 *
+ *******************************************
+ */
+
+ /*
+ * Step 6: Is this a power-up reset?
+ * For now we just ignore this and do *all* the steps
+ * Someday we might want to:
+ * if (Hard, Loss of Clock, Power-up)
+ * Do all steps
+ * else if (Double bus fault, watchdog or soft reset)
+ * Skip to step 12
+ * else (must be a reset command)
+ * Skip to step 14
+ */
+
+ /*
+ * Step 7: Deal with clock synthesizer
+ * HARDWARE:
+ * Change if you're not using an external 25 MHz oscillator.
+ */
+ m360.clkocr = 0x83; /* No more writes, full-power CLKO2 */
+ m360.pllcr = 0xD000; /* PLL, no writes, no prescale,
+ no LPSTOP slowdown, PLL X1 */
+ m360.cdvcr = 0x8000; /* No more writes, no clock division */
+
+ /*
+ * Step 8: Initialize system protection
+ * Disable watchdog FIXME: Should use watchdog!!!!
+ * Watchdog causes system reset
+ * Slowest watchdog timeout
+ * Disable double bus fault monitor
+ * Enable bus monitor external
+ * 1024 clocks for external timeout
+ */
+ m360.sypcr = 0x74;
+
+ /*
+ * Step 9: Clear parameter RAM and reset communication processor module
+ */
+ for (i = 0 ; i < 192 ; i += sizeof (long)) {
+ *((long *)((char *)&m360 + 0xC00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xD00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xE00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xF00 + i)) = 0;
+ }
+ M360ExecuteRISC (M360_CR_RST);
+
+ /*
+ * Step 10: Write PEPAR
+ * SINTOUT standard M68000 family interrupt level encoding
+ * CF1MODE=10 (BCLRO* output)
+ * No RAS1* double drive
+ * A31 - A28
+ * AMUX output
+ * CAS2* - CAS3*
+ * CAS0* - CAS1*
+ * CS7*
+ * AVEC*
+ */
+ m360.pepar = 0x3440;
+
+ /*
+ * Step 11: Remap Chip Select 0 (CS0*), set up GMR
+ */
+ /*
+ * 512 addresses per DRAM page (256K DRAM chips)
+ * 70 nsec DRAM
+ * 180 nsec ROM (3 wait states)
+ */
+ m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
+ M360_GMR_RCYC(0) | M360_GMR_PGS(1) |
+ M360_GMR_DPS_32BIT | M360_GMR_NCS |
+ M360_GMR_TSS40;
+ m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
+ M360_MEMC_BR_V;
+ m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
+ M360_MEMC_OR_32BIT;
+
+ /*
+ * Step 12: Initialize the system RAM
+ */
+ /*
+ * Set up option/base registers
+ * 1M DRAM
+ * 70 nsec DRAM
+ * Enable burst mode
+ * No parity checking
+ * Wait for chips to power up
+ * Perform 8 read cycles
+ */
+ m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
+ M360_MEMC_OR_1MB |
+ M360_MEMC_OR_DRAM;
+ m360.memc[1].br = (unsigned long)&_RamBase |
+ M360_MEMC_BR_BACK40 |
+ M360_MEMC_BR_V;
+ for (i = 0; i < 50000; i++)
+ continue;
+ for (i = 0; i < 8; ++i)
+ *((volatile unsigned long *)(unsigned long)&_RamBase);
+
+ /*
+ * Step 13: Copy the exception vector table to system RAM
+ */
+ m68k_get_vbr (vbr);
+ for (i = 0; i < 256; ++i)
+ M68Kvec[i] = vbr[i];
+ m68k_set_vbr (M68Kvec);
+
+ /*
+ * Step 14: More system initialization
+ * SDCR (Serial DMA configuration register)
+ * Disable SDMA during FREEZE
+ * Give SDMA priority over all interrupt handlers
+ * Set DMA arbiration level to 4
+ * CICR (CPM interrupt configuration register):
+ * SCC1 requests at SCCa position
+ * SCC2 requests at SCCb position
+ * SCC3 requests at SCCc position
+ * SCC4 requests at SCCd position
+ * Interrupt request level 4
+ * Maintain original priority order
+ * Vector base 128
+ * SCCs priority grouped at top of table
+ */
+ m360.sdcr = M360_SDMA_FREEZE | M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
+ m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
+ (4 << 13) | (0x1F << 8) | (128);
+
+ /*
+ * Step 15: Set module configuration register
+ * Bus request MC68040 Arbitration ID 3
+ * Bus asynchronous timing mode (work around bug in Rev. B)
+ * Arbitration asynchronous timing mode
+ * Disable timers during FREEZE
+ * Disable bus monitor during FREEZE
+ * BCLRO* arbitration level 3
+ * No show cycles
+ * User/supervisor access
+ * Bus clear in arbitration ID level 3
+ * SIM60 interrupt sources higher priority than CPM
+ */
+ m360.mcr = 0x6000EC3F;
+
+#elif (defined (M68360_ATLAS_HSB))
+ /*
+ ******************************************
+ * Standalone Motorola 68360 -- ATLAS HSB *
+ ******************************************
+ */
+
+ /*
+ * Step 6: Is this a power-up reset?
+ * For now we just ignore this and do *all* the steps
+ * Someday we might want to:
+ * if (Hard, Loss of Clock, Power-up)
+ * Do all steps
+ * else if (Double bus fault, watchdog or soft reset)
+ * Skip to step 12
+ * else (must be a CPU32+ reset command)
+ * Skip to step 14
+ */
+
+ /*
+ * Step 7: Deal with clock synthesizer
+ * HARDWARE:
+ * Change if you're not using an external 25 MHz oscillator.
+ */
+ m360.clkocr = 0x8F; /* No more writes, no clock outputs */
+ m360.pllcr = 0xD000; /* PLL, no writes, no prescale,
+ no LPSTOP slowdown, PLL X1 */
+ m360.cdvcr = 0x8000; /* No more writes, no clock division */
+
+ /*
+ * Step 8: Initialize system protection
+ * Disable watchdog FIXME: Should use watchdog!!!!
+ * Watchdog causes system reset
+ * Slowest watchdog timeout
+ * Enable double bus fault monitor
+ * Enable bus monitor external
+ * 128 clocks for external timeout
+ */
+ m360.sypcr = 0x7F;
+
+ /*
+ * Step 9: Clear parameter RAM and reset communication processor module
+ */
+ for (i = 0 ; i < 192 ; i += sizeof (long)) {
+ *((long *)((char *)&m360 + 0xC00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xD00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xE00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xF00 + i)) = 0;
+ }
+ M360ExecuteRISC (M360_CR_RST);
+
+ /*
+ * Step 10: Write PEPAR
+ * SINTOUT not used (CPU32+ mode)
+ * CF1MODE=00 (CONFIG1 input)
+ * RAS1* double drive
+ * WE0* - WE3*
+ * OE* output
+ * CAS2* - CAS3*
+ * CAS0* - CAS1*
+ * CS7*
+ * AVEC*
+ * HARDWARE:
+ * Change if you are using a different memory configuration
+ * (static RAM, external address multiplexing, etc).
+ */
+ m360.pepar = 0x0180;
+
+ /*
+ * Step 11: Remap Chip Select 0 (CS0*), set up GMR
+ */
+ m360.gmr = M360_GMR_RCNT(12) | M360_GMR_RFEN |
+ M360_GMR_RCYC(0) | M360_GMR_PGS(1) |
+ M360_GMR_DPS_32BIT | M360_GMR_DWQ |
+ M360_GMR_GAMX;
+ m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
+ M360_MEMC_BR_V;
+ m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
+ M360_MEMC_OR_8BIT;
+
+ /*
+ * Step 12: Initialize the system RAM
+ */
+ /* first bank 1MByte DRAM */
+ m360.memc[1].or = M360_MEMC_OR_TCYC(2) | M360_MEMC_OR_1MB |
+ M360_MEMC_OR_PGME | M360_MEMC_OR_DRAM;
+ m360.memc[1].br = (unsigned long)&_RamBase | M360_MEMC_BR_V;
+
+ /* second bank 1MByte DRAM */
+ m360.memc[2].or = M360_MEMC_OR_TCYC(2) | M360_MEMC_OR_1MB |
+ M360_MEMC_OR_PGME | M360_MEMC_OR_DRAM;
+ m360.memc[2].br = ((unsigned long)&_RamBase + 0x100000) |
+ M360_MEMC_BR_V;
+
+ /* flash rom socket U6 on CS5 */
+ m360.memc[5].br = (unsigned long)ATLASHSB_ROM_U6 | M360_MEMC_BR_WP |
+ M360_MEMC_BR_V;
+ m360.memc[5].or = M360_MEMC_OR_WAITS(2) | M360_MEMC_OR_512KB |
+ M360_MEMC_OR_8BIT;
+
+ /* CSRs on CS7 */
+ m360.memc[7].or = M360_MEMC_OR_TCYC(4) | M360_MEMC_OR_64KB |
+ M360_MEMC_OR_8BIT;
+ m360.memc[7].br = ATLASHSB_ESR | 0x01;
+ for (i = 0; i < 50000; i++)
+ continue;
+ for (i = 0; i < 8; ++i)
+ *((volatile unsigned long *)(unsigned long)&_RamBase);
+
+ /*
+ * Step 13: Copy the exception vector table to system RAM
+ */
+ m68k_get_vbr (vbr);
+ for (i = 0; i < 256; ++i)
+ M68Kvec[i] = vbr[i];
+ m68k_set_vbr (M68Kvec);
+
+ /*
+ * Step 14: More system initialization
+ * SDCR (Serial DMA configuration register)
+ * Disable SDMA during FREEZE
+ * Give SDMA priority over all interrupt handlers
+ * Set DMA arbiration level to 4
+ * CICR (CPM interrupt configuration register):
+ * SCC1 requests at SCCa position
+ * SCC2 requests at SCCb position
+ * SCC3 requests at SCCc position
+ * SCC4 requests at SCCd position
+ * Interrupt request level 4
+ * Maintain original priority order
+ * Vector base 128
+ * SCCs priority grouped at top of table
+ */
+ m360.sdcr = M360_SDMA_FREEZE | M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
+ m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
+ (4 << 13) | (0x1F << 8) | (128);
+
+ /*
+ * Step 15: Set module configuration register
+ * Disable timers during FREEZE
+ * Enable bus monitor during FREEZE
+ * BCLRO* arbitration level 3
+ * No show cycles
+ * User/supervisor access
+ * Bus clear interrupt service level 7
+ * SIM60 interrupt sources higher priority than CPM
+ */
+ m360.mcr = 0x4C7F;
+
+#else
+ /*
+ ***************************************************
+ * Generic Standalone Motorola 68360 *
+ * As described in MC68360 User's Manual *
+ * Atlas ACE360 *
+ ***************************************************
+ */
+
+ /*
+ * Step 6: Is this a power-up reset?
+ * For now we just ignore this and do *all* the steps
+ * Someday we might want to:
+ * if (Hard, Loss of Clock, Power-up)
+ * Do all steps
+ * else if (Double bus fault, watchdog or soft reset)
+ * Skip to step 12
+ * else (must be a CPU32+ reset command)
+ * Skip to step 14
+ */
+
+ /*
+ * Step 7: Deal with clock synthesizer
+ * HARDWARE:
+ * Change if you're not using an external 25 MHz oscillator.
+ */
+ m360.clkocr = 0x8F; /* No more writes, no clock outputs */
+ m360.pllcr = 0xD000; /* PLL, no writes, no prescale,
+ no LPSTOP slowdown, PLL X1 */
+ m360.cdvcr = 0x8000; /* No more writes, no clock division */
+
+ /*
+ * Step 8: Initialize system protection
+ * Disable watchdog FIXME: Should use watchdog!!!!
+ * Watchdog causes system reset
+ * Slowest watchdog timeout
+ * Enable double bus fault monitor
+ * Enable bus monitor external
+ * 128 clocks for external timeout
+ */
+ m360.sypcr = 0x7F;
+
+ /*
+ * Step 9: Clear parameter RAM and reset communication processor module
+ */
+ for (i = 0 ; i < 192 ; i += sizeof (long)) {
+ *((long *)((char *)&m360 + 0xC00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xD00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xE00 + i)) = 0;
+ *((long *)((char *)&m360 + 0xF00 + i)) = 0;
+ }
+ M360ExecuteRISC (M360_CR_RST);
+
+ /*
+ * Step 10: Write PEPAR
+ * SINTOUT not used (CPU32+ mode)
+ * CF1MODE=00 (CONFIG1 input)
+ * RAS1* double drive
+ * WE0* - WE3*
+ * OE* output
+ * CAS2* - CAS3*
+ * CAS0* - CAS1*
+ * CS7*
+ * AVEC*
+ * HARDWARE:
+ * Change if you are using a different memory configuration
+ * (static RAM, external address multiplexing, etc).
+ */
+ m360.pepar = 0x0180;
+
+ /*
+ * Step 11: Remap Chip Select 0 (CS0*), set up GMR
+ */
+ /*
+ * 1024/2048/4096 addresses per DRAM page (1M/4M/16M DRAM chips)
+ * 60 nsec DRAM
+ * 180 nsec ROM (3 wait states)
+ */
+ switch ((unsigned long)&_RamSize) {
+ default:
+ case 4*1024*1024:
+ m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
+ M360_GMR_RCYC(0) | M360_GMR_PGS(3) |
+ M360_GMR_DPS_32BIT | M360_GMR_NCS |
+ M360_GMR_GAMX;
+ break;
+
+ case 16*1024*1024:
+ m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
+ M360_GMR_RCYC(0) | M360_GMR_PGS(5) |
+ M360_GMR_DPS_32BIT | M360_GMR_NCS |
+ M360_GMR_GAMX;
+ break;
+
+ case 64*1024*1024:
+ m360.gmr = M360_GMR_RCNT(23) | M360_GMR_RFEN |
+ M360_GMR_RCYC(0) | M360_GMR_PGS(7) |
+ M360_GMR_DPS_32BIT | M360_GMR_NCS |
+ M360_GMR_GAMX;
+ break;
+ }
+ m360.memc[0].br = (unsigned long)&_RomBase | M360_MEMC_BR_WP |
+ M360_MEMC_BR_V;
+ m360.memc[0].or = M360_MEMC_OR_WAITS(3) | M360_MEMC_OR_1MB |
+ M360_MEMC_OR_8BIT;
+
+ /*
+ * Step 12: Initialize the system RAM
+ */
+ /*
+ * Set up option/base registers
+ * 4M/16M/64M DRAM
+ * 60 nsec DRAM
+ * Wait for chips to power up
+ * Perform 8 read cycles
+ * Set all parity bits to correct state
+ * Enable parity checking
+ */
+ switch ((unsigned long)&_RamSize) {
+ default:
+ case 4*1024*1024:
+ m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
+ M360_MEMC_OR_4MB |
+ M360_MEMC_OR_DRAM;
+ break;
+
+ case 16*1024*1024:
+ m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
+ M360_MEMC_OR_16MB |
+ M360_MEMC_OR_DRAM;
+ break;
+
+ case 64*1024*1024:
+ m360.memc[1].or = M360_MEMC_OR_TCYC(0) |
+ M360_MEMC_OR_64MB |
+ M360_MEMC_OR_DRAM;
+ break;
+ }
+ m360.memc[1].br = (unsigned long)&_RamBase | M360_MEMC_BR_V;
+ for (i = 0; i < 50000; i++)
+ continue;
+ for (i = 0; i < 8; ++i)
+ *((volatile unsigned long *)(unsigned long)&_RamBase);
+ for (i = 0 ; i < (unsigned long)&_RamSize ; i += sizeof (unsigned long)) {
+ volatile unsigned long *lp;
+ lp = (unsigned long *)((unsigned char *)&_RamBase + i);
+ *lp = *lp;
+ }
+ m360.memc[1].br = (unsigned long)&_RamBase |
+ M360_MEMC_BR_PAREN | M360_MEMC_BR_V;
+
+ /*
+ * Step 13: Copy the exception vector table to system RAM
+ */
+ m68k_get_vbr (vbr);
+ for (i = 0; i < 256; ++i)
+ M68Kvec[i] = vbr[i];
+ m68k_set_vbr (M68Kvec);
+
+ /*
+ * Step 14: More system initialization
+ * SDCR (Serial DMA configuration register)
+ * Disable SDMA during FREEZE
+ * Give SDMA priority over all interrupt handlers
+ * Set DMA arbiration level to 4
+ * CICR (CPM interrupt configuration register):
+ * SCC1 requests at SCCa position
+ * SCC2 requests at SCCb position
+ * SCC3 requests at SCCc position
+ * SCC4 requests at SCCd position
+ * Interrupt request level 4
+ * Maintain original priority order
+ * Vector base 128
+ * SCCs priority grouped at top of table
+ */
+ m360.sdcr = M360_SDMA_FREEZE | M360_SDMA_SISM_7 | M360_SDMA_SAID_4;
+ m360.cicr = (3 << 22) | (2 << 20) | (1 << 18) | (0 << 16) |
+ (4 << 13) | (0x1F << 8) | (128);
+
+ /*
+ * Step 15: Set module configuration register
+ * Disable timers during FREEZE
+ * Enable bus monitor during FREEZE
+ * BCLRO* arbitration level 3
+ * No show cycles
+ * User/supervisor access
+ * Bus clear interrupt service level 7
+ * SIM60 interrupt sources higher priority than CPM
+ */
+ m360.mcr = 0x4C7F;
+#endif
+
+ /*
+ * Copy data, clear BSS, switch stacks and call main()
+ */
+ _CopyDataClearBSSAndStart ();
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds
new file mode 100644
index 0000000000..b50954e10c
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds
@@ -0,0 +1,117 @@
+/*
+ * This file contains GNU linker directives for a generic MC68360 board.
+ * Variations in memory size and allocation can be made by
+ * overriding some values with linker command-line arguments.
+ *
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+/*
+ * Declare some sizes.
+ * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
+ * number used there is not constant. If this happens to you, edit
+ * the lines marked XXX below to use a constant value.
+ */
+RamSize = DEFINED(RamSize) ? RamSize : 4M;
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
+/*
+ * Declare on-board memory.
+ * It would be nice if the ram length could be given as
+ * LENGTH=RamSize, but gld doesn't allow non-constant
+ * values in the LENGTH expression.
+ */
+MEMORY {
+ ram : ORIGIN = 0x00000000, LENGTH = 64M
+ rom : ORIGIN = 0x0F000000, LENGTH = 1M
+ dpram : ORIGIN = 0x0E000000, LENGTH = 8k
+}
+
+/*
+ * Declare low-order three octets of Ethernet address.
+ */
+ETHERNET_ADDRESS = DEFINED(ETHERNET_ADDRESS) ? ETHERNET_ADDRESS : 0xDEAD12;
+
+/*
+ * Load objects
+ */
+SECTIONS {
+ /*
+ * Hardware variations
+ */
+ _RamSize = RamSize;
+ __RamSize = RamSize;
+
+ /*
+ * Boot PROM
+ */
+ rom : {
+ _RomBase = .;
+ __RomBase = .;
+ } >rom
+
+ /*
+ * Dynamic RAM
+ */
+ ram : {
+ _RamBase = .;
+ __RamBase = .;
+ } >ram
+
+ /*
+ * Text, data and bss segments
+ */
+ .text : {
+ CREATE_OBJECT_SYMBOLS
+ *(.text)
+ . = ALIGN (16);
+ etext = .;
+ _etext = .;
+ } >ram
+ .data : {
+ copy_start = .;
+ *(.data)
+ . = ALIGN (16);
+ _edata = .;
+ copy_end = .;
+ } >ram
+ .bss : {
+ M68Kvec = .;
+ _M68Kvec = .;
+ . += (256 * 4);
+ clear_start = .;
+ *(.bss)
+ *(COMMON)
+ . = ALIGN (16);
+ _end = .;
+
+ _HeapStart = .;
+ __HeapStart = .;
+ . += HeapSize; /* XXX -- Old gld can't handle this */
+ . += StackSize; /* XXX -- Old gld can't handle this */
+ /* . += 0x10000; */ /* HeapSize for old gld */
+ /* . += 0x1000; */ /* StackSize for old gld */
+ . = ALIGN (16);
+ stack_init = .;
+ clear_end = .;
+
+ _WorkspaceBase = .;
+ __WorkspaceBase = .;
+ } >ram
+
+ /*
+ * On-chip memory/peripherals
+ */
+ dpram : {
+ m360 = .;
+ _m360 = .;
+ . += (8 * 1024);
+
+ } >dpram
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp
new file mode 100644
index 0000000000..a39b355e25
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.bootp
@@ -0,0 +1,122 @@
+/*
+ * This file contains GNU linker directives for a generic MC68360 board.
+ * Variations in hardware type and dynamic memory size can be made
+ * by overriding some values with linker command-line arguments.
+ *
+ * These linker directives are for producing a PROM version.
+ * The data segment is placed at the end of the text segment in the PROM.
+ * The start-up code takes care of copying this region to RAM.
+ *
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+/*
+ * Declare some sizes.
+ * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
+ * number used there is not constant. If this happens to you, edit
+ * the lines marked XXX below to use a constant value.
+ */
+RamSize = DEFINED(RamSize) ? RamSize : 4M;
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
+/*
+ * Declare on-board memory.
+ * It would be nice if the ram length could be given as
+ * LENGTH=RamSize, but gld doesn't allow non-constant
+ * values in the LENGTH expression.
+ */
+MEMORY {
+ ram : ORIGIN = 0x00000000, LENGTH = 64M
+ myram : ORIGIN = 4M-512k, LENGTH = 512k
+ rom : ORIGIN = 0x0F000000, LENGTH = 1M
+ dpram : ORIGIN = 0x0E000000, LENGTH = 8k
+}
+
+/*
+ * Declare low-order three octets of Ethernet address.
+ */
+ETHERNET_ADDRESS = DEFINED(ETHERNET_ADDRESS) ? ETHERNET_ADDRESS : 0xDEAD12;
+
+/*
+ * Load objects
+ */
+SECTIONS {
+ /*
+ * Hardware variations
+ */
+ _RamSize = RamSize;
+ __RamSize = RamSize;
+
+ /*
+ * Boot PROM
+ */
+ rom : {
+ _RomBase = .;
+ __RomBase = .;
+ } >rom
+
+ /*
+ * Dynamic RAM
+ */
+ ram : {
+ _RamBase = .;
+ __RamBase = .;
+ } >ram
+
+ /*
+ * Text, data and bss segments
+ */
+ .text : AT (0x00000000) {
+ CREATE_OBJECT_SYMBOLS
+ *(.text)
+ . = ALIGN (16);
+ etext = .;
+ _etext = .;
+ } >rom
+ .data : AT(SIZEOF(.text)) {
+ copy_start = .;
+ *(.data)
+ . = ALIGN (16);
+ _edata = .;
+ copy_end = .;
+ } >myram
+ .bss : {
+ M68Kvec = .;
+ _M68Kvec = .;
+ . += (256 * 4);
+ clear_start = .;
+ *(.bss)
+ *(COMMON)
+ . = ALIGN (16);
+ _end = .;
+
+ _HeapStart = .;
+ __HeapStart = .;
+ . += HeapSize; /* XXX -- Old gld can't handle this */
+ . += StackSize; /* XXX -- Old gld can't handle this */
+ /* . += 0x10000; */ /* HeapSize for old gld */
+ /* . += 0x1000; */ /* StackSize for old gld */
+ . = ALIGN (16);
+ stack_init = .;
+ clear_end = .;
+
+ _WorkspaceBase = .;
+ __WorkspaceBase = .;
+ } >myram
+
+ /*
+ * On-chip memory/peripherals
+ */
+ dpram : {
+ m360 = .;
+ _m360 = .;
+ . += (8 * 1024);
+
+ } >dpram
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom
new file mode 100644
index 0000000000..64d5fe91a1
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/startup/linkcmds.prom
@@ -0,0 +1,150 @@
+/*
+ * This file contains GNU linker directives for a generic MC68360 board.
+ * Variations in hardware type and dynamic memory size can be made
+ * by overriding some values with linker command-line arguments.
+ *
+ * These linker directives are for producing a BOOTP PROM.
+ * To create the PROM image from the linker output you must use objcopy
+ * (--adjust-section-vma) to place the data segment at the end of the text
+ * segment in the PROM. The start-up code takes care of copying this region
+ * to RAM.
+ *
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+/*
+ * a.out format doesn't handle prom images very well
+ */
+OUTPUT_FORMAT(coff-m68k)
+
+/*
+ * Declare some sizes.
+ * XXX: The assignment of ". += XyzSize;" fails in older gld's if the
+ * number used there is not constant. If this happens to you, edit
+ * the lines marked XXX below to use a constant value.
+ */
+RamSize = DEFINED(RamSize) ? RamSize : 4M;
+HeapSize = DEFINED(HeapSize) ? HeapSize : 0x10000;
+StackSize = DEFINED(StackSize) ? StackSize : 0x1000;
+
+/*
+ * Declare hardware type
+ */
+MC68360HardwareTypeMotorolaGeneric = 0;
+MC68360HardwareTypeAtlasHSB = 1;
+MC68360HardwareType = DEFINED(MC68360HardwareType) ? MC68360HardwareType : 0;
+
+/*
+ * Declare on-board memory.
+ * It would be nice if the ram length could be given as
+ * LENGTH=RamSize, but gld doesn't allow non-constant
+ * values in the LENGTH expression.
+ */
+MEMORY {
+ ram : ORIGIN = 0x00000000, LENGTH = 64M
+ rom : ORIGIN = 0xFF000000, LENGTH = 1M
+ dpram : ORIGIN = 0xFE000000, LENGTH = 8k
+}
+
+/*
+ * Declare low-order three octets of Ethernet address.
+ */
+ETHERNET_ADDRESS = DEFINED(ETHERNET_ADDRESS) ? ETHERNET_ADDRESS : 0xDEAD12;
+
+/*
+ * Declare hardware type.
+ * Acceptable values are:
+ * 0 - Generic system as described in the MC68360 User's Manual
+ * (MC68360UM/AD Rev. 1).
+ * 1 - ATLAS Computer Equipment Incorporated ACE360/HSB.
+ */
+MC68360HardwareType = DEFINED(MC68360HardwareType) ? MC68360HardwareType : 0;
+
+/*
+ * Load objects
+ */
+SECTIONS {
+ /*
+ * Hardware variations
+ */
+ _RamSize = RamSize;
+ __RamSize = RamSize;
+ _MC68360HardwareType = MC68360HardwareType;
+ __MC68360HardwareType = MC68360HardwareType;
+ _MC68360HardwareTypeMotorolaGeneric = MC68360HardwareTypeMotorolaGeneric;
+ __MC68360HardwareTypeMotorolaGeneric = MC68360HardwareTypeMotorolaGeneric;
+ _MC68360HardwareTypeAtlasHSB = MC68360HardwareTypeAtlasHSB;
+ __MC68360HardwareTypeAtlasHSB = MC68360HardwareTypeAtlasHSB;
+
+ /*
+ * Boot PROM
+ */
+ rom : {
+ _RomBase = .;
+ __RomBase = .;
+ } >rom
+
+ /*
+ * Dynamic RAM
+ */
+ ram : {
+ _RamBase = .;
+ __RamBase = .;
+ } >ram
+
+ /*
+ * Text, data and bss segments
+ */
+ .text : {
+ CREATE_OBJECT_SYMBOLS
+ *(.text)
+ . = ALIGN (16);
+ etext = .;
+ _etext = .;
+ } >rom
+ .data : {
+ copy_start = .;
+ *(.data)
+ . = ALIGN (16);
+ _edata = .;
+ copy_end = .;
+ } >ram
+ .bss : {
+ M68Kvec = .;
+ _M68Kvec = .;
+ . += (256 * 4);
+ clear_start = .;
+ *(.bss)
+ *(COMMON)
+ . = ALIGN (16);
+ _end = .;
+
+ _HeapStart = .;
+ __HeapStart = .;
+ . += HeapSize; /* XXX -- Old gld can't handle this */
+ . += StackSize; /* XXX -- Old gld can't handle this */
+ /* . += 0x10000; */ /* HeapSize for old gld */
+ /* . += 0x1000; */ /* StackSize for old gld */
+ . = ALIGN (16);
+ stack_init = .;
+ clear_end = .;
+
+ _WorkspaceBase = .;
+ __WorkspaceBase = .;
+ } >ram
+
+ /*
+ * On-chip memory/peripherals
+ */
+ dpram : {
+ m360 = .;
+ _m360 = .;
+ . += (8 * 1024);
+
+ } >dpram
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/timer/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/timer/Makefile.in
new file mode 100644
index 0000000000..79c8438431
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/timer/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/gen68360/timer/timer.c b/c/src/lib/libbsp/m68k/gen68360/timer/timer.c
new file mode 100644
index 0000000000..7d87c1397a
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/timer/timer.c
@@ -0,0 +1,95 @@
+/*
+ * Timer_init()
+ *
+ * Use TIMER 1 and TIMER 2 for Timing Test Suite
+ *
+ * The hardware on the MC68360 makes these routines very simple.
+ *
+ * Based on the `gen68302' board support package, and covered by the
+ * original distribution terms.
+ *
+ * W. Eric Norum
+ * Saskatchewan Accelerator Laboratory
+ * University of Saskatchewan
+ * Saskatoon, Saskatchewan, CANADA
+ * eric@skatter.usask.ca
+ *
+ * $Id$
+ */
+
+/*
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include "m68360.h"
+
+void
+Timer_initialize (void)
+{
+ /*
+ * Reset timers 1 and 2
+ */
+ m360.tgcr &= ~0x00FF;
+ m360.tcn1 = 0;
+ m360.tcn2 = 0;
+ m360.ter1 = 0xFFFF;
+ m360.ter2 = 0xFFFF;
+
+ /*
+ * Cascade timers 1 and 2
+ */
+ m360.tgcr |= 0x0080;
+
+ /*
+ * Configure timers 1 and 2 to a single 32-bit, 1 MHz timer.
+ * HARDWARE:
+ * Change the `25' to match your processor clock
+ */
+ m360.tmr2 = ((25-1) << 8) | 0x2;
+ m360.tmr1 = 0;
+
+ /*
+ * Start the timers
+ */
+ m360.tgcr |= 0x0011;
+}
+
+/*
+ * Return timer value in microsecond units
+ */
+int
+Read_timer (void)
+{
+ return *(rtems_unsigned32 *)&m360.tcn1;
+}
+
+/*
+ * Empty function call used in loops to measure basic cost of looping
+ * in Timing Test Suite.
+ */
+rtems_status_code
+Empty_function (void)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void
+Set_find_average_overhead(rtems_boolean find_flag)
+{
+}
diff --git a/c/src/lib/libbsp/m68k/gen68360/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/gen68360/wrapup/Makefile.in
new file mode 100644
index 0000000000..4893e89c5d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/gen68360/wrapup/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer
+CPU_PIECES=
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(CPU_PIECES), \
+ ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).rel) \
+ $(wildcard \
+ ../../../../libcpu/$(RTEMS_CPU)/$(RTEMS_CPU_MODEL)/fpsp/$(ARCH)/fpsp.rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/idp/Makefile.in b/c/src/lib/libbsp/m68k/idp/Makefile.in
new file mode 100644
index 0000000000..1590a95a1e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console timer wrapup
diff --git a/c/src/lib/libbsp/m68k/idp/README b/c/src/lib/libbsp/m68k/idp/README
new file mode 100644
index 0000000000..f02ced80b9
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/README
@@ -0,0 +1,35 @@
+#
+# $Id$
+#
+
+This board support package has not been tested with multiprocessor
+or the timing support. The uniprocessor IDP package was tested though
+with a fairly large application (although bugs may exist). The
+$RTEMS_ROOT/src/tests/Makefile should therefore have the samples and
+the tests directories compiled first with the tmtests (timing) and
+multiprocessor directories optional.
+
+Let me know if you have any problems or bug fixes. Bug fixes are greatly
+appreciated. I do not work for RTEMS or am a member of the RTEMS support
+group in any way, however. I am just one of many that appreciate
+"free" software and enjoy contributing when possible :). You can do it too!
+
+ -- doug mcbride
+ mcbride@rodin.colorado.edu
+
+==============================================================
+Notes: Make sure that -msoft-float is defined when compiling in the
+newlib-beta-rtems/newlib/msoft-float directory subtree. You also probably
+want to add the following line to line 413 of
+newlib-beta-rtems/newlib/msoft-float/libc/stdio/vfprintf.c:
+
+#define INTEGER_ONLY
+
+That allows you to pass most of the paranoia test in the samples
+directory of RTEMS although you can't see the floating point values actually
+printed (software floating point tends to make that difficult anyway).
+In order to pass the whole paranoia test (with one flaw), however, I had to
+comment out the following line in milestone 140 (why?):
+
+/* printf ("Testing X^((X + 1) / (X - 1)) vs. exp(2) = %.17e as X -> 1.\n",
+ Exp2); */
diff --git a/c/src/lib/libbsp/m68k/idp/bsp_specs b/c/src/lib/libbsp/m68k/idp/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/idp/clock/Makefile.in b/c/src/lib/libbsp/m68k/idp/clock/Makefile.in
new file mode 100644
index 0000000000..95a41d281e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/clock/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/idp/clock/ckinit.c b/c/src/lib/libbsp/m68k/idp/clock/ckinit.c
new file mode 100644
index 0000000000..1d3c22d280
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/clock/ckinit.c
@@ -0,0 +1,199 @@
+/* Clock_init()
+ *
+ *
+ * This is modified by Doug McBride to get it to work for the MC68EC040
+ * IDP board. The below comments are kept to show that some prior work
+ * was done in the area and the modifications performed was application
+ * specific for the IDP board to port it to.
+ *
+ * This routine initializes the mc68230 on the MC68EC040 board.
+ * The tick frequency is 40 milliseconds.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+volatile rtems_unsigned32 Clock_driver_ticks;
+ /* ticks since initialization */
+rtems_isr_entry Old_ticker;
+
+extern rtems_configuration_table Configuration;
+extern void led_putnum();
+void Disable_clock();
+
+#define CLOCK_VECTOR 0x4D
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+
+/*
+ * ISR Handler
+ *
+ *
+ * ((1ms * 6.5 MHz) / 2^5) = 203.125) where 6.5 MHz is the clock rate of the
+ * MC68230, 2^5 is the prescaler factor, and 1ms is the common interrupt
+ * interval for the Clock_isr routine.
+ * Therefore, 203 (decimal) is the number to program into the CPRH-L registers
+ * of the MC68230 for countdown. However, I have found that 193 instead of
+ * 203 provides greater accuracy -- why? The crystal should be more accurate
+ * than that
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ Clock_driver_ticks += 1;
+ /* acknowledge interrupt
+ TSR = 1; */
+ MC68230_WRITE (TSR, 1);
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ /* Cast to an integer so that 68EC040 IDP which doesn't have an FPU doesn't
+ have a heart attack -- if you use newlib1.6 or greater and get
+ libgcc.a for gcc with software floating point support, this is not
+ a problem */
+ Clock_isrs =
+ (int)(BSP_Configuration.microseconds_per_tick / 1000);
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Disable_clock()
+{
+ /* Disable timer */
+ MC68230_WRITE (TCR, 0x00);
+}
+
+void Install_clock( clock_isr )
+rtems_isr_entry clock_isr;
+{
+ Clock_driver_ticks = 0;
+ Clock_isrs = (int)(Configuration.microseconds_per_tick / 1000);
+
+ if ( Configuration.ticks_per_timeslice ) {
+/* led_putnum('c'); * for debugging purposes */
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+
+ /* Disable timer for initialization */
+ MC68230_WRITE (TCR, 0x00);
+
+ /* some PI/T initialization stuff here -- see comment in the ckisr.c
+ file in this directory to understand why I use the values that I do */
+ /* Set up the interrupt vector on the MC68230 chip:
+ TIVR = CLOCK_VECTOR; */
+ MC68230_WRITE (TIVR, CLOCK_VECTOR);
+
+ /* Set CPRH through CPRL to 193 (not 203) decimal for countdown--see ckisr.c
+ CPRH = 0x00;
+ CPRM = 0x00;
+ CPRL = 0xC1; */
+ MC68230_WRITE (CPRH, 0x00);
+ MC68230_WRITE (CPRM, 0x00);
+ MC68230_WRITE (CPRL, 0xC1);
+
+ /* Enable timer and use it as an external periodic interrupt generator
+ TCR = 0xA1; */
+/* led_putnum('a'); * for debugging purposes */
+ MC68230_WRITE (TCR, 0xA1);
+
+ /*
+ * Schedule the clock cleanup routine to execute if the application exits.
+ */
+ atexit( Clock_exit );
+ }
+}
+
+/* The following was added for debugging purposes */
+void Clock_exit( void )
+{
+ rtems_unsigned8 data;
+
+ if ( Configuration.ticks_per_timeslice ) {
+
+ /* disable timer
+ data = TCR;
+ TCR = (data & 0xFE); */
+ MC68230_READ (TCR, data);
+ MC68230_WRITE (TCR, (data & 0xFE));
+
+ /* do not restore old vector */
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/idp/console/Makefile.in b/c/src/lib/libbsp/m68k/idp/console/Makefile.in
new file mode 100644
index 0000000000..1332213895
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console leds mc68ec duart
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/idp/console/console.c b/c/src/lib/libbsp/m68k/idp/console/console.c
new file mode 100644
index 0000000000..cd64e27e84
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/console/console.c
@@ -0,0 +1,284 @@
+/*
+ * This file contains the Motorola IDP console IO package.
+ *
+ * Written by Doug McBride, Colorado Space Grant College
+ * Based off of the board support packages of RTEMS
+ *
+ * Updated to RTEMS 3.2.0 by Joel Sherrill.
+ *
+ * $Id$
+ */
+
+#define MIDP_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <ringbuf.h>
+
+Ring_buffer_t Buffer[ 2 ];
+
+rtems_isr C_Receive_ISR(rtems_vector_number vector);
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ Ring_buffer_Initialize( &Buffer[ 0 ] );
+ Ring_buffer_Initialize( &Buffer[ 1 ] );
+
+ init_pit();
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name(
+ "/dev/tty00",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name(
+ "/dev/tty01",
+ major,
+ (rtems_device_minor_number) 1
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch,
+ int port
+)
+{
+ if ( Ring_buffer_Is_empty( &Buffer[ port ] ) )
+ return FALSE;
+
+ Ring_buffer_Remove_character( &Buffer[ port ], *ch );
+ return TRUE;
+}
+
+/* quick_char_check
+ *
+ * This routine returns TRUE if a character is available.
+ * It is different from above because it does not disturb the ring buffer
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean quick_char_check(
+ int port
+)
+{
+ if ( Ring_buffer_Is_empty( &Buffer[ port ] ) )
+ return FALSE;
+
+ return TRUE;
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the UART through a buffer.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char inbyte(
+ int port
+)
+{
+ unsigned char tmp_char;
+
+ /* If you come into this routine without checking is_character_ready() first
+ and you want nonblocking code, then it's your own fault */
+
+ while ( !is_character_ready( &tmp_char, port ) );
+
+ return tmp_char;
+}
+
+
+/* outbyte
+ *
+ * This routine transmits a character out the M68681. It supports
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch,
+ int port
+)
+{
+ switch ( port ) {
+ case 0:
+ transmit_char( ch );
+ break;
+ case 1:
+ transmit_char_portb( ch );
+ break;
+ }
+
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ if ( minor > 1 )
+ return RTEMS_INVALID_NUMBER;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte( minor );
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ if ( minor > 1 )
+ return RTEMS_INVALID_NUMBER;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r', minor );
+ }
+ outbyte( buffer[ count ], minor );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/idp/console/duart.c b/c/src/lib/libbsp/m68k/idp/console/duart.c
new file mode 100644
index 0000000000..2d82590a49
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/console/duart.c
@@ -0,0 +1,174 @@
+/*
+ * $Id$
+ */
+
+/*#########################################################
+#
+# This code is a modified version of what you will find at the
+# end of the IDP User's manual. The original code is copyrighted
+# by Motorola and Motorola Semiconductor Products as well as
+# Motorola Software products group.
+#
+# Modifications to the original IDP code by Doug McBride, Colorado
+# Space Grant College. Modifications include a means of accessing
+# port B of the duart as well as port A as well as modifications for
+# buffering and RTEMS support. Modifications are provided
+# as is and may not be correct.
+#
+# Rob Savoye provided the format for the mc68681 header file
+#
+# Joel Sherrill provided inspiration for recoding my original assembly
+# for this file into C (a good idea)
+#
+##########################################################*/
+
+#include "mc68230.h"
+#include "mc68681.h"
+#include "ringbuf.h"
+#include "rtems.h"
+#include "bsp.h"
+
+rtems_isr C_Receive_ISR(rtems_vector_number vector);
+extern Ring_buffer_t Buffer[];
+
+extern unsigned char inbuf[];
+extern unsigned char inbuf_portb[];
+extern unsigned tail;
+extern unsigned tail_portb;
+unsigned char Pit_initialized = 0;
+
+/*#####################################################################
+# The volatile routine to initialize the duart -- port a and port b
+######################################################################*/
+volatile void init_pit()
+{
+ /* Disable ports A & B while configuring PIT */
+ MC68681_WRITE(DUART_IMR, 0x00); /* disable imr */
+ MC68681_WRITE(DUART_CRA, 0x08); /* disable port a transmitter */
+ MC68681_WRITE(DUART_CRA, 0x02); /* disable port a receiver */
+ MC68681_WRITE(DUART_CRB, 0x08); /* disable port b transmitter */
+ MC68681_WRITE(DUART_CRB, 0x02); /* disable port b receiver */
+
+ /* install ISR for ports A and B */
+ set_vector(C_Receive_ISR, (VECT+H3VECT), 1);
+
+ /* initialize pit */
+ MC68230_WRITE(PGCR, 0x00); /* set mode to 0 -- disable all ports */
+ MC68230_WRITE(PSRR, 0x18); /* set up pirq and piack */
+ MC68230_WRITE(PBDDR, 0x00); /* all pins on port b are input */
+ MC68230_WRITE(PBCR, 0x82); /* submode 1x, h3 interrupt enabled */
+ MC68230_WRITE(PIVR, VECT); /* setup pivr */
+ MC68230_WRITE(PGCR, 0x20); /* turn on all ports */
+
+ /* For some reason, the reset of receiver/transmitter only works for
+ the first time around -- it garbles the output otherwise (e.g., sp21) */
+ if (!Pit_initialized)
+ {
+ /* now initialize the duart registers on port b */
+ /* WARNING:OPTIMIZER MAY ONLY EXECUTE THIRD STATEMENT IF NOT VOLATILE */
+ MC68681_WRITE(DUART_CRB, 0x30); /* reset tx, channel b */
+ MC68681_WRITE(DUART_CRB, 0x20); /* reset rx, channel b */
+ MC68681_WRITE(DUART_CRB, 0x10); /* reset mr pointer, channel b */
+
+ /* now initialize the duart registers on port a */
+ /* WARNING:OPTIMIZER MAY ONLY EXECUTE THIRD STATEMENT IF NOT VOLATILE */
+ MC68681_WRITE(DUART_CRA, 0x30); /* reset tx, channel a */
+ MC68681_WRITE(DUART_CRA, 0x20); /* reset rx, channel a */
+ MC68681_WRITE(DUART_CRA, 0x10); /* reset mr pointer, channel a */
+ Pit_initialized = 1;
+ }
+
+ /* init the general registers of the duart */
+ MC68681_WRITE(DUART_IVR, 0x0f); /* init ivr */
+ MC68681_WRITE(DUART_IMR, 0x22); /* init imr */
+ MC68681_WRITE(DUART_ACR, 0x00); /* init acr */
+ MC68681_WRITE(DUART_CTUR, 0x00); /* init ctur */
+ MC68681_WRITE(DUART_CTLR, 0x02); /* init ctlr */
+ MC68681_WRITE(DUART_OPCR, 0x00); /* init opcr */
+ MC68681_WRITE(DUART_OPRSET, 0x01); /* init cts */
+
+ /* init the actual serial port for port a */
+ MC68681_WRITE(DUART_CSRA, 0xbb); /* init csra -- 9600 baud */
+ MC68681_WRITE(DUART_MR1A, 0x13); /* init mr1a */
+ MC68681_WRITE(DUART_MR2A, 0x07); /* init mr2a */
+ MC68681_WRITE(DUART_CRA, 0x05); /* init cra */
+
+ /* init the actual serial port for port b */
+ MC68681_WRITE(DUART_CSRB, 0xbb); /* init csrb -- 9600 baud */
+#define EIGHT_BITS_NO_PARITY
+#ifdef EIGHT_BITS_NO_PARITY
+ MC68681_WRITE(DUART_MR1B, 0x13); /* init mr1b */
+#else /* 7 bits, even parity */
+ MC68681_WRITE(DUART_MR1B, 0x02); /* init mr1b */
+#endif
+ MC68681_WRITE(DUART_MR2B, 0x07); /* init mr2b -- one stop bit */
+ MC68681_WRITE(DUART_CRB, 0x05); /* init crb */
+}
+
+/*#####################################################################
+# interrupt handler for receive of character from duart on ports A & B
+#####################################################################*/
+rtems_isr C_Receive_ISR(rtems_vector_number vector)
+{
+ volatile unsigned char *_addr;
+
+ _addr = (unsigned char *) (PIT_ADDR + PITSR);
+ *_addr = 0x04; /* clear pit interrupt */
+
+ /* Let's check port A first for input */
+ _addr = (unsigned char *) (DUART_ADDR + DUART_SRA);
+ if (*_addr & 0x01) /* extract rcvrdy on port A */
+ {
+ /* Read input on port A */
+ _addr = (unsigned char *) (DUART_ADDR + DUART_RBA);
+ Ring_buffer_Add_character( &Buffer[ 0 ], *_addr );
+ }
+ else /* If not on port A, let's check port B */
+ {
+ _addr = (unsigned char *) (DUART_ADDR + DUART_SRB);
+ if (*_addr & 0x01) /* extract rcvrdy on port B */
+ {
+ /* Read input on port B */
+ _addr = (unsigned char *) (DUART_ADDR + DUART_RBB);
+ Ring_buffer_Add_character( &Buffer[ 1 ], *_addr );
+ }
+ /* if not ready on port A or port B, must be an error */
+ /* if error, get out so that fifo is undisturbed */
+ }
+}
+
+/*#####################################################################
+# This is the routine that actually transmits a character one at a time
+# This routine transmits on port A of the IDP board
+#####################################################################*/
+void transmit_char(char ch)
+{
+ volatile unsigned char *_addr;
+
+ /* Get SRA (extract txrdy) */
+ _addr = (unsigned char *) (DUART_ADDR + DUART_SRA);
+ while (!(*_addr & 0x04))
+ {
+ }
+
+ /* transmit character over port A */
+ MC68681_WRITE(DUART_TBA, ch);
+}
+
+/*#####################################################################
+# This is the routine that actually transmits a character one at a time
+# This routine transmits on port B of the IDP board
+#####################################################################*/
+void transmit_char_portb(char ch)
+{
+ volatile unsigned char *_addr;
+
+ /* Get SRB (extract txrdy) */
+ _addr = (unsigned char *) (DUART_ADDR + DUART_SRB);
+ while (!(*_addr & 0x04))
+ {
+ }
+
+ /* transmit character over port B */
+ MC68681_WRITE(DUART_TBB, ch);
+}
diff --git a/c/src/lib/libbsp/m68k/idp/console/leds.c b/c/src/lib/libbsp/m68k/idp/console/leds.c
new file mode 100644
index 0000000000..b7b7722008
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/console/leds.c
@@ -0,0 +1,83 @@
+/*
+ * leds.c -- control the led's on a Motorola mc68ec0x0 board.
+ * Written by rob@cygnus.com (Rob Savoye)
+ *
+ * $Id$
+ */
+#include "leds.h"
+
+void zylons();
+void led_putnum();
+void clear_leds();
+
+/*
+ * led_putnum -- print a hex number on the LED. the value of num must be a char with
+ * the ascii value. ie... number 0 is '0', a is 'a', ' ' (null) clears
+ * the led display.
+ * Setting the bit to 0 turns it on, 1 turns it off.
+ * the LED's are controlled by setting the right bit mask in the base
+ * address.
+ * The bits are:
+ * [d.p | g | f | e | d | c | b | a ] is the byte.
+ *
+ * The locations are:
+ *
+ * a
+ * -----
+ * f | | b
+ * | g |
+ * -----
+ * | |
+ * e | | c
+ * -----
+ * d . d.p (decimal point)
+ */
+void
+led_putnum ( num )
+char num;
+{
+ static unsigned char *leds = (unsigned char *)LED_ADDR;
+ static unsigned char num_bits [18] = {
+ 0xff, /* clear all */
+ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x98, /* numbers 0-9 */
+ 0x98, 0x20, 0x3, 0x27, 0x21, 0x4, 0xe /* letters a-f */
+ };
+
+ if (num >= '0' && num <= '9')
+ num = (num - '0') + 1;
+
+ if (num >= 'a' && num <= 'f')
+ num = (num - 'a') + 12;
+
+ if (num == ' ')
+ num = 0;
+
+ *leds = num_bits[(int)num];
+}
+
+/* This procedure added by Doug McBride, Colorado Space Grant College --
+ Probably should be a macro instead */
+void
+clear_leds ( )
+{
+ static unsigned char *leds = (unsigned char *)LED_ADDR;
+ *leds = 0xFF;
+}
+
+/*
+ * zylons -- draw a rotating pattern. NOTE: this function never returns.
+ */
+void
+zylons()
+{
+ unsigned char *leds = (unsigned char *)LED_ADDR;
+ unsigned char curled = 0xfe;
+ void delay( int );
+
+ while (1)
+ {
+ *leds = curled;
+ curled = (curled >> 1) | (curled << 7);
+ delay ( 8000 );
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/idp/console/mc68ec.c b/c/src/lib/libbsp/m68k/idp/console/mc68ec.c
new file mode 100644
index 0000000000..fd837981d2
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/console/mc68ec.c
@@ -0,0 +1,21 @@
+/*
+ * mc68ec.c -- Low level support for the Motorola mc68ec0x0 board.
+ * Written by rob@cygnus.com (Rob Savoye)
+ *
+ * $Id$
+ */
+
+#include "leds.h"
+
+/*
+ * delay -- delay execution. This is an ugly hack. It should
+ * use the timer, but I'm waiting for docs. (sigh)
+ */
+void delay(num)
+int num;
+{
+ while (num--)
+ {
+ asm ("nop");
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/idp/include/Makefile.in b/c/src/lib/libbsp/m68k/idp/include/Makefile.in
new file mode 100644
index 0000000000..d4574056f5
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/include/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h $(srcdir)/leds.h \
+ $(srcdir)/mc68230.h $(srcdir)/mc68681.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/idp/include/README b/c/src/lib/libbsp/m68k/idp/include/README
new file mode 100644
index 0000000000..940cadb13d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/include/README
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+The following files really should be made generic and allowed to
+be shared between BSPs:
+
+ mc68230.h
+ mc68681.h
+ ringbuf.h
+
+However at the moment the BSP is not tested under 3.2.0 so it is
+dangerous to do so.
diff --git a/c/src/lib/libbsp/m68k/idp/include/bsp.h b/c/src/lib/libbsp/m68k/idp/include/bsp.h
new file mode 100644
index 0000000000..65fcfe1e6e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/include/bsp.h
@@ -0,0 +1,97 @@
+/* bsp.h
+ *
+ * This include file contains all Motorola 680x0 IDP board IO definitions.
+ *
+ * $Id$
+ */
+
+#ifndef __IDP_BSP_H
+#define __IDP_BSP_H
+
+#include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
+#include <mc68230.h>
+#include <mc68681.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: tm27 apparently not supported.
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x200000
+
+#ifdef MIDP_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+void init_pit( void );
+
+void transmit_char( char ch );
+
+void transmit_char_portb( char ch );
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/idp/include/coverhd.h b/c/src/lib/libbsp/m68k/idp/include/coverhd.h
new file mode 100644
index 0000000000..48d824e5f4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/include/coverhd.h
@@ -0,0 +1,106 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#endif
diff --git a/c/src/lib/libbsp/m68k/idp/include/leds.h b/c/src/lib/libbsp/m68k/idp/include/leds.h
new file mode 100644
index 0000000000..f2c3257dd4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/include/leds.h
@@ -0,0 +1,27 @@
+/*
+ * leds.c -- control the led's on a Motorola mc68ec0x0 board.
+ * Written by rob@cygnus.com (Rob Savoye)
+ *
+ * $Id$
+ */
+
+#ifndef __LEDS_H__
+#define __LEDS_H__
+
+#define LED_ADDR 0xd00003
+#define LED_0 ~0x1
+#define LED_1 ~0x2
+#define LED_2 ~0x4
+#define LED_3 ~0x8
+#define LED_4 ~0x10
+#define LED_5 ~0x20
+#define LED_6 ~0x40
+#define LED_7 ~0x80
+#define LEDS_OFF 0xff
+#define LEDS_ON 0x0
+
+#define FUDGE(x) ((x >= 0xa && x <= 0xf) ? (x + 'a') & 0x7f : (x + '0') & 0x7f)
+
+extern void led_putnum( char );
+
+#endif /* __LEDS_H__ */
diff --git a/c/src/lib/libbsp/m68k/idp/startup/Makefile.in b/c/src/lib/libbsp/m68k/idp/startup/Makefile.in
new file mode 100644
index 0000000000..c52372c7a6
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/idp/startup/bspstart.c b/c/src/lib/libbsp/m68k/idp/startup/bspstart.c
new file mode 100644
index 0000000000..ef5205cde7
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/startup/bspstart.c
@@ -0,0 +1,256 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+unsigned char *duart_base;
+extern struct duart_regs duart_info;
+
+#define DELAY 5000
+
+void led_putnum();
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /* Create 64 KByte memory region for RTEMS executive */
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ m68k_isr_entry *monitors_vector_table;
+ int index;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ duart_base = (unsigned char *)DUART_ADDR;
+
+ /*
+ * Set the VBR here to the monitor's default.
+ */
+
+ monitors_vector_table = (m68k_isr_entry *)0;
+ /* This is where you set vector base register = 0 */
+ m68k_set_vbr( monitors_vector_table );
+
+ /* The vector interrupt table for the 680x0 is in appendix B-2
+ of the M68000 Family Programmer's reference table */
+ for ( index=2 ; index<=255 ; index++ )
+ M68Kvec[ index ] = monitors_vector_table[ 32 ];
+
+
+ M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */
+ M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */
+ M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */
+
+ /*
+ * Set the VBR here if you do not want to use the monitor's vector table.
+ */
+
+ m68k_set_vbr( &M68Kvec );
+
+ m68k_enable_caching();
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_vector_table = (m68k_isr_entry *) &M68Kvec;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+/* led_putnum('e'); * for debugging purposes only */
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );/* does not return */
+
+ /* Clock_exit is done as an atexit() function */
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/idp/startup/linkcmds b/c/src/lib/libbsp/m68k/idp/startup/linkcmds
new file mode 100644
index 0000000000..150d397467
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/startup/linkcmds
@@ -0,0 +1,46 @@
+/* This file is a derivation of that found with the newlib-1.6 distribution
+ * for the idp.ld file. That file, it appears, was originally written by
+ * Rob Savoye. Other ideas came from Joel Sherrill for the RTEMS linkcmds
+ * file (this is basically a mixture of the two).
+ *
+ * $Id$
+ */
+
+/*
+ * Setup the memory map of the MC68ec0x0 Board (IDP)
+ * stack grows up towards high memory. This works for
+ * both the rom68k and the mon68k monitors.
+ */
+MEMORY
+{
+ ram : org = 0x10000, l = 2M
+}
+
+SECTIONS
+{
+ .text 0x10000:
+ {
+ text_start = . ;
+ _text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+ _etext = .;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ _data_start = .;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+ _edata = .;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/idp/timer/Makefile.in b/c/src/lib/libbsp/m68k/idp/timer/Makefile.in
new file mode 100644
index 0000000000..468ed7460d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/idp/timer/timer.c b/c/src/lib/libbsp/m68k/idp/timer/timer.c
new file mode 100644
index 0000000000..4493faa86f
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/timer/timer.c
@@ -0,0 +1,120 @@
+/* Timer_init()
+ *
+ * This routine initializes the MC68230 timer on the Motorola IDP board.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine will not work if the optimizer is enabled
+ * for some compilers. The multiple writes to the MC68230
+ * may be optimized away.
+ *
+ * It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * Code Modified for the MC68230 by Doug McBride, Colorado Space Grant College
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+#include <mc68230.h>
+
+#define TIMER_VECTOR 0x4D
+
+int Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+void Timer_initialize()
+{
+ (void) set_vector( timerisr, TIMER_VECTOR, 0 ); /* install ISR */
+
+ Ttimer_val = 0; /* clear timer ISR count */
+
+ /* some PI/T initialization stuff here */
+ /* Set up the interrupt vector on the MC68230 chip:
+ TIVR = TIMER_VECTOR; */
+ MC68230_WRITE (TIVR, TIMER_VECTOR);
+
+ /* Set CPRH through CPRL to maximum count to reduce interrupt overhead
+ CPRH = 0xFF;
+ CPRM = 0xFF;
+ CPRL = 0xFF; */
+ MC68230_WRITE (CPRH, 0xFF);
+ MC68230_WRITE (CPRM, 0xFF);
+ MC68230_WRITE (CPRL, 0xFF);
+
+ /* Enable timer and use it as an external periodic interrupt generator
+ TCR = 0xA1; */
+ MC68230_WRITE (TCR, 0xA1);
+
+}
+
+#define AVG_OVERHEAD 9 /* may not be right -- do this later */
+#define LEAST_VALID 10 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ rtems_unsigned8 data;
+ rtems_unsigned8 msb, osb, lsb;
+ rtems_unsigned32 remaining, total;
+
+ /* Disable timer so that timer can be read
+ data = TCR;
+ TCR = (data & 0xFE); */
+ MC68230_READ (TCR, data);
+ MC68230_WRITE (TCR, (data & 0xFE));
+
+ /* Read the counter value
+ msb = CNTRH;
+ osb = CNTRM;
+ lsb = CNTRL; */
+ MC68230_READ (CNTRH, msb);
+ MC68230_READ (CNTRM, osb);
+ MC68230_READ (CNTRL, lsb);
+
+ /* Calculate the time so far */
+ remaining = 0x1000000 - ((msb << 16) + (osb << 8) + lsb);
+ total = (Ttimer_val * 0x1000000) + remaining;
+
+ /* Enable timer so that timer can continue
+ TCR = 0xA1; */
+ MC68230_WRITE (TCR, 0xA1);
+
+ /* do not restore old vector */
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in countdown units */
+
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ /* Clocked at 6.5 Mhz */
+ /* Avoid floating point problems, be lazy, and return the total minus
+ the average overhead */
+ return (total - AVG_OVERHEAD);
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/idp/timer/timerisr.s b/c/src/lib/libbsp/m68k/idp/timer/timerisr.s
new file mode 100644
index 0000000000..caeff93a3d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/timer/timerisr.s
@@ -0,0 +1,38 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the MC68230 timer on the Motorola
+ * IDP board. The timer is set up to generate an interrupt at maximum
+ * intervals.
+ *
+ * Code modified by Doug McBride, Colorado Space Grant College
+ * countdown should be loaded automatically
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+
+.set TSR, 0x00c0106B | base address of PIT register "TSR"
+
+ PUBLIC (timerisr)
+SYM (timerisr):
+ movb #1,TSR | acknowledge interrupt
+ addql #1, SYM (Ttimer_val) | increment timer value
+ rte
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/m68k/idp/times b/c/src/lib/libbsp/m68k/idp/times
new file mode 100644
index 0000000000..92864585f3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/times
@@ -0,0 +1,193 @@
+#
+# Timing Test Suite Results for the Motorola IDP BSP
+#
+# $Id$
+#
+
+NOTE: This BSP is used submitted and no information is currently available.
+
+Board: IDP
+CPU:
+Clock Speed:
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column A: unused
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/m68k/idp/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/idp/wrapup/Makefile.in
new file mode 100644
index 0000000000..8bbdfdc470
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/idp/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/mvme136/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/Makefile.in
new file mode 100644
index 0000000000..1280bbaad6
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console shmsupp timer wrapup
diff --git a/c/src/lib/libbsp/m68k/mvme136/bsp_specs b/c/src/lib/libbsp/m68k/mvme136/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/mvme136/clock/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/clock/Makefile.in
new file mode 100644
index 0000000000..e2def59237
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/clock/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c b/c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c
new file mode 100644
index 0000000000..214d80190f
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/clock/ckinit.c
@@ -0,0 +1,173 @@
+/* Clock_init()
+ *
+ * This routine initializes the Z80386 1 on the MVME136 board.
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <z8036.h>
+
+#define MICRVAL 0xe2 /* disable lower chain, no vec */
+ /* set right justified addr */
+ /* and master int enable */
+#define MCCRVAL 0xc4 /* enable T1 and port B */
+ /* timers independent */
+#define MS_COUNT 0x07d0 /* T1's countdown constant (1 ms) */
+#define T1MSRVAL 0x80 /* T1 cont. cycle/pulse output */
+#define T1CSRVAL 0xc6 /* enable interrupt, allow and */
+ /* and trigger countdown */
+
+#define TIMER 0xfffb0000
+#define RELOAD 0x24 /* clr IP & IUS,allow countdown */
+
+#define CLOCK_VECTOR 66
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */
+
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * ISR Handler
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ Clock_driver_ticks += 1;
+ ((volatile struct z8036_map *) TIMER)->CT1_CMD_STATUS = RELOAD;
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ volatile struct z8036_map *timer;
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ timer = (struct z8036_map *) 0xfffb0000;
+ timer->MASTER_INTR = MICRVAL;
+ timer->CT1_MODE_SPEC = T1MSRVAL;
+
+ *((rtems_unsigned16 *)0xfffb0016) = MS_COUNT; /* write countdown value */
+
+ /*
+ * timer->CT1_TIME_CONST_MSB = (MS_COUNT >> 8);
+ * timer->CT1_TIME_CONST_LSB = (MS_COUNT & 0xff);
+ */
+
+ timer->MASTER_CFG = MCCRVAL;
+ timer->CT1_CMD_STATUS = T1CSRVAL;
+
+ /*
+ * Enable interrupt via VME interrupt mask register
+ */
+ (*(rtems_unsigned8 *)0xfffb0038) &= 0xfd;
+
+ atexit( Clock_exit );
+ }
+
+}
+
+void Clock_exit( void )
+{
+ volatile struct z8036_map *timer;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ timer = (struct z8036_map *) 0xfffb0000;
+ timer->MASTER_INTR = 0x62;
+ timer->CT1_MODE_SPEC = 0x00;
+ timer->MASTER_CFG = 0xf4;
+ timer->CT1_CMD_STATUS = 0x00;
+ /* do not restore old vector */
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/console/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme136/console/console.c b/c/src/lib/libbsp/m68k/mvme136/console/console.c
new file mode 100644
index 0000000000..cd55f2402d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/console/console.c
@@ -0,0 +1,224 @@
+/*
+ * This file contains the MVME136 console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define M136_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ _Write_m681 = ( struct w_m681_info * ) M681ADDR;
+ _Read_m681 = ( struct r_m681_info * ) M681ADDR;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ if ( !(_Read_m681->srb & RXRDYB) )
+ return(FALSE);
+
+ *ch = _Read_m681->rbb;
+ return(TRUE);
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the UART.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char inbyte( void )
+{
+ while ( !(_Read_m681->srb & RXRDYB) );
+ return _Read_m681->rbb;
+}
+
+
+/* outbyte
+ *
+ * This routine transmits a character out the M68681. It supports
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ while ( ! (_Read_m681->srb & TXRDYB) ) ;
+ while ( _Read_m681->srb & RXRDYB ) /* must be an XOFF */
+ if ( _Read_m681->rbb == XOFF )
+ do {
+ while ( ! (_Read_m681->srb & RXRDYB) ) ;
+ } while ( _Read_m681->rbb != XON );
+
+ _Write_m681->tbb = ch;
+ if ( ch == '\n' )
+ outbyte( CR );
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/include/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/mvme136/include/bsp.h b/c/src/lib/libbsp/m68k/mvme136/include/bsp.h
new file mode 100644
index 0000000000..993a6dc0fd
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/include/bsp.h
@@ -0,0 +1,162 @@
+/* bsp.h
+ *
+ * This include file contains all MVME136 board IO definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MVME136_h
+#define __MVME136_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Use the MPCSR vector for the MVME136
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 75, 1 )
+
+#define Cause_tm27_intr() (*(volatile rtems_unsigned8 *)0xfffb006b) = 0x80
+
+#define Clear_tm27_intr() (*(volatile rtems_unsigned8 *)0xfffb006b) = 0x00
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { register rtems_unsigned32 _delay=(microseconds); \
+ register rtems_unsigned32 _tmp=123; \
+ asm volatile( "0: \
+ nbcd %0 ; \
+ nbcd %0 ; \
+ dbf %1,0b" \
+ : "=d" (_tmp), "=d" (_delay) \
+ : "0" (_tmp), "1" (_delay) ); \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+#define M681ADDR 0xfffb0040 /* address of the M68681 chip */
+#define RXRDYB 0x01 /* status reg recv ready mask */
+#define TXRDYB 0x04 /* status reg trans ready mask */
+#define PARITYERR 0x20 /* status reg parity error mask */
+#define FRAMEERR 0x40 /* status reg frame error mask */
+
+
+#define FOREVER 1 /* infinite loop */
+
+/* Structures */
+
+struct r_m681_info {
+ char fill1[ 5 ]; /* channel A regs ( not used ) */
+ char isr; /* interrupt status reg */
+ char fill2[ 2 ]; /* counter regs (not used) */
+ char mr1mr2b; /* MR1B and MR2B regs */
+ char srb; /* status reg channel B */
+ char fill3; /* do not access */
+ char rbb; /* receive buffer channel B */
+ char ivr; /* interrupt vector register */
+};
+
+struct w_m681_info {
+ char fill1[ 4 ]; /* channel A regs (not used) */
+ char acr; /* auxillary control reg */
+ char imr; /* interrupt mask reg */
+ char fill2[ 2 ]; /* counter regs (not used) */
+ char mr1mr2b; /* MR1B and MR2B regs */
+ char csrb; /* clock select reg */
+ char crb; /* command reg */
+ char tbb; /* transmit buffer channel B */
+ char ivr; /* interrupt vector register */
+};
+
+#ifdef M136_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+/* M68681 DUART chip register variables */
+
+EXTERN volatile struct r_m681_info *_Read_m681; /* M68681 read registers */
+EXTERN volatile struct w_m681_info *_Write_m681; /* M68681 write registers */
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/mvme136/include/coverhd.h b/c/src/lib/libbsp/m68k/mvme136/include/coverhd.h
new file mode 100644
index 0000000000..3add9961ff
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 2
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
+#define CALLING_OVERHEAD_TASK_CREATE 3
+#define CALLING_OVERHEAD_TASK_IDENT 2
+#define CALLING_OVERHEAD_TASK_START 2
+#define CALLING_OVERHEAD_TASK_RESTART 2
+#define CALLING_OVERHEAD_TASK_DELETE 1
+#define CALLING_OVERHEAD_TASK_SUSPEND 1
+#define CALLING_OVERHEAD_TASK_RESUME 2
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 2
+#define CALLING_OVERHEAD_TASK_MODE 2
+#define CALLING_OVERHEAD_TASK_GET_NOTE 2
+#define CALLING_OVERHEAD_TASK_SET_NOTE 2
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 2
+#define CALLING_OVERHEAD_CLOCK_GET 5
+#define CALLING_OVERHEAD_CLOCK_SET 4
+#define CALLING_OVERHEAD_CLOCK_TICK 1
+
+#define CALLING_OVERHEAD_TIMER_CREATE 2
+#define CALLING_OVERHEAD_TIMER_IDENT 1
+#define CALLING_OVERHEAD_TIMER_DELETE 2
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
+#define CALLING_OVERHEAD_TIMER_RESET 1
+#define CALLING_OVERHEAD_TIMER_CANCEL 1
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 3
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 1
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 2
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 2
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 2
+
+#define CALLING_OVERHEAD_EVENT_SEND 2
+#define CALLING_OVERHEAD_EVENT_RECEIVE 2
+#define CALLING_OVERHEAD_SIGNAL_CATCH 2
+#define CALLING_OVERHEAD_SIGNAL_SEND 2
+#define CALLING_OVERHEAD_PARTITION_CREATE 3
+#define CALLING_OVERHEAD_PARTITION_IDENT 2
+#define CALLING_OVERHEAD_PARTITION_DELETE 1
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 2
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 2
+#define CALLING_OVERHEAD_REGION_CREATE 3
+#define CALLING_OVERHEAD_REGION_IDENT 2
+#define CALLING_OVERHEAD_REGION_DELETE 2
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 3
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 2
+#define CALLING_OVERHEAD_PORT_CREATE 3
+#define CALLING_OVERHEAD_PORT_IDENT 2
+#define CALLING_OVERHEAD_PORT_DELETE 1
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 2
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 2
+#define CALLING_OVERHEAD_IO_OPEN 2
+#define CALLING_OVERHEAD_IO_CLOSE 3
+#define CALLING_OVERHEAD_IO_READ 2
+#define CALLING_OVERHEAD_IO_WRITE 2
+#define CALLING_OVERHEAD_IO_CONTROL 2
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 2
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/mvme136/shmsupp/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/shmsupp/Makefile.in
new file mode 100644
index 0000000000..113ab8109a
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/shmsupp/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/m68k/mvme136/shmsupp/addrconv.c b/c/src/lib/libbsp/m68k/mvme136/shmsupp/addrconv.c
new file mode 100644
index 0000000000..b8fa52d182
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/shmsupp/addrconv.c
@@ -0,0 +1,32 @@
+/* Shm_Convert_address
+ *
+ * This MVME136 has a "normal" view of the VME address space.
+ * No address range conversion is required.
+ *
+ * Input parameters:
+ * address - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+void *Shm_Convert_address(
+ void *address
+)
+{
+ return ( address );
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/shmsupp/getcfg.c b/c/src/lib/libbsp/m68k/mvme136/shmsupp/getcfg.c
new file mode 100644
index 0000000000..05f7123f50
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/shmsupp/getcfg.c
@@ -0,0 +1,85 @@
+/* void Shm_Get_configuration( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the Cyclone CVME961.
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+ * NOTES: The MPCSR interrupt on the MVME136 is used as an interprocessor
+ * interrupt. The capablities of the MPCSR are used to generate
+ * interprocessor interrupts for up to eight nodes.
+ *
+ * The following table illustrates the configuration limitations:
+ *
+ * BUS MAX
+ * MODE ENDIAN NODES
+ * ========= ====== =======
+ * POLLED LITTLE 2+
+ * INTERRUPT LITTLE 2-8
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+#define INTERRUPT 1 /* MVME136 target supports both */
+#define POLLING 0 /* polling and interrupt modes */
+
+shm_config_table BSP_shm_cfgtbl;
+
+rtems_unsigned32 *BSP_int_address()
+{
+ rtems_unsigned32 id, offset;
+
+ id = (rtems_unsigned32) *(rtems_unsigned8 *)0xfffb0061;
+ offset = ((id & 0x1f) << 5) | ((id & 0xe0) << 8);
+ offset |= 0xffff000b;
+ return( (rtems_unsigned32 * ) offset );
+}
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+ BSP_shm_cfgtbl.base = (rtems_unsigned32 *)0x20000000;
+ BSP_shm_cfgtbl.length = 1 * MEGABYTE;
+ BSP_shm_cfgtbl.format = SHM_BIG;
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#else
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
+#endif
+
+#if (POLLING==1)
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+#else
+ BSP_shm_cfgtbl.poll_intr = INTR_MODE;
+ BSP_shm_cfgtbl.Intr.address = BSP_int_address();
+ BSP_shm_cfgtbl.Intr.value = 0x80;
+ BSP_shm_cfgtbl.Intr.length = BYTE;
+#endif
+
+ *shmcfg = &BSP_shm_cfgtbl;
+
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/shmsupp/lock.c b/c/src/lib/libbsp/m68k/mvme136/shmsupp/lock.c
new file mode 100644
index 0000000000..f65d77adc7
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/shmsupp/lock.c
@@ -0,0 +1,75 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = LQ_UNLOCKED;
+}
+
+/* void _Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+ rtems_unsigned32 *lockptr = (rtems_unsigned32 *)&lq_cb->lock;
+
+ rtems_interrupt_disable( isr_level );
+ Shm_isrstat = isr_level;
+ asm volatile( "lockit:" : : );
+ asm volatile( "tas %0@" : "=a" (lockptr) : "0" (lockptr) );
+ asm volatile( "bne lockit" : : );
+/* should delay */
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ lq_cb->lock = SHM_UNLOCK_VALUE;
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
+
diff --git a/c/src/lib/libbsp/m68k/mvme136/shmsupp/mpisr.c b/c/src/lib/libbsp/m68k/mvme136/shmsupp/mpisr.c
new file mode 100644
index 0000000000..b63d12ac1b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/shmsupp/mpisr.c
@@ -0,0 +1,42 @@
+/* Shm_isr_mvme136()
+ *
+ * NOTE: This routine is not used when in polling mode. Either
+ * this routine OR Shm_clockisr is used in a particular system.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+rtems_isr Shm_isr_mvme136()
+{
+ Shm_Interrupt_count += 1;
+ rtems_multiprocessing_announce();
+ (*(volatile rtems_unsigned8 *)0xfffb006b) = 0; /* clear MPCSR intr */
+}
+
+/* void _Shm_setvec( )
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void Shm_setvec()
+{
+ /* may need to disable intr */
+ set_vector( Shm_isr_mvme136, 75, 1 );
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/startup/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/startup/Makefile.in
new file mode 100644
index 0000000000..82053d22aa
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(srcdir)/linkcmds $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/mvme136/startup/bspclean.c b/c/src/lib/libbsp/m68k/mvme136/startup/bspclean.c
new file mode 100644
index 0000000000..a8860032c7
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/startup/bspclean.c
@@ -0,0 +1,46 @@
+/*
+ * This routine returns control to 135Bug.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <clockdrv.h>
+#include <z8036.h>
+
+void bsp_return_to_monitor_trap()
+{
+ extern void start( void );
+
+ register volatile void *start_addr;
+
+ m68k_set_vbr( 0 ); /* restore 135Bug vectors */
+ asm volatile( "trap #15" ); /* trap to 135Bug */
+ asm volatile( ".short 0x63" ); /* return to 135Bug (.RETURN) */
+ /* restart program */
+ start_addr = start;
+
+ asm volatile ( "jmp %0@" : "=a" (start_addr) : "0" (start_addr) );
+}
+
+#define TIMER 0xfffb0000
+
+void bsp_cleanup( void )
+{
+ Z8x36_WRITE( TIMER, MASTER_INTR, 0x62 ); /* redo timer */
+ Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x00 );
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0xf4 );
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0x00 );
+
+ M68Kvec[ 45 ] = bsp_return_to_monitor_trap; /* install handler */
+ asm volatile( "trap #13" ); /* insures SUPV mode */
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c b/c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c
new file mode 100644
index 0000000000..75afe5fcce
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/startup/bspstart.c
@@ -0,0 +1,239 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+#include <z8036.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ m68k_isr_entry *monitors_vector_table;
+ int index;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ monitors_vector_table = (m68k_isr_entry *)0; /* 135Bug Vectors are at 0 */
+ m68k_set_vbr( monitors_vector_table );
+
+ for ( index=2 ; index<=255 ; index++ )
+ M68Kvec[ index ] = monitors_vector_table[ 32 ];
+
+ M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */
+ M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */
+ M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */
+ M68Kvec[ 47 ] = monitors_vector_table[ 47 ]; /* system call vector */
+
+ m68k_set_vbr( &M68Kvec );
+
+ (*(rtems_unsigned8 *)0xfffb0067) = 0x7f; /* make VME access round-robin */
+
+ m68k_enable_caching();
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_vector_table = (m68k_isr_entry *) &M68Kvec;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme136/startup/linkcmds
new file mode 100644
index 0000000000..fced582c19
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/startup/linkcmds
@@ -0,0 +1,48 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Motorola MVME136/MVME135 boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x3000, l = 1M
+ }
+
+SECTIONS
+{
+ .text 0x3000 :
+ {
+ text_start = . ;
+ _text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+ _etext = .;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ _data_start = .;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+ _edata = .;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/timer/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/timer/Makefile.in
new file mode 100644
index 0000000000..c2ba3476d3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme136/timer/timer.c b/c/src/lib/libbsp/m68k/mvme136/timer/timer.c
new file mode 100644
index 0000000000..f2cb728577
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/timer/timer.c
@@ -0,0 +1,107 @@
+/* Timer_init()
+ *
+ * This routine initializes the Z8036 timer on the MVME136 board.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine will not work if the optimizer is enabled
+ * for some compilers. The multiple writes to the Z8036
+ * may be optimized away.
+ *
+ * It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <bsp.h>
+#include <z8036.h>
+
+#define TIMER 0xfffb0000 /* address of Z8036 on MVME136 */
+
+int Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+void Timer_initialize()
+{
+ (void) set_vector( timerisr, 66, 0 ); /* install ISR */
+
+ Ttimer_val = 0; /* clear timer ISR count */
+ Z8x36_WRITE( TIMER, MASTER_INTR, 0x01 ); /* reset */
+ Z8x36_WRITE( TIMER, MASTER_INTR, 0x00 ); /* clear reset */
+ Z8x36_WRITE( TIMER, MASTER_INTR, 0xe2 ); /* disable lower chain, no vec */
+ /* set right justified addr */
+ /* and master int enable */
+ Z8x36_WRITE( TIMER, CT1_MODE_SPEC, 0x80 ); /* T1 continuous, and */
+ /* cycle/pulse output */
+
+ *((rtems_unsigned16 *)0xfffb0016) = 0x0000; /* write countdown value */
+/*
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_MSB, 0x00 );
+ Z8x36_WRITE( TIMER, CT1_TIME_CONST_LSB, 0x00 );
+*/
+ Z8x36_WRITE( TIMER, MASTER_CFG, 0xc4 ); /* enable timer1 */
+
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xc6 ); /* set INTR enable (IE), */
+ /* trigger command */
+ /* (TCB) and gate */
+ /* command (GCB) bits */
+ *((rtems_unsigned8 *)0xfffb0038) &= 0xfd; /* enable timer INTR on */
+ /* VME controller */
+}
+
+#define AVG_OVERHEAD 6 /* It typically takes 3.0 microseconds */
+ /* (6 countdowns) to start/stop the timer. */
+#define LEAST_VALID 10 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+/*
+ rtems_unsigned8 msb, lsb;
+*/
+ rtems_unsigned32 remaining, total;
+
+ Z8x36_WRITE( TIMER, CT1_CMD_STATUS, 0xce ); /* read the counter value */
+remaining = 0xffff - *((rtems_unsigned16 *) 0xfffb0010);
+/*
+ Z8x36_READ( TIMER, CT1_CUR_CNT_MSB, msb );
+ Z8x36_READ( TIMER, CT1_CUR_CNT_LSB, lsb );
+
+ remaining = 0xffff - ((msb << 8) + lsb);
+*/
+ total = (Ttimer_val * 0x10000) + remaining;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in one-half microsecond units */
+
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ return (total-AVG_OVERHEAD) >> 1;
+ }
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme136/timer/timerisr.s b/c/src/lib/libbsp/m68k/mvme136/timer/timerisr.s
new file mode 100644
index 0000000000..d74429be4d
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/timer/timerisr.s
@@ -0,0 +1,39 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the Z8036 timer on the MVME136
+ * board. The timer is set up to generate an interrupt at maximum
+ * intervals.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+
+.set CT1_CMD_STATUS, 0xfffb000a | port A
+.set RELOAD, 0x24 | clr IP & IUS,allow countdown
+
+ PUBLIC (timerisr)
+SYM (timerisr):
+ movl a0,a7@- | save a0
+ movl #CT1_CMD_STATUS,a0 | a0 = addr of cmd status reg
+ movb #RELOAD,a0@ | reload countdown
+ addql #1, SYM (Ttimer_val) | increment timer value
+ movl a7@+,a0 | save a0
+ rte
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/m68k/mvme136/times b/c/src/lib/libbsp/m68k/mvme136/times
new file mode 100644
index 0000000000..b5b2109554
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/times
@@ -0,0 +1,191 @@
+#
+# Timing Test Suite Results for the Motorola MVME136 BSP
+#
+# $Id$
+#
+
+Board: Motorola MVME136
+CPU: Motorola MC68020 + MC68881 FPU
+Clock Speed: 20 Mhz
+Memory Configuration: DRAM w/no cache
+Wait States: 1 wait state
+
+Times Reported in: microseconds
+Timer Source: Zilog Z8036
+
+Column A: 3.5.1 pre-release
+Column B: 3.5.17 pre-release
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 67 60
+ rtems_semaphore_delete 64 58
+ rtems_semaphore_obtain: available 46 38
+ rtems_semaphore_obtain: not available -- NO_WAIT 45 38
+ rtems_semaphore_release: no waiting tasks 51 44
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 113 109
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 94 87
+
+ 4 rtems_task_restart: blocked task -- preempts caller 152 149
+ rtems_task_restart: ready task -- preempts caller 145 142
+ rtems_semaphore_release: task readied -- returns to caller 71 66
+ rtems_task_create 154 148
+ rtems_task_start 82 76
+ rtems_task_restart: suspended task -- returns to caller 94 89
+ rtems_task_delete: suspended task 145 138
+ rtems_task_restart: ready task -- returns to caller 97 92
+ rtems_task_restart: blocked task -- returns to caller 128 124
+ rtems_task_delete: blocked task 149 143
+
+ 5 rtems_task_suspend: calling task 77 71
+ rtems_task_resume: task readied -- preempts caller 74 67
+
+ 6 rtems_task_restart: calling task 101 95
+ rtems_task_suspend: returns to caller 50 43
+ rtems_task_resume: task readied -- returns to caller 50 45
+ rtems_task_delete: ready task 151 144
+
+ 7 rtems_task_restart: suspended task -- preempts caller 130 125
+
+ 8 rtems_task_set_priority: obtain current priority 38 31
+ rtems_task_set_priority: returns to caller 71 64
+ rtems_task_mode: obtain current mode 16 14
+ rtems_task_mode: no reschedule 18 16
+ rtems_task_mode: reschedule -- returns to caller 24 23
+ rtems_task_mode: reschedule -- preempts caller 68 60
+ rtems_task_set_note 39 33
+ rtems_task_get_note 40 33
+ rtems_clock_set 93 86
+ rtems_clock_get 1 1
+
+ 9 rtems_message_queue_create 207 200
+ rtems_message_queue_send: no waiting tasks 103 97
+ rtems_message_queue_urgent: no waiting tasks 103 96
+ rtems_message_queue_receive: available 87 79
+ rtems_message_queue_flush: no messages flushed 36 29
+ rtems_message_queue_flush: messages flushed 46 39
+ rtems_message_queue_delete 85 80
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 51 43
+ rtems_message_queue_receive: not available -- caller blocks 115 114
+
+11 rtems_message_queue_send: task readied -- preempts caller 129 123
+
+12 rtems_message_queue_send: task readied -- returns to caller 107 101
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 130 123
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 107 101
+
+15 rtems_event_receive: obtain current events 0 1
+ rtems_event_receive: not available -- NO_WAIT 33 23
+ rtems_event_receive: not available -- caller blocks 92 84
+ rtems_event_send: no task readied 34 24
+ rtems_event_receive: available 36 28
+ rtems_event_send: task readied -- returns to caller 67 60
+
+16 rtems_event_send: task readied -- preempts caller 90 84
+
+17 rtems_task_set_priority: preempts caller 110 106
+
+18 rtems_task_delete: calling task 175 170
+
+19 rtems_signal_catch 23 15
+ rtems_signal_send: returns to caller 43 37
+ rtems_signal_send: signal to self 52 55
+ exit ASR overhead: returns to calling task 37 37
+ exit ASR overhead: returns to preempting task 65 54
+
+20 rtems_partition_create 77 70
+ rtems_region_create 70 63
+ rtems_partition_get_buffer: available 42 35
+ rtems_partition_get_buffer: not available 40 33
+ rtems_partition_return_buffer 50 43
+ rtems_partition_delete 47 42
+ rtems_region_get_segment: available 58 52
+ rtems_region_get_segment: not available -- NO_WAIT 55 49
+ rtems_region_return_segment: no waiting tasks 60 54
+ rtems_region_get_segment: not available -- caller blocks 126 123
+ rtems_region_return_segment: task readied -- preempts caller 143 136
+ rtems_region_return_segment: task readied -- returns to caller 120 114
+ rtems_region_delete 45 39
+ rtems_io_initialize 6 4
+ rtems_io_open 2 2
+ rtems_io_close 1 1
+ rtems_io_read 1 2
+ rtems_io_write 1 3
+ rtems_io_control 2 2
+
+21 rtems_task_ident 353 350
+ rtems_message_queue_ident 344 341
+ rtems_semaphore_ident 369 367
+ rtems_partition_ident 344 341
+ rtems_region_ident 350 348
+ rtems_port_ident 343 340
+ rtems_timer_ident 345 343
+ rtems_rate_monotonic_ident 344 341
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 115 111
+ rtems_message_queue_broadcast: no waiting tasks 60 53
+ rtems_message_queue_broadcast: task readied -- preempts caller 138 133
+
+23 rtems_timer_create 37 28
+ rtems_timer_fire_after: inactive 66 58
+ rtems_timer_fire_after: active 70 61
+ rtems_timer_cancel: active 42 34
+ rtems_timer_cancel: inactive 39 31
+ rtems_timer_reset: inactive 60 54
+ rtems_timer_reset: active 65 58
+ rtems_timer_fire_when: inactive 96 88
+ rtems_timer_fire_when: active 96 88
+ rtems_timer_delete: active 55 47
+ rtems_timer_delete: inactive 51 47
+ rtems_task_wake_when 125 117
+
+24 rtems_task_wake_after: yield -- returns to caller 26 16
+ rtems_task_wake_after: yields -- preempts caller 65 56
+
+25 rtems_clock_tick 14 17
+
+26 _ISR_Disable 0 0
+ _ISR_Flash 0 0
+ _ISR_Enable 0 0
+ _Thread_Disable_dispatch 0 0
+ _Thread_Enable_dispatch 19 11
+ _Thread_Set_state 24 24
+ _Thread_Disptach (NO FP) 50 43
+ context switch: no floating point contexts 41 35
+ context switch: self 9 9
+ context switch: to another task 9 10
+ context switch: restore 1st FP task 46 39
+ fp context switch: save idle, restore idle 75 68
+ fp context switch: save idle, restore initialized 66 66
+ fp context switch: save initialized, restore initialized 65 66
+ _Thread_Resume 18 19
+ _Thread_Unblock 18 19
+ _Thread_Ready 22 21
+ _Thread_Get 12 14
+ _Semaphore_Get 10 10
+ _Thread_Get: invalid id 2 2
+
+27 interrupt entry overhead: returns to interrupted task 9 9
+ interrupt exit overhead: returns to interrupted task 8 8
+ interrupt entry overhead: returns to nested interrupt 14 12
+ interrupt exit overhead: returns to nested interrupt 0 0
+ interrupt entry overhead: returns to preempting task 8 9
+ interrupt exit overhead: returns to preempting task 62 54
+
+28 rtems_port_create 44 35
+ rtems_port_external_to_internal 35 27
+ rtems_port_internal_to_external 34 26
+ rtems_port_delete 46 39
+
+29 rtems_rate_monotonic_create 40 32
+ rtems_rate_monotonic_period: initiate period -- returns to caller 60 54
+ rtems_rate_monotonic_period: obtain status 38 31
+ rtems_rate_monotonic_cancel 46 39
+ rtems_rate_monotonic_delete: inactive 54 48
+ rtems_rate_monotonic_delete: active 57 51
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 83 74
diff --git a/c/src/lib/libbsp/m68k/mvme136/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/mvme136/wrapup/Makefile.in
new file mode 100644
index 0000000000..0e6fe816b0
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme136/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console shmsupp timer
+GENERIC_PIECES=shmdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/mvme147/Makefile.in b/c/src/lib/libbsp/m68k/mvme147/Makefile.in
new file mode 100644
index 0000000000..1590a95a1e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console timer wrapup
diff --git a/c/src/lib/libbsp/m68k/mvme147/README b/c/src/lib/libbsp/m68k/mvme147/README
new file mode 100644
index 0000000000..b7952ad9cb
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/README
@@ -0,0 +1,86 @@
+#
+# $Id$
+#
+
+Notes about the MVME147 bsp
+
+MVME147 port for TNI - Telecom Bretagne
+by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+May 1996
+
+
+This bsp is essentially based on the mvme136 bsp.
+
+Summary of the modifications that were made:
+
+ * include
+
+ - bsp.h
+ Peripheral Channel Controller memory mapping
+ Z8530 memory mapping
+
+ * startup
+
+ - bspstart.c
+ main () setup for VME roundrobin mode
+ setup for the PCC interrupt vector base
+ - bspclean.c
+ bsp_cleanup () disable timer 1 & 2 interruptions
+ - linkcmds set the RAM start (0x5000) and size (4Meg - 0x5000)
+ - setvec.c unchanged
+ - sbrk.c unchanged
+
+ * console
+
+ - console.c taken from the dmv152 bsp (Zilog Z8530)
+ with no modification
+
+ * clock
+
+ - ckinit.c entirely rewritten for the PCC tick timer 2
+
+ * timer
+
+ - timerisr.s and timer.c
+ entirely rewritten for the PCC tick timer 1
+ now gives results un 6.25 us units (mininum timer delay,
+ suprising big grain)
+
+ * times
+
+ - updated results for the mvme147 (beware of the 6.25 us grain)
+
+ * Makefiles
+
+ - compilation of shmsupp simply removed
+
+
+To be done:
+
+ * add VMEchip memory mapping to include/bsp.h
+
+ * update the overheads in coverhead.h
+
+ * add support for serila ports 2,3 and 4.
+
+Other notes:
+
+ * There is no MP support (no more shmsupp) because I have no
+ experience of the VME bus. The mvme136 shared memory support
+ does not seem applicable on the VMEchip of the mvme147, so
+ I don't know where to start. Suggestions are welcome.
+
+ * All the timing tests and sp tests have been run except tmoverhd.
+ The test hangs during the pause (where the task should be suspended
+ until a return). Maybe the rtems_initialize_executive is no more
+ reentrant with this bsp.
+
+Future work:
+
+ * Add gdb serial remote support.
+
+ * Shared memory support (I don't really need it, but I can do
+ it if it's simple).
+
+ * Message passing on VME bus, with Ada 95 annex E (distributed
+ systems) in mind.
diff --git a/c/src/lib/libbsp/m68k/mvme147/bsp_specs b/c/src/lib/libbsp/m68k/mvme147/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/mvme147/clock/Makefile.in b/c/src/lib/libbsp/m68k/mvme147/clock/Makefile.in
new file mode 100644
index 0000000000..e2def59237
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/clock/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme147/clock/ckinit.c b/c/src/lib/libbsp/m68k/mvme147/clock/ckinit.c
new file mode 100644
index 0000000000..9c8f05d104
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/clock/ckinit.c
@@ -0,0 +1,142 @@
+/* Clock_init()
+ *
+ * This routine initializes the Tick Timer 2 on the MVME147 board.
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#define MS_COUNT 65376 /* 1ms */
+/* MS_COUNT = 0x10000 - 1e-3/6.25e-6 */
+#define CLOCK_INT_LEVEL 6 /* T2's interrupt level */
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+
+/*
+ * ISR Handler
+ */
+
+rtems_isr Clock_isr(rtems_vector_number vector)
+{
+ Clock_driver_ticks += 1;
+ pcc->timer2_int_control |= 0x80; /* Acknowledge interr. */
+
+ if (Clock_isrs == 1) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(rtems_isr_entry clock_isr )
+{
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker =
+ (rtems_isr_entry) set_vector( clock_isr, TIMER_2_VECTOR, 1 );
+
+ pcc->timer2_int_control = 0x00; /* Disable T2 Interr. */
+ pcc->timer2_preload = MS_COUNT;
+ /* write preload value */
+ pcc->timer2_control = 0x07; /* clear T2 overflow counter, enable counter */
+ pcc->timer2_int_control = CLOCK_INT_LEVEL|0x08;
+ /* Enable Timer 2 and set its int. level */
+
+ atexit( Clock_exit );
+ }
+}
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ pcc->timer2_int_control = 0x00; /* Disable T2 Interr. */
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(TIMER_2_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, TIMER_2_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/mvme147/console/Makefile.in b/c/src/lib/libbsp/m68k/mvme147/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme147/console/console.c b/c/src/lib/libbsp/m68k/mvme147/console/console.c
new file mode 100644
index 0000000000..824b931c9e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/console/console.c
@@ -0,0 +1,258 @@
+/*
+ * This file contains the MVME147 console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * This file was taken from the DMV152 bsp
+ *
+ * $Id$
+ */
+
+#define M147_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <z8530.h>
+
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ rtems_unsigned8 rr_0;
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ if ( !(rr_0 & RR_0_RX_DATA_AVAILABLE) )
+ return( FALSE );
+
+ Z8x30_READ_DATA( CONSOLE_DATA, *ch );
+ return( TRUE );
+ }
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SCC.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SCC
+ */
+
+char inbyte( void )
+{
+ rtems_unsigned8 rr_0;
+ char ch;
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) != 0 )
+ break;
+ }
+
+ Z8x30_READ_DATA( CONSOLE_DATA, ch );
+ return ( ch );
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SCC. It supports
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ rtems_unsigned8 rr_0;
+ char flow_control;
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ if ( (rr_0 & RR_0_TX_BUFFER_EMPTY) != 0 )
+ break;
+ }
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 )
+ break;
+
+ Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
+
+ if ( flow_control == XOFF )
+ do {
+ do {
+ Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
+ } while ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 );
+ Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
+ } while ( flow_control != XON );
+ }
+
+ Z8x30_WRITE_DATA( CONSOLE_DATA, ch );
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/mvme147/include/Makefile.in b/c/src/lib/libbsp/m68k/mvme147/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/mvme147/include/bsp.h b/c/src/lib/libbsp/m68k/mvme147/include/bsp.h
new file mode 100644
index 0000000000..cb54564fbe
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/include/bsp.h
@@ -0,0 +1,189 @@
+/* bsp.h
+ *
+ * This include file contains all MVME147 board IO definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#ifndef __MVME147_h
+#define __MVME147_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+
+/* Constants */
+
+#define RAM_START 0x00005000
+#define RAM_END 0x00400000
+
+ /* MVME 147 Peripheral controller chip
+ see MVME147/D1, 3.4 */
+
+struct pcc_map {
+ /* 32 bit registers */
+ rtems_unsigned32 dma_table_address; /* 0xfffe1000 */
+ rtems_unsigned32 dma_data_address; /* 0xfffe1004 */
+ rtems_unsigned32 dma_bytecount; /* 0xfffe1008 */
+ rtems_unsigned32 dma_data_holding; /* 0xfffe100c */
+
+ /* 16 bit registers */
+ rtems_unsigned16 timer1_preload; /* 0xfffe1010 */
+ rtems_unsigned16 timer1_count; /* 0xfffe1012 */
+ rtems_unsigned16 timer2_preload; /* 0xfffe1014 */
+ rtems_unsigned16 timer2_count; /* 0xfffe1016 */
+
+ /* 8 bit registers */
+ rtems_unsigned8 timer1_int_control; /* 0xfffe1018 */
+ rtems_unsigned8 timer1_control; /* 0xfffe1019 */
+ rtems_unsigned8 timer2_int_control; /* 0xfffe101a */
+ rtems_unsigned8 timer2_control; /* 0xfffe101b */
+
+ rtems_unsigned8 acfail_int_control; /* 0xfffe101c */
+ rtems_unsigned8 watchdog_control; /* 0xfffe101d */
+
+ rtems_unsigned8 printer_int_control; /* 0xfffe101e */
+ rtems_unsigned8 printer_control; /* 0xfffe102f */
+
+ rtems_unsigned8 dma_int_control; /* 0xfffe1020 */
+ rtems_unsigned8 dma_control; /* 0xfffe1021 */
+ rtems_unsigned8 bus_error_int_control; /* 0xfffe1022 */
+ rtems_unsigned8 dma_status; /* 0xfffe1023 */
+ rtems_unsigned8 abort_int_control; /* 0xfffe1024 */
+ rtems_unsigned8 table_address_function_code; /* 0xfffe1025 */
+ rtems_unsigned8 serial_port_int_control; /* 0xfffe1026 */
+ rtems_unsigned8 general_purpose_control; /* 0xfffe1027 */
+ rtems_unsigned8 lan_int_control; /* 0xfffe1028 */
+ rtems_unsigned8 general_purpose_status; /* 0xfffe1029 */
+ rtems_unsigned8 scsi_port_int_control; /* 0xfffe102a */
+ rtems_unsigned8 slave_base_address; /* 0xfffe102b */
+ rtems_unsigned8 software_int_1_control; /* 0xfffe102c */
+ rtems_unsigned8 int_base_vector; /* 0xfffe102d */
+ rtems_unsigned8 software_int_2_control; /* 0xfffe102e */
+ rtems_unsigned8 revision_level; /* 0xfffe102f */
+};
+
+#define pcc ((volatile struct pcc_map * const) 0xfffe1000)
+
+#define z8530 0xfffe3001
+
+
+/* interrupt vectors - see MVME146/D1 4.14 */
+#define PCC_BASE_VECTOR 0x40 /* First user int */
+#define SCC_VECTOR PCC_BASE_VECTOR+3
+#define TIMER_1_VECTOR PCC_BASE_VECTOR+8
+#define TIMER_2_VECTOR PCC_BASE_VECTOR+9
+#define SOFT_1_VECTOR PCC_BASE_VECTOR+10
+#define SOFT_2_VECTOR PCC_BASE_VECTOR+11
+
+#define USE_CHANNEL_A 1 /* 1 = use channel A for console */
+#define USE_CHANNEL_B 0 /* 1 = use channel B for console */
+
+#if (USE_CHANNEL_A == 1)
+#define CONSOLE_CONTROL 0xfffe3002
+#define CONSOLE_DATA 0xfffe3003
+#elif (USE_CHANNEL_B == 1)
+#define CONSOLE_CONTROL 0xfffe3000
+#define CONSOLE_DATA 0xfffe3001
+#endif
+
+
+
+#define FOREVER 1 /* infinite loop */
+
+#ifdef M147_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Use the MPCSR vector for the MVME147
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), \
+ SOFT_1_VECTOR, 1 )
+
+#define Cause_tm27_intr() pcc->software_int_1_control = 0x0c
+ /* generate level 4 sotware int. */
+
+#define Clear_tm27_intr() pcc->software_int_1_control = 0x00
+
+#define Lower_tm27_intr()
+
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/lib/libbsp/m68k/mvme147/include/coverhd.h b/c/src/lib/libbsp/m68k/mvme147/include/coverhd.h
new file mode 100644
index 0000000000..3add9961ff
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 2
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
+#define CALLING_OVERHEAD_TASK_CREATE 3
+#define CALLING_OVERHEAD_TASK_IDENT 2
+#define CALLING_OVERHEAD_TASK_START 2
+#define CALLING_OVERHEAD_TASK_RESTART 2
+#define CALLING_OVERHEAD_TASK_DELETE 1
+#define CALLING_OVERHEAD_TASK_SUSPEND 1
+#define CALLING_OVERHEAD_TASK_RESUME 2
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 2
+#define CALLING_OVERHEAD_TASK_MODE 2
+#define CALLING_OVERHEAD_TASK_GET_NOTE 2
+#define CALLING_OVERHEAD_TASK_SET_NOTE 2
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 2
+#define CALLING_OVERHEAD_CLOCK_GET 5
+#define CALLING_OVERHEAD_CLOCK_SET 4
+#define CALLING_OVERHEAD_CLOCK_TICK 1
+
+#define CALLING_OVERHEAD_TIMER_CREATE 2
+#define CALLING_OVERHEAD_TIMER_IDENT 1
+#define CALLING_OVERHEAD_TIMER_DELETE 2
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
+#define CALLING_OVERHEAD_TIMER_RESET 1
+#define CALLING_OVERHEAD_TIMER_CANCEL 1
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 3
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 1
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 2
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 2
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 2
+
+#define CALLING_OVERHEAD_EVENT_SEND 2
+#define CALLING_OVERHEAD_EVENT_RECEIVE 2
+#define CALLING_OVERHEAD_SIGNAL_CATCH 2
+#define CALLING_OVERHEAD_SIGNAL_SEND 2
+#define CALLING_OVERHEAD_PARTITION_CREATE 3
+#define CALLING_OVERHEAD_PARTITION_IDENT 2
+#define CALLING_OVERHEAD_PARTITION_DELETE 1
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 2
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 2
+#define CALLING_OVERHEAD_REGION_CREATE 3
+#define CALLING_OVERHEAD_REGION_IDENT 2
+#define CALLING_OVERHEAD_REGION_DELETE 2
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 3
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 2
+#define CALLING_OVERHEAD_PORT_CREATE 3
+#define CALLING_OVERHEAD_PORT_IDENT 2
+#define CALLING_OVERHEAD_PORT_DELETE 1
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 2
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 2
+#define CALLING_OVERHEAD_IO_OPEN 2
+#define CALLING_OVERHEAD_IO_CLOSE 3
+#define CALLING_OVERHEAD_IO_READ 2
+#define CALLING_OVERHEAD_IO_WRITE 2
+#define CALLING_OVERHEAD_IO_CONTROL 2
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 2
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/mvme147/startup/Makefile.in b/c/src/lib/libbsp/m68k/mvme147/startup/Makefile.in
new file mode 100644
index 0000000000..82053d22aa
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(srcdir)/linkcmds $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/mvme147/startup/bspclean.c b/c/src/lib/libbsp/m68k/mvme147/startup/bspclean.c
new file mode 100644
index 0000000000..7b052c8cfd
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/startup/bspclean.c
@@ -0,0 +1,45 @@
+/*
+ * This routine returns control to 147Bug.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <clockdrv.h>
+
+void bsp_return_to_monitor_trap()
+{
+ extern void start( void );
+
+ register volatile void *start_addr;
+
+ m68k_set_vbr( 0 ); /* restore 147Bug vectors */
+ asm volatile( "trap #15" ); /* trap to 147Bug */
+ asm volatile( ".short 0x63" ); /* return to 147Bug (.RETURN) */
+ /* restart program */
+ start_addr = start;
+
+ asm volatile ( "jmp %0@" : "=a" (start_addr) : "0" (start_addr) );
+}
+
+void bsp_cleanup( void )
+{
+ pcc->timer1_int_control = 0; /* Disable Timer 1 */
+ pcc->timer2_int_control = 0; /* Disable Timer 2 */
+
+ M68Kvec[ 45 ] = bsp_return_to_monitor_trap; /* install handler */
+ asm volatile( "trap #13" ); /* insures SUPV mode */
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147/startup/bspstart.c b/c/src/lib/libbsp/m68k/mvme147/startup/bspstart.c
new file mode 100644
index 0000000000..230b4ad98a
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/startup/bspstart.c
@@ -0,0 +1,245 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ m68k_isr_entry *monitors_vector_table;
+ int index;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ monitors_vector_table = (m68k_isr_entry *)0; /* 135Bug Vectors are at 0 */
+ m68k_set_vbr( monitors_vector_table );
+
+ for ( index=2 ; index<=255 ; index++ )
+ M68Kvec[ index ] = monitors_vector_table[ 32 ];
+
+ M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */
+ M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */
+ M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */
+ M68Kvec[ 47 ] = monitors_vector_table[ 47 ]; /* system call vector */
+
+ m68k_set_vbr( &M68Kvec );
+
+ pcc->int_base_vector = PCC_BASE_VECTOR; /* Set the PCC int vectors base */
+
+ (*(rtems_unsigned8 *)0xfffe2001) = 0x08;
+ /* make VME access round-robin */
+
+ m68k_enable_caching();
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_vector_table = (m68k_isr_entry *) &M68Kvec;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme147/startup/linkcmds
new file mode 100644
index 0000000000..c6c4fa75e0
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/startup/linkcmds
@@ -0,0 +1,52 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Motorola MVME147 boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x5000, l = 0x3fafff
+ }
+
+SECTIONS
+{
+ .text 0x5000 :
+ {
+ text_start = . ;
+ _text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+ _etext = .;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ _data_start = .;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+ _edata = .;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147/timer/Makefile.in b/c/src/lib/libbsp/m68k/mvme147/timer/Makefile.in
new file mode 100644
index 0000000000..c2ba3476d3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme147/timer/timer.c b/c/src/lib/libbsp/m68k/mvme147/timer/timer.c
new file mode 100644
index 0000000000..cfdf409eaf
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/timer/timer.c
@@ -0,0 +1,84 @@
+/* Timer_init()
+ *
+ * This routine initializes the PCC timer on the MVME147 board.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#define TIMER_INT_LEVEL 6
+
+#define COUNTDOWN_VALUE 0
+/* Allows 0.4096 second delay betwin ints */
+/* Each tick is 6.25 us */
+
+int Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+void Timer_initialize()
+{
+ (void) set_vector(timerisr, TIMER_1_VECTOR, 0); /* install ISR */
+
+ Ttimer_val = 0; /* clear timer ISR count */
+ pcc->timer1_int_control = 0x00; /* Disable T1 Interr. */
+ pcc->timer1_preload = COUNTDOWN_VALUE;
+ /* write countdown preload value */
+ pcc->timer1_control = 0x00; /* load preload value */
+ pcc->timer1_control = 0x07; /* clear T1 overflow counter, enable counter */
+ pcc->timer1_int_control = TIMER_INT_LEVEL|0x08;
+ /* Enable Timer 1 and set its int. level */
+
+}
+
+#define AVG_OVERHEAD 0 /* No need to start/stop the timer to read
+ its value on the MVME147 PCC: reads are not
+ synchronized whith the counter updates*/
+#define LEAST_VALID 10 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ rtems_unsigned32 total;
+ rtems_unsigned16 counter_value;
+
+ counter_value = pcc->timer1_count; /* read the counter value */
+
+ total = ((Ttimer_val * 0x10000) + counter_value); /* in 6.25 us units */
+ /* DC note : just look at the assembly generated
+ to see gcc's impressive optimization ! */
+ return total;
+
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147/timer/timerisr.s b/c/src/lib/libbsp/m68k/mvme147/timer/timerisr.s
new file mode 100644
index 0000000000..7debd13849
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/timer/timerisr.s
@@ -0,0 +1,28 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the PCC timer on the MVME147
+ * board. The timer is set up to generate an interrupt at maximum
+ * intervals.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+
+.set T1_CONTROL_REGISTER, 0xfffe1018 | timer 1 control register
+
+ PUBLIC (timerisr)
+SYM (timerisr):
+ orb #0x80, T1_CONTROL_REGISTER | clear T1 int status bit
+ addql #1, SYM (Ttimer_val) | increment timer value
+end_timerisr:
+ rte
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/m68k/mvme147/times b/c/src/lib/libbsp/m68k/mvme147/times
new file mode 100644
index 0000000000..d1bae93265
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/times
@@ -0,0 +1,194 @@
+#
+# Timing Test Suite Results for the Motorola MVME147 BSP
+#
+# MVME147 port for TNI - Telecom Bretagne
+# by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+# May 1996
+#
+# $Id$
+#
+
+Board: Motorola MVME147S
+CPU: Motorola MC68030 + MC68882 FPU
+Clock Speed: 20 Mhz
+Memory Configuration: DRAM w/no cache
+Wait States: ? wait state
+
+Times Reported in: microseconds (6.25 us grain)
+Timer Source: MVME147 Peripheral Channel Controller tick timer
+
+Column A: 3.5.1 pre-release
+
+# DESCRIPTION A
+== ================================================================= ====
+ 1 rtems_semaphore_create 69
+ rtems_semaphore_delete 69
+ rtems_semaphore_obtain: available 44
+ rtems_semaphore_obtain: not available -- NO_WAIT 44
+ rtems_semaphore_release: no waiting tasks 56
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 125
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 106
+
+ 4 rtems_task_restart: blocked task -- preempts caller 181
+ rtems_task_restart: ready task -- preempts caller 169
+ rtems_semaphore_release: task readied -- returns to caller 81
+ rtems_task_create 169
+ rtems_task_start 87
+ rtems_task_restart: suspended task -- returns to caller 106
+ rtems_task_delete: suspended task 169
+ rtems_task_restart: ready task -- returns to caller 112
+ rtems_task_restart: blocked task -- returns to caller 150
+ rtems_task_delete: blocked task 175
+
+ 5 rtems_task_suspend: calling task 87
+ rtems_task_resume: task readied -- preempts caller 75
+
+ 6 rtems_task_restart: calling task 112
+ rtems_task_suspend: returns to caller 56
+ rtems_task_resume: task readied -- returns to caller 50
+ rtems_task_delete: ready task 169
+
+ 7 rtems_task_restart: suspended task -- preempts caller 143
+
+ 8 rtems_task_set_priority: obtain current priority 37
+ rtems_task_set_priority: returns to caller 75
+ rtems_task_mode: obtain current mode 6
+ rtems_task_mode: no reschedule 6
+ rtems_task_mode: reschedule -- returns to caller 19
+ rtems_task_mode: reschedule -- preempts caller 75
+ rtems_task_set_note 37
+ rtems_task_get_note 37
+ rtems_clock_set 87
+ rtems_clock_get 0
+
+ 9 rtems_message_queue_create 225
+ rtems_message_queue_send: no waiting tasks 112
+ rtems_message_queue_urgent: no waiting tasks 112
+ rtems_message_queue_receive: available 87
+ rtems_message_queue_flush: no messages flushed 37
+ rtems_message_queue_flush: messages flushed 50
+ rtems_message_queue_delete 106
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 44
+ rtems_message_queue_receive: not available -- caller blocks 125
+
+11 rtems_message_queue_send: task readied -- preempts caller 144
+
+12 rtems_message_queue_send: task readied -- returns to caller 119
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 144
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 119
+
+15 rtems_event_receive: obtain current events 0
+ rtems_event_receive: not available -- NO_WAIT 25
+ rtems_event_receive: not available -- caller blocks 100
+ rtems_event_send: no task readied 31
+ rtems_event_receive: available 37
+ rtems_event_send: task readied -- returns to caller 69
+
+16 rtems_event_send: task readied -- preempts caller 100
+
+17 rtems_task_set_priority: preempts caller 125
+
+18 rtems_task_delete: calling task 200
+
+19 rtems_signal_catch 19
+ rtems_signal_send: returns to caller 50
+ rtems_signal_send: signal to self 56
+ exit ASR overhead: returns to calling task 44
+ exit ASR overhead: returns to preempting task 75
+
+20 rtems_partition_create 81
+ rtems_region_create 75
+ rtems_partition_get_buffer: available 44
+ rtems_partition_get_buffer: not available 44
+ rtems_partition_return_buffer 56
+ rtems_partition_delete 62
+ rtems_region_get_segment: available 56
+ rtems_region_get_segment: not available -- NO_WAIT 56
+ rtems_region_return_segment: no waiting tasks 69
+ rtems_region_get_segment: not available -- caller blocks 144
+ rtems_region_return_segment: task readied -- preempts caller 169
+ rtems_region_return_segment: task readied -- returns to caller 137
+ rtems_region_delete 56
+ rtems_io_initialize 0
+ rtems_io_open 0
+ rtems_io_close 0
+ rtems_io_read 0
+ rtems_io_write 0
+ rtems_io_control 0
+
+21 rtems_task_ident 375
+ rtems_message_queue_ident 362
+ rtems_semaphore_ident 394
+ rtems_partition_ident 362
+ rtems_region_ident 369
+ rtems_port_ident 362
+ rtems_timer_ident 369
+ rtems_rate_monotonic_ident 362
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 131
+ rtems_message_queue_broadcast: no waiting tasks 62
+ rtems_message_queue_broadcast: task readied -- preempts caller 156
+
+23 rtems_timer_create 31
+ rtems_timer_fire_after: inactive 69
+ rtems_timer_fire_after: active 69
+ rtems_timer_cancel: active 44
+ rtems_timer_cancel: inactive 37
+ rtems_timer_reset: inactive 69
+ rtems_timer_reset: active 69
+ rtems_timer_fire_when: inactive 87
+ rtems_timer_fire_when: active 87
+ rtems_timer_delete: active 56
+ rtems_timer_delete: inactive 50
+ rtems_task_wake_when 125
+
+24 rtems_task_wake_after: yield -- returns to caller 19
+ rtems_task_wake_after: yields -- preempts caller 69
+
+25 rtems_clock_tick 19
+
+26 _ISR_Disable 6
+ _ISR_Flash 6
+ _ISR_Enable 6
+ _Thread_Disable_dispatch 6
+ _Thread_Enable_dispatch 25
+ _Thread_Set_state 31
+ _Thread_Disptach (NO FP) 62
+ context switch: no floating point contexts 50
+ context switch: self 12
+ context switch: to another task 12
+ context switch: restore 1st FP task 56
+ fp context switch: save idle, restore idle 87
+ fp context switch: save idle, restore initialized 75
+ fp context switch: save initialized, restore initialized 75
+ _Thread_Resume 25
+ _Thread_Unblock 25
+ _Thread_Ready 31
+ _Thread_Get 12
+ _Semaphore_Get 6
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 12
+ interrupt exit overhead: returns to interrupted task 12
+ interrupt entry overhead: returns to nested interrupt 19
+ interrupt exit overhead: returns to nested interrupt 6
+ interrupt entry overhead: returns to preempting task 12
+ interrupt exit overhead: returns to preempting task 81
+
+28 rtems_port_create 37
+ rtems_port_external_to_internal 31
+ rtems_port_internal_to_external 31
+ rtems_port_delete 56
+
+29 rtems_rate_monotonic_create 44
+ rtems_rate_monotonic_period: initiate period -- returns to caller 62
+ rtems_rate_monotonic_period: obtain status 37
+ rtems_rate_monotonic_cancel 56
+ rtems_rate_monotonic_delete: inactive 62
+ rtems_rate_monotonic_delete: active 69
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 87
diff --git a/c/src/lib/libbsp/m68k/mvme147/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/mvme147/wrapup/Makefile.in
new file mode 100644
index 0000000000..ccc33af739
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer # shmsupp
+GENERIC_PIECES=# shmdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/mvme147s/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/Makefile.in
new file mode 100644
index 0000000000..61010e50f6
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/Makefile.in
@@ -0,0 +1,16 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console timer shmsupp wrapup
+
diff --git a/c/src/lib/libbsp/m68k/mvme147s/README b/c/src/lib/libbsp/m68k/mvme147s/README
new file mode 100644
index 0000000000..132f214777
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/README
@@ -0,0 +1,92 @@
+#
+# $Id$
+#
+
+Notes about the MVME147S bsp
+
+MVME147 port for TNI - Telecom Bretagne
+by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+May 1996
+
+
+This bsp is essentially based on the mvme136 bsp,
+and is only an extention of the MVME147 bsp. There
+are slight differences in the VMEchips used in the MVME147S and
+the MVME147 that should prevent the shmsupport and the startup
+code from running on a MVME147.
+
+Summary of the modifications that were made:
+
+ * include
+
+ - bsp.h
+ Peripheral Channel Controller memory mapping
+ Z8530 memory mapping
+ VMEchip memory mapping
+
+ * startup
+
+ - bspstart.c
+ main () setup for VME roundrobin mode
+ setup for the PCC interrupt vector base
+ setup of the VME shared memory
+ - bspclean.c
+ bsp_cleanup () disable timer 1 & 2 interruptions
+ - linkcmds set the RAM start (0x7000) and size (4Meg - 0x7000)
+ - setvec.c unchanged
+ - sbrk.c unchanged
+
+ * console
+
+ - console.c taken from the dmv152 bsp (Zilog Z8530)
+ with no modification
+
+ * clock
+
+ - ckinit.c entirely rewritten for the PCC tick timer 2
+
+ * timer
+
+ - timerisr.s and timer.c
+ entirely rewritten for the PCC tick timer 1
+ now gives results un 6.25 us units (mininum timer delay,
+ suprising big grain)
+
+ * times
+
+ - updated results for the mvme147 (beware of the 6.25 us grain)
+
+ * shmsupp :
+ Specific to the S version of the MVME147
+ Only tested with 2 boards, in interrupt mode.
+ Uses the top 128k of the VME system controller board RAM
+ as the shared space.
+
+ - mpisr.c : uses the SIGLP interruption
+
+ - Makefile : unchanged
+
+ - getcfg.c : rewritten
+
+ - lock.c unchanged
+
+ - addrconv.c unchanged
+
+ * Makefiles
+
+ - unchanged
+
+
+To be done:
+
+ * update the overheads in coverhead.h
+
+ * add support for serial ports 2,3 and 4.
+
+Other notes:
+
+ * All the timing tests and sp tests have been run except tmoverhd.
+ The test hangs during the pause (where the task should be suspended
+ until a return). Maybe the rtems_initialize_executive is no more
+ reentrant with this bsp.
+
diff --git a/c/src/lib/libbsp/m68k/mvme147s/bsp_specs b/c/src/lib/libbsp/m68k/mvme147s/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/mvme147s/clock/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/clock/Makefile.in
new file mode 100644
index 0000000000..66185824b4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/clock/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../mvme147/clock
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme147s/console/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/console/Makefile.in
new file mode 100644
index 0000000000..3d9d7f4df4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../mvme147/console
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme147s/include/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/mvme147s/include/bsp.h b/c/src/lib/libbsp/m68k/mvme147s/include/bsp.h
new file mode 100644
index 0000000000..78fe1bc333
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/include/bsp.h
@@ -0,0 +1,253 @@
+/* bsp.h
+ *
+ * This include file contains all MVME147 board IO definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#ifndef __MVME147_h
+#define __MVME147_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+
+/* Constants */
+
+#define RAM_START 0x00007000
+#define RAM_END 0x003e0000
+#define DRAM_END 0x00400000
+ /* We leave 128k for the shared memory */
+
+ /* MVME 147 Peripheral controller chip
+ see MVME147/D1, 3.4 */
+
+struct pcc_map {
+ /* 32 bit registers */
+ rtems_unsigned32 dma_table_address; /* 0xfffe1000 */
+ rtems_unsigned32 dma_data_address; /* 0xfffe1004 */
+ rtems_unsigned32 dma_bytecount; /* 0xfffe1008 */
+ rtems_unsigned32 dma_data_holding; /* 0xfffe100c */
+
+ /* 16 bit registers */
+ rtems_unsigned16 timer1_preload; /* 0xfffe1010 */
+ rtems_unsigned16 timer1_count; /* 0xfffe1012 */
+ rtems_unsigned16 timer2_preload; /* 0xfffe1014 */
+ rtems_unsigned16 timer2_count; /* 0xfffe1016 */
+
+ /* 8 bit registers */
+ rtems_unsigned8 timer1_int_control; /* 0xfffe1018 */
+ rtems_unsigned8 timer1_control; /* 0xfffe1019 */
+ rtems_unsigned8 timer2_int_control; /* 0xfffe101a */
+ rtems_unsigned8 timer2_control; /* 0xfffe101b */
+
+ rtems_unsigned8 acfail_int_control; /* 0xfffe101c */
+ rtems_unsigned8 watchdog_control; /* 0xfffe101d */
+
+ rtems_unsigned8 printer_int_control; /* 0xfffe101e */
+ rtems_unsigned8 printer_control; /* 0xfffe102f */
+
+ rtems_unsigned8 dma_int_control; /* 0xfffe1020 */
+ rtems_unsigned8 dma_control; /* 0xfffe1021 */
+ rtems_unsigned8 bus_error_int_control; /* 0xfffe1022 */
+ rtems_unsigned8 dma_status; /* 0xfffe1023 */
+ rtems_unsigned8 abort_int_control; /* 0xfffe1024 */
+ rtems_unsigned8 table_address_function_code; /* 0xfffe1025 */
+ rtems_unsigned8 serial_port_int_control; /* 0xfffe1026 */
+ rtems_unsigned8 general_purpose_control; /* 0xfffe1027 */
+ rtems_unsigned8 lan_int_control; /* 0xfffe1028 */
+ rtems_unsigned8 general_purpose_status; /* 0xfffe1029 */
+ rtems_unsigned8 scsi_port_int_control; /* 0xfffe102a */
+ rtems_unsigned8 slave_base_address; /* 0xfffe102b */
+ rtems_unsigned8 software_int_1_control; /* 0xfffe102c */
+ rtems_unsigned8 int_base_vector; /* 0xfffe102d */
+ rtems_unsigned8 software_int_2_control; /* 0xfffe102e */
+ rtems_unsigned8 revision_level; /* 0xfffe102f */
+};
+
+#define pcc ((volatile struct pcc_map * const) 0xfffe1000)
+
+/* VME chip configuration registers */
+
+struct vme_lcsr_map {
+ rtems_unsigned8 unused_1;
+ rtems_unsigned8 system_controller; /* 0xfffe2001 */
+ rtems_unsigned8 unused_2;
+ rtems_unsigned8 vme_bus_requester; /* 0xfffe2003 */
+ rtems_unsigned8 unused_3;
+ rtems_unsigned8 master_configuration; /* 0xfffe2005 */
+ rtems_unsigned8 unused_4;
+ rtems_unsigned8 slave_configuration; /* 0xfffe2007 */
+ rtems_unsigned8 unused_5;
+ rtems_unsigned8 timer_configuration; /* 0xfffe2009 */
+ rtems_unsigned8 unused_6;
+ rtems_unsigned8 slave_address_modifier; /* 0xfffe200b */
+ rtems_unsigned8 unused_7;
+ rtems_unsigned8 master_address_modifier; /* 0xfffe200d */
+ rtems_unsigned8 unused_8;
+ rtems_unsigned8 interrupt_handler_mask; /* 0xfffe200f */
+ rtems_unsigned8 unused_9;
+ rtems_unsigned8 utility_interrupt_mask; /* 0xfffe2011 */
+ rtems_unsigned8 unused_10;
+ rtems_unsigned8 utility_interrupt_vector; /* 0xfffe2013 */
+ rtems_unsigned8 unused_11;
+ rtems_unsigned8 interrupt_request; /* 0xfffe2015 */
+ rtems_unsigned8 unused_12;
+ rtems_unsigned8 vme_bus_status_id; /* 0xfffe2017 */
+ rtems_unsigned8 unused_13;
+ rtems_unsigned8 bus_error_status; /* 0xfffe2019 */
+ rtems_unsigned8 unused_14;
+ rtems_unsigned8 gcsr_base_address; /* 0xfffe201b */
+};
+
+#define vme_lcsr ((volatile struct vme_lcsr_map * const) 0xfffe2000)
+
+
+struct vme_gcsr_map {
+ rtems_unsigned8 unused_1;
+ rtems_unsigned8 global_0; /* 0xfffe2021 */
+ rtems_unsigned8 unused_2;
+ rtems_unsigned8 global_1; /* 0xfffe2023 */
+ rtems_unsigned8 unused_3;
+ rtems_unsigned8 board_identification; /* 0xfffe2025 */
+ rtems_unsigned8 unused_4;
+ rtems_unsigned8 general_purpose_0; /* 0xfffe2027 */
+ rtems_unsigned8 unused_5;
+ rtems_unsigned8 general_purpose_1; /* 0xfffe2029 */
+ rtems_unsigned8 unused_6;
+ rtems_unsigned8 general_purpose_2; /* 0xfffe202b */
+ rtems_unsigned8 unused_7;
+ rtems_unsigned8 general_purpose_3; /* 0xfffe202d */
+ rtems_unsigned8 unused_8;
+ rtems_unsigned8 general_purpose_4; /* 0xfffe202f */
+};
+
+#define vme_gcsr ((volatile struct vme_gcsr_map * const) 0xfffe2020)
+
+
+
+#define z8530 0xfffe3001
+
+
+/* interrupt vectors - see MVME147/D1 4.14 */
+#define PCC_BASE_VECTOR 0x40 /* First user int */
+#define SCC_VECTOR PCC_BASE_VECTOR+3
+#define TIMER_1_VECTOR PCC_BASE_VECTOR+8
+#define TIMER_2_VECTOR PCC_BASE_VECTOR+9
+#define SOFT_1_VECTOR PCC_BASE_VECTOR+10
+#define SOFT_2_VECTOR PCC_BASE_VECTOR+11
+
+#define VME_BASE_VECTOR 0x50
+#define VME_SIGLP_VECTOR VME_BASE_VECTOR+1
+
+#define USE_CHANNEL_A 1 /* 1 = use channel A for console */
+#define USE_CHANNEL_B 0 /* 1 = use channel B for console */
+
+#if (USE_CHANNEL_A == 1)
+#define CONSOLE_CONTROL 0xfffe3002
+#define CONSOLE_DATA 0xfffe3003
+#elif (USE_CHANNEL_B == 1)
+#define CONSOLE_CONTROL 0xfffe3000
+#define CONSOLE_DATA 0xfffe3001
+#endif
+
+
+
+#define FOREVER 1 /* infinite loop */
+
+#ifdef M147_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Use the MPCSR vector for the MVME147
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), \
+ SOFT_1_VECTOR, 1 )
+
+#define Cause_tm27_intr() pcc->software_int_1_control = 0x0c
+ /* generate level 4 sotware int. */
+
+#define Clear_tm27_intr() pcc->software_int_1_control = 0x00
+
+#define Lower_tm27_intr()
+
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/c/src/lib/libbsp/m68k/mvme147s/include/coverhd.h b/c/src/lib/libbsp/m68k/mvme147s/include/coverhd.h
new file mode 100644
index 0000000000..3add9961ff
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 2
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
+#define CALLING_OVERHEAD_TASK_CREATE 3
+#define CALLING_OVERHEAD_TASK_IDENT 2
+#define CALLING_OVERHEAD_TASK_START 2
+#define CALLING_OVERHEAD_TASK_RESTART 2
+#define CALLING_OVERHEAD_TASK_DELETE 1
+#define CALLING_OVERHEAD_TASK_SUSPEND 1
+#define CALLING_OVERHEAD_TASK_RESUME 2
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 2
+#define CALLING_OVERHEAD_TASK_MODE 2
+#define CALLING_OVERHEAD_TASK_GET_NOTE 2
+#define CALLING_OVERHEAD_TASK_SET_NOTE 2
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 2
+#define CALLING_OVERHEAD_CLOCK_GET 5
+#define CALLING_OVERHEAD_CLOCK_SET 4
+#define CALLING_OVERHEAD_CLOCK_TICK 1
+
+#define CALLING_OVERHEAD_TIMER_CREATE 2
+#define CALLING_OVERHEAD_TIMER_IDENT 1
+#define CALLING_OVERHEAD_TIMER_DELETE 2
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
+#define CALLING_OVERHEAD_TIMER_RESET 1
+#define CALLING_OVERHEAD_TIMER_CANCEL 1
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 3
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 1
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 2
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 2
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 3
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 2
+
+#define CALLING_OVERHEAD_EVENT_SEND 2
+#define CALLING_OVERHEAD_EVENT_RECEIVE 2
+#define CALLING_OVERHEAD_SIGNAL_CATCH 2
+#define CALLING_OVERHEAD_SIGNAL_SEND 2
+#define CALLING_OVERHEAD_PARTITION_CREATE 3
+#define CALLING_OVERHEAD_PARTITION_IDENT 2
+#define CALLING_OVERHEAD_PARTITION_DELETE 1
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 2
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 2
+#define CALLING_OVERHEAD_REGION_CREATE 3
+#define CALLING_OVERHEAD_REGION_IDENT 2
+#define CALLING_OVERHEAD_REGION_DELETE 2
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 3
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 2
+#define CALLING_OVERHEAD_PORT_CREATE 3
+#define CALLING_OVERHEAD_PORT_IDENT 2
+#define CALLING_OVERHEAD_PORT_DELETE 1
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 2
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 2
+#define CALLING_OVERHEAD_IO_OPEN 2
+#define CALLING_OVERHEAD_IO_CLOSE 3
+#define CALLING_OVERHEAD_IO_READ 2
+#define CALLING_OVERHEAD_IO_WRITE 2
+#define CALLING_OVERHEAD_IO_CONTROL 2
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 2
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/mvme147s/shmsupp/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/Makefile.in
new file mode 100644
index 0000000000..9006fb28e7
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/m68k/mvme147s/shmsupp/addrconv.c b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/addrconv.c
new file mode 100644
index 0000000000..aa41e2a63e
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/addrconv.c
@@ -0,0 +1,36 @@
+/* Shm_Convert_address
+ *
+ * This MVME147 has a "normal" view of the VME address space.
+ * No address range conversion is required.
+ *
+ * Input parameters:
+ * address - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * June 1996
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+void *Shm_Convert_address(
+ void *address
+)
+{
+ return ( address );
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147s/shmsupp/getcfg.c b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/getcfg.c
new file mode 100644
index 0000000000..479a5bc1a8
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/getcfg.c
@@ -0,0 +1,87 @@
+/* void Shm_Get_configuration( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the MVME147.
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+ * NOTES: The SIGLP interrupt on the MVME147 is used as an interprocessor
+ * interrupt.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * June 1996
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems.h>
+#include "shm.h"
+
+#define INTERRUPT 1 /* MVME147 target supports both */
+#define POLLING 0 /* polling and interrupt modes */
+
+shm_config_table BSP_shm_cfgtbl;
+
+rtems_unsigned32 *BSP_int_address()
+{
+ rtems_unsigned32 id, offset;
+
+ id = (rtems_unsigned32) vme_lcsr->gcsr_base_address;
+ offset = (id << 4) & 0xF0;
+ offset |= 0xffff0003; /* points to GCSR global 1 */
+ return( (rtems_unsigned32 * ) offset );
+}
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+ /* A shared mem space has bee left between RAM_END and DRAM_END
+ on the first node*/
+ if (localnode == 1)
+ BSP_shm_cfgtbl.base = (vol_u32 *) RAM_END;
+ else
+ BSP_shm_cfgtbl.base = (vol_u32 *) (DRAM_END + RAM_END);
+
+ BSP_shm_cfgtbl.length = DRAM_END - RAM_END;
+ BSP_shm_cfgtbl.format = SHM_BIG;
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#else
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
+#endif
+
+#if (POLLING==1)
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+#else
+ BSP_shm_cfgtbl.poll_intr = INTR_MODE;
+ BSP_shm_cfgtbl.Intr.address = BSP_int_address(); /* GCSR global 1 */
+ BSP_shm_cfgtbl.Intr.value = 0x01; /* SIGLP */
+ BSP_shm_cfgtbl.Intr.length = BYTE;
+#endif
+
+ *shmcfg = &BSP_shm_cfgtbl;
+
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147s/shmsupp/lock.c b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/lock.c
new file mode 100644
index 0000000000..f65d77adc7
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/lock.c
@@ -0,0 +1,75 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = LQ_UNLOCKED;
+}
+
+/* void _Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+ rtems_unsigned32 *lockptr = (rtems_unsigned32 *)&lq_cb->lock;
+
+ rtems_interrupt_disable( isr_level );
+ Shm_isrstat = isr_level;
+ asm volatile( "lockit:" : : );
+ asm volatile( "tas %0@" : "=a" (lockptr) : "0" (lockptr) );
+ asm volatile( "bne lockit" : : );
+/* should delay */
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ lq_cb->lock = SHM_UNLOCK_VALUE;
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
+
diff --git a/c/src/lib/libbsp/m68k/mvme147s/shmsupp/mpisr.c b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/mpisr.c
new file mode 100644
index 0000000000..b8732c8f26
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/shmsupp/mpisr.c
@@ -0,0 +1,46 @@
+/* Shm_isr_mvme147()
+ *
+ * NOTE: This routine is not used when in polling mode. Either
+ * this routine OR Shm_clockisr is used in a particular system.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * June 1996
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+rtems_isr Shm_isr_mvme147()
+{
+ Shm_Interrupt_count += 1;
+ rtems_multiprocessing_announce();
+ vme_gcsr->global_1 = 1; /* clear SIGLP intr */
+}
+
+/* void _Shm_setvec( )
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void Shm_setvec()
+{
+ /* may need to disable intr */
+ set_vector( Shm_isr_mvme147, VME_SIGLP_VECTOR, 1 );
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147s/startup/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/startup/Makefile.in
new file mode 100644
index 0000000000..3a20849c5c
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/startup/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../mvme147/startup:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(srcdir)/linkcmds $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
diff --git a/c/src/lib/libbsp/m68k/mvme147s/startup/bspstart.c b/c/src/lib/libbsp/m68k/mvme147s/startup/bspstart.c
new file mode 100644
index 0000000000..3a56e63942
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/startup/bspstart.c
@@ -0,0 +1,305 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ m68k_isr_entry *monitors_vector_table;
+ int index;
+ rtems_unsigned8 node_number;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ monitors_vector_table = (m68k_isr_entry *)0; /* 147Bug Vectors are at 0 */
+ m68k_set_vbr( monitors_vector_table );
+
+ for ( index=2 ; index<=255 ; index++ )
+ M68Kvec[ index ] = monitors_vector_table[ 32 ];
+
+ M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */
+ M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */
+ M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */
+ M68Kvec[ 47 ] = monitors_vector_table[ 47 ]; /* system call vector */
+
+ m68k_set_vbr( &M68Kvec );
+
+ pcc->int_base_vector = PCC_BASE_VECTOR & 0xF0;
+ /* Set the PCC int vectors base */
+
+ /* VME shared memory configuration */
+ /* Only the first node shares its top 128k DRAM */
+
+ vme_lcsr->utility_interrupt_vector = VME_BASE_VECTOR & 0xF8;
+ /* Set VMEchip base interrupt vector */
+ vme_lcsr->utility_interrupt_mask |= 0x02;
+ /* Enable SIGLP interruption (see shm support) */
+ pcc->general_purpose_control &= 0x10;
+ /* Enable VME master interruptions */
+
+ if (vme_lcsr->system_controller & 0x01) {
+ /* the board is system controller */
+ vme_lcsr->system_controller = 0x08;
+ /* Make VME access round-robin */
+ }
+
+
+ node_number =
+ (rtems_unsigned8)
+ (Configuration.User_multiprocessing_table->node - 1) & 0xF;
+ /* Get and store node ID, first node_number = 0 */
+ vme_gcsr->board_identification = node_number;
+
+ vme_lcsr->gcsr_base_address = node_number;
+ /* Setup the base address of this board's gcsr */
+ vme_lcsr->timer_configuration = 0x6a;
+ /* Enable VME time outs, maximum periods */
+
+ if (node_number == 0) {
+ pcc->slave_base_address = 0x01;
+ /* Set local DRAM base address on the VME bus to the DRAM size */
+
+ vme_lcsr->vme_bus_requester = 0x80;
+ while (! (vme_lcsr->vme_bus_requester & 0x40));
+ /* Get VMEbus mastership */
+ vme_lcsr->slave_address_modifier = 0xfb;
+ /* Share everything */
+ vme_lcsr->slave_configuration = 0x80;
+ /* Share local DRAM */
+ vme_lcsr->vme_bus_requester = 0x0;
+ /* release bus */
+ } else {
+ pcc->slave_base_address = 0;
+ /* Set local DRAM base address on the VME bus to 0 */
+
+ vme_lcsr->vme_bus_requester = 0x80;
+ while (! (vme_lcsr->vme_bus_requester & 0x40));
+ /* Get VMEbus mastership */
+ vme_lcsr->slave_address_modifier = 0x08;
+ /* Share only the short adress range */
+ vme_lcsr->slave_configuration = 0;
+ /* Don't share local DRAM */
+ vme_lcsr->vme_bus_requester = 0x0;
+ /* release bus */
+ }
+
+ vme_lcsr->master_address_modifier = 0;
+ /* Automatically set the address modifier */
+ vme_lcsr->master_configuration = 1;
+ /* Disable D32 transfers : they don't work on my VMEbus rack */
+
+ m68k_enable_caching();
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_vector_table = (m68k_isr_entry *) &M68Kvec;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds
new file mode 100644
index 0000000000..3f35f87fe8
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/startup/linkcmds
@@ -0,0 +1,52 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Motorola MVME147 boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * MVME147 port for TNI - Telecom Bretagne
+ * by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+ * May 1996
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x7000, l = 0x3d8fff
+ }
+
+SECTIONS
+{
+ .text 0x7000 :
+ {
+ text_start = . ;
+ _text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+ _etext = .;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ _data_start = .;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+ _edata = .;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/mvme147s/timer/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/timer/Makefile.in
new file mode 100644
index 0000000000..88201beb4c
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../mvme147/timer
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(S_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme147s/times b/c/src/lib/libbsp/m68k/mvme147s/times
new file mode 100644
index 0000000000..d1bae93265
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/times
@@ -0,0 +1,194 @@
+#
+# Timing Test Suite Results for the Motorola MVME147 BSP
+#
+# MVME147 port for TNI - Telecom Bretagne
+# by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
+# May 1996
+#
+# $Id$
+#
+
+Board: Motorola MVME147S
+CPU: Motorola MC68030 + MC68882 FPU
+Clock Speed: 20 Mhz
+Memory Configuration: DRAM w/no cache
+Wait States: ? wait state
+
+Times Reported in: microseconds (6.25 us grain)
+Timer Source: MVME147 Peripheral Channel Controller tick timer
+
+Column A: 3.5.1 pre-release
+
+# DESCRIPTION A
+== ================================================================= ====
+ 1 rtems_semaphore_create 69
+ rtems_semaphore_delete 69
+ rtems_semaphore_obtain: available 44
+ rtems_semaphore_obtain: not available -- NO_WAIT 44
+ rtems_semaphore_release: no waiting tasks 56
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 125
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 106
+
+ 4 rtems_task_restart: blocked task -- preempts caller 181
+ rtems_task_restart: ready task -- preempts caller 169
+ rtems_semaphore_release: task readied -- returns to caller 81
+ rtems_task_create 169
+ rtems_task_start 87
+ rtems_task_restart: suspended task -- returns to caller 106
+ rtems_task_delete: suspended task 169
+ rtems_task_restart: ready task -- returns to caller 112
+ rtems_task_restart: blocked task -- returns to caller 150
+ rtems_task_delete: blocked task 175
+
+ 5 rtems_task_suspend: calling task 87
+ rtems_task_resume: task readied -- preempts caller 75
+
+ 6 rtems_task_restart: calling task 112
+ rtems_task_suspend: returns to caller 56
+ rtems_task_resume: task readied -- returns to caller 50
+ rtems_task_delete: ready task 169
+
+ 7 rtems_task_restart: suspended task -- preempts caller 143
+
+ 8 rtems_task_set_priority: obtain current priority 37
+ rtems_task_set_priority: returns to caller 75
+ rtems_task_mode: obtain current mode 6
+ rtems_task_mode: no reschedule 6
+ rtems_task_mode: reschedule -- returns to caller 19
+ rtems_task_mode: reschedule -- preempts caller 75
+ rtems_task_set_note 37
+ rtems_task_get_note 37
+ rtems_clock_set 87
+ rtems_clock_get 0
+
+ 9 rtems_message_queue_create 225
+ rtems_message_queue_send: no waiting tasks 112
+ rtems_message_queue_urgent: no waiting tasks 112
+ rtems_message_queue_receive: available 87
+ rtems_message_queue_flush: no messages flushed 37
+ rtems_message_queue_flush: messages flushed 50
+ rtems_message_queue_delete 106
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 44
+ rtems_message_queue_receive: not available -- caller blocks 125
+
+11 rtems_message_queue_send: task readied -- preempts caller 144
+
+12 rtems_message_queue_send: task readied -- returns to caller 119
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 144
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 119
+
+15 rtems_event_receive: obtain current events 0
+ rtems_event_receive: not available -- NO_WAIT 25
+ rtems_event_receive: not available -- caller blocks 100
+ rtems_event_send: no task readied 31
+ rtems_event_receive: available 37
+ rtems_event_send: task readied -- returns to caller 69
+
+16 rtems_event_send: task readied -- preempts caller 100
+
+17 rtems_task_set_priority: preempts caller 125
+
+18 rtems_task_delete: calling task 200
+
+19 rtems_signal_catch 19
+ rtems_signal_send: returns to caller 50
+ rtems_signal_send: signal to self 56
+ exit ASR overhead: returns to calling task 44
+ exit ASR overhead: returns to preempting task 75
+
+20 rtems_partition_create 81
+ rtems_region_create 75
+ rtems_partition_get_buffer: available 44
+ rtems_partition_get_buffer: not available 44
+ rtems_partition_return_buffer 56
+ rtems_partition_delete 62
+ rtems_region_get_segment: available 56
+ rtems_region_get_segment: not available -- NO_WAIT 56
+ rtems_region_return_segment: no waiting tasks 69
+ rtems_region_get_segment: not available -- caller blocks 144
+ rtems_region_return_segment: task readied -- preempts caller 169
+ rtems_region_return_segment: task readied -- returns to caller 137
+ rtems_region_delete 56
+ rtems_io_initialize 0
+ rtems_io_open 0
+ rtems_io_close 0
+ rtems_io_read 0
+ rtems_io_write 0
+ rtems_io_control 0
+
+21 rtems_task_ident 375
+ rtems_message_queue_ident 362
+ rtems_semaphore_ident 394
+ rtems_partition_ident 362
+ rtems_region_ident 369
+ rtems_port_ident 362
+ rtems_timer_ident 369
+ rtems_rate_monotonic_ident 362
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 131
+ rtems_message_queue_broadcast: no waiting tasks 62
+ rtems_message_queue_broadcast: task readied -- preempts caller 156
+
+23 rtems_timer_create 31
+ rtems_timer_fire_after: inactive 69
+ rtems_timer_fire_after: active 69
+ rtems_timer_cancel: active 44
+ rtems_timer_cancel: inactive 37
+ rtems_timer_reset: inactive 69
+ rtems_timer_reset: active 69
+ rtems_timer_fire_when: inactive 87
+ rtems_timer_fire_when: active 87
+ rtems_timer_delete: active 56
+ rtems_timer_delete: inactive 50
+ rtems_task_wake_when 125
+
+24 rtems_task_wake_after: yield -- returns to caller 19
+ rtems_task_wake_after: yields -- preempts caller 69
+
+25 rtems_clock_tick 19
+
+26 _ISR_Disable 6
+ _ISR_Flash 6
+ _ISR_Enable 6
+ _Thread_Disable_dispatch 6
+ _Thread_Enable_dispatch 25
+ _Thread_Set_state 31
+ _Thread_Disptach (NO FP) 62
+ context switch: no floating point contexts 50
+ context switch: self 12
+ context switch: to another task 12
+ context switch: restore 1st FP task 56
+ fp context switch: save idle, restore idle 87
+ fp context switch: save idle, restore initialized 75
+ fp context switch: save initialized, restore initialized 75
+ _Thread_Resume 25
+ _Thread_Unblock 25
+ _Thread_Ready 31
+ _Thread_Get 12
+ _Semaphore_Get 6
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 12
+ interrupt exit overhead: returns to interrupted task 12
+ interrupt entry overhead: returns to nested interrupt 19
+ interrupt exit overhead: returns to nested interrupt 6
+ interrupt entry overhead: returns to preempting task 12
+ interrupt exit overhead: returns to preempting task 81
+
+28 rtems_port_create 37
+ rtems_port_external_to_internal 31
+ rtems_port_internal_to_external 31
+ rtems_port_delete 56
+
+29 rtems_rate_monotonic_create 44
+ rtems_rate_monotonic_period: initiate period -- returns to caller 62
+ rtems_rate_monotonic_period: obtain status 37
+ rtems_rate_monotonic_cancel 56
+ rtems_rate_monotonic_delete: inactive 62
+ rtems_rate_monotonic_delete: active 69
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 87
diff --git a/c/src/lib/libbsp/m68k/mvme147s/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/mvme147s/wrapup/Makefile.in
new file mode 100644
index 0000000000..0296916f22
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme147s/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer shmsupp
+GENERIC_PIECES=shmdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/mvme162/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/Makefile.in
new file mode 100644
index 0000000000..c72d071f77
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/Makefile.in
@@ -0,0 +1,19 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SRCS=README
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+#
+# XXXX add tools
+SUB_DIRS=include startup clock console timer wrapup
diff --git a/c/src/lib/libbsp/m68k/mvme162/README b/c/src/lib/libbsp/m68k/mvme162/README
new file mode 100644
index 0000000000..af6082db21
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/README
@@ -0,0 +1,151 @@
+--
+-- EISCAT Scientific Association. M.Savitski
+--
+-- This material is a part of the MVME162 Board Support Package
+-- for the RTEMS executive. Its licensing policies are those of the
+-- RTEMS distribution.
+--
+-- Updated by Joel Sherrill (jsherril@redstone.army.mil) after
+-- inclusion in the standard release.
+--
+-- $Id$
+--
+
+This is a README file for the MVME162 port of RTEMS.
+
+Disclaimer
+----------
+This is my first attempt at porting RTEMS. The resulting code obviously
+contains bugs (know and unknown) and limitations. I assume no
+responsibility for quality and support of the software in question.
+
+Now on more optimistic note:
+
+I have run most of the standard RTEMS sptests, and neither of them
+failed. My present (short) experience of developing RTEMS applications
+is essentially positive and suggestive of a long-term commitment. In
+any case I am ready to answer questions regarding the port and intend
+to follow the future RTEMS versions. I will do my best to provide
+whatever support I can afford time-wise.
+
+MVME162FX and DMA on the IP bus
+-------------------------------
+
+From Eric Vaitl <eric@viasat.com>:
+
+If you have any customers that will be using the 162FX, tell them to
+be careful. The main difference between the 162 and the 162FX is DMA
+on the IP bus. I spent over a month trying to write a DMA HDLC driver
+for GreenSprings IP-MP and couldn't get it to work. I talked to some
+people at GreenSprings, and they agreed that there really is no way to
+get DMA to work unless you know the size of the packets in advance.
+Once the IP2 chip DMA controller is given the character count and
+enabled, it doesn't accept further commands until all of the
+characters have arrived. The only way to terminate a DMA transfer
+prematurely is by raising DMAEND* during the last read. None of the IP
+modules that I know of are currently able to do that. GreenSprings is
+working on the problem, but nothing is going to available for a few
+months.
+
+Installation
+------------
+Nothing unique to the MVME162. It has been incorporated into the
+standard release.
+
+Port Description
+----------------
+The port was done using already existing ports to the M68020 boards,
+DMV152 and MVME136.
+
+The host system was SUN/Solaris 2.3, and the cross-development
+environment consisted of Free Software Foundation (FSF)'s GNU C
+compiler (version 2.6), GNU Assembler (version 2.3) and GNU binary
+utilities binutils version 2.5.2, built with m68k as a target. The
+recent/latest versions of other GNU programs (flex, make, etc) were
+also used at the build stage.
+
+In all subdirectories of the RTEMS distribution tree, the directories
+mvme136 were duplicated as mvme162.
+
+Essential modifications are detailed below:
+
+- the MVME162-specific hardware registers were described in bsp.h
+
+- timer and clock routines were made to use the MVME162's Tick Timers 1
+and 2, respectively
+
+- shared memory support was replaced by stubs for the time being
+
+- console IO was lifted entirely from the DMV152 support code, thanks
+to the fact that Z8530 SCC used in DMV152 is upwards compatible with
+the Z85230 SCC of the MVME162. (Only the memory mapping of the SCC
+registers had to be changed.)
+
+- symbols in several *.s files were prepended with underscores to
+comply with the xgcc configuration used (it prepends underscores to all
+symbols defined in c code)
+
+- linkcmds file was modified to place the linked code into the memory
+configured for the board in use
+
+- bspstart.c was modified as follows:
+
+ monitors_vector_table = (m68k_isr *)0xFFE00000;
+
+was made to point to the power-up location of MVME162 interrupt vector
+table.
+
+- The shutdown is a temporary solution. To exit cleanly, it has to disable
+all enabled interrupts and restore the board to its power-up status.
+Presently this is not done satisfactorily, as a result, the board needs
+a hardware reset from the external VMEbus master or from the front
+panel to ensure correct operation for subsequent downloads.
+
+Host System
+-----------
+The VMEbus master used to externally control and download the MVME162
+is a FORCE CPU-2CE board running Solaris 2.3. A simple program to load
+s-records and start/reset the MVME162 was written. The code is in the
+file tools/sload.c
+
+This code depends on the external VMEbus master's vme driver and is
+provided as an example, without the Makefile. The bulk of the program
+which parses the s-records is courtesy of Kym Newbery,
+(8918927y@lux.levels.unisa.edu.au).
+
+In general, apart from x-gcc, the tools most often used while building
+RTEMS for MVME162 were: find, grep, diff, and, of course
+
+MVME162 Embedded Controller Programmer's Reference Guide,
+Motorola, MVME162PG/D1.
+
+Thanks
+------
+- to On-Line Applications Research Corporation (OAR) for developing
+RTEMS and making it available on a Technology Transfer basis;
+- to Joel Sherril, the leader of the RTEMS development group for
+stimulating and helpful discussions;
+- to Kym Newbery (8918927y@lux.levels.unisa.edu.au) for his s-record
+parser;
+- to Gerd Truschinski (gt@first.gmd.de) for creating and running the
+crossgcc mailing list
+- to FSF and Cygnus Support for great free software;
+
+What's new
+----------
+ - 28.07.95 BSP adjusted to rtems-3.2.0.
+ - Now console driver uses interrupts on receive (ring buffer
+ code lifted with thanks from the IDP BSP next door (../idp))
+ - both front-panel serial interfaces are supported
+ - serious bug in timer interrupts fixed
+ - interrupt test tm27 now supported
+
++----------------------------------+-------------------------------+
+| Dr. Mikhail (Misha) Savitski | Voice : +46-980-79162 |
+| Software Systems Engineer | Fax : +46-980-79161 |
+| EISCAT Svalbard Radar Project | E-mail: mms@eiscathq.irf.se |
+| EISCAT Scientific Association |----------- /\_/\ -----------|
+| Box 812 S-98128 Kiruna, Sweden | EIS { o o } CAT |
++----------------------------------+-------oQQQ--(>I<)--QQQo-------+
+
+
diff --git a/c/src/lib/libbsp/m68k/mvme162/bsp_specs b/c/src/lib/libbsp/m68k/mvme162/bsp_specs
new file mode 100644
index 0000000000..70d6a7ab66
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: start.o%s
+{!pg:
+g: start.o%s
+{!g:
+p: start.o%s
+!p: start.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/m68k/mvme162/clock/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/clock/Makefile.in
new file mode 100644
index 0000000000..e2def59237
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/clock/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c b/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c
new file mode 100644
index 0000000000..6490737731
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/clock/ckinit.c
@@ -0,0 +1,146 @@
+/* Clock_init()
+ *
+ * This routine initializes the Tick Timer 2 on the MVME162 board.
+ * The tick frequency is 1 millisecond.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#define MS_COUNT 1000 /* T2's countdown constant (1 ms) */
+#define CLOCK_INT_LEVEL 6 /* T2's interrupt level */
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+volatile rtems_unsigned32 Clock_driver_ticks; /* ticks since initialization */
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+#define CLOCK_VECTOR (VBR0 * 0x10 + 0x9)
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+
+/*
+ * ISR Handler
+ */
+
+rtems_isr Clock_isr(rtems_vector_number vector)
+{
+ Clock_driver_ticks += 1;
+ lcsr->timer_cnt_2 = 0; /* clear counter */
+ lcsr->intr_clear |= 0x02000000;
+
+ if ( Clock_isrs == 1 ) {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+ }
+ else
+ Clock_isrs -= 1;
+}
+
+void Install_clock(rtems_isr_entry clock_isr )
+{
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker =
+ (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ lcsr->vector_base |= MASK_INT; /* unmask VMEchip2 interrupts */
+ lcsr->to_ctl = 0xE7; /* prescaler to 1 MHz (see Appendix A1) */
+ lcsr->timer_cmp_2 = MS_COUNT;
+ lcsr->timer_cnt_2 = 0; /* clear counter */
+ lcsr->board_ctl |= 0x700; /* increment, reset-on-compare, and */
+ /* clear-overflow-cnt */
+
+ lcsr->intr_level[0] |= CLOCK_INT_LEVEL * 0x10; /* set int level */
+ lcsr->intr_ena |= 0x02000000; /* enable tick timer 2 interrupt */
+
+ atexit( Clock_exit );
+ }
+}
+
+void Clock_exit( void )
+{
+/* Dummy for now. See other m68k BSP's for code examples */
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/m68k/mvme162/console/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme162/console/console.c b/c/src/lib/libbsp/m68k/mvme162/console/console.c
new file mode 100644
index 0000000000..f75070ef08
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/console/console.c
@@ -0,0 +1,256 @@
+/*
+ * This file contains the MVME162 console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+#define M162_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <ringbuf.h>
+
+Ring_buffer_t Buffer[2];
+
+/*
+ * Interrupt handler for receiver interrupts
+ */
+
+rtems_isr C_Receive_ISR(rtems_vector_number vector)
+{
+ register int ipend, port;
+
+ ZWRITE0(1, 0x38); /* reset highest IUS */
+
+ ipend = ZREAD(1, 3); /* read int pending from A side */
+
+ if (ipend == 0x04) port = 0; /* channel B intr pending */
+ else if (ipend == 0x20) port = 1; /* channel A intr pending */
+ else return;
+
+ Ring_buffer_Add_character(&Buffer[port], ZREADD(port));
+
+ if (ZREAD(port, 1) & 0x70) { /* check error stat */
+ ZWRITE0(port, 0x30); /* reset error */
+ }
+}
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ int i;
+ rtems_status_code status;
+
+ /*
+ * Initialise receiver interrupts on both ports
+ */
+
+ for (i = 0; i <= 1; i++) {
+ Ring_buffer_Initialize( &Buffer[i] );
+ ZWRITE(i, 2, SCC_VECTOR);
+ ZWRITE(i, 10, 0);
+ ZWRITE(i, 1, 0x10); /* int on all Rx chars or special condition */
+ ZWRITE(i, 9, 8); /* master interrupt enable */
+ }
+
+ set_vector(C_Receive_ISR, SCC_VECTOR, 1); /* install ISR for ports A and B */
+
+ mcchip->vector_base = 0;
+ mcchip->gen_control = 2; /* MIEN */
+ mcchip->SCC_int_ctl = 0x13; /* SCC IEN, IPL3 */
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 1
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name(
+ "/dev/tty00",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name(
+ "/dev/tty01",
+ major,
+ (rtems_device_minor_number) 1
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Non-blocking char input
+ */
+
+rtems_boolean char_ready(int port, char *ch)
+{
+ if ( Ring_buffer_Is_empty( &Buffer[port] ) )
+ return FALSE;
+
+ Ring_buffer_Remove_character( &Buffer[port], *ch );
+
+ return TRUE;
+}
+
+/*
+ * Block on char input
+ */
+
+char inbyte(int port)
+{
+ unsigned char tmp_char;
+
+ while ( !char_ready(port, &tmp_char) );
+ return tmp_char;
+}
+
+/*
+ * This routine transmits a character out the SCC. It no longer supports
+ * XON/XOFF flow control.
+ */
+
+void outbyte(char ch, int port)
+{
+ while (1) {
+ if (ZREAD0(port) & TX_BUFFER_EMPTY) break;
+ }
+ ZWRITED(port, ch);
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ if ( minor > 1 )
+ return RTEMS_INVALID_NUMBER;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte( minor );
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ if ( minor > 1 )
+ return RTEMS_INVALID_NUMBER;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r', minor );
+ }
+ outbyte( buffer[ count ], minor );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme162/include/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/include/Makefile.in
new file mode 100644
index 0000000000..8c93d9a2fa
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h $(srcdir)/page_table.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/m68k/mvme162/include/bsp.h b/c/src/lib/libbsp/m68k/mvme162/include/bsp.h
new file mode 100644
index 0000000000..b2c4395ed8
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/include/bsp.h
@@ -0,0 +1,300 @@
+/* bsp.h
+ *
+ * This include file contains all MVME162fx board IO definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+#ifndef __MVME162_h
+#define __MVME162_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+
+/*
+ * Following defines must reflect the setup of the particular MVME162
+ */
+
+#define GROUP_BASE_ADDRESS 0x0000F200
+#define BOARD_BASE_ADDRESS 0xFFFF0000
+
+/* Base for local interrupters' vectors (with enable bit set) */
+
+#define MASK_INT 0x00800000
+#define VBR0 0x6
+#define VBR1 0x7
+
+/* RAM limits */
+
+#define RAM_START 0x00100000
+#define RAM_END 0x00200000
+
+/*
+ * ----------------------------------
+ */
+
+typedef volatile struct lcsr_regs {
+ unsigned long slave_adr[2];
+ unsigned long slave_trn[2];
+ unsigned long slave_ctl;
+ unsigned long mastr_adr[4];
+ unsigned long mastr_trn;
+ unsigned long mastr_att;
+ unsigned long mastr_ctl;
+ unsigned long dma_ctl_1;
+ unsigned long dma_ctl_2;
+ unsigned long dma_loc_cnt;
+ unsigned long dma_vme_cnt;
+ unsigned long dma_byte_cnt;
+ unsigned long dma_adr_cnt;
+ unsigned long dma_status;
+ unsigned long to_ctl;
+ unsigned long timer_cmp_1;
+ unsigned long timer_cnt_1;
+ unsigned long timer_cmp_2;
+ unsigned long timer_cnt_2;
+ unsigned long board_ctl;
+ unsigned long prescaler_cnt;
+ unsigned long intr_stat;
+ unsigned long intr_ena;
+ unsigned long intr_soft_set;
+ unsigned long intr_clear;
+ unsigned long intr_level[4];
+ unsigned long vector_base;
+} lcsr_regs;
+
+#define lcsr ((lcsr_regs * const) 0xFFF40000)
+
+typedef volatile struct mcchip_regs {
+
+ unsigned char chipID;
+ unsigned char chipREV;
+ unsigned char gen_control;
+ unsigned char vector_base;
+
+ unsigned long timer_cmp_1;
+ unsigned long timer_cnt_1;
+ unsigned long timer_cmp_2;
+ unsigned long timer_cnt_2;
+
+ unsigned char LSB_prescaler_count;
+ unsigned char prescaler_clock_adjust;
+ unsigned char time_ctl_2;
+ unsigned char time_ctl_1;
+
+ unsigned char time_int_ctl_4;
+ unsigned char time_int_ctl_3;
+ unsigned char time_int_ctl_2;
+ unsigned char time_int_ctl_1;
+
+ unsigned char dram_err_int_ctl;
+ unsigned char SCC_int_ctl;
+ unsigned char time_ctl_4;
+ unsigned char time_ctl_3;
+
+ unsigned short DRAM_space_base;
+ unsigned short SRAM_space_base;
+
+ unsigned char DRAM_size;
+ unsigned char DRAM_SRAM_opt;
+ unsigned char SRAM_size;
+ unsigned char reserved;
+
+ unsigned char LANC_error;
+ unsigned char reserved1;
+ unsigned char LANC_int_ctl;
+ unsigned char LANC_berr_ctl;
+
+ unsigned char SCSI_error;
+ unsigned char general_inputs;
+ unsigned char MVME_162_version;
+ unsigned char SCSI_int_ctl;
+
+ unsigned long timer_cmp_3;
+ unsigned long timer_cnt_3;
+ unsigned long timer_cmp_4;
+ unsigned long timer_cnt_4;
+
+ unsigned char bus_clk;
+ unsigned char PROM_acc_time_ctl;
+ unsigned char FLASH_acc_time_ctl;
+ unsigned char ABORT_int_ctl;
+
+ unsigned char RESET_ctl;
+ unsigned char watchdog_timer_ctl;
+ unsigned char acc_watchdog_time_base_sel;
+ unsigned char reserved2;
+
+ unsigned char DRAM_ctl;
+ unsigned char reserved4;
+ unsigned char MPU_status;
+ unsigned char reserved3;
+
+ unsigned long prescaler_count;
+
+} mcchip_regs;
+
+#define mcchip ((mcchip_regs * const) 0xFFF42000)
+
+/*----------------------------------------------------------------*/
+
+/*
+ * SCC Z8523(0) defines and macros
+ * -------------------------------
+ * Prototypes for the low-level serial io are also included here,
+ * because such stuff is bsp-specific (yet). The function bodies
+ * are in console.c
+ *
+ * NOTE from Eric Vaitl <evaitl@viasat.com>:
+ *
+ * I dropped RTEMS into a 162FX today (the MVME162-513). The 162FX has a
+ * bug in the MC2 chip (revision 1) such that the SCC data register is
+ * not accessible, it has to be accessed indirectly through the SCC
+ * control register.
+ */
+
+enum {portB, portA};
+
+rtems_boolean char_ready(int port, char *ch);
+char char_wait(int port);
+void char_put(int port, char ch);
+
+#define TX_BUFFER_EMPTY 0x04
+#define RX_DATA_AVAILABLE 0x01
+#define SCC_VECTOR 0x40
+
+typedef volatile struct scc_regs {
+ unsigned char pad1;
+ volatile unsigned char csr;
+ unsigned char pad2;
+ volatile unsigned char buf;
+} scc_regs;
+
+#define scc ((scc_regs * const) 0xFFF45000)
+
+#define ZWRITE0(port, v) (scc[port].csr = (unsigned char)(v))
+#define ZREAD0(port) (scc[port].csr)
+
+#define ZREAD(port, n) (ZWRITE0(port, n), (scc[port].csr))
+#define ZREADD(port) (scc[port].csr=0x08, scc[port].csr )
+
+#define ZWRITE(port, n, v) (ZWRITE0(port, n), ZWRITE0(port, v))
+#define ZWRITED(port, v) (scc[port].csr = 0x08, \
+ scc[port].csr = (unsigned char)(v))
+/*----------------------------------------------------------------*/
+
+/*
+ * The following registers are located in the VMEbus short
+ * IO space and respond to address modifier codes $29 and $2D.
+ * On FORCE CPU use address gcsr_vme and device /dev/vme16d32.
+*/
+typedef volatile struct gcsr_regs {
+ unsigned char chip_revision;
+ unsigned char chip_id;
+ unsigned char lmsig;
+ unsigned char board_scr;
+ unsigned short gpr[6];
+} gcsr_regs;
+
+#define gcsr_vme ((gcsr_regs * const) (GROUP_BASE_ADDRESS + BOARD_BASE_ADDRESS))
+#define gcsr ((gcsr_regs * const) 0xFFF40100)
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: We use software interrupt 0
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) \
+ set_vector( (handler), VBR1 * 0x10 + 0x8, 1 ); \
+ lcsr->intr_level[2] |= 3; \
+ lcsr->intr_ena |= 0x100;
+
+#define Cause_tm27_intr() lcsr->intr_soft_set |= 0x100
+
+#define Clear_tm27_intr() lcsr->intr_clear |= 0x100
+
+#define Lower_tm27_intr()
+
+#ifdef M162_INIT
+#undef EXTERN
+#define EXTERN
+#else
+#undef EXTERN
+#define EXTERN extern
+#endif
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+extern m68k_isr_entry M68Kvec[]; /* vector table address */
+
+/* functions */
+
+void bsp_cleanup( void );
+
+m68k_isr_entry set_vector(
+ rtems_isr_entry handler,
+ rtems_vector_number vector,
+ int type
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/mvme162/include/coverhd.h b/c/src/lib/libbsp/m68k/mvme162/include/coverhd.h
new file mode 100644
index 0000000000..25fd29af85
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/include/coverhd.h
@@ -0,0 +1,104 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C on this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 2
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
+#define CALLING_OVERHEAD_TASK_CREATE 3
+#define CALLING_OVERHEAD_TASK_IDENT 2
+#define CALLING_OVERHEAD_TASK_START 2
+#define CALLING_OVERHEAD_TASK_RESTART 2
+#define CALLING_OVERHEAD_TASK_DELETE 1
+#define CALLING_OVERHEAD_TASK_SUSPEND 1
+#define CALLING_OVERHEAD_TASK_RESUME 2
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 2
+#define CALLING_OVERHEAD_TASK_MODE 2
+#define CALLING_OVERHEAD_TASK_GET_NOTE 2
+#define CALLING_OVERHEAD_TASK_SET_NOTE 2
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 2
+#define CALLING_OVERHEAD_CLOCK_GET 4
+#define CALLING_OVERHEAD_CLOCK_SET 4
+#define CALLING_OVERHEAD_CLOCK_TICK 1
+
+#define CALLING_OVERHEAD_TIMER_CREATE 2
+#define CALLING_OVERHEAD_TIMER_IDENT 1
+#define CALLING_OVERHEAD_TIMER_DELETE 2
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
+#define CALLING_OVERHEAD_TIMER_RESET 1
+#define CALLING_OVERHEAD_TIMER_CANCEL 1
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 2
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 1
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 2
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 2
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 2
+
+#define CALLING_OVERHEAD_EVENT_SEND 2
+#define CALLING_OVERHEAD_EVENT_RECEIVE 2
+#define CALLING_OVERHEAD_SIGNAL_CATCH 2
+#define CALLING_OVERHEAD_SIGNAL_SEND 2
+#define CALLING_OVERHEAD_PARTITION_CREATE 3
+#define CALLING_OVERHEAD_PARTITION_IDENT 2
+#define CALLING_OVERHEAD_PARTITION_DELETE 2
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 2
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 2
+#define CALLING_OVERHEAD_REGION_CREATE 3
+#define CALLING_OVERHEAD_REGION_IDENT 2
+#define CALLING_OVERHEAD_REGION_DELETE 1
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 3
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 2
+#define CALLING_OVERHEAD_PORT_CREATE 3
+#define CALLING_OVERHEAD_PORT_IDENT 2
+#define CALLING_OVERHEAD_PORT_DELETE 2
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 2
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 3
+#define CALLING_OVERHEAD_IO_OPEN 2
+#define CALLING_OVERHEAD_IO_CLOSE 2
+#define CALLING_OVERHEAD_IO_READ 2
+#define CALLING_OVERHEAD_IO_WRITE 2
+#define CALLING_OVERHEAD_IO_CONTROL 2
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 2
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 2
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/m68k/mvme162/include/page_table.h b/c/src/lib/libbsp/m68k/mvme162/include/page_table.h
new file mode 100644
index 0000000000..a5685245f2
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/include/page_table.h
@@ -0,0 +1,45 @@
+/*
+ * $Id$
+ *
+ * This file was submitted by Eric Vaitl <vaitl@viasat.com> and
+ * supports page table initialization.
+ *
+ * $Log$
+ * Revision 1.1 1995/12/19 19:22:36 joel
+ * file lost in crash and re-added
+ *
+ * Revision 1.1 1995/12/05 15:29:19 joel
+ * added.. submitted by Eric Vaitl <vaitl@viasat.com>
+ *
+ * Revision 1.2 1995/10/27 21:00:33 vaitl
+ * Modified page table routines so application code can map
+ * VME space.
+ *
+ * Revision 1.1 1995/10/25 17:16:06 vaitl
+ * Working on page table. Caching partially set up, but can't currently
+ * set tc register.
+ *
+ */
+
+#ifndef PAGE_TABLE_H
+#define PAGE_TABLE_H
+
+extern void page_table_teardown(void);
+extern void page_table_init(void);
+extern int page_table_map(void *addr, unsigned long size, int cache_type);
+
+enum {
+ CACHE_WRITE_THROUGH,
+ CACHE_COPYBACK,
+ CACHE_NONE_SERIALIZED,
+ CACHE_NONE
+};
+enum {
+ PTM_SUCCESS,
+ PTM_BAD_ADDR,
+ PTM_BAD_SIZE,
+ PTM_BAD_CACHE,
+ PTM_NO_TABLE_SPACE
+};
+
+#endif
diff --git a/c/src/lib/libbsp/m68k/mvme162/startup/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/startup/Makefile.in
new file mode 100644
index 0000000000..281d964124
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/startup/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../shared:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart page_table sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
diff --git a/c/src/lib/libbsp/m68k/mvme162/startup/bspclean.c b/c/src/lib/libbsp/m68k/mvme162/startup/bspclean.c
new file mode 100644
index 0000000000..edf2f99e6b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/startup/bspclean.c
@@ -0,0 +1,56 @@
+/*
+ * This routine returns control to 162Bug.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <z8036.h>
+#include <page_table.h>
+
+void bsp_return_to_monitor_trap()
+{
+ extern void start( void );
+
+ page_table_teardown();
+
+ lcsr->intr_ena = 0; /* disable interrupts */
+ m68k_set_vbr(0xFFE00000); /* restore 162Bug vectors */
+ asm volatile( "trap #15" ); /* trap to 162Bug */
+ asm volatile( ".short 0x63" ); /* return to 162Bug (.RETURN) */
+ /* restart program */
+ /*
+ * This does not work on the 162....
+ */
+#if 0
+ { register volatile void *start_addr;
+
+ start_addr = start;
+
+ asm volatile ( "jmp %0@" : "=a" (start_addr) : "0" (start_addr) );
+ }
+#endif
+}
+
+void bsp_cleanup( void )
+{
+ M68Kvec[ 45 ] = bsp_return_to_monitor_trap; /* install handler */
+ asm volatile( "trap #13" ); /* insures SUPV mode */
+}
diff --git a/c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c b/c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c
new file mode 100644
index 0000000000..1d4b976eb4
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/startup/bspstart.c
@@ -0,0 +1,257 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <page_table.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ m68k_isr_entry *monitors_vector_table;
+ int index;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * 162Bug Vectors are at 0xFFE00000
+ */
+
+ monitors_vector_table = (m68k_isr_entry *)0xFFE00000;
+
+ m68k_set_vbr( monitors_vector_table );
+
+ for ( index=2 ; index<=255 ; index++ )
+ M68Kvec[ index ] = monitors_vector_table[ 32 ];
+
+ M68Kvec[ 2 ] = monitors_vector_table[ 2 ]; /* bus error vector */
+ M68Kvec[ 4 ] = monitors_vector_table[ 4 ]; /* breakpoints vector */
+ M68Kvec[ 9 ] = monitors_vector_table[ 9 ]; /* trace vector */
+ M68Kvec[ 47 ] = monitors_vector_table[ 47 ]; /* system call vector */
+
+ m68k_set_vbr( &M68Kvec );
+
+ /*
+ * You may wish to make the VME arbitration round-robin here, currently
+ * we leave it as it is.
+ */
+
+ /* set the Interrupt Base Vectors */
+
+ lcsr->vector_base = (VBR0 << 28) | (VBR1 << 24);
+
+ page_table_init();
+
+ /*
+ * we only use a hook to get the C library initialized.
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_vector_table = (m68k_isr_entry *) &M68Kvec;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add another extension if using the stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ BSP_Configuration.work_space_start = (void *)
+ (RAM_END - BSP_Configuration.work_space_size);
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+ /* does not return */
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme162/startup/linkcmds b/c/src/lib/libbsp/m68k/mvme162/startup/linkcmds
new file mode 100644
index 0000000000..27c41cfb28
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/startup/linkcmds
@@ -0,0 +1,50 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Motorola MVME162 board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x100000, l = 1M
+ }
+
+SECTIONS
+{
+ .text 0x100000 :
+ {
+ text_start = . ;
+ *(.text)
+ etext = ALIGN( 0x10 ) ;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ *(.data)
+ edata = ALIGN( 0x10 ) ;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ _end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/m68k/mvme162/startup/page_table.c b/c/src/lib/libbsp/m68k/mvme162/startup/page_table.c
new file mode 100644
index 0000000000..a1ad5c135b
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/startup/page_table.c
@@ -0,0 +1,202 @@
+/*
+ * $Id$
+ *
+ * This file was submitted by Eric Vaitl <vaitl@viasat.com>.
+ * The manipulation of the page table has a very positive impact on
+ * the performance of the MVME162.
+ *
+ * The following history is included verbatim from the submitter.
+ *
+ * Revision 1.8 1995/11/18 00:07:25 vaitl
+ * Modified asm statements to get rid of the register hard-codes.
+ *
+ * Revision 1.7 1995/10/27 21:00:32 vaitl
+ * Modified page table routines so application code can map
+ * VME space.
+ *
+ * Revision 1.6 1995/10/26 17:40:01 vaitl
+ * Two cache changes after reading the mvme162 users manual.
+ *
+ * 1) The users manual says that the MPU can act as a source for the
+ * VME2 chip, so I made the VME accessable memory copy-back instead
+ * of write through. I have't changed the comments yet. If this
+ * causes problems, I'll change it back.
+ *
+ * 2) The 162 book also says that IO space should be serialized as well as
+ * non-cacheable. I flipped the appropriate dttr0 and ittr0 registers. I
+ * don't think this is really necessary because we don't recover from any
+ * exceptions. If it slows down IO addresses too much, I'll change it back
+ * and see what happens.
+ *
+ * Revision 1.5 1995/10/25 19:32:38 vaitl
+ * Got it. Three problems:
+ * 1) Must cpusha instead of cinva.
+ * 2) On page descriptors the PDT field of 1 or 3 is resident. On pointer
+ * descriptors resident is 2 or 3. I was using 2 for everything.
+ * Changed it to 3 for everything.
+ * 3) Forgot to do a pflusha.
+ *
+ * Revision 1.4 1995/10/25 17:47:11 vaitl
+ * Still working on it.
+ *
+ * Revision 1.3 1995/10/25 17:16:05 vaitl
+ * Working on page table. Caching partially set up, but can't currently
+ * set tc register.
+ *
+ */
+
+#include <string.h>
+#include <page_table.h>
+
+/* All page table must fit between BASE_TABLE_ADDR and
+ MAX_TABLE_ADDR. */
+
+#define BASE_TABLE_ADDR 0x10000
+#define MAX_TABLE_ADDR 0x20000
+#define ROOT_TABLE_SIZE 512
+#define POINTER_TABLE_SIZE 512
+#define PAGE_TABLE_SIZE 256
+
+static unsigned long *root_table;
+static unsigned long *next_avail;
+
+/* Returns a zeroed out table. */
+static unsigned long *table_alloc(int size){
+ unsigned long *addr=next_avail;
+ if(((unsigned long)next_avail + size) > MAX_TABLE_ADDR){
+ return 0;
+ }
+ bzero((void *)addr,size);
+ next_avail =(unsigned long *)((unsigned long)next_avail + size);
+ return addr;
+}
+
+
+
+/*
+ void page_table_init();
+
+ This should transparently map the first 4 Meg of ram. Caching is
+ turned off from 0x00000000 to 0x00020000 (this region is used by
+ 162Bug and contains the page tables). From 0x00020000 to 0x00400000
+ we are using copy back caching. DTTR0 and ITTR0 are set up to
+ directly translate from 0x80000000-0xffffffff with caching turned
+ off and serialized. Addresses between 0x400000 and 0x80000000 are
+ illegal.
+*/
+void page_table_init(){
+
+ /* put everything in a known state */
+ page_table_teardown();
+
+ root_table=table_alloc(ROOT_TABLE_SIZE);
+
+ /* First set up TTR.
+ base address = 0x80000000
+ address mask = 0x7f
+ Ignore FC2 for match.
+ Noncachable.
+ Not write protected.*/
+ asm volatile ("movec %0,%%dtt0
+ movec %0,%%itt0"
+ :: "d" (0x807fc040));
+
+ /* Point urp and srp at root page table. */
+ asm volatile ("movec %0,%%urp
+ movec %0,%%srp"
+ :: "d" (BASE_TABLE_ADDR));
+
+ page_table_map((void *)0,0x20000, CACHE_NONE);
+ page_table_map((void *)0x20000,0x400000-0x20000,CACHE_COPYBACK);
+
+ /* Turn on paging with a 4 k page size.*/
+ asm volatile ("movec %0,%%tc"
+ :: "d" (0x8000));
+
+ /* Turn on the cache. */
+ asm volatile ("movec %0,%%cacr"
+ :: "d" (0x80008000));
+}
+
+void page_table_teardown(){
+ next_avail=(unsigned long *)BASE_TABLE_ADDR;
+ /* Turn off paging. Turn off the cache. Flush the cache. Tear down
+ the transparent translations. */
+ asm volatile ("movec %0,%%tc
+ movec %0,%%cacr
+ cpusha %%bc
+ movec %0,%%dtt0
+ movec %0,%%itt0
+ movec %0,%%dtt1
+ movec %0,%%itt1"
+ :: "d" (0) );
+}
+
+/* Identity maps addr to addr+size with caching cache_type. */
+int page_table_map(void *addr, unsigned long size, int cache_type){
+ unsigned long *pointer_table;
+ unsigned long *page_table;
+ unsigned long root_index, pointer_index, page_index;
+ /* addr must be a multiple of 4k */
+ if((unsigned long)addr & 0xfff){
+ return PTM_BAD_ADDR;
+ }
+ /* size must also be a multiple of 4k */
+ if(size & 0xfff){
+ return PTM_BAD_SIZE;
+ }
+ /* check for valid cache type */
+ if( (cache_type>CACHE_NONE) || (cache_type<CACHE_WRITE_THROUGH)){
+ return PTM_BAD_CACHE;
+ }
+
+ while(size){
+ root_index=(unsigned long)addr;
+ root_index >>= 25;
+ root_index &= 0x7f;
+
+ if(root_table[root_index]){
+ pointer_table =
+ (unsigned long *) (root_table[root_index] & 0xfffffe00);
+ }else{
+ if(!(pointer_table=table_alloc(POINTER_TABLE_SIZE))){
+ return PTM_NO_TABLE_SPACE;
+ }
+ root_table[root_index]=((unsigned long)pointer_table) + 0x03;
+ }
+
+ pointer_index=(unsigned long)addr;
+ pointer_index >>=18;
+ pointer_index &= 0x7f;
+
+ if(pointer_table[pointer_index]){
+ page_table =
+ (unsigned long *) (pointer_table[pointer_index] &
+ 0xffffff00);
+ }else{
+ if(!(page_table=table_alloc(PAGE_TABLE_SIZE))){
+ return PTM_NO_TABLE_SPACE;
+ }
+ pointer_table[pointer_index]=
+ ((unsigned long)page_table) + 0x03;
+ }
+
+ page_index=(unsigned long)addr;
+ page_index >>=12;
+ page_index &= 0x3f;
+
+ page_table[page_index] =
+ ((unsigned long) addr & 0xfffff000) + 0x03 + (cache_type << 5);
+
+ size -= 4096;
+ addr = (void *) ((unsigned long)addr + 4096);
+ }
+
+ /* Flush the ATC. Push and invalidate the cache. */
+ asm volatile ("pflusha
+ cpusha %bc");
+
+ return PTM_SUCCESS;
+}
+
+
diff --git a/c/src/lib/libbsp/m68k/mvme162/timer/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/timer/Makefile.in
new file mode 100644
index 0000000000..c2ba3476d3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=timerisr
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/m68k/mvme162/timer/timer.c b/c/src/lib/libbsp/m68k/mvme162/timer/timer.c
new file mode 100644
index 0000000000..5028ea1293
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/timer/timer.c
@@ -0,0 +1,93 @@
+/* Timer_init()
+ *
+ * This routine initializes the Tick Timer 1 on the MVME162 board.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine will not work if the optimizer is enabled
+ * for some compilers. The multiple writes
+ * may be optimized away.
+ *
+ * It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+/* Periodic tick interval */
+#define TICK_INTERVAL 0x10000U
+#define TIMER_INT_LEVEL 6
+
+rtems_unsigned32 Ttimer_val;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_isr timerisr();
+
+void Timer_initialize()
+{
+ (void) set_vector( timerisr, VBR0 * 0x10 + 0x8, 0 );
+
+ Ttimer_val = 0; /* clear timer ISR count */
+ lcsr->vector_base |= MASK_INT; /* unmask VMEchip2 interrupts */
+ lcsr->intr_clear |= 0x01000000; /* clear pending interrupt */
+ lcsr->to_ctl = 0xE7; /* prescaler to 1 MHz (see Appendix A1) */
+ lcsr->timer_cmp_1 = TICK_INTERVAL;
+ lcsr->timer_cnt_1 = 0; /* clear counter */
+ lcsr->board_ctl |= 7; /* increment, reset-on-compare, */
+ /* and clear-overflow-cnt */
+
+ lcsr->intr_level[0] |= TIMER_INT_LEVEL; /* set int level */
+ lcsr->intr_ena |= 0x01000000; /* enable tick timer 1 interrupt */
+}
+
+#define AVG_OVERHEAD 3U /* It typically takes 3.0 microseconds */
+ /* (3 countdowns) to start/stop the timer. */
+#define LEAST_VALID 10U /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ rtems_unsigned32 total;
+
+ total = (Ttimer_val * TICK_INTERVAL) + lcsr->timer_cnt_1;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in one-half microsecond units */
+
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ return (total-AVG_OVERHEAD) >> 1;
+}
+
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/m68k/mvme162/timer/timerisr.s b/c/src/lib/libbsp/m68k/mvme162/timer/timerisr.s
new file mode 100644
index 0000000000..18951ef7d3
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/timer/timerisr.s
@@ -0,0 +1,47 @@
+/* timer_isr()
+ *
+ * This routine provides the ISR for the Z8036 timer on the MVME136
+ * board. The timer is set up to generate an interrupt at maximum
+ * intervals.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
+ * EISCAT Scientific Association. M.Savitski
+ *
+ * This material is a part of the MVME162 Board Support Package
+ * for the RTEMS executive. Its licensing policies are those of the
+ * RTEMS above.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+
+.set INTR_CLEAR_REG, 0xfff40074 | interrupt clear register
+.set RELOAD, 0x01000000 | clear tick 1 interrupt
+
+ PUBLIC (Ttimer_val)
+ PUBLIC (timerisr)
+SYM (timerisr):
+ move.l a0, -(a7) | save a0
+ movea.l #INTR_CLEAR_REG, a0 | a0 = addr of cmd status reg
+ ori.l #RELOAD, (a0) | reload countdown
+ addq.l #1, SYM (Ttimer_val) | increment timer value
+ move.l (a7)+, a0 | restore a0
+ rte
+
+END_CODE
+END
diff --git a/c/src/lib/libbsp/m68k/mvme162/times b/c/src/lib/libbsp/m68k/mvme162/times
new file mode 100644
index 0000000000..7f37dc4176
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/times
@@ -0,0 +1,193 @@
+#
+# Timing Test Suite Results for the Motorola MVME162 BSP
+#
+# $Id$
+#
+
+NOTE: This BSP is used submitted and no information is currently available.
+
+Board: Motorola MVME162
+CPU: Motorola MC68040
+Clock Speed:
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column A: unused
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/m68k/mvme162/tools/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/tools/Makefile.in
new file mode 100644
index 0000000000..4c363f303c
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/tools/Makefile.in
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# we use host compiler here for genoffsets. Hopefully it has same alignment!!
+USE_HOST_COMPILER=yes
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=sload
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PGMS=${ARCH}/sload
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here.
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGMS)
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+install: all
+ $(INSTALL) -m 555 ${PGMS} ${PROJECT_RELEASE}/bin
diff --git a/c/src/lib/libbsp/m68k/mvme162/tools/sload.c b/c/src/lib/libbsp/m68k/mvme162/tools/sload.c
new file mode 100644
index 0000000000..1fe0ecd421
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/tools/sload.c
@@ -0,0 +1,511 @@
+/*
+ *
+ * Copyright (c) 1994 by EISCAT Scientific Association.
+ * All Rights Reserved.
+ * M.Savitski
+ *
+ * S-record code - courtesy of Kym Newbery
+ * 8918927y@lux.levels.unisa.edu.au
+ *
+ * Loading S-records into the VMEbus memory.
+ *
+ * Loads an executable in s-record format into the MVME dual-ported
+ * memory and directs the MVME CPU to start execution.
+ * VMEbus access is done via the FORCE CPU-2CE vmeplus driver in
+ * read/write mode for loading and in mmap mode for accessing MVME registers.
+ * See mvme162.h for #define's dependent on the MVME162 setup.
+ *
+ * $Id$
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+
+#include <sys/types.h>
+#include <sys/fcntl.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <sys/vme.h>
+#include <sys/mman.h>
+
+#include "../include/bsp.h"
+
+#define FALSE 0
+#define TRUE 1
+
+#define DATA19 0
+#define DATA28 1
+#define DATA37 3
+#define HEADER 4
+#define TERMINATOR 5
+#define NONE 6
+
+unsigned int ahdtoi(unsigned char digit);
+int issrec(char *str);
+int validrec(char *str);
+void hdr2str(char *sstr, char *pstr);
+unsigned long getaddr(char *str);
+unsigned int datasize(char *str);
+void usage (void);
+int MVMEControl(u_long entry, int reset, int go);
+
+unsigned int ahdtoi(unsigned char digit)
+/* converts a hexadecimal char to an integer
+ *
+ * entry : digit = character to convert
+ * : 0..15 = result
+ * : -1 = char is not a digit
+ */
+{
+/* check digit */
+ if (!isxdigit(digit))
+ return(-1);
+
+ switch (toupper(digit)) {
+ case 'A' : return(0xA);
+ case 'B' : return(0xB);
+ case 'C' : return(0xC);
+ case 'D' : return(0xD);
+ case 'E' : return(0xE);
+ case 'F' : return(0xF);
+ default : return(digit - 0x30);
+ }
+}
+
+int issrec(char *str)
+/* attempts to identify the type of Srecord string passed
+ *
+ * entry : str = pointer to null terminated string
+ * returns : 0,1,2,3,5,7,8,9 for S0..S9 except S6 & S4
+ * : -1 = invalid header or header not found
+ * : -2 = invalid header number
+ */
+{
+/* Check first character for S */
+ if ((isupper(str[0]) && (str[0] == 'S')) || (islower(str[0]) && (str[0] == 's')))
+ {
+ /* check for valid header number */
+ switch (str[1]) {
+ case '0' : return 0; /* header record */
+ case '1' : return 1; /* data record, 2byte addr */
+ case '2' : return 2; /* " " , 3byte addr */
+ case '3' : return 3; /* " " , 4byte addr */
+ case '5' : return 5; /* number of S1,S2,S3 blocks */
+ case '7' : return 7; /* S3 terminator */
+ case '8' : return 8; /* S2 terminator */
+ case '9' : return 9; /* S1 terminator */
+ default : return -2; /* all others are invalid */
+ }
+ }
+ return(-1);
+}
+
+int validrec(char *str)
+/* Tests for a valid srecord. tests checksum & for nondigit characters
+ * doesn't rely on any other srecord routines.
+ *
+ * entry : str = pointer to null terminated string
+ * returns : -1 = srecord contains invalid characters
+ * : -2 = srecord checksum is invalid
+ * : -3 = srecord record length is invalid
+ * : 0 = srecord is valid
+ */
+{
+ int cn = 1, rlen=0;
+ int mchksum=0, rchksum=0;
+
+/* first check if there are any non-digit characters except S */
+ while (str[cn]!=0)
+ if (!isxdigit(str[cn++]))
+ return(-1);
+
+/* test number of data bytes */
+ rlen = ahdtoi(str[2])* 0x10 + ahdtoi(str[3]);
+ if (((strlen(str)-4)/2U) != rlen) return(-3);
+
+/* get checksum from string */
+ rchksum = ahdtoi(str[rlen*2+2])*0x10 + ahdtoi(str[rlen*2+3]); /* string chksum */
+
+/* now calculate my own checksum */
+ for (cn=2; cn <= rlen*2; )
+ mchksum += ahdtoi(str[cn++])*0x10 + ahdtoi(str[cn++]);
+ mchksum = ~mchksum & 0xFF;
+ if (mchksum != rchksum) return(-2); /* return -2 in not equal */
+
+/* return OK if we didn't fail any of these tests */
+ return(0);
+}
+
+void hdr2str(char *sstr, char *pstr)
+/* converts header record (S0) string into a plain string
+ *
+ * entry : sstr = pointer to S0 string record
+ * exit : pstr = pointer to string long enough to hold string
+ * (caller must allocate enough space for string)
+ */
+{
+ int rlen, cn, pn=0;
+
+ rlen = ahdtoi(sstr[2])*0x10 + ahdtoi(sstr[3]);
+ for (cn=8; cn <= rlen*2; )
+ pstr[pn++] = ahdtoi(sstr[cn++])*0x10 + ahdtoi(sstr[cn++]);
+ pstr[pn]=0;
+}
+
+unsigned long getaddr(char *str)
+/* returns the address of the srecord in str. assumes record is valid.
+ *
+ * entry : str = pointer to srecord string
+ * exit : address of data, word or long.
+ */
+{
+ unsigned long addr=0;
+
+ switch (issrec(str)) {
+ case 0 :
+ case 1 :
+ case 5 :
+ case 9 : addr = ahdtoi(str[4])*0x1000 + ahdtoi(str[5])*0x100
+ + ahdtoi(str[6])*0x10 + ahdtoi(str[7]);
+ return(addr);
+ case 2 :
+ case 8 : addr = ahdtoi(str[4])*0x100000 + ahdtoi(str[5])*0x10000
+ + ahdtoi(str[6])*0x1000 + ahdtoi(str[7])*0x100
+ + ahdtoi(str[8])*0x10 + ahdtoi(str[9]);
+ return(addr);
+ case 3 :
+ case 7 : addr = ahdtoi(str[4])*0x10000000 + ahdtoi(str[5])*0x1000000
+ + ahdtoi(str[6])*0x100000 + ahdtoi(str[7])*0x10000
+ + ahdtoi(str[8])*0x1000 + ahdtoi(str[9])*0x100
+ + ahdtoi(str[10])*0x10 + ahdtoi(str[11]);
+ return(addr);
+ default : return(-1);
+ }
+}
+
+unsigned int datasize(char *str)
+/*
+ * returns the number of data bytes in the srecord. assumes record is valid.
+ *
+ * entry : str = pointer to srecord string
+ * exit : number of bytes of data in the data field.
+ */
+{
+ unsigned int size=0;
+
+ switch (issrec(str)) {
+ case 0 :
+ case 1 :
+ case 5 :
+ case 7 :
+ case 8 :
+ case 9 : size = ahdtoi(str[2])*0x10 + ahdtoi(str[3]);
+ return(size-3);
+ case 2 : size = ahdtoi(str[2])*0x10 + ahdtoi(str[3]);
+ return(size-4);
+ case 3 : size = ahdtoi(str[2])*0x10 + ahdtoi(str[3]);
+ return(size-5);
+ default : return(-1);
+ }
+}
+
+void usage (void)
+/*
+ * prints correct usage on stdout
+ */
+{
+ printf("\nUSAGE : sload [-v][-g][-r] [file]\n");
+ printf(" file is an s-record file\n");
+ printf(" -v for verbose summary of s-records loaded\n");
+ printf(" -g to start execution\n");
+ printf(" -r to reset MVME162\n\n");
+}
+
+int MVMEControl(u_long entry, int reset, int go)
+/* Controls MVME-162 from other VME master:
+ * if entry != 0, loads it as start address
+ * if go != 0, starts program execution from entry
+ * if reset != 0, resets mvme162's local bus
+ * Depends upon #define'ed GROUP_BASE_ADDRESS and BOARD_BASE_ADDRESS
+ * which in turn are set by the 162-BUG's ENV command.
+ */
+{
+ int vme;
+ char vmedev[32] = "/dev/vme16d32"; /* d32 is important !!! */
+ u_long pagesize;
+ struct gcsr *gcsr_map;
+
+ pagesize = sysconf(_SC_PAGESIZE); /* mmap likes to be page-aligned */
+
+ if ((vme = open(vmedev, O_RDWR)) == -1) {
+ perror("open");
+ fprintf(stderr, "Cannot open vme as %s to access GCSR\n", vmedev);
+ return 1;
+ }
+
+/* "MAP_SHARED" is important here */
+ gcsr_map = (struct gcsr *) mmap(0, 0x1000, PROT_WRITE|PROT_READ, MAP_SHARED,
+ vme, (u_long)gcsr_vme / pagesize * pagesize);
+ if (gcsr_map == (struct gcsr *) - 1) {
+ perror("mmap");
+ fprintf(stderr, "Cannot mmap() to remote bus address 0x%08X\n",
+ (u_long)gcsr_vme / pagesize * pagesize);
+ return 1;
+ }
+
+/*
+ * use GCSR to start execution in MVME162
+ * adjust pointer to compensate for page alignement
+ */
+ gcsr_map = (struct gcsr *)((u_long)gcsr_map + (u_long)gcsr_vme % pagesize);
+
+ if (reset) { /* reset the local bus... */
+ gcsr_map->board_scr |= 0x80;
+ }
+ if (entry) { /* ...load start address... */
+ gcsr_map->gpr[0] = entry >> 16U;
+ gcsr_map->gpr[1] = entry & 0x0000FFFF;
+ }
+ if (go) { /* ... and kick it in the ass! */
+ gcsr_map->lmsig = 0x1;
+ }
+}
+
+/*=================================================================== */
+main(int argc, char *argv[])
+{
+ char inpstr[256];
+ u_char image[256];
+ char hdrstr[64];
+ int i, j, k, result, size, line=0, lastrec=0;
+ long addr, tsize=0, naddr=0, blksize=0, blknum=1;
+ FILE *in;
+ char infile[256] = "";
+ char vmedev[32] = "/dev/vme32d32"; /* Assume "/dev/vme32d32" */
+ int vme, verbose = 0, go = 0, reset = 0, havefile = 0;
+
+/* Parse the command line */
+
+ --argc;
+
+ while (argv++, argc--) {
+ if (**argv != '-') {
+ strcpy(infile, *argv);
+ havefile = 1;
+ } else if (!strcmp(*argv, "-v")) {
+ verbose = 1;
+ } else if (!strcmp(*argv, "-g")) {
+ go = 1;
+ } else if (!strcmp(*argv, "-r")) {
+ reset = 1;
+/* } else if (!strcmp(*argv, "-vme32")) { */
+/* strcpy(vmedev, "/dev/vme32d32"); */
+/* } else if (!strcmp(*argv, "-vme24")) { */
+/* strcpy(vmedev, "/dev/vme24d32"); */
+/* } else if (!strcmp(*argv, "-vme16")) { */
+/* strcpy(vmedev, "/dev/vme16d32"); */
+ } else if (!strcmp(*argv, "-")) {
+ usage();
+ exit(0);
+ } else {
+ usage();
+ exit(0);
+ }
+ }
+
+ if (!havefile) {
+ if (!reset && !go) {
+ usage();
+ }
+ else {
+ MVMEControl(0, reset, go);
+ }
+ exit(0);
+ }
+
+ if ((in = fopen(infile, "r")) == NULL) {
+ perror("open");
+ fprintf(stderr, "Cannot open input file %s\n", infile);
+ exit(1);
+ }
+
+ if ((vme = open(vmedev, O_RDWR)) == -1) {
+ fprintf(stderr, "Cannot open vme as %s\n", vmedev);
+ }
+
+ while (fscanf(in, "%s", &inpstr) != EOF) {
+ line++;
+ if (validrec(inpstr) == 0) {
+ switch (issrec(inpstr)) {
+ case 0 :
+ hdr2str(inpstr, hdrstr);
+ if (verbose) printf("HEADER string = `%s'\n", hdrstr);
+ lastrec=HEADER;
+ break;
+ case 1 :
+ addr = getaddr(inpstr);
+ size = datasize(inpstr);
+ if (blksize == 0) {
+ blksize+=size;
+ naddr=addr+size;
+ if (verbose) printf("DATA\tS19\t$%04lX", addr);
+ lastrec=DATA19;
+ }
+ else if ((blksize!=0) && (addr==naddr)) {
+ blksize+=size;
+ naddr=addr+size;
+ }
+ else {
+ if (verbose) printf("\t$%04lX\t%lu", naddr-1, blksize);
+ if (verbose) printf("\t%d\n", blknum);
+ blknum+=1;
+ naddr=addr+size;
+ blksize=size;
+ if (verbose) printf("DATA\tS19\t$%04lX", addr);
+ lastrec=DATA19;
+ }
+ tsize += size;
+ if (vme == -1) break;
+ for (i = 0, j = 8, k = size; k-- > 0; i += 1, j += 2) {
+ image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]);
+ }
+ if (lseek(vme, addr, SEEK_SET) == -1) {
+ fprintf(stderr, "lseek() to vme address %08X failed\n", addr);
+ }
+ else {
+ if (write(vme, (u_char *)image, size) != size) {
+ fprintf(stderr, "Write to vme address %08X failed\n", addr);
+ }
+ }
+ break;
+ case 2 :
+ addr = getaddr(inpstr);
+ size = datasize(inpstr);
+ if (blksize == 0) {
+ blksize+=size;
+ naddr=addr+size;
+ if (verbose) printf("DATA\tS28\t$%06lX",addr);
+ lastrec=DATA28;
+ }
+ else if ((blksize!=0) && (addr==naddr)) {
+ blksize+=size;
+ naddr=addr+size;
+ }
+ else {
+ if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);
+ if (verbose) printf("\t%d\n",blknum);
+ blknum+=1;
+ naddr=addr+size;
+ blksize=size;
+ if (verbose) printf("DATA\tS28\t$%06lX",addr);
+ lastrec=DATA28;
+ }
+ tsize += size;
+ if (vme == -1) break;
+ for (i = 0, j = 10, k = size; k-- > 0; i += 1, j += 2) {
+ image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]);
+ }
+ if (lseek(vme, addr, SEEK_SET) == -1) {
+ fprintf(stderr, "lseek() to vme address %08X failed\n", addr);
+ }
+ else {
+ if (write(vme, (u_char *)image, size) != size) {
+ fprintf(stderr, "Write to vme address %08X failed\n", addr);
+ }
+ }
+ break;
+ case 3 :
+ addr = getaddr(inpstr);
+ size = datasize(inpstr);
+ if (blksize == 0) {
+ blksize+=size;
+ naddr=addr+size;
+ if (verbose) printf("DATA\tS37\t$%08lX",addr);
+ lastrec=DATA37;
+ }
+ else if ((blksize!=0) && (addr==naddr)) {
+ blksize+=size;
+ naddr=addr+size;
+ }
+ else {
+ if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);
+ if (verbose) printf("\t%d\n",blknum);
+ blknum+=1;
+ naddr=addr+size;
+ blksize=size;
+ if (verbose) printf("DATA\tS37\t$%08lX",addr);
+ lastrec=DATA37;
+ }
+ tsize += size;
+ if (vme == -1) break;
+ for (i = 0, j = 12, k = size; k-- > 0; i += 1, j += 2) {
+ image[i] = ahdtoi(inpstr[j])*0x10 + ahdtoi(inpstr[j+1]);
+ }
+ if (lseek(vme, addr, SEEK_SET) == -1) {
+ fprintf(stderr, "lseek() to vme address %08X failed\n", addr);
+ }
+ else {
+ if (write(vme, (u_char *)image, size) != size) {
+ fprintf(stderr, "Write to vme address %08X failed\n", addr);
+ }
+ }
+ break;
+ case 7 :
+ if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}
+ if (verbose) printf("\t%d\n",blknum);
+ addr = getaddr(inpstr);
+ if (verbose) printf("TERM\tS37");
+ printf("\nExecution address = $%08lX\n", addr);
+ lastrec=TERMINATOR;
+ break;
+ case 8 :
+ if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}
+ if (verbose) printf("\t%d\n",blknum);
+ addr = getaddr(inpstr);
+ if (verbose) printf("TERM\tS28");
+ printf("\nExecution address = $%06lX\n", addr);
+ lastrec=TERMINATOR;
+ break;
+ case 9 :
+ if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}
+ if (verbose) printf("\t%d\n",blknum);
+ addr = getaddr(inpstr);
+ if (verbose) printf("TERM\tS19");
+ printf("\nExecution address = $%04lX\n", addr);
+ lastrec=TERMINATOR;
+ break;
+ }
+ }
+ else {
+ printf("\nError on line %d. ",line);
+ switch (validrec(inpstr)) {
+ case -1 : {printf("SRecord contains invalid characters.\n"); break; }
+ case -2 : {printf("SRecord checksum is invalid.\n"); break;}
+ case -3 : {printf("SRecord length is invalid.\n"); break;}
+ }
+ exit(1);
+ }
+ }
+
+ if ((lastrec==DATA19) || (lastrec==DATA28) || (lastrec==DATA37)) {
+ if (lastrec==DATA19){if (verbose) printf("\t$%04lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA28){if (verbose) printf("\t$%06lX\t%lu",naddr-1,blksize);}
+ if (lastrec==DATA37){if (verbose) printf("\t$%08lX\t%lu",naddr-1,blksize);}
+ if (verbose) printf("\t%d\n",blknum);
+ printf("ERROR: terminator record not found.\n");
+ }
+ else {
+ for (i = 0x000FFFF; i-- > 0;) ; /* mystique delay... */
+ MVMEControl(addr, reset, go);
+ }
+ if (verbose) printf("total data size = %lu bytes\n", tsize);
+}
diff --git a/c/src/lib/libbsp/m68k/mvme162/wrapup/Makefile.in b/c/src/lib/libbsp/m68k/mvme162/wrapup/Makefile.in
new file mode 100644
index 0000000000..bd06f5f90f
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/mvme162/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/m68k/shared/setvec.c b/c/src/lib/libbsp/m68k/shared/setvec.c
new file mode 100644
index 0000000000..04c99b6981
--- /dev/null
+++ b/c/src/lib/libbsp/m68k/shared/setvec.c
@@ -0,0 +1,39 @@
+/*
+ *
+ * This routine installs an interrupt vector using the basic
+ * RTEMS mechanisms. This implementation should be suitable for
+ * most m68k based boards. However, if the board has an unusual
+ * interrupt controller or most somehow manipulate board specific
+ * hardware to enable/disable, mask, prioritize, etc an interrupt
+ * source, then this routine should be customized to support that.
+ *
+ * COPYRIGHT (c) 1989-1997. 1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+m68k_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ m68k_isr_entry previous_isr;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ _CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr );
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/mips/README b/c/src/lib/libbsp/mips/README
new file mode 100644
index 0000000000..805ed6c193
--- /dev/null
+++ b/c/src/lib/libbsp/mips/README
@@ -0,0 +1,3 @@
+The MIPS bsp are now called p4600 and p4650, referring to which cpu they use.
+The same bsp sub-directory can be used, the cpu is selected by the bsp
+specific makefiles (p4600.cfg and p4650.cfg).
diff --git a/c/src/lib/libbsp/mips/p4000/README b/c/src/lib/libbsp/mips/p4000/README
new file mode 100644
index 0000000000..31152f15ec
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/README
@@ -0,0 +1,47 @@
+#
+# README,v 1.2 1995/05/31 16:56:03 joel Exp
+#
+# @(#)README 08/20/96 1.2
+#
+
+BSP NAME: p4000
+BOARD: Algorithmics P4000 SBC
+BUS: N/A
+CPU FAMILY: mips
+CPU: IDT 4650
+COPROCESSORS: N/A
+MODE: 32 bit mode
+
+DEBUG MONITOR: IDT/SIM
+
+PERIPHERALS
+===========
+TIMERS: 4650 internal
+ RESOLUTION: half of internal clock frequency
+SERIAL PORTS: IDT/SIM controlled
+REAL-TIME CLOCK: none
+DMA: none
+VIDEO: none
+SCSI: none
+NETWORKING: none
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: 4650 internal
+IOSUPP DRIVER: N/A
+SHMSUPP: N/A
+TIMER DRIVER: 4650 internal
+TTY DRIVER: uses IDT/SIM
+
+STDIO
+=====
+PORT: Console port 0
+ELECTRICAL: RS-232
+BAUD: 9600
+BITS PER CHARACTER: 8
+PARITY: None
+STOP BITS: 1
+
+NOTES
+=====
+
diff --git a/c/src/lib/libbsp/mips/p4000/bsp_specs b/c/src/lib/libbsp/mips/p4000/bsp_specs
new file mode 100644
index 0000000000..7d3a7361f5
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: idt_csu.o%s
+{!pg:
+g: idt_csu.o%s
+{!g:
+p: idt_csu.o%s
+!p: idt_csu.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/mips/p4000/console/console.c b/c/src/lib/libbsp/mips/p4000/console/console.c
new file mode 100644
index 0000000000..e898fb1003
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/console/console.c
@@ -0,0 +1,276 @@
+/*
+ * This file contains the IDT 4650 console IO package.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/console/console.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)console.c 08/20/96 1.6\n";
+ */
+
+
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <ctype.h>
+
+char idtsim_getchar( void );
+void idtsim_putchar( char c );
+void mips_leddisplay( char a, char b, char c, char d );
+
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ *ch = '\0'; /* return NULL for no particular reason */
+ return(TRUE);
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SOURCE.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SOURCE
+ */
+
+char inbyte( void )
+{
+ /*
+ * If polling, wait until a character is available.
+ */
+
+ return idtsim_getchar();
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SOURCE. It may support
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+#define NUM_LEDS 4
+ static unsigned int cur_led = 0;
+ static unsigned char led_chars[NUM_LEDS];
+
+ /*
+ * If polling, wait for the transmitter to be ready.
+ * Check for flow control requests and process.
+ * Then output the character.
+ */
+
+ idtsim_putchar( ch );
+
+ /* print out first four alpha numeric characters in a line */
+ if ( ch == '\n' )
+ {
+ mips_leddisplay( led_chars[0], led_chars[1], led_chars[2], led_chars[3] );
+ cur_led = 0;
+ }
+ else if ( isalnum( (unsigned char) ch ) && cur_led < NUM_LEDS )
+ {
+ led_chars[cur_led++] = ch;
+ }
+
+}
+
+
+#if 0
+static int console_fd = -1;
+#endif
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+#if 0
+ int console_fd = open("tty0", 2); /* open for read/write */
+#endif
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+#if 0
+ if ( console_fd )
+ close( console_fd );
+#endif
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/mips/p4000/console/led.S b/c/src/lib/libbsp/mips/p4000/console/led.S
new file mode 100644
index 0000000000..e62b82e041
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/console/led.S
@@ -0,0 +1,23 @@
+/*
+ * $Id$
+ */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtmon.h>
+#include <rtems/score/idtcpu.h>
+
+
+FRAME(mips_leddisplay,sp,0,ra)
+ j ra
+ nop
+ENDFRAME(mips_leddisplay)
+
+FRAME(sbddisplay,sp,0,ra)
+ j ra
+ENDFRAME(sbddisplay)
+
+
+FRAME(sbdblank,sp,0,ra)
+ j ra
+ENDFRAME(sbdblank)
+
diff --git a/c/src/lib/libbsp/mips/p4000/include/bsp.h b/c/src/lib/libbsp/mips/p4000/include/bsp.h
new file mode 100644
index 0000000000..697a269a49
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/include/bsp.h
@@ -0,0 +1,132 @@
+/* bsp.h
+ *
+ * This include file contains all board IO definitions.
+ *
+ * XXX : put yours in here
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)bsp.h 03/15/96 1.1 */
+
+#ifndef __P4000_BSP_h
+#define __P4000_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
+
+extern void WriteDisplay( char * string );
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Stuff for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 0, 1 )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+extern unsigned32 mips_get_timer( void );
+
+#define CPU_CLOCK_RATE_MHZ (50)
+#define CLOCKS_PER_MICROSECOND ( CPU_CLOCK_RATE_MHZ ) /* equivalent to CPU clock speed in MHz */
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ *
+ * NOTE: This macro generates a warning like "integer constant out
+ * of range" which is safe to ignore. In 64 bit mode, unsigned32
+ * types are actually 64 bits long so that comparisons between
+ * unsigned32 types and pointers are valid. The warning is caused
+ * by code in the delay macro that is necessary for 64 bit mode.
+ */
+
+#define delay( microseconds ) \
+ { \
+ unsigned32 _end_clock = mips_get_timer() + microseconds * CLOCKS_PER_MICROSECOND; \
+ _end_clock %= 0x100000000; /* make sure result is 32 bits */ \
+ \
+ /* handle timer overflow, if necessary */ \
+ while ( _end_clock < mips_get_timer() ); \
+ \
+ while ( _end_clock > mips_get_timer() ); \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+int bsp_start(
+ int argc,
+ char **argv,
+ char **environp
+);
+
+void bsp_cleanup( void );
+
+mips_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/mips/p4000/include/coverhd.h b/c/src/lib/libbsp/mips/p4000/include/coverhd.h
new file mode 100644
index 0000000000..084b3861e8
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/include/coverhd.h
@@ -0,0 +1,116 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)coverhd.h 04/08/96 1.3 */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 5
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 4
+#define CALLING_OVERHEAD_TASK_CREATE 6
+#define CALLING_OVERHEAD_TASK_IDENT 4
+#define CALLING_OVERHEAD_TASK_START 5
+#define CALLING_OVERHEAD_TASK_RESTART 4
+#define CALLING_OVERHEAD_TASK_DELETE 4
+#define CALLING_OVERHEAD_TASK_SUSPEND 4
+#define CALLING_OVERHEAD_TASK_RESUME 4
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 5
+#define CALLING_OVERHEAD_TASK_MODE 4
+#define CALLING_OVERHEAD_TASK_GET_NOTE 5
+#define CALLING_OVERHEAD_TASK_SET_NOTE 5
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 9
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 4
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 5
+#define CALLING_OVERHEAD_CLOCK_GET 9
+#define CALLING_OVERHEAD_CLOCK_SET 8
+#define CALLING_OVERHEAD_CLOCK_TICK 3
+
+#define CALLING_OVERHEAD_TIMER_CREATE 4
+#define CALLING_OVERHEAD_TIMER_IDENT 4
+#define CALLING_OVERHEAD_TIMER_DELETE 4
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 6
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 10
+#define CALLING_OVERHEAD_TIMER_RESET 4
+#define CALLING_OVERHEAD_TIMER_CANCEL 4
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 5
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 4
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 4
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 5
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 5
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 5
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 5
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 4
+
+#define CALLING_OVERHEAD_EVENT_SEND 4
+#define CALLING_OVERHEAD_EVENT_RECEIVE 5
+#define CALLING_OVERHEAD_SIGNAL_CATCH 5
+#define CALLING_OVERHEAD_SIGNAL_SEND 4
+#define CALLING_OVERHEAD_PARTITION_CREATE 6
+#define CALLING_OVERHEAD_PARTITION_IDENT 4
+#define CALLING_OVERHEAD_PARTITION_DELETE 4
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 4
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 4
+#define CALLING_OVERHEAD_REGION_CREATE 6
+#define CALLING_OVERHEAD_REGION_IDENT 4
+#define CALLING_OVERHEAD_REGION_DELETE 4
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 5
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 4
+#define CALLING_OVERHEAD_PORT_CREATE 6
+#define CALLING_OVERHEAD_PORT_IDENT 4
+#define CALLING_OVERHEAD_PORT_DELETE 4
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 4
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 4
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 5
+#define CALLING_OVERHEAD_IO_OPEN 5
+#define CALLING_OVERHEAD_IO_CLOSE 5
+#define CALLING_OVERHEAD_IO_READ 5
+#define CALLING_OVERHEAD_IO_WRITE 5
+#define CALLING_OVERHEAD_IO_CONTROL 5
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 4
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 3
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/mips/p4000/liblnk/lnklib.S b/c/src/lib/libbsp/mips/p4000/liblnk/lnklib.S
new file mode 100644
index 0000000000..ae2509ce3c
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/liblnk/lnklib.S
@@ -0,0 +1,62 @@
+/*
+ * $Id$
+ */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+
+#define ENDFRAME(name) \
+ .end name
+
+#define PROM_LINK(name,entry) \
+ .globl name; \
+ .ent name; \
+name: la $2,+entry; \
+ j $2; \
+ .end name
+
+#define PROM_ENTRY(x) (0xbfc00000+((x)*8))
+
+#define PROM_RESET PROM_ENTRY(0)
+#define PROM_NOT_IMP PROM_ENTRY(1)
+#define PROM_RESTART PROM_ENTRY(2)
+#define PROM_REINIT PROM_ENTRY(3)
+#define PROM_GETCHAR PROM_ENTRY(11)
+#define PROM_PUTCHAR PROM_ENTRY(12)
+#define PROM_SHOWCHAR PROM_ENTRY(13)
+#define PROM_PRINTF PROM_ENTRY(16)
+#define PROM_RETURN PROM_ENTRY(17)
+
+#define PROM_RGETS PROM_ENTRY(25)
+#define PROM_FLUSHCACHE PROM_ENTRY(28)
+#define PROM_CLEARCACHE PROM_ENTRY(29)
+#define PROM_SETJMP PROM_ENTRY(30)
+#define PROM_LONGJMP PROM_ENTRY(31)
+
+ .text
+
+PROM_LINK(idtsim_putchar, PROM_PUTCHAR)
+PROM_LINK(idtsim_getchar, PROM_GETCHAR)
+PROM_LINK(idtsim_showchar, PROM_SHOWCHAR)
+PROM_LINK(idtsim__exit, PROM_RETURN)
+PROM_LINK(idtsim_reinit, PROM_REINIT)
+PROM_LINK(idtsim_restart, PROM_RESTART)
+PROM_LINK(idtsim_reset, PROM_RESET)
+PROM_LINK(idtsim_promexit, PROM_RETURN)
+PROM_LINK(idtsim_setjmp, PROM_SETJMP)
+PROM_LINK(idtsim_longjmp, PROM_LONGJMP)
+
+FRAME(idtsim_init_sbrk,sp,0,ra)
+ j ra
+ENDFRAME(idtsim_init_sbrk)
+
+FRAME(idtsim_init_file,sp,0,ra)
+ j ra
+ENDFRAME(idtsim_init_file)
+
diff --git a/c/src/lib/libbsp/mips/p4000/start/start.S b/c/src/lib/libbsp/mips/p4000/start/start.S
new file mode 100644
index 0000000000..8dc31c8999
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/start/start.S
@@ -0,0 +1,299 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*************************************************************************
+**
+** Copyright 1991-95 Integrated Device Technology, Inc.
+** All Rights Reserved
+**
+** idt_csu.S -- IDT stand alone startup code
+**
+**************************************************************************/
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+
+.extern _fbss,4 /* this is defined by the linker */
+.extern end,4 /* this is defined by the linker */
+
+.lcomm sim_mem_cfg_struct,12
+
+ .text
+
+
+#define TMP_STKSIZE 1024
+
+/**************************************************************************
+**
+** start - Typicl standalone start up code required for R3000/R4000
+**
+**
+** 1) Initialize the STATUS Register
+** a) Clear parity error bit
+** b) Set co_processor 1 usable bit ON
+** c) Clear all IntMask Enables
+** d) Set kernel/disabled mode
+** 2) Initialize Cause Register
+** a) clear software interrupt bits
+** 3) Determine FPU installed or not
+** if not, clear CoProcessor 1 usable bit
+** 4) Clear bss area
+** 5) MUST allocate temporary stack until memory size determined
+** It MUST be uncached to prevent overwriting when caches are cleared
+** 6) Install exception handlers
+** 7) Determine memory and cache sizes
+** 8) Establish permanent stack (cached or uncached as defined by bss)
+** 9) Flush Instruction and Data caches
+** 10) If there is a Translation Lookaside Buffer, Clear the TLB
+** 11) Execute initialization code if the IDT/c library is to be used
+**
+** 12) Jump to user's "main()"
+** 13) Jump to promexit
+**
+** IDT/C 5.x defines _R3000, IDT/C 6.x defines _R4000 internally.
+** This is used to mark code specific to R3xxx or R4xxx processors.
+** IDT/C 6.x defines __mips to be the ISA level for which we're
+** generating code. This is used to make sure the stack etc. is
+** double word aligned, when using -mips3 (default) or -mips2,
+** when compiling with IDT/C6.x
+**
+***************************************************************************/
+
+FRAME(start,sp,0,ra)
+
+ .set noreorder
+#ifdef _R3000
+ li v0,SR_PE|SR_CU1 /* reset parity error and set */
+ /* cp1 usable */
+#endif
+#ifdef _R4000
+#if __mips==3 || defined(R4650)
+ li v0,SR_CU1|SR_DE|SR_FR /* initally clear ERL, enable FPA 64bit regs*/
+ /* 4650: Need fr to be set anyway */
+#else
+ li v0,SR_CU1|SR_DE /* initally clear ERL, enable FPA 32bit regs*/
+#endif mips3
+#endif
+
+ mtc0 v0,C0_SR /* clr IntMsks/ kernel/disabled mode */
+ nop
+ mtc0 zero,C0_CAUSE /* clear software interrupts */
+ nop
+
+#ifdef _R4000
+ li v0,CFG_C_NONCOHERENT # initialise default cache mode
+ mtc0 v0,C0_CONFIG
+#endif
+
+/*
+** check to see if an fpu is really plugged in
+*/
+ li t3,0xaaaa5555 /* put a's and 5's in t3 */
+ mtc1 t3,fp0 /* try to write them into fp0 */
+ mtc1 zero,fp1 /* try to write zero in fp */
+ mfc1 t0,fp0
+ mfc1 t1,fp1
+ nop
+ bne t0,t3,1f /* branch if no match */
+ nop
+ bne t1,zero,1f /* double check for positive id */
+ nop
+ /* We have a FPU. clear fcsr */
+ ctc1 zero, fcr31
+ j 2f /* status register already correct */
+ nop
+1:
+#ifdef _R3000
+ li v0, SR_PE /* reset parity error/NO cp1 usable */
+#endif
+
+#ifdef _R4000
+ li v0,SR_DE /* clear ERL and disable FPA */
+#endif
+
+ mtc0 v0, C0_SR /* reset status register */
+2:
+ la gp, _gp
+
+ la v0,_fbss /* clear bss before using it */
+ la v1,end /* end of bss */
+3: sw zero,0(v0)
+ bltu v0,v1,3b
+ add v0,4
+
+
+/************************************************************************
+**
+** Temporary Stack - needed to handle stack saves until
+** memory size is determined and permanent stack set
+**
+** MUST be uncached to avoid confusion at cache
+** switching during memory sizing
+**
+*************************************************************************/
+#if __mips==3
+ /* For MIPS 3, we need to be sure that the stack is aligned on a
+ * double word boundary.
+ */
+ andi t0, v0, 0x7
+ beqz t0, 11f /* Last three bits Zero, already aligned */
+ nop
+ add v0, 4
+11:
+#endif
+
+ or v0, K1BASE /* switch to uncached */
+ add v1, v0, TMP_STKSIZE /* end of bss + length of tmp stack */
+ sub v1, v1, (4*4) /* overhead */
+ move sp, v1 /* set sp to top of stack */
+4: sw zero, 0(v0)
+ bltu v0, v1, 4b /* clear out temp stack */
+ add v0, 4
+
+ jal init_exc_vecs /* install exception handlers */
+ nop /* MUST do before memory probes */
+
+ la v0, 5f
+ li v1, K1BASE /* force into uncached space */
+ or v0, v1 /* during memory/cache probes */
+ j v0
+ nop
+5:
+ la a0, sim_mem_cfg_struct
+ jal sim_mem_cfg /* Make SIM call to get mem size */
+ nop
+ la a0, sim_mem_cfg_struct
+ lw a0, 0(a0) /* Get memory size from struct */
+#ifdef _R3000
+ jal config_Icache
+ nop
+ jal config_Dcache /* determine size of D & I caches */
+ nop
+#endif
+#ifdef _R4000
+ jal config_cache /* determine size of D & I caches */
+ nop
+#endif
+
+ move v0, a0 /* mem_size */
+
+#if __mips==3
+ /* For MIPS 3, we need to be sure that the stack (and hence v0
+ * here) is aligned on a double word boundary.
+ */
+ andi t0, v0, 0x7
+ beqz t0, 12f /* Last three bits Zero, already aligned */
+ nop
+ subu v0, 4 /* mem_size was not aligned on doubleword bdry????*/
+12:
+#endif
+
+
+
+/**************************************************************************
+**
+** Permanent Stack - now know top of memory, put permanent stack there
+**
+***************************************************************************/
+
+ la t2, _fbss /* cache mode as linked */
+ and t2, 0xF0000000 /* isolate segment */
+ la t1, 6f
+ j t1 /* back to original cache mode */
+ nop
+6:
+ or v0, t2 /* stack back to original cache mode */
+ addiu v0,v0,-16 /* overhead */
+ move sp, v0 /* now replace count w top of memory */
+ move v1, v0
+ subu v1, P_STACKSIZE /* clear requested stack size */
+
+7: sw zero, 0(v1) /* clear P_STACKSIZE stack */
+ bltu v1,v0,7b
+ add v1, 4
+ .set reorder
+
+#ifdef _R3000
+ jal flush_Icache
+ jal flush_Dcache /* flush Data & Instruction caches */
+#endif
+#ifdef _R4000
+ jal flush_cache_nowrite /* flush Data & Instruction caches */
+#endif
+
+
+
+/**************************************************************************
+**
+** If this chip supports a Translation Lookaside Buffer, clear it
+**
+***************************************************************************/
+
+ .set noreorder
+ mfc0 t1, C0_SR /* look at Status Register */
+ nop
+ .set reorder
+#ifdef _R3000
+ li t2, SR_TS /* TLB Shutdown bit */
+ and t1,t2 /* TLB Shutdown if 1 */
+ bnez t1, 8f /* skip clearing if no TLB */
+#endif
+
+#ifndef R4650
+ jal init_tlb /* clear the tlb */
+#endif
+
+
+/************************************************************************
+**
+** Initialization required if using IDT/c or libc.a, standard C Lib
+**
+** can SKIP if not necessary for application
+**
+************************************************************************/
+8:
+
+ jal idtsim_init_sbrk
+ jal idtsim_init_file
+/*********************** END I/O initialization **********************/
+
+
+ jal main
+
+ jal idtsim_promexit
+
+ENDFRAME(start)
+
+
+ .globl sim_mem_cfg
+sim_mem_cfg:
+ .set noat
+ .set noreorder
+ li AT, (0xbfc00000+((55)*8))
+ jr AT
+ nop
+ .set at
+ .set reorder
diff --git a/c/src/lib/libbsp/mips/p4000/startup/bspclean.c b/c/src/lib/libbsp/mips/p4000/startup/bspclean.c
new file mode 100644
index 0000000000..f59599ee36
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/startup/bspclean.c
@@ -0,0 +1,35 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and usually returns
+ * control to a monitor.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)bspclean.c 03/15/96 1.1\n";
+ */
+
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+void bsp_cleanup( void )
+{
+}
diff --git a/c/src/lib/libbsp/mips/p4000/startup/ghlinkcmds b/c/src/lib/libbsp/mips/p4000/startup/ghlinkcmds
new file mode 100644
index 0000000000..cf2a80bf8d
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/startup/ghlinkcmds
@@ -0,0 +1,15 @@
+-map
+-sec
+{
+ .text 0x80010000 :
+ .data align(16) :
+ .rodata :
+ .fini :
+# .sdata :
+ .symtab :
+ .strtab :
+ .debug :
+# .sbss :
+ .bss align(8) :
+ .init 0xbfc00000 :
+}
diff --git a/c/src/lib/libbsp/mips/p4000/startup/idtmem.S b/c/src/lib/libbsp/mips/p4000/startup/idtmem.S
new file mode 100644
index 0000000000..70a7096877
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/startup/idtmem.S
@@ -0,0 +1,938 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+
+*/
+
+/************************************************************************
+**
+** idtmem.s - memory and cache functions
+**
+** Copyright 1991 Integrated Device Technology, Inc.
+** All Rights Reserved
+**
+**************************************************************************/
+
+/*
+ * 950313: Ketan fixed bugs in mfc0/mtc0 hazards, and removed hack
+ * to set mem_size.
+ */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+ .data
+mem_size:
+ .word 0
+dcache_size:
+ .word 0
+icache_size:
+#if defined(CPU_R3000)
+ .word MINCACHE
+#endif
+#if defined(CPU_R4000)
+ .word 0
+#endif
+
+#if defined(CPU_R4000)
+ .data
+scache_size:
+ .word 0
+icache_linesize:
+ .word 0
+dcache_linesize:
+ .word 0
+scache_linesize:
+ .word 0
+#endif
+
+
+ .text
+
+#if defined (CPU_R3000)
+#define CONFIGFRM ((2*4)+4)
+
+/*************************************************************************
+**
+** Config_Dcache() -- determine size of Data cache
+**
+**************************************************************************/
+
+FRAME(config_Dcache,sp, CONFIGFRM, ra)
+ .set noreorder
+ subu sp,CONFIGFRM
+ sw ra,CONFIGFRM-4(sp) /* save return address */
+ sw s0,4*4(sp) /* save s0 in first regsave slot */
+ mfc0 s0,C0_SR /* save SR */
+ nop
+ mtc0 zero,C0_SR /* disable interrupts */
+ .set reorder
+ jal _size_cache /* returns Data cache size in v0 */
+ sw v0, dcache_size /* save it */
+ and s0, ~SR_PE /* do not clear PE */
+ .set noreorder
+ mtc0 s0,C0_SR /* restore SR */
+ nop
+ .set reorder
+ lw s0, 4*4(sp) /* restore s0 */
+ lw ra,CONFIGFRM-4(sp) /* restore ra */
+ addu sp,CONFIGFRM /* pop stack */
+ j ra
+ENDFRAME(config_Dcache)
+
+
+/*************************************************************************
+**
+** Config_Icache() -- determine size of Instruction cache
+** MUST be run in uncached mode/handled in idt_csu.s
+**
+**************************************************************************/
+
+FRAME(config_Icache,sp, CONFIGFRM, ra)
+ .set noreorder
+ subu sp,CONFIGFRM
+ sw ra,CONFIGFRM-4(sp) /* save return address */
+ sw s0,4*4(sp) /* save s0 in first regsave slot */
+ mfc0 s0,C0_SR /* save SR */
+ nop
+ mtc0 zero, C0_SR /* disable interrupts */
+ li v0,SR_SWC /* swap caches/disable ints */
+ mtc0 v0,C0_SR
+ nop
+ .set reorder
+ jal _size_cache /* returns instruction cache size */
+ .set noreorder
+ mtc0 zero,C0_SR /* swap back caches */
+ nop
+ and s0,~SR_PE /* do not inadvertantly clear PE */
+ mtc0 s0,C0_SR /* restore SR */
+ nop
+ .set reorder
+ sw v0, icache_size /* save it AFTER caches back */
+ lw s0,4*4(sp) /* restore s0 */
+ lw ra,CONFIGFRM-4(sp) /* restore ra */
+ addu sp,CONFIGFRM /* pop stack */
+ j ra
+ENDFRAME(config_Icache)
+
+/************************************************************************
+**
+** _size_cache()
+** returns cache size in v0
+**
+************************************************************************/
+
+FRAME(_size_cache,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR /* save current sr */
+ nop
+ and t0,~SR_PE /* do not inadvertently clear PE */
+ or v0,t0,SR_ISC /* isolate cache */
+ mtc0 v0,C0_SR
+ /*
+ * First check if there is a cache there at all
+ */
+ move v0,zero
+ li v1,0xa5a5a5a5 /* distinctive pattern */
+ sw v1,K0BASE /* try to write into cache */
+ lw t1,K0BASE /* try to read from cache */
+ nop
+ mfc0 t2,C0_SR
+ nop
+ .set reorder
+ and t2,SR_CM
+ bne t2,zero,3f /* cache miss, must be no cache */
+ bne v1,t1,3f /* data not equal -> no cache */
+ /*
+ * Clear cache size boundries to known state.
+ */
+ li v0,MINCACHE
+1:
+ sw zero,K0BASE(v0)
+ sll v0,1
+ ble v0,MAXCACHE,1b
+
+ li v0,-1
+ sw v0,K0BASE(zero) /* store marker in cache */
+ li v0,MINCACHE /* MIN cache size */
+
+2: lw v1,K0BASE(v0) /* Look for marker */
+ bne v1,zero,3f /* found marker */
+ sll v0,1 /* cache size * 2 */
+ ble v0,MAXCACHE,2b /* keep looking */
+ move v0,zero /* must be no cache */
+ .set noreorder
+3: mtc0 t0,C0_SR /* restore sr */
+ j ra
+ nop
+ENDFRAME(_size_cache)
+ .set reorder
+
+
+#define FLUSHFRM (2*4)
+
+/***************************************************************************
+**
+** flush_Dcache() - flush entire Data cache
+**
+****************************************************************************/
+FRAME(flush_Dcache,sp,FLUSHFRM,ra)
+ lw t2, dcache_size
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ beq t2,zero,_Dflush_done /* no D cache, get out! */
+ nop
+ li v0, SR_ISC /* isolate cache */
+ mtc0 v0, C0_SR
+ nop
+ .set reorder
+ li t0,K0BASE /* set loop registers */
+ or t1,t0,t2
+
+2: sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bne t0,t1,2b
+
+ .set noreorder
+_Dflush_done:
+ mtc0 t3,C0_SR /* restore Status Register */
+ .set reorder
+ j ra
+ENDFRAME(flush_Dcache)
+
+
+/***************************************************************************
+**
+** flush_Icache() - flush entire Instruction cache
+**
+** NOTE: Icache can only be flushed/cleared when uncached
+** Code forces into uncached memory regardless of calling mode
+**
+****************************************************************************/
+FRAME(flush_Icache,sp,FLUSHFRM,ra)
+ lw t1,icache_size
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ la v0,1f
+ li v1,K1BASE
+ or v0,v1
+ j v0 /* force into non-cached space */
+ nop
+1:
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ beq t1,zero,_Iflush_done /* no i-cache get out */
+ nop
+ li v0,SR_ISC|SR_SWC /* disable intr, isolate and swap */
+ mtc0 v0,C0_SR
+ li t0,K0BASE
+ .set reorder
+ or t1,t0,t1
+
+1: sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bne t0,t1,1b
+ .set noreorder
+_Iflush_done:
+ mtc0 t3,C0_SR /* un-isolate, enable interrupts */
+ .set reorder
+ j ra
+ENDFRAME(flush_Icache)
+
+/**************************************************************************
+**
+** clear_Dcache(base_addr, byte_count) - flush portion of Data cache
+**
+** a0 = base address of portion to be cleared
+** a1 = byte count of length
+**
+***************************************************************************/
+FRAME(clear_Dcache,sp,0,ra)
+
+ lw t2, dcache_size /* Data cache size */
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ nop
+ nop
+ .set reorder
+ /*
+ * flush data cache
+ */
+
+ .set noreorder
+ nop
+ li v0,SR_ISC /* isolate data cache */
+ mtc0 v0,C0_SR
+ .set reorder
+ bltu t2,a1,1f /* cache is smaller than region */
+ move t2,a1
+1: addu t2,a0 /* ending address + 1 */
+ move t0,a0
+
+1: sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bltu t0,t2,1b
+
+ .set noreorder
+ mtc0 t3,C0_SR /* un-isolate, enable interrupts */
+ nop
+ .set reorder
+ j ra
+ENDFRAME(clear_Dcache)
+
+
+/**************************************************************************
+**
+** clear_Icache(base_addr, byte_count) - flush portion of Instruction cache
+**
+** a0 = base address of portion to be cleared
+** a1 = byte count of length
+**
+** NOTE: Icache can only be flushed/cleared when uncached
+** Code forces into uncached memory regardless of calling mode
+**
+***************************************************************************/
+FRAME(clear_Icache,sp,0,ra)
+
+ lw t1, icache_size /* Instruction cache size */
+ /*
+ * flush text cache
+ */
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ la v0,1f
+ li v1,K1BASE
+ or v0,v1
+ j v0 /* force into non-cached space */
+ nop
+1:
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ nop
+ nop
+ li v0,SR_ISC|SR_SWC /* disable intr, isolate and swap */
+ mtc0 v0,C0_SR
+ .set reorder
+ bltu t1,a1,1f /* cache is smaller than region */
+ move t1,a1
+1: addu t1,a0 /* ending address + 1 */
+ move t0,a0
+
+ sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bltu t0,t1,1b
+ .set noreorder
+ mtc0 t3,C0_SR /* un-isolate, enable interrupts */
+ nop
+ nop
+ nop /* allow time for caches to swap */
+ .set reorder
+ j ra
+ENDFRAME(clear_Icache)
+
+
+/**************************************************************************
+**
+** get_mem_conf - get memory configuration
+**
+***************************************************************************/
+
+
+FRAME(get_mem_conf,sp,0,ra)
+
+ lw t6, mem_size
+ sw t6, 0(a0)
+ lw t7, icache_size
+ sw t7, 4(a0)
+ lw t8, dcache_size
+ sw t8, 8(a0)
+ j ra
+
+ENDFRAME(get_mem_conf)
+#endif /* defined CPU_R3000 */
+
+#if defined(CPU_R4000)
+#define LEAF(label) FRAME(label,sp,0,ra)
+#define XLEAF(label) \
+ .globl label ; \
+label:
+#define END(label) ENDFRAME(label)
+
+/*
+ * cacheop macro to automate cache operations
+ * first some helpers...
+ */
+#define _mincache(size, maxsize) \
+ bltu size,maxsize,8f ; \
+ move size,maxsize ; \
+8:
+
+#define _align(tmp, minaddr, maxaddr, linesize) \
+ subu tmp,linesize,1 ; \
+ not tmp ; \
+ and minaddr,tmp ; \
+ addu maxaddr,-1 ; \
+ and maxaddr,tmp
+
+/* This is a bit of a hack really because it relies on minaddr=a0 */
+#define _doop1(op1) \
+ cache op1,0(a0)
+
+#define _doop2(op1, op2) \
+ cache op1,0(a0) ; \
+ cache op2,0(a0)
+
+/* specials for cache initialisation */
+#define _doop1lw1(op1) \
+ cache op1,0(a0) ; \
+ lw zero,0(a0) ; \
+ cache op1,0(a0)
+
+#define _doop121(op1,op2) \
+ cache op1,0(a0) ; \
+ nop; \
+ cache op2,0(a0) ; \
+ nop; \
+ cache op1,0(a0)
+
+#define _oploopn(minaddr, maxaddr, linesize, tag, ops) \
+ .set noreorder ; \
+7: _doop##tag##ops ; \
+ bne minaddr,maxaddr,7b ; \
+ addu minaddr,linesize ; \
+ .set reorder
+
+/* finally the cache operation macros */
+#define icacheopn(kva, n, cache_size, cache_linesize, tag, ops) \
+ _mincache(n, cache_size); \
+ blez n,9f ; \
+ addu n,kva ; \
+ _align(t1, kva, n, cache_linesize) ; \
+ _oploopn(kva, n, cache_linesize, tag, ops) ; \
+9:
+
+#define vcacheopn(kva, n, cache_size, cache_linesize, tag, ops) \
+ blez n,9f ; \
+ addu n,kva ; \
+ _align(t1, kva, n, cache_linesize) ; \
+ _oploopn(kva, n, cache_linesize, tag, ops) ; \
+9:
+
+#define icacheop(kva, n, cache_size, cache_linesize, op) \
+ icacheopn(kva, n, cache_size, cache_linesize, 1, (op))
+
+#define vcacheop(kva, n, cache_size, cache_linesize, op) \
+ vcacheopn(kva, n, cache_size, cache_linesize, 1, (op))
+
+ .text
+
+/*
+ * static void _size_cache() R4000
+ *
+ * Internal routine to determine cache sizes by looking at R4000 config
+ * register. Sizes are returned in registers, as follows:
+ * t2 icache size
+ * t3 dcache size
+ * t6 scache size
+ * t4 icache line size
+ * t5 dcache line size
+ * t7 scache line size
+ */
+LEAF(_size_cache)
+ mfc0 t0,C0_CONFIG
+
+ and t1,t0,CFG_ICMASK
+ srl t1,CFG_ICSHIFT
+ li t2,0x1000
+ sll t2,t1
+
+ and t1,t0,CFG_DCMASK
+ srl t1,CFG_DCSHIFT
+ li t3,0x1000
+ sll t3,t1
+
+ li t4,32
+ and t1,t0,CFG_IB
+ bnez t1,1f
+ li t4,16
+1:
+
+ li t5,32
+ and t1,t0,CFG_DB
+ bnez t1,1f
+ li t5,16
+1:
+
+ move t6,zero # default to no scache
+ move t7,zero #
+
+ and t1,t0,CFG_C_UNCACHED # test config register
+ bnez t1,1f # no scache if uncached/non-coherent
+
+ li t6,0x100000 # assume 1Mb scache <<-NOTE
+ and t1,t0,CFG_SBMASK
+ srl t1,CFG_SBSHIFT
+ li t7,16
+ sll t7,t1
+1: j ra
+END(_size_cache)
+
+
+/*
+ * void config_cache() R4000
+ *
+ * Work out size of I, D & S caches, assuming they are already initialised.
+ */
+LEAF(config_cache)
+ lw t0,icache_size
+ bgtz t0,8f # already known?
+ move v0,ra
+ bal _size_cache
+ move ra,v0
+
+ sw t2,icache_size
+ sw t3,dcache_size
+ sw t6,scache_size
+ sw t4,icache_linesize
+ sw t5,dcache_linesize
+ sw t7,scache_linesize
+8: j ra
+END(config_cache)
+
+
+/*
+ * void _init_cache() R4000
+ */
+LEAF(_init_cache)
+ /*
+ * First work out the sizes
+ */
+ move v0,ra
+ bal _size_cache
+ move ra,v0
+
+ /*
+ * The caches may be in an indeterminate state,
+ * so we force good parity into them by doing an
+ * invalidate, load/fill, invalidate for each line.
+ */
+
+ /* disable all i/u and cache exceptions */
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ or v1,SR_DE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ /* assume bottom of RAM will generate good parity for the cache */
+ li a0,PHYS_TO_K0(0)
+ move a2,t2 # icache_size
+ move a3,t4 # icache_linesize
+ move a1,a2
+ icacheopn(a0,a1,a2,a3,121,(Index_Store_Tag_I,Fill_I))
+
+ li a0,PHYS_TO_K0(0)
+ move a2,t3 # dcache_size
+ move a3,t5 # dcache_linesize
+ move a1,a2
+ icacheopn(a0,a1,a2,a3,1lw1,(Index_Store_Tag_D))
+
+ /* assume unified I & D in scache <<-NOTE */
+ blez t6,1f
+ li a0,PHYS_TO_K0(0)
+ move a2,t6
+ move a3,t7
+ move a1,a2
+ icacheopn(a0,a1,a2,a3,1lw1,(Index_Store_Tag_SD))
+
+1: mtc0 v0,C0_SR
+ j ra
+END(_init_cache)
+
+
+/*
+ * void flush_cache (void) R4000
+ *
+ * Flush and invalidate all caches
+ */
+LEAF(flush_cache)
+ /* secondary cacheops do all the work if present */
+ lw a2,scache_size
+ blez a2,1f
+ lw a3,scache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_SD)
+ b 2f
+
+1:
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+ lw a2,dcache_size
+ lw a3,dcache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_D)
+
+2: j ra
+END(flush_cache)
+
+/*
+ * void flush_cache_nowrite (void) R4000
+ *
+ * Invalidate all caches
+ */
+LEAF(flush_cache_nowrite)
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+ lw a2,dcache_size
+ lw a3,dcache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
+
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_SD)
+
+2: mtc0 v0,C0_SR
+ j ra
+END(flush_cache_nowrite)
+
+/*
+ * void clean_cache (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate address range in all caches
+ */
+LEAF(clean_cache)
+XLEAF(clear_cache)
+
+ /* secondary cacheops do all the work (if fitted) */
+ lw a2,scache_size
+ blez a2,1f
+ lw a3,scache_linesize
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_SD)
+ b 2f
+
+1: lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+ /* save kva & n for subsequent loop */
+ move t8,a0
+ move t9,a1
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_I)
+
+ lw a2,dcache_size
+ lw a3,dcache_linesize
+ /* restore kva & n */
+ move a0,t8
+ move a1,t9
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_D)
+
+2: j ra
+END(clean_cache)
+
+/*
+ * void clean_dcache (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate address range in primary data cache
+ */
+LEAF(clean_dcache)
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_D)
+
+2: j ra
+END(clean_dcache)
+
+/*
+ * void clean_dcache_indexed (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate indexed range in primary data cache
+ */
+LEAF(clean_dcache_indexed)
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+#ifdef CPU_ORION
+ srl a2,1 # do one set (half cache) at a time
+ move t8,a0 # save kva & n
+ move t9,a1
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_D)
+
+ addu a0,t8,a2 # do next set
+ move a1,t9 # restore n
+#endif
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_D)
+
+2: j ra
+END(clean_dcache_indexed)
+
+/*
+ * void clean_dcache_nowrite (unsigned kva, size_t n) R4000
+ *
+ * Invalidate an address range in primary data cache
+ */
+LEAF(clean_dcache_nowrite)
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_D)
+
+2: j ra
+END(clean_dcache_nowrite)
+
+/*
+ * void clean_dcache_nowrite_indexed (unsigned kva, size_t n) R4000
+ *
+ * Invalidate indexed range in primary data cache
+ */
+LEAF(clean_dcache_nowrite_indexed)
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+#ifdef CPU_ORION
+ srl a2,1 # do one set (half cache) at a time
+ move t8,a0 # save kva & n
+ move t9,a1
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
+
+ addu a0,t8,a2 # do next set
+ move a1,t9 # restore n
+#endif
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
+
+2: mtc0 v0,C0_SR
+ j ra
+END(clean_dcache_nowrite_indexed)
+
+/*
+ * void clean_icache (unsigned kva, size_t n) R4000
+ *
+ * Invalidate address range in primary instruction cache
+ */
+LEAF(clean_icache)
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_I)
+
+2: j ra
+END(clean_icache)
+
+/*
+ * void clean_icache_indexed (unsigned kva, size_t n) R4000
+ *
+ * Invalidate indexed range in primary instruction cache
+ */
+LEAF(clean_icache_indexed)
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+
+#ifdef CPU_ORION
+ srl a2,1 # do one set (half cache) at a time
+ move t8,a0 # save kva & n
+ move t9,a1
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+ addu a0,t8,a2 # do next set
+ move a1,t9 # restore n
+#endif
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+2: j ra
+END(clean_icache_indexed)
+
+
+
+/*
+ * void clean_scache (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate address range in secondary cache
+ */
+LEAF(clean_scache)
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_SD)
+
+2: j ra
+END(clean_scache)
+
+/*
+ * void clean_scache_indexed (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate indexed range in secondary cache
+ */
+LEAF(clean_scache_indexed)
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_SD)
+
+2: j ra
+END(clean_scache_indexed)
+
+/*
+ * void clean_scache_nowrite (unsigned kva, size_t n) R4000
+ *
+ * Invalidate an address range in secondary cache
+ */
+LEAF(clean_scache_nowrite)
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_SD)
+
+2: j ra
+END(clean_scache_nowrite)
+
+/*
+ * void clean_scache_nowrite_indexed (unsigned kva, size_t n) R4000
+ *
+ * Invalidate indexed range in secondary cache
+ */
+LEAF(clean_scache_nowrite_indexed)
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_SD)
+
+2: mtc0 v0,C0_SR
+ j ra
+END(clean_scache_nowrite_indexed)
+
+/**************************************************************************
+**
+** get_mem_conf - get memory configuration R4000
+**
+***************************************************************************/
+
+
+FRAME(get_mem_conf,sp,0,ra)
+
+ lw t6, mem_size
+ sw t6, 0(a0)
+ lw t7, icache_size
+ sw t7, 4(a0)
+ lw t8, dcache_size
+ sw t8, 8(a0)
+ lw t7, scache_size
+ sw t7, 12(a0)
+ j ra
+
+ENDFRAME(get_mem_conf)
+
+#endif /* defined(CPU_R4000) */
+
+/*
+ * void set_mem_size (mem_size)
+ *
+ * config_memory()'s memory size gets written into mem_size here.
+ * Now we don't need to call config_cache() with memory size - New to IDTC6.0
+ */
+FRAME(set_memory_size,sp,0,ra)
+ sw a0, mem_size
+ j ra
+ENDFRAME(set_memory_size)
+
+
diff --git a/c/src/lib/libbsp/mips/p4000/startup/idttlb.S b/c/src/lib/libbsp/mips/p4000/startup/idttlb.S
new file mode 100644
index 0000000000..4aad7b1416
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/startup/idttlb.S
@@ -0,0 +1,390 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+
+/*
+** idttlb.s - fetch the registers associated with and the contents
+** of the tlb.
+**
+*/
+/* 950308: Ketan patched a few tlb functions that would not have worked.*/
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+
+ .text
+
+#if defined(CPU_R3000)
+/*
+** ret_tlblo -- returns the 'entrylo' contents for the TLB
+** 'c' callable - as ret_tlblo(index) - where index is the
+** tlb entry to return the lo value for - if called from assembly
+** language then index should be in register a0.
+*/
+FRAME(ret_tlblo,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR # save sr
+ nop
+ and t0,~SR_PE # dont inadvertantly clear PE
+ mtc0 zero,C0_SR # clear interrupts
+ mfc0 t1,C0_TLBHI # save pid
+ sll a0,TLBINX_INXSHIFT # position index
+ mtc0 a0,C0_INX # write to index register
+ nop
+ tlbr # put tlb entry in entrylo and hi
+ nop
+ mfc0 v0,C0_TLBLO # get the requested entry lo
+ mtc0 t1,C0_TLBHI # restore pid
+ mtc0 t0,C0_SR # restore status register
+ j ra
+ nop
+ .set reorder
+ENDFRAME(ret_tlblo)
+#endif
+#if defined(CPU_R4000)
+/*
+** ret_tlblo[01] -- returns the 'entrylo' contents for the TLB
+** 'c' callable - as ret_tlblo(index) - where index is the
+** tlb entry to return the lo value for - if called from assembly
+** language then index should be in register a0.
+*/
+FRAME(ret_tlblo0,sp,0,ra)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # clear interrupts
+ mfc0 t1,C0_TLBHI # save pid
+ mtc0 a0,C0_INX # write to index register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # put tlb entry in entrylo and hi
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_TLBLO0 # get the requested entry lo
+ mtc0 t1,C0_TLBHI # restore pid
+ mtc0 t0,C0_SR # restore status register
+ j ra
+ENDFRAME(ret_tlblo0)
+
+FRAME(ret_tlblo1,sp,0,ra)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # clear interrupts
+ mfc0 t1,C0_TLBHI # save pid
+ mtc0 a0,C0_INX # write to index register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # put tlb entry in entrylo and hi
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_TLBLO1 # get the requested entry lo
+ mtc0 t1,C0_TLBHI # restore pid
+ mtc0 t0,C0_SR # restore status register
+ j ra
+ENDFRAME(ret_tlblo1)
+
+/*
+** ret_pagemask(index) -- return pagemask contents of tlb entry "index"
+*/
+FRAME(ret_pagemask,sp,0,ra)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ mtc0 a0,C0_INX # drop it in C0 register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # read entry to entry hi/lo
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_PAGEMASK # to return value
+ mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+ENDFRAME(ret_pagemask)
+
+/*
+** ret_tlbwired(void) -- return wired register
+*/
+FRAME(ret_tlbwired,sp,0,ra)
+ mfc0 v0,C0_WIRED
+ j ra
+ENDFRAME(ret_tlbwired)
+#endif
+
+/*
+** ret_tlbhi -- return the tlb entry high content for tlb entry
+** index
+*/
+FRAME(ret_tlbhi,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 t0,C0_SR # save sr
+ nop
+ and t0,~SR_PE
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ sll a0,TLBINX_INXSHIFT # position index
+ mtc0 a0,C0_INX # drop it in C0 register
+ nop
+ tlbr # read entry to entry hi/lo
+ nop
+ mfc0 v0,C0_TLBHI # to return value
+ mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ mtc0 a0,C0_INX # drop it in C0 register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # read entry to entry hi/lo0/lo1/mask
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_TLBHI # to return value
+ mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+#endif
+ENDFRAME(ret_tlbhi)
+
+/*
+** ret_tlbpid() -- return tlb pid contained in the current entry hi
+*/
+FRAME(ret_tlbpid,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 v0,C0_TLBHI # fetch tlb high
+ nop
+ and v0,TLBHI_PIDMASK # isolate and position
+ srl v0,TLBHI_PIDSHIFT
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ mfc0 v0,C0_TLBHI # to return value
+ nop
+ and v0,TLBHI_PIDMASK
+ j ra
+#endif
+ENDFRAME(ret_tlbpid)
+
+/*
+** tlbprobe(address, pid) -- probe the tlb to see if address is currently
+** mapped
+** a0 = vpn - virtual page numbers are 0=0 1=0x1000, 2=0x2000...
+** virtual page numbers for the r3000 are in
+** entry hi bits 31-12
+** a1 = pid - this is a process id ranging from 0 to 63
+** this process id is shifted left 6 bits and or'ed into
+** the entry hi register
+** returns an index value (0-63) if successful -1 -f not
+*/
+FRAME(tlbprobe,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 t0,C0_SR /* fetch status reg */
+ and a0,TLBHI_VPNMASK /* isolate just the vpn */
+ and t0,~SR_PE /* don't inadvertantly clear pe */
+ mtc0 zero,C0_SR
+ mfc0 t1,C0_TLBHI
+ sll a1,TLBHI_PIDSHIFT /* possition the pid */
+ and a1,TLBHI_PIDMASK
+ or a0,a1 /* build entry hi value */
+ mtc0 a0,C0_TLBHI
+ nop
+ tlbp /* do the probe */
+ nop
+ mfc0 v1,C0_INX
+ li v0,-1
+ bltz v1,1f
+ nop
+ sra v0,v1,TLBINX_INXSHIFT /* get index positioned for return */
+1:
+ mtc0 t1,C0_TLBHI /* restore tlb hi */
+ mtc0 t0,C0_SR /* restore the status reg */
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ and a0,TLBHI_VPN2MASK # construct tlbhi for probe
+ and a1,TLBHI_PIDMASK
+ or a0,a1
+ mtc0 a0,C0_TLBHI
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbp # probe entry to entry hi/lo0/lo1/mask
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v1,C0_INX
+ li v0,-1
+ bltz v1,1f
+ move v0,v1
+1: mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+#endif
+ENDFRAME(tlbprobe)
+
+/*
+** resettlb(index) Invalidate the TLB entry specified by index
+*/
+FRAME(resettlb,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 t0,C0_TLBHI # fetch the current hi
+ mfc0 v0,C0_SR # fetch the status reg.
+ li t2,K0BASE&TLBHI_VPNMASK
+ and v0,~SR_PE # dont inadvertantly clear PE
+ mtc0 zero,C0_SR
+ mtc0 t2,C0_TLBHI # set up tlbhi
+ mtc0 zero,C0_TLBLO
+ sll a0,TLBINX_INXSHIFT
+ mtc0 a0,C0_INX
+ nop
+ tlbwi # do actual invalidate
+ nop
+ mtc0 t0,C0_TLBHI
+ mtc0 v0,C0_SR
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ li t2,K0BASE&TLBHI_VPN2MASK
+ mfc0 t0,C0_TLBHI # save current TLBHI
+ mfc0 v0,C0_SR # save SR and disable interrupts
+ mtc0 zero,C0_SR
+ mtc0 t2,C0_TLBHI # invalidate entry
+ mtc0 zero,C0_TLBLO0
+ mtc0 zero,C0_TLBLO1
+ mtc0 a0,C0_INX
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbwi
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mtc0 t0,C0_TLBHI
+ mtc0 v0,C0_SR
+ j ra
+#endif
+ENDFRAME(resettlb)
+
+#if defined(CPU_R3000)
+/*
+** Setup TLB entry
+**
+** map_tlb(index, tlbhi, phypage)
+** a0 = TLB entry index
+** a1 = virtual page number and PID
+** a2 = physical page
+*/
+FRAME(map_tlb,sp,0,ra)
+ .set noreorder
+ sll a0,TLBINX_INXSHIFT
+ mfc0 v0,C0_SR # fetch the current status
+ mfc0 a3,C0_TLBHI # save the current hi
+ and v0,~SR_PE # dont inadvertantly clear parity
+
+ mtc0 zero,C0_SR
+ mtc0 a1,C0_TLBHI # set the hi entry
+ mtc0 a2,C0_TLBLO # set the lo entry
+ mtc0 a0,C0_INX # load the index
+ nop
+ tlbwi # put the hi/lo in tlb entry indexed
+ nop
+ mtc0 a3,C0_TLBHI # put back the tlb hi reg
+ mtc0 v0,C0_SR # restore the status register
+ j ra
+ nop
+ .set reorder
+ENDFRAME(map_tlb)
+ #endif
+#if defined(CPU_R4000)
+/*
+** Setup R4000 TLB entry
+**
+** map_tlb4000(mask_index, tlbhi, pte_even, pte_odd)
+** a0 = TLB entry index and page mask
+** a1 = virtual page number and PID
+** a2 = pte -- contents of even pte
+** a3 = pte -- contents of odd pte
+*/
+FRAME(map_tlb4000,sp,0,ra)
+ and t2,a0,TLBPGMASK_MASK
+ and a0,TLBINX_INXMASK
+ mfc0 t1,C0_TLBHI # save current TLBPID
+ mfc0 v0,C0_SR # save SR and disable interrupts
+ mtc0 zero,C0_SR
+ mtc0 t2,C0_PAGEMASK # set
+ mtc0 a1,C0_TLBHI # set VPN and TLBPID
+ mtc0 a2,C0_TLBLO0 # set PPN and access bits
+ mtc0 a3,C0_TLBLO1 # set PPN and access bits
+ mtc0 a0,C0_INX # set INDEX to wired entry
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbwi # drop it in
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mtc0 t1,C0_TLBHI # restore TLBPID
+ mtc0 v0,C0_SR # restore SR
+ j ra
+ENDFRAME(map_tlb4000)
+#endif
+
+
+/*
+** Set current TLBPID. This assumes PID is positioned correctly in reg.
+** a0.
+*/
+FRAME(set_tlbpid,sp,0,ra)
+ .set noreorder
+ mtc0 a0,C0_TLBHI
+ j ra
+ nop
+ .set reorder
+ENDFRAME(set_tlbpid)
+
diff --git a/c/src/lib/libbsp/mips/p4000/startup/inittlb.c b/c/src/lib/libbsp/mips/p4000/startup/inittlb.c
new file mode 100644
index 0000000000..e61f0043be
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/startup/inittlb.c
@@ -0,0 +1,16 @@
+/*
+ * $Id$
+ */
+
+#include <rtems/score/idtcpu.h>
+
+extern void resettlb( int i );
+
+void init_tlb(void)
+{
+ int i;
+
+ for (i = 0; i < N_TLB_ENTRIES; i++ )
+ resettlb(i);
+}
+
diff --git a/c/src/lib/libbsp/mips/p4000/startup/linkcmds b/c/src/lib/libbsp/mips/p4000/startup/linkcmds
new file mode 100644
index 0000000000..858317853c
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/startup/linkcmds
@@ -0,0 +1,72 @@
+/*
+ * $Id$
+ */
+
+OUTPUT_FORMAT("elf32-bigmips")
+OUTPUT_ARCH(mips)
+/* Do we need any of these for elf?
+ __DYNAMIC = 0; */
+_DYNAMIC_LINK = 0;
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ .text 0x80030000 : /* */
+/* .text 0xa0020000 : /* */
+/* .text 0x00020000 : /* */
+ {
+ _ftext = . ;
+ *(.text)
+ CREATE_OBJECT_SYMBOLS
+ _etext = .;
+ }
+ .init ALIGN(8) : { *(.init) } =0
+ .fini ALIGN(8) : { *(.fini) } =0
+ .ctors ALIGN(8) : { *(.ctors) }
+ .dtors ALIGN(8) : { *(.dtors) }
+ .rodata ALIGN(8) : { *(.rodata) }
+ .rodata1 ALIGN(8) :
+ {
+ *(.rodata1)
+ . = ALIGN(8);
+ }
+ .reginfo . : { *(.reginfo) }
+ /* also: .hash .dynsym .dynstr .plt(if r/o) .rel.got */
+ /* Read-write section, merged into data segment: */
+ .data ALIGN(16) :
+ {
+ _fdata = . ;
+ *(.data)
+ CONSTRUCTORS
+ }
+ .data1 ALIGN(8) : { *(.data1) }
+ _gp = . + 0x8000;
+ .lit8 . : { *(.lit8) }
+ .lit4 . : { *(.lit4) }
+ /* also (before uninitialized portion): .dynamic .got .plt(if r/w)
+ (or does .dynamic go into its own segment?) */
+ /* We want the small data sections together, so single-instruction offsets
+ can access them all, and initialized data all before uninitialized, so
+ we can shorten the on-disk segment size. */
+ .sdata ALIGN(8) : { *(.sdata) }
+ _edata = .;
+ __bss_start = ALIGN(8);
+ _fbss = .;
+ .sbss ALIGN(8) : { *(.sbss) *(.scommon) }
+ .bss ALIGN(8) :
+ {
+ *(.bss)
+ *(COMMON)
+ _end = . ;
+ end = . ;
+ }
+ /* Debug sections. These should never be loadable, but they must have
+ zero addresses for the debuggers to work correctly. */
+ .line 0 : { *(.line) }
+ .debug 0 : { *(.debug) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+}
+
diff --git a/c/src/lib/libbsp/mips/p4000/startup/setvec.c b/c/src/lib/libbsp/mips/p4000/startup/setvec.c
new file mode 100644
index 0000000000..0f6d3c5ce3
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/startup/setvec.c
@@ -0,0 +1,53 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the target Board/CPU.
+ * This routine is allowed to be as board dependent as necessary.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)setvec.c 04/25/96 1.2\n";
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+mips_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ mips_isr_entry previous_isr;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ /* XXX: install non-RTEMS ISR as "raw" interupt */
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/mips/p4000/times b/c/src/lib/libbsp/mips/p4000/times
new file mode 100644
index 0000000000..6a3dbfe1fb
--- /dev/null
+++ b/c/src/lib/libbsp/mips/p4000/times
@@ -0,0 +1,200 @@
+#
+# Timing Test Suite Results for the NO_BSP
+#
+# NOTE: This is just a template. The times are irrelevant since this BSP
+# can only be compiled -- not executed.
+#
+# times,v 1.2 1995/12/07 15:44:23 joel Exp
+#
+# @(#)times 08/01/96 1.4
+
+NOTE: To obtain the execution time in microseconds, divide the number of
+ cycles by the clock speed. For example, if rtems_semaphore create
+ is reported to be 1164 cycles, then at 66 Mhz it takes 17.64
+ microseconds or 8.75 microseconds at 133 Mhz.
+
+Board: Algorithmics P4000i
+CPU: IDT 4650
+Clock Speed: 100MHz
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles
+Timer Source: on-CPU cycle counter
+
+Column A:RTEMS compiled with 64 bit pointers and 64 bit unsigned32 types
+Column B:RTEMS compiled with 32 bit pointers and 32 bit unsigned32 types
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 788 759
+ rtems_semaphore_delete 903 945
+ rtems_semaphore_obtain: available 119 119
+ rtems_semaphore_obtain: not available -- NO_WAIT 118 118
+ rtems_semaphore_release: no waiting tasks 127 127
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 842 840
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 777 751
+
+ 4 rtems_task_restart: blocked task -- preempts caller 1611 1595
+ rtems_task_restart: ready task -- preempts caller 1253 1395
+ rtems_semaphore_release: task readied -- returns to caller 365 345
+ rtems_task_create 798 797
+ rtems_task_start 464 460
+ rtems_task_restart: suspended task -- returns to caller 517 517
+ rtems_task_delete: suspended task 529 595
+ rtems_task_restart: ready task -- returns to caller 527 525
+ rtems_task_restart: blocked task -- returns to caller 707 684
+ rtems_task_delete: blocked task 609 675
+
+ 5 rtems_task_suspend: calling task 549 549
+ rtems_task_resume: task readied -- preempts caller 702 699
+
+ 6 rtems_task_restart: calling task 291 291
+ rtems_task_suspend: returns to caller 195 194
+ rtems_task_resume: task readied -- returns to caller 198 198
+ rtems_task_delete: ready task 734 736
+
+ 7 rtems_task_restart: suspended task -- preempts caller 1049 990
+
+ 8 rtems_task_set_priority: obtain current priority 94 94
+ rtems_task_set_priority: returns to caller 418 355
+ rtems_task_mode: obtain current mode 44 43
+ rtems_task_mode: no reschedule 0 49
+ rtems_task_mode: reschedule -- returns to caller 0 232
+ rtems_task_mode: reschedule -- preempts caller 0 687
+ rtems_task_set_note 0 101
+ rtems_task_get_note 0 103
+ rtems_clock_set 0 237
+ rtems_clock_get 0 16
+
+ 9 rtems_message_queue_create 3583 3432
+ rtems_message_queue_send: no waiting tasks 252 252
+ rtems_message_queue_urgent: no waiting tasks 252 252
+ rtems_message_queue_receive: available 207 207
+ rtems_message_queue_flush: no messages flushed 95 96
+ rtems_message_queue_flush: messages flushed 110 110
+ rtems_message_queue_delete 1044 1111
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 132 131
+ rtems_message_queue_receive: not available -- caller blocks 884 892
+
+11 rtems_message_queue_send: task readied -- preempts caller 397 817
+
+12 rtems_message_queue_send: task readied -- returns to caller 397 397
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 816 817
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 397 398
+
+15 rtems_event_receive: obtain current events 5 5
+ rtems_event_receive: not available -- NO_WAIT 99 99
+ rtems_event_receive: not available -- caller blocks 689 689
+ rtems_event_send: no task readied 123 123
+ rtems_event_receive: available 326 349
+ rtems_event_send: task readied -- returns to caller 333 429
+
+16 rtems_event_send: task readied -- preempts caller 843 838
+
+17 rtems_task_set_priority: preempts caller 1002 991
+
+18 rtems_task_delete: calling task 1171 1157
+
+19 rtems_signal_catch 0 1306
+ rtems_signal_send: returns to caller 0 1019
+ rtems_signal_send: signal to self 0 496
+ exit ASR overhead: returns to calling task 0 120
+ exit ASR overhead: returns to preempting task 0 73
+
+20 rtems_partition_create 1293 1306
+ rtems_region_create 1010 1019
+ rtems_partition_get_buffer: available 481 496
+ rtems_partition_get_buffer: not available 120 120
+ rtems_partition_return_buffer 587 460
+ rtems_partition_delete 379 320
+ rtems_region_get_segment: available 179 179
+ rtems_region_get_segment: not available -- NO_WAIT 349 293
+ rtems_region_return_segment: no waiting tasks 335 322
+ rtems_region_get_segment: not available -- caller blocks 1603 1496
+ rtems_region_return_segment: task readied -- preempts caller 1616 1533
+ rtems_region_return_segment: task readied -- returns to caller 940 939
+ rtems_region_delete 301 348
+ rtems_io_initialize 9 10
+ rtems_io_open 6 6
+ rtems_io_close 6 6
+ rtems_io_read 6 6
+ rtems_io_write 6 5
+ rtems_io_control 6 6
+
+21 rtems_task_ident 1057 1058
+ rtems_message_queue_ident 963 963
+ rtems_semaphore_ident 1137 1136
+ rtems_partition_ident 962 961
+ rtems_region_ident 923 924
+ rtems_port_ident 918 917
+ rtems_timer_ident 942 941
+ rtems_rate_monotonic_ident 924 925
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 1084 1095
+ rtems_message_queue_broadcast: no waiting tasks 147 148
+ rtems_message_queue_broadcast: task readied -- preempts caller 1305 1268
+
+23 rtems_timer_create 202 201
+ rtems_timer_fire_after: inactive 261 261
+ rtems_timer_fire_after: active 271 269
+ rtems_timer_cancel: active 142 141
+ rtems_timer_cancel: inactive 122 124
+ rtems_timer_reset: inactive 222 222
+ rtems_timer_reset: active 246 245
+ rtems_timer_fire_when: inactive 312 311
+ rtems_timer_fire_when: active 358 358
+ rtems_timer_delete: active 263 263
+ rtems_timer_delete: inactive 247 247
+ rtems_task_wake_when 833 831
+
+24 rtems_task_wake_after: yield -- returns to caller 99 98
+ rtems_task_wake_after: yields -- preempts caller 479 478
+
+25 rtems_clock_tick 313 318
+
+26 _ISR_Disable 64 57
+ _ISR_Flash 51 36
+ _ISR_Enable 31 18
+ _Thread_Disable_dispatch 53 37
+ _Thread_Enable_dispatch 260 233
+ _Thread_Set_state 446 463
+ _Thread_Disptach (NO FP) 839 801
+ context switch: no floating point contexts 673 653
+ context switch: self 156 162
+ context switch: to another task 84 70
+ context switch: restore 1st FP task 1030 1013
+ fp context switch: save idle, restore idle 969 948
+ fp context switch: save idle, restore initialized 275 267
+ fp context switch: save initialized, restore initialized 319 292
+ _Thread_Resume 512 480
+ _Thread_Unblock 121 139
+ _Thread_Ready 199 203
+ _Thread_Get 27 27
+ _Semaphore_Get 20 21
+ _Thread_Get: invalid id 5 5
+
+27 interrupt entry overhead: returns to interrupted task 0 0
+ interrupt exit overhead: returns to interrupted task 27 41
+ interrupt entry overhead: returns to nested interrupt 0 0
+ interrupt exit overhead: returns to nested interrupt 0 0
+ interrupt entry overhead: returns to preempting task 0 0
+ interrupt exit overhead: returns to preempting task 0 0
+
+28 rtems_port_create 574 560
+ rtems_port_external_to_internal 87 87
+ rtems_port_internal_to_external 86 86
+ rtems_port_delete 395 353
+
+29 rtems_rate_monotonic_create 621 633
+ rtems_rate_monotonic_period: initiate period -- returns to caller 773 694
+ rtems_rate_monotonic_period: obtain status 295 284
+ rtems_rate_monotonic_cancel 408 451
+ rtems_rate_monotonic_delete: inactive 453 471
+ rtems_rate_monotonic_delete: active 332 336
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 664 686
diff --git a/c/src/lib/libbsp/mips64orion/Makefile.in b/c/src/lib/libbsp/mips64orion/Makefile.in
new file mode 100644
index 0000000000..7dbe87397c
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/Makefile.in
@@ -0,0 +1,14 @@
+#
+# Makefile,v 1.2 1995/05/31 16:56:44 joel Exp
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/mips64orion/README b/c/src/lib/libbsp/mips64orion/README
new file mode 100644
index 0000000000..805ed6c193
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/README
@@ -0,0 +1,3 @@
+The MIPS bsp are now called p4600 and p4650, referring to which cpu they use.
+The same bsp sub-directory can be used, the cpu is selected by the bsp
+specific makefiles (p4600.cfg and p4650.cfg).
diff --git a/c/src/lib/libbsp/mips64orion/p4000/README b/c/src/lib/libbsp/mips64orion/p4000/README
new file mode 100644
index 0000000000..31152f15ec
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/README
@@ -0,0 +1,47 @@
+#
+# README,v 1.2 1995/05/31 16:56:03 joel Exp
+#
+# @(#)README 08/20/96 1.2
+#
+
+BSP NAME: p4000
+BOARD: Algorithmics P4000 SBC
+BUS: N/A
+CPU FAMILY: mips
+CPU: IDT 4650
+COPROCESSORS: N/A
+MODE: 32 bit mode
+
+DEBUG MONITOR: IDT/SIM
+
+PERIPHERALS
+===========
+TIMERS: 4650 internal
+ RESOLUTION: half of internal clock frequency
+SERIAL PORTS: IDT/SIM controlled
+REAL-TIME CLOCK: none
+DMA: none
+VIDEO: none
+SCSI: none
+NETWORKING: none
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: 4650 internal
+IOSUPP DRIVER: N/A
+SHMSUPP: N/A
+TIMER DRIVER: 4650 internal
+TTY DRIVER: uses IDT/SIM
+
+STDIO
+=====
+PORT: Console port 0
+ELECTRICAL: RS-232
+BAUD: 9600
+BITS PER CHARACTER: 8
+PARITY: None
+STOP BITS: 1
+
+NOTES
+=====
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/bsp_specs b/c/src/lib/libbsp/mips64orion/p4000/bsp_specs
new file mode 100644
index 0000000000..7d3a7361f5
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: idt_csu.o%s
+{!pg:
+g: idt_csu.o%s
+{!g:
+p: idt_csu.o%s
+!p: idt_csu.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/console/Makefile.in b/c/src/lib/libbsp/mips64orion/p4000/console/Makefile.in
new file mode 100644
index 0000000000..7dfe2cbcde
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/console/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=led
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/mips64orion/p4000/console/console.c b/c/src/lib/libbsp/mips64orion/p4000/console/console.c
new file mode 100644
index 0000000000..e898fb1003
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/console/console.c
@@ -0,0 +1,276 @@
+/*
+ * This file contains the IDT 4650 console IO package.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/console/console.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)console.c 08/20/96 1.6\n";
+ */
+
+
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <ctype.h>
+
+char idtsim_getchar( void );
+void idtsim_putchar( char c );
+void mips_leddisplay( char a, char b, char c, char d );
+
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ *ch = '\0'; /* return NULL for no particular reason */
+ return(TRUE);
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SOURCE.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SOURCE
+ */
+
+char inbyte( void )
+{
+ /*
+ * If polling, wait until a character is available.
+ */
+
+ return idtsim_getchar();
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SOURCE. It may support
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+#define NUM_LEDS 4
+ static unsigned int cur_led = 0;
+ static unsigned char led_chars[NUM_LEDS];
+
+ /*
+ * If polling, wait for the transmitter to be ready.
+ * Check for flow control requests and process.
+ * Then output the character.
+ */
+
+ idtsim_putchar( ch );
+
+ /* print out first four alpha numeric characters in a line */
+ if ( ch == '\n' )
+ {
+ mips_leddisplay( led_chars[0], led_chars[1], led_chars[2], led_chars[3] );
+ cur_led = 0;
+ }
+ else if ( isalnum( (unsigned char) ch ) && cur_led < NUM_LEDS )
+ {
+ led_chars[cur_led++] = ch;
+ }
+
+}
+
+
+#if 0
+static int console_fd = -1;
+#endif
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+#if 0
+ int console_fd = open("tty0", 2); /* open for read/write */
+#endif
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+#if 0
+ if ( console_fd )
+ close( console_fd );
+#endif
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/mips64orion/p4000/console/led.S b/c/src/lib/libbsp/mips64orion/p4000/console/led.S
new file mode 100644
index 0000000000..e62b82e041
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/console/led.S
@@ -0,0 +1,23 @@
+/*
+ * $Id$
+ */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtmon.h>
+#include <rtems/score/idtcpu.h>
+
+
+FRAME(mips_leddisplay,sp,0,ra)
+ j ra
+ nop
+ENDFRAME(mips_leddisplay)
+
+FRAME(sbddisplay,sp,0,ra)
+ j ra
+ENDFRAME(sbddisplay)
+
+
+FRAME(sbdblank,sp,0,ra)
+ j ra
+ENDFRAME(sbdblank)
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/include/Makefile.in b/c/src/lib/libbsp/mips64orion/p4000/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/mips64orion/p4000/include/bsp.h b/c/src/lib/libbsp/mips64orion/p4000/include/bsp.h
new file mode 100644
index 0000000000..697a269a49
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/include/bsp.h
@@ -0,0 +1,132 @@
+/* bsp.h
+ *
+ * This include file contains all board IO definitions.
+ *
+ * XXX : put yours in here
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)bsp.h 03/15/96 1.1 */
+
+#ifndef __P4000_BSP_h
+#define __P4000_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
+
+extern void WriteDisplay( char * string );
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Stuff for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 0, 1 )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+extern unsigned32 mips_get_timer( void );
+
+#define CPU_CLOCK_RATE_MHZ (50)
+#define CLOCKS_PER_MICROSECOND ( CPU_CLOCK_RATE_MHZ ) /* equivalent to CPU clock speed in MHz */
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ *
+ * NOTE: This macro generates a warning like "integer constant out
+ * of range" which is safe to ignore. In 64 bit mode, unsigned32
+ * types are actually 64 bits long so that comparisons between
+ * unsigned32 types and pointers are valid. The warning is caused
+ * by code in the delay macro that is necessary for 64 bit mode.
+ */
+
+#define delay( microseconds ) \
+ { \
+ unsigned32 _end_clock = mips_get_timer() + microseconds * CLOCKS_PER_MICROSECOND; \
+ _end_clock %= 0x100000000; /* make sure result is 32 bits */ \
+ \
+ /* handle timer overflow, if necessary */ \
+ while ( _end_clock < mips_get_timer() ); \
+ \
+ while ( _end_clock > mips_get_timer() ); \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* miscellaneous stuff assumed to exist */
+
+int bsp_start(
+ int argc,
+ char **argv,
+ char **environp
+);
+
+void bsp_cleanup( void );
+
+mips_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/mips64orion/p4000/include/coverhd.h b/c/src/lib/libbsp/mips64orion/p4000/include/coverhd.h
new file mode 100644
index 0000000000..084b3861e8
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/include/coverhd.h
@@ -0,0 +1,116 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)coverhd.h 04/08/96 1.3 */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 5
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 4
+#define CALLING_OVERHEAD_TASK_CREATE 6
+#define CALLING_OVERHEAD_TASK_IDENT 4
+#define CALLING_OVERHEAD_TASK_START 5
+#define CALLING_OVERHEAD_TASK_RESTART 4
+#define CALLING_OVERHEAD_TASK_DELETE 4
+#define CALLING_OVERHEAD_TASK_SUSPEND 4
+#define CALLING_OVERHEAD_TASK_RESUME 4
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 5
+#define CALLING_OVERHEAD_TASK_MODE 4
+#define CALLING_OVERHEAD_TASK_GET_NOTE 5
+#define CALLING_OVERHEAD_TASK_SET_NOTE 5
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 9
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 4
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 5
+#define CALLING_OVERHEAD_CLOCK_GET 9
+#define CALLING_OVERHEAD_CLOCK_SET 8
+#define CALLING_OVERHEAD_CLOCK_TICK 3
+
+#define CALLING_OVERHEAD_TIMER_CREATE 4
+#define CALLING_OVERHEAD_TIMER_IDENT 4
+#define CALLING_OVERHEAD_TIMER_DELETE 4
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 6
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 10
+#define CALLING_OVERHEAD_TIMER_RESET 4
+#define CALLING_OVERHEAD_TIMER_CANCEL 4
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 5
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 4
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 4
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 5
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 5
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 4
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 5
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 5
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 4
+
+#define CALLING_OVERHEAD_EVENT_SEND 4
+#define CALLING_OVERHEAD_EVENT_RECEIVE 5
+#define CALLING_OVERHEAD_SIGNAL_CATCH 5
+#define CALLING_OVERHEAD_SIGNAL_SEND 4
+#define CALLING_OVERHEAD_PARTITION_CREATE 6
+#define CALLING_OVERHEAD_PARTITION_IDENT 4
+#define CALLING_OVERHEAD_PARTITION_DELETE 4
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 4
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 4
+#define CALLING_OVERHEAD_REGION_CREATE 6
+#define CALLING_OVERHEAD_REGION_IDENT 4
+#define CALLING_OVERHEAD_REGION_DELETE 4
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 5
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 4
+#define CALLING_OVERHEAD_PORT_CREATE 6
+#define CALLING_OVERHEAD_PORT_IDENT 4
+#define CALLING_OVERHEAD_PORT_DELETE 4
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 4
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 4
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 5
+#define CALLING_OVERHEAD_IO_OPEN 5
+#define CALLING_OVERHEAD_IO_CLOSE 5
+#define CALLING_OVERHEAD_IO_READ 5
+#define CALLING_OVERHEAD_IO_WRITE 5
+#define CALLING_OVERHEAD_IO_CONTROL 5
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 4
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 4
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 3
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/mips64orion/p4000/liblnk/Makefile.in b/c/src/lib/libbsp/mips64orion/p4000/liblnk/Makefile.in
new file mode 100644
index 0000000000..ac11a0e2f5
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/liblnk/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/liblnk.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=lnklib
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/mips64orion/p4000/liblnk/lnklib.S b/c/src/lib/libbsp/mips64orion/p4000/liblnk/lnklib.S
new file mode 100644
index 0000000000..ae2509ce3c
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/liblnk/lnklib.S
@@ -0,0 +1,62 @@
+/*
+ * $Id$
+ */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+
+#define ENDFRAME(name) \
+ .end name
+
+#define PROM_LINK(name,entry) \
+ .globl name; \
+ .ent name; \
+name: la $2,+entry; \
+ j $2; \
+ .end name
+
+#define PROM_ENTRY(x) (0xbfc00000+((x)*8))
+
+#define PROM_RESET PROM_ENTRY(0)
+#define PROM_NOT_IMP PROM_ENTRY(1)
+#define PROM_RESTART PROM_ENTRY(2)
+#define PROM_REINIT PROM_ENTRY(3)
+#define PROM_GETCHAR PROM_ENTRY(11)
+#define PROM_PUTCHAR PROM_ENTRY(12)
+#define PROM_SHOWCHAR PROM_ENTRY(13)
+#define PROM_PRINTF PROM_ENTRY(16)
+#define PROM_RETURN PROM_ENTRY(17)
+
+#define PROM_RGETS PROM_ENTRY(25)
+#define PROM_FLUSHCACHE PROM_ENTRY(28)
+#define PROM_CLEARCACHE PROM_ENTRY(29)
+#define PROM_SETJMP PROM_ENTRY(30)
+#define PROM_LONGJMP PROM_ENTRY(31)
+
+ .text
+
+PROM_LINK(idtsim_putchar, PROM_PUTCHAR)
+PROM_LINK(idtsim_getchar, PROM_GETCHAR)
+PROM_LINK(idtsim_showchar, PROM_SHOWCHAR)
+PROM_LINK(idtsim__exit, PROM_RETURN)
+PROM_LINK(idtsim_reinit, PROM_REINIT)
+PROM_LINK(idtsim_restart, PROM_RESTART)
+PROM_LINK(idtsim_reset, PROM_RESET)
+PROM_LINK(idtsim_promexit, PROM_RETURN)
+PROM_LINK(idtsim_setjmp, PROM_SETJMP)
+PROM_LINK(idtsim_longjmp, PROM_LONGJMP)
+
+FRAME(idtsim_init_sbrk,sp,0,ra)
+ j ra
+ENDFRAME(idtsim_init_sbrk)
+
+FRAME(idtsim_init_file,sp,0,ra)
+ j ra
+ENDFRAME(idtsim_init_file)
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/start/Makefile.in b/c/src/lib/libbsp/mips64orion/p4000/start/Makefile.in
new file mode 100644
index 0000000000..67478f0a83
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/start/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=idt_csu
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+PGM=${ARCH}/idt_csu.o
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/mips64orion/p4000/start/start.S b/c/src/lib/libbsp/mips64orion/p4000/start/start.S
new file mode 100644
index 0000000000..8dc31c8999
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/start/start.S
@@ -0,0 +1,299 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*************************************************************************
+**
+** Copyright 1991-95 Integrated Device Technology, Inc.
+** All Rights Reserved
+**
+** idt_csu.S -- IDT stand alone startup code
+**
+**************************************************************************/
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+
+.extern _fbss,4 /* this is defined by the linker */
+.extern end,4 /* this is defined by the linker */
+
+.lcomm sim_mem_cfg_struct,12
+
+ .text
+
+
+#define TMP_STKSIZE 1024
+
+/**************************************************************************
+**
+** start - Typicl standalone start up code required for R3000/R4000
+**
+**
+** 1) Initialize the STATUS Register
+** a) Clear parity error bit
+** b) Set co_processor 1 usable bit ON
+** c) Clear all IntMask Enables
+** d) Set kernel/disabled mode
+** 2) Initialize Cause Register
+** a) clear software interrupt bits
+** 3) Determine FPU installed or not
+** if not, clear CoProcessor 1 usable bit
+** 4) Clear bss area
+** 5) MUST allocate temporary stack until memory size determined
+** It MUST be uncached to prevent overwriting when caches are cleared
+** 6) Install exception handlers
+** 7) Determine memory and cache sizes
+** 8) Establish permanent stack (cached or uncached as defined by bss)
+** 9) Flush Instruction and Data caches
+** 10) If there is a Translation Lookaside Buffer, Clear the TLB
+** 11) Execute initialization code if the IDT/c library is to be used
+**
+** 12) Jump to user's "main()"
+** 13) Jump to promexit
+**
+** IDT/C 5.x defines _R3000, IDT/C 6.x defines _R4000 internally.
+** This is used to mark code specific to R3xxx or R4xxx processors.
+** IDT/C 6.x defines __mips to be the ISA level for which we're
+** generating code. This is used to make sure the stack etc. is
+** double word aligned, when using -mips3 (default) or -mips2,
+** when compiling with IDT/C6.x
+**
+***************************************************************************/
+
+FRAME(start,sp,0,ra)
+
+ .set noreorder
+#ifdef _R3000
+ li v0,SR_PE|SR_CU1 /* reset parity error and set */
+ /* cp1 usable */
+#endif
+#ifdef _R4000
+#if __mips==3 || defined(R4650)
+ li v0,SR_CU1|SR_DE|SR_FR /* initally clear ERL, enable FPA 64bit regs*/
+ /* 4650: Need fr to be set anyway */
+#else
+ li v0,SR_CU1|SR_DE /* initally clear ERL, enable FPA 32bit regs*/
+#endif mips3
+#endif
+
+ mtc0 v0,C0_SR /* clr IntMsks/ kernel/disabled mode */
+ nop
+ mtc0 zero,C0_CAUSE /* clear software interrupts */
+ nop
+
+#ifdef _R4000
+ li v0,CFG_C_NONCOHERENT # initialise default cache mode
+ mtc0 v0,C0_CONFIG
+#endif
+
+/*
+** check to see if an fpu is really plugged in
+*/
+ li t3,0xaaaa5555 /* put a's and 5's in t3 */
+ mtc1 t3,fp0 /* try to write them into fp0 */
+ mtc1 zero,fp1 /* try to write zero in fp */
+ mfc1 t0,fp0
+ mfc1 t1,fp1
+ nop
+ bne t0,t3,1f /* branch if no match */
+ nop
+ bne t1,zero,1f /* double check for positive id */
+ nop
+ /* We have a FPU. clear fcsr */
+ ctc1 zero, fcr31
+ j 2f /* status register already correct */
+ nop
+1:
+#ifdef _R3000
+ li v0, SR_PE /* reset parity error/NO cp1 usable */
+#endif
+
+#ifdef _R4000
+ li v0,SR_DE /* clear ERL and disable FPA */
+#endif
+
+ mtc0 v0, C0_SR /* reset status register */
+2:
+ la gp, _gp
+
+ la v0,_fbss /* clear bss before using it */
+ la v1,end /* end of bss */
+3: sw zero,0(v0)
+ bltu v0,v1,3b
+ add v0,4
+
+
+/************************************************************************
+**
+** Temporary Stack - needed to handle stack saves until
+** memory size is determined and permanent stack set
+**
+** MUST be uncached to avoid confusion at cache
+** switching during memory sizing
+**
+*************************************************************************/
+#if __mips==3
+ /* For MIPS 3, we need to be sure that the stack is aligned on a
+ * double word boundary.
+ */
+ andi t0, v0, 0x7
+ beqz t0, 11f /* Last three bits Zero, already aligned */
+ nop
+ add v0, 4
+11:
+#endif
+
+ or v0, K1BASE /* switch to uncached */
+ add v1, v0, TMP_STKSIZE /* end of bss + length of tmp stack */
+ sub v1, v1, (4*4) /* overhead */
+ move sp, v1 /* set sp to top of stack */
+4: sw zero, 0(v0)
+ bltu v0, v1, 4b /* clear out temp stack */
+ add v0, 4
+
+ jal init_exc_vecs /* install exception handlers */
+ nop /* MUST do before memory probes */
+
+ la v0, 5f
+ li v1, K1BASE /* force into uncached space */
+ or v0, v1 /* during memory/cache probes */
+ j v0
+ nop
+5:
+ la a0, sim_mem_cfg_struct
+ jal sim_mem_cfg /* Make SIM call to get mem size */
+ nop
+ la a0, sim_mem_cfg_struct
+ lw a0, 0(a0) /* Get memory size from struct */
+#ifdef _R3000
+ jal config_Icache
+ nop
+ jal config_Dcache /* determine size of D & I caches */
+ nop
+#endif
+#ifdef _R4000
+ jal config_cache /* determine size of D & I caches */
+ nop
+#endif
+
+ move v0, a0 /* mem_size */
+
+#if __mips==3
+ /* For MIPS 3, we need to be sure that the stack (and hence v0
+ * here) is aligned on a double word boundary.
+ */
+ andi t0, v0, 0x7
+ beqz t0, 12f /* Last three bits Zero, already aligned */
+ nop
+ subu v0, 4 /* mem_size was not aligned on doubleword bdry????*/
+12:
+#endif
+
+
+
+/**************************************************************************
+**
+** Permanent Stack - now know top of memory, put permanent stack there
+**
+***************************************************************************/
+
+ la t2, _fbss /* cache mode as linked */
+ and t2, 0xF0000000 /* isolate segment */
+ la t1, 6f
+ j t1 /* back to original cache mode */
+ nop
+6:
+ or v0, t2 /* stack back to original cache mode */
+ addiu v0,v0,-16 /* overhead */
+ move sp, v0 /* now replace count w top of memory */
+ move v1, v0
+ subu v1, P_STACKSIZE /* clear requested stack size */
+
+7: sw zero, 0(v1) /* clear P_STACKSIZE stack */
+ bltu v1,v0,7b
+ add v1, 4
+ .set reorder
+
+#ifdef _R3000
+ jal flush_Icache
+ jal flush_Dcache /* flush Data & Instruction caches */
+#endif
+#ifdef _R4000
+ jal flush_cache_nowrite /* flush Data & Instruction caches */
+#endif
+
+
+
+/**************************************************************************
+**
+** If this chip supports a Translation Lookaside Buffer, clear it
+**
+***************************************************************************/
+
+ .set noreorder
+ mfc0 t1, C0_SR /* look at Status Register */
+ nop
+ .set reorder
+#ifdef _R3000
+ li t2, SR_TS /* TLB Shutdown bit */
+ and t1,t2 /* TLB Shutdown if 1 */
+ bnez t1, 8f /* skip clearing if no TLB */
+#endif
+
+#ifndef R4650
+ jal init_tlb /* clear the tlb */
+#endif
+
+
+/************************************************************************
+**
+** Initialization required if using IDT/c or libc.a, standard C Lib
+**
+** can SKIP if not necessary for application
+**
+************************************************************************/
+8:
+
+ jal idtsim_init_sbrk
+ jal idtsim_init_file
+/*********************** END I/O initialization **********************/
+
+
+ jal main
+
+ jal idtsim_promexit
+
+ENDFRAME(start)
+
+
+ .globl sim_mem_cfg
+sim_mem_cfg:
+ .set noat
+ .set noreorder
+ li AT, (0xbfc00000+((55)*8))
+ jr AT
+ nop
+ .set at
+ .set reorder
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/Makefile.in b/c/src/lib/libbsp/mips64orion/p4000/startup/Makefile.in
new file mode 100644
index 0000000000..9f575107d6
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart main sbrk setvec inittlb
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=idtmem idttlb
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=ghlinkcmds linkcmds $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/ghlinkcmds $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+
+
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/bspclean.c b/c/src/lib/libbsp/mips64orion/p4000/startup/bspclean.c
new file mode 100644
index 0000000000..f59599ee36
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/bspclean.c
@@ -0,0 +1,35 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and usually returns
+ * control to a monitor.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)bspclean.c 03/15/96 1.1\n";
+ */
+
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+void bsp_cleanup( void )
+{
+}
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/ghlinkcmds b/c/src/lib/libbsp/mips64orion/p4000/startup/ghlinkcmds
new file mode 100644
index 0000000000..cf2a80bf8d
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/ghlinkcmds
@@ -0,0 +1,15 @@
+-map
+-sec
+{
+ .text 0x80010000 :
+ .data align(16) :
+ .rodata :
+ .fini :
+# .sdata :
+ .symtab :
+ .strtab :
+ .debug :
+# .sbss :
+ .bss align(8) :
+ .init 0xbfc00000 :
+}
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/idtmem.S b/c/src/lib/libbsp/mips64orion/p4000/startup/idtmem.S
new file mode 100644
index 0000000000..70a7096877
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/idtmem.S
@@ -0,0 +1,938 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+
+*/
+
+/************************************************************************
+**
+** idtmem.s - memory and cache functions
+**
+** Copyright 1991 Integrated Device Technology, Inc.
+** All Rights Reserved
+**
+**************************************************************************/
+
+/*
+ * 950313: Ketan fixed bugs in mfc0/mtc0 hazards, and removed hack
+ * to set mem_size.
+ */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+ .data
+mem_size:
+ .word 0
+dcache_size:
+ .word 0
+icache_size:
+#if defined(CPU_R3000)
+ .word MINCACHE
+#endif
+#if defined(CPU_R4000)
+ .word 0
+#endif
+
+#if defined(CPU_R4000)
+ .data
+scache_size:
+ .word 0
+icache_linesize:
+ .word 0
+dcache_linesize:
+ .word 0
+scache_linesize:
+ .word 0
+#endif
+
+
+ .text
+
+#if defined (CPU_R3000)
+#define CONFIGFRM ((2*4)+4)
+
+/*************************************************************************
+**
+** Config_Dcache() -- determine size of Data cache
+**
+**************************************************************************/
+
+FRAME(config_Dcache,sp, CONFIGFRM, ra)
+ .set noreorder
+ subu sp,CONFIGFRM
+ sw ra,CONFIGFRM-4(sp) /* save return address */
+ sw s0,4*4(sp) /* save s0 in first regsave slot */
+ mfc0 s0,C0_SR /* save SR */
+ nop
+ mtc0 zero,C0_SR /* disable interrupts */
+ .set reorder
+ jal _size_cache /* returns Data cache size in v0 */
+ sw v0, dcache_size /* save it */
+ and s0, ~SR_PE /* do not clear PE */
+ .set noreorder
+ mtc0 s0,C0_SR /* restore SR */
+ nop
+ .set reorder
+ lw s0, 4*4(sp) /* restore s0 */
+ lw ra,CONFIGFRM-4(sp) /* restore ra */
+ addu sp,CONFIGFRM /* pop stack */
+ j ra
+ENDFRAME(config_Dcache)
+
+
+/*************************************************************************
+**
+** Config_Icache() -- determine size of Instruction cache
+** MUST be run in uncached mode/handled in idt_csu.s
+**
+**************************************************************************/
+
+FRAME(config_Icache,sp, CONFIGFRM, ra)
+ .set noreorder
+ subu sp,CONFIGFRM
+ sw ra,CONFIGFRM-4(sp) /* save return address */
+ sw s0,4*4(sp) /* save s0 in first regsave slot */
+ mfc0 s0,C0_SR /* save SR */
+ nop
+ mtc0 zero, C0_SR /* disable interrupts */
+ li v0,SR_SWC /* swap caches/disable ints */
+ mtc0 v0,C0_SR
+ nop
+ .set reorder
+ jal _size_cache /* returns instruction cache size */
+ .set noreorder
+ mtc0 zero,C0_SR /* swap back caches */
+ nop
+ and s0,~SR_PE /* do not inadvertantly clear PE */
+ mtc0 s0,C0_SR /* restore SR */
+ nop
+ .set reorder
+ sw v0, icache_size /* save it AFTER caches back */
+ lw s0,4*4(sp) /* restore s0 */
+ lw ra,CONFIGFRM-4(sp) /* restore ra */
+ addu sp,CONFIGFRM /* pop stack */
+ j ra
+ENDFRAME(config_Icache)
+
+/************************************************************************
+**
+** _size_cache()
+** returns cache size in v0
+**
+************************************************************************/
+
+FRAME(_size_cache,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR /* save current sr */
+ nop
+ and t0,~SR_PE /* do not inadvertently clear PE */
+ or v0,t0,SR_ISC /* isolate cache */
+ mtc0 v0,C0_SR
+ /*
+ * First check if there is a cache there at all
+ */
+ move v0,zero
+ li v1,0xa5a5a5a5 /* distinctive pattern */
+ sw v1,K0BASE /* try to write into cache */
+ lw t1,K0BASE /* try to read from cache */
+ nop
+ mfc0 t2,C0_SR
+ nop
+ .set reorder
+ and t2,SR_CM
+ bne t2,zero,3f /* cache miss, must be no cache */
+ bne v1,t1,3f /* data not equal -> no cache */
+ /*
+ * Clear cache size boundries to known state.
+ */
+ li v0,MINCACHE
+1:
+ sw zero,K0BASE(v0)
+ sll v0,1
+ ble v0,MAXCACHE,1b
+
+ li v0,-1
+ sw v0,K0BASE(zero) /* store marker in cache */
+ li v0,MINCACHE /* MIN cache size */
+
+2: lw v1,K0BASE(v0) /* Look for marker */
+ bne v1,zero,3f /* found marker */
+ sll v0,1 /* cache size * 2 */
+ ble v0,MAXCACHE,2b /* keep looking */
+ move v0,zero /* must be no cache */
+ .set noreorder
+3: mtc0 t0,C0_SR /* restore sr */
+ j ra
+ nop
+ENDFRAME(_size_cache)
+ .set reorder
+
+
+#define FLUSHFRM (2*4)
+
+/***************************************************************************
+**
+** flush_Dcache() - flush entire Data cache
+**
+****************************************************************************/
+FRAME(flush_Dcache,sp,FLUSHFRM,ra)
+ lw t2, dcache_size
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ beq t2,zero,_Dflush_done /* no D cache, get out! */
+ nop
+ li v0, SR_ISC /* isolate cache */
+ mtc0 v0, C0_SR
+ nop
+ .set reorder
+ li t0,K0BASE /* set loop registers */
+ or t1,t0,t2
+
+2: sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bne t0,t1,2b
+
+ .set noreorder
+_Dflush_done:
+ mtc0 t3,C0_SR /* restore Status Register */
+ .set reorder
+ j ra
+ENDFRAME(flush_Dcache)
+
+
+/***************************************************************************
+**
+** flush_Icache() - flush entire Instruction cache
+**
+** NOTE: Icache can only be flushed/cleared when uncached
+** Code forces into uncached memory regardless of calling mode
+**
+****************************************************************************/
+FRAME(flush_Icache,sp,FLUSHFRM,ra)
+ lw t1,icache_size
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ la v0,1f
+ li v1,K1BASE
+ or v0,v1
+ j v0 /* force into non-cached space */
+ nop
+1:
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ beq t1,zero,_Iflush_done /* no i-cache get out */
+ nop
+ li v0,SR_ISC|SR_SWC /* disable intr, isolate and swap */
+ mtc0 v0,C0_SR
+ li t0,K0BASE
+ .set reorder
+ or t1,t0,t1
+
+1: sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bne t0,t1,1b
+ .set noreorder
+_Iflush_done:
+ mtc0 t3,C0_SR /* un-isolate, enable interrupts */
+ .set reorder
+ j ra
+ENDFRAME(flush_Icache)
+
+/**************************************************************************
+**
+** clear_Dcache(base_addr, byte_count) - flush portion of Data cache
+**
+** a0 = base address of portion to be cleared
+** a1 = byte count of length
+**
+***************************************************************************/
+FRAME(clear_Dcache,sp,0,ra)
+
+ lw t2, dcache_size /* Data cache size */
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ nop
+ nop
+ .set reorder
+ /*
+ * flush data cache
+ */
+
+ .set noreorder
+ nop
+ li v0,SR_ISC /* isolate data cache */
+ mtc0 v0,C0_SR
+ .set reorder
+ bltu t2,a1,1f /* cache is smaller than region */
+ move t2,a1
+1: addu t2,a0 /* ending address + 1 */
+ move t0,a0
+
+1: sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bltu t0,t2,1b
+
+ .set noreorder
+ mtc0 t3,C0_SR /* un-isolate, enable interrupts */
+ nop
+ .set reorder
+ j ra
+ENDFRAME(clear_Dcache)
+
+
+/**************************************************************************
+**
+** clear_Icache(base_addr, byte_count) - flush portion of Instruction cache
+**
+** a0 = base address of portion to be cleared
+** a1 = byte count of length
+**
+** NOTE: Icache can only be flushed/cleared when uncached
+** Code forces into uncached memory regardless of calling mode
+**
+***************************************************************************/
+FRAME(clear_Icache,sp,0,ra)
+
+ lw t1, icache_size /* Instruction cache size */
+ /*
+ * flush text cache
+ */
+ .set noreorder
+ mfc0 t3,C0_SR /* save SR */
+ nop
+ la v0,1f
+ li v1,K1BASE
+ or v0,v1
+ j v0 /* force into non-cached space */
+ nop
+1:
+ and t3,~SR_PE /* dont inadvertently clear PE */
+ nop
+ nop
+ li v0,SR_ISC|SR_SWC /* disable intr, isolate and swap */
+ mtc0 v0,C0_SR
+ .set reorder
+ bltu t1,a1,1f /* cache is smaller than region */
+ move t1,a1
+1: addu t1,a0 /* ending address + 1 */
+ move t0,a0
+
+ sb zero,0(t0)
+ sb zero,4(t0)
+ sb zero,8(t0)
+ sb zero,12(t0)
+ sb zero,16(t0)
+ sb zero,20(t0)
+ sb zero,24(t0)
+ addu t0,32
+ sb zero,-4(t0)
+ bltu t0,t1,1b
+ .set noreorder
+ mtc0 t3,C0_SR /* un-isolate, enable interrupts */
+ nop
+ nop
+ nop /* allow time for caches to swap */
+ .set reorder
+ j ra
+ENDFRAME(clear_Icache)
+
+
+/**************************************************************************
+**
+** get_mem_conf - get memory configuration
+**
+***************************************************************************/
+
+
+FRAME(get_mem_conf,sp,0,ra)
+
+ lw t6, mem_size
+ sw t6, 0(a0)
+ lw t7, icache_size
+ sw t7, 4(a0)
+ lw t8, dcache_size
+ sw t8, 8(a0)
+ j ra
+
+ENDFRAME(get_mem_conf)
+#endif /* defined CPU_R3000 */
+
+#if defined(CPU_R4000)
+#define LEAF(label) FRAME(label,sp,0,ra)
+#define XLEAF(label) \
+ .globl label ; \
+label:
+#define END(label) ENDFRAME(label)
+
+/*
+ * cacheop macro to automate cache operations
+ * first some helpers...
+ */
+#define _mincache(size, maxsize) \
+ bltu size,maxsize,8f ; \
+ move size,maxsize ; \
+8:
+
+#define _align(tmp, minaddr, maxaddr, linesize) \
+ subu tmp,linesize,1 ; \
+ not tmp ; \
+ and minaddr,tmp ; \
+ addu maxaddr,-1 ; \
+ and maxaddr,tmp
+
+/* This is a bit of a hack really because it relies on minaddr=a0 */
+#define _doop1(op1) \
+ cache op1,0(a0)
+
+#define _doop2(op1, op2) \
+ cache op1,0(a0) ; \
+ cache op2,0(a0)
+
+/* specials for cache initialisation */
+#define _doop1lw1(op1) \
+ cache op1,0(a0) ; \
+ lw zero,0(a0) ; \
+ cache op1,0(a0)
+
+#define _doop121(op1,op2) \
+ cache op1,0(a0) ; \
+ nop; \
+ cache op2,0(a0) ; \
+ nop; \
+ cache op1,0(a0)
+
+#define _oploopn(minaddr, maxaddr, linesize, tag, ops) \
+ .set noreorder ; \
+7: _doop##tag##ops ; \
+ bne minaddr,maxaddr,7b ; \
+ addu minaddr,linesize ; \
+ .set reorder
+
+/* finally the cache operation macros */
+#define icacheopn(kva, n, cache_size, cache_linesize, tag, ops) \
+ _mincache(n, cache_size); \
+ blez n,9f ; \
+ addu n,kva ; \
+ _align(t1, kva, n, cache_linesize) ; \
+ _oploopn(kva, n, cache_linesize, tag, ops) ; \
+9:
+
+#define vcacheopn(kva, n, cache_size, cache_linesize, tag, ops) \
+ blez n,9f ; \
+ addu n,kva ; \
+ _align(t1, kva, n, cache_linesize) ; \
+ _oploopn(kva, n, cache_linesize, tag, ops) ; \
+9:
+
+#define icacheop(kva, n, cache_size, cache_linesize, op) \
+ icacheopn(kva, n, cache_size, cache_linesize, 1, (op))
+
+#define vcacheop(kva, n, cache_size, cache_linesize, op) \
+ vcacheopn(kva, n, cache_size, cache_linesize, 1, (op))
+
+ .text
+
+/*
+ * static void _size_cache() R4000
+ *
+ * Internal routine to determine cache sizes by looking at R4000 config
+ * register. Sizes are returned in registers, as follows:
+ * t2 icache size
+ * t3 dcache size
+ * t6 scache size
+ * t4 icache line size
+ * t5 dcache line size
+ * t7 scache line size
+ */
+LEAF(_size_cache)
+ mfc0 t0,C0_CONFIG
+
+ and t1,t0,CFG_ICMASK
+ srl t1,CFG_ICSHIFT
+ li t2,0x1000
+ sll t2,t1
+
+ and t1,t0,CFG_DCMASK
+ srl t1,CFG_DCSHIFT
+ li t3,0x1000
+ sll t3,t1
+
+ li t4,32
+ and t1,t0,CFG_IB
+ bnez t1,1f
+ li t4,16
+1:
+
+ li t5,32
+ and t1,t0,CFG_DB
+ bnez t1,1f
+ li t5,16
+1:
+
+ move t6,zero # default to no scache
+ move t7,zero #
+
+ and t1,t0,CFG_C_UNCACHED # test config register
+ bnez t1,1f # no scache if uncached/non-coherent
+
+ li t6,0x100000 # assume 1Mb scache <<-NOTE
+ and t1,t0,CFG_SBMASK
+ srl t1,CFG_SBSHIFT
+ li t7,16
+ sll t7,t1
+1: j ra
+END(_size_cache)
+
+
+/*
+ * void config_cache() R4000
+ *
+ * Work out size of I, D & S caches, assuming they are already initialised.
+ */
+LEAF(config_cache)
+ lw t0,icache_size
+ bgtz t0,8f # already known?
+ move v0,ra
+ bal _size_cache
+ move ra,v0
+
+ sw t2,icache_size
+ sw t3,dcache_size
+ sw t6,scache_size
+ sw t4,icache_linesize
+ sw t5,dcache_linesize
+ sw t7,scache_linesize
+8: j ra
+END(config_cache)
+
+
+/*
+ * void _init_cache() R4000
+ */
+LEAF(_init_cache)
+ /*
+ * First work out the sizes
+ */
+ move v0,ra
+ bal _size_cache
+ move ra,v0
+
+ /*
+ * The caches may be in an indeterminate state,
+ * so we force good parity into them by doing an
+ * invalidate, load/fill, invalidate for each line.
+ */
+
+ /* disable all i/u and cache exceptions */
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ or v1,SR_DE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ /* assume bottom of RAM will generate good parity for the cache */
+ li a0,PHYS_TO_K0(0)
+ move a2,t2 # icache_size
+ move a3,t4 # icache_linesize
+ move a1,a2
+ icacheopn(a0,a1,a2,a3,121,(Index_Store_Tag_I,Fill_I))
+
+ li a0,PHYS_TO_K0(0)
+ move a2,t3 # dcache_size
+ move a3,t5 # dcache_linesize
+ move a1,a2
+ icacheopn(a0,a1,a2,a3,1lw1,(Index_Store_Tag_D))
+
+ /* assume unified I & D in scache <<-NOTE */
+ blez t6,1f
+ li a0,PHYS_TO_K0(0)
+ move a2,t6
+ move a3,t7
+ move a1,a2
+ icacheopn(a0,a1,a2,a3,1lw1,(Index_Store_Tag_SD))
+
+1: mtc0 v0,C0_SR
+ j ra
+END(_init_cache)
+
+
+/*
+ * void flush_cache (void) R4000
+ *
+ * Flush and invalidate all caches
+ */
+LEAF(flush_cache)
+ /* secondary cacheops do all the work if present */
+ lw a2,scache_size
+ blez a2,1f
+ lw a3,scache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_SD)
+ b 2f
+
+1:
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+ lw a2,dcache_size
+ lw a3,dcache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_D)
+
+2: j ra
+END(flush_cache)
+
+/*
+ * void flush_cache_nowrite (void) R4000
+ *
+ * Invalidate all caches
+ */
+LEAF(flush_cache_nowrite)
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+ lw a2,dcache_size
+ lw a3,dcache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
+
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+ li a0,PHYS_TO_K0(0)
+ move a1,a2
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_SD)
+
+2: mtc0 v0,C0_SR
+ j ra
+END(flush_cache_nowrite)
+
+/*
+ * void clean_cache (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate address range in all caches
+ */
+LEAF(clean_cache)
+XLEAF(clear_cache)
+
+ /* secondary cacheops do all the work (if fitted) */
+ lw a2,scache_size
+ blez a2,1f
+ lw a3,scache_linesize
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_SD)
+ b 2f
+
+1: lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+ /* save kva & n for subsequent loop */
+ move t8,a0
+ move t9,a1
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_I)
+
+ lw a2,dcache_size
+ lw a3,dcache_linesize
+ /* restore kva & n */
+ move a0,t8
+ move a1,t9
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_D)
+
+2: j ra
+END(clean_cache)
+
+/*
+ * void clean_dcache (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate address range in primary data cache
+ */
+LEAF(clean_dcache)
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_D)
+
+2: j ra
+END(clean_dcache)
+
+/*
+ * void clean_dcache_indexed (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate indexed range in primary data cache
+ */
+LEAF(clean_dcache_indexed)
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+#ifdef CPU_ORION
+ srl a2,1 # do one set (half cache) at a time
+ move t8,a0 # save kva & n
+ move t9,a1
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_D)
+
+ addu a0,t8,a2 # do next set
+ move a1,t9 # restore n
+#endif
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_D)
+
+2: j ra
+END(clean_dcache_indexed)
+
+/*
+ * void clean_dcache_nowrite (unsigned kva, size_t n) R4000
+ *
+ * Invalidate an address range in primary data cache
+ */
+LEAF(clean_dcache_nowrite)
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_D)
+
+2: j ra
+END(clean_dcache_nowrite)
+
+/*
+ * void clean_dcache_nowrite_indexed (unsigned kva, size_t n) R4000
+ *
+ * Invalidate indexed range in primary data cache
+ */
+LEAF(clean_dcache_nowrite_indexed)
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ lw a2,dcache_size
+ blez a2,2f
+ lw a3,dcache_linesize
+
+#ifdef CPU_ORION
+ srl a2,1 # do one set (half cache) at a time
+ move t8,a0 # save kva & n
+ move t9,a1
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
+
+ addu a0,t8,a2 # do next set
+ move a1,t9 # restore n
+#endif
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_D)
+
+2: mtc0 v0,C0_SR
+ j ra
+END(clean_dcache_nowrite_indexed)
+
+/*
+ * void clean_icache (unsigned kva, size_t n) R4000
+ *
+ * Invalidate address range in primary instruction cache
+ */
+LEAF(clean_icache)
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_I)
+
+2: j ra
+END(clean_icache)
+
+/*
+ * void clean_icache_indexed (unsigned kva, size_t n) R4000
+ *
+ * Invalidate indexed range in primary instruction cache
+ */
+LEAF(clean_icache_indexed)
+ lw a2,icache_size
+ blez a2,2f
+ lw a3,icache_linesize
+
+#ifdef CPU_ORION
+ srl a2,1 # do one set (half cache) at a time
+ move t8,a0 # save kva & n
+ move t9,a1
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+ addu a0,t8,a2 # do next set
+ move a1,t9 # restore n
+#endif
+ icacheop(a0,a1,a2,a3,Index_Invalidate_I)
+
+2: j ra
+END(clean_icache_indexed)
+
+
+
+/*
+ * void clean_scache (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate address range in secondary cache
+ */
+LEAF(clean_scache)
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+ vcacheop(a0,a1,a2,a3,Hit_Writeback_Inv_SD)
+
+2: j ra
+END(clean_scache)
+
+/*
+ * void clean_scache_indexed (unsigned kva, size_t n) R4000
+ *
+ * Writeback and invalidate indexed range in secondary cache
+ */
+LEAF(clean_scache_indexed)
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+
+ icacheop(a0,a1,a2,a3,Index_Writeback_Inv_SD)
+
+2: j ra
+END(clean_scache_indexed)
+
+/*
+ * void clean_scache_nowrite (unsigned kva, size_t n) R4000
+ *
+ * Invalidate an address range in secondary cache
+ */
+LEAF(clean_scache_nowrite)
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+
+ vcacheop(a0,a1,a2,a3,Hit_Invalidate_SD)
+
+2: j ra
+END(clean_scache_nowrite)
+
+/*
+ * void clean_scache_nowrite_indexed (unsigned kva, size_t n) R4000
+ *
+ * Invalidate indexed range in secondary cache
+ */
+LEAF(clean_scache_nowrite_indexed)
+ mfc0 v0,C0_SR
+ and v1,v0,~SR_IE
+ mtc0 v1,C0_SR
+
+ mtc0 zero,C0_TAGLO
+ mtc0 zero,C0_TAGHI
+
+ lw a2,scache_size
+ blez a2,2f
+ lw a3,scache_linesize
+
+ icacheop(a0,a1,a2,a3,Index_Store_Tag_SD)
+
+2: mtc0 v0,C0_SR
+ j ra
+END(clean_scache_nowrite_indexed)
+
+/**************************************************************************
+**
+** get_mem_conf - get memory configuration R4000
+**
+***************************************************************************/
+
+
+FRAME(get_mem_conf,sp,0,ra)
+
+ lw t6, mem_size
+ sw t6, 0(a0)
+ lw t7, icache_size
+ sw t7, 4(a0)
+ lw t8, dcache_size
+ sw t8, 8(a0)
+ lw t7, scache_size
+ sw t7, 12(a0)
+ j ra
+
+ENDFRAME(get_mem_conf)
+
+#endif /* defined(CPU_R4000) */
+
+/*
+ * void set_mem_size (mem_size)
+ *
+ * config_memory()'s memory size gets written into mem_size here.
+ * Now we don't need to call config_cache() with memory size - New to IDTC6.0
+ */
+FRAME(set_memory_size,sp,0,ra)
+ sw a0, mem_size
+ j ra
+ENDFRAME(set_memory_size)
+
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/idttlb.S b/c/src/lib/libbsp/mips64orion/p4000/startup/idttlb.S
new file mode 100644
index 0000000000..4aad7b1416
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/idttlb.S
@@ -0,0 +1,390 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+
+/*
+** idttlb.s - fetch the registers associated with and the contents
+** of the tlb.
+**
+*/
+/* 950308: Ketan patched a few tlb functions that would not have worked.*/
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+
+ .text
+
+#if defined(CPU_R3000)
+/*
+** ret_tlblo -- returns the 'entrylo' contents for the TLB
+** 'c' callable - as ret_tlblo(index) - where index is the
+** tlb entry to return the lo value for - if called from assembly
+** language then index should be in register a0.
+*/
+FRAME(ret_tlblo,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR # save sr
+ nop
+ and t0,~SR_PE # dont inadvertantly clear PE
+ mtc0 zero,C0_SR # clear interrupts
+ mfc0 t1,C0_TLBHI # save pid
+ sll a0,TLBINX_INXSHIFT # position index
+ mtc0 a0,C0_INX # write to index register
+ nop
+ tlbr # put tlb entry in entrylo and hi
+ nop
+ mfc0 v0,C0_TLBLO # get the requested entry lo
+ mtc0 t1,C0_TLBHI # restore pid
+ mtc0 t0,C0_SR # restore status register
+ j ra
+ nop
+ .set reorder
+ENDFRAME(ret_tlblo)
+#endif
+#if defined(CPU_R4000)
+/*
+** ret_tlblo[01] -- returns the 'entrylo' contents for the TLB
+** 'c' callable - as ret_tlblo(index) - where index is the
+** tlb entry to return the lo value for - if called from assembly
+** language then index should be in register a0.
+*/
+FRAME(ret_tlblo0,sp,0,ra)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # clear interrupts
+ mfc0 t1,C0_TLBHI # save pid
+ mtc0 a0,C0_INX # write to index register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # put tlb entry in entrylo and hi
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_TLBLO0 # get the requested entry lo
+ mtc0 t1,C0_TLBHI # restore pid
+ mtc0 t0,C0_SR # restore status register
+ j ra
+ENDFRAME(ret_tlblo0)
+
+FRAME(ret_tlblo1,sp,0,ra)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # clear interrupts
+ mfc0 t1,C0_TLBHI # save pid
+ mtc0 a0,C0_INX # write to index register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # put tlb entry in entrylo and hi
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_TLBLO1 # get the requested entry lo
+ mtc0 t1,C0_TLBHI # restore pid
+ mtc0 t0,C0_SR # restore status register
+ j ra
+ENDFRAME(ret_tlblo1)
+
+/*
+** ret_pagemask(index) -- return pagemask contents of tlb entry "index"
+*/
+FRAME(ret_pagemask,sp,0,ra)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ mtc0 a0,C0_INX # drop it in C0 register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # read entry to entry hi/lo
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_PAGEMASK # to return value
+ mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+ENDFRAME(ret_pagemask)
+
+/*
+** ret_tlbwired(void) -- return wired register
+*/
+FRAME(ret_tlbwired,sp,0,ra)
+ mfc0 v0,C0_WIRED
+ j ra
+ENDFRAME(ret_tlbwired)
+#endif
+
+/*
+** ret_tlbhi -- return the tlb entry high content for tlb entry
+** index
+*/
+FRAME(ret_tlbhi,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 t0,C0_SR # save sr
+ nop
+ and t0,~SR_PE
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ sll a0,TLBINX_INXSHIFT # position index
+ mtc0 a0,C0_INX # drop it in C0 register
+ nop
+ tlbr # read entry to entry hi/lo
+ nop
+ mfc0 v0,C0_TLBHI # to return value
+ mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ mtc0 a0,C0_INX # drop it in C0 register
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbr # read entry to entry hi/lo0/lo1/mask
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v0,C0_TLBHI # to return value
+ mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+#endif
+ENDFRAME(ret_tlbhi)
+
+/*
+** ret_tlbpid() -- return tlb pid contained in the current entry hi
+*/
+FRAME(ret_tlbpid,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 v0,C0_TLBHI # fetch tlb high
+ nop
+ and v0,TLBHI_PIDMASK # isolate and position
+ srl v0,TLBHI_PIDSHIFT
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ mfc0 v0,C0_TLBHI # to return value
+ nop
+ and v0,TLBHI_PIDMASK
+ j ra
+#endif
+ENDFRAME(ret_tlbpid)
+
+/*
+** tlbprobe(address, pid) -- probe the tlb to see if address is currently
+** mapped
+** a0 = vpn - virtual page numbers are 0=0 1=0x1000, 2=0x2000...
+** virtual page numbers for the r3000 are in
+** entry hi bits 31-12
+** a1 = pid - this is a process id ranging from 0 to 63
+** this process id is shifted left 6 bits and or'ed into
+** the entry hi register
+** returns an index value (0-63) if successful -1 -f not
+*/
+FRAME(tlbprobe,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 t0,C0_SR /* fetch status reg */
+ and a0,TLBHI_VPNMASK /* isolate just the vpn */
+ and t0,~SR_PE /* don't inadvertantly clear pe */
+ mtc0 zero,C0_SR
+ mfc0 t1,C0_TLBHI
+ sll a1,TLBHI_PIDSHIFT /* possition the pid */
+ and a1,TLBHI_PIDMASK
+ or a0,a1 /* build entry hi value */
+ mtc0 a0,C0_TLBHI
+ nop
+ tlbp /* do the probe */
+ nop
+ mfc0 v1,C0_INX
+ li v0,-1
+ bltz v1,1f
+ nop
+ sra v0,v1,TLBINX_INXSHIFT /* get index positioned for return */
+1:
+ mtc0 t1,C0_TLBHI /* restore tlb hi */
+ mtc0 t0,C0_SR /* restore the status reg */
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ mfc0 t0,C0_SR # save sr
+ mtc0 zero,C0_SR # disable interrupts
+ mfc0 t1,C0_TLBHI # save current pid
+ and a0,TLBHI_VPN2MASK # construct tlbhi for probe
+ and a1,TLBHI_PIDMASK
+ or a0,a1
+ mtc0 a0,C0_TLBHI
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbp # probe entry to entry hi/lo0/lo1/mask
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mfc0 v1,C0_INX
+ li v0,-1
+ bltz v1,1f
+ move v0,v1
+1: mtc0 t1,C0_TLBHI # restore current pid
+ mtc0 t0,C0_SR # restore sr
+ j ra
+#endif
+ENDFRAME(tlbprobe)
+
+/*
+** resettlb(index) Invalidate the TLB entry specified by index
+*/
+FRAME(resettlb,sp,0,ra)
+#if defined(CPU_R3000)
+ .set noreorder
+ mfc0 t0,C0_TLBHI # fetch the current hi
+ mfc0 v0,C0_SR # fetch the status reg.
+ li t2,K0BASE&TLBHI_VPNMASK
+ and v0,~SR_PE # dont inadvertantly clear PE
+ mtc0 zero,C0_SR
+ mtc0 t2,C0_TLBHI # set up tlbhi
+ mtc0 zero,C0_TLBLO
+ sll a0,TLBINX_INXSHIFT
+ mtc0 a0,C0_INX
+ nop
+ tlbwi # do actual invalidate
+ nop
+ mtc0 t0,C0_TLBHI
+ mtc0 v0,C0_SR
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ li t2,K0BASE&TLBHI_VPN2MASK
+ mfc0 t0,C0_TLBHI # save current TLBHI
+ mfc0 v0,C0_SR # save SR and disable interrupts
+ mtc0 zero,C0_SR
+ mtc0 t2,C0_TLBHI # invalidate entry
+ mtc0 zero,C0_TLBLO0
+ mtc0 zero,C0_TLBLO1
+ mtc0 a0,C0_INX
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbwi
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mtc0 t0,C0_TLBHI
+ mtc0 v0,C0_SR
+ j ra
+#endif
+ENDFRAME(resettlb)
+
+#if defined(CPU_R3000)
+/*
+** Setup TLB entry
+**
+** map_tlb(index, tlbhi, phypage)
+** a0 = TLB entry index
+** a1 = virtual page number and PID
+** a2 = physical page
+*/
+FRAME(map_tlb,sp,0,ra)
+ .set noreorder
+ sll a0,TLBINX_INXSHIFT
+ mfc0 v0,C0_SR # fetch the current status
+ mfc0 a3,C0_TLBHI # save the current hi
+ and v0,~SR_PE # dont inadvertantly clear parity
+
+ mtc0 zero,C0_SR
+ mtc0 a1,C0_TLBHI # set the hi entry
+ mtc0 a2,C0_TLBLO # set the lo entry
+ mtc0 a0,C0_INX # load the index
+ nop
+ tlbwi # put the hi/lo in tlb entry indexed
+ nop
+ mtc0 a3,C0_TLBHI # put back the tlb hi reg
+ mtc0 v0,C0_SR # restore the status register
+ j ra
+ nop
+ .set reorder
+ENDFRAME(map_tlb)
+ #endif
+#if defined(CPU_R4000)
+/*
+** Setup R4000 TLB entry
+**
+** map_tlb4000(mask_index, tlbhi, pte_even, pte_odd)
+** a0 = TLB entry index and page mask
+** a1 = virtual page number and PID
+** a2 = pte -- contents of even pte
+** a3 = pte -- contents of odd pte
+*/
+FRAME(map_tlb4000,sp,0,ra)
+ and t2,a0,TLBPGMASK_MASK
+ and a0,TLBINX_INXMASK
+ mfc0 t1,C0_TLBHI # save current TLBPID
+ mfc0 v0,C0_SR # save SR and disable interrupts
+ mtc0 zero,C0_SR
+ mtc0 t2,C0_PAGEMASK # set
+ mtc0 a1,C0_TLBHI # set VPN and TLBPID
+ mtc0 a2,C0_TLBLO0 # set PPN and access bits
+ mtc0 a3,C0_TLBLO1 # set PPN and access bits
+ mtc0 a0,C0_INX # set INDEX to wired entry
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ tlbwi # drop it in
+ .set noreorder
+ nop; nop; nop; nop; nop; nop; nop; nop
+ .set reorder
+ mtc0 t1,C0_TLBHI # restore TLBPID
+ mtc0 v0,C0_SR # restore SR
+ j ra
+ENDFRAME(map_tlb4000)
+#endif
+
+
+/*
+** Set current TLBPID. This assumes PID is positioned correctly in reg.
+** a0.
+*/
+FRAME(set_tlbpid,sp,0,ra)
+ .set noreorder
+ mtc0 a0,C0_TLBHI
+ j ra
+ nop
+ .set reorder
+ENDFRAME(set_tlbpid)
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/inittlb.c b/c/src/lib/libbsp/mips64orion/p4000/startup/inittlb.c
new file mode 100644
index 0000000000..e61f0043be
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/inittlb.c
@@ -0,0 +1,16 @@
+/*
+ * $Id$
+ */
+
+#include <rtems/score/idtcpu.h>
+
+extern void resettlb( int i );
+
+void init_tlb(void)
+{
+ int i;
+
+ for (i = 0; i < N_TLB_ENTRIES; i++ )
+ resettlb(i);
+}
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/linkcmds b/c/src/lib/libbsp/mips64orion/p4000/startup/linkcmds
new file mode 100644
index 0000000000..858317853c
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/linkcmds
@@ -0,0 +1,72 @@
+/*
+ * $Id$
+ */
+
+OUTPUT_FORMAT("elf32-bigmips")
+OUTPUT_ARCH(mips)
+/* Do we need any of these for elf?
+ __DYNAMIC = 0; */
+_DYNAMIC_LINK = 0;
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ .text 0x80030000 : /* */
+/* .text 0xa0020000 : /* */
+/* .text 0x00020000 : /* */
+ {
+ _ftext = . ;
+ *(.text)
+ CREATE_OBJECT_SYMBOLS
+ _etext = .;
+ }
+ .init ALIGN(8) : { *(.init) } =0
+ .fini ALIGN(8) : { *(.fini) } =0
+ .ctors ALIGN(8) : { *(.ctors) }
+ .dtors ALIGN(8) : { *(.dtors) }
+ .rodata ALIGN(8) : { *(.rodata) }
+ .rodata1 ALIGN(8) :
+ {
+ *(.rodata1)
+ . = ALIGN(8);
+ }
+ .reginfo . : { *(.reginfo) }
+ /* also: .hash .dynsym .dynstr .plt(if r/o) .rel.got */
+ /* Read-write section, merged into data segment: */
+ .data ALIGN(16) :
+ {
+ _fdata = . ;
+ *(.data)
+ CONSTRUCTORS
+ }
+ .data1 ALIGN(8) : { *(.data1) }
+ _gp = . + 0x8000;
+ .lit8 . : { *(.lit8) }
+ .lit4 . : { *(.lit4) }
+ /* also (before uninitialized portion): .dynamic .got .plt(if r/w)
+ (or does .dynamic go into its own segment?) */
+ /* We want the small data sections together, so single-instruction offsets
+ can access them all, and initialized data all before uninitialized, so
+ we can shorten the on-disk segment size. */
+ .sdata ALIGN(8) : { *(.sdata) }
+ _edata = .;
+ __bss_start = ALIGN(8);
+ _fbss = .;
+ .sbss ALIGN(8) : { *(.sbss) *(.scommon) }
+ .bss ALIGN(8) :
+ {
+ *(.bss)
+ *(COMMON)
+ _end = . ;
+ end = . ;
+ }
+ /* Debug sections. These should never be loadable, but they must have
+ zero addresses for the debuggers to work correctly. */
+ .line 0 : { *(.line) }
+ .debug 0 : { *(.debug) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+}
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/startup/setvec.c b/c/src/lib/libbsp/mips64orion/p4000/startup/setvec.c
new file mode 100644
index 0000000000..0f6d3c5ce3
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/startup/setvec.c
@@ -0,0 +1,53 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the target Board/CPU.
+ * This routine is allowed to be as board dependent as necessary.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)setvec.c 04/25/96 1.2\n";
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+mips_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ mips_isr_entry previous_isr;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ /* XXX: install non-RTEMS ISR as "raw" interupt */
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/mips64orion/p4000/times b/c/src/lib/libbsp/mips64orion/p4000/times
new file mode 100644
index 0000000000..6a3dbfe1fb
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/times
@@ -0,0 +1,200 @@
+#
+# Timing Test Suite Results for the NO_BSP
+#
+# NOTE: This is just a template. The times are irrelevant since this BSP
+# can only be compiled -- not executed.
+#
+# times,v 1.2 1995/12/07 15:44:23 joel Exp
+#
+# @(#)times 08/01/96 1.4
+
+NOTE: To obtain the execution time in microseconds, divide the number of
+ cycles by the clock speed. For example, if rtems_semaphore create
+ is reported to be 1164 cycles, then at 66 Mhz it takes 17.64
+ microseconds or 8.75 microseconds at 133 Mhz.
+
+Board: Algorithmics P4000i
+CPU: IDT 4650
+Clock Speed: 100MHz
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles
+Timer Source: on-CPU cycle counter
+
+Column A:RTEMS compiled with 64 bit pointers and 64 bit unsigned32 types
+Column B:RTEMS compiled with 32 bit pointers and 32 bit unsigned32 types
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 788 759
+ rtems_semaphore_delete 903 945
+ rtems_semaphore_obtain: available 119 119
+ rtems_semaphore_obtain: not available -- NO_WAIT 118 118
+ rtems_semaphore_release: no waiting tasks 127 127
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 842 840
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 777 751
+
+ 4 rtems_task_restart: blocked task -- preempts caller 1611 1595
+ rtems_task_restart: ready task -- preempts caller 1253 1395
+ rtems_semaphore_release: task readied -- returns to caller 365 345
+ rtems_task_create 798 797
+ rtems_task_start 464 460
+ rtems_task_restart: suspended task -- returns to caller 517 517
+ rtems_task_delete: suspended task 529 595
+ rtems_task_restart: ready task -- returns to caller 527 525
+ rtems_task_restart: blocked task -- returns to caller 707 684
+ rtems_task_delete: blocked task 609 675
+
+ 5 rtems_task_suspend: calling task 549 549
+ rtems_task_resume: task readied -- preempts caller 702 699
+
+ 6 rtems_task_restart: calling task 291 291
+ rtems_task_suspend: returns to caller 195 194
+ rtems_task_resume: task readied -- returns to caller 198 198
+ rtems_task_delete: ready task 734 736
+
+ 7 rtems_task_restart: suspended task -- preempts caller 1049 990
+
+ 8 rtems_task_set_priority: obtain current priority 94 94
+ rtems_task_set_priority: returns to caller 418 355
+ rtems_task_mode: obtain current mode 44 43
+ rtems_task_mode: no reschedule 0 49
+ rtems_task_mode: reschedule -- returns to caller 0 232
+ rtems_task_mode: reschedule -- preempts caller 0 687
+ rtems_task_set_note 0 101
+ rtems_task_get_note 0 103
+ rtems_clock_set 0 237
+ rtems_clock_get 0 16
+
+ 9 rtems_message_queue_create 3583 3432
+ rtems_message_queue_send: no waiting tasks 252 252
+ rtems_message_queue_urgent: no waiting tasks 252 252
+ rtems_message_queue_receive: available 207 207
+ rtems_message_queue_flush: no messages flushed 95 96
+ rtems_message_queue_flush: messages flushed 110 110
+ rtems_message_queue_delete 1044 1111
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 132 131
+ rtems_message_queue_receive: not available -- caller blocks 884 892
+
+11 rtems_message_queue_send: task readied -- preempts caller 397 817
+
+12 rtems_message_queue_send: task readied -- returns to caller 397 397
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 816 817
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 397 398
+
+15 rtems_event_receive: obtain current events 5 5
+ rtems_event_receive: not available -- NO_WAIT 99 99
+ rtems_event_receive: not available -- caller blocks 689 689
+ rtems_event_send: no task readied 123 123
+ rtems_event_receive: available 326 349
+ rtems_event_send: task readied -- returns to caller 333 429
+
+16 rtems_event_send: task readied -- preempts caller 843 838
+
+17 rtems_task_set_priority: preempts caller 1002 991
+
+18 rtems_task_delete: calling task 1171 1157
+
+19 rtems_signal_catch 0 1306
+ rtems_signal_send: returns to caller 0 1019
+ rtems_signal_send: signal to self 0 496
+ exit ASR overhead: returns to calling task 0 120
+ exit ASR overhead: returns to preempting task 0 73
+
+20 rtems_partition_create 1293 1306
+ rtems_region_create 1010 1019
+ rtems_partition_get_buffer: available 481 496
+ rtems_partition_get_buffer: not available 120 120
+ rtems_partition_return_buffer 587 460
+ rtems_partition_delete 379 320
+ rtems_region_get_segment: available 179 179
+ rtems_region_get_segment: not available -- NO_WAIT 349 293
+ rtems_region_return_segment: no waiting tasks 335 322
+ rtems_region_get_segment: not available -- caller blocks 1603 1496
+ rtems_region_return_segment: task readied -- preempts caller 1616 1533
+ rtems_region_return_segment: task readied -- returns to caller 940 939
+ rtems_region_delete 301 348
+ rtems_io_initialize 9 10
+ rtems_io_open 6 6
+ rtems_io_close 6 6
+ rtems_io_read 6 6
+ rtems_io_write 6 5
+ rtems_io_control 6 6
+
+21 rtems_task_ident 1057 1058
+ rtems_message_queue_ident 963 963
+ rtems_semaphore_ident 1137 1136
+ rtems_partition_ident 962 961
+ rtems_region_ident 923 924
+ rtems_port_ident 918 917
+ rtems_timer_ident 942 941
+ rtems_rate_monotonic_ident 924 925
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 1084 1095
+ rtems_message_queue_broadcast: no waiting tasks 147 148
+ rtems_message_queue_broadcast: task readied -- preempts caller 1305 1268
+
+23 rtems_timer_create 202 201
+ rtems_timer_fire_after: inactive 261 261
+ rtems_timer_fire_after: active 271 269
+ rtems_timer_cancel: active 142 141
+ rtems_timer_cancel: inactive 122 124
+ rtems_timer_reset: inactive 222 222
+ rtems_timer_reset: active 246 245
+ rtems_timer_fire_when: inactive 312 311
+ rtems_timer_fire_when: active 358 358
+ rtems_timer_delete: active 263 263
+ rtems_timer_delete: inactive 247 247
+ rtems_task_wake_when 833 831
+
+24 rtems_task_wake_after: yield -- returns to caller 99 98
+ rtems_task_wake_after: yields -- preempts caller 479 478
+
+25 rtems_clock_tick 313 318
+
+26 _ISR_Disable 64 57
+ _ISR_Flash 51 36
+ _ISR_Enable 31 18
+ _Thread_Disable_dispatch 53 37
+ _Thread_Enable_dispatch 260 233
+ _Thread_Set_state 446 463
+ _Thread_Disptach (NO FP) 839 801
+ context switch: no floating point contexts 673 653
+ context switch: self 156 162
+ context switch: to another task 84 70
+ context switch: restore 1st FP task 1030 1013
+ fp context switch: save idle, restore idle 969 948
+ fp context switch: save idle, restore initialized 275 267
+ fp context switch: save initialized, restore initialized 319 292
+ _Thread_Resume 512 480
+ _Thread_Unblock 121 139
+ _Thread_Ready 199 203
+ _Thread_Get 27 27
+ _Semaphore_Get 20 21
+ _Thread_Get: invalid id 5 5
+
+27 interrupt entry overhead: returns to interrupted task 0 0
+ interrupt exit overhead: returns to interrupted task 27 41
+ interrupt entry overhead: returns to nested interrupt 0 0
+ interrupt exit overhead: returns to nested interrupt 0 0
+ interrupt entry overhead: returns to preempting task 0 0
+ interrupt exit overhead: returns to preempting task 0 0
+
+28 rtems_port_create 574 560
+ rtems_port_external_to_internal 87 87
+ rtems_port_internal_to_external 86 86
+ rtems_port_delete 395 353
+
+29 rtems_rate_monotonic_create 621 633
+ rtems_rate_monotonic_period: initiate period -- returns to caller 773 694
+ rtems_rate_monotonic_period: obtain status 295 284
+ rtems_rate_monotonic_cancel 408 451
+ rtems_rate_monotonic_delete: inactive 453 471
+ rtems_rate_monotonic_delete: active 332 336
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 664 686
diff --git a/c/src/lib/libbsp/mips64orion/p4000/wrapup/Makefile.in b/c/src/lib/libbsp/mips64orion/p4000/wrapup/Makefile.in
new file mode 100644
index 0000000000..ff57be1813
--- /dev/null
+++ b/c/src/lib/libbsp/mips64orion/p4000/wrapup/Makefile.in
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup console liblnk
+CPU_PIECES=clock timer
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(CPU_PIECES), ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
+install: all
+
diff --git a/c/src/lib/libbsp/no_cpu/Makefile.in b/c/src/lib/libbsp/no_cpu/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/Makefile.in
new file mode 100644
index 0000000000..039b961a77
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/Makefile.in
@@ -0,0 +1,19 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SRCS=README
+
+all: $(SRCS)
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console shmsupp timer wrapup
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/README b/c/src/lib/libbsp/no_cpu/no_bsp/README
new file mode 100644
index 0000000000..8ed80e29f8
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/README
@@ -0,0 +1,69 @@
+#
+# $Id$
+#
+# This is a sample hardware description file for a BSP. This comment
+# block does not have to appear in a real one. The intention of this
+# file is to provide a central place to look when searching for
+# information about a board when starting a new BSP. For example,
+# you may want to find an existing timer driver for the chip you are
+# using on your board. It is easier to grep for the chip name in
+# all of the HARDWARE files than to peruse the source tree. Hopefully,
+# making the HARDDWARE files accurate will also alleviate the common
+# problem of not knowing anything about a board based on its BSP
+# name.
+#
+# NOTE: If you have a class of peripheral chip on board which
+# is not in this list please add it to this file so
+# others will also use the same name.
+#
+# Timer resolution is the way it is configured in this BSP.
+# On a counting timer, this is the length of time which
+# corresponds to 1 count.
+#
+
+BSP NAME: fastsbc1
+BOARD: Fasssst Computers, Fast SBC-1
+BUS: SchoolBus
+CPU FAMILY: i386
+CPU: Intel Hexium
+COPROCESSORS: Witch Hex87
+MODE: 32 bit mode
+
+DEBUG MONITOR: HexBug
+
+PERIPHERALS
+===========
+TIMERS: Intel i8254
+ RESOLUTION: .0001 microseconds
+SERIAL PORTS: Zilog Z8530 (with 2 ports)
+REAL-TIME CLOCK: RTC-4
+DMA: Intel i8259
+VIDEO: none
+SCSI: none
+NETWORKING: none
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: RTC-4
+IOSUPP DRIVER: Zilog Z8530 port A
+SHMSUPP: polled and interrupts
+TIMER DRIVER: Intel i8254
+TTY DRIVER: stub only
+
+STDIO
+=====
+PORT: Console port 0
+ELECTRICAL: RS-232
+BAUD: 9600
+BITS PER CHARACTER: 8
+PARITY: None
+STOP BITS: 1
+
+NOTES
+=====
+
+(1) 900 Mhz and 950 Mhz versions.
+
+(2) 1 Gb or 2 Gb RAM.
+
+(3) PC compatible if HexBug not enabled.
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/clock/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/clock/Makefile.in
new file mode 100644
index 0000000000..1bbbda6e96
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/clock/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c b/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c
new file mode 100644
index 0000000000..1925ceb3f3
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c
@@ -0,0 +1,191 @@
+/* ckinit.c
+ *
+ * This file provides a template for the clock device driver initialization.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <bsp.h>
+
+void Clock_exit( void );
+rtems_isr Clock_isr( rtems_vector_number vector );
+
+
+/*
+ * The interrupt vector number associated with the clock tick device
+ * driver.
+ */
+
+#define CLOCK_VECTOR 4
+
+/*
+ * Clock_driver_ticks is a monotonically increasing counter of the
+ * number of clock ticks since the driver was initialized.
+ */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+/*
+ * Clock_isrs is the number of clock ISRs until the next invocation of
+ * the RTEMS clock tick routine. The clock tick device driver
+ * gets an interrupt once a millisecond and counts down until the
+ * length of time between the user configured microseconds per tick
+ * has passed.
+ */
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * The previous ISR on this clock tick interrupt vector.
+ */
+
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+
+/*
+ * Isr Handler
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+/*
+ * bump the number of clock driver ticks since initialization
+ *
+ * determine if it is time to announce the passing of tick as configured
+ * to RTEMS through the rtems_clock_tick directive
+ *
+ * perform any timer dependent tasks
+ */
+}
+
+/*
+ * Install_clock
+ *
+ * Install a clock tick handler and reprograms the chip. This
+ * is used to initially establish the clock tick.
+ */
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ /*
+ * Initialize the clock tick device driver variables
+ */
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ /*
+ * If ticks_per_timeslice is configured as non-zero, then the user
+ * wants a clock tick.
+ */
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ /*
+ * Hardware specific initialize goes here
+ */
+
+ /* XXX */
+ }
+
+ /*
+ * Schedule the clock cleanup routine to execute if the application exits.
+ */
+
+ atexit( Clock_exit );
+}
+
+/*
+ * Clean up before the application exits
+ */
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+
+ /* XXX: turn off the timer interrupts */
+
+ /* XXX: If necessary, restore the old vector */
+ }
+}
+
+/*
+ * Clock_initialize
+ *
+ * Device driver entry point for clock tick driver initialization.
+ */
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/console/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/console/Makefile.in
new file mode 100644
index 0000000000..58d2734659
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/console/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/console/console.c b/c/src/lib/libbsp/no_cpu/no_bsp/console/console.c
new file mode 100644
index 0000000000..339c99926f
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/console/console.c
@@ -0,0 +1,223 @@
+/*
+ * This file contains the template for a console IO package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define NO_BSP_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ *ch = '\0'; /* return NULL for no particular reason */
+ return(TRUE);
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SOURCE.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SOURCE
+ */
+
+char inbyte( void )
+{
+ /*
+ * If polling, wait until a character is available.
+ */
+
+ return '\0';
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SOURCE. It may support
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ /*
+ * If polling, wait for the transmitter to be ready.
+ * Check for flow control requests and process.
+ * Then output the character.
+ */
+
+ /*
+ * Carriage Return/New line translation.
+ */
+
+ if ( ch == '\n' )
+ outbyte( '\r' );
+}
+
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/include/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h b/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h
new file mode 100644
index 0000000000..d8ba29d247
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h
@@ -0,0 +1,105 @@
+/* bsp.h
+ *
+ * This include file contains all board IO definitions.
+ *
+ * XXX : put yours in here
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __NO_BSP_h
+#define __NO_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Stuff for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), 0, 1 )
+
+#define Cause_tm27_intr()
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { \
+ }
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+void bsp_cleanup( void );
+
+no_cpu_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/include/coverhd.h b/c/src/lib/libbsp/no_cpu/no_bsp/include/coverhd.h
new file mode 100644
index 0000000000..16d7ee639c
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/include/coverhd.h
@@ -0,0 +1,115 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/Makefile.in
new file mode 100644
index 0000000000..c91ccb5214
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/addrconv.c b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/addrconv.c
new file mode 100644
index 0000000000..3e1f16ec81
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/addrconv.c
@@ -0,0 +1,31 @@
+/* Shm_Convert_address
+ *
+ * No address range conversion is required.
+ *
+ * Input parameters:
+ * address - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+void *Shm_Convert_address(
+ void *address
+)
+{
+ return ( address );
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/getcfg.c b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/getcfg.c
new file mode 100644
index 0000000000..c7bef36350
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/getcfg.c
@@ -0,0 +1,77 @@
+/* void Shm_Get_configuration( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the XXX target.
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+XXX: FIX THE COMMENTS BELOW WHEN THE CPU IS KNOWN
+ * NOTES: The XYZ does not have an interprocessor interrupt.
+ *
+ * The following table illustrates the configuration limitations:
+ *
+ * BUS MAX
+ * MODE ENDIAN NODES
+ * ========= ====== =======
+ * POLLED BIG 2+
+ * INTERRUPT **** NOT SUPPORTED ****
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * configured if currently polling of interrupt driven
+ */
+
+#define INTERRUPT 0 /* XXX: */
+#define POLLING 1 /* XXX: fix me -- is polling ONLY!!! */
+
+
+shm_config_table BSP_shm_cfgtbl;
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+ BSP_shm_cfgtbl.base = 0x0;
+ BSP_shm_cfgtbl.length = 1 * MEGABYTE;
+ BSP_shm_cfgtbl.format = SHM_BIG;
+
+ /*
+ * Override cause_intr or shm_isr if your target has
+ * special requirements.
+ */
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#else
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
+#endif
+
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+
+ *shmcfg = &BSP_shm_cfgtbl;
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/lock.c b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/lock.c
new file mode 100644
index 0000000000..54ee0b1ba7
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/lock.c
@@ -0,0 +1,86 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = LQ_UNLOCKED;
+}
+
+/* void _Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+ rtems_unsigned32 *lockptr = (rtems_unsigned32 *) &lq_cb->lock;
+ rtems_unsigned32 lock_value;
+
+ lock_value = 0x80000000;
+ rtems_interrupt_disable( isr_level );
+
+ Shm_isrstat = isr_level;
+ while ( lock_value ) {
+ asm volatile( ""
+ : "=r" (lockptr), "=r" (lock_value)
+ : "0" (lockptr), "1" (lock_value)
+ );
+ /*
+ * If not available, then may want to delay to reduce load on lock.
+ */
+
+ if ( lock_value )
+ delay( 10 ); /* approximately 10 microseconds */
+ }
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ lq_cb->lock = SHM_UNLOCK_VALUE;
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
+
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/mpisr.c b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/mpisr.c
new file mode 100644
index 0000000000..de2a4b0f1f
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/mpisr.c
@@ -0,0 +1,47 @@
+/* Shm_isr_nobsp()
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+#include <shm.h>
+
+rtems_isr Shm_isr_nobsp( void )
+{
+ /*
+ * If this routine has to do anything other than the mpisr.c
+ * found in the generic driver, then copy the contents of the generic
+ * mpisr.c and augment it to satisfy this particular board. Typically,
+ * you need to have a board specific mpisr.c when the interrupt
+ * must be cleared.
+ *
+ * If the generic mpisr.c satisifies your requirements, then
+ * remove this routine from your target's shmsupp/mpisb.c file.
+ * Then simply install the generic Shm_isr in the Shm_setvec
+ * routine below.
+ */
+}
+
+/* Shm_setvec
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void Shm_setvec( void )
+{
+ /* XXX: FIX ME!!! */
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/startup/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/startup/Makefile.in
new file mode 100644
index 0000000000..caa6bb55aa
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/startup/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart main sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=linkcmds $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+ $(INSTALL) linkcmds ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspclean.c b/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspclean.c
new file mode 100644
index 0000000000..90f64272a3
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspclean.c
@@ -0,0 +1,26 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and usually returns
+ * control to a monitor.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+void bsp_cleanup( void )
+{
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c b/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c
new file mode 100644
index 0000000000..6bf337ddf2
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c
@@ -0,0 +1,255 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /*
+ * The last parameter to RTEMS_Malloc_Initialize is the "chunk"
+ * size which a multiple of will be requested on each sbrk()
+ * call by malloc(). A value of 0 indicates that sbrk() should
+ * not be called to extend the heap.
+ */
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int bsp_start(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * Allocate the memory for the RTEMS Work Space. This can come from
+ * a variety of places: hard coded address, malloc'ed from outside
+ * RTEMS world (e.g. simulator or primitive memory manager), or (as
+ * typically done by stock BSPs) by subtracting the required amount
+ * of work space from the last physical address on the CPU board.
+ */
+
+ /*
+ * Copy the Configuration Table .. so we can change it
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Add 1 extension for stack checker
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ /*
+ * Need to "allocate" the memory for the RTEMS Workspace and
+ * tell the RTEMS configuration where it is. This memory is
+ * not malloc'ed. It is just "pulled from the air".
+ */
+
+ BSP_Configuration.work_space_start = (void *) 0;
+
+ /*
+ * initialize the CPU table for this BSP
+ */
+
+ /*
+ * we do not use the pretasking_hook
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_stack_size = 4096;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Don't forget the other CPU Table entries.
+ */
+
+ /*
+ * Start RTEMS
+ */
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+
+ bsp_cleanup();
+
+ return 0;
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/startup/linkcmds b/c/src/lib/libbsp/no_cpu/no_bsp/startup/linkcmds
new file mode 100644
index 0000000000..8eb0a140e3
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/startup/linkcmds
@@ -0,0 +1,46 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the FORCE CPU386 board.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+MEMORY
+ {
+ ram : org = 0x0, l = 1M
+ }
+
+SECTIONS
+{
+ .text 0x0 :
+ {
+ text_start = . ;
+ _text_start = . ;
+ *(.text)
+ _etext = ALIGN( 0x10 ) ;
+ }
+ .data ADDR( .text ) + SIZEOF( .text ):
+ {
+ data_start = . ;
+ _data_start = . ;
+ *(.data)
+ _edata = ALIGN( 0x10 ) ;
+ }
+ .bss ADDR( .data ) + SIZEOF( .data ):
+ {
+ bss_start = . ;
+ _bss_start = . ;
+ *(.bss)
+ *(COMMON)
+ end = . ;
+ __end = . ;
+ }
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/startup/main.c b/c/src/lib/libbsp/no_cpu/no_bsp/startup/main.c
new file mode 100644
index 0000000000..6b0a77bf44
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/startup/main.c
@@ -0,0 +1,38 @@
+/* main()
+ *
+ * This is the entry point for the application. It calls
+ * the bsp_start routine to the actual dirty work.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+int main(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ extern void bsp_start( int, char**, char ** );
+
+ bsp_start( argc, argv, environp );
+
+ /*
+ * May be able to return to the "crt/start.s" code but also
+ * may not be able to. Do something here which is board dependent.
+ */
+
+ rtems_fatal_error_occurred( 0 );
+
+ return 0; /* just to satisfy the native compiler */
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/startup/setvec.c b/c/src/lib/libbsp/no_cpu/no_bsp/startup/setvec.c
new file mode 100644
index 0000000000..8958537e53
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/startup/setvec.c
@@ -0,0 +1,44 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the target Board/CPU.
+ * This routine is allowed to be as board dependent as necessary.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+no_cpu_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ no_cpu_isr_entry previous_isr;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+ else {
+ /* XXX: install non-RTEMS ISR as "raw" interupt */
+ }
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/timer/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/timer/Makefile.in
new file mode 100644
index 0000000000..48c65c1c49
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/timer/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# NOTE: timerisr is normally an assembly file!!!
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer timerisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/timer/timer.c b/c/src/lib/libbsp/no_cpu/no_bsp/timer/timer.c
new file mode 100644
index 0000000000..4c5c733537
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/timer/timer.c
@@ -0,0 +1,105 @@
+/* timer.c
+ *
+ * This file manages the benchmark timer used by the RTEMS Timing Test
+ * Suite. Each measured time period is demarcated by calls to
+ * Timer_initialize() and Read_timer(). Read_timer() usually returns
+ * the number of microseconds since Timer_initialize() exitted.
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+rtems_unsigned32 Timer_interrupts;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+void Timer_initialize( void )
+{
+
+ /*
+ * Timer has never overflowed. This may not be necessary on some
+ * implemenations of timer but ....
+ */
+
+ Timer_interrupts = 0;
+
+ /*
+ * Somehow start the timer
+ */
+}
+
+/*
+ * The following controls the behavior of Read_timer().
+ *
+ * AVG_OVEREHAD is the overhead for starting and stopping the timer. It
+ * is usually deducted from the number returned.
+ *
+ * LEAST_VALID is the lowest number this routine should trust. Numbers
+ * below this are "noise" and zero is returned.
+ */
+
+#define AVG_OVERHEAD 0 /* It typically takes X.X microseconds */
+ /* (Y countdowns) to start/stop the timer. */
+ /* This value is in microseconds. */
+#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */
+
+int Read_timer( void )
+{
+ rtems_unsigned32 clicks;
+ rtems_unsigned32 total;
+
+ /*
+ * Read the timer and see how many clicks it has been since we started.
+ */
+
+ clicks = 0; /* XXX: read some HW here */
+
+ /*
+ * Total is calculated by taking into account the number of timer overflow
+ * interrupts since the timer was initialized and clicks since the last
+ * interrupts.
+ */
+
+ total = clicks * 0;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in XXX microsecond units */
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ /*
+ * Somehow convert total into microseconds
+ */
+ return (total - AVG_OVERHEAD);
+ }
+}
+
+/*
+ * Empty function call used in loops to measure basic cost of looping
+ * in Timing Test Suite.
+ */
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
+
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/timer/timerisr.c b/c/src/lib/libbsp/no_cpu/no_bsp/timer/timerisr.c
new file mode 100644
index 0000000000..1e39d76d2a
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/timer/timerisr.c
@@ -0,0 +1,37 @@
+/* timerisr.s
+ *
+ * If required this ISR is used to bump a count of interval "overflow"
+ * interrupts which have occurred since the timer was started. The
+ * number of overflows is taken into account in the Read_timer()
+ * routine if necessary.
+ *
+ * To reduce overhead this is best to be the "rawest" hardware interupt
+ * handler you can write. This should be the only interrupt which can
+ * occur during the measured time period.
+ *
+ * NOTE: This file is USUALLY in assembly and is LEAN AND MEAN.
+ * Any code in this isr is pure overhead which can perturb
+ * the accuracy of the Timing Test Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+extern rtems_unsigned32 _Timer_interrupts;
+
+void timerisr( void )
+{
+ /*
+ * _Timer_interrupts += TIMER_BETWEEN_OVERFLOWS (usually in microseconds)
+ * return from interrupt
+ */
+}
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/times b/c/src/lib/libbsp/no_cpu/no_bsp/times
new file mode 100644
index 0000000000..2ac0b9ee22
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/times
@@ -0,0 +1,194 @@
+#
+# Timing Test Suite Results for the NO_BSP
+#
+# NOTE: This is just a template. The times are irrelevant since this BSP
+# can only be compiled -- not executed.
+#
+# $Id$
+#
+
+Board:
+CPU: include coprocessor if applicable
+Clock Speed:
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column X:
+Column Y:
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/no_cpu/no_bsp/wrapup/Makefile.in b/c/src/lib/libbsp/no_cpu/no_bsp/wrapup/Makefile.in
new file mode 100644
index 0000000000..0e6fe816b0
--- /dev/null
+++ b/c/src/lib/libbsp/no_cpu/no_bsp/wrapup/Makefile.in
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup clock console shmsupp timer
+GENERIC_PIECES=shmdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/powerpc/Makefile.in b/c/src/lib/libbsp/powerpc/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/powerpc/papyrus/Makefile.in b/c/src/lib/libbsp/powerpc/papyrus/Makefile.in
new file mode 100644
index 0000000000..17aaea81d5
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/Makefile.in
@@ -0,0 +1,19 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SRCS=README
+
+all: $(SRCS)
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include dlentry flashentry startup wrapup
diff --git a/c/src/lib/libbsp/powerpc/papyrus/README b/c/src/lib/libbsp/powerpc/papyrus/README
new file mode 100644
index 0000000000..9d3e20b592
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/README
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+
+BSP NAME: papyrus
+BOARD: i cubed, papyrus development board
+BUS: N/A
+CPU FAMILY: ppc
+CPU: PowerPC 403GA
+COPROCESSORS: N/A
+MODE: 32 bit mode
+
+DEBUG MONITOR: Modified IBM OpenBios
+
+PERIPHERALS
+===========
+TIMERS: 403GA internal
+ RESOLUTION: .1 microseconds
+SERIAL PORTS: 403GA internal with extra lines
+REAL-TIME CLOCK: 403GA internal
+DMA: 403GA internal
+VIDEO: Laser Printer
+SCSI: none
+NETWORKING: AMD PCNet32
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: 403GA internal
+IOSUPP DRIVER: N/A
+SHMSUPP: N/A
+TIMER DRIVER: 403GA internal
+TTY DRIVER: 403GA internal
+
+STDIO
+=====
+PORT: Console port 0
+ELECTRICAL: RS-232
+BAUD: 9600
+BITS PER CHARACTER: 8
+PARITY: None
+STOP BITS: 1
+
+Notes
+=====
+
+Papyrus only supports single processor operations.
+
+The code under c/src/lib/libbsp/ppc/papyrus only really supports
+the PowerOpen ABI with an ELF assembler.
+
diff --git a/c/src/lib/libbsp/powerpc/papyrus/bsp_specs b/c/src/lib/libbsp/powerpc/papyrus/bsp_specs
new file mode 100644
index 0000000000..c70f7a3e9e
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg:
+{!pg:
+g:
+{!g:
+p:
+!p:
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -u __vectors -u download_entry -N -T linkcmds%s
+
+lib: replace
+mrtems: ecrti%O%s -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/powerpc/papyrus/dlentry/Makefile.in b/c/src/lib/libbsp/powerpc/papyrus/dlentry/Makefile.in
new file mode 100644
index 0000000000..2078226e73
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/dlentry/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/dlentry.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=dlentry
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/powerpc/papyrus/dlentry/dlentry.s b/c/src/lib/libbsp/powerpc/papyrus/dlentry/dlentry.s
new file mode 100644
index 0000000000..e5df33a114
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/dlentry/dlentry.s
@@ -0,0 +1,251 @@
+/* dlentry.s 1.0 - 95/08/08
+ *
+ * This file contains the entry veneer for RTEMS programs
+ * downloaded to Papyrus.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+/*
+ * The Papyrus ELF link scripts support three special sections:
+ * .entry The actual entry point, this must contain less
+ * than 256 bytes of code/data to fit below the
+ * .vectors section. This always preceeds any other
+ * code or data.
+ * .vectors The section containing the interrupt entry veneers.
+ * .entry2 Any code overflowing from .entry
+ * .descriptors The PowerOpen function indirection blocks.
+ */
+
+/*
+ * Downloaded code loads the vectors separately to 0x00000100,
+ * so .entry can be over 256 bytes.
+ *
+ * The other sections are linked in the following order:
+ * .entry
+ * .entry2
+ * .text
+ * .descriptors
+ * .data
+ * .bss
+ * usually starting from 0x00020000.
+ *
+ * The initial stack is set to run BELOW the code base address.
+ *
+ * All the entry veneer has to do is to clear the BSS.
+ */
+
+/*
+ * GDB likes to have debugging information for the entry veneer.
+ * Here is some DWARF information.
+ */
+
+#if PPC_ASM == PPC_ASM_ELF
+ .section .entry,"ax",@progbits
+.L_text_b:
+.L_LC1:
+ .previous
+
+.section .debug_sfnames
+.L_sfnames_b:
+ .byte "/home/andy/powerpc/rtems-3.2.0/c/src/lib/libcpu/ppc/ppc403/dlentry/"
+ .byte 0
+.L_F0:
+ .byte "dlentry.s"
+ .byte 0
+ .previous
+
+.section .line
+.L_line_b:
+ .4byte .L_line_e-.L_line_b
+ .4byte .L_text_b
+.L_LE1:
+.L_line_last:
+ .4byte 0x0
+ .2byte 0xffff
+ .4byte .L_text_e-.L_text_b
+.L_line_e:
+ .previous
+
+.section .debug_srcinfo
+.L_srcinfo_b:
+ .4byte .L_line_b
+ .4byte .L_sfnames_b
+ .4byte .L_text_b
+ .4byte .L_text_e
+ .4byte 0xffffffff
+ .4byte .L_LE1-.L_line_b
+ .4byte .L_F0-.L_sfnames_b
+ .4byte .L_line_last-.L_line_b
+ .4byte 0xffffffff
+ .previous
+
+.section .debug_pubnames
+ .4byte .L_debug_b
+ .4byte .L_P0
+ .byte "download_entry"
+ .byte 0
+ .4byte 0x0
+ .byte 0
+ .previous
+
+.section .debug_aranges
+ .4byte .L_debug_b
+ .4byte .L_text_b
+ .4byte .L_text_e-.L_text_b
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0x0
+ .4byte 0x0
+ .previous
+
+.section .debug
+.L_debug_b:
+.L_D1:
+ .4byte .L_D1_e-.L_D1
+ .2byte 0x11 /* TAG_compile_unit */
+ .2byte 0x12 /* AT_sibling */
+ .4byte .L_D2
+ .2byte 0x38 /* AT_name */
+ .byte "dlentry.s"
+ .byte 0
+ .2byte 0x258 /* AT_producer */
+ .byte "GAS 2.5.2"
+ .byte 0
+ .2byte 0x111 /* AT_low_pc */
+ .4byte .L_text_b
+ .2byte 0x121 /* AT_high_pc */
+ .4byte .L_text_e
+ .2byte 0x106 /* AT_stmt_list */
+ .4byte .L_line_b
+ .2byte 0x1b8 /* AT_comp_dir */
+ .byte "/home/andy/powerpc/rtems-3.2.0/c/src/lib/libcpu/ppc/ppc403/dlentry/"
+ .byte 0
+ .2byte 0x8006 /* AT_sf_names */
+ .4byte .L_sfnames_b
+ .2byte 0x8016 /* AT_src_info */
+ .4byte .L_srcinfo_b
+.L_D1_e:
+.L_P0:
+.L_D3:
+ .4byte .L_D3_e-.L_D3
+ .2byte 0x6 /* TAG_global_subroutine */
+ .2byte 0x12 /* AT_sibling */
+ .4byte .L_D4
+ .2byte 0x38 /* AT_name */
+ .byte "download_entry"
+ .byte 0
+ .2byte 0x278 /* AT_prototyped */
+ .byte 0
+ .2byte 0x111 /* AT_low_pc */
+ .4byte .L_text_b
+ .2byte 0x121 /* AT_high_pc */
+ .4byte .L_text_e
+ .2byte 0x8041 /* AT_body_begin */
+ .4byte .L_text_b
+ .2byte 0x8051 /* AT_body_end */
+ .4byte .L_text_e
+.L_D3_e:
+
+.L_D4:
+ .4byte .L_D4_e-.L_D4
+ .align 2
+.L_D4_e:
+.L_D2:
+ .previous
+#endif
+
+/*-------------------------------------------------------------------------------
+ * ROM Vector area.
+ *------------------------------------------------------------------------------*/
+#if PPC_ASM == PPC_ASM_ELF
+ .section .entry
+#else
+ .csect .text[PR]
+#endif
+
+ PUBLIC_VAR (download_entry)
+SYM(download_entry):
+ bl .startup
+base_addr:
+
+/*-------------------------------------------------------------------------------
+ * Parameters from linker
+ *------------------------------------------------------------------------------*/
+toc_pointer:
+#if PPC_ASM == PPC_ASM_ELF
+ .long s.got
+#else
+ .long TOC[tc0]
+#endif
+bss_length:
+ .long bss.size
+bss_addr:
+ .long bss.start
+/*-------------------------------------------------------------------------------
+ * Reset_entry.
+ *------------------------------------------------------------------------------*/
+.startup:
+ /* Get start address, stack grows down from here... */
+ mflr r1
+
+ /* Assume Bank regs set up..., cache etc. */
+ bl bssclr
+
+ /*-----------------------------------------------------------------------
+ * C_setup.
+ *----------------------------------------------------------------------*/
+ lwz r2,toc_pointer-base_addr(r1) /* set r2 to toc */
+ addi r1,r1,-56-4 /* start stack at text_addr - 56 */
+ addi r3,r0,0x0 /* clear r3 */
+ stw r3, 0(r1) /* Clear stack chain */
+ stw r3, 4(r1)
+ stw r3, 8(r1)
+ stw r3, 12(r1)
+ .extern SYM (main)
+ b SYM (main) /* call the first C routine */
+
+/*-------------------------------------------------------------------------------
+ * bssclr.
+ *------------------------------------------------------------------------------*/
+bssclr:
+ /*-----------------------------------------------------------------------
+ * Data move finished, zero out bss.
+ *----------------------------------------------------------------------*/
+ lwz r2,bss_addr-base_addr(r1) /* start of bss set by loader */
+ lwz r3,bss_length-base_addr(r1) /* bss length */
+ rlwinm. r3,r3,30,0x3FFFFFFF /* form length/4 */
+ beqlr /* no bss */
+ mtctr r3 /* set ctr reg */
+ xor r6,r6,r6 /* r6 = 0 */
+clear_bss:
+ stswi r6,r2,0x4 /* store r6 */
+ addi r3,r2,0x4 /* update r2 */
+ bdnz clear_bss /* decrement counter and loop */
+ blr /* return */
+.L_text_e:
+
+#if PPC_ABI == PPC_ABI_POWEROPEN
+ DESCRIPTOR (startup)
+#endif
diff --git a/c/src/lib/libbsp/powerpc/papyrus/flashentry/Makefile.in b/c/src/lib/libbsp/powerpc/papyrus/flashentry/Makefile.in
new file mode 100644
index 0000000000..e02c8bb3d6
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/flashentry/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/flashentry.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=flashentry
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/powerpc/papyrus/flashentry/flashentry.s b/c/src/lib/libbsp/powerpc/papyrus/flashentry/flashentry.s
new file mode 100644
index 0000000000..a6a8f5ff86
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/flashentry/flashentry.s
@@ -0,0 +1,289 @@
+/* dlentry.s 1.0 - 95/08/08
+ *
+ * This file contains the entry veneer for RTEMS programs
+ * stored in Papyrus' flash ROM.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+/*
+ * The Papyrus ELF link scripts support three special sections:
+ * .entry The actual entry point, this must contain less
+ * than 256 bytes of code/data to fit below the
+ * .vectors section. This always preceeds any other
+ * code or data.
+ * .vectors The section containing the interrupt entry veneers.
+ * .entry2 Any code overflowing from .entry
+ * .descriptors The PowerOpen function indirection blocks.
+ */
+
+/*
+ * Flash sections are linked in the following order:
+ * .entry
+ * .vectors
+ * .entry2
+ * .text
+ * .descriptors
+ * .data
+ * .bss
+ * usually starting from 0xFFF00000.
+ *
+ * The initial stack is set to run BELOW the final location of
+ * the initialised data.
+ *
+ * All the entry veneer has to do is to copy the initialised data
+ * to its final location and clear the BSS.
+ */
+
+/*
+ * GDB likes to have debugging information for the entry veneer.
+ * Here is some DWARF information.
+ */
+
+#if PPC_ASM == PPC_ASM_ELF
+ .section .entry,"ax",@progbits
+.L_text_b:
+.L_LC1:
+ .previous
+
+.section .debug_sfnames
+.L_sfnames_b:
+ .byte "/home/andy/powerpc/rtems-3.2.0/c/src/lib/libcpu/ppc/ppc403/flashentry/"
+ .byte 0
+.L_F0:
+ .byte "flashentry.s"
+ .byte 0
+ .previous
+
+.section .line
+.L_line_b:
+ .4byte .L_line_e-.L_line_b
+ .4byte .L_text_b
+.L_LE1:
+.L_line_last:
+ .4byte 0x0
+ .2byte 0xffff
+ .4byte .L_text_e-.L_text_b
+.L_line_e:
+ .previous
+
+.section .debug_srcinfo
+.L_srcinfo_b:
+ .4byte .L_line_b
+ .4byte .L_sfnames_b
+ .4byte .L_text_b
+ .4byte .L_text_e
+ .4byte 0xffffffff
+ .4byte .L_LE1-.L_line_b
+ .4byte .L_F0-.L_sfnames_b
+ .4byte .L_line_last-.L_line_b
+ .4byte 0xffffffff
+ .previous
+
+.section .debug_pubnames
+ .4byte .L_debug_b
+ .4byte .L_P0
+ .byte "flash_entry"
+ .byte 0
+ .4byte 0x0
+ .byte 0
+ .previous
+
+.section .debug_aranges
+ .4byte .L_debug_b
+ .4byte .L_text_b
+ .4byte .L_text_e-.L_text_b
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0
+ .4byte 0x0
+ .4byte 0x0
+ .previous
+
+.section .debug
+.L_debug_b:
+.L_D1:
+ .4byte .L_D1_e-.L_D1
+ .2byte 0x11 /* TAG_compile_unit */
+ .2byte 0x12 /* AT_sibling */
+ .4byte .L_D2
+ .2byte 0x38 /* AT_name */
+ .byte "flashentry.s"
+ .byte 0
+ .2byte 0x258 /* AT_producer */
+ .byte "GAS 2.5.2"
+ .byte 0
+ .2byte 0x111 /* AT_low_pc */
+ .4byte .L_text_b
+ .2byte 0x121 /* AT_high_pc */
+ .4byte .L_text_e
+ .2byte 0x106 /* AT_stmt_list */
+ .4byte .L_line_b
+ .2byte 0x1b8 /* AT_comp_dir */
+ .byte "/home/andy/powerpc/rtems-3.2.0/c/src/lib/libcpu/ppc/ppc403/dlentry/"
+ .byte 0
+ .2byte 0x8006 /* AT_sf_names */
+ .4byte .L_sfnames_b
+ .2byte 0x8016 /* AT_src_info */
+ .4byte .L_srcinfo_b
+.L_D1_e:
+.L_P0:
+.L_D3:
+ .4byte .L_D3_e-.L_D3
+ .2byte 0x6 /* TAG_global_subroutine */
+ .2byte 0x12 /* AT_sibling */
+ .4byte .L_D4
+ .2byte 0x38 /* AT_name */
+ .byte "flash_entry"
+ .byte 0
+ .2byte 0x278 /* AT_prototyped */
+ .byte 0
+ .2byte 0x111 /* AT_low_pc */
+ .4byte .L_text_b
+ .2byte 0x121 /* AT_high_pc */
+ .4byte .L_text_e
+ .2byte 0x8041 /* AT_body_begin */
+ .4byte .L_text_b
+ .2byte 0x8051 /* AT_body_end */
+ .4byte .L_text_e
+.L_D3_e:
+
+.L_D4:
+ .4byte .L_D4_e-.L_D4
+ .align 2
+.L_D4_e:
+.L_D2:
+ .previous
+#endif
+
+/*-------------------------------------------------------------------------------
+ * ROM Vector area.
+ *------------------------------------------------------------------------------*/
+#if PPC_ASM == PPC_ASM_ELF
+ .section .entry
+#else
+ .csect .text[PR]
+#endif
+ PUBLIC_VAR (flash_entry)
+SYM (flash_entry):
+ bl .startup
+base_addr:
+
+/*-------------------------------------------------------------------------------
+ * Parameters from linker
+ *------------------------------------------------------------------------------*/
+toc_pointer:
+#if PPC_ASM == PPC_ASM_ELF
+ .long s.got
+#else
+ .long TOC[tc0]
+#endif
+text_length:
+ .long t.size
+text_addr:
+ .long t.start
+data_length:
+ .long copy.size
+data_addr:
+ .long copy.dest
+bss_length:
+ .long bss.size
+bss_addr:
+ .long bss.start
+
+/*-------------------------------------------------------------------------------
+ * Reset_entry.
+ *------------------------------------------------------------------------------*/
+.startup:
+ /* Get start address */
+ mflr r1
+
+ /* Assume Bank regs set up..., cache etc. */
+
+ /*-----------------------------------------------------------------------
+ * Check the DRAM where STACK+ DATA+ BBS will be placed. If this is OK
+ * we will return here.
+ *----------------------------------------------------------------------*/
+ bl rom2ram
+ /*-----------------------------------------------------------------------
+ * Enable two 128MB cachable regions.
+ *----------------------------------------------------------------------*/
+ addis r2,r0,0x8000
+ addi r2,r2,0x0001
+
+ mtspr 0x3fb, r2 /* ICCR */
+ mtspr 0x3fa, r2 /* DCCR */
+
+ /*-----------------------------------------------------------------------
+ * C_setup.
+ *----------------------------------------------------------------------*/
+ lwz r2,toc_pointer-base_addr(r1) /* set r2 to toc */
+ lwz r1,data_addr-base_addr(r1) /* set r1 to data_addr */
+ addi r1,r1,-56 /* start stack at data_addr - 56 */
+ addi r3,r0,0x0 /* clear r3 */
+ stw r3, 0(r1) /* Clear stack chain */
+ stw r3, 4(r1)
+ stw r3, 8(r1)
+ stw r3, 12(r1)
+ .extern SYM (main)
+ b SYM (main) /* call the first C routine */
+
+/*-------------------------------------------------------------------------------
+ * Rom2ram.
+ *------------------------------------------------------------------------------*/
+rom2ram:
+ lwz r2,data_addr-base_addr(r1) /* start of data set by loader */
+ lwz r3,data_length-base_addr(r1) /* data length */
+ rlwinm r3,r3,30,0x3FFFFFFF /* form length/4 */
+ mtctr r3 /* set ctr reg */
+ /*-----------------------------------------------------------------------
+ * Calculate offset of data in image.
+ *----------------------------------------------------------------------*/
+ lwz r5,text_length-base_addr(r1) /* get text length */
+ lwz r4,text_addr-base_addr(r1) /* get text length */
+ add r4,r4,r5 /* r4 = data pointer */
+move_data:
+ lswi r6,r4,0x4 /* load r6 */
+ stswi r6,r2,0x4 /* store r6 */
+ addi r4,r4,0x4 /* update r4 */
+ addi r2,r2,0x4 /* update r2 */
+ bdnz move_data /* decrement counter and loop */
+ /*-----------------------------------------------------------------------
+ * Data move finished, zero out bss.
+ *----------------------------------------------------------------------*/
+ lwz r2,bss_addr-base_addr(r1) /* start of bss set by loader */
+ lwz r3,bss_length-base_addr(r1) /* bss length */
+ rlwinm. r3,r3,30,0x3FFFFFFF /* form length/4 */
+ beqlr /* no bss */
+ mtctr r3 /* set ctr reg */
+ xor r6,r6,r6 /* r6 = 0 */
+clear_bss:
+ stswi r6,r2,0x4 /* store r6 */
+ addi r3,r2,0x4 /* update r2 */
+ bdnz clear_bss /* decrement counter and loop */
+ blr /* return */
+.L_text_e:
+
+#if PPC_ABI == PPC_ABI_POWEROPEN
+ DESCRIPTOR (startup)
+#endif
diff --git a/c/src/lib/libbsp/powerpc/papyrus/include/Makefile.in b/c/src/lib/libbsp/powerpc/papyrus/include/Makefile.in
new file mode 100644
index 0000000000..20c100b31f
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/include/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
+
+install: all
diff --git a/c/src/lib/libbsp/powerpc/papyrus/include/bsp.h b/c/src/lib/libbsp/powerpc/papyrus/include/bsp.h
new file mode 100644
index 0000000000..38d71954c7
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/include/bsp.h
@@ -0,0 +1,154 @@
+/* bsp.h
+ *
+ * This include file contains all Papyrus board IO definitions.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/include/bsp.h
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PAPYRUS_h
+#define __PAPYRUS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef ASM
+/* Definition of where to store registers in alignment handler */
+#define ALIGN_REGS 0x0140
+
+#else
+#include <rtems.h>
+#include <console.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+
+/*
+ * Stuff for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 0
+
+#define Install_tm27_vector( handler ) set_vector( (handler), PPC_IRQ_SCALL, 1 )
+
+#define Cause_tm27_intr() asm volatile ("sc")
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+#define delay( microseconds ) \
+ { \
+ unsigned32 start, ticks, now; \
+ asm volatile ("mfspr %0, 0x3dd" : "=r" (start)); /* TBLO */ \
+ ticks = (microseconds) * Cpu_table.clicks_per_usec; \
+ do \
+ asm volatile ("mfspr %0, 0x3dd" : "=r" (now)); /* TBLO */ \
+ while (now - start < ticks); \
+ }
+
+
+/* Constants */
+
+#define RAM_START 0
+#define RAM_END 0x00200000
+
+
+/* Some useful LED debugging bits */
+/* LED numbers are from 0-2 */
+#define __led_base ((volatile int *)0x7F200000)
+
+/* Turn a LED on */
+#define led_on(n) (__led_base[n] = 0)
+
+/* Turn a LED off */
+#define led_off(n) (__led_base[n] = 1)
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration; /* owned by BSP */
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+int bsp_start(
+ int argc,
+ char **argv,
+ char **environp
+);
+
+void bsp_cleanup( void );
+
+rtems_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+);
+#endif /* ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/powerpc/papyrus/include/coverhd.h b/c/src/lib/libbsp/powerpc/papyrus/include/coverhd.h
new file mode 100644
index 0000000000..9a41de7f9b
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/include/coverhd.h
@@ -0,0 +1,135 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ * This file should be updated after running the C overhead timing
+ * test. Once this update has been performed, the RTEMS Time Test
+ * Suite should be rebuilt to account for these overhead times in the
+ * timing results.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Updated for a 25MHz Papyrus by Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * Units are 100ns.
+ *
+ * These numbers are of questionable use, as they are developed by calling
+ * the routine many times, thus getting its entry veneer into the (small)
+ * cache on the 403GA. This in general is not true of the RTEMS timing
+ * tests, which usually call a routine only once, thus having no cache loaded
+ * advantage.
+ *
+ * Whether the directive times are useful after deducting the function call
+ * overhead is also questionable. The user is more interested generally
+ * in the total cost of a directive, not the cost if the procedure call
+ * is inlined! (In general this is not true).
+ *
+ * Andrew Bray 18/08/1995
+ *
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 1
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 1
+#define CALLING_OVERHEAD_TASK_CREATE 3
+#define CALLING_OVERHEAD_TASK_IDENT 1
+#define CALLING_OVERHEAD_TASK_START 1
+#define CALLING_OVERHEAD_TASK_RESTART 1
+#define CALLING_OVERHEAD_TASK_DELETE 1
+#define CALLING_OVERHEAD_TASK_SUSPEND 1
+#define CALLING_OVERHEAD_TASK_RESUME 1
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 1
+#define CALLING_OVERHEAD_TASK_MODE 1
+#define CALLING_OVERHEAD_TASK_GET_NOTE 1
+#define CALLING_OVERHEAD_TASK_SET_NOTE 1
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 4
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 1
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 1
+#define CALLING_OVERHEAD_CLOCK_GET 4
+#define CALLING_OVERHEAD_CLOCK_SET 3
+#define CALLING_OVERHEAD_CLOCK_TICK 1
+
+#define CALLING_OVERHEAD_TIMER_CREATE 1
+#define CALLING_OVERHEAD_TIMER_IDENT 1
+#define CALLING_OVERHEAD_TIMER_DELETE 1
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 2
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 5
+#define CALLING_OVERHEAD_TIMER_RESET 1
+#define CALLING_OVERHEAD_TIMER_CANCEL 1
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 2
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 1
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 1
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 1
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 1
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 2
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 1
+
+#define CALLING_OVERHEAD_EVENT_SEND 1
+#define CALLING_OVERHEAD_EVENT_RECEIVE 2
+#define CALLING_OVERHEAD_SIGNAL_CATCH 1
+#define CALLING_OVERHEAD_SIGNAL_SEND 1
+#define CALLING_OVERHEAD_PARTITION_CREATE 3
+#define CALLING_OVERHEAD_PARTITION_IDENT 1
+#define CALLING_OVERHEAD_PARTITION_DELETE 1
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 1
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 1
+#define CALLING_OVERHEAD_REGION_CREATE 3
+#define CALLING_OVERHEAD_REGION_IDENT 1
+#define CALLING_OVERHEAD_REGION_DELETE 1
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 2
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 1
+#define CALLING_OVERHEAD_PORT_CREATE 2
+#define CALLING_OVERHEAD_PORT_IDENT 1
+#define CALLING_OVERHEAD_PORT_DELETE 1
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 1
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 2
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 2
+#define CALLING_OVERHEAD_IO_OPEN 2
+#define CALLING_OVERHEAD_IO_CLOSE 2
+#define CALLING_OVERHEAD_IO_READ 2
+#define CALLING_OVERHEAD_IO_WRITE 2
+#define CALLING_OVERHEAD_IO_CONTROL 2
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 1
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 1
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/powerpc/papyrus/startup/Makefile.in b/c/src/lib/libbsp/powerpc/papyrus/startup/Makefile.in
new file mode 100644
index 0000000000..a69e0032cc
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/startup/Makefile.in
@@ -0,0 +1,55 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart main sbrk setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/powerpc/papyrus/startup/bspclean.c b/c/src/lib/libbsp/powerpc/papyrus/startup/bspclean.c
new file mode 100644
index 0000000000..34bc82c6a7
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/startup/bspclean.c
@@ -0,0 +1,44 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and usually returns
+ * control to a monitor.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/startup/bspclean.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+void bsp_cleanup( void )
+{
+ rtems_fatal_error_occurred(0);
+}
diff --git a/c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c b/c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c
new file mode 100644
index 0000000000..a27b1205d5
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/startup/bspstart.c
@@ -0,0 +1,276 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/startup/bspstart.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+
+char *rtems_progname;
+
+/* Initialize whatever libc we are using
+ * called from postdriver hook
+ */
+
+void bsp_libc_init()
+{
+ extern int _end;
+ rtems_unsigned32 heap_start;
+
+ heap_start = (rtems_unsigned32) &_end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /*
+ * The last parameter to RTEMS_Malloc_Initialize is the "chunk"
+ * size which a multiple of will be requested on each sbrk()
+ * call by malloc(). A value of 0 indicates that sbrk() should
+ * not be called to extend the heap.
+ */
+
+ RTEMS_Malloc_Initialize((void *) heap_start, 64 * 1024, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+
+}
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * NOTES:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+}
+
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+int bsp_start(
+ int argc,
+ char **argv,
+ char **environp
+)
+{
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * Allocate the memory for the RTEMS Work Space. This can come from
+ * a variety of places: hard coded address, malloc'ed from outside
+ * RTEMS world (e.g. simulator or primitive memory manager), or (as
+ * typically done by stock BSPs) by subtracting the required amount
+ * of work space from the last physical address on the CPU board.
+ */
+
+ /*
+ * Copy the Configuration Table .. so we can change it
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * Add 1 region for the RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+#ifdef RTEMS_NEWLIB
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add 1 extension for stack checker
+ */
+
+#ifdef STACK_CHECKER_ON
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ /*
+ * Need to "allocate" the memory for the RTEMS Workspace and
+ * tell the RTEMS configuration where it is. This memory is
+ * not malloc'ed. It is just "pulled from the air".
+ */
+
+ BSP_Configuration.work_space_start = (void *)
+ RAM_END - BSP_Configuration.work_space_size;
+
+ /*
+ * initialize the CPU table for this BSP
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ Cpu_table.interrupt_stack_size = 4 * 1024;
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Don't forget the other CPU Table entries.
+ */
+
+ Cpu_table.clicks_per_usec = 10;
+
+ Cpu_table.serial_per_sec = 10000000;
+
+ Cpu_table.serial_external_clock = 1;
+
+ Cpu_table.serial_xon_xoff = 0;
+
+ Cpu_table.serial_cts_rts = 1;
+
+ Cpu_table.serial_rate = 9600;
+
+ Cpu_table.timer_average_overhead = 2;
+
+ Cpu_table.timer_least_valid = 3;
+
+ /*
+ * Start RTEMS
+ */
+
+ rtems_initialize_executive( &BSP_Configuration, &Cpu_table );
+
+ bsp_cleanup();
+}
diff --git a/c/src/lib/libbsp/powerpc/papyrus/startup/linkcmds b/c/src/lib/libbsp/powerpc/papyrus/startup/linkcmds
new file mode 100644
index 0000000000..00bf4c6876
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/startup/linkcmds
@@ -0,0 +1,115 @@
+/*
+ * This file contains directives for the GNU linker which are specific
+ * to the Papyrus.
+ *
+ * $Id$
+ */
+
+OUTPUT_FORMAT("elf32-powerpc", "elf32-powerpc",
+ "elf32-powerpc")
+OUTPUT_ARCH(powerpc)
+ SEARCH_DIR(/usr/local/powerpc-rtems/lib);
+
+ENTRY(download_entry)
+
+MEMORY
+ {
+ RAM : ORIGIN = 0, LENGTH = 4M
+ FLASH : ORIGIN = 0xFF000000, LENGTH = 0x80000
+ EPROM : ORIGIN = 0xFFFE0000, LENGTH = 0x20000
+ }
+
+/* Do we need any of these for elf?
+ __DYNAMIC = 0; */
+
+/* What are these for? */
+
+__EXCEPT_START__ = 0;
+__EXCEPT_END__ = 0;
+__SDATA2_START__ = 0;
+__SDATA2_END__ = 0;
+__SBSS2_START__ = 0;
+__SBSS2_END__ = 0;
+__FIXUP_START__ = 0;
+__FIXUP_END__ = 0;
+__GOT2_START__ = 0;
+__GOT2_END__ = 0;
+__SDATA_START__ = 0;
+__SDATA_END__ = 0;
+
+
+SECTIONS
+{
+ .vectors 0x0100 :
+ {
+ *(.vectors)
+ }
+
+ .text 0x20000 :
+ {
+ *(.entry)
+ *(.entry2)
+ *(.text)
+ *(.rodata)
+ *(.rodata1)
+ *(.descriptors)
+ *(rom_ver)
+ etext = ALIGN(0x10);
+ _etext = .;
+ __CTOR_LIST__ = .;
+ LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
+ *(.ctors)
+ LONG(0)
+ __CTOR_END__ = .;
+ __DTOR_LIST__ = .;
+ LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
+ *(.dtors)
+ LONG(0)
+ __DTOR_END__ = .;
+ *(.lit)
+ *(.shdata)
+ *(.init)
+ *(.fini)
+ _endtext = .;
+ } > RAM
+
+ /* R/W Data */
+ .data :
+ {
+ *(.data)
+ *(.data1)
+ } > RAM
+
+ __GOT_START__ = .;
+ .got :
+ {
+ s.got = .;
+ *(.got.plt) *(.got)
+ } > RAM
+ __GOT_END__ = .;
+
+ __SBSS_START__ = .;
+ .bss :
+ {
+ bss.start = .;
+ *(.bss) *(.sbss) *(COMMON)
+ bss.end = ALIGN(4);
+ } > RAM
+ __SBSS_END__ = .;
+
+ bss.size = bss.end - bss.start;
+ PROVIDE(_end = bss.end);
+
+ .line 0 : { *(.line) }
+ .debug 0 : { *(.debug) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_aregion 0 : { *(.debug_aregion) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+}
+
+
diff --git a/c/src/lib/libbsp/powerpc/papyrus/startup/setvec.c b/c/src/lib/libbsp/powerpc/papyrus/startup/setvec.c
new file mode 100644
index 0000000000..bd0052c680
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/startup/setvec.c
@@ -0,0 +1,58 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the target Board/CPU.
+ * This routine is allowed to be as board dependent as necessary.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/startup/setvec.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <bsp.h>
+
+rtems_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ rtems_isr_entry previous_isr;
+
+ rtems_interrupt_catch( handler, vector, (rtems_isr_entry *) &previous_isr );
+
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/powerpc/papyrus/times b/c/src/lib/libbsp/powerpc/papyrus/times
new file mode 100644
index 0000000000..da260853bf
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/times
@@ -0,0 +1,197 @@
+#
+# Timing Test Suite Results for the Papyrus BSP
+#
+# NOTE: The Papyrus is a proprietary PPC403 based board. But it is the
+# only BSP currently available for the PowerPC family.
+#
+# $Id$
+#
+
+NOTE: This BSP is user submitted and no timing information
+ is currently avaiable.
+
+Board: Papyrus
+CPU: IBM 403GA
+Clock Speed: 33 Mhz
+Memory Configuration: SRAM, DRAM, cache, etc
+Wait States:
+
+Times Reported in: cycles, microseconds, etc
+Timer Source: Count Down Timer, on-CPU cycle counter, etc
+
+Column A: unused
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/powerpc/papyrus/wrapup/Makefile.in b/c/src/lib/libbsp/powerpc/papyrus/wrapup/Makefile.in
new file mode 100644
index 0000000000..875cb30396
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/papyrus/wrapup/Makefile.in
@@ -0,0 +1,55 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup dlentry flashentry
+# pieces to pick up out of libcpu/ppc
+CPU_PIECES=ppc403/clock ppc403/timer ppc403/console ppc403/vectors
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(CPU_PIECES), \
+ ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(notdir $(piece)).rel) \
+ $(foreach piece, $(GENERIC_PIECES), \
+ ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
+install: all
+
diff --git a/c/src/lib/libbsp/shared/sbrk.c b/c/src/lib/libbsp/shared/sbrk.c
new file mode 100644
index 0000000000..b24c538ac6
--- /dev/null
+++ b/c/src/lib/libbsp/shared/sbrk.c
@@ -0,0 +1,32 @@
+/*
+ * sbrk.c
+ *
+ * If the BSP wants to dynamically allocate the memory for the
+ * C Library heap (malloc) and/or be able to extend the heap,
+ * then this routine must be functional. This is the default
+ * implementation which raises an error.
+ *
+ * COPYRIGHT (c) 1989-1997. 1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+void * sbrk(size_t incr)
+{
+ errno = ENOMEM;
+ return (void *)-1;
+}
+
diff --git a/c/src/lib/libbsp/shmdr/Makefile.in b/c/src/lib/libbsp/shmdr/Makefile.in
new file mode 100644
index 0000000000..1f264207c9
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmdr.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addlq cnvpkt getlq dump fatal getpkt init initlq intr mpisr \
+ poll receive retpkt send setckvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_PIECES=shm mpci
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: preinstall ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 644 $(PGM) ${PROJECT_RELEASE}/lib
+
+# the .rel file built here will be put into libbsp.a by
+# ../$(RTEMS_BSP)/wrapup/Makefile
+
+preinstall:
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/shmdr/README b/c/src/lib/libbsp/shmdr/README
new file mode 100644
index 0000000000..5ed9e861b0
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/README
@@ -0,0 +1,9 @@
+#
+# $Id$
+#
+
+The mpci.h file provided in here is too simple for an MPCI with
+multiple ways to get to a node.
+
+This version of the shm driver needs to be reorganized to follow
+the better model of the Ada version.
diff --git a/c/src/lib/libbsp/shmdr/addlq.c b/c/src/lib/libbsp/shmdr/addlq.c
new file mode 100644
index 0000000000..f139fbf645
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/addlq.c
@@ -0,0 +1,43 @@
+/* void Shm_Locked_queue_Add( lq_cb, ecb )
+ *
+ * This routine adds an envelope control block to a shared memory queue.
+ *
+ * Input parameters:
+ * lq_cb - pointer to a locked queue control block
+ * ecb - pointer to an envelope control block
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Locked_queue_Add(
+ Shm_Locked_queue_Control *lq_cb,
+ Shm_Envelope_control *ecb
+)
+{
+ rtems_unsigned32 index;
+
+ ecb->next = Shm_Locked_queue_End_of_list;
+ ecb->queue = lq_cb->owner;
+ index = ecb->index;
+
+ Shm_Lock( lq_cb );
+ if ( Shm_Convert(lq_cb->front) != Shm_Locked_queue_End_of_list )
+ Shm_Envelopes[ Shm_Convert(lq_cb->rear) ].next = index;
+ else
+ lq_cb->front = index;
+ lq_cb->rear = index;
+ Shm_Unlock( lq_cb );
+}
diff --git a/c/src/lib/libbsp/shmdr/cnvpkt.c b/c/src/lib/libbsp/shmdr/cnvpkt.c
new file mode 100644
index 0000000000..70f3047d8c
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/cnvpkt.c
@@ -0,0 +1,42 @@
+/* void Shm_Convert_packet( &packet )
+ *
+ * This routine is the shared memory locked queue MPCI driver routine
+ * used to convert the RTEMS's information in a packet from non-native
+ * format to processor native format.
+ *
+ * Input parameters:
+ * packet - pointer to a packet
+ *
+ * Output parameters:
+ * *packet - packet in native format
+ *
+ * NOTE: Message buffers are not manipulated.
+ * Endian conversion is currently the only conversion.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Convert_packet(
+ rtems_packet_prefix *packet
+)
+{
+ rtems_unsigned32 *pkt, i;
+
+ pkt = (rtems_unsigned32 *) packet;
+ for ( i=RTEMS_MINIMUN_HETERO_CONVERSION ; i ; i--, pkt++ )
+ *pkt = CPU_swap_u32( *pkt );
+
+ for ( i=packet->to_convert ; i ; i--, pkt++ )
+ *pkt = CPU_swap_u32( *pkt );
+}
diff --git a/c/src/lib/libbsp/shmdr/dump.c b/c/src/lib/libbsp/shmdr/dump.c
new file mode 100644
index 0000000000..dc0bf850a7
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/dump.c
@@ -0,0 +1,51 @@
+/*
+ * This routine is invoked following a reset to report the statistics
+ * gathered during the previous execution.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdio.h>
+
+#include "shm.h"
+
+void
+Shm_Print_statistics(void)
+{
+ rtems_unsigned32 ticks;
+ rtems_unsigned32 ticks_per_second;
+ rtems_unsigned32 seconds;
+ int packets_per_second;
+
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &ticks );
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticks_per_second );
+
+ seconds = ticks / ticks_per_second;
+ if ( seconds == 0 )
+ seconds = 1;
+
+ packets_per_second = Shm_Receive_message_count / seconds;
+ if ( (Shm_Receive_message_count % seconds) >= (seconds / 2) )
+ packets_per_second++;
+
+ printf( "\n\nSHMDR STATISTICS (NODE %d)\n", Shm_Local_node );
+ printf( "TICKS SINCE BOOT = %d\n", ticks );
+ printf( "TICKS PER SECOND = %d\n", ticks_per_second );
+ printf( "ISRs=%d\n", Shm_Interrupt_count );
+ printf( "RECV=%d\n", Shm_Receive_message_count );
+ printf( "NULL=%d\n", Shm_Null_message_count );
+ printf( "PKTS/SEC=%d\n", packets_per_second );
+}
diff --git a/c/src/lib/libbsp/shmdr/fatal.c b/c/src/lib/libbsp/shmdr/fatal.c
new file mode 100644
index 0000000000..453349d0e0
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/fatal.c
@@ -0,0 +1,39 @@
+/* void MPCI_Fatal( error )
+ *
+ * This routine is the shared memory driver fatal error handler.
+ *
+ * Input parameters:
+ * error - fatal error code
+ *
+ * Output parameters: NEVER RETURNS
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void MPCI_Fatal(
+ Internal_errors_Source source,
+ boolean is_internal,
+ rtems_unsigned32 error
+)
+{
+ /* Eventually need to attempt to broadcast a K_FATAL message
+ * without checking for all possible errors (do not want to
+ * recurse).
+ *
+ * Also need to avoid using Shm_Node_statuses if the driver has not been
+ * initialized.
+ */
+
+ Shm_Local_node_status->error = Shm_Convert(error);
+}
diff --git a/c/src/lib/libbsp/shmdr/getlq.c b/c/src/lib/libbsp/shmdr/getlq.c
new file mode 100644
index 0000000000..6233226eaa
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/getlq.c
@@ -0,0 +1,48 @@
+/* Shm_Envelope_control *Shm_Locked_queue_Get( lq_cb )
+ *
+ * This routine returns an envelope control block from a shared
+ * memory queue.
+ *
+ * Input parameters:
+ * lq_cb - pointer to a locked queue control block
+ *
+ * Output parameters:
+ * returns - pointer to an envelope control block
+ * - NULL if no envelopes on specified queue
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <shm.h>
+
+Shm_Envelope_control *Shm_Locked_queue_Get(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ Shm_Envelope_control *tmp_ecb;
+ rtems_unsigned32 tmpfront;
+
+ tmp_ecb = NULL;
+ Shm_Lock( lq_cb );
+
+ tmpfront = Shm_Convert(lq_cb->front);
+ if ( tmpfront != Shm_Locked_queue_End_of_list ) {
+ tmp_ecb = &Shm_Envelopes[ tmpfront ];
+ lq_cb->front = tmp_ecb->next;
+ if ( tmp_ecb->next == Shm_Locked_queue_End_of_list )
+ lq_cb->rear = Shm_Locked_queue_End_of_list;
+ tmp_ecb->next = Shm_Locked_queue_Not_on_list;
+ }
+
+ Shm_Unlock( lq_cb );
+ return( tmp_ecb );
+}
diff --git a/c/src/lib/libbsp/shmdr/getpkt.c b/c/src/lib/libbsp/shmdr/getpkt.c
new file mode 100644
index 0000000000..842b312816
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/getpkt.c
@@ -0,0 +1,36 @@
+/* Shm_Get_packet
+ *
+ * This routine is the shared memory locked queue MPCI driver
+ * routine used to obtain an empty message packet.
+ *
+ * Input parameters:
+ * packet - address of pointer to packet
+ *
+ * Output parameters:
+ * *(cpb->get_packet) - address of allocated packet
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_mpci_entry Shm_Get_packet(
+ rtems_packet_prefix **packet
+)
+{
+ Shm_Envelope_control *ecb;
+
+ ecb = Shm_Allocate_envelope();
+ if ( !ecb )
+ rtems_fatal_error_occurred ( SHM_NO_FREE_PKTS );
+ *packet = Shm_Envelope_control_to_packet_prefix_pointer( ecb );
+}
diff --git a/c/src/lib/libbsp/shmdr/init.c b/c/src/lib/libbsp/shmdr/init.c
new file mode 100644
index 0000000000..c77d527682
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/init.c
@@ -0,0 +1,254 @@
+/* Shm_Initialization
+ *
+ * This routine is the shared memory communications initerface
+ * driver initialization routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define _SHM_INIT
+
+#include <rtems.h>
+#include <shm.h>
+
+#include <string.h> /* memset() */
+#include <stdlib.h> /* malloc() */
+#include <assert.h>
+
+/*
+ * User extension to install MPCI_Fatal as a fatal error
+ * handler extension
+ */
+
+rtems_extensions_table MPCI_Shm_extensions;
+
+rtems_mpci_entry Shm_Initialization( void )
+
+{
+ rtems_unsigned32 i, all_initialized;
+ rtems_unsigned32 interrupt_cause, interrupt_value;
+ void *interrupt_address;
+ Shm_Node_status_control *nscb;
+ rtems_unsigned32 extension_id; /* for installation of MPCI_Fatal */
+ rtems_unsigned32 remaining_memory;
+/* XXX these should use "public" methods to set their values.... */
+ rtems_configuration_table *configuration = _Configuration_Table;
+ rtems_multiprocessing_table *mp_configuration = _Configuration_MP_table;
+
+ Shm_RTEMS_Configuration = configuration;
+ Shm_RTEMS_MP_Configuration = mp_configuration;
+
+ Shm_Local_node = Shm_RTEMS_MP_Configuration->node;
+ Shm_Maximum_nodes = Shm_RTEMS_MP_Configuration->maximum_nodes;
+
+ Shm_Get_configuration( Shm_Local_node, &Shm_Configuration );
+
+ Shm_Interrupt_table = (Shm_Interrupt_information *) malloc(
+ sizeof(Shm_Interrupt_information) * (Shm_Maximum_nodes + 1)
+ );
+
+ assert( Shm_Interrupt_table );
+
+
+ Shm_Receive_message_count = 0;
+ Shm_Null_message_count = 0;
+ Shm_Interrupt_count = 0;
+
+ /*
+ * Set the Node Status indicators
+ */
+
+ Shm_Pending_initialization =
+ Shm_Convert(rtems_build_name( 'P', 'E', 'N', 'D' ));
+ Shm_Initialization_complete =
+ Shm_Convert(rtems_build_name( 'C', 'O', 'M', 'P' ));
+ Shm_Active_node =
+ Shm_Convert(rtems_build_name( 'A', 'C', 'T', 'V' ));
+
+ /*
+ * Initialize the constants used by the Locked Queue code.
+ */
+
+ Shm_Locked_queue_End_of_list = Shm_Convert( 0xffffffff );
+ Shm_Locked_queue_Not_on_list = Shm_Convert( 0xfffffffe );
+
+ /*
+ * Set the base addresses for the:
+ * + Node Status Table
+ * + Free Pool and Receive Queues
+ * + Envelopes
+ */
+
+ Shm_Node_statuses = (Shm_Node_status_control *) START_NS_CBS;
+ Shm_Locked_queues = (Shm_Locked_queue_Control *) START_LQ_CBS;
+ Shm_Envelopes = (Shm_Envelope_control *) START_ENVELOPES;
+
+ /*
+ * Calculate the maximum number of envelopes which can be
+ * placed the remaining shared memory.
+ */
+
+ remaining_memory =
+ ((void *)Shm_Configuration->base + Shm_Configuration->length) -
+ ((void *)Shm_Envelopes);
+
+ Shm_Maximum_envelopes = remaining_memory / sizeof( Shm_Envelope_control );
+ Shm_Maximum_envelopes -= 1;
+
+ /*
+ * Set the pointer to the receive queue for the local node.
+ * When we receive a node, we will get it from here before
+ * processing it.
+ */
+
+ Shm_Local_receive_queue = &Shm_Locked_queues[ Shm_Local_node ];
+ Shm_Local_node_status = &Shm_Node_statuses[ Shm_Local_node ];
+
+ /*
+ * Convert local interrupt cause information into the
+ * neutral format so other nodes will be able to
+ * understand it.
+ */
+
+ interrupt_address =
+ (void *) Shm_Convert( (rtems_unsigned32)Shm_Configuration->Intr.address );
+ interrupt_value = Shm_Convert( Shm_Configuration->Intr.value );
+ interrupt_cause = Shm_Convert( Shm_Configuration->Intr.length );
+
+ if ( Shm_Configuration->poll_intr == POLLED_MODE ) Shm_setclockvec();
+ else Shm_setvec();
+
+ if ( Shm_Is_master_node() ) {
+
+ /*
+ * Zero out the shared memory area.
+ */
+
+ (void) memset(
+ (void *) Shm_Configuration->base,
+ 0,
+ Shm_Configuration->length
+ );
+
+ /*
+ * Initialize all of the locked queues (the free envelope
+ * pool and a receive queue per node) and set all of the
+ * node's status so they will be waiting to initialization
+ * to complete.
+ */
+
+ Shm_Locked_queue_Initialize( FREE_ENV_CB, FREE_ENV_POOL );
+
+ for ( i=SHM_FIRST_NODE ; i<=Shm_Maximum_nodes ; i++ ) {
+ Shm_Initialize_receive_queue( i );
+
+ Shm_Node_statuses[ i ].status = Shm_Pending_initialization;
+ Shm_Node_statuses[ i ].error = 0;
+ }
+
+ /*
+ * Initialize all of the envelopes and place them in the
+ * free pool.
+ */
+
+ for ( i=0 ; i<Shm_Maximum_envelopes ; i++ ) {
+ Shm_Envelopes[ i ].index = Shm_Convert(i);
+ Shm_Free_envelope( &Shm_Envelopes[ i ] );
+ }
+
+ /*
+ * Initialize this node's interrupt information in the
+ * shared area so other nodes can interrupt us.
+ */
+
+ Shm_Local_node_status->int_address = (rtems_unsigned32) interrupt_address;
+ Shm_Local_node_status->int_value = interrupt_value;
+ Shm_Local_node_status->int_length = interrupt_cause;
+
+ Shm_Local_node_status->status = Shm_Initialization_complete;
+
+ /*
+ * Loop until all nodes have completed initialization.
+ */
+
+ do {
+ all_initialized = 1;
+
+ for ( i = SHM_FIRST_NODE ; i <= Shm_Maximum_nodes ; i++ )
+ if ( Shm_Node_statuses[ i ].status != Shm_Initialization_complete )
+ all_initialized = 0;
+
+ } while ( all_initialized == 0 );
+
+ /*
+ * Tell the other nodes we think that the system is up.
+ */
+
+ for ( i = SHM_FIRST_NODE ; i <= Shm_Maximum_nodes ; i++ )
+ Shm_Node_statuses[ i ].status = Shm_Active_node;
+
+ } else { /* is not MASTER node */
+
+ /*
+ * Initialize the node status for the non-master nodes.
+ * Because the master node zeroes out memory, it is
+ * necessary for them to keep putting their values in
+ * the node status area until the master says they
+ * should become active.
+ */
+
+ Shm_Local_node_status->status = Shm_Pending_initialization;
+
+ do {
+
+ if ( Shm_Local_node_status->status == Shm_Pending_initialization ) {
+
+ /*
+ * Initialize this node's interrupt information in the
+ * shared area so other nodes can interrupt us.
+ */
+
+ Shm_Local_node_status->int_address =
+ (rtems_unsigned32) interrupt_address;
+ Shm_Local_node_status->int_value = interrupt_value;
+ Shm_Local_node_status->int_length = interrupt_cause;
+
+ Shm_Local_node_status->status = Shm_Initialization_complete;
+ }
+ } while ( Shm_Local_node_status->status != Shm_Active_node ) ;
+ }
+
+ /*
+ * Initialize the Interrupt Information Table
+ */
+
+ for ( i = SHM_FIRST_NODE ; i <= Shm_Maximum_nodes ; i++ ) {
+ nscb = &Shm_Node_statuses[ i ];
+
+ Shm_Interrupt_table[i].address = Shm_Convert_address(
+ (void *)Shm_Convert(((vol_u32) nscb->int_address))
+ );
+ Shm_Interrupt_table[i].value = Shm_Convert( nscb->int_value );
+ Shm_Interrupt_table[i].length = Shm_Convert( nscb->int_length );
+ }
+
+ MPCI_Shm_extensions.fatal = MPCI_Fatal;
+
+ (void) rtems_extension_create(
+ rtems_build_name( 'M', 'P', 'E', 'X' ),
+ &MPCI_Shm_extensions,
+ &extension_id
+ );
+}
diff --git a/c/src/lib/libbsp/shmdr/initlq.c b/c/src/lib/libbsp/shmdr/initlq.c
new file mode 100644
index 0000000000..eb98d82176
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/initlq.c
@@ -0,0 +1,35 @@
+/* void Shm_Locked_queue_Initialize( lq_cb, owner )
+ *
+ * This routine initializes a shared memory locked queue.
+ *
+ * Input parameters:
+ * lq_cb - pointer to the control block of the queue
+ * to be initialized
+ * owner - unique idenitifier of who owns this queue.
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Locked_queue_Initialize(
+ Shm_Locked_queue_Control *lq_cb,
+ rtems_unsigned32 owner
+)
+{
+ Shm_Initialize_lock( lq_cb );
+ lq_cb->front = Shm_Locked_queue_End_of_list;
+ lq_cb->rear = Shm_Locked_queue_End_of_list;
+ lq_cb->owner = Shm_Convert(owner);
+}
diff --git a/c/src/lib/libbsp/shmdr/intr.c b/c/src/lib/libbsp/shmdr/intr.c
new file mode 100644
index 0000000000..d809471fec
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/intr.c
@@ -0,0 +1,58 @@
+/* void Shm_Cause_interrupt( node )
+ *
+ * This routine is the shared memory driver routine which
+ * generates interrupts to other CPUs.
+ *
+ * It uses the information placed in the node status control
+ * block by each node. For example, when used with the Motorola
+ * MVME136 board, the MPCSR is used.
+ *
+ * Input parameters:
+ * node - destination of this packet (0 = broadcast)
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Cause_interrupt(
+ rtems_unsigned32 node
+)
+{
+ Shm_Interrupt_information *intr;
+ rtems_unsigned8 *u8;
+ rtems_unsigned16 *u16;
+ rtems_unsigned32 *u32;
+ rtems_unsigned32 value;
+
+ intr = &Shm_Interrupt_table[node];
+ value = intr->value;
+
+ switch ( intr->length ) {
+ case NO_INTERRUPT:
+ break;
+ case BYTE:
+ u8 = (rtems_unsigned8 *)intr->address;
+ *u8 = (rtems_unsigned8) value;
+ break;
+ case WORD:
+ u16 = (rtems_unsigned16 *)intr->address;
+ *u16 = (rtems_unsigned16) value;
+ break;
+ case LONG:
+ u32 = (rtems_unsigned32 *)intr->address;
+ *u32 = (rtems_unsigned32) value;
+ break;
+ }
+}
diff --git a/c/src/lib/libbsp/shmdr/mpci.h b/c/src/lib/libbsp/shmdr/mpci.h
new file mode 100644
index 0000000000..8c6aaf8654
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/mpci.h
@@ -0,0 +1,59 @@
+/* mpci.h
+ *
+ * This include file contains all the renaming necessary to
+ * have an application use the Shared Memory Driver as its
+ * sole mechanism for MPCI.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SHM_MPCI_h
+#define __SHM_MPCI_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <shm.h>
+
+#define MPCI_Initialization( _configuration ) \
+ Shm_Initialization( _configuration )
+
+#define MPCI_Get_packet( _the_packet ) \
+ Shm_Get_packet( _the_packet )
+
+#define MPCI_Return_packet( _the_packet ) \
+ Shm_Return_packet( _the_packet )
+
+#define MPCI_Receive_packet( _the_packet ) \
+ Shm_Receive_packet( _the_packet )
+
+#define MPCI_Send_packet( _destination, _the_packet ) \
+ Shm_Send_packet( _destination, _the_packet )
+
+/* Unnecessary... mapped in shm.h
+#define MPCI_Fatal( _the_error ) \
+ Shm_Fatal( _the_error )
+*/
+
+#define MPCI_Enable_statistics()
+
+#define MPCI_Print_statistics() \
+ Shm_Print_statistics()
+
+/* no need to rename the MPCI_Table either */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/shmdr/mpisr.c b/c/src/lib/libbsp/shmdr/mpisr.c
new file mode 100644
index 0000000000..116956fe2e
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/mpisr.c
@@ -0,0 +1,23 @@
+/* _Shm_isr()
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_isr Shm_isr(
+ rtems_vector_number vector
+)
+{
+ Shm_Interrupt_count += 1;
+ rtems_multiprocessing_announce();
+}
diff --git a/c/src/lib/libbsp/shmdr/poll.c b/c/src/lib/libbsp/shmdr/poll.c
new file mode 100644
index 0000000000..9afe6883df
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/poll.c
@@ -0,0 +1,53 @@
+/* void Shm_Poll()
+ *
+ * This routine polls to see if a packet has arrived. If one
+ * has it informs the executive. It is typically called from
+ * the clock tick interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/libio.h>
+
+#include "shm.h"
+
+void Shm_Poll()
+{
+ rtems_unsigned32 tmpfront;
+ rtems_libio_ioctl_args_t args;
+
+ /* invoke clock isr */
+ args.iop = 0;
+ args.command = rtems_build_name('I', 'S', 'R', ' ');
+ (void) rtems_io_control(rtems_clock_major, rtems_clock_minor, &args);
+
+ /*
+ * Check for msgs only if we are "up"
+ * This avoids a race condition where we may get a clock
+ * interrupt before MPCI has completed its init
+ */
+
+ if (_System_state_Is_up(_System_state_Get()))
+ {
+ tmpfront = Shm_Local_receive_queue->front;
+ if ( Shm_Convert(tmpfront) != Shm_Locked_queue_End_of_list )
+ {
+ rtems_multiprocessing_announce();
+ Shm_Interrupt_count++;
+ }
+ }
+}
diff --git a/c/src/lib/libbsp/shmdr/receive.c b/c/src/lib/libbsp/shmdr/receive.c
new file mode 100644
index 0000000000..f786379bde
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/receive.c
@@ -0,0 +1,44 @@
+/* Shm_Receive_packet
+ *
+ * This routine is the shared memory locked queue MPCI driver routine
+ * used to obtain a packet containing a message from this node's
+ * receive queue.
+ *
+ * Input parameters:
+ * packet - address of a pointer to a packet
+ *
+ * Output parameters:
+ * *(rpb->packet) - pointer to packet
+ * NULL if no packet currently available
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_mpci_entry Shm_Receive_packet(
+ rtems_packet_prefix **packet
+)
+{
+ Shm_Envelope_control *ecb;
+
+ ecb = Shm_Locked_queue_Get( Shm_Local_receive_queue );
+ if ( ecb ) {
+ *(packet) = Shm_Envelope_control_to_packet_prefix_pointer( ecb );
+ if ( ecb->Preamble.endian != Shm_Configuration->format )
+ Shm_Convert_packet( *packet );
+ Shm_Receive_message_count++;
+ } else {
+ *(packet) = NULL;
+ Shm_Null_message_count++;
+ }
+}
diff --git a/c/src/lib/libbsp/shmdr/retpkt.c b/c/src/lib/libbsp/shmdr/retpkt.c
new file mode 100644
index 0000000000..4cdc07e097
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/retpkt.c
@@ -0,0 +1,32 @@
+/* Shm_Return_packet
+ *
+ * This routine is the shared memory locked queue MPCI driver
+ * routine used to return a message packet to a free envelope
+ * pool accessible by this node.
+ *
+ * Input parameters:
+ * packet - address of pointer to packet
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_mpci_entry Shm_Return_packet(
+ rtems_packet_prefix *packet
+)
+{
+ Shm_Free_envelope( Shm_Packet_prefix_to_envelope_control_pointer(packet) );
+}
+
diff --git a/c/src/lib/libbsp/shmdr/send.c b/c/src/lib/libbsp/shmdr/send.c
new file mode 100644
index 0000000000..5150aa4869
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/send.c
@@ -0,0 +1,61 @@
+/* Shm_Send_packet
+ *
+ * This routine is the shared memory driver locked queue write
+ * MPCI driver routine. This routine sends the specified packet
+ * to the destination specified by "node". A "node" value of
+ * zero designates that this packet is to be broadcasted.
+ *
+ * Input parameters:
+ * node - destination of this packet (0 = broadcast)
+ * packet - address of packet
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+struct pkt_cpy {
+ rtems_unsigned32 packet[MAX_PACKET_SIZE/4];
+};
+
+rtems_mpci_entry Shm_Send_packet(
+ rtems_unsigned32 node,
+ rtems_packet_prefix *packet
+)
+{
+ Shm_Envelope_control *ecb, *tmp_ecb;
+ rtems_unsigned32 nnum;
+
+ ecb = Shm_Packet_prefix_to_envelope_control_pointer( packet );
+ if ( node ) {
+ Shm_Build_preamble( ecb, node );
+ Shm_Build_postamble( ecb );
+ Shm_Append_to_receive_queue( node, ecb );
+ (*Shm_Configuration->cause_intr)( node );
+ }
+ else {
+ for( nnum = SHM_FIRST_NODE ; nnum <= Shm_Maximum_nodes ; nnum++ )
+ if ( Shm_Local_node != nnum ) {
+ tmp_ecb = Shm_Allocate_envelope();
+ if ( !tmp_ecb )
+ rtems_fatal_error_occurred( SHM_NO_FREE_PKTS );
+ Shm_Build_preamble( tmp_ecb, nnum );
+ *((struct pkt_cpy *)tmp_ecb->packet) = *((struct pkt_cpy *)packet);
+ Shm_Build_postamble( tmp_ecb );
+ Shm_Append_to_receive_queue( nnum, tmp_ecb );
+ (*Shm_Configuration->cause_intr)( nnum );
+ }
+ Shm_Free_envelope( ecb );
+ }
+}
diff --git a/c/src/lib/libbsp/shmdr/setckvec.c b/c/src/lib/libbsp/shmdr/setckvec.c
new file mode 100644
index 0000000000..68477e1cf7
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/setckvec.c
@@ -0,0 +1,34 @@
+/* Shm_setclockvec
+ *
+ * This routines installs the shared memory clock interrupt handler
+ * used when the driver is used in polling mode.
+ *
+ * INPUT PARAMETERS: NONE
+ *
+ * OUTPUT PARAMETERS: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/libio.h>
+
+#include "shm.h"
+
+rtems_isr Shm_setclockvec()
+{
+ rtems_libio_ioctl_args_t args;
+ args.iop = 0;
+ args.command = rtems_build_name('N', 'E', 'W', ' ');
+ args.buffer = (void *) Shm_Poll;
+
+ (void) rtems_io_control(rtems_clock_major, rtems_clock_minor, &args);
+}
diff --git a/c/src/lib/libbsp/shmdr/shm.h b/c/src/lib/libbsp/shmdr/shm.h
new file mode 100644
index 0000000000..45c4c76ad5
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/shm.h
@@ -0,0 +1,539 @@
+/* shm.h
+ *
+ * This include file contains all the constants, structures,
+ * and global variables for this RTEMS based shared memory
+ * communications interface driver.
+ *
+ * Processor board dependencies are in other files.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SHM_h
+#define __SHM_h
+
+#include <clockdrv.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The information contained in the Node Status, Locked Queue, and
+ * Envelope Control Blocks must be maintained in a NEUTRAL format.
+ * Currently the neutral format may be selected as big or little
+ * endian by simply defining either NEUTRAL_BIG or NEUTRAL_LITTLE.
+ *
+ * It is CRITICAL to note that the neutral format can ONLY be
+ * changed by modifying this file and recompiling the ENTIRE
+ * SHM driver including ALL target specific support files.
+ *
+ * The following table details the memory contents for the endian
+ * field of the Node Status Control Block in the various
+ * data format configurations (data is in hexadecimal):
+ *
+ * NEUTRAL NATIVE BYTE 0 BYTE 1 BYTE 2 BYTE 3
+ * ======= ====== ====== ====== ====== ======
+ * BIG BIG 00 00 00 01
+ * BIG LITTLE 10 00 00 00
+ * LITTLE BIG 01 00 00 00
+ * LITTLE LITTLE 00 00 00 10
+ *
+ *
+ * NOTE: XXX
+ * PORTABILITY OF LOCKING INSTRUCTIONS
+ * ===================================
+ * The locking mechanism described below is not
+ * general enough. Where the hardware supports
+ * it we should use "atomic swap" instructions
+ * so the values in the lock can be tailored to
+ * support a CPU with only weak atomic memory
+ * instructions. There are combinations of
+ * CPUs with inflexible atomic memory instructions
+ * which appear to be incompatible. For example,
+ * the SPARClite instruction uses a byte which is
+ * 0xFF when locked. The PA-RISC uses 1 to indicate
+ * locked and 0 when unlocked. These CPUs appear to
+ * have incompatible lock instructions. But
+ * they could be used in a heterogenous system
+ * with does not mix SPARCs and PA-RISCs. For
+ * example, the i386 and SPARC or i386 and SPARC
+ * could work together. The bottom line is that
+ * not every CPU will work together using this
+ * locking scheme. There are supposed to be
+ * algorithms to do this without hardware assist
+ * and one of these should be incorporated into
+ * the shared memory driver.
+ *
+ * The most flexible scheme using the instructions
+ * of the various CPUs for efficiency would be to use
+ * "atomic swaps" wherever possible. Make the lock
+ * and unlock configurable much like BIG vs LITTLE
+ * endian use of shared memory is now. The values
+ * of the lock could then reflect the "worst"
+ * CPU in a system. This still results in mixes
+ * of CPUs which are incompatible.
+ *
+ * The current locking mechanism is based upon the MC68020
+ * "tas" instruction which is atomic. All ports to other CPUs
+ * comply with the restrictive placement of lock bit by this
+ * instruction. The lock bit is the most significant bit in a
+ * big-endian rtems_unsigned32. On other processors, the lock is
+ * typically implemented via an atomic swap or atomic modify
+ * bits type instruction.
+ */
+
+#define NEUTRAL_BIG
+
+#ifdef NEUTRAL_BIG
+#define SHM_BIG 0x00000001
+#define SHM_LITTLE 0x10000000
+#endif
+
+#ifdef NEUTRAL_LITTLE
+#define SHM_BIG 0x01000000
+#define SHM_LITTLE 0x00000010
+#endif
+
+/*
+ * The following are the values used to fill in the lock field. Some CPUs
+ * are able to write only a single value into field. By making the
+ * lock and unlock values configurable, CPUs which support "atomic swap"
+ * instructions can generally be made to work in any heterogeneous
+ * configuration. However, it is possible for two CPUs to be incompatible
+ * in regards to the lock field values. This occurs when two CPUs
+ * which write only a single value to the field are used in a system
+ * but the two CPUs write different incompatible values.
+ *
+ * NOTE: The following is a first attempt at defining values which
+ * have a chance at working together. The m68k should use
+ * chk2 instead of tas to be less restrictive. Target endian
+ * problems (like the Force CPU386 which has (broken) big endian
+ * view of the VMEbus address space) are not addressed yet.
+ */
+
+#if defined(i960)
+#define SHM_LOCK_VALUE 0x00000080
+#define SHM_UNLOCK_VALUE 0
+#elif defined(m68k)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(i386)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(mips64orion)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(hppa1_1)
+#define SHM_LOCK_VALUE 0
+#define SHM_UNLOCK_VALUE 1
+#elif defined(unix)
+#define SHM_LOCK_VALUE 0
+#define SHM_UNLOCK_VALUE 1
+#elif defined(no_cpu) /* for this values are irrelevant */
+#define SHM_LOCK_VALUE 1
+#define SHM_UNLOCK_VALUE 0
+#else
+#error "shm.h - no SHM_LOCK_VALUE defined for this CPU architecture"
+#endif
+
+#define Shm_Convert( value ) \
+ ((Shm_Configuration->convert) ? \
+ (*Shm_Configuration->convert)(value) : (value))
+
+/* constants */
+
+#define SHM_MASTER 1 /* master initialization node */
+#define SHM_FIRST_NODE 1
+
+/* size constants */
+
+#define KILOBYTE (1024)
+#define MEGABYTE (1024*1024)
+
+/* inter-node interrupt values */
+
+#define NO_INTERRUPT 0 /* used for polled nodes */
+#define BYTE 1
+#define WORD 2
+#define LONG 4
+
+/* operational mode constants -- used in SHM Configuration Table */
+#define POLLED_MODE 0
+#define INTR_MODE 1
+
+/* error codes */
+
+#define NO_ERROR 0
+#define SHM_NO_FREE_PKTS 0xf0000
+
+/* null pointers of different types */
+
+#define NULL_ENV_CB ((Shm_Envelope_control *) 0)
+#define NULL_CONVERT 0
+
+/*
+ * size of stuff before preamble in envelope.
+ * It must be a constant since we will use it to generate MAX_PACKET_SIZE
+ */
+
+#define SHM_ENVELOPE_PREFIX_OVERHEAD (4 * sizeof(vol_u32))
+
+/*
+ * The following is adjusted so envelopes are MAX_ENVELOPE_SIZE bytes long.
+ * It must be >= RTEMS_MINIMUM_PACKET_SIZE in mppkt.h.
+ */
+
+#ifndef MAX_ENVELOPE_SIZE
+#define MAX_ENVELOPE_SIZE 0x180
+#endif
+
+#define MAX_PACKET_SIZE (MAX_ENVELOPE_SIZE - \
+ SHM_ENVELOPE_PREFIX_OVERHEAD + \
+ sizeof(Shm_Envelope_preamble) + \
+ sizeof(Shm_Envelope_postamble))
+
+
+/* constants pertinent to Locked Queue routines */
+
+#define LQ_UNLOCKED SHM_UNLOCK_VALUE
+#define LQ_LOCKED SHM_LOCK_VALUE
+
+/* constants related to the Free Envelope Pool */
+
+#define FREE_ENV_POOL 0
+#define FREE_ENV_CB (&Shm_Locked_queues[ FREE_ENV_POOL ])
+
+/* The following are important when dealing with
+ * the shared memory communications interface area.
+ *
+ * NOTE: The starting address and length of the shared memory
+ * is defined in a system dependent file.
+ */
+
+#define START_NS_CBS ((void *)Shm_Configuration->base)
+#define START_LQ_CBS ((START_NS_CBS) + \
+ ( (sizeof (Shm_Node_status_control)) * (Shm_Maximum_nodes + 1) ) )
+#define START_ENVELOPES ( ((void *) START_LQ_CBS) + \
+ ( (sizeof (Shm_Locked_queue_Control)) * (Shm_Maximum_nodes + 1) ) )
+#define END_SHMCI_AREA ( (void *) START_ENVELOPES + \
+ ( (sizeof (Shm_Envelope_control)) * Shm_Maximum_envelopes ) )
+#define END_SHARED_MEM (START_NS_CBS+Shm_Configuration->length)
+
+/* macros */
+
+#define Shm_Is_master_node() \
+ ( SHM_MASTER == Shm_Local_node )
+
+#define Shm_Free_envelope( ecb ) \
+ Shm_Locked_queue_Add( FREE_ENV_CB, (ecb) )
+#define Shm_Allocate_envelope() \
+ Shm_Locked_queue_Get(FREE_ENV_CB)
+
+#define Shm_Initialize_receive_queue(node) \
+ Shm_Locked_queue_Initialize( &Shm_Locked_queues[node], node )
+
+#define Shm_Append_to_receive_queue(node, ecb) \
+ Shm_Locked_queue_Add( &Shm_Locked_queues[node], (ecb) )
+
+#define Shm_Envelope_control_to_packet_prefix_pointer(ecb) \
+ ((void *)(ecb)->packet)
+
+#define Shm_Packet_prefix_to_envelope_control_pointer( pkt ) \
+ ((Shm_Envelope_control *)((rtems_unsigned8 *)(pkt) - \
+ (sizeof(Shm_Envelope_preamble) + SHM_ENVELOPE_PREFIX_OVERHEAD)))
+
+#define Shm_Build_preamble(ecb, node) \
+ (ecb)->Preamble.endian = Shm_Configuration->format
+
+#define Shm_Build_postamble( ecb )
+
+/* volatile types */
+
+typedef volatile rtems_unsigned8 vol_u8;
+typedef volatile rtems_unsigned32 vol_u32;
+
+/* shm control information */
+
+struct shm_info {
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+ vol_u32 not_currently_used_3;
+};
+
+typedef struct {
+ /*byte start_of_text;*/
+ vol_u32 endian;
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+} Shm_Envelope_preamble;
+
+typedef struct {
+} Shm_Envelope_postamble;
+
+/* WARNING! If you change this structure, don't forget to change
+ * SHM_ENVELOPE_PREFIX_OVERHEAD and
+ * Shm_Packet_prefix_to_envelope_control_pointer() above.
+ */
+
+/* This comment block describes the contents of each field
+ * of the Envelope Control Block:
+ *
+ * next - The index of the next envelope on this queue.
+ * queue - The index of the queue this envelope is on.
+ * index - The index of this envelope.
+ * Preamble - Generic packet preamble. One day this structure
+ * could be enhanced to contain routing information.
+ * packet - RTEMS MPCI packet. Untouched by SHM Driver
+ * other than copying and format conversion as
+ * documented in the RTEMS User's Guide.
+ * Postamble - Generic packet postamble. One day this structure
+ * could be enhanced to contain checksum information.
+ */
+
+typedef struct {
+ vol_u32 next; /* next envelope on queue */
+ vol_u32 queue; /* queue on which this resides */
+ vol_u32 index; /* index into array of envelopes*/
+ vol_u32 pad0; /* insure the next one is aligned */
+ Shm_Envelope_preamble Preamble; /* header information */
+ vol_u8 packet[MAX_PACKET_SIZE]; /* RTEMS INFO */
+ Shm_Envelope_postamble Postamble;/* trailer information */
+} Shm_Envelope_control;
+
+/* This comment block describes the contents of each field
+ * of the Locked Queue Control Block:
+ *
+ * lock - Lock used to insure mutually exclusive access.
+ * front - Index of first envelope on queue. This field
+ * is used to remove head of queue (receive).
+ * rear - Index of last envelope on queue. This field
+ * is used to add evelope to queue (send).
+ * owner - The node number of the recipient (owning) node.
+ * RTEMS does not use the node number zero (0).
+ * The zero node is used by the SHM Driver for the
+ * Free Envelope Queue shared by all nodes.
+ */
+
+typedef struct {
+ vol_u32 lock; /* lock field for this queue */
+ vol_u32 front; /* first envelope on queue */
+ vol_u32 rear; /* last envelope on queue */
+ vol_u32 owner; /* receiving (i.e. owning) node */
+} Shm_Locked_queue_Control;
+
+/* This comment block describes the contents of each field
+ * of the Node Status Control Block:
+ *
+ * status - Node status. Current values are Pending Initialization,
+ * Initialization Complete, and Active Node. Other values
+ * could be added to enhance fault tolerance.
+ * error - Zero if the node has not failed. Otherwise,
+ * this field contains a status indicating the
+ * failure reason.
+ * int_address, int_value, and int_length
+ * - These field are the Interrupt Information table
+ * for this node in neutral format. This is how
+ * each node knows how to generate interrupts.
+ */
+
+typedef struct {
+ vol_u32 status; /* node status information */
+ vol_u32 error; /* fatal error code */
+ vol_u32 int_address; /* write here for interrupt */
+ vol_u32 int_value; /* this value causes interrupt */
+ vol_u32 int_length; /* for this length (0,1,2,4) */
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+} Shm_Node_status_control;
+
+/* This comment block describes the contents of each field
+ * of the Interrupt Information Table. This table describes
+ * how another node can generate an interrupt to this node.
+ * This information is target board dependent. If the
+ * SHM Driver is in POLLED_MODE, then all fields should
+ * be initialized to NO_INTERRUPT.
+ *
+ * address - The address to which another node should
+ * write to cause an interrupt.
+ * value - The value which must be written
+ * length - The size of the value to write. Valid
+ * values are BYTE, WORD, and LONG.
+ *
+ * NOTE: The Node Status Control Block contains this
+ * information in neutral format and not in a
+ * structure to avoid potential alignment problems.
+ */
+
+typedef struct {
+ vol_u32 *address; /* write here for interrupt */
+ vol_u32 value; /* this value causes interrupt */
+ vol_u32 length; /* for this length (0,1,2,4) */
+} Shm_Interrupt_information;
+
+/* SHM Configuration Table
+ *
+ * This comment block describes the contents of each field
+ * of the SHM Configuration Table.
+ *
+ * base - The base address of the shared memory. This
+ * address may be specific to this node.
+ * length - The length of the shared memory in bytes.
+ * format - The natural format for rtems_unsigned32's in the
+ * shared memory. Valid values are currently
+ * only SHM_LITTLE and SHM_BIG.
+ * convert - The address of the routine which converts
+ * between neutral and local format.
+ * poll_intr - The operational mode of the driver. Some
+ * target boards may not provide hardware for
+ * an interprocessor interrupt. If POLLED_MODE
+ * is selected, the SHM driver will install a
+ * wrapper around the Clock_isr() to poll for
+ * incoming packets. Throughput is dependent
+ * on the time between clock interrupts.
+ * Valid values are POLLED_MODE and INTR_MODE.
+ * cause_intr - This is the address of the routine used to
+ * write to a particular address and cause an
+ * interrupt on another node. This routine
+ * may need to be target dependent if something
+ * other than a normal write from C does not work.
+ * Intr - This structure describes the operation required
+ * to cause an interrupt to this node. The actual
+ * contents of this structure are described above.
+ */
+
+struct shm_config_info {
+ vol_u32 *base; /* base address of SHM */
+ vol_u32 length; /* length (in bytes) of SHM */
+ vol_u32 format; /* SHM is big or little endian */
+ vol_u32 (*convert)();/* neutral conversion routine */
+ vol_u32 poll_intr;/* POLLED or INTR driven mode */
+ void (*cause_intr)( rtems_unsigned32 );
+ Shm_Interrupt_information Intr; /* cause intr information */
+};
+
+typedef struct shm_config_info shm_config_table;
+
+/* global variables */
+
+#ifdef _SHM_INIT
+#define SHM_EXTERN
+#else
+#define SHM_EXTERN extern
+#endif
+
+SHM_EXTERN shm_config_table *Shm_Configuration;
+SHM_EXTERN Shm_Interrupt_information *Shm_Interrupt_table;
+SHM_EXTERN Shm_Node_status_control *Shm_Node_statuses;
+SHM_EXTERN Shm_Locked_queue_Control *Shm_Locked_queues;
+SHM_EXTERN Shm_Envelope_control *Shm_Envelopes;
+SHM_EXTERN rtems_configuration_table *Shm_RTEMS_Configuration;
+SHM_EXTERN rtems_multiprocessing_table *Shm_RTEMS_MP_Configuration;
+SHM_EXTERN rtems_unsigned32 Shm_Receive_message_count;
+SHM_EXTERN rtems_unsigned32 Shm_Null_message_count;
+SHM_EXTERN rtems_unsigned32 Shm_Interrupt_count;
+SHM_EXTERN rtems_unsigned32 Shm_Local_node;
+SHM_EXTERN Shm_Locked_queue_Control *Shm_Local_receive_queue;
+SHM_EXTERN Shm_Node_status_control *Shm_Local_node_status;
+SHM_EXTERN rtems_unsigned32 Shm_isrstat;
+ /* reported by shmdr */
+
+SHM_EXTERN rtems_unsigned32 Shm_Pending_initialization;
+SHM_EXTERN rtems_unsigned32 Shm_Initialization_complete;
+SHM_EXTERN rtems_unsigned32 Shm_Active_node;
+
+SHM_EXTERN rtems_unsigned32 Shm_Maximum_nodes;
+SHM_EXTERN rtems_unsigned32 Shm_Maximum_envelopes;
+
+SHM_EXTERN rtems_unsigned32 Shm_Locked_queue_End_of_list;
+SHM_EXTERN rtems_unsigned32 Shm_Locked_queue_Not_on_list;
+
+/* functions */
+
+/* locked queue routines */
+void Shm_Locked_queue_Add(
+ Shm_Locked_queue_Control *, Shm_Envelope_control * );
+Shm_Envelope_control *Shm_Locked_queue_Get( Shm_Locked_queue_Control * );
+void Shm_Locked_queue_Initialize(
+ Shm_Locked_queue_Control *, rtems_unsigned32 );
+ /* Shm_Initialize_lock is CPU dependent */
+ /* Shm_Lock is CPU dependent */
+ /* Shm_Unlock is CPU dependent */
+
+/* portable routines */
+void Init_env_pool();
+void Shm_Print_statistics( void );
+void MPCI_Fatal( Internal_errors_Source, boolean, rtems_unsigned32 );
+rtems_task Shm_Cause_interrupt( rtems_unsigned32 );
+void Shm_Poll();
+void Shm_setclockvec();
+void Shm_Convert_packet( rtems_packet_prefix * );
+
+/* CPU specific routines are inlined in shmcpu.h */
+
+/* target specific routines */
+void *Shm_Convert_address( void * );
+void Shm_Get_configuration( rtems_unsigned32, shm_config_table ** );
+void Shm_isr();
+void Shm_setvec( void );
+
+void Shm_Initialize_lock( Shm_Locked_queue_Control * );
+void Shm_Lock( Shm_Locked_queue_Control * );
+void Shm_Unlock( Shm_Locked_queue_Control * );
+
+/* MPCI entry points */
+rtems_mpci_entry Shm_Get_packet(
+ rtems_packet_prefix **
+);
+
+rtems_mpci_entry Shm_Initialization( void );
+
+rtems_mpci_entry Shm_Receive_packet(
+ rtems_packet_prefix **
+);
+
+rtems_mpci_entry Shm_Return_packet(
+ rtems_packet_prefix *
+);
+
+rtems_mpci_entry Shm_Send_packet(
+ rtems_unsigned32,
+ rtems_packet_prefix *
+);
+
+extern rtems_mpci_table MPCI_table;
+
+#ifdef _SHM_INIT
+
+/* multiprocessor communications interface (MPCI) table */
+
+rtems_mpci_table MPCI_table = {
+ 100000, /* default timeout value in ticks */
+ MAX_PACKET_SIZE, /* maximum packet size */
+ Shm_Initialization, /* initialization procedure */
+ Shm_Get_packet, /* get packet procedure */
+ Shm_Return_packet, /* return packet procedure */
+ Shm_Send_packet, /* packet send procedure */
+ Shm_Receive_packet /* packet receive procedure */
+};
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/shmdr/shm_driver.h b/c/src/lib/libbsp/shmdr/shm_driver.h
new file mode 100644
index 0000000000..45c4c76ad5
--- /dev/null
+++ b/c/src/lib/libbsp/shmdr/shm_driver.h
@@ -0,0 +1,539 @@
+/* shm.h
+ *
+ * This include file contains all the constants, structures,
+ * and global variables for this RTEMS based shared memory
+ * communications interface driver.
+ *
+ * Processor board dependencies are in other files.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SHM_h
+#define __SHM_h
+
+#include <clockdrv.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The information contained in the Node Status, Locked Queue, and
+ * Envelope Control Blocks must be maintained in a NEUTRAL format.
+ * Currently the neutral format may be selected as big or little
+ * endian by simply defining either NEUTRAL_BIG or NEUTRAL_LITTLE.
+ *
+ * It is CRITICAL to note that the neutral format can ONLY be
+ * changed by modifying this file and recompiling the ENTIRE
+ * SHM driver including ALL target specific support files.
+ *
+ * The following table details the memory contents for the endian
+ * field of the Node Status Control Block in the various
+ * data format configurations (data is in hexadecimal):
+ *
+ * NEUTRAL NATIVE BYTE 0 BYTE 1 BYTE 2 BYTE 3
+ * ======= ====== ====== ====== ====== ======
+ * BIG BIG 00 00 00 01
+ * BIG LITTLE 10 00 00 00
+ * LITTLE BIG 01 00 00 00
+ * LITTLE LITTLE 00 00 00 10
+ *
+ *
+ * NOTE: XXX
+ * PORTABILITY OF LOCKING INSTRUCTIONS
+ * ===================================
+ * The locking mechanism described below is not
+ * general enough. Where the hardware supports
+ * it we should use "atomic swap" instructions
+ * so the values in the lock can be tailored to
+ * support a CPU with only weak atomic memory
+ * instructions. There are combinations of
+ * CPUs with inflexible atomic memory instructions
+ * which appear to be incompatible. For example,
+ * the SPARClite instruction uses a byte which is
+ * 0xFF when locked. The PA-RISC uses 1 to indicate
+ * locked and 0 when unlocked. These CPUs appear to
+ * have incompatible lock instructions. But
+ * they could be used in a heterogenous system
+ * with does not mix SPARCs and PA-RISCs. For
+ * example, the i386 and SPARC or i386 and SPARC
+ * could work together. The bottom line is that
+ * not every CPU will work together using this
+ * locking scheme. There are supposed to be
+ * algorithms to do this without hardware assist
+ * and one of these should be incorporated into
+ * the shared memory driver.
+ *
+ * The most flexible scheme using the instructions
+ * of the various CPUs for efficiency would be to use
+ * "atomic swaps" wherever possible. Make the lock
+ * and unlock configurable much like BIG vs LITTLE
+ * endian use of shared memory is now. The values
+ * of the lock could then reflect the "worst"
+ * CPU in a system. This still results in mixes
+ * of CPUs which are incompatible.
+ *
+ * The current locking mechanism is based upon the MC68020
+ * "tas" instruction which is atomic. All ports to other CPUs
+ * comply with the restrictive placement of lock bit by this
+ * instruction. The lock bit is the most significant bit in a
+ * big-endian rtems_unsigned32. On other processors, the lock is
+ * typically implemented via an atomic swap or atomic modify
+ * bits type instruction.
+ */
+
+#define NEUTRAL_BIG
+
+#ifdef NEUTRAL_BIG
+#define SHM_BIG 0x00000001
+#define SHM_LITTLE 0x10000000
+#endif
+
+#ifdef NEUTRAL_LITTLE
+#define SHM_BIG 0x01000000
+#define SHM_LITTLE 0x00000010
+#endif
+
+/*
+ * The following are the values used to fill in the lock field. Some CPUs
+ * are able to write only a single value into field. By making the
+ * lock and unlock values configurable, CPUs which support "atomic swap"
+ * instructions can generally be made to work in any heterogeneous
+ * configuration. However, it is possible for two CPUs to be incompatible
+ * in regards to the lock field values. This occurs when two CPUs
+ * which write only a single value to the field are used in a system
+ * but the two CPUs write different incompatible values.
+ *
+ * NOTE: The following is a first attempt at defining values which
+ * have a chance at working together. The m68k should use
+ * chk2 instead of tas to be less restrictive. Target endian
+ * problems (like the Force CPU386 which has (broken) big endian
+ * view of the VMEbus address space) are not addressed yet.
+ */
+
+#if defined(i960)
+#define SHM_LOCK_VALUE 0x00000080
+#define SHM_UNLOCK_VALUE 0
+#elif defined(m68k)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(i386)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(mips64orion)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(hppa1_1)
+#define SHM_LOCK_VALUE 0
+#define SHM_UNLOCK_VALUE 1
+#elif defined(unix)
+#define SHM_LOCK_VALUE 0
+#define SHM_UNLOCK_VALUE 1
+#elif defined(no_cpu) /* for this values are irrelevant */
+#define SHM_LOCK_VALUE 1
+#define SHM_UNLOCK_VALUE 0
+#else
+#error "shm.h - no SHM_LOCK_VALUE defined for this CPU architecture"
+#endif
+
+#define Shm_Convert( value ) \
+ ((Shm_Configuration->convert) ? \
+ (*Shm_Configuration->convert)(value) : (value))
+
+/* constants */
+
+#define SHM_MASTER 1 /* master initialization node */
+#define SHM_FIRST_NODE 1
+
+/* size constants */
+
+#define KILOBYTE (1024)
+#define MEGABYTE (1024*1024)
+
+/* inter-node interrupt values */
+
+#define NO_INTERRUPT 0 /* used for polled nodes */
+#define BYTE 1
+#define WORD 2
+#define LONG 4
+
+/* operational mode constants -- used in SHM Configuration Table */
+#define POLLED_MODE 0
+#define INTR_MODE 1
+
+/* error codes */
+
+#define NO_ERROR 0
+#define SHM_NO_FREE_PKTS 0xf0000
+
+/* null pointers of different types */
+
+#define NULL_ENV_CB ((Shm_Envelope_control *) 0)
+#define NULL_CONVERT 0
+
+/*
+ * size of stuff before preamble in envelope.
+ * It must be a constant since we will use it to generate MAX_PACKET_SIZE
+ */
+
+#define SHM_ENVELOPE_PREFIX_OVERHEAD (4 * sizeof(vol_u32))
+
+/*
+ * The following is adjusted so envelopes are MAX_ENVELOPE_SIZE bytes long.
+ * It must be >= RTEMS_MINIMUM_PACKET_SIZE in mppkt.h.
+ */
+
+#ifndef MAX_ENVELOPE_SIZE
+#define MAX_ENVELOPE_SIZE 0x180
+#endif
+
+#define MAX_PACKET_SIZE (MAX_ENVELOPE_SIZE - \
+ SHM_ENVELOPE_PREFIX_OVERHEAD + \
+ sizeof(Shm_Envelope_preamble) + \
+ sizeof(Shm_Envelope_postamble))
+
+
+/* constants pertinent to Locked Queue routines */
+
+#define LQ_UNLOCKED SHM_UNLOCK_VALUE
+#define LQ_LOCKED SHM_LOCK_VALUE
+
+/* constants related to the Free Envelope Pool */
+
+#define FREE_ENV_POOL 0
+#define FREE_ENV_CB (&Shm_Locked_queues[ FREE_ENV_POOL ])
+
+/* The following are important when dealing with
+ * the shared memory communications interface area.
+ *
+ * NOTE: The starting address and length of the shared memory
+ * is defined in a system dependent file.
+ */
+
+#define START_NS_CBS ((void *)Shm_Configuration->base)
+#define START_LQ_CBS ((START_NS_CBS) + \
+ ( (sizeof (Shm_Node_status_control)) * (Shm_Maximum_nodes + 1) ) )
+#define START_ENVELOPES ( ((void *) START_LQ_CBS) + \
+ ( (sizeof (Shm_Locked_queue_Control)) * (Shm_Maximum_nodes + 1) ) )
+#define END_SHMCI_AREA ( (void *) START_ENVELOPES + \
+ ( (sizeof (Shm_Envelope_control)) * Shm_Maximum_envelopes ) )
+#define END_SHARED_MEM (START_NS_CBS+Shm_Configuration->length)
+
+/* macros */
+
+#define Shm_Is_master_node() \
+ ( SHM_MASTER == Shm_Local_node )
+
+#define Shm_Free_envelope( ecb ) \
+ Shm_Locked_queue_Add( FREE_ENV_CB, (ecb) )
+#define Shm_Allocate_envelope() \
+ Shm_Locked_queue_Get(FREE_ENV_CB)
+
+#define Shm_Initialize_receive_queue(node) \
+ Shm_Locked_queue_Initialize( &Shm_Locked_queues[node], node )
+
+#define Shm_Append_to_receive_queue(node, ecb) \
+ Shm_Locked_queue_Add( &Shm_Locked_queues[node], (ecb) )
+
+#define Shm_Envelope_control_to_packet_prefix_pointer(ecb) \
+ ((void *)(ecb)->packet)
+
+#define Shm_Packet_prefix_to_envelope_control_pointer( pkt ) \
+ ((Shm_Envelope_control *)((rtems_unsigned8 *)(pkt) - \
+ (sizeof(Shm_Envelope_preamble) + SHM_ENVELOPE_PREFIX_OVERHEAD)))
+
+#define Shm_Build_preamble(ecb, node) \
+ (ecb)->Preamble.endian = Shm_Configuration->format
+
+#define Shm_Build_postamble( ecb )
+
+/* volatile types */
+
+typedef volatile rtems_unsigned8 vol_u8;
+typedef volatile rtems_unsigned32 vol_u32;
+
+/* shm control information */
+
+struct shm_info {
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+ vol_u32 not_currently_used_3;
+};
+
+typedef struct {
+ /*byte start_of_text;*/
+ vol_u32 endian;
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+} Shm_Envelope_preamble;
+
+typedef struct {
+} Shm_Envelope_postamble;
+
+/* WARNING! If you change this structure, don't forget to change
+ * SHM_ENVELOPE_PREFIX_OVERHEAD and
+ * Shm_Packet_prefix_to_envelope_control_pointer() above.
+ */
+
+/* This comment block describes the contents of each field
+ * of the Envelope Control Block:
+ *
+ * next - The index of the next envelope on this queue.
+ * queue - The index of the queue this envelope is on.
+ * index - The index of this envelope.
+ * Preamble - Generic packet preamble. One day this structure
+ * could be enhanced to contain routing information.
+ * packet - RTEMS MPCI packet. Untouched by SHM Driver
+ * other than copying and format conversion as
+ * documented in the RTEMS User's Guide.
+ * Postamble - Generic packet postamble. One day this structure
+ * could be enhanced to contain checksum information.
+ */
+
+typedef struct {
+ vol_u32 next; /* next envelope on queue */
+ vol_u32 queue; /* queue on which this resides */
+ vol_u32 index; /* index into array of envelopes*/
+ vol_u32 pad0; /* insure the next one is aligned */
+ Shm_Envelope_preamble Preamble; /* header information */
+ vol_u8 packet[MAX_PACKET_SIZE]; /* RTEMS INFO */
+ Shm_Envelope_postamble Postamble;/* trailer information */
+} Shm_Envelope_control;
+
+/* This comment block describes the contents of each field
+ * of the Locked Queue Control Block:
+ *
+ * lock - Lock used to insure mutually exclusive access.
+ * front - Index of first envelope on queue. This field
+ * is used to remove head of queue (receive).
+ * rear - Index of last envelope on queue. This field
+ * is used to add evelope to queue (send).
+ * owner - The node number of the recipient (owning) node.
+ * RTEMS does not use the node number zero (0).
+ * The zero node is used by the SHM Driver for the
+ * Free Envelope Queue shared by all nodes.
+ */
+
+typedef struct {
+ vol_u32 lock; /* lock field for this queue */
+ vol_u32 front; /* first envelope on queue */
+ vol_u32 rear; /* last envelope on queue */
+ vol_u32 owner; /* receiving (i.e. owning) node */
+} Shm_Locked_queue_Control;
+
+/* This comment block describes the contents of each field
+ * of the Node Status Control Block:
+ *
+ * status - Node status. Current values are Pending Initialization,
+ * Initialization Complete, and Active Node. Other values
+ * could be added to enhance fault tolerance.
+ * error - Zero if the node has not failed. Otherwise,
+ * this field contains a status indicating the
+ * failure reason.
+ * int_address, int_value, and int_length
+ * - These field are the Interrupt Information table
+ * for this node in neutral format. This is how
+ * each node knows how to generate interrupts.
+ */
+
+typedef struct {
+ vol_u32 status; /* node status information */
+ vol_u32 error; /* fatal error code */
+ vol_u32 int_address; /* write here for interrupt */
+ vol_u32 int_value; /* this value causes interrupt */
+ vol_u32 int_length; /* for this length (0,1,2,4) */
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+} Shm_Node_status_control;
+
+/* This comment block describes the contents of each field
+ * of the Interrupt Information Table. This table describes
+ * how another node can generate an interrupt to this node.
+ * This information is target board dependent. If the
+ * SHM Driver is in POLLED_MODE, then all fields should
+ * be initialized to NO_INTERRUPT.
+ *
+ * address - The address to which another node should
+ * write to cause an interrupt.
+ * value - The value which must be written
+ * length - The size of the value to write. Valid
+ * values are BYTE, WORD, and LONG.
+ *
+ * NOTE: The Node Status Control Block contains this
+ * information in neutral format and not in a
+ * structure to avoid potential alignment problems.
+ */
+
+typedef struct {
+ vol_u32 *address; /* write here for interrupt */
+ vol_u32 value; /* this value causes interrupt */
+ vol_u32 length; /* for this length (0,1,2,4) */
+} Shm_Interrupt_information;
+
+/* SHM Configuration Table
+ *
+ * This comment block describes the contents of each field
+ * of the SHM Configuration Table.
+ *
+ * base - The base address of the shared memory. This
+ * address may be specific to this node.
+ * length - The length of the shared memory in bytes.
+ * format - The natural format for rtems_unsigned32's in the
+ * shared memory. Valid values are currently
+ * only SHM_LITTLE and SHM_BIG.
+ * convert - The address of the routine which converts
+ * between neutral and local format.
+ * poll_intr - The operational mode of the driver. Some
+ * target boards may not provide hardware for
+ * an interprocessor interrupt. If POLLED_MODE
+ * is selected, the SHM driver will install a
+ * wrapper around the Clock_isr() to poll for
+ * incoming packets. Throughput is dependent
+ * on the time between clock interrupts.
+ * Valid values are POLLED_MODE and INTR_MODE.
+ * cause_intr - This is the address of the routine used to
+ * write to a particular address and cause an
+ * interrupt on another node. This routine
+ * may need to be target dependent if something
+ * other than a normal write from C does not work.
+ * Intr - This structure describes the operation required
+ * to cause an interrupt to this node. The actual
+ * contents of this structure are described above.
+ */
+
+struct shm_config_info {
+ vol_u32 *base; /* base address of SHM */
+ vol_u32 length; /* length (in bytes) of SHM */
+ vol_u32 format; /* SHM is big or little endian */
+ vol_u32 (*convert)();/* neutral conversion routine */
+ vol_u32 poll_intr;/* POLLED or INTR driven mode */
+ void (*cause_intr)( rtems_unsigned32 );
+ Shm_Interrupt_information Intr; /* cause intr information */
+};
+
+typedef struct shm_config_info shm_config_table;
+
+/* global variables */
+
+#ifdef _SHM_INIT
+#define SHM_EXTERN
+#else
+#define SHM_EXTERN extern
+#endif
+
+SHM_EXTERN shm_config_table *Shm_Configuration;
+SHM_EXTERN Shm_Interrupt_information *Shm_Interrupt_table;
+SHM_EXTERN Shm_Node_status_control *Shm_Node_statuses;
+SHM_EXTERN Shm_Locked_queue_Control *Shm_Locked_queues;
+SHM_EXTERN Shm_Envelope_control *Shm_Envelopes;
+SHM_EXTERN rtems_configuration_table *Shm_RTEMS_Configuration;
+SHM_EXTERN rtems_multiprocessing_table *Shm_RTEMS_MP_Configuration;
+SHM_EXTERN rtems_unsigned32 Shm_Receive_message_count;
+SHM_EXTERN rtems_unsigned32 Shm_Null_message_count;
+SHM_EXTERN rtems_unsigned32 Shm_Interrupt_count;
+SHM_EXTERN rtems_unsigned32 Shm_Local_node;
+SHM_EXTERN Shm_Locked_queue_Control *Shm_Local_receive_queue;
+SHM_EXTERN Shm_Node_status_control *Shm_Local_node_status;
+SHM_EXTERN rtems_unsigned32 Shm_isrstat;
+ /* reported by shmdr */
+
+SHM_EXTERN rtems_unsigned32 Shm_Pending_initialization;
+SHM_EXTERN rtems_unsigned32 Shm_Initialization_complete;
+SHM_EXTERN rtems_unsigned32 Shm_Active_node;
+
+SHM_EXTERN rtems_unsigned32 Shm_Maximum_nodes;
+SHM_EXTERN rtems_unsigned32 Shm_Maximum_envelopes;
+
+SHM_EXTERN rtems_unsigned32 Shm_Locked_queue_End_of_list;
+SHM_EXTERN rtems_unsigned32 Shm_Locked_queue_Not_on_list;
+
+/* functions */
+
+/* locked queue routines */
+void Shm_Locked_queue_Add(
+ Shm_Locked_queue_Control *, Shm_Envelope_control * );
+Shm_Envelope_control *Shm_Locked_queue_Get( Shm_Locked_queue_Control * );
+void Shm_Locked_queue_Initialize(
+ Shm_Locked_queue_Control *, rtems_unsigned32 );
+ /* Shm_Initialize_lock is CPU dependent */
+ /* Shm_Lock is CPU dependent */
+ /* Shm_Unlock is CPU dependent */
+
+/* portable routines */
+void Init_env_pool();
+void Shm_Print_statistics( void );
+void MPCI_Fatal( Internal_errors_Source, boolean, rtems_unsigned32 );
+rtems_task Shm_Cause_interrupt( rtems_unsigned32 );
+void Shm_Poll();
+void Shm_setclockvec();
+void Shm_Convert_packet( rtems_packet_prefix * );
+
+/* CPU specific routines are inlined in shmcpu.h */
+
+/* target specific routines */
+void *Shm_Convert_address( void * );
+void Shm_Get_configuration( rtems_unsigned32, shm_config_table ** );
+void Shm_isr();
+void Shm_setvec( void );
+
+void Shm_Initialize_lock( Shm_Locked_queue_Control * );
+void Shm_Lock( Shm_Locked_queue_Control * );
+void Shm_Unlock( Shm_Locked_queue_Control * );
+
+/* MPCI entry points */
+rtems_mpci_entry Shm_Get_packet(
+ rtems_packet_prefix **
+);
+
+rtems_mpci_entry Shm_Initialization( void );
+
+rtems_mpci_entry Shm_Receive_packet(
+ rtems_packet_prefix **
+);
+
+rtems_mpci_entry Shm_Return_packet(
+ rtems_packet_prefix *
+);
+
+rtems_mpci_entry Shm_Send_packet(
+ rtems_unsigned32,
+ rtems_packet_prefix *
+);
+
+extern rtems_mpci_table MPCI_table;
+
+#ifdef _SHM_INIT
+
+/* multiprocessor communications interface (MPCI) table */
+
+rtems_mpci_table MPCI_table = {
+ 100000, /* default timeout value in ticks */
+ MAX_PACKET_SIZE, /* maximum packet size */
+ Shm_Initialization, /* initialization procedure */
+ Shm_Get_packet, /* get packet procedure */
+ Shm_Return_packet, /* return packet procedure */
+ Shm_Send_packet, /* packet send procedure */
+ Shm_Receive_packet /* packet receive procedure */
+};
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/sparc/Makefile.in b/c/src/lib/libbsp/sparc/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/sparc/erc32/Makefile.in b/c/src/lib/libbsp/sparc/erc32/Makefile.in
new file mode 100644
index 0000000000..c4d00cd7a6
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/Makefile.in
@@ -0,0 +1,16 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+# NOTE: we pick up HPPA clock and timer from libcpu/hppa
+SUB_DIRS=startsis include startup console clock timer wrapup
diff --git a/c/src/lib/libbsp/sparc/erc32/README b/c/src/lib/libbsp/sparc/erc32/README
new file mode 100644
index 0000000000..93f19bb383
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/README
@@ -0,0 +1,80 @@
+#
+# Description of SIS as related to this BSP
+#
+# $Id$
+#
+
+BSP NAME: sis
+BOARD: any based on the European Space Agency's ERC32
+BUS: N/A
+CPU FAMILY: sparc
+CPU: ERC32 (SPARC V7 + on-CPU peripherals)
+ based on Cypress 601/602
+COPROCESSORS: on-chip 602 compatible FPU
+MODE: 32 bit mode
+
+DEBUG MONITOR: none
+
+PERIPHERALS
+===========
+TIMERS:
+ NAME: General Purpose Timer
+ RESOLUTION: 50 nanoseconds - 12.8 microseconds
+ NAME: Real Time Clock Timer
+ RESOLUTION: 50 nanoseconds - 3.2768 milliseconds
+ NAME: Watchdog Timer
+ RESOLUTION: XXX
+SERIAL PORTS: 2 using on-chip UART
+REAL-TIME CLOCK: none
+DMA: on-chip
+VIDEO: none
+SCSI: none
+NETWORKING: none
+
+DRIVER INFORMATION
+==================
+CLOCK DRIVER: ERC32 internal Real Time Clock Timer
+IOSUPP DRIVER: N/A
+SHMSUPP: N/A
+TIMER DRIVER: ERC32 internal General Purpose Timer
+CONSOLE DRIVER: ERC32 internal UART
+
+STDIO
+=====
+PORT: Channel A
+ELECTRICAL: na since using simulator
+BAUD: na
+BITS PER CHARACTER: na
+PARITY: na
+STOP BITS: na
+
+Notes
+=====
+
+ERC32 BSP only supports single processor operations.
+
+A nice feature of this BSP is that the RAM and PROM size are set in the
+linkcmds file and the startup code programs the Memory Configuration
+Register based on those sizes.
+
+The Watchdog Timer is disabled.
+
+This code was developed and tested entirely using the SPARC Instruction
+Simulator (SIS) for the ERC32. All tests were known to run correctly
+against sis v1.7.
+
+
+Memory Map
+==========
+
+0x00000000 - 0x00000000 + _PROM_SIZE code and initialized data
+0x01f80000 on chip peripherals
+0x00000000 - 0x02000000 + _RAM_SIZE destination for initialized data
+ BSS (i.e. unitialized data)
+ C Heap (i.e. malloc area)
+ RTEMS Workspace
+
+The C heap is assigned all memory between the end of the BSS and the
+RTEMS Workspace. The size of the RTEMS Workspace is based on that
+specified in the application's configuration table.
+
diff --git a/c/src/lib/libbsp/sparc/erc32/bsp_specs b/c/src/lib/libbsp/sparc/erc32/bsp_specs
new file mode 100644
index 0000000000..eaf71059ad
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/bsp_specs
@@ -0,0 +1,34 @@
+
+predefines:
+-D__embedded__ -Asystem(embedded)
+
+startfile: replace
+mrtems:
+pg: startsis.o%s
+{!pg:
+g: startsis.o%s
+{!g:
+p: startsis.o%s
+!p: startsis.o%s
+}}
+{!mrtems:
+pg: pgcrt0%O
+{!pg:
+g: gcrt0%O
+{!g:
+p: pcrt0%O
+!p: crt0%O
+}}}
+
+
+link: replace
+mrtems: -dc -dp -N -T linkcmds%s -e start
+
+lib: replace
+mrtems: -( -lc -lrtemsall -lgcc -)
+
+
+libgcc: replace
+
+
+
diff --git a/c/src/lib/libbsp/sparc/erc32/clock/Makefile.in b/c/src/lib/libbsp/sparc/erc32/clock/Makefile.in
new file mode 100644
index 0000000000..3dd7213304
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/clock/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
new file mode 100644
index 0000000000..be11ab8fe7
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/clock/ckinit.c
@@ -0,0 +1,262 @@
+/*
+ * Clock Tick Device Driver
+ *
+ * This routine initializes the Real Time Clock Counter Timer which is
+ * part of the MEC on the ERC32 CPU.
+ *
+ * The tick frequency is directly programmed to the configured number of
+ * microseconds per tick.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <stdlib.h>
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+/*
+ * The Real Time Clock Counter Timer uses this trap type.
+ */
+
+#define CLOCK_VECTOR ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK )
+
+/*
+ * Clock ticks since initialization
+ */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+/*
+ * This is the value programmed into the count down timer. It
+ * is artificially lowered when SIMSPARC_FAST_IDLE is defined to
+ * cut down how long we spend in the idle task while executing on
+ * the simulator.
+ */
+
+extern rtems_unsigned32 CPU_SPARC_CLICKS_PER_TICK;
+
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * Clock_isr
+ *
+ * This is the clock tick interrupt handler.
+ *
+ * Input parameters:
+ * vector - vector number
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ *
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+ /*
+ * If we are in "fast idle" mode, then the value for clicks per tick
+ * is lowered to decrease the amount of time spent executing the idle
+ * task while using the SPARC Instruction Simulator.
+ */
+
+#if SIMSPARC_FAST_IDLE
+ ERC32_MEC.Real_Time_Clock_Counter = CPU_SPARC_CLICKS_PER_TICK;
+ ERC32_MEC_Set_Real_Time_Clock_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING |
+ ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER
+ );
+#endif
+
+ /*
+ * The driver has seen another tick.
+ */
+
+ Clock_driver_ticks += 1;
+
+ /*
+ * Real Time Clock counter/timer is set to automatically reload.
+ */
+
+ rtems_clock_tick();
+}
+
+/*
+ * Install_clock
+ *
+ * This routine actually performs the hardware initialization for the clock.
+ *
+ * Input parameters:
+ * clock_isr - clock interrupt service routine entry point
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ *
+ */
+
+extern int CLOCK_SPEED;
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ Clock_driver_ticks = 0;
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+
+ /* approximately 1 us per countdown */
+ ERC32_MEC.Real_Time_Clock_Scalar = CLOCK_SPEED - 1;
+ ERC32_MEC.Real_Time_Clock_Counter = CPU_SPARC_CLICKS_PER_TICK;
+
+ ERC32_MEC_Set_Real_Time_Clock_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING |
+ ERC32_MEC_TIMER_COUNTER_LOAD_SCALER |
+ ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER
+ );
+
+ ERC32_MEC_Set_Real_Time_Clock_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING |
+ ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO
+ );
+
+ atexit( Clock_exit );
+ }
+
+}
+
+/*
+ * Clock_exit
+ *
+ * This routine allows the clock driver to exit by masking the interrupt and
+ * disabling the clock's counter.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ *
+ */
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ ERC32_Mask_interrupt( ERC32_INTERRUPT_REAL_TIME_CLOCK );
+
+ ERC32_MEC_Set_Real_Time_Clock_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_DISABLE_COUNTING
+ );
+
+ /* do not restore old vector */
+ }
+}
+
+/*
+ * Clock_initialize
+ *
+ * This routine initializes the clock driver.
+ *
+ * Input parameters:
+ * major - clock device major number
+ * minor - clock device minor number
+ * parg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ */
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Clock_control
+ *
+ * This routine is the clock device driver control entry point.
+ *
+ * Input parameters:
+ * major - clock device major number
+ * minor - clock device minor number
+ * parg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ */
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/sparc/erc32/console/Makefile.in b/c/src/lib/libbsp/sparc/erc32/console/Makefile.in
new file mode 100644
index 0000000000..58d2734659
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/console/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/sparc/erc32/console/console.c b/c/src/lib/libbsp/sparc/erc32/console/console.c
new file mode 100644
index 0000000000..8cc3d23850
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/console/console.c
@@ -0,0 +1,609 @@
+/*
+ * console.c
+ *
+ * This file contains the Sparc Instruction Simulator Console driver.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <stdlib.h>
+
+/*
+ * Define RDB_BREAK_IN if you need to be able to break in to the
+ * program with a ctrl-c during remote target debugging. If so,
+ * UART B will not be accessible from rtems during remote debugging
+ * if interrupt driven console is used. Does not affect UART A, polled
+ * mode or when the program runs without remote debugging.
+ */
+
+#define RDB_BREAK_IN
+
+/*
+ * Should we use a polled or interrupt drived console?
+ *
+ * NOTE: Define only one of these by default.
+ *
+ * WARNING: As of sis 1.6, it did not appear that the UART interrupts
+ * worked in a desirable fashion. Immediately upon writing
+ * a character into the TX buffer, an interrupt was generated.
+ * This did not allow enough time for the program to put more
+ * characters in the buffer. So every character resulted in
+ * "priming" the transmitter. This effectively results in
+ * in a polled console with a useless interrupt per character
+ * on output. It is reasonable to assume that input does not
+ * share this problem although it was not investigated.
+ */
+
+#ifdef CONSOLE_USE_POLLED
+#define OUTBYTE console_outbyte_polled
+#define INBYTE console_inbyte_polled
+#else
+#define OUTBYTE console_outbyte_interrupts
+#define INBYTE console_inbyte_interrupts
+#endif
+
+void console_initialize_interrupts( void );
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters:
+ * major - console device major number
+ * minor - console device minor number
+ * arg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+#ifdef CONSOLE_USE_INTERRUPTS
+ console_initialize_interrupts();
+#endif
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/* console_inbyte_polled
+ *
+ * This routine reads a character from the UART.
+ *
+ * Input parameters:
+ * port - port to read character from
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char console_inbyte_polled( int port )
+{
+ int UStat;
+
+ if ( port == 0 ) {
+ while (((UStat = ERC32_MEC.UART_Status) & ERC32_MEC_UART_STATUS_DRA) == 0 )
+ if (UStat & ERC32_MEC_UART_STATUS_ERRA) {
+ ERC32_MEC.UART_Status = ERC32_MEC_UART_STATUS_CLRA;
+ ERC32_MEC.Control = ERC32_MEC.Control;
+ }
+ return (int) ERC32_MEC.UART_Channel_A;
+ }
+
+ while (((UStat = ERC32_MEC.UART_Status) & ERC32_MEC_UART_STATUS_DRB) == 0 )
+ if (UStat & ERC32_MEC_UART_STATUS_ERRB) {
+ ERC32_MEC.UART_Status = ERC32_MEC_UART_STATUS_CLRB;
+ ERC32_MEC.Control = ERC32_MEC.Control;
+ }
+ return (int) ERC32_MEC.UART_Channel_B;
+}
+
+
+/* console_outbyte_polled
+ *
+ * This routine transmits a character out.
+ *
+ * Input parameters:
+ * port - port to transmit character to
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+void console_outbyte_polled(
+ int port,
+ char ch
+)
+{
+ if ( port == 0 ) {
+ while ( (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEA) == 0 );
+ ERC32_MEC.UART_Channel_A = (int) ch;
+ return;
+ }
+
+ while ( (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB) == 0 );
+ ERC32_MEC.UART_Channel_B = (int) ch;
+}
+
+/*
+ * Interrupt driven console IO
+ */
+
+#ifdef CONSOLE_USE_INTERRUPTS
+
+/*
+ * Buffers between task and ISRs
+ */
+
+#include <ringbuf.h>
+
+Ring_buffer_t TX_Buffer[ 2 ];
+Ring_buffer_t RX_Buffer[ 2 ];
+boolean Is_TX_active[ 2 ];
+
+/*
+ * console_isr_a
+ *
+ * This routine is the console interrupt handler for Channel A.
+ *
+ * Input parameters:
+ * vector - vector number
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+rtems_isr console_isr_a(
+ rtems_vector_number vector
+)
+{
+ char ch;
+ int UStat;
+
+ if ( (UStat = ERC32_MEC.UART_Status) & ERC32_MEC_UART_STATUS_DRA ) {
+ if (UStat & ERC32_MEC_UART_STATUS_ERRA) {
+ ERC32_MEC.UART_Status = ERC32_MEC_UART_STATUS_CLRA;
+ ERC32_MEC.Control = ERC32_MEC.Control;
+ }
+ ch = ERC32_MEC.UART_Channel_A;
+ if ( !Ring_buffer_Is_full( &RX_Buffer[ 0 ] ) )
+ Ring_buffer_Add_character( &RX_Buffer[ 0 ], ch );
+ /* else toss it */
+ }
+
+ if ( ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEA ) {
+ if ( !Ring_buffer_Is_empty( &TX_Buffer[ 0 ] ) ) {
+ Ring_buffer_Remove_character( &TX_Buffer[ 0 ], ch );
+ ERC32_MEC.UART_Channel_A = (unsigned32) ch;
+ } else
+ Is_TX_active[ 0 ] = FALSE;
+ }
+
+ ERC32_Clear_interrupt( ERC32_INTERRUPT_UART_A_RX_TX );
+}
+
+/*
+ * console_isr_b
+ *
+ * This routine is the console interrupt handler for Channel B.
+ *
+ * Input parameters:
+ * vector - vector number
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+rtems_isr console_isr_b(
+ rtems_vector_number vector
+)
+{
+ char ch;
+ int UStat;
+
+ if ( (UStat = ERC32_MEC.UART_Status) & ERC32_MEC_UART_STATUS_DRB ) {
+ if (UStat & ERC32_MEC_UART_STATUS_ERRB) {
+ ERC32_MEC.UART_Status = ERC32_MEC_UART_STATUS_CLRB;
+ ERC32_MEC.Control = ERC32_MEC.Control;
+ }
+ ch = ERC32_MEC.UART_Channel_B;
+ if ( !Ring_buffer_Is_full( &RX_Buffer[ 1 ] ) )
+ Ring_buffer_Add_character( &RX_Buffer[ 1 ], ch );
+ /* else toss it */
+ }
+
+ if ( ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB ) {
+ if ( !Ring_buffer_Is_empty( &TX_Buffer[ 1 ] ) ) {
+ Ring_buffer_Remove_character( &TX_Buffer[ 1 ], ch );
+ ERC32_MEC.UART_Channel_B = (unsigned32) ch;
+ } else
+ Is_TX_active[ 1 ] = FALSE;
+ }
+
+ ERC32_Clear_interrupt( ERC32_INTERRUPT_UART_B_RX_TX );
+}
+
+/*
+ * console_exit
+ *
+ * This routine allows the console to exit by masking its associated interrupt
+ * vectors.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+void console_exit()
+{
+ rtems_unsigned32 port;
+ rtems_unsigned32 ch;
+
+ /*
+ * Although the interrupts for the UART are unmasked, the PIL is set to
+ * disable all external interrupts. So we might as well do this first.
+ */
+
+ ERC32_Mask_interrupt( ERC32_INTERRUPT_UART_A_RX_TX );
+ ERC32_Mask_interrupt( ERC32_INTERRUPT_UART_B_RX_TX );
+
+ for ( port=0 ; port <= 1 ; port++ ) {
+ while ( !Ring_buffer_Is_empty( &TX_Buffer[ port ] ) ) {
+ Ring_buffer_Remove_character( &TX_Buffer[ port ], ch );
+ console_outbyte_polled( port, ch );
+ }
+ }
+
+ /*
+ * Now wait for all the data to actually get out ... the send register
+ * should be empty.
+ */
+
+ while ( (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEA) !=
+ ERC32_MEC_UART_STATUS_THEA );
+
+ while ( (ERC32_MEC.UART_Status & ERC32_MEC_UART_STATUS_THEB) !=
+ ERC32_MEC_UART_STATUS_THEB );
+
+}
+
+#define CONSOLE_UART_A_TRAP ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_A_RX_TX )
+#define CONSOLE_UART_B_TRAP ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_B_RX_TX )
+
+/*
+ * console_initialize_interrupts
+ *
+ * This routine initializes the console's receive and transmit
+ * ring buffers and loads the appropriate vectors to handle the interrupts.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+#ifdef RDB_BREAK_IN
+ extern unsigned32 trap_table[];
+#endif
+
+void console_initialize_interrupts()
+{
+ Ring_buffer_Initialize( &RX_Buffer[ 0 ] );
+ Ring_buffer_Initialize( &RX_Buffer[ 1 ] );
+
+ Ring_buffer_Initialize( &TX_Buffer[ 0 ] );
+ Ring_buffer_Initialize( &TX_Buffer[ 1 ] );
+
+ Is_TX_active[ 0 ] = FALSE;
+ Is_TX_active[ 1 ] = FALSE;
+
+ atexit( console_exit );
+
+ set_vector( console_isr_a, CONSOLE_UART_A_TRAP, 1 );
+#ifdef RDB_BREAK_IN
+ if (trap_table[0x150/4] == 0x91d02000)
+#endif
+ set_vector( console_isr_b, CONSOLE_UART_B_TRAP, 1 );
+}
+
+/*
+ * console_inbyte_interrupts
+ *
+ * This routine reads a character from the UART.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char console_inbyte_interrupts( int port )
+{
+ char ch;
+
+ while ( Ring_buffer_Is_empty( &RX_Buffer[ port ] ) );
+
+ Ring_buffer_Remove_character( &RX_Buffer[ port ], ch );
+ return ch;
+}
+
+/*
+ * console_outbyte_interrupts
+ *
+ * This routine transmits a character out.
+ *
+ * Input parameters:
+ * port - port to transmit character to
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+void console_outbyte_interrupts(
+ int port,
+ char ch
+)
+{
+ /*
+ * If this is the first character then we need to prime the pump
+ */
+
+ if ( Is_TX_active[ port ] == FALSE ) {
+ Is_TX_active[ port ] = TRUE;
+ console_outbyte_polled( port, ch );
+ return;
+ }
+
+ while ( Ring_buffer_Is_full( &TX_Buffer[ port ] ) );
+
+ Ring_buffer_Add_character( &TX_Buffer[ port ], ch );
+}
+
+#endif /* CONSOLE_USE_INTERRUPTS */
+
+/*
+ * DEBUG_puts
+ *
+ * This should be safe in the event of an error. It attempts to insure
+ * that no TX empty interrupts occur while it is doing polled IO. Then
+ * it restores the state of that external interrupt.
+ *
+ * Input parameters:
+ * string - pointer to debug output string
+ *
+ * Output parameters: NONE
+ *
+ * Return values: NONE
+ */
+
+void DEBUG_puts(
+ char *string
+)
+{
+ char *s;
+ unsigned32 old_level;
+
+ ERC32_Disable_interrupt( ERC32_INTERRUPT_UART_A_RX_TX, old_level );
+ for ( s = string ; *s ; s++ )
+ console_outbyte_polled( 0, *s );
+
+ console_outbyte_polled( 0, '\r' );
+ console_outbyte_polled( 0, '\n' );
+ ERC32_Restore_interrupt( ERC32_INTERRUPT_UART_A_RX_TX, old_level );
+}
+
+
+/*
+ * console_open
+ *
+ * This routine is the console device driver open entry point.
+ *
+ * Input parameters:
+ * major - console device major number
+ * minor - console device minor number
+ * arg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * console_close
+ *
+ * This routine is the console device driver close entry point.
+ *
+ * Input parameters:
+ * major - console device major number
+ * minor - console device minor number
+ * arg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * console_read
+ *
+ * This routine is the console device driver read entry point.
+ *
+ * Input parameters:
+ * major - console device major number
+ * minor - console device minor number
+ * arg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ *
+ * NOTE: Read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = INBYTE( minor );
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * console_write
+ *
+ * This routine is the console device driver write entry point.
+ *
+ * Input parameters:
+ * major - console device major number
+ * minor - console device minor number
+ * arg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ *
+ * NOTE: Write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ OUTBYTE( minor, buffer[ count ] );
+ if ( buffer[ count ] == '\n') {
+ OUTBYTE( minor, '\r');
+ }
+ }
+
+ rw_args->bytes_moved = maximum;
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * console_control
+ *
+ * This routine is the console device driver control entry point.
+ *
+ * Input parameters:
+ * major - console device major number
+ * minor - console device minor number
+ * arg - pointer to optional device driver arguments
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * rtems_device_driver status code
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libbsp/sparc/erc32/include/Makefile.in b/c/src/lib/libbsp/sparc/erc32/include/Makefile.in
new file mode 100644
index 0000000000..8022b50bb2
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/include/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+# If you add equate files, don't forget to uncomment the install line
+# below.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/sparc/erc32/include/bsp.h b/c/src/lib/libbsp/sparc/erc32/include/bsp.h
new file mode 100644
index 0000000000..d5e71b9598
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/include/bsp.h
@@ -0,0 +1,181 @@
+/* bsp.h
+ *
+ * This include file contains all SPARC simulator definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#ifndef __SIS_h
+#define __SIS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+#include <erc32.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 3 /* 3 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Define the interrupt mechanism for Time Test 27
+ *
+ * NOTE: Since the interrupt code for the SPARC supports both synchronous
+ * and asynchronous trap handlers, support for testing with both
+ * is included.
+ */
+
+#define SIS_USE_SYNCHRONOUS_TRAP 0
+
+/*
+ * The synchronous trap is an arbitrarily chosen software trap.
+ */
+
+#if (SIS_USE_SYNCHRONOUS_TRAP == 1)
+
+#define TEST_VECTOR SPARC_SYNCHRONOUS_TRAP( 0x90 )
+
+#define MUST_WAIT_FOR_INTERRUPT 1
+
+#define Install_tm27_vector( handler ) \
+ set_vector( (handler), TEST_VECTOR, 1 );
+
+#define Cause_tm27_intr() \
+ asm volatile( "ta 0x10; nop " );
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr()
+
+/*
+ * The asynchronous trap is an arbitrarily chosen ERC32 interrupt source.
+ */
+
+#else /* use a regular asynchronous trap */
+
+#define TEST_INTERRUPT_SOURCE ERC32_INTERRUPT_EXTERNAL_1
+#define TEST_VECTOR ERC32_TRAP_TYPE( TEST_INTERRUPT_SOURCE )
+
+#define MUST_WAIT_FOR_INTERRUPT 1
+
+#define Install_tm27_vector( handler ) \
+ set_vector( (handler), TEST_VECTOR, 1 );
+
+#define Cause_tm27_intr() \
+ do { \
+ ERC32_Force_interrupt( TEST_INTERRUPT_SOURCE ); \
+ nop(); \
+ nop(); \
+ nop(); \
+ } while (0)
+
+#define Clear_tm27_intr() \
+ ERC32_Clear_interrupt( TEST_INTERRUPT_SOURCE )
+
+#define Lower_tm27_intr()
+
+#endif
+
+/*
+ * Simple spin delay in microsecond units for device drivers.
+ * This is very dependent on the clock speed of the target.
+ */
+
+extern void Clock_delay(rtems_unsigned32 microseconds);
+
+#define delay( microseconds ) Clock_delay(microseconds)
+
+/* Constants */
+
+/*
+ * Information placed in the linkcmds file.
+ */
+
+extern int RAM_START;
+extern int RAM_END;
+extern int RAM_SIZE;
+
+extern int PROM_START;
+extern int PROM_END;
+extern int PROM_SIZE;
+
+extern int CLOCK_SPEED;
+
+extern int end; /* last address in the program */
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+
+/* miscellaneous stuff assumed to exist */
+
+void bsp_cleanup( void );
+
+void bsp_start( void );
+
+rtems_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+);
+
+void DEBUG_puts( char *string );
+
+void BSP_fatal_return( void );
+
+void bsp_spurious_initialize( void );
+
+extern rtems_configuration_table BSP_Configuration; /* owned by BSP */
+
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+extern rtems_unsigned32 bsp_isr_level;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/sparc/erc32/include/coverhd.h b/c/src/lib/libbsp/sparc/erc32/include/coverhd.h
new file mode 100644
index 0000000000..9630bdb677
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/include/coverhd.h
@@ -0,0 +1,111 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C for this target.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/sparc/erc32/start/Makefile.in b/c/src/lib/libbsp/sparc/erc32/start/Makefile.in
new file mode 100644
index 0000000000..07bd7ad73e
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/start/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGMS=${ARCH}/startsis.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=startsis
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/sparc/erc32/start/startsis.s b/c/src/lib/libbsp/sparc/erc32/start/startsis.s
new file mode 100644
index 0000000000..225d70abf0
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/start/startsis.s
@@ -0,0 +1,309 @@
+/*
+ * startsis.s
+ *
+ * Start code for the ERC32.
+ *
+ * This is based on the file srt0.s provided with the binary
+ * distribution of the SPARC Instruction Simulator (SIS) found
+ * at ftp://ftp.estec.esa.nl/pub/ws/wsd/erc32.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+#include <erc32.h>
+
+/*
+ * Unexpected trap will halt the processor by forcing it to error state
+ */
+
+#define BAD_TRAP \
+ ta 0; \
+ nop; \
+ nop; \
+ nop;
+
+/*
+ * Software trap. Treat as BAD_TRAP for the time being...
+ */
+
+#define SOFT_TRAP BAD_TRAP
+
+
+ .seg "text"
+ PUBLIC(start)
+ .global start
+
+SYM(start):
+start:
+
+/*
+ * The trap table has to be the first code in a boot PROM. But because
+ * the Memory Configuration comes up thinking we only have 4K of PROM, we
+ * cannot have a full trap table and still have room left over to
+ * reprogram the Memory Configuration register correctly. This file
+ * uses an abbreviated trap which has every entry which might be used
+ * before RTEMS installs its own trap table.
+ */
+
+
+ PUBLIC(trap_table)
+SYM(trap_table):
+
+ RTRAP( 0, SYM(hard_reset) ); ! 00 reset trap
+ BAD_TRAP; ! 01 instruction access
+ ! exception
+ BAD_TRAP; ! 02 illegal instruction
+ BAD_TRAP; ! 03 privileged instruction
+ BAD_TRAP; ! 04 fp disabled
+ TRAP( 5, SYM(window_overflow_trap_handler) ); ! 05 window overflow
+ TRAP( 6, SYM(window_underflow_trap_handler) );! 06 window underflow
+ BAD_TRAP; ! 07 memory address not aligned
+ BAD_TRAP; ! 08 fp exception
+ BAD_TRAP; ! 09 data access exception
+ BAD_TRAP; ! 0A tag overflow
+ BAD_TRAP; ! 0B undefined
+ BAD_TRAP; ! 0C undefined
+ BAD_TRAP; ! 0D undefined
+ BAD_TRAP; ! 0E undefined
+ BAD_TRAP; ! 0F undefined
+ BAD_TRAP; ! 10 undefined
+
+ /*
+ * ERC32 defined traps
+ */
+
+ BAD_TRAP; ! 11 masked errors
+ BAD_TRAP; ! 12 external 1
+ BAD_TRAP; ! 13 external 2
+ BAD_TRAP; ! 14 UART A RX/TX
+ BAD_TRAP; ! 15 UART B RX/TX
+ BAD_TRAP; ! 16 correctable memory error
+ BAD_TRAP; ! 17 UART error
+ BAD_TRAP; ! 18 DMA access error
+ BAD_TRAP; ! 19 DMA timeout
+ BAD_TRAP; ! 1A external 3
+ BAD_TRAP; ! 1B external 4
+ BAD_TRAP; ! 1C general purpose timer
+ BAD_TRAP; ! 1D real time clock
+ BAD_TRAP; ! 1E external 5
+ BAD_TRAP; ! 1F watchdog timeout
+
+
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 20 - 23 undefined
+ BAD_TRAP; ! 24 cp_disabled
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 25 - 27 undefined
+ BAD_TRAP; ! 28 cp_exception
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 29 - 2B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 2C - 2F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 30 - 33 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 34 - 37 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 38 - 3B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 3C - 3F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 40 - 43 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 44 - 47 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 48 - 4B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 4C - 4F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 50 - 53 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 54 - 57 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 58 - 5B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 5C - 5F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 60 - 63 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 64 - 67 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 68 - 6B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 6C - 6F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 70 - 73 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 74 - 77 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 78 - 7B undefined
+
+/*
+ This is a sad patch to make sure that we know where the
+ MEC timer control register mirror is so we can stop the timers
+ from an external debugger. It is needed because the control
+ register is write-only. Trap 0x7C cannot occure in ERC32...
+
+ We also use this location to store the last location of the
+ usable RAM in order not to overwrite the remote debugger with
+ the RTEMS work-space area.
+
+*/
+
+ .global __ERC32_MEC_Timer_Control_Mirror, _rdb_start, _CLOCK_SPEED
+
+_rdb_start:
+__ERC32_MEC_Timer_Control_Mirror:
+
+ BAD_TRAP; BAD_TRAP; ! 7C - 7D undefined
+
+_CLOCK_SPEED:
+ BAD_TRAP; BAD_TRAP; ! BAD_TRAP; BAD_TRAP; ! 7E - 7F undefined
+
+ /*
+ * Software traps
+ *
+ * NOTE: At the risk of being redundant... this is not a full
+ * table. The setjmp on the SPARC requires a window flush trap
+ * handler and RTEMS will preserve the entries that were
+ * installed before.
+ */
+
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 80 - 82
+ TRAP( 0x83, SYM(window_flush_trap_handler) ); ! 83 flush windows SW trap
+
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 84 - 87
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 88 - 8B
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 8C - 8F
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 90 - 93
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 94 - 97
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 98 - 9B
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 9C - 9F
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A0 - A3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A4 - A7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A8 - AB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! AC - AF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B0 - B3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B4 - B7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B8 - BB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! BC - BF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C0 - C3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C4 - C7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C8 - CB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! CC - CF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D0 - D3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D4 - D7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D8 - DB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! DC - DF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E0 - E3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E4 - E7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E8 - EB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! EC - EF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F0 - F3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F4 - F7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F8 - FB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! FC - FF
+
+/*
+ * This is the hard reset code.
+ */
+
+#define PSR_INIT 0x10c0 /* Disable traps, set s and ps */
+#define WIM_INIT 2
+#define STACK_SIZE 16 * 1024
+
+ PUBLIC(hard_reset)
+SYM(hard_reset):
+
+ set _trap_table, %g1 ! Initialize TBR
+ mov %g1, %tbr
+
+ set (SYM(rdb_start)), %g6 ! End of work-space area
+ st %sp, [%g6]
+
+
+/* Check if MEC is initialised. If not, this means that we are
+ running on the simulator. Initiate some of the parameters
+ that are done by the boot-prom otherwise.
+*/
+
+ set SYM(ERC32_MEC), %g3 ! g3 = base address of peripherals
+ ld [%g3], %g2
+ set 0xfe080000, %g1
+ andcc %g1, %g2, %g0
+ bne 1f
+ set 0x00101000, %g1 ! 2M ROM, 4M RAM
+ ! set the Memory Configuration
+ st %g1, [ %g3 + ERC32_MEC_MEMORY_CONFIGURATION_OFFSET ]
+
+ set SYM(RAM_END), %sp ! End of work-space area
+ st %sp, [%g6]
+
+ set _CLOCK_SPEED, %g6 ! Use 14 MHz in simulator
+ set 14, %g1
+ st %g1, [%g6]
+
+/* Common initialisation */
+1:
+ set WIM_INIT, %g1 ! Initialize WIM
+ mov %g1, %wim
+
+ set PSR_INIT, %g1
+ wr %g1, 0x20, %psr ! enable traps
+
+ nop
+ nop
+ nop
+
+ sethi %hi(stack_space + STACK_SIZE), %g1
+ or %g1,%lo(stack_space + STACK_SIZE),%g1
+ ! g1 = top of stack
+ mov %g1, %sp ! Set stack pointer
+ mov %sp, %fp ! Set frame pointer
+ nop
+
+ /*
+ * Copy the initialized data to RAM
+ *
+ * FROM: _endtext
+ * TO: _data_start
+ * LENGTH: (__bss_start - _data_start) bytes
+ */
+
+
+ sethi %hi(_endtext),%g2
+ or %g2,%lo(_endtext),%g2 ! g2 = start of initialized data in ROM
+
+ sethi %hi(_data_start),%g3
+ or %g3,%lo(_data_start),%g3 ! g3 = start of initialized data in RAM
+
+ sethi %hi(__bss_start),%g4
+ or %g4,%lo(__bss_start),%g4 ! g4 = end of initialized data in RAM
+
+ cmp %g2, %g3
+ be 1f
+ nop
+
+copy_data:
+ ldd [ %g2 ], %g6
+ std %g6 , [ %g3 ] ! copy this double word
+ add %g3, 8, %g3 ! bump the destination pointer
+ add %g2, 8, %g2 ! bump the source pointer
+ cmp %g3, %g4 ! Is the pointer past the end of dest?
+ bl copy_data
+ nop
+
+ /* clear the bss */
+1:
+
+ sethi %hi(_edata),%g2
+ or %g2,%lo(_edata),%g2 ! g2 = start of bss
+ sethi %hi(_end),%g3
+ or %g3,%lo(_end),%g3 ! g3 = end of bss
+ mov %g0,%g1 ! so std has two zeros
+zerobss:
+ std %g0,[%g2]
+ add %g2,8,%g2
+ cmp %g2,%g3
+ bleu,a zerobss
+ nop
+
+ mov %0, %o2 ! environ
+ mov %0, %o1 ! argv
+ mov %0, %o0 ! argc
+ call SYM(main)
+ sub %sp, 0x60, %sp ! room for main to save args
+ nop
+
+ PUBLIC(BSP_fatal_return)
+SYM(BSP_fatal_return):
+ ta 0 ! Halt if _main returns ...
+ nop
+
+ /*
+ * There does not seem to be a way to get this aligned AND
+ * in the BSS.
+ */
+
+ .align 32
+ .comm stack_space, STACK_SIZE
+
+/* end of file */
diff --git a/c/src/lib/libbsp/sparc/erc32/startsis/Makefile.in b/c/src/lib/libbsp/sparc/erc32/startsis/Makefile.in
new file mode 100644
index 0000000000..07bd7ad73e
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startsis/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGMS=${ARCH}/startsis.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=startsis
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/sparc/erc32/startsis/startsis.s b/c/src/lib/libbsp/sparc/erc32/startsis/startsis.s
new file mode 100644
index 0000000000..225d70abf0
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startsis/startsis.s
@@ -0,0 +1,309 @@
+/*
+ * startsis.s
+ *
+ * Start code for the ERC32.
+ *
+ * This is based on the file srt0.s provided with the binary
+ * distribution of the SPARC Instruction Simulator (SIS) found
+ * at ftp://ftp.estec.esa.nl/pub/ws/wsd/erc32.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+#include <erc32.h>
+
+/*
+ * Unexpected trap will halt the processor by forcing it to error state
+ */
+
+#define BAD_TRAP \
+ ta 0; \
+ nop; \
+ nop; \
+ nop;
+
+/*
+ * Software trap. Treat as BAD_TRAP for the time being...
+ */
+
+#define SOFT_TRAP BAD_TRAP
+
+
+ .seg "text"
+ PUBLIC(start)
+ .global start
+
+SYM(start):
+start:
+
+/*
+ * The trap table has to be the first code in a boot PROM. But because
+ * the Memory Configuration comes up thinking we only have 4K of PROM, we
+ * cannot have a full trap table and still have room left over to
+ * reprogram the Memory Configuration register correctly. This file
+ * uses an abbreviated trap which has every entry which might be used
+ * before RTEMS installs its own trap table.
+ */
+
+
+ PUBLIC(trap_table)
+SYM(trap_table):
+
+ RTRAP( 0, SYM(hard_reset) ); ! 00 reset trap
+ BAD_TRAP; ! 01 instruction access
+ ! exception
+ BAD_TRAP; ! 02 illegal instruction
+ BAD_TRAP; ! 03 privileged instruction
+ BAD_TRAP; ! 04 fp disabled
+ TRAP( 5, SYM(window_overflow_trap_handler) ); ! 05 window overflow
+ TRAP( 6, SYM(window_underflow_trap_handler) );! 06 window underflow
+ BAD_TRAP; ! 07 memory address not aligned
+ BAD_TRAP; ! 08 fp exception
+ BAD_TRAP; ! 09 data access exception
+ BAD_TRAP; ! 0A tag overflow
+ BAD_TRAP; ! 0B undefined
+ BAD_TRAP; ! 0C undefined
+ BAD_TRAP; ! 0D undefined
+ BAD_TRAP; ! 0E undefined
+ BAD_TRAP; ! 0F undefined
+ BAD_TRAP; ! 10 undefined
+
+ /*
+ * ERC32 defined traps
+ */
+
+ BAD_TRAP; ! 11 masked errors
+ BAD_TRAP; ! 12 external 1
+ BAD_TRAP; ! 13 external 2
+ BAD_TRAP; ! 14 UART A RX/TX
+ BAD_TRAP; ! 15 UART B RX/TX
+ BAD_TRAP; ! 16 correctable memory error
+ BAD_TRAP; ! 17 UART error
+ BAD_TRAP; ! 18 DMA access error
+ BAD_TRAP; ! 19 DMA timeout
+ BAD_TRAP; ! 1A external 3
+ BAD_TRAP; ! 1B external 4
+ BAD_TRAP; ! 1C general purpose timer
+ BAD_TRAP; ! 1D real time clock
+ BAD_TRAP; ! 1E external 5
+ BAD_TRAP; ! 1F watchdog timeout
+
+
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 20 - 23 undefined
+ BAD_TRAP; ! 24 cp_disabled
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 25 - 27 undefined
+ BAD_TRAP; ! 28 cp_exception
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 29 - 2B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 2C - 2F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 30 - 33 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 34 - 37 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 38 - 3B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 3C - 3F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 40 - 43 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 44 - 47 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 48 - 4B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 4C - 4F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 50 - 53 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 54 - 57 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 58 - 5B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 5C - 5F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 60 - 63 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 64 - 67 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 68 - 6B undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 6C - 6F undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 70 - 73 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 74 - 77 undefined
+ BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 78 - 7B undefined
+
+/*
+ This is a sad patch to make sure that we know where the
+ MEC timer control register mirror is so we can stop the timers
+ from an external debugger. It is needed because the control
+ register is write-only. Trap 0x7C cannot occure in ERC32...
+
+ We also use this location to store the last location of the
+ usable RAM in order not to overwrite the remote debugger with
+ the RTEMS work-space area.
+
+*/
+
+ .global __ERC32_MEC_Timer_Control_Mirror, _rdb_start, _CLOCK_SPEED
+
+_rdb_start:
+__ERC32_MEC_Timer_Control_Mirror:
+
+ BAD_TRAP; BAD_TRAP; ! 7C - 7D undefined
+
+_CLOCK_SPEED:
+ BAD_TRAP; BAD_TRAP; ! BAD_TRAP; BAD_TRAP; ! 7E - 7F undefined
+
+ /*
+ * Software traps
+ *
+ * NOTE: At the risk of being redundant... this is not a full
+ * table. The setjmp on the SPARC requires a window flush trap
+ * handler and RTEMS will preserve the entries that were
+ * installed before.
+ */
+
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 80 - 82
+ TRAP( 0x83, SYM(window_flush_trap_handler) ); ! 83 flush windows SW trap
+
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 84 - 87
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 88 - 8B
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 8C - 8F
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 90 - 93
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 94 - 97
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 98 - 9B
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 9C - 9F
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A0 - A3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A4 - A7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A8 - AB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! AC - AF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B0 - B3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B4 - B7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B8 - BB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! BC - BF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C0 - C3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C4 - C7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C8 - CB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! CC - CF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D0 - D3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D4 - D7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D8 - DB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! DC - DF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E0 - E3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E4 - E7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E8 - EB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! EC - EF
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F0 - F3
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F4 - F7
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F8 - FB
+ SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! FC - FF
+
+/*
+ * This is the hard reset code.
+ */
+
+#define PSR_INIT 0x10c0 /* Disable traps, set s and ps */
+#define WIM_INIT 2
+#define STACK_SIZE 16 * 1024
+
+ PUBLIC(hard_reset)
+SYM(hard_reset):
+
+ set _trap_table, %g1 ! Initialize TBR
+ mov %g1, %tbr
+
+ set (SYM(rdb_start)), %g6 ! End of work-space area
+ st %sp, [%g6]
+
+
+/* Check if MEC is initialised. If not, this means that we are
+ running on the simulator. Initiate some of the parameters
+ that are done by the boot-prom otherwise.
+*/
+
+ set SYM(ERC32_MEC), %g3 ! g3 = base address of peripherals
+ ld [%g3], %g2
+ set 0xfe080000, %g1
+ andcc %g1, %g2, %g0
+ bne 1f
+ set 0x00101000, %g1 ! 2M ROM, 4M RAM
+ ! set the Memory Configuration
+ st %g1, [ %g3 + ERC32_MEC_MEMORY_CONFIGURATION_OFFSET ]
+
+ set SYM(RAM_END), %sp ! End of work-space area
+ st %sp, [%g6]
+
+ set _CLOCK_SPEED, %g6 ! Use 14 MHz in simulator
+ set 14, %g1
+ st %g1, [%g6]
+
+/* Common initialisation */
+1:
+ set WIM_INIT, %g1 ! Initialize WIM
+ mov %g1, %wim
+
+ set PSR_INIT, %g1
+ wr %g1, 0x20, %psr ! enable traps
+
+ nop
+ nop
+ nop
+
+ sethi %hi(stack_space + STACK_SIZE), %g1
+ or %g1,%lo(stack_space + STACK_SIZE),%g1
+ ! g1 = top of stack
+ mov %g1, %sp ! Set stack pointer
+ mov %sp, %fp ! Set frame pointer
+ nop
+
+ /*
+ * Copy the initialized data to RAM
+ *
+ * FROM: _endtext
+ * TO: _data_start
+ * LENGTH: (__bss_start - _data_start) bytes
+ */
+
+
+ sethi %hi(_endtext),%g2
+ or %g2,%lo(_endtext),%g2 ! g2 = start of initialized data in ROM
+
+ sethi %hi(_data_start),%g3
+ or %g3,%lo(_data_start),%g3 ! g3 = start of initialized data in RAM
+
+ sethi %hi(__bss_start),%g4
+ or %g4,%lo(__bss_start),%g4 ! g4 = end of initialized data in RAM
+
+ cmp %g2, %g3
+ be 1f
+ nop
+
+copy_data:
+ ldd [ %g2 ], %g6
+ std %g6 , [ %g3 ] ! copy this double word
+ add %g3, 8, %g3 ! bump the destination pointer
+ add %g2, 8, %g2 ! bump the source pointer
+ cmp %g3, %g4 ! Is the pointer past the end of dest?
+ bl copy_data
+ nop
+
+ /* clear the bss */
+1:
+
+ sethi %hi(_edata),%g2
+ or %g2,%lo(_edata),%g2 ! g2 = start of bss
+ sethi %hi(_end),%g3
+ or %g3,%lo(_end),%g3 ! g3 = end of bss
+ mov %g0,%g1 ! so std has two zeros
+zerobss:
+ std %g0,[%g2]
+ add %g2,8,%g2
+ cmp %g2,%g3
+ bleu,a zerobss
+ nop
+
+ mov %0, %o2 ! environ
+ mov %0, %o1 ! argv
+ mov %0, %o0 ! argc
+ call SYM(main)
+ sub %sp, 0x60, %sp ! room for main to save args
+ nop
+
+ PUBLIC(BSP_fatal_return)
+SYM(BSP_fatal_return):
+ ta 0 ! Halt if _main returns ...
+ nop
+
+ /*
+ * There does not seem to be a way to get this aligned AND
+ * in the BSS.
+ */
+
+ .align 32
+ .comm stack_space, STACK_SIZE
+
+/* end of file */
diff --git a/c/src/lib/libbsp/sparc/erc32/startup/Makefile.in b/c/src/lib/libbsp/sparc/erc32/startup/Makefile.in
new file mode 100644
index 0000000000..886ea2af2e
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startup/Makefile.in
@@ -0,0 +1,65 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/../../../shared
+
+PGM=${ARCH}/startup.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart sbrk setvec spurious
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+CC_PIECES=rtems-ctor
+CC_FILES=$(CC_PIECES:%=%.cc)
+CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=linkcmds $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES)
+
+# We install the RTEMS constructor as a separate .o
+# so it can be easily place correctly by the compiler config file.
+INSTALLED_O_FILES=$(ARCH)/rtems-ctor.o
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(INSTALLED_O_FILES) $(PGM)
+ $(INSTALL) $(srcdir)/linkcmds ${PROJECT_RELEASE}/lib
+ $(INSTALL_VARIANT) $(INSTALLED_O_FILES) ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/sparc/erc32/startup/bspclean.c b/c/src/lib/libbsp/sparc/erc32/startup/bspclean.c
new file mode 100644
index 0000000000..1f58feb2a5
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startup/bspclean.c
@@ -0,0 +1,37 @@
+/* bspclean.c
+ *
+ * This file contains cleanup code executed when the application exits.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+/*
+ * The app has "exited" (rtems_shutdown_executive returns control to main)
+ */
+
+void bsp_cleanup( void )
+{
+ /*
+ * "halt" by trapping to the simulator command line.
+ */
+
+
+ asm volatile( "ta 0" );
+}
diff --git a/c/src/lib/libbsp/sparc/erc32/startup/bspstart.c b/c/src/lib/libbsp/sparc/erc32/startup/bspstart.c
new file mode 100644
index 0000000000..3feddb71c1
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startup/bspstart.c
@@ -0,0 +1,377 @@
+/* bspstart.c
+ *
+ * This set of routines starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before any of these are invoked.
+ *
+ * Called by RTEMS::RTEMS constructor in rtems-ctor.cc
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+#include <libcsupport.h>
+
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+/*
+ * The original table from the application and our copy of it with
+ * some changes.
+ */
+
+extern rtems_configuration_table Configuration;
+rtems_configuration_table BSP_Configuration;
+
+rtems_cpu_table Cpu_table;
+rtems_unsigned32 bsp_isr_level;
+
+/*
+ * Tells us where to put the workspace in case remote debugger is present.
+ */
+
+extern rtems_unsigned32 rdb_start;
+
+/*
+ * Amount to increment itimer by each pass
+ * It is a variable instead of a #define to allow the 'looptest'
+ * script to bump it without recompiling rtems
+ *
+ * NOTE: This is based on the PA-RISC simulator. I don't know if we
+ * can actually pull this trick on the SPARC simulator.
+ */
+
+rtems_unsigned32 CPU_SPARC_CLICKS_PER_TICK;
+
+#if SIMSPARC_FAST_IDLE
+
+/*
+ * Many of the tests are very slow on the simulator because they have
+ * have 5 second delays hardwired in.
+ *
+ * Try to speed those tests up by speeding up the clock when in the idle task.
+ *
+ * NOTE: At the current setting, 5 second delays in the tests take
+ * approximately 5 seconds of wall time.
+ */
+
+rtems_extension
+fast_idle_switch_hook(rtems_tcb *current_task,
+ rtems_tcb *heir_task)
+{
+ static rtems_unsigned32 normal_clock = ~0;
+ static rtems_unsigned32 fast_clock;
+
+ /* init our params on first call */
+ if (normal_clock == ~0)
+ {
+ normal_clock = CPU_SPARC_CLICKS_PER_TICK;
+ fast_clock = CPU_SPARC_CLICKS_PER_TICK / 0x08;
+ if (fast_clock == 0) /* handle pathological case */
+ fast_clock++;
+ }
+
+ /*
+ * Run the clock faster when idle is in place.
+ */
+
+ if (heir_task == _Thread_Idle)
+ CPU_SPARC_CLICKS_PER_TICK = fast_clock;
+ else if (current_task == _Thread_Idle)
+ CPU_SPARC_CLICKS_PER_TICK = normal_clock;
+}
+
+#endif
+
+/*
+ * bsp_libc_init
+ *
+ * Initialize whatever libc we are using called from bsp_postdriver_hook.
+ */
+
+void bsp_libc_init(void)
+{
+ extern int end;
+ rtems_unsigned32 heap_start;
+ rtems_unsigned32 heap_size;
+
+ heap_start = (rtems_unsigned32) &end;
+ if (heap_start & (CPU_ALIGNMENT-1))
+ heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ heap_size = BSP_Configuration.work_space_start - (void *)&end;
+ heap_size &= 0xfffffff0; /* keep it as a multiple of 16 bytes */
+
+ RTEMS_Malloc_Initialize((void *) heap_start, heap_size, 0);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ /*
+ * Set up for the libc handling.
+ */
+
+ if (BSP_Configuration.ticks_per_timeslice > 0)
+ libc_init(1); /* reentrant if possible */
+ else
+ libc_init(0); /* non-reentrant */
+
+}
+
+
+/*
+ * bsp_pretasking_hook
+ *
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ */
+
+void bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#if SIMSPARC_FAST_IDLE
+ /*
+ * Install the fast idle task switch extension
+ *
+ * On MP systems, might not want to do this; it confuses at least
+ * one test (mp06) on the PA-RISC simulator
+ */
+
+#if 0
+ if (BSP_Configuration.User_multiprocessing_table == 0)
+#endif
+ {
+ rtems_extensions_table fast_idle_extension;
+ rtems_id extension_id;
+ rtems_status_code rc;
+
+ memset(&fast_idle_extension, 0, sizeof(fast_idle_extension));
+
+ fast_idle_extension.thread_switch = fast_idle_switch_hook;
+
+ rc = rtems_extension_create(
+ rtems_build_name('F', 'D', 'L', 'E'),
+ &fast_idle_extension,
+ &extension_id
+ );
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+ }
+#endif
+
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+
+}
+
+/*
+ * bsp_postdriver_hook
+ *
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+}
+
+/*
+ * bsp_start
+ *
+ * This routine does the bulk of the system initialization.
+ */
+
+void bsp_start( void )
+{
+ unsigned char *work_space_start;
+
+ /* Check if MEc is initialised */
+
+ if (!(ERC32_MEC.Control & 0xfe080000)) {
+
+ /*
+ * DISABLE THE HARDWARE WATCHDOG!!!
+ */
+
+ ERC32_MEC.Watchdog_Trap_Door_Set = 0; /* value is irrelevant */
+
+ /*
+ * Reduce the number of wait states to 0 for all memory areas.
+ */
+
+ ERC32_MEC.Wait_State_Configuration = 0;
+
+ }
+
+ /*
+ * Set up our hooks
+ * Make sure libc_init is done before drivers initialized so that
+ * they can use atexit()
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL; /* bsp_spurious_initialize;*/
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ /*
+ * SIS does zero out memory BUT only when IT begins execution. Thus
+ * if we want to have a clean slate in the workspace each time we
+ * begin execution of OUR application, then we must zero the workspace.
+ */
+
+ Cpu_table.do_zero_of_workspace = TRUE;
+
+ /*
+ * This should be enough interrupt stack.
+ */
+
+ Cpu_table.interrupt_stack_size = (12 * 1024);
+
+ /*
+ * SIS does not support MP configurations so there is really no way
+ * to check this out.
+ */
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Copy the table and allocate memory for the RTEMS Workspace
+ */
+
+ BSP_Configuration = Configuration;
+
+#if defined(RTEMS_POSIX_API)
+ BSP_Configuration.work_space_size *= 3;
+#endif
+
+ work_space_start =
+ (unsigned char *)rdb_start - BSP_Configuration.work_space_size;
+
+ if ( work_space_start <= (unsigned char *)&end ) {
+ DEBUG_puts( "bspstart: Not enough RAM!!!\n" );
+ BSP_fatal_return();
+ }
+
+ BSP_Configuration.work_space_start = work_space_start;
+
+ /*
+ * Add 1 region for RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+#ifdef RTEMS_NEWLIB
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Add 1 extension for stack checker
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+#if SIMSPARC_FAST_IDLE
+ /*
+ * Add 1 extension for fast idle
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Add 1 extension for MPCI_fatal
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ BSP_Configuration.maximum_extensions++;
+
+ /*
+ * Set the "clicks per tick" for the simulator
+ * used by XXX/clock/clock.c to schedule interrupts
+ */
+
+ CPU_SPARC_CLICKS_PER_TICK = BSP_Configuration.microseconds_per_tick;
+
+ /*
+ * Initialize RTEMS. main() will finish it up and start multitasking.
+ */
+
+ rtems_libio_config( &BSP_Configuration, BSP_LIBIO_MAX_FDS );
+
+ bsp_isr_level = rtems_initialize_executive_early(
+ &BSP_Configuration,
+ &Cpu_table
+ );
+}
diff --git a/c/src/lib/libbsp/sparc/erc32/startup/linkcmds b/c/src/lib/libbsp/sparc/erc32/startup/linkcmds
new file mode 100644
index 0000000000..8b68dd2c05
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startup/linkcmds
@@ -0,0 +1,132 @@
+/* linkcmds
+ *
+ * $Id$
+ */
+
+OUTPUT_ARCH(sparc)
+__DYNAMIC = 0;
+
+/*
+ * The memory map looks like this:
+ * +--------------------+ <- low memory
+ * | .text |
+ * | etext |
+ * | ctor list | the ctor and dtor lists are for
+ * | dtor list | C++ support
+ * | _endtext |
+ * +--------------------+
+ * | .data | initialized data goes here
+ * | _sdata |
+ * | _edata |
+ * +--------------------+
+ * | .bss |
+ * | __bss_start | start of bss, cleared by crt0
+ * | _end | start of heap, used by sbrk()
+ * +--------------------+
+ * | heap space |
+ * | _ENDHEAP |
+ * | stack space |
+ * | __stack | top of stack
+ * +--------------------+ <- high memory
+ */
+
+
+/*
+ * User modifiable values:
+ *
+ * _CLOCK_SPEED in Mhz (used to program the counter/timers)
+ *
+ * _PROM_SIZE size of PROM (permissible values are 4K, 8K, 16K
+ * 32K, 64K, 128K, 256K, and 512K)
+ * _RAM_SIZE size of RAM (permissible values are 256K, 512K,
+ * 1MB, 2Mb, 4Mb, 8Mb, 16Mb, and 32Mb)
+ *
+ * MAKE SURE THESE MATCH THE MEMORY DESCRIPTION SECTION!!!
+ */
+
+/*
+_CLOCK_SPEED = 10;
+*/
+
+_PROM_SIZE = 512K;
+_RAM_SIZE = 2M;
+
+_RAM_START = 0x02000000;
+_RAM_END = _RAM_START + _RAM_SIZE;
+
+_PROM_START = 0x00000000;
+_PROM_END = _PROM_START + _PROM_SIZE;
+
+/*
+ * Base address of the on-CPU peripherals
+ */
+
+_ERC32_MEC = 0x01f80000;
+
+MEMORY
+{
+ rom : ORIGIN = 0x00000000, LENGTH = 512K
+ ram : ORIGIN = 0x02000000, LENGTH = 2M
+}
+
+/*
+ * stick everything in ram (of course)
+ */
+SECTIONS
+{
+ .text :
+ {
+ CREATE_OBJECT_SYMBOLS
+ text_start = .;
+ _text_start = .;
+ *(.text)
+ etext = ALIGN(0x10);
+ _etext = .;
+ __CTOR_LIST__ = .;
+ LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
+ *(.ctors)
+ LONG(0)
+ __CTOR_END__ = .;
+ __DTOR_LIST__ = .;
+ LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
+ *(.dtors)
+ LONG(0)
+ __DTOR_END__ = .;
+ *(.lit)
+ *(.shdata)
+ _endtext = .;
+ } > ram
+ .data :
+ {
+ data_start = .;
+ _data_start = .;
+ _sdata = . ;
+ *(.data)
+ CONSTRUCTORS
+ edata = ALIGN(0x10);
+ _edata = .;
+ } > ram
+ .shbss :
+ {
+ *(.shbss)
+ } > ram
+ .bss :
+ {
+ __bss_start = ALIGN(0x8);
+ _bss_start = .;
+ bss_start = .;
+ *(.bss)
+ *(COMMON)
+ end = .;
+ _end = ALIGN(0x8);
+ __end = ALIGN(0x8);
+ } > ram
+ .stab . (NOLOAD) :
+ {
+ [ .stab ]
+ }
+ .stabstr . (NOLOAD) :
+ {
+ [ .stabstr ]
+ }
+}
diff --git a/c/src/lib/libbsp/sparc/erc32/startup/setvec.c b/c/src/lib/libbsp/sparc/erc32/startup/setvec.c
new file mode 100644
index 0000000000..3ba8c4fdeb
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startup/setvec.c
@@ -0,0 +1,63 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on the SPARC simulator.
+ *
+ * INPUT PARAMETERS:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * OUTPUT PARAMETERS: NONE
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+rtems_isr_entry set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ rtems_isr_entry previous_isr;
+ unsigned32 real_trap;
+ unsigned32 source;
+
+ if ( type )
+ rtems_interrupt_catch( handler, vector, &previous_isr );
+ else
+ _CPU_ISR_install_raw_handler( vector, handler, (void *)&previous_isr );
+
+ real_trap = SPARC_REAL_TRAP_NUMBER( vector );
+
+ if ( ERC32_Is_MEC_Trap( real_trap ) ) {
+
+ source = ERC32_TRAP_SOURCE( real_trap );
+
+ ERC32_Clear_interrupt( source );
+ ERC32_Unmask_interrupt( source );
+ }
+
+ return previous_isr;
+}
+
diff --git a/c/src/lib/libbsp/sparc/erc32/startup/spurious.c b/c/src/lib/libbsp/sparc/erc32/startup/spurious.c
new file mode 100644
index 0000000000..fa1a704079
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/startup/spurious.c
@@ -0,0 +1,164 @@
+/*
+ * ERC32 Spurious Trap Handler
+ *
+ * This is just enough of a trap handler to let us know what
+ * the likely source of the trap was.
+ *
+ * Developed as part of the port of RTEMS to the ERC32 implementation
+ * of the SPARC by On-Line Applications Research Corporation (OAR)
+ * under contract to the European Space Agency (ESA).
+ *
+ * COPYRIGHT (c) 1995. European Space Agency.
+ *
+ * This terms of the RTEMS license apply to this file.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include <string.h>
+
+static const char digits[16] = "0123456789abcdef";
+
+/*
+ * bsp_spurious_handler
+ *
+ * Print a message on the debug console and then die
+ */
+
+rtems_isr bsp_spurious_handler(
+ rtems_vector_number trap
+)
+{
+ char line[ 80 ];
+ int length;
+ rtems_unsigned32 real_trap;
+
+ DEBUG_puts( "Spurious Trap" );
+
+ real_trap = SPARC_REAL_TRAP_NUMBER(trap);
+
+ switch (real_trap) {
+
+ /*
+ * First the ones defined by the basic architecture
+ */
+
+ case 0x00:
+ DEBUG_puts( "reset" );
+ break;
+ case 0x01:
+ DEBUG_puts( "instruction access exception" );
+ break;
+ case 0x02:
+ DEBUG_puts( "illegal instruction" );
+ break;
+ case 0x03:
+ DEBUG_puts( "privileged instruction" );
+ break;
+ case 0x04:
+ DEBUG_puts( "fp disabled" );
+ break;
+ case 0x07:
+ DEBUG_puts( "memory address not aligned" );
+ break;
+ case 0x08:
+ DEBUG_puts( "fp exception" );
+ break;
+ case 0x09:
+ DEBUG_puts( "data access exception" );
+ break;
+ case 0x0A:
+ DEBUG_puts( "tag overflow" );
+ break;
+
+ /*
+ * Then the ones defined by the ERC32 in particular
+ */
+
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_MASKED_ERRORS ):
+ DEBUG_puts( "ERC32_INTERRUPT_MASKED_ERRORS" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_1 ):
+ DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_1" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_2 ):
+ DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_2" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_A_RX_TX ):
+ DEBUG_puts( "ERC32_INTERRUPT_UART_A_RX_TX" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_B_RX_TX ):
+ DEBUG_puts( "ERC32_INTERRUPT_UART_A_RX_TX" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_CORRECTABLE_MEMORY_ERROR ):
+ DEBUG_puts( "ERC32_INTERRUPT_CORRECTABLE_MEMORY_ERROR" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_UART_ERROR ):
+ DEBUG_puts( "ERC32_INTERRUPT_UART_ERROR" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_DMA_ACCESS_ERROR ):
+ DEBUG_puts( "ERC32_INTERRUPT_DMA_ACCESS_ERROR" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_DMA_TIMEOUT ):
+ DEBUG_puts( "ERC32_INTERRUPT_DMA_TIMEOUT" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_3 ):
+ DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_3" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_4 ):
+ DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_4" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_GENERAL_PURPOSE_TIMER ):
+ DEBUG_puts( "ERC32_INTERRUPT_GENERAL_PURPOSE_TIMER" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_REAL_TIME_CLOCK ):
+ DEBUG_puts( "ERC32_INTERRUPT_REAL_TIME_CLOCK" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_EXTERNAL_5 ):
+ DEBUG_puts( "ERC32_INTERRUPT_EXTERNAL_5" );
+ break;
+ case ERC32_TRAP_TYPE( ERC32_INTERRUPT_WATCHDOG_TIMEOUT ):
+ DEBUG_puts( "ERC32_INTERRUPT_WATCHDOG_TIMEOUT" );
+ break;
+
+ default:
+ strcpy( line, "Number 0x " );
+ length = strlen ( line );
+ line[ length - 2 ] = digits[ real_trap >> 4 ];
+ line[ length - 1 ] = digits[ real_trap & 0xf ];
+ DEBUG_puts( line );
+ break;
+ }
+
+ /*
+ * What else can we do but stop ...
+ */
+
+ asm volatile( "ta 0x0" );
+}
+
+/*
+ * bsp_spurious_initialize
+ *
+ * Install the spurious handler for most traps.
+ */
+
+void bsp_spurious_initialize()
+{
+ rtems_unsigned32 trap;
+
+ for ( trap=0 ; trap<256 ; trap++ ) {
+
+ /*
+ * Skip window overflow, underflow, and flush as well as software
+ * trap 0 which we will use as a shutdown.
+ */
+
+ if ( trap == 5 || trap == 6 || trap == 0x83 || trap == 0x80)
+ continue;
+
+ set_vector( bsp_spurious_handler, SPARC_SYNCHRONOUS_TRAP( trap ), 1 );
+ }
+}
diff --git a/c/src/lib/libbsp/sparc/erc32/timer/Makefile.in b/c/src/lib/libbsp/sparc/erc32/timer/Makefile.in
new file mode 100644
index 0000000000..6511afb8bf
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/timer/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/sparc/erc32/timer/timer.c b/c/src/lib/libbsp/sparc/erc32/timer/timer.c
new file mode 100644
index 0000000000..72259139ae
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/timer/timer.c
@@ -0,0 +1,89 @@
+/* timer.c
+ *
+ * This file implements a benchmark timer using the General Purpose Timer on
+ * the MEC.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+
+#include <bsp.h>
+
+rtems_boolean Timer_driver_Find_average_overhead;
+
+rtems_boolean Timer_driver_Is_initialized = FALSE;
+
+void Timer_initialize()
+{
+ /*
+ * Timer runs long and accurate enough not to require an interrupt.
+ */
+
+ if ( Timer_driver_Is_initialized == FALSE ) {
+
+ /* approximately 1 us per countdown */
+ ERC32_MEC.General_Purpose_Timer_Scalar = CLOCK_SPEED - 1;
+ ERC32_MEC.General_Purpose_Timer_Counter = 0xffffffff;
+
+ } else {
+ Timer_driver_Is_initialized = TRUE;
+ }
+
+ ERC32_MEC_Set_General_Purpose_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING |
+ ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER
+ );
+
+ ERC32_MEC_Set_General_Purpose_Timer_Control(
+ ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING
+ );
+
+}
+
+#define AVG_OVERHEAD 3 /* It typically takes 3.0 microseconds */
+ /* to start/stop the timer. */
+#define LEAST_VALID 2 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ rtems_unsigned32 total;
+
+ total = ERC32_MEC.General_Purpose_Timer_Counter;
+
+ total = 0xffffffff - total;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in one microsecond units */
+
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+
+ return total - AVG_OVERHEAD;
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/sparc/erc32/times b/c/src/lib/libbsp/sparc/erc32/times
new file mode 100644
index 0000000000..1b04728a25
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/times
@@ -0,0 +1,193 @@
+#
+# Timing Test Suite Results for the SPARC Instruction Simulator BSP
+#
+# NOTE: The ERC32 is derived from the Cypress 601/602 chip set.
+#
+# $Id$
+#
+
+Board: SPARC Instruction Simulator v1.8
+CPU: include coprocessor if applicable
+Clock Speed: 15 Mhz
+Memory Configuration:
+Wait States: 0
+
+Times Reported in: microseconds
+Timer Source: on-CPU General Purpose Count Down Timer
+
+Column A: 3.5.1 pre-release
+Column B: unused
+
+# DESCRIPTION A B
+== ================================================================= ==== ====
+ 1 rtems_semaphore_create 20
+ rtems_semaphore_delete 21
+ rtems_semaphore_obtain: available 15
+ rtems_semaphore_obtain: not available -- NO_WAIT 15
+ rtems_semaphore_release: no waiting tasks 16
+
+ 2 rtems_semaphore_obtain: not available -- caller blocks 62
+
+ 3 rtems_semaphore_release: task readied -- preempts caller 55
+
+ 4 rtems_task_restart: blocked task -- preempts caller 77
+ rtems_task_restart: ready task -- preempts caller 70
+ rtems_semaphore_release: task readied -- returns to caller 25
+ rtems_task_create 57
+ rtems_task_start 31
+ rtems_task_restart: suspended task -- returns to caller 36
+ rtems_task_delete: suspended task 47
+ rtems_task_restart: ready task -- returns to caller 37
+ rtems_task_restart: blocked task -- returns to caller 46
+ rtems_task_delete: blocked task 50
+
+ 5 rtems_task_suspend: calling task 51
+ rtems_task_resume: task readied -- preempts caller 49
+
+ 6 rtems_task_restart: calling task 59
+ rtems_task_suspend: returns to caller 18
+ rtems_task_resume: task readied -- returns to caller 19
+ rtems_task_delete: ready task 50
+
+ 7 rtems_task_restart: suspended task -- preempts caller 70
+
+ 8 rtems_task_set_priority: obtain current priority 12
+ rtems_task_set_priority: returns to caller 27
+ rtems_task_mode: obtain current mode 5
+ rtems_task_mode: no reschedule 5
+ rtems_task_mode: reschedule -- returns to caller 8
+ rtems_task_mode: reschedule -- preempts caller 39
+ rtems_task_set_note 13
+ rtems_task_get_note 13
+ rtems_clock_set 33
+ rtems_clock_get 3
+
+ 9 rtems_message_queue_create 110
+ rtems_message_queue_send: no waiting tasks 37
+ rtems_message_queue_urgent: no waiting tasks 37
+ rtems_message_queue_receive: available 31
+ rtems_message_queue_flush: no messages flushed 12
+ rtems_message_queue_flush: messages flushed 16
+ rtems_message_queue_delete 26
+
+10 rtems_message_queue_receive: not available -- NO_WAIT 15
+ rtems_message_queue_receive: not available -- caller blocks 62
+
+11 rtems_message_queue_send: task readied -- preempts caller 72
+
+12 rtems_message_queue_send: task readied -- returns to caller 39
+
+13 rtems_message_queue_urgent: task readied -- preempts caller 72
+
+14 rtems_message_queue_urgent: task readied -- returns to caller 39
+
+15 rtems_event_receive: obtain current events 1
+ rtems_event_receive: not available -- NO_WAIT 12
+ rtems_event_receive: not available -- caller blocks 56
+ rtems_event_send: no task readied 12
+ rtems_event_receive: available 12
+ rtems_event_send: task readied -- returns to caller 24
+
+16 rtems_event_send: task readied -- preempts caller 55
+
+17 rtems_task_set_priority: preempts caller 62
+
+18 rtems_task_delete: calling task 83
+
+19 rtems_signal_catch 9
+ rtems_signal_send: returns to caller 15
+ rtems_signal_send: signal to self 18
+ exit ASR overhead: returns to calling task 22
+ exit ASR overhead: returns to preempting task 49
+
+20 rtems_partition_create 35
+ rtems_region_create 23
+ rtems_partition_get_buffer: available 15
+ rtems_partition_get_buffer: not available 13
+ rtems_partition_return_buffer 18
+ rtems_partition_delete 16
+ rtems_region_get_segment: available 22
+ rtems_region_get_segment: not available -- NO_WAIT 21
+ rtems_region_return_segment: no waiting tasks 19
+ rtems_region_get_segment: not available -- caller blocks 64
+ rtems_region_return_segment: task readied -- preempts caller 74
+ rtems_region_return_segment: task readied -- returns to caller 44
+ rtems_region_delete 16
+ rtems_io_initialize 2
+ rtems_io_open 1
+ rtems_io_close 1
+ rtems_io_read 1
+ rtems_io_write 1
+ rtems_io_control 1
+
+21 rtems_task_ident 149
+ rtems_message_queue_ident 145
+ rtems_semaphore_ident 156
+ rtems_partition_ident 145
+ rtems_region_ident 148
+ rtems_port_ident 145
+ rtems_timer_ident 145
+ rtems_rate_monotonic_ident 145
+
+22 rtems_message_queue_broadcast: task readied -- returns to caller 42
+ rtems_message_queue_broadcast: no waiting tasks 17
+ rtems_message_queue_broadcast: task readied -- preempts caller 78
+
+23 rtems_timer_create 14
+ rtems_timer_fire_after: inactive 22
+ rtems_timer_fire_after: active 24
+ rtems_timer_cancel: active 15
+ rtems_timer_cancel: inactive 13
+ rtems_timer_reset: inactive 21
+ rtems_timer_reset: active 23
+ rtems_timer_fire_when: inactive 34
+ rtems_timer_fire_when: active 34
+ rtems_timer_delete: active 19
+ rtems_timer_delete: inactive 17
+ rtems_task_wake_when 69
+
+24 rtems_task_wake_after: yield -- returns to caller 9
+ rtems_task_wake_after: yields -- preempts caller 45
+
+25 rtems_clock_tick 4
+
+26 _ISR_Disable 0
+ _ISR_Flash 1
+ _ISR_Enable 1
+ _Thread_Disable_dispatch 0
+ _Thread_Enable_dispatch 7
+ _Thread_Set_state 11
+ _Thread_Disptach (NO FP) 31
+ context switch: no floating point contexts 21
+ context switch: self 10
+ context switch: to another task 10
+ context switch: restore 1st FP task 25
+ fp context switch: save idle, restore idle 31
+ fp context switch: save idle, restore initialized 19
+ fp context switch: save initialized, restore initialized 20
+ _Thread_Resume 7
+ _Thread_Unblock 7
+ _Thread_Ready 9
+ _Thread_Get 4
+ _Semaphore_Get 2
+ _Thread_Get: invalid id 0
+
+27 interrupt entry overhead: returns to interrupted task 6
+ interrupt exit overhead: returns to interrupted task 6
+ interrupt entry overhead: returns to nested interrupt 6
+ interrupt exit overhead: returns to nested interrupt 5
+ interrupt entry overhead: returns to preempting task 7
+ interrupt exit overhead: returns to preempting task 36
+
+28 rtems_port_create 16
+ rtems_port_external_to_internal 11
+ rtems_port_internal_to_external 11
+ rtems_port_delete 16
+
+29 rtems_rate_monotonic_create 15
+ rtems_rate_monotonic_period: initiate period -- returns to caller 21
+ rtems_rate_monotonic_period: obtain status 13
+ rtems_rate_monotonic_cancel 16
+ rtems_rate_monotonic_delete: inactive 18
+ rtems_rate_monotonic_delete: active 20
+ rtems_rate_monotonic_period: conclude periods -- caller blocks 53
diff --git a/c/src/lib/libbsp/sparc/erc32/tools/Makefile.in b/c/src/lib/libbsp/sparc/erc32/tools/Makefile.in
new file mode 100644
index 0000000000..4b680df9f0
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/tools/Makefile.in
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/tests
+
+PGMS=runtest
+
+INSTALLED=$(PGMS:%=$(DESTDIR)/%)
+
+all: $(DESTDIR) $(PGMS) install
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
diff --git a/c/src/lib/libbsp/sparc/erc32/wrapup/Makefile.in b/c/src/lib/libbsp/sparc/erc32/wrapup/Makefile.in
new file mode 100644
index 0000000000..b583e82f19
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/erc32/wrapup/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+BSP_PIECES=startup console clock timer
+# pieces to pick up out of libcpu/sparc
+CPU_PIECES=reg_win
+GENERIC_PIECES=
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(CPU_PIECES), \
+ ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), \
+ ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libbsp/unix/Makefile.in b/c/src/lib/libbsp/unix/Makefile.in
new file mode 100644
index 0000000000..a92e20d55e
--- /dev/null
+++ b/c/src/lib/libbsp/unix/Makefile.in
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# Descend into the $(RTEMS_BSP) directory if it exists
+SUB_DIRS=$(wildcard $(RTEMS_BSP))
diff --git a/c/src/lib/libbsp/unix/posix/Makefile.in b/c/src/lib/libbsp/unix/posix/Makefile.in
new file mode 100644
index 0000000000..1a0df3d90b
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/Makefile.in
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SRCS=README
+
+# MP_PARTS are the pieces of the BSP required in a MP environment
+# We only build them if HAS_MP was defined
+
+MP_PARTS_yes_V = shmsupp
+MP_PARTS = $(MP_PARTS_$(HAS_MP)_V)
+
+all: $(SRCS)
+
+# wrapup is the one that actually builds and installs the library
+# from the individual .rel files built in other directories
+SUB_DIRS=include startup clock console timer $(MP_PARTS) wrapup
diff --git a/c/src/lib/libbsp/unix/posix/README b/c/src/lib/libbsp/unix/posix/README
new file mode 100644
index 0000000000..0bf0782737
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/README
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+
+
+This is a "generic" BSP for a modern UNIX system which is enough
+System V and POSIX compliant to support at least the following:
+
+ + semaphores
+ + itimers
+ + mmap
+ + shared memory
+
+At the moment, this BSP is known to work with the following UNIXes:
+
+ + HP-UX 9.0.x
+ + Solaris 2.x
+ + Linux 1.1.x (single processor only -- mmap is broken)
diff --git a/c/src/lib/libbsp/unix/posix/clock/Makefile.in b/c/src/lib/libbsp/unix/posix/clock/Makefile.in
new file mode 100644
index 0000000000..809910191e
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/clock/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=clock
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/unix/posix/clock/clock.c b/c/src/lib/libbsp/unix/posix/clock/clock.c
new file mode 100644
index 0000000000..d3586328ab
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/clock/clock.c
@@ -0,0 +1,112 @@
+/* Clock
+ *
+ * This routine generates clock ticks using standard POSIX services.
+ * The tick frequency is specified by the bsp.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <stdlib.h>
+
+void Clock_exit(void);
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+rtems_unsigned32 Clock_driver_vector;
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+void Install_clock(rtems_isr_entry clock_isr)
+{
+ Clock_driver_ticks = 0;
+
+ (void) set_vector( clock_isr, Clock_driver_vector, 1 );
+
+ _CPU_Start_clock( BSP_Configuration.microseconds_per_tick );
+
+ atexit(Clock_exit);
+}
+
+void Clock_isr(int vector)
+{
+ Clock_driver_ticks++;
+ rtems_clock_tick();
+}
+
+/*
+ * Called via atexit()
+ * Remove the clock signal
+ */
+
+void Clock_exit(void)
+{
+ _CPU_Stop_clock();
+
+ (void) set_vector( 0, Clock_driver_vector, 1 );
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Clock_driver_vector = _CPU_Get_clock_vector();
+
+ Install_clock((rtems_isr_entry) Clock_isr);
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(Clock_driver_vector);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ (void) set_vector( args->buffer, Clock_driver_vector, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/unix/posix/console/Makefile.in b/c/src/lib/libbsp/unix/posix/console/Makefile.in
new file mode 100644
index 0000000000..ff608c8496
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/console/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/unix/posix/console/console.c b/c/src/lib/libbsp/unix/posix/console/console.c
new file mode 100644
index 0000000000..8490b01662
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/console/console.c
@@ -0,0 +1,95 @@
+/*
+ * Console IO Support Routines
+ *
+ * These provide UNIX-like read and write calls for the C library.
+ *
+ * NOTE: For the most part, this is just a space holder.
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include <unistd.h>
+#include <errno.h>
+
+rtems_device_driver
+console_initialize(rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return 0;
+}
+
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return -1;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/unix/posix/include/Makefile.in b/c/src/lib/libbsp/unix/posix/include/Makefile.in
new file mode 100644
index 0000000000..fd7d4d6077
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/include/Makefile.in
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES = $(srcdir)/bsp.h $(srcdir)/coverhd.h
+
+#
+# Equate files are for including from assembly preprocessed by
+# gm4 or gasp. No examples are provided except for those for
+# other CPUs. The best way to generate them would be to
+# provide a program which generates the constants used based
+# on the C equivalents.
+#
+
+EQ_FILES =
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(EQ_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libbsp/unix/posix/include/bsp.h b/c/src/lib/libbsp/unix/posix/include/bsp.h
new file mode 100644
index 0000000000..0dded0b0ca
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/include/bsp.h
@@ -0,0 +1,106 @@
+/* bsp.h
+ *
+ * This include file contains all POSIX BSP definitions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_BSP_h
+#define __POSIX_BSP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems.h>
+#include <clockdrv.h>
+#include <console.h>
+#include <iosupp.h>
+
+/*
+ * Define the time limits for RTEMS Test Suite test durations.
+ * Long test and short test duration limits are provided. These
+ * values are in seconds and need to be converted to ticks for the
+ * application.
+ *
+ */
+
+#define MAX_LONG_TEST_DURATION 300 /* 5 minutes = 300 seconds */
+#define MAX_SHORT_TEST_DURATION 3 /* 3 seconds */
+
+/*
+ * Stuff for Time Test 27
+ */
+
+#define MUST_WAIT_FOR_INTERRUPT 1
+
+#define Install_tm27_vector( handler ) \
+ set_vector( (handler), 16, 1 )
+
+#define Cause_tm27_intr() \
+ raise( 16 )
+
+#define Clear_tm27_intr()
+
+#define Lower_tm27_intr() \
+ _ISR_Set_level( 0 );
+
+#define RAM_START 0
+#define RAM_END 0x100000
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration;
+
+/*
+ * Device Driver Table Entries
+ */
+
+/*
+ * NOTE: Use the standard Console driver entry
+ */
+
+/*
+ * NOTE: Use the standard Clock driver entry
+ */
+
+/*
+ * How many libio files we want
+ */
+
+#define BSP_LIBIO_MAX_FDS 20
+
+/* functions */
+
+rtems_isr_entry set_vector(rtems_isr_entry, rtems_vector_number, int);
+void bsp_start( void );
+void bsp_cleanup( void );
+
+/* miscellaneous stuff assumed to exist */
+
+extern rtems_configuration_table BSP_Configuration; /* owned by BSP */
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+extern int rtems_argc;
+extern char **rtems_argv;
+
+extern rtems_unsigned32 bsp_isr_level;
+
+extern char *rtems_progname; /* UNIX executable name */
+
+extern int cpu_number;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/unix/posix/include/coverhd.h b/c/src/lib/libbsp/unix/posix/include/coverhd.h
new file mode 100644
index 0000000000..c70d2e17a0
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/include/coverhd.h
@@ -0,0 +1,111 @@
+/* coverhd.h
+ *
+ * This include file has defines to represent the overhead associated
+ * with calling a particular directive from C. These are used in the
+ * Timing Test Suite to ignore the overhead required to pass arguments
+ * to directives. On some CPUs and/or target boards, this overhead
+ * is significant and makes it difficult to distinguish internal
+ * RTEMS execution time from that used to call the directive.
+ *
+ * NOTE: If these are all zero, then the times reported include all
+ * all calling overhead including passing of arguments.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __COVERHD_h
+#define __COVERHD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CALLING_OVERHEAD_INITIALIZE_EXECUTIVE 0
+#define CALLING_OVERHEAD_SHUTDOWN_EXECUTIVE 0
+#define CALLING_OVERHEAD_TASK_CREATE 0
+#define CALLING_OVERHEAD_TASK_IDENT 0
+#define CALLING_OVERHEAD_TASK_START 0
+#define CALLING_OVERHEAD_TASK_RESTART 0
+#define CALLING_OVERHEAD_TASK_DELETE 0
+#define CALLING_OVERHEAD_TASK_SUSPEND 0
+#define CALLING_OVERHEAD_TASK_RESUME 0
+#define CALLING_OVERHEAD_TASK_SET_PRIORITY 0
+#define CALLING_OVERHEAD_TASK_MODE 0
+#define CALLING_OVERHEAD_TASK_GET_NOTE 0
+#define CALLING_OVERHEAD_TASK_SET_NOTE 0
+#define CALLING_OVERHEAD_TASK_WAKE_WHEN 0
+#define CALLING_OVERHEAD_TASK_WAKE_AFTER 0
+#define CALLING_OVERHEAD_INTERRUPT_CATCH 0
+#define CALLING_OVERHEAD_CLOCK_GET 0
+#define CALLING_OVERHEAD_CLOCK_SET 0
+#define CALLING_OVERHEAD_CLOCK_TICK 0
+
+#define CALLING_OVERHEAD_TIMER_CREATE 0
+#define CALLING_OVERHEAD_TIMER_IDENT 0
+#define CALLING_OVERHEAD_TIMER_DELETE 0
+#define CALLING_OVERHEAD_TIMER_FIRE_AFTER 0
+#define CALLING_OVERHEAD_TIMER_FIRE_WHEN 0
+#define CALLING_OVERHEAD_TIMER_RESET 0
+#define CALLING_OVERHEAD_TIMER_CANCEL 0
+#define CALLING_OVERHEAD_SEMAPHORE_CREATE 0
+#define CALLING_OVERHEAD_SEMAPHORE_IDENT 0
+#define CALLING_OVERHEAD_SEMAPHORE_DELETE 0
+#define CALLING_OVERHEAD_SEMAPHORE_OBTAIN 0
+#define CALLING_OVERHEAD_SEMAPHORE_RELEASE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_SEND 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE 0
+#define CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH 0
+
+#define CALLING_OVERHEAD_EVENT_SEND 0
+#define CALLING_OVERHEAD_EVENT_RECEIVE 0
+#define CALLING_OVERHEAD_SIGNAL_CATCH 0
+#define CALLING_OVERHEAD_SIGNAL_SEND 0
+#define CALLING_OVERHEAD_PARTITION_CREATE 0
+#define CALLING_OVERHEAD_PARTITION_IDENT 0
+#define CALLING_OVERHEAD_PARTITION_DELETE 0
+#define CALLING_OVERHEAD_PARTITION_GET_BUFFER 0
+#define CALLING_OVERHEAD_PARTITION_RETURN_BUFFER 0
+#define CALLING_OVERHEAD_REGION_CREATE 0
+#define CALLING_OVERHEAD_REGION_IDENT 0
+#define CALLING_OVERHEAD_REGION_DELETE 0
+#define CALLING_OVERHEAD_REGION_GET_SEGMENT 0
+#define CALLING_OVERHEAD_REGION_RETURN_SEGMENT 0
+#define CALLING_OVERHEAD_PORT_CREATE 0
+#define CALLING_OVERHEAD_PORT_IDENT 0
+#define CALLING_OVERHEAD_PORT_DELETE 0
+#define CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL 0
+#define CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL 0
+
+#define CALLING_OVERHEAD_IO_INITIALIZE 0
+#define CALLING_OVERHEAD_IO_OPEN 0
+#define CALLING_OVERHEAD_IO_CLOSE 0
+#define CALLING_OVERHEAD_IO_READ 0
+#define CALLING_OVERHEAD_IO_WRITE 0
+#define CALLING_OVERHEAD_IO_CONTROL 0
+#define CALLING_OVERHEAD_FATAL_ERROR_OCCURRED 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CREATE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_IDENT 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_DELETE 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL 0
+#define CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD 0
+#define CALLING_OVERHEAD_MULTIPROCESSING_ANNOUNCE 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/Makefile.in b/c/src/lib/libbsp/unix/posix/shmsupp/Makefile.in
new file mode 100644
index 0000000000..f0836ef414
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/shmsupp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=addrconv getcfg intr lock mpisr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
+
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/README b/c/src/lib/libbsp/unix/posix/shmsupp/README
new file mode 100644
index 0000000000..93d6fcbe8c
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/README
@@ -0,0 +1,9 @@
+#
+# $Id$
+#
+
+This directory contains the SHM driver support files for
+System V/POSIX derived UNIX flavors.
+
+WARNING: The interrupt support in this directory currently will
+ only work in a homogeneous system.
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c b/c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c
new file mode 100644
index 0000000000..16b8c5c3e0
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/addrconv.c
@@ -0,0 +1,30 @@
+/* addrconv.v
+ *
+ * No address range conversion is required.
+ *
+ * Input parameters:
+ * addr - address to convert
+ *
+ * Output parameters:
+ * returns - converted address
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+
+void *Shm_Convert_address(
+ void *addr
+)
+{
+ return ( addr );
+}
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c b/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
new file mode 100644
index 0000000000..7a1d57e0af
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/getcfg.c
@@ -0,0 +1,75 @@
+/* void Shm_get_config( localnode, &shmcfg )
+ *
+ * This routine initializes, if necessary, and returns a pointer
+ * to the Shared Memory Configuration Table for the UNIX
+ * simulator.
+ *
+ * INPUT PARAMETERS:
+ * localnode - local node number
+ * shmcfg - address of pointer to SHM Config Table
+ *
+ * OUTPUT PARAMETERS:
+ * *shmcfg - pointer to SHM Config Table
+ *
+ * NOTES: This driver is capable of supporting a practically unlimited
+ * number of nodes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+#include <sys/types.h> /* pid_t */
+
+shm_config_table BSP_shm_cfgtbl;
+
+int semid;
+
+void Shm_Cause_interrupt_unix(
+ rtems_unsigned32 node
+);
+
+void Shm_Get_configuration(
+ rtems_unsigned32 localnode,
+ shm_config_table **shmcfg
+)
+{
+ _CPU_SHM_Init(
+ Shm_Maximum_nodes,
+ Shm_Is_master_node(),
+ (void **)&BSP_shm_cfgtbl.base,
+ (unsigned32 *)&BSP_shm_cfgtbl.length
+ );
+
+ BSP_shm_cfgtbl.format = SHM_BIG;
+
+ BSP_shm_cfgtbl.cause_intr = Shm_Cause_interrupt_unix;
+
+#ifdef NEUTRAL_BIG
+ BSP_shm_cfgtbl.convert = NULL_CONVERT;
+#else
+ BSP_shm_cfgtbl.convert = CPU_swap_u32;
+#endif
+
+ if ( _CPU_SHM_Get_vector() ) {
+ BSP_shm_cfgtbl.poll_intr = INTR_MODE;
+ BSP_shm_cfgtbl.Intr.address = (vol_u32 *) _CPU_Get_pid(); /* process id */
+ BSP_shm_cfgtbl.Intr.value = _CPU_SHM_Get_vector(); /* signal to send */
+ BSP_shm_cfgtbl.Intr.length = LONG;
+ } else {
+ BSP_shm_cfgtbl.poll_intr = POLLED_MODE;
+ BSP_shm_cfgtbl.Intr.address = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.value = NO_INTERRUPT;
+ BSP_shm_cfgtbl.Intr.length = NO_INTERRUPT;
+ }
+
+ *shmcfg = &BSP_shm_cfgtbl;
+}
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/intr.c b/c/src/lib/libbsp/unix/posix/shmsupp/intr.c
new file mode 100644
index 0000000000..9dfdc8c4e7
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/intr.c
@@ -0,0 +1,34 @@
+/* void Shm_interrupt_unix( node )
+ *
+ * This routine is the shared memory driver routine which
+ * generates interrupts to other CPUs.
+ *
+ * Input parameters:
+ * node - destination of this packet (0 = broadcast)
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+#include <sys/types.h> /* pid_t */
+
+void Shm_Cause_interrupt_unix(
+ rtems_unsigned32 node
+)
+{
+ Shm_Interrupt_information *intr;
+ intr = &Shm_Interrupt_table[node];
+
+ _CPU_SHM_Send_interrupt( (pid_t) intr->address, intr->value );
+}
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/lock.c b/c/src/lib/libbsp/unix/posix/shmsupp/lock.c
new file mode 100644
index 0000000000..3de04e6082
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/lock.c
@@ -0,0 +1,72 @@
+/* Shared Memory Lock Routines
+ *
+ * This shared memory locked queue support routine need to be
+ * able to lock the specified locked queue. Interrupts are
+ * disabled while the queue is locked to prevent preemption
+ * and deadlock when two tasks poll for the same lock.
+ * previous level.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+
+/*
+ * Shm_Initialize_lock
+ *
+ * Initialize the lock for the specified locked queue.
+ */
+
+void Shm_Initialize_lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ lq_cb->lock = lq_cb - Shm_Locked_queues;
+}
+
+/* Shm_Lock( &lq_cb )
+ *
+ * This shared memory locked queue support routine locks the
+ * specified locked queue. It disables interrupts to prevent
+ * a deadlock condition.
+ */
+
+void Shm_Lock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ rtems_interrupt_disable( isr_level );
+
+ Shm_isrstat = isr_level;
+
+ _CPU_SHM_Lock( lq_cb->lock );
+}
+
+/*
+ * Shm_Unlock
+ *
+ * Unlock the lock for the specified locked queue.
+ */
+
+void Shm_Unlock(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ rtems_unsigned32 isr_level;
+
+ _CPU_SHM_Unlock( lq_cb->lock );
+
+ isr_level = Shm_isrstat;
+ rtems_interrupt_enable( isr_level );
+}
diff --git a/c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c b/c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c
new file mode 100644
index 0000000000..aec95008bc
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/shmsupp/mpisr.c
@@ -0,0 +1,32 @@
+/* Shm_setvec
+ *
+ * This driver routine sets the SHM interrupt vector to point to the
+ * driver's SHM interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <shm.h>
+
+void Shm_setvec( void )
+{
+ int vector;
+
+ vector = _CPU_SHM_Get_vector();
+
+ if ( vector )
+ set_vector( Shm_isr, vector, 1 );
+}
diff --git a/c/src/lib/libbsp/unix/posix/startup/Makefile.in b/c/src/lib/libbsp/unix/posix/startup/Makefile.in
new file mode 100644
index 0000000000..fd016427e5
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/startup/Makefile.in
@@ -0,0 +1,65 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/startup.rel
+NO_CTOR_LIB=${ARCH}/libno-ctor.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=bspclean bspstart setvec
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+CC_PIECES=rtems-ctor
+CC_FILES=$(CC_PIECES:%=%.cc)
+CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) no-ctor.c
+OBJS=$(C_O_FILES)
+
+# We install the RTEMS constructor as a separate .o
+# so it can be easily place correctly by the compiler config file.
+INSTALLED_O_FILES=$(ARCH)/rtems-ctor.o
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+${NO_CTOR_LIB}: $(ARCH)/no-ctor.o
+ $(RM) $@
+ $(AR) -cvr $@ $(ARCH)/no-ctor.o
+
+all: ${ARCH} $(SRCS) $(INSTALLED_O_FILES) $(PGM) ${NO_CTOR_LIB}
+ $(INSTALL_VARIANT) $(INSTALLED_O_FILES) ${PROJECT_RELEASE}/lib
+ $(INSTALL_VARIANT) $(NO_CTOR_LIB) ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/libbsp/unix/posix/startup/bspclean.c b/c/src/lib/libbsp/unix/posix/startup/bspclean.c
new file mode 100644
index 0000000000..1fbfb3115f
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/startup/bspclean.c
@@ -0,0 +1,41 @@
+/* bsp_cleanup()
+ *
+ * This routine normally is part of start.s and returns
+ * control to a monitor but on the UNIX simulator
+ * we do that directly from main.c.
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include <stdio.h>
+
+/*
+ * The app has "exited" (called rtems_shutdown_executive)
+ */
+
+void bsp_cleanup( void )
+{
+ /*
+ * Invoke any fatal error extension and "halt"
+ * By definition, rtems_fatal_error_occurred does not return.
+ */
+
+ fflush(stdout);
+ fflush(stderr);
+
+ rtems_fatal_error_occurred(0);
+}
diff --git a/c/src/lib/libbsp/unix/posix/startup/bspstart.c b/c/src/lib/libbsp/unix/posix/startup/bspstart.c
new file mode 100644
index 0000000000..23c7478776
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/startup/bspstart.c
@@ -0,0 +1,368 @@
+/* bsp_start()
+ *
+ * This routine starts the application. It includes application,
+ * board, and monitor specific initialization and configuration.
+ * The generic CPU dependent initialization has been performed
+ * before this routine is invoked.
+ *
+ * Called by RTEMS::RTEMS constructor in startup-ctor.cc
+ *
+ * INPUT: NONE
+ *
+ * OUTPUT: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <bsp.h>
+#include <libcsupport.h>
+
+#include <rtems/libio.h>
+
+#ifdef STACK_CHECKER_ON
+#include <stackchk.h>
+#endif
+
+extern rtems_configuration_table Configuration;
+
+/*
+ * A copy of the configuration table from the application
+ * with some changes applied to it.
+ */
+
+rtems_configuration_table BSP_Configuration;
+rtems_multiprocessing_table BSP_Multiprocessing;
+rtems_cpu_table Cpu_table;
+rtems_unsigned32 bsp_isr_level;
+rtems_unsigned32 Heap_size;
+int rtems_argc;
+char **rtems_argv;
+
+/*
+ * May be overridden by RTEMS_WORKSPACE_SIZE and RTEMS_HEAPSPACE_SIZE
+ * environment variables; see below.
+ */
+
+#define DEFAULT_WORKSPACE_SIZE (WORKSPACE_MB * (1024 * 1024))
+#define DEFAULT_HEAPSPACE_SIZE (HEAPSPACE_MB * (1024 * 1024))
+
+/*
+ * Amount to increment itimer by each pass
+ * It is a variable instead of a #define to allow the 'looptest'
+ * script to bump it without recompiling rtems
+ */
+
+rtems_unsigned32 CPU_CLICKS_PER_TICK;
+
+/*
+ * Function: bsp_libc_init
+ * Created: 94/12/6
+ *
+ * Description:
+ * Initialize whatever libc we are using
+ * called from bsp_postdriver_hook
+ *
+ *
+ * Parameters:
+ * none
+ *
+ * Returns:
+ * none.
+ *
+ * Side Effects:
+ *
+ *
+ * Notes:
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+void
+bsp_libc_init(void)
+{
+ void *heap_start;
+
+ if (getenv("RTEMS_HEAPSPACE_SIZE"))
+ Heap_size = strtol(getenv("RTEMS_HEAPSPACE_SIZE"), 0, 0);
+ else
+ Heap_size = DEFAULT_HEAPSPACE_SIZE;
+
+ heap_start = 0;
+
+ RTEMS_Malloc_Initialize((void *)heap_start, Heap_size, 1024 * 1024);
+
+ /*
+ * Init the RTEMS libio facility to provide UNIX-like system
+ * calls for use by newlib (ie: provide __rtems_open, __rtems_close, etc)
+ * Uses malloc() to get area for the iops, so must be after malloc init
+ */
+
+ rtems_libio_init();
+
+ libc_init(1);
+}
+
+
+/*
+ * Function: bsp_pretasking_hook
+ * Created: 95/03/10
+ *
+ * Description:
+ * BSP pretasking hook. Called just before drivers are initialized.
+ * Used to setup libc and install any BSP extensions.
+ *
+ * Parameters:
+ * none
+ *
+ * Returns:
+ * nada
+ *
+ * Side Effects:
+ * installs a few extensions
+ *
+ * Notes:
+ * Must not use libc (to do io) from here, since drivers are
+ * not yet initialized.
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+void
+bsp_pretasking_hook(void)
+{
+ bsp_libc_init();
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Initialize the stack bounds checker
+ * We can either turn it on here or from the app.
+ */
+
+ Stack_check_Initialize();
+#endif
+
+#ifdef RTEMS_DEBUG
+ rtems_debug_enable( RTEMS_DEBUG_ALL_MASK );
+#endif
+
+ /*
+ * Dump malloc stats on exit...
+ */
+#if defined(RTEMS_DEBUG)
+ atexit(malloc_dump);
+#endif
+}
+
+/*
+ * After drivers are setup, register some "filenames"
+ * and open stdin, stdout, stderr files
+ *
+ * Newlib will automatically associate the files with these
+ * (it hardcodes the numbers)
+ */
+
+void
+bsp_postdriver_hook(void)
+{
+#if 0
+ int stdin_fd, stdout_fd, stderr_fd;
+ int error_code;
+
+ error_code = 'S' << 24 | 'T' << 16;
+
+ if ((stdin_fd = __rtems_open("/dev/console", O_RDONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '0' );
+
+ if ((stdout_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '1' );
+
+ if ((stderr_fd = __rtems_open("/dev/console", O_WRONLY, 0)) == -1)
+ rtems_fatal_error_occurred( error_code | 'D' << 8 | '2' );
+
+ if ((stdin_fd != 0) || (stdout_fd != 1) || (stderr_fd != 2))
+ rtems_fatal_error_occurred( error_code | 'I' << 8 | 'O' );
+#endif
+}
+
+/*
+ * Function: bsp_start
+ * Created: 94/12/6
+ *
+ * Description:
+ * called by crt0 as our "main" equivalent
+ *
+ *
+ *
+ * Parameters:
+ *
+ *
+ * Returns:
+ *
+ *
+ * Side Effects:
+ *
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+void
+bsp_start(void)
+{
+ unsigned32 workspace_ptr;
+
+ /*
+ * Copy the table
+ */
+
+ BSP_Configuration = Configuration;
+
+ /*
+ * If the node number is -1 then the application better provide
+ * it through environment variables RTEMS_NODE.
+ * Ditto for RTEMS_MAXIMUM_NODES
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table) {
+ char *p;
+
+ /* make a copy for possible editing */
+ BSP_Multiprocessing = *BSP_Configuration.User_multiprocessing_table;
+ BSP_Configuration.User_multiprocessing_table = &BSP_Multiprocessing;
+
+ if (BSP_Multiprocessing.node == -1)
+ {
+ p = getenv("RTEMS_NODE");
+ BSP_Multiprocessing.node = p ? atoi(p) : 1;
+ }
+
+ /* If needed provide maximum_nodes also */
+ if (BSP_Multiprocessing.maximum_nodes == -1)
+ {
+ p = getenv("RTEMS_MAXIMUM_NODES");
+ BSP_Multiprocessing.maximum_nodes = p ? atoi(p) : 1;
+ }
+ }
+
+ /*
+ * Set cpu_number to accurately reflect our cpu number
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ cpu_number = BSP_Configuration.User_multiprocessing_table->node - 1;
+ else
+ cpu_number = 0;
+
+ if (getenv("RTEMS_WORKSPACE_SIZE"))
+ BSP_Configuration.work_space_size =
+ strtol(getenv("RTEMS_WORKSPACE_SIZE"), 0, 0);
+ else
+ BSP_Configuration.work_space_size = DEFAULT_WORKSPACE_SIZE;
+
+ /*
+ * Allocate workspace memory, ensuring it is properly aligned
+ */
+
+ workspace_ptr =
+ (unsigned32) sbrk(BSP_Configuration.work_space_size + CPU_ALIGNMENT);
+ workspace_ptr += CPU_ALIGNMENT - 1;
+ workspace_ptr &= ~(CPU_ALIGNMENT - 1);
+
+ BSP_Configuration.work_space_start = (void *) workspace_ptr;
+
+ /*
+ * Set up our hooks
+ * Make sure libc_init is done before drivers init'd so that
+ * they can use atexit()
+ */
+
+ Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */
+
+ Cpu_table.predriver_hook = NULL;
+
+ Cpu_table.postdriver_hook = bsp_postdriver_hook;
+
+ Cpu_table.idle_task = NULL; /* do not override system IDLE task */
+
+ /*
+ * Don't zero out the workspace since it is in the BSS under UNIX.
+ */
+
+ Cpu_table.do_zero_of_workspace = FALSE;
+
+ /*
+ * XXX; interrupt stack not currently used, so this doesn't matter
+ */
+
+ Cpu_table.interrupt_stack_size = (12 * 1024);
+
+ Cpu_table.extra_mpci_receive_server_stack = 0;
+
+ /*
+ * Add 1 region for RTEMS Malloc
+ */
+
+ BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
+
+#ifdef RTEMS_NEWLIB
+ /*
+ * Add 1 extension for newlib libc
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+#ifdef STACK_CHECKER_ON
+ /*
+ * Add 1 extension for stack checker
+ */
+
+ BSP_Configuration.maximum_extensions++;
+#endif
+
+ /*
+ * Tell libio how many fd's we want and allow it to tweak config
+ */
+
+ rtems_libio_config(&BSP_Configuration, BSP_LIBIO_MAX_FDS);
+
+ /*
+ * Add 1 extension for MPCI_fatal
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ BSP_Configuration.maximum_extensions++;
+
+ CPU_CLICKS_PER_TICK = 1;
+
+ /*
+ * Start most of RTEMS
+ * main() will start the rest
+ */
+
+ bsp_isr_level = rtems_initialize_executive_early(
+ &BSP_Configuration,
+ &Cpu_table
+ );
+}
diff --git a/c/src/lib/libbsp/unix/posix/startup/exit.c b/c/src/lib/libbsp/unix/posix/startup/exit.c
new file mode 100644
index 0000000000..d8b0f5ca7a
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/startup/exit.c
@@ -0,0 +1,27 @@
+/*
+ * exit
+ *
+ * This routine returns control to "the pre-RTEMS environment".
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <clockdrv.h>
+
+void _exit( void )
+{
+ /* Clock or Timer cleanup is run by at_exit() */
+
+ Io_cleanup();
+
+ bsp_cleanup();
+}
diff --git a/c/src/lib/libbsp/unix/posix/startup/no-ctor.c b/c/src/lib/libbsp/unix/posix/startup/no-ctor.c
new file mode 100644
index 0000000000..349ad2b1dd
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/startup/no-ctor.c
@@ -0,0 +1,16 @@
+/*
+ * rtems, floss, libc are always compiled with GNU compilers
+ * application code may be compiled with some other C++ compiler
+ * that has a different global constructor technique.
+ *
+ * For the simple case, where the app has no global constructors or
+ * is compiled by g++, we provide this empty routine
+ * In order to get both g++ constructors (RTEMS::RTEMS, for example)
+ * and application constructors run, we provide this routine.
+ *
+ * $Id$
+ */
+
+void invoke_non_gnu_constructors(void)
+{
+}
diff --git a/c/src/lib/libbsp/unix/posix/startup/rtems-ctor.cc b/c/src/lib/libbsp/unix/posix/startup/rtems-ctor.cc
new file mode 100644
index 0000000000..87dba921a7
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/startup/rtems-ctor.cc
@@ -0,0 +1,116 @@
+/*
+ * rtems-ctor.cc
+ *
+ * Description:
+ * This file exists solely to (try to) ensure RTEMS is initialized
+ * before any global constructors are run.
+ *
+ * The problem:
+ * Global constructors might reasonably expect that new() will
+ * work, but since new() uses malloc() which uses RTEMS regions,
+ * it can not be called until after initialize_executive().
+ *
+ * Global constructors are called in GNU systems one of 2 ways:
+ *
+ * an "invisible" call to __main() inserted by compiler
+ * This __main() calls __do_global_ctors() which
+ * walks thru the table and calls all global
+ * constructors.
+ *
+ * or -
+ * A special section is put into the linked binary. The
+ * system startup code knows to run the constructors in
+ * this special section before calling main().
+ *
+ * By making RTEMS initialization a constructor, we avoid having
+ * too much about all this. All we have to guarantee is that
+ * this constructor is the first one run.
+ *
+ *
+ * So for the first case above, this is what happens
+ *
+ * host crt0
+ * main()
+ * __main()
+ * __do_global_ctors()
+ * bsp_start()
+ * init_executive_early()
+ * <<any other constructors>>
+ *
+ * init_executive_late()
+ * bsp_cleanup()
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+ * RTEMS program name
+ * Probably not used by anyone, but it is nice to have it.
+ * Actually the UNIX version of CPU_INVOKE_DEBUGGER will probably
+ * need to use it
+ */
+
+char *rtems_progname;
+
+class RTEMS {
+ public:
+ RTEMS();
+ ~RTEMS();
+};
+
+RTEMS rtems_constructor;
+
+RTEMS::RTEMS()
+{
+ bsp_start();
+}
+
+RTEMS::~RTEMS()
+{
+ bsp_cleanup();
+}
+
+extern "C" {
+ extern void invoke_non_gnu_constructors(void);
+
+ int
+ main(int argc,
+ char **argv,
+ char **environp)
+ {
+ rtems_argc = argc;
+ rtems_argv = argv;
+
+ if ((argc > 0) && argv && argv[0])
+ rtems_progname = argv[0];
+ else
+ rtems_progname = "RTEMS";
+
+ /*
+ * run any non-gnu constructors we may need
+ */
+
+ invoke_non_gnu_constructors();
+
+ /*
+ * Start multitasking
+ */
+
+ rtems_initialize_executive_late( bsp_isr_level );
+
+ /*
+ * Returns when multitasking is stopped
+ * This allows our destructors to get run normally
+ */
+
+ fflush( stdout );
+ fflush( stderr );
+ return 0;
+ }
+}
diff --git a/c/src/lib/libbsp/unix/posix/startup/setvec.c b/c/src/lib/libbsp/unix/posix/startup/setvec.c
new file mode 100644
index 0000000000..6b07132450
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/startup/setvec.c
@@ -0,0 +1,47 @@
+/* set_vector
+ *
+ * This routine installs an interrupt vector on UNIX.
+ *
+ * INPUT:
+ * handler - interrupt handler entry point
+ * vector - vector number
+ * type - 0 indicates raw hardware connect
+ * 1 indicates RTEMS interrupt connect
+ *
+ * RETURNS:
+ * address of previous interrupt handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+rtems_isr_entry
+set_vector( /* returns old vector */
+ rtems_isr_entry handler, /* isr routine */
+ rtems_vector_number vector, /* vector number */
+ int type /* RTEMS or RAW intr */
+)
+{
+ rtems_isr_entry rtems_isr_ptr = 0;
+ proc_ptr raw_isr_ptr;
+
+ if ( type ) {
+ rtems_interrupt_catch( handler, vector, &rtems_isr_ptr );
+ return rtems_isr_ptr;
+ } else {
+ _CPU_ISR_install_vector( vector, (proc_ptr) handler, &raw_isr_ptr );
+ return raw_isr_ptr;
+ }
+
+}
+
+
diff --git a/c/src/lib/libbsp/unix/posix/timer/Makefile.in b/c/src/lib/libbsp/unix/posix/timer/Makefile.in
new file mode 100644
index 0000000000..150619daba
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/timer/Makefile.in
@@ -0,0 +1,54 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libbsp/unix/posix/timer/timer.c b/c/src/lib/libbsp/unix/posix/timer/timer.c
new file mode 100644
index 0000000000..94720fbbb2
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/timer/timer.c
@@ -0,0 +1,74 @@
+/* timer.c
+ *
+ * This file manages the interval timer on the PA-RISC.
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* For solaris 2.4 */
+#define __EXTENSIONS__
+
+#include <bsp.h>
+#include <time.h>
+#include <sys/time.h>
+
+struct timeval Timer_start;
+struct timeval Timer_stop;
+struct timezone Time_zone;
+
+rtems_boolean Timer_driver_Find_average_overhead;
+
+void Timer_initialize()
+{
+ gettimeofday( &Timer_start, &Time_zone );
+}
+
+#define AVG_OVERHEAD 0 /* It typically takes xxx microseconds */
+ /* (XX countdowns) to start/stop the timer. */
+#define LEAST_VALID 10 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ int total;
+
+ gettimeofday( &Timer_stop, &Time_zone );
+
+ if ( Timer_stop.tv_sec == Timer_start.tv_sec )
+ total = Timer_stop.tv_usec - Timer_start.tv_usec;
+ else {
+ total = 1000000 - Timer_start.tv_usec;
+ total += (Timer_stop.tv_sec - Timer_start.tv_sec - 1) * 1000000;
+ total += Timer_stop.tv_usec;
+ }
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in countdown units */
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ return total - AVG_OVERHEAD;
+ }
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libbsp/unix/posix/times b/c/src/lib/libbsp/unix/posix/times
new file mode 100644
index 0000000000..28811e37ba
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/times
@@ -0,0 +1,10 @@
+#
+# Timing Test Suite Results for the UNIX Simulator BSP
+#
+# $Id$
+#
+
+The times when running on the UNIX simulator are irrelevant. They vary based
+on a variety of factors including host OS, host configuration, and system load.
+The intent of the UNIX simulator is to provide a testing and prototyping
+environment not to compete with the "normal" embedded role of RTEMS.
diff --git a/c/src/lib/libbsp/unix/posix/tools/Makefile.in b/c/src/lib/libbsp/unix/posix/tools/Makefile.in
new file mode 100644
index 0000000000..fc5f40ba18
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/tools/Makefile.in
@@ -0,0 +1,30 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/tests
+
+# We use the generic difftest
+PGMS=runtest looptest semdump shmdump
+
+INSTALLED=$(PGMS:%=$(DESTDIR)/%)
+
+all: $(DESTDIR) $(PGMS) install
+
+install: $(INSTALLED)
+
+# Install the program, replacing #!KSHELL with $(KSH)
+# and first line #!SHELL with $(SHELL)
+$(DESTDIR)/%: %
+ -$(RM) $@.old
+ -$(MV) $@ $@.old >/dev/null 2>&1
+ $(SED) -e '1,1s?^#!KSHELL?#!$(KSH)?' -e '1,1s?^#!SHELL?#!$(SHELL)?' < $< > $@
+ $(CHMOD) 0555 $@
diff --git a/c/src/lib/libbsp/unix/posix/wrapup/Makefile.in b/c/src/lib/libbsp/unix/posix/wrapup/Makefile.in
new file mode 100644
index 0000000000..7dbf6b7c44
--- /dev/null
+++ b/c/src/lib/libbsp/unix/posix/wrapup/Makefile.in
@@ -0,0 +1,64 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# MP_XXX_PARTS are the pieces of the BSP required in a MP environment
+# We only build them if HAS_MP was defined
+
+MP_BSP_PARTS_yes_V = shmsupp
+MP_BSP_PARTS = $(MP_BSP_PARTS_$(HAS_MP)_V)
+
+MP_GENERIC_PARTS_yes_V = shmdr
+MP_GENERIC_PARTS = $(MP_GENERIC_PARTS_$(HAS_MP)_V)
+
+
+
+BSP_PIECES=startup clock console $(MP_BSP_PARTS) timer
+# pieces to pick up out of libcpu/unix
+CPU_PIECES=
+GENERIC_PIECES=$(MP_GENERIC_PARTS)
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(BSP_PIECES), ../$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(CPU_PIECES), \
+ ../../../../libcpu/$(RTEMS_CPU)/$(piece)/$(ARCH)/$(piece).rel) \
+ $(foreach piece, $(GENERIC_PIECES), \
+ ../../../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libbsp.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/libc/Makefile.in b/c/src/lib/libc/Makefile.in
new file mode 100644
index 0000000000..9b5c9238d6
--- /dev/null
+++ b/c/src/lib/libc/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIBNAME=libcsupport.a
+LIB=${ARCH}/${LIBNAME}
+
+# C and C++ source names, if any, go here -- minus the .c or .cc
+C_PIECES=__gettod __brk __times malloc syscalls \
+ no_libc newlibc newlibif support unixlibc libio hosterr
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/libcsupport.h
+SYS_H_FILES=
+RTEMS_H_FILES=$(srcdir)/libio.h
+PRIVATE_H_FILES=$(srcdir)/internal.h
+
+INSTALLED_H_FILES=$(srcdir)/libio.h $(srcdir)/libcsupport.h
+SRCS=$(C_FILES) $(H_FILES) $(SYS_H_FILES) $(RTEMS_H_FILES) $(PRIVATE_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(LIBC_DEFINES)
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} preinstall $(LIB)
+ $(INSTALL_VARIANT) -m 644 ${LIB} ${PROJECT_RELEASE}/lib
+
+$(LIB): $(SRCS) ${OBJS}
+ $(make-library)
+
+# Install the library, appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
+preinstall:
+ $(INSTALL) -m 444 ${RTEMS_H_FILES} ${PROJECT_RELEASE}/include/rtems
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(SYS_H_FILES) ${PROJECT_RELEASE}/include/sys
+
+
diff --git a/c/src/lib/libc/README b/c/src/lib/libc/README
new file mode 100644
index 0000000000..ee7a90501e
--- /dev/null
+++ b/c/src/lib/libc/README
@@ -0,0 +1,37 @@
+--
+-- $Id$
+--
+
+Overview of newlib support (newlib is from CYGNUS)
+ Each task can have its own libc state including:
+ open stdio files
+ strtok
+ multi precision arithmetic state
+ etc.
+
+ This is implemented by a reentrancy data structure for each task.
+
+ When a task is "started" (in RTEMS sense) the reentrancy structure
+ is allocated. Its address is stored in notepad[NOTEPAD_LAST].
+
+ When task is switched to, the value of global variable _impure_ptr
+ is changed to the value of the new tasks reentrancy structure.
+
+ When a task is deleted
+ atexit() processing (for that task) happens
+ task's stdio buffers are flushed
+
+ When exit(3) is called
+ calling task's atexit processing done
+ global libc state atexit processing done
+ (this will include any atexit routines installed by drivers)
+ executive is shutdown
+ causes a context switch back to bsp land
+
+
+NOTE:
+ libc extension are installed by bsp_libc_init()
+ iff we are using clock interrupts.
+ This hack is necessary to allow the tmtests to avoid
+ timing the extensions.
+
diff --git a/c/src/lib/libc/__brk.c b/c/src/lib/libc/__brk.c
new file mode 100644
index 0000000000..853ace5e02
--- /dev/null
+++ b/c/src/lib/libc/__brk.c
@@ -0,0 +1,44 @@
+#if !defined(RTEMS_UNIX)
+
+/*
+ * RTEMS "Broken" __brk/__sbrk Implementation
+ *
+ * NOTE: sbrk is BSP provided.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#ifdef RTEMS_NEWLIB
+#include <reent.h>
+#endif
+#include <unistd.h>
+
+/* we use RTEMS for memory management. We don't need sbrk */
+
+void * __sbrk(int incr)
+{
+ errno = EINVAL;
+ return (void *)0;
+}
+
+int __brk( const void *endds )
+{
+ errno = EINVAL;
+ return -1;
+}
+
+#endif
diff --git a/c/src/lib/libc/__gettod.c b/c/src/lib/libc/__gettod.c
new file mode 100644
index 0000000000..1d80792446
--- /dev/null
+++ b/c/src/lib/libc/__gettod.c
@@ -0,0 +1,103 @@
+#if !defined(RTEMS_UNIX)
+/*
+ * RTEMS gettimeofday Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#ifdef RTEMS_NEWLIB
+#include <sys/reent.h>
+#endif
+
+#include <time.h>
+#include <sys/time.h>
+
+#include <errno.h>
+#include <assert.h>
+
+/*
+ * NOTE: The solaris gettimeofday does not have a second parameter.
+ */
+
+int gettimeofday(
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ rtems_status_code status;
+ rtems_clock_time_value time;
+
+ if ( !tp ) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* "POSIX" does not seem to allow for not having a TOD */
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TIME_VALUE, &time );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ assert( 0 );
+ return -1;
+ }
+
+ tp->tv_sec = time.seconds;
+ tp->tv_usec = time.microseconds;
+
+ /*
+ * newlib does not have timezone and daylight savings time
+ * yet. When it does this needs to be fixed.
+ */
+
+#if 0
+ if ( tzp ) {
+ tzp->tz_minuteswest = 0; /* at UTC */
+ tzp->tz_dsttime = 0; /* no daylight savings */
+ tzp->minuteswest = timezone / 60; /* from seconds to minutes */
+ tzp->dsttime = daylight;
+ }
+#endif
+ return 0;
+}
+
+#if defined(RTEMS_NEWLIB)
+
+#if 0
+/*
+ * "Reentrant" version
+ */
+
+int _gettimeofday_r(
+ struct _reent *ignored_reentrancy_stuff,
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ return gettimeofday( tp, tzp );
+}
+#endif
+
+/*
+ * "System call" version
+ */
+
+int _gettimeofday(
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ return gettimeofday( tp, tzp );
+}
+
+#endif /* defined(RTEMS_NEWLIB) */
+
+#endif
diff --git a/c/src/lib/libc/__times.c b/c/src/lib/libc/__times.c
new file mode 100644
index 0000000000..fb46d0238d
--- /dev/null
+++ b/c/src/lib/libc/__times.c
@@ -0,0 +1,65 @@
+/*
+ * RTEMS _times Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <sys/times.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <assert.h>
+
+clock_t _times(
+ struct tms *ptms
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks_since_boot;
+
+ if ( !ptms ) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* "POSIX" does not seem to allow for not having a TOD */
+ status = rtems_clock_get(
+ RTEMS_CLOCK_GET_TICKS_SINCE_BOOT,
+ &ticks_since_boot
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ assert( 0 );
+ return -1;
+ }
+
+ /*
+ * RTEMS has no notion of system versus user time and does
+ * not (as of 3.2.0) keep track of CPU usage on a per task basis.
+ */
+
+ ptms->tms_utime = ticks_since_boot;
+ ptms->tms_stime = 0;
+ ptms->tms_cutime = 0;
+ ptms->tms_cstime = 0;
+
+ return 0;
+}
+
+clock_t times(
+ struct tms *ptms
+)
+{
+ return _times( ptms );
+}
+
diff --git a/c/src/lib/libc/assoc.c b/c/src/lib/libc/assoc.c
new file mode 100644
index 0000000000..74387a8c5b
--- /dev/null
+++ b/c/src/lib/libc/assoc.c
@@ -0,0 +1,260 @@
+/*
+ * assoc.c
+ * rtems assoc routines
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "assoc.h"
+
+#include <stdio.h> /* sprintf */
+#include <string.h> /* strcat, strcmp */
+
+#define STREQ(a,b) (strcmp((a), (b)) == 0)
+#define rtems_assoc_is_default(ap) ((ap)->name && STREQ(ap->name, RTEMS_ASSOC_DEFAULT_NAME))
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (strcmp(ap->name, name) == 0)
+ return ap;
+
+ return default_ap;
+}
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->local_value == local_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->remote_value == remote_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+/*
+ * Get values
+ */
+
+unsigned32
+rtems_assoc_remote_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_remote_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+/*
+ * what to return if a value is not found
+ * this is not reentrant, but it really shouldn't be invoked anyway
+ */
+
+const char *
+rtems_assoc_name_bad(
+ unsigned32 bad_value
+)
+{
+#ifdef RTEMS_DEBUG
+ static char bad_buffer[32];
+
+ sprintf(bad_buffer, "< %d [0x%x] >", bad_value, bad_value);
+#else
+ static char bad_buffer[32] = "<assoc.c: BAD NAME>";
+#endif
+ return bad_buffer;
+}
+
+
+const char *
+rtems_assoc_name_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(local_value);
+}
+
+const char *
+rtems_assoc_name_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(remote_value);
+}
+
+/*
+ * Bitfield functions assume just 1 bit set in each of remote and local
+ * entries; they do not check for this.
+ */
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ unsigned32 b;
+ unsigned32 remote_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & local_value)
+ remote_value |= rtems_assoc_remote_by_local(ap, b);
+
+ return remote_value;
+}
+
+
+unsigned32 rtems_assoc_local_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ unsigned32 b;
+ unsigned32 local_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & remote_value)
+ local_value |= rtems_assoc_local_by_remote(ap, b);
+
+ return local_value;
+}
+
+char *
+rtems_assoc_name_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_remote(ap, b));
+ }
+
+ return buffer;
+}
+
+char *
+rtems_assoc_name_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_local(ap, b));
+ }
+
+ return buffer;
+}
diff --git a/c/src/lib/libc/assoc.h b/c/src/lib/libc/assoc.h
new file mode 100644
index 0000000000..1982d654ac
--- /dev/null
+++ b/c/src/lib/libc/assoc.h
@@ -0,0 +1,42 @@
+/*
+ *
+ * Rtems associativity routines. Mainly used to convert a value from
+ * one space to another (eg: our errno's to host errno's and v.v)
+ *
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ASSOC_H
+#define _INCLUDE_ASSOC_H
+
+typedef struct {
+ const char *name;
+ unsigned32 local_value;
+ unsigned32 remote_value;
+} rtems_assoc_t;
+
+/*
+ * Flag/marker for optional default value in each table
+ */
+
+#define RTEMS_ASSOC_DEFAULT_NAME "(default)"
+
+const rtems_assoc_t *rtems_assoc_ptr_by_name(const rtems_assoc_t *, const char *);
+const rtems_assoc_t *rtems_assoc_ptr_by_value(const rtems_assoc_t *, unsigned32);
+const rtems_assoc_t *rtems_assoc_ptr_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_local_by_remote(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_remote_by_name(const rtems_assoc_t *, const char *);
+unsigned32 rtems_assoc_local_by_name(const rtems_assoc_t *, const char *);
+const char *rtems_assoc_name_by_local(const rtems_assoc_t *, unsigned32);
+const char *rtems_assoc_name_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(const rtems_assoc_t *, unsigned32);
+char *rtems_assoc_name_by_local_bitfield(const rtems_assoc_t *, unsigned32, char *);
+char *rtems_assoc_name_by_remote_bitfield(const rtems_assoc_t *, unsigned32, char *);
+unsigned32 rtems_assoc_local_by_remote_bitfield(const rtems_assoc_t *, unsigned32);
+
+
+#endif /* ! _INCLUDE_ASSOC_H */
diff --git a/c/src/lib/libc/error.c b/c/src/lib/libc/error.c
new file mode 100644
index 0000000000..5bd481c3e6
--- /dev/null
+++ b/c/src/lib/libc/error.c
@@ -0,0 +1,209 @@
+/*
+ * report errors and panics to RTEMS' stderr.
+ * Currently just used by RTEMS monitor.
+ *
+ * $Id$
+ */
+
+
+/*
+ * These routines provide general purpose error reporting.
+ * rtems_error reports an error to stderr and allows use of
+ * printf style formatting. A newline is appended to all messages.
+ *
+ * error_flag can be specified as any of the following:
+ *
+ * RTEMS_ERROR_ERRNO -- include errno text in output
+ * RTEMS_ERROR_PANIC -- halts local system after output
+ * RTEMS_ERROR_ABORT -- abort after output
+ *
+ * It can also include a rtems_status value which can be OR'd
+ * with the above flags. *
+ *
+ * EXAMPLE
+ * #include <rtems.h>
+ * #include <rtems/error.h>
+ * rtems_error(0, "stray interrupt %d", intr);
+ *
+ * EXAMPLE
+ * if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL)
+ * {
+ * rtems_error(status | RTEMS_ERROR_ABORT,
+ * "could not create task");
+ * }
+ *
+ * EXAMPLE
+ * if ((fd = open(pathname, O_RDNLY)) < 0)
+ * {
+ * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname);
+ * goto failed;
+ * }
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "error.h"
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h> /* _exit() */
+
+/* bug in hpux <errno.h>: no prototypes unless you are C++ */
+#ifdef hpux9
+char *strerror(int);
+#endif
+
+extern char *rtems_progname;
+int rtems_panic_in_progress;
+
+rtems_assoc_t rtems_status_assoc[] = {
+ { "successful completion", RTEMS_SUCCESSFUL, },
+ { "returned from a thread", RTEMS_TASK_EXITTED, },
+ { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, },
+ { "invalid object name", RTEMS_INVALID_NAME, },
+ { "invalid object id", RTEMS_INVALID_ID, },
+ { "too many", RTEMS_TOO_MANY, },
+ { "timed out waiting", RTEMS_TIMEOUT, },
+ { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, },
+ { "specified size was invalid", RTEMS_INVALID_SIZE, },
+ { "address specified is invalid", RTEMS_INVALID_ADDRESS, },
+ { "number was invalid", RTEMS_INVALID_NUMBER, },
+ { "item has not been initialized", RTEMS_NOT_DEFINED, },
+ { "resources still outstanding", RTEMS_RESOURCE_IN_USE, },
+ { "request not satisfied", RTEMS_UNSATISFIED, },
+ { "thread is in wrong state", RTEMS_INCORRECT_STATE, },
+ { "thread already in state", RTEMS_ALREADY_SUSPENDED, },
+ { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, },
+ { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, },
+ { "called from wrong environment", RTEMS_CALLED_FROM_ISR, },
+ { "invalid thread priority", RTEMS_INVALID_PRIORITY, },
+ { "invalid date/time", RTEMS_INVALID_CLOCK, },
+ { "invalid node id", RTEMS_INVALID_NODE, },
+ { "directive not configured", RTEMS_NOT_CONFIGURED, },
+ { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , },
+ { "directive not implemented", RTEMS_NOT_IMPLEMENTED, },
+ { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, },
+ { "could not get enough memory", RTEMS_NO_MEMORY, },
+ { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
+ { 0, 0, 0 },
+};
+
+
+const char *
+rtems_status_text(
+ rtems_status_code status
+)
+{
+ return rtems_assoc_name_by_local(rtems_status_assoc, status);
+}
+
+
+static int rtems_verror(
+ unsigned32 error_flag,
+ const char *printf_format,
+ va_list arglist
+)
+{
+ int local_errno = 0;
+ int chars_written = 0;
+ rtems_status_code status;
+
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_panic_in_progress++;
+
+ /* disable task switches */
+ _Thread_Disable_dispatch();
+
+ /* don't aggravate things */
+ if (rtems_panic_in_progress > 2)
+ return 0;
+ }
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ status = error_flag & ~RTEMS_ERROR_MASK;
+ if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
+ local_errno = errno;
+
+ if (_System_state_Is_multiprocessing)
+ fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
+
+ if (rtems_progname && *rtems_progname)
+ chars_written += fprintf(stderr, "%s: ", rtems_progname);
+ chars_written += vfprintf(stderr, printf_format, arglist);
+
+ if (status)
+ chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status));
+
+ if (local_errno)
+ if ((local_errno > 0) && *strerror(local_errno))
+ chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
+ else
+ chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
+
+ chars_written += fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT))
+ {
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_error(0, "fatal error, exiting");
+ _exit(local_errno);
+ }
+ else
+ {
+ rtems_error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+ return chars_written;
+}
+
+
+/*
+ * Report an error.
+ * error_flag is as above; printf_format is a normal
+ * printf(3) format string, with its concommitant arguments.
+ *
+ * Returns the number of characters written.
+ */
+
+int rtems_error(
+ int error_flag,
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+ int chars_written;
+
+ va_start(arglist, printf_format);
+ chars_written = rtems_verror(error_flag, printf_format, arglist);
+ va_end(arglist);
+
+ return chars_written;
+}
+
+/*
+ * rtems_panic is shorthand for rtems_error(RTEMS_ERROR_PANIC, ...)
+ */
+
+void rtems_panic(
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+
+ va_start(arglist, printf_format);
+ (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
+ va_end(arglist);
+}
diff --git a/c/src/lib/libc/error.h b/c/src/lib/libc/error.h
new file mode 100644
index 0000000000..a0698afb5d
--- /dev/null
+++ b/c/src/lib/libc/error.h
@@ -0,0 +1,38 @@
+/*
+ * Defines and externs for rtems error reporting
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ERROR_h
+#define __RTEMS_ERROR_h
+
+/*
+ * rtems_error() and rtems_panic() support
+ */
+
+#define RTEMS_ERROR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */
+#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */
+
+#define RTEMS_ERROR_MASK (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \
+ RTEMS_ERROR_PANIC) /* all */
+
+const char *rtems_status_text(rtems_status_code);
+int rtems_error(int error_code, const char *printf_format, ...);
+#ifdef __GNUC__
+void rtems_panic(const char *printf_format, ...);
+/*
+ * We should be able to use this attribute but gcc complains that
+ * rtems_panic does in fact return. :(
+ *
+ * __attribute__ ((__noreturn__));
+ */
+#else
+void rtems_panic(const char *printf_format, ...);
+#endif
+
+extern int rtems_panic_in_progress;
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libc/hosterr.c b/c/src/lib/libc/hosterr.c
new file mode 100644
index 0000000000..7c0838a2e0
--- /dev/null
+++ b/c/src/lib/libc/hosterr.c
@@ -0,0 +1,43 @@
+/*
+ * Routines to access a host errno
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <errno.h>
+
+int host_errno(void);
+
+/*
+ * copy host errno, if any to thread aware errno, if any
+ */
+
+void fix_syscall_errno(void)
+{
+ errno = host_errno();
+}
+
+/*
+ * Get the host system errno, if any
+ * When using newlib (or possibly other libc's) on top of UNIX
+ * the errno returned by system calls may be unavailable due
+ * to trickery of making errno thread aware.
+ * This provides a kludge of getting at it.
+ */
+
+#undef errno
+extern int errno;
+int host_errno(void)
+{
+ return errno;
+}
+
diff --git a/c/src/lib/libc/internal.h b/c/src/lib/libc/internal.h
new file mode 100644
index 0000000000..72833c823b
--- /dev/null
+++ b/c/src/lib/libc/internal.h
@@ -0,0 +1,41 @@
+/* internal.h
+ *
+ * This include file contains internal information
+ * for the RTEMS C library support which is needed across
+ * files.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INTERNAL_LIBC_h
+#define __INTERNAL_LIBC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void MY_task_set_note(
+ rtems_tcb *tcb,
+ rtems_unsigned32 notepad,
+ rtems_unsigned32 note
+);
+
+rtems_unsigned32 MY_task_get_note(
+ rtems_tcb *tcb,
+ rtems_unsigned32 notepad
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libc/libcsupport.h b/c/src/lib/libc/libcsupport.h
new file mode 100644
index 0000000000..470a35b51a
--- /dev/null
+++ b/c/src/lib/libc/libcsupport.h
@@ -0,0 +1,43 @@
+/* libcsupport.h
+ *
+ * This include file contains the information regarding the
+ * RTEMS specific support for the standard C library.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __LIBC_SUPPORT_h
+#define __LIBC_SUPPORT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+
+void RTEMS_Malloc_Initialize(
+ void *start,
+ size_t length,
+ size_t sbrk_amount
+);
+
+extern void malloc_dump(void);
+extern void malloc_walk(size_t source, size_t printf_enabled);
+extern void libc_init(int reentrant);
+extern int host_errno(void);
+extern void fix_syscall_errno(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libc/libio.c b/c/src/lib/libc/libio.c
new file mode 100644
index 0000000000..ec10184a10
--- /dev/null
+++ b/c/src/lib/libc/libio.c
@@ -0,0 +1,532 @@
+/*
+ * Provide UNIX/POSIX-like io system calls for RTEMS using the
+ * RTEMS IO manager
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/assoc.h> /* assoc.h not included by rtems.h */
+
+#include <stdio.h> /* O_RDONLY, et.al. */
+#include <fcntl.h> /* O_RDONLY, et.al. */
+#include <assert.h>
+
+#if ! defined(O_NDELAY)
+# if defined(solaris2)
+# define O_NDELAY O_NONBLOCK
+# elif defined(RTEMS_NEWLIB)
+# define O_NDELAY _FNBIO
+# endif
+#endif
+
+
+#include <errno.h>
+#include <string.h> /* strcmp */
+#include <unistd.h>
+#include <stdlib.h> /* calloc() */
+
+#include "libio.h" /* libio.h not pulled in by rtems */
+
+/*
+ * Semaphore to protect the io table
+ */
+
+Objects_Id rtems_libio_semaphore;
+
+#define RTEMS_LIBIO_SEM rtems_build_name('L', 'B', 'I', 'O')
+#define RTEMS_LIBIO_IOP_SEM(n) rtems_build_name('L', 'B', 'I', n)
+
+unsigned32 rtems_libio_number_iops;
+rtems_libio_t *rtems_libio_iops;
+rtems_libio_t *rtems_libio_last_iop;
+
+#define rtems_libio_iop(fd) ((((unsigned32)(fd)) < rtems_libio_number_iops) ? \
+ &rtems_libio_iops[fd] : 0)
+
+#define rtems_libio_check_fd(fd) \
+ do { \
+ if ((unsigned32) (fd) >= rtems_libio_number_iops) \
+ { \
+ errno = EBADF; \
+ return -1; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_buffer(buffer) \
+ do { \
+ if ((buffer) == 0) \
+ { \
+ errno = EINVAL; \
+ return -1; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_count(count) \
+ do { \
+ if ((count) == 0) \
+ { \
+ return 0; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_permissions(iop, flag) \
+ do { \
+ if (((iop)->flags & (flag)) == 0) \
+ { \
+ errno = EINVAL; \
+ return -1; \
+ } \
+ } while (0)
+
+/*
+ * External I/O handlers
+ *
+ * Space for all possible handlers is preallocated
+ * to speed up dispatch to external handlers.
+ */
+
+static rtems_libio_handler_t handlers[15];
+
+void
+rtems_register_libio_handler(
+ int handler_flag,
+ const rtems_libio_handler_t *handler
+)
+{
+ int handler_index = rtems_file_descriptor_type_index(handler_flag);
+
+ if ((handler_index < 0) || (handler_index >= 15))
+ rtems_fatal_error_occurred( RTEMS_INVALID_NUMBER );
+ handlers[handler_index] = *handler;
+}
+
+
+void
+rtems_libio_config(
+ rtems_configuration_table *config,
+ unsigned32 max_fds
+)
+{
+ rtems_libio_number_iops = max_fds;
+
+ /*
+ * tweak config to reflect # of semaphores we will need
+ */
+
+ /* one for iop table */
+ config->RTEMS_api_configuration->maximum_semaphores += 1;
+ config->RTEMS_api_configuration->maximum_semaphores += max_fds;
+}
+
+/*
+ * Called by bsp startup code to init the libio area.
+ */
+
+void
+rtems_libio_init(void)
+{
+ rtems_status_code rc;
+
+ if (rtems_libio_number_iops > 0)
+ {
+ rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
+ sizeof(rtems_libio_t));
+ if (rtems_libio_iops == NULL)
+ rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
+
+ rtems_libio_last_iop = rtems_libio_iops + (rtems_libio_number_iops - 1);
+ }
+
+ rc = rtems_semaphore_create(
+ RTEMS_LIBIO_SEM,
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &rtems_libio_semaphore
+ );
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+}
+
+/*
+ * Convert RTEMS status to a UNIX errno
+ */
+
+rtems_assoc_t errno_assoc[] = {
+ { "OK", RTEMS_SUCCESSFUL, 0 },
+ { "TIMEOUT", RTEMS_TIMEOUT, ETIME },
+ { "NO MEMORY", RTEMS_NO_MEMORY, ENOMEM },
+ { "NO DEVICE", RTEMS_UNSATISFIED, ENOSYS },
+ { 0, 0, 0 },
+};
+
+static unsigned32
+rtems_libio_errno(rtems_status_code code)
+{
+ int rc;
+
+ if ((rc = rtems_assoc_remote_by_local(errno_assoc, (unsigned32) code)))
+ {
+ errno = rc;
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * Convert UNIX fnctl(2) flags to ones that RTEMS drivers understand
+ */
+
+rtems_assoc_t access_modes_assoc[] = {
+ { "READ", LIBIO_FLAGS_READ, O_RDONLY },
+ { "WRITE", LIBIO_FLAGS_WRITE, O_WRONLY },
+ { "READ/WRITE", LIBIO_FLAGS_READ_WRITE, O_RDWR },
+ { 0, 0, 0 },
+};
+
+rtems_assoc_t status_flags_assoc[] = {
+ { "NO DELAY", LIBIO_FLAGS_NO_DELAY, O_NDELAY },
+ { "APPEND", LIBIO_FLAGS_APPEND, O_APPEND },
+ { "CREATE", LIBIO_FLAGS_CREATE, O_CREAT },
+ { 0, 0, 0 },
+};
+
+static unsigned32
+rtems_libio_fcntl_flags(unsigned32 fcntl_flags)
+{
+ unsigned32 flags = 0;
+ unsigned32 access_modes;
+
+ /*
+ * Access mode is a small integer
+ */
+
+ access_modes = fcntl_flags & O_ACCMODE;
+ fcntl_flags &= ~O_ACCMODE;
+ flags = rtems_assoc_local_by_remote(access_modes_assoc, access_modes);
+
+ /*
+ * Everything else is single bits
+ */
+
+ flags |= rtems_assoc_local_by_remote_bitfield(status_flags_assoc, fcntl_flags);
+ return flags;
+}
+
+
+static rtems_libio_t *
+rtems_libio_allocate(void)
+{
+ rtems_libio_t *iop;
+ rtems_status_code rc;
+
+ rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+
+ for (iop = rtems_libio_iops; iop <= rtems_libio_last_iop; iop++)
+ if ((iop->flags & LIBIO_FLAGS_OPEN) == 0)
+ {
+ /*
+ * Got one; create a semaphore for it
+ */
+
+ rc = rtems_semaphore_create(
+ RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops),
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &iop->sem
+ );
+ if (rc != RTEMS_SUCCESSFUL)
+ goto failed;
+
+ iop->flags = LIBIO_FLAGS_OPEN;
+ goto done;
+ }
+
+failed:
+ iop = 0;
+
+done:
+ rtems_semaphore_release(rtems_libio_semaphore);
+ return iop;
+}
+
+static void
+rtems_libio_free(rtems_libio_t *iop)
+{
+ rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+
+ if (iop->sem)
+ rtems_semaphore_delete(iop->sem);
+ (void) memset(iop, 0, sizeof(*iop));
+
+ rtems_semaphore_release(rtems_libio_semaphore);
+}
+
+int
+__rtems_open(
+ const char *pathname,
+ unsigned32 flag,
+ unsigned32 mode)
+{
+ rtems_status_code rc;
+ rtems_libio_t *iop = 0;
+ rtems_driver_name_t *np;
+ rtems_libio_open_close_args_t args;
+
+ /*
+ * Additional external I/O handlers would be supported by
+ * adding code to pick apart the pathname appropriately.
+ * The networking code does not require changes here since
+ * network file descriptors are obtained using socket(), not
+ * open().
+ */
+
+ if ((rc = rtems_io_lookup_name(pathname, &np)) != RTEMS_SUCCESSFUL)
+ goto done;
+
+ iop = rtems_libio_allocate();
+ if (iop == 0)
+ {
+ rc = RTEMS_TOO_MANY;
+ goto done;
+ }
+
+ iop->driver = np;
+ iop->pathname = (char *) pathname;
+ iop->flags |= rtems_libio_fcntl_flags(flag);
+
+ args.iop = iop;
+ args.flags = iop->flags;
+ args.mode = mode;
+
+ rc = rtems_io_open(np->major, np->minor, (void *) &args);
+
+done:
+
+ if (rc != RTEMS_SUCCESSFUL)
+ {
+ if (iop)
+ rtems_libio_free(iop);
+ return rtems_libio_errno(rc);
+ }
+
+ return iop - rtems_libio_iops;
+}
+
+int
+__rtems_close(
+ int fd
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_open_close_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].close;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.flags = 0;
+ args.mode = 0;
+
+ rc = rtems_io_close(np->major, np->minor, (void *) &args);
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+ return 0;
+}
+
+int
+__rtems_read(
+ int fd,
+ void * buffer,
+ unsigned32 count
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_rw_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, void *buffer, unsigned32 count);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].read;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, buffer, count);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+ rtems_libio_check_buffer(buffer);
+ rtems_libio_check_count(count);
+ rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ rc = rtems_io_read(np->major, np->minor, (void *) &args);
+
+ iop->offset += args.bytes_moved;
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.bytes_moved;
+}
+
+int
+__rtems_write(
+ int fd,
+ const void *buffer,
+ unsigned32 count
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_rw_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, const void *buffer, unsigned32 count);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].write;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, buffer, count);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+ rtems_libio_check_buffer(buffer);
+ rtems_libio_check_count(count);
+ rtems_libio_check_permissions(iop, LIBIO_FLAGS_WRITE);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = (void *) buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ rc = rtems_io_write(np->major, np->minor, (void *) &args);
+
+ iop->offset += args.bytes_moved;
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.bytes_moved;
+}
+
+int
+__rtems_ioctl(
+ int fd,
+ unsigned32 command,
+ void * buffer)
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_ioctl_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, unsigned32 command, void *buffer);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].ioctl;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, command, buffer);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.command = command;
+ args.buffer = buffer;
+
+ rc = rtems_io_control(np->major, np->minor, (void *) &args);
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.ioctl_return;
+}
+
+/*
+ * internal only??
+ */
+
+
+int
+__rtems_lseek(
+ int fd,
+ rtems_libio_offset_t offset,
+ int whence
+ )
+{
+ rtems_libio_t *iop;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, rtems_libio_offset_t offset, int whence);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].lseek;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, offset, whence);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ switch (whence)
+ {
+ case SEEK_SET:
+ iop->offset = offset;
+ break;
+
+ case SEEK_CUR:
+ iop->offset += offset;
+ break;
+
+ case SEEK_END:
+ iop->offset = iop->size - offset;
+ break;
+
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+}
diff --git a/c/src/lib/libc/libio.h b/c/src/lib/libc/libio.h
new file mode 100644
index 0000000000..c79dfc2e33
--- /dev/null
+++ b/c/src/lib/libc/libio.h
@@ -0,0 +1,124 @@
+/*
+ * General purpose communication channel for RTEMS to allow UNIX/POSIX
+ * system call behavior on top of RTEMS IO devices.
+ *
+ * TODO
+ * stat(2)
+ * unlink(2)
+ * rename(2)
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_LIBIO_H
+#define _RTEMS_LIBIO_H
+
+#include <sys/stat.h>
+
+typedef unsigned32 rtems_libio_offset_t;
+
+/*
+ * An open file data structure, indexed by 'fd'
+ * TODO:
+ * should really have a separate per/file data structure that this
+ * points to (eg: size, offset, driver, pathname should be in that)
+ */
+
+typedef struct {
+ rtems_driver_name_t *driver;
+ rtems_libio_offset_t size; /* size of file */
+ rtems_libio_offset_t offset; /* current offset into the file */
+ unsigned32 flags;
+ char *pathname; /* opened pathname */
+ Objects_Id sem;
+ unsigned32 data0; /* private to "driver" */
+ unsigned32 data1; /* ... */
+} rtems_libio_t;
+
+
+/*
+ * param block for read/write
+ * Note: it must include 'offset' instead of using iop's offset since
+ * we can have multiple outstanding i/o's on a device.
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ rtems_libio_offset_t offset;
+ unsigned8 *buffer;
+ unsigned32 count;
+ unsigned32 flags;
+ unsigned32 bytes_moved;
+} rtems_libio_rw_args_t;
+
+/*
+ * param block for open/close
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 flags;
+ unsigned32 mode;
+} rtems_libio_open_close_args_t;
+
+/*
+ * param block for ioctl
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 command;
+ void *buffer;
+ unsigned32 ioctl_return;
+} rtems_libio_ioctl_args_t;
+
+
+/*
+ * Values for 'flag'
+ */
+
+#define LIBIO_FLAGS_NO_DELAY 0x0001 /* return immediately if no data */
+#define LIBIO_FLAGS_READ 0x0002 /* reading */
+#define LIBIO_FLAGS_WRITE 0x0004 /* writing */
+#define LIBIO_FLAGS_LINE_BUFFERED 0x0008 /* line buffered io (^h, ^u, etc) */
+#define LIBIO_FLAGS_OPEN 0x0100 /* device is open */
+#define LIBIO_FLAGS_APPEND 0x0200 /* all writes append */
+#define LIBIO_FLAGS_CREATE 0x0400 /* create file */
+
+#define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE)
+
+void rtems_libio_config(rtems_configuration_table *config, unsigned32 max_fds);
+void rtems_libio_init(void);
+
+int __rtems_open(const char *pathname, unsigned32 flag, unsigned32 mode);
+int __rtems_close(int fd);
+int __rtems_read(int fd, void *buffer, unsigned32 count);
+int __rtems_write(int fd, const void *buffer, unsigned32 count);
+int __rtems_ioctl(int fd, unsigned32 command, void *buffer);
+int __rtems_lseek(int fd, rtems_libio_offset_t offset, int whence);
+int __rtems_fstat(int _fd, struct stat* _sbuf);
+int __rtems_isatty(int _fd);
+
+/*
+ * External I/O handlers
+ */
+typedef struct {
+ int (*open)(const char *pathname, unsigned32 flag, unsigned32 mode);
+ int (*close)(int fd);
+ int (*read)(int fd, void *buffer, unsigned32 count);
+ int (*write)(int fd, const void *buffer, unsigned32 count);
+ int (*ioctl)(int fd, unsigned32 command, void *buffer);
+ int (*lseek)(int fd, rtems_libio_offset_t offset, int whence);
+} rtems_libio_handler_t;
+
+void rtems_register_libio_handler(int handler_flag,
+ const rtems_libio_handler_t *handler);
+
+#define RTEMS_FILE_DESCRIPTOR_TYPE_FILE 0x0000
+#define RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET 0x1000
+#define rtems_make_file_descriptor(fd,flags) ((fd)|(flags))
+#define rtems_file_descriptor_base(fd) ((fd) & 0x0FFF)
+#define rtems_file_descriptor_type(fd) ((fd) & 0xF000)
+#define rtems_file_descriptor_type_index(fd) ((((fd) & 0xF000) >> 12) - 1)
+
+#endif /* _RTEMS_LIBIO_H */
diff --git a/c/src/lib/libc/malloc.c b/c/src/lib/libc/malloc.c
new file mode 100644
index 0000000000..580cb97da1
--- /dev/null
+++ b/c/src/lib/libc/malloc.c
@@ -0,0 +1,400 @@
+/*
+ * RTEMS Malloc Family Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "libcsupport.h"
+#ifdef RTEMS_NEWLIB
+#include <sys/reent.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h> /* sbrk(2) */
+
+rtems_id RTEMS_Malloc_Heap;
+size_t RTEMS_Malloc_Sbrk_amount;
+
+#ifdef RTEMS_DEBUG
+#define MALLOC_STATS
+#define MALLOC_DIRTY
+#endif
+
+#ifdef MALLOC_STATS
+#define MSBUMP(f,n) rtems_malloc_stats.f += (n)
+
+struct {
+ unsigned32 space_available; /* current size of malloc area */
+ unsigned32 malloc_calls; /* # calls to malloc */
+ unsigned32 free_calls;
+ unsigned32 realloc_calls;
+ unsigned32 calloc_calls;
+ unsigned32 max_depth; /* most ever malloc'd at 1 time */
+ unsigned64 lifetime_allocated;
+ unsigned64 lifetime_freed;
+} rtems_malloc_stats;
+
+#else /* No rtems_malloc_stats */
+#define MSBUMP(f,n)
+#endif
+
+void RTEMS_Malloc_Initialize(
+ void *start,
+ size_t length,
+ size_t sbrk_amount
+)
+{
+ rtems_status_code status;
+ void *starting_address;
+ rtems_unsigned32 old_address;
+ rtems_unsigned32 u32_address;
+
+ /*
+ * If the starting address is 0 then we are to attempt to
+ * get length worth of memory using sbrk. Make sure we
+ * align the address that we get back.
+ */
+
+ starting_address = start;
+ RTEMS_Malloc_Sbrk_amount = sbrk_amount;
+
+ if (!starting_address) {
+ u32_address = (unsigned int)sbrk(length);
+
+ if (u32_address == -1) {
+ rtems_fatal_error_occurred( RTEMS_NO_MEMORY );
+ /* DOES NOT RETURN!!! */
+ }
+
+ if (u32_address & (CPU_ALIGNMENT-1)) {
+ old_address = u32_address;
+ u32_address = (u32_address + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /*
+ * adjust the length by whatever we aligned by
+ */
+
+ length -= u32_address - old_address;
+ }
+
+ starting_address = (void *)u32_address;
+ }
+
+ /*
+ * Unfortunately we cannot use assert if this fails because if this
+ * has failed we do not have a heap and if we do not have a heap
+ * STDIO cannot work because there will be no buffers.
+ */
+
+ status = rtems_region_create(
+ rtems_build_name( 'H', 'E', 'A', 'P' ),
+ starting_address,
+ length,
+ CPU_ALIGNMENT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &RTEMS_Malloc_Heap
+ );
+ if ( status != RTEMS_SUCCESSFUL )
+ rtems_fatal_error_occurred( status );
+
+#ifdef MALLOC_STATS
+ /* zero all the stats */
+ (void) memset(&rtems_malloc_stats, 0, sizeof(rtems_malloc_stats));
+#endif
+
+ MSBUMP(space_available, length);
+}
+
+#ifdef RTEMS_NEWLIB
+void *malloc(
+ size_t size
+)
+{
+ void *return_this;
+ void *starting_address;
+ rtems_unsigned32 the_size;
+ rtems_unsigned32 sbrk_amount;
+ rtems_status_code status;
+
+ MSBUMP(malloc_calls, 1);
+
+ if ( !size )
+ return (void *) 0;
+
+ /*
+ * Try to give a segment in the current region if there is not
+ * enough space then try to grow the region using rtems_region_extend().
+ * If this fails then return a NULL pointer.
+ */
+
+ status = rtems_region_get_segment(
+ RTEMS_Malloc_Heap,
+ size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &return_this
+ );
+
+ if ( status != RTEMS_SUCCESSFUL ) {
+ /*
+ * Round to the "requested sbrk amount" so hopefully we won't have
+ * to grow again for a while. This effectively does sbrk() calls
+ * in "page" amounts.
+ */
+
+ sbrk_amount = RTEMS_Malloc_Sbrk_amount;
+
+ if ( sbrk_amount == 0 )
+ return (void *) 0;
+
+ the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
+
+ if (((rtems_unsigned32)starting_address = (void *)sbrk(the_size)) == -1)
+ return (void *) 0;
+
+ status = rtems_region_extend(
+ RTEMS_Malloc_Heap,
+ starting_address,
+ the_size
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ sbrk(-the_size);
+ errno = ENOMEM;
+ return (void *) 0;
+ }
+
+ MSBUMP(space_available, the_size);
+
+ status = rtems_region_get_segment(
+ RTEMS_Malloc_Heap,
+ size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &return_this
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = ENOMEM;
+ return (void *) 0;
+ }
+ }
+
+#ifdef MALLOC_STATS
+ if (return_this)
+ {
+ unsigned32 actual_size;
+ unsigned32 current_depth;
+ status = rtems_region_get_segment_size(RTEMS_Malloc_Heap, return_this, &actual_size);
+ MSBUMP(lifetime_allocated, actual_size);
+ current_depth = rtems_malloc_stats.lifetime_allocated - rtems_malloc_stats.lifetime_freed;
+ if (current_depth > rtems_malloc_stats.max_depth)
+ rtems_malloc_stats.max_depth = current_depth;
+ }
+#endif
+
+#ifdef MALLOC_DIRTY
+ (void) memset(return_this, 0xCF, size);
+#endif
+
+ return return_this;
+}
+
+void *calloc(
+ size_t nelem,
+ size_t elsize
+)
+{
+ register char *cptr;
+ int length;
+
+ MSBUMP(calloc_calls, 1);
+
+ length = nelem * elsize;
+ cptr = malloc( length );
+ if ( cptr )
+ memset( cptr, '\0', length );
+
+ MSBUMP(malloc_calls, -1); /* subtract off the malloc */
+
+ return cptr;
+}
+
+void *realloc(
+ void *ptr,
+ size_t size
+)
+{
+ rtems_unsigned32 old_size;
+ rtems_status_code status;
+ char *new_area;
+
+ MSBUMP(realloc_calls, 1);
+
+ if ( !ptr )
+ return malloc( size );
+
+ if ( !size ) {
+ free( ptr );
+ return (void *) 0;
+ }
+
+ new_area = malloc( size );
+
+ MSBUMP(malloc_calls, -1); /* subtract off the malloc */
+
+ if ( !new_area ) {
+ free( ptr );
+ return (void *) 0;
+ }
+
+ status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = EINVAL;
+ return (void *) 0;
+ }
+
+ memcpy( new_area, ptr, (size < old_size) ? size : old_size );
+ free( ptr );
+
+ return new_area;
+
+}
+
+void free(
+ void *ptr
+)
+{
+ rtems_status_code status;
+
+ MSBUMP(free_calls, 1);
+
+ if ( !ptr )
+ return;
+
+#ifdef MALLOC_STATS
+ {
+ unsigned32 size;
+ status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &size );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ MSBUMP(lifetime_freed, size);
+ }
+ }
+#endif
+
+ status = rtems_region_return_segment( RTEMS_Malloc_Heap, ptr );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = EINVAL;
+ assert( 0 );
+ }
+}
+/* end if RTEMS_NEWLIB */
+#endif
+
+#ifdef MALLOC_STATS
+/*
+ * Dump the malloc statistics
+ * May be called via atexit() (installable by our bsp) or
+ * at any time by user
+ */
+
+void malloc_dump(void)
+{
+ unsigned32 allocated = rtems_malloc_stats.lifetime_allocated - rtems_malloc_stats.lifetime_freed;
+
+ printf("Malloc stats\n");
+ printf(" avail:%uk allocated:%uk (%d%%) max:%uk (%d%%) lifetime:%Luk freed:%Luk\n",
+ (unsigned int) rtems_malloc_stats.space_available / 1024,
+ (unsigned int) allocated / 1024,
+ /* avoid float! */
+ (allocated * 100) / rtems_malloc_stats.space_available,
+ (unsigned int) rtems_malloc_stats.max_depth / 1024,
+ (rtems_malloc_stats.max_depth * 100) / rtems_malloc_stats.space_available,
+ (unsigned64) rtems_malloc_stats.lifetime_allocated / 1024,
+ (unsigned64) rtems_malloc_stats.lifetime_freed / 1024);
+ printf(" Call counts: malloc:%d free:%d realloc:%d calloc:%d\n",
+ rtems_malloc_stats.malloc_calls,
+ rtems_malloc_stats.free_calls,
+ rtems_malloc_stats.realloc_calls,
+ rtems_malloc_stats.calloc_calls);
+}
+
+
+void malloc_walk(size_t source, size_t printf_enabled)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+
+ the_region = _Region_Get( RTEMS_Malloc_Heap, &location );
+ if ( location == OBJECTS_LOCAL )
+ {
+ _Heap_Walk( &the_region->Memory, source, printf_enabled );
+ _Thread_Enable_dispatch();
+ }
+}
+
+#else
+
+void malloc_dump(void)
+{
+ return;
+}
+
+void malloc_walk(size_t source, size_t printf_enabled)
+{
+ return;
+}
+
+#endif
+
+/*
+ * "Reentrant" versions of the above routines implemented above.
+ */
+
+#ifdef RTEMS_NEWLIB
+void *malloc_r(
+ struct _reent *ignored,
+ size_t size
+)
+{
+ return malloc( size );
+}
+
+void *calloc_r(
+ size_t nelem,
+ size_t elsize
+)
+{
+ return calloc( nelem, elsize );
+}
+
+void *realloc_r(
+ void *ptr,
+ size_t size
+)
+{
+ return realloc_r( ptr, size );
+}
+
+void free_r(
+ void *ptr
+)
+{
+ free( ptr );
+}
+#endif
+
diff --git a/c/src/lib/libc/newlibc.c b/c/src/lib/libc/newlibc.c
new file mode 100644
index 0000000000..ac8b146a48
--- /dev/null
+++ b/c/src/lib/libc/newlibc.c
@@ -0,0 +1,430 @@
+
+/*
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Description:
+ * Implementation of hooks for the CYGNUS newlib libc
+ * These hooks set things up so that:
+ * '_REENT' is switched at task switch time.
+ *
+ *
+ * TODO:
+ *
+ * NOTE:
+ *
+ * $Id$
+ *
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#if defined(RTEMS_NEWLIB)
+#include <libcsupport.h>
+#include <stdlib.h> /* for free() */
+#include <string.h> /* for memset() */
+
+#include <sys/reent.h> /* for extern of _REENT (aka _impure_ptr) */
+#include <errno.h>
+
+/*
+ * NOTE: When using RTEMS fake stat, fstat, and isatty, all output
+ * is line buffered so this setvbuf is not necessary. This
+ * setvbuf insures that we can redirect the output of a test
+ * on the UNIX simulator and it is in the same order as for a
+ * real target.
+ * NOTE:
+ * There is some problem with doing this on the hpux version
+ * of the UNIX simulator (symptom is printf core dumps), so
+ * we just don't for now.
+ * Not sure if this is a problem with hpux, newlib, or something else.
+ */
+
+#if defined(RTEMS_UNIX) && !defined(hpux)
+#define NEED_SETVBUF
+#endif
+
+#ifdef NEED_SETVBUF
+#include <stdio.h>
+#endif
+
+#include "internal.h"
+
+#define LIBC_NOTEPAD RTEMS_NOTEPAD_LAST
+
+
+int libc_reentrant; /* do we think we are reentrant? */
+struct _reent libc_global_reent = _REENT_INIT(libc_global_reent);
+
+/*
+ * CYGNUS newlib routine that does atexit() processing and flushes
+ * stdio streams
+ * undocumented
+ */
+
+extern void _wrapup_reent(struct _reent *);
+extern void _reclaim_reent(struct _reent *);
+
+void
+libc_wrapup(void)
+{
+ /*
+ * In case RTEMS is already down, don't do this. It could be
+ * dangerous.
+ */
+
+ if (!_System_state_Is_up(_System_state_Get()))
+ return;
+
+ _wrapup_reent(0);
+ if (_REENT != &libc_global_reent)
+ {
+ _wrapup_reent(&libc_global_reent);
+#if 0
+ /* don't reclaim this one, just in case we do printfs */
+ /* on our way out to ROM */
+ _reclaim_reent(&libc_global_reent);
+#endif
+ _REENT = &libc_global_reent;
+ }
+}
+
+
+rtems_boolean
+libc_create_hook(rtems_tcb *current_task,
+ rtems_tcb *creating_task)
+{
+ MY_task_set_note(creating_task, LIBC_NOTEPAD, 0);
+ return TRUE;
+}
+
+/*
+ * Called for all user TASKS (system tasks are MPCI Receive Server and IDLE)
+ */
+
+rtems_extension
+libc_start_hook(rtems_tcb *current_task,
+ rtems_tcb *starting_task)
+{
+ struct _reent *ptr;
+
+ /* NOTE: our malloc is reentrant without a reent ptr since
+ * it is based on region manager
+ */
+
+ ptr = (struct _reent *) calloc(1, sizeof(struct _reent));
+
+ if (!ptr)
+ rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
+
+#ifdef __GNUC__
+ /* GCC extension: structure constants */
+ *ptr = (struct _reent) _REENT_INIT((*ptr));
+#else
+ /*
+ * Warning: THIS IS VERY DEPENDENT ON NEWLIB!!! WRITTEN FOR 1.7.0
+ */
+ ptr->_errno=0;
+ ptr->_stdin=&ptr->__sf[0];
+ ptr->_stdout=&ptr->__sf[1];
+ ptr->_stderr=&ptr->__sf[2];
+ ptr->_scanpoint=0;
+ ptr->_asctime[0]=0;
+ ptr->_next=1;
+ ptr->__sdidinit=0;
+#endif
+
+ MY_task_set_note(starting_task, LIBC_NOTEPAD, (rtems_unsigned32) ptr);
+}
+
+/*
+ * Called for all user TASKS (system tasks are MPCI Receive Server and IDLE)
+ *
+ * NOTE: When using RTEMS fake stat, fstat, and isatty, all output
+ * is line buffered so this setvbuf is not necessary. This
+ * setvbuf insures that we can redirect the output of a test
+ * on the UNIX simulator and it is in the same order as for a
+ * real target.
+ */
+
+#ifdef NEED_SETVBUF
+rtems_extension
+libc_begin_hook(rtems_tcb *current_task)
+{
+ setvbuf( stdout, NULL, _IOLBF, BUFSIZ );
+}
+#endif
+
+rtems_extension
+libc_switch_hook(rtems_tcb *current_task,
+ rtems_tcb *heir_task)
+{
+ rtems_unsigned32 impure_value;
+
+ /* XXX We can't use rtems_task_set_note() here since SYSI task has a
+ * tid of 0, which is treated specially (optimized, actually)
+ * by rtems_task_set_note
+ *
+ * NOTE: The above comment is no longer true and we need to use
+ * the extension data areas added about the same time.
+ */
+
+ /*
+ * Don't touch the outgoing task if it has been deleted.
+ */
+
+ if ( !_States_Is_transient( current_task->current_state ) ) {
+ impure_value = (rtems_unsigned32) _REENT;
+ MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value);
+ }
+
+ _REENT = (struct _reent *) MY_task_get_note(heir_task, LIBC_NOTEPAD);
+
+}
+
+/*
+ * Function: libc_delete_hook
+ * Created: 94/12/10
+ *
+ * Description:
+ * Called when a task is deleted.
+ * Must restore the new lib reentrancy state for the new current
+ * task.
+ *
+ * Parameters:
+ *
+ *
+ * Returns:
+ *
+ *
+ * Side Effects:
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+rtems_extension
+libc_delete_hook(rtems_tcb *current_task,
+ rtems_tcb *deleted_task)
+{
+ struct _reent *ptr;
+
+ /*
+ * The reentrancy structure was allocated by newlib using malloc()
+ */
+
+ if (current_task == deleted_task)
+ {
+ ptr = _REENT;
+ }
+ else
+ {
+ ptr = (struct _reent *) MY_task_get_note(deleted_task, LIBC_NOTEPAD);
+ }
+
+ /* if (ptr) */
+ if (ptr && ptr != &libc_global_reent)
+ {
+ _wrapup_reent(ptr);
+ _reclaim_reent(ptr);
+ free(ptr);
+ }
+
+ MY_task_set_note(deleted_task, LIBC_NOTEPAD, 0);
+
+ /*
+ * Require the switch back to another task to install its own
+ */
+
+ if (current_task == deleted_task)
+ {
+ _REENT = 0;
+ }
+}
+
+/*
+ * Function: libc_init
+ * Created: 94/12/10
+ *
+ * Description:
+ * Init libc for CYGNUS newlib
+ * Set up _REENT to use our global libc_global_reent.
+ * (newlib provides a global of its own, but we prefer our
+ * own name for it)
+ *
+ * If reentrancy is desired (which it should be), then
+ * we install the task extension hooks to maintain the
+ * newlib reentrancy global variable _REENT on task
+ * create, delete, switch, exit, etc.
+ *
+ * Parameters:
+ * reentrant non-zero if reentrant library desired.
+ *
+ * Returns:
+ *
+ * Side Effects:
+ * installs libc extensions if reentrant.
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ */
+
+void
+libc_init(int reentrant)
+{
+ rtems_extensions_table libc_extension;
+ rtems_id extension_id;
+ rtems_status_code rc;
+
+ _REENT = &libc_global_reent;
+
+ if (reentrant)
+ {
+ memset(&libc_extension, 0, sizeof(libc_extension));
+
+ libc_extension.thread_create = libc_create_hook;
+ libc_extension.thread_start = libc_start_hook;
+#ifdef NEED_SETVBUF
+ libc_extension.thread_begin = libc_begin_hook;
+#endif
+ 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);
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+
+ libc_reentrant = reentrant;
+ }
+}
+
+#if 0
+/*
+ * Routines required by the gnat runtime.
+ */
+
+int get_errno()
+{
+ return errno;
+}
+#endif
+
+/*
+ * Function: _exit
+ * Created: 94/12/10
+ *
+ * Description:
+ * Called from exit() after it does atexit() processing and stdio fflush's
+ *
+ * called from bottom of exit() to really delete the task.
+ * If we are using reentrant libc, then let the delete extension
+ * do all the work, otherwise if a shutdown is in progress,
+ * then just do it.
+ *
+ * Parameters:
+ * exit status
+ *
+ * Returns:
+ * does not return
+ *
+ * Side Effects:
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+#include <stdio.h>
+
+/* #if !defined(RTEMS_UNIX) && !defined(__GO32__) && !defined(_AM29K) */
+#if !defined(RTEMS_UNIX) && !defined(_AM29K)
+void _exit(int status)
+{
+ rtems_shutdown_executive(status);
+}
+
+#else
+
+void exit(int status)
+{
+ libc_wrapup();
+ rtems_shutdown_executive(status);
+}
+#endif
+
+
+/*
+ * These are directly supported (and completely correct) in the posix api.
+ */
+
+#if !defined(RTEMS_POSIX_API)
+pid_t __getpid(void)
+{
+ return 0;
+}
+#endif
+
+/* #if !defined(RTEMS_POSIX_API) || defined(__GO32__) */
+#if !defined(RTEMS_POSIX_API)
+pid_t getpid(void)
+{
+ return __getpid();
+}
+#endif
+
+/* #if !defined(RTEMS_POSIX_API) || defined(__GO32__) */
+#if !defined(RTEMS_POSIX_API)
+int kill( pid_t pid, int sig )
+{
+ return 0;
+}
+#endif
+
+int __kill( pid_t pid, int sig )
+{
+ return 0;
+}
+
+#if !defined(RTEMS_POSIX_API)
+unsigned int sleep(
+ unsigned int seconds
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks_per_second;
+ rtems_interval ticks;
+
+ status = rtems_clock_get(
+ RTEMS_CLOCK_GET_TICKS_PER_SECOND,
+ &ticks_per_second
+ );
+
+ ticks = seconds * ticks_per_second;
+
+ status = rtems_task_wake_after( ticks );
+
+ /*
+ * Returns the "unslept" amount of time. In RTEMS signals are not
+ * interruptable, so tasks really sleep all of the requested time.
+ */
+
+ return 0;
+}
+#endif
+
+
+#endif
diff --git a/c/src/lib/libc/newlibif.c b/c/src/lib/libc/newlibif.c
new file mode 100644
index 0000000000..5b59554428
--- /dev/null
+++ b/c/src/lib/libc/newlibif.c
@@ -0,0 +1,90 @@
+
+/*
+ * This file contains the glue which maps newlib system calls onto their
+ * RTEMS implementations. This formerly was in the file
+ * libgloss/rtems/iface.c which was installed as rtems.o. Merging this
+ * into the RTEMS source tree minimizes the files which must be linked
+ * to build an rtems application.
+ *
+ * $Id$
+ *
+ */
+
+#include <rtems.h>
+#if defined(RTEMS_NEWLIB)
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "internal.h"
+#include "libio.h"
+
+int
+read(int fd,
+ char *buf,
+ int nbytes)
+{
+ return __rtems_read(fd, buf, nbytes);
+}
+
+int
+write(int fd,
+ char *buf,
+ int nbytes)
+{
+ return __rtems_write(fd, buf, nbytes);
+}
+
+int
+open(char *buf,
+ int flags,
+ int mode)
+{
+ return __rtems_open(buf, flags, mode);
+}
+
+int
+close(int fd)
+{
+ return __rtems_close(fd);
+}
+
+/*
+ * isatty -- returns 1 if connected to a terminal device,
+ * returns 0 if not.
+ */
+int
+isatty(int fd)
+{
+ return __rtems_isatty(fd);
+}
+
+/*
+ * lseek -- move read/write pointer. Since a serial port
+ * is non-seekable, we return an error.
+ */
+off_t
+lseek(int fd,
+ off_t offset,
+ int whence)
+{
+ return __rtems_lseek(fd, offset, whence);
+}
+
+/*
+ * fstat -- get status of a file. Since we have no file
+ * system, we just return an error.
+ */
+int
+fstat(int fd,
+ struct stat *buf)
+{
+ return __rtems_fstat(fd, buf);
+}
+
+/*
+ * getpid and kill are provided directly by rtems
+ */
+
+#endif
diff --git a/c/src/lib/libc/no_libc.c b/c/src/lib/libc/no_libc.c
new file mode 100644
index 0000000000..19c9ac836d
--- /dev/null
+++ b/c/src/lib/libc/no_libc.c
@@ -0,0 +1,55 @@
+
+/* no_libc.h
+ *
+ * This file contains stubs for the reentrancy hooks when
+ * an unknown C library is used.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#if !defined(RTEMS_NEWLIB) && !defined(RTEMS_UNIX)
+
+#include "libcsupport.h"
+#include "internal.h"
+
+#include <stdlib.h> /* for free() */
+
+void
+libc_init(int reentrant)
+{
+}
+
+void libc_suspend_main(void)
+{
+}
+
+
+void libc_global_exit(rtems_unsigned32 code)
+{
+}
+
+void _exit(int status)
+{
+}
+
+#else
+
+/* remove ANSI errors.
+ * A program must contain at least one external-declaration
+ * (X3.159-1989 p.82,L3).
+ */
+void no_libc_dummy_function( void )
+{
+}
+
+#endif
diff --git a/c/src/lib/libc/support.c b/c/src/lib/libc/support.c
new file mode 100644
index 0000000000..4a33bd4086
--- /dev/null
+++ b/c/src/lib/libc/support.c
@@ -0,0 +1,52 @@
+/*
+ * Routines to Access Internal RTEMS Resources
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+#include <rtems.h>
+
+void MY_task_set_note(
+ Thread_Control *the_thread,
+ unsigned32 notepad,
+ unsigned32 note
+)
+{
+ RTEMS_API_Control *api;
+
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+
+ if ( api )
+ api->Notepads[ notepad ] = note;
+}
+
+
+unsigned32 MY_task_get_note(
+ Thread_Control *the_thread,
+ unsigned32 notepad
+)
+{
+ RTEMS_API_Control *api;
+
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+
+ return api->Notepads[ notepad ];
+}
+
+void *MY_CPU_Context_FP_start(
+ void *base,
+ unsigned32 offset
+)
+{
+ return _CPU_Context_Fp_start( base, offset );
+}
+
diff --git a/c/src/lib/libc/syscalls.c b/c/src/lib/libc/syscalls.c
new file mode 100644
index 0000000000..d324cfc5f0
--- /dev/null
+++ b/c/src/lib/libc/syscalls.c
@@ -0,0 +1,102 @@
+/*
+ * RTEMS Fake System Calls
+ *
+ * This file contains "fake" versions of the system call routines
+ * which are reference by many libc implementations. Once a routine
+ * has been implemented in terms of RTEMS services, it should be
+ * taken out of this file.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <stdio.h> /* only for puts */
+
+#include <rtems.h>
+
+#ifdef RTEMS_NEWLIB
+/*
+ * fstat, stat, and isatty must lie consistently and report that everything
+ * is a tty or stdout will not be line buffered.
+ */
+
+int __rtems_fstat(int _fd, struct stat* _sbuf)
+{
+ if ( _fd > 2 ) {
+ puts( "__rtems_fstat -- only stdio supported" );
+ assert( 0 );
+ }
+ _sbuf->st_mode = S_IFCHR;
+#ifdef HAVE_BLKSIZE
+ _sbuf->st_blksize = 0;
+#endif
+ return 0;
+}
+
+int __rtems_isatty(int _fd)
+{
+ return 1;
+}
+
+#if !defined(RTEMS_UNIX)
+int stat( const char *path, struct stat *buf )
+{
+ if ( strncmp( "/dev/", path, 5 ) ) {
+ return -1;
+ }
+ return __rtems_fstat( 0, buf );
+}
+
+int link( const char *existing, const char *new )
+{
+ /* always fail */
+ return -1;
+}
+
+int unlink( const char *path )
+{
+ /* always fail */
+ return -1;
+}
+
+char *getcwd( char *_buf, size_t _size)
+{
+
+/* assert( FALSE ); */
+ errno = ENOSYS;
+ return 0;
+}
+int fork() {
+ puts( "fork -- not supported!!!" );
+ assert( 0 );
+ errno = ENOSYS;
+ return -1;
+}
+int execv(const char *_path, char * const _argv[] ) {
+ puts( "execv -- not supported!!!" );
+ assert( 0 );
+ errno = ENOSYS;
+ return -1;
+}
+int wait() {
+ puts( "wait -- not supported!!!" );
+ assert( 0 );
+ errno = ENOSYS;
+ return -1;
+}
+#endif
+
+#endif
diff --git a/c/src/lib/libc/unixlibc.c b/c/src/lib/libc/unixlibc.c
new file mode 100644
index 0000000000..3e757e313d
--- /dev/null
+++ b/c/src/lib/libc/unixlibc.c
@@ -0,0 +1,23 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#if defined(RTEMS_UNIXLIB)
+
+void libc_init(int reentrant)
+{
+}
+
+#else
+
+/* remove ANSI errors.
+ * A program must contain at least one external-declaration
+ * (X3.159-1989 p.82,L3).
+ */
+void unixlibc_dummy_function( void )
+{
+}
+
+#endif
diff --git a/c/src/lib/libc/utsname.c b/c/src/lib/libc/utsname.c
new file mode 100644
index 0000000000..7fba3d610f
--- /dev/null
+++ b/c/src/lib/libc/utsname.c
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <sys/utsname.h>
+
+#include <rtems/system.h>
+#include <rtems/score/system.h>
+#include <rtems/score/object.h>
+
+/*PAGE
+ *
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+)
+{
+ /* XXX: Here is what Solaris returns...
+ sysname = SunOS
+ nodename = node_name
+ release = 5.3
+ version = Generic_101318-12
+ machine = sun4m
+ */
+
+ strcpy( name->sysname, "RTEMS" );
+
+ sprintf( name->nodename, "Node %d\n", _Objects_Local_node );
+
+ /* XXX release string is in BAD format for this routine!!! */
+ strcpy( name->release, "3.2.0" );
+
+ /* XXX does this have any meaning for RTEMS */
+
+ strcpy( name->release, "" );
+
+ sprintf( name->machine, "%s/%s", CPU_NAME, CPU_MODEL_NAME );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/c/src/lib/libcpu/Makefile.in b/c/src/lib/libcpu/Makefile.in
new file mode 100644
index 0000000000..db59fa1142
--- /dev/null
+++ b/c/src/lib/libcpu/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=$(wildcard $(RTEMS_CPU))
diff --git a/c/src/lib/libcpu/README b/c/src/lib/libcpu/README
new file mode 100644
index 0000000000..e7e293660c
--- /dev/null
+++ b/c/src/lib/libcpu/README
@@ -0,0 +1,14 @@
+#
+# $Id$
+#
+
+This is the README file for libcpu.
+
+This directory contains reusable libraries which are CPU dependent but not
+target board dependent. For example, the HPPA has an on chip interval timer
+which may be used by all HPPA bsp's.
+
+Another example might be the Intel i960CA has on-chip DMA which could be
+supported in a library and placed in lib/libcpu/i960. This level of support
+will make it easier for others developing embedded applications on a given
+CPU.
diff --git a/c/src/lib/libcpu/hppa1.1/Makefile.in b/c/src/lib/libcpu/hppa1.1/Makefile.in
new file mode 100644
index 0000000000..387b84ad61
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=include milli runway clock timer semaphore
diff --git a/c/src/lib/libcpu/hppa1.1/clock/Makefile.in b/c/src/lib/libcpu/hppa1.1/clock/Makefile.in
new file mode 100644
index 0000000000..20bef5121e
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/clock/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=clock
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# libbsp/hppa/BSP/wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/hppa1.1/clock/clock.c b/c/src/lib/libcpu/hppa1.1/clock/clock.c
new file mode 100644
index 0000000000..ff3260a269
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/clock/clock.c
@@ -0,0 +1,267 @@
+/* Clock
+ *
+ * This routine initializes the interval timer on the
+ * PA-RISC CPU. The tick frequency is specified by the bsp.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/libio.h>
+
+/* should get this from bsp.h, but it is not installed yet */
+rtems_isr_entry set_vector(rtems_isr_entry, rtems_vector_number, int);
+extern rtems_configuration_table BSP_Configuration;
+
+#include <stdlib.h> /* for atexit() */
+
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+typedef unsigned long long hppa_click_count_t;
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * CPU_HPPA_CLICKS_PER_TICK is either a #define or an rtems_unsigned32
+ * allocated and set by bsp_start()
+ */
+
+#ifndef CPU_HPPA_CLICKS_PER_TICK
+extern rtems_unsigned32 CPU_HPPA_CLICKS_PER_TICK;
+#endif
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+rtems_unsigned32 most_recent_itimer_value;
+
+rtems_unsigned64 Clock_clicks; /* running total of cycles */
+
+rtems_unsigned32 Clock_clicks_interrupt;
+
+void Clock_exit(void);
+
+void
+ReInstall_clock(rtems_isr_entry new_clock_isr)
+{
+ rtems_unsigned32 isrlevel = 0;
+
+ rtems_interrupt_disable(isrlevel);
+ (void) set_vector(
+ new_clock_isr,
+ HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER,
+ 1
+ );
+ rtems_interrupt_enable(isrlevel);
+}
+
+/*
+ * read itimer and update Clock_clicks as appropriate
+ */
+
+rtems_unsigned32
+Clock_read_itimer()
+{
+ rtems_unsigned32 isrlevel;
+ rtems_unsigned32 itimer_value;
+ rtems_unsigned32 wrap_count;
+ rtems_unsigned32 recent_count;
+
+ rtems_interrupt_disable(isrlevel);
+
+ wrap_count = (Clock_clicks & 0xFFFFFFFF00000000ULL) >> 32;
+ recent_count = (rtems_unsigned32) Clock_clicks;
+
+ itimer_value = get_itimer();
+
+ if (itimer_value < recent_count)
+ wrap_count++;
+ Clock_clicks = (((rtems_unsigned64) wrap_count) << 32) + itimer_value;
+
+ rtems_interrupt_enable(isrlevel);
+
+ return itimer_value;
+}
+
+
+void Install_clock(rtems_isr_entry clock_isr)
+{
+ Clock_driver_ticks = 0;
+ Clock_clicks_interrupt = 0;
+ Clock_clicks = 0;
+
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ if (BSP_Configuration.ticks_per_timeslice)
+ {
+ /*
+ * initialize the interval here
+ * First tick is set to right amount of time in the future
+ * Future ticks will be incremented over last value set
+ * in order to provide consistent clicks in the face of
+ * interrupt overhead
+ */
+
+ Clock_clicks_interrupt = Clock_read_itimer() + CPU_HPPA_CLICKS_PER_TICK;
+ set_itimer((rtems_unsigned32) Clock_clicks_interrupt);
+
+ (void) set_vector(clock_isr, HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER, 1);
+ }
+ atexit(Clock_exit);
+}
+
+rtems_isr
+Clock_isr(rtems_vector_number vector)
+{
+ rtems_unsigned32 clicks_til_next_interrupt;
+ rtems_unsigned32 itimer_value;
+
+ /*
+ * setup for next interrupt; making sure the new value is reasonably
+ * in the future.... in case we lost out on an interrupt somehow
+ */
+
+ itimer_value = Clock_read_itimer();
+ Clock_clicks_interrupt += CPU_HPPA_CLICKS_PER_TICK;
+
+ /*
+ * how far away is next interrupt *really*
+ * It may be a long time; this subtraction works even if
+ * Clock_clicks_interrupt < Clock_clicks_low_order via
+ * the miracle of unsigned math.
+ */
+ clicks_til_next_interrupt = Clock_clicks_interrupt - itimer_value;
+
+ /*
+ * If it is too soon then bump it up.
+ * This should only happen if CPU_HPPA_CLICKS_PER_TICK is too small.
+ * But setting it low is useful for debug, so...
+ */
+
+ if (clicks_til_next_interrupt < 400)
+ {
+ Clock_clicks_interrupt = itimer_value + 1000;
+ /* XXX: count these! this should be rare */
+ }
+
+ /*
+ * If it is too late, that means we missed the interrupt somehow.
+ * Rather than wait 35-50s for a wrap, we just fudge it here.
+ */
+
+ if (clicks_til_next_interrupt > CPU_HPPA_CLICKS_PER_TICK)
+ {
+ Clock_clicks_interrupt = itimer_value + 1000;
+ /* XXX: count these! this should never happen :-) */
+ }
+
+ set_itimer((rtems_unsigned32) Clock_clicks_interrupt);
+
+ Clock_driver_ticks++;
+
+ if (Clock_isrs == 1)
+ {
+ rtems_clock_tick();
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 10000;
+ if (Clock_isrs == 0)
+ Clock_isrs = 1;
+ }
+ else
+ Clock_isrs--;
+}
+
+/*
+ * Called via atexit()
+ * Remove the clock interrupt handler by setting handler to NULL
+ */
+
+void
+Clock_exit(void)
+{
+ if ( BSP_Configuration.ticks_per_timeslice )
+ {
+ (void) set_vector(0, HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER, 1);
+ }
+}
+
+/*
+ * spin delay for specified number of microseconds
+ * used by RTEMS delay macro
+ */
+
+void
+Clock_delay(rtems_unsigned32 microseconds)
+{
+ rtems_unsigned64 future_time;
+
+ (void) Clock_read_itimer();
+ future_time = Clock_clicks +
+ ((rtems_unsigned64) microseconds) *
+ Cpu_table.itimer_clicks_per_microsecond;
+
+ for (;;)
+ {
+ (void) Clock_read_itimer();
+ if (future_time <= Clock_clicks)
+ break;
+ }
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock(Clock_isr);
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ ReInstall_clock(args->buffer);
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libcpu/hppa1.1/include/Makefile.in b/c/src/lib/libcpu/hppa1.1/include/Makefile.in
new file mode 100644
index 0000000000..177394bdba
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/include/Makefile.in
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# Install any include files needed by libcpu.
+# Mainly this just means bsp.h which would normally be installed
+# after libcpu is built.
+# This is a bit of a hack.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+all: FORCEIT
+ cd ../../../libbsp/$(RTEMS_CPU)/$(RTEMS_BSP)/include; $(MAKE) all
+
+
diff --git a/c/src/lib/libcpu/hppa1.1/milli/Makefile.in b/c/src/lib/libcpu/hppa1.1/milli/Makefile.in
new file mode 100644
index 0000000000..414e8fac8a
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/milli/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/milli.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=milli
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# libbsp/hppa/BSP/wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/hppa1.1/milli/milli.s b/c/src/lib/libcpu/hppa1.1/milli/milli.s
new file mode 100644
index 0000000000..85aaa08d88
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/milli/milli.s
@@ -0,0 +1,1998 @@
+;
+; (c) Copyright 1986 HEWLETT-PACKARD COMPANY
+;
+; To anyone who acknowledges that this file is provided "AS IS"
+; without any express or implied warranty:
+; permission to use, copy, modify, and distribute this file
+; for any purpose is hereby granted without fee, provided that
+; the above copyright notice and this notice appears in all
+; copies, and that the name of Hewlett-Packard Company not be
+; used in advertising or publicity pertaining to distribution
+; of the software without specific, written prior permission.
+; Hewlett-Packard Company makes no representations about the
+; suitability of this software for any purpose.
+;
+
+; Standard Hardware Register Definitions for Use with Assembler
+; version A.08.06
+; - fr16-31 added at Utah
+;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+; Hardware General Registers
+r0: .equ 0
+
+r1: .equ 1
+
+r2: .equ 2
+
+r3: .equ 3
+
+r4: .equ 4
+
+r5: .equ 5
+
+r6: .equ 6
+
+r7: .equ 7
+
+r8: .equ 8
+
+r9: .equ 9
+
+r10: .equ 10
+
+r11: .equ 11
+
+r12: .equ 12
+
+r13: .equ 13
+
+r14: .equ 14
+
+r15: .equ 15
+
+r16: .equ 16
+
+r17: .equ 17
+
+r18: .equ 18
+
+r19: .equ 19
+
+r20: .equ 20
+
+r21: .equ 21
+
+r22: .equ 22
+
+r23: .equ 23
+
+r24: .equ 24
+
+r25: .equ 25
+
+r26: .equ 26
+
+r27: .equ 27
+
+r28: .equ 28
+
+r29: .equ 29
+
+r30: .equ 30
+
+r31: .equ 31
+
+; Hardware Space Registers
+sr0: .equ 0
+
+sr1: .equ 1
+
+sr2: .equ 2
+
+sr3: .equ 3
+
+sr4: .equ 4
+
+sr5: .equ 5
+
+sr6: .equ 6
+
+sr7: .equ 7
+
+; Hardware Floating Point Registers
+fr0: .equ 0
+
+fr1: .equ 1
+
+fr2: .equ 2
+
+fr3: .equ 3
+
+fr4: .equ 4
+
+fr5: .equ 5
+
+fr6: .equ 6
+
+fr7: .equ 7
+
+fr8: .equ 8
+
+fr9: .equ 9
+
+fr10: .equ 10
+
+fr11: .equ 11
+
+fr12: .equ 12
+
+fr13: .equ 13
+
+fr14: .equ 14
+
+fr15: .equ 15
+
+fr16: .equ 16
+
+fr17: .equ 17
+
+fr18: .equ 18
+
+fr19: .equ 19
+
+fr20: .equ 20
+
+fr21: .equ 21
+
+fr22: .equ 22
+
+fr23: .equ 23
+
+fr24: .equ 24
+
+fr25: .equ 25
+
+fr26: .equ 26
+
+fr27: .equ 27
+
+fr28: .equ 28
+
+fr29: .equ 29
+
+fr30: .equ 30
+
+fr31: .equ 31
+
+; Hardware Control Registers
+cr0: .equ 0
+
+rctr: .equ 0 ; Recovery Counter Register
+
+
+cr8: .equ 8 ; Protection ID 1
+
+pidr1: .equ 8
+
+
+cr9: .equ 9 ; Protection ID 2
+
+pidr2: .equ 9
+
+
+cr10: .equ 10
+
+ccr: .equ 10 ; Coprocessor Confiquration Register
+
+
+cr11: .equ 11
+
+sar: .equ 11 ; Shift Amount Register
+
+
+cr12: .equ 12
+
+pidr3: .equ 12 ; Protection ID 3
+
+
+cr13: .equ 13
+
+pidr4: .equ 13 ; Protection ID 4
+
+
+cr14: .equ 14
+
+iva: .equ 14 ; Interrupt Vector Address
+
+
+cr15: .equ 15
+
+eiem: .equ 15 ; External Interrupt Enable Mask
+
+
+cr16: .equ 16
+
+itmr: .equ 16 ; Interval Timer
+
+
+cr17: .equ 17
+
+pcsq: .equ 17 ; Program Counter Space queue
+
+
+cr18: .equ 18
+
+pcoq: .equ 18 ; Program Counter Offset queue
+
+
+cr19: .equ 19
+
+iir: .equ 19 ; Interruption Instruction Register
+
+
+cr20: .equ 20
+
+isr: .equ 20 ; Interruption Space Register
+
+
+cr21: .equ 21
+
+ior: .equ 21 ; Interruption Offset Register
+
+
+cr22: .equ 22
+
+ipsw: .equ 22 ; Interrpution Processor Status Word
+
+
+cr23: .equ 23
+
+eirr: .equ 23 ; External Interrupt Request
+
+
+cr24: .equ 24
+
+ppda: .equ 24 ; Physcial Page Directory Address
+
+tr0: .equ 24 ; Temporary register 0
+
+
+cr25: .equ 25
+
+hta: .equ 25 ; Hash Table Address
+
+tr1: .equ 25 ; Temporary register 1
+
+
+cr26: .equ 26
+
+tr2: .equ 26 ; Temporary register 2
+
+
+cr27: .equ 27
+
+tr3: .equ 27 ; Temporary register 3
+
+
+cr28: .equ 28
+
+tr4: .equ 28 ; Temporary register 4
+
+
+cr29: .equ 29
+
+tr5: .equ 29 ; Temporary register 5
+
+
+cr30: .equ 30
+
+tr6: .equ 30 ; Temporary register 6
+
+
+cr31: .equ 31
+
+tr7: .equ 31 ; Temporary register 7
+
+;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+; Procedure Call Convention ~
+; Register Definitions for Use with Assembler ~
+; version A.08.06
+;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+; Software Architecture General Registers
+rp: .equ r2 ; return pointer
+
+mrp: .equ r31 ; millicode return pointer
+
+ret0: .equ r28 ; return value
+
+ret1: .equ r29 ; return value (high part of double)
+
+sl: .equ r29 ; static link
+
+sp: .equ r30 ; stack pointer
+
+dp: .equ r27 ; data pointer
+
+arg0: .equ r26 ; argument
+
+arg1: .equ r25 ; argument or high part of double argument
+
+arg2: .equ r24 ; argument
+
+arg3: .equ r23 ; argument or high part of double argument
+
+;_____________________________________________________________________________
+; Software Architecture Space Registers
+; sr0 ; return link form BLE
+sret: .equ sr1 ; return value
+
+sarg: .equ sr1 ; argument
+
+; sr4 ; PC SPACE tracker
+; sr5 ; process private data
+;_____________________________________________________________________________
+; Software Architecture Pseudo Registers
+previous_sp: .equ 64 ; old stack pointer (locates previous frame)
+
+;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+; Standard space and subspace definitions. version A.08.06
+; These are generally suitable for programs on HP_UX and HPE.
+; Statements commented out are used when building such things as operating
+; system kernels.
+;;;;;;;;;;;;;;;;
+ .SPACE $TEXT$, SPNUM=0,SORT=8
+ .subspa $MILLICODE$, QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=8
+ .subspa $LIT$, QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=16
+ .subspa $CODE$, QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=24
+; Additional code subspaces should have ALIGN=8 for an interspace BV
+; and should have SORT=24.
+;
+; For an incomplete executable (program bound to shared libraries),
+; sort keys $GLOBAL$ -1 and $GLOBAL$ -2 are reserved for the $DLT$
+; and $PLT$ subspaces respectively.
+;;;;;;;;;;;;;;;
+ .SPACE $PRIVATE$, SPNUM=1,PRIVATE,SORT=16
+ .subspa $GLOBAL$, QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=40
+ .import $global$
+ .subspa $DATA$, QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=16
+ .subspa $BSS$, QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=82,ZERO
+
+ .SPACE $TEXT$
+ .SUBSPA $MILLICODE$
+
+ .align 8
+ .EXPORT $$remI,millicode
+; .IMPORT cerror
+$$remI:
+ .PROC
+ .CALLINFO millicode
+ .ENTRY
+ addit,= 0,arg1,r0
+ add,>= r0,arg0,ret1
+ sub r0,ret1,ret1
+ sub r0,arg1,r1
+ ds r0,r1,r0
+ or r0,r0,r1
+ add ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ ds r1,arg1,r1
+ addc ret1,ret1,ret1
+ movb,>=,n r1,ret1,remI300
+ add,< arg1,r0,r0
+ add,tr r1,arg1,ret1
+ sub r1,arg1,ret1
+remI300: add,>= arg0,r0,r0
+
+ sub r0,ret1,ret1
+ bv r0(r31)
+ nop
+ .EXIT
+ .PROCEND
+
+bit1: .equ 1
+
+bit30: .equ 30
+bit31: .equ 31
+
+len2: .equ 2
+
+len4: .equ 4
+
+
+$$dyncall:
+ .proc
+ .callinfo NO_CALLS
+ .entry
+ .export $$dyncall,MILLICODE
+
+ bb,>=,n 22,bit30,noshlibs
+
+ depi 0,bit31,len2,22
+ ldw 4(22),19
+ ldw 0(22),22
+noshlibs:
+ ldsid (22),r1
+ mtsp r1,sr0
+ be 0(sr0,r22)
+ stw rp,-24(sp)
+ .exit
+ .procend
+
+temp: .EQU r1
+
+retreg: .EQU ret1 ; r29
+
+
+ .export $$divU,millicode
+ .import $$divU_3,millicode
+ .import $$divU_5,millicode
+ .import $$divU_6,millicode
+ .import $$divU_7,millicode
+ .import $$divU_9,millicode
+ .import $$divU_10,millicode
+ .import $$divU_12,millicode
+ .import $$divU_14,millicode
+ .import $$divU_15,millicode
+$$divU:
+ .proc
+ .callinfo millicode
+ .entry
+; The subtract is not nullified since it does no harm and can be used
+; by the two cases that branch back to "normal".
+ comib,>= 15,arg1,special_divisor
+ sub r0,arg1,temp ; clear carry, negate the divisor
+ ds r0,temp,r0 ; set V-bit to 1
+normal:
+ add arg0,arg0,retreg ; shift msb bit into carry
+ ds r0,arg1,temp ; 1st divide step, if no carry
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 2nd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 3rd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 4th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 5th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 6th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 7th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 8th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 9th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 10th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 11th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 12th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 13th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 14th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 15th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 16th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 17th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 18th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 19th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 20th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 21st divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 22nd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 23rd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 24th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 25th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 26th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 27th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 28th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 29th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 30th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 31st divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 32nd divide step,
+ bv 0(r31)
+ addc retreg,retreg,retreg ; shift last retreg bit into retreg
+;_____________________________________________________________________________
+; handle the cases where divisor is a small constant or has high bit on
+special_divisor:
+ comib,> 0,arg1,big_divisor
+ nop
+ blr arg1,r0
+ nop
+zero_divisor: ; this label is here to provide external visibility
+
+ addit,= 0,arg1,0 ; trap for zero dvr
+ nop
+ bv 0(r31) ; divisor == 1
+ copy arg0,retreg
+ bv 0(r31) ; divisor == 2
+ extru arg0,30,31,retreg
+ b,n $$divU_3 ; divisor == 3
+ nop
+ bv 0(r31) ; divisor == 4
+ extru arg0,29,30,retreg
+ b,n $$divU_5 ; divisor == 5
+ nop
+ b,n $$divU_6 ; divisor == 6
+ nop
+ b,n $$divU_7 ; divisor == 7
+ nop
+ bv 0(r31) ; divisor == 8
+ extru arg0,28,29,retreg
+ b,n $$divU_9 ; divisor == 9
+ nop
+ b,n $$divU_10 ; divisor == 10
+ nop
+ b normal ; divisor == 11
+ ds r0,temp,r0 ; set V-bit to 1
+ b,n $$divU_12 ; divisor == 12
+ nop
+ b normal ; divisor == 13
+ ds r0,temp,r0 ; set V-bit to 1
+ b,n $$divU_14 ; divisor == 14
+ nop
+ b,n $$divU_15 ; divisor == 15
+ nop
+;_____________________________________________________________________________
+; Handle the case where the high bit is on in the divisor.
+; Compute: if( dividend>=divisor) quotient=1; else quotient=0;
+; Note: dividend>==divisor iff dividend-divisor does not borrow
+; and not borrow iff carry
+big_divisor:
+ sub arg0,arg1,r0
+ bv 0(r31)
+ addc r0,r0,retreg
+ .exit
+ .procend
+ .end
+
+t2: .EQU r1
+
+; x2 .EQU arg0 ; r26
+t1: .EQU arg1 ; r25
+
+; x1 .EQU ret1 ; r29
+;_____________________________________________________________________________
+
+$$divide_by_constant:
+ .PROC
+ .CALLINFO millicode
+ .entry
+
+
+ .export $$divide_by_constant,millicode
+; Provides a "nice" label for the code covered by the unwind descriptor
+; for things like gprof.
+
+
+
+
+
+
+
+
+
+$$divI_2:
+ .EXPORT $$divI_2,MILLICODE
+ COMCLR,>= arg0,0,0
+ ADDI 1,arg0,arg0
+ bv 0(r31)
+ EXTRS arg0,30,31,ret1
+
+
+
+$$divI_4:
+ .EXPORT $$divI_4,MILLICODE
+ COMCLR,>= arg0,0,0
+ ADDI 3,arg0,arg0
+ bv 0(r31)
+ EXTRS arg0,29,30,ret1
+
+
+
+$$divI_8:
+ .EXPORT $$divI_8,MILLICODE
+ COMCLR,>= arg0,0,0
+ ADDI 7,arg0,arg0
+ bv 0(r31)
+ EXTRS arg0,28,29,ret1
+
+
+$$divI_16:
+ .EXPORT $$divI_16,MILLICODE
+ COMCLR,>= arg0,0,0
+ ADDI 15,arg0,arg0
+ bv 0(r31)
+ EXTRS arg0,27,28,ret1
+
+
+
+
+
+
+
+
+
+
+
+$$divI_3:
+ .EXPORT $$divI_3,MILLICODE
+ COMB,<,N arg0,0,$neg3
+
+ ADDI 1,arg0,arg0
+ EXTRU arg0,1,2,ret1
+ SH2ADD arg0,arg0,arg0
+ B $pos
+ ADDC ret1,0,ret1
+
+$neg3:
+ SUBI 1,arg0,arg0
+ EXTRU arg0,1,2,ret1
+ SH2ADD arg0,arg0,arg0
+ B $neg
+ ADDC ret1,0,ret1
+
+$$divU_3:
+ .EXPORT $$divU_3,MILLICODE
+ ADDI 1,arg0,arg0
+ ADDC 0,0,ret1
+ SHD ret1,arg0,30,t1
+ SH2ADD arg0,arg0,arg0
+ B $pos
+ ADDC ret1,t1,ret1
+
+
+
+$$divI_5:
+ .EXPORT $$divI_5,MILLICODE
+ COMB,<,N arg0,0,$neg5
+ ADDI 3,arg0,t1
+ SH1ADD arg0,t1,arg0
+ B $pos
+ ADDC 0,0,ret1
+
+$neg5:
+ SUB 0,arg0,arg0
+ ADDI 1,arg0,arg0
+ SHD 0,arg0,31,ret1
+ SH1ADD arg0,arg0,arg0
+ B $neg
+ ADDC ret1,0,ret1
+
+$$divU_5:
+ .EXPORT $$divU_5,MILLICODE
+ ADDI 1,arg0,arg0
+ ADDC 0,0,ret1
+ SHD ret1,arg0,31,t1
+ SH1ADD arg0,arg0,arg0
+ B $pos
+ ADDC t1,ret1,ret1
+
+
+$$divI_6:
+ .EXPORT $$divI_6,MILLICODE
+ COMB,<,N arg0,0,$neg6
+ EXTRU arg0,30,31,arg0
+ ADDI 5,arg0,t1
+ SH2ADD arg0,t1,arg0
+ B $pos
+ ADDC 0,0,ret1
+
+$neg6:
+ SUBI 2,arg0,arg0
+
+
+ EXTRU arg0,30,31,arg0
+ SHD 0,arg0,30,ret1
+ SH2ADD arg0,arg0,arg0
+ B $neg
+ ADDC ret1,0,ret1
+
+$$divU_6:
+ .EXPORT $$divU_6,MILLICODE
+ EXTRU arg0,30,31,arg0
+ ADDI 1,arg0,arg0
+ SHD 0,arg0,30,ret1
+ SH2ADD arg0,arg0,arg0
+ B $pos
+ ADDC ret1,0,ret1
+
+
+$$divU_10:
+ .EXPORT $$divU_10,MILLICODE
+ EXTRU arg0,30,31,arg0
+ ADDI 3,arg0,t1
+ SH1ADD arg0,t1,arg0
+ ADDC 0,0,ret1
+$pos:
+ SHD ret1,arg0,28,t1
+ SHD arg0,0,28,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,ret1
+$pos_for_17:
+ SHD ret1,arg0,24,t1
+ SHD arg0,0,24,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,ret1
+
+ SHD ret1,arg0,16,t1
+ SHD arg0,0,16,t2
+ ADD arg0,t2,arg0
+ bv 0(r31)
+ ADDC ret1,t1,ret1
+
+$$divI_10:
+ .EXPORT $$divI_10,MILLICODE
+ COMB,< arg0,0,$neg10
+ COPY 0,ret1
+ EXTRU arg0,30,31,arg0
+ ADDIB,TR 1,arg0,$pos
+ SH1ADD arg0,arg0,arg0
+
+$neg10:
+ SUBI 2,arg0,arg0
+
+
+ EXTRU arg0,30,31,arg0
+ SH1ADD arg0,arg0,arg0
+$neg:
+ SHD ret1,arg0,28,t1
+ SHD arg0,0,28,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,ret1
+$neg_for_17:
+ SHD ret1,arg0,24,t1
+ SHD arg0,0,24,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,ret1
+
+ SHD ret1,arg0,16,t1
+ SHD arg0,0,16,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,ret1
+ bv 0(r31)
+ SUB 0,ret1,ret1
+
+
+$$divI_12:
+ .EXPORT $$divI_12,MILLICODE
+ COMB,< arg0,0,$neg12
+ COPY 0,ret1
+ EXTRU arg0,29,30,arg0
+ ADDIB,TR 1,arg0,$pos
+ SH2ADD arg0,arg0,arg0
+
+$neg12:
+ SUBI 4,arg0,arg0
+
+
+ EXTRU arg0,29,30,arg0
+ B $neg
+ SH2ADD arg0,arg0,arg0
+
+$$divU_12:
+ .EXPORT $$divU_12,MILLICODE
+ EXTRU arg0,29,30,arg0
+ ADDI 5,arg0,t1
+ SH2ADD arg0,t1,arg0
+ B $pos
+ ADDC 0,0,ret1
+
+
+$$divI_15:
+ .EXPORT $$divI_15,MILLICODE
+ COMB,< arg0,0,$neg15
+ COPY 0,ret1
+ ADDIB,TR 1,arg0,$pos+4
+ SHD ret1,arg0,28,t1
+
+$neg15:
+ B $neg
+ SUBI 1,arg0,arg0
+
+$$divU_15:
+ .EXPORT $$divU_15,MILLICODE
+ ADDI 1,arg0,arg0
+ B $pos
+ ADDC 0,0,ret1
+
+
+$$divI_17:
+ .EXPORT $$divI_17,MILLICODE
+ COMB,<,N arg0,0,$neg17
+ ADDI 1,arg0,arg0
+ SHD 0,arg0,28,t1
+ SHD arg0,0,28,t2
+ SUB t2,arg0,arg0
+ B $pos_for_17
+ SUBB t1,0,ret1
+
+$neg17:
+ SUBI 1,arg0,arg0
+ SHD 0,arg0,28,t1
+ SHD arg0,0,28,t2
+ SUB t2,arg0,arg0
+ B $neg_for_17
+ SUBB t1,0,ret1
+
+$$divU_17:
+ .EXPORT $$divU_17,MILLICODE
+ ADDI 1,arg0,arg0
+ ADDC 0,0,ret1
+ SHD ret1,arg0,28,t1
+$u17:
+ SHD arg0,0,28,t2
+ SUB t2,arg0,arg0
+ B $pos_for_17
+ SUBB t1,ret1,ret1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+$$divI_7:
+ .EXPORT $$divI_7,MILLICODE
+ COMB,<,N arg0,0,$neg7
+$7:
+ ADDI 1,arg0,arg0
+ SHD 0,arg0,29,ret1
+ SH3ADD arg0,arg0,arg0
+ ADDC ret1,0,ret1
+$pos7:
+ SHD ret1,arg0,26,t1
+ SHD arg0,0,26,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,ret1
+
+ SHD ret1,arg0,20,t1
+ SHD arg0,0,20,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,t1
+
+
+
+ COPY 0,ret1
+ SHD,= t1,arg0,24,t1
+$1:
+ ADDB,TR t1,ret1,$2
+ EXTRU arg0,31,24,arg0
+
+ bv,n 0(r31)
+
+$2:
+ ADDB,TR t1,arg0,$1
+ EXTRU,= arg0,7,8,t1
+
+$neg7:
+ SUBI 1,arg0,arg0
+$8:
+ SHD 0,arg0,29,ret1
+ SH3ADD arg0,arg0,arg0
+ ADDC ret1,0,ret1
+
+$neg7_shift:
+ SHD ret1,arg0,26,t1
+ SHD arg0,0,26,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,ret1
+
+ SHD ret1,arg0,20,t1
+ SHD arg0,0,20,t2
+ ADD arg0,t2,arg0
+ ADDC ret1,t1,t1
+
+
+
+ COPY 0,ret1
+ SHD,= t1,arg0,24,t1
+$3:
+ ADDB,TR t1,ret1,$4
+ EXTRU arg0,31,24,arg0
+
+ bv 0(r31)
+ SUB 0,ret1,ret1
+
+$4:
+ ADDB,TR t1,arg0,$3
+ EXTRU,= arg0,7,8,t1
+
+$$divU_7:
+ .EXPORT $$divU_7,MILLICODE
+ ADDI 1,arg0,arg0
+ ADDC 0,0,ret1
+ SHD ret1,arg0,29,t1
+ SH3ADD arg0,arg0,arg0
+ B $pos7
+ ADDC t1,ret1,ret1
+
+
+$$divI_9:
+ .EXPORT $$divI_9,MILLICODE
+ COMB,<,N arg0,0,$neg9
+ ADDI 1,arg0,arg0
+ SHD 0,arg0,29,t1
+ SHD arg0,0,29,t2
+ SUB t2,arg0,arg0
+ B $pos7
+ SUBB t1,0,ret1
+
+$neg9:
+ SUBI 1,arg0,arg0
+ SHD 0,arg0,29,t1
+ SHD arg0,0,29,t2
+ SUB t2,arg0,arg0
+ B $neg7_shift
+ SUBB t1,0,ret1
+
+$$divU_9:
+ .EXPORT $$divU_9,MILLICODE
+ ADDI 1,arg0,arg0
+ ADDC 0,0,ret1
+ SHD ret1,arg0,29,t1
+ SHD arg0,0,29,t2
+ SUB t2,arg0,arg0
+ B $pos7
+ SUBB t1,ret1,ret1
+
+
+$$divI_14:
+ .EXPORT $$divI_14,MILLICODE
+ COMB,<,N arg0,0,$neg14
+$$divU_14:
+ .EXPORT $$divU_14,MILLICODE
+ B $7
+ EXTRU arg0,30,31,arg0
+
+$neg14:
+ SUBI 2,arg0,arg0
+ B $8
+ EXTRU arg0,30,31,arg0
+
+ .exit
+ .PROCEND
+ .END
+
+rmndr: .EQU ret1 ; r29
+
+
+ .export $$remU,millicode
+$$remU:
+ .proc
+ .callinfo millicode
+ .entry
+
+ comib,>=,n 0,arg1,special_case
+ sub r0,arg1,rmndr ; clear carry, negate the divisor
+ ds r0,rmndr,r0 ; set V-bit to 1
+ add arg0,arg0,temp ; shift msb bit into carry
+ ds r0,arg1,rmndr ; 1st divide step, if no carry
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 2nd divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 3rd divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 4th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 5th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 6th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 7th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 8th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 9th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 10th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 11th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 12th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 13th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 14th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 15th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 16th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 17th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 18th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 19th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 20th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 21st divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 22nd divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 23rd divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 24th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 25th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 26th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 27th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 28th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 29th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 30th divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 31st divide step
+ addc temp,temp,temp ; shift temp with/into carry
+ ds rmndr,arg1,rmndr ; 32nd divide step,
+ comiclr,<= 0,rmndr,r0
+ add rmndr,arg1,rmndr ; correction
+; .exit
+ bv,n 0(r31)
+ nop
+; Putting >= on the last DS and deleting COMICLR does not work!
+;_____________________________________________________________________________
+special_case:
+ addit,= 0,arg1,r0 ; trap on div by zero
+ sub,>>= arg0,arg1,rmndr
+ copy arg0,rmndr
+ bv,n 0(r31)
+ nop
+ .exit
+ .procend
+ .end
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+; Use bv 0(r31) and bv,n 0(r31) instead.
+; #define return bv 0(%mrp)
+; #define return_n bv,n 0(%mrp)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .subspa $MILLICODE$
+ .align 16
+$$mulI:
+
+ .proc
+ .callinfo millicode
+ .entry
+ .export $$mulI, millicode
+ combt,<<= %r25,%r26,l4 ; swap args if unsigned %r25>%r26
+ copy 0,%r29 ; zero out the result
+ xor %r26,%r25,%r26 ; swap %r26 & %r25 using the
+ xor %r26,%r25,%r25 ; old xor trick
+ xor %r26,%r25,%r26
+l4: combt,<= 0,%r26,l3 ; if %r26>=0 then proceed like unsigned
+
+ zdep %r25,30,8,%r1 ; %r1 = (%r25&0xff)<<1 *********
+ sub,> 0,%r25,%r1 ; otherwise negate both and
+ combt,<=,n %r26,%r1,l2 ; swap back if |%r26|<|%r25|
+ sub 0,%r26,%r25
+ movb,tr,n %r1,%r26,l2 ; 10th inst.
+
+l0: add %r29,%r1,%r29 ; add in this partial product
+
+l1: zdep %r26,23,24,%r26 ; %r26 <<= 8 ******************
+
+l2: zdep %r25,30,8,%r1 ; %r1 = (%r25&0xff)<<1 *********
+
+l3: blr %r1,0 ; case on these 8 bits ******
+
+ extru %r25,23,24,%r25 ; %r25 >>= 8 ******************
+
+;16 insts before this.
+; %r26 <<= 8 **************************
+x0: comb,<> %r25,0,l2 ! zdep %r26,23,24,%r26 ! bv,n 0(r31) ! nop
+
+x1: comb,<> %r25,0,l1 ! add %r29,%r26,%r29 ! bv,n 0(r31) ! nop
+
+x2: comb,<> %r25,0,l1 ! sh1add %r26,%r29,%r29 ! bv,n 0(r31) ! nop
+
+x3: comb,<> %r25,0,l0 ! sh1add %r26,%r26,%r1 ! bv 0(r31) ! add %r29,%r1,%r29
+
+x4: comb,<> %r25,0,l1 ! sh2add %r26,%r29,%r29 ! bv,n 0(r31) ! nop
+
+x5: comb,<> %r25,0,l0 ! sh2add %r26,%r26,%r1 ! bv 0(r31) ! add %r29,%r1,%r29
+
+x6: sh1add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh1add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x7: sh1add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh2add %r26,%r29,%r29 ! b,n ret_t0
+
+x8: comb,<> %r25,0,l1 ! sh3add %r26,%r29,%r29 ! bv,n 0(r31) ! nop
+
+x9: comb,<> %r25,0,l0 ! sh3add %r26,%r26,%r1 ! bv 0(r31) ! add %r29,%r1,%r29
+
+x10: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh1add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x11: sh1add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh3add %r26,%r29,%r29 ! b,n ret_t0
+
+x12: sh1add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh2add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x13: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh3add %r26,%r29,%r29 ! b,n ret_t0
+
+x14: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x15: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh1add %r1,%r1,%r1 ! b,n ret_t0
+
+x16: zdep %r26,27,28,%r1 ! comb,<> %r25,0,l1 ! add %r29,%r1,%r29 ! bv,n 0(r31)
+
+x17: sh3add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh3add %r26,%r1,%r1 ! b,n ret_t0
+
+x18: sh3add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh1add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x19: sh3add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh1add %r1,%r26,%r1 ! b,n ret_t0
+
+x20: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh2add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x21: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh2add %r1,%r26,%r1 ! b,n ret_t0
+
+x22: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x23: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x24: sh1add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh3add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x25: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh2add %r1,%r1,%r1 ! b,n ret_t0
+
+x26: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x27: sh1add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh3add %r1,%r1,%r1 ! b,n ret_t0
+
+x28: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x29: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x30: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x31: zdep %r26,26,27,%r1 ! comb,<> %r25,0,l0 ! sub %r1,%r26,%r1 ! b,n ret_t0
+
+x32: zdep %r26,26,27,%r1 ! comb,<> %r25,0,l1 ! add %r29,%r1,%r29 ! bv,n 0(r31)
+
+x33: sh3add %r26,0,%r1 ! comb,<> %r25,0,l0 ! sh2add %r1,%r26,%r1 ! b,n ret_t0
+
+x34: zdep %r26,27,28,%r1 ! add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x35: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh3add %r26,%r1,%r1
+
+x36: sh3add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh2add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x37: sh3add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh2add %r1,%r26,%r1 ! b,n ret_t0
+
+x38: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x39: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x40: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh3add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x41: sh2add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh3add %r1,%r26,%r1 ! b,n ret_t0
+
+x42: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x43: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x44: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x45: sh3add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! sh2add %r1,%r1,%r1 ! b,n ret_t0
+
+x46: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! add %r1,%r26,%r1
+
+x47: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh1add %r26,%r1,%r1
+
+x48: sh1add %r26,%r26,%r1 ! comb,<> %r25,0,l0 ! zdep %r1,27,28,%r1 ! b,n ret_t0
+
+x49: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh2add %r26,%r1,%r1
+
+x50: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x51: sh3add %r26,%r26,%r1 ! sh3add %r26,%r1,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x52: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x53: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x54: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x55: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x56: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x57: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x58: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x59: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t02a0 ! sh1add %r1,%r1,%r1
+
+x60: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x61: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x62: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x63: zdep %r26,25,26,%r1 ! comb,<> %r25,0,l0 ! sub %r1,%r26,%r1 ! b,n ret_t0
+
+x64: zdep %r26,25,26,%r1 ! comb,<> %r25,0,l1 ! add %r29,%r1,%r29 ! bv,n 0(r31)
+
+x65: sh3add %r26,0,%r1 ! comb,<> %r25,0,l0 ! sh3add %r1,%r26,%r1 ! b,n ret_t0
+
+x66: zdep %r26,26,27,%r1 ! add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x67: sh3add %r26,0,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x68: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x69: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x70: zdep %r26,25,26,%r1 ! sh2add %r26,%r1,%r1 ! b e_t0 ! sh1add %r26,%r1,%r1
+
+x71: sh3add %r26,%r26,%r1 ! sh3add %r1,0,%r1 ! b e_t0 ! sub %r1,%r26,%r1
+
+x72: sh3add %r26,%r26,%r1 ! comb,<> %r25,0,l1 ! sh3add %r1,%r29,%r29 ! bv,n 0(r31)
+
+x73: sh3add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_shift ! add %r29,%r1,%r29
+
+x74: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x75: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x76: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x77: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x78: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r26,%r1
+
+x79: zdep %r26,27,28,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sub %r1,%r26,%r1
+
+x80: zdep %r26,27,28,%r1 ! sh2add %r1,%r1,%r1 ! b e_shift ! add %r29,%r1,%r29
+
+x81: sh3add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_shift ! add %r29,%r1,%r29
+
+x82: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x83: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x84: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x85: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x86: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r26,%r1
+
+x87: sh3add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_t02a0 ! sh2add %r26,%r1,%r1
+
+x88: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x89: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x90: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x91: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x92: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0 ! sh1add %r1,%r26,%r1
+
+x93: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x94: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0 ! sh1add %r26,%r1,%r1
+
+x95: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x96: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x97: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x98: zdep %r26,26,27,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh1add %r26,%r1,%r1
+
+x99: sh3add %r26,0,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x100: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x101: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x102: zdep %r26,26,27,%r1 ! sh1add %r26,%r1,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x103: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t02a0 ! sh2add %r1,%r26,%r1
+
+x104: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x105: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x106: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x107: sh3add %r26,%r26,%r1 ! sh2add %r26,%r1,%r1 ! b e_t02a0 ! sh3add %r1,%r26,%r1
+
+x108: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x109: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x110: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_2t0 ! sh1add %r1,%r26,%r1
+
+x111: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x112: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! zdep %r1,27,28,%r1
+
+x113: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t02a0 ! sh1add %r1,%r1,%r1
+
+x114: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r1,%r1
+
+x115: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0a0 ! sh1add %r1,%r1,%r1
+
+x116: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0 ! sh2add %r1,%r26,%r1
+
+x117: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r1,%r1
+
+x118: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0a0 ! sh3add %r1,%r1,%r1
+
+x119: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t02a0 ! sh3add %r1,%r1,%r1
+
+x120: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x121: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x122: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x123: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x124: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x125: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x126: zdep %r26,25,26,%r1 ! sub %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x127: zdep %r26,24,25,%r1 ! comb,<> %r25,0,l0 ! sub %r1,%r26,%r1 ! b,n ret_t0
+
+x128: zdep %r26,24,25,%r1 ! comb,<> %r25,0,l1 ! add %r29,%r1,%r29 ! bv,n 0(r31)
+
+x129: zdep %r26,24,25,%r1 ! comb,<> %r25,0,l0 ! add %r1,%r26,%r1 ! b,n ret_t0
+
+x130: zdep %r26,25,26,%r1 ! add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x131: sh3add %r26,0,%r1 ! sh3add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x132: sh3add %r26,0,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x133: sh3add %r26,0,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x134: sh3add %r26,0,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r26,%r1
+
+x135: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x136: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x137: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x138: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x139: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0a0 ! sh2add %r1,%r26,%r1
+
+x140: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0 ! sh2add %r1,%r1,%r1
+
+x141: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0a0 ! sh1add %r1,%r26,%r1
+
+x142: sh3add %r26,%r26,%r1 ! sh3add %r1,0,%r1 ! b e_2t0 ! sub %r1,%r26,%r1
+
+x143: zdep %r26,27,28,%r1 ! sh3add %r1,%r1,%r1 ! b e_t0 ! sub %r1,%r26,%r1
+
+x144: sh3add %r26,%r26,%r1 ! sh3add %r1,0,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x145: sh3add %r26,%r26,%r1 ! sh3add %r1,0,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x146: sh3add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x147: sh3add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x148: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x149: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x150: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r26,%r1
+
+x151: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0a0 ! sh1add %r1,%r26,%r1
+
+x152: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x153: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x154: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x155: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x156: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0 ! sh1add %r1,%r26,%r1
+
+x157: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_t02a0 ! sh2add %r1,%r1,%r1
+
+x158: zdep %r26,27,28,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0 ! sub %r1,%r26,%r1
+
+x159: zdep %r26,26,27,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sub %r1,%r26,%r1
+
+x160: sh2add %r26,%r26,%r1 ! sh2add %r1,0,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x161: sh3add %r26,0,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x162: sh3add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x163: sh3add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_t0 ! sh1add %r1,%r26,%r1
+
+x164: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x165: sh3add %r26,0,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x166: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r26,%r1
+
+x167: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_2t0a0 ! sh1add %r1,%r26,%r1
+
+x168: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x169: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x170: zdep %r26,26,27,%r1 ! sh1add %r26,%r1,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x171: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r1,%r1
+
+x172: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_4t0 ! sh1add %r1,%r26,%r1
+
+x173: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t02a0 ! sh3add %r1,%r1,%r1
+
+x174: zdep %r26,26,27,%r1 ! sh1add %r26,%r1,%r1 ! b e_t04a0 ! sh2add %r1,%r1,%r1
+
+x175: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_5t0 ! sh1add %r1,%r26,%r1
+
+x176: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_8t0 ! add %r1,%r26,%r1
+
+x177: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_8t0a0 ! add %r1,%r26,%r1
+
+x178: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0 ! sh3add %r1,%r26,%r1
+
+x179: sh2add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0a0 ! sh3add %r1,%r26,%r1
+
+x180: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x181: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x182: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0 ! sh1add %r1,%r26,%r1
+
+x183: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0a0 ! sh1add %r1,%r26,%r1
+
+x184: sh2add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_4t0 ! add %r1,%r26,%r1
+
+x185: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x186: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r1,%r1
+
+x187: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t02a0 ! sh2add %r1,%r1,%r1
+
+x188: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_4t0 ! sh1add %r26,%r1,%r1
+
+x189: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r1,%r1
+
+x190: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_2t0 ! sh2add %r1,%r1,%r1
+
+x191: zdep %r26,25,26,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sub %r1,%r26,%r1
+
+x192: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x193: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x194: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x195: sh3add %r26,0,%r1 ! sh3add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x196: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_4t0 ! sh1add %r1,%r26,%r1
+
+x197: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_4t0a0 ! sh1add %r1,%r26,%r1
+
+x198: zdep %r26,25,26,%r1 ! sh1add %r26,%r1,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x199: sh3add %r26,0,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0a0 ! sh1add %r1,%r1,%r1
+
+x200: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x201: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x202: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x203: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0a0 ! sh2add %r1,%r26,%r1
+
+x204: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0 ! sh1add %r1,%r1,%r1
+
+x205: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x206: zdep %r26,25,26,%r1 ! sh2add %r26,%r1,%r1 ! b e_t02a0 ! sh1add %r1,%r1,%r1
+
+x207: sh3add %r26,0,%r1 ! sh1add %r1,%r26,%r1 ! b e_3t0 ! sh2add %r1,%r26,%r1
+
+x208: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_8t0 ! add %r1,%r26,%r1
+
+x209: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_8t0a0 ! add %r1,%r26,%r1
+
+x210: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0 ! sh2add %r1,%r1,%r1
+
+x211: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0a0 ! sh2add %r1,%r1,%r1
+
+x212: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_4t0 ! sh2add %r1,%r26,%r1
+
+x213: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_4t0a0 ! sh2add %r1,%r26,%r1
+
+x214: sh3add %r26,%r26,%r1 ! sh2add %r26,%r1,%r1 ! b e2t04a0 ! sh3add %r1,%r26,%r1
+
+x215: sh2add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_5t0 ! sh1add %r1,%r26,%r1
+
+x216: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x217: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x218: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_2t0 ! sh2add %r1,%r26,%r1
+
+x219: sh3add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x220: sh1add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_4t0 ! sh1add %r1,%r26,%r1
+
+x221: sh1add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_4t0a0 ! sh1add %r1,%r26,%r1
+
+x222: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r1,%r1
+
+x223: sh3add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0a0 ! sh1add %r1,%r1,%r1
+
+x224: sh3add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_8t0 ! add %r1,%r26,%r1
+
+x225: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0 ! sh2add %r1,%r1,%r1
+
+x226: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_t02a0 ! zdep %r1,26,27,%r1
+
+x227: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_t02a0 ! sh2add %r1,%r1,%r1
+
+x228: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0 ! sh1add %r1,%r1,%r1
+
+x229: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_4t0a0 ! sh1add %r1,%r1,%r1
+
+x230: sh3add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_5t0 ! add %r1,%r26,%r1
+
+x231: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_3t0 ! sh2add %r1,%r26,%r1
+
+x232: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_8t0 ! sh2add %r1,%r26,%r1
+
+x233: sh1add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e_8t0a0 ! sh2add %r1,%r26,%r1
+
+x234: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0 ! sh3add %r1,%r1,%r1
+
+x235: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e_2t0a0 ! sh3add %r1,%r1,%r1
+
+x236: sh3add %r26,%r26,%r1 ! sh1add %r1,%r26,%r1 ! b e4t08a0 ! sh1add %r1,%r1,%r1
+
+x237: zdep %r26,27,28,%r1 ! sh2add %r1,%r1,%r1 ! b e_3t0 ! sub %r1,%r26,%r1
+
+x238: sh1add %r26,%r26,%r1 ! sh2add %r1,%r26,%r1 ! b e2t04a0 ! sh3add %r1,%r1,%r1
+
+x239: zdep %r26,27,28,%r1 ! sh2add %r1,%r1,%r1 ! b e_t0ma0 ! sh1add %r1,%r1,%r1
+
+x240: sh3add %r26,%r26,%r1 ! add %r1,%r26,%r1 ! b e_8t0 ! sh1add %r1,%r1,%r1
+
+x241: sh3add %r26,%r26,%r1 ! add %r1,%r26,%r1 ! b e_8t0a0 ! sh1add %r1,%r1,%r1
+
+x242: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_2t0 ! sh3add %r1,%r26,%r1
+
+x243: sh3add %r26,%r26,%r1 ! sh3add %r1,%r1,%r1 ! b e_t0 ! sh1add %r1,%r1,%r1
+
+x244: sh2add %r26,%r26,%r1 ! sh1add %r1,%r1,%r1 ! b e_4t0 ! sh2add %r1,%r26,%r1
+
+x245: sh3add %r26,0,%r1 ! sh1add %r1,%r1,%r1 ! b e_5t0 ! sh1add %r1,%r26,%r1
+
+x246: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_2t0 ! sh1add %r1,%r1,%r1
+
+x247: sh2add %r26,%r26,%r1 ! sh3add %r1,%r26,%r1 ! b e_2t0a0 ! sh1add %r1,%r1,%r1
+
+x248: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_shift ! sh3add %r1,%r29,%r29
+
+x249: zdep %r26,26,27,%r1 ! sub %r1,%r26,%r1 ! b e_t0 ! sh3add %r1,%r26,%r1
+
+x250: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0 ! sh2add %r1,%r1,%r1
+
+x251: sh2add %r26,%r26,%r1 ! sh2add %r1,%r1,%r1 ! b e_2t0a0 ! sh2add %r1,%r1,%r1
+
+x252: zdep %r26,25,26,%r1 ! sub %r1,%r26,%r1 ! b e_shift ! sh2add %r1,%r29,%r29
+
+x253: zdep %r26,25,26,%r1 ! sub %r1,%r26,%r1 ! b e_t0 ! sh2add %r1,%r26,%r1
+
+x254: zdep %r26,24,25,%r1 ! sub %r1,%r26,%r1 ! b e_shift ! sh1add %r1,%r29,%r29
+
+x255: zdep %r26,23,24,%r1 ! comb,<> %r25,0,l0 ! sub %r1,%r26,%r1 ! b,n ret_t0
+
+;1040 insts before this.
+ret_t0: bv 0(r31)
+
+e_t0: add %r29,%r1,%r29
+
+e_shift: comb,<> %r25,0,l2
+
+ zdep %r26,23,24,%r26 ; %r26 <<= 8 ***********
+ bv,n 0(r31)
+e_t0ma0: comb,<> %r25,0,l0
+
+ sub %r1,%r26,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e_t0a0: comb,<> %r25,0,l0
+
+ add %r1,%r26,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e_t02a0: comb,<> %r25,0,l0
+
+ sh1add %r26,%r1,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e_t04a0: comb,<> %r25,0,l0
+
+ sh2add %r26,%r1,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e_2t0: comb,<> %r25,0,l1
+
+ sh1add %r1,%r29,%r29
+ bv,n 0(r31)
+e_2t0a0: comb,<> %r25,0,l0
+
+ sh1add %r1,%r26,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e2t04a0: sh1add %r26,%r1,%r1
+
+ comb,<> %r25,0,l1
+ sh1add %r1,%r29,%r29
+ bv,n 0(r31)
+e_3t0: comb,<> %r25,0,l0
+
+ sh1add %r1,%r1,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e_4t0: comb,<> %r25,0,l1
+
+ sh2add %r1,%r29,%r29
+ bv,n 0(r31)
+e_4t0a0: comb,<> %r25,0,l0
+
+ sh2add %r1,%r26,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e4t08a0: sh1add %r26,%r1,%r1
+
+ comb,<> %r25,0,l1
+ sh2add %r1,%r29,%r29
+ bv,n 0(r31)
+e_5t0: comb,<> %r25,0,l0
+
+ sh2add %r1,%r1,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+e_8t0: comb,<> %r25,0,l1
+
+ sh3add %r1,%r29,%r29
+ bv,n 0(r31)
+e_8t0a0: comb,<> %r25,0,l0
+
+ sh3add %r1,%r26,%r1
+ bv 0(r31)
+ add %r29,%r1,%r29
+
+ .exit
+ .procend
+ .end
+
+ .import $$divI_2,millicode
+ .import $$divI_3,millicode
+ .import $$divI_4,millicode
+ .import $$divI_5,millicode
+ .import $$divI_6,millicode
+ .import $$divI_7,millicode
+ .import $$divI_8,millicode
+ .import $$divI_9,millicode
+ .import $$divI_10,millicode
+ .import $$divI_12,millicode
+ .import $$divI_14,millicode
+ .import $$divI_15,millicode
+ .export $$divI,millicode
+ .export $$divoI,millicode
+$$divoI:
+ .proc
+ .callinfo millicode
+ .entry
+ comib,=,n -1,arg1,negative1 ; when divisor == -1
+$$divI:
+ comib,>>=,n 15,arg1,small_divisor
+ add,>= 0,arg0,retreg ; move dividend, if retreg < 0,
+normal1:
+ sub 0,retreg,retreg ; make it positive
+ sub 0,arg1,temp ; clear carry,
+ ; negate the divisor
+ ds 0,temp,0 ; set V-bit to the comple-
+ ; ment of the divisor sign
+ add retreg,retreg,retreg ; shift msb bit into carry
+ ds r0,arg1,temp ; 1st divide step, if no carry
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 2nd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 3rd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 4th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 5th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 6th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 7th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 8th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 9th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 10th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 11th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 12th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 13th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 14th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 15th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 16th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 17th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 18th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 19th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 20th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 21st divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 22nd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 23rd divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 24th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 25th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 26th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 27th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 28th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 29th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 30th divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 31st divide step
+ addc retreg,retreg,retreg ; shift retreg with/into carry
+ ds temp,arg1,temp ; 32nd divide step,
+ addc retreg,retreg,retreg ; shift last retreg bit into retreg
+ xor,>= arg0,arg1,0 ; get correct sign of quotient
+ sub 0,retreg,retreg ; based on operand signs
+ bv,n 0(r31)
+ nop
+;______________________________________________________________________
+small_divisor:
+ blr,n arg1,r0
+ nop
+; table for divisor == 0,1, ... ,15
+ addit,= 0,arg1,r0 ; trap if divisor == 0
+ nop
+ bv 0(r31) ; divisor == 1
+ copy arg0,retreg
+ b,n $$divI_2 ; divisor == 2
+ nop
+ b,n $$divI_3 ; divisor == 3
+ nop
+ b,n $$divI_4 ; divisor == 4
+ nop
+ b,n $$divI_5 ; divisor == 5
+ nop
+ b,n $$divI_6 ; divisor == 6
+ nop
+ b,n $$divI_7 ; divisor == 7
+ nop
+ b,n $$divI_8 ; divisor == 8
+ nop
+ b,n $$divI_9 ; divisor == 9
+ nop
+ b,n $$divI_10 ; divisor == 10
+ nop
+ b normal1 ; divisor == 11
+ add,>= 0,arg0,retreg
+ b,n $$divI_12 ; divisor == 12
+ nop
+ b normal1 ; divisor == 13
+ add,>= 0,arg0,retreg
+ b,n $$divI_14 ; divisor == 14
+ nop
+ b,n $$divI_15 ; divisor == 15
+ nop
+;______________________________________________________________________
+negative1:
+ sub 0,arg0,retreg ; result is negation of dividend
+ bv 0(r31)
+ addo arg0,arg1,r0 ; trap iff dividend==0x80000000 && divisor==-1
+ .exit
+ .procend
+
+ .subspa $LIT$
+___hp_free_copyright:
+ .export ___hp_free_copyright,data
+ .align 4
+ .string "(c) Copyright 1986 HEWLETT-PACKARD COMPANY\x0aTo anyone who acknowledges that this file is provided \"AS IS\"\x0awithout any express or implied warranty:\x0a permission to use, copy, modify, and distribute this file\x0afor any purpose is hereby granted without fee, provided that\x0athe above copyright notice and this notice appears in all\x0acopies, and that the name of Hewlett-Packard Company not be\x0aused in advertising or publicity pertaining to distribution\x0aof the software without specific, written prior permission.\x0aHewlett-Packard Company makes no representations about the\x0asuitability of this software for any purpose.\x0a\x00"
+ .align 4
+ .end
diff --git a/c/src/lib/libcpu/hppa1.1/runway/Makefile.in b/c/src/lib/libcpu/hppa1.1/runway/Makefile.in
new file mode 100644
index 0000000000..0580bf3046
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/runway/Makefile.in
@@ -0,0 +1,22 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_PIECES = runway
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+SRCS=$(H_FILES) $(EQ_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libcpu/hppa1.1/runway/runway.h b/c/src/lib/libcpu/hppa1.1/runway/runway.h
new file mode 100644
index 0000000000..41aafe26ef
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/runway/runway.h
@@ -0,0 +1,37 @@
+/*
+ * File: $RCSfile$
+ * Project: PixelFlow
+ * Created: 94/11/29
+ * RespEngr: tony bennett
+ * Revision: $Revision$
+ * Last Mod: $Date$
+ *
+ * Description:
+ * definitions specific to the runway bus
+ *
+ * TODO:
+ * Add lots more.
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_RUNWAY_H
+#define _INCLUDE_RUNWAY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define HPPA_RUNWAY_PROC_HPA_BASE ((void *) 0xFFFA0000)
+
+/* given a processor number, where is its HPA? */
+#define HPPA_RUNWAY_HPA(cpu) \
+ ((rtems_unsigned32) (HPPA_RUNWAY_PROC_HPA_BASE + ((cpu) * 0x2000)))
+
+#define HPPA_RUNWAY_REG_IO_EIR_OFFSET 0x000
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_RUNWAY_H */
diff --git a/c/src/lib/libcpu/hppa1.1/semaphore/Makefile.in b/c/src/lib/libcpu/hppa1.1/semaphore/Makefile.in
new file mode 100644
index 0000000000..423d53c8de
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/semaphore/Makefile.in
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/semaphore.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=semaphore
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_PIECES=semaphore
+H_FILES=$(H_PIECES:%=$(srcdir)/%.h)
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+# Add your list of files to delete here.
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) -m 444 $(H_FILES) $(PROJECT_RELEASE)/include
diff --git a/c/src/lib/libcpu/hppa1.1/semaphore/semaphore.c b/c/src/lib/libcpu/hppa1.1/semaphore/semaphore.c
new file mode 100644
index 0000000000..59d4dd7770
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/semaphore/semaphore.c
@@ -0,0 +1,294 @@
+/*
+ * Description:
+ * HPPA fast spinlock semaphores based on LDCWX instruction.
+ * These semaphores are not known to RTEMS.
+ *
+ * TODO:
+ * Put node number in high 16 bits of flag??
+ * XXX: Need h_s_deallocate
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+#include "semaphore.h"
+
+/*
+ * Report fatal semaphore error
+ */
+
+#define SEM_FATAL_ERROR(sp) rtems_fatal_error_occurred((rtems_unsigned32) sp)
+
+#define SEM_CHECK(sp) do { \
+ if (((sp) == 0) || (int) (sp) & 0xf) \
+ { \
+ SEM_FATAL_ERROR(sp); \
+ } \
+ } while (0)
+
+/*
+ * Init a semaphore to be free
+ */
+
+#define SEM_FREE_INIT(sp) \
+ do { \
+ (sp)->lock = 1; \
+ (sp)->flags = 0; \
+ (sp)->owner_tcb = 0; \
+ } while (0)
+
+/*
+ * Grab a semaphore recording its owner.
+ */
+
+#define SEM_MARK_GRABBED(sp) \
+ do { \
+ (sp)->owner_tcb = _Thread_Executing; \
+ } while (0)
+
+/*
+ * Mark the semaphore busy
+ */
+
+#define SEM_MARK_BUSY(sp) ((sp)->flags |= HPPA_SEM_IN_USE)
+
+/*
+ * Is a semaphore available?
+ */
+
+#define SEM_IS_AVAILABLE(sp) ((sp)->owner_tcb == 0)
+
+/*
+ * The pool control semaphore is the first in the pool
+ */
+
+#define SEM_CONTROL (&hppa_semaphore_pool[0])
+#define SEM_FIRST (&hppa_semaphore_pool[1])
+
+#define SEM_PRIVATE(cookie) rtems_interrupt_disable(cookie)
+
+#define SEM_PUBLIC(cookie) rtems_interrupt_enable(cookie)
+
+
+/*
+ * Control variables for the pool
+ */
+
+hppa_semaphore_t *hppa_semaphore_pool; /* ptr to first */
+int hppa_semaphores;
+int hppa_semaphores_available;
+
+void
+hppa_semaphore_pool_initialize(void *pool_base,
+ int pool_size)
+{
+ hppa_semaphore_t *sp;
+ int align_factor;
+ rtems_unsigned32 isr_level;
+
+ /*
+ * round pool_base up to be a multiple of SEM_ALIGN
+ */
+
+ align_factor = SEM_ALIGN - (((int) pool_base) & (SEM_ALIGN-1));
+ if (align_factor != SEM_ALIGN)
+ {
+ pool_base += align_factor;
+ pool_size -= align_factor;
+ }
+
+ /*
+ * How many can the pool hold?
+ * Assumes the semaphores are SEM_ALIGN bytes each
+ */
+
+ if (sizeof(hppa_semaphore_t) != SEM_ALIGN)
+ rtems_fatal_error_occurred(RTEMS_INVALID_SIZE);
+
+ pool_size &= ~(SEM_ALIGN - 1);
+
+ SEM_PRIVATE(isr_level);
+
+ hppa_semaphore_pool = pool_base;
+ hppa_semaphores = pool_size / SEM_ALIGN;
+
+ /*
+ * If we are node0, then init all in the pool
+ */
+
+ if (cpu_number == 0)
+ {
+ /*
+ * Tell other cpus we are not done, jic
+ */
+ SEM_CONTROL->user = rtems_build_name('!', 'D', 'N', 'E');
+
+ for (sp=SEM_FIRST; sp < &hppa_semaphore_pool[hppa_semaphores]; sp++)
+ SEM_FREE_INIT(sp);
+ SEM_FREE_INIT(SEM_CONTROL);
+ }
+
+ /*
+ * Tell other cpus we are done, or wait for it to be done if on another cpu
+ */
+
+ if (cpu_number == 0)
+ SEM_CONTROL->user = rtems_build_name('D', 'O', 'N', 'E');
+ else
+ while (SEM_CONTROL->user != rtems_build_name('D', 'O', 'N', 'E'))
+ ;
+
+ hppa_semaphores_available = hppa_semaphores;
+
+ SEM_PUBLIC(isr_level);
+}
+
+/*
+ * Function: hppa_semaphore_acquire
+ * Created: 94/11/29
+ * RespEngr: tony bennett
+ *
+ * Description:
+ * Acquire a semaphore. Will spin on the semaphore unless
+ * 'flag' says not to.
+ *
+ * Parameters:
+ *
+ *
+ * Returns:
+ * 0 -- if did not acquire
+ * non-zero -- if acquired semaphore
+ * (actually this is the spin count)
+ *
+ * Notes:
+ * There is no requirement that the semaphore be within the pool
+ *
+ * Deficiencies/ToDo:
+ *
+ */
+
+
+rtems_unsigned32
+hppa_semaphore_acquire(hppa_semaphore_t *sp,
+ int flag)
+{
+ rtems_unsigned32 lock_value;
+ rtems_unsigned32 spin_count = 1;
+
+ SEM_CHECK(sp);
+
+ for (;;)
+ {
+ HPPA_ASM_LDCWS(0, 0, sp, lock_value);
+
+ if (lock_value) /* we now own the lock */
+ {
+ SEM_MARK_GRABBED(sp);
+ return spin_count ? spin_count : ~0; /* jic */
+ }
+
+ if (flag & HPPA_SEM_NO_SPIN)
+ return 0;
+
+ spin_count++;
+ }
+}
+
+void
+hppa_semaphore_release(hppa_semaphore_t *sp)
+{
+ SEM_CHECK(sp);
+
+ if (sp->owner_tcb != _Thread_Executing)
+ SEM_FATAL_ERROR("owner mismatch");
+
+ sp->lock = 1;
+}
+
+
+/*
+ * Function: hppa_semaphore_allocate
+ * Created: 94/11/29
+ * RespEngr: tony bennett
+ *
+ * Description:
+ * Get a pointer to a semaphore.
+ *
+ * Parameters:
+ * which -- if 0, then allocate a free semaphore from the pool
+ * if non-zero, then return pointer to that one, even
+ * if it is already busy.
+ *
+ * Returns:
+ * successful -- pointer to semaphore
+ * NULL otherwise
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+hppa_semaphore_t *
+hppa_semaphore_allocate(rtems_unsigned32 which,
+ int flag)
+{
+ hppa_semaphore_t *sp = 0;
+
+ /*
+ * grab the control semaphore
+ */
+
+ if (hppa_semaphore_acquire(SEM_CONTROL, 0) == 0)
+ SEM_FATAL_ERROR("could not grab control semaphore");
+
+ /*
+ * Find a free one and init it
+ */
+
+ if (which)
+ {
+ if (which >= hppa_semaphores)
+ SEM_FATAL_ERROR("requested non-existent semaphore");
+ sp = &hppa_semaphore_pool[which];
+
+ /*
+ * if it is "free", then mark it claimed now.
+ * If it is not free then we are done.
+ */
+
+ if (SEM_IS_AVAILABLE(sp))
+ goto allmine;
+ }
+ else for (sp = SEM_FIRST;
+ sp < &hppa_semaphore_pool[hppa_semaphores];
+ sp++)
+ {
+ if (SEM_IS_AVAILABLE(sp))
+ {
+allmine: SEM_FREE_INIT(sp);
+ SEM_MARK_BUSY(sp);
+ if ( ! (flag & HPPA_SEM_INITIALLY_FREE))
+ SEM_MARK_GRABBED(sp);
+ break;
+ }
+ }
+
+ /*
+ * Free up the control semaphore
+ */
+
+ hppa_semaphore_release(SEM_CONTROL);
+
+ return sp;
+}
+
diff --git a/c/src/lib/libcpu/hppa1.1/semaphore/semaphore.h b/c/src/lib/libcpu/hppa1.1/semaphore/semaphore.h
new file mode 100644
index 0000000000..a5e92983a0
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/semaphore/semaphore.h
@@ -0,0 +1,70 @@
+/*
+ * Description:
+ * HPPA fast spinlock semaphores based on LDCWX instruction.
+ * These semaphores are not known to RTEMS.
+ *
+ * TODO:
+ *
+ * COPYRIGHT (c) 1994,95 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_SEMAPHORE_H
+#define _INCLUDE_SEMAPHORE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This structure has hardware requirements.
+ * LDCWX opcode requires 16byte alignment for the lock
+ * 'lock' must be first member of structure.
+ */
+
+#define SEM_ALIGN 16
+
+typedef volatile struct {
+
+ rtems_unsigned32 lock __attribute__ ((aligned (SEM_ALIGN)));
+
+ rtems_unsigned32 flags;
+
+ void *owner_tcb; /* for debug/commentary only */
+
+ rtems_unsigned32 user; /* for use by user */
+
+} hppa_semaphore_t;
+
+/*
+ * Values for flags
+ */
+
+#define HPPA_SEM_IN_USE 0x0001 /* semaphore owned by somebody */
+#define HPPA_SEM_NO_SPIN 0x0002 /* don't spin if unavailable */
+#define HPPA_SEM_INITIALLY_FREE 0x0004 /* init it to be free */
+
+/*
+ * Caller specifiable flags
+ */
+
+#define HPPA_SEM_CALLER_FLAGS (HPPA_SEM_NO_SPIN | HPPA_SEM_INITIALLY_FREE)
+
+void hppa_semaphore_pool_initialize(void *pool_base, int pool_size);
+
+rtems_unsigned32 hppa_semaphore_acquire(hppa_semaphore_t *sp, int flag);
+
+void hppa_semaphore_release(hppa_semaphore_t *sp);
+
+hppa_semaphore_t *hppa_semaphore_allocate(rtems_unsigned32 which, int flag);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_SEMAPHORE_H */
diff --git a/c/src/lib/libcpu/hppa1.1/timer/Makefile.in b/c/src/lib/libcpu/hppa1.1/timer/Makefile.in
new file mode 100644
index 0000000000..03af6fc92a
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/timer/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# libbsp/hppa/BSP/wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/hppa1.1/timer/timer.c b/c/src/lib/libcpu/hppa1.1/timer/timer.c
new file mode 100644
index 0000000000..030a288645
--- /dev/null
+++ b/c/src/lib/libcpu/hppa1.1/timer/timer.c
@@ -0,0 +1,63 @@
+/* timer.c
+ *
+ * This file manages the interval timer on the PA-RISC.
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+volatile rtems_unsigned32 Timer_starting;
+rtems_boolean Timer_driver_Find_average_overhead;
+
+void Timer_initialize()
+{
+ Timer_starting = get_itimer();
+ set_eiem(0x80000000);
+}
+
+#define AVG_OVERHEAD 0 /* It typically takes 3.0 microseconds */
+ /* (6 countdowns) to start/stop the timer. */
+#define LEAST_VALID 1 /* Don't trust a value lower than this */
+
+int Read_timer()
+{
+ rtems_unsigned32 clicks;
+ rtems_unsigned32 total;
+
+ clicks = get_itimer();
+
+ total = clicks - Timer_starting;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in XXX microsecond units */
+
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ return (total - AVG_OVERHEAD);
+ }
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libcpu/m68k/Makefile.in b/c/src/lib/libcpu/m68k/Makefile.in
new file mode 100644
index 0000000000..9687252dbb
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=$(wildcard $(RTEMS_CPU_MODEL))
diff --git a/c/src/lib/libcpu/m68k/m68040/Makefile.in b/c/src/lib/libcpu/m68k/m68040/Makefile.in
new file mode 100644
index 0000000000..7680536125
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=fpsp
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/Makefile.in b/c/src/lib/libcpu/m68k/m68040/fpsp/Makefile.in
new file mode 100644
index 0000000000..533ec6d415
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/Makefile.in
@@ -0,0 +1,63 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/fpsp.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=rtems_fpsp
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES= bindec binstr bugfix decbin do_func gen_except get_op kernel_ex \
+ res_func round rtems_skel sacos sasin satan satanh scale scosh setox \
+ sgetem sint slog2 slogn smovecr srem_mod ssin ssinh stan stanh sto_res \
+ stwotox tbldo util x_bsun x_fline x_operr x_ovfl x_snan x_store x_unfl \
+ x_unimp x_unsupp
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# libbsp/hppa/BSP/wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/README b/c/src/lib/libcpu/m68k/m68040/fpsp/README
new file mode 100644
index 0000000000..9917fd4fd8
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/README
@@ -0,0 +1,40 @@
+M68040FPSP -- Motorola 68040 floating point support package
+-----------------------------------------------------------
+
+Modified for RTEMS by Eric Norum (eric@skatter.usask.ca)
+
+To include these routines in your application call
+
+ M68KFPSPInstallExceptionHandlers ();
+
+before performing any floating point operations.
+
+Acknowledgement
+---------------
+
+This code can be obtain from the Motorola Engineer's Toolbox WWW page
+at http://www.mot.com/SPS/HPESD/tools/freeware/040fpsp.html. Here is
+the description from that page:
+
+ The MC68040 contains a subset of the floating-point hardware that is
+ implemented in the MC68881/882 devices and as such provides reduced yet
+ high performance on-chip floating-point support. Those applications that
+ require full compatibility with earlier members of the M68000 family
+ will need to provide emulation support fo r the un-implemented MC68040
+ floating-point instructions. The M68040FPSP provides complete emulation
+ of the floating-point functionality available in the MC68881/882.
+
+ The M68040FPSP is offered in source code form to allow integration into
+ existing systems to support either a kernel or library version of
+ floating-point support. The M68040FPSP operates in conjunction with the
+ on-chip MC68040 features to provide fast and full emulation. The kernel
+ version allows full emulation via a trap mechanism to allow full binary
+ compatibility and is fully reentrant. The library version is used to
+ eliminate the trap overhead in situation where re-compilation is
+ possible or desired.
+
+From this page one may download the original source code. Inline with
+the first sentence of the second paragraph, we have integrated it with
+RTEMS.
+
+
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/bindec.s b/c/src/lib/libcpu/m68k/m68040/fpsp/bindec.s
new file mode 100644
index 0000000000..6b01e02fcd
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/bindec.s
@@ -0,0 +1,920 @@
+//
+// bindec.sa 3.4 1/3/91
+//
+// bindec
+//
+// Description:
+// Converts an input in extended precision format
+// to bcd format.
+//
+// Input:
+// a0 points to the input extended precision value
+// value in memory; d0 contains the k-factor sign-extended
+// to 32-bits. The input may be either normalized,
+// unnormalized, or denormalized.
+//
+// Output: result in the FP_SCR1 space on the stack.
+//
+// Saves and Modifies: D2-D7,A2,FP2
+//
+// Algorithm:
+//
+// A1. Set RM and size ext; Set SIGMA = sign of input.
+// The k-factor is saved for use in d7. Clear the
+// BINDEC_FLG for separating normalized/denormalized
+// input. If input is unnormalized or denormalized,
+// normalize it.
+//
+// A2. Set X = abs(input).
+//
+// A3. Compute ILOG.
+// ILOG is the log base 10 of the input value. It is
+// approximated by adding e + 0.f when the original
+// value is viewed as 2^^e * 1.f in extended precision.
+// This value is stored in d6.
+//
+// A4. Clr INEX bit.
+// The operation in A3 above may have set INEX2.
+//
+// A5. Set ICTR = 0;
+// ICTR is a flag used in A13. It must be set before the
+// loop entry A6.
+//
+// A6. Calculate LEN.
+// LEN is the number of digits to be displayed. The
+// k-factor can dictate either the total number of digits,
+// if it is a positive number, or the number of digits
+// after the decimal point which are to be included as
+// significant. See the 68882 manual for examples.
+// If LEN is computed to be greater than 17, set OPERR in
+// USER_FPSR. LEN is stored in d4.
+//
+// A7. Calculate SCALE.
+// SCALE is equal to 10^ISCALE, where ISCALE is the number
+// of decimal places needed to insure LEN integer digits
+// in the output before conversion to bcd. LAMBDA is the
+// sign of ISCALE, used in A9. Fp1 contains
+// 10^^(abs(ISCALE)) using a rounding mode which is a
+// function of the original rounding mode and the signs
+// of ISCALE and X. A table is given in the code.
+//
+// A8. Clr INEX; Force RZ.
+// The operation in A3 above may have set INEX2.
+// RZ mode is forced for the scaling operation to insure
+// only one rounding error. The grs bits are collected in
+// the INEX flag for use in A10.
+//
+// A9. Scale X -> Y.
+// The mantissa is scaled to the desired number of
+// significant digits. The excess digits are collected
+// in INEX2.
+//
+// A10. Or in INEX.
+// If INEX is set, round error occurred. This is
+// compensated for by 'or-ing' in the INEX2 flag to
+// the lsb of Y.
+//
+// A11. Restore original FPCR; set size ext.
+// Perform FINT operation in the user's rounding mode.
+// Keep the size to extended.
+//
+// A12. Calculate YINT = FINT(Y) according to user's rounding
+// mode. The FPSP routine sintd0 is used. The output
+// is in fp0.
+//
+// A13. Check for LEN digits.
+// If the int operation results in more than LEN digits,
+// or less than LEN -1 digits, adjust ILOG and repeat from
+// A6. This test occurs only on the first pass. If the
+// result is exactly 10^LEN, decrement ILOG and divide
+// the mantissa by 10.
+//
+// A14. Convert the mantissa to bcd.
+// The binstr routine is used to convert the LEN digit
+// mantissa to bcd in memory. The input to binstr is
+// to be a fraction; i.e. (mantissa)/10^LEN and adjusted
+// such that the decimal point is to the left of bit 63.
+// The bcd digits are stored in the correct position in
+// the final string area in memory.
+//
+// A15. Convert the exponent to bcd.
+// As in A14 above, the exp is converted to bcd and the
+// digits are stored in the final string.
+// Test the length of the final exponent string. If the
+// length is 4, set operr.
+//
+// A16. Write sign bits to final string.
+//
+// Implementation Notes:
+//
+// The registers are used as follows:
+//
+// d0: scratch; LEN input to binstr
+// d1: scratch
+// d2: upper 32-bits of mantissa for binstr
+// d3: scratch;lower 32-bits of mantissa for binstr
+// d4: LEN
+// d5: LAMBDA/ICTR
+// d6: ILOG
+// d7: k-factor
+// a0: ptr for original operand/final result
+// a1: scratch pointer
+// a2: pointer to FP_X; abs(original value) in ext
+// fp0: scratch
+// fp1: scratch
+// fp2: scratch
+// F_SCR1:
+// F_SCR2:
+// L_SCR1:
+// L_SCR2:
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//BINDEC idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ .include "fpsp.defs"
+
+ |section 8
+
+// Constants in extended precision
+LOG2: .long 0x3FFD0000,0x9A209A84,0xFBCFF798,0x00000000
+LOG2UP1: .long 0x3FFD0000,0x9A209A84,0xFBCFF799,0x00000000
+
+// Constants in single precision
+FONE: .long 0x3F800000,0x00000000,0x00000000,0x00000000
+FTWO: .long 0x40000000,0x00000000,0x00000000,0x00000000
+FTEN: .long 0x41200000,0x00000000,0x00000000,0x00000000
+F4933: .long 0x459A2800,0x00000000,0x00000000,0x00000000
+
+RBDTBL: .byte 0,0,0,0
+ .byte 3,3,2,2
+ .byte 3,2,2,3
+ .byte 2,3,3,2
+
+ |xref binstr
+ |xref sintdo
+ |xref ptenrn,ptenrm,ptenrp
+
+ .global bindec
+ .global sc_mul
+bindec:
+ moveml %d2-%d7/%a2,-(%a7)
+ fmovemx %fp0-%fp2,-(%a7)
+
+// A1. Set RM and size ext. Set SIGMA = sign input;
+// The k-factor is saved for use in d7. Clear BINDEC_FLG for
+// separating normalized/denormalized input. If the input
+// is a denormalized number, set the BINDEC_FLG memory word
+// to signal denorm. If the input is unnormalized, normalize
+// the input and test for denormalized result.
+//
+ fmovel #rm_mode,%FPCR //set RM and ext
+ movel (%a0),L_SCR2(%a6) //save exponent for sign check
+ movel %d0,%d7 //move k-factor to d7
+ clrb BINDEC_FLG(%a6) //clr norm/denorm flag
+ movew STAG(%a6),%d0 //get stag
+ andiw #0xe000,%d0 //isolate stag bits
+ beq A2_str //if zero, input is norm
+//
+// Normalize the denorm
+//
+un_de_norm:
+ movew (%a0),%d0
+ andiw #0x7fff,%d0 //strip sign of normalized exp
+ movel 4(%a0),%d1
+ movel 8(%a0),%d2
+norm_loop:
+ subw #1,%d0
+ lsll #1,%d2
+ roxll #1,%d1
+ tstl %d1
+ bges norm_loop
+//
+// Test if the normalized input is denormalized
+//
+ tstw %d0
+ bgts pos_exp //if greater than zero, it is a norm
+ st BINDEC_FLG(%a6) //set flag for denorm
+pos_exp:
+ andiw #0x7fff,%d0 //strip sign of normalized exp
+ movew %d0,(%a0)
+ movel %d1,4(%a0)
+ movel %d2,8(%a0)
+
+// A2. Set X = abs(input).
+//
+A2_str:
+ movel (%a0),FP_SCR2(%a6) // move input to work space
+ movel 4(%a0),FP_SCR2+4(%a6) // move input to work space
+ movel 8(%a0),FP_SCR2+8(%a6) // move input to work space
+ andil #0x7fffffff,FP_SCR2(%a6) //create abs(X)
+
+// A3. Compute ILOG.
+// ILOG is the log base 10 of the input value. It is approx-
+// imated by adding e + 0.f when the original value is viewed
+// as 2^^e * 1.f in extended precision. This value is stored
+// in d6.
+//
+// Register usage:
+// Input/Output
+// d0: k-factor/exponent
+// d2: x/x
+// d3: x/x
+// d4: x/x
+// d5: x/x
+// d6: x/ILOG
+// d7: k-factor/Unchanged
+// a0: ptr for original operand/final result
+// a1: x/x
+// a2: x/x
+// fp0: x/float(ILOG)
+// fp1: x/x
+// fp2: x/x
+// F_SCR1:x/x
+// F_SCR2:Abs(X)/Abs(X) with $3fff exponent
+// L_SCR1:x/x
+// L_SCR2:first word of X packed/Unchanged
+
+ tstb BINDEC_FLG(%a6) //check for denorm
+ beqs A3_cont //if clr, continue with norm
+ movel #-4933,%d6 //force ILOG = -4933
+ bras A4_str
+A3_cont:
+ movew FP_SCR2(%a6),%d0 //move exp to d0
+ movew #0x3fff,FP_SCR2(%a6) //replace exponent with 0x3fff
+ fmovex FP_SCR2(%a6),%fp0 //now fp0 has 1.f
+ subw #0x3fff,%d0 //strip off bias
+ faddw %d0,%fp0 //add in exp
+ fsubs FONE,%fp0 //subtract off 1.0
+ fbge pos_res //if pos, branch
+ fmulx LOG2UP1,%fp0 //if neg, mul by LOG2UP1
+ fmovel %fp0,%d6 //put ILOG in d6 as a lword
+ bras A4_str //go move out ILOG
+pos_res:
+ fmulx LOG2,%fp0 //if pos, mul by LOG2
+ fmovel %fp0,%d6 //put ILOG in d6 as a lword
+
+
+// A4. Clr INEX bit.
+// The operation in A3 above may have set INEX2.
+
+A4_str:
+ fmovel #0,%FPSR //zero all of fpsr - nothing needed
+
+
+// A5. Set ICTR = 0;
+// ICTR is a flag used in A13. It must be set before the
+// loop entry A6. The lower word of d5 is used for ICTR.
+
+ clrw %d5 //clear ICTR
+
+
+// A6. Calculate LEN.
+// LEN is the number of digits to be displayed. The k-factor
+// can dictate either the total number of digits, if it is
+// a positive number, or the number of digits after the
+// original decimal point which are to be included as
+// significant. See the 68882 manual for examples.
+// If LEN is computed to be greater than 17, set OPERR in
+// USER_FPSR. LEN is stored in d4.
+//
+// Register usage:
+// Input/Output
+// d0: exponent/Unchanged
+// d2: x/x/scratch
+// d3: x/x
+// d4: exc picture/LEN
+// d5: ICTR/Unchanged
+// d6: ILOG/Unchanged
+// d7: k-factor/Unchanged
+// a0: ptr for original operand/final result
+// a1: x/x
+// a2: x/x
+// fp0: float(ILOG)/Unchanged
+// fp1: x/x
+// fp2: x/x
+// F_SCR1:x/x
+// F_SCR2:Abs(X) with $3fff exponent/Unchanged
+// L_SCR1:x/x
+// L_SCR2:first word of X packed/Unchanged
+
+A6_str:
+ tstl %d7 //branch on sign of k
+ bles k_neg //if k <= 0, LEN = ILOG + 1 - k
+ movel %d7,%d4 //if k > 0, LEN = k
+ bras len_ck //skip to LEN check
+k_neg:
+ movel %d6,%d4 //first load ILOG to d4
+ subl %d7,%d4 //subtract off k
+ addql #1,%d4 //add in the 1
+len_ck:
+ tstl %d4 //LEN check: branch on sign of LEN
+ bles LEN_ng //if neg, set LEN = 1
+ cmpl #17,%d4 //test if LEN > 17
+ bles A7_str //if not, forget it
+ movel #17,%d4 //set max LEN = 17
+ tstl %d7 //if negative, never set OPERR
+ bles A7_str //if positive, continue
+ orl #opaop_mask,USER_FPSR(%a6) //set OPERR & AIOP in USER_FPSR
+ bras A7_str //finished here
+LEN_ng:
+ moveql #1,%d4 //min LEN is 1
+
+
+// A7. Calculate SCALE.
+// SCALE is equal to 10^ISCALE, where ISCALE is the number
+// of decimal places needed to insure LEN integer digits
+// in the output before conversion to bcd. LAMBDA is the sign
+// of ISCALE, used in A9. Fp1 contains 10^^(abs(ISCALE)) using
+// the rounding mode as given in the following table (see
+// Coonen, p. 7.23 as ref.; however, the SCALE variable is
+// of opposite sign in bindec.sa from Coonen).
+//
+// Initial USE
+// FPCR[6:5] LAMBDA SIGN(X) FPCR[6:5]
+// ----------------------------------------------
+// RN 00 0 0 00/0 RN
+// RN 00 0 1 00/0 RN
+// RN 00 1 0 00/0 RN
+// RN 00 1 1 00/0 RN
+// RZ 01 0 0 11/3 RP
+// RZ 01 0 1 11/3 RP
+// RZ 01 1 0 10/2 RM
+// RZ 01 1 1 10/2 RM
+// RM 10 0 0 11/3 RP
+// RM 10 0 1 10/2 RM
+// RM 10 1 0 10/2 RM
+// RM 10 1 1 11/3 RP
+// RP 11 0 0 10/2 RM
+// RP 11 0 1 11/3 RP
+// RP 11 1 0 11/3 RP
+// RP 11 1 1 10/2 RM
+//
+// Register usage:
+// Input/Output
+// d0: exponent/scratch - final is 0
+// d2: x/0 or 24 for A9
+// d3: x/scratch - offset ptr into PTENRM array
+// d4: LEN/Unchanged
+// d5: 0/ICTR:LAMBDA
+// d6: ILOG/ILOG or k if ((k<=0)&(ILOG<k))
+// d7: k-factor/Unchanged
+// a0: ptr for original operand/final result
+// a1: x/ptr to PTENRM array
+// a2: x/x
+// fp0: float(ILOG)/Unchanged
+// fp1: x/10^ISCALE
+// fp2: x/x
+// F_SCR1:x/x
+// F_SCR2:Abs(X) with $3fff exponent/Unchanged
+// L_SCR1:x/x
+// L_SCR2:first word of X packed/Unchanged
+
+A7_str:
+ tstl %d7 //test sign of k
+ bgts k_pos //if pos and > 0, skip this
+ cmpl %d6,%d7 //test k - ILOG
+ blts k_pos //if ILOG >= k, skip this
+ movel %d7,%d6 //if ((k<0) & (ILOG < k)) ILOG = k
+k_pos:
+ movel %d6,%d0 //calc ILOG + 1 - LEN in d0
+ addql #1,%d0 //add the 1
+ subl %d4,%d0 //sub off LEN
+ swap %d5 //use upper word of d5 for LAMBDA
+ clrw %d5 //set it zero initially
+ clrw %d2 //set up d2 for very small case
+ tstl %d0 //test sign of ISCALE
+ bges iscale //if pos, skip next inst
+ addqw #1,%d5 //if neg, set LAMBDA true
+ cmpl #0xffffecd4,%d0 //test iscale <= -4908
+ bgts no_inf //if false, skip rest
+ addil #24,%d0 //add in 24 to iscale
+ movel #24,%d2 //put 24 in d2 for A9
+no_inf:
+ negl %d0 //and take abs of ISCALE
+iscale:
+ fmoves FONE,%fp1 //init fp1 to 1
+ bfextu USER_FPCR(%a6){#26:#2},%d1 //get initial rmode bits
+ lslw #1,%d1 //put them in bits 2:1
+ addw %d5,%d1 //add in LAMBDA
+ lslw #1,%d1 //put them in bits 3:1
+ tstl L_SCR2(%a6) //test sign of original x
+ bges x_pos //if pos, don't set bit 0
+ addql #1,%d1 //if neg, set bit 0
+x_pos:
+ leal RBDTBL,%a2 //load rbdtbl base
+ moveb (%a2,%d1),%d3 //load d3 with new rmode
+ lsll #4,%d3 //put bits in proper position
+ fmovel %d3,%fpcr //load bits into fpu
+ lsrl #4,%d3 //put bits in proper position
+ tstb %d3 //decode new rmode for pten table
+ bnes not_rn //if zero, it is RN
+ leal PTENRN,%a1 //load a1 with RN table base
+ bras rmode //exit decode
+not_rn:
+ lsrb #1,%d3 //get lsb in carry
+ bccs not_rp //if carry clear, it is RM
+ leal PTENRP,%a1 //load a1 with RP table base
+ bras rmode //exit decode
+not_rp:
+ leal PTENRM,%a1 //load a1 with RM table base
+rmode:
+ clrl %d3 //clr table index
+e_loop:
+ lsrl #1,%d0 //shift next bit into carry
+ bccs e_next //if zero, skip the mul
+ fmulx (%a1,%d3),%fp1 //mul by 10**(d3_bit_no)
+e_next:
+ addl #12,%d3 //inc d3 to next pwrten table entry
+ tstl %d0 //test if ISCALE is zero
+ bnes e_loop //if not, loop
+
+
+// A8. Clr INEX; Force RZ.
+// The operation in A3 above may have set INEX2.
+// RZ mode is forced for the scaling operation to insure
+// only one rounding error. The grs bits are collected in
+// the INEX flag for use in A10.
+//
+// Register usage:
+// Input/Output
+
+ fmovel #0,%FPSR //clr INEX
+ fmovel #rz_mode,%FPCR //set RZ rounding mode
+
+
+// A9. Scale X -> Y.
+// The mantissa is scaled to the desired number of significant
+// digits. The excess digits are collected in INEX2. If mul,
+// Check d2 for excess 10 exponential value. If not zero,
+// the iscale value would have caused the pwrten calculation
+// to overflow. Only a negative iscale can cause this, so
+// multiply by 10^(d2), which is now only allowed to be 24,
+// with a multiply by 10^8 and 10^16, which is exact since
+// 10^24 is exact. If the input was denormalized, we must
+// create a busy stack frame with the mul command and the
+// two operands, and allow the fpu to complete the multiply.
+//
+// Register usage:
+// Input/Output
+// d0: FPCR with RZ mode/Unchanged
+// d2: 0 or 24/unchanged
+// d3: x/x
+// d4: LEN/Unchanged
+// d5: ICTR:LAMBDA
+// d6: ILOG/Unchanged
+// d7: k-factor/Unchanged
+// a0: ptr for original operand/final result
+// a1: ptr to PTENRM array/Unchanged
+// a2: x/x
+// fp0: float(ILOG)/X adjusted for SCALE (Y)
+// fp1: 10^ISCALE/Unchanged
+// fp2: x/x
+// F_SCR1:x/x
+// F_SCR2:Abs(X) with $3fff exponent/Unchanged
+// L_SCR1:x/x
+// L_SCR2:first word of X packed/Unchanged
+
+A9_str:
+ fmovex (%a0),%fp0 //load X from memory
+ fabsx %fp0 //use abs(X)
+ tstw %d5 //LAMBDA is in lower word of d5
+ bnes sc_mul //if neg (LAMBDA = 1), scale by mul
+ fdivx %fp1,%fp0 //calculate X / SCALE -> Y to fp0
+ bras A10_st //branch to A10
+
+sc_mul:
+ tstb BINDEC_FLG(%a6) //check for denorm
+ beqs A9_norm //if norm, continue with mul
+ fmovemx %fp1-%fp1,-(%a7) //load ETEMP with 10^ISCALE
+ movel 8(%a0),-(%a7) //load FPTEMP with input arg
+ movel 4(%a0),-(%a7)
+ movel (%a0),-(%a7)
+ movel #18,%d3 //load count for busy stack
+A9_loop:
+ clrl -(%a7) //clear lword on stack
+ dbf %d3,A9_loop
+ moveb VER_TMP(%a6),(%a7) //write current version number
+ moveb #BUSY_SIZE-4,1(%a7) //write current busy size
+ moveb #0x10,0x44(%a7) //set fcefpte[15] bit
+ movew #0x0023,0x40(%a7) //load cmdreg1b with mul command
+ moveb #0xfe,0x8(%a7) //load all 1s to cu savepc
+ frestore (%a7)+ //restore frame to fpu for completion
+ fmulx 36(%a1),%fp0 //multiply fp0 by 10^8
+ fmulx 48(%a1),%fp0 //multiply fp0 by 10^16
+ bras A10_st
+A9_norm:
+ tstw %d2 //test for small exp case
+ beqs A9_con //if zero, continue as normal
+ fmulx 36(%a1),%fp0 //multiply fp0 by 10^8
+ fmulx 48(%a1),%fp0 //multiply fp0 by 10^16
+A9_con:
+ fmulx %fp1,%fp0 //calculate X * SCALE -> Y to fp0
+
+
+// A10. Or in INEX.
+// If INEX is set, round error occurred. This is compensated
+// for by 'or-ing' in the INEX2 flag to the lsb of Y.
+//
+// Register usage:
+// Input/Output
+// d0: FPCR with RZ mode/FPSR with INEX2 isolated
+// d2: x/x
+// d3: x/x
+// d4: LEN/Unchanged
+// d5: ICTR:LAMBDA
+// d6: ILOG/Unchanged
+// d7: k-factor/Unchanged
+// a0: ptr for original operand/final result
+// a1: ptr to PTENxx array/Unchanged
+// a2: x/ptr to FP_SCR2(a6)
+// fp0: Y/Y with lsb adjusted
+// fp1: 10^ISCALE/Unchanged
+// fp2: x/x
+
+A10_st:
+ fmovel %FPSR,%d0 //get FPSR
+ fmovex %fp0,FP_SCR2(%a6) //move Y to memory
+ leal FP_SCR2(%a6),%a2 //load a2 with ptr to FP_SCR2
+ btstl #9,%d0 //check if INEX2 set
+ beqs A11_st //if clear, skip rest
+ oril #1,8(%a2) //or in 1 to lsb of mantissa
+ fmovex FP_SCR2(%a6),%fp0 //write adjusted Y back to fpu
+
+
+// A11. Restore original FPCR; set size ext.
+// Perform FINT operation in the user's rounding mode. Keep
+// the size to extended. The sintdo entry point in the sint
+// routine expects the FPCR value to be in USER_FPCR for
+// mode and precision. The original FPCR is saved in L_SCR1.
+
+A11_st:
+ movel USER_FPCR(%a6),L_SCR1(%a6) //save it for later
+ andil #0x00000030,USER_FPCR(%a6) //set size to ext,
+// ;block exceptions
+
+
+// A12. Calculate YINT = FINT(Y) according to user's rounding mode.
+// The FPSP routine sintd0 is used. The output is in fp0.
+//
+// Register usage:
+// Input/Output
+// d0: FPSR with AINEX cleared/FPCR with size set to ext
+// d2: x/x/scratch
+// d3: x/x
+// d4: LEN/Unchanged
+// d5: ICTR:LAMBDA/Unchanged
+// d6: ILOG/Unchanged
+// d7: k-factor/Unchanged
+// a0: ptr for original operand/src ptr for sintdo
+// a1: ptr to PTENxx array/Unchanged
+// a2: ptr to FP_SCR2(a6)/Unchanged
+// a6: temp pointer to FP_SCR2(a6) - orig value saved and restored
+// fp0: Y/YINT
+// fp1: 10^ISCALE/Unchanged
+// fp2: x/x
+// F_SCR1:x/x
+// F_SCR2:Y adjusted for inex/Y with original exponent
+// L_SCR1:x/original USER_FPCR
+// L_SCR2:first word of X packed/Unchanged
+
+A12_st:
+ moveml %d0-%d1/%a0-%a1,-(%a7) //save regs used by sintd0
+ movel L_SCR1(%a6),-(%a7)
+ movel L_SCR2(%a6),-(%a7)
+ leal FP_SCR2(%a6),%a0 //a0 is ptr to F_SCR2(a6)
+ fmovex %fp0,(%a0) //move Y to memory at FP_SCR2(a6)
+ tstl L_SCR2(%a6) //test sign of original operand
+ bges do_fint //if pos, use Y
+ orl #0x80000000,(%a0) //if neg, use -Y
+do_fint:
+ movel USER_FPSR(%a6),-(%a7)
+ bsr sintdo //sint routine returns int in fp0
+ moveb (%a7),USER_FPSR(%a6)
+ addl #4,%a7
+ movel (%a7)+,L_SCR2(%a6)
+ movel (%a7)+,L_SCR1(%a6)
+ moveml (%a7)+,%d0-%d1/%a0-%a1 //restore regs used by sint
+ movel L_SCR2(%a6),FP_SCR2(%a6) //restore original exponent
+ movel L_SCR1(%a6),USER_FPCR(%a6) //restore user's FPCR
+
+
+// A13. Check for LEN digits.
+// If the int operation results in more than LEN digits,
+// or less than LEN -1 digits, adjust ILOG and repeat from
+// A6. This test occurs only on the first pass. If the
+// result is exactly 10^LEN, decrement ILOG and divide
+// the mantissa by 10. The calculation of 10^LEN cannot
+// be inexact, since all powers of ten upto 10^27 are exact
+// in extended precision, so the use of a previous power-of-ten
+// table will introduce no error.
+//
+//
+// Register usage:
+// Input/Output
+// d0: FPCR with size set to ext/scratch final = 0
+// d2: x/x
+// d3: x/scratch final = x
+// d4: LEN/LEN adjusted
+// d5: ICTR:LAMBDA/LAMBDA:ICTR
+// d6: ILOG/ILOG adjusted
+// d7: k-factor/Unchanged
+// a0: pointer into memory for packed bcd string formation
+// a1: ptr to PTENxx array/Unchanged
+// a2: ptr to FP_SCR2(a6)/Unchanged
+// fp0: int portion of Y/abs(YINT) adjusted
+// fp1: 10^ISCALE/Unchanged
+// fp2: x/10^LEN
+// F_SCR1:x/x
+// F_SCR2:Y with original exponent/Unchanged
+// L_SCR1:original USER_FPCR/Unchanged
+// L_SCR2:first word of X packed/Unchanged
+
+A13_st:
+ swap %d5 //put ICTR in lower word of d5
+ tstw %d5 //check if ICTR = 0
+ bne not_zr //if non-zero, go to second test
+//
+// Compute 10^(LEN-1)
+//
+ fmoves FONE,%fp2 //init fp2 to 1.0
+ movel %d4,%d0 //put LEN in d0
+ subql #1,%d0 //d0 = LEN -1
+ clrl %d3 //clr table index
+l_loop:
+ lsrl #1,%d0 //shift next bit into carry
+ bccs l_next //if zero, skip the mul
+ fmulx (%a1,%d3),%fp2 //mul by 10**(d3_bit_no)
+l_next:
+ addl #12,%d3 //inc d3 to next pwrten table entry
+ tstl %d0 //test if LEN is zero
+ bnes l_loop //if not, loop
+//
+// 10^LEN-1 is computed for this test and A14. If the input was
+// denormalized, check only the case in which YINT > 10^LEN.
+//
+ tstb BINDEC_FLG(%a6) //check if input was norm
+ beqs A13_con //if norm, continue with checking
+ fabsx %fp0 //take abs of YINT
+ bra test_2
+//
+// Compare abs(YINT) to 10^(LEN-1) and 10^LEN
+//
+A13_con:
+ fabsx %fp0 //take abs of YINT
+ fcmpx %fp2,%fp0 //compare abs(YINT) with 10^(LEN-1)
+ fbge test_2 //if greater, do next test
+ subql #1,%d6 //subtract 1 from ILOG
+ movew #1,%d5 //set ICTR
+ fmovel #rm_mode,%FPCR //set rmode to RM
+ fmuls FTEN,%fp2 //compute 10^LEN
+ bra A6_str //return to A6 and recompute YINT
+test_2:
+ fmuls FTEN,%fp2 //compute 10^LEN
+ fcmpx %fp2,%fp0 //compare abs(YINT) with 10^LEN
+ fblt A14_st //if less, all is ok, go to A14
+ fbgt fix_ex //if greater, fix and redo
+ fdivs FTEN,%fp0 //if equal, divide by 10
+ addql #1,%d6 // and inc ILOG
+ bras A14_st // and continue elsewhere
+fix_ex:
+ addql #1,%d6 //increment ILOG by 1
+ movew #1,%d5 //set ICTR
+ fmovel #rm_mode,%FPCR //set rmode to RM
+ bra A6_str //return to A6 and recompute YINT
+//
+// Since ICTR <> 0, we have already been through one adjustment,
+// and shouldn't have another; this is to check if abs(YINT) = 10^LEN
+// 10^LEN is again computed using whatever table is in a1 since the
+// value calculated cannot be inexact.
+//
+not_zr:
+ fmoves FONE,%fp2 //init fp2 to 1.0
+ movel %d4,%d0 //put LEN in d0
+ clrl %d3 //clr table index
+z_loop:
+ lsrl #1,%d0 //shift next bit into carry
+ bccs z_next //if zero, skip the mul
+ fmulx (%a1,%d3),%fp2 //mul by 10**(d3_bit_no)
+z_next:
+ addl #12,%d3 //inc d3 to next pwrten table entry
+ tstl %d0 //test if LEN is zero
+ bnes z_loop //if not, loop
+ fabsx %fp0 //get abs(YINT)
+ fcmpx %fp2,%fp0 //check if abs(YINT) = 10^LEN
+ fbne A14_st //if not, skip this
+ fdivs FTEN,%fp0 //divide abs(YINT) by 10
+ addql #1,%d6 //and inc ILOG by 1
+ addql #1,%d4 // and inc LEN
+ fmuls FTEN,%fp2 // if LEN++, the get 10^^LEN
+
+
+// A14. Convert the mantissa to bcd.
+// The binstr routine is used to convert the LEN digit
+// mantissa to bcd in memory. The input to binstr is
+// to be a fraction; i.e. (mantissa)/10^LEN and adjusted
+// such that the decimal point is to the left of bit 63.
+// The bcd digits are stored in the correct position in
+// the final string area in memory.
+//
+//
+// Register usage:
+// Input/Output
+// d0: x/LEN call to binstr - final is 0
+// d1: x/0
+// d2: x/ms 32-bits of mant of abs(YINT)
+// d3: x/ls 32-bits of mant of abs(YINT)
+// d4: LEN/Unchanged
+// d5: ICTR:LAMBDA/LAMBDA:ICTR
+// d6: ILOG
+// d7: k-factor/Unchanged
+// a0: pointer into memory for packed bcd string formation
+// /ptr to first mantissa byte in result string
+// a1: ptr to PTENxx array/Unchanged
+// a2: ptr to FP_SCR2(a6)/Unchanged
+// fp0: int portion of Y/abs(YINT) adjusted
+// fp1: 10^ISCALE/Unchanged
+// fp2: 10^LEN/Unchanged
+// F_SCR1:x/Work area for final result
+// F_SCR2:Y with original exponent/Unchanged
+// L_SCR1:original USER_FPCR/Unchanged
+// L_SCR2:first word of X packed/Unchanged
+
+A14_st:
+ fmovel #rz_mode,%FPCR //force rz for conversion
+ fdivx %fp2,%fp0 //divide abs(YINT) by 10^LEN
+ leal FP_SCR1(%a6),%a0
+ fmovex %fp0,(%a0) //move abs(YINT)/10^LEN to memory
+ movel 4(%a0),%d2 //move 2nd word of FP_RES to d2
+ movel 8(%a0),%d3 //move 3rd word of FP_RES to d3
+ clrl 4(%a0) //zero word 2 of FP_RES
+ clrl 8(%a0) //zero word 3 of FP_RES
+ movel (%a0),%d0 //move exponent to d0
+ swap %d0 //put exponent in lower word
+ beqs no_sft //if zero, don't shift
+ subil #0x3ffd,%d0 //sub bias less 2 to make fract
+ tstl %d0 //check if > 1
+ bgts no_sft //if so, don't shift
+ negl %d0 //make exp positive
+m_loop:
+ lsrl #1,%d2 //shift d2:d3 right, add 0s
+ roxrl #1,%d3 //the number of places
+ dbf %d0,m_loop //given in d0
+no_sft:
+ tstl %d2 //check for mantissa of zero
+ bnes no_zr //if not, go on
+ tstl %d3 //continue zero check
+ beqs zer_m //if zero, go directly to binstr
+no_zr:
+ clrl %d1 //put zero in d1 for addx
+ addil #0x00000080,%d3 //inc at bit 7
+ addxl %d1,%d2 //continue inc
+ andil #0xffffff80,%d3 //strip off lsb not used by 882
+zer_m:
+ movel %d4,%d0 //put LEN in d0 for binstr call
+ addql #3,%a0 //a0 points to M16 byte in result
+ bsr binstr //call binstr to convert mant
+
+
+// A15. Convert the exponent to bcd.
+// As in A14 above, the exp is converted to bcd and the
+// digits are stored in the final string.
+//
+// Digits are stored in L_SCR1(a6) on return from BINDEC as:
+//
+// 32 16 15 0
+// -----------------------------------------
+// | 0 | e3 | e2 | e1 | e4 | X | X | X |
+// -----------------------------------------
+//
+// And are moved into their proper places in FP_SCR1. If digit e4
+// is non-zero, OPERR is signaled. In all cases, all 4 digits are
+// written as specified in the 881/882 manual for packed decimal.
+//
+// Register usage:
+// Input/Output
+// d0: x/LEN call to binstr - final is 0
+// d1: x/scratch (0);shift count for final exponent packing
+// d2: x/ms 32-bits of exp fraction/scratch
+// d3: x/ls 32-bits of exp fraction
+// d4: LEN/Unchanged
+// d5: ICTR:LAMBDA/LAMBDA:ICTR
+// d6: ILOG
+// d7: k-factor/Unchanged
+// a0: ptr to result string/ptr to L_SCR1(a6)
+// a1: ptr to PTENxx array/Unchanged
+// a2: ptr to FP_SCR2(a6)/Unchanged
+// fp0: abs(YINT) adjusted/float(ILOG)
+// fp1: 10^ISCALE/Unchanged
+// fp2: 10^LEN/Unchanged
+// F_SCR1:Work area for final result/BCD result
+// F_SCR2:Y with original exponent/ILOG/10^4
+// L_SCR1:original USER_FPCR/Exponent digits on return from binstr
+// L_SCR2:first word of X packed/Unchanged
+
+A15_st:
+ tstb BINDEC_FLG(%a6) //check for denorm
+ beqs not_denorm
+ ftstx %fp0 //test for zero
+ fbeq den_zero //if zero, use k-factor or 4933
+ fmovel %d6,%fp0 //float ILOG
+ fabsx %fp0 //get abs of ILOG
+ bras convrt
+den_zero:
+ tstl %d7 //check sign of the k-factor
+ blts use_ilog //if negative, use ILOG
+ fmoves F4933,%fp0 //force exponent to 4933
+ bras convrt //do it
+use_ilog:
+ fmovel %d6,%fp0 //float ILOG
+ fabsx %fp0 //get abs of ILOG
+ bras convrt
+not_denorm:
+ ftstx %fp0 //test for zero
+ fbne not_zero //if zero, force exponent
+ fmoves FONE,%fp0 //force exponent to 1
+ bras convrt //do it
+not_zero:
+ fmovel %d6,%fp0 //float ILOG
+ fabsx %fp0 //get abs of ILOG
+convrt:
+ fdivx 24(%a1),%fp0 //compute ILOG/10^4
+ fmovex %fp0,FP_SCR2(%a6) //store fp0 in memory
+ movel 4(%a2),%d2 //move word 2 to d2
+ movel 8(%a2),%d3 //move word 3 to d3
+ movew (%a2),%d0 //move exp to d0
+ beqs x_loop_fin //if zero, skip the shift
+ subiw #0x3ffd,%d0 //subtract off bias
+ negw %d0 //make exp positive
+x_loop:
+ lsrl #1,%d2 //shift d2:d3 right
+ roxrl #1,%d3 //the number of places
+ dbf %d0,x_loop //given in d0
+x_loop_fin:
+ clrl %d1 //put zero in d1 for addx
+ addil #0x00000080,%d3 //inc at bit 6
+ addxl %d1,%d2 //continue inc
+ andil #0xffffff80,%d3 //strip off lsb not used by 882
+ movel #4,%d0 //put 4 in d0 for binstr call
+ leal L_SCR1(%a6),%a0 //a0 is ptr to L_SCR1 for exp digits
+ bsr binstr //call binstr to convert exp
+ movel L_SCR1(%a6),%d0 //load L_SCR1 lword to d0
+ movel #12,%d1 //use d1 for shift count
+ lsrl %d1,%d0 //shift d0 right by 12
+ bfins %d0,FP_SCR1(%a6){#4:#12} //put e3:e2:e1 in FP_SCR1
+ lsrl %d1,%d0 //shift d0 right by 12
+ bfins %d0,FP_SCR1(%a6){#16:#4} //put e4 in FP_SCR1
+ tstb %d0 //check if e4 is zero
+ beqs A16_st //if zero, skip rest
+ orl #opaop_mask,USER_FPSR(%a6) //set OPERR & AIOP in USER_FPSR
+
+
+// A16. Write sign bits to final string.
+// Sigma is bit 31 of initial value; RHO is bit 31 of d6 (ILOG).
+//
+// Register usage:
+// Input/Output
+// d0: x/scratch - final is x
+// d2: x/x
+// d3: x/x
+// d4: LEN/Unchanged
+// d5: ICTR:LAMBDA/LAMBDA:ICTR
+// d6: ILOG/ILOG adjusted
+// d7: k-factor/Unchanged
+// a0: ptr to L_SCR1(a6)/Unchanged
+// a1: ptr to PTENxx array/Unchanged
+// a2: ptr to FP_SCR2(a6)/Unchanged
+// fp0: float(ILOG)/Unchanged
+// fp1: 10^ISCALE/Unchanged
+// fp2: 10^LEN/Unchanged
+// F_SCR1:BCD result with correct signs
+// F_SCR2:ILOG/10^4
+// L_SCR1:Exponent digits on return from binstr
+// L_SCR2:first word of X packed/Unchanged
+
+A16_st:
+ clrl %d0 //clr d0 for collection of signs
+ andib #0x0f,FP_SCR1(%a6) //clear first nibble of FP_SCR1
+ tstl L_SCR2(%a6) //check sign of original mantissa
+ bges mant_p //if pos, don't set SM
+ moveql #2,%d0 //move 2 in to d0 for SM
+mant_p:
+ tstl %d6 //check sign of ILOG
+ bges wr_sgn //if pos, don't set SE
+ addql #1,%d0 //set bit 0 in d0 for SE
+wr_sgn:
+ bfins %d0,FP_SCR1(%a6){#0:#2} //insert SM and SE into FP_SCR1
+
+// Clean up and restore all registers used.
+
+ fmovel #0,%FPSR //clear possible inex2/ainex bits
+ fmovemx (%a7)+,%fp0-%fp2
+ moveml (%a7)+,%d2-%d7/%a2
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/binstr.s b/c/src/lib/libcpu/m68k/m68040/fpsp/binstr.s
new file mode 100644
index 0000000000..5688d505f1
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/binstr.s
@@ -0,0 +1,140 @@
+//
+// binstr.sa 3.3 12/19/90
+//
+//
+// Description: Converts a 64-bit binary integer to bcd.
+//
+// Input: 64-bit binary integer in d2:d3, desired length (LEN) in
+// d0, and a pointer to start in memory for bcd characters
+// in d0. (This pointer must point to byte 4 of the first
+// lword of the packed decimal memory string.)
+//
+// Output: LEN bcd digits representing the 64-bit integer.
+//
+// Algorithm:
+// The 64-bit binary is assumed to have a decimal point before
+// bit 63. The fraction is multiplied by 10 using a mul by 2
+// shift and a mul by 8 shift. The bits shifted out of the
+// msb form a decimal digit. This process is iterated until
+// LEN digits are formed.
+//
+// A1. Init d7 to 1. D7 is the byte digit counter, and if 1, the
+// digit formed will be assumed the least significant. This is
+// to force the first byte formed to have a 0 in the upper 4 bits.
+//
+// A2. Beginning of the loop:
+// Copy the fraction in d2:d3 to d4:d5.
+//
+// A3. Multiply the fraction in d2:d3 by 8 using bit-field
+// extracts and shifts. The three msbs from d2 will go into
+// d1.
+//
+// A4. Multiply the fraction in d4:d5 by 2 using shifts. The msb
+// will be collected by the carry.
+//
+// A5. Add using the carry the 64-bit quantities in d2:d3 and d4:d5
+// into d2:d3. D1 will contain the bcd digit formed.
+//
+// A6. Test d7. If zero, the digit formed is the ms digit. If non-
+// zero, it is the ls digit. Put the digit in its place in the
+// upper word of d0. If it is the ls digit, write the word
+// from d0 to memory.
+//
+// A7. Decrement d6 (LEN counter) and repeat the loop until zero.
+//
+// Implementation Notes:
+//
+// The registers are used as follows:
+//
+// d0: LEN counter
+// d1: temp used to form the digit
+// d2: upper 32-bits of fraction for mul by 8
+// d3: lower 32-bits of fraction for mul by 8
+// d4: upper 32-bits of fraction for mul by 2
+// d5: lower 32-bits of fraction for mul by 2
+// d6: temp for bit-field extracts
+// d7: byte digit formation word;digit count {0,1}
+// a0: pointer into memory for packed bcd string formation
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//BINSTR idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ .global binstr
+binstr:
+ moveml %d0-%d7,-(%a7)
+//
+// A1: Init d7
+//
+ moveql #1,%d7 //init d7 for second digit
+ subql #1,%d0 //for dbf d0 would have LEN+1 passes
+//
+// A2. Copy d2:d3 to d4:d5. Start loop.
+//
+loop:
+ movel %d2,%d4 //copy the fraction before muls
+ movel %d3,%d5 //to d4:d5
+//
+// A3. Multiply d2:d3 by 8; extract msbs into d1.
+//
+ bfextu %d2{#0:#3},%d1 //copy 3 msbs of d2 into d1
+ asll #3,%d2 //shift d2 left by 3 places
+ bfextu %d3{#0:#3},%d6 //copy 3 msbs of d3 into d6
+ asll #3,%d3 //shift d3 left by 3 places
+ orl %d6,%d2 //or in msbs from d3 into d2
+//
+// A4. Multiply d4:d5 by 2; add carry out to d1.
+//
+ asll #1,%d5 //mul d5 by 2
+ roxll #1,%d4 //mul d4 by 2
+ swap %d6 //put 0 in d6 lower word
+ addxw %d6,%d1 //add in extend from mul by 2
+//
+// A5. Add mul by 8 to mul by 2. D1 contains the digit formed.
+//
+ addl %d5,%d3 //add lower 32 bits
+ nop //ERRATA ; FIX #13 (Rev. 1.2 6/6/90)
+ addxl %d4,%d2 //add with extend upper 32 bits
+ nop //ERRATA ; FIX #13 (Rev. 1.2 6/6/90)
+ addxw %d6,%d1 //add in extend from add to d1
+ swap %d6 //with d6 = 0; put 0 in upper word
+//
+// A6. Test d7 and branch.
+//
+ tstw %d7 //if zero, store digit & to loop
+ beqs first_d //if non-zero, form byte & write
+sec_d:
+ swap %d7 //bring first digit to word d7b
+ aslw #4,%d7 //first digit in upper 4 bits d7b
+ addw %d1,%d7 //add in ls digit to d7b
+ moveb %d7,(%a0)+ //store d7b byte in memory
+ swap %d7 //put LEN counter in word d7a
+ clrw %d7 //set d7a to signal no digits done
+ dbf %d0,loop //do loop some more!
+ bras end_bstr //finished, so exit
+first_d:
+ swap %d7 //put digit word in d7b
+ movew %d1,%d7 //put new digit in d7b
+ swap %d7 //put LEN counter in word d7a
+ addqw #1,%d7 //set d7a to signal first digit done
+ dbf %d0,loop //do loop some more!
+ swap %d7 //put last digit in string
+ lslw #4,%d7 //move it to upper 4 bits
+ moveb %d7,(%a0)+ //store it in memory string
+//
+// Clean up and return with result in fp0.
+//
+end_bstr:
+ moveml (%a7)+,%d0-%d7
+ rts
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/bugfix.s b/c/src/lib/libcpu/m68k/m68040/fpsp/bugfix.s
new file mode 100644
index 0000000000..c5ad7617cd
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/bugfix.s
@@ -0,0 +1,496 @@
+//
+// bugfix.sa 3.2 1/31/91
+//
+//
+// This file contains workarounds for bugs in the 040
+// relating to the Floating-Point Software Package (FPSP)
+//
+// Fixes for bugs: 1238
+//
+// Bug: 1238
+//
+//
+// /* The following dirty_bit clear should be left in
+// * the handler permanently to improve throughput.
+// * The dirty_bits are located at bits [23:16] in
+// * longword $08 in the busy frame $4x60. Bit 16
+// * corresponds to FP0, bit 17 corresponds to FP1,
+// * and so on.
+// */
+// if (E3_exception_just_serviced) {
+// dirty_bit[cmdreg3b[9:7]] = 0;
+// }
+//
+// if (fsave_format_version != $40) {goto NOFIX}
+//
+// if !(E3_exception_just_serviced) {goto NOFIX}
+// if (cupc == 0000000) {goto NOFIX}
+// if ((cmdreg1b[15:13] != 000) &&
+// (cmdreg1b[15:10] != 010001)) {goto NOFIX}
+// if (((cmdreg1b[15:13] != 000) || ((cmdreg1b[12:10] != cmdreg2b[9:7]) &&
+// (cmdreg1b[12:10] != cmdreg3b[9:7])) ) &&
+// ((cmdreg1b[ 9: 7] != cmdreg2b[9:7]) &&
+// (cmdreg1b[ 9: 7] != cmdreg3b[9:7])) ) {goto NOFIX}
+//
+// /* Note: for 6d43b or 8d43b, you may want to add the following code
+// * to get better coverage. (If you do not insert this code, the part
+// * won't lock up; it will simply get the wrong answer.)
+// * Do NOT insert this code for 10d43b or later parts.
+// *
+// * if (fpiarcu == integer stack return address) {
+// * cupc = 0000000;
+// * goto NOFIX;
+// * }
+// */
+//
+// if (cmdreg1b[15:13] != 000) {goto FIX_OPCLASS2}
+// FIX_OPCLASS0:
+// if (((cmdreg1b[12:10] == cmdreg2b[9:7]) ||
+// (cmdreg1b[ 9: 7] == cmdreg2b[9:7])) &&
+// (cmdreg1b[12:10] != cmdreg3b[9:7]) &&
+// (cmdreg1b[ 9: 7] != cmdreg3b[9:7])) { /* xu conflict only */
+// /* We execute the following code if there is an
+// xu conflict and NOT an nu conflict */
+//
+// /* first save some values on the fsave frame */
+// stag_temp = STAG[fsave_frame];
+// cmdreg1b_temp = CMDREG1B[fsave_frame];
+// dtag_temp = DTAG[fsave_frame];
+// ete15_temp = ETE15[fsave_frame];
+//
+// CUPC[fsave_frame] = 0000000;
+// FRESTORE
+// FSAVE
+//
+// /* If the xu instruction is exceptional, we punt.
+// * Otherwise, we would have to include OVFL/UNFL handler
+// * code here to get the correct answer.
+// */
+// if (fsave_frame_format == $4060) {goto KILL_PROCESS}
+//
+// fsave_frame = /* build a long frame of all zeros */
+// fsave_frame_format = $4060; /* label it as long frame */
+//
+// /* load it with the temps we saved */
+// STAG[fsave_frame] = stag_temp;
+// CMDREG1B[fsave_frame] = cmdreg1b_temp;
+// DTAG[fsave_frame] = dtag_temp;
+// ETE15[fsave_frame] = ete15_temp;
+//
+// /* Make sure that the cmdreg3b dest reg is not going to
+// * be destroyed by a FMOVEM at the end of all this code.
+// * If it is, you should move the current value of the reg
+// * onto the stack so that the reg will loaded with that value.
+// */
+//
+// /* All done. Proceed with the code below */
+// }
+//
+// etemp = FP_reg_[cmdreg1b[12:10]];
+// ete15 = ~ete14;
+// cmdreg1b[15:10] = 010010;
+// clear(bug_flag_procIDxxxx);
+// FRESTORE and return;
+//
+//
+// FIX_OPCLASS2:
+// if ((cmdreg1b[9:7] == cmdreg2b[9:7]) &&
+// (cmdreg1b[9:7] != cmdreg3b[9:7])) { /* xu conflict only */
+// /* We execute the following code if there is an
+// xu conflict and NOT an nu conflict */
+//
+// /* first save some values on the fsave frame */
+// stag_temp = STAG[fsave_frame];
+// cmdreg1b_temp = CMDREG1B[fsave_frame];
+// dtag_temp = DTAG[fsave_frame];
+// ete15_temp = ETE15[fsave_frame];
+// etemp_temp = ETEMP[fsave_frame];
+//
+// CUPC[fsave_frame] = 0000000;
+// FRESTORE
+// FSAVE
+//
+//
+// /* If the xu instruction is exceptional, we punt.
+// * Otherwise, we would have to include OVFL/UNFL handler
+// * code here to get the correct answer.
+// */
+// if (fsave_frame_format == $4060) {goto KILL_PROCESS}
+//
+// fsave_frame = /* build a long frame of all zeros */
+// fsave_frame_format = $4060; /* label it as long frame */
+//
+// /* load it with the temps we saved */
+// STAG[fsave_frame] = stag_temp;
+// CMDREG1B[fsave_frame] = cmdreg1b_temp;
+// DTAG[fsave_frame] = dtag_temp;
+// ETE15[fsave_frame] = ete15_temp;
+// ETEMP[fsave_frame] = etemp_temp;
+//
+// /* Make sure that the cmdreg3b dest reg is not going to
+// * be destroyed by a FMOVEM at the end of all this code.
+// * If it is, you should move the current value of the reg
+// * onto the stack so that the reg will loaded with that value.
+// */
+//
+// /* All done. Proceed with the code below */
+// }
+//
+// if (etemp_exponent == min_sgl) etemp_exponent = min_dbl;
+// if (etemp_exponent == max_sgl) etemp_exponent = max_dbl;
+// cmdreg1b[15:10] = 010101;
+// clear(bug_flag_procIDxxxx);
+// FRESTORE and return;
+//
+//
+// NOFIX:
+// clear(bug_flag_procIDxxxx);
+// FRESTORE and return;
+//
+
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//BUGFIX idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref fpsp_fmt_error
+
+ .global b1238_fix
+b1238_fix:
+//
+// This code is entered only on completion of the handling of an
+// nu-generated ovfl, unfl, or inex exception. If the version
+// number of the fsave is not $40, this handler is not necessary.
+// Simply branch to fix_done and exit normally.
+//
+ cmpib #VER_40,4(%a7)
+ bne fix_done
+//
+// Test for cu_savepc equal to zero. If not, this is not a bug
+// #1238 case.
+//
+ moveb CU_SAVEPC(%a6),%d0
+ andib #0xFE,%d0
+ beq fix_done //if zero, this is not bug #1238
+
+//
+// Test the register conflict aspect. If opclass0, check for
+// cu src equal to xu dest or equal to nu dest. If so, go to
+// op0. Else, or if opclass2, check for cu dest equal to
+// xu dest or equal to nu dest. If so, go to tst_opcl. Else,
+// exit, it is not the bug case.
+//
+// Check for opclass 0. If not, go and check for opclass 2 and sgl.
+//
+ movew CMDREG1B(%a6),%d0
+ andiw #0xE000,%d0 //strip all but opclass
+ bne op2sgl //not opclass 0, check op2
+//
+// Check for cu and nu register conflict. If one exists, this takes
+// priority over a cu and xu conflict.
+//
+ bfextu CMDREG1B(%a6){#3:#3},%d0 //get 1st src
+ bfextu CMDREG3B(%a6){#6:#3},%d1 //get 3rd dest
+ cmpb %d0,%d1
+ beqs op0 //if equal, continue bugfix
+//
+// Check for cu dest equal to nu dest. If so, go and fix the
+// bug condition. Otherwise, exit.
+//
+ bfextu CMDREG1B(%a6){#6:#3},%d0 //get 1st dest
+ cmpb %d0,%d1 //cmp 1st dest with 3rd dest
+ beqs op0 //if equal, continue bugfix
+//
+// Check for cu and xu register conflict.
+//
+ bfextu CMDREG2B(%a6){#6:#3},%d1 //get 2nd dest
+ cmpb %d0,%d1 //cmp 1st dest with 2nd dest
+ beqs op0_xu //if equal, continue bugfix
+ bfextu CMDREG1B(%a6){#3:#3},%d0 //get 1st src
+ cmpb %d0,%d1 //cmp 1st src with 2nd dest
+ beq op0_xu
+ bne fix_done //if the reg checks fail, exit
+//
+// We have the opclass 0 situation.
+//
+op0:
+ bfextu CMDREG1B(%a6){#3:#3},%d0 //get source register no
+ movel #7,%d1
+ subl %d0,%d1
+ clrl %d0
+ bsetl %d1,%d0
+ fmovemx %d0,ETEMP(%a6) //load source to ETEMP
+
+ moveb #0x12,%d0
+ bfins %d0,CMDREG1B(%a6){#0:#6} //opclass 2, extended
+//
+// Set ETEMP exponent bit 15 as the opposite of ete14
+//
+ btst #6,ETEMP_EX(%a6) //check etemp exponent bit 14
+ beq setete15
+ bclr #etemp15_bit,STAG(%a6)
+ bra finish
+setete15:
+ bset #etemp15_bit,STAG(%a6)
+ bra finish
+
+//
+// We have the case in which a conflict exists between the cu src or
+// dest and the dest of the xu. We must clear the instruction in
+// the cu and restore the state, allowing the instruction in the
+// xu to complete. Remember, the instruction in the nu
+// was exceptional, and was completed by the appropriate handler.
+// If the result of the xu instruction is not exceptional, we can
+// restore the instruction from the cu to the frame and continue
+// processing the original exception. If the result is also
+// exceptional, we choose to kill the process.
+//
+// Items saved from the stack:
+//
+// $3c stag - L_SCR1
+// $40 cmdreg1b - L_SCR2
+// $44 dtag - L_SCR3
+//
+// The cu savepc is set to zero, and the frame is restored to the
+// fpu.
+//
+op0_xu:
+ movel STAG(%a6),L_SCR1(%a6)
+ movel CMDREG1B(%a6),L_SCR2(%a6)
+ movel DTAG(%a6),L_SCR3(%a6)
+ andil #0xe0000000,L_SCR3(%a6)
+ moveb #0,CU_SAVEPC(%a6)
+ movel (%a7)+,%d1 //save return address from bsr
+ frestore (%a7)+
+ fsave -(%a7)
+//
+// Check if the instruction which just completed was exceptional.
+//
+ cmpw #0x4060,(%a7)
+ beq op0_xb
+//
+// It is necessary to isolate the result of the instruction in the
+// xu if it is to fp0 - fp3 and write that value to the USER_FPn
+// locations on the stack. The correct destination register is in
+// cmdreg2b.
+//
+ bfextu CMDREG2B(%a6){#6:#3},%d0 //get dest register no
+ cmpil #3,%d0
+ bgts op0_xi
+ beqs op0_fp3
+ cmpil #1,%d0
+ blts op0_fp0
+ beqs op0_fp1
+op0_fp2:
+ fmovemx %fp2-%fp2,USER_FP2(%a6)
+ bras op0_xi
+op0_fp1:
+ fmovemx %fp1-%fp1,USER_FP1(%a6)
+ bras op0_xi
+op0_fp0:
+ fmovemx %fp0-%fp0,USER_FP0(%a6)
+ bras op0_xi
+op0_fp3:
+ fmovemx %fp3-%fp3,USER_FP3(%a6)
+//
+// The frame returned is idle. We must build a busy frame to hold
+// the cu state information and setup etemp.
+//
+op0_xi:
+ movel #22,%d0 //clear 23 lwords
+ clrl (%a7)
+op0_loop:
+ clrl -(%a7)
+ dbf %d0,op0_loop
+ movel #0x40600000,-(%a7)
+ movel L_SCR1(%a6),STAG(%a6)
+ movel L_SCR2(%a6),CMDREG1B(%a6)
+ movel L_SCR3(%a6),DTAG(%a6)
+ moveb #0x6,CU_SAVEPC(%a6)
+ movel %d1,-(%a7) //return bsr return address
+ bfextu CMDREG1B(%a6){#3:#3},%d0 //get source register no
+ movel #7,%d1
+ subl %d0,%d1
+ clrl %d0
+ bsetl %d1,%d0
+ fmovemx %d0,ETEMP(%a6) //load source to ETEMP
+
+ moveb #0x12,%d0
+ bfins %d0,CMDREG1B(%a6){#0:#6} //opclass 2, extended
+//
+// Set ETEMP exponent bit 15 as the opposite of ete14
+//
+ btst #6,ETEMP_EX(%a6) //check etemp exponent bit 14
+ beq op0_sete15
+ bclr #etemp15_bit,STAG(%a6)
+ bra finish
+op0_sete15:
+ bset #etemp15_bit,STAG(%a6)
+ bra finish
+
+//
+// The frame returned is busy. It is not possible to reconstruct
+// the code sequence to allow completion. We will jump to
+// fpsp_fmt_error and allow the kernel to kill the process.
+//
+op0_xb:
+ jmp fpsp_fmt_error
+
+//
+// Check for opclass 2 and single size. If not both, exit.
+//
+op2sgl:
+ movew CMDREG1B(%a6),%d0
+ andiw #0xFC00,%d0 //strip all but opclass and size
+ cmpiw #0x4400,%d0 //test for opclass 2 and size=sgl
+ bne fix_done //if not, it is not bug 1238
+//
+// Check for cu dest equal to nu dest or equal to xu dest, with
+// a cu and nu conflict taking priority an nu conflict. If either,
+// go and fix the bug condition. Otherwise, exit.
+//
+ bfextu CMDREG1B(%a6){#6:#3},%d0 //get 1st dest
+ bfextu CMDREG3B(%a6){#6:#3},%d1 //get 3rd dest
+ cmpb %d0,%d1 //cmp 1st dest with 3rd dest
+ beq op2_com //if equal, continue bugfix
+ bfextu CMDREG2B(%a6){#6:#3},%d1 //get 2nd dest
+ cmpb %d0,%d1 //cmp 1st dest with 2nd dest
+ bne fix_done //if the reg checks fail, exit
+//
+// We have the case in which a conflict exists between the cu src or
+// dest and the dest of the xu. We must clear the instruction in
+// the cu and restore the state, allowing the instruction in the
+// xu to complete. Remember, the instruction in the nu
+// was exceptional, and was completed by the appropriate handler.
+// If the result of the xu instruction is not exceptional, we can
+// restore the instruction from the cu to the frame and continue
+// processing the original exception. If the result is also
+// exceptional, we choose to kill the process.
+//
+// Items saved from the stack:
+//
+// $3c stag - L_SCR1
+// $40 cmdreg1b - L_SCR2
+// $44 dtag - L_SCR3
+// etemp - FP_SCR2
+//
+// The cu savepc is set to zero, and the frame is restored to the
+// fpu.
+//
+op2_xu:
+ movel STAG(%a6),L_SCR1(%a6)
+ movel CMDREG1B(%a6),L_SCR2(%a6)
+ movel DTAG(%a6),L_SCR3(%a6)
+ andil #0xe0000000,L_SCR3(%a6)
+ moveb #0,CU_SAVEPC(%a6)
+ movel ETEMP(%a6),FP_SCR2(%a6)
+ movel ETEMP_HI(%a6),FP_SCR2+4(%a6)
+ movel ETEMP_LO(%a6),FP_SCR2+8(%a6)
+ movel (%a7)+,%d1 //save return address from bsr
+ frestore (%a7)+
+ fsave -(%a7)
+//
+// Check if the instruction which just completed was exceptional.
+//
+ cmpw #0x4060,(%a7)
+ beq op2_xb
+//
+// It is necessary to isolate the result of the instruction in the
+// xu if it is to fp0 - fp3 and write that value to the USER_FPn
+// locations on the stack. The correct destination register is in
+// cmdreg2b.
+//
+ bfextu CMDREG2B(%a6){#6:#3},%d0 //get dest register no
+ cmpil #3,%d0
+ bgts op2_xi
+ beqs op2_fp3
+ cmpil #1,%d0
+ blts op2_fp0
+ beqs op2_fp1
+op2_fp2:
+ fmovemx %fp2-%fp2,USER_FP2(%a6)
+ bras op2_xi
+op2_fp1:
+ fmovemx %fp1-%fp1,USER_FP1(%a6)
+ bras op2_xi
+op2_fp0:
+ fmovemx %fp0-%fp0,USER_FP0(%a6)
+ bras op2_xi
+op2_fp3:
+ fmovemx %fp3-%fp3,USER_FP3(%a6)
+//
+// The frame returned is idle. We must build a busy frame to hold
+// the cu state information and fix up etemp.
+//
+op2_xi:
+ movel #22,%d0 //clear 23 lwords
+ clrl (%a7)
+op2_loop:
+ clrl -(%a7)
+ dbf %d0,op2_loop
+ movel #0x40600000,-(%a7)
+ movel L_SCR1(%a6),STAG(%a6)
+ movel L_SCR2(%a6),CMDREG1B(%a6)
+ movel L_SCR3(%a6),DTAG(%a6)
+ moveb #0x6,CU_SAVEPC(%a6)
+ movel FP_SCR2(%a6),ETEMP(%a6)
+ movel FP_SCR2+4(%a6),ETEMP_HI(%a6)
+ movel FP_SCR2+8(%a6),ETEMP_LO(%a6)
+ movel %d1,-(%a7)
+ bra op2_com
+
+//
+// We have the opclass 2 single source situation.
+//
+op2_com:
+ moveb #0x15,%d0
+ bfins %d0,CMDREG1B(%a6){#0:#6} //opclass 2, double
+
+ cmpw #0x407F,ETEMP_EX(%a6) //single +max
+ bnes case2
+ movew #0x43FF,ETEMP_EX(%a6) //to double +max
+ bra finish
+case2:
+ cmpw #0xC07F,ETEMP_EX(%a6) //single -max
+ bnes case3
+ movew #0xC3FF,ETEMP_EX(%a6) //to double -max
+ bra finish
+case3:
+ cmpw #0x3F80,ETEMP_EX(%a6) //single +min
+ bnes case4
+ movew #0x3C00,ETEMP_EX(%a6) //to double +min
+ bra finish
+case4:
+ cmpw #0xBF80,ETEMP_EX(%a6) //single -min
+ bne fix_done
+ movew #0xBC00,ETEMP_EX(%a6) //to double -min
+ bra finish
+//
+// The frame returned is busy. It is not possible to reconstruct
+// the code sequence to allow completion. fpsp_fmt_error causes
+// an fline illegal instruction to be executed.
+//
+// You should replace the jump to fpsp_fmt_error with a jump
+// to the entry point used to kill a process.
+//
+op2_xb:
+ jmp fpsp_fmt_error
+
+//
+// Enter here if the case is not of the situations affected by
+// bug #1238, or if the fix is completed, and exit.
+//
+finish:
+fix_done:
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/decbin.s b/c/src/lib/libcpu/m68k/m68040/fpsp/decbin.s
new file mode 100644
index 0000000000..c1abffe4b3
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/decbin.s
@@ -0,0 +1,506 @@
+//
+// decbin.sa 3.3 12/19/90
+//
+// Description: Converts normalized packed bcd value pointed to by
+// register A6 to extended-precision value in FP0.
+//
+// Input: Normalized packed bcd value in ETEMP(a6).
+//
+// Output: Exact floating-point representation of the packed bcd value.
+//
+// Saves and Modifies: D2-D5
+//
+// Speed: The program decbin takes ??? cycles to execute.
+//
+// Object Size:
+//
+// External Reference(s): None.
+//
+// Algorithm:
+// Expected is a normal bcd (i.e. non-exceptional; all inf, zero,
+// and NaN operands are dispatched without entering this routine)
+// value in 68881/882 format at location ETEMP(A6).
+//
+// A1. Convert the bcd exponent to binary by successive adds and muls.
+// Set the sign according to SE. Subtract 16 to compensate
+// for the mantissa which is to be interpreted as 17 integer
+// digits, rather than 1 integer and 16 fraction digits.
+// Note: this operation can never overflow.
+//
+// A2. Convert the bcd mantissa to binary by successive
+// adds and muls in FP0. Set the sign according to SM.
+// The mantissa digits will be converted with the decimal point
+// assumed following the least-significant digit.
+// Note: this operation can never overflow.
+//
+// A3. Count the number of leading/trailing zeros in the
+// bcd string. If SE is positive, count the leading zeros;
+// if negative, count the trailing zeros. Set the adjusted
+// exponent equal to the exponent from A1 and the zero count
+// added if SM = 1 and subtracted if SM = 0. Scale the
+// mantissa the equivalent of forcing in the bcd value:
+//
+// SM = 0 a non-zero digit in the integer position
+// SM = 1 a non-zero digit in Mant0, lsd of the fraction
+//
+// this will insure that any value, regardless of its
+// representation (ex. 0.1E2, 1E1, 10E0, 100E-1), is converted
+// consistently.
+//
+// A4. Calculate the factor 10^exp in FP1 using a table of
+// 10^(2^n) values. To reduce the error in forming factors
+// greater than 10^27, a directed rounding scheme is used with
+// tables rounded to RN, RM, and RP, according to the table
+// in the comments of the pwrten section.
+//
+// A5. Form the final binary number by scaling the mantissa by
+// the exponent factor. This is done by multiplying the
+// mantissa in FP0 by the factor in FP1 if the adjusted
+// exponent sign is positive, and dividing FP0 by FP1 if
+// it is negative.
+//
+// Clean up and return. Check if the final mul or div resulted
+// in an inex2 exception. If so, set inex1 in the fpsr and
+// check if the inex1 exception is enabled. If so, set d7 upper
+// word to $0100. This will signal unimp.sa that an enabled inex1
+// exception occurred. Unimp will fix the stack.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//DECBIN idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+//
+// PTENRN, PTENRM, and PTENRP are arrays of powers of 10 rounded
+// to nearest, minus, and plus, respectively. The tables include
+// 10**{1,2,4,8,16,32,64,128,256,512,1024,2048,4096}. No rounding
+// is required until the power is greater than 27, however, all
+// tables include the first 5 for ease of indexing.
+//
+ |xref PTENRN
+ |xref PTENRM
+ |xref PTENRP
+
+RTABLE: .byte 0,0,0,0
+ .byte 2,3,2,3
+ .byte 2,3,3,2
+ .byte 3,2,2,3
+
+ .global decbin
+ .global calc_e
+ .global pwrten
+ .global calc_m
+ .global norm
+ .global ap_st_z
+ .global ap_st_n
+//
+ .set FNIBS,7
+ .set FSTRT,0
+//
+ .set ESTRT,4
+ .set EDIGITS,2 //
+//
+// Constants in single precision
+FZERO: .long 0x00000000
+FONE: .long 0x3F800000
+FTEN: .long 0x41200000
+
+ .set TEN,10
+
+//
+decbin:
+ | fmovel #0,FPCR ;clr real fpcr
+ moveml %d2-%d5,-(%a7)
+//
+// Calculate exponent:
+// 1. Copy bcd value in memory for use as a working copy.
+// 2. Calculate absolute value of exponent in d1 by mul and add.
+// 3. Correct for exponent sign.
+// 4. Subtract 16 to compensate for interpreting the mant as all integer digits.
+// (i.e., all digits assumed left of the decimal point.)
+//
+// Register usage:
+//
+// calc_e:
+// (*) d0: temp digit storage
+// (*) d1: accumulator for binary exponent
+// (*) d2: digit count
+// (*) d3: offset pointer
+// ( ) d4: first word of bcd
+// ( ) a0: pointer to working bcd value
+// ( ) a6: pointer to original bcd value
+// (*) FP_SCR1: working copy of original bcd value
+// (*) L_SCR1: copy of original exponent word
+//
+calc_e:
+ movel #EDIGITS,%d2 //# of nibbles (digits) in fraction part
+ moveql #ESTRT,%d3 //counter to pick up digits
+ leal FP_SCR1(%a6),%a0 //load tmp bcd storage address
+ movel ETEMP(%a6),(%a0) //save input bcd value
+ movel ETEMP_HI(%a6),4(%a0) //save words 2 and 3
+ movel ETEMP_LO(%a6),8(%a0) //and work with these
+ movel (%a0),%d4 //get first word of bcd
+ clrl %d1 //zero d1 for accumulator
+e_gd:
+ mulul #TEN,%d1 //mul partial product by one digit place
+ bfextu %d4{%d3:#4},%d0 //get the digit and zero extend into d0
+ addl %d0,%d1 //d1 = d1 + d0
+ addqb #4,%d3 //advance d3 to the next digit
+ dbf %d2,e_gd //if we have used all 3 digits, exit loop
+ btst #30,%d4 //get SE
+ beqs e_pos //don't negate if pos
+ negl %d1 //negate before subtracting
+e_pos:
+ subl #16,%d1 //sub to compensate for shift of mant
+ bges e_save //if still pos, do not neg
+ negl %d1 //now negative, make pos and set SE
+ orl #0x40000000,%d4 //set SE in d4,
+ orl #0x40000000,(%a0) //and in working bcd
+e_save:
+ movel %d1,L_SCR1(%a6) //save exp in memory
+//
+//
+// Calculate mantissa:
+// 1. Calculate absolute value of mantissa in fp0 by mul and add.
+// 2. Correct for mantissa sign.
+// (i.e., all digits assumed left of the decimal point.)
+//
+// Register usage:
+//
+// calc_m:
+// (*) d0: temp digit storage
+// (*) d1: lword counter
+// (*) d2: digit count
+// (*) d3: offset pointer
+// ( ) d4: words 2 and 3 of bcd
+// ( ) a0: pointer to working bcd value
+// ( ) a6: pointer to original bcd value
+// (*) fp0: mantissa accumulator
+// ( ) FP_SCR1: working copy of original bcd value
+// ( ) L_SCR1: copy of original exponent word
+//
+calc_m:
+ moveql #1,%d1 //word counter, init to 1
+ fmoves FZERO,%fp0 //accumulator
+//
+//
+// Since the packed number has a long word between the first & second parts,
+// get the integer digit then skip down & get the rest of the
+// mantissa. We will unroll the loop once.
+//
+ bfextu (%a0){#28:#4},%d0 //integer part is ls digit in long word
+ faddb %d0,%fp0 //add digit to sum in fp0
+//
+//
+// Get the rest of the mantissa.
+//
+loadlw:
+ movel (%a0,%d1.L*4),%d4 //load mantissa longword into d4
+ moveql #FSTRT,%d3 //counter to pick up digits
+ moveql #FNIBS,%d2 //reset number of digits per a0 ptr
+md2b:
+ fmuls FTEN,%fp0 //fp0 = fp0 * 10
+ bfextu %d4{%d3:#4},%d0 //get the digit and zero extend
+ faddb %d0,%fp0 //fp0 = fp0 + digit
+//
+//
+// If all the digits (8) in that long word have been converted (d2=0),
+// then inc d1 (=2) to point to the next long word and reset d3 to 0
+// to initialize the digit offset, and set d2 to 7 for the digit count;
+// else continue with this long word.
+//
+ addqb #4,%d3 //advance d3 to the next digit
+ dbf %d2,md2b //check for last digit in this lw
+nextlw:
+ addql #1,%d1 //inc lw pointer in mantissa
+ cmpl #2,%d1 //test for last lw
+ ble loadlw //if not, get last one
+
+//
+// Check the sign of the mant and make the value in fp0 the same sign.
+//
+m_sign:
+ btst #31,(%a0) //test sign of the mantissa
+ beqs ap_st_z //if clear, go to append/strip zeros
+ fnegx %fp0 //if set, negate fp0
+
+//
+// Append/strip zeros:
+//
+// For adjusted exponents which have an absolute value greater than 27*,
+// this routine calculates the amount needed to normalize the mantissa
+// for the adjusted exponent. That number is subtracted from the exp
+// if the exp was positive, and added if it was negative. The purpose
+// of this is to reduce the value of the exponent and the possibility
+// of error in calculation of pwrten.
+//
+// 1. Branch on the sign of the adjusted exponent.
+// 2p.(positive exp)
+// 2. Check M16 and the digits in lwords 2 and 3 in descending order.
+// 3. Add one for each zero encountered until a non-zero digit.
+// 4. Subtract the count from the exp.
+// 5. Check if the exp has crossed zero in #3 above; make the exp abs
+// and set SE.
+// 6. Multiply the mantissa by 10**count.
+// 2n.(negative exp)
+// 2. Check the digits in lwords 3 and 2 in descending order.
+// 3. Add one for each zero encountered until a non-zero digit.
+// 4. Add the count to the exp.
+// 5. Check if the exp has crossed zero in #3 above; clear SE.
+// 6. Divide the mantissa by 10**count.
+//
+// *Why 27? If the adjusted exponent is within -28 < expA < 28, than
+// any adjustment due to append/strip zeros will drive the resultant
+// exponent towards zero. Since all pwrten constants with a power
+// of 27 or less are exact, there is no need to use this routine to
+// attempt to lessen the resultant exponent.
+//
+// Register usage:
+//
+// ap_st_z:
+// (*) d0: temp digit storage
+// (*) d1: zero count
+// (*) d2: digit count
+// (*) d3: offset pointer
+// ( ) d4: first word of bcd
+// (*) d5: lword counter
+// ( ) a0: pointer to working bcd value
+// ( ) FP_SCR1: working copy of original bcd value
+// ( ) L_SCR1: copy of original exponent word
+//
+//
+// First check the absolute value of the exponent to see if this
+// routine is necessary. If so, then check the sign of the exponent
+// and do append (+) or strip (-) zeros accordingly.
+// This section handles a positive adjusted exponent.
+//
+ap_st_z:
+ movel L_SCR1(%a6),%d1 //load expA for range test
+ cmpl #27,%d1 //test is with 27
+ ble pwrten //if abs(expA) <28, skip ap/st zeros
+ btst #30,(%a0) //check sign of exp
+ bnes ap_st_n //if neg, go to neg side
+ clrl %d1 //zero count reg
+ movel (%a0),%d4 //load lword 1 to d4
+ bfextu %d4{#28:#4},%d0 //get M16 in d0
+ bnes ap_p_fx //if M16 is non-zero, go fix exp
+ addql #1,%d1 //inc zero count
+ moveql #1,%d5 //init lword counter
+ movel (%a0,%d5.L*4),%d4 //get lword 2 to d4
+ bnes ap_p_cl //if lw 2 is zero, skip it
+ addql #8,%d1 //and inc count by 8
+ addql #1,%d5 //inc lword counter
+ movel (%a0,%d5.L*4),%d4 //get lword 3 to d4
+ap_p_cl:
+ clrl %d3 //init offset reg
+ moveql #7,%d2 //init digit counter
+ap_p_gd:
+ bfextu %d4{%d3:#4},%d0 //get digit
+ bnes ap_p_fx //if non-zero, go to fix exp
+ addql #4,%d3 //point to next digit
+ addql #1,%d1 //inc digit counter
+ dbf %d2,ap_p_gd //get next digit
+ap_p_fx:
+ movel %d1,%d0 //copy counter to d2
+ movel L_SCR1(%a6),%d1 //get adjusted exp from memory
+ subl %d0,%d1 //subtract count from exp
+ bges ap_p_fm //if still pos, go to pwrten
+ negl %d1 //now its neg; get abs
+ movel (%a0),%d4 //load lword 1 to d4
+ orl #0x40000000,%d4 // and set SE in d4
+ orl #0x40000000,(%a0) // and in memory
+//
+// Calculate the mantissa multiplier to compensate for the striping of
+// zeros from the mantissa.
+//
+ap_p_fm:
+ movel #PTENRN,%a1 //get address of power-of-ten table
+ clrl %d3 //init table index
+ fmoves FONE,%fp1 //init fp1 to 1
+ moveql #3,%d2 //init d2 to count bits in counter
+ap_p_el:
+ asrl #1,%d0 //shift lsb into carry
+ bccs ap_p_en //if 1, mul fp1 by pwrten factor
+ fmulx (%a1,%d3),%fp1 //mul by 10**(d3_bit_no)
+ap_p_en:
+ addl #12,%d3 //inc d3 to next rtable entry
+ tstl %d0 //check if d0 is zero
+ bnes ap_p_el //if not, get next bit
+ fmulx %fp1,%fp0 //mul mantissa by 10**(no_bits_shifted)
+ bras pwrten //go calc pwrten
+//
+// This section handles a negative adjusted exponent.
+//
+ap_st_n:
+ clrl %d1 //clr counter
+ moveql #2,%d5 //set up d5 to point to lword 3
+ movel (%a0,%d5.L*4),%d4 //get lword 3
+ bnes ap_n_cl //if not zero, check digits
+ subl #1,%d5 //dec d5 to point to lword 2
+ addql #8,%d1 //inc counter by 8
+ movel (%a0,%d5.L*4),%d4 //get lword 2
+ap_n_cl:
+ movel #28,%d3 //point to last digit
+ moveql #7,%d2 //init digit counter
+ap_n_gd:
+ bfextu %d4{%d3:#4},%d0 //get digit
+ bnes ap_n_fx //if non-zero, go to exp fix
+ subql #4,%d3 //point to previous digit
+ addql #1,%d1 //inc digit counter
+ dbf %d2,ap_n_gd //get next digit
+ap_n_fx:
+ movel %d1,%d0 //copy counter to d0
+ movel L_SCR1(%a6),%d1 //get adjusted exp from memory
+ subl %d0,%d1 //subtract count from exp
+ bgts ap_n_fm //if still pos, go fix mantissa
+ negl %d1 //take abs of exp and clr SE
+ movel (%a0),%d4 //load lword 1 to d4
+ andl #0xbfffffff,%d4 // and clr SE in d4
+ andl #0xbfffffff,(%a0) // and in memory
+//
+// Calculate the mantissa multiplier to compensate for the appending of
+// zeros to the mantissa.
+//
+ap_n_fm:
+ movel #PTENRN,%a1 //get address of power-of-ten table
+ clrl %d3 //init table index
+ fmoves FONE,%fp1 //init fp1 to 1
+ moveql #3,%d2 //init d2 to count bits in counter
+ap_n_el:
+ asrl #1,%d0 //shift lsb into carry
+ bccs ap_n_en //if 1, mul fp1 by pwrten factor
+ fmulx (%a1,%d3),%fp1 //mul by 10**(d3_bit_no)
+ap_n_en:
+ addl #12,%d3 //inc d3 to next rtable entry
+ tstl %d0 //check if d0 is zero
+ bnes ap_n_el //if not, get next bit
+ fdivx %fp1,%fp0 //div mantissa by 10**(no_bits_shifted)
+//
+//
+// Calculate power-of-ten factor from adjusted and shifted exponent.
+//
+// Register usage:
+//
+// pwrten:
+// (*) d0: temp
+// ( ) d1: exponent
+// (*) d2: {FPCR[6:5],SM,SE} as index in RTABLE; temp
+// (*) d3: FPCR work copy
+// ( ) d4: first word of bcd
+// (*) a1: RTABLE pointer
+// calc_p:
+// (*) d0: temp
+// ( ) d1: exponent
+// (*) d3: PWRTxx table index
+// ( ) a0: pointer to working copy of bcd
+// (*) a1: PWRTxx pointer
+// (*) fp1: power-of-ten accumulator
+//
+// Pwrten calculates the exponent factor in the selected rounding mode
+// according to the following table:
+//
+// Sign of Mant Sign of Exp Rounding Mode PWRTEN Rounding Mode
+//
+// ANY ANY RN RN
+//
+// + + RP RP
+// - + RP RM
+// + - RP RM
+// - - RP RP
+//
+// + + RM RM
+// - + RM RP
+// + - RM RP
+// - - RM RM
+//
+// + + RZ RM
+// - + RZ RM
+// + - RZ RP
+// - - RZ RP
+//
+//
+pwrten:
+ movel USER_FPCR(%a6),%d3 //get user's FPCR
+ bfextu %d3{#26:#2},%d2 //isolate rounding mode bits
+ movel (%a0),%d4 //reload 1st bcd word to d4
+ asll #2,%d2 //format d2 to be
+ bfextu %d4{#0:#2},%d0 // {FPCR[6],FPCR[5],SM,SE}
+ addl %d0,%d2 //in d2 as index into RTABLE
+ leal RTABLE,%a1 //load rtable base
+ moveb (%a1,%d2),%d0 //load new rounding bits from table
+ clrl %d3 //clear d3 to force no exc and extended
+ bfins %d0,%d3{#26:#2} //stuff new rounding bits in FPCR
+ fmovel %d3,%FPCR //write new FPCR
+ asrl #1,%d0 //write correct PTENxx table
+ bccs not_rp //to a1
+ leal PTENRP,%a1 //it is RP
+ bras calc_p //go to init section
+not_rp:
+ asrl #1,%d0 //keep checking
+ bccs not_rm
+ leal PTENRM,%a1 //it is RM
+ bras calc_p //go to init section
+not_rm:
+ leal PTENRN,%a1 //it is RN
+calc_p:
+ movel %d1,%d0 //copy exp to d0;use d0
+ bpls no_neg //if exp is negative,
+ negl %d0 //invert it
+ orl #0x40000000,(%a0) //and set SE bit
+no_neg:
+ clrl %d3 //table index
+ fmoves FONE,%fp1 //init fp1 to 1
+e_loop:
+ asrl #1,%d0 //shift next bit into carry
+ bccs e_next //if zero, skip the mul
+ fmulx (%a1,%d3),%fp1 //mul by 10**(d3_bit_no)
+e_next:
+ addl #12,%d3 //inc d3 to next rtable entry
+ tstl %d0 //check if d0 is zero
+ bnes e_loop //not zero, continue shifting
+//
+//
+// Check the sign of the adjusted exp and make the value in fp0 the
+// same sign. If the exp was pos then multiply fp1*fp0;
+// else divide fp0/fp1.
+//
+// Register Usage:
+// norm:
+// ( ) a0: pointer to working bcd value
+// (*) fp0: mantissa accumulator
+// ( ) fp1: scaling factor - 10**(abs(exp))
+//
+norm:
+ btst #30,(%a0) //test the sign of the exponent
+ beqs mul //if clear, go to multiply
+div:
+ fdivx %fp1,%fp0 //exp is negative, so divide mant by exp
+ bras end_dec
+mul:
+ fmulx %fp1,%fp0 //exp is positive, so multiply by exp
+//
+//
+// Clean up and return with result in fp0.
+//
+// If the final mul/div in decbin incurred an inex exception,
+// it will be inex2, but will be reported as inex1 by get_op.
+//
+end_dec:
+ fmovel %FPSR,%d0 //get status register
+ bclrl #inex2_bit+8,%d0 //test for inex2 and clear it
+ fmovel %d0,%FPSR //return status reg w/o inex2
+ beqs no_exc //skip this if no exc
+ orl #inx1a_mask,USER_FPSR(%a6) //set inex1/ainex
+no_exc:
+ moveml (%a7)+,%d2-%d5
+ rts
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/do_func.s b/c/src/lib/libcpu/m68k/m68040/fpsp/do_func.s
new file mode 100644
index 0000000000..e7fcbbb36a
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/do_func.s
@@ -0,0 +1,559 @@
+//
+// do_func.sa 3.4 2/18/91
+//
+// Do_func performs the unimplemented operation. The operation
+// to be performed is determined from the lower 7 bits of the
+// extension word (except in the case of fmovecr and fsincos).
+// The opcode and tag bits form an index into a jump table in
+// tbldo.sa. Cases of zero, infinity and NaN are handled in
+// do_func by forcing the default result. Normalized and
+// denormalized (there are no unnormalized numbers at this
+// point) are passed onto the emulation code.
+//
+// CMDREG1B and STAG are extracted from the fsave frame
+// and combined to form the table index. The function called
+// will start with a0 pointing to the ETEMP operand. Dyadic
+// functions can find FPTEMP at -12(a0).
+//
+// Called functions return their result in fp0. Sincos returns
+// sin(x) in fp0 and cos(x) in fp1.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+DO_FUNC: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref t_dz2
+ |xref t_operr
+ |xref t_inx2
+ |xref t_resdnrm
+ |xref dst_nan
+ |xref src_nan
+ |xref nrm_set
+ |xref sto_cos
+
+ |xref tblpre
+ |xref slognp1,slogn,slog10,slog2
+ |xref slognd,slog10d,slog2d
+ |xref smod,srem
+ |xref sscale
+ |xref smovcr
+
+PONE: .long 0x3fff0000,0x80000000,0x00000000 //+1
+MONE: .long 0xbfff0000,0x80000000,0x00000000 //-1
+PZERO: .long 0x00000000,0x00000000,0x00000000 //+0
+MZERO: .long 0x80000000,0x00000000,0x00000000 //-0
+PINF: .long 0x7fff0000,0x00000000,0x00000000 //+inf
+MINF: .long 0xffff0000,0x00000000,0x00000000 //-inf
+QNAN: .long 0x7fff0000,0xffffffff,0xffffffff //non-signaling nan
+PPIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235 //+PI/2
+MPIBY2: .long 0xbFFF0000,0xC90FDAA2,0x2168C235 //-PI/2
+
+ .global do_func
+do_func:
+ clrb CU_ONLY(%a6)
+//
+// Check for fmovecr. It does not follow the format of fp gen
+// unimplemented instructions. The test is on the upper 6 bits;
+// if they are $17, the inst is fmovecr. Call entry smovcr
+// directly.
+//
+ bfextu CMDREG1B(%a6){#0:#6},%d0 //get opclass and src fields
+ cmpil #0x17,%d0 //if op class and size fields are $17,
+// ;it is FMOVECR; if not, continue
+ bnes not_fmovecr
+ jmp smovcr //fmovecr; jmp directly to emulation
+
+not_fmovecr:
+ movew CMDREG1B(%a6),%d0
+ andl #0x7F,%d0
+ cmpil #0x38,%d0 //if the extension is >= $38,
+ bges serror //it is illegal
+ bfextu STAG(%a6){#0:#3},%d1
+ lsll #3,%d0 //make room for STAG
+ addl %d1,%d0 //combine for final index into table
+ leal tblpre,%a1 //start of monster jump table
+ movel (%a1,%d0.w*4),%a1 //real target address
+ leal ETEMP(%a6),%a0 //a0 is pointer to src op
+ movel USER_FPCR(%a6),%d1
+ andl #0xFF,%d1 // discard all but rounding mode/prec
+ fmovel #0,%fpcr
+ jmp (%a1)
+//
+// ERROR
+//
+ .global serror
+serror:
+ st STORE_FLG(%a6)
+ rts
+//
+// These routines load forced values into fp0. They are called
+// by index into tbldo.
+//
+// Load a signed zero to fp0 and set inex2/ainex
+//
+ .global snzrinx
+snzrinx:
+ btstb #sign_bit,LOCAL_EX(%a0) //get sign of source operand
+ bnes ld_mzinx //if negative, branch
+ bsr ld_pzero //bsr so we can return and set inx
+ bra t_inx2 //now, set the inx for the next inst
+ld_mzinx:
+ bsr ld_mzero //if neg, load neg zero, return here
+ bra t_inx2 //now, set the inx for the next inst
+//
+// Load a signed zero to fp0; do not set inex2/ainex
+//
+ .global szero
+szero:
+ btstb #sign_bit,LOCAL_EX(%a0) //get sign of source operand
+ bne ld_mzero //if neg, load neg zero
+ bra ld_pzero //load positive zero
+//
+// Load a signed infinity to fp0; do not set inex2/ainex
+//
+ .global sinf
+sinf:
+ btstb #sign_bit,LOCAL_EX(%a0) //get sign of source operand
+ bne ld_minf //if negative branch
+ bra ld_pinf
+//
+// Load a signed one to fp0; do not set inex2/ainex
+//
+ .global sone
+sone:
+ btstb #sign_bit,LOCAL_EX(%a0) //check sign of source
+ bne ld_mone
+ bra ld_pone
+//
+// Load a signed pi/2 to fp0; do not set inex2/ainex
+//
+ .global spi_2
+spi_2:
+ btstb #sign_bit,LOCAL_EX(%a0) //check sign of source
+ bne ld_mpi2
+ bra ld_ppi2
+//
+// Load either a +0 or +inf for plus/minus operand
+//
+ .global szr_inf
+szr_inf:
+ btstb #sign_bit,LOCAL_EX(%a0) //check sign of source
+ bne ld_pzero
+ bra ld_pinf
+//
+// Result is either an operr or +inf for plus/minus operand
+// [Used by slogn, slognp1, slog10, and slog2]
+//
+ .global sopr_inf
+sopr_inf:
+ btstb #sign_bit,LOCAL_EX(%a0) //check sign of source
+ bne t_operr
+ bra ld_pinf
+//
+// FLOGNP1
+//
+ .global sslognp1
+sslognp1:
+ fmovemx (%a0),%fp0-%fp0
+ fcmpb #-1,%fp0
+ fbgt slognp1
+ fbeq t_dz2 //if = -1, divide by zero exception
+ fmovel #0,%FPSR //clr N flag
+ bra t_operr //take care of operands < -1
+//
+// FETOXM1
+//
+ .global setoxm1i
+setoxm1i:
+ btstb #sign_bit,LOCAL_EX(%a0) //check sign of source
+ bne ld_mone
+ bra ld_pinf
+//
+// FLOGN
+//
+// Test for 1.0 as an input argument, returning +zero. Also check
+// the sign and return operr if negative.
+//
+ .global sslogn
+sslogn:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ bne t_operr //take care of operands < 0
+ cmpiw #0x3fff,LOCAL_EX(%a0) //test for 1.0 input
+ bne slogn
+ cmpil #0x80000000,LOCAL_HI(%a0)
+ bne slogn
+ tstl LOCAL_LO(%a0)
+ bne slogn
+ fmovex PZERO,%fp0
+ rts
+
+ .global sslognd
+sslognd:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ beq slognd
+ bra t_operr //take care of operands < 0
+
+//
+// FLOG10
+//
+ .global sslog10
+sslog10:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ bne t_operr //take care of operands < 0
+ cmpiw #0x3fff,LOCAL_EX(%a0) //test for 1.0 input
+ bne slog10
+ cmpil #0x80000000,LOCAL_HI(%a0)
+ bne slog10
+ tstl LOCAL_LO(%a0)
+ bne slog10
+ fmovex PZERO,%fp0
+ rts
+
+ .global sslog10d
+sslog10d:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ beq slog10d
+ bra t_operr //take care of operands < 0
+
+//
+// FLOG2
+//
+ .global sslog2
+sslog2:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ bne t_operr //take care of operands < 0
+ cmpiw #0x3fff,LOCAL_EX(%a0) //test for 1.0 input
+ bne slog2
+ cmpil #0x80000000,LOCAL_HI(%a0)
+ bne slog2
+ tstl LOCAL_LO(%a0)
+ bne slog2
+ fmovex PZERO,%fp0
+ rts
+
+ .global sslog2d
+sslog2d:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ beq slog2d
+ bra t_operr //take care of operands < 0
+
+//
+// FMOD
+//
+pmodt:
+// ;$21 fmod
+// ;dtag,stag
+ .long smod // 00,00 norm,norm = normal
+ .long smod_oper // 00,01 norm,zero = nan with operr
+ .long smod_fpn // 00,10 norm,inf = fpn
+ .long smod_snan // 00,11 norm,nan = nan
+ .long smod_zro // 01,00 zero,norm = +-zero
+ .long smod_oper // 01,01 zero,zero = nan with operr
+ .long smod_zro // 01,10 zero,inf = +-zero
+ .long smod_snan // 01,11 zero,nan = nan
+ .long smod_oper // 10,00 inf,norm = nan with operr
+ .long smod_oper // 10,01 inf,zero = nan with operr
+ .long smod_oper // 10,10 inf,inf = nan with operr
+ .long smod_snan // 10,11 inf,nan = nan
+ .long smod_dnan // 11,00 nan,norm = nan
+ .long smod_dnan // 11,01 nan,zero = nan
+ .long smod_dnan // 11,10 nan,inf = nan
+ .long smod_dnan // 11,11 nan,nan = nan
+
+ .global pmod
+pmod:
+ clrb FPSR_QBYTE(%a6) // clear quotient field
+ bfextu STAG(%a6){#0:#3},%d0 //stag = d0
+ bfextu DTAG(%a6){#0:#3},%d1 //dtag = d1
+
+//
+// Alias extended denorms to norms for the jump table.
+//
+ bclrl #2,%d0
+ bclrl #2,%d1
+
+ lslb #2,%d1
+ orb %d0,%d1 //d1{3:2} = dtag, d1{1:0} = stag
+// ;Tag values:
+// ;00 = norm or denorm
+// ;01 = zero
+// ;10 = inf
+// ;11 = nan
+ lea pmodt,%a1
+ movel (%a1,%d1.w*4),%a1
+ jmp (%a1)
+
+smod_snan:
+ bra src_nan
+smod_dnan:
+ bra dst_nan
+smod_oper:
+ bra t_operr
+smod_zro:
+ moveb ETEMP(%a6),%d1 //get sign of src op
+ moveb FPTEMP(%a6),%d0 //get sign of dst op
+ eorb %d0,%d1 //get exor of sign bits
+ btstl #7,%d1 //test for sign
+ beqs smod_zsn //if clr, do not set sign big
+ bsetb #q_sn_bit,FPSR_QBYTE(%a6) //set q-byte sign bit
+smod_zsn:
+ btstl #7,%d0 //test if + or -
+ beq ld_pzero //if pos then load +0
+ bra ld_mzero //else neg load -0
+
+smod_fpn:
+ moveb ETEMP(%a6),%d1 //get sign of src op
+ moveb FPTEMP(%a6),%d0 //get sign of dst op
+ eorb %d0,%d1 //get exor of sign bits
+ btstl #7,%d1 //test for sign
+ beqs smod_fsn //if clr, do not set sign big
+ bsetb #q_sn_bit,FPSR_QBYTE(%a6) //set q-byte sign bit
+smod_fsn:
+ tstb DTAG(%a6) //filter out denormal destination case
+ bpls smod_nrm //
+ leal FPTEMP(%a6),%a0 //a0<- addr(FPTEMP)
+ bra t_resdnrm //force UNFL(but exact) result
+smod_nrm:
+ fmovel USER_FPCR(%a6),%fpcr //use user's rmode and precision
+ fmovex FPTEMP(%a6),%fp0 //return dest to fp0
+ rts
+
+//
+// FREM
+//
+premt:
+// ;$25 frem
+// ;dtag,stag
+ .long srem // 00,00 norm,norm = normal
+ .long srem_oper // 00,01 norm,zero = nan with operr
+ .long srem_fpn // 00,10 norm,inf = fpn
+ .long srem_snan // 00,11 norm,nan = nan
+ .long srem_zro // 01,00 zero,norm = +-zero
+ .long srem_oper // 01,01 zero,zero = nan with operr
+ .long srem_zro // 01,10 zero,inf = +-zero
+ .long srem_snan // 01,11 zero,nan = nan
+ .long srem_oper // 10,00 inf,norm = nan with operr
+ .long srem_oper // 10,01 inf,zero = nan with operr
+ .long srem_oper // 10,10 inf,inf = nan with operr
+ .long srem_snan // 10,11 inf,nan = nan
+ .long srem_dnan // 11,00 nan,norm = nan
+ .long srem_dnan // 11,01 nan,zero = nan
+ .long srem_dnan // 11,10 nan,inf = nan
+ .long srem_dnan // 11,11 nan,nan = nan
+
+ .global prem
+prem:
+ clrb FPSR_QBYTE(%a6) //clear quotient field
+ bfextu STAG(%a6){#0:#3},%d0 //stag = d0
+ bfextu DTAG(%a6){#0:#3},%d1 //dtag = d1
+//
+// Alias extended denorms to norms for the jump table.
+//
+ bclr #2,%d0
+ bclr #2,%d1
+
+ lslb #2,%d1
+ orb %d0,%d1 //d1{3:2} = dtag, d1{1:0} = stag
+// ;Tag values:
+// ;00 = norm or denorm
+// ;01 = zero
+// ;10 = inf
+// ;11 = nan
+ lea premt,%a1
+ movel (%a1,%d1.w*4),%a1
+ jmp (%a1)
+
+srem_snan:
+ bra src_nan
+srem_dnan:
+ bra dst_nan
+srem_oper:
+ bra t_operr
+srem_zro:
+ moveb ETEMP(%a6),%d1 //get sign of src op
+ moveb FPTEMP(%a6),%d0 //get sign of dst op
+ eorb %d0,%d1 //get exor of sign bits
+ btstl #7,%d1 //test for sign
+ beqs srem_zsn //if clr, do not set sign big
+ bsetb #q_sn_bit,FPSR_QBYTE(%a6) //set q-byte sign bit
+srem_zsn:
+ btstl #7,%d0 //test if + or -
+ beq ld_pzero //if pos then load +0
+ bra ld_mzero //else neg load -0
+
+srem_fpn:
+ moveb ETEMP(%a6),%d1 //get sign of src op
+ moveb FPTEMP(%a6),%d0 //get sign of dst op
+ eorb %d0,%d1 //get exor of sign bits
+ btstl #7,%d1 //test for sign
+ beqs srem_fsn //if clr, do not set sign big
+ bsetb #q_sn_bit,FPSR_QBYTE(%a6) //set q-byte sign bit
+srem_fsn:
+ tstb DTAG(%a6) //filter out denormal destination case
+ bpls srem_nrm //
+ leal FPTEMP(%a6),%a0 //a0<- addr(FPTEMP)
+ bra t_resdnrm //force UNFL(but exact) result
+srem_nrm:
+ fmovel USER_FPCR(%a6),%fpcr //use user's rmode and precision
+ fmovex FPTEMP(%a6),%fp0 //return dest to fp0
+ rts
+//
+// FSCALE
+//
+pscalet:
+// ;$26 fscale
+// ;dtag,stag
+ .long sscale // 00,00 norm,norm = result
+ .long sscale // 00,01 norm,zero = fpn
+ .long scl_opr // 00,10 norm,inf = nan with operr
+ .long scl_snan // 00,11 norm,nan = nan
+ .long scl_zro // 01,00 zero,norm = +-zero
+ .long scl_zro // 01,01 zero,zero = +-zero
+ .long scl_opr // 01,10 zero,inf = nan with operr
+ .long scl_snan // 01,11 zero,nan = nan
+ .long scl_inf // 10,00 inf,norm = +-inf
+ .long scl_inf // 10,01 inf,zero = +-inf
+ .long scl_opr // 10,10 inf,inf = nan with operr
+ .long scl_snan // 10,11 inf,nan = nan
+ .long scl_dnan // 11,00 nan,norm = nan
+ .long scl_dnan // 11,01 nan,zero = nan
+ .long scl_dnan // 11,10 nan,inf = nan
+ .long scl_dnan // 11,11 nan,nan = nan
+
+ .global pscale
+pscale:
+ bfextu STAG(%a6){#0:#3},%d0 //stag in d0
+ bfextu DTAG(%a6){#0:#3},%d1 //dtag in d1
+ bclrl #2,%d0 //alias denorm into norm
+ bclrl #2,%d1 //alias denorm into norm
+ lslb #2,%d1
+ orb %d0,%d1 //d1{4:2} = dtag, d1{1:0} = stag
+// ;dtag values stag values:
+// ;000 = norm 00 = norm
+// ;001 = zero 01 = zero
+// ;010 = inf 10 = inf
+// ;011 = nan 11 = nan
+// ;100 = dnrm
+//
+//
+ leal pscalet,%a1 //load start of jump table
+ movel (%a1,%d1.w*4),%a1 //load a1 with label depending on tag
+ jmp (%a1) //go to the routine
+
+scl_opr:
+ bra t_operr
+
+scl_dnan:
+ bra dst_nan
+
+scl_zro:
+ btstb #sign_bit,FPTEMP_EX(%a6) //test if + or -
+ beq ld_pzero //if pos then load +0
+ bra ld_mzero //if neg then load -0
+scl_inf:
+ btstb #sign_bit,FPTEMP_EX(%a6) //test if + or -
+ beq ld_pinf //if pos then load +inf
+ bra ld_minf //else neg load -inf
+scl_snan:
+ bra src_nan
+//
+// FSINCOS
+//
+ .global ssincosz
+ssincosz:
+ btstb #sign_bit,ETEMP(%a6) //get sign
+ beqs sincosp
+ fmovex MZERO,%fp0
+ bras sincoscom
+sincosp:
+ fmovex PZERO,%fp0
+sincoscom:
+ fmovemx PONE,%fp1-%fp1 //do not allow FPSR to be affected
+ bra sto_cos //store cosine result
+
+ .global ssincosi
+ssincosi:
+ fmovex QNAN,%fp1 //load NAN
+ bsr sto_cos //store cosine result
+ fmovex QNAN,%fp0 //load NAN
+ bra t_operr
+
+ .global ssincosnan
+ssincosnan:
+ movel ETEMP_EX(%a6),FP_SCR1(%a6)
+ movel ETEMP_HI(%a6),FP_SCR1+4(%a6)
+ movel ETEMP_LO(%a6),FP_SCR1+8(%a6)
+ bsetb #signan_bit,FP_SCR1+4(%a6)
+ fmovemx FP_SCR1(%a6),%fp1-%fp1
+ bsr sto_cos
+ bra src_nan
+//
+// This code forces default values for the zero, inf, and nan cases
+// in the transcendentals code. The CC bits must be set in the
+// stacked FPSR to be correctly reported.
+//
+//**Returns +PI/2
+ .global ld_ppi2
+ld_ppi2:
+ fmovex PPIBY2,%fp0 //load +pi/2
+ bra t_inx2 //set inex2 exc
+
+//**Returns -PI/2
+ .global ld_mpi2
+ld_mpi2:
+ fmovex MPIBY2,%fp0 //load -pi/2
+ orl #neg_mask,USER_FPSR(%a6) //set N bit
+ bra t_inx2 //set inex2 exc
+
+//**Returns +inf
+ .global ld_pinf
+ld_pinf:
+ fmovex PINF,%fp0 //load +inf
+ orl #inf_mask,USER_FPSR(%a6) //set I bit
+ rts
+
+//**Returns -inf
+ .global ld_minf
+ld_minf:
+ fmovex MINF,%fp0 //load -inf
+ orl #neg_mask+inf_mask,USER_FPSR(%a6) //set N and I bits
+ rts
+
+//**Returns +1
+ .global ld_pone
+ld_pone:
+ fmovex PONE,%fp0 //load +1
+ rts
+
+//**Returns -1
+ .global ld_mone
+ld_mone:
+ fmovex MONE,%fp0 //load -1
+ orl #neg_mask,USER_FPSR(%a6) //set N bit
+ rts
+
+//**Returns +0
+ .global ld_pzero
+ld_pzero:
+ fmovex PZERO,%fp0 //load +0
+ orl #z_mask,USER_FPSR(%a6) //set Z bit
+ rts
+
+//**Returns -0
+ .global ld_mzero
+ld_mzero:
+ fmovex MZERO,%fp0 //load -0
+ orl #neg_mask+z_mask,USER_FPSR(%a6) //set N and Z bits
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/fpsp.defs b/c/src/lib/libcpu/m68k/m68040/fpsp/fpsp.defs
new file mode 100644
index 0000000000..ca93677e98
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/fpsp.defs
@@ -0,0 +1,348 @@
+|
+| fpsp.h 3.3 3.3
+|
+
+| Copyright (C) Motorola, Inc. 1990
+| All Rights Reserved
+|
+| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+| The copyright notice above does not evidence any
+| actual or intended publication of such source code.
+
+| fpsp.h --- stack frame offsets during FPSP exception handling
+|
+| These equates are used to access the exception frame, the fsave
+| frame and any local variables needed by the FPSP package.
+|
+| All FPSP handlers begin by executing:
+|
+| link a6,#-LOCAL_SIZE
+| fsave -(a7)
+| movem.l d0-d1/a0-a1,USER_DA(a6)
+| fmovem.x fp0-fp3,USER_FP0(a6)
+| fmove.l fpsr/fpcr/fpiar,USER_FPSR(a6)
+|
+| After initialization, the stack looks like this:
+|
+| A7 ---> +-------------------------------+
+| | |
+| | FPU fsave area |
+| | |
+| +-------------------------------+
+| | |
+| | FPSP Local Variables |
+| | including |
+| | saved registers |
+| | |
+| +-------------------------------+
+| A6 ---> | Saved A6 |
+| +-------------------------------+
+| | |
+| | Exception Frame |
+| | |
+| | |
+|
+| Positive offsets from A6 refer to the exception frame. Negative
+| offsets refer to the Local Variable area and the fsave area.
+| The fsave frame is also accessible 'from the top' via A7.
+|
+| On exit, the handlers execute:
+|
+| movem.l USER_DA(a6),d0-d1/a0-a1
+| fmovem.x USER_FP0(a6),fp0-fp3
+| fmove.l USER_FPSR(a6),fpsr/fpcr/fpiar
+| frestore (a7)+
+| unlk a6
+|
+| and then either 'bra fpsp_done' if the exception was completely
+| handled by the package, or 'bra real_xxxx' which is an external
+| label to a routine that will process a real exception of the
+| type that was generated. Some handlers may omit the 'frestore'
+| if the FPU state after the exception is idle.
+|
+| Sometimes the exception handler will transform the fsave area
+| because it needs to report an exception back to the user. This
+| can happen if the package is entered for an unimplemented float
+| instruction that generates (say) an underflow. Alternatively,
+| a second fsave frame can be pushed onto the stack and the
+| handler exit code will reload the new frame and discard the old.
+|
+| The registers d0, d1, a0, a1 and fp0-fp3 are always saved and
+| restored from the 'local variable' area and can be used as
+| temporaries. If a routine needs to change any
+| of these registers, it should modify the saved copy and let
+| the handler exit code restore the value.
+|
+|----------------------------------------------------------------------
+|
+| Local Variables on the stack
+|
+ .set LOCAL_SIZE,192 | bytes needed for local variables
+ .set LV,-LOCAL_SIZE | convenient base value
+|
+ .set USER_DA,LV+0 | save space for D0-D1,A0-A1
+ .set USER_D0,LV+0 | saved user D0
+ .set USER_D1,LV+4 | saved user D1
+ .set USER_A0,LV+8 | saved user A0
+ .set USER_A1,LV+12 | saved user A1
+ .set USER_FP0,LV+16 | saved user FP0
+ .set USER_FP1,LV+28 | saved user FP1
+ .set USER_FP2,LV+40 | saved user FP2
+ .set USER_FP3,LV+52 | saved user FP3
+ .set USER_FPCR,LV+64 | saved user FPCR
+ .set FPCR_ENABLE,USER_FPCR+2 | FPCR exception enable
+ .set FPCR_MODE,USER_FPCR+3 | FPCR rounding mode control
+ .set USER_FPSR,LV+68 | saved user FPSR
+ .set FPSR_CC,USER_FPSR+0 | FPSR condition code
+ .set FPSR_QBYTE,USER_FPSR+1 | FPSR quotient
+ .set FPSR_EXCEPT,USER_FPSR+2 | FPSR exception
+ .set FPSR_AEXCEPT,USER_FPSR+3 | FPSR accrued exception
+ .set USER_FPIAR,LV+72 | saved user FPIAR
+ .set FP_SCR1,LV+76 | room for a temporary float value
+ .set FP_SCR2,LV+92 | room for a temporary float value
+ .set L_SCR1,LV+108 | room for a temporary long value
+ .set L_SCR2,LV+112 | room for a temporary long value
+ .set STORE_FLG,LV+116
+ .set BINDEC_FLG,LV+117 | used in bindec
+ .set DNRM_FLG,LV+118 | used in res_func
+ .set RES_FLG,LV+119 | used in res_func
+ .set DY_MO_FLG,LV+120 | dyadic/monadic flag
+ .set UFLG_TMP,LV+121 | temporary for uflag errata
+ .set CU_ONLY,LV+122 | cu-only flag
+ .set VER_TMP,LV+123 | temp holding for version number
+ .set L_SCR3,LV+124 | room for a temporary long value
+ .set FP_SCR3,LV+128 | room for a temporary float value
+ .set FP_SCR4,LV+144 | room for a temporary float value
+ .set FP_SCR5,LV+160 | room for a temporary float value
+ .set FP_SCR6,LV+176
+|
+|NEXT equ LV+192 ;need to increase LOCAL_SIZE
+|
+|--------------------------------------------------------------------------
+|
+| fsave offsets and bit definitions
+|
+| Offsets are defined from the end of an fsave because the last 10
+| words of a busy frame are the same as the unimplemented frame.
+|
+ .set CU_SAVEPC,LV-92 | micro-pc for CU (1 byte)
+ .set FPR_DIRTY_BITS,LV-91 | fpr dirty bits
+|
+ .set WBTEMP,LV-76 | write back temp (12 bytes)
+ .set WBTEMP_EX,WBTEMP | wbtemp sign and exponent (2 bytes)
+ .set WBTEMP_HI,WBTEMP+4 | wbtemp mantissa [63:32] (4 bytes)
+ .set WBTEMP_LO,WBTEMP+8 | wbtemp mantissa [31:00] (4 bytes)
+|
+ .set WBTEMP_SGN,WBTEMP+2 | used to store sign
+|
+ .set FPSR_SHADOW,LV-64 | fpsr shadow reg
+|
+ .set FPIARCU,LV-60 | Instr. addr. reg. for CU (4 bytes)
+|
+ .set CMDREG2B,LV-52 | cmd reg for machine 2
+ .set CMDREG3B,LV-48 | cmd reg for E3 exceptions (2 bytes)
+|
+ .set NMNEXC,LV-44 | NMNEXC (unsup,snan bits only)
+ .set nmn_unsup_bit,1
+ .set nmn_snan_bit,0
+|
+ .set NMCEXC,LV-43 | NMNEXC & NMCEXC
+ .set nmn_operr_bit,7
+ .set nmn_ovfl_bit,6
+ .set nmn_unfl_bit,5
+ .set nmc_unsup_bit,4
+ .set nmc_snan_bit,3
+ .set nmc_operr_bit,2
+ .set nmc_ovfl_bit,1
+ .set nmc_unfl_bit,0
+|
+ .set STAG,LV-40 | source tag (1 byte)
+ .set WBTEMP_GRS,LV-40 | alias wbtemp guard, round, sticky
+ .set guard_bit,1 | guard bit is bit number 1
+ .set round_bit,0 | round bit is bit number 0
+ .set stag_mask,0xE0 | upper 3 bits are source tag type
+ .set denorm_bit,7 | bit determins if denorm or unnorm
+ .set etemp15_bit,4 | etemp exponent bit #15
+ .set wbtemp66_bit,2 | wbtemp mantissa bit #66
+ .set wbtemp1_bit,1 | wbtemp mantissa bit #1
+ .set wbtemp0_bit,0 | wbtemp mantissa bit #0
+|
+ .set STICKY,LV-39 | holds sticky bit
+ .set sticky_bit,7
+|
+ .set CMDREG1B,LV-36 | cmd reg for E1 exceptions (2 bytes)
+ .set kfact_bit,12 | distinguishes static/dynamic k-factor
+| ;on packed move outs. NOTE: this
+| ;equate only works when CMDREG1B is in
+| ;a register.
+|
+ .set CMDWORD,LV-35 | command word in cmd1b
+ .set direction_bit,5 | bit 0 in opclass
+ .set size_bit2,12 | bit 2 in size field
+|
+ .set DTAG,LV-32 | dest tag (1 byte)
+ .set dtag_mask,0xE0 | upper 3 bits are dest type tag
+ .set fptemp15_bit,4 | fptemp exponent bit #15
+|
+ .set WB_BYTE,LV-31 | holds WBTE15 bit (1 byte)
+ .set wbtemp15_bit,4 | wbtemp exponent bit #15
+|
+ .set E_BYTE,LV-28 | holds E1 and E3 bits (1 byte)
+ .set E1,2 | which bit is E1 flag
+ .set E3,1 | which bit is E3 flag
+ .set SFLAG,0 | which bit is S flag
+|
+ .set T_BYTE,LV-27 | holds T and U bits (1 byte)
+ .set XFLAG,7 | which bit is X flag
+ .set UFLAG,5 | which bit is U flag
+ .set TFLAG,4 | which bit is T flag
+|
+ .set FPTEMP,LV-24 | fptemp (12 bytes)
+ .set FPTEMP_EX,FPTEMP | fptemp sign and exponent (2 bytes)
+ .set FPTEMP_HI,FPTEMP+4 | fptemp mantissa [63:32] (4 bytes)
+ .set FPTEMP_LO,FPTEMP+8 | fptemp mantissa [31:00] (4 bytes)
+|
+ .set FPTEMP_SGN,FPTEMP+2 | used to store sign
+|
+ .set ETEMP,LV-12 | etemp (12 bytes)
+ .set ETEMP_EX,ETEMP | etemp sign and exponent (2 bytes)
+ .set ETEMP_HI,ETEMP+4 | etemp mantissa [63:32] (4 bytes)
+ .set ETEMP_LO,ETEMP+8 | etemp mantissa [31:00] (4 bytes)
+|
+ .set ETEMP_SGN,ETEMP+2 | used to store sign
+|
+ .set EXC_SR,4 | exception frame status register
+ .set EXC_PC,6 | exception frame program counter
+ .set EXC_VEC,10 | exception frame vector (format+vector#)
+ .set EXC_EA,12 | exception frame effective address
+|
+|--------------------------------------------------------------------------
+|
+| FPSR/FPCR bits
+|
+ .set neg_bit,3 | negative result
+ .set z_bit,2 | zero result
+ .set inf_bit,1 | infinity result
+ .set nan_bit,0 | not-a-number result
+|
+ .set q_sn_bit,7 | sign bit of quotient byte
+|
+ .set bsun_bit,7 | branch on unordered
+ .set snan_bit,6 | signalling nan
+ .set operr_bit,5 | operand error
+ .set ovfl_bit,4 | overflow
+ .set unfl_bit,3 | underflow
+ .set dz_bit,2 | divide by zero
+ .set inex2_bit,1 | inexact result 2
+ .set inex1_bit,0 | inexact result 1
+|
+ .set aiop_bit,7 | accrued illegal operation
+ .set aovfl_bit,6 | accrued overflow
+ .set aunfl_bit,5 | accrued underflow
+ .set adz_bit,4 | accrued divide by zero
+ .set ainex_bit,3 | accrued inexact
+|
+| FPSR individual bit masks
+|
+ .set neg_mask,0x08000000
+ .set z_mask,0x04000000
+ .set inf_mask,0x02000000
+ .set nan_mask,0x01000000
+|
+ .set bsun_mask,0x00008000
+ .set snan_mask,0x00004000
+ .set operr_mask,0x00002000
+ .set ovfl_mask,0x00001000
+ .set unfl_mask,0x00000800
+ .set dz_mask,0x00000400
+ .set inex2_mask,0x00000200
+ .set inex1_mask,0x00000100
+|
+ .set aiop_mask,0x00000080 | accrued illegal operation
+ .set aovfl_mask,0x00000040 | accrued overflow
+ .set aunfl_mask,0x00000020 | accrued underflow
+ .set adz_mask,0x00000010 | accrued divide by zero
+ .set ainex_mask,0x00000008 | accrued inexact
+|
+| FPSR combinations used in the FPSP
+|
+ .set dzinf_mask,inf_mask+dz_mask+adz_mask
+ .set opnan_mask,nan_mask+operr_mask+aiop_mask
+ .set nzi_mask,0x01ffffff | clears N, Z, and I
+ .set unfinx_mask,unfl_mask+inex2_mask+aunfl_mask+ainex_mask
+ .set unf2inx_mask,unfl_mask+inex2_mask+ainex_mask
+ .set ovfinx_mask,ovfl_mask+inex2_mask+aovfl_mask+ainex_mask
+ .set inx1a_mask,inex1_mask+ainex_mask
+ .set inx2a_mask,inex2_mask+ainex_mask
+ .set snaniop_mask,nan_mask+snan_mask+aiop_mask
+ .set naniop_mask,nan_mask+aiop_mask
+ .set neginf_mask,neg_mask+inf_mask
+ .set infaiop_mask,inf_mask+aiop_mask
+ .set negz_mask,neg_mask+z_mask
+ .set opaop_mask,operr_mask+aiop_mask
+ .set unfl_inx_mask,unfl_mask+aunfl_mask+ainex_mask
+ .set ovfl_inx_mask,ovfl_mask+aovfl_mask+ainex_mask
+|
+|--------------------------------------------------------------------------
+|
+| FPCR rounding modes
+|
+ .set x_mode,0x00 | round to extended
+ .set s_mode,0x40 | round to single
+ .set d_mode,0x80 | round to double
+|
+ .set rn_mode,0x00 | round nearest
+ .set rz_mode,0x10 | round to zero
+ .set rm_mode,0x20 | round to minus infinity
+ .set rp_mode,0x30 | round to plus infinity
+|
+|--------------------------------------------------------------------------
+|
+| Miscellaneous equates
+|
+ .set signan_bit,6 | signalling nan bit in mantissa
+ .set sign_bit,7
+|
+ .set rnd_stky_bit,29 | round/sticky bit of mantissa
+| this can only be used if in a data register
+ .set sx_mask,0x01800000 | set s and x bits in word $48
+|
+ .set LOCAL_EX,0
+ .set LOCAL_SGN,2
+ .set LOCAL_HI,4
+ .set LOCAL_LO,8
+ .set LOCAL_GRS,12 | valid ONLY for FP_SCR1, FP_SCR2
+|
+|
+ .set norm_tag,0x00 | tag bits in {7:5} position
+ .set zero_tag,0x20
+ .set inf_tag,0x40
+ .set nan_tag,0x60
+ .set dnrm_tag,0x80
+|
+| fsave sizes and formats
+|
+ .set VER_4,0x40 | fpsp compatible version numbers
+| are in the $40s {$40-$4f}
+ .set VER_40,0x40 | original version number
+ .set VER_41,0x41 | revision version number
+|
+ .set BUSY_SIZE,100 | size of busy frame
+ .set BUSY_FRAME,LV-BUSY_SIZE | start of busy frame
+|
+ .set UNIMP_40_SIZE,44 | size of orig unimp frame
+ .set UNIMP_41_SIZE,52 | size of rev unimp frame
+|
+ .set IDLE_SIZE,4 | size of idle frame
+ .set IDLE_FRAME,LV-IDLE_SIZE | start of idle frame
+|
+| exception vectors
+|
+ .set TRACE_VEC,0x2024 | trace trap
+ .set FLINE_VEC,0x002C | 'real' F-line
+ .set UNIMP_VEC,0x202C | unimplemented
+ .set INEX_VEC,0x00C4
+|
+ .set dbl_thresh,0x3C01
+ .set sgl_thresh,0x3F81
+|
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/gen_except.s b/c/src/lib/libcpu/m68k/m68040/fpsp/gen_except.s
new file mode 100644
index 0000000000..7c9ff527fc
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/gen_except.s
@@ -0,0 +1,468 @@
+//
+// gen_except.sa 3.7 1/16/92
+//
+// gen_except --- FPSP routine to detect reportable exceptions
+//
+// This routine compares the exception enable byte of the
+// user_fpcr on the stack with the exception status byte
+// of the user_fpsr.
+//
+// Any routine which may report an exceptions must load
+// the stack frame in memory with the exceptional operand(s).
+//
+// Priority for exceptions is:
+//
+// Highest: bsun
+// snan
+// operr
+// ovfl
+// unfl
+// dz
+// inex2
+// Lowest: inex1
+//
+// Note: The IEEE standard specifies that inex2 is to be
+// reported if ovfl occurs and the ovfl enable bit is not
+// set but the inex2 enable bit is.
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+GEN_EXCEPT: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref real_trace
+ |xref fpsp_done
+ |xref fpsp_fmt_error
+
+exc_tbl:
+ .long bsun_exc
+ .long commonE1
+ .long commonE1
+ .long ovfl_unfl
+ .long ovfl_unfl
+ .long commonE1
+ .long commonE3
+ .long commonE3
+ .long no_match
+
+ .global gen_except
+gen_except:
+ cmpib #IDLE_SIZE-4,1(%a7) //test for idle frame
+ beq do_check //go handle idle frame
+ cmpib #UNIMP_40_SIZE-4,1(%a7) //test for orig unimp frame
+ beqs unimp_x //go handle unimp frame
+ cmpib #UNIMP_41_SIZE-4,1(%a7) //test for rev unimp frame
+ beqs unimp_x //go handle unimp frame
+ cmpib #BUSY_SIZE-4,1(%a7) //if size <> $60, fmt error
+ bnel fpsp_fmt_error
+ leal BUSY_SIZE+LOCAL_SIZE(%a7),%a1 //init a1 so fpsp.h
+// ;equates will work
+// Fix up the new busy frame with entries from the unimp frame
+//
+ movel ETEMP_EX(%a6),ETEMP_EX(%a1) //copy etemp from unimp
+ movel ETEMP_HI(%a6),ETEMP_HI(%a1) //frame to busy frame
+ movel ETEMP_LO(%a6),ETEMP_LO(%a1)
+ movel CMDREG1B(%a6),CMDREG1B(%a1) //set inst in frame to unimp
+ movel CMDREG1B(%a6),%d0 //fix cmd1b to make it
+ andl #0x03c30000,%d0 //work for cmd3b
+ bfextu CMDREG1B(%a6){#13:#1},%d1 //extract bit 2
+ lsll #5,%d1
+ swap %d1
+ orl %d1,%d0 //put it in the right place
+ bfextu CMDREG1B(%a6){#10:#3},%d1 //extract bit 3,4,5
+ lsll #2,%d1
+ swap %d1
+ orl %d1,%d0 //put them in the right place
+ movel %d0,CMDREG3B(%a1) //in the busy frame
+//
+// Or in the FPSR from the emulation with the USER_FPSR on the stack.
+//
+ fmovel %FPSR,%d0
+ orl %d0,USER_FPSR(%a6)
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a1) //set exc bits
+ orl #sx_mask,E_BYTE(%a1)
+ bra do_clean
+
+//
+// Frame is an unimp frame possible resulting from an fmove <ea>,fp0
+// that caused an exception
+//
+// a1 is modified to point into the new frame allowing fpsp equates
+// to be valid.
+//
+unimp_x:
+ cmpib #UNIMP_40_SIZE-4,1(%a7) //test for orig unimp frame
+ bnes test_rev
+ leal UNIMP_40_SIZE+LOCAL_SIZE(%a7),%a1
+ bras unimp_con
+test_rev:
+ cmpib #UNIMP_41_SIZE-4,1(%a7) //test for rev unimp frame
+ bnel fpsp_fmt_error //if not $28 or $30
+ leal UNIMP_41_SIZE+LOCAL_SIZE(%a7),%a1
+
+unimp_con:
+//
+// Fix up the new unimp frame with entries from the old unimp frame
+//
+ movel CMDREG1B(%a6),CMDREG1B(%a1) //set inst in frame to unimp
+//
+// Or in the FPSR from the emulation with the USER_FPSR on the stack.
+//
+ fmovel %FPSR,%d0
+ orl %d0,USER_FPSR(%a6)
+ bra do_clean
+
+//
+// Frame is idle, so check for exceptions reported through
+// USER_FPSR and set the unimp frame accordingly.
+// A7 must be incremented to the point before the
+// idle fsave vector to the unimp vector.
+//
+
+do_check:
+ addl #4,%a7 //point A7 back to unimp frame
+//
+// Or in the FPSR from the emulation with the USER_FPSR on the stack.
+//
+ fmovel %FPSR,%d0
+ orl %d0,USER_FPSR(%a6)
+//
+// On a busy frame, we must clear the nmnexc bits.
+//
+ cmpib #BUSY_SIZE-4,1(%a7) //check frame type
+ bnes check_fr //if busy, clr nmnexc
+ clrw NMNEXC(%a6) //clr nmnexc & nmcexc
+ btstb #5,CMDREG1B(%a6) //test for fmove out
+ bnes frame_com
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6) //set exc bits
+ orl #sx_mask,E_BYTE(%a6)
+ bras frame_com
+check_fr:
+ cmpb #UNIMP_40_SIZE-4,1(%a7)
+ beqs frame_com
+ clrw NMNEXC(%a6)
+frame_com:
+ moveb FPCR_ENABLE(%a6),%d0 //get fpcr enable byte
+ andb FPSR_EXCEPT(%a6),%d0 //and in the fpsr exc byte
+ bfffo %d0{#24:#8},%d1 //test for first set bit
+ leal exc_tbl,%a0 //load jmp table address
+ subib #24,%d1 //normalize bit offset to 0-8
+ movel (%a0,%d1.w*4),%a0 //load routine address based
+// ;based on first enabled exc
+ jmp (%a0) //jump to routine
+//
+// Bsun is not possible in unimp or unsupp
+//
+bsun_exc:
+ bra do_clean
+//
+// The typical work to be done to the unimp frame to report an
+// exception is to set the E1/E3 byte and clr the U flag.
+// commonE1 does this for E1 exceptions, which are snan,
+// operr, and dz. commonE3 does this for E3 exceptions, which
+// are inex2 and inex1, and also clears the E1 exception bit
+// left over from the unimp exception.
+//
+commonE1:
+ bsetb #E1,E_BYTE(%a6) //set E1 flag
+ bra commonE //go clean and exit
+
+commonE3:
+ tstb UFLG_TMP(%a6) //test flag for unsup/unimp state
+ bnes unsE3
+uniE3:
+ bsetb #E3,E_BYTE(%a6) //set E3 flag
+ bclrb #E1,E_BYTE(%a6) //clr E1 from unimp
+ bra commonE
+
+unsE3:
+ tstb RES_FLG(%a6)
+ bnes unsE3_0
+unsE3_1:
+ bsetb #E3,E_BYTE(%a6) //set E3 flag
+unsE3_0:
+ bclrb #E1,E_BYTE(%a6) //clr E1 flag
+ movel CMDREG1B(%a6),%d0
+ andl #0x03c30000,%d0 //work for cmd3b
+ bfextu CMDREG1B(%a6){#13:#1},%d1 //extract bit 2
+ lsll #5,%d1
+ swap %d1
+ orl %d1,%d0 //put it in the right place
+ bfextu CMDREG1B(%a6){#10:#3},%d1 //extract bit 3,4,5
+ lsll #2,%d1
+ swap %d1
+ orl %d1,%d0 //put them in the right place
+ movel %d0,CMDREG3B(%a6) //in the busy frame
+
+commonE:
+ bclrb #UFLAG,T_BYTE(%a6) //clr U flag from unimp
+ bra do_clean //go clean and exit
+//
+// No bits in the enable byte match existing exceptions. Check for
+// the case of the ovfl exc without the ovfl enabled, but with
+// inex2 enabled.
+//
+no_match:
+ btstb #inex2_bit,FPCR_ENABLE(%a6) //check for ovfl/inex2 case
+ beqs no_exc //if clear, exit
+ btstb #ovfl_bit,FPSR_EXCEPT(%a6) //now check ovfl
+ beqs no_exc //if clear, exit
+ bras ovfl_unfl //go to unfl_ovfl to determine if
+// ;it is an unsupp or unimp exc
+
+// No exceptions are to be reported. If the instruction was
+// unimplemented, no FPU restore is necessary. If it was
+// unsupported, we must perform the restore.
+no_exc:
+ tstb UFLG_TMP(%a6) //test flag for unsupp/unimp state
+ beqs uni_no_exc
+uns_no_exc:
+ tstb RES_FLG(%a6) //check if frestore is needed
+ bne do_clean //if clear, no frestore needed
+uni_no_exc:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ unlk %a6
+ bra finish_up
+//
+// Unsupported Data Type Handler:
+// Ovfl:
+// An fmoveout that results in an overflow is reported this way.
+// Unfl:
+// An fmoveout that results in an underflow is reported this way.
+//
+// Unimplemented Instruction Handler:
+// Ovfl:
+// Only scosh, setox, ssinh, stwotox, and scale can set overflow in
+// this manner.
+// Unfl:
+// Stwotox, setox, and scale can set underflow in this manner.
+// Any of the other Library Routines such that f(x)=x in which
+// x is an extended denorm can report an underflow exception.
+// It is the responsibility of the exception-causing exception
+// to make sure that WBTEMP is correct.
+//
+// The exceptional operand is in FP_SCR1.
+//
+ovfl_unfl:
+ tstb UFLG_TMP(%a6) //test flag for unsupp/unimp state
+ beqs ofuf_con
+//
+// The caller was from an unsupported data type trap. Test if the
+// caller set CU_ONLY. If so, the exceptional operand is expected in
+// FPTEMP, rather than WBTEMP.
+//
+ tstb CU_ONLY(%a6) //test if inst is cu-only
+ beq unsE3
+// move.w #$fe,CU_SAVEPC(%a6)
+ clrb CU_SAVEPC(%a6)
+ bsetb #E1,E_BYTE(%a6) //set E1 exception flag
+ movew ETEMP_EX(%a6),FPTEMP_EX(%a6)
+ movel ETEMP_HI(%a6),FPTEMP_HI(%a6)
+ movel ETEMP_LO(%a6),FPTEMP_LO(%a6)
+ bsetb #fptemp15_bit,DTAG(%a6) //set fpte15
+ bclrb #UFLAG,T_BYTE(%a6) //clr U flag from unimp
+ bra do_clean //go clean and exit
+
+ofuf_con:
+ moveb (%a7),VER_TMP(%a6) //save version number
+ cmpib #BUSY_SIZE-4,1(%a7) //check for busy frame
+ beqs busy_fr //if unimp, grow to busy
+ cmpib #VER_40,(%a7) //test for orig unimp frame
+ bnes try_41 //if not, test for rev frame
+ moveql #13,%d0 //need to zero 14 lwords
+ bras ofuf_fin
+try_41:
+ cmpib #VER_41,(%a7) //test for rev unimp frame
+ bnel fpsp_fmt_error //if neither, exit with error
+ moveql #11,%d0 //need to zero 12 lwords
+
+ofuf_fin:
+ clrl (%a7)
+loop1:
+ clrl -(%a7) //clear and dec a7
+ dbra %d0,loop1
+ moveb VER_TMP(%a6),(%a7)
+ moveb #BUSY_SIZE-4,1(%a7) //write busy fmt word.
+busy_fr:
+ movel FP_SCR1(%a6),WBTEMP_EX(%a6) //write
+ movel FP_SCR1+4(%a6),WBTEMP_HI(%a6) //exceptional op to
+ movel FP_SCR1+8(%a6),WBTEMP_LO(%a6) //wbtemp
+ bsetb #E3,E_BYTE(%a6) //set E3 flag
+ bclrb #E1,E_BYTE(%a6) //make sure E1 is clear
+ bclrb #UFLAG,T_BYTE(%a6) //clr U flag
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+ movel CMDREG1B(%a6),%d0 //fix cmd1b to make it
+ andl #0x03c30000,%d0 //work for cmd3b
+ bfextu CMDREG1B(%a6){#13:#1},%d1 //extract bit 2
+ lsll #5,%d1
+ swap %d1
+ orl %d1,%d0 //put it in the right place
+ bfextu CMDREG1B(%a6){#10:#3},%d1 //extract bit 3,4,5
+ lsll #2,%d1
+ swap %d1
+ orl %d1,%d0 //put them in the right place
+ movel %d0,CMDREG3B(%a6) //in the busy frame
+
+//
+// Check if the frame to be restored is busy or unimp.
+//** NOTE *** Bug fix for errata (0d43b #3)
+// If the frame is unimp, we must create a busy frame to
+// fix the bug with the nmnexc bits in cases in which they
+// are set by a previous instruction and not cleared by
+// the save. The frame will be unimp only if the final
+// instruction in an emulation routine caused the exception
+// by doing an fmove <ea>,fp0. The exception operand, in
+// internal format, is in fptemp.
+//
+do_clean:
+ cmpib #UNIMP_40_SIZE-4,1(%a7)
+ bnes do_con
+ moveql #13,%d0 //in orig, need to zero 14 lwords
+ bras do_build
+do_con:
+ cmpib #UNIMP_41_SIZE-4,1(%a7)
+ bnes do_restore //frame must be busy
+ moveql #11,%d0 //in rev, need to zero 12 lwords
+
+do_build:
+ moveb (%a7),VER_TMP(%a6)
+ clrl (%a7)
+loop2:
+ clrl -(%a7) //clear and dec a7
+ dbra %d0,loop2
+//
+// Use a1 as pointer into new frame. a6 is not correct if an unimp or
+// busy frame was created as the result of an exception on the final
+// instruction of an emulation routine.
+//
+// We need to set the nmcexc bits if the exception is E1. Otherwise,
+// the exc taken will be inex2.
+//
+ leal BUSY_SIZE+LOCAL_SIZE(%a7),%a1 //init a1 for new frame
+ moveb VER_TMP(%a6),(%a7) //write busy fmt word
+ moveb #BUSY_SIZE-4,1(%a7)
+ movel FP_SCR1(%a6),WBTEMP_EX(%a1) //write
+ movel FP_SCR1+4(%a6),WBTEMP_HI(%a1) //exceptional op to
+ movel FP_SCR1+8(%a6),WBTEMP_LO(%a1) //wbtemp
+// btst.b #E1,E_BYTE(%a1)
+// beq.b do_restore
+ bfextu USER_FPSR(%a6){#17:#4},%d0 //get snan/operr/ovfl/unfl bits
+ bfins %d0,NMCEXC(%a1){#4:#4} //and insert them in nmcexc
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a1) //set exc bits
+ orl #sx_mask,E_BYTE(%a1)
+
+do_restore:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ tstb RES_FLG(%a6) //RES_FLG indicates a "continuation" frame
+ beq cont
+ bsr bug1384
+cont:
+ unlk %a6
+//
+// If trace mode enabled, then go to trace handler. This handler
+// cannot have any fp instructions. If there are fp inst's and an
+// exception has been restored into the machine then the exception
+// will occur upon execution of the fp inst. This is not desirable
+// in the kernel (supervisor mode). See MC68040 manual Section 9.3.8.
+//
+finish_up:
+ btstb #7,(%a7) //test T1 in SR
+ bnes g_trace
+ btstb #6,(%a7) //test T0 in SR
+ bnes g_trace
+ bral fpsp_done
+//
+// Change integer stack to look like trace stack
+// The address of the instruction that caused the
+// exception is already in the integer stack (is
+// the same as the saved friar)
+//
+// If the current frame is already a 6-word stack then all
+// that needs to be done is to change the vector# to TRACE.
+// If the frame is only a 4-word stack (meaning we got here
+// on an Unsupported data type exception), then we need to grow
+// the stack an extra 2 words and get the FPIAR from the FPU.
+//
+g_trace:
+ bftst EXC_VEC-4(%sp){#0:#4}
+ bne g_easy
+
+ subw #4,%sp // make room
+ movel 4(%sp),(%sp)
+ movel 8(%sp),4(%sp)
+ subw #BUSY_SIZE,%sp
+ fsave (%sp)
+ fmovel %fpiar,BUSY_SIZE+EXC_EA-4(%sp)
+ frestore (%sp)
+ addw #BUSY_SIZE,%sp
+
+g_easy:
+ movew #TRACE_VEC,EXC_VEC-4(%a7)
+ bral real_trace
+//
+// This is a work-around for hardware bug 1384.
+//
+bug1384:
+ link %a5,#0
+ fsave -(%sp)
+ cmpib #0x41,(%sp) // check for correct frame
+ beq frame_41
+ bgt nofix // if more advanced mask, do nada
+
+frame_40:
+ tstb 1(%sp) // check to see if idle
+ bne notidle
+idle40:
+ clrl (%sp) // get rid of old fsave frame
+ movel %d1,USER_D1(%a6) // save d1
+ movew #8,%d1 // place unimp frame instead
+loop40: clrl -(%sp)
+ dbra %d1,loop40
+ movel USER_D1(%a6),%d1 // restore d1
+ movel #0x40280000,-(%sp)
+ frestore (%sp)+
+ unlk %a5
+ rts
+
+frame_41:
+ tstb 1(%sp) // check to see if idle
+ bne notidle
+idle41:
+ clrl (%sp) // get rid of old fsave frame
+ movel %d1,USER_D1(%a6) // save d1
+ movew #10,%d1 // place unimp frame instead
+loop41: clrl -(%sp)
+ dbra %d1,loop41
+ movel USER_D1(%a6),%d1 // restore d1
+ movel #0x41300000,-(%sp)
+ frestore (%sp)+
+ unlk %a5
+ rts
+
+notidle:
+ bclrb #etemp15_bit,-40(%a5)
+ frestore (%sp)+
+ unlk %a5
+ rts
+
+nofix:
+ frestore (%sp)+
+ unlk %a5
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/get_op.s b/c/src/lib/libcpu/m68k/m68040/fpsp/get_op.s
new file mode 100644
index 0000000000..bd56f74c51
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/get_op.s
@@ -0,0 +1,676 @@
+//
+// get_op.sa 3.6 5/19/92
+//
+// get_op.sa 3.5 4/26/91
+//
+// Description: This routine is called by the unsupported format/data
+// type exception handler ('unsupp' - vector 55) and the unimplemented
+// instruction exception handler ('unimp' - vector 11). 'get_op'
+// determines the opclass (0, 2, or 3) and branches to the
+// opclass handler routine. See 68881/2 User's Manual table 4-11
+// for a description of the opclasses.
+//
+// For UNSUPPORTED data/format (exception vector 55) and for
+// UNIMPLEMENTED instructions (exception vector 11) the following
+// applies:
+//
+// - For unnormalized numbers (opclass 0, 2, or 3) the
+// number(s) is normalized and the operand type tag is updated.
+//
+// - For a packed number (opclass 2) the number is unpacked and the
+// operand type tag is updated.
+//
+// - For denormalized numbers (opclass 0 or 2) the number(s) is not
+// changed but passed to the next module. The next module for
+// unimp is do_func, the next module for unsupp is res_func.
+//
+// For UNSUPPORTED data/format (exception vector 55) only the
+// following applies:
+//
+// - If there is a move out with a packed number (opclass 3) the
+// number is packed and written to user memory. For the other
+// opclasses the number(s) are written back to the fsave stack
+// and the instruction is then restored back into the '040. The
+// '040 is then able to complete the instruction.
+//
+// For example:
+// fadd.x fpm,fpn where the fpm contains an unnormalized number.
+// The '040 takes an unsupported data trap and gets to this
+// routine. The number is normalized, put back on the stack and
+// then an frestore is done to restore the instruction back into
+// the '040. The '040 then re-executes the fadd.x fpm,fpn with
+// a normalized number in the source and the instruction is
+// successful.
+//
+// Next consider if in the process of normalizing the un-
+// normalized number it becomes a denormalized number. The
+// routine which converts the unnorm to a norm (called mk_norm)
+// detects this and tags the number as a denorm. The routine
+// res_func sees the denorm tag and converts the denorm to a
+// norm. The instruction is then restored back into the '040
+// which re_executes the instruction.
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+GET_OP: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ .global PIRN,PIRZRM,PIRP
+ .global SMALRN,SMALRZRM,SMALRP
+ .global BIGRN,BIGRZRM,BIGRP
+
+PIRN:
+ .long 0x40000000,0xc90fdaa2,0x2168c235 //pi
+PIRZRM:
+ .long 0x40000000,0xc90fdaa2,0x2168c234 //pi
+PIRP:
+ .long 0x40000000,0xc90fdaa2,0x2168c235 //pi
+
+//round to nearest
+SMALRN:
+ .long 0x3ffd0000,0x9a209a84,0xfbcff798 //log10(2)
+ .long 0x40000000,0xadf85458,0xa2bb4a9a //e
+ .long 0x3fff0000,0xb8aa3b29,0x5c17f0bc //log2(e)
+ .long 0x3ffd0000,0xde5bd8a9,0x37287195 //log10(e)
+ .long 0x00000000,0x00000000,0x00000000 //0.0
+// round to zero;round to negative infinity
+SMALRZRM:
+ .long 0x3ffd0000,0x9a209a84,0xfbcff798 //log10(2)
+ .long 0x40000000,0xadf85458,0xa2bb4a9a //e
+ .long 0x3fff0000,0xb8aa3b29,0x5c17f0bb //log2(e)
+ .long 0x3ffd0000,0xde5bd8a9,0x37287195 //log10(e)
+ .long 0x00000000,0x00000000,0x00000000 //0.0
+// round to positive infinity
+SMALRP:
+ .long 0x3ffd0000,0x9a209a84,0xfbcff799 //log10(2)
+ .long 0x40000000,0xadf85458,0xa2bb4a9b //e
+ .long 0x3fff0000,0xb8aa3b29,0x5c17f0bc //log2(e)
+ .long 0x3ffd0000,0xde5bd8a9,0x37287195 //log10(e)
+ .long 0x00000000,0x00000000,0x00000000 //0.0
+
+//round to nearest
+BIGRN:
+ .long 0x3ffe0000,0xb17217f7,0xd1cf79ac //ln(2)
+ .long 0x40000000,0x935d8ddd,0xaaa8ac17 //ln(10)
+ .long 0x3fff0000,0x80000000,0x00000000 //10 ^ 0
+
+ .global PTENRN
+PTENRN:
+ .long 0x40020000,0xA0000000,0x00000000 //10 ^ 1
+ .long 0x40050000,0xC8000000,0x00000000 //10 ^ 2
+ .long 0x400C0000,0x9C400000,0x00000000 //10 ^ 4
+ .long 0x40190000,0xBEBC2000,0x00000000 //10 ^ 8
+ .long 0x40340000,0x8E1BC9BF,0x04000000 //10 ^ 16
+ .long 0x40690000,0x9DC5ADA8,0x2B70B59E //10 ^ 32
+ .long 0x40D30000,0xC2781F49,0xFFCFA6D5 //10 ^ 64
+ .long 0x41A80000,0x93BA47C9,0x80E98CE0 //10 ^ 128
+ .long 0x43510000,0xAA7EEBFB,0x9DF9DE8E //10 ^ 256
+ .long 0x46A30000,0xE319A0AE,0xA60E91C7 //10 ^ 512
+ .long 0x4D480000,0xC9767586,0x81750C17 //10 ^ 1024
+ .long 0x5A920000,0x9E8B3B5D,0xC53D5DE5 //10 ^ 2048
+ .long 0x75250000,0xC4605202,0x8A20979B //10 ^ 4096
+//round to minus infinity
+BIGRZRM:
+ .long 0x3ffe0000,0xb17217f7,0xd1cf79ab //ln(2)
+ .long 0x40000000,0x935d8ddd,0xaaa8ac16 //ln(10)
+ .long 0x3fff0000,0x80000000,0x00000000 //10 ^ 0
+
+ .global PTENRM
+PTENRM:
+ .long 0x40020000,0xA0000000,0x00000000 //10 ^ 1
+ .long 0x40050000,0xC8000000,0x00000000 //10 ^ 2
+ .long 0x400C0000,0x9C400000,0x00000000 //10 ^ 4
+ .long 0x40190000,0xBEBC2000,0x00000000 //10 ^ 8
+ .long 0x40340000,0x8E1BC9BF,0x04000000 //10 ^ 16
+ .long 0x40690000,0x9DC5ADA8,0x2B70B59D //10 ^ 32
+ .long 0x40D30000,0xC2781F49,0xFFCFA6D5 //10 ^ 64
+ .long 0x41A80000,0x93BA47C9,0x80E98CDF //10 ^ 128
+ .long 0x43510000,0xAA7EEBFB,0x9DF9DE8D //10 ^ 256
+ .long 0x46A30000,0xE319A0AE,0xA60E91C6 //10 ^ 512
+ .long 0x4D480000,0xC9767586,0x81750C17 //10 ^ 1024
+ .long 0x5A920000,0x9E8B3B5D,0xC53D5DE5 //10 ^ 2048
+ .long 0x75250000,0xC4605202,0x8A20979A //10 ^ 4096
+//round to positive infinity
+BIGRP:
+ .long 0x3ffe0000,0xb17217f7,0xd1cf79ac //ln(2)
+ .long 0x40000000,0x935d8ddd,0xaaa8ac17 //ln(10)
+ .long 0x3fff0000,0x80000000,0x00000000 //10 ^ 0
+
+ .global PTENRP
+PTENRP:
+ .long 0x40020000,0xA0000000,0x00000000 //10 ^ 1
+ .long 0x40050000,0xC8000000,0x00000000 //10 ^ 2
+ .long 0x400C0000,0x9C400000,0x00000000 //10 ^ 4
+ .long 0x40190000,0xBEBC2000,0x00000000 //10 ^ 8
+ .long 0x40340000,0x8E1BC9BF,0x04000000 //10 ^ 16
+ .long 0x40690000,0x9DC5ADA8,0x2B70B59E //10 ^ 32
+ .long 0x40D30000,0xC2781F49,0xFFCFA6D6 //10 ^ 64
+ .long 0x41A80000,0x93BA47C9,0x80E98CE0 //10 ^ 128
+ .long 0x43510000,0xAA7EEBFB,0x9DF9DE8E //10 ^ 256
+ .long 0x46A30000,0xE319A0AE,0xA60E91C7 //10 ^ 512
+ .long 0x4D480000,0xC9767586,0x81750C18 //10 ^ 1024
+ .long 0x5A920000,0x9E8B3B5D,0xC53D5DE6 //10 ^ 2048
+ .long 0x75250000,0xC4605202,0x8A20979B //10 ^ 4096
+
+ |xref nrm_zero
+ |xref decbin
+ |xref round
+
+ .global get_op
+ .global uns_getop
+ .global uni_getop
+get_op:
+ clrb DY_MO_FLG(%a6)
+ tstb UFLG_TMP(%a6) //test flag for unsupp/unimp state
+ beqs uni_getop
+
+uns_getop:
+ btstb #direction_bit,CMDREG1B(%a6)
+ bne opclass3 //branch if a fmove out (any kind)
+ btstb #6,CMDREG1B(%a6)
+ beqs uns_notpacked
+
+ bfextu CMDREG1B(%a6){#3:#3},%d0
+ cmpb #3,%d0
+ beq pack_source //check for a packed src op, branch if so
+uns_notpacked:
+ bsr chk_dy_mo //set the dyadic/monadic flag
+ tstb DY_MO_FLG(%a6)
+ beqs src_op_ck //if monadic, go check src op
+// ;else, check dst op (fall through)
+
+ btstb #7,DTAG(%a6)
+ beqs src_op_ck //if dst op is norm, check src op
+ bras dst_ex_dnrm //else, handle destination unnorm/dnrm
+
+uni_getop:
+ bfextu CMDREG1B(%a6){#0:#6},%d0 //get opclass and src fields
+ cmpil #0x17,%d0 //if op class and size fields are $17,
+// ;it is FMOVECR; if not, continue
+//
+// If the instruction is fmovecr, exit get_op. It is handled
+// in do_func and smovecr.sa.
+//
+ bne not_fmovecr //handle fmovecr as an unimplemented inst
+ rts
+
+not_fmovecr:
+ btstb #E1,E_BYTE(%a6) //if set, there is a packed operand
+ bne pack_source //check for packed src op, branch if so
+
+// The following lines of are coded to optimize on normalized operands
+ moveb STAG(%a6),%d0
+ orb DTAG(%a6),%d0 //check if either of STAG/DTAG msb set
+ bmis dest_op_ck //if so, some op needs to be fixed
+ rts
+
+dest_op_ck:
+ btstb #7,DTAG(%a6) //check for unsupported data types in
+ beqs src_op_ck //the destination, if not, check src op
+ bsr chk_dy_mo //set dyadic/monadic flag
+ tstb DY_MO_FLG(%a6) //
+ beqs src_op_ck //if monadic, check src op
+//
+// At this point, destination has an extended denorm or unnorm.
+//
+dst_ex_dnrm:
+ movew FPTEMP_EX(%a6),%d0 //get destination exponent
+ andiw #0x7fff,%d0 //mask sign, check if exp = 0000
+ beqs src_op_ck //if denorm then check source op.
+// ;denorms are taken care of in res_func
+// ;(unsupp) or do_func (unimp)
+// ;else unnorm fall through
+ leal FPTEMP(%a6),%a0 //point a0 to dop - used in mk_norm
+ bsr mk_norm //go normalize - mk_norm returns:
+// ;L_SCR1{7:5} = operand tag
+// ; (000 = norm, 100 = denorm)
+// ;L_SCR1{4} = fpte15 or ete15
+// ; 0 = exp > $3fff
+// ; 1 = exp <= $3fff
+// ;and puts the normalized num back
+// ;on the fsave stack
+//
+ moveb L_SCR1(%a6),DTAG(%a6) //write the new tag & fpte15
+// ;to the fsave stack and fall
+// ;through to check source operand
+//
+src_op_ck:
+ btstb #7,STAG(%a6)
+ beq end_getop //check for unsupported data types on the
+// ;source operand
+ btstb #5,STAG(%a6)
+ bnes src_sd_dnrm //if bit 5 set, handle sgl/dbl denorms
+//
+// At this point only unnorms or extended denorms are possible.
+//
+src_ex_dnrm:
+ movew ETEMP_EX(%a6),%d0 //get source exponent
+ andiw #0x7fff,%d0 //mask sign, check if exp = 0000
+ beq end_getop //if denorm then exit, denorms are
+// ;handled in do_func
+ leal ETEMP(%a6),%a0 //point a0 to sop - used in mk_norm
+ bsr mk_norm //go normalize - mk_norm returns:
+// ;L_SCR1{7:5} = operand tag
+// ; (000 = norm, 100 = denorm)
+// ;L_SCR1{4} = fpte15 or ete15
+// ; 0 = exp > $3fff
+// ; 1 = exp <= $3fff
+// ;and puts the normalized num back
+// ;on the fsave stack
+//
+ moveb L_SCR1(%a6),STAG(%a6) //write the new tag & ete15
+ rts //end_getop
+
+//
+// At this point, only single or double denorms are possible.
+// If the inst is not fmove, normalize the source. If it is,
+// do nothing to the input.
+//
+src_sd_dnrm:
+ btstb #4,CMDREG1B(%a6) //differentiate between sgl/dbl denorm
+ bnes is_double
+is_single:
+ movew #0x3f81,%d1 //write bias for sgl denorm
+ bras common //goto the common code
+is_double:
+ movew #0x3c01,%d1 //write the bias for a dbl denorm
+common:
+ btstb #sign_bit,ETEMP_EX(%a6) //grab sign bit of mantissa
+ beqs pos
+ bset #15,%d1 //set sign bit because it is negative
+pos:
+ movew %d1,ETEMP_EX(%a6)
+// ;put exponent on stack
+
+ movew CMDREG1B(%a6),%d1
+ andw #0xe3ff,%d1 //clear out source specifier
+ orw #0x0800,%d1 //set source specifier to extended prec
+ movew %d1,CMDREG1B(%a6) //write back to the command word in stack
+// ;this is needed to fix unsupp data stack
+ leal ETEMP(%a6),%a0 //point a0 to sop
+
+ bsr mk_norm //convert sgl/dbl denorm to norm
+ moveb L_SCR1(%a6),STAG(%a6) //put tag into source tag reg - d0
+ rts //end_getop
+//
+// At this point, the source is definitely packed, whether
+// instruction is dyadic or monadic is still unknown
+//
+pack_source:
+ movel FPTEMP_LO(%a6),ETEMP(%a6) //write ms part of packed
+// ;number to etemp slot
+ bsr chk_dy_mo //set dyadic/monadic flag
+ bsr unpack
+
+ tstb DY_MO_FLG(%a6)
+ beqs end_getop //if monadic, exit
+// ;else, fix FPTEMP
+pack_dya:
+ bfextu CMDREG1B(%a6){#6:#3},%d0 //extract dest fp reg
+ movel #7,%d1
+ subl %d0,%d1
+ clrl %d0
+ bsetl %d1,%d0 //set up d0 as a dynamic register mask
+ fmovemx %d0,FPTEMP(%a6) //write to FPTEMP
+
+ btstb #7,DTAG(%a6) //check dest tag for unnorm or denorm
+ bne dst_ex_dnrm //else, handle the unnorm or ext denorm
+//
+// Dest is not denormalized. Check for norm, and set fpte15
+// accordingly.
+//
+ moveb DTAG(%a6),%d0
+ andib #0xf0,%d0 //strip to only dtag:fpte15
+ tstb %d0 //check for normalized value
+ bnes end_getop //if inf/nan/zero leave get_op
+ movew FPTEMP_EX(%a6),%d0
+ andiw #0x7fff,%d0
+ cmpiw #0x3fff,%d0 //check if fpte15 needs setting
+ bges end_getop //if >= $3fff, leave fpte15=0
+ orb #0x10,DTAG(%a6)
+ bras end_getop
+
+//
+// At this point, it is either an fmoveout packed, unnorm or denorm
+//
+opclass3:
+ clrb DY_MO_FLG(%a6) //set dyadic/monadic flag to monadic
+ bfextu CMDREG1B(%a6){#4:#2},%d0
+ cmpib #3,%d0
+ bne src_ex_dnrm //if not equal, must be unnorm or denorm
+// ;else it is a packed move out
+// ;exit
+end_getop:
+ rts
+
+//
+// Sets the DY_MO_FLG correctly. This is used only on if it is an
+// unsupported data type exception. Set if dyadic.
+//
+chk_dy_mo:
+ movew CMDREG1B(%a6),%d0
+ btstl #5,%d0 //testing extension command word
+ beqs set_mon //if bit 5 = 0 then monadic
+ btstl #4,%d0 //know that bit 5 = 1
+ beqs set_dya //if bit 4 = 0 then dyadic
+ andiw #0x007f,%d0 //get rid of all but extension bits {6:0}
+ cmpiw #0x0038,%d0 //if extension = $38 then fcmp (dyadic)
+ bnes set_mon
+set_dya:
+ st DY_MO_FLG(%a6) //set the inst flag type to dyadic
+ rts
+set_mon:
+ clrb DY_MO_FLG(%a6) //set the inst flag type to monadic
+ rts
+//
+// MK_NORM
+//
+// Normalizes unnormalized numbers, sets tag to norm or denorm, sets unfl
+// exception if denorm.
+//
+// CASE opclass 0x0 unsupp
+// mk_norm till msb set
+// set tag = norm
+//
+// CASE opclass 0x0 unimp
+// mk_norm till msb set or exp = 0
+// if integer bit = 0
+// tag = denorm
+// else
+// tag = norm
+//
+// CASE opclass 011 unsupp
+// mk_norm till msb set or exp = 0
+// if integer bit = 0
+// tag = denorm
+// set unfl_nmcexe = 1
+// else
+// tag = norm
+//
+// if exp <= $3fff
+// set ete15 or fpte15 = 1
+// else set ete15 or fpte15 = 0
+
+// input:
+// a0 = points to operand to be normalized
+// output:
+// L_SCR1{7:5} = operand tag (000 = norm, 100 = denorm)
+// L_SCR1{4} = fpte15 or ete15 (0 = exp > $3fff, 1 = exp <=$3fff)
+// the normalized operand is placed back on the fsave stack
+mk_norm:
+ clrl L_SCR1(%a6)
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0) //transform into internal extended format
+
+ cmpib #0x2c,1+EXC_VEC(%a6) //check if unimp
+ bnes uns_data //branch if unsupp
+ bsr uni_inst //call if unimp (opclass 0x0)
+ bras reload
+uns_data:
+ btstb #direction_bit,CMDREG1B(%a6) //check transfer direction
+ bnes bit_set //branch if set (opclass 011)
+ bsr uns_opx //call if opclass 0x0
+ bras reload
+bit_set:
+ bsr uns_op3 //opclass 011
+reload:
+ cmpw #0x3fff,LOCAL_EX(%a0) //if exp > $3fff
+ bgts end_mk // fpte15/ete15 already set to 0
+ bsetb #4,L_SCR1(%a6) //else set fpte15/ete15 to 1
+// ;calling routine actually sets the
+// ;value on the stack (along with the
+// ;tag), since this routine doesn't
+// ;know if it should set ete15 or fpte15
+// ;ie, it doesn't know if this is the
+// ;src op or dest op.
+end_mk:
+ bfclr LOCAL_SGN(%a0){#0:#8}
+ beqs end_mk_pos
+ bsetb #sign_bit,LOCAL_EX(%a0) //convert back to IEEE format
+end_mk_pos:
+ rts
+//
+// CASE opclass 011 unsupp
+//
+uns_op3:
+ bsr nrm_zero //normalize till msb = 1 or exp = zero
+ btstb #7,LOCAL_HI(%a0) //if msb = 1
+ bnes no_unfl //then branch
+set_unfl:
+ orw #dnrm_tag,L_SCR1(%a6) //set denorm tag
+ bsetb #unfl_bit,FPSR_EXCEPT(%a6) //set unfl exception bit
+no_unfl:
+ rts
+//
+// CASE opclass 0x0 unsupp
+//
+uns_opx:
+ bsr nrm_zero //normalize the number
+ btstb #7,LOCAL_HI(%a0) //check if integer bit (j-bit) is set
+ beqs uns_den //if clear then now have a denorm
+uns_nrm:
+ orb #norm_tag,L_SCR1(%a6) //set tag to norm
+ rts
+uns_den:
+ orb #dnrm_tag,L_SCR1(%a6) //set tag to denorm
+ rts
+//
+// CASE opclass 0x0 unimp
+//
+uni_inst:
+ bsr nrm_zero
+ btstb #7,LOCAL_HI(%a0) //check if integer bit (j-bit) is set
+ beqs uni_den //if clear then now have a denorm
+uni_nrm:
+ orb #norm_tag,L_SCR1(%a6) //set tag to norm
+ rts
+uni_den:
+ orb #dnrm_tag,L_SCR1(%a6) //set tag to denorm
+ rts
+
+//
+// Decimal to binary conversion
+//
+// Special cases of inf and NaNs are completed outside of decbin.
+// If the input is an snan, the snan bit is not set.
+//
+// input:
+// ETEMP(a6) - points to packed decimal string in memory
+// output:
+// fp0 - contains packed string converted to extended precision
+// ETEMP - same as fp0
+unpack:
+ movew CMDREG1B(%a6),%d0 //examine command word, looking for fmove's
+ andw #0x3b,%d0
+ beq move_unpack //special handling for fmove: must set FPSR_CC
+
+ movew ETEMP(%a6),%d0 //get word with inf information
+ bfextu %d0{#20:#12},%d1 //get exponent into d1
+ cmpiw #0x0fff,%d1 //test for inf or NaN
+ bnes try_zero //if not equal, it is not special
+ bfextu %d0{#17:#3},%d1 //get SE and y bits into d1
+ cmpiw #7,%d1 //SE and y bits must be on for special
+ bnes try_zero //if not on, it is not special
+//input is of the special cases of inf and NaN
+ tstl ETEMP_HI(%a6) //check ms mantissa
+ bnes fix_nan //if non-zero, it is a NaN
+ tstl ETEMP_LO(%a6) //check ls mantissa
+ bnes fix_nan //if non-zero, it is a NaN
+ bra finish //special already on stack
+fix_nan:
+ btstb #signan_bit,ETEMP_HI(%a6) //test for snan
+ bne finish
+ orl #snaniop_mask,USER_FPSR(%a6) //always set snan if it is so
+ bra finish
+try_zero:
+ movew ETEMP_EX+2(%a6),%d0 //get word 4
+ andiw #0x000f,%d0 //clear all but last ni(y)bble
+ tstw %d0 //check for zero.
+ bne not_spec
+ tstl ETEMP_HI(%a6) //check words 3 and 2
+ bne not_spec
+ tstl ETEMP_LO(%a6) //check words 1 and 0
+ bne not_spec
+ tstl ETEMP(%a6) //test sign of the zero
+ bges pos_zero
+ movel #0x80000000,ETEMP(%a6) //write neg zero to etemp
+ clrl ETEMP_HI(%a6)
+ clrl ETEMP_LO(%a6)
+ bra finish
+pos_zero:
+ clrl ETEMP(%a6)
+ clrl ETEMP_HI(%a6)
+ clrl ETEMP_LO(%a6)
+ bra finish
+
+not_spec:
+ fmovemx %fp0-%fp1,-(%a7) //save fp0 - decbin returns in it
+ bsr decbin
+ fmovex %fp0,ETEMP(%a6) //put the unpacked sop in the fsave stack
+ fmovemx (%a7)+,%fp0-%fp1
+ fmovel #0,%FPSR //clr fpsr from decbin
+ bra finish
+
+//
+// Special handling for packed move in: Same results as all other
+// packed cases, but we must set the FPSR condition codes properly.
+//
+move_unpack:
+ movew ETEMP(%a6),%d0 //get word with inf information
+ bfextu %d0{#20:#12},%d1 //get exponent into d1
+ cmpiw #0x0fff,%d1 //test for inf or NaN
+ bnes mtry_zero //if not equal, it is not special
+ bfextu %d0{#17:#3},%d1 //get SE and y bits into d1
+ cmpiw #7,%d1 //SE and y bits must be on for special
+ bnes mtry_zero //if not on, it is not special
+//input is of the special cases of inf and NaN
+ tstl ETEMP_HI(%a6) //check ms mantissa
+ bnes mfix_nan //if non-zero, it is a NaN
+ tstl ETEMP_LO(%a6) //check ls mantissa
+ bnes mfix_nan //if non-zero, it is a NaN
+//input is inf
+ orl #inf_mask,USER_FPSR(%a6) //set I bit
+ tstl ETEMP(%a6) //check sign
+ bge finish
+ orl #neg_mask,USER_FPSR(%a6) //set N bit
+ bra finish //special already on stack
+mfix_nan:
+ orl #nan_mask,USER_FPSR(%a6) //set NaN bit
+ moveb #nan_tag,STAG(%a6) //set stag to NaN
+ btstb #signan_bit,ETEMP_HI(%a6) //test for snan
+ bnes mn_snan
+ orl #snaniop_mask,USER_FPSR(%a6) //set snan bit
+ btstb #snan_bit,FPCR_ENABLE(%a6) //test for snan enabled
+ bnes mn_snan
+ bsetb #signan_bit,ETEMP_HI(%a6) //force snans to qnans
+mn_snan:
+ tstl ETEMP(%a6) //check for sign
+ bge finish //if clr, go on
+ orl #neg_mask,USER_FPSR(%a6) //set N bit
+ bra finish
+
+mtry_zero:
+ movew ETEMP_EX+2(%a6),%d0 //get word 4
+ andiw #0x000f,%d0 //clear all but last ni(y)bble
+ tstw %d0 //check for zero.
+ bnes mnot_spec
+ tstl ETEMP_HI(%a6) //check words 3 and 2
+ bnes mnot_spec
+ tstl ETEMP_LO(%a6) //check words 1 and 0
+ bnes mnot_spec
+ tstl ETEMP(%a6) //test sign of the zero
+ bges mpos_zero
+ orl #neg_mask+z_mask,USER_FPSR(%a6) //set N and Z
+ movel #0x80000000,ETEMP(%a6) //write neg zero to etemp
+ clrl ETEMP_HI(%a6)
+ clrl ETEMP_LO(%a6)
+ bras finish
+mpos_zero:
+ orl #z_mask,USER_FPSR(%a6) //set Z
+ clrl ETEMP(%a6)
+ clrl ETEMP_HI(%a6)
+ clrl ETEMP_LO(%a6)
+ bras finish
+
+mnot_spec:
+ fmovemx %fp0-%fp1,-(%a7) //save fp0 ,fp1 - decbin returns in fp0
+ bsr decbin
+ fmovex %fp0,ETEMP(%a6)
+// ;put the unpacked sop in the fsave stack
+ fmovemx (%a7)+,%fp0-%fp1
+
+finish:
+ movew CMDREG1B(%a6),%d0 //get the command word
+ andw #0xfbff,%d0 //change the source specifier field to
+// ;extended (was packed).
+ movew %d0,CMDREG1B(%a6) //write command word back to fsave stack
+// ;we need to do this so the 040 will
+// ;re-execute the inst. without taking
+// ;another packed trap.
+
+fix_stag:
+//Converted result is now in etemp on fsave stack, now set the source
+//tag (stag)
+// if (ete =$7fff) then INF or NAN
+// if (etemp = $x.0----0) then
+// stag = INF
+// else
+// stag = NAN
+// else
+// if (ete = $0000) then
+// stag = ZERO
+// else
+// stag = NORM
+//
+// Note also that the etemp_15 bit (just right of the stag) must
+// be set accordingly.
+//
+ movew ETEMP_EX(%a6),%d1
+ andiw #0x7fff,%d1 //strip sign
+ cmpw #0x7fff,%d1
+ bnes z_or_nrm
+ movel ETEMP_HI(%a6),%d1
+ bnes is_nan
+ movel ETEMP_LO(%a6),%d1
+ bnes is_nan
+is_inf:
+ moveb #0x40,STAG(%a6)
+ movel #0x40,%d0
+ rts
+is_nan:
+ moveb #0x60,STAG(%a6)
+ movel #0x60,%d0
+ rts
+z_or_nrm:
+ tstw %d1
+ bnes is_nrm
+is_zro:
+// For a zero, set etemp_15
+ moveb #0x30,STAG(%a6)
+ movel #0x20,%d0
+ rts
+is_nrm:
+// For a norm, check if the exp <= $3fff; if so, set etemp_15
+ cmpiw #0x3fff,%d1
+ bles set_bit15
+ moveb #0,STAG(%a6)
+ bras end_is_nrm
+set_bit15:
+ moveb #0x10,STAG(%a6)
+end_is_nrm:
+ movel #0,%d0
+end_fix:
+ rts
+
+end_get:
+ rts
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/kernel_ex.s b/c/src/lib/libcpu/m68k/m68040/fpsp/kernel_ex.s
new file mode 100644
index 0000000000..5873f42f13
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/kernel_ex.s
@@ -0,0 +1,494 @@
+//
+// kernel_ex.sa 3.3 12/19/90
+//
+// This file contains routines to force exception status in the
+// fpu for exceptional cases detected or reported within the
+// transcendental functions. Typically, the t_xx routine will
+// set the appropriate bits in the USER_FPSR word on the stack.
+// The bits are tested in gen_except.sa to determine if an exceptional
+// situation needs to be created on return from the FPSP.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+KERNEL_EX: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+mns_inf: .long 0xffff0000,0x00000000,0x00000000
+pls_inf: .long 0x7fff0000,0x00000000,0x00000000
+nan: .long 0x7fff0000,0xffffffff,0xffffffff
+huge: .long 0x7ffe0000,0xffffffff,0xffffffff
+
+ |xref ovf_r_k
+ |xref unf_sub
+ |xref nrm_set
+
+ .global t_dz
+ .global t_dz2
+ .global t_operr
+ .global t_unfl
+ .global t_ovfl
+ .global t_ovfl2
+ .global t_inx2
+ .global t_frcinx
+ .global t_extdnrm
+ .global t_resdnrm
+ .global dst_nan
+ .global src_nan
+//
+// DZ exception
+//
+//
+// if dz trap disabled
+// store properly signed inf (use sign of etemp) into fp0
+// set FPSR exception status dz bit, condition code
+// inf bit, and accrued dz bit
+// return
+// frestore the frame into the machine (done by unimp_hd)
+//
+// else dz trap enabled
+// set exception status bit & accrued bits in FPSR
+// set flag to disable sto_res from corrupting fp register
+// return
+// frestore the frame into the machine (done by unimp_hd)
+//
+// t_dz2 is used by monadic functions such as flogn (from do_func).
+// t_dz is used by monadic functions such as satanh (from the
+// transcendental function).
+//
+t_dz2:
+ bsetb #neg_bit,FPSR_CC(%a6) //set neg bit in FPSR
+ fmovel #0,%FPSR //clr status bits (Z set)
+ btstb #dz_bit,FPCR_ENABLE(%a6) //test FPCR for dz exc enabled
+ bnes dz_ena_end
+ bras m_inf //flogx always returns -inf
+t_dz:
+ fmovel #0,%FPSR //clr status bits (Z set)
+ btstb #dz_bit,FPCR_ENABLE(%a6) //test FPCR for dz exc enabled
+ bnes dz_ena
+//
+// dz disabled
+//
+ btstb #sign_bit,ETEMP_EX(%a6) //check sign for neg or pos
+ beqs p_inf //branch if pos sign
+
+m_inf:
+ fmovemx mns_inf,%fp0-%fp0 //load -inf
+ bsetb #neg_bit,FPSR_CC(%a6) //set neg bit in FPSR
+ bras set_fpsr
+p_inf:
+ fmovemx pls_inf,%fp0-%fp0 //load +inf
+set_fpsr:
+ orl #dzinf_mask,USER_FPSR(%a6) //set I,DZ,ADZ
+ rts
+//
+// dz enabled
+//
+dz_ena:
+ btstb #sign_bit,ETEMP_EX(%a6) //check sign for neg or pos
+ beqs dz_ena_end
+ bsetb #neg_bit,FPSR_CC(%a6) //set neg bit in FPSR
+dz_ena_end:
+ orl #dzinf_mask,USER_FPSR(%a6) //set I,DZ,ADZ
+ st STORE_FLG(%a6)
+ rts
+//
+// OPERR exception
+//
+// if (operr trap disabled)
+// set FPSR exception status operr bit, condition code
+// nan bit; Store default NAN into fp0
+// frestore the frame into the machine (done by unimp_hd)
+//
+// else (operr trap enabled)
+// set FPSR exception status operr bit, accrued operr bit
+// set flag to disable sto_res from corrupting fp register
+// frestore the frame into the machine (done by unimp_hd)
+//
+t_operr:
+ orl #opnan_mask,USER_FPSR(%a6) //set NaN, OPERR, AIOP
+
+ btstb #operr_bit,FPCR_ENABLE(%a6) //test FPCR for operr enabled
+ bnes op_ena
+
+ fmovemx nan,%fp0-%fp0 //load default nan
+ rts
+op_ena:
+ st STORE_FLG(%a6) //do not corrupt destination
+ rts
+
+//
+// t_unfl --- UNFL exception
+//
+// This entry point is used by all routines requiring unfl, inex2,
+// aunfl, and ainex to be set on exit.
+//
+// On entry, a0 points to the exceptional operand. The final exceptional
+// operand is built in FP_SCR1 and only the sign from the original operand
+// is used.
+//
+t_unfl:
+ clrl FP_SCR1(%a6) //set exceptional operand to zero
+ clrl FP_SCR1+4(%a6)
+ clrl FP_SCR1+8(%a6)
+ tstb (%a0) //extract sign from caller's exop
+ bpls unfl_signok
+ bset #sign_bit,FP_SCR1(%a6)
+unfl_signok:
+ leal FP_SCR1(%a6),%a0
+ orl #unfinx_mask,USER_FPSR(%a6)
+// ;set UNFL, INEX2, AUNFL, AINEX
+unfl_con:
+ btstb #unfl_bit,FPCR_ENABLE(%a6)
+ beqs unfl_dis
+
+unfl_ena:
+ bfclr STAG(%a6){#5:#3} //clear wbtm66,wbtm1,wbtm0
+ bsetb #wbtemp15_bit,WB_BYTE(%a6) //set wbtemp15
+ bsetb #sticky_bit,STICKY(%a6) //set sticky bit
+
+ bclrb #E1,E_BYTE(%a6)
+
+unfl_dis:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0 //get round precision
+
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0) //convert to internal ext format
+
+ bsr unf_sub //returns IEEE result at a0
+// ;and sets FPSR_CC accordingly
+
+ bfclr LOCAL_SGN(%a0){#0:#8} //convert back to IEEE ext format
+ beqs unfl_fin
+
+ bsetb #sign_bit,LOCAL_EX(%a0)
+ bsetb #sign_bit,FP_SCR1(%a6) //set sign bit of exc operand
+
+unfl_fin:
+ fmovemx (%a0),%fp0-%fp0 //store result in fp0
+ rts
+
+
+//
+// t_ovfl2 --- OVFL exception (without inex2 returned)
+//
+// This entry is used by scale to force catastrophic overflow. The
+// ovfl, aovfl, and ainex bits are set, but not the inex2 bit.
+//
+t_ovfl2:
+ orl #ovfl_inx_mask,USER_FPSR(%a6)
+ movel ETEMP(%a6),FP_SCR1(%a6)
+ movel ETEMP_HI(%a6),FP_SCR1+4(%a6)
+ movel ETEMP_LO(%a6),FP_SCR1+8(%a6)
+//
+// Check for single or double round precision. If single, check if
+// the lower 40 bits of ETEMP are zero; if not, set inex2. If double,
+// check if the lower 21 bits are zero; if not, set inex2.
+//
+ moveb FPCR_MODE(%a6),%d0
+ andib #0xc0,%d0
+ beq t_work //if extended, finish ovfl processing
+ cmpib #0x40,%d0 //test for single
+ bnes t_dbl
+t_sgl:
+ tstb ETEMP_LO(%a6)
+ bnes t_setinx2
+ movel ETEMP_HI(%a6),%d0
+ andil #0xff,%d0 //look at only lower 8 bits
+ bnes t_setinx2
+ bra t_work
+t_dbl:
+ movel ETEMP_LO(%a6),%d0
+ andil #0x7ff,%d0 //look at only lower 11 bits
+ beq t_work
+t_setinx2:
+ orl #inex2_mask,USER_FPSR(%a6)
+ bras t_work
+//
+// t_ovfl --- OVFL exception
+//
+//** Note: the exc operand is returned in ETEMP.
+//
+t_ovfl:
+ orl #ovfinx_mask,USER_FPSR(%a6)
+t_work:
+ btstb #ovfl_bit,FPCR_ENABLE(%a6) //test FPCR for ovfl enabled
+ beqs ovf_dis
+
+ovf_ena:
+ clrl FP_SCR1(%a6) //set exceptional operand
+ clrl FP_SCR1+4(%a6)
+ clrl FP_SCR1+8(%a6)
+
+ bfclr STAG(%a6){#5:#3} //clear wbtm66,wbtm1,wbtm0
+ bclrb #wbtemp15_bit,WB_BYTE(%a6) //clear wbtemp15
+ bsetb #sticky_bit,STICKY(%a6) //set sticky bit
+
+ bclrb #E1,E_BYTE(%a6)
+// ;fall through to disabled case
+
+// For disabled overflow call 'ovf_r_k'. This routine loads the
+// correct result based on the rounding precision, destination
+// format, rounding mode and sign.
+//
+ovf_dis:
+ bsr ovf_r_k //returns unsigned ETEMP_EX
+// ;and sets FPSR_CC accordingly.
+ bfclr ETEMP_SGN(%a6){#0:#8} //fix sign
+ beqs ovf_pos
+ bsetb #sign_bit,ETEMP_EX(%a6)
+ bsetb #sign_bit,FP_SCR1(%a6) //set exceptional operand sign
+ovf_pos:
+ fmovemx ETEMP(%a6),%fp0-%fp0 //move the result to fp0
+ rts
+
+
+//
+// INEX2 exception
+//
+// The inex2 and ainex bits are set.
+//
+t_inx2:
+ orl #inx2a_mask,USER_FPSR(%a6) //set INEX2, AINEX
+ rts
+
+//
+// Force Inex2
+//
+// This routine is called by the transcendental routines to force
+// the inex2 exception bits set in the FPSR. If the underflow bit
+// is set, but the underflow trap was not taken, the aunfl bit in
+// the FPSR must be set.
+//
+t_frcinx:
+ orl #inx2a_mask,USER_FPSR(%a6) //set INEX2, AINEX
+ btstb #unfl_bit,FPSR_EXCEPT(%a6) //test for unfl bit set
+ beqs no_uacc1 //if clear, do not set aunfl
+ bsetb #aunfl_bit,FPSR_AEXCEPT(%a6)
+no_uacc1:
+ rts
+
+//
+// DST_NAN
+//
+// Determine if the destination nan is signalling or non-signalling,
+// and set the FPSR bits accordingly. See the MC68040 User's Manual
+// section 3.2.2.5 NOT-A-NUMBERS.
+//
+dst_nan:
+ btstb #sign_bit,FPTEMP_EX(%a6) //test sign of nan
+ beqs dst_pos //if clr, it was positive
+ bsetb #neg_bit,FPSR_CC(%a6) //set N bit
+dst_pos:
+ btstb #signan_bit,FPTEMP_HI(%a6) //check if signalling
+ beqs dst_snan //branch if signalling
+
+ fmovel %d1,%fpcr //restore user's rmode/prec
+ fmovex FPTEMP(%a6),%fp0 //return the non-signalling nan
+//
+// Check the source nan. If it is signalling, snan will be reported.
+//
+ moveb STAG(%a6),%d0
+ andib #0xe0,%d0
+ cmpib #0x60,%d0
+ bnes no_snan
+ btstb #signan_bit,ETEMP_HI(%a6) //check if signalling
+ bnes no_snan
+ orl #snaniop_mask,USER_FPSR(%a6) //set NAN, SNAN, AIOP
+no_snan:
+ rts
+
+dst_snan:
+ btstb #snan_bit,FPCR_ENABLE(%a6) //check if trap enabled
+ beqs dst_dis //branch if disabled
+
+ orb #nan_tag,DTAG(%a6) //set up dtag for nan
+ st STORE_FLG(%a6) //do not store a result
+ orl #snaniop_mask,USER_FPSR(%a6) //set NAN, SNAN, AIOP
+ rts
+
+dst_dis:
+ bsetb #signan_bit,FPTEMP_HI(%a6) //set SNAN bit in sop
+ fmovel %d1,%fpcr //restore user's rmode/prec
+ fmovex FPTEMP(%a6),%fp0 //load non-sign. nan
+ orl #snaniop_mask,USER_FPSR(%a6) //set NAN, SNAN, AIOP
+ rts
+
+//
+// SRC_NAN
+//
+// Determine if the source nan is signalling or non-signalling,
+// and set the FPSR bits accordingly. See the MC68040 User's Manual
+// section 3.2.2.5 NOT-A-NUMBERS.
+//
+src_nan:
+ btstb #sign_bit,ETEMP_EX(%a6) //test sign of nan
+ beqs src_pos //if clr, it was positive
+ bsetb #neg_bit,FPSR_CC(%a6) //set N bit
+src_pos:
+ btstb #signan_bit,ETEMP_HI(%a6) //check if signalling
+ beqs src_snan //branch if signalling
+ fmovel %d1,%fpcr //restore user's rmode/prec
+ fmovex ETEMP(%a6),%fp0 //return the non-signalling nan
+ rts
+
+src_snan:
+ btstb #snan_bit,FPCR_ENABLE(%a6) //check if trap enabled
+ beqs src_dis //branch if disabled
+ bsetb #signan_bit,ETEMP_HI(%a6) //set SNAN bit in sop
+ orb #norm_tag,DTAG(%a6) //set up dtag for norm
+ orb #nan_tag,STAG(%a6) //set up stag for nan
+ st STORE_FLG(%a6) //do not store a result
+ orl #snaniop_mask,USER_FPSR(%a6) //set NAN, SNAN, AIOP
+ rts
+
+src_dis:
+ bsetb #signan_bit,ETEMP_HI(%a6) //set SNAN bit in sop
+ fmovel %d1,%fpcr //restore user's rmode/prec
+ fmovex ETEMP(%a6),%fp0 //load non-sign. nan
+ orl #snaniop_mask,USER_FPSR(%a6) //set NAN, SNAN, AIOP
+ rts
+
+//
+// For all functions that have a denormalized input and that f(x)=x,
+// this is the entry point
+//
+t_extdnrm:
+ orl #unfinx_mask,USER_FPSR(%a6)
+// ;set UNFL, INEX2, AUNFL, AINEX
+ bras xdnrm_con
+//
+// Entry point for scale with extended denorm. The function does
+// not set inex2, aunfl, or ainex.
+//
+t_resdnrm:
+ orl #unfl_mask,USER_FPSR(%a6)
+
+xdnrm_con:
+ btstb #unfl_bit,FPCR_ENABLE(%a6)
+ beqs xdnrm_dis
+
+//
+// If exceptions are enabled, the additional task of setting up WBTEMP
+// is needed so that when the underflow exception handler is entered,
+// the user perceives no difference between what the 040 provides vs.
+// what the FPSP provides.
+//
+xdnrm_ena:
+ movel %a0,-(%a7)
+
+ movel LOCAL_EX(%a0),FP_SCR1(%a6)
+ movel LOCAL_HI(%a0),FP_SCR1+4(%a6)
+ movel LOCAL_LO(%a0),FP_SCR1+8(%a6)
+
+ lea FP_SCR1(%a6),%a0
+
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0) //convert to internal ext format
+ tstw LOCAL_EX(%a0) //check if input is denorm
+ beqs xdnrm_dn //if so, skip nrm_set
+ bsr nrm_set //normalize the result (exponent
+// ;will be negative
+xdnrm_dn:
+ bclrb #sign_bit,LOCAL_EX(%a0) //take off false sign
+ bfclr LOCAL_SGN(%a0){#0:#8} //change back to IEEE ext format
+ beqs xdep
+ bsetb #sign_bit,LOCAL_EX(%a0)
+xdep:
+ bfclr STAG(%a6){#5:#3} //clear wbtm66,wbtm1,wbtm0
+ bsetb #wbtemp15_bit,WB_BYTE(%a6) //set wbtemp15
+ bclrb #sticky_bit,STICKY(%a6) //clear sticky bit
+ bclrb #E1,E_BYTE(%a6)
+ movel (%a7)+,%a0
+xdnrm_dis:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0 //get round precision
+ bnes not_ext //if not round extended, store
+// ;IEEE defaults
+is_ext:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ beqs xdnrm_store
+
+ bsetb #neg_bit,FPSR_CC(%a6) //set N bit in FPSR_CC
+
+ bras xdnrm_store
+
+not_ext:
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0) //convert to internal ext format
+ bsr unf_sub //returns IEEE result pointed by
+// ;a0; sets FPSR_CC accordingly
+ bfclr LOCAL_SGN(%a0){#0:#8} //convert back to IEEE ext format
+ beqs xdnrm_store
+ bsetb #sign_bit,LOCAL_EX(%a0)
+xdnrm_store:
+ fmovemx (%a0),%fp0-%fp0 //store result in fp0
+ rts
+
+//
+// This subroutine is used for dyadic operations that use an extended
+// denorm within the kernel. The approach used is to capture the frame,
+// fix/restore.
+//
+ .global t_avoid_unsupp
+t_avoid_unsupp:
+ link %a2,#-LOCAL_SIZE //so that a2 fpsp.h negative
+// ;offsets may be used
+ fsave -(%a7)
+ tstb 1(%a7) //check if idle, exit if so
+ beq idle_end
+ btstb #E1,E_BYTE(%a2) //check for an E1 exception if
+// ;enabled, there is an unsupp
+ beq end_avun //else, exit
+ btstb #7,DTAG(%a2) //check for denorm destination
+ beqs src_den //else, must be a source denorm
+//
+// handle destination denorm
+//
+ lea FPTEMP(%a2),%a0
+ btstb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0) //convert to internal ext format
+ bclrb #7,DTAG(%a2) //set DTAG to norm
+ bsr nrm_set //normalize result, exponent
+// ;will become negative
+ bclrb #sign_bit,LOCAL_EX(%a0) //get rid of fake sign
+ bfclr LOCAL_SGN(%a0){#0:#8} //convert back to IEEE ext format
+ beqs ck_src_den //check if source is also denorm
+ bsetb #sign_bit,LOCAL_EX(%a0)
+ck_src_den:
+ btstb #7,STAG(%a2)
+ beqs end_avun
+src_den:
+ lea ETEMP(%a2),%a0
+ btstb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0) //convert to internal ext format
+ bclrb #7,STAG(%a2) //set STAG to norm
+ bsr nrm_set //normalize result, exponent
+// ;will become negative
+ bclrb #sign_bit,LOCAL_EX(%a0) //get rid of fake sign
+ bfclr LOCAL_SGN(%a0){#0:#8} //convert back to IEEE ext format
+ beqs den_com
+ bsetb #sign_bit,LOCAL_EX(%a0)
+den_com:
+ moveb #0xfe,CU_SAVEPC(%a2) //set continue frame
+ clrw NMNEXC(%a2) //clear NMNEXC
+ bclrb #E1,E_BYTE(%a2)
+// fmove.l %FPSR,FPSR_SHADOW(%a2)
+// bset.b #SFLAG,E_BYTE(%a2)
+// bset.b #XFLAG,T_BYTE(%a2)
+end_avun:
+ frestore (%a7)+
+ unlk %a2
+ rts
+idle_end:
+ addl #4,%a7
+ unlk %a2
+ rts
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/res_func.s b/c/src/lib/libcpu/m68k/m68040/fpsp/res_func.s
new file mode 100644
index 0000000000..df8d0d9313
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/res_func.s
@@ -0,0 +1,2040 @@
+//
+// res_func.sa 3.9 7/29/91
+//
+// Normalizes denormalized numbers if necessary and updates the
+// stack frame. The function is then restored back into the
+// machine and the 040 completes the operation. This routine
+// is only used by the unsupported data type/format handler.
+// (Exception vector 55).
+//
+// For packed move out (fmove.p fpm,<ea>) the operation is
+// completed here; data is packed and moved to user memory.
+// The stack is restored to the 040 only in the case of a
+// reportable exception in the conversion.
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+RES_FUNC: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+sp_bnds: .short 0x3f81,0x407e
+ .short 0x3f6a,0x0000
+dp_bnds: .short 0x3c01,0x43fe
+ .short 0x3bcd,0x0000
+
+ |xref mem_write
+ |xref bindec
+ |xref get_fline
+ |xref round
+ |xref denorm
+ |xref dest_ext
+ |xref dest_dbl
+ |xref dest_sgl
+ |xref unf_sub
+ |xref nrm_set
+ |xref dnrm_lp
+ |xref ovf_res
+ |xref reg_dest
+ |xref t_ovfl
+ |xref t_unfl
+
+ .global res_func
+ .global p_move
+
+res_func:
+ clrb DNRM_FLG(%a6)
+ clrb RES_FLG(%a6)
+ clrb CU_ONLY(%a6)
+ tstb DY_MO_FLG(%a6)
+ beqs monadic
+dyadic:
+ btstb #7,DTAG(%a6) //if dop = norm=000, zero=001,
+// ;inf=010 or nan=011
+ beqs monadic //then branch
+// ;else denorm
+// HANDLE DESTINATION DENORM HERE
+// ;set dtag to norm
+// ;write the tag & fpte15 to the fstack
+ leal FPTEMP(%a6),%a0
+
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+
+ bsr nrm_set //normalize number (exp will go negative)
+ bclrb #sign_bit,LOCAL_EX(%a0) //get rid of false sign
+ bfclr LOCAL_SGN(%a0){#0:#8} //change back to IEEE ext format
+ beqs dpos
+ bsetb #sign_bit,LOCAL_EX(%a0)
+dpos:
+ bfclr DTAG(%a6){#0:#4} //set tag to normalized, FPTE15 = 0
+ bsetb #4,DTAG(%a6) //set FPTE15
+ orb #0x0f,DNRM_FLG(%a6)
+monadic:
+ leal ETEMP(%a6),%a0
+ btstb #direction_bit,CMDREG1B(%a6) //check direction
+ bne opclass3 //it is a mv out
+//
+// At this point, only opclass 0 and 2 possible
+//
+ btstb #7,STAG(%a6) //if sop = norm=000, zero=001,
+// ;inf=010 or nan=011
+ bne mon_dnrm //else denorm
+ tstb DY_MO_FLG(%a6) //all cases of dyadic instructions would
+ bne normal //require normalization of denorm
+
+// At this point:
+// monadic instructions: fabs = $18 fneg = $1a ftst = $3a
+// fmove = $00 fsmove = $40 fdmove = $44
+// fsqrt = $05* fssqrt = $41 fdsqrt = $45
+// (*fsqrt reencoded to $05)
+//
+ movew CMDREG1B(%a6),%d0 //get command register
+ andil #0x7f,%d0 //strip to only command word
+//
+// At this point, fabs, fneg, fsmove, fdmove, ftst, fsqrt, fssqrt, and
+// fdsqrt are possible.
+// For cases fabs, fneg, fsmove, and fdmove goto spos (do not normalize)
+// For cases fsqrt, fssqrt, and fdsqrt goto nrm_src (do normalize)
+//
+ btstl #0,%d0
+ bne normal //weed out fsqrt instructions
+//
+// cu_norm handles fmove in instructions with normalized inputs.
+// The routine round is used to correctly round the input for the
+// destination precision and mode.
+//
+cu_norm:
+ st CU_ONLY(%a6) //set cu-only inst flag
+ movew CMDREG1B(%a6),%d0
+ andib #0x3b,%d0 //isolate bits to select inst
+ tstb %d0
+ beql cu_nmove //if zero, it is an fmove
+ cmpib #0x18,%d0
+ beql cu_nabs //if $18, it is fabs
+ cmpib #0x1a,%d0
+ beql cu_nneg //if $1a, it is fneg
+//
+// Inst is ftst. Check the source operand and set the cc's accordingly.
+// No write is done, so simply rts.
+//
+cu_ntst:
+ movew LOCAL_EX(%a0),%d0
+ bclrl #15,%d0
+ sne LOCAL_SGN(%a0)
+ beqs cu_ntpo
+ orl #neg_mask,USER_FPSR(%a6) //set N
+cu_ntpo:
+ cmpiw #0x7fff,%d0 //test for inf/nan
+ bnes cu_ntcz
+ tstl LOCAL_HI(%a0)
+ bnes cu_ntn
+ tstl LOCAL_LO(%a0)
+ bnes cu_ntn
+ orl #inf_mask,USER_FPSR(%a6)
+ rts
+cu_ntn:
+ orl #nan_mask,USER_FPSR(%a6)
+ movel ETEMP_EX(%a6),FPTEMP_EX(%a6) //set up fptemp sign for
+// ;snan handler
+
+ rts
+cu_ntcz:
+ tstl LOCAL_HI(%a0)
+ bnel cu_ntsx
+ tstl LOCAL_LO(%a0)
+ bnel cu_ntsx
+ orl #z_mask,USER_FPSR(%a6)
+cu_ntsx:
+ rts
+//
+// Inst is fabs. Execute the absolute value function on the input.
+// Branch to the fmove code. If the operand is NaN, do nothing.
+//
+cu_nabs:
+ moveb STAG(%a6),%d0
+ btstl #5,%d0 //test for NaN or zero
+ bne wr_etemp //if either, simply write it
+ bclrb #7,LOCAL_EX(%a0) //do abs
+ bras cu_nmove //fmove code will finish
+//
+// Inst is fneg. Execute the negate value function on the input.
+// Fall though to the fmove code. If the operand is NaN, do nothing.
+//
+cu_nneg:
+ moveb STAG(%a6),%d0
+ btstl #5,%d0 //test for NaN or zero
+ bne wr_etemp //if either, simply write it
+ bchgb #7,LOCAL_EX(%a0) //do neg
+//
+// Inst is fmove. This code also handles all result writes.
+// If bit 2 is set, round is forced to double. If it is clear,
+// and bit 6 is set, round is forced to single. If both are clear,
+// the round precision is found in the fpcr. If the rounding precision
+// is double or single, round the result before the write.
+//
+cu_nmove:
+ moveb STAG(%a6),%d0
+ andib #0xe0,%d0 //isolate stag bits
+ bne wr_etemp //if not norm, simply write it
+ btstb #2,CMDREG1B+1(%a6) //check for rd
+ bne cu_nmrd
+ btstb #6,CMDREG1B+1(%a6) //check for rs
+ bne cu_nmrs
+//
+// The move or operation is not with forced precision. Test for
+// nan or inf as the input; if so, simply write it to FPn. Use the
+// FPCR_MODE byte to get rounding on norms and zeros.
+//
+cu_nmnr:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0
+ tstb %d0 //check for extended
+ beq cu_wrexn //if so, just write result
+ cmpib #1,%d0 //check for single
+ beq cu_nmrs //fall through to double
+//
+// The move is fdmove or round precision is double.
+//
+cu_nmrd:
+ movel #2,%d0 //set up the size for denorm
+ movew LOCAL_EX(%a0),%d1 //compare exponent to double threshold
+ andw #0x7fff,%d1
+ cmpw #0x3c01,%d1
+ bls cu_nunfl
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //get rmode
+ orl #0x00020000,%d1 //or in rprec (double)
+ clrl %d0 //clear g,r,s for round
+ bclrb #sign_bit,LOCAL_EX(%a0) //convert to internal format
+ sne LOCAL_SGN(%a0)
+ bsrl round
+ bfclr LOCAL_SGN(%a0){#0:#8}
+ beqs cu_nmrdc
+ bsetb #sign_bit,LOCAL_EX(%a0)
+cu_nmrdc:
+ movew LOCAL_EX(%a0),%d1 //check for overflow
+ andw #0x7fff,%d1
+ cmpw #0x43ff,%d1
+ bge cu_novfl //take care of overflow case
+ bra cu_wrexn
+//
+// The move is fsmove or round precision is single.
+//
+cu_nmrs:
+ movel #1,%d0
+ movew LOCAL_EX(%a0),%d1
+ andw #0x7fff,%d1
+ cmpw #0x3f81,%d1
+ bls cu_nunfl
+ bfextu FPCR_MODE(%a6){#2:#2},%d1
+ orl #0x00010000,%d1
+ clrl %d0
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+ bsrl round
+ bfclr LOCAL_SGN(%a0){#0:#8}
+ beqs cu_nmrsc
+ bsetb #sign_bit,LOCAL_EX(%a0)
+cu_nmrsc:
+ movew LOCAL_EX(%a0),%d1
+ andw #0x7FFF,%d1
+ cmpw #0x407f,%d1
+ blt cu_wrexn
+//
+// The operand is above precision boundaries. Use t_ovfl to
+// generate the correct value.
+//
+cu_novfl:
+ bsr t_ovfl
+ bra cu_wrexn
+//
+// The operand is below precision boundaries. Use denorm to
+// generate the correct value.
+//
+cu_nunfl:
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+ bsr denorm
+ bfclr LOCAL_SGN(%a0){#0:#8} //change back to IEEE ext format
+ beqs cu_nucont
+ bsetb #sign_bit,LOCAL_EX(%a0)
+cu_nucont:
+ bfextu FPCR_MODE(%a6){#2:#2},%d1
+ btstb #2,CMDREG1B+1(%a6) //check for rd
+ bne inst_d
+ btstb #6,CMDREG1B+1(%a6) //check for rs
+ bne inst_s
+ swap %d1
+ moveb FPCR_MODE(%a6),%d1
+ lsrb #6,%d1
+ swap %d1
+ bra inst_sd
+inst_d:
+ orl #0x00020000,%d1
+ bra inst_sd
+inst_s:
+ orl #0x00010000,%d1
+inst_sd:
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+ bsrl round
+ bfclr LOCAL_SGN(%a0){#0:#8}
+ beqs cu_nuflp
+ bsetb #sign_bit,LOCAL_EX(%a0)
+cu_nuflp:
+ btstb #inex2_bit,FPSR_EXCEPT(%a6)
+ beqs cu_nuninx
+ orl #aunfl_mask,USER_FPSR(%a6) //if the round was inex, set AUNFL
+cu_nuninx:
+ tstl LOCAL_HI(%a0) //test for zero
+ bnes cu_nunzro
+ tstl LOCAL_LO(%a0)
+ bnes cu_nunzro
+//
+// The mantissa is zero from the denorm loop. Check sign and rmode
+// to see if rounding should have occurred which would leave the lsb.
+//
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0 //isolate rmode
+ cmpil #0x20,%d0
+ blts cu_nzro
+ bnes cu_nrp
+cu_nrm:
+ tstw LOCAL_EX(%a0) //if positive, set lsb
+ bges cu_nzro
+ btstb #7,FPCR_MODE(%a6) //check for double
+ beqs cu_nincs
+ bras cu_nincd
+cu_nrp:
+ tstw LOCAL_EX(%a0) //if positive, set lsb
+ blts cu_nzro
+ btstb #7,FPCR_MODE(%a6) //check for double
+ beqs cu_nincs
+cu_nincd:
+ orl #0x800,LOCAL_LO(%a0) //inc for double
+ bra cu_nunzro
+cu_nincs:
+ orl #0x100,LOCAL_HI(%a0) //inc for single
+ bra cu_nunzro
+cu_nzro:
+ orl #z_mask,USER_FPSR(%a6)
+ moveb STAG(%a6),%d0
+ andib #0xe0,%d0
+ cmpib #0x40,%d0 //check if input was tagged zero
+ beqs cu_numv
+cu_nunzro:
+ orl #unfl_mask,USER_FPSR(%a6) //set unfl
+cu_numv:
+ movel (%a0),ETEMP(%a6)
+ movel 4(%a0),ETEMP_HI(%a6)
+ movel 8(%a0),ETEMP_LO(%a6)
+//
+// Write the result to memory, setting the fpsr cc bits. NaN and Inf
+// bypass cu_wrexn.
+//
+cu_wrexn:
+ tstw LOCAL_EX(%a0) //test for zero
+ beqs cu_wrzero
+ cmpw #0x8000,LOCAL_EX(%a0) //test for zero
+ bnes cu_wreon
+cu_wrzero:
+ orl #z_mask,USER_FPSR(%a6) //set Z bit
+cu_wreon:
+ tstw LOCAL_EX(%a0)
+ bpl wr_etemp
+ orl #neg_mask,USER_FPSR(%a6)
+ bra wr_etemp
+
+//
+// HANDLE SOURCE DENORM HERE
+//
+// ;clear denorm stag to norm
+// ;write the new tag & ete15 to the fstack
+mon_dnrm:
+//
+// At this point, check for the cases in which normalizing the
+// denorm produces incorrect results.
+//
+ tstb DY_MO_FLG(%a6) //all cases of dyadic instructions would
+ bnes nrm_src //require normalization of denorm
+
+// At this point:
+// monadic instructions: fabs = $18 fneg = $1a ftst = $3a
+// fmove = $00 fsmove = $40 fdmove = $44
+// fsqrt = $05* fssqrt = $41 fdsqrt = $45
+// (*fsqrt reencoded to $05)
+//
+ movew CMDREG1B(%a6),%d0 //get command register
+ andil #0x7f,%d0 //strip to only command word
+//
+// At this point, fabs, fneg, fsmove, fdmove, ftst, fsqrt, fssqrt, and
+// fdsqrt are possible.
+// For cases fabs, fneg, fsmove, and fdmove goto spos (do not normalize)
+// For cases fsqrt, fssqrt, and fdsqrt goto nrm_src (do normalize)
+//
+ btstl #0,%d0
+ bnes nrm_src //weed out fsqrt instructions
+ st CU_ONLY(%a6) //set cu-only inst flag
+ bra cu_dnrm //fmove, fabs, fneg, ftst
+// ;cases go to cu_dnrm
+nrm_src:
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+ bsr nrm_set //normalize number (exponent will go
+// ; negative)
+ bclrb #sign_bit,LOCAL_EX(%a0) //get rid of false sign
+
+ bfclr LOCAL_SGN(%a0){#0:#8} //change back to IEEE ext format
+ beqs spos
+ bsetb #sign_bit,LOCAL_EX(%a0)
+spos:
+ bfclr STAG(%a6){#0:#4} //set tag to normalized, FPTE15 = 0
+ bsetb #4,STAG(%a6) //set ETE15
+ orb #0xf0,DNRM_FLG(%a6)
+normal:
+ tstb DNRM_FLG(%a6) //check if any of the ops were denorms
+ bne ck_wrap //if so, check if it is a potential
+// ;wrap-around case
+fix_stk:
+ moveb #0xfe,CU_SAVEPC(%a6)
+ bclrb #E1,E_BYTE(%a6)
+
+ clrw NMNEXC(%a6)
+
+ st RES_FLG(%a6) //indicate that a restore is needed
+ rts
+
+//
+// cu_dnrm handles all cu-only instructions (fmove, fabs, fneg, and
+// ftst) completely in software without an frestore to the 040.
+//
+cu_dnrm:
+ st CU_ONLY(%a6)
+ movew CMDREG1B(%a6),%d0
+ andib #0x3b,%d0 //isolate bits to select inst
+ tstb %d0
+ beql cu_dmove //if zero, it is an fmove
+ cmpib #0x18,%d0
+ beql cu_dabs //if $18, it is fabs
+ cmpib #0x1a,%d0
+ beql cu_dneg //if $1a, it is fneg
+//
+// Inst is ftst. Check the source operand and set the cc's accordingly.
+// No write is done, so simply rts.
+//
+cu_dtst:
+ movew LOCAL_EX(%a0),%d0
+ bclrl #15,%d0
+ sne LOCAL_SGN(%a0)
+ beqs cu_dtpo
+ orl #neg_mask,USER_FPSR(%a6) //set N
+cu_dtpo:
+ cmpiw #0x7fff,%d0 //test for inf/nan
+ bnes cu_dtcz
+ tstl LOCAL_HI(%a0)
+ bnes cu_dtn
+ tstl LOCAL_LO(%a0)
+ bnes cu_dtn
+ orl #inf_mask,USER_FPSR(%a6)
+ rts
+cu_dtn:
+ orl #nan_mask,USER_FPSR(%a6)
+ movel ETEMP_EX(%a6),FPTEMP_EX(%a6) //set up fptemp sign for
+// ;snan handler
+ rts
+cu_dtcz:
+ tstl LOCAL_HI(%a0)
+ bnel cu_dtsx
+ tstl LOCAL_LO(%a0)
+ bnel cu_dtsx
+ orl #z_mask,USER_FPSR(%a6)
+cu_dtsx:
+ rts
+//
+// Inst is fabs. Execute the absolute value function on the input.
+// Branch to the fmove code.
+//
+cu_dabs:
+ bclrb #7,LOCAL_EX(%a0) //do abs
+ bras cu_dmove //fmove code will finish
+//
+// Inst is fneg. Execute the negate value function on the input.
+// Fall though to the fmove code.
+//
+cu_dneg:
+ bchgb #7,LOCAL_EX(%a0) //do neg
+//
+// Inst is fmove. This code also handles all result writes.
+// If bit 2 is set, round is forced to double. If it is clear,
+// and bit 6 is set, round is forced to single. If both are clear,
+// the round precision is found in the fpcr. If the rounding precision
+// is double or single, the result is zero, and the mode is checked
+// to determine if the lsb of the result should be set.
+//
+cu_dmove:
+ btstb #2,CMDREG1B+1(%a6) //check for rd
+ bne cu_dmrd
+ btstb #6,CMDREG1B+1(%a6) //check for rs
+ bne cu_dmrs
+//
+// The move or operation is not with forced precision. Use the
+// FPCR_MODE byte to get rounding.
+//
+cu_dmnr:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0
+ tstb %d0 //check for extended
+ beq cu_wrexd //if so, just write result
+ cmpib #1,%d0 //check for single
+ beq cu_dmrs //fall through to double
+//
+// The move is fdmove or round precision is double. Result is zero.
+// Check rmode for rp or rm and set lsb accordingly.
+//
+cu_dmrd:
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //get rmode
+ tstw LOCAL_EX(%a0) //check sign
+ blts cu_dmdn
+ cmpib #3,%d1 //check for rp
+ bne cu_dpd //load double pos zero
+ bra cu_dpdr //load double pos zero w/lsb
+cu_dmdn:
+ cmpib #2,%d1 //check for rm
+ bne cu_dnd //load double neg zero
+ bra cu_dndr //load double neg zero w/lsb
+//
+// The move is fsmove or round precision is single. Result is zero.
+// Check for rp or rm and set lsb accordingly.
+//
+cu_dmrs:
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //get rmode
+ tstw LOCAL_EX(%a0) //check sign
+ blts cu_dmsn
+ cmpib #3,%d1 //check for rp
+ bne cu_spd //load single pos zero
+ bra cu_spdr //load single pos zero w/lsb
+cu_dmsn:
+ cmpib #2,%d1 //check for rm
+ bne cu_snd //load single neg zero
+ bra cu_sndr //load single neg zero w/lsb
+//
+// The precision is extended, so the result in etemp is correct.
+// Simply set unfl (not inex2 or aunfl) and write the result to
+// the correct fp register.
+cu_wrexd:
+ orl #unfl_mask,USER_FPSR(%a6)
+ tstw LOCAL_EX(%a0)
+ beq wr_etemp
+ orl #neg_mask,USER_FPSR(%a6)
+ bra wr_etemp
+//
+// These routines write +/- zero in double format. The routines
+// cu_dpdr and cu_dndr set the double lsb.
+//
+cu_dpd:
+ movel #0x3c010000,LOCAL_EX(%a0) //force pos double zero
+ clrl LOCAL_HI(%a0)
+ clrl LOCAL_LO(%a0)
+ orl #z_mask,USER_FPSR(%a6)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+cu_dpdr:
+ movel #0x3c010000,LOCAL_EX(%a0) //force pos double zero
+ clrl LOCAL_HI(%a0)
+ movel #0x800,LOCAL_LO(%a0) //with lsb set
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+cu_dnd:
+ movel #0xbc010000,LOCAL_EX(%a0) //force pos double zero
+ clrl LOCAL_HI(%a0)
+ clrl LOCAL_LO(%a0)
+ orl #z_mask,USER_FPSR(%a6)
+ orl #neg_mask,USER_FPSR(%a6)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+cu_dndr:
+ movel #0xbc010000,LOCAL_EX(%a0) //force pos double zero
+ clrl LOCAL_HI(%a0)
+ movel #0x800,LOCAL_LO(%a0) //with lsb set
+ orl #neg_mask,USER_FPSR(%a6)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+//
+// These routines write +/- zero in single format. The routines
+// cu_dpdr and cu_dndr set the single lsb.
+//
+cu_spd:
+ movel #0x3f810000,LOCAL_EX(%a0) //force pos single zero
+ clrl LOCAL_HI(%a0)
+ clrl LOCAL_LO(%a0)
+ orl #z_mask,USER_FPSR(%a6)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+cu_spdr:
+ movel #0x3f810000,LOCAL_EX(%a0) //force pos single zero
+ movel #0x100,LOCAL_HI(%a0) //with lsb set
+ clrl LOCAL_LO(%a0)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+cu_snd:
+ movel #0xbf810000,LOCAL_EX(%a0) //force pos single zero
+ clrl LOCAL_HI(%a0)
+ clrl LOCAL_LO(%a0)
+ orl #z_mask,USER_FPSR(%a6)
+ orl #neg_mask,USER_FPSR(%a6)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+cu_sndr:
+ movel #0xbf810000,LOCAL_EX(%a0) //force pos single zero
+ movel #0x100,LOCAL_HI(%a0) //with lsb set
+ clrl LOCAL_LO(%a0)
+ orl #neg_mask,USER_FPSR(%a6)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ bra wr_etemp
+
+//
+// This code checks for 16-bit overflow conditions on dyadic
+// operations which are not restorable into the floating-point
+// unit and must be completed in software. Basically, this
+// condition exists with a very large norm and a denorm. One
+// of the operands must be denormalized to enter this code.
+//
+// Flags used:
+// DY_MO_FLG contains 0 for monadic op, $ff for dyadic
+// DNRM_FLG contains $00 for neither op denormalized
+// $0f for the destination op denormalized
+// $f0 for the source op denormalized
+// $ff for both ops denormalized
+//
+// The wrap-around condition occurs for add, sub, div, and cmp
+// when
+//
+// abs(dest_exp - src_exp) >= $8000
+//
+// and for mul when
+//
+// (dest_exp + src_exp) < $0
+//
+// we must process the operation here if this case is true.
+//
+// The rts following the frcfpn routine is the exit from res_func
+// for this condition. The restore flag (RES_FLG) is left clear.
+// No frestore is done unless an exception is to be reported.
+//
+// For fadd:
+// if(sign_of(dest) != sign_of(src))
+// replace exponent of src with $3fff (keep sign)
+// use fpu to perform dest+new_src (user's rmode and X)
+// clr sticky
+// else
+// set sticky
+// call round with user's precision and mode
+// move result to fpn and wbtemp
+//
+// For fsub:
+// if(sign_of(dest) == sign_of(src))
+// replace exponent of src with $3fff (keep sign)
+// use fpu to perform dest+new_src (user's rmode and X)
+// clr sticky
+// else
+// set sticky
+// call round with user's precision and mode
+// move result to fpn and wbtemp
+//
+// For fdiv/fsgldiv:
+// if(both operands are denorm)
+// restore_to_fpu;
+// if(dest is norm)
+// force_ovf;
+// else(dest is denorm)
+// force_unf:
+//
+// For fcmp:
+// if(dest is norm)
+// N = sign_of(dest);
+// else(dest is denorm)
+// N = sign_of(src);
+//
+// For fmul:
+// if(both operands are denorm)
+// force_unf;
+// if((dest_exp + src_exp) < 0)
+// force_unf:
+// else
+// restore_to_fpu;
+//
+// local equates:
+ .set addcode,0x22
+ .set subcode,0x28
+ .set mulcode,0x23
+ .set divcode,0x20
+ .set cmpcode,0x38
+ck_wrap:
+ | tstb DY_MO_FLG(%a6) ;check for fsqrt
+ beq fix_stk //if zero, it is fsqrt
+ movew CMDREG1B(%a6),%d0
+ andiw #0x3b,%d0 //strip to command bits
+ cmpiw #addcode,%d0
+ beq wrap_add
+ cmpiw #subcode,%d0
+ beq wrap_sub
+ cmpiw #mulcode,%d0
+ beq wrap_mul
+ cmpiw #cmpcode,%d0
+ beq wrap_cmp
+//
+// Inst is fdiv.
+//
+wrap_div:
+ cmpb #0xff,DNRM_FLG(%a6) //if both ops denorm,
+ beq fix_stk //restore to fpu
+//
+// One of the ops is denormalized. Test for wrap condition
+// and force the result.
+//
+ cmpb #0x0f,DNRM_FLG(%a6) //check for dest denorm
+ bnes div_srcd
+div_destd:
+ bsrl ckinf_ns
+ bne fix_stk
+ bfextu ETEMP_EX(%a6){#1:#15},%d0 //get src exp (always pos)
+ bfexts FPTEMP_EX(%a6){#1:#15},%d1 //get dest exp (always neg)
+ subl %d1,%d0 //subtract dest from src
+ cmpl #0x7fff,%d0
+ blt fix_stk //if less, not wrap case
+ clrb WBTEMP_SGN(%a6)
+ movew ETEMP_EX(%a6),%d0 //find the sign of the result
+ movew FPTEMP_EX(%a6),%d1
+ eorw %d1,%d0
+ andiw #0x8000,%d0
+ beq force_unf
+ st WBTEMP_SGN(%a6)
+ bra force_unf
+
+ckinf_ns:
+ moveb STAG(%a6),%d0 //check source tag for inf or nan
+ bra ck_in_com
+ckinf_nd:
+ moveb DTAG(%a6),%d0 //check destination tag for inf or nan
+ck_in_com:
+ andib #0x60,%d0 //isolate tag bits
+ cmpb #0x40,%d0 //is it inf?
+ beq nan_or_inf //not wrap case
+ cmpb #0x60,%d0 //is it nan?
+ beq nan_or_inf //yes, not wrap case?
+ cmpb #0x20,%d0 //is it a zero?
+ beq nan_or_inf //yes
+ clrl %d0
+ rts //then ; it is either a zero of norm,
+// ;check wrap case
+nan_or_inf:
+ moveql #-1,%d0
+ rts
+
+
+
+div_srcd:
+ bsrl ckinf_nd
+ bne fix_stk
+ bfextu FPTEMP_EX(%a6){#1:#15},%d0 //get dest exp (always pos)
+ bfexts ETEMP_EX(%a6){#1:#15},%d1 //get src exp (always neg)
+ subl %d1,%d0 //subtract src from dest
+ cmpl #0x8000,%d0
+ blt fix_stk //if less, not wrap case
+ clrb WBTEMP_SGN(%a6)
+ movew ETEMP_EX(%a6),%d0 //find the sign of the result
+ movew FPTEMP_EX(%a6),%d1
+ eorw %d1,%d0
+ andiw #0x8000,%d0
+ beqs force_ovf
+ st WBTEMP_SGN(%a6)
+//
+// This code handles the case of the instruction resulting in
+// an overflow condition.
+//
+force_ovf:
+ bclrb #E1,E_BYTE(%a6)
+ orl #ovfl_inx_mask,USER_FPSR(%a6)
+ clrw NMNEXC(%a6)
+ leal WBTEMP(%a6),%a0 //point a0 to memory location
+ movew CMDREG1B(%a6),%d0
+ btstl #6,%d0 //test for forced precision
+ beqs frcovf_fpcr
+ btstl #2,%d0 //check for double
+ bnes frcovf_dbl
+ movel #0x1,%d0 //inst is forced single
+ bras frcovf_rnd
+frcovf_dbl:
+ movel #0x2,%d0 //inst is forced double
+ bras frcovf_rnd
+frcovf_fpcr:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0 //inst not forced - use fpcr prec
+frcovf_rnd:
+
+// The 881/882 does not set inex2 for the following case, so the
+// line is commented out to be compatible with 881/882
+// tst.b %d0
+// beq.b frcovf_x
+// or.l #inex2_mask,USER_FPSR(%a6) ;if prec is s or d, set inex2
+
+//frcovf_x:
+ bsrl ovf_res //get correct result based on
+// ;round precision/mode. This
+// ;sets FPSR_CC correctly
+// ;returns in external format
+ bfclr WBTEMP_SGN(%a6){#0:#8}
+ beq frcfpn
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+ bra frcfpn
+//
+// Inst is fadd.
+//
+wrap_add:
+ cmpb #0xff,DNRM_FLG(%a6) //if both ops denorm,
+ beq fix_stk //restore to fpu
+//
+// One of the ops is denormalized. Test for wrap condition
+// and complete the instruction.
+//
+ cmpb #0x0f,DNRM_FLG(%a6) //check for dest denorm
+ bnes add_srcd
+add_destd:
+ bsrl ckinf_ns
+ bne fix_stk
+ bfextu ETEMP_EX(%a6){#1:#15},%d0 //get src exp (always pos)
+ bfexts FPTEMP_EX(%a6){#1:#15},%d1 //get dest exp (always neg)
+ subl %d1,%d0 //subtract dest from src
+ cmpl #0x8000,%d0
+ blt fix_stk //if less, not wrap case
+ bra add_wrap
+add_srcd:
+ bsrl ckinf_nd
+ bne fix_stk
+ bfextu FPTEMP_EX(%a6){#1:#15},%d0 //get dest exp (always pos)
+ bfexts ETEMP_EX(%a6){#1:#15},%d1 //get src exp (always neg)
+ subl %d1,%d0 //subtract src from dest
+ cmpl #0x8000,%d0
+ blt fix_stk //if less, not wrap case
+//
+// Check the signs of the operands. If they are unlike, the fpu
+// can be used to add the norm and 1.0 with the sign of the
+// denorm and it will correctly generate the result in extended
+// precision. We can then call round with no sticky and the result
+// will be correct for the user's rounding mode and precision. If
+// the signs are the same, we call round with the sticky bit set
+// and the result will be correct for the user's rounding mode and
+// precision.
+//
+add_wrap:
+ movew ETEMP_EX(%a6),%d0
+ movew FPTEMP_EX(%a6),%d1
+ eorw %d1,%d0
+ andiw #0x8000,%d0
+ beq add_same
+//
+// The signs are unlike.
+//
+ cmpb #0x0f,DNRM_FLG(%a6) //is dest the denorm?
+ bnes add_u_srcd
+ movew FPTEMP_EX(%a6),%d0
+ andiw #0x8000,%d0
+ orw #0x3fff,%d0 //force the exponent to +/- 1
+ movew %d0,FPTEMP_EX(%a6) //in the denorm
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ fmovel %d0,%fpcr //set up users rmode and X
+ fmovex ETEMP(%a6),%fp0
+ faddx FPTEMP(%a6),%fp0
+ leal WBTEMP(%a6),%a0 //point a0 to wbtemp in frame
+ fmovel %fpsr,%d1
+ orl %d1,USER_FPSR(%a6) //capture cc's and inex from fadd
+ fmovex %fp0,WBTEMP(%a6) //write result to memory
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ clrl %d0 //force sticky to zero
+ bclrb #sign_bit,WBTEMP_EX(%a6)
+ sne WBTEMP_SGN(%a6)
+ bsrl round //round result to users rmode & prec
+ bfclr WBTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beq frcfpnr
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+ bra frcfpnr
+add_u_srcd:
+ movew ETEMP_EX(%a6),%d0
+ andiw #0x8000,%d0
+ orw #0x3fff,%d0 //force the exponent to +/- 1
+ movew %d0,ETEMP_EX(%a6) //in the denorm
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ fmovel %d0,%fpcr //set up users rmode and X
+ fmovex ETEMP(%a6),%fp0
+ faddx FPTEMP(%a6),%fp0
+ fmovel %fpsr,%d1
+ orl %d1,USER_FPSR(%a6) //capture cc's and inex from fadd
+ leal WBTEMP(%a6),%a0 //point a0 to wbtemp in frame
+ fmovex %fp0,WBTEMP(%a6) //write result to memory
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ clrl %d0 //force sticky to zero
+ bclrb #sign_bit,WBTEMP_EX(%a6)
+ sne WBTEMP_SGN(%a6) //use internal format for round
+ bsrl round //round result to users rmode & prec
+ bfclr WBTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beq frcfpnr
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+ bra frcfpnr
+//
+// Signs are alike:
+//
+add_same:
+ cmpb #0x0f,DNRM_FLG(%a6) //is dest the denorm?
+ bnes add_s_srcd
+add_s_destd:
+ leal ETEMP(%a6),%a0
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ movel #0x20000000,%d0 //set sticky for round
+ bclrb #sign_bit,ETEMP_EX(%a6)
+ sne ETEMP_SGN(%a6)
+ bsrl round //round result to users rmode & prec
+ bfclr ETEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beqs add_s_dclr
+ bsetb #sign_bit,ETEMP_EX(%a6)
+add_s_dclr:
+ leal WBTEMP(%a6),%a0
+ movel ETEMP(%a6),(%a0) //write result to wbtemp
+ movel ETEMP_HI(%a6),4(%a0)
+ movel ETEMP_LO(%a6),8(%a0)
+ tstw ETEMP_EX(%a6)
+ bgt add_ckovf
+ orl #neg_mask,USER_FPSR(%a6)
+ bra add_ckovf
+add_s_srcd:
+ leal FPTEMP(%a6),%a0
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ movel #0x20000000,%d0 //set sticky for round
+ bclrb #sign_bit,FPTEMP_EX(%a6)
+ sne FPTEMP_SGN(%a6)
+ bsrl round //round result to users rmode & prec
+ bfclr FPTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beqs add_s_sclr
+ bsetb #sign_bit,FPTEMP_EX(%a6)
+add_s_sclr:
+ leal WBTEMP(%a6),%a0
+ movel FPTEMP(%a6),(%a0) //write result to wbtemp
+ movel FPTEMP_HI(%a6),4(%a0)
+ movel FPTEMP_LO(%a6),8(%a0)
+ tstw FPTEMP_EX(%a6)
+ bgt add_ckovf
+ orl #neg_mask,USER_FPSR(%a6)
+add_ckovf:
+ movew WBTEMP_EX(%a6),%d0
+ andiw #0x7fff,%d0
+ cmpiw #0x7fff,%d0
+ bne frcfpnr
+//
+// The result has overflowed to $7fff exponent. Set I, ovfl,
+// and aovfl, and clr the mantissa (incorrectly set by the
+// round routine.)
+//
+ orl #inf_mask+ovfl_inx_mask,USER_FPSR(%a6)
+ clrl 4(%a0)
+ bra frcfpnr
+//
+// Inst is fsub.
+//
+wrap_sub:
+ cmpb #0xff,DNRM_FLG(%a6) //if both ops denorm,
+ beq fix_stk //restore to fpu
+//
+// One of the ops is denormalized. Test for wrap condition
+// and complete the instruction.
+//
+ cmpb #0x0f,DNRM_FLG(%a6) //check for dest denorm
+ bnes sub_srcd
+sub_destd:
+ bsrl ckinf_ns
+ bne fix_stk
+ bfextu ETEMP_EX(%a6){#1:#15},%d0 //get src exp (always pos)
+ bfexts FPTEMP_EX(%a6){#1:#15},%d1 //get dest exp (always neg)
+ subl %d1,%d0 //subtract src from dest
+ cmpl #0x8000,%d0
+ blt fix_stk //if less, not wrap case
+ bra sub_wrap
+sub_srcd:
+ bsrl ckinf_nd
+ bne fix_stk
+ bfextu FPTEMP_EX(%a6){#1:#15},%d0 //get dest exp (always pos)
+ bfexts ETEMP_EX(%a6){#1:#15},%d1 //get src exp (always neg)
+ subl %d1,%d0 //subtract dest from src
+ cmpl #0x8000,%d0
+ blt fix_stk //if less, not wrap case
+//
+// Check the signs of the operands. If they are alike, the fpu
+// can be used to subtract from the norm 1.0 with the sign of the
+// denorm and it will correctly generate the result in extended
+// precision. We can then call round with no sticky and the result
+// will be correct for the user's rounding mode and precision. If
+// the signs are unlike, we call round with the sticky bit set
+// and the result will be correct for the user's rounding mode and
+// precision.
+//
+sub_wrap:
+ movew ETEMP_EX(%a6),%d0
+ movew FPTEMP_EX(%a6),%d1
+ eorw %d1,%d0
+ andiw #0x8000,%d0
+ bne sub_diff
+//
+// The signs are alike.
+//
+ cmpb #0x0f,DNRM_FLG(%a6) //is dest the denorm?
+ bnes sub_u_srcd
+ movew FPTEMP_EX(%a6),%d0
+ andiw #0x8000,%d0
+ orw #0x3fff,%d0 //force the exponent to +/- 1
+ movew %d0,FPTEMP_EX(%a6) //in the denorm
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ fmovel %d0,%fpcr //set up users rmode and X
+ fmovex FPTEMP(%a6),%fp0
+ fsubx ETEMP(%a6),%fp0
+ fmovel %fpsr,%d1
+ orl %d1,USER_FPSR(%a6) //capture cc's and inex from fadd
+ leal WBTEMP(%a6),%a0 //point a0 to wbtemp in frame
+ fmovex %fp0,WBTEMP(%a6) //write result to memory
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ clrl %d0 //force sticky to zero
+ bclrb #sign_bit,WBTEMP_EX(%a6)
+ sne WBTEMP_SGN(%a6)
+ bsrl round //round result to users rmode & prec
+ bfclr WBTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beq frcfpnr
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+ bra frcfpnr
+sub_u_srcd:
+ movew ETEMP_EX(%a6),%d0
+ andiw #0x8000,%d0
+ orw #0x3fff,%d0 //force the exponent to +/- 1
+ movew %d0,ETEMP_EX(%a6) //in the denorm
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ fmovel %d0,%fpcr //set up users rmode and X
+ fmovex FPTEMP(%a6),%fp0
+ fsubx ETEMP(%a6),%fp0
+ fmovel %fpsr,%d1
+ orl %d1,USER_FPSR(%a6) //capture cc's and inex from fadd
+ leal WBTEMP(%a6),%a0 //point a0 to wbtemp in frame
+ fmovex %fp0,WBTEMP(%a6) //write result to memory
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ clrl %d0 //force sticky to zero
+ bclrb #sign_bit,WBTEMP_EX(%a6)
+ sne WBTEMP_SGN(%a6)
+ bsrl round //round result to users rmode & prec
+ bfclr WBTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beq frcfpnr
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+ bra frcfpnr
+//
+// Signs are unlike:
+//
+sub_diff:
+ cmpb #0x0f,DNRM_FLG(%a6) //is dest the denorm?
+ bnes sub_s_srcd
+sub_s_destd:
+ leal ETEMP(%a6),%a0
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ movel #0x20000000,%d0 //set sticky for round
+//
+// Since the dest is the denorm, the sign is the opposite of the
+// norm sign.
+//
+ eoriw #0x8000,ETEMP_EX(%a6) //flip sign on result
+ tstw ETEMP_EX(%a6)
+ bgts sub_s_dwr
+ orl #neg_mask,USER_FPSR(%a6)
+sub_s_dwr:
+ bclrb #sign_bit,ETEMP_EX(%a6)
+ sne ETEMP_SGN(%a6)
+ bsrl round //round result to users rmode & prec
+ bfclr ETEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beqs sub_s_dclr
+ bsetb #sign_bit,ETEMP_EX(%a6)
+sub_s_dclr:
+ leal WBTEMP(%a6),%a0
+ movel ETEMP(%a6),(%a0) //write result to wbtemp
+ movel ETEMP_HI(%a6),4(%a0)
+ movel ETEMP_LO(%a6),8(%a0)
+ bra sub_ckovf
+sub_s_srcd:
+ leal FPTEMP(%a6),%a0
+ movel USER_FPCR(%a6),%d0
+ andil #0x30,%d0
+ lsrl #4,%d0 //put rmode in lower 2 bits
+ movel USER_FPCR(%a6),%d1
+ andil #0xc0,%d1
+ lsrl #6,%d1 //put precision in upper word
+ swap %d1
+ orl %d0,%d1 //set up for round call
+ movel #0x20000000,%d0 //set sticky for round
+ bclrb #sign_bit,FPTEMP_EX(%a6)
+ sne FPTEMP_SGN(%a6)
+ bsrl round //round result to users rmode & prec
+ bfclr FPTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beqs sub_s_sclr
+ bsetb #sign_bit,FPTEMP_EX(%a6)
+sub_s_sclr:
+ leal WBTEMP(%a6),%a0
+ movel FPTEMP(%a6),(%a0) //write result to wbtemp
+ movel FPTEMP_HI(%a6),4(%a0)
+ movel FPTEMP_LO(%a6),8(%a0)
+ tstw FPTEMP_EX(%a6)
+ bgt sub_ckovf
+ orl #neg_mask,USER_FPSR(%a6)
+sub_ckovf:
+ movew WBTEMP_EX(%a6),%d0
+ andiw #0x7fff,%d0
+ cmpiw #0x7fff,%d0
+ bne frcfpnr
+//
+// The result has overflowed to $7fff exponent. Set I, ovfl,
+// and aovfl, and clr the mantissa (incorrectly set by the
+// round routine.)
+//
+ orl #inf_mask+ovfl_inx_mask,USER_FPSR(%a6)
+ clrl 4(%a0)
+ bra frcfpnr
+//
+// Inst is fcmp.
+//
+wrap_cmp:
+ cmpb #0xff,DNRM_FLG(%a6) //if both ops denorm,
+ beq fix_stk //restore to fpu
+//
+// One of the ops is denormalized. Test for wrap condition
+// and complete the instruction.
+//
+ cmpb #0x0f,DNRM_FLG(%a6) //check for dest denorm
+ bnes cmp_srcd
+cmp_destd:
+ bsrl ckinf_ns
+ bne fix_stk
+ bfextu ETEMP_EX(%a6){#1:#15},%d0 //get src exp (always pos)
+ bfexts FPTEMP_EX(%a6){#1:#15},%d1 //get dest exp (always neg)
+ subl %d1,%d0 //subtract dest from src
+ cmpl #0x8000,%d0
+ blt fix_stk //if less, not wrap case
+ tstw ETEMP_EX(%a6) //set N to ~sign_of(src)
+ bge cmp_setn
+ rts
+cmp_srcd:
+ bsrl ckinf_nd
+ bne fix_stk
+ bfextu FPTEMP_EX(%a6){#1:#15},%d0 //get dest exp (always pos)
+ bfexts ETEMP_EX(%a6){#1:#15},%d1 //get src exp (always neg)
+ subl %d1,%d0 //subtract src from dest
+ cmpl #0x8000,%d0
+ blt fix_stk //if less, not wrap case
+ tstw FPTEMP_EX(%a6) //set N to sign_of(dest)
+ blt cmp_setn
+ rts
+cmp_setn:
+ orl #neg_mask,USER_FPSR(%a6)
+ rts
+
+//
+// Inst is fmul.
+//
+wrap_mul:
+ cmpb #0xff,DNRM_FLG(%a6) //if both ops denorm,
+ beq force_unf //force an underflow (really!)
+//
+// One of the ops is denormalized. Test for wrap condition
+// and complete the instruction.
+//
+ cmpb #0x0f,DNRM_FLG(%a6) //check for dest denorm
+ bnes mul_srcd
+mul_destd:
+ bsrl ckinf_ns
+ bne fix_stk
+ bfextu ETEMP_EX(%a6){#1:#15},%d0 //get src exp (always pos)
+ bfexts FPTEMP_EX(%a6){#1:#15},%d1 //get dest exp (always neg)
+ addl %d1,%d0 //subtract dest from src
+ bgt fix_stk
+ bra force_unf
+mul_srcd:
+ bsrl ckinf_nd
+ bne fix_stk
+ bfextu FPTEMP_EX(%a6){#1:#15},%d0 //get dest exp (always pos)
+ bfexts ETEMP_EX(%a6){#1:#15},%d1 //get src exp (always neg)
+ addl %d1,%d0 //subtract src from dest
+ bgt fix_stk
+
+//
+// This code handles the case of the instruction resulting in
+// an underflow condition.
+//
+force_unf:
+ bclrb #E1,E_BYTE(%a6)
+ orl #unfinx_mask,USER_FPSR(%a6)
+ clrw NMNEXC(%a6)
+ clrb WBTEMP_SGN(%a6)
+ movew ETEMP_EX(%a6),%d0 //find the sign of the result
+ movew FPTEMP_EX(%a6),%d1
+ eorw %d1,%d0
+ andiw #0x8000,%d0
+ beqs frcunfcont
+ st WBTEMP_SGN(%a6)
+frcunfcont:
+ lea WBTEMP(%a6),%a0 //point a0 to memory location
+ movew CMDREG1B(%a6),%d0
+ btstl #6,%d0 //test for forced precision
+ beqs frcunf_fpcr
+ btstl #2,%d0 //check for double
+ bnes frcunf_dbl
+ movel #0x1,%d0 //inst is forced single
+ bras frcunf_rnd
+frcunf_dbl:
+ movel #0x2,%d0 //inst is forced double
+ bras frcunf_rnd
+frcunf_fpcr:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0 //inst not forced - use fpcr prec
+frcunf_rnd:
+ bsrl unf_sub //get correct result based on
+// ;round precision/mode. This
+// ;sets FPSR_CC correctly
+ bfclr WBTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beqs frcfpn
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+ bra frcfpn
+
+//
+// Write the result to the user's fpn. All results must be HUGE to be
+// written; otherwise the results would have overflowed or underflowed.
+// If the rounding precision is single or double, the ovf_res routine
+// is needed to correctly supply the max value.
+//
+frcfpnr:
+ movew CMDREG1B(%a6),%d0
+ btstl #6,%d0 //test for forced precision
+ beqs frcfpn_fpcr
+ btstl #2,%d0 //check for double
+ bnes frcfpn_dbl
+ movel #0x1,%d0 //inst is forced single
+ bras frcfpn_rnd
+frcfpn_dbl:
+ movel #0x2,%d0 //inst is forced double
+ bras frcfpn_rnd
+frcfpn_fpcr:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0 //inst not forced - use fpcr prec
+ tstb %d0
+ beqs frcfpn //if extended, write what you got
+frcfpn_rnd:
+ bclrb #sign_bit,WBTEMP_EX(%a6)
+ sne WBTEMP_SGN(%a6)
+ bsrl ovf_res //get correct result based on
+// ;round precision/mode. This
+// ;sets FPSR_CC correctly
+ bfclr WBTEMP_SGN(%a6){#0:#8} //convert back to IEEE ext format
+ beqs frcfpn_clr
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+frcfpn_clr:
+ orl #ovfinx_mask,USER_FPSR(%a6)
+//
+// Perform the write.
+//
+frcfpn:
+ bfextu CMDREG1B(%a6){#6:#3},%d0 //extract fp destination register
+ cmpib #3,%d0
+ bles frc0123 //check if dest is fp0-fp3
+ movel #7,%d1
+ subl %d0,%d1
+ clrl %d0
+ bsetl %d1,%d0
+ fmovemx WBTEMP(%a6),%d0
+ rts
+frc0123:
+ cmpib #0,%d0
+ beqs frc0_dst
+ cmpib #1,%d0
+ beqs frc1_dst
+ cmpib #2,%d0
+ beqs frc2_dst
+frc3_dst:
+ movel WBTEMP_EX(%a6),USER_FP3(%a6)
+ movel WBTEMP_HI(%a6),USER_FP3+4(%a6)
+ movel WBTEMP_LO(%a6),USER_FP3+8(%a6)
+ rts
+frc2_dst:
+ movel WBTEMP_EX(%a6),USER_FP2(%a6)
+ movel WBTEMP_HI(%a6),USER_FP2+4(%a6)
+ movel WBTEMP_LO(%a6),USER_FP2+8(%a6)
+ rts
+frc1_dst:
+ movel WBTEMP_EX(%a6),USER_FP1(%a6)
+ movel WBTEMP_HI(%a6),USER_FP1+4(%a6)
+ movel WBTEMP_LO(%a6),USER_FP1+8(%a6)
+ rts
+frc0_dst:
+ movel WBTEMP_EX(%a6),USER_FP0(%a6)
+ movel WBTEMP_HI(%a6),USER_FP0+4(%a6)
+ movel WBTEMP_LO(%a6),USER_FP0+8(%a6)
+ rts
+
+//
+// Write etemp to fpn.
+// A check is made on enabled and signalled snan exceptions,
+// and the destination is not overwritten if this condition exists.
+// This code is designed to make fmoveins of unsupported data types
+// faster.
+//
+wr_etemp:
+ btstb #snan_bit,FPSR_EXCEPT(%a6) //if snan is set, and
+ beqs fmoveinc //enabled, force restore
+ btstb #snan_bit,FPCR_ENABLE(%a6) //and don't overwrite
+ beqs fmoveinc //the dest
+ movel ETEMP_EX(%a6),FPTEMP_EX(%a6) //set up fptemp sign for
+// ;snan handler
+ tstb ETEMP(%a6) //check for negative
+ blts snan_neg
+ rts
+snan_neg:
+ orl #neg_bit,USER_FPSR(%a6) //snan is negative; set N
+ rts
+fmoveinc:
+ clrw NMNEXC(%a6)
+ bclrb #E1,E_BYTE(%a6)
+ moveb STAG(%a6),%d0 //check if stag is inf
+ andib #0xe0,%d0
+ cmpib #0x40,%d0
+ bnes fminc_cnan
+ orl #inf_mask,USER_FPSR(%a6) //if inf, nothing yet has set I
+ tstw LOCAL_EX(%a0) //check sign
+ bges fminc_con
+ orl #neg_mask,USER_FPSR(%a6)
+ bra fminc_con
+fminc_cnan:
+ cmpib #0x60,%d0 //check if stag is NaN
+ bnes fminc_czero
+ orl #nan_mask,USER_FPSR(%a6) //if nan, nothing yet has set NaN
+ movel ETEMP_EX(%a6),FPTEMP_EX(%a6) //set up fptemp sign for
+// ;snan handler
+ tstw LOCAL_EX(%a0) //check sign
+ bges fminc_con
+ orl #neg_mask,USER_FPSR(%a6)
+ bra fminc_con
+fminc_czero:
+ cmpib #0x20,%d0 //check if zero
+ bnes fminc_con
+ orl #z_mask,USER_FPSR(%a6) //if zero, set Z
+ tstw LOCAL_EX(%a0) //check sign
+ bges fminc_con
+ orl #neg_mask,USER_FPSR(%a6)
+fminc_con:
+ bfextu CMDREG1B(%a6){#6:#3},%d0 //extract fp destination register
+ cmpib #3,%d0
+ bles fp0123 //check if dest is fp0-fp3
+ movel #7,%d1
+ subl %d0,%d1
+ clrl %d0
+ bsetl %d1,%d0
+ fmovemx ETEMP(%a6),%d0
+ rts
+
+fp0123:
+ cmpib #0,%d0
+ beqs fp0_dst
+ cmpib #1,%d0
+ beqs fp1_dst
+ cmpib #2,%d0
+ beqs fp2_dst
+fp3_dst:
+ movel ETEMP_EX(%a6),USER_FP3(%a6)
+ movel ETEMP_HI(%a6),USER_FP3+4(%a6)
+ movel ETEMP_LO(%a6),USER_FP3+8(%a6)
+ rts
+fp2_dst:
+ movel ETEMP_EX(%a6),USER_FP2(%a6)
+ movel ETEMP_HI(%a6),USER_FP2+4(%a6)
+ movel ETEMP_LO(%a6),USER_FP2+8(%a6)
+ rts
+fp1_dst:
+ movel ETEMP_EX(%a6),USER_FP1(%a6)
+ movel ETEMP_HI(%a6),USER_FP1+4(%a6)
+ movel ETEMP_LO(%a6),USER_FP1+8(%a6)
+ rts
+fp0_dst:
+ movel ETEMP_EX(%a6),USER_FP0(%a6)
+ movel ETEMP_HI(%a6),USER_FP0+4(%a6)
+ movel ETEMP_LO(%a6),USER_FP0+8(%a6)
+ rts
+
+opclass3:
+ st CU_ONLY(%a6)
+ movew CMDREG1B(%a6),%d0 //check if packed moveout
+ andiw #0x0c00,%d0 //isolate last 2 bits of size field
+ cmpiw #0x0c00,%d0 //if size is 011 or 111, it is packed
+ beq pack_out //else it is norm or denorm
+ bra mv_out
+
+
+//
+// MOVE OUT
+//
+
+mv_tbl:
+ .long li
+ .long sgp
+ .long xp
+ .long mvout_end //should never be taken
+ .long wi
+ .long dp
+ .long bi
+ .long mvout_end //should never be taken
+mv_out:
+ bfextu CMDREG1B(%a6){#3:#3},%d1 //put source specifier in d1
+ leal mv_tbl,%a0
+ movel %a0@(%d1:l:4),%a0
+ jmp (%a0)
+
+//
+// This exit is for move-out to memory. The aunfl bit is
+// set if the result is inex and unfl is signalled.
+//
+mvout_end:
+ btstb #inex2_bit,FPSR_EXCEPT(%a6)
+ beqs no_aufl
+ btstb #unfl_bit,FPSR_EXCEPT(%a6)
+ beqs no_aufl
+ bsetb #aunfl_bit,FPSR_AEXCEPT(%a6)
+no_aufl:
+ clrw NMNEXC(%a6)
+ bclrb #E1,E_BYTE(%a6)
+ fmovel #0,%FPSR //clear any cc bits from res_func
+//
+// Return ETEMP to extended format from internal extended format so
+// that gen_except will have a correctly signed value for ovfl/unfl
+// handlers.
+//
+ bfclr ETEMP_SGN(%a6){#0:#8}
+ beqs mvout_con
+ bsetb #sign_bit,ETEMP_EX(%a6)
+mvout_con:
+ rts
+//
+// This exit is for move-out to int register. The aunfl bit is
+// not set in any case for this move.
+//
+mvouti_end:
+ clrw NMNEXC(%a6)
+ bclrb #E1,E_BYTE(%a6)
+ fmovel #0,%FPSR //clear any cc bits from res_func
+//
+// Return ETEMP to extended format from internal extended format so
+// that gen_except will have a correctly signed value for ovfl/unfl
+// handlers.
+//
+ bfclr ETEMP_SGN(%a6){#0:#8}
+ beqs mvouti_con
+ bsetb #sign_bit,ETEMP_EX(%a6)
+mvouti_con:
+ rts
+//
+// li is used to handle a long integer source specifier
+//
+
+li:
+ moveql #4,%d0 //set byte count
+
+ btstb #7,STAG(%a6) //check for extended denorm
+ bne int_dnrm //if so, branch
+
+ fmovemx ETEMP(%a6),%fp0-%fp0
+ fcmpd #0x41dfffffffc00000,%fp0
+// 41dfffffffc00000 in dbl prec = 401d0000fffffffe00000000 in ext prec
+ fbge lo_plrg
+ fcmpd #0xc1e0000000000000,%fp0
+// c1e0000000000000 in dbl prec = c01e00008000000000000000 in ext prec
+ fble lo_nlrg
+//
+// at this point, the answer is between the largest pos and neg values
+//
+ movel USER_FPCR(%a6),%d1 //use user's rounding mode
+ andil #0x30,%d1
+ fmovel %d1,%fpcr
+ fmovel %fp0,L_SCR1(%a6) //let the 040 perform conversion
+ fmovel %fpsr,%d1
+ orl %d1,USER_FPSR(%a6) //capture inex2/ainex if set
+ bra int_wrt
+
+
+lo_plrg:
+ movel #0x7fffffff,L_SCR1(%a6) //answer is largest positive int
+ fbeq int_wrt //exact answer
+ fcmpd #0x41dfffffffe00000,%fp0
+// 41dfffffffe00000 in dbl prec = 401d0000ffffffff00000000 in ext prec
+ fbge int_operr //set operr
+ bra int_inx //set inexact
+
+lo_nlrg:
+ movel #0x80000000,L_SCR1(%a6)
+ fbeq int_wrt //exact answer
+ fcmpd #0xc1e0000000100000,%fp0
+// c1e0000000100000 in dbl prec = c01e00008000000080000000 in ext prec
+ fblt int_operr //set operr
+ bra int_inx //set inexact
+
+//
+// wi is used to handle a word integer source specifier
+//
+
+wi:
+ moveql #2,%d0 //set byte count
+
+ btstb #7,STAG(%a6) //check for extended denorm
+ bne int_dnrm //branch if so
+
+ fmovemx ETEMP(%a6),%fp0-%fp0
+ fcmps #0x46fffe00,%fp0
+// 46fffe00 in sgl prec = 400d0000fffe000000000000 in ext prec
+ fbge wo_plrg
+ fcmps #0xc7000000,%fp0
+// c7000000 in sgl prec = c00e00008000000000000000 in ext prec
+ fble wo_nlrg
+
+//
+// at this point, the answer is between the largest pos and neg values
+//
+ movel USER_FPCR(%a6),%d1 //use user's rounding mode
+ andil #0x30,%d1
+ fmovel %d1,%fpcr
+ fmovew %fp0,L_SCR1(%a6) //let the 040 perform conversion
+ fmovel %fpsr,%d1
+ orl %d1,USER_FPSR(%a6) //capture inex2/ainex if set
+ bra int_wrt
+
+wo_plrg:
+ movew #0x7fff,L_SCR1(%a6) //answer is largest positive int
+ fbeq int_wrt //exact answer
+ fcmps #0x46ffff00,%fp0
+// 46ffff00 in sgl prec = 400d0000ffff000000000000 in ext prec
+ fbge int_operr //set operr
+ bra int_inx //set inexact
+
+wo_nlrg:
+ movew #0x8000,L_SCR1(%a6)
+ fbeq int_wrt //exact answer
+ fcmps #0xc7000080,%fp0
+// c7000080 in sgl prec = c00e00008000800000000000 in ext prec
+ fblt int_operr //set operr
+ bra int_inx //set inexact
+
+//
+// bi is used to handle a byte integer source specifier
+//
+
+bi:
+ moveql #1,%d0 //set byte count
+
+ btstb #7,STAG(%a6) //check for extended denorm
+ bne int_dnrm //branch if so
+
+ fmovemx ETEMP(%a6),%fp0-%fp0
+ fcmps #0x42fe0000,%fp0
+// 42fe0000 in sgl prec = 40050000fe00000000000000 in ext prec
+ fbge by_plrg
+ fcmps #0xc3000000,%fp0
+// c3000000 in sgl prec = c00600008000000000000000 in ext prec
+ fble by_nlrg
+
+//
+// at this point, the answer is between the largest pos and neg values
+//
+ movel USER_FPCR(%a6),%d1 //use user's rounding mode
+ andil #0x30,%d1
+ fmovel %d1,%fpcr
+ fmoveb %fp0,L_SCR1(%a6) //let the 040 perform conversion
+ fmovel %fpsr,%d1
+ orl %d1,USER_FPSR(%a6) //capture inex2/ainex if set
+ bra int_wrt
+
+by_plrg:
+ moveb #0x7f,L_SCR1(%a6) //answer is largest positive int
+ fbeq int_wrt //exact answer
+ fcmps #0x42ff0000,%fp0
+// 42ff0000 in sgl prec = 40050000ff00000000000000 in ext prec
+ fbge int_operr //set operr
+ bra int_inx //set inexact
+
+by_nlrg:
+ moveb #0x80,L_SCR1(%a6)
+ fbeq int_wrt //exact answer
+ fcmps #0xc3008000,%fp0
+// c3008000 in sgl prec = c00600008080000000000000 in ext prec
+ fblt int_operr //set operr
+ bra int_inx //set inexact
+
+//
+// Common integer routines
+//
+// int_drnrm---account for possible nonzero result for round up with positive
+// operand and round down for negative answer. In the first case (result = 1)
+// byte-width (store in d0) of result must be honored. In the second case,
+// -1 in L_SCR1(a6) will cover all contingencies (FMOVE.B/W/L out).
+
+int_dnrm:
+ movel #0,L_SCR1(%a6) // initialize result to 0
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 // d1 is the rounding mode
+ cmpb #2,%d1
+ bmis int_inx // if RN or RZ, done
+ bnes int_rp // if RP, continue below
+ tstw ETEMP(%a6) // RM: store -1 in L_SCR1 if src is negative
+ bpls int_inx // otherwise result is 0
+ movel #-1,L_SCR1(%a6)
+ bras int_inx
+int_rp:
+ tstw ETEMP(%a6) // RP: store +1 of proper width in L_SCR1 if
+// ; source is greater than 0
+ bmis int_inx // otherwise, result is 0
+ lea L_SCR1(%a6),%a1 // a1 is address of L_SCR1
+ addal %d0,%a1 // offset by destination width -1
+ subal #1,%a1
+ bsetb #0,(%a1) // set low bit at a1 address
+int_inx:
+ oril #inx2a_mask,USER_FPSR(%a6)
+ bras int_wrt
+int_operr:
+ fmovemx %fp0-%fp0,FPTEMP(%a6) //FPTEMP must contain the extended
+// ;precision source that needs to be
+// ;converted to integer this is required
+// ;if the operr exception is enabled.
+// ;set operr/aiop (no inex2 on int ovfl)
+
+ oril #opaop_mask,USER_FPSR(%a6)
+// ;fall through to perform int_wrt
+int_wrt:
+ movel EXC_EA(%a6),%a1 //load destination address
+ tstl %a1 //check to see if it is a dest register
+ beqs wrt_dn //write data register
+ lea L_SCR1(%a6),%a0 //point to supervisor source address
+ bsrl mem_write
+ bra mvouti_end
+
+wrt_dn:
+ movel %d0,-(%sp) //d0 currently contains the size to write
+ bsrl get_fline //get_fline returns Dn in d0
+ andiw #0x7,%d0 //isolate register
+ movel (%sp)+,%d1 //get size
+ cmpil #4,%d1 //most frequent case
+ beqs sz_long
+ cmpil #2,%d1
+ bnes sz_con
+ orl #8,%d0 //add 'word' size to register#
+ bras sz_con
+sz_long:
+ orl #0x10,%d0 //add 'long' size to register#
+sz_con:
+ movel %d0,%d1 //reg_dest expects size:reg in d1
+ bsrl reg_dest //load proper data register
+ bra mvouti_end
+xp:
+ lea ETEMP(%a6),%a0
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+ btstb #7,STAG(%a6) //check for extended denorm
+ bne xdnrm
+ clrl %d0
+ bras do_fp //do normal case
+sgp:
+ lea ETEMP(%a6),%a0
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+ btstb #7,STAG(%a6) //check for extended denorm
+ bne sp_catas //branch if so
+ movew LOCAL_EX(%a0),%d0
+ lea sp_bnds,%a1
+ cmpw (%a1),%d0
+ blt sp_under
+ cmpw 2(%a1),%d0
+ bgt sp_over
+ movel #1,%d0 //set destination format to single
+ bras do_fp //do normal case
+dp:
+ lea ETEMP(%a6),%a0
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+
+ btstb #7,STAG(%a6) //check for extended denorm
+ bne dp_catas //branch if so
+
+ movew LOCAL_EX(%a0),%d0
+ lea dp_bnds,%a1
+
+ cmpw (%a1),%d0
+ blt dp_under
+ cmpw 2(%a1),%d0
+ bgt dp_over
+
+ movel #2,%d0 //set destination format to double
+// ;fall through to do_fp
+//
+do_fp:
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //rnd mode in d1
+ swap %d0 //rnd prec in upper word
+ addl %d0,%d1 //d1 has PREC/MODE info
+
+ clrl %d0 //clear g,r,s
+
+ bsrl round //round
+
+ movel %a0,%a1
+ movel EXC_EA(%a6),%a0
+
+ bfextu CMDREG1B(%a6){#3:#3},%d1 //extract destination format
+// ;at this point only the dest
+// ;formats sgl, dbl, ext are
+// ;possible
+ cmpb #2,%d1
+ bgts ddbl //double=5, extended=2, single=1
+ bnes dsgl
+// ;fall through to dext
+dext:
+ bsrl dest_ext
+ bra mvout_end
+dsgl:
+ bsrl dest_sgl
+ bra mvout_end
+ddbl:
+ bsrl dest_dbl
+ bra mvout_end
+
+//
+// Handle possible denorm or catastrophic underflow cases here
+//
+xdnrm:
+ bsr set_xop //initialize WBTEMP
+ bsetb #wbtemp15_bit,WB_BYTE(%a6) //set wbtemp15
+
+ movel %a0,%a1
+ movel EXC_EA(%a6),%a0 //a0 has the destination pointer
+ bsrl dest_ext //store to memory
+ bsetb #unfl_bit,FPSR_EXCEPT(%a6)
+ bra mvout_end
+
+sp_under:
+ bsetb #etemp15_bit,STAG(%a6)
+
+ cmpw 4(%a1),%d0
+ blts sp_catas //catastrophic underflow case
+
+ movel #1,%d0 //load in round precision
+ movel #sgl_thresh,%d1 //load in single denorm threshold
+ bsrl dpspdnrm //expects d1 to have the proper
+// ;denorm threshold
+ bsrl dest_sgl //stores value to destination
+ bsetb #unfl_bit,FPSR_EXCEPT(%a6)
+ bra mvout_end //exit
+
+dp_under:
+ bsetb #etemp15_bit,STAG(%a6)
+
+ cmpw 4(%a1),%d0
+ blts dp_catas //catastrophic underflow case
+
+ movel #dbl_thresh,%d1 //load in double precision threshold
+ movel #2,%d0
+ bsrl dpspdnrm //expects d1 to have proper
+// ;denorm threshold
+// ;expects d0 to have round precision
+ bsrl dest_dbl //store value to destination
+ bsetb #unfl_bit,FPSR_EXCEPT(%a6)
+ bra mvout_end //exit
+
+//
+// Handle catastrophic underflow cases here
+//
+sp_catas:
+// Temp fix for z bit set in unf_sub
+ movel USER_FPSR(%a6),-(%a7)
+
+ movel #1,%d0 //set round precision to sgl
+
+ bsrl unf_sub //a0 points to result
+
+ movel (%a7)+,USER_FPSR(%a6)
+
+ movel #1,%d0
+ subw %d0,LOCAL_EX(%a0) //account for difference between
+// ;denorm/norm bias
+
+ movel %a0,%a1 //a1 has the operand input
+ movel EXC_EA(%a6),%a0 //a0 has the destination pointer
+
+ bsrl dest_sgl //store the result
+ oril #unfinx_mask,USER_FPSR(%a6)
+ bra mvout_end
+
+dp_catas:
+// Temp fix for z bit set in unf_sub
+ movel USER_FPSR(%a6),-(%a7)
+
+ movel #2,%d0 //set round precision to dbl
+ bsrl unf_sub //a0 points to result
+
+ movel (%a7)+,USER_FPSR(%a6)
+
+ movel #1,%d0
+ subw %d0,LOCAL_EX(%a0) //account for difference between
+// ;denorm/norm bias
+
+ movel %a0,%a1 //a1 has the operand input
+ movel EXC_EA(%a6),%a0 //a0 has the destination pointer
+
+ bsrl dest_dbl //store the result
+ oril #unfinx_mask,USER_FPSR(%a6)
+ bra mvout_end
+
+//
+// Handle catastrophic overflow cases here
+//
+sp_over:
+// Temp fix for z bit set in unf_sub
+ movel USER_FPSR(%a6),-(%a7)
+
+ movel #1,%d0
+ leal FP_SCR1(%a6),%a0 //use FP_SCR1 for creating result
+ movel ETEMP_EX(%a6),(%a0)
+ movel ETEMP_HI(%a6),4(%a0)
+ movel ETEMP_LO(%a6),8(%a0)
+ bsrl ovf_res
+
+ movel (%a7)+,USER_FPSR(%a6)
+
+ movel %a0,%a1
+ movel EXC_EA(%a6),%a0
+ bsrl dest_sgl
+ orl #ovfinx_mask,USER_FPSR(%a6)
+ bra mvout_end
+
+dp_over:
+// Temp fix for z bit set in ovf_res
+ movel USER_FPSR(%a6),-(%a7)
+
+ movel #2,%d0
+ leal FP_SCR1(%a6),%a0 //use FP_SCR1 for creating result
+ movel ETEMP_EX(%a6),(%a0)
+ movel ETEMP_HI(%a6),4(%a0)
+ movel ETEMP_LO(%a6),8(%a0)
+ bsrl ovf_res
+
+ movel (%a7)+,USER_FPSR(%a6)
+
+ movel %a0,%a1
+ movel EXC_EA(%a6),%a0
+ bsrl dest_dbl
+ orl #ovfinx_mask,USER_FPSR(%a6)
+ bra mvout_end
+
+//
+// DPSPDNRM
+//
+// This subroutine takes an extended normalized number and denormalizes
+// it to the given round precision. This subroutine also decrements
+// the input operand's exponent by 1 to account for the fact that
+// dest_sgl or dest_dbl expects a normalized number's bias.
+//
+// Input: a0 points to a normalized number in internal extended format
+// d0 is the round precision (=1 for sgl; =2 for dbl)
+// d1 is the the single precision or double precision
+// denorm threshold
+//
+// Output: (In the format for dest_sgl or dest_dbl)
+// a0 points to the destination
+// a1 points to the operand
+//
+// Exceptions: Reports inexact 2 exception by setting USER_FPSR bits
+//
+dpspdnrm:
+ movel %d0,-(%a7) //save round precision
+ clrl %d0 //clear initial g,r,s
+ bsrl dnrm_lp //careful with d0, it's needed by round
+
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //get rounding mode
+ swap %d1
+ movew 2(%a7),%d1 //set rounding precision
+ swap %d1 //at this point d1 has PREC/MODE info
+ bsrl round //round result, sets the inex bit in
+// ;USER_FPSR if needed
+
+ movew #1,%d0
+ subw %d0,LOCAL_EX(%a0) //account for difference in denorm
+// ;vs norm bias
+
+ movel %a0,%a1 //a1 has the operand input
+ movel EXC_EA(%a6),%a0 //a0 has the destination pointer
+ addw #4,%a7 //pop stack
+ rts
+//
+// SET_XOP initialized WBTEMP with the value pointed to by a0
+// input: a0 points to input operand in the internal extended format
+//
+set_xop:
+ movel LOCAL_EX(%a0),WBTEMP_EX(%a6)
+ movel LOCAL_HI(%a0),WBTEMP_HI(%a6)
+ movel LOCAL_LO(%a0),WBTEMP_LO(%a6)
+ bfclr WBTEMP_SGN(%a6){#0:#8}
+ beqs sxop
+ bsetb #sign_bit,WBTEMP_EX(%a6)
+sxop:
+ bfclr STAG(%a6){#5:#4} //clear wbtm66,wbtm1,wbtm0,sbit
+ rts
+//
+// P_MOVE
+//
+p_movet:
+ .long p_move
+ .long p_movez
+ .long p_movei
+ .long p_moven
+ .long p_move
+p_regd:
+ .long p_dyd0
+ .long p_dyd1
+ .long p_dyd2
+ .long p_dyd3
+ .long p_dyd4
+ .long p_dyd5
+ .long p_dyd6
+ .long p_dyd7
+
+pack_out:
+ leal p_movet,%a0 //load jmp table address
+ movew STAG(%a6),%d0 //get source tag
+ bfextu %d0{#16:#3},%d0 //isolate source bits
+ movel (%a0,%d0.w*4),%a0 //load a0 with routine label for tag
+ jmp (%a0) //go to the routine
+
+p_write:
+ movel #0x0c,%d0 //get byte count
+ movel EXC_EA(%a6),%a1 //get the destination address
+ bsr mem_write //write the user's destination
+ moveb #0,CU_SAVEPC(%a6) //set the cu save pc to all 0's
+
+//
+// Also note that the dtag must be set to norm here - this is because
+// the 040 uses the dtag to execute the correct microcode.
+//
+ bfclr DTAG(%a6){#0:#3} //set dtag to norm
+
+ rts
+
+// Notes on handling of special case (zero, inf, and nan) inputs:
+// 1. Operr is not signalled if the k-factor is greater than 18.
+// 2. Per the manual, status bits are not set.
+//
+
+p_move:
+ movew CMDREG1B(%a6),%d0
+ btstl #kfact_bit,%d0 //test for dynamic k-factor
+ beqs statick //if clear, k-factor is static
+dynamick:
+ bfextu %d0{#25:#3},%d0 //isolate register for dynamic k-factor
+ lea p_regd,%a0
+ movel %a0@(%d0:l:4),%a0
+ jmp (%a0)
+statick:
+ andiw #0x007f,%d0 //get k-factor
+ bfexts %d0{#25:#7},%d0 //sign extend d0 for bindec
+ leal ETEMP(%a6),%a0 //a0 will point to the packed decimal
+ bsrl bindec //perform the convert; data at a6
+ leal FP_SCR1(%a6),%a0 //load a0 with result address
+ bral p_write
+p_movez:
+ leal ETEMP(%a6),%a0 //a0 will point to the packed decimal
+ clrw 2(%a0) //clear lower word of exp
+ clrl 4(%a0) //load second lword of ZERO
+ clrl 8(%a0) //load third lword of ZERO
+ bra p_write //go write results
+p_movei:
+ fmovel #0,%FPSR //clear aiop
+ leal ETEMP(%a6),%a0 //a0 will point to the packed decimal
+ clrw 2(%a0) //clear lower word of exp
+ bra p_write //go write the result
+p_moven:
+ leal ETEMP(%a6),%a0 //a0 will point to the packed decimal
+ clrw 2(%a0) //clear lower word of exp
+ bra p_write //go write the result
+
+//
+// Routines to read the dynamic k-factor from Dn.
+//
+p_dyd0:
+ movel USER_D0(%a6),%d0
+ bras statick
+p_dyd1:
+ movel USER_D1(%a6),%d0
+ bras statick
+p_dyd2:
+ movel %d2,%d0
+ bras statick
+p_dyd3:
+ movel %d3,%d0
+ bras statick
+p_dyd4:
+ movel %d4,%d0
+ bras statick
+p_dyd5:
+ movel %d5,%d0
+ bras statick
+p_dyd6:
+ movel %d6,%d0
+ bra statick
+p_dyd7:
+ movel %d7,%d0
+ bra statick
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/round.s b/c/src/lib/libcpu/m68k/m68040/fpsp/round.s
new file mode 100644
index 0000000000..afccaa7d96
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/round.s
@@ -0,0 +1,649 @@
+//
+// round.sa 3.4 7/29/91
+//
+// handle rounding and normalization tasks
+//
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//ROUND idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+//
+// round --- round result according to precision/mode
+//
+// a0 points to the input operand in the internal extended format
+// d1(high word) contains rounding precision:
+// ext = $0000xxxx
+// sgl = $0001xxxx
+// dbl = $0002xxxx
+// d1(low word) contains rounding mode:
+// RN = $xxxx0000
+// RZ = $xxxx0001
+// RM = $xxxx0010
+// RP = $xxxx0011
+// d0{31:29} contains the g,r,s bits (extended)
+//
+// On return the value pointed to by a0 is correctly rounded,
+// a0 is preserved and the g-r-s bits in d0 are cleared.
+// The result is not typed - the tag field is invalid. The
+// result is still in the internal extended format.
+//
+// The INEX bit of USER_FPSR will be set if the rounded result was
+// inexact (i.e. if any of the g-r-s bits were set).
+//
+
+ .global round
+round:
+// If g=r=s=0 then result is exact and round is done, else set
+// the inex flag in status reg and continue.
+//
+ bsrs ext_grs //this subroutine looks at the
+// :rounding precision and sets
+// ;the appropriate g-r-s bits.
+ tstl %d0 //if grs are zero, go force
+ bne rnd_cont //lower bits to zero for size
+
+ swap %d1 //set up d1.w for round prec.
+ bra truncate
+
+rnd_cont:
+//
+// Use rounding mode as an index into a jump table for these modes.
+//
+ orl #inx2a_mask,USER_FPSR(%a6) //set inex2/ainex
+ lea mode_tab,%a1
+ movel (%a1,%d1.w*4),%a1
+ jmp (%a1)
+//
+// Jump table indexed by rounding mode in d1.w. All following assumes
+// grs != 0.
+//
+mode_tab:
+ .long rnd_near
+ .long rnd_zero
+ .long rnd_mnus
+ .long rnd_plus
+//
+// ROUND PLUS INFINITY
+//
+// If sign of fp number = 0 (positive), then add 1 to l.
+//
+rnd_plus:
+ swap %d1 //set up d1 for round prec.
+ tstb LOCAL_SGN(%a0) //check for sign
+ bmi truncate //if positive then truncate
+ movel #0xffffffff,%d0 //force g,r,s to be all f's
+ lea add_to_l,%a1
+ movel (%a1,%d1.w*4),%a1
+ jmp (%a1)
+//
+// ROUND MINUS INFINITY
+//
+// If sign of fp number = 1 (negative), then add 1 to l.
+//
+rnd_mnus:
+ swap %d1 //set up d1 for round prec.
+ tstb LOCAL_SGN(%a0) //check for sign
+ bpl truncate //if negative then truncate
+ movel #0xffffffff,%d0 //force g,r,s to be all f's
+ lea add_to_l,%a1
+ movel (%a1,%d1.w*4),%a1
+ jmp (%a1)
+//
+// ROUND ZERO
+//
+// Always truncate.
+rnd_zero:
+ swap %d1 //set up d1 for round prec.
+ bra truncate
+//
+//
+// ROUND NEAREST
+//
+// If (g=1), then add 1 to l and if (r=s=0), then clear l
+// Note that this will round to even in case of a tie.
+//
+rnd_near:
+ swap %d1 //set up d1 for round prec.
+ asll #1,%d0 //shift g-bit to c-bit
+ bcc truncate //if (g=1) then
+ lea add_to_l,%a1
+ movel (%a1,%d1.w*4),%a1
+ jmp (%a1)
+
+//
+// ext_grs --- extract guard, round and sticky bits
+//
+// Input: d1 = PREC:ROUND
+// Output: d0{31:29}= guard, round, sticky
+//
+// The ext_grs extract the guard/round/sticky bits according to the
+// selected rounding precision. It is called by the round subroutine
+// only. All registers except d0 are kept intact. d0 becomes an
+// updated guard,round,sticky in d0{31:29}
+//
+// Notes: the ext_grs uses the round PREC, and therefore has to swap d1
+// prior to usage, and needs to restore d1 to original.
+//
+ext_grs:
+ swap %d1 //have d1.w point to round precision
+ cmpiw #0,%d1
+ bnes sgl_or_dbl
+ bras end_ext_grs
+
+sgl_or_dbl:
+ moveml %d2/%d3,-(%a7) //make some temp registers
+ cmpiw #1,%d1
+ bnes grs_dbl
+grs_sgl:
+ bfextu LOCAL_HI(%a0){#24:#2},%d3 //sgl prec. g-r are 2 bits right
+ movel #30,%d2 //of the sgl prec. limits
+ lsll %d2,%d3 //shift g-r bits to MSB of d3
+ movel LOCAL_HI(%a0),%d2 //get word 2 for s-bit test
+ andil #0x0000003f,%d2 //s bit is the or of all other
+ bnes st_stky //bits to the right of g-r
+ tstl LOCAL_LO(%a0) //test lower mantissa
+ bnes st_stky //if any are set, set sticky
+ tstl %d0 //test original g,r,s
+ bnes st_stky //if any are set, set sticky
+ bras end_sd //if words 3 and 4 are clr, exit
+grs_dbl:
+ bfextu LOCAL_LO(%a0){#21:#2},%d3 //dbl-prec. g-r are 2 bits right
+ movel #30,%d2 //of the dbl prec. limits
+ lsll %d2,%d3 //shift g-r bits to the MSB of d3
+ movel LOCAL_LO(%a0),%d2 //get lower mantissa for s-bit test
+ andil #0x000001ff,%d2 //s bit is the or-ing of all
+ bnes st_stky //other bits to the right of g-r
+ tstl %d0 //test word original g,r,s
+ bnes st_stky //if any are set, set sticky
+ bras end_sd //if clear, exit
+st_stky:
+ bset #rnd_stky_bit,%d3
+end_sd:
+ movel %d3,%d0 //return grs to d0
+ moveml (%a7)+,%d2/%d3 //restore scratch registers
+end_ext_grs:
+ swap %d1 //restore d1 to original
+ rts
+
+//******************* Local Equates
+ .set ad_1_sgl,0x00000100 // constant to add 1 to l-bit in sgl prec
+ .set ad_1_dbl,0x00000800 // constant to add 1 to l-bit in dbl prec
+
+
+//Jump table for adding 1 to the l-bit indexed by rnd prec
+
+add_to_l:
+ .long add_ext
+ .long add_sgl
+ .long add_dbl
+ .long add_dbl
+//
+// ADD SINGLE
+//
+add_sgl:
+ addl #ad_1_sgl,LOCAL_HI(%a0)
+ bccs scc_clr //no mantissa overflow
+ roxrw LOCAL_HI(%a0) //shift v-bit back in
+ roxrw LOCAL_HI+2(%a0) //shift v-bit back in
+ addw #0x1,LOCAL_EX(%a0) //and incr exponent
+scc_clr:
+ tstl %d0 //test for rs = 0
+ bnes sgl_done
+ andiw #0xfe00,LOCAL_HI+2(%a0) //clear the l-bit
+sgl_done:
+ andil #0xffffff00,LOCAL_HI(%a0) //truncate bits beyond sgl limit
+ clrl LOCAL_LO(%a0) //clear d2
+ rts
+
+//
+// ADD EXTENDED
+//
+add_ext:
+ addql #1,LOCAL_LO(%a0) //add 1 to l-bit
+ bccs xcc_clr //test for carry out
+ addql #1,LOCAL_HI(%a0) //propagate carry
+ bccs xcc_clr
+ roxrw LOCAL_HI(%a0) //mant is 0 so restore v-bit
+ roxrw LOCAL_HI+2(%a0) //mant is 0 so restore v-bit
+ roxrw LOCAL_LO(%a0)
+ roxrw LOCAL_LO+2(%a0)
+ addw #0x1,LOCAL_EX(%a0) //and inc exp
+xcc_clr:
+ tstl %d0 //test rs = 0
+ bnes add_ext_done
+ andib #0xfe,LOCAL_LO+3(%a0) //clear the l bit
+add_ext_done:
+ rts
+//
+// ADD DOUBLE
+//
+add_dbl:
+ addl #ad_1_dbl,LOCAL_LO(%a0)
+ bccs dcc_clr
+ addql #1,LOCAL_HI(%a0) //propagate carry
+ bccs dcc_clr
+ roxrw LOCAL_HI(%a0) //mant is 0 so restore v-bit
+ roxrw LOCAL_HI+2(%a0) //mant is 0 so restore v-bit
+ roxrw LOCAL_LO(%a0)
+ roxrw LOCAL_LO+2(%a0)
+ addw #0x1,LOCAL_EX(%a0) //incr exponent
+dcc_clr:
+ tstl %d0 //test for rs = 0
+ bnes dbl_done
+ andiw #0xf000,LOCAL_LO+2(%a0) //clear the l-bit
+
+dbl_done:
+ andil #0xfffff800,LOCAL_LO(%a0) //truncate bits beyond dbl limit
+ rts
+
+error:
+ rts
+//
+// Truncate all other bits
+//
+trunct:
+ .long end_rnd
+ .long sgl_done
+ .long dbl_done
+ .long dbl_done
+
+truncate:
+ lea trunct,%a1
+ movel (%a1,%d1.w*4),%a1
+ jmp (%a1)
+
+end_rnd:
+ rts
+
+//
+// NORMALIZE
+//
+// These routines (nrm_zero & nrm_set) normalize the unnorm. This
+// is done by shifting the mantissa left while decrementing the
+// exponent.
+//
+// NRM_SET shifts and decrements until there is a 1 set in the integer
+// bit of the mantissa (msb in d1).
+//
+// NRM_ZERO shifts and decrements until there is a 1 set in the integer
+// bit of the mantissa (msb in d1) unless this would mean the exponent
+// would go less than 0. In that case the number becomes a denorm - the
+// exponent (d0) is set to 0 and the mantissa (d1 & d2) is not
+// normalized.
+//
+// Note that both routines have been optimized (for the worst case) and
+// therefore do not have the easy to follow decrement/shift loop.
+//
+// NRM_ZERO
+//
+// Distance to first 1 bit in mantissa = X
+// Distance to 0 from exponent = Y
+// If X < Y
+// Then
+// nrm_set
+// Else
+// shift mantissa by Y
+// set exponent = 0
+//
+//input:
+// FP_SCR1 = exponent, ms mantissa part, ls mantissa part
+//output:
+// L_SCR1{4} = fpte15 or ete15 bit
+//
+ .global nrm_zero
+nrm_zero:
+ movew LOCAL_EX(%a0),%d0
+ cmpw #64,%d0 //see if exp > 64
+ bmis d0_less
+ bsr nrm_set //exp > 64 so exp won't exceed 0
+ rts
+d0_less:
+ moveml %d2/%d3/%d5/%d6,-(%a7)
+ movel LOCAL_HI(%a0),%d1
+ movel LOCAL_LO(%a0),%d2
+
+ bfffo %d1{#0:#32},%d3 //get the distance to the first 1
+// ;in ms mant
+ beqs ms_clr //branch if no bits were set
+ cmpw %d3,%d0 //of X>Y
+ bmis greater //then exp will go past 0 (neg) if
+// ;it is just shifted
+ bsr nrm_set //else exp won't go past 0
+ moveml (%a7)+,%d2/%d3/%d5/%d6
+ rts
+greater:
+ movel %d2,%d6 //save ls mant in d6
+ lsll %d0,%d2 //shift ls mant by count
+ lsll %d0,%d1 //shift ms mant by count
+ movel #32,%d5
+ subl %d0,%d5 //make op a denorm by shifting bits
+ lsrl %d5,%d6 //by the number in the exp, then
+// ;set exp = 0.
+ orl %d6,%d1 //shift the ls mant bits into the ms mant
+ movel #0,%d0 //same as if decremented exp to 0
+// ;while shifting
+ movew %d0,LOCAL_EX(%a0)
+ movel %d1,LOCAL_HI(%a0)
+ movel %d2,LOCAL_LO(%a0)
+ moveml (%a7)+,%d2/%d3/%d5/%d6
+ rts
+ms_clr:
+ bfffo %d2{#0:#32},%d3 //check if any bits set in ls mant
+ beqs all_clr //branch if none set
+ addw #32,%d3
+ cmpw %d3,%d0 //if X>Y
+ bmis greater //then branch
+ bsr nrm_set //else exp won't go past 0
+ moveml (%a7)+,%d2/%d3/%d5/%d6
+ rts
+all_clr:
+ movew #0,LOCAL_EX(%a0) //no mantissa bits set. Set exp = 0.
+ moveml (%a7)+,%d2/%d3/%d5/%d6
+ rts
+//
+// NRM_SET
+//
+ .global nrm_set
+nrm_set:
+ movel %d7,-(%a7)
+ bfffo LOCAL_HI(%a0){#0:#32},%d7 //find first 1 in ms mant to d7)
+ beqs lower //branch if ms mant is all 0's
+
+ movel %d6,-(%a7)
+
+ subw %d7,LOCAL_EX(%a0) //sub exponent by count
+ movel LOCAL_HI(%a0),%d0 //d0 has ms mant
+ movel LOCAL_LO(%a0),%d1 //d1 has ls mant
+
+ lsll %d7,%d0 //shift first 1 to j bit position
+ movel %d1,%d6 //copy ls mant into d6
+ lsll %d7,%d6 //shift ls mant by count
+ movel %d6,LOCAL_LO(%a0) //store ls mant into memory
+ moveql #32,%d6
+ subl %d7,%d6 //continue shift
+ lsrl %d6,%d1 //shift off all bits but those that will
+// ;be shifted into ms mant
+ orl %d1,%d0 //shift the ls mant bits into the ms mant
+ movel %d0,LOCAL_HI(%a0) //store ms mant into memory
+ moveml (%a7)+,%d7/%d6 //restore registers
+ rts
+
+//
+// We get here if ms mant was = 0, and we assume ls mant has bits
+// set (otherwise this would have been tagged a zero not a denorm).
+//
+lower:
+ movew LOCAL_EX(%a0),%d0 //d0 has exponent
+ movel LOCAL_LO(%a0),%d1 //d1 has ls mant
+ subw #32,%d0 //account for ms mant being all zeros
+ bfffo %d1{#0:#32},%d7 //find first 1 in ls mant to d7)
+ subw %d7,%d0 //subtract shift count from exp
+ lsll %d7,%d1 //shift first 1 to integer bit in ms mant
+ movew %d0,LOCAL_EX(%a0) //store ms mant
+ movel %d1,LOCAL_HI(%a0) //store exp
+ clrl LOCAL_LO(%a0) //clear ls mant
+ movel (%a7)+,%d7
+ rts
+//
+// denorm --- denormalize an intermediate result
+//
+// Used by underflow.
+//
+// Input:
+// a0 points to the operand to be denormalized
+// (in the internal extended format)
+//
+// d0: rounding precision
+// Output:
+// a0 points to the denormalized result
+// (in the internal extended format)
+//
+// d0 is guard,round,sticky
+//
+// d0 comes into this routine with the rounding precision. It
+// is then loaded with the denormalized exponent threshold for the
+// rounding precision.
+//
+
+ .global denorm
+denorm:
+ btstb #6,LOCAL_EX(%a0) //check for exponents between $7fff-$4000
+ beqs no_sgn_ext
+ bsetb #7,LOCAL_EX(%a0) //sign extend if it is so
+no_sgn_ext:
+
+ cmpib #0,%d0 //if 0 then extended precision
+ bnes not_ext //else branch
+
+ clrl %d1 //load d1 with ext threshold
+ clrl %d0 //clear the sticky flag
+ bsr dnrm_lp //denormalize the number
+ tstb %d1 //check for inex
+ beq no_inex //if clr, no inex
+ bras dnrm_inex //if set, set inex
+
+not_ext:
+ cmpil #1,%d0 //if 1 then single precision
+ beqs load_sgl //else must be 2, double prec
+
+load_dbl:
+ movew #dbl_thresh,%d1 //put copy of threshold in d1
+ movel %d1,%d0 //copy d1 into d0
+ subw LOCAL_EX(%a0),%d0 //diff = threshold - exp
+ cmpw #67,%d0 //if diff > 67 (mant + grs bits)
+ bpls chk_stky //then branch (all bits would be
+// ; shifted off in denorm routine)
+ clrl %d0 //else clear the sticky flag
+ bsr dnrm_lp //denormalize the number
+ tstb %d1 //check flag
+ beqs no_inex //if clr, no inex
+ bras dnrm_inex //if set, set inex
+
+load_sgl:
+ movew #sgl_thresh,%d1 //put copy of threshold in d1
+ movel %d1,%d0 //copy d1 into d0
+ subw LOCAL_EX(%a0),%d0 //diff = threshold - exp
+ cmpw #67,%d0 //if diff > 67 (mant + grs bits)
+ bpls chk_stky //then branch (all bits would be
+// ; shifted off in denorm routine)
+ clrl %d0 //else clear the sticky flag
+ bsr dnrm_lp //denormalize the number
+ tstb %d1 //check flag
+ beqs no_inex //if clr, no inex
+ bras dnrm_inex //if set, set inex
+
+chk_stky:
+ tstl LOCAL_HI(%a0) //check for any bits set
+ bnes set_stky
+ tstl LOCAL_LO(%a0) //check for any bits set
+ bnes set_stky
+ bras clr_mant
+set_stky:
+ orl #inx2a_mask,USER_FPSR(%a6) //set inex2/ainex
+ movel #0x20000000,%d0 //set sticky bit in return value
+clr_mant:
+ movew %d1,LOCAL_EX(%a0) //load exp with threshold
+ movel #0,LOCAL_HI(%a0) //set d1 = 0 (ms mantissa)
+ movel #0,LOCAL_LO(%a0) //set d2 = 0 (ms mantissa)
+ rts
+dnrm_inex:
+ orl #inx2a_mask,USER_FPSR(%a6) //set inex2/ainex
+no_inex:
+ rts
+
+//
+// dnrm_lp --- normalize exponent/mantissa to specified threshold
+//
+// Input:
+// a0 points to the operand to be denormalized
+// d0{31:29} initial guard,round,sticky
+// d1{15:0} denormalization threshold
+// Output:
+// a0 points to the denormalized operand
+// d0{31:29} final guard,round,sticky
+// d1.b inexact flag: all ones means inexact result
+//
+// The LOCAL_LO and LOCAL_GRS parts of the value are copied to FP_SCR2
+// so that bfext can be used to extract the new low part of the mantissa.
+// Dnrm_lp can be called with a0 pointing to ETEMP or WBTEMP and there
+// is no LOCAL_GRS scratch word following it on the fsave frame.
+//
+ .global dnrm_lp
+dnrm_lp:
+ movel %d2,-(%sp) //save d2 for temp use
+ btstb #E3,E_BYTE(%a6) //test for type E3 exception
+ beqs not_E3 //not type E3 exception
+ bfextu WBTEMP_GRS(%a6){#6:#3},%d2 //extract guard,round, sticky bit
+ movel #29,%d0
+ lsll %d0,%d2 //shift g,r,s to their positions
+ movel %d2,%d0
+not_E3:
+ movel (%sp)+,%d2 //restore d2
+ movel LOCAL_LO(%a0),FP_SCR2+LOCAL_LO(%a6)
+ movel %d0,FP_SCR2+LOCAL_GRS(%a6)
+ movel %d1,%d0 //copy the denorm threshold
+ subw LOCAL_EX(%a0),%d1 //d1 = threshold - uns exponent
+ bles no_lp //d1 <= 0
+ cmpw #32,%d1
+ blts case_1 //0 = d1 < 32
+ cmpw #64,%d1
+ blts case_2 //32 <= d1 < 64
+ bra case_3 //d1 >= 64
+//
+// No normalization necessary
+//
+no_lp:
+ clrb %d1 //set no inex2 reported
+ movel FP_SCR2+LOCAL_GRS(%a6),%d0 //restore original g,r,s
+ rts
+//
+// case (0<d1<32)
+//
+case_1:
+ movel %d2,-(%sp)
+ movew %d0,LOCAL_EX(%a0) //exponent = denorm threshold
+ movel #32,%d0
+ subw %d1,%d0 //d0 = 32 - d1
+ bfextu LOCAL_EX(%a0){%d0:#32},%d2
+ bfextu %d2{%d1:%d0},%d2 //d2 = new LOCAL_HI
+ bfextu LOCAL_HI(%a0){%d0:#32},%d1 //d1 = new LOCAL_LO
+ bfextu FP_SCR2+LOCAL_LO(%a6){%d0:#32},%d0 //d0 = new G,R,S
+ movel %d2,LOCAL_HI(%a0) //store new LOCAL_HI
+ movel %d1,LOCAL_LO(%a0) //store new LOCAL_LO
+ clrb %d1
+ bftst %d0{#2:#30}
+ beqs c1nstky
+ bsetl #rnd_stky_bit,%d0
+ st %d1
+c1nstky:
+ movel FP_SCR2+LOCAL_GRS(%a6),%d2 //restore original g,r,s
+ andil #0xe0000000,%d2 //clear all but G,R,S
+ tstl %d2 //test if original G,R,S are clear
+ beqs grs_clear
+ orl #0x20000000,%d0 //set sticky bit in d0
+grs_clear:
+ andil #0xe0000000,%d0 //clear all but G,R,S
+ movel (%sp)+,%d2
+ rts
+//
+// case (32<=d1<64)
+//
+case_2:
+ movel %d2,-(%sp)
+ movew %d0,LOCAL_EX(%a0) //unsigned exponent = threshold
+ subw #32,%d1 //d1 now between 0 and 32
+ movel #32,%d0
+ subw %d1,%d0 //d0 = 32 - d1
+ bfextu LOCAL_EX(%a0){%d0:#32},%d2
+ bfextu %d2{%d1:%d0},%d2 //d2 = new LOCAL_LO
+ bfextu LOCAL_HI(%a0){%d0:#32},%d1 //d1 = new G,R,S
+ bftst %d1{#2:#30}
+ bnes c2_sstky //bra if sticky bit to be set
+ bftst FP_SCR2+LOCAL_LO(%a6){%d0:#32}
+ bnes c2_sstky //bra if sticky bit to be set
+ movel %d1,%d0
+ clrb %d1
+ bras end_c2
+c2_sstky:
+ movel %d1,%d0
+ bsetl #rnd_stky_bit,%d0
+ st %d1
+end_c2:
+ clrl LOCAL_HI(%a0) //store LOCAL_HI = 0
+ movel %d2,LOCAL_LO(%a0) //store LOCAL_LO
+ movel FP_SCR2+LOCAL_GRS(%a6),%d2 //restore original g,r,s
+ andil #0xe0000000,%d2 //clear all but G,R,S
+ tstl %d2 //test if original G,R,S are clear
+ beqs clear_grs
+ orl #0x20000000,%d0 //set sticky bit in d0
+clear_grs:
+ andil #0xe0000000,%d0 //get rid of all but G,R,S
+ movel (%sp)+,%d2
+ rts
+//
+// d1 >= 64 Force the exponent to be the denorm threshold with the
+// correct sign.
+//
+case_3:
+ movew %d0,LOCAL_EX(%a0)
+ tstw LOCAL_SGN(%a0)
+ bges c3con
+c3neg:
+ orl #0x80000000,LOCAL_EX(%a0)
+c3con:
+ cmpw #64,%d1
+ beqs sixty_four
+ cmpw #65,%d1
+ beqs sixty_five
+//
+// Shift value is out of range. Set d1 for inex2 flag and
+// return a zero with the given threshold.
+//
+ clrl LOCAL_HI(%a0)
+ clrl LOCAL_LO(%a0)
+ movel #0x20000000,%d0
+ st %d1
+ rts
+
+sixty_four:
+ movel LOCAL_HI(%a0),%d0
+ bfextu %d0{#2:#30},%d1
+ andil #0xc0000000,%d0
+ bras c3com
+
+sixty_five:
+ movel LOCAL_HI(%a0),%d0
+ bfextu %d0{#1:#31},%d1
+ andil #0x80000000,%d0
+ lsrl #1,%d0 //shift high bit into R bit
+
+c3com:
+ tstl %d1
+ bnes c3ssticky
+ tstl LOCAL_LO(%a0)
+ bnes c3ssticky
+ tstb FP_SCR2+LOCAL_GRS(%a6)
+ bnes c3ssticky
+ clrb %d1
+ bras c3end
+
+c3ssticky:
+ bsetl #rnd_stky_bit,%d0
+ st %d1
+c3end:
+ clrl LOCAL_HI(%a0)
+ clrl LOCAL_LO(%a0)
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/rtems_fpsp.c b/c/src/lib/libcpu/m68k/m68040/fpsp/rtems_fpsp.c
new file mode 100644
index 0000000000..fefce81bc9
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/rtems_fpsp.c
@@ -0,0 +1,81 @@
+/*
+ * $Id$
+ */
+
+#include <rtems/system.h>
+/*
+#include <rtems/score/isr.h>
+*/
+
+/*
+ * User exception handlers
+ */
+proc_ptr M68040FPSPUserExceptionHandlers[9];
+
+/*
+ * Intercept requests to install an exception handler.
+ * FPSP exceptions get special treatment.
+ */
+static int
+FPSP_install_raw_handler (unsigned32 vector, proc_ptr new_handler, proc_ptr *old_handler)
+{
+ int fpspVector;
+
+ switch (vector) {
+ default: return 0; /* Non-FPSP vector */
+ case 11: fpspVector = 0; break; /* F-line */
+ case 48: fpspVector = 1; break; /* BSUN */
+ case 49: fpspVector = 2; break; /* INEXACT */
+ case 50: fpspVector = 3; break; /* DIVIDE-BY-ZERO */
+ case 51: fpspVector = 4; break; /* UNDERFLOW */
+ case 52: fpspVector = 5; break; /* OPERAND ERROR */
+ case 53: fpspVector = 6; break; /* OVERFLOW */
+ case 54: fpspVector = 7; break; /* SIGNALLING NAN */
+ case 55: fpspVector = 8; break; /* UNIMPLEMENTED DATA TYPE */
+ }
+ *old_handler = M68040FPSPUserExceptionHandlers[fpspVector];
+ M68040FPSPUserExceptionHandlers[fpspVector] = new_handler;
+ return 1;
+}
+
+/*
+ * Attach floating point exception vectors to M68040FPSP entry points
+ *
+ * NOTE: Uses M68K rather than M68040 in the name so all CPUs having
+ * an FPSP can share the same code in RTEMS proper.
+ */
+void
+M68KFPSPInstallExceptionHandlers (void)
+{
+ extern void _fpspEntry_fline();
+ extern void _fpspEntry_bsun();
+ extern void _fpspEntry_inex();
+ extern void _fpspEntry_dz();
+ extern void _fpspEntry_unfl();
+ extern void _fpspEntry_ovfl();
+ extern void _fpspEntry_operr();
+ extern void _fpspEntry_snan();
+ extern void _fpspEntry_unsupp();
+ static struct {
+ int vector_number;
+ void (*handler)();
+ } fpspHandlers[] = {
+ { 11, _fpspEntry_fline },
+ { 48, _fpspEntry_bsun },
+ { 49, _fpspEntry_inex },
+ { 50, _fpspEntry_dz },
+ { 51, _fpspEntry_unfl },
+ { 52, _fpspEntry_operr },
+ { 53, _fpspEntry_ovfl },
+ { 54, _fpspEntry_snan },
+ { 55, _fpspEntry_unsupp },
+ };
+ int i;
+ proc_ptr oldHandler;
+
+ for (i = 0 ; i < sizeof fpspHandlers / sizeof fpspHandlers[0] ; i++) {
+ _CPU_ISR_install_raw_handler(fpspHandlers[i].vector_number, fpspHandlers[i].handler, &oldHandler);
+ M68040FPSPUserExceptionHandlers[i] = oldHandler;
+ }
+ _FPSP_install_raw_handler = FPSP_install_raw_handler;
+}
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/rtems_skel.s b/c/src/lib/libcpu/m68k/m68040/fpsp/rtems_skel.s
new file mode 100644
index 0000000000..a347f5cee4
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/rtems_skel.s
@@ -0,0 +1,397 @@
+//
+// skeleton.sa 3.2 4/26/91
+//
+// This file contains code that is system dependent and will
+// need to be modified to install the FPSP.
+//
+// Each entry point for exception 'xxxx' begins with a 'jmp fpsp_xxxx'.
+// Put any target system specific handling that must be done immediately
+// before the jump instruction. If there no handling necessary, then
+// the 'fpsp_xxxx' handler entry point should be placed in the exception
+// table so that the 'jmp' can be eliminated. If the FPSP determines that the
+// exception is one that must be reported then there will be a
+// return from the package by a 'jmp real_xxxx'. At that point
+// the machine state will be identical to the state before
+// the FPSP was entered. In particular, whatever condition
+// that caused the exception will still be pending when the FPSP
+// package returns. Thus, there will be system specific code
+// to handle the exception.
+//
+// If the exception was completely handled by the package, then
+// the return will be via a 'jmp fpsp_done'. Unless there is
+// OS specific work to be done (such as handling a context switch or
+// interrupt) the user program can be resumed via 'rte'.
+//
+// In the following skeleton code, some typical 'real_xxxx' handling
+// code is shown. This code may need to be moved to an appropriate
+// place in the target system, or rewritten.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+// $Id$
+
+//
+// Modified for Linux-1.3.x by Jes Sorensen (jds@kom.auc.dk)
+// Modified for RTEMS 4.0.0 by Eric Norum (eric@skatter.usask.ca)
+//
+
+#include <asm.h>
+
+//SKELETON idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ .include "fpsp.defs"
+
+//
+// Divide by Zero exception
+//
+// All dz exceptions are 'real', hence no fpsp_dz entry point.
+//
+ .global SYM(_fpspEntry_dz)
+SYM(_fpspEntry_dz):
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ bclrb #E1,E_BYTE(%a6)
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+3*4],za0)
+
+//
+// Inexact exception
+//
+// All inexact exceptions are real, but the 'real' handler
+// will probably want to clear the pending exception.
+// The provided code will clear the E3 exception (if pending),
+// otherwise clear the E1 exception. The frestore is not really
+// necessary for E1 exceptions.
+//
+// Code following the 'inex' label is to handle bug #1232. In this
+// bug, if an E1 snan, ovfl, or unfl occurred, and the process was
+// swapped out before taking the exception, the exception taken on
+// return was inex, rather than the correct exception. The snan, ovfl,
+// and unfl exception to be taken must not have been enabled. The
+// fix is to check for E1, and the existence of one of snan, ovfl,
+// or unfl bits set in the fpsr. If any of these are set, branch
+// to the appropriate handler for the exception in the fpsr. Note
+// that this fix is only for d43b parts, and is skipped if the
+// version number is not $40.
+//
+//
+ .global SYM(_fpspEntry_inex)
+ .global real_inex
+SYM(_fpspEntry_inex):
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ cmpib #VER_40,(%sp) //test version number
+ bnes not_fmt40
+ fmovel %fpsr,-(%sp)
+ btstb #E1,E_BYTE(%a6) //test for E1 set
+ beqs not_b1232
+ btstb #snan_bit,2(%sp) //test for snan
+ beq inex_ckofl
+ addl #4,%sp
+ frestore (%sp)+
+ unlk %a6
+ bra snan
+inex_ckofl:
+ btstb #ovfl_bit,2(%sp) //test for ovfl
+ beq inex_ckufl
+ addl #4,%sp
+ frestore (%sp)+
+ unlk %a6
+ bra SYM(_fpspEntry_ovfl)
+inex_ckufl:
+ btstb #unfl_bit,2(%sp) //test for unfl
+ beq not_b1232
+ addl #4,%sp
+ frestore (%sp)+
+ unlk %a6
+ bra SYM(_fpspEntry_unfl)
+
+//
+// We do not have the bug 1232 case. Clean up the stack and call
+// real_inex.
+//
+not_b1232:
+ addl #4,%sp
+ frestore (%sp)+
+ unlk %a6
+
+real_inex:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+not_fmt40:
+ bclrb #E3,E_BYTE(%a6) //clear and test E3 flag
+ beqs inex_cke1
+//
+// Clear dirty bit on dest resister in the frame before branching
+// to b1238_fix.
+//
+ moveml %d0/%d1,USER_DA(%a6)
+ bfextu CMDREG1B(%a6){#6:#3},%d0 //get dest reg no
+ bclrb %d0,FPR_DIRTY_BITS(%a6) //clr dest dirty bit
+ bsrl b1238_fix //test for bug1238 case
+ moveml USER_DA(%a6),%d0/%d1
+ bras inex_done
+inex_cke1:
+ bclrb #E1,E_BYTE(%a6)
+inex_done:
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+2*4],za0)
+
+//
+// Overflow exception
+//
+ .global SYM(_fpspEntry_ovfl)
+ .global real_ovfl
+SYM(_fpspEntry_ovfl):
+ jmp fpsp_ovfl
+real_ovfl:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ bclrb #E3,E_BYTE(%a6) //clear and test E3 flag
+ bnes ovfl_done
+ bclrb #E1,E_BYTE(%a6)
+ovfl_done:
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+6*4],za0)
+
+//
+// Underflow exception
+//
+ .global SYM(_fpspEntry_unfl)
+ .global real_unfl
+SYM(_fpspEntry_unfl):
+ jmp fpsp_unfl
+real_unfl:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ bclrb #E3,E_BYTE(%a6) //clear and test E3 flag
+ bnes unfl_done
+ bclrb #E1,E_BYTE(%a6)
+unfl_done:
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+4*4],za0)
+
+//
+// Signalling NAN exception
+//
+ .global SYM(_fpspEntry_snan)
+ .global real_snan
+SYM(_fpspEntry_snan):
+snan:
+ jmp fpsp_snan
+real_snan:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ bclrb #E1,E_BYTE(%a6) //snan is always an E1 exception
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+7*4],za0)
+
+//
+// Operand Error exception
+//
+ .global SYM(_fpspEntry_operr)
+ .global real_operr
+SYM(_fpspEntry_operr):
+ jmp fpsp_operr
+real_operr:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ bclrb #E1,E_BYTE(%a6) //operr is always an E1 exception
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+5*4],za0)
+
+//
+// BSUN exception
+//
+// This sample handler simply clears the nan bit in the FPSR.
+//
+ .global SYM(_fpspEntry_bsun)
+ .global real_bsun
+SYM(_fpspEntry_bsun):
+ jmp fpsp_bsun
+real_bsun:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ bclrb #E1,E_BYTE(%a6) //bsun is always an E1 exception
+ fmovel %FPSR,-(%sp)
+ bclrb #nan_bit,(%sp)
+ fmovel (%sp)+,%FPSR
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+1*4],za0)
+
+//
+// F-line exception
+//
+// A 'real' F-line exception is one that the FPSP is not supposed to
+// handle. E.g. an instruction with a co-processor ID that is not 1.
+//
+ .global SYM(_fpspEntry_fline)
+ .global real_fline
+SYM(_fpspEntry_fline):
+ jmp fpsp_fline
+real_fline:
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+0*4],za0)
+
+//
+// Unsupported data type exception
+//
+ .global SYM(_fpspEntry_unsupp)
+ .global real_unsupp
+SYM(_fpspEntry_unsupp):
+ jmp fpsp_unsupp
+real_unsupp:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%sp)
+ bclrb #E1,E_BYTE(%a6) //unsupp is always an E1 exception
+ frestore (%sp)+
+ unlk %a6
+ jmp ([SYM(M68040FPSPUserExceptionHandlers)+8*4],za0)
+
+//
+// Trace exception
+//
+ .global real_trace
+real_trace:
+ trap #10
+
+//
+// fpsp_fmt_error --- exit point for frame format error
+//
+// The fpu stack frame does not match the frames existing
+// or planned at the time of this writing. The fpsp is
+// unable to handle frame sizes not in the following
+// version:size pairs:
+//
+// {4060, 4160} - busy frame
+// {4028, 4130} - unimp frame
+// {4000, 4100} - idle frame
+//
+ .global fpsp_fmt_error
+fpsp_fmt_error:
+ trap #11
+
+//
+// fpsp_done --- FPSP exit point
+//
+// The exception has been handled by the package and we are ready
+// to return to user mode, but there may be OS specific code
+// to execute before we do. If there is, do it now.
+//
+// For now, the RTEMS does not bother looking at the
+// possibility that it is time to reschedule....
+//
+
+ .global fpsp_done
+fpsp_done:
+ rte
+
+//
+// mem_write --- write to user or supervisor address space
+//
+// Writes to memory while in supervisor mode.
+//
+// a0 - supervisor source address
+// a1 - user/supervisor destination address
+// d0 - number of bytes to write (maximum count is 12)
+//
+ .global mem_write
+mem_write:
+ btstb #5,EXC_SR(%a6) //check for supervisor state
+ beqs user_write
+super_write:
+ moveb (%a0)+,(%a1)+
+ subql #1,%d0
+ bnes super_write
+ rts
+user_write:
+ movel %d1,-(%sp) //preserve d1 just in case
+ movel %d0,-(%sp)
+ movel %a1,-(%sp)
+ movel %a0,-(%sp)
+ jsr copyout
+ addw #12,%sp
+ movel (%sp)+,%d1
+ rts
+//
+// mem_read --- read from user or supervisor address space
+//
+// Reads from memory while in supervisor mode.
+//
+// The FPSP calls mem_read to read the original F-line instruction in order
+// to extract the data register number when the 'Dn' addressing mode is
+// used.
+//
+//Input:
+// a0 - user/supervisor source address
+// a1 - supervisor destination address
+// d0 - number of bytes to read (maximum count is 12)
+//
+// Like mem_write, mem_read always reads with a supervisor
+// destination address on the supervisor stack. Also like mem_write,
+// the EXC_SR is checked and a simple memory copy is done if reading
+// from supervisor space is indicated.
+//
+ .global mem_read
+mem_read:
+ btstb #5,EXC_SR(%a6) //check for supervisor state
+ beqs user_read
+super_read:
+ moveb (%a0)+,(%a1)+
+ subql #1,%d0
+ bnes super_read
+ rts
+user_read:
+ movel %d1,-(%sp) //preserve d1 just in case
+ movel %d0,-(%sp)
+ movel %a1,-(%sp)
+ movel %a0,-(%sp)
+ jsr copyin
+ addw #12,%sp
+ movel (%sp)+,%d1
+ rts
+
+//
+// Use these routines if your kernel does not have copyout/copyin equivalents.
+// Assumes that D0/D1/A0/A1 are scratch registers. copyout overwrites DFC,
+// and copyin overwrites SFC.
+//
+copyout:
+ movel 4(%sp),%a0 // source
+ movel 8(%sp),%a1 // destination
+ movel 12(%sp),%d0 // count
+ subl #1,%d0 // dec count by 1 for dbra
+ movel #1,%d1
+ movec %d1,%DFC // set dfc for user data space
+moreout:
+ moveb (%a0)+,%d1 // fetch supervisor byte
+ movesb %d1,(%a1)+ // write user byte
+ dbf %d0,moreout
+ rts
+
+copyin:
+ movel 4(%sp),%a0 // source
+ movel 8(%sp),%a1 // destination
+ movel 12(%sp),%d0 // count
+ subl #1,%d0 // dec count by 1 for dbra
+ movel #1,%d1
+ movec %d1,%SFC // set sfc for user space
+morein:
+ movesb (%a0)+,%d1 // fetch user byte
+ moveb %d1,(%a1)+ // write supervisor byte
+ dbf %d0,morein
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/sacos.s b/c/src/lib/libcpu/m68k/m68040/fpsp/sacos.s
new file mode 100644
index 0000000000..83390a8ebb
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/sacos.s
@@ -0,0 +1,115 @@
+//
+// sacos.sa 3.3 12/19/90
+//
+// Description: The entry point sAcos computes the inverse cosine of
+// an input argument; sAcosd does the same except for denormalized
+// input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value arccos(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 3 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program sCOS takes approximately 310 cycles.
+//
+// Algorithm:
+//
+// ACOS
+// 1. If |X| >= 1, go to 3.
+//
+// 2. (|X| < 1) Calculate acos(X) by
+// z := (1-X) / (1+X)
+// acos(X) = 2 * atan( sqrt(z) ).
+// Exit.
+//
+// 3. If |X| > 1, go to 5.
+//
+// 4. (|X| = 1) If X > 0, return 0. Otherwise, return Pi. Exit.
+//
+// 5. (|X| > 1) Generate an invalid operation by 0 * infinity.
+// Exit.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SACOS idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+PI: .long 0x40000000,0xC90FDAA2,0x2168C235,0x00000000
+PIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
+
+ |xref t_operr
+ |xref t_frcinx
+ |xref satan
+
+ .global sacosd
+sacosd:
+//--ACOS(X) = PI/2 FOR DENORMALIZED X
+ fmovel %d1,%fpcr // ...load user's rounding mode/precision
+ fmovex PIBY2,%fp0
+ bra t_frcinx
+
+ .global sacos
+sacos:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0 // ...pack exponent with upper 16 fraction
+ movew 4(%a0),%d0
+ andil #0x7FFFFFFF,%d0
+ cmpil #0x3FFF8000,%d0
+ bges ACOSBIG
+
+//--THIS IS THE USUAL CASE, |X| < 1
+//--ACOS(X) = 2 * ATAN( SQRT( (1-X)/(1+X) ) )
+
+ fmoves #0x3F800000,%fp1
+ faddx %fp0,%fp1 // ...1+X
+ fnegx %fp0 // ... -X
+ fadds #0x3F800000,%fp0 // ...1-X
+ fdivx %fp1,%fp0 // ...(1-X)/(1+X)
+ fsqrtx %fp0 // ...SQRT((1-X)/(1+X))
+ fmovemx %fp0-%fp0,(%a0) // ...overwrite input
+ movel %d1,-(%sp) //save original users fpcr
+ clrl %d1
+ bsr satan // ...ATAN(SQRT([1-X]/[1+X]))
+ fmovel (%sp)+,%fpcr //restore users exceptions
+ faddx %fp0,%fp0 // ...2 * ATAN( STUFF )
+ bra t_frcinx
+
+ACOSBIG:
+ fabsx %fp0
+ fcmps #0x3F800000,%fp0
+ fbgt t_operr //cause an operr exception
+
+//--|X| = 1, ACOS(X) = 0 OR PI
+ movel (%a0),%d0 // ...pack exponent with upper 16 fraction
+ movew 4(%a0),%d0
+ cmpl #0,%d0 //D0 has original exponent+fraction
+ bgts ACOSP1
+
+//--X = -1
+//Returns PI and inexact exception
+ fmovex PI,%fp0
+ fmovel %d1,%FPCR
+ fadds #0x00800000,%fp0 //cause an inexact exception to be put
+// ;into the 040 - will not trap until next
+// ;fp inst.
+ bra t_frcinx
+
+ACOSP1:
+ fmovel %d1,%FPCR
+ fmoves #0x00000000,%fp0
+ rts //Facos ; of +1 is exact
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/sasin.s b/c/src/lib/libcpu/m68k/m68040/fpsp/sasin.s
new file mode 100644
index 0000000000..6725b9b143
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/sasin.s
@@ -0,0 +1,104 @@
+//
+// sasin.sa 3.3 12/19/90
+//
+// Description: The entry point sAsin computes the inverse sine of
+// an input argument; sAsind does the same except for denormalized
+// input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value arcsin(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 3 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program sASIN takes approximately 310 cycles.
+//
+// Algorithm:
+//
+// ASIN
+// 1. If |X| >= 1, go to 3.
+//
+// 2. (|X| < 1) Calculate asin(X) by
+// z := sqrt( [1-X][1+X] )
+// asin(X) = atan( x / z ).
+// Exit.
+//
+// 3. If |X| > 1, go to 5.
+//
+// 4. (|X| = 1) sgn := sign(X), return asin(X) := sgn * Pi/2. Exit.
+//
+// 5. (|X| > 1) Generate an invalid operation by 0 * infinity.
+// Exit.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SASIN idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+PIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
+
+ |xref t_operr
+ |xref t_frcinx
+ |xref t_extdnrm
+ |xref satan
+
+ .global sasind
+sasind:
+//--ASIN(X) = X FOR DENORMALIZED X
+
+ bra t_extdnrm
+
+ .global sasin
+sasin:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ andil #0x7FFFFFFF,%d0
+ cmpil #0x3FFF8000,%d0
+ bges asinbig
+
+//--THIS IS THE USUAL CASE, |X| < 1
+//--ASIN(X) = ATAN( X / SQRT( (1-X)(1+X) ) )
+
+ fmoves #0x3F800000,%fp1
+ fsubx %fp0,%fp1 // ...1-X
+ fmovemx %fp2-%fp2,-(%a7)
+ fmoves #0x3F800000,%fp2
+ faddx %fp0,%fp2 // ...1+X
+ fmulx %fp2,%fp1 // ...(1+X)(1-X)
+ fmovemx (%a7)+,%fp2-%fp2
+ fsqrtx %fp1 // ...SQRT([1-X][1+X])
+ fdivx %fp1,%fp0 // ...X/SQRT([1-X][1+X])
+ fmovemx %fp0-%fp0,(%a0)
+ bsr satan
+ bra t_frcinx
+
+asinbig:
+ fabsx %fp0 // ...|X|
+ fcmps #0x3F800000,%fp0
+ fbgt t_operr //cause an operr exception
+
+//--|X| = 1, ASIN(X) = +- PI/2.
+
+ fmovex PIBY2,%fp0
+ movel (%a0),%d0
+ andil #0x80000000,%d0 // ...SIGN BIT OF X
+ oril #0x3F800000,%d0 // ...+-1 IN SGL FORMAT
+ movel %d0,-(%sp) // ...push SIGN(X) IN SGL-FMT
+ fmovel %d1,%FPCR
+ fmuls (%sp)+,%fp0
+ bra t_frcinx
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/satan.s b/c/src/lib/libcpu/m68k/m68040/fpsp/satan.s
new file mode 100644
index 0000000000..662b0430f0
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/satan.s
@@ -0,0 +1,478 @@
+//
+// satan.sa 3.3 12/19/90
+//
+// The entry point satan computes the arctangent of an
+// input value. satand does the same except the input value is a
+// denormalized number.
+//
+// Input: Double-extended value in memory location pointed to by address
+// register a0.
+//
+// Output: Arctan(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 2 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program satan takes approximately 160 cycles for input
+// argument X such that 1/16 < |X| < 16. For the other arguments,
+// the program will run no worse than 10% slower.
+//
+// Algorithm:
+// Step 1. If |X| >= 16 or |X| < 1/16, go to Step 5.
+//
+// Step 2. Let X = sgn * 2**k * 1.xxxxxxxx...x. Note that k = -4, -3,..., or 3.
+// Define F = sgn * 2**k * 1.xxxx1, i.e. the first 5 significant bits
+// of X with a bit-1 attached at the 6-th bit position. Define u
+// to be u = (X-F) / (1 + X*F).
+//
+// Step 3. Approximate arctan(u) by a polynomial poly.
+//
+// Step 4. Return arctan(F) + poly, arctan(F) is fetched from a table of values
+// calculated beforehand. Exit.
+//
+// Step 5. If |X| >= 16, go to Step 7.
+//
+// Step 6. Approximate arctan(X) by an odd polynomial in X. Exit.
+//
+// Step 7. Define X' = -1/X. Approximate arctan(X') by an odd polynomial in X'.
+// Arctan(X) = sign(X)*Pi/2 + arctan(X'). Exit.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//satan idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+BOUNDS1: .long 0x3FFB8000,0x4002FFFF
+
+ONE: .long 0x3F800000
+
+ .long 0x00000000
+
+ATANA3: .long 0xBFF6687E,0x314987D8
+ATANA2: .long 0x4002AC69,0x34A26DB3
+
+ATANA1: .long 0xBFC2476F,0x4E1DA28E
+ATANB6: .long 0x3FB34444,0x7F876989
+
+ATANB5: .long 0xBFB744EE,0x7FAF45DB
+ATANB4: .long 0x3FBC71C6,0x46940220
+
+ATANB3: .long 0xBFC24924,0x921872F9
+ATANB2: .long 0x3FC99999,0x99998FA9
+
+ATANB1: .long 0xBFD55555,0x55555555
+ATANC5: .long 0xBFB70BF3,0x98539E6A
+
+ATANC4: .long 0x3FBC7187,0x962D1D7D
+ATANC3: .long 0xBFC24924,0x827107B8
+
+ATANC2: .long 0x3FC99999,0x9996263E
+ATANC1: .long 0xBFD55555,0x55555536
+
+PPIBY2: .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x00000000
+NPIBY2: .long 0xBFFF0000,0xC90FDAA2,0x2168C235,0x00000000
+PTINY: .long 0x00010000,0x80000000,0x00000000,0x00000000
+NTINY: .long 0x80010000,0x80000000,0x00000000,0x00000000
+
+ATANTBL:
+ .long 0x3FFB0000,0x83D152C5,0x060B7A51,0x00000000
+ .long 0x3FFB0000,0x8BC85445,0x65498B8B,0x00000000
+ .long 0x3FFB0000,0x93BE4060,0x17626B0D,0x00000000
+ .long 0x3FFB0000,0x9BB3078D,0x35AEC202,0x00000000
+ .long 0x3FFB0000,0xA3A69A52,0x5DDCE7DE,0x00000000
+ .long 0x3FFB0000,0xAB98E943,0x62765619,0x00000000
+ .long 0x3FFB0000,0xB389E502,0xF9C59862,0x00000000
+ .long 0x3FFB0000,0xBB797E43,0x6B09E6FB,0x00000000
+ .long 0x3FFB0000,0xC367A5C7,0x39E5F446,0x00000000
+ .long 0x3FFB0000,0xCB544C61,0xCFF7D5C6,0x00000000
+ .long 0x3FFB0000,0xD33F62F8,0x2488533E,0x00000000
+ .long 0x3FFB0000,0xDB28DA81,0x62404C77,0x00000000
+ .long 0x3FFB0000,0xE310A407,0x8AD34F18,0x00000000
+ .long 0x3FFB0000,0xEAF6B0A8,0x188EE1EB,0x00000000
+ .long 0x3FFB0000,0xF2DAF194,0x9DBE79D5,0x00000000
+ .long 0x3FFB0000,0xFABD5813,0x61D47E3E,0x00000000
+ .long 0x3FFC0000,0x8346AC21,0x0959ECC4,0x00000000
+ .long 0x3FFC0000,0x8B232A08,0x304282D8,0x00000000
+ .long 0x3FFC0000,0x92FB70B8,0xD29AE2F9,0x00000000
+ .long 0x3FFC0000,0x9ACF476F,0x5CCD1CB4,0x00000000
+ .long 0x3FFC0000,0xA29E7630,0x4954F23F,0x00000000
+ .long 0x3FFC0000,0xAA68C5D0,0x8AB85230,0x00000000
+ .long 0x3FFC0000,0xB22DFFFD,0x9D539F83,0x00000000
+ .long 0x3FFC0000,0xB9EDEF45,0x3E900EA5,0x00000000
+ .long 0x3FFC0000,0xC1A85F1C,0xC75E3EA5,0x00000000
+ .long 0x3FFC0000,0xC95D1BE8,0x28138DE6,0x00000000
+ .long 0x3FFC0000,0xD10BF300,0x840D2DE4,0x00000000
+ .long 0x3FFC0000,0xD8B4B2BA,0x6BC05E7A,0x00000000
+ .long 0x3FFC0000,0xE0572A6B,0xB42335F6,0x00000000
+ .long 0x3FFC0000,0xE7F32A70,0xEA9CAA8F,0x00000000
+ .long 0x3FFC0000,0xEF888432,0x64ECEFAA,0x00000000
+ .long 0x3FFC0000,0xF7170A28,0xECC06666,0x00000000
+ .long 0x3FFD0000,0x812FD288,0x332DAD32,0x00000000
+ .long 0x3FFD0000,0x88A8D1B1,0x218E4D64,0x00000000
+ .long 0x3FFD0000,0x9012AB3F,0x23E4AEE8,0x00000000
+ .long 0x3FFD0000,0x976CC3D4,0x11E7F1B9,0x00000000
+ .long 0x3FFD0000,0x9EB68949,0x3889A227,0x00000000
+ .long 0x3FFD0000,0xA5EF72C3,0x4487361B,0x00000000
+ .long 0x3FFD0000,0xAD1700BA,0xF07A7227,0x00000000
+ .long 0x3FFD0000,0xB42CBCFA,0xFD37EFB7,0x00000000
+ .long 0x3FFD0000,0xBB303A94,0x0BA80F89,0x00000000
+ .long 0x3FFD0000,0xC22115C6,0xFCAEBBAF,0x00000000
+ .long 0x3FFD0000,0xC8FEF3E6,0x86331221,0x00000000
+ .long 0x3FFD0000,0xCFC98330,0xB4000C70,0x00000000
+ .long 0x3FFD0000,0xD6807AA1,0x102C5BF9,0x00000000
+ .long 0x3FFD0000,0xDD2399BC,0x31252AA3,0x00000000
+ .long 0x3FFD0000,0xE3B2A855,0x6B8FC517,0x00000000
+ .long 0x3FFD0000,0xEA2D764F,0x64315989,0x00000000
+ .long 0x3FFD0000,0xF3BF5BF8,0xBAD1A21D,0x00000000
+ .long 0x3FFE0000,0x801CE39E,0x0D205C9A,0x00000000
+ .long 0x3FFE0000,0x8630A2DA,0xDA1ED066,0x00000000
+ .long 0x3FFE0000,0x8C1AD445,0xF3E09B8C,0x00000000
+ .long 0x3FFE0000,0x91DB8F16,0x64F350E2,0x00000000
+ .long 0x3FFE0000,0x97731420,0x365E538C,0x00000000
+ .long 0x3FFE0000,0x9CE1C8E6,0xA0B8CDBA,0x00000000
+ .long 0x3FFE0000,0xA22832DB,0xCADAAE09,0x00000000
+ .long 0x3FFE0000,0xA746F2DD,0xB7602294,0x00000000
+ .long 0x3FFE0000,0xAC3EC0FB,0x997DD6A2,0x00000000
+ .long 0x3FFE0000,0xB110688A,0xEBDC6F6A,0x00000000
+ .long 0x3FFE0000,0xB5BCC490,0x59ECC4B0,0x00000000
+ .long 0x3FFE0000,0xBA44BC7D,0xD470782F,0x00000000
+ .long 0x3FFE0000,0xBEA94144,0xFD049AAC,0x00000000
+ .long 0x3FFE0000,0xC2EB4ABB,0x661628B6,0x00000000
+ .long 0x3FFE0000,0xC70BD54C,0xE602EE14,0x00000000
+ .long 0x3FFE0000,0xCD000549,0xADEC7159,0x00000000
+ .long 0x3FFE0000,0xD48457D2,0xD8EA4EA3,0x00000000
+ .long 0x3FFE0000,0xDB948DA7,0x12DECE3B,0x00000000
+ .long 0x3FFE0000,0xE23855F9,0x69E8096A,0x00000000
+ .long 0x3FFE0000,0xE8771129,0xC4353259,0x00000000
+ .long 0x3FFE0000,0xEE57C16E,0x0D379C0D,0x00000000
+ .long 0x3FFE0000,0xF3E10211,0xA87C3779,0x00000000
+ .long 0x3FFE0000,0xF919039D,0x758B8D41,0x00000000
+ .long 0x3FFE0000,0xFE058B8F,0x64935FB3,0x00000000
+ .long 0x3FFF0000,0x8155FB49,0x7B685D04,0x00000000
+ .long 0x3FFF0000,0x83889E35,0x49D108E1,0x00000000
+ .long 0x3FFF0000,0x859CFA76,0x511D724B,0x00000000
+ .long 0x3FFF0000,0x87952ECF,0xFF8131E7,0x00000000
+ .long 0x3FFF0000,0x89732FD1,0x9557641B,0x00000000
+ .long 0x3FFF0000,0x8B38CAD1,0x01932A35,0x00000000
+ .long 0x3FFF0000,0x8CE7A8D8,0x301EE6B5,0x00000000
+ .long 0x3FFF0000,0x8F46A39E,0x2EAE5281,0x00000000
+ .long 0x3FFF0000,0x922DA7D7,0x91888487,0x00000000
+ .long 0x3FFF0000,0x94D19FCB,0xDEDF5241,0x00000000
+ .long 0x3FFF0000,0x973AB944,0x19D2A08B,0x00000000
+ .long 0x3FFF0000,0x996FF00E,0x08E10B96,0x00000000
+ .long 0x3FFF0000,0x9B773F95,0x12321DA7,0x00000000
+ .long 0x3FFF0000,0x9D55CC32,0x0F935624,0x00000000
+ .long 0x3FFF0000,0x9F100575,0x006CC571,0x00000000
+ .long 0x3FFF0000,0xA0A9C290,0xD97CC06C,0x00000000
+ .long 0x3FFF0000,0xA22659EB,0xEBC0630A,0x00000000
+ .long 0x3FFF0000,0xA388B4AF,0xF6EF0EC9,0x00000000
+ .long 0x3FFF0000,0xA4D35F10,0x61D292C4,0x00000000
+ .long 0x3FFF0000,0xA60895DC,0xFBE3187E,0x00000000
+ .long 0x3FFF0000,0xA72A51DC,0x7367BEAC,0x00000000
+ .long 0x3FFF0000,0xA83A5153,0x0956168F,0x00000000
+ .long 0x3FFF0000,0xA93A2007,0x7539546E,0x00000000
+ .long 0x3FFF0000,0xAA9E7245,0x023B2605,0x00000000
+ .long 0x3FFF0000,0xAC4C84BA,0x6FE4D58F,0x00000000
+ .long 0x3FFF0000,0xADCE4A4A,0x606B9712,0x00000000
+ .long 0x3FFF0000,0xAF2A2DCD,0x8D263C9C,0x00000000
+ .long 0x3FFF0000,0xB0656F81,0xF22265C7,0x00000000
+ .long 0x3FFF0000,0xB1846515,0x0F71496A,0x00000000
+ .long 0x3FFF0000,0xB28AAA15,0x6F9ADA35,0x00000000
+ .long 0x3FFF0000,0xB37B44FF,0x3766B895,0x00000000
+ .long 0x3FFF0000,0xB458C3DC,0xE9630433,0x00000000
+ .long 0x3FFF0000,0xB525529D,0x562246BD,0x00000000
+ .long 0x3FFF0000,0xB5E2CCA9,0x5F9D88CC,0x00000000
+ .long 0x3FFF0000,0xB692CADA,0x7ACA1ADA,0x00000000
+ .long 0x3FFF0000,0xB736AEA7,0xA6925838,0x00000000
+ .long 0x3FFF0000,0xB7CFAB28,0x7E9F7B36,0x00000000
+ .long 0x3FFF0000,0xB85ECC66,0xCB219835,0x00000000
+ .long 0x3FFF0000,0xB8E4FD5A,0x20A593DA,0x00000000
+ .long 0x3FFF0000,0xB99F41F6,0x4AFF9BB5,0x00000000
+ .long 0x3FFF0000,0xBA7F1E17,0x842BBE7B,0x00000000
+ .long 0x3FFF0000,0xBB471285,0x7637E17D,0x00000000
+ .long 0x3FFF0000,0xBBFABE8A,0x4788DF6F,0x00000000
+ .long 0x3FFF0000,0xBC9D0FAD,0x2B689D79,0x00000000
+ .long 0x3FFF0000,0xBD306A39,0x471ECD86,0x00000000
+ .long 0x3FFF0000,0xBDB6C731,0x856AF18A,0x00000000
+ .long 0x3FFF0000,0xBE31CAC5,0x02E80D70,0x00000000
+ .long 0x3FFF0000,0xBEA2D55C,0xE33194E2,0x00000000
+ .long 0x3FFF0000,0xBF0B10B7,0xC03128F0,0x00000000
+ .long 0x3FFF0000,0xBF6B7A18,0xDACB778D,0x00000000
+ .long 0x3FFF0000,0xBFC4EA46,0x63FA18F6,0x00000000
+ .long 0x3FFF0000,0xC0181BDE,0x8B89A454,0x00000000
+ .long 0x3FFF0000,0xC065B066,0xCFBF6439,0x00000000
+ .long 0x3FFF0000,0xC0AE345F,0x56340AE6,0x00000000
+ .long 0x3FFF0000,0xC0F22291,0x9CB9E6A7,0x00000000
+
+ .set X,FP_SCR1
+ .set XDCARE,X+2
+ .set XFRAC,X+4
+ .set XFRACLO,X+8
+
+ .set ATANF,FP_SCR2
+ .set ATANFHI,ATANF+4
+ .set ATANFLO,ATANF+8
+
+
+ | xref t_frcinx
+ |xref t_extdnrm
+
+ .global satand
+satand:
+//--ENTRY POINT FOR ATAN(X) FOR DENORMALIZED ARGUMENT
+
+ bra t_extdnrm
+
+ .global satan
+satan:
+//--ENTRY POINT FOR ATAN(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
+
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ fmovex %fp0,X(%a6)
+ andil #0x7FFFFFFF,%d0
+
+ cmpil #0x3FFB8000,%d0 // ...|X| >= 1/16?
+ bges ATANOK1
+ bra ATANSM
+
+ATANOK1:
+ cmpil #0x4002FFFF,%d0 // ...|X| < 16 ?
+ bles ATANMAIN
+ bra ATANBIG
+
+
+//--THE MOST LIKELY CASE, |X| IN [1/16, 16). WE USE TABLE TECHNIQUE
+//--THE IDEA IS ATAN(X) = ATAN(F) + ATAN( [X-F] / [1+XF] ).
+//--SO IF F IS CHOSEN TO BE CLOSE TO X AND ATAN(F) IS STORED IN
+//--A TABLE, ALL WE NEED IS TO APPROXIMATE ATAN(U) WHERE
+//--U = (X-F)/(1+XF) IS SMALL (REMEMBER F IS CLOSE TO X). IT IS
+//--TRUE THAT A DIVIDE IS NOW NEEDED, BUT THE APPROXIMATION FOR
+//--ATAN(U) IS A VERY SHORT POLYNOMIAL AND THE INDEXING TO
+//--FETCH F AND SAVING OF REGISTERS CAN BE ALL HIDED UNDER THE
+//--DIVIDE. IN THE END THIS METHOD IS MUCH FASTER THAN A TRADITIONAL
+//--ONE. NOTE ALSO THAT THE TRADITIONAL SCHEME THAT APPROXIMATE
+//--ATAN(X) DIRECTLY WILL NEED TO USE A RATIONAL APPROXIMATION
+//--(DIVISION NEEDED) ANYWAY BECAUSE A POLYNOMIAL APPROXIMATION
+//--WILL INVOLVE A VERY LONG POLYNOMIAL.
+
+//--NOW WE SEE X AS +-2^K * 1.BBBBBBB....B <- 1. + 63 BITS
+//--WE CHOSE F TO BE +-2^K * 1.BBBB1
+//--THAT IS IT MATCHES THE EXPONENT AND FIRST 5 BITS OF X, THE
+//--SIXTH BITS IS SET TO BE 1. SINCE K = -4, -3, ..., 3, THERE
+//--ARE ONLY 8 TIMES 16 = 2^7 = 128 |F|'S. SINCE ATAN(-|F|) IS
+//-- -ATAN(|F|), WE NEED TO STORE ONLY ATAN(|F|).
+
+ATANMAIN:
+
+ movew #0x0000,XDCARE(%a6) // ...CLEAN UP X JUST IN CASE
+ andil #0xF8000000,XFRAC(%a6) // ...FIRST 5 BITS
+ oril #0x04000000,XFRAC(%a6) // ...SET 6-TH BIT TO 1
+ movel #0x00000000,XFRACLO(%a6) // ...LOCATION OF X IS NOW F
+
+ fmovex %fp0,%fp1 // ...FP1 IS X
+ fmulx X(%a6),%fp1 // ...FP1 IS X*F, NOTE THAT X*F > 0
+ fsubx X(%a6),%fp0 // ...FP0 IS X-F
+ fadds #0x3F800000,%fp1 // ...FP1 IS 1 + X*F
+ fdivx %fp1,%fp0 // ...FP0 IS U = (X-F)/(1+X*F)
+
+//--WHILE THE DIVISION IS TAKING ITS TIME, WE FETCH ATAN(|F|)
+//--CREATE ATAN(F) AND STORE IT IN ATANF, AND
+//--SAVE REGISTERS FP2.
+
+ movel %d2,-(%a7) // ...SAVE d2 TEMPORARILY
+ movel %d0,%d2 // ...THE EXPO AND 16 BITS OF X
+ andil #0x00007800,%d0 // ...4 VARYING BITS OF F'S FRACTION
+ andil #0x7FFF0000,%d2 // ...EXPONENT OF F
+ subil #0x3FFB0000,%d2 // ...K+4
+ asrl #1,%d2
+ addl %d2,%d0 // ...THE 7 BITS IDENTIFYING F
+ asrl #7,%d0 // ...INDEX INTO TBL OF ATAN(|F|)
+ lea ATANTBL,%a1
+ addal %d0,%a1 // ...ADDRESS OF ATAN(|F|)
+ movel (%a1)+,ATANF(%a6)
+ movel (%a1)+,ATANFHI(%a6)
+ movel (%a1)+,ATANFLO(%a6) // ...ATANF IS NOW ATAN(|F|)
+ movel X(%a6),%d0 // ...LOAD SIGN AND EXPO. AGAIN
+ andil #0x80000000,%d0 // ...SIGN(F)
+ orl %d0,ATANF(%a6) // ...ATANF IS NOW SIGN(F)*ATAN(|F|)
+ movel (%a7)+,%d2 // ...RESTORE d2
+
+//--THAT'S ALL I HAVE TO DO FOR NOW,
+//--BUT ALAS, THE DIVIDE IS STILL CRANKING!
+
+//--U IN FP0, WE ARE NOW READY TO COMPUTE ATAN(U) AS
+//--U + A1*U*V*(A2 + V*(A3 + V)), V = U*U
+//--THE POLYNOMIAL MAY LOOK STRANGE, BUT IS NEVERTHELESS CORRECT.
+//--THE NATURAL FORM IS U + U*V*(A1 + V*(A2 + V*A3))
+//--WHAT WE HAVE HERE IS MERELY A1 = A3, A2 = A1/A3, A3 = A2/A3.
+//--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT
+//--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOAD-BALANCED
+
+
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1
+ fmoved ATANA3,%fp2
+ faddx %fp1,%fp2 // ...A3+V
+ fmulx %fp1,%fp2 // ...V*(A3+V)
+ fmulx %fp0,%fp1 // ...U*V
+ faddd ATANA2,%fp2 // ...A2+V*(A3+V)
+ fmuld ATANA1,%fp1 // ...A1*U*V
+ fmulx %fp2,%fp1 // ...A1*U*V*(A2+V*(A3+V))
+
+ faddx %fp1,%fp0 // ...ATAN(U), FP1 RELEASED
+ fmovel %d1,%FPCR //restore users exceptions
+ faddx ATANF(%a6),%fp0 // ...ATAN(X)
+ bra t_frcinx
+
+ATANBORS:
+//--|X| IS IN d0 IN COMPACT FORM. FP1, d0 SAVED.
+//--FP0 IS X AND |X| <= 1/16 OR |X| >= 16.
+ cmpil #0x3FFF8000,%d0
+ bgt ATANBIG // ...I.E. |X| >= 16
+
+ATANSM:
+//--|X| <= 1/16
+//--IF |X| < 2^(-40), RETURN X AS ANSWER. OTHERWISE, APPROXIMATE
+//--ATAN(X) BY X + X*Y*(B1+Y*(B2+Y*(B3+Y*(B4+Y*(B5+Y*B6)))))
+//--WHICH IS X + X*Y*( [B1+Z*(B3+Z*B5)] + [Y*(B2+Z*(B4+Z*B6)] )
+//--WHERE Y = X*X, AND Z = Y*Y.
+
+ cmpil #0x3FD78000,%d0
+ blt ATANTINY
+//--COMPUTE POLYNOMIAL
+ fmulx %fp0,%fp0 // ...FP0 IS Y = X*X
+
+
+ movew #0x0000,XDCARE(%a6)
+
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...FP1 IS Z = Y*Y
+
+ fmoved ATANB6,%fp2
+ fmoved ATANB5,%fp3
+
+ fmulx %fp1,%fp2 // ...Z*B6
+ fmulx %fp1,%fp3 // ...Z*B5
+
+ faddd ATANB4,%fp2 // ...B4+Z*B6
+ faddd ATANB3,%fp3 // ...B3+Z*B5
+
+ fmulx %fp1,%fp2 // ...Z*(B4+Z*B6)
+ fmulx %fp3,%fp1 // ...Z*(B3+Z*B5)
+
+ faddd ATANB2,%fp2 // ...B2+Z*(B4+Z*B6)
+ faddd ATANB1,%fp1 // ...B1+Z*(B3+Z*B5)
+
+ fmulx %fp0,%fp2 // ...Y*(B2+Z*(B4+Z*B6))
+ fmulx X(%a6),%fp0 // ...X*Y
+
+ faddx %fp2,%fp1 // ...[B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]
+
+
+ fmulx %fp1,%fp0 // ...X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))])
+
+ fmovel %d1,%FPCR //restore users exceptions
+ faddx X(%a6),%fp0
+
+ bra t_frcinx
+
+ATANTINY:
+//--|X| < 2^(-40), ATAN(X) = X
+ movew #0x0000,XDCARE(%a6)
+
+ fmovel %d1,%FPCR //restore users exceptions
+ fmovex X(%a6),%fp0 //last inst - possible exception set
+
+ bra t_frcinx
+
+ATANBIG:
+//--IF |X| > 2^(100), RETURN SIGN(X)*(PI/2 - TINY). OTHERWISE,
+//--RETURN SIGN(X)*PI/2 + ATAN(-1/X).
+ cmpil #0x40638000,%d0
+ bgt ATANHUGE
+
+//--APPROXIMATE ATAN(-1/X) BY
+//--X'+X'*Y*(C1+Y*(C2+Y*(C3+Y*(C4+Y*C5)))), X' = -1/X, Y = X'*X'
+//--THIS CAN BE RE-WRITTEN AS
+//--X'+X'*Y*( [C1+Z*(C3+Z*C5)] + [Y*(C2+Z*C4)] ), Z = Y*Y.
+
+ fmoves #0xBF800000,%fp1 // ...LOAD -1
+ fdivx %fp0,%fp1 // ...FP1 IS -1/X
+
+
+//--DIVIDE IS STILL CRANKING
+
+ fmovex %fp1,%fp0 // ...FP0 IS X'
+ fmulx %fp0,%fp0 // ...FP0 IS Y = X'*X'
+ fmovex %fp1,X(%a6) // ...X IS REALLY X'
+
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...FP1 IS Z = Y*Y
+
+ fmoved ATANC5,%fp3
+ fmoved ATANC4,%fp2
+
+ fmulx %fp1,%fp3 // ...Z*C5
+ fmulx %fp1,%fp2 // ...Z*B4
+
+ faddd ATANC3,%fp3 // ...C3+Z*C5
+ faddd ATANC2,%fp2 // ...C2+Z*C4
+
+ fmulx %fp3,%fp1 // ...Z*(C3+Z*C5), FP3 RELEASED
+ fmulx %fp0,%fp2 // ...Y*(C2+Z*C4)
+
+ faddd ATANC1,%fp1 // ...C1+Z*(C3+Z*C5)
+ fmulx X(%a6),%fp0 // ...X'*Y
+
+ faddx %fp2,%fp1 // ...[Y*(C2+Z*C4)]+[C1+Z*(C3+Z*C5)]
+
+
+ fmulx %fp1,%fp0 // ...X'*Y*([B1+Z*(B3+Z*B5)]
+// ... +[Y*(B2+Z*(B4+Z*B6))])
+ faddx X(%a6),%fp0
+
+ fmovel %d1,%FPCR //restore users exceptions
+
+ btstb #7,(%a0)
+ beqs pos_big
+
+neg_big:
+ faddx NPIBY2,%fp0
+ bra t_frcinx
+
+pos_big:
+ faddx PPIBY2,%fp0
+ bra t_frcinx
+
+ATANHUGE:
+//--RETURN SIGN(X)*(PIBY2 - TINY) = SIGN(X)*PIBY2 - SIGN(X)*TINY
+ btstb #7,(%a0)
+ beqs pos_huge
+
+neg_huge:
+ fmovex NPIBY2,%fp0
+ fmovel %d1,%fpcr
+ fsubx NTINY,%fp0
+ bra t_frcinx
+
+pos_huge:
+ fmovex PPIBY2,%fp0
+ fmovel %d1,%fpcr
+ fsubx PTINY,%fp0
+ bra t_frcinx
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/satanh.s b/c/src/lib/libcpu/m68k/m68040/fpsp/satanh.s
new file mode 100644
index 0000000000..6874f83e34
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/satanh.s
@@ -0,0 +1,104 @@
+//
+// satanh.sa 3.3 12/19/90
+//
+// The entry point satanh computes the inverse
+// hyperbolic tangent of
+// an input argument; satanhd does the same except for denormalized
+// input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value arctanh(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 3 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program satanh takes approximately 270 cycles.
+//
+// Algorithm:
+//
+// ATANH
+// 1. If |X| >= 1, go to 3.
+//
+// 2. (|X| < 1) Calculate atanh(X) by
+// sgn := sign(X)
+// y := |X|
+// z := 2y/(1-y)
+// atanh(X) := sgn * (1/2) * logp1(z)
+// Exit.
+//
+// 3. If |X| > 1, go to 5.
+//
+// 4. (|X| = 1) Generate infinity with an appropriate sign and
+// divide-by-zero by
+// sgn := sign(X)
+// atan(X) := sgn / (+0).
+// Exit.
+//
+// 5. (|X| > 1) Generate an invalid operation by 0 * infinity.
+// Exit.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//satanh idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ |xref t_dz
+ |xref t_operr
+ |xref t_frcinx
+ |xref t_extdnrm
+ |xref slognp1
+
+ .global satanhd
+satanhd:
+//--ATANH(X) = X FOR DENORMALIZED X
+
+ bra t_extdnrm
+
+ .global satanh
+satanh:
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ andil #0x7FFFFFFF,%d0
+ cmpil #0x3FFF8000,%d0
+ bges ATANHBIG
+
+//--THIS IS THE USUAL CASE, |X| < 1
+//--Y = |X|, Z = 2Y/(1-Y), ATANH(X) = SIGN(X) * (1/2) * LOG1P(Z).
+
+ fabsx (%a0),%fp0 // ...Y = |X|
+ fmovex %fp0,%fp1
+ fnegx %fp1 // ...-Y
+ faddx %fp0,%fp0 // ...2Y
+ fadds #0x3F800000,%fp1 // ...1-Y
+ fdivx %fp1,%fp0 // ...2Y/(1-Y)
+ movel (%a0),%d0
+ andil #0x80000000,%d0
+ oril #0x3F000000,%d0 // ...SIGN(X)*HALF
+ movel %d0,-(%sp)
+
+ fmovemx %fp0-%fp0,(%a0) // ...overwrite input
+ movel %d1,-(%sp)
+ clrl %d1
+ bsr slognp1 // ...LOG1P(Z)
+ fmovel (%sp)+,%fpcr
+ fmuls (%sp)+,%fp0
+ bra t_frcinx
+
+ATANHBIG:
+ fabsx (%a0),%fp0 // ...|X|
+ fcmps #0x3F800000,%fp0
+ fbgt t_operr
+ bra t_dz
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/scale.s b/c/src/lib/libcpu/m68k/m68040/fpsp/scale.s
new file mode 100644
index 0000000000..3e990d8d33
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/scale.s
@@ -0,0 +1,371 @@
+//
+// scale.sa 3.3 7/30/91
+//
+// The entry point sSCALE computes the destination operand
+// scaled by the source operand. If the absolute value of
+// the source operand is (>= 2^14) an overflow or underflow
+// is returned.
+//
+// The entry point sscale is called from do_func to emulate
+// the fscale unimplemented instruction.
+//
+// Input: Double-extended destination operand in FPTEMP,
+// double-extended source operand in ETEMP.
+//
+// Output: The function returns scale(X,Y) to fp0.
+//
+// Modifies: fp0.
+//
+// Algorithm:
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SCALE idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref t_ovfl2
+ |xref t_unfl
+ |xref round
+ |xref t_resdnrm
+
+SRC_BNDS: .short 0x3fff,0x400c
+
+//
+// This entry point is used by the unimplemented instruction exception
+// handler.
+//
+//
+//
+// FSCALE
+//
+ .global sscale
+sscale:
+ fmovel #0,%fpcr //clr user enabled exc
+ clrl %d1
+ movew FPTEMP(%a6),%d1 //get dest exponent
+ smi L_SCR1(%a6) //use L_SCR1 to hold sign
+ andil #0x7fff,%d1 //strip sign
+ movew ETEMP(%a6),%d0 //check src bounds
+ andiw #0x7fff,%d0 //clr sign bit
+ cmp2w SRC_BNDS,%d0
+ bccs src_in
+ cmpiw #0x400c,%d0 //test for too large
+ bge src_out
+//
+// The source input is below 1, so we check for denormalized numbers
+// and set unfl.
+//
+src_small:
+ moveb DTAG(%a6),%d0
+ andib #0xe0,%d0
+ tstb %d0
+ beqs no_denorm
+ st STORE_FLG(%a6) //dest already contains result
+ orl #unfl_mask,USER_FPSR(%a6) //set UNFL
+den_done:
+ leal FPTEMP(%a6),%a0
+ bra t_resdnrm
+no_denorm:
+ fmovel USER_FPCR(%a6),%FPCR
+ fmovex FPTEMP(%a6),%fp0 //simply return dest
+ rts
+
+
+//
+// Source is within 2^14 range. To perform the int operation,
+// move it to d0.
+//
+src_in:
+ fmovex ETEMP(%a6),%fp0 //move in src for int
+ fmovel #rz_mode,%fpcr //force rz for src conversion
+ fmovel %fp0,%d0 //int src to d0
+ fmovel #0,%FPSR //clr status from above
+ tstw ETEMP(%a6) //check src sign
+ blt src_neg
+//
+// Source is positive. Add the src to the dest exponent.
+// The result can be denormalized, if src = 0, or overflow,
+// if the result of the add sets a bit in the upper word.
+//
+src_pos:
+ tstw %d1 //check for denorm
+ beq dst_dnrm
+ addl %d0,%d1 //add src to dest exp
+ beqs denorm //if zero, result is denorm
+ cmpil #0x7fff,%d1 //test for overflow
+ bges ovfl
+ tstb L_SCR1(%a6)
+ beqs spos_pos
+ orw #0x8000,%d1
+spos_pos:
+ movew %d1,FPTEMP(%a6) //result in FPTEMP
+ fmovel USER_FPCR(%a6),%FPCR
+ fmovex FPTEMP(%a6),%fp0 //write result to fp0
+ rts
+ovfl:
+ tstb L_SCR1(%a6)
+ beqs sovl_pos
+ orw #0x8000,%d1
+sovl_pos:
+ movew FPTEMP(%a6),ETEMP(%a6) //result in ETEMP
+ movel FPTEMP_HI(%a6),ETEMP_HI(%a6)
+ movel FPTEMP_LO(%a6),ETEMP_LO(%a6)
+ bra t_ovfl2
+
+denorm:
+ tstb L_SCR1(%a6)
+ beqs den_pos
+ orw #0x8000,%d1
+den_pos:
+ tstl FPTEMP_HI(%a6) //check j bit
+ blts nden_exit //if set, not denorm
+ movew %d1,ETEMP(%a6) //input expected in ETEMP
+ movel FPTEMP_HI(%a6),ETEMP_HI(%a6)
+ movel FPTEMP_LO(%a6),ETEMP_LO(%a6)
+ orl #unfl_bit,USER_FPSR(%a6) //set unfl
+ leal ETEMP(%a6),%a0
+ bra t_resdnrm
+nden_exit:
+ movew %d1,FPTEMP(%a6) //result in FPTEMP
+ fmovel USER_FPCR(%a6),%FPCR
+ fmovex FPTEMP(%a6),%fp0 //write result to fp0
+ rts
+
+//
+// Source is negative. Add the src to the dest exponent.
+// (The result exponent will be reduced). The result can be
+// denormalized.
+//
+src_neg:
+ addl %d0,%d1 //add src to dest
+ beqs denorm //if zero, result is denorm
+ blts fix_dnrm //if negative, result is
+// ;needing denormalization
+ tstb L_SCR1(%a6)
+ beqs sneg_pos
+ orw #0x8000,%d1
+sneg_pos:
+ movew %d1,FPTEMP(%a6) //result in FPTEMP
+ fmovel USER_FPCR(%a6),%FPCR
+ fmovex FPTEMP(%a6),%fp0 //write result to fp0
+ rts
+
+
+//
+// The result exponent is below denorm value. Test for catastrophic
+// underflow and force zero if true. If not, try to shift the
+// mantissa right until a zero exponent exists.
+//
+fix_dnrm:
+ cmpiw #0xffc0,%d1 //lower bound for normalization
+ blt fix_unfl //if lower, catastrophic unfl
+ movew %d1,%d0 //use d0 for exp
+ movel %d2,-(%a7) //free d2 for norm
+ movel FPTEMP_HI(%a6),%d1
+ movel FPTEMP_LO(%a6),%d2
+ clrl L_SCR2(%a6)
+fix_loop:
+ addw #1,%d0 //drive d0 to 0
+ lsrl #1,%d1 //while shifting the
+ roxrl #1,%d2 //mantissa to the right
+ bccs no_carry
+ st L_SCR2(%a6) //use L_SCR2 to capture inex
+no_carry:
+ tstw %d0 //it is finished when
+ blts fix_loop //d0 is zero or the mantissa
+ tstb L_SCR2(%a6)
+ beqs tst_zero
+ orl #unfl_inx_mask,USER_FPSR(%a6)
+// ;set unfl, aunfl, ainex
+//
+// Test for zero. If zero, simply use fmove to return +/- zero
+// to the fpu.
+//
+tst_zero:
+ clrw FPTEMP_EX(%a6)
+ tstb L_SCR1(%a6) //test for sign
+ beqs tst_con
+ orw #0x8000,FPTEMP_EX(%a6) //set sign bit
+tst_con:
+ movel %d1,FPTEMP_HI(%a6)
+ movel %d2,FPTEMP_LO(%a6)
+ movel (%a7)+,%d2
+ tstl %d1
+ bnes not_zero
+ tstl FPTEMP_LO(%a6)
+ bnes not_zero
+//
+// Result is zero. Check for rounding mode to set lsb. If the
+// mode is rp, and the zero is positive, return smallest denorm.
+// If the mode is rm, and the zero is negative, return smallest
+// negative denorm.
+//
+ btstb #5,FPCR_MODE(%a6) //test if rm or rp
+ beqs no_dir
+ btstb #4,FPCR_MODE(%a6) //check which one
+ beqs zer_rm
+zer_rp:
+ tstb L_SCR1(%a6) //check sign
+ bnes no_dir //if set, neg op, no inc
+ movel #1,FPTEMP_LO(%a6) //set lsb
+ bras sm_dnrm
+zer_rm:
+ tstb L_SCR1(%a6) //check sign
+ beqs no_dir //if clr, neg op, no inc
+ movel #1,FPTEMP_LO(%a6) //set lsb
+ orl #neg_mask,USER_FPSR(%a6) //set N
+ bras sm_dnrm
+no_dir:
+ fmovel USER_FPCR(%a6),%FPCR
+ fmovex FPTEMP(%a6),%fp0 //use fmove to set cc's
+ rts
+
+//
+// The rounding mode changed the zero to a smallest denorm. Call
+// t_resdnrm with exceptional operand in ETEMP.
+//
+sm_dnrm:
+ movel FPTEMP_EX(%a6),ETEMP_EX(%a6)
+ movel FPTEMP_HI(%a6),ETEMP_HI(%a6)
+ movel FPTEMP_LO(%a6),ETEMP_LO(%a6)
+ leal ETEMP(%a6),%a0
+ bra t_resdnrm
+
+//
+// Result is still denormalized.
+//
+not_zero:
+ orl #unfl_mask,USER_FPSR(%a6) //set unfl
+ tstb L_SCR1(%a6) //check for sign
+ beqs fix_exit
+ orl #neg_mask,USER_FPSR(%a6) //set N
+fix_exit:
+ bras sm_dnrm
+
+
+//
+// The result has underflowed to zero. Return zero and set
+// unfl, aunfl, and ainex.
+//
+fix_unfl:
+ orl #unfl_inx_mask,USER_FPSR(%a6)
+ btstb #5,FPCR_MODE(%a6) //test if rm or rp
+ beqs no_dir2
+ btstb #4,FPCR_MODE(%a6) //check which one
+ beqs zer_rm2
+zer_rp2:
+ tstb L_SCR1(%a6) //check sign
+ bnes no_dir2 //if set, neg op, no inc
+ clrl FPTEMP_EX(%a6)
+ clrl FPTEMP_HI(%a6)
+ movel #1,FPTEMP_LO(%a6) //set lsb
+ bras sm_dnrm //return smallest denorm
+zer_rm2:
+ tstb L_SCR1(%a6) //check sign
+ beqs no_dir2 //if clr, neg op, no inc
+ movew #0x8000,FPTEMP_EX(%a6)
+ clrl FPTEMP_HI(%a6)
+ movel #1,FPTEMP_LO(%a6) //set lsb
+ orl #neg_mask,USER_FPSR(%a6) //set N
+ bra sm_dnrm //return smallest denorm
+
+no_dir2:
+ tstb L_SCR1(%a6)
+ bges pos_zero
+neg_zero:
+ clrl FP_SCR1(%a6) //clear the exceptional operand
+ clrl FP_SCR1+4(%a6) //for gen_except.
+ clrl FP_SCR1+8(%a6)
+ fmoves #0x80000000,%fp0
+ rts
+pos_zero:
+ clrl FP_SCR1(%a6) //clear the exceptional operand
+ clrl FP_SCR1+4(%a6) //for gen_except.
+ clrl FP_SCR1+8(%a6)
+ fmoves #0x00000000,%fp0
+ rts
+
+//
+// The destination is a denormalized number. It must be handled
+// by first shifting the bits in the mantissa until it is normalized,
+// then adding the remainder of the source to the exponent.
+//
+dst_dnrm:
+ moveml %d2/%d3,-(%a7)
+ movew FPTEMP_EX(%a6),%d1
+ movel FPTEMP_HI(%a6),%d2
+ movel FPTEMP_LO(%a6),%d3
+dst_loop:
+ tstl %d2 //test for normalized result
+ blts dst_norm //exit loop if so
+ tstl %d0 //otherwise, test shift count
+ beqs dst_fin //if zero, shifting is done
+ subil #1,%d0 //dec src
+ lsll #1,%d3
+ roxll #1,%d2
+ bras dst_loop
+//
+// Destination became normalized. Simply add the remaining
+// portion of the src to the exponent.
+//
+dst_norm:
+ addw %d0,%d1 //dst is normalized; add src
+ tstb L_SCR1(%a6)
+ beqs dnrm_pos
+ orl #0x8000,%d1
+dnrm_pos:
+ movemw %d1,FPTEMP_EX(%a6)
+ moveml %d2,FPTEMP_HI(%a6)
+ moveml %d3,FPTEMP_LO(%a6)
+ fmovel USER_FPCR(%a6),%FPCR
+ fmovex FPTEMP(%a6),%fp0
+ moveml (%a7)+,%d2/%d3
+ rts
+
+//
+// Destination remained denormalized. Call t_excdnrm with
+// exceptional operand in ETEMP.
+//
+dst_fin:
+ tstb L_SCR1(%a6) //check for sign
+ beqs dst_exit
+ orl #neg_mask,USER_FPSR(%a6) //set N
+ orl #0x8000,%d1
+dst_exit:
+ movemw %d1,ETEMP_EX(%a6)
+ moveml %d2,ETEMP_HI(%a6)
+ moveml %d3,ETEMP_LO(%a6)
+ orl #unfl_mask,USER_FPSR(%a6) //set unfl
+ moveml (%a7)+,%d2/%d3
+ leal ETEMP(%a6),%a0
+ bra t_resdnrm
+
+//
+// Source is outside of 2^14 range. Test the sign and branch
+// to the appropriate exception handler.
+//
+src_out:
+ tstb L_SCR1(%a6)
+ beqs scro_pos
+ orl #0x8000,%d1
+scro_pos:
+ movel FPTEMP_HI(%a6),ETEMP_HI(%a6)
+ movel FPTEMP_LO(%a6),ETEMP_LO(%a6)
+ tstw ETEMP(%a6)
+ blts res_neg
+res_pos:
+ movew %d1,ETEMP(%a6) //result in ETEMP
+ bra t_ovfl2
+res_neg:
+ movew %d1,ETEMP(%a6) //result in ETEMP
+ leal ETEMP(%a6),%a0
+ bra t_unfl
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s b/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s
new file mode 100644
index 0000000000..cf603883be
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/scosh.s
@@ -0,0 +1,132 @@
+//
+// scosh.sa 3.1 12/10/90
+//
+// The entry point sCosh computes the hyperbolic cosine of
+// an input argument; sCoshd does the same except for denormalized
+// input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value cosh(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 3 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program sCOSH takes approximately 250 cycles.
+//
+// Algorithm:
+//
+// COSH
+// 1. If |X| > 16380 log2, go to 3.
+//
+// 2. (|X| <= 16380 log2) Cosh(X) is obtained by the formulae
+// y = |X|, z = exp(Y), and
+// cosh(X) = (1/2)*( z + 1/z ).
+// Exit.
+//
+// 3. (|X| > 16380 log2). If |X| > 16480 log2, go to 5.
+//
+// 4. (16380 log2 < |X| <= 16480 log2)
+// cosh(X) = sign(X) * exp(|X|)/2.
+// However, invoking exp(|X|) may cause premature overflow.
+// Thus, we calculate sinh(X) as follows:
+// Y := |X|
+// Fact := 2**(16380)
+// Y' := Y - 16381 log2
+// cosh(X) := Fact * exp(Y').
+// Exit.
+//
+// 5. (|X| > 16480 log2) sinh(X) must overflow. Return
+// Huge*Huge to generate overflow and an infinity with
+// the appropriate sign. Huge is the largest finite number in
+// extended format. Exit.
+//
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SCOSH idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ |xref t_ovfl
+ |xref t_frcinx
+ |xref setox
+
+T1: .long 0x40C62D38,0xD3D64634 // ... 16381 LOG2 LEAD
+T2: .long 0x3D6F90AE,0xB1E75CC7 // ... 16381 LOG2 TRAIL
+
+TWO16380: .long 0x7FFB0000,0x80000000,0x00000000,0x00000000
+
+ .global scoshd
+scoshd:
+//--COSH(X) = 1 FOR DENORMALIZED X
+
+ fmoves #0x3F800000,%fp0
+
+ fmovel %d1,%FPCR
+ fadds #0x00800000,%fp0
+ bra t_frcinx
+
+ .global scosh
+scosh:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ andil #0x7FFFFFFF,%d0
+ cmpil #0x400CB167,%d0
+ bgts COSHBIG
+
+//--THIS IS THE USUAL CASE, |X| < 16380 LOG2
+//--COSH(X) = (1/2) * ( EXP(X) + 1/EXP(X) )
+
+ fabsx %fp0 // ...|X|
+
+ movel %d1,-(%sp)
+ clrl %d1
+ fmovemx %fp0-%fp0,(%a0) //pass parameter to setox
+ bsr setox // ...FP0 IS EXP(|X|)
+ fmuls #0x3F000000,%fp0 // ...(1/2)EXP(|X|)
+ movel (%sp)+,%d1
+
+ fmoves #0x3E800000,%fp1 // ...(1/4)
+ fdivx %fp0,%fp1 // ...1/(2 EXP(|X|))
+
+ fmovel %d1,%FPCR
+ faddx %fp1,%fp0
+
+ bra t_frcinx
+
+COSHBIG:
+ cmpil #0x400CB2B3,%d0
+ bgts COSHHUGE
+
+ fabsx %fp0
+ fsubd T1(%pc),%fp0 // ...(|X|-16381LOG2_LEAD)
+ fsubd T2(%pc),%fp0 // ...|X| - 16381 LOG2, ACCURATE
+
+ movel %d1,-(%sp)
+ clrl %d1
+ fmovemx %fp0-%fp0,(%a0)
+ bsr setox
+ fmovel (%sp)+,%fpcr
+
+ fmulx TWO16380(%pc),%fp0
+ bra t_frcinx
+
+COSHHUGE:
+ fmovel #0,%fpsr //clr N bit if set by source
+ bclrb #7,(%a0) //always return positive value
+ fmovemx (%a0),%fp0-%fp0
+ bra t_ovfl
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/setox.s b/c/src/lib/libcpu/m68k/m68040/fpsp/setox.s
new file mode 100644
index 0000000000..2caf829b06
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/setox.s
@@ -0,0 +1,865 @@
+//
+// setox.sa 3.1 12/10/90
+//
+// The entry point setox computes the exponential of a value.
+// setoxd does the same except the input value is a denormalized
+// number. setoxm1 computes exp(X)-1, and setoxm1d computes
+// exp(X)-1 for denormalized X.
+//
+// INPUT
+// -----
+// Double-extended value in memory location pointed to by address
+// register a0.
+//
+// OUTPUT
+// ------
+// exp(X) or exp(X)-1 returned in floating-point register fp0.
+//
+// ACCURACY and MONOTONICITY
+// -------------------------
+// The returned result is within 0.85 ulps in 64 significant bit, i.e.
+// within 0.5001 ulp to 53 bits if the result is subsequently rounded
+// to double precision. The result is provably monotonic in double
+// precision.
+//
+// SPEED
+// -----
+// Two timings are measured, both in the copy-back mode. The
+// first one is measured when the function is invoked the first time
+// (so the instructions and data are not in cache), and the
+// second one is measured when the function is reinvoked at the same
+// input argument.
+//
+// The program setox takes approximately 210/190 cycles for input
+// argument X whose magnitude is less than 16380 log2, which
+// is the usual situation. For the less common arguments,
+// depending on their values, the program may run faster or slower --
+// but no worse than 10% slower even in the extreme cases.
+//
+// The program setoxm1 takes approximately ???/??? cycles for input
+// argument X, 0.25 <= |X| < 70log2. For |X| < 0.25, it takes
+// approximately ???/??? cycles. For the less common arguments,
+// depending on their values, the program may run faster or slower --
+// but no worse than 10% slower even in the extreme cases.
+//
+// ALGORITHM and IMPLEMENTATION NOTES
+// ----------------------------------
+//
+// setoxd
+// ------
+// Step 1. Set ans := 1.0
+//
+// Step 2. Return ans := ans + sign(X)*2^(-126). Exit.
+// Notes: This will always generate one exception -- inexact.
+//
+//
+// setox
+// -----
+//
+// Step 1. Filter out extreme cases of input argument.
+// 1.1 If |X| >= 2^(-65), go to Step 1.3.
+// 1.2 Go to Step 7.
+// 1.3 If |X| < 16380 log(2), go to Step 2.
+// 1.4 Go to Step 8.
+// Notes: The usual case should take the branches 1.1 -> 1.3 -> 2.
+// To avoid the use of floating-point comparisons, a
+// compact representation of |X| is used. This format is a
+// 32-bit integer, the upper (more significant) 16 bits are
+// the sign and biased exponent field of |X|; the lower 16
+// bits are the 16 most significant fraction (including the
+// explicit bit) bits of |X|. Consequently, the comparisons
+// in Steps 1.1 and 1.3 can be performed by integer comparison.
+// Note also that the constant 16380 log(2) used in Step 1.3
+// is also in the compact form. Thus taking the branch
+// to Step 2 guarantees |X| < 16380 log(2). There is no harm
+// to have a small number of cases where |X| is less than,
+// but close to, 16380 log(2) and the branch to Step 9 is
+// taken.
+//
+// Step 2. Calculate N = round-to-nearest-int( X * 64/log2 ).
+// 2.1 Set AdjFlag := 0 (indicates the branch 1.3 -> 2 was taken)
+// 2.2 N := round-to-nearest-integer( X * 64/log2 ).
+// 2.3 Calculate J = N mod 64; so J = 0,1,2,..., or 63.
+// 2.4 Calculate M = (N - J)/64; so N = 64M + J.
+// 2.5 Calculate the address of the stored value of 2^(J/64).
+// 2.6 Create the value Scale = 2^M.
+// Notes: The calculation in 2.2 is really performed by
+//
+// Z := X * constant
+// N := round-to-nearest-integer(Z)
+//
+// where
+//
+// constant := single-precision( 64/log 2 ).
+//
+// Using a single-precision constant avoids memory access.
+// Another effect of using a single-precision "constant" is
+// that the calculated value Z is
+//
+// Z = X*(64/log2)*(1+eps), |eps| <= 2^(-24).
+//
+// This error has to be considered later in Steps 3 and 4.
+//
+// Step 3. Calculate X - N*log2/64.
+// 3.1 R := X + N*L1, where L1 := single-precision(-log2/64).
+// 3.2 R := R + N*L2, L2 := extended-precision(-log2/64 - L1).
+// Notes: a) The way L1 and L2 are chosen ensures L1+L2 approximate
+// the value -log2/64 to 88 bits of accuracy.
+// b) N*L1 is exact because N is no longer than 22 bits and
+// L1 is no longer than 24 bits.
+// c) The calculation X+N*L1 is also exact due to cancellation.
+// Thus, R is practically X+N(L1+L2) to full 64 bits.
+// d) It is important to estimate how large can |R| be after
+// Step 3.2.
+//
+// N = rnd-to-int( X*64/log2 (1+eps) ), |eps|<=2^(-24)
+// X*64/log2 (1+eps) = N + f, |f| <= 0.5
+// X*64/log2 - N = f - eps*X 64/log2
+// X - N*log2/64 = f*log2/64 - eps*X
+//
+//
+// Now |X| <= 16446 log2, thus
+//
+// |X - N*log2/64| <= (0.5 + 16446/2^(18))*log2/64
+// <= 0.57 log2/64.
+// This bound will be used in Step 4.
+//
+// Step 4. Approximate exp(R)-1 by a polynomial
+// p = R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*A5))))
+// Notes: a) In order to reduce memory access, the coefficients are
+// made as "short" as possible: A1 (which is 1/2), A4 and A5
+// are single precision; A2 and A3 are double precision.
+// b) Even with the restrictions above,
+// |p - (exp(R)-1)| < 2^(-68.8) for all |R| <= 0.0062.
+// Note that 0.0062 is slightly bigger than 0.57 log2/64.
+// c) To fully utilize the pipeline, p is separated into
+// two independent pieces of roughly equal complexities
+// p = [ R + R*S*(A2 + S*A4) ] +
+// [ S*(A1 + S*(A3 + S*A5)) ]
+// where S = R*R.
+//
+// Step 5. Compute 2^(J/64)*exp(R) = 2^(J/64)*(1+p) by
+// ans := T + ( T*p + t)
+// where T and t are the stored values for 2^(J/64).
+// Notes: 2^(J/64) is stored as T and t where T+t approximates
+// 2^(J/64) to roughly 85 bits; T is in extended precision
+// and t is in single precision. Note also that T is rounded
+// to 62 bits so that the last two bits of T are zero. The
+// reason for such a special form is that T-1, T-2, and T-8
+// will all be exact --- a property that will give much
+// more accurate computation of the function EXPM1.
+//
+// Step 6. Reconstruction of exp(X)
+// exp(X) = 2^M * 2^(J/64) * exp(R).
+// 6.1 If AdjFlag = 0, go to 6.3
+// 6.2 ans := ans * AdjScale
+// 6.3 Restore the user FPCR
+// 6.4 Return ans := ans * Scale. Exit.
+// Notes: If AdjFlag = 0, we have X = Mlog2 + Jlog2/64 + R,
+// |M| <= 16380, and Scale = 2^M. Moreover, exp(X) will
+// neither overflow nor underflow. If AdjFlag = 1, that
+// means that
+// X = (M1+M)log2 + Jlog2/64 + R, |M1+M| >= 16380.
+// Hence, exp(X) may overflow or underflow or neither.
+// When that is the case, AdjScale = 2^(M1) where M1 is
+// approximately M. Thus 6.2 will never cause over/underflow.
+// Possible exception in 6.4 is overflow or underflow.
+// The inexact exception is not generated in 6.4. Although
+// one can argue that the inexact flag should always be
+// raised, to simulate that exception cost to much than the
+// flag is worth in practical uses.
+//
+// Step 7. Return 1 + X.
+// 7.1 ans := X
+// 7.2 Restore user FPCR.
+// 7.3 Return ans := 1 + ans. Exit
+// Notes: For non-zero X, the inexact exception will always be
+// raised by 7.3. That is the only exception raised by 7.3.
+// Note also that we use the FMOVEM instruction to move X
+// in Step 7.1 to avoid unnecessary trapping. (Although
+// the FMOVEM may not seem relevant since X is normalized,
+// the precaution will be useful in the library version of
+// this code where the separate entry for denormalized inputs
+// will be done away with.)
+//
+// Step 8. Handle exp(X) where |X| >= 16380log2.
+// 8.1 If |X| > 16480 log2, go to Step 9.
+// (mimic 2.2 - 2.6)
+// 8.2 N := round-to-integer( X * 64/log2 )
+// 8.3 Calculate J = N mod 64, J = 0,1,...,63
+// 8.4 K := (N-J)/64, M1 := truncate(K/2), M = K-M1, AdjFlag := 1.
+// 8.5 Calculate the address of the stored value 2^(J/64).
+// 8.6 Create the values Scale = 2^M, AdjScale = 2^M1.
+// 8.7 Go to Step 3.
+// Notes: Refer to notes for 2.2 - 2.6.
+//
+// Step 9. Handle exp(X), |X| > 16480 log2.
+// 9.1 If X < 0, go to 9.3
+// 9.2 ans := Huge, go to 9.4
+// 9.3 ans := Tiny.
+// 9.4 Restore user FPCR.
+// 9.5 Return ans := ans * ans. Exit.
+// Notes: Exp(X) will surely overflow or underflow, depending on
+// X's sign. "Huge" and "Tiny" are respectively large/tiny
+// extended-precision numbers whose square over/underflow
+// with an inexact result. Thus, 9.5 always raises the
+// inexact together with either overflow or underflow.
+//
+//
+// setoxm1d
+// --------
+//
+// Step 1. Set ans := 0
+//
+// Step 2. Return ans := X + ans. Exit.
+// Notes: This will return X with the appropriate rounding
+// precision prescribed by the user FPCR.
+//
+// setoxm1
+// -------
+//
+// Step 1. Check |X|
+// 1.1 If |X| >= 1/4, go to Step 1.3.
+// 1.2 Go to Step 7.
+// 1.3 If |X| < 70 log(2), go to Step 2.
+// 1.4 Go to Step 10.
+// Notes: The usual case should take the branches 1.1 -> 1.3 -> 2.
+// However, it is conceivable |X| can be small very often
+// because EXPM1 is intended to evaluate exp(X)-1 accurately
+// when |X| is small. For further details on the comparisons,
+// see the notes on Step 1 of setox.
+//
+// Step 2. Calculate N = round-to-nearest-int( X * 64/log2 ).
+// 2.1 N := round-to-nearest-integer( X * 64/log2 ).
+// 2.2 Calculate J = N mod 64; so J = 0,1,2,..., or 63.
+// 2.3 Calculate M = (N - J)/64; so N = 64M + J.
+// 2.4 Calculate the address of the stored value of 2^(J/64).
+// 2.5 Create the values Sc = 2^M and OnebySc := -2^(-M).
+// Notes: See the notes on Step 2 of setox.
+//
+// Step 3. Calculate X - N*log2/64.
+// 3.1 R := X + N*L1, where L1 := single-precision(-log2/64).
+// 3.2 R := R + N*L2, L2 := extended-precision(-log2/64 - L1).
+// Notes: Applying the analysis of Step 3 of setox in this case
+// shows that |R| <= 0.0055 (note that |X| <= 70 log2 in
+// this case).
+//
+// Step 4. Approximate exp(R)-1 by a polynomial
+// p = R+R*R*(A1+R*(A2+R*(A3+R*(A4+R*(A5+R*A6)))))
+// Notes: a) In order to reduce memory access, the coefficients are
+// made as "short" as possible: A1 (which is 1/2), A5 and A6
+// are single precision; A2, A3 and A4 are double precision.
+// b) Even with the restriction above,
+// |p - (exp(R)-1)| < |R| * 2^(-72.7)
+// for all |R| <= 0.0055.
+// c) To fully utilize the pipeline, p is separated into
+// two independent pieces of roughly equal complexity
+// p = [ R*S*(A2 + S*(A4 + S*A6)) ] +
+// [ R + S*(A1 + S*(A3 + S*A5)) ]
+// where S = R*R.
+//
+// Step 5. Compute 2^(J/64)*p by
+// p := T*p
+// where T and t are the stored values for 2^(J/64).
+// Notes: 2^(J/64) is stored as T and t where T+t approximates
+// 2^(J/64) to roughly 85 bits; T is in extended precision
+// and t is in single precision. Note also that T is rounded
+// to 62 bits so that the last two bits of T are zero. The
+// reason for such a special form is that T-1, T-2, and T-8
+// will all be exact --- a property that will be exploited
+// in Step 6 below. The total relative error in p is no
+// bigger than 2^(-67.7) compared to the final result.
+//
+// Step 6. Reconstruction of exp(X)-1
+// exp(X)-1 = 2^M * ( 2^(J/64) + p - 2^(-M) ).
+// 6.1 If M <= 63, go to Step 6.3.
+// 6.2 ans := T + (p + (t + OnebySc)). Go to 6.6
+// 6.3 If M >= -3, go to 6.5.
+// 6.4 ans := (T + (p + t)) + OnebySc. Go to 6.6
+// 6.5 ans := (T + OnebySc) + (p + t).
+// 6.6 Restore user FPCR.
+// 6.7 Return ans := Sc * ans. Exit.
+// Notes: The various arrangements of the expressions give accurate
+// evaluations.
+//
+// Step 7. exp(X)-1 for |X| < 1/4.
+// 7.1 If |X| >= 2^(-65), go to Step 9.
+// 7.2 Go to Step 8.
+//
+// Step 8. Calculate exp(X)-1, |X| < 2^(-65).
+// 8.1 If |X| < 2^(-16312), goto 8.3
+// 8.2 Restore FPCR; return ans := X - 2^(-16382). Exit.
+// 8.3 X := X * 2^(140).
+// 8.4 Restore FPCR; ans := ans - 2^(-16382).
+// Return ans := ans*2^(140). Exit
+// Notes: The idea is to return "X - tiny" under the user
+// precision and rounding modes. To avoid unnecessary
+// inefficiency, we stay away from denormalized numbers the
+// best we can. For |X| >= 2^(-16312), the straightforward
+// 8.2 generates the inexact exception as the case warrants.
+//
+// Step 9. Calculate exp(X)-1, |X| < 1/4, by a polynomial
+// p = X + X*X*(B1 + X*(B2 + ... + X*B12))
+// Notes: a) In order to reduce memory access, the coefficients are
+// made as "short" as possible: B1 (which is 1/2), B9 to B12
+// are single precision; B3 to B8 are double precision; and
+// B2 is double extended.
+// b) Even with the restriction above,
+// |p - (exp(X)-1)| < |X| 2^(-70.6)
+// for all |X| <= 0.251.
+// Note that 0.251 is slightly bigger than 1/4.
+// c) To fully preserve accuracy, the polynomial is computed
+// as X + ( S*B1 + Q ) where S = X*X and
+// Q = X*S*(B2 + X*(B3 + ... + X*B12))
+// d) To fully utilize the pipeline, Q is separated into
+// two independent pieces of roughly equal complexity
+// Q = [ X*S*(B2 + S*(B4 + ... + S*B12)) ] +
+// [ S*S*(B3 + S*(B5 + ... + S*B11)) ]
+//
+// Step 10. Calculate exp(X)-1 for |X| >= 70 log 2.
+// 10.1 If X >= 70log2 , exp(X) - 1 = exp(X) for all practical
+// purposes. Therefore, go to Step 1 of setox.
+// 10.2 If X <= -70log2, exp(X) - 1 = -1 for all practical purposes.
+// ans := -1
+// Restore user FPCR
+// Return ans := ans + 2^(-126). Exit.
+// Notes: 10.2 will always create an inexact and return -1 + tiny
+// in the user rounding precision and mode.
+//
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//setox idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+L2: .long 0x3FDC0000,0x82E30865,0x4361C4C6,0x00000000
+
+EXPA3: .long 0x3FA55555,0x55554431
+EXPA2: .long 0x3FC55555,0x55554018
+
+HUGE: .long 0x7FFE0000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
+TINY: .long 0x00010000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
+
+EM1A4: .long 0x3F811111,0x11174385
+EM1A3: .long 0x3FA55555,0x55554F5A
+
+EM1A2: .long 0x3FC55555,0x55555555,0x00000000,0x00000000
+
+EM1B8: .long 0x3EC71DE3,0xA5774682
+EM1B7: .long 0x3EFA01A0,0x19D7CB68
+
+EM1B6: .long 0x3F2A01A0,0x1A019DF3
+EM1B5: .long 0x3F56C16C,0x16C170E2
+
+EM1B4: .long 0x3F811111,0x11111111
+EM1B3: .long 0x3FA55555,0x55555555
+
+EM1B2: .long 0x3FFC0000,0xAAAAAAAA,0xAAAAAAAB
+ .long 0x00000000
+
+TWO140: .long 0x48B00000,0x00000000
+TWON140: .long 0x37300000,0x00000000
+
+EXPTBL:
+ .long 0x3FFF0000,0x80000000,0x00000000,0x00000000
+ .long 0x3FFF0000,0x8164D1F3,0xBC030774,0x9F841A9B
+ .long 0x3FFF0000,0x82CD8698,0xAC2BA1D8,0x9FC1D5B9
+ .long 0x3FFF0000,0x843A28C3,0xACDE4048,0xA0728369
+ .long 0x3FFF0000,0x85AAC367,0xCC487B14,0x1FC5C95C
+ .long 0x3FFF0000,0x871F6196,0x9E8D1010,0x1EE85C9F
+ .long 0x3FFF0000,0x88980E80,0x92DA8528,0x9FA20729
+ .long 0x3FFF0000,0x8A14D575,0x496EFD9C,0xA07BF9AF
+ .long 0x3FFF0000,0x8B95C1E3,0xEA8BD6E8,0xA0020DCF
+ .long 0x3FFF0000,0x8D1ADF5B,0x7E5BA9E4,0x205A63DA
+ .long 0x3FFF0000,0x8EA4398B,0x45CD53C0,0x1EB70051
+ .long 0x3FFF0000,0x9031DC43,0x1466B1DC,0x1F6EB029
+ .long 0x3FFF0000,0x91C3D373,0xAB11C338,0xA0781494
+ .long 0x3FFF0000,0x935A2B2F,0x13E6E92C,0x9EB319B0
+ .long 0x3FFF0000,0x94F4EFA8,0xFEF70960,0x2017457D
+ .long 0x3FFF0000,0x96942D37,0x20185A00,0x1F11D537
+ .long 0x3FFF0000,0x9837F051,0x8DB8A970,0x9FB952DD
+ .long 0x3FFF0000,0x99E04593,0x20B7FA64,0x1FE43087
+ .long 0x3FFF0000,0x9B8D39B9,0xD54E5538,0x1FA2A818
+ .long 0x3FFF0000,0x9D3ED9A7,0x2CFFB750,0x1FDE494D
+ .long 0x3FFF0000,0x9EF53260,0x91A111AC,0x20504890
+ .long 0x3FFF0000,0xA0B0510F,0xB9714FC4,0xA073691C
+ .long 0x3FFF0000,0xA2704303,0x0C496818,0x1F9B7A05
+ .long 0x3FFF0000,0xA43515AE,0x09E680A0,0xA0797126
+ .long 0x3FFF0000,0xA5FED6A9,0xB15138EC,0xA071A140
+ .long 0x3FFF0000,0xA7CD93B4,0xE9653568,0x204F62DA
+ .long 0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x1F283C4A
+ .long 0x3FFF0000,0xAB7A39B5,0xA93ED338,0x9F9A7FDC
+ .long 0x3FFF0000,0xAD583EEA,0x42A14AC8,0xA05B3FAC
+ .long 0x3FFF0000,0xAF3B78AD,0x690A4374,0x1FDF2610
+ .long 0x3FFF0000,0xB123F581,0xD2AC2590,0x9F705F90
+ .long 0x3FFF0000,0xB311C412,0xA9112488,0x201F678A
+ .long 0x3FFF0000,0xB504F333,0xF9DE6484,0x1F32FB13
+ .long 0x3FFF0000,0xB6FD91E3,0x28D17790,0x20038B30
+ .long 0x3FFF0000,0xB8FBAF47,0x62FB9EE8,0x200DC3CC
+ .long 0x3FFF0000,0xBAFF5AB2,0x133E45FC,0x9F8B2AE6
+ .long 0x3FFF0000,0xBD08A39F,0x580C36C0,0xA02BBF70
+ .long 0x3FFF0000,0xBF1799B6,0x7A731084,0xA00BF518
+ .long 0x3FFF0000,0xC12C4CCA,0x66709458,0xA041DD41
+ .long 0x3FFF0000,0xC346CCDA,0x24976408,0x9FDF137B
+ .long 0x3FFF0000,0xC5672A11,0x5506DADC,0x201F1568
+ .long 0x3FFF0000,0xC78D74C8,0xABB9B15C,0x1FC13A2E
+ .long 0x3FFF0000,0xC9B9BD86,0x6E2F27A4,0xA03F8F03
+ .long 0x3FFF0000,0xCBEC14FE,0xF2727C5C,0x1FF4907D
+ .long 0x3FFF0000,0xCE248C15,0x1F8480E4,0x9E6E53E4
+ .long 0x3FFF0000,0xD06333DA,0xEF2B2594,0x1FD6D45C
+ .long 0x3FFF0000,0xD2A81D91,0xF12AE45C,0xA076EDB9
+ .long 0x3FFF0000,0xD4F35AAB,0xCFEDFA20,0x9FA6DE21
+ .long 0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x1EE69A2F
+ .long 0x3FFF0000,0xD99D15C2,0x78AFD7B4,0x207F439F
+ .long 0x3FFF0000,0xDBFBB797,0xDAF23754,0x201EC207
+ .long 0x3FFF0000,0xDE60F482,0x5E0E9124,0x9E8BE175
+ .long 0x3FFF0000,0xE0CCDEEC,0x2A94E110,0x20032C4B
+ .long 0x3FFF0000,0xE33F8972,0xBE8A5A50,0x2004DFF5
+ .long 0x3FFF0000,0xE5B906E7,0x7C8348A8,0x1E72F47A
+ .long 0x3FFF0000,0xE8396A50,0x3C4BDC68,0x1F722F22
+ .long 0x3FFF0000,0xEAC0C6E7,0xDD243930,0xA017E945
+ .long 0x3FFF0000,0xED4F301E,0xD9942B84,0x1F401A5B
+ .long 0x3FFF0000,0xEFE4B99B,0xDCDAF5CC,0x9FB9A9E3
+ .long 0x3FFF0000,0xF281773C,0x59FFB138,0x20744C05
+ .long 0x3FFF0000,0xF5257D15,0x2486CC2C,0x1F773A19
+ .long 0x3FFF0000,0xF7D0DF73,0x0AD13BB8,0x1FFE90D5
+ .long 0x3FFF0000,0xFA83B2DB,0x722A033C,0xA041ED22
+ .long 0x3FFF0000,0xFD3E0C0C,0xF486C174,0x1F853F3A
+
+ .set ADJFLAG,L_SCR2
+ .set SCALE,FP_SCR1
+ .set ADJSCALE,FP_SCR2
+ .set SC,FP_SCR3
+ .set ONEBYSC,FP_SCR4
+
+ | xref t_frcinx
+ |xref t_extdnrm
+ |xref t_unfl
+ |xref t_ovfl
+
+ .global setoxd
+setoxd:
+//--entry point for EXP(X), X is denormalized
+ movel (%a0),%d0
+ andil #0x80000000,%d0
+ oril #0x00800000,%d0 // ...sign(X)*2^(-126)
+ movel %d0,-(%sp)
+ fmoves #0x3F800000,%fp0
+ fmovel %d1,%fpcr
+ fadds (%sp)+,%fp0
+ bra t_frcinx
+
+ .global setox
+setox:
+//--entry point for EXP(X), here X is finite, non-zero, and not NaN's
+
+//--Step 1.
+ movel (%a0),%d0 // ...load part of input X
+ andil #0x7FFF0000,%d0 // ...biased expo. of X
+ cmpil #0x3FBE0000,%d0 // ...2^(-65)
+ bges EXPC1 // ...normal case
+ bra EXPSM
+
+EXPC1:
+//--The case |X| >= 2^(-65)
+ movew 4(%a0),%d0 // ...expo. and partial sig. of |X|
+ cmpil #0x400CB167,%d0 // ...16380 log2 trunc. 16 bits
+ blts EXPMAIN // ...normal case
+ bra EXPBIG
+
+EXPMAIN:
+//--Step 2.
+//--This is the normal branch: 2^(-65) <= |X| < 16380 log2.
+ fmovex (%a0),%fp0 // ...load input from (a0)
+
+ fmovex %fp0,%fp1
+ fmuls #0x42B8AA3B,%fp0 // ...64/log2 * X
+ fmovemx %fp2-%fp2/%fp3,-(%a7) // ...save fp2
+ movel #0,ADJFLAG(%a6)
+ fmovel %fp0,%d0 // ...N = int( X * 64/log2 )
+ lea EXPTBL,%a1
+ fmovel %d0,%fp0 // ...convert to floating-format
+
+ movel %d0,L_SCR1(%a6) // ...save N temporarily
+ andil #0x3F,%d0 // ...D0 is J = N mod 64
+ lsll #4,%d0
+ addal %d0,%a1 // ...address of 2^(J/64)
+ movel L_SCR1(%a6),%d0
+ asrl #6,%d0 // ...D0 is M
+ addiw #0x3FFF,%d0 // ...biased expo. of 2^(M)
+ movew L2,L_SCR1(%a6) // ...prefetch L2, no need in CB
+
+EXPCONT1:
+//--Step 3.
+//--fp1,fp2 saved on the stack. fp0 is N, fp1 is X,
+//--a0 points to 2^(J/64), D0 is biased expo. of 2^(M)
+ fmovex %fp0,%fp2
+ fmuls #0xBC317218,%fp0 // ...N * L1, L1 = lead(-log2/64)
+ fmulx L2,%fp2 // ...N * L2, L1+L2 = -log2/64
+ faddx %fp1,%fp0 // ...X + N*L1
+ faddx %fp2,%fp0 // ...fp0 is R, reduced arg.
+// MOVE.W #$3FA5,EXPA3 ...load EXPA3 in cache
+
+//--Step 4.
+//--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL
+//-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*A5))))
+//--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE S = R*R
+//--[R+R*S*(A2+S*A4)] + [S*(A1+S*(A3+S*A5))]
+
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...fp1 IS S = R*R
+
+ fmoves #0x3AB60B70,%fp2 // ...fp2 IS A5
+// MOVE.W #0,2(%a1) ...load 2^(J/64) in cache
+
+ fmulx %fp1,%fp2 // ...fp2 IS S*A5
+ fmovex %fp1,%fp3
+ fmuls #0x3C088895,%fp3 // ...fp3 IS S*A4
+
+ faddd EXPA3,%fp2 // ...fp2 IS A3+S*A5
+ faddd EXPA2,%fp3 // ...fp3 IS A2+S*A4
+
+ fmulx %fp1,%fp2 // ...fp2 IS S*(A3+S*A5)
+ movew %d0,SCALE(%a6) // ...SCALE is 2^(M) in extended
+ clrw SCALE+2(%a6)
+ movel #0x80000000,SCALE+4(%a6)
+ clrl SCALE+8(%a6)
+
+ fmulx %fp1,%fp3 // ...fp3 IS S*(A2+S*A4)
+
+ fadds #0x3F000000,%fp2 // ...fp2 IS A1+S*(A3+S*A5)
+ fmulx %fp0,%fp3 // ...fp3 IS R*S*(A2+S*A4)
+
+ fmulx %fp1,%fp2 // ...fp2 IS S*(A1+S*(A3+S*A5))
+ faddx %fp3,%fp0 // ...fp0 IS R+R*S*(A2+S*A4),
+// ...fp3 released
+
+ fmovex (%a1)+,%fp1 // ...fp1 is lead. pt. of 2^(J/64)
+ faddx %fp2,%fp0 // ...fp0 is EXP(R) - 1
+// ...fp2 released
+
+//--Step 5
+//--final reconstruction process
+//--EXP(X) = 2^M * ( 2^(J/64) + 2^(J/64)*(EXP(R)-1) )
+
+ fmulx %fp1,%fp0 // ...2^(J/64)*(Exp(R)-1)
+ fmovemx (%a7)+,%fp2-%fp2/%fp3 // ...fp2 restored
+ fadds (%a1),%fp0 // ...accurate 2^(J/64)
+
+ faddx %fp1,%fp0 // ...2^(J/64) + 2^(J/64)*...
+ movel ADJFLAG(%a6),%d0
+
+//--Step 6
+ tstl %d0
+ beqs NORMAL
+ADJUST:
+ fmulx ADJSCALE(%a6),%fp0
+NORMAL:
+ fmovel %d1,%FPCR // ...restore user FPCR
+ fmulx SCALE(%a6),%fp0 // ...multiply 2^(M)
+ bra t_frcinx
+
+EXPSM:
+//--Step 7
+ fmovemx (%a0),%fp0-%fp0 // ...in case X is denormalized
+ fmovel %d1,%FPCR
+ fadds #0x3F800000,%fp0 // ...1+X in user mode
+ bra t_frcinx
+
+EXPBIG:
+//--Step 8
+ cmpil #0x400CB27C,%d0 // ...16480 log2
+ bgts EXP2BIG
+//--Steps 8.2 -- 8.6
+ fmovex (%a0),%fp0 // ...load input from (a0)
+
+ fmovex %fp0,%fp1
+ fmuls #0x42B8AA3B,%fp0 // ...64/log2 * X
+ fmovemx %fp2-%fp2/%fp3,-(%a7) // ...save fp2
+ movel #1,ADJFLAG(%a6)
+ fmovel %fp0,%d0 // ...N = int( X * 64/log2 )
+ lea EXPTBL,%a1
+ fmovel %d0,%fp0 // ...convert to floating-format
+ movel %d0,L_SCR1(%a6) // ...save N temporarily
+ andil #0x3F,%d0 // ...D0 is J = N mod 64
+ lsll #4,%d0
+ addal %d0,%a1 // ...address of 2^(J/64)
+ movel L_SCR1(%a6),%d0
+ asrl #6,%d0 // ...D0 is K
+ movel %d0,L_SCR1(%a6) // ...save K temporarily
+ asrl #1,%d0 // ...D0 is M1
+ subl %d0,L_SCR1(%a6) // ...a1 is M
+ addiw #0x3FFF,%d0 // ...biased expo. of 2^(M1)
+ movew %d0,ADJSCALE(%a6) // ...ADJSCALE := 2^(M1)
+ clrw ADJSCALE+2(%a6)
+ movel #0x80000000,ADJSCALE+4(%a6)
+ clrl ADJSCALE+8(%a6)
+ movel L_SCR1(%a6),%d0 // ...D0 is M
+ addiw #0x3FFF,%d0 // ...biased expo. of 2^(M)
+ bra EXPCONT1 // ...go back to Step 3
+
+EXP2BIG:
+//--Step 9
+ fmovel %d1,%FPCR
+ movel (%a0),%d0
+ bclrb #sign_bit,(%a0) // ...setox always returns positive
+ cmpil #0,%d0
+ blt t_unfl
+ bra t_ovfl
+
+ .global setoxm1d
+setoxm1d:
+//--entry point for EXPM1(X), here X is denormalized
+//--Step 0.
+ bra t_extdnrm
+
+
+ .global setoxm1
+setoxm1:
+//--entry point for EXPM1(X), here X is finite, non-zero, non-NaN
+
+//--Step 1.
+//--Step 1.1
+ movel (%a0),%d0 // ...load part of input X
+ andil #0x7FFF0000,%d0 // ...biased expo. of X
+ cmpil #0x3FFD0000,%d0 // ...1/4
+ bges EM1CON1 // ...|X| >= 1/4
+ bra EM1SM
+
+EM1CON1:
+//--Step 1.3
+//--The case |X| >= 1/4
+ movew 4(%a0),%d0 // ...expo. and partial sig. of |X|
+ cmpil #0x4004C215,%d0 // ...70log2 rounded up to 16 bits
+ bles EM1MAIN // ...1/4 <= |X| <= 70log2
+ bra EM1BIG
+
+EM1MAIN:
+//--Step 2.
+//--This is the case: 1/4 <= |X| <= 70 log2.
+ fmovex (%a0),%fp0 // ...load input from (a0)
+
+ fmovex %fp0,%fp1
+ fmuls #0x42B8AA3B,%fp0 // ...64/log2 * X
+ fmovemx %fp2-%fp2/%fp3,-(%a7) // ...save fp2
+// MOVE.W #$3F81,EM1A4 ...prefetch in CB mode
+ fmovel %fp0,%d0 // ...N = int( X * 64/log2 )
+ lea EXPTBL,%a1
+ fmovel %d0,%fp0 // ...convert to floating-format
+
+ movel %d0,L_SCR1(%a6) // ...save N temporarily
+ andil #0x3F,%d0 // ...D0 is J = N mod 64
+ lsll #4,%d0
+ addal %d0,%a1 // ...address of 2^(J/64)
+ movel L_SCR1(%a6),%d0
+ asrl #6,%d0 // ...D0 is M
+ movel %d0,L_SCR1(%a6) // ...save a copy of M
+// MOVE.W #$3FDC,L2 ...prefetch L2 in CB mode
+
+//--Step 3.
+//--fp1,fp2 saved on the stack. fp0 is N, fp1 is X,
+//--a0 points to 2^(J/64), D0 and a1 both contain M
+ fmovex %fp0,%fp2
+ fmuls #0xBC317218,%fp0 // ...N * L1, L1 = lead(-log2/64)
+ fmulx L2,%fp2 // ...N * L2, L1+L2 = -log2/64
+ faddx %fp1,%fp0 // ...X + N*L1
+ faddx %fp2,%fp0 // ...fp0 is R, reduced arg.
+// MOVE.W #$3FC5,EM1A2 ...load EM1A2 in cache
+ addiw #0x3FFF,%d0 // ...D0 is biased expo. of 2^M
+
+//--Step 4.
+//--WE NOW COMPUTE EXP(R)-1 BY A POLYNOMIAL
+//-- R + R*R*(A1 + R*(A2 + R*(A3 + R*(A4 + R*(A5 + R*A6)))))
+//--TO FULLY UTILIZE THE PIPELINE, WE COMPUTE S = R*R
+//--[R*S*(A2+S*(A4+S*A6))] + [R+S*(A1+S*(A3+S*A5))]
+
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...fp1 IS S = R*R
+
+ fmoves #0x3950097B,%fp2 // ...fp2 IS a6
+// MOVE.W #0,2(%a1) ...load 2^(J/64) in cache
+
+ fmulx %fp1,%fp2 // ...fp2 IS S*A6
+ fmovex %fp1,%fp3
+ fmuls #0x3AB60B6A,%fp3 // ...fp3 IS S*A5
+
+ faddd EM1A4,%fp2 // ...fp2 IS A4+S*A6
+ faddd EM1A3,%fp3 // ...fp3 IS A3+S*A5
+ movew %d0,SC(%a6) // ...SC is 2^(M) in extended
+ clrw SC+2(%a6)
+ movel #0x80000000,SC+4(%a6)
+ clrl SC+8(%a6)
+
+ fmulx %fp1,%fp2 // ...fp2 IS S*(A4+S*A6)
+ movel L_SCR1(%a6),%d0 // ...D0 is M
+ negw %d0 // ...D0 is -M
+ fmulx %fp1,%fp3 // ...fp3 IS S*(A3+S*A5)
+ addiw #0x3FFF,%d0 // ...biased expo. of 2^(-M)
+ faddd EM1A2,%fp2 // ...fp2 IS A2+S*(A4+S*A6)
+ fadds #0x3F000000,%fp3 // ...fp3 IS A1+S*(A3+S*A5)
+
+ fmulx %fp1,%fp2 // ...fp2 IS S*(A2+S*(A4+S*A6))
+ oriw #0x8000,%d0 // ...signed/expo. of -2^(-M)
+ movew %d0,ONEBYSC(%a6) // ...OnebySc is -2^(-M)
+ clrw ONEBYSC+2(%a6)
+ movel #0x80000000,ONEBYSC+4(%a6)
+ clrl ONEBYSC+8(%a6)
+ fmulx %fp3,%fp1 // ...fp1 IS S*(A1+S*(A3+S*A5))
+// ...fp3 released
+
+ fmulx %fp0,%fp2 // ...fp2 IS R*S*(A2+S*(A4+S*A6))
+ faddx %fp1,%fp0 // ...fp0 IS R+S*(A1+S*(A3+S*A5))
+// ...fp1 released
+
+ faddx %fp2,%fp0 // ...fp0 IS EXP(R)-1
+// ...fp2 released
+ fmovemx (%a7)+,%fp2-%fp2/%fp3 // ...fp2 restored
+
+//--Step 5
+//--Compute 2^(J/64)*p
+
+ fmulx (%a1),%fp0 // ...2^(J/64)*(Exp(R)-1)
+
+//--Step 6
+//--Step 6.1
+ movel L_SCR1(%a6),%d0 // ...retrieve M
+ cmpil #63,%d0
+ bles MLE63
+//--Step 6.2 M >= 64
+ fmoves 12(%a1),%fp1 // ...fp1 is t
+ faddx ONEBYSC(%a6),%fp1 // ...fp1 is t+OnebySc
+ faddx %fp1,%fp0 // ...p+(t+OnebySc), fp1 released
+ faddx (%a1),%fp0 // ...T+(p+(t+OnebySc))
+ bras EM1SCALE
+MLE63:
+//--Step 6.3 M <= 63
+ cmpil #-3,%d0
+ bges MGEN3
+MLTN3:
+//--Step 6.4 M <= -4
+ fadds 12(%a1),%fp0 // ...p+t
+ faddx (%a1),%fp0 // ...T+(p+t)
+ faddx ONEBYSC(%a6),%fp0 // ...OnebySc + (T+(p+t))
+ bras EM1SCALE
+MGEN3:
+//--Step 6.5 -3 <= M <= 63
+ fmovex (%a1)+,%fp1 // ...fp1 is T
+ fadds (%a1),%fp0 // ...fp0 is p+t
+ faddx ONEBYSC(%a6),%fp1 // ...fp1 is T+OnebySc
+ faddx %fp1,%fp0 // ...(T+OnebySc)+(p+t)
+
+EM1SCALE:
+//--Step 6.6
+ fmovel %d1,%FPCR
+ fmulx SC(%a6),%fp0
+
+ bra t_frcinx
+
+EM1SM:
+//--Step 7 |X| < 1/4.
+ cmpil #0x3FBE0000,%d0 // ...2^(-65)
+ bges EM1POLY
+
+EM1TINY:
+//--Step 8 |X| < 2^(-65)
+ cmpil #0x00330000,%d0 // ...2^(-16312)
+ blts EM12TINY
+//--Step 8.2
+ movel #0x80010000,SC(%a6) // ...SC is -2^(-16382)
+ movel #0x80000000,SC+4(%a6)
+ clrl SC+8(%a6)
+ fmovex (%a0),%fp0
+ fmovel %d1,%FPCR
+ faddx SC(%a6),%fp0
+
+ bra t_frcinx
+
+EM12TINY:
+//--Step 8.3
+ fmovex (%a0),%fp0
+ fmuld TWO140,%fp0
+ movel #0x80010000,SC(%a6)
+ movel #0x80000000,SC+4(%a6)
+ clrl SC+8(%a6)
+ faddx SC(%a6),%fp0
+ fmovel %d1,%FPCR
+ fmuld TWON140,%fp0
+
+ bra t_frcinx
+
+EM1POLY:
+//--Step 9 exp(X)-1 by a simple polynomial
+ fmovex (%a0),%fp0 // ...fp0 is X
+ fmulx %fp0,%fp0 // ...fp0 is S := X*X
+ fmovemx %fp2-%fp2/%fp3,-(%a7) // ...save fp2
+ fmoves #0x2F30CAA8,%fp1 // ...fp1 is B12
+ fmulx %fp0,%fp1 // ...fp1 is S*B12
+ fmoves #0x310F8290,%fp2 // ...fp2 is B11
+ fadds #0x32D73220,%fp1 // ...fp1 is B10+S*B12
+
+ fmulx %fp0,%fp2 // ...fp2 is S*B11
+ fmulx %fp0,%fp1 // ...fp1 is S*(B10 + ...
+
+ fadds #0x3493F281,%fp2 // ...fp2 is B9+S*...
+ faddd EM1B8,%fp1 // ...fp1 is B8+S*...
+
+ fmulx %fp0,%fp2 // ...fp2 is S*(B9+...
+ fmulx %fp0,%fp1 // ...fp1 is S*(B8+...
+
+ faddd EM1B7,%fp2 // ...fp2 is B7+S*...
+ faddd EM1B6,%fp1 // ...fp1 is B6+S*...
+
+ fmulx %fp0,%fp2 // ...fp2 is S*(B7+...
+ fmulx %fp0,%fp1 // ...fp1 is S*(B6+...
+
+ faddd EM1B5,%fp2 // ...fp2 is B5+S*...
+ faddd EM1B4,%fp1 // ...fp1 is B4+S*...
+
+ fmulx %fp0,%fp2 // ...fp2 is S*(B5+...
+ fmulx %fp0,%fp1 // ...fp1 is S*(B4+...
+
+ faddd EM1B3,%fp2 // ...fp2 is B3+S*...
+ faddx EM1B2,%fp1 // ...fp1 is B2+S*...
+
+ fmulx %fp0,%fp2 // ...fp2 is S*(B3+...
+ fmulx %fp0,%fp1 // ...fp1 is S*(B2+...
+
+ fmulx %fp0,%fp2 // ...fp2 is S*S*(B3+...)
+ fmulx (%a0),%fp1 // ...fp1 is X*S*(B2...
+
+ fmuls #0x3F000000,%fp0 // ...fp0 is S*B1
+ faddx %fp2,%fp1 // ...fp1 is Q
+// ...fp2 released
+
+ fmovemx (%a7)+,%fp2-%fp2/%fp3 // ...fp2 restored
+
+ faddx %fp1,%fp0 // ...fp0 is S*B1+Q
+// ...fp1 released
+
+ fmovel %d1,%FPCR
+ faddx (%a0),%fp0
+
+ bra t_frcinx
+
+EM1BIG:
+//--Step 10 |X| > 70 log2
+ movel (%a0),%d0
+ cmpil #0,%d0
+ bgt EXPC1
+//--Step 10.2
+ fmoves #0xBF800000,%fp0 // ...fp0 is -1
+ fmovel %d1,%FPCR
+ fadds #0x00800000,%fp0 // ...-1 + 2^(-126)
+
+ bra t_frcinx
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s b/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s
new file mode 100644
index 0000000000..ca3cc09085
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/sgetem.s
@@ -0,0 +1,141 @@
+//
+// sgetem.sa 3.1 12/10/90
+//
+// The entry point sGETEXP returns the exponent portion
+// of the input argument. The exponent bias is removed
+// and the exponent value is returned as an extended
+// precision number in fp0. sGETEXPD handles denormalized
+// numbers.
+//
+// The entry point sGETMAN extracts the mantissa of the
+// input argument. The mantissa is converted to an
+// extended precision number and returned in fp0. The
+// range of the result is [1.0 - 2.0).
+//
+//
+// Input: Double-extended number X in the ETEMP space in
+// the floating-point save stack.
+//
+// Output: The functions return exp(X) or man(X) in fp0.
+//
+// Modified: fp0.
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SGETEM idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref nrm_set
+
+//
+// This entry point is used by the unimplemented instruction exception
+// handler. It points a0 to the input operand.
+//
+//
+//
+// SGETEXP
+//
+
+ .global sgetexp
+sgetexp:
+ movew LOCAL_EX(%a0),%d0 //get the exponent
+ bclrl #15,%d0 //clear the sign bit
+ subw #0x3fff,%d0 //subtract off the bias
+ fmovew %d0,%fp0 //move the exp to fp0
+ rts
+
+ .global sgetexpd
+sgetexpd:
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ bsr nrm_set //normalize (exp will go negative)
+ movew LOCAL_EX(%a0),%d0 //load resulting exponent into d0
+ subw #0x3fff,%d0 //subtract off the bias
+ fmovew %d0,%fp0 //move the exp to fp0
+ rts
+//
+//
+// This entry point is used by the unimplemented instruction exception
+// handler. It points a0 to the input operand.
+//
+//
+//
+// SGETMAN
+//
+//
+// For normalized numbers, leave the mantissa alone, simply load
+// with an exponent of +/- $3fff.
+//
+ .global sgetman
+sgetman:
+ movel USER_FPCR(%a6),%d0
+ andil #0xffffff00,%d0 //clear rounding precision and mode
+ fmovel %d0,%fpcr //this fpcr setting is used by the 882
+ movew LOCAL_EX(%a0),%d0 //get the exp (really just want sign bit)
+ orw #0x7fff,%d0 //clear old exp
+ bclrl #14,%d0 //make it the new exp +-3fff
+ movew %d0,LOCAL_EX(%a0) //move the sign & exp back to fsave stack
+ fmovex (%a0),%fp0 //put new value back in fp0
+ rts
+
+//
+// For denormalized numbers, shift the mantissa until the j-bit = 1,
+// then load the exponent with +/1 $3fff.
+//
+ .global sgetmand
+sgetmand:
+ movel LOCAL_HI(%a0),%d0 //load ms mant in d0
+ movel LOCAL_LO(%a0),%d1 //load ls mant in d1
+ bsr shft //shift mantissa bits till msbit is set
+ movel %d0,LOCAL_HI(%a0) //put ms mant back on stack
+ movel %d1,LOCAL_LO(%a0) //put ls mant back on stack
+ bras sgetman
+
+//
+// SHFT
+//
+// Shifts the mantissa bits until msbit is set.
+// input:
+// ms mantissa part in d0
+// ls mantissa part in d1
+// output:
+// shifted bits in d0 and d1
+shft:
+ tstl %d0 //if any bits set in ms mant
+ bnes upper //then branch
+// ;else no bits set in ms mant
+ tstl %d1 //test if any bits set in ls mant
+ bnes cont //if set then continue
+ bras shft_end //else return
+cont:
+ movel %d3,-(%a7) //save d3
+ exg %d0,%d1 //shift ls mant to ms mant
+ bfffo %d0{#0:#32},%d3 //find first 1 in ls mant to d0
+ lsll %d3,%d0 //shift first 1 to integer bit in ms mant
+ movel (%a7)+,%d3 //restore d3
+ bras shft_end
+upper:
+
+ moveml %d3/%d5/%d6,-(%a7) //save registers
+ bfffo %d0{#0:#32},%d3 //find first 1 in ls mant to d0
+ lsll %d3,%d0 //shift ms mant until j-bit is set
+ movel %d1,%d6 //save ls mant in d6
+ lsll %d3,%d1 //shift ls mant by count
+ movel #32,%d5
+ subl %d3,%d5 //sub 32 from shift for ls mant
+ lsrl %d5,%d6 //shift off all bits but those that will
+// ;be shifted into ms mant
+ orl %d6,%d0 //shift the ls mant bits into the ms mant
+ moveml (%a7)+,%d3/%d5/%d6 //restore registers
+shft_end:
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/sint.s b/c/src/lib/libcpu/m68k/m68040/fpsp/sint.s
new file mode 100644
index 0000000000..9cfd6c67ed
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/sint.s
@@ -0,0 +1,247 @@
+//
+// sint.sa 3.1 12/10/90
+//
+// The entry point sINT computes the rounded integer
+// equivalent of the input argument, sINTRZ computes
+// the integer rounded to zero of the input argument.
+//
+// Entry points sint and sintrz are called from do_func
+// to emulate the fint and fintrz unimplemented instructions,
+// respectively. Entry point sintdo is used by bindec.
+//
+// Input: (Entry points sint and sintrz) Double-extended
+// number X in the ETEMP space in the floating-point
+// save stack.
+// (Entry point sintdo) Double-extended number X in
+// location pointed to by the address register a0.
+// (Entry point sintd) Double-extended denormalized
+// number X in the ETEMP space in the floating-point
+// save stack.
+//
+// Output: The function returns int(X) or intrz(X) in fp0.
+//
+// Modifies: fp0.
+//
+// Algorithm: (sint and sintrz)
+//
+// 1. If exp(X) >= 63, return X.
+// If exp(X) < 0, return +/- 0 or +/- 1, according to
+// the rounding mode.
+//
+// 2. (X is in range) set rsc = 63 - exp(X). Unnormalize the
+// result to the exponent $403e.
+//
+// 3. Round the result in the mode given in USER_FPCR. For
+// sintrz, force round-to-zero mode.
+//
+// 4. Normalize the rounded result; store in fp0.
+//
+// For the denormalized cases, force the correct result
+// for the given sign and rounding mode.
+//
+// Sign(X)
+// RMODE + -
+// ----- --------
+// RN +0 -0
+// RZ +0 -0
+// RM +0 -1
+// RP +1 -0
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SINT idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref dnrm_lp
+ |xref nrm_set
+ |xref round
+ |xref t_inx2
+ |xref ld_pone
+ |xref ld_mone
+ |xref ld_pzero
+ |xref ld_mzero
+ |xref snzrinx
+
+//
+// FINT
+//
+ .global sint
+sint:
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //use user's mode for rounding
+// ;implicitly has extend precision
+// ;in upper word.
+ movel %d1,L_SCR1(%a6) //save mode bits
+ bras sintexc
+
+//
+// FINT with extended denorm inputs.
+//
+ .global sintd
+sintd:
+ btstb #5,FPCR_MODE(%a6)
+ beq snzrinx //if round nearest or round zero, +/- 0
+ btstb #4,FPCR_MODE(%a6)
+ beqs rnd_mns
+rnd_pls:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ bnes sintmz
+ bsr ld_pone //if round plus inf and pos, answer is +1
+ bra t_inx2
+rnd_mns:
+ btstb #sign_bit,LOCAL_EX(%a0)
+ beqs sintpz
+ bsr ld_mone //if round mns inf and neg, answer is -1
+ bra t_inx2
+sintpz:
+ bsr ld_pzero
+ bra t_inx2
+sintmz:
+ bsr ld_mzero
+ bra t_inx2
+
+//
+// FINTRZ
+//
+ .global sintrz
+sintrz:
+ movel #1,L_SCR1(%a6) //use rz mode for rounding
+// ;implicitly has extend precision
+// ;in upper word.
+ bras sintexc
+//
+// SINTDO
+//
+// Input: a0 points to an IEEE extended format operand
+// Output: fp0 has the result
+//
+// Exceptions:
+//
+// If the subroutine results in an inexact operation, the inx2 and
+// ainx bits in the USER_FPSR are set.
+//
+//
+ .global sintdo
+sintdo:
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //use user's mode for rounding
+// ;implicitly has ext precision
+// ;in upper word.
+ movel %d1,L_SCR1(%a6) //save mode bits
+//
+// Real work of sint is in sintexc
+//
+sintexc:
+ bclrb #sign_bit,LOCAL_EX(%a0) //convert to internal extended
+// ;format
+ sne LOCAL_SGN(%a0)
+ cmpw #0x403e,LOCAL_EX(%a0) //check if (unbiased) exp > 63
+ bgts out_rnge //branch if exp < 63
+ cmpw #0x3ffd,LOCAL_EX(%a0) //check if (unbiased) exp < 0
+ bgt in_rnge //if 63 >= exp > 0, do calc
+//
+// Input is less than zero. Restore sign, and check for directed
+// rounding modes. L_SCR1 contains the rmode in the lower byte.
+//
+un_rnge:
+ btstb #1,L_SCR1+3(%a6) //check for rn and rz
+ beqs un_rnrz
+ tstb LOCAL_SGN(%a0) //check for sign
+ bnes un_rmrp_neg
+//
+// Sign is +. If rp, load +1.0, if rm, load +0.0
+//
+ cmpib #3,L_SCR1+3(%a6) //check for rp
+ beqs un_ldpone //if rp, load +1.0
+ bsr ld_pzero //if rm, load +0.0
+ bra t_inx2
+un_ldpone:
+ bsr ld_pone
+ bra t_inx2
+//
+// Sign is -. If rm, load -1.0, if rp, load -0.0
+//
+un_rmrp_neg:
+ cmpib #2,L_SCR1+3(%a6) //check for rm
+ beqs un_ldmone //if rm, load -1.0
+ bsr ld_mzero //if rp, load -0.0
+ bra t_inx2
+un_ldmone:
+ bsr ld_mone
+ bra t_inx2
+//
+// Rmode is rn or rz; return signed zero
+//
+un_rnrz:
+ tstb LOCAL_SGN(%a0) //check for sign
+ bnes un_rnrz_neg
+ bsr ld_pzero
+ bra t_inx2
+un_rnrz_neg:
+ bsr ld_mzero
+ bra t_inx2
+
+//
+// Input is greater than 2^63. All bits are significant. Return
+// the input.
+//
+out_rnge:
+ bfclr LOCAL_SGN(%a0){#0:#8} //change back to IEEE ext format
+ beqs intps
+ bsetb #sign_bit,LOCAL_EX(%a0)
+intps:
+ fmovel %fpcr,-(%sp)
+ fmovel #0,%fpcr
+ fmovex LOCAL_EX(%a0),%fp0 //if exp > 63
+// ;then return X to the user
+// ;there are no fraction bits
+ fmovel (%sp)+,%fpcr
+ rts
+
+in_rnge:
+// ;shift off fraction bits
+ clrl %d0 //clear d0 - initial g,r,s for
+// ;dnrm_lp
+ movel #0x403e,%d1 //set threshold for dnrm_lp
+// ;assumes a0 points to operand
+ bsr dnrm_lp
+// ;returns unnormalized number
+// ;pointed by a0
+// ;output d0 supplies g,r,s
+// ;used by round
+ movel L_SCR1(%a6),%d1 //use selected rounding mode
+//
+//
+ bsr round //round the unnorm based on users
+// ;input a0 ptr to ext X
+// ; d0 g,r,s bits
+// ; d1 PREC/MODE info
+// ;output a0 ptr to rounded result
+// ;inexact flag set in USER_FPSR
+// ;if initial grs set
+//
+// normalize the rounded result and store value in fp0
+//
+ bsr nrm_set //normalize the unnorm
+// ;Input: a0 points to operand to
+// ;be normalized
+// ;Output: a0 points to normalized
+// ;result
+ bfclr LOCAL_SGN(%a0){#0:#8}
+ beqs nrmrndp
+ bsetb #sign_bit,LOCAL_EX(%a0) //return to IEEE extended format
+nrmrndp:
+ fmovel %fpcr,-(%sp)
+ fmovel #0,%fpcr
+ fmovex LOCAL_EX(%a0),%fp0 //move result to fp0
+ fmovel (%sp)+,%fpcr
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/slog2.s b/c/src/lib/libcpu/m68k/m68040/fpsp/slog2.s
new file mode 100644
index 0000000000..b65e6f7b16
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/slog2.s
@@ -0,0 +1,188 @@
+//
+// slog2.sa 3.1 12/10/90
+//
+// The entry point slog10 computes the base-10
+// logarithm of an input argument X.
+// slog10d does the same except the input value is a
+// denormalized number.
+// sLog2 and sLog2d are the base-2 analogues.
+//
+// INPUT: Double-extended value in memory location pointed to
+// by address register a0.
+//
+// OUTPUT: log_10(X) or log_2(X) returned in floating-point
+// register fp0.
+//
+// ACCURACY and MONOTONICITY: The returned result is within 1.7
+// ulps in 64 significant bit, i.e. within 0.5003 ulp
+// to 53 bits if the result is subsequently rounded
+// to double precision. The result is provably monotonic
+// in double precision.
+//
+// SPEED: Two timings are measured, both in the copy-back mode.
+// The first one is measured when the function is invoked
+// the first time (so the instructions and data are not
+// in cache), and the second one is measured when the
+// function is reinvoked at the same input argument.
+//
+// ALGORITHM and IMPLEMENTATION NOTES:
+//
+// slog10d:
+//
+// Step 0. If X < 0, create a NaN and raise the invalid operation
+// flag. Otherwise, save FPCR in D1; set FpCR to default.
+// Notes: Default means round-to-nearest mode, no floating-point
+// traps, and precision control = double extended.
+//
+// Step 1. Call slognd to obtain Y = log(X), the natural log of X.
+// Notes: Even if X is denormalized, log(X) is always normalized.
+//
+// Step 2. Compute log_10(X) = log(X) * (1/log(10)).
+// 2.1 Restore the user FPCR
+// 2.2 Return ans := Y * INV_L10.
+//
+//
+// slog10:
+//
+// Step 0. If X < 0, create a NaN and raise the invalid operation
+// flag. Otherwise, save FPCR in D1; set FpCR to default.
+// Notes: Default means round-to-nearest mode, no floating-point
+// traps, and precision control = double extended.
+//
+// Step 1. Call sLogN to obtain Y = log(X), the natural log of X.
+//
+// Step 2. Compute log_10(X) = log(X) * (1/log(10)).
+// 2.1 Restore the user FPCR
+// 2.2 Return ans := Y * INV_L10.
+//
+//
+// sLog2d:
+//
+// Step 0. If X < 0, create a NaN and raise the invalid operation
+// flag. Otherwise, save FPCR in D1; set FpCR to default.
+// Notes: Default means round-to-nearest mode, no floating-point
+// traps, and precision control = double extended.
+//
+// Step 1. Call slognd to obtain Y = log(X), the natural log of X.
+// Notes: Even if X is denormalized, log(X) is always normalized.
+//
+// Step 2. Compute log_10(X) = log(X) * (1/log(2)).
+// 2.1 Restore the user FPCR
+// 2.2 Return ans := Y * INV_L2.
+//
+//
+// sLog2:
+//
+// Step 0. If X < 0, create a NaN and raise the invalid operation
+// flag. Otherwise, save FPCR in D1; set FpCR to default.
+// Notes: Default means round-to-nearest mode, no floating-point
+// traps, and precision control = double extended.
+//
+// Step 1. If X is not an integer power of two, i.e., X != 2^k,
+// go to Step 3.
+//
+// Step 2. Return k.
+// 2.1 Get integer k, X = 2^k.
+// 2.2 Restore the user FPCR.
+// 2.3 Return ans := convert-to-double-extended(k).
+//
+// Step 3. Call sLogN to obtain Y = log(X), the natural log of X.
+//
+// Step 4. Compute log_2(X) = log(X) * (1/log(2)).
+// 4.1 Restore the user FPCR
+// 4.2 Return ans := Y * INV_L2.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SLOG2 idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ |xref t_frcinx
+ |xref t_operr
+ |xref slogn
+ |xref slognd
+
+INV_L10: .long 0x3FFD0000,0xDE5BD8A9,0x37287195,0x00000000
+
+INV_L2: .long 0x3FFF0000,0xB8AA3B29,0x5C17F0BC,0x00000000
+
+ .global slog10d
+slog10d:
+//--entry point for Log10(X), X is denormalized
+ movel (%a0),%d0
+ blt invalid
+ movel %d1,-(%sp)
+ clrl %d1
+ bsr slognd // ...log(X), X denorm.
+ fmovel (%sp)+,%fpcr
+ fmulx INV_L10,%fp0
+ bra t_frcinx
+
+ .global slog10
+slog10:
+//--entry point for Log10(X), X is normalized
+
+ movel (%a0),%d0
+ blt invalid
+ movel %d1,-(%sp)
+ clrl %d1
+ bsr slogn // ...log(X), X normal.
+ fmovel (%sp)+,%fpcr
+ fmulx INV_L10,%fp0
+ bra t_frcinx
+
+
+ .global slog2d
+slog2d:
+//--entry point for Log2(X), X is denormalized
+
+ movel (%a0),%d0
+ blt invalid
+ movel %d1,-(%sp)
+ clrl %d1
+ bsr slognd // ...log(X), X denorm.
+ fmovel (%sp)+,%fpcr
+ fmulx INV_L2,%fp0
+ bra t_frcinx
+
+ .global slog2
+slog2:
+//--entry point for Log2(X), X is normalized
+ movel (%a0),%d0
+ blt invalid
+
+ movel 8(%a0),%d0
+ bnes continue // ...X is not 2^k
+
+ movel 4(%a0),%d0
+ andl #0x7FFFFFFF,%d0
+ tstl %d0
+ bnes continue
+
+//--X = 2^k.
+ movew (%a0),%d0
+ andl #0x00007FFF,%d0
+ subl #0x3FFF,%d0
+ fmovel %d1,%fpcr
+ fmovel %d0,%fp0
+ bra t_frcinx
+
+continue:
+ movel %d1,-(%sp)
+ clrl %d1
+ bsr slogn // ...log(X), X normal.
+ fmovel (%sp)+,%fpcr
+ fmulx INV_L2,%fp0
+ bra t_frcinx
+
+invalid:
+ bra t_operr
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/slogn.s b/c/src/lib/libcpu/m68k/m68040/fpsp/slogn.s
new file mode 100644
index 0000000000..74cb5f99eb
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/slogn.s
@@ -0,0 +1,592 @@
+//
+// slogn.sa 3.1 12/10/90
+//
+// slogn computes the natural logarithm of an
+// input value. slognd does the same except the input value is a
+// denormalized number. slognp1 computes log(1+X), and slognp1d
+// computes log(1+X) for denormalized X.
+//
+// Input: Double-extended value in memory location pointed to by address
+// register a0.
+//
+// Output: log(X) or log(1+X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 2 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program slogn takes approximately 190 cycles for input
+// argument X such that |X-1| >= 1/16, which is the the usual
+// situation. For those arguments, slognp1 takes approximately
+// 210 cycles. For the less common arguments, the program will
+// run no worse than 10% slower.
+//
+// Algorithm:
+// LOGN:
+// Step 1. If |X-1| < 1/16, approximate log(X) by an odd polynomial in
+// u, where u = 2(X-1)/(X+1). Otherwise, move on to Step 2.
+//
+// Step 2. X = 2**k * Y where 1 <= Y < 2. Define F to be the first seven
+// significant bits of Y plus 2**(-7), i.e. F = 1.xxxxxx1 in base
+// 2 where the six "x" match those of Y. Note that |Y-F| <= 2**(-7).
+//
+// Step 3. Define u = (Y-F)/F. Approximate log(1+u) by a polynomial in u,
+// log(1+u) = poly.
+//
+// Step 4. Reconstruct log(X) = log( 2**k * Y ) = k*log(2) + log(F) + log(1+u)
+// by k*log(2) + (log(F) + poly). The values of log(F) are calculated
+// beforehand and stored in the program.
+//
+// lognp1:
+// Step 1: If |X| < 1/16, approximate log(1+X) by an odd polynomial in
+// u where u = 2X/(2+X). Otherwise, move on to Step 2.
+//
+// Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done in Step 2
+// of the algorithm for LOGN and compute log(1+X) as
+// k*log(2) + log(F) + poly where poly approximates log(1+u),
+// u = (Y-F)/F.
+//
+// Implementation Notes:
+// Note 1. There are 64 different possible values for F, thus 64 log(F)'s
+// need to be tabulated. Moreover, the values of 1/F are also
+// tabulated so that the division in (Y-F)/F can be performed by a
+// multiplication.
+//
+// Note 2. In Step 2 of lognp1, in order to preserved accuracy, the value
+// Y-F has to be calculated carefully when 1/2 <= X < 3/2.
+//
+// Note 3. To fully exploit the pipeline, polynomials are usually separated
+// into two parts evaluated independently before being added up.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//slogn idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+BOUNDS1: .long 0x3FFEF07D,0x3FFF8841
+BOUNDS2: .long 0x3FFE8000,0x3FFFC000
+
+LOGOF2: .long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
+
+one: .long 0x3F800000
+zero: .long 0x00000000
+infty: .long 0x7F800000
+negone: .long 0xBF800000
+
+LOGA6: .long 0x3FC2499A,0xB5E4040B
+LOGA5: .long 0xBFC555B5,0x848CB7DB
+
+LOGA4: .long 0x3FC99999,0x987D8730
+LOGA3: .long 0xBFCFFFFF,0xFF6F7E97
+
+LOGA2: .long 0x3FD55555,0x555555a4
+LOGA1: .long 0xBFE00000,0x00000008
+
+LOGB5: .long 0x3F175496,0xADD7DAD6
+LOGB4: .long 0x3F3C71C2,0xFE80C7E0
+
+LOGB3: .long 0x3F624924,0x928BCCFF
+LOGB2: .long 0x3F899999,0x999995EC
+
+LOGB1: .long 0x3FB55555,0x55555555
+TWO: .long 0x40000000,0x00000000
+
+LTHOLD: .long 0x3f990000,0x80000000,0x00000000,0x00000000
+
+LOGTBL:
+ .long 0x3FFE0000,0xFE03F80F,0xE03F80FE,0x00000000
+ .long 0x3FF70000,0xFF015358,0x833C47E2,0x00000000
+ .long 0x3FFE0000,0xFA232CF2,0x52138AC0,0x00000000
+ .long 0x3FF90000,0xBDC8D83E,0xAD88D549,0x00000000
+ .long 0x3FFE0000,0xF6603D98,0x0F6603DA,0x00000000
+ .long 0x3FFA0000,0x9CF43DCF,0xF5EAFD48,0x00000000
+ .long 0x3FFE0000,0xF2B9D648,0x0F2B9D65,0x00000000
+ .long 0x3FFA0000,0xDA16EB88,0xCB8DF614,0x00000000
+ .long 0x3FFE0000,0xEF2EB71F,0xC4345238,0x00000000
+ .long 0x3FFB0000,0x8B29B775,0x1BD70743,0x00000000
+ .long 0x3FFE0000,0xEBBDB2A5,0xC1619C8C,0x00000000
+ .long 0x3FFB0000,0xA8D839F8,0x30C1FB49,0x00000000
+ .long 0x3FFE0000,0xE865AC7B,0x7603A197,0x00000000
+ .long 0x3FFB0000,0xC61A2EB1,0x8CD907AD,0x00000000
+ .long 0x3FFE0000,0xE525982A,0xF70C880E,0x00000000
+ .long 0x3FFB0000,0xE2F2A47A,0xDE3A18AF,0x00000000
+ .long 0x3FFE0000,0xE1FC780E,0x1FC780E2,0x00000000
+ .long 0x3FFB0000,0xFF64898E,0xDF55D551,0x00000000
+ .long 0x3FFE0000,0xDEE95C4C,0xA037BA57,0x00000000
+ .long 0x3FFC0000,0x8DB956A9,0x7B3D0148,0x00000000
+ .long 0x3FFE0000,0xDBEB61EE,0xD19C5958,0x00000000
+ .long 0x3FFC0000,0x9B8FE100,0xF47BA1DE,0x00000000
+ .long 0x3FFE0000,0xD901B203,0x6406C80E,0x00000000
+ .long 0x3FFC0000,0xA9372F1D,0x0DA1BD17,0x00000000
+ .long 0x3FFE0000,0xD62B80D6,0x2B80D62C,0x00000000
+ .long 0x3FFC0000,0xB6B07F38,0xCE90E46B,0x00000000
+ .long 0x3FFE0000,0xD3680D36,0x80D3680D,0x00000000
+ .long 0x3FFC0000,0xC3FD0329,0x06488481,0x00000000
+ .long 0x3FFE0000,0xD0B69FCB,0xD2580D0B,0x00000000
+ .long 0x3FFC0000,0xD11DE0FF,0x15AB18CA,0x00000000
+ .long 0x3FFE0000,0xCE168A77,0x25080CE1,0x00000000
+ .long 0x3FFC0000,0xDE1433A1,0x6C66B150,0x00000000
+ .long 0x3FFE0000,0xCB8727C0,0x65C393E0,0x00000000
+ .long 0x3FFC0000,0xEAE10B5A,0x7DDC8ADD,0x00000000
+ .long 0x3FFE0000,0xC907DA4E,0x871146AD,0x00000000
+ .long 0x3FFC0000,0xF7856E5E,0xE2C9B291,0x00000000
+ .long 0x3FFE0000,0xC6980C69,0x80C6980C,0x00000000
+ .long 0x3FFD0000,0x82012CA5,0xA68206D7,0x00000000
+ .long 0x3FFE0000,0xC4372F85,0x5D824CA6,0x00000000
+ .long 0x3FFD0000,0x882C5FCD,0x7256A8C5,0x00000000
+ .long 0x3FFE0000,0xC1E4BBD5,0x95F6E947,0x00000000
+ .long 0x3FFD0000,0x8E44C60B,0x4CCFD7DE,0x00000000
+ .long 0x3FFE0000,0xBFA02FE8,0x0BFA02FF,0x00000000
+ .long 0x3FFD0000,0x944AD09E,0xF4351AF6,0x00000000
+ .long 0x3FFE0000,0xBD691047,0x07661AA3,0x00000000
+ .long 0x3FFD0000,0x9A3EECD4,0xC3EAA6B2,0x00000000
+ .long 0x3FFE0000,0xBB3EE721,0xA54D880C,0x00000000
+ .long 0x3FFD0000,0xA0218434,0x353F1DE8,0x00000000
+ .long 0x3FFE0000,0xB92143FA,0x36F5E02E,0x00000000
+ .long 0x3FFD0000,0xA5F2FCAB,0xBBC506DA,0x00000000
+ .long 0x3FFE0000,0xB70FBB5A,0x19BE3659,0x00000000
+ .long 0x3FFD0000,0xABB3B8BA,0x2AD362A5,0x00000000
+ .long 0x3FFE0000,0xB509E68A,0x9B94821F,0x00000000
+ .long 0x3FFD0000,0xB1641795,0xCE3CA97B,0x00000000
+ .long 0x3FFE0000,0xB30F6352,0x8917C80B,0x00000000
+ .long 0x3FFD0000,0xB7047551,0x5D0F1C61,0x00000000
+ .long 0x3FFE0000,0xB11FD3B8,0x0B11FD3C,0x00000000
+ .long 0x3FFD0000,0xBC952AFE,0xEA3D13E1,0x00000000
+ .long 0x3FFE0000,0xAF3ADDC6,0x80AF3ADE,0x00000000
+ .long 0x3FFD0000,0xC2168ED0,0xF458BA4A,0x00000000
+ .long 0x3FFE0000,0xAD602B58,0x0AD602B6,0x00000000
+ .long 0x3FFD0000,0xC788F439,0xB3163BF1,0x00000000
+ .long 0x3FFE0000,0xAB8F69E2,0x8359CD11,0x00000000
+ .long 0x3FFD0000,0xCCECAC08,0xBF04565D,0x00000000
+ .long 0x3FFE0000,0xA9C84A47,0xA07F5638,0x00000000
+ .long 0x3FFD0000,0xD2420487,0x2DD85160,0x00000000
+ .long 0x3FFE0000,0xA80A80A8,0x0A80A80B,0x00000000
+ .long 0x3FFD0000,0xD7894992,0x3BC3588A,0x00000000
+ .long 0x3FFE0000,0xA655C439,0x2D7B73A8,0x00000000
+ .long 0x3FFD0000,0xDCC2C4B4,0x9887DACC,0x00000000
+ .long 0x3FFE0000,0xA4A9CF1D,0x96833751,0x00000000
+ .long 0x3FFD0000,0xE1EEBD3E,0x6D6A6B9E,0x00000000
+ .long 0x3FFE0000,0xA3065E3F,0xAE7CD0E0,0x00000000
+ .long 0x3FFD0000,0xE70D785C,0x2F9F5BDC,0x00000000
+ .long 0x3FFE0000,0xA16B312E,0xA8FC377D,0x00000000
+ .long 0x3FFD0000,0xEC1F392C,0x5179F283,0x00000000
+ .long 0x3FFE0000,0x9FD809FD,0x809FD80A,0x00000000
+ .long 0x3FFD0000,0xF12440D3,0xE36130E6,0x00000000
+ .long 0x3FFE0000,0x9E4CAD23,0xDD5F3A20,0x00000000
+ .long 0x3FFD0000,0xF61CCE92,0x346600BB,0x00000000
+ .long 0x3FFE0000,0x9CC8E160,0xC3FB19B9,0x00000000
+ .long 0x3FFD0000,0xFB091FD3,0x8145630A,0x00000000
+ .long 0x3FFE0000,0x9B4C6F9E,0xF03A3CAA,0x00000000
+ .long 0x3FFD0000,0xFFE97042,0xBFA4C2AD,0x00000000
+ .long 0x3FFE0000,0x99D722DA,0xBDE58F06,0x00000000
+ .long 0x3FFE0000,0x825EFCED,0x49369330,0x00000000
+ .long 0x3FFE0000,0x9868C809,0x868C8098,0x00000000
+ .long 0x3FFE0000,0x84C37A7A,0xB9A905C9,0x00000000
+ .long 0x3FFE0000,0x97012E02,0x5C04B809,0x00000000
+ .long 0x3FFE0000,0x87224C2E,0x8E645FB7,0x00000000
+ .long 0x3FFE0000,0x95A02568,0x095A0257,0x00000000
+ .long 0x3FFE0000,0x897B8CAC,0x9F7DE298,0x00000000
+ .long 0x3FFE0000,0x94458094,0x45809446,0x00000000
+ .long 0x3FFE0000,0x8BCF55DE,0xC4CD05FE,0x00000000
+ .long 0x3FFE0000,0x92F11384,0x0497889C,0x00000000
+ .long 0x3FFE0000,0x8E1DC0FB,0x89E125E5,0x00000000
+ .long 0x3FFE0000,0x91A2B3C4,0xD5E6F809,0x00000000
+ .long 0x3FFE0000,0x9066E68C,0x955B6C9B,0x00000000
+ .long 0x3FFE0000,0x905A3863,0x3E06C43B,0x00000000
+ .long 0x3FFE0000,0x92AADE74,0xC7BE59E0,0x00000000
+ .long 0x3FFE0000,0x8F1779D9,0xFDC3A219,0x00000000
+ .long 0x3FFE0000,0x94E9BFF6,0x15845643,0x00000000
+ .long 0x3FFE0000,0x8DDA5202,0x37694809,0x00000000
+ .long 0x3FFE0000,0x9723A1B7,0x20134203,0x00000000
+ .long 0x3FFE0000,0x8CA29C04,0x6514E023,0x00000000
+ .long 0x3FFE0000,0x995899C8,0x90EB8990,0x00000000
+ .long 0x3FFE0000,0x8B70344A,0x139BC75A,0x00000000
+ .long 0x3FFE0000,0x9B88BDAA,0x3A3DAE2F,0x00000000
+ .long 0x3FFE0000,0x8A42F870,0x5669DB46,0x00000000
+ .long 0x3FFE0000,0x9DB4224F,0xFFE1157C,0x00000000
+ .long 0x3FFE0000,0x891AC73A,0xE9819B50,0x00000000
+ .long 0x3FFE0000,0x9FDADC26,0x8B7A12DA,0x00000000
+ .long 0x3FFE0000,0x87F78087,0xF78087F8,0x00000000
+ .long 0x3FFE0000,0xA1FCFF17,0xCE733BD4,0x00000000
+ .long 0x3FFE0000,0x86D90544,0x7A34ACC6,0x00000000
+ .long 0x3FFE0000,0xA41A9E8F,0x5446FB9F,0x00000000
+ .long 0x3FFE0000,0x85BF3761,0x2CEE3C9B,0x00000000
+ .long 0x3FFE0000,0xA633CD7E,0x6771CD8B,0x00000000
+ .long 0x3FFE0000,0x84A9F9C8,0x084A9F9D,0x00000000
+ .long 0x3FFE0000,0xA8489E60,0x0B435A5E,0x00000000
+ .long 0x3FFE0000,0x83993052,0x3FBE3368,0x00000000
+ .long 0x3FFE0000,0xAA59233C,0xCCA4BD49,0x00000000
+ .long 0x3FFE0000,0x828CBFBE,0xB9A020A3,0x00000000
+ .long 0x3FFE0000,0xAC656DAE,0x6BCC4985,0x00000000
+ .long 0x3FFE0000,0x81848DA8,0xFAF0D277,0x00000000
+ .long 0x3FFE0000,0xAE6D8EE3,0x60BB2468,0x00000000
+ .long 0x3FFE0000,0x80808080,0x80808081,0x00000000
+ .long 0x3FFE0000,0xB07197A2,0x3C46C654,0x00000000
+
+ .set ADJK,L_SCR1
+
+ .set X,FP_SCR1
+ .set XDCARE,X+2
+ .set XFRAC,X+4
+
+ .set F,FP_SCR2
+ .set FFRAC,F+4
+
+ .set KLOG2,FP_SCR3
+
+ .set SAVEU,FP_SCR4
+
+ | xref t_frcinx
+ |xref t_extdnrm
+ |xref t_operr
+ |xref t_dz
+
+ .global slognd
+slognd:
+//--ENTRY POINT FOR LOG(X) FOR DENORMALIZED INPUT
+
+ movel #-100,ADJK(%a6) // ...INPUT = 2^(ADJK) * FP0
+
+//----normalize the input value by left shifting k bits (k to be determined
+//----below), adjusting exponent and storing -k to ADJK
+//----the value TWOTO100 is no longer needed.
+//----Note that this code assumes the denormalized input is NON-ZERO.
+
+ moveml %d2-%d7,-(%a7) // ...save some registers
+ movel #0x00000000,%d3 // ...D3 is exponent of smallest norm. #
+ movel 4(%a0),%d4
+ movel 8(%a0),%d5 // ...(D4,D5) is (Hi_X,Lo_X)
+ clrl %d2 // ...D2 used for holding K
+
+ tstl %d4
+ bnes HiX_not0
+
+HiX_0:
+ movel %d5,%d4
+ clrl %d5
+ movel #32,%d2
+ clrl %d6
+ bfffo %d4{#0:#32},%d6
+ lsll %d6,%d4
+ addl %d6,%d2 // ...(D3,D4,D5) is normalized
+
+ movel %d3,X(%a6)
+ movel %d4,XFRAC(%a6)
+ movel %d5,XFRAC+4(%a6)
+ negl %d2
+ movel %d2,ADJK(%a6)
+ fmovex X(%a6),%fp0
+ moveml (%a7)+,%d2-%d7 // ...restore registers
+ lea X(%a6),%a0
+ bras LOGBGN // ...begin regular log(X)
+
+
+HiX_not0:
+ clrl %d6
+ bfffo %d4{#0:#32},%d6 // ...find first 1
+ movel %d6,%d2 // ...get k
+ lsll %d6,%d4
+ movel %d5,%d7 // ...a copy of D5
+ lsll %d6,%d5
+ negl %d6
+ addil #32,%d6
+ lsrl %d6,%d7
+ orl %d7,%d4 // ...(D3,D4,D5) normalized
+
+ movel %d3,X(%a6)
+ movel %d4,XFRAC(%a6)
+ movel %d5,XFRAC+4(%a6)
+ negl %d2
+ movel %d2,ADJK(%a6)
+ fmovex X(%a6),%fp0
+ moveml (%a7)+,%d2-%d7 // ...restore registers
+ lea X(%a6),%a0
+ bras LOGBGN // ...begin regular log(X)
+
+
+ .global slogn
+slogn:
+//--ENTRY POINT FOR LOG(X) FOR X FINITE, NON-ZERO, NOT NAN'S
+
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+ movel #0x00000000,ADJK(%a6)
+
+LOGBGN:
+//--FPCR SAVED AND CLEARED, INPUT IS 2^(ADJK)*FP0, FP0 CONTAINS
+//--A FINITE, NON-ZERO, NORMALIZED NUMBER.
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+
+ movel (%a0),X(%a6)
+ movel 4(%a0),X+4(%a6)
+ movel 8(%a0),X+8(%a6)
+
+ cmpil #0,%d0 // ...CHECK IF X IS NEGATIVE
+ blt LOGNEG // ...LOG OF NEGATIVE ARGUMENT IS INVALID
+ cmp2l BOUNDS1,%d0 // ...X IS POSITIVE, CHECK IF X IS NEAR 1
+ bcc LOGNEAR1 // ...BOUNDS IS ROUGHLY [15/16, 17/16]
+
+LOGMAIN:
+//--THIS SHOULD BE THE USUAL CASE, X NOT VERY CLOSE TO 1
+
+//--X = 2^(K) * Y, 1 <= Y < 2. THUS, Y = 1.XXXXXXXX....XX IN BINARY.
+//--WE DEFINE F = 1.XXXXXX1, I.E. FIRST 7 BITS OF Y AND ATTACH A 1.
+//--THE IDEA IS THAT LOG(X) = K*LOG2 + LOG(Y)
+//-- = K*LOG2 + LOG(F) + LOG(1 + (Y-F)/F).
+//--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING
+//--LOG(1+U) CAN BE VERY EFFICIENT.
+//--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO
+//--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.
+
+//--GET K, Y, F, AND ADDRESS OF 1/F.
+ asrl #8,%d0
+ asrl #8,%d0 // ...SHIFTED 16 BITS, BIASED EXPO. OF X
+ subil #0x3FFF,%d0 // ...THIS IS K
+ addl ADJK(%a6),%d0 // ...ADJUST K, ORIGINAL INPUT MAY BE DENORM.
+ lea LOGTBL,%a0 // ...BASE ADDRESS OF 1/F AND LOG(F)
+ fmovel %d0,%fp1 // ...CONVERT K TO FLOATING-POINT FORMAT
+
+//--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F
+ movel #0x3FFF0000,X(%a6) // ...X IS NOW Y, I.E. 2^(-K)*X
+ movel XFRAC(%a6),FFRAC(%a6)
+ andil #0xFE000000,FFRAC(%a6) // ...FIRST 7 BITS OF Y
+ oril #0x01000000,FFRAC(%a6) // ...GET F: ATTACH A 1 AT THE EIGHTH BIT
+ movel FFRAC(%a6),%d0 // ...READY TO GET ADDRESS OF 1/F
+ andil #0x7E000000,%d0
+ asrl #8,%d0
+ asrl #8,%d0
+ asrl #4,%d0 // ...SHIFTED 20, D0 IS THE DISPLACEMENT
+ addal %d0,%a0 // ...A0 IS THE ADDRESS FOR 1/F
+
+ fmovex X(%a6),%fp0
+ movel #0x3fff0000,F(%a6)
+ clrl F+8(%a6)
+ fsubx F(%a6),%fp0 // ...Y-F
+ fmovemx %fp2-%fp2/%fp3,-(%sp) // ...SAVE FP2 WHILE FP0 IS NOT READY
+//--SUMMARY: FP0 IS Y-F, A0 IS ADDRESS OF 1/F, FP1 IS K
+//--REGISTERS SAVED: FPCR, FP1, FP2
+
+LP1CONT1:
+//--AN RE-ENTRY POINT FOR LOGNP1
+ fmulx (%a0),%fp0 // ...FP0 IS U = (Y-F)/F
+ fmulx LOGOF2,%fp1 // ...GET K*LOG2 WHILE FP0 IS NOT READY
+ fmovex %fp0,%fp2
+ fmulx %fp2,%fp2 // ...FP2 IS V=U*U
+ fmovex %fp1,KLOG2(%a6) // ...PUT K*LOG2 IN MEMORY, FREE FP1
+
+//--LOG(1+U) IS APPROXIMATED BY
+//--U + V*(A1+U*(A2+U*(A3+U*(A4+U*(A5+U*A6))))) WHICH IS
+//--[U + V*(A1+V*(A3+V*A5))] + [U*V*(A2+V*(A4+V*A6))]
+
+ fmovex %fp2,%fp3
+ fmovex %fp2,%fp1
+
+ fmuld LOGA6,%fp1 // ...V*A6
+ fmuld LOGA5,%fp2 // ...V*A5
+
+ faddd LOGA4,%fp1 // ...A4+V*A6
+ faddd LOGA3,%fp2 // ...A3+V*A5
+
+ fmulx %fp3,%fp1 // ...V*(A4+V*A6)
+ fmulx %fp3,%fp2 // ...V*(A3+V*A5)
+
+ faddd LOGA2,%fp1 // ...A2+V*(A4+V*A6)
+ faddd LOGA1,%fp2 // ...A1+V*(A3+V*A5)
+
+ fmulx %fp3,%fp1 // ...V*(A2+V*(A4+V*A6))
+ addal #16,%a0 // ...ADDRESS OF LOG(F)
+ fmulx %fp3,%fp2 // ...V*(A1+V*(A3+V*A5)), FP3 RELEASED
+
+ fmulx %fp0,%fp1 // ...U*V*(A2+V*(A4+V*A6))
+ faddx %fp2,%fp0 // ...U+V*(A1+V*(A3+V*A5)), FP2 RELEASED
+
+ faddx (%a0),%fp1 // ...LOG(F)+U*V*(A2+V*(A4+V*A6))
+ fmovemx (%sp)+,%fp2-%fp2/%fp3 // ...RESTORE FP2
+ faddx %fp1,%fp0 // ...FP0 IS LOG(F) + LOG(1+U)
+
+ fmovel %d1,%fpcr
+ faddx KLOG2(%a6),%fp0 // ...FINAL ADD
+ bra t_frcinx
+
+
+LOGNEAR1:
+//--REGISTERS SAVED: FPCR, FP1. FP0 CONTAINS THE INPUT.
+ fmovex %fp0,%fp1
+ fsubs one,%fp1 // ...FP1 IS X-1
+ fadds one,%fp0 // ...FP0 IS X+1
+ faddx %fp1,%fp1 // ...FP1 IS 2(X-1)
+//--LOG(X) = LOG(1+U/2)-LOG(1-U/2) WHICH IS AN ODD POLYNOMIAL
+//--IN U, U = 2(X-1)/(X+1) = FP1/FP0
+
+LP1CONT2:
+//--THIS IS AN RE-ENTRY POINT FOR LOGNP1
+ fdivx %fp0,%fp1 // ...FP1 IS U
+ fmovemx %fp2-%fp2/%fp3,-(%sp) // ...SAVE FP2
+//--REGISTERS SAVED ARE NOW FPCR,FP1,FP2,FP3
+//--LET V=U*U, W=V*V, CALCULATE
+//--U + U*V*(B1 + V*(B2 + V*(B3 + V*(B4 + V*B5)))) BY
+//--U + U*V*( [B1 + W*(B3 + W*B5)] + [V*(B2 + W*B4)] )
+ fmovex %fp1,%fp0
+ fmulx %fp0,%fp0 // ...FP0 IS V
+ fmovex %fp1,SAVEU(%a6) // ...STORE U IN MEMORY, FREE FP1
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...FP1 IS W
+
+ fmoved LOGB5,%fp3
+ fmoved LOGB4,%fp2
+
+ fmulx %fp1,%fp3 // ...W*B5
+ fmulx %fp1,%fp2 // ...W*B4
+
+ faddd LOGB3,%fp3 // ...B3+W*B5
+ faddd LOGB2,%fp2 // ...B2+W*B4
+
+ fmulx %fp3,%fp1 // ...W*(B3+W*B5), FP3 RELEASED
+
+ fmulx %fp0,%fp2 // ...V*(B2+W*B4)
+
+ faddd LOGB1,%fp1 // ...B1+W*(B3+W*B5)
+ fmulx SAVEU(%a6),%fp0 // ...FP0 IS U*V
+
+ faddx %fp2,%fp1 // ...B1+W*(B3+W*B5) + V*(B2+W*B4), FP2 RELEASED
+ fmovemx (%sp)+,%fp2-%fp2/%fp3 // ...FP2 RESTORED
+
+ fmulx %fp1,%fp0 // ...U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] )
+
+ fmovel %d1,%fpcr
+ faddx SAVEU(%a6),%fp0
+ bra t_frcinx
+ rts
+
+LOGNEG:
+//--REGISTERS SAVED FPCR. LOG(-VE) IS INVALID
+ bra t_operr
+
+ .global slognp1d
+slognp1d:
+//--ENTRY POINT FOR LOG(1+Z) FOR DENORMALIZED INPUT
+// Simply return the denorm
+
+ bra t_extdnrm
+
+ .global slognp1
+slognp1:
+//--ENTRY POINT FOR LOG(1+X) FOR X FINITE, NON-ZERO, NOT NAN'S
+
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+ fabsx %fp0 //test magnitude
+ fcmpx LTHOLD,%fp0 //compare with min threshold
+ fbgt LP1REAL //if greater, continue
+ fmovel #0,%fpsr //clr N flag from compare
+ fmovel %d1,%fpcr
+ fmovex (%a0),%fp0 //return signed argument
+ bra t_frcinx
+
+LP1REAL:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+ movel #0x00000000,ADJK(%a6)
+ fmovex %fp0,%fp1 // ...FP1 IS INPUT Z
+ fadds one,%fp0 // ...X := ROUND(1+Z)
+ fmovex %fp0,X(%a6)
+ movew XFRAC(%a6),XDCARE(%a6)
+ movel X(%a6),%d0
+ cmpil #0,%d0
+ ble LP1NEG0 // ...LOG OF ZERO OR -VE
+ cmp2l BOUNDS2,%d0
+ bcs LOGMAIN // ...BOUNDS2 IS [1/2,3/2]
+//--IF 1+Z > 3/2 OR 1+Z < 1/2, THEN X, WHICH IS ROUNDING 1+Z,
+//--CONTAINS AT LEAST 63 BITS OF INFORMATION OF Z. IN THAT CASE,
+//--SIMPLY INVOKE LOG(X) FOR LOG(1+Z).
+
+LP1NEAR1:
+//--NEXT SEE IF EXP(-1/16) < X < EXP(1/16)
+ cmp2l BOUNDS1,%d0
+ bcss LP1CARE
+
+LP1ONE16:
+//--EXP(-1/16) < X < EXP(1/16). LOG(1+Z) = LOG(1+U/2) - LOG(1-U/2)
+//--WHERE U = 2Z/(2+Z) = 2Z/(1+X).
+ faddx %fp1,%fp1 // ...FP1 IS 2Z
+ fadds one,%fp0 // ...FP0 IS 1+X
+//--U = FP1/FP0
+ bra LP1CONT2
+
+LP1CARE:
+//--HERE WE USE THE USUAL TABLE DRIVEN APPROACH. CARE HAS TO BE
+//--TAKEN BECAUSE 1+Z CAN HAVE 67 BITS OF INFORMATION AND WE MUST
+//--PRESERVE ALL THE INFORMATION. BECAUSE 1+Z IS IN [1/2,3/2],
+//--THERE ARE ONLY TWO CASES.
+//--CASE 1: 1+Z < 1, THEN K = -1 AND Y-F = (2-F) + 2Z
+//--CASE 2: 1+Z > 1, THEN K = 0 AND Y-F = (1-F) + Z
+//--ON RETURNING TO LP1CONT1, WE MUST HAVE K IN FP1, ADDRESS OF
+//--(1/F) IN A0, Y-F IN FP0, AND FP2 SAVED.
+
+ movel XFRAC(%a6),FFRAC(%a6)
+ andil #0xFE000000,FFRAC(%a6)
+ oril #0x01000000,FFRAC(%a6) // ...F OBTAINED
+ cmpil #0x3FFF8000,%d0 // ...SEE IF 1+Z > 1
+ bges KISZERO
+
+KISNEG1:
+ fmoves TWO,%fp0
+ movel #0x3fff0000,F(%a6)
+ clrl F+8(%a6)
+ fsubx F(%a6),%fp0 // ...2-F
+ movel FFRAC(%a6),%d0
+ andil #0x7E000000,%d0
+ asrl #8,%d0
+ asrl #8,%d0
+ asrl #4,%d0 // ...D0 CONTAINS DISPLACEMENT FOR 1/F
+ faddx %fp1,%fp1 // ...GET 2Z
+ fmovemx %fp2-%fp2/%fp3,-(%sp) // ...SAVE FP2
+ faddx %fp1,%fp0 // ...FP0 IS Y-F = (2-F)+2Z
+ lea LOGTBL,%a0 // ...A0 IS ADDRESS OF 1/F
+ addal %d0,%a0
+ fmoves negone,%fp1 // ...FP1 IS K = -1
+ bra LP1CONT1
+
+KISZERO:
+ fmoves one,%fp0
+ movel #0x3fff0000,F(%a6)
+ clrl F+8(%a6)
+ fsubx F(%a6),%fp0 // ...1-F
+ movel FFRAC(%a6),%d0
+ andil #0x7E000000,%d0
+ asrl #8,%d0
+ asrl #8,%d0
+ asrl #4,%d0
+ faddx %fp1,%fp0 // ...FP0 IS Y-F
+ fmovemx %fp2-%fp2/%fp3,-(%sp) // ...FP2 SAVED
+ lea LOGTBL,%a0
+ addal %d0,%a0 // ...A0 IS ADDRESS OF 1/F
+ fmoves zero,%fp1 // ...FP1 IS K = 0
+ bra LP1CONT1
+
+LP1NEG0:
+//--FPCR SAVED. D0 IS X IN COMPACT FORM.
+ cmpil #0,%d0
+ blts LP1NEG
+LP1ZERO:
+ fmoves negone,%fp0
+
+ fmovel %d1,%fpcr
+ bra t_dz
+
+LP1NEG:
+ fmoves zero,%fp0
+
+ fmovel %d1,%fpcr
+ bra t_operr
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.s b/c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.s
new file mode 100644
index 0000000000..cf45b2ec4d
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/smovecr.s
@@ -0,0 +1,162 @@
+//
+// smovecr.sa 3.1 12/10/90
+//
+// The entry point sMOVECR returns the constant at the
+// offset given in the instruction field.
+//
+// Input: An offset in the instruction word.
+//
+// Output: The constant rounded to the user's rounding
+// mode unchecked for overflow.
+//
+// Modified: fp0.
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SMOVECR idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref nrm_set
+ |xref round
+ |xref PIRN
+ |xref PIRZRM
+ |xref PIRP
+ |xref SMALRN
+ |xref SMALRZRM
+ |xref SMALRP
+ |xref BIGRN
+ |xref BIGRZRM
+ |xref BIGRP
+
+FZERO: .long 00000000
+//
+// FMOVECR
+//
+ .global smovcr
+smovcr:
+ bfextu CMDREG1B(%a6){#9:#7},%d0 //get offset
+ bfextu USER_FPCR(%a6){#26:#2},%d1 //get rmode
+//
+// check range of offset
+//
+ tstb %d0 //if zero, offset is to pi
+ beqs PI_TBL //it is pi
+ cmpib #0x0a,%d0 //check range $01 - $0a
+ bles Z_VAL //if in this range, return zero
+ cmpib #0x0e,%d0 //check range $0b - $0e
+ bles SM_TBL //valid constants in this range
+ cmpib #0x2f,%d0 //check range $10 - $2f
+ bles Z_VAL //if in this range, return zero
+ cmpib #0x3f,%d0 //check range $30 - $3f
+ ble BG_TBL //valid constants in this range
+Z_VAL:
+ fmoves FZERO,%fp0
+ rts
+PI_TBL:
+ tstb %d1 //offset is zero, check for rmode
+ beqs PI_RN //if zero, rn mode
+ cmpib #0x3,%d1 //check for rp
+ beqs PI_RP //if 3, rp mode
+PI_RZRM:
+ leal PIRZRM,%a0 //rmode is rz or rm, load PIRZRM in a0
+ bra set_finx
+PI_RN:
+ leal PIRN,%a0 //rmode is rn, load PIRN in a0
+ bra set_finx
+PI_RP:
+ leal PIRP,%a0 //rmode is rp, load PIRP in a0
+ bra set_finx
+SM_TBL:
+ subil #0xb,%d0 //make offset in 0 - 4 range
+ tstb %d1 //check for rmode
+ beqs SM_RN //if zero, rn mode
+ cmpib #0x3,%d1 //check for rp
+ beqs SM_RP //if 3, rp mode
+SM_RZRM:
+ leal SMALRZRM,%a0 //rmode is rz or rm, load SMRZRM in a0
+ cmpib #0x2,%d0 //check if result is inex
+ ble set_finx //if 0 - 2, it is inexact
+ bra no_finx //if 3, it is exact
+SM_RN:
+ leal SMALRN,%a0 //rmode is rn, load SMRN in a0
+ cmpib #0x2,%d0 //check if result is inex
+ ble set_finx //if 0 - 2, it is inexact
+ bra no_finx //if 3, it is exact
+SM_RP:
+ leal SMALRP,%a0 //rmode is rp, load SMRP in a0
+ cmpib #0x2,%d0 //check if result is inex
+ ble set_finx //if 0 - 2, it is inexact
+ bra no_finx //if 3, it is exact
+BG_TBL:
+ subil #0x30,%d0 //make offset in 0 - f range
+ tstb %d1 //check for rmode
+ beqs BG_RN //if zero, rn mode
+ cmpib #0x3,%d1 //check for rp
+ beqs BG_RP //if 3, rp mode
+BG_RZRM:
+ leal BIGRZRM,%a0 //rmode is rz or rm, load BGRZRM in a0
+ cmpib #0x1,%d0 //check if result is inex
+ ble set_finx //if 0 - 1, it is inexact
+ cmpib #0x7,%d0 //second check
+ ble no_finx //if 0 - 7, it is exact
+ bra set_finx //if 8 - f, it is inexact
+BG_RN:
+ leal BIGRN,%a0 //rmode is rn, load BGRN in a0
+ cmpib #0x1,%d0 //check if result is inex
+ ble set_finx //if 0 - 1, it is inexact
+ cmpib #0x7,%d0 //second check
+ ble no_finx //if 0 - 7, it is exact
+ bra set_finx //if 8 - f, it is inexact
+BG_RP:
+ leal BIGRP,%a0 //rmode is rp, load SMRP in a0
+ cmpib #0x1,%d0 //check if result is inex
+ ble set_finx //if 0 - 1, it is inexact
+ cmpib #0x7,%d0 //second check
+ ble no_finx //if 0 - 7, it is exact
+// bra set_finx ;if 8 - f, it is inexact
+set_finx:
+ orl #inx2a_mask,USER_FPSR(%a6) //set inex2/ainex
+no_finx:
+ mulul #12,%d0 //use offset to point into tables
+ movel %d1,L_SCR1(%a6) //load mode for round call
+ bfextu USER_FPCR(%a6){#24:#2},%d1 //get precision
+ tstl %d1 //check if extended precision
+//
+// Precision is extended
+//
+ bnes not_ext //if extended, do not call round
+ fmovemx (%a0,%d0),%fp0-%fp0 //return result in fp0
+ rts
+//
+// Precision is single or double
+//
+not_ext:
+ swap %d1 //rnd prec in upper word of d1
+ addl L_SCR1(%a6),%d1 //merge rmode in low word of d1
+ movel (%a0,%d0),FP_SCR1(%a6) //load first word to temp storage
+ movel 4(%a0,%d0),FP_SCR1+4(%a6) //load second word
+ movel 8(%a0,%d0),FP_SCR1+8(%a6) //load third word
+ clrl %d0 //clear g,r,s
+ lea FP_SCR1(%a6),%a0
+ btstb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0) //convert to internal ext. format
+
+ bsr round //go round the mantissa
+
+ bfclr LOCAL_SGN(%a0){#0:#8} //convert back to IEEE ext format
+ beqs fin_fcr
+ bsetb #sign_bit,LOCAL_EX(%a0)
+fin_fcr:
+ fmovemx (%a0),%fp0-%fp0
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/srem_mod.s b/c/src/lib/libcpu/m68k/m68040/fpsp/srem_mod.s
new file mode 100644
index 0000000000..57ee7ed4b3
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/srem_mod.s
@@ -0,0 +1,422 @@
+//
+// srem_mod.sa 3.1 12/10/90
+//
+// The entry point sMOD computes the floating point MOD of the
+// input values X and Y. The entry point sREM computes the floating
+// point (IEEE) REM of the input values X and Y.
+//
+// INPUT
+// -----
+// Double-extended value Y is pointed to by address in register
+// A0. Double-extended value X is located in -12(A0). The values
+// of X and Y are both nonzero and finite; although either or both
+// of them can be denormalized. The special cases of zeros, NaNs,
+// and infinities are handled elsewhere.
+//
+// OUTPUT
+// ------
+// FREM(X,Y) or FMOD(X,Y), depending on entry point.
+//
+// ALGORITHM
+// ---------
+//
+// Step 1. Save and strip signs of X and Y: signX := sign(X),
+// signY := sign(Y), X := |X|, Y := |Y|,
+// signQ := signX EOR signY. Record whether MOD or REM
+// is requested.
+//
+// Step 2. Set L := expo(X)-expo(Y), k := 0, Q := 0.
+// If (L < 0) then
+// R := X, go to Step 4.
+// else
+// R := 2^(-L)X, j := L.
+// endif
+//
+// Step 3. Perform MOD(X,Y)
+// 3.1 If R = Y, go to Step 9.
+// 3.2 If R > Y, then { R := R - Y, Q := Q + 1}
+// 3.3 If j = 0, go to Step 4.
+// 3.4 k := k + 1, j := j - 1, Q := 2Q, R := 2R. Go to
+// Step 3.1.
+//
+// Step 4. At this point, R = X - QY = MOD(X,Y). Set
+// Last_Subtract := false (used in Step 7 below). If
+// MOD is requested, go to Step 6.
+//
+// Step 5. R = MOD(X,Y), but REM(X,Y) is requested.
+// 5.1 If R < Y/2, then R = MOD(X,Y) = REM(X,Y). Go to
+// Step 6.
+// 5.2 If R > Y/2, then { set Last_Subtract := true,
+// Q := Q + 1, Y := signY*Y }. Go to Step 6.
+// 5.3 This is the tricky case of R = Y/2. If Q is odd,
+// then { Q := Q + 1, signX := -signX }.
+//
+// Step 6. R := signX*R.
+//
+// Step 7. If Last_Subtract = true, R := R - Y.
+//
+// Step 8. Return signQ, last 7 bits of Q, and R as required.
+//
+// Step 9. At this point, R = 2^(-j)*X - Q Y = Y. Thus,
+// X = 2^(j)*(Q+1)Y. set Q := 2^(j)*(Q+1),
+// R := 0. Return signQ, last 7 bits of Q, and R.
+//
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+SREM_MOD: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ .set Mod_Flag,L_SCR3
+ .set SignY,FP_SCR3+4
+ .set SignX,FP_SCR3+8
+ .set SignQ,FP_SCR3+12
+ .set Sc_Flag,FP_SCR4
+
+ .set Y,FP_SCR1
+ .set Y_Hi,Y+4
+ .set Y_Lo,Y+8
+
+ .set R,FP_SCR2
+ .set R_Hi,R+4
+ .set R_Lo,R+8
+
+
+Scale: .long 0x00010000,0x80000000,0x00000000,0x00000000
+
+ |xref t_avoid_unsupp
+
+ .global smod
+smod:
+
+ movel #0,Mod_Flag(%a6)
+ bras Mod_Rem
+
+ .global srem
+srem:
+
+ movel #1,Mod_Flag(%a6)
+
+Mod_Rem:
+//..Save sign of X and Y
+ moveml %d2-%d7,-(%a7) // ...save data registers
+ movew (%a0),%d3
+ movew %d3,SignY(%a6)
+ andil #0x00007FFF,%d3 // ...Y := |Y|
+
+//
+ movel 4(%a0),%d4
+ movel 8(%a0),%d5 // ...(D3,D4,D5) is |Y|
+
+ tstl %d3
+ bnes Y_Normal
+
+ movel #0x00003FFE,%d3 // ...$3FFD + 1
+ tstl %d4
+ bnes HiY_not0
+
+HiY_0:
+ movel %d5,%d4
+ clrl %d5
+ subil #32,%d3
+ clrl %d6
+ bfffo %d4{#0:#32},%d6
+ lsll %d6,%d4
+ subl %d6,%d3 // ...(D3,D4,D5) is normalized
+// ...with bias $7FFD
+ bras Chk_X
+
+HiY_not0:
+ clrl %d6
+ bfffo %d4{#0:#32},%d6
+ subl %d6,%d3
+ lsll %d6,%d4
+ movel %d5,%d7 // ...a copy of D5
+ lsll %d6,%d5
+ negl %d6
+ addil #32,%d6
+ lsrl %d6,%d7
+ orl %d7,%d4 // ...(D3,D4,D5) normalized
+// ...with bias $7FFD
+ bras Chk_X
+
+Y_Normal:
+ addil #0x00003FFE,%d3 // ...(D3,D4,D5) normalized
+// ...with bias $7FFD
+
+Chk_X:
+ movew -12(%a0),%d0
+ movew %d0,SignX(%a6)
+ movew SignY(%a6),%d1
+ eorl %d0,%d1
+ andil #0x00008000,%d1
+ movew %d1,SignQ(%a6) // ...sign(Q) obtained
+ andil #0x00007FFF,%d0
+ movel -8(%a0),%d1
+ movel -4(%a0),%d2 // ...(D0,D1,D2) is |X|
+ tstl %d0
+ bnes X_Normal
+ movel #0x00003FFE,%d0
+ tstl %d1
+ bnes HiX_not0
+
+HiX_0:
+ movel %d2,%d1
+ clrl %d2
+ subil #32,%d0
+ clrl %d6
+ bfffo %d1{#0:#32},%d6
+ lsll %d6,%d1
+ subl %d6,%d0 // ...(D0,D1,D2) is normalized
+// ...with bias $7FFD
+ bras Init
+
+HiX_not0:
+ clrl %d6
+ bfffo %d1{#0:#32},%d6
+ subl %d6,%d0
+ lsll %d6,%d1
+ movel %d2,%d7 // ...a copy of D2
+ lsll %d6,%d2
+ negl %d6
+ addil #32,%d6
+ lsrl %d6,%d7
+ orl %d7,%d1 // ...(D0,D1,D2) normalized
+// ...with bias $7FFD
+ bras Init
+
+X_Normal:
+ addil #0x00003FFE,%d0 // ...(D0,D1,D2) normalized
+// ...with bias $7FFD
+
+Init:
+//
+ movel %d3,L_SCR1(%a6) // ...save biased expo(Y)
+ movel %d0,L_SCR2(%a6) //save d0
+ subl %d3,%d0 // ...L := expo(X)-expo(Y)
+// Move.L D0,L ...D0 is j
+ clrl %d6 // ...D6 := carry <- 0
+ clrl %d3 // ...D3 is Q
+ moveal #0,%a1 // ...A1 is k; j+k=L, Q=0
+
+//..(Carry,D1,D2) is R
+ tstl %d0
+ bges Mod_Loop
+
+//..expo(X) < expo(Y). Thus X = mod(X,Y)
+//
+ movel L_SCR2(%a6),%d0 //restore d0
+ bra Get_Mod
+
+//..At this point R = 2^(-L)X; Q = 0; k = 0; and k+j = L
+
+
+Mod_Loop:
+ tstl %d6 // ...test carry bit
+ bgts R_GT_Y
+
+//..At this point carry = 0, R = (D1,D2), Y = (D4,D5)
+ cmpl %d4,%d1 // ...compare hi(R) and hi(Y)
+ bnes R_NE_Y
+ cmpl %d5,%d2 // ...compare lo(R) and lo(Y)
+ bnes R_NE_Y
+
+//..At this point, R = Y
+ bra Rem_is_0
+
+R_NE_Y:
+//..use the borrow of the previous compare
+ bcss R_LT_Y // ...borrow is set iff R < Y
+
+R_GT_Y:
+//..If Carry is set, then Y < (Carry,D1,D2) < 2Y. Otherwise, Carry = 0
+//..and Y < (D1,D2) < 2Y. Either way, perform R - Y
+ subl %d5,%d2 // ...lo(R) - lo(Y)
+ subxl %d4,%d1 // ...hi(R) - hi(Y)
+ clrl %d6 // ...clear carry
+ addql #1,%d3 // ...Q := Q + 1
+
+R_LT_Y:
+//..At this point, Carry=0, R < Y. R = 2^(k-L)X - QY; k+j = L; j >= 0.
+ tstl %d0 // ...see if j = 0.
+ beqs PostLoop
+
+ addl %d3,%d3 // ...Q := 2Q
+ addl %d2,%d2 // ...lo(R) = 2lo(R)
+ roxll #1,%d1 // ...hi(R) = 2hi(R) + carry
+ scs %d6 // ...set Carry if 2(R) overflows
+ addql #1,%a1 // ...k := k+1
+ subql #1,%d0 // ...j := j - 1
+//..At this point, R=(Carry,D1,D2) = 2^(k-L)X - QY, j+k=L, j >= 0, R < 2Y.
+
+ bras Mod_Loop
+
+PostLoop:
+//..k = L, j = 0, Carry = 0, R = (D1,D2) = X - QY, R < Y.
+
+//..normalize R.
+ movel L_SCR1(%a6),%d0 // ...new biased expo of R
+ tstl %d1
+ bnes HiR_not0
+
+HiR_0:
+ movel %d2,%d1
+ clrl %d2
+ subil #32,%d0
+ clrl %d6
+ bfffo %d1{#0:#32},%d6
+ lsll %d6,%d1
+ subl %d6,%d0 // ...(D0,D1,D2) is normalized
+// ...with bias $7FFD
+ bras Get_Mod
+
+HiR_not0:
+ clrl %d6
+ bfffo %d1{#0:#32},%d6
+ bmis Get_Mod // ...already normalized
+ subl %d6,%d0
+ lsll %d6,%d1
+ movel %d2,%d7 // ...a copy of D2
+ lsll %d6,%d2
+ negl %d6
+ addil #32,%d6
+ lsrl %d6,%d7
+ orl %d7,%d1 // ...(D0,D1,D2) normalized
+
+//
+Get_Mod:
+ cmpil #0x000041FE,%d0
+ bges No_Scale
+Do_Scale:
+ movew %d0,R(%a6)
+ clrw R+2(%a6)
+ movel %d1,R_Hi(%a6)
+ movel %d2,R_Lo(%a6)
+ movel L_SCR1(%a6),%d6
+ movew %d6,Y(%a6)
+ clrw Y+2(%a6)
+ movel %d4,Y_Hi(%a6)
+ movel %d5,Y_Lo(%a6)
+ fmovex R(%a6),%fp0 // ...no exception
+ movel #1,Sc_Flag(%a6)
+ bras ModOrRem
+No_Scale:
+ movel %d1,R_Hi(%a6)
+ movel %d2,R_Lo(%a6)
+ subil #0x3FFE,%d0
+ movew %d0,R(%a6)
+ clrw R+2(%a6)
+ movel L_SCR1(%a6),%d6
+ subil #0x3FFE,%d6
+ movel %d6,L_SCR1(%a6)
+ fmovex R(%a6),%fp0
+ movew %d6,Y(%a6)
+ movel %d4,Y_Hi(%a6)
+ movel %d5,Y_Lo(%a6)
+ movel #0,Sc_Flag(%a6)
+
+//
+
+
+ModOrRem:
+ movel Mod_Flag(%a6),%d6
+ beqs Fix_Sign
+
+ movel L_SCR1(%a6),%d6 // ...new biased expo(Y)
+ subql #1,%d6 // ...biased expo(Y/2)
+ cmpl %d6,%d0
+ blts Fix_Sign
+ bgts Last_Sub
+
+ cmpl %d4,%d1
+ bnes Not_EQ
+ cmpl %d5,%d2
+ bnes Not_EQ
+ bra Tie_Case
+
+Not_EQ:
+ bcss Fix_Sign
+
+Last_Sub:
+//
+ fsubx Y(%a6),%fp0 // ...no exceptions
+ addql #1,%d3 // ...Q := Q + 1
+
+//
+
+Fix_Sign:
+//..Get sign of X
+ movew SignX(%a6),%d6
+ bges Get_Q
+ fnegx %fp0
+
+//..Get Q
+//
+Get_Q:
+ clrl %d6
+ movew SignQ(%a6),%d6 // ...D6 is sign(Q)
+ movel #8,%d7
+ lsrl %d7,%d6
+ andil #0x0000007F,%d3 // ...7 bits of Q
+ orl %d6,%d3 // ...sign and bits of Q
+ swap %d3
+ fmovel %fpsr,%d6
+ andil #0xFF00FFFF,%d6
+ orl %d3,%d6
+ fmovel %d6,%fpsr // ...put Q in fpsr
+
+//
+Restore:
+ moveml (%a7)+,%d2-%d7
+ fmovel USER_FPCR(%a6),%fpcr
+ movel Sc_Flag(%a6),%d0
+ beqs Finish
+ fmulx Scale(%pc),%fp0 // ...may cause underflow
+ bra t_avoid_unsupp //check for denorm as a
+// ;result of the scaling
+
+Finish:
+ fmovex %fp0,%fp0 //capture exceptions & round
+ rts
+
+Rem_is_0:
+//..R = 2^(-j)X - Q Y = Y, thus R = 0 and quotient = 2^j (Q+1)
+ addql #1,%d3
+ cmpil #8,%d0 // ...D0 is j
+ bges Q_Big
+
+ lsll %d0,%d3
+ bras Set_R_0
+
+Q_Big:
+ clrl %d3
+
+Set_R_0:
+ fmoves #0x00000000,%fp0
+ movel #0,Sc_Flag(%a6)
+ bra Fix_Sign
+
+Tie_Case:
+//..Check parity of Q
+ movel %d3,%d6
+ andil #0x00000001,%d6
+ tstl %d6
+ beq Fix_Sign // ...Q is even
+
+//..Q is odd, Q := Q + 1, signX := -signX
+ addql #1,%d3
+ movew SignX(%a6),%d6
+ eoril #0x00008000,%d6
+ movew %d6,SignX(%a6)
+ bra Fix_Sign
+
+ //end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/ssin.s b/c/src/lib/libcpu/m68k/m68040/fpsp/ssin.s
new file mode 100644
index 0000000000..9c12a55cba
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/ssin.s
@@ -0,0 +1,746 @@
+//
+// ssin.sa 3.3 7/29/91
+//
+// The entry point sSIN computes the sine of an input argument
+// sCOS computes the cosine, and sSINCOS computes both. The
+// corresponding entry points with a "d" computes the same
+// corresponding function values for denormalized inputs.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The function value sin(X) or cos(X) returned in Fp0 if SIN or
+// COS is requested. Otherwise, for SINCOS, sin(X) is returned
+// in Fp0, and cos(X) is returned in Fp1.
+//
+// Modifies: Fp0 for SIN or COS; both Fp0 and Fp1 for SINCOS.
+//
+// Accuracy and Monotonicity: The returned result is within 1 ulp in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The programs sSIN and sCOS take approximately 150 cycles for
+// input argument X such that |X| < 15Pi, which is the the usual
+// situation. The speed for sSINCOS is approximately 190 cycles.
+//
+// Algorithm:
+//
+// SIN and COS:
+// 1. If SIN is invoked, set AdjN := 0; otherwise, set AdjN := 1.
+//
+// 2. If |X| >= 15Pi or |X| < 2**(-40), go to 7.
+//
+// 3. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let
+// k = N mod 4, so in particular, k = 0,1,2,or 3. Overwrite
+// k by k := k + AdjN.
+//
+// 4. If k is even, go to 6.
+//
+// 5. (k is odd) Set j := (k-1)/2, sgn := (-1)**j. Return sgn*cos(r)
+// where cos(r) is approximated by an even polynomial in r,
+// 1 + r*r*(B1+s*(B2+ ... + s*B8)), s = r*r.
+// Exit.
+//
+// 6. (k is even) Set j := k/2, sgn := (-1)**j. Return sgn*sin(r)
+// where sin(r) is approximated by an odd polynomial in r
+// r + r*s*(A1+s*(A2+ ... + s*A7)), s = r*r.
+// Exit.
+//
+// 7. If |X| > 1, go to 9.
+//
+// 8. (|X|<2**(-40)) If SIN is invoked, return X; otherwise return 1.
+//
+// 9. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 3.
+//
+// SINCOS:
+// 1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.
+//
+// 2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let
+// k = N mod 4, so in particular, k = 0,1,2,or 3.
+//
+// 3. If k is even, go to 5.
+//
+// 4. (k is odd) Set j1 := (k-1)/2, j2 := j1 (EOR) (k mod 2), i.e.
+// j1 exclusive or with the l.s.b. of k.
+// sgn1 := (-1)**j1, sgn2 := (-1)**j2.
+// SIN(X) = sgn1 * cos(r) and COS(X) = sgn2*sin(r) where
+// sin(r) and cos(r) are computed as odd and even polynomials
+// in r, respectively. Exit
+//
+// 5. (k is even) Set j1 := k/2, sgn1 := (-1)**j1.
+// SIN(X) = sgn1 * sin(r) and COS(X) = sgn1*cos(r) where
+// sin(r) and cos(r) are computed as odd and even polynomials
+// in r, respectively. Exit
+//
+// 6. If |X| > 1, go to 8.
+//
+// 7. (|X|<2**(-40)) SIN(X) = X and COS(X) = 1. Exit.
+//
+// 8. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 2.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SSIN idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+BOUNDS1: .long 0x3FD78000,0x4004BC7E
+TWOBYPI: .long 0x3FE45F30,0x6DC9C883
+
+SINA7: .long 0xBD6AAA77,0xCCC994F5
+SINA6: .long 0x3DE61209,0x7AAE8DA1
+
+SINA5: .long 0xBE5AE645,0x2A118AE4
+SINA4: .long 0x3EC71DE3,0xA5341531
+
+SINA3: .long 0xBF2A01A0,0x1A018B59,0x00000000,0x00000000
+
+SINA2: .long 0x3FF80000,0x88888888,0x888859AF,0x00000000
+
+SINA1: .long 0xBFFC0000,0xAAAAAAAA,0xAAAAAA99,0x00000000
+
+COSB8: .long 0x3D2AC4D0,0xD6011EE3
+COSB7: .long 0xBDA9396F,0x9F45AC19
+
+COSB6: .long 0x3E21EED9,0x0612C972
+COSB5: .long 0xBE927E4F,0xB79D9FCF
+
+COSB4: .long 0x3EFA01A0,0x1A01D423,0x00000000,0x00000000
+
+COSB3: .long 0xBFF50000,0xB60B60B6,0x0B61D438,0x00000000
+
+COSB2: .long 0x3FFA0000,0xAAAAAAAA,0xAAAAAB5E
+COSB1: .long 0xBF000000
+
+INVTWOPI: .long 0x3FFC0000,0xA2F9836E,0x4E44152A
+
+TWOPI1: .long 0x40010000,0xC90FDAA2,0x00000000,0x00000000
+TWOPI2: .long 0x3FDF0000,0x85A308D4,0x00000000,0x00000000
+
+ |xref PITBL
+
+ .set INARG,FP_SCR4
+
+ .set X,FP_SCR5
+ .set XDCARE,X+2
+ .set XFRAC,X+4
+
+ .set RPRIME,FP_SCR1
+ .set SPRIME,FP_SCR2
+
+ .set POSNEG1,L_SCR1
+ .set TWOTO63,L_SCR1
+
+ .set ENDFLAG,L_SCR2
+ .set N,L_SCR2
+
+ .set ADJN,L_SCR3
+
+ | xref t_frcinx
+ |xref t_extdnrm
+ |xref sto_cos
+
+ .global ssind
+ssind:
+//--SIN(X) = X FOR DENORMALIZED X
+ bra t_extdnrm
+
+ .global scosd
+scosd:
+//--COS(X) = 1 FOR DENORMALIZED X
+
+ fmoves #0x3F800000,%fp0
+//
+// 9D25B Fix: Sometimes the previous fmove.s sets fpsr bits
+//
+ fmovel #0,%fpsr
+//
+ bra t_frcinx
+
+ .global ssin
+ssin:
+//--SET ADJN TO 0
+ movel #0,ADJN(%a6)
+ bras SINBGN
+
+ .global scos
+scos:
+//--SET ADJN TO 1
+ movel #1,ADJN(%a6)
+
+SINBGN:
+//--SAVE FPCR, FP1. CHECK IF |X| IS TOO SMALL OR LARGE
+
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ fmovex %fp0,X(%a6)
+ andil #0x7FFFFFFF,%d0 // ...COMPACTIFY X
+
+ cmpil #0x3FD78000,%d0 // ...|X| >= 2**(-40)?
+ bges SOK1
+ bra SINSM
+
+SOK1:
+ cmpil #0x4004BC7E,%d0 // ...|X| < 15 PI?
+ blts SINMAIN
+ bra REDUCEX
+
+SINMAIN:
+//--THIS IS THE USUAL CASE, |X| <= 15 PI.
+//--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
+ fmovex %fp0,%fp1
+ fmuld TWOBYPI,%fp1 // ...X*2/PI
+
+//--HIDE THE NEXT THREE INSTRUCTIONS
+ lea PITBL+0x200,%a1 // ...TABLE OF N*PI/2, N = -32,...,32
+
+
+//--FP1 IS NOW READY
+ fmovel %fp1,N(%a6) // ...CONVERT TO INTEGER
+
+ movel N(%a6),%d0
+ asll #4,%d0
+ addal %d0,%a1 // ...A1 IS THE ADDRESS OF N*PIBY2
+// ...WHICH IS IN TWO PIECES Y1 & Y2
+
+ fsubx (%a1)+,%fp0 // ...X-Y1
+//--HIDE THE NEXT ONE
+ fsubs (%a1),%fp0 // ...FP0 IS R = (X-Y1)-Y2
+
+SINCONT:
+//--continuation from REDUCEX
+
+//--GET N+ADJN AND SEE IF SIN(R) OR COS(R) IS NEEDED
+ movel N(%a6),%d0
+ addl ADJN(%a6),%d0 // ...SEE IF D0 IS ODD OR EVEN
+ rorl #1,%d0 // ...D0 WAS ODD IFF D0 IS NEGATIVE
+ cmpil #0,%d0
+ blt COSPOLY
+
+SINPOLY:
+//--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.
+//--THEN WE RETURN SGN*SIN(R). SGN*SIN(R) IS COMPUTED BY
+//--R' + R'*S*(A1 + S(A2 + S(A3 + S(A4 + ... + SA7)))), WHERE
+//--R' = SGN*R, S=R*R. THIS CAN BE REWRITTEN AS
+//--R' + R'*S*( [A1+T(A3+T(A5+TA7))] + [S(A2+T(A4+TA6))])
+//--WHERE T=S*S.
+//--NOTE THAT A3 THROUGH A7 ARE STORED IN DOUBLE PRECISION
+//--WHILE A1 AND A2 ARE IN DOUBLE-EXTENDED FORMAT.
+ fmovex %fp0,X(%a6) // ...X IS R
+ fmulx %fp0,%fp0 // ...FP0 IS S
+//---HIDE THE NEXT TWO WHILE WAITING FOR FP0
+ fmoved SINA7,%fp3
+ fmoved SINA6,%fp2
+//--FP0 IS NOW READY
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...FP1 IS T
+//--HIDE THE NEXT TWO WHILE WAITING FOR FP1
+
+ rorl #1,%d0
+ andil #0x80000000,%d0
+// ...LEAST SIG. BIT OF D0 IN SIGN POSITION
+ eorl %d0,X(%a6) // ...X IS NOW R'= SGN*R
+
+ fmulx %fp1,%fp3 // ...TA7
+ fmulx %fp1,%fp2 // ...TA6
+
+ faddd SINA5,%fp3 // ...A5+TA7
+ faddd SINA4,%fp2 // ...A4+TA6
+
+ fmulx %fp1,%fp3 // ...T(A5+TA7)
+ fmulx %fp1,%fp2 // ...T(A4+TA6)
+
+ faddd SINA3,%fp3 // ...A3+T(A5+TA7)
+ faddx SINA2,%fp2 // ...A2+T(A4+TA6)
+
+ fmulx %fp3,%fp1 // ...T(A3+T(A5+TA7))
+
+ fmulx %fp0,%fp2 // ...S(A2+T(A4+TA6))
+ faddx SINA1,%fp1 // ...A1+T(A3+T(A5+TA7))
+ fmulx X(%a6),%fp0 // ...R'*S
+
+ faddx %fp2,%fp1 // ...[A1+T(A3+T(A5+TA7))]+[S(A2+T(A4+TA6))]
+//--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING
+//--FP2 RELEASED, RESTORE NOW AND TAKE FULL ADVANTAGE OF HIDING
+
+
+ fmulx %fp1,%fp0 // ...SIN(R')-R'
+//--FP1 RELEASED.
+
+ fmovel %d1,%FPCR //restore users exceptions
+ faddx X(%a6),%fp0 //last inst - possible exception set
+ bra t_frcinx
+
+
+COSPOLY:
+//--LET J BE THE LEAST SIG. BIT OF D0, LET SGN := (-1)**J.
+//--THEN WE RETURN SGN*COS(R). SGN*COS(R) IS COMPUTED BY
+//--SGN + S'*(B1 + S(B2 + S(B3 + S(B4 + ... + SB8)))), WHERE
+//--S=R*R AND S'=SGN*S. THIS CAN BE REWRITTEN AS
+//--SGN + S'*([B1+T(B3+T(B5+TB7))] + [S(B2+T(B4+T(B6+TB8)))])
+//--WHERE T=S*S.
+//--NOTE THAT B4 THROUGH B8 ARE STORED IN DOUBLE PRECISION
+//--WHILE B2 AND B3 ARE IN DOUBLE-EXTENDED FORMAT, B1 IS -1/2
+//--AND IS THEREFORE STORED AS SINGLE PRECISION.
+
+ fmulx %fp0,%fp0 // ...FP0 IS S
+//---HIDE THE NEXT TWO WHILE WAITING FOR FP0
+ fmoved COSB8,%fp2
+ fmoved COSB7,%fp3
+//--FP0 IS NOW READY
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...FP1 IS T
+//--HIDE THE NEXT TWO WHILE WAITING FOR FP1
+ fmovex %fp0,X(%a6) // ...X IS S
+ rorl #1,%d0
+ andil #0x80000000,%d0
+// ...LEAST SIG. BIT OF D0 IN SIGN POSITION
+
+ fmulx %fp1,%fp2 // ...TB8
+//--HIDE THE NEXT TWO WHILE WAITING FOR THE XU
+ eorl %d0,X(%a6) // ...X IS NOW S'= SGN*S
+ andil #0x80000000,%d0
+
+ fmulx %fp1,%fp3 // ...TB7
+//--HIDE THE NEXT TWO WHILE WAITING FOR THE XU
+ oril #0x3F800000,%d0 // ...D0 IS SGN IN SINGLE
+ movel %d0,POSNEG1(%a6)
+
+ faddd COSB6,%fp2 // ...B6+TB8
+ faddd COSB5,%fp3 // ...B5+TB7
+
+ fmulx %fp1,%fp2 // ...T(B6+TB8)
+ fmulx %fp1,%fp3 // ...T(B5+TB7)
+
+ faddd COSB4,%fp2 // ...B4+T(B6+TB8)
+ faddx COSB3,%fp3 // ...B3+T(B5+TB7)
+
+ fmulx %fp1,%fp2 // ...T(B4+T(B6+TB8))
+ fmulx %fp3,%fp1 // ...T(B3+T(B5+TB7))
+
+ faddx COSB2,%fp2 // ...B2+T(B4+T(B6+TB8))
+ fadds COSB1,%fp1 // ...B1+T(B3+T(B5+TB7))
+
+ fmulx %fp2,%fp0 // ...S(B2+T(B4+T(B6+TB8)))
+//--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING
+//--FP2 RELEASED.
+
+
+ faddx %fp1,%fp0
+//--FP1 RELEASED
+
+ fmulx X(%a6),%fp0
+
+ fmovel %d1,%FPCR //restore users exceptions
+ fadds POSNEG1(%a6),%fp0 //last inst - possible exception set
+ bra t_frcinx
+
+
+SINBORS:
+//--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
+//--IF |X| < 2**(-40), RETURN X OR 1.
+ cmpil #0x3FFF8000,%d0
+ bgts REDUCEX
+
+
+SINSM:
+ movel ADJN(%a6),%d0
+ cmpil #0,%d0
+ bgts COSTINY
+
+SINTINY:
+ movew #0x0000,XDCARE(%a6) // ...JUST IN CASE
+ fmovel %d1,%FPCR //restore users exceptions
+ fmovex X(%a6),%fp0 //last inst - possible exception set
+ bra t_frcinx
+
+
+COSTINY:
+ fmoves #0x3F800000,%fp0
+
+ fmovel %d1,%FPCR //restore users exceptions
+ fsubs #0x00800000,%fp0 //last inst - possible exception set
+ bra t_frcinx
+
+
+REDUCEX:
+//--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
+//--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
+//--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
+
+ fmovemx %fp2-%fp5,-(%a7) // ...save FP2 through FP5
+ movel %d2,-(%a7)
+ fmoves #0x00000000,%fp1
+//--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
+//--there is a danger of unwanted overflow in first LOOP iteration. In this
+//--case, reduce argument by one remainder step to make subsequent reduction
+//--safe.
+ cmpil #0x7ffeffff,%d0 //is argument dangerously large?
+ bnes LOOP
+ movel #0x7ffe0000,FP_SCR2(%a6) //yes
+// ;create 2**16383*PI/2
+ movel #0xc90fdaa2,FP_SCR2+4(%a6)
+ clrl FP_SCR2+8(%a6)
+ ftstx %fp0 //test sign of argument
+ movel #0x7fdc0000,FP_SCR3(%a6) //create low half of 2**16383*
+// ;PI/2 at FP_SCR3
+ movel #0x85a308d3,FP_SCR3+4(%a6)
+ clrl FP_SCR3+8(%a6)
+ fblt red_neg
+ orw #0x8000,FP_SCR2(%a6) //positive arg
+ orw #0x8000,FP_SCR3(%a6)
+red_neg:
+ faddx FP_SCR2(%a6),%fp0 //high part of reduction is exact
+ fmovex %fp0,%fp1 //save high result in fp1
+ faddx FP_SCR3(%a6),%fp0 //low part of reduction
+ fsubx %fp0,%fp1 //determine low component of result
+ faddx FP_SCR3(%a6),%fp1 //fp0/fp1 are reduced argument.
+
+//--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
+//--integer quotient will be stored in N
+//--Intermediate remainder is 66-bit long; (R,r) in (FP0,FP1)
+
+LOOP:
+ fmovex %fp0,INARG(%a6) // ...+-2**K * F, 1 <= F < 2
+ movew INARG(%a6),%d0
+ movel %d0,%a1 // ...save a copy of D0
+ andil #0x00007FFF,%d0
+ subil #0x00003FFF,%d0 // ...D0 IS K
+ cmpil #28,%d0
+ bles LASTLOOP
+CONTLOOP:
+ subil #27,%d0 // ...D0 IS L := K-27
+ movel #0,ENDFLAG(%a6)
+ bras WORK
+LASTLOOP:
+ clrl %d0 // ...D0 IS L := 0
+ movel #1,ENDFLAG(%a6)
+
+WORK:
+//--FIND THE REMAINDER OF (R,r) W.R.T. 2**L * (PI/2). L IS SO CHOSEN
+//--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.
+
+//--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
+//--2**L * (PIby2_1), 2**L * (PIby2_2)
+
+ movel #0x00003FFE,%d2 // ...BIASED EXPO OF 2/PI
+ subl %d0,%d2 // ...BIASED EXPO OF 2**(-L)*(2/PI)
+
+ movel #0xA2F9836E,FP_SCR1+4(%a6)
+ movel #0x4E44152A,FP_SCR1+8(%a6)
+ movew %d2,FP_SCR1(%a6) // ...FP_SCR1 is 2**(-L)*(2/PI)
+
+ fmovex %fp0,%fp2
+ fmulx FP_SCR1(%a6),%fp2
+//--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
+//--FLOATING POINT FORMAT, THE TWO FMOVE'S FMOVE.L FP <--> N
+//--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
+//--(SIGN(INARG)*2**63 + FP2) - SIGN(INARG)*2**63 WILL GIVE
+//--US THE DESIRED VALUE IN FLOATING POINT.
+
+//--HIDE SIX CYCLES OF INSTRUCTION
+ movel %a1,%d2
+ swap %d2
+ andil #0x80000000,%d2
+ oril #0x5F000000,%d2 // ...D2 IS SIGN(INARG)*2**63 IN SGL
+ movel %d2,TWOTO63(%a6)
+
+ movel %d0,%d2
+ addil #0x00003FFF,%d2 // ...BIASED EXPO OF 2**L * (PI/2)
+
+//--FP2 IS READY
+ fadds TWOTO63(%a6),%fp2 // ...THE FRACTIONAL PART OF FP1 IS ROUNDED
+
+//--HIDE 4 CYCLES OF INSTRUCTION; creating 2**(L)*Piby2_1 and 2**(L)*Piby2_2
+ movew %d2,FP_SCR2(%a6)
+ clrw FP_SCR2+2(%a6)
+ movel #0xC90FDAA2,FP_SCR2+4(%a6)
+ clrl FP_SCR2+8(%a6) // ...FP_SCR2 is 2**(L) * Piby2_1
+
+//--FP2 IS READY
+ fsubs TWOTO63(%a6),%fp2 // ...FP2 is N
+
+ addil #0x00003FDD,%d0
+ movew %d0,FP_SCR3(%a6)
+ clrw FP_SCR3+2(%a6)
+ movel #0x85A308D3,FP_SCR3+4(%a6)
+ clrl FP_SCR3+8(%a6) // ...FP_SCR3 is 2**(L) * Piby2_2
+
+ movel ENDFLAG(%a6),%d0
+
+//--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
+//--P2 = 2**(L) * Piby2_2
+ fmovex %fp2,%fp4
+ fmulx FP_SCR2(%a6),%fp4 // ...W = N*P1
+ fmovex %fp2,%fp5
+ fmulx FP_SCR3(%a6),%fp5 // ...w = N*P2
+ fmovex %fp4,%fp3
+//--we want P+p = W+w but |p| <= half ulp of P
+//--Then, we need to compute A := R-P and a := r-p
+ faddx %fp5,%fp3 // ...FP3 is P
+ fsubx %fp3,%fp4 // ...W-P
+
+ fsubx %fp3,%fp0 // ...FP0 is A := R - P
+ faddx %fp5,%fp4 // ...FP4 is p = (W-P)+w
+
+ fmovex %fp0,%fp3 // ...FP3 A
+ fsubx %fp4,%fp1 // ...FP1 is a := r - p
+
+//--Now we need to normalize (A,a) to "new (R,r)" where R+r = A+a but
+//--|r| <= half ulp of R.
+ faddx %fp1,%fp0 // ...FP0 is R := A+a
+//--No need to calculate r if this is the last loop
+ cmpil #0,%d0
+ bgt RESTORE
+
+//--Need to calculate r
+ fsubx %fp0,%fp3 // ...A-R
+ faddx %fp3,%fp1 // ...FP1 is r := (A-R)+a
+ bra LOOP
+
+RESTORE:
+ fmovel %fp2,N(%a6)
+ movel (%a7)+,%d2
+ fmovemx (%a7)+,%fp2-%fp5
+
+
+ movel ADJN(%a6),%d0
+ cmpil #4,%d0
+
+ blt SINCONT
+ bras SCCONT
+
+ .global ssincosd
+ssincosd:
+//--SIN AND COS OF X FOR DENORMALIZED X
+
+ fmoves #0x3F800000,%fp1
+ bsr sto_cos //store cosine result
+ bra t_extdnrm
+
+ .global ssincos
+ssincos:
+//--SET ADJN TO 4
+ movel #4,ADJN(%a6)
+
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ fmovex %fp0,X(%a6)
+ andil #0x7FFFFFFF,%d0 // ...COMPACTIFY X
+
+ cmpil #0x3FD78000,%d0 // ...|X| >= 2**(-40)?
+ bges SCOK1
+ bra SCSM
+
+SCOK1:
+ cmpil #0x4004BC7E,%d0 // ...|X| < 15 PI?
+ blts SCMAIN
+ bra REDUCEX
+
+
+SCMAIN:
+//--THIS IS THE USUAL CASE, |X| <= 15 PI.
+//--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
+ fmovex %fp0,%fp1
+ fmuld TWOBYPI,%fp1 // ...X*2/PI
+
+//--HIDE THE NEXT THREE INSTRUCTIONS
+ lea PITBL+0x200,%a1 // ...TABLE OF N*PI/2, N = -32,...,32
+
+
+//--FP1 IS NOW READY
+ fmovel %fp1,N(%a6) // ...CONVERT TO INTEGER
+
+ movel N(%a6),%d0
+ asll #4,%d0
+ addal %d0,%a1 // ...ADDRESS OF N*PIBY2, IN Y1, Y2
+
+ fsubx (%a1)+,%fp0 // ...X-Y1
+ fsubs (%a1),%fp0 // ...FP0 IS R = (X-Y1)-Y2
+
+SCCONT:
+//--continuation point from REDUCEX
+
+//--HIDE THE NEXT TWO
+ movel N(%a6),%d0
+ rorl #1,%d0
+
+ cmpil #0,%d0 // ...D0 < 0 IFF N IS ODD
+ bge NEVEN
+
+NODD:
+//--REGISTERS SAVED SO FAR: D0, A0, FP2.
+
+ fmovex %fp0,RPRIME(%a6)
+ fmulx %fp0,%fp0 // ...FP0 IS S = R*R
+ fmoved SINA7,%fp1 // ...A7
+ fmoved COSB8,%fp2 // ...B8
+ fmulx %fp0,%fp1 // ...SA7
+ movel %d2,-(%a7)
+ movel %d0,%d2
+ fmulx %fp0,%fp2 // ...SB8
+ rorl #1,%d2
+ andil #0x80000000,%d2
+
+ faddd SINA6,%fp1 // ...A6+SA7
+ eorl %d0,%d2
+ andil #0x80000000,%d2
+ faddd COSB7,%fp2 // ...B7+SB8
+
+ fmulx %fp0,%fp1 // ...S(A6+SA7)
+ eorl %d2,RPRIME(%a6)
+ movel (%a7)+,%d2
+ fmulx %fp0,%fp2 // ...S(B7+SB8)
+ rorl #1,%d0
+ andil #0x80000000,%d0
+
+ faddd SINA5,%fp1 // ...A5+S(A6+SA7)
+ movel #0x3F800000,POSNEG1(%a6)
+ eorl %d0,POSNEG1(%a6)
+ faddd COSB6,%fp2 // ...B6+S(B7+SB8)
+
+ fmulx %fp0,%fp1 // ...S(A5+S(A6+SA7))
+ fmulx %fp0,%fp2 // ...S(B6+S(B7+SB8))
+ fmovex %fp0,SPRIME(%a6)
+
+ faddd SINA4,%fp1 // ...A4+S(A5+S(A6+SA7))
+ eorl %d0,SPRIME(%a6)
+ faddd COSB5,%fp2 // ...B5+S(B6+S(B7+SB8))
+
+ fmulx %fp0,%fp1 // ...S(A4+...)
+ fmulx %fp0,%fp2 // ...S(B5+...)
+
+ faddd SINA3,%fp1 // ...A3+S(A4+...)
+ faddd COSB4,%fp2 // ...B4+S(B5+...)
+
+ fmulx %fp0,%fp1 // ...S(A3+...)
+ fmulx %fp0,%fp2 // ...S(B4+...)
+
+ faddx SINA2,%fp1 // ...A2+S(A3+...)
+ faddx COSB3,%fp2 // ...B3+S(B4+...)
+
+ fmulx %fp0,%fp1 // ...S(A2+...)
+ fmulx %fp0,%fp2 // ...S(B3+...)
+
+ faddx SINA1,%fp1 // ...A1+S(A2+...)
+ faddx COSB2,%fp2 // ...B2+S(B3+...)
+
+ fmulx %fp0,%fp1 // ...S(A1+...)
+ fmulx %fp2,%fp0 // ...S(B2+...)
+
+
+
+ fmulx RPRIME(%a6),%fp1 // ...R'S(A1+...)
+ fadds COSB1,%fp0 // ...B1+S(B2...)
+ fmulx SPRIME(%a6),%fp0 // ...S'(B1+S(B2+...))
+
+ movel %d1,-(%sp) //restore users mode & precision
+ andil #0xff,%d1 //mask off all exceptions
+ fmovel %d1,%FPCR
+ faddx RPRIME(%a6),%fp1 // ...COS(X)
+ bsr sto_cos //store cosine result
+ fmovel (%sp)+,%FPCR //restore users exceptions
+ fadds POSNEG1(%a6),%fp0 // ...SIN(X)
+
+ bra t_frcinx
+
+
+NEVEN:
+//--REGISTERS SAVED SO FAR: FP2.
+
+ fmovex %fp0,RPRIME(%a6)
+ fmulx %fp0,%fp0 // ...FP0 IS S = R*R
+ fmoved COSB8,%fp1 // ...B8
+ fmoved SINA7,%fp2 // ...A7
+ fmulx %fp0,%fp1 // ...SB8
+ fmovex %fp0,SPRIME(%a6)
+ fmulx %fp0,%fp2 // ...SA7
+ rorl #1,%d0
+ andil #0x80000000,%d0
+ faddd COSB7,%fp1 // ...B7+SB8
+ faddd SINA6,%fp2 // ...A6+SA7
+ eorl %d0,RPRIME(%a6)
+ eorl %d0,SPRIME(%a6)
+ fmulx %fp0,%fp1 // ...S(B7+SB8)
+ oril #0x3F800000,%d0
+ movel %d0,POSNEG1(%a6)
+ fmulx %fp0,%fp2 // ...S(A6+SA7)
+
+ faddd COSB6,%fp1 // ...B6+S(B7+SB8)
+ faddd SINA5,%fp2 // ...A5+S(A6+SA7)
+
+ fmulx %fp0,%fp1 // ...S(B6+S(B7+SB8))
+ fmulx %fp0,%fp2 // ...S(A5+S(A6+SA7))
+
+ faddd COSB5,%fp1 // ...B5+S(B6+S(B7+SB8))
+ faddd SINA4,%fp2 // ...A4+S(A5+S(A6+SA7))
+
+ fmulx %fp0,%fp1 // ...S(B5+...)
+ fmulx %fp0,%fp2 // ...S(A4+...)
+
+ faddd COSB4,%fp1 // ...B4+S(B5+...)
+ faddd SINA3,%fp2 // ...A3+S(A4+...)
+
+ fmulx %fp0,%fp1 // ...S(B4+...)
+ fmulx %fp0,%fp2 // ...S(A3+...)
+
+ faddx COSB3,%fp1 // ...B3+S(B4+...)
+ faddx SINA2,%fp2 // ...A2+S(A3+...)
+
+ fmulx %fp0,%fp1 // ...S(B3+...)
+ fmulx %fp0,%fp2 // ...S(A2+...)
+
+ faddx COSB2,%fp1 // ...B2+S(B3+...)
+ faddx SINA1,%fp2 // ...A1+S(A2+...)
+
+ fmulx %fp0,%fp1 // ...S(B2+...)
+ fmulx %fp2,%fp0 // ...s(a1+...)
+
+
+
+ fadds COSB1,%fp1 // ...B1+S(B2...)
+ fmulx RPRIME(%a6),%fp0 // ...R'S(A1+...)
+ fmulx SPRIME(%a6),%fp1 // ...S'(B1+S(B2+...))
+
+ movel %d1,-(%sp) //save users mode & precision
+ andil #0xff,%d1 //mask off all exceptions
+ fmovel %d1,%FPCR
+ fadds POSNEG1(%a6),%fp1 // ...COS(X)
+ bsr sto_cos //store cosine result
+ fmovel (%sp)+,%FPCR //restore users exceptions
+ faddx RPRIME(%a6),%fp0 // ...SIN(X)
+
+ bra t_frcinx
+
+SCBORS:
+ cmpil #0x3FFF8000,%d0
+ bgt REDUCEX
+
+
+SCSM:
+ movew #0x0000,XDCARE(%a6)
+ fmoves #0x3F800000,%fp1
+
+ movel %d1,-(%sp) //save users mode & precision
+ andil #0xff,%d1 //mask off all exceptions
+ fmovel %d1,%FPCR
+ fsubs #0x00800000,%fp1
+ bsr sto_cos //store cosine result
+ fmovel (%sp)+,%FPCR //restore users exceptions
+ fmovex X(%a6),%fp0
+ bra t_frcinx
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/ssinh.s b/c/src/lib/libcpu/m68k/m68040/fpsp/ssinh.s
new file mode 100644
index 0000000000..3fb689441a
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/ssinh.s
@@ -0,0 +1,135 @@
+//
+// ssinh.sa 3.1 12/10/90
+//
+// The entry point sSinh computes the hyperbolic sine of
+// an input argument; sSinhd does the same except for denormalized
+// input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value sinh(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 3 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program sSINH takes approximately 280 cycles.
+//
+// Algorithm:
+//
+// SINH
+// 1. If |X| > 16380 log2, go to 3.
+//
+// 2. (|X| <= 16380 log2) Sinh(X) is obtained by the formulae
+// y = |X|, sgn = sign(X), and z = expm1(Y),
+// sinh(X) = sgn*(1/2)*( z + z/(1+z) ).
+// Exit.
+//
+// 3. If |X| > 16480 log2, go to 5.
+//
+// 4. (16380 log2 < |X| <= 16480 log2)
+// sinh(X) = sign(X) * exp(|X|)/2.
+// However, invoking exp(|X|) may cause premature overflow.
+// Thus, we calculate sinh(X) as follows:
+// Y := |X|
+// sgn := sign(X)
+// sgnFact := sgn * 2**(16380)
+// Y' := Y - 16381 log2
+// sinh(X) := sgnFact * exp(Y').
+// Exit.
+//
+// 5. (|X| > 16480 log2) sinh(X) must overflow. Return
+// sign(X)*Huge*Huge to generate overflow and an infinity with
+// the appropriate sign. Huge is the largest finite number in
+// extended format. Exit.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//SSINH idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+T1: .long 0x40C62D38,0xD3D64634 // ... 16381 LOG2 LEAD
+T2: .long 0x3D6F90AE,0xB1E75CC7 // ... 16381 LOG2 TRAIL
+
+ |xref t_frcinx
+ |xref t_ovfl
+ |xref t_extdnrm
+ |xref setox
+ |xref setoxm1
+
+ .global ssinhd
+ssinhd:
+//--SINH(X) = X FOR DENORMALIZED X
+
+ bra t_extdnrm
+
+ .global ssinh
+ssinh:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ movel %d0,%a1 // save a copy of original (compacted) operand
+ andl #0x7FFFFFFF,%d0
+ cmpl #0x400CB167,%d0
+ bgts SINHBIG
+
+//--THIS IS THE USUAL CASE, |X| < 16380 LOG2
+//--Y = |X|, Z = EXPM1(Y), SINH(X) = SIGN(X)*(1/2)*( Z + Z/(1+Z) )
+
+ fabsx %fp0 // ...Y = |X|
+
+ moveml %a1/%d1,-(%sp)
+ fmovemx %fp0-%fp0,(%a0)
+ clrl %d1
+ bsr setoxm1 // ...FP0 IS Z = EXPM1(Y)
+ fmovel #0,%fpcr
+ moveml (%sp)+,%a1/%d1
+
+ fmovex %fp0,%fp1
+ fadds #0x3F800000,%fp1 // ...1+Z
+ fmovex %fp0,-(%sp)
+ fdivx %fp1,%fp0 // ...Z/(1+Z)
+ movel %a1,%d0
+ andl #0x80000000,%d0
+ orl #0x3F000000,%d0
+ faddx (%sp)+,%fp0
+ movel %d0,-(%sp)
+
+ fmovel %d1,%fpcr
+ fmuls (%sp)+,%fp0 //last fp inst - possible exceptions set
+
+ bra t_frcinx
+
+SINHBIG:
+ cmpl #0x400CB2B3,%d0
+ bgt t_ovfl
+ fabsx %fp0
+ fsubd T1(%pc),%fp0 // ...(|X|-16381LOG2_LEAD)
+ movel #0,-(%sp)
+ movel #0x80000000,-(%sp)
+ movel %a1,%d0
+ andl #0x80000000,%d0
+ orl #0x7FFB0000,%d0
+ movel %d0,-(%sp) // ...EXTENDED FMT
+ fsubd T2(%pc),%fp0 // ...|X| - 16381 LOG2, ACCURATE
+
+ movel %d1,-(%sp)
+ clrl %d1
+ fmovemx %fp0-%fp0,(%a0)
+ bsr setox
+ fmovel (%sp)+,%fpcr
+
+ fmulx (%sp)+,%fp0 //possible exception
+ bra t_frcinx
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/stan.s b/c/src/lib/libcpu/m68k/m68040/fpsp/stan.s
new file mode 100644
index 0000000000..c2b8047823
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/stan.s
@@ -0,0 +1,455 @@
+//
+// stan.sa 3.3 7/29/91
+//
+// The entry point stan computes the tangent of
+// an input argument;
+// stand does the same except for denormalized input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value tan(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 3 ulp in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program sTAN takes approximately 170 cycles for
+// input argument X such that |X| < 15Pi, which is the the usual
+// situation.
+//
+// Algorithm:
+//
+// 1. If |X| >= 15Pi or |X| < 2**(-40), go to 6.
+//
+// 2. Decompose X as X = N(Pi/2) + r where |r| <= Pi/4. Let
+// k = N mod 2, so in particular, k = 0 or 1.
+//
+// 3. If k is odd, go to 5.
+//
+// 4. (k is even) Tan(X) = tan(r) and tan(r) is approximated by a
+// rational function U/V where
+// U = r + r*s*(P1 + s*(P2 + s*P3)), and
+// V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))), s = r*r.
+// Exit.
+//
+// 4. (k is odd) Tan(X) = -cot(r). Since tan(r) is approximated by a
+// rational function U/V where
+// U = r + r*s*(P1 + s*(P2 + s*P3)), and
+// V = 1 + s*(Q1 + s*(Q2 + s*(Q3 + s*Q4))), s = r*r,
+// -Cot(r) = -V/U. Exit.
+//
+// 6. If |X| > 1, go to 8.
+//
+// 7. (|X|<2**(-40)) Tan(X) = X. Exit.
+//
+// 8. Overwrite X by X := X rem 2Pi. Now that |X| <= Pi, go back to 2.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//STAN idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+BOUNDS1: .long 0x3FD78000,0x4004BC7E
+TWOBYPI: .long 0x3FE45F30,0x6DC9C883
+
+TANQ4: .long 0x3EA0B759,0xF50F8688
+TANP3: .long 0xBEF2BAA5,0xA8924F04
+
+TANQ3: .long 0xBF346F59,0xB39BA65F,0x00000000,0x00000000
+
+TANP2: .long 0x3FF60000,0xE073D3FC,0x199C4A00,0x00000000
+
+TANQ2: .long 0x3FF90000,0xD23CD684,0x15D95FA1,0x00000000
+
+TANP1: .long 0xBFFC0000,0x8895A6C5,0xFB423BCA,0x00000000
+
+TANQ1: .long 0xBFFD0000,0xEEF57E0D,0xA84BC8CE,0x00000000
+
+INVTWOPI: .long 0x3FFC0000,0xA2F9836E,0x4E44152A,0x00000000
+
+TWOPI1: .long 0x40010000,0xC90FDAA2,0x00000000,0x00000000
+TWOPI2: .long 0x3FDF0000,0x85A308D4,0x00000000,0x00000000
+
+//--N*PI/2, -32 <= N <= 32, IN A LEADING TERM IN EXT. AND TRAILING
+//--TERM IN SGL. NOTE THAT PI IS 64-BIT LONG, THUS N*PI/2 IS AT
+//--MOST 69 BITS LONG.
+ .global PITBL
+PITBL:
+ .long 0xC0040000,0xC90FDAA2,0x2168C235,0x21800000
+ .long 0xC0040000,0xC2C75BCD,0x105D7C23,0xA0D00000
+ .long 0xC0040000,0xBC7EDCF7,0xFF523611,0xA1E80000
+ .long 0xC0040000,0xB6365E22,0xEE46F000,0x21480000
+ .long 0xC0040000,0xAFEDDF4D,0xDD3BA9EE,0xA1200000
+ .long 0xC0040000,0xA9A56078,0xCC3063DD,0x21FC0000
+ .long 0xC0040000,0xA35CE1A3,0xBB251DCB,0x21100000
+ .long 0xC0040000,0x9D1462CE,0xAA19D7B9,0xA1580000
+ .long 0xC0040000,0x96CBE3F9,0x990E91A8,0x21E00000
+ .long 0xC0040000,0x90836524,0x88034B96,0x20B00000
+ .long 0xC0040000,0x8A3AE64F,0x76F80584,0xA1880000
+ .long 0xC0040000,0x83F2677A,0x65ECBF73,0x21C40000
+ .long 0xC0030000,0xFB53D14A,0xA9C2F2C2,0x20000000
+ .long 0xC0030000,0xEEC2D3A0,0x87AC669F,0x21380000
+ .long 0xC0030000,0xE231D5F6,0x6595DA7B,0xA1300000
+ .long 0xC0030000,0xD5A0D84C,0x437F4E58,0x9FC00000
+ .long 0xC0030000,0xC90FDAA2,0x2168C235,0x21000000
+ .long 0xC0030000,0xBC7EDCF7,0xFF523611,0xA1680000
+ .long 0xC0030000,0xAFEDDF4D,0xDD3BA9EE,0xA0A00000
+ .long 0xC0030000,0xA35CE1A3,0xBB251DCB,0x20900000
+ .long 0xC0030000,0x96CBE3F9,0x990E91A8,0x21600000
+ .long 0xC0030000,0x8A3AE64F,0x76F80584,0xA1080000
+ .long 0xC0020000,0xFB53D14A,0xA9C2F2C2,0x1F800000
+ .long 0xC0020000,0xE231D5F6,0x6595DA7B,0xA0B00000
+ .long 0xC0020000,0xC90FDAA2,0x2168C235,0x20800000
+ .long 0xC0020000,0xAFEDDF4D,0xDD3BA9EE,0xA0200000
+ .long 0xC0020000,0x96CBE3F9,0x990E91A8,0x20E00000
+ .long 0xC0010000,0xFB53D14A,0xA9C2F2C2,0x1F000000
+ .long 0xC0010000,0xC90FDAA2,0x2168C235,0x20000000
+ .long 0xC0010000,0x96CBE3F9,0x990E91A8,0x20600000
+ .long 0xC0000000,0xC90FDAA2,0x2168C235,0x1F800000
+ .long 0xBFFF0000,0xC90FDAA2,0x2168C235,0x1F000000
+ .long 0x00000000,0x00000000,0x00000000,0x00000000
+ .long 0x3FFF0000,0xC90FDAA2,0x2168C235,0x9F000000
+ .long 0x40000000,0xC90FDAA2,0x2168C235,0x9F800000
+ .long 0x40010000,0x96CBE3F9,0x990E91A8,0xA0600000
+ .long 0x40010000,0xC90FDAA2,0x2168C235,0xA0000000
+ .long 0x40010000,0xFB53D14A,0xA9C2F2C2,0x9F000000
+ .long 0x40020000,0x96CBE3F9,0x990E91A8,0xA0E00000
+ .long 0x40020000,0xAFEDDF4D,0xDD3BA9EE,0x20200000
+ .long 0x40020000,0xC90FDAA2,0x2168C235,0xA0800000
+ .long 0x40020000,0xE231D5F6,0x6595DA7B,0x20B00000
+ .long 0x40020000,0xFB53D14A,0xA9C2F2C2,0x9F800000
+ .long 0x40030000,0x8A3AE64F,0x76F80584,0x21080000
+ .long 0x40030000,0x96CBE3F9,0x990E91A8,0xA1600000
+ .long 0x40030000,0xA35CE1A3,0xBB251DCB,0xA0900000
+ .long 0x40030000,0xAFEDDF4D,0xDD3BA9EE,0x20A00000
+ .long 0x40030000,0xBC7EDCF7,0xFF523611,0x21680000
+ .long 0x40030000,0xC90FDAA2,0x2168C235,0xA1000000
+ .long 0x40030000,0xD5A0D84C,0x437F4E58,0x1FC00000
+ .long 0x40030000,0xE231D5F6,0x6595DA7B,0x21300000
+ .long 0x40030000,0xEEC2D3A0,0x87AC669F,0xA1380000
+ .long 0x40030000,0xFB53D14A,0xA9C2F2C2,0xA0000000
+ .long 0x40040000,0x83F2677A,0x65ECBF73,0xA1C40000
+ .long 0x40040000,0x8A3AE64F,0x76F80584,0x21880000
+ .long 0x40040000,0x90836524,0x88034B96,0xA0B00000
+ .long 0x40040000,0x96CBE3F9,0x990E91A8,0xA1E00000
+ .long 0x40040000,0x9D1462CE,0xAA19D7B9,0x21580000
+ .long 0x40040000,0xA35CE1A3,0xBB251DCB,0xA1100000
+ .long 0x40040000,0xA9A56078,0xCC3063DD,0xA1FC0000
+ .long 0x40040000,0xAFEDDF4D,0xDD3BA9EE,0x21200000
+ .long 0x40040000,0xB6365E22,0xEE46F000,0xA1480000
+ .long 0x40040000,0xBC7EDCF7,0xFF523611,0x21E80000
+ .long 0x40040000,0xC2C75BCD,0x105D7C23,0x20D00000
+ .long 0x40040000,0xC90FDAA2,0x2168C235,0xA1800000
+
+ .set INARG,FP_SCR4
+
+ .set TWOTO63,L_SCR1
+ .set ENDFLAG,L_SCR2
+ .set N,L_SCR3
+
+ | xref t_frcinx
+ |xref t_extdnrm
+
+ .global stand
+stand:
+//--TAN(X) = X FOR DENORMALIZED X
+
+ bra t_extdnrm
+
+ .global stan
+stan:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ andil #0x7FFFFFFF,%d0
+
+ cmpil #0x3FD78000,%d0 // ...|X| >= 2**(-40)?
+ bges TANOK1
+ bra TANSM
+TANOK1:
+ cmpil #0x4004BC7E,%d0 // ...|X| < 15 PI?
+ blts TANMAIN
+ bra REDUCEX
+
+
+TANMAIN:
+//--THIS IS THE USUAL CASE, |X| <= 15 PI.
+//--THE ARGUMENT REDUCTION IS DONE BY TABLE LOOK UP.
+ fmovex %fp0,%fp1
+ fmuld TWOBYPI,%fp1 // ...X*2/PI
+
+//--HIDE THE NEXT TWO INSTRUCTIONS
+ leal PITBL+0x200,%a1 // ...TABLE OF N*PI/2, N = -32,...,32
+
+//--FP1 IS NOW READY
+ fmovel %fp1,%d0 // ...CONVERT TO INTEGER
+
+ asll #4,%d0
+ addal %d0,%a1 // ...ADDRESS N*PIBY2 IN Y1, Y2
+
+ fsubx (%a1)+,%fp0 // ...X-Y1
+//--HIDE THE NEXT ONE
+
+ fsubs (%a1),%fp0 // ...FP0 IS R = (X-Y1)-Y2
+
+ rorl #5,%d0
+ andil #0x80000000,%d0 // ...D0 WAS ODD IFF D0 < 0
+
+TANCONT:
+
+ cmpil #0,%d0
+ blt NODD
+
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...S = R*R
+
+ fmoved TANQ4,%fp3
+ fmoved TANP3,%fp2
+
+ fmulx %fp1,%fp3 // ...SQ4
+ fmulx %fp1,%fp2 // ...SP3
+
+ faddd TANQ3,%fp3 // ...Q3+SQ4
+ faddx TANP2,%fp2 // ...P2+SP3
+
+ fmulx %fp1,%fp3 // ...S(Q3+SQ4)
+ fmulx %fp1,%fp2 // ...S(P2+SP3)
+
+ faddx TANQ2,%fp3 // ...Q2+S(Q3+SQ4)
+ faddx TANP1,%fp2 // ...P1+S(P2+SP3)
+
+ fmulx %fp1,%fp3 // ...S(Q2+S(Q3+SQ4))
+ fmulx %fp1,%fp2 // ...S(P1+S(P2+SP3))
+
+ faddx TANQ1,%fp3 // ...Q1+S(Q2+S(Q3+SQ4))
+ fmulx %fp0,%fp2 // ...RS(P1+S(P2+SP3))
+
+ fmulx %fp3,%fp1 // ...S(Q1+S(Q2+S(Q3+SQ4)))
+
+
+ faddx %fp2,%fp0 // ...R+RS(P1+S(P2+SP3))
+
+
+ fadds #0x3F800000,%fp1 // ...1+S(Q1+...)
+
+ fmovel %d1,%fpcr //restore users exceptions
+ fdivx %fp1,%fp0 //last inst - possible exception set
+
+ bra t_frcinx
+
+NODD:
+ fmovex %fp0,%fp1
+ fmulx %fp0,%fp0 // ...S = R*R
+
+ fmoved TANQ4,%fp3
+ fmoved TANP3,%fp2
+
+ fmulx %fp0,%fp3 // ...SQ4
+ fmulx %fp0,%fp2 // ...SP3
+
+ faddd TANQ3,%fp3 // ...Q3+SQ4
+ faddx TANP2,%fp2 // ...P2+SP3
+
+ fmulx %fp0,%fp3 // ...S(Q3+SQ4)
+ fmulx %fp0,%fp2 // ...S(P2+SP3)
+
+ faddx TANQ2,%fp3 // ...Q2+S(Q3+SQ4)
+ faddx TANP1,%fp2 // ...P1+S(P2+SP3)
+
+ fmulx %fp0,%fp3 // ...S(Q2+S(Q3+SQ4))
+ fmulx %fp0,%fp2 // ...S(P1+S(P2+SP3))
+
+ faddx TANQ1,%fp3 // ...Q1+S(Q2+S(Q3+SQ4))
+ fmulx %fp1,%fp2 // ...RS(P1+S(P2+SP3))
+
+ fmulx %fp3,%fp0 // ...S(Q1+S(Q2+S(Q3+SQ4)))
+
+
+ faddx %fp2,%fp1 // ...R+RS(P1+S(P2+SP3))
+ fadds #0x3F800000,%fp0 // ...1+S(Q1+...)
+
+
+ fmovex %fp1,-(%sp)
+ eoril #0x80000000,(%sp)
+
+ fmovel %d1,%fpcr //restore users exceptions
+ fdivx (%sp)+,%fp0 //last inst - possible exception set
+
+ bra t_frcinx
+
+TANBORS:
+//--IF |X| > 15PI, WE USE THE GENERAL ARGUMENT REDUCTION.
+//--IF |X| < 2**(-40), RETURN X OR 1.
+ cmpil #0x3FFF8000,%d0
+ bgts REDUCEX
+
+TANSM:
+
+ fmovex %fp0,-(%sp)
+ fmovel %d1,%fpcr //restore users exceptions
+ fmovex (%sp)+,%fp0 //last inst - possible exception set
+
+ bra t_frcinx
+
+
+REDUCEX:
+//--WHEN REDUCEX IS USED, THE CODE WILL INEVITABLY BE SLOW.
+//--THIS REDUCTION METHOD, HOWEVER, IS MUCH FASTER THAN USING
+//--THE REMAINDER INSTRUCTION WHICH IS NOW IN SOFTWARE.
+
+ fmovemx %fp2-%fp5,-(%a7) // ...save FP2 through FP5
+ movel %d2,-(%a7)
+ fmoves #0x00000000,%fp1
+
+//--If compact form of abs(arg) in d0=$7ffeffff, argument is so large that
+//--there is a danger of unwanted overflow in first LOOP iteration. In this
+//--case, reduce argument by one remainder step to make subsequent reduction
+//--safe.
+ cmpil #0x7ffeffff,%d0 //is argument dangerously large?
+ bnes LOOP
+ movel #0x7ffe0000,FP_SCR2(%a6) //yes
+// ;create 2**16383*PI/2
+ movel #0xc90fdaa2,FP_SCR2+4(%a6)
+ clrl FP_SCR2+8(%a6)
+ ftstx %fp0 //test sign of argument
+ movel #0x7fdc0000,FP_SCR3(%a6) //create low half of 2**16383*
+// ;PI/2 at FP_SCR3
+ movel #0x85a308d3,FP_SCR3+4(%a6)
+ clrl FP_SCR3+8(%a6)
+ fblt red_neg
+ orw #0x8000,FP_SCR2(%a6) //positive arg
+ orw #0x8000,FP_SCR3(%a6)
+red_neg:
+ faddx FP_SCR2(%a6),%fp0 //high part of reduction is exact
+ fmovex %fp0,%fp1 //save high result in fp1
+ faddx FP_SCR3(%a6),%fp0 //low part of reduction
+ fsubx %fp0,%fp1 //determine low component of result
+ faddx FP_SCR3(%a6),%fp1 //fp0/fp1 are reduced argument.
+
+//--ON ENTRY, FP0 IS X, ON RETURN, FP0 IS X REM PI/2, |X| <= PI/4.
+//--integer quotient will be stored in N
+//--Intermediate remainder is 66-bit long; (R,r) in (FP0,FP1)
+
+LOOP:
+ fmovex %fp0,INARG(%a6) // ...+-2**K * F, 1 <= F < 2
+ movew INARG(%a6),%d0
+ movel %d0,%a1 // ...save a copy of D0
+ andil #0x00007FFF,%d0
+ subil #0x00003FFF,%d0 // ...D0 IS K
+ cmpil #28,%d0
+ bles LASTLOOP
+CONTLOOP:
+ subil #27,%d0 // ...D0 IS L := K-27
+ movel #0,ENDFLAG(%a6)
+ bras WORK
+LASTLOOP:
+ clrl %d0 // ...D0 IS L := 0
+ movel #1,ENDFLAG(%a6)
+
+WORK:
+//--FIND THE REMAINDER OF (R,r) W.R.T. 2**L * (PI/2). L IS SO CHOSEN
+//--THAT INT( X * (2/PI) / 2**(L) ) < 2**29.
+
+//--CREATE 2**(-L) * (2/PI), SIGN(INARG)*2**(63),
+//--2**L * (PIby2_1), 2**L * (PIby2_2)
+
+ movel #0x00003FFE,%d2 // ...BIASED EXPO OF 2/PI
+ subl %d0,%d2 // ...BIASED EXPO OF 2**(-L)*(2/PI)
+
+ movel #0xA2F9836E,FP_SCR1+4(%a6)
+ movel #0x4E44152A,FP_SCR1+8(%a6)
+ movew %d2,FP_SCR1(%a6) // ...FP_SCR1 is 2**(-L)*(2/PI)
+
+ fmovex %fp0,%fp2
+ fmulx FP_SCR1(%a6),%fp2
+//--WE MUST NOW FIND INT(FP2). SINCE WE NEED THIS VALUE IN
+//--FLOATING POINT FORMAT, THE TWO FMOVE'S FMOVE.L FP <--> N
+//--WILL BE TOO INEFFICIENT. THE WAY AROUND IT IS THAT
+//--(SIGN(INARG)*2**63 + FP2) - SIGN(INARG)*2**63 WILL GIVE
+//--US THE DESIRED VALUE IN FLOATING POINT.
+
+//--HIDE SIX CYCLES OF INSTRUCTION
+ movel %a1,%d2
+ swap %d2
+ andil #0x80000000,%d2
+ oril #0x5F000000,%d2 // ...D2 IS SIGN(INARG)*2**63 IN SGL
+ movel %d2,TWOTO63(%a6)
+
+ movel %d0,%d2
+ addil #0x00003FFF,%d2 // ...BIASED EXPO OF 2**L * (PI/2)
+
+//--FP2 IS READY
+ fadds TWOTO63(%a6),%fp2 // ...THE FRACTIONAL PART OF FP1 IS ROUNDED
+
+//--HIDE 4 CYCLES OF INSTRUCTION; creating 2**(L)*Piby2_1 and 2**(L)*Piby2_2
+ movew %d2,FP_SCR2(%a6)
+ clrw FP_SCR2+2(%a6)
+ movel #0xC90FDAA2,FP_SCR2+4(%a6)
+ clrl FP_SCR2+8(%a6) // ...FP_SCR2 is 2**(L) * Piby2_1
+
+//--FP2 IS READY
+ fsubs TWOTO63(%a6),%fp2 // ...FP2 is N
+
+ addil #0x00003FDD,%d0
+ movew %d0,FP_SCR3(%a6)
+ clrw FP_SCR3+2(%a6)
+ movel #0x85A308D3,FP_SCR3+4(%a6)
+ clrl FP_SCR3+8(%a6) // ...FP_SCR3 is 2**(L) * Piby2_2
+
+ movel ENDFLAG(%a6),%d0
+
+//--We are now ready to perform (R+r) - N*P1 - N*P2, P1 = 2**(L) * Piby2_1 and
+//--P2 = 2**(L) * Piby2_2
+ fmovex %fp2,%fp4
+ fmulx FP_SCR2(%a6),%fp4 // ...W = N*P1
+ fmovex %fp2,%fp5
+ fmulx FP_SCR3(%a6),%fp5 // ...w = N*P2
+ fmovex %fp4,%fp3
+//--we want P+p = W+w but |p| <= half ulp of P
+//--Then, we need to compute A := R-P and a := r-p
+ faddx %fp5,%fp3 // ...FP3 is P
+ fsubx %fp3,%fp4 // ...W-P
+
+ fsubx %fp3,%fp0 // ...FP0 is A := R - P
+ faddx %fp5,%fp4 // ...FP4 is p = (W-P)+w
+
+ fmovex %fp0,%fp3 // ...FP3 A
+ fsubx %fp4,%fp1 // ...FP1 is a := r - p
+
+//--Now we need to normalize (A,a) to "new (R,r)" where R+r = A+a but
+//--|r| <= half ulp of R.
+ faddx %fp1,%fp0 // ...FP0 is R := A+a
+//--No need to calculate r if this is the last loop
+ cmpil #0,%d0
+ bgt RESTORE
+
+//--Need to calculate r
+ fsubx %fp0,%fp3 // ...A-R
+ faddx %fp3,%fp1 // ...FP1 is r := (A-R)+a
+ bra LOOP
+
+RESTORE:
+ fmovel %fp2,N(%a6)
+ movel (%a7)+,%d2
+ fmovemx (%a7)+,%fp2-%fp5
+
+
+ movel N(%a6),%d0
+ rorl #1,%d0
+
+
+ bra TANCONT
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/stanh.s b/c/src/lib/libcpu/m68k/m68040/fpsp/stanh.s
new file mode 100644
index 0000000000..d2601cafa7
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/stanh.s
@@ -0,0 +1,185 @@
+//
+// stanh.sa 3.1 12/10/90
+//
+// The entry point sTanh computes the hyperbolic tangent of
+// an input argument; sTanhd does the same except for denormalized
+// input.
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The value tanh(X) returned in floating-point register Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 3 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program stanh takes approximately 270 cycles.
+//
+// Algorithm:
+//
+// TANH
+// 1. If |X| >= (5/2) log2 or |X| <= 2**(-40), go to 3.
+//
+// 2. (2**(-40) < |X| < (5/2) log2) Calculate tanh(X) by
+// sgn := sign(X), y := 2|X|, z := expm1(Y), and
+// tanh(X) = sgn*( z/(2+z) ).
+// Exit.
+//
+// 3. (|X| <= 2**(-40) or |X| >= (5/2) log2). If |X| < 1,
+// go to 7.
+//
+// 4. (|X| >= (5/2) log2) If |X| >= 50 log2, go to 6.
+//
+// 5. ((5/2) log2 <= |X| < 50 log2) Calculate tanh(X) by
+// sgn := sign(X), y := 2|X|, z := exp(Y),
+// tanh(X) = sgn - [ sgn*2/(1+z) ].
+// Exit.
+//
+// 6. (|X| >= 50 log2) Tanh(X) = +-1 (round to nearest). Thus, we
+// calculate Tanh(X) by
+// sgn := sign(X), Tiny := 2**(-126),
+// tanh(X) := sgn - sgn*Tiny.
+// Exit.
+//
+// 7. (|X| < 2**(-40)). Tanh(X) = X. Exit.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//STANH idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ .set X,FP_SCR5
+ .set XDCARE,X+2
+ .set XFRAC,X+4
+
+ .set SGN,L_SCR3
+
+ .set V,FP_SCR6
+
+BOUNDS1: .long 0x3FD78000,0x3FFFDDCE // ... 2^(-40), (5/2)LOG2
+
+ |xref t_frcinx
+ |xref t_extdnrm
+ |xref setox
+ |xref setoxm1
+
+ .global stanhd
+stanhd:
+//--TANH(X) = X FOR DENORMALIZED X
+
+ bra t_extdnrm
+
+ .global stanh
+stanh:
+ fmovex (%a0),%fp0 // ...LOAD INPUT
+
+ fmovex %fp0,X(%a6)
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ movel %d0,X(%a6)
+ andl #0x7FFFFFFF,%d0
+ cmp2l BOUNDS1(%pc),%d0 // ...2**(-40) < |X| < (5/2)LOG2 ?
+ bcss TANHBORS
+
+//--THIS IS THE USUAL CASE
+//--Y = 2|X|, Z = EXPM1(Y), TANH(X) = SIGN(X) * Z / (Z+2).
+
+ movel X(%a6),%d0
+ movel %d0,SGN(%a6)
+ andl #0x7FFF0000,%d0
+ addl #0x00010000,%d0 // ...EXPONENT OF 2|X|
+ movel %d0,X(%a6)
+ andl #0x80000000,SGN(%a6)
+ fmovex X(%a6),%fp0 // ...FP0 IS Y = 2|X|
+
+ movel %d1,-(%a7)
+ clrl %d1
+ fmovemx %fp0-%fp0,(%a0)
+ bsr setoxm1 // ...FP0 IS Z = EXPM1(Y)
+ movel (%a7)+,%d1
+
+ fmovex %fp0,%fp1
+ fadds #0x40000000,%fp1 // ...Z+2
+ movel SGN(%a6),%d0
+ fmovex %fp1,V(%a6)
+ eorl %d0,V(%a6)
+
+ fmovel %d1,%FPCR //restore users exceptions
+ fdivx V(%a6),%fp0
+ bra t_frcinx
+
+TANHBORS:
+ cmpl #0x3FFF8000,%d0
+ blt TANHSM
+
+ cmpl #0x40048AA1,%d0
+ bgt TANHHUGE
+
+//-- (5/2) LOG2 < |X| < 50 LOG2,
+//--TANH(X) = 1 - (2/[EXP(2X)+1]). LET Y = 2|X|, SGN = SIGN(X),
+//--TANH(X) = SGN - SGN*2/[EXP(Y)+1].
+
+ movel X(%a6),%d0
+ movel %d0,SGN(%a6)
+ andl #0x7FFF0000,%d0
+ addl #0x00010000,%d0 // ...EXPO OF 2|X|
+ movel %d0,X(%a6) // ...Y = 2|X|
+ andl #0x80000000,SGN(%a6)
+ movel SGN(%a6),%d0
+ fmovex X(%a6),%fp0 // ...Y = 2|X|
+
+ movel %d1,-(%a7)
+ clrl %d1
+ fmovemx %fp0-%fp0,(%a0)
+ bsr setox // ...FP0 IS EXP(Y)
+ movel (%a7)+,%d1
+ movel SGN(%a6),%d0
+ fadds #0x3F800000,%fp0 // ...EXP(Y)+1
+
+ eorl #0xC0000000,%d0 // ...-SIGN(X)*2
+ fmoves %d0,%fp1 // ...-SIGN(X)*2 IN SGL FMT
+ fdivx %fp0,%fp1 // ...-SIGN(X)2 / [EXP(Y)+1 ]
+
+ movel SGN(%a6),%d0
+ orl #0x3F800000,%d0 // ...SGN
+ fmoves %d0,%fp0 // ...SGN IN SGL FMT
+
+ fmovel %d1,%FPCR //restore users exceptions
+ faddx %fp1,%fp0
+
+ bra t_frcinx
+
+TANHSM:
+ movew #0x0000,XDCARE(%a6)
+
+ fmovel %d1,%FPCR //restore users exceptions
+ fmovex X(%a6),%fp0 //last inst - possible exception set
+
+ bra t_frcinx
+
+TANHHUGE:
+//---RETURN SGN(X) - SGN(X)EPS
+ movel X(%a6),%d0
+ andl #0x80000000,%d0
+ orl #0x3F800000,%d0
+ fmoves %d0,%fp0
+ andl #0x80000000,%d0
+ eorl #0x80800000,%d0 // ...-SIGN(X)*EPS
+
+ fmovel %d1,%FPCR //restore users exceptions
+ fadds %d0,%fp0
+
+ bra t_frcinx
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/sto_res.s b/c/src/lib/libcpu/m68k/m68040/fpsp/sto_res.s
new file mode 100644
index 0000000000..fcf98a66ed
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/sto_res.s
@@ -0,0 +1,98 @@
+//
+// sto_res.sa 3.1 12/10/90
+//
+// Takes the result and puts it in where the user expects it.
+// Library functions return result in fp0. If fp0 is not the
+// users destination register then fp0 is moved to the the
+// correct floating-point destination register. fp0 and fp1
+// are then restored to the original contents.
+//
+// Input: result in fp0,fp1
+//
+// d2 & a0 should be kept unmodified
+//
+// Output: moves the result to the true destination reg or mem
+//
+// Modifies: destination floating point register
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+STO_RES: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ .global sto_cos
+sto_cos:
+ bfextu CMDREG1B(%a6){#13:#3},%d0 //extract cos destination
+ cmpib #3,%d0 //check for fp0/fp1 cases
+ bles c_fp0123
+ fmovemx %fp1-%fp1,-(%a7)
+ moveql #7,%d1
+ subl %d0,%d1 //d1 = 7- (dest. reg. no.)
+ clrl %d0
+ bsetl %d1,%d0 //d0 is dynamic register mask
+ fmovemx (%a7)+,%d0
+ rts
+c_fp0123:
+ cmpib #0,%d0
+ beqs c_is_fp0
+ cmpib #1,%d0
+ beqs c_is_fp1
+ cmpib #2,%d0
+ beqs c_is_fp2
+c_is_fp3:
+ fmovemx %fp1-%fp1,USER_FP3(%a6)
+ rts
+c_is_fp2:
+ fmovemx %fp1-%fp1,USER_FP2(%a6)
+ rts
+c_is_fp1:
+ fmovemx %fp1-%fp1,USER_FP1(%a6)
+ rts
+c_is_fp0:
+ fmovemx %fp1-%fp1,USER_FP0(%a6)
+ rts
+
+
+ .global sto_res
+sto_res:
+ bfextu CMDREG1B(%a6){#6:#3},%d0 //extract destination register
+ cmpib #3,%d0 //check for fp0/fp1 cases
+ bles fp0123
+ fmovemx %fp0-%fp0,-(%a7)
+ moveql #7,%d1
+ subl %d0,%d1 //d1 = 7- (dest. reg. no.)
+ clrl %d0
+ bsetl %d1,%d0 //d0 is dynamic register mask
+ fmovemx (%a7)+,%d0
+ rts
+fp0123:
+ cmpib #0,%d0
+ beqs is_fp0
+ cmpib #1,%d0
+ beqs is_fp1
+ cmpib #2,%d0
+ beqs is_fp2
+is_fp3:
+ fmovemx %fp0-%fp0,USER_FP3(%a6)
+ rts
+is_fp2:
+ fmovemx %fp0-%fp0,USER_FP2(%a6)
+ rts
+is_fp1:
+ fmovemx %fp0-%fp0,USER_FP1(%a6)
+ rts
+is_fp0:
+ fmovemx %fp0-%fp0,USER_FP0(%a6)
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/stwotox.s b/c/src/lib/libcpu/m68k/m68040/fpsp/stwotox.s
new file mode 100644
index 0000000000..e4db1c9765
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/stwotox.s
@@ -0,0 +1,427 @@
+//
+// stwotox.sa 3.1 12/10/90
+//
+// stwotox --- 2**X
+// stwotoxd --- 2**X for denormalized X
+// stentox --- 10**X
+// stentoxd --- 10**X for denormalized X
+//
+// Input: Double-extended number X in location pointed to
+// by address register a0.
+//
+// Output: The function values are returned in Fp0.
+//
+// Accuracy and Monotonicity: The returned result is within 2 ulps in
+// 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
+// result is subsequently rounded to double precision. The
+// result is provably monotonic in double precision.
+//
+// Speed: The program stwotox takes approximately 190 cycles and the
+// program stentox takes approximately 200 cycles.
+//
+// Algorithm:
+//
+// twotox
+// 1. If |X| > 16480, go to ExpBig.
+//
+// 2. If |X| < 2**(-70), go to ExpSm.
+//
+// 3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore
+// decompose N as
+// N = 64(M + M') + j, j = 0,1,2,...,63.
+//
+// 4. Overwrite r := r * log2. Then
+// 2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
+// Go to expr to compute that expression.
+//
+// tentox
+// 1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.
+//
+// 2. If |X| < 2**(-70), go to ExpSm.
+//
+// 3. Set y := X*log_2(10)*64 (base 2 log of 10). Set
+// N := round-to-int(y). Decompose N as
+// N = 64(M + M') + j, j = 0,1,2,...,63.
+//
+// 4. Define r as
+// r := ((X - N*L1)-N*L2) * L10
+// where L1, L2 are the leading and trailing parts of log_10(2)/64
+// and L10 is the natural log of 10. Then
+// 10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
+// Go to expr to compute that expression.
+//
+// expr
+// 1. Fetch 2**(j/64) from table as Fact1 and Fact2.
+//
+// 2. Overwrite Fact1 and Fact2 by
+// Fact1 := 2**(M) * Fact1
+// Fact2 := 2**(M) * Fact2
+// Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).
+//
+// 3. Calculate P where 1 + P approximates exp(r):
+// P = r + r*r*(A1+r*(A2+...+r*A5)).
+//
+// 4. Let AdjFact := 2**(M'). Return
+// AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).
+// Exit.
+//
+// ExpBig
+// 1. Generate overflow by Huge * Huge if X > 0; otherwise, generate
+// underflow by Tiny * Tiny.
+//
+// ExpSm
+// 1. Return 1 + X.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//STWOTOX idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+BOUNDS1: .long 0x3FB98000,0x400D80C0 // ... 2^(-70),16480
+BOUNDS2: .long 0x3FB98000,0x400B9B07 // ... 2^(-70),16480 LOG2/LOG10
+
+L2TEN64: .long 0x406A934F,0x0979A371 // ... 64LOG10/LOG2
+L10TWO1: .long 0x3F734413,0x509F8000 // ... LOG2/64LOG10
+
+L10TWO2: .long 0xBFCD0000,0xC0219DC1,0xDA994FD2,0x00000000
+
+LOG10: .long 0x40000000,0x935D8DDD,0xAAA8AC17,0x00000000
+
+LOG2: .long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
+
+EXPA5: .long 0x3F56C16D,0x6F7BD0B2
+EXPA4: .long 0x3F811112,0x302C712C
+EXPA3: .long 0x3FA55555,0x55554CC1
+EXPA2: .long 0x3FC55555,0x55554A54
+EXPA1: .long 0x3FE00000,0x00000000,0x00000000,0x00000000
+
+HUGE: .long 0x7FFE0000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
+TINY: .long 0x00010000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
+
+EXPTBL:
+ .long 0x3FFF0000,0x80000000,0x00000000,0x3F738000
+ .long 0x3FFF0000,0x8164D1F3,0xBC030773,0x3FBEF7CA
+ .long 0x3FFF0000,0x82CD8698,0xAC2BA1D7,0x3FBDF8A9
+ .long 0x3FFF0000,0x843A28C3,0xACDE4046,0x3FBCD7C9
+ .long 0x3FFF0000,0x85AAC367,0xCC487B15,0xBFBDE8DA
+ .long 0x3FFF0000,0x871F6196,0x9E8D1010,0x3FBDE85C
+ .long 0x3FFF0000,0x88980E80,0x92DA8527,0x3FBEBBF1
+ .long 0x3FFF0000,0x8A14D575,0x496EFD9A,0x3FBB80CA
+ .long 0x3FFF0000,0x8B95C1E3,0xEA8BD6E7,0xBFBA8373
+ .long 0x3FFF0000,0x8D1ADF5B,0x7E5BA9E6,0xBFBE9670
+ .long 0x3FFF0000,0x8EA4398B,0x45CD53C0,0x3FBDB700
+ .long 0x3FFF0000,0x9031DC43,0x1466B1DC,0x3FBEEEB0
+ .long 0x3FFF0000,0x91C3D373,0xAB11C336,0x3FBBFD6D
+ .long 0x3FFF0000,0x935A2B2F,0x13E6E92C,0xBFBDB319
+ .long 0x3FFF0000,0x94F4EFA8,0xFEF70961,0x3FBDBA2B
+ .long 0x3FFF0000,0x96942D37,0x20185A00,0x3FBE91D5
+ .long 0x3FFF0000,0x9837F051,0x8DB8A96F,0x3FBE8D5A
+ .long 0x3FFF0000,0x99E04593,0x20B7FA65,0xBFBCDE7B
+ .long 0x3FFF0000,0x9B8D39B9,0xD54E5539,0xBFBEBAAF
+ .long 0x3FFF0000,0x9D3ED9A7,0x2CFFB751,0xBFBD86DA
+ .long 0x3FFF0000,0x9EF53260,0x91A111AE,0xBFBEBEDD
+ .long 0x3FFF0000,0xA0B0510F,0xB9714FC2,0x3FBCC96E
+ .long 0x3FFF0000,0xA2704303,0x0C496819,0xBFBEC90B
+ .long 0x3FFF0000,0xA43515AE,0x09E6809E,0x3FBBD1DB
+ .long 0x3FFF0000,0xA5FED6A9,0xB15138EA,0x3FBCE5EB
+ .long 0x3FFF0000,0xA7CD93B4,0xE965356A,0xBFBEC274
+ .long 0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x3FBEA83C
+ .long 0x3FFF0000,0xAB7A39B5,0xA93ED337,0x3FBECB00
+ .long 0x3FFF0000,0xAD583EEA,0x42A14AC6,0x3FBE9301
+ .long 0x3FFF0000,0xAF3B78AD,0x690A4375,0xBFBD8367
+ .long 0x3FFF0000,0xB123F581,0xD2AC2590,0xBFBEF05F
+ .long 0x3FFF0000,0xB311C412,0xA9112489,0x3FBDFB3C
+ .long 0x3FFF0000,0xB504F333,0xF9DE6484,0x3FBEB2FB
+ .long 0x3FFF0000,0xB6FD91E3,0x28D17791,0x3FBAE2CB
+ .long 0x3FFF0000,0xB8FBAF47,0x62FB9EE9,0x3FBCDC3C
+ .long 0x3FFF0000,0xBAFF5AB2,0x133E45FB,0x3FBEE9AA
+ .long 0x3FFF0000,0xBD08A39F,0x580C36BF,0xBFBEAEFD
+ .long 0x3FFF0000,0xBF1799B6,0x7A731083,0xBFBCBF51
+ .long 0x3FFF0000,0xC12C4CCA,0x66709456,0x3FBEF88A
+ .long 0x3FFF0000,0xC346CCDA,0x24976407,0x3FBD83B2
+ .long 0x3FFF0000,0xC5672A11,0x5506DADD,0x3FBDF8AB
+ .long 0x3FFF0000,0xC78D74C8,0xABB9B15D,0xBFBDFB17
+ .long 0x3FFF0000,0xC9B9BD86,0x6E2F27A3,0xBFBEFE3C
+ .long 0x3FFF0000,0xCBEC14FE,0xF2727C5D,0xBFBBB6F8
+ .long 0x3FFF0000,0xCE248C15,0x1F8480E4,0xBFBCEE53
+ .long 0x3FFF0000,0xD06333DA,0xEF2B2595,0xBFBDA4AE
+ .long 0x3FFF0000,0xD2A81D91,0xF12AE45A,0x3FBC9124
+ .long 0x3FFF0000,0xD4F35AAB,0xCFEDFA1F,0x3FBEB243
+ .long 0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x3FBDE69A
+ .long 0x3FFF0000,0xD99D15C2,0x78AFD7B6,0xBFB8BC61
+ .long 0x3FFF0000,0xDBFBB797,0xDAF23755,0x3FBDF610
+ .long 0x3FFF0000,0xDE60F482,0x5E0E9124,0xBFBD8BE1
+ .long 0x3FFF0000,0xE0CCDEEC,0x2A94E111,0x3FBACB12
+ .long 0x3FFF0000,0xE33F8972,0xBE8A5A51,0x3FBB9BFE
+ .long 0x3FFF0000,0xE5B906E7,0x7C8348A8,0x3FBCF2F4
+ .long 0x3FFF0000,0xE8396A50,0x3C4BDC68,0x3FBEF22F
+ .long 0x3FFF0000,0xEAC0C6E7,0xDD24392F,0xBFBDBF4A
+ .long 0x3FFF0000,0xED4F301E,0xD9942B84,0x3FBEC01A
+ .long 0x3FFF0000,0xEFE4B99B,0xDCDAF5CB,0x3FBE8CAC
+ .long 0x3FFF0000,0xF281773C,0x59FFB13A,0xBFBCBB3F
+ .long 0x3FFF0000,0xF5257D15,0x2486CC2C,0x3FBEF73A
+ .long 0x3FFF0000,0xF7D0DF73,0x0AD13BB9,0xBFB8B795
+ .long 0x3FFF0000,0xFA83B2DB,0x722A033A,0x3FBEF84B
+ .long 0x3FFF0000,0xFD3E0C0C,0xF486C175,0xBFBEF581
+
+ .set N,L_SCR1
+
+ .set X,FP_SCR1
+ .set XDCARE,X+2
+ .set XFRAC,X+4
+
+ .set ADJFACT,FP_SCR2
+
+ .set FACT1,FP_SCR3
+ .set FACT1HI,FACT1+4
+ .set FACT1LOW,FACT1+8
+
+ .set FACT2,FP_SCR4
+ .set FACT2HI,FACT2+4
+ .set FACT2LOW,FACT2+8
+
+ | xref t_unfl
+ |xref t_ovfl
+ |xref t_frcinx
+
+ .global stwotoxd
+stwotoxd:
+//--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
+
+ fmovel %d1,%fpcr // ...set user's rounding mode/precision
+ fmoves #0x3F800000,%fp0 // ...RETURN 1 + X
+ movel (%a0),%d0
+ orl #0x00800001,%d0
+ fadds %d0,%fp0
+ bra t_frcinx
+
+ .global stwotox
+stwotox:
+//--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
+ fmovemx (%a0),%fp0-%fp0 // ...LOAD INPUT, do not set cc's
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ fmovex %fp0,X(%a6)
+ andil #0x7FFFFFFF,%d0
+
+ cmpil #0x3FB98000,%d0 // ...|X| >= 2**(-70)?
+ bges TWOOK1
+ bra EXPBORS
+
+TWOOK1:
+ cmpil #0x400D80C0,%d0 // ...|X| > 16480?
+ bles TWOMAIN
+ bra EXPBORS
+
+
+TWOMAIN:
+//--USUAL CASE, 2^(-70) <= |X| <= 16480
+
+ fmovex %fp0,%fp1
+ fmuls #0x42800000,%fp1 // ...64 * X
+
+ fmovel %fp1,N(%a6) // ...N = ROUND-TO-INT(64 X)
+ movel %d2,-(%sp)
+ lea EXPTBL,%a1 // ...LOAD ADDRESS OF TABLE OF 2^(J/64)
+ fmovel N(%a6),%fp1 // ...N --> FLOATING FMT
+ movel N(%a6),%d0
+ movel %d0,%d2
+ andil #0x3F,%d0 // ...D0 IS J
+ asll #4,%d0 // ...DISPLACEMENT FOR 2^(J/64)
+ addal %d0,%a1 // ...ADDRESS FOR 2^(J/64)
+ asrl #6,%d2 // ...d2 IS L, N = 64L + J
+ movel %d2,%d0
+ asrl #1,%d0 // ...D0 IS M
+ subl %d0,%d2 // ...d2 IS M', N = 64(M+M') + J
+ addil #0x3FFF,%d2
+ movew %d2,ADJFACT(%a6) // ...ADJFACT IS 2^(M')
+ movel (%sp)+,%d2
+//--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
+//--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
+//--ADJFACT = 2^(M').
+//--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
+
+ fmuls #0x3C800000,%fp1 // ...(1/64)*N
+ movel (%a1)+,FACT1(%a6)
+ movel (%a1)+,FACT1HI(%a6)
+ movel (%a1)+,FACT1LOW(%a6)
+ movew (%a1)+,FACT2(%a6)
+ clrw FACT2+2(%a6)
+
+ fsubx %fp1,%fp0 // ...X - (1/64)*INT(64 X)
+
+ movew (%a1)+,FACT2HI(%a6)
+ clrw FACT2HI+2(%a6)
+ clrl FACT2LOW(%a6)
+ addw %d0,FACT1(%a6)
+
+ fmulx LOG2,%fp0 // ...FP0 IS R
+ addw %d0,FACT2(%a6)
+
+ bra expr
+
+EXPBORS:
+//--FPCR, D0 SAVED
+ cmpil #0x3FFF8000,%d0
+ bgts EXPBIG
+
+EXPSM:
+//--|X| IS SMALL, RETURN 1 + X
+
+ fmovel %d1,%FPCR //restore users exceptions
+ fadds #0x3F800000,%fp0 // ...RETURN 1 + X
+
+ bra t_frcinx
+
+EXPBIG:
+//--|X| IS LARGE, GENERATE OVERFLOW IF X > 0; ELSE GENERATE UNDERFLOW
+//--REGISTERS SAVE SO FAR ARE FPCR AND D0
+ movel X(%a6),%d0
+ cmpil #0,%d0
+ blts EXPNEG
+
+ bclrb #7,(%a0) //t_ovfl expects positive value
+ bra t_ovfl
+
+EXPNEG:
+ bclrb #7,(%a0) //t_unfl expects positive value
+ bra t_unfl
+
+ .global stentoxd
+stentoxd:
+//--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
+
+ fmovel %d1,%fpcr // ...set user's rounding mode/precision
+ fmoves #0x3F800000,%fp0 // ...RETURN 1 + X
+ movel (%a0),%d0
+ orl #0x00800001,%d0
+ fadds %d0,%fp0
+ bra t_frcinx
+
+ .global stentox
+stentox:
+//--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S
+ fmovemx (%a0),%fp0-%fp0 // ...LOAD INPUT, do not set cc's
+
+ movel (%a0),%d0
+ movew 4(%a0),%d0
+ fmovex %fp0,X(%a6)
+ andil #0x7FFFFFFF,%d0
+
+ cmpil #0x3FB98000,%d0 // ...|X| >= 2**(-70)?
+ bges TENOK1
+ bra EXPBORS
+
+TENOK1:
+ cmpil #0x400B9B07,%d0 // ...|X| <= 16480*log2/log10 ?
+ bles TENMAIN
+ bra EXPBORS
+
+TENMAIN:
+//--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
+
+ fmovex %fp0,%fp1
+ fmuld L2TEN64,%fp1 // ...X*64*LOG10/LOG2
+
+ fmovel %fp1,N(%a6) // ...N=INT(X*64*LOG10/LOG2)
+ movel %d2,-(%sp)
+ lea EXPTBL,%a1 // ...LOAD ADDRESS OF TABLE OF 2^(J/64)
+ fmovel N(%a6),%fp1 // ...N --> FLOATING FMT
+ movel N(%a6),%d0
+ movel %d0,%d2
+ andil #0x3F,%d0 // ...D0 IS J
+ asll #4,%d0 // ...DISPLACEMENT FOR 2^(J/64)
+ addal %d0,%a1 // ...ADDRESS FOR 2^(J/64)
+ asrl #6,%d2 // ...d2 IS L, N = 64L + J
+ movel %d2,%d0
+ asrl #1,%d0 // ...D0 IS M
+ subl %d0,%d2 // ...d2 IS M', N = 64(M+M') + J
+ addil #0x3FFF,%d2
+ movew %d2,ADJFACT(%a6) // ...ADJFACT IS 2^(M')
+ movel (%sp)+,%d2
+
+//--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
+//--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
+//--ADJFACT = 2^(M').
+//--REGISTERS SAVED SO FAR ARE (IN ORDER) FPCR, D0, FP1, a1, AND FP2.
+
+ fmovex %fp1,%fp2
+
+ fmuld L10TWO1,%fp1 // ...N*(LOG2/64LOG10)_LEAD
+ movel (%a1)+,FACT1(%a6)
+
+ fmulx L10TWO2,%fp2 // ...N*(LOG2/64LOG10)_TRAIL
+
+ movel (%a1)+,FACT1HI(%a6)
+ movel (%a1)+,FACT1LOW(%a6)
+ fsubx %fp1,%fp0 // ...X - N L_LEAD
+ movew (%a1)+,FACT2(%a6)
+
+ fsubx %fp2,%fp0 // ...X - N L_TRAIL
+
+ clrw FACT2+2(%a6)
+ movew (%a1)+,FACT2HI(%a6)
+ clrw FACT2HI+2(%a6)
+ clrl FACT2LOW(%a6)
+
+ fmulx LOG10,%fp0 // ...FP0 IS R
+
+ addw %d0,FACT1(%a6)
+ addw %d0,FACT2(%a6)
+
+expr:
+//--FPCR, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
+//--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64).
+//--FP0 IS R. THE FOLLOWING CODE COMPUTES
+//-- 2**(M'+M) * 2**(J/64) * EXP(R)
+
+ fmovex %fp0,%fp1
+ fmulx %fp1,%fp1 // ...FP1 IS S = R*R
+
+ fmoved EXPA5,%fp2 // ...FP2 IS A5
+ fmoved EXPA4,%fp3 // ...FP3 IS A4
+
+ fmulx %fp1,%fp2 // ...FP2 IS S*A5
+ fmulx %fp1,%fp3 // ...FP3 IS S*A4
+
+ faddd EXPA3,%fp2 // ...FP2 IS A3+S*A5
+ faddd EXPA2,%fp3 // ...FP3 IS A2+S*A4
+
+ fmulx %fp1,%fp2 // ...FP2 IS S*(A3+S*A5)
+ fmulx %fp1,%fp3 // ...FP3 IS S*(A2+S*A4)
+
+ faddd EXPA1,%fp2 // ...FP2 IS A1+S*(A3+S*A5)
+ fmulx %fp0,%fp3 // ...FP3 IS R*S*(A2+S*A4)
+
+ fmulx %fp1,%fp2 // ...FP2 IS S*(A1+S*(A3+S*A5))
+ faddx %fp3,%fp0 // ...FP0 IS R+R*S*(A2+S*A4)
+
+ faddx %fp2,%fp0 // ...FP0 IS EXP(R) - 1
+
+
+//--FINAL RECONSTRUCTION PROCESS
+//--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1) - (1 OR 0)
+
+ fmulx FACT1(%a6),%fp0
+ faddx FACT2(%a6),%fp0
+ faddx FACT1(%a6),%fp0
+
+ fmovel %d1,%FPCR //restore users exceptions
+ clrw ADJFACT+2(%a6)
+ movel #0x80000000,ADJFACT+4(%a6)
+ clrl ADJFACT+8(%a6)
+ fmulx ADJFACT(%a6),%fp0 // ...FINAL ADJUSTMENT
+
+ bra t_frcinx
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/tbldo.s b/c/src/lib/libcpu/m68k/m68040/fpsp/tbldo.s
new file mode 100644
index 0000000000..7c64dae3e0
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/tbldo.s
@@ -0,0 +1,554 @@
+//
+// tbldo.sa 3.1 12/10/90
+//
+// Modified:
+// 8/16/90 chinds The table was constructed to use only one level
+// of indirection in do_func for monadic
+// functions. Dyadic functions require two
+// levels, and the tables are still contained
+// in do_func. The table is arranged for
+// index with a 10-bit index, with the first
+// 7 bits the opcode, and the remaining 3
+// the stag. For dyadic functions, all
+// valid addresses are to the generic entry
+// point.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//TBLDO idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ |xref ld_pinf,ld_pone,ld_ppi2
+ |xref t_dz2,t_operr
+ |xref serror,sone,szero,sinf,snzrinx
+ |xref sopr_inf,spi_2,src_nan,szr_inf
+
+ |xref smovcr
+ |xref pmod,prem,pscale
+ |xref satanh,satanhd
+ |xref sacos,sacosd,sasin,sasind,satan,satand
+ |xref setox,setoxd,setoxm1,setoxm1d,setoxm1i
+ |xref sgetexp,sgetexpd,sgetman,sgetmand
+ |xref sint,sintd,sintrz
+ |xref ssincos,ssincosd,ssincosi,ssincosnan,ssincosz
+ |xref scos,scosd,ssin,ssind,stan,stand
+ |xref scosh,scoshd,ssinh,ssinhd,stanh,stanhd
+ |xref sslog10,sslog2,sslogn,sslognp1
+ |xref sslog10d,sslog2d,sslognd,slognp1d
+ |xref stentox,stentoxd,stwotox,stwotoxd
+
+// instruction ;opcode-stag Notes
+ .global tblpre
+tblpre:
+ .long smovcr //$00-0 fmovecr all
+ .long smovcr //$00-1 fmovecr all
+ .long smovcr //$00-2 fmovecr all
+ .long smovcr //$00-3 fmovecr all
+ .long smovcr //$00-4 fmovecr all
+ .long smovcr //$00-5 fmovecr all
+ .long smovcr //$00-6 fmovecr all
+ .long smovcr //$00-7 fmovecr all
+
+ .long sint //$01-0 fint norm
+ .long szero //$01-1 fint zero
+ .long sinf //$01-2 fint inf
+ .long src_nan //$01-3 fint nan
+ .long sintd //$01-4 fint denorm inx
+ .long serror //$01-5 fint ERROR
+ .long serror //$01-6 fint ERROR
+ .long serror //$01-7 fint ERROR
+
+ .long ssinh //$02-0 fsinh norm
+ .long szero //$02-1 fsinh zero
+ .long sinf //$02-2 fsinh inf
+ .long src_nan //$02-3 fsinh nan
+ .long ssinhd //$02-4 fsinh denorm
+ .long serror //$02-5 fsinh ERROR
+ .long serror //$02-6 fsinh ERROR
+ .long serror //$02-7 fsinh ERROR
+
+ .long sintrz //$03-0 fintrz norm
+ .long szero //$03-1 fintrz zero
+ .long sinf //$03-2 fintrz inf
+ .long src_nan //$03-3 fintrz nan
+ .long snzrinx //$03-4 fintrz denorm inx
+ .long serror //$03-5 fintrz ERROR
+ .long serror //$03-6 fintrz ERROR
+ .long serror //$03-7 fintrz ERROR
+
+ .long serror //$04-0 ERROR - illegal extension
+ .long serror //$04-1 ERROR - illegal extension
+ .long serror //$04-2 ERROR - illegal extension
+ .long serror //$04-3 ERROR - illegal extension
+ .long serror //$04-4 ERROR - illegal extension
+ .long serror //$04-5 ERROR - illegal extension
+ .long serror //$04-6 ERROR - illegal extension
+ .long serror //$04-7 ERROR - illegal extension
+
+ .long serror //$05-0 ERROR - illegal extension
+ .long serror //$05-1 ERROR - illegal extension
+ .long serror //$05-2 ERROR - illegal extension
+ .long serror //$05-3 ERROR - illegal extension
+ .long serror //$05-4 ERROR - illegal extension
+ .long serror //$05-5 ERROR - illegal extension
+ .long serror //$05-6 ERROR - illegal extension
+ .long serror //$05-7 ERROR - illegal extension
+
+ .long sslognp1 //$06-0 flognp1 norm
+ .long szero //$06-1 flognp1 zero
+ .long sopr_inf //$06-2 flognp1 inf
+ .long src_nan //$06-3 flognp1 nan
+ .long slognp1d //$06-4 flognp1 denorm
+ .long serror //$06-5 flognp1 ERROR
+ .long serror //$06-6 flognp1 ERROR
+ .long serror //$06-7 flognp1 ERROR
+
+ .long serror //$07-0 ERROR - illegal extension
+ .long serror //$07-1 ERROR - illegal extension
+ .long serror //$07-2 ERROR - illegal extension
+ .long serror //$07-3 ERROR - illegal extension
+ .long serror //$07-4 ERROR - illegal extension
+ .long serror //$07-5 ERROR - illegal extension
+ .long serror //$07-6 ERROR - illegal extension
+ .long serror //$07-7 ERROR - illegal extension
+
+ .long setoxm1 //$08-0 fetoxm1 norm
+ .long szero //$08-1 fetoxm1 zero
+ .long setoxm1i //$08-2 fetoxm1 inf
+ .long src_nan //$08-3 fetoxm1 nan
+ .long setoxm1d //$08-4 fetoxm1 denorm
+ .long serror //$08-5 fetoxm1 ERROR
+ .long serror //$08-6 fetoxm1 ERROR
+ .long serror //$08-7 fetoxm1 ERROR
+
+ .long stanh //$09-0 ftanh norm
+ .long szero //$09-1 ftanh zero
+ .long sone //$09-2 ftanh inf
+ .long src_nan //$09-3 ftanh nan
+ .long stanhd //$09-4 ftanh denorm
+ .long serror //$09-5 ftanh ERROR
+ .long serror //$09-6 ftanh ERROR
+ .long serror //$09-7 ftanh ERROR
+
+ .long satan //$0a-0 fatan norm
+ .long szero //$0a-1 fatan zero
+ .long spi_2 //$0a-2 fatan inf
+ .long src_nan //$0a-3 fatan nan
+ .long satand //$0a-4 fatan denorm
+ .long serror //$0a-5 fatan ERROR
+ .long serror //$0a-6 fatan ERROR
+ .long serror //$0a-7 fatan ERROR
+
+ .long serror //$0b-0 ERROR - illegal extension
+ .long serror //$0b-1 ERROR - illegal extension
+ .long serror //$0b-2 ERROR - illegal extension
+ .long serror //$0b-3 ERROR - illegal extension
+ .long serror //$0b-4 ERROR - illegal extension
+ .long serror //$0b-5 ERROR - illegal extension
+ .long serror //$0b-6 ERROR - illegal extension
+ .long serror //$0b-7 ERROR - illegal extension
+
+ .long sasin //$0c-0 fasin norm
+ .long szero //$0c-1 fasin zero
+ .long t_operr //$0c-2 fasin inf
+ .long src_nan //$0c-3 fasin nan
+ .long sasind //$0c-4 fasin denorm
+ .long serror //$0c-5 fasin ERROR
+ .long serror //$0c-6 fasin ERROR
+ .long serror //$0c-7 fasin ERROR
+
+ .long satanh //$0d-0 fatanh norm
+ .long szero //$0d-1 fatanh zero
+ .long t_operr //$0d-2 fatanh inf
+ .long src_nan //$0d-3 fatanh nan
+ .long satanhd //$0d-4 fatanh denorm
+ .long serror //$0d-5 fatanh ERROR
+ .long serror //$0d-6 fatanh ERROR
+ .long serror //$0d-7 fatanh ERROR
+
+ .long ssin //$0e-0 fsin norm
+ .long szero //$0e-1 fsin zero
+ .long t_operr //$0e-2 fsin inf
+ .long src_nan //$0e-3 fsin nan
+ .long ssind //$0e-4 fsin denorm
+ .long serror //$0e-5 fsin ERROR
+ .long serror //$0e-6 fsin ERROR
+ .long serror //$0e-7 fsin ERROR
+
+ .long stan //$0f-0 ftan norm
+ .long szero //$0f-1 ftan zero
+ .long t_operr //$0f-2 ftan inf
+ .long src_nan //$0f-3 ftan nan
+ .long stand //$0f-4 ftan denorm
+ .long serror //$0f-5 ftan ERROR
+ .long serror //$0f-6 ftan ERROR
+ .long serror //$0f-7 ftan ERROR
+
+ .long setox //$10-0 fetox norm
+ .long ld_pone //$10-1 fetox zero
+ .long szr_inf //$10-2 fetox inf
+ .long src_nan //$10-3 fetox nan
+ .long setoxd //$10-4 fetox denorm
+ .long serror //$10-5 fetox ERROR
+ .long serror //$10-6 fetox ERROR
+ .long serror //$10-7 fetox ERROR
+
+ .long stwotox //$11-0 ftwotox norm
+ .long ld_pone //$11-1 ftwotox zero
+ .long szr_inf //$11-2 ftwotox inf
+ .long src_nan //$11-3 ftwotox nan
+ .long stwotoxd //$11-4 ftwotox denorm
+ .long serror //$11-5 ftwotox ERROR
+ .long serror //$11-6 ftwotox ERROR
+ .long serror //$11-7 ftwotox ERROR
+
+ .long stentox //$12-0 ftentox norm
+ .long ld_pone //$12-1 ftentox zero
+ .long szr_inf //$12-2 ftentox inf
+ .long src_nan //$12-3 ftentox nan
+ .long stentoxd //$12-4 ftentox denorm
+ .long serror //$12-5 ftentox ERROR
+ .long serror //$12-6 ftentox ERROR
+ .long serror //$12-7 ftentox ERROR
+
+ .long serror //$13-0 ERROR - illegal extension
+ .long serror //$13-1 ERROR - illegal extension
+ .long serror //$13-2 ERROR - illegal extension
+ .long serror //$13-3 ERROR - illegal extension
+ .long serror //$13-4 ERROR - illegal extension
+ .long serror //$13-5 ERROR - illegal extension
+ .long serror //$13-6 ERROR - illegal extension
+ .long serror //$13-7 ERROR - illegal extension
+
+ .long sslogn //$14-0 flogn norm
+ .long t_dz2 //$14-1 flogn zero
+ .long sopr_inf //$14-2 flogn inf
+ .long src_nan //$14-3 flogn nan
+ .long sslognd //$14-4 flogn denorm
+ .long serror //$14-5 flogn ERROR
+ .long serror //$14-6 flogn ERROR
+ .long serror //$14-7 flogn ERROR
+
+ .long sslog10 //$15-0 flog10 norm
+ .long t_dz2 //$15-1 flog10 zero
+ .long sopr_inf //$15-2 flog10 inf
+ .long src_nan //$15-3 flog10 nan
+ .long sslog10d //$15-4 flog10 denorm
+ .long serror //$15-5 flog10 ERROR
+ .long serror //$15-6 flog10 ERROR
+ .long serror //$15-7 flog10 ERROR
+
+ .long sslog2 //$16-0 flog2 norm
+ .long t_dz2 //$16-1 flog2 zero
+ .long sopr_inf //$16-2 flog2 inf
+ .long src_nan //$16-3 flog2 nan
+ .long sslog2d //$16-4 flog2 denorm
+ .long serror //$16-5 flog2 ERROR
+ .long serror //$16-6 flog2 ERROR
+ .long serror //$16-7 flog2 ERROR
+
+ .long serror //$17-0 ERROR - illegal extension
+ .long serror //$17-1 ERROR - illegal extension
+ .long serror //$17-2 ERROR - illegal extension
+ .long serror //$17-3 ERROR - illegal extension
+ .long serror //$17-4 ERROR - illegal extension
+ .long serror //$17-5 ERROR - illegal extension
+ .long serror //$17-6 ERROR - illegal extension
+ .long serror //$17-7 ERROR - illegal extension
+
+ .long serror //$18-0 ERROR - illegal extension
+ .long serror //$18-1 ERROR - illegal extension
+ .long serror //$18-2 ERROR - illegal extension
+ .long serror //$18-3 ERROR - illegal extension
+ .long serror //$18-4 ERROR - illegal extension
+ .long serror //$18-5 ERROR - illegal extension
+ .long serror //$18-6 ERROR - illegal extension
+ .long serror //$18-7 ERROR - illegal extension
+
+ .long scosh //$19-0 fcosh norm
+ .long ld_pone //$19-1 fcosh zero
+ .long ld_pinf //$19-2 fcosh inf
+ .long src_nan //$19-3 fcosh nan
+ .long scoshd //$19-4 fcosh denorm
+ .long serror //$19-5 fcosh ERROR
+ .long serror //$19-6 fcosh ERROR
+ .long serror //$19-7 fcosh ERROR
+
+ .long serror //$1a-0 ERROR - illegal extension
+ .long serror //$1a-1 ERROR - illegal extension
+ .long serror //$1a-2 ERROR - illegal extension
+ .long serror //$1a-3 ERROR - illegal extension
+ .long serror //$1a-4 ERROR - illegal extension
+ .long serror //$1a-5 ERROR - illegal extension
+ .long serror //$1a-6 ERROR - illegal extension
+ .long serror //$1a-7 ERROR - illegal extension
+
+ .long serror //$1b-0 ERROR - illegal extension
+ .long serror //$1b-1 ERROR - illegal extension
+ .long serror //$1b-2 ERROR - illegal extension
+ .long serror //$1b-3 ERROR - illegal extension
+ .long serror //$1b-4 ERROR - illegal extension
+ .long serror //$1b-5 ERROR - illegal extension
+ .long serror //$1b-6 ERROR - illegal extension
+ .long serror //$1b-7 ERROR - illegal extension
+
+ .long sacos //$1c-0 facos norm
+ .long ld_ppi2 //$1c-1 facos zero
+ .long t_operr //$1c-2 facos inf
+ .long src_nan //$1c-3 facos nan
+ .long sacosd //$1c-4 facos denorm
+ .long serror //$1c-5 facos ERROR
+ .long serror //$1c-6 facos ERROR
+ .long serror //$1c-7 facos ERROR
+
+ .long scos //$1d-0 fcos norm
+ .long ld_pone //$1d-1 fcos zero
+ .long t_operr //$1d-2 fcos inf
+ .long src_nan //$1d-3 fcos nan
+ .long scosd //$1d-4 fcos denorm
+ .long serror //$1d-5 fcos ERROR
+ .long serror //$1d-6 fcos ERROR
+ .long serror //$1d-7 fcos ERROR
+
+ .long sgetexp //$1e-0 fgetexp norm
+ .long szero //$1e-1 fgetexp zero
+ .long t_operr //$1e-2 fgetexp inf
+ .long src_nan //$1e-3 fgetexp nan
+ .long sgetexpd //$1e-4 fgetexp denorm
+ .long serror //$1e-5 fgetexp ERROR
+ .long serror //$1e-6 fgetexp ERROR
+ .long serror //$1e-7 fgetexp ERROR
+
+ .long sgetman //$1f-0 fgetman norm
+ .long szero //$1f-1 fgetman zero
+ .long t_operr //$1f-2 fgetman inf
+ .long src_nan //$1f-3 fgetman nan
+ .long sgetmand //$1f-4 fgetman denorm
+ .long serror //$1f-5 fgetman ERROR
+ .long serror //$1f-6 fgetman ERROR
+ .long serror //$1f-7 fgetman ERROR
+
+ .long serror //$20-0 ERROR - illegal extension
+ .long serror //$20-1 ERROR - illegal extension
+ .long serror //$20-2 ERROR - illegal extension
+ .long serror //$20-3 ERROR - illegal extension
+ .long serror //$20-4 ERROR - illegal extension
+ .long serror //$20-5 ERROR - illegal extension
+ .long serror //$20-6 ERROR - illegal extension
+ .long serror //$20-7 ERROR - illegal extension
+
+ .long pmod //$21-0 fmod all
+ .long pmod //$21-1 fmod all
+ .long pmod //$21-2 fmod all
+ .long pmod //$21-3 fmod all
+ .long pmod //$21-4 fmod all
+ .long serror //$21-5 fmod ERROR
+ .long serror //$21-6 fmod ERROR
+ .long serror //$21-7 fmod ERROR
+
+ .long serror //$22-0 ERROR - illegal extension
+ .long serror //$22-1 ERROR - illegal extension
+ .long serror //$22-2 ERROR - illegal extension
+ .long serror //$22-3 ERROR - illegal extension
+ .long serror //$22-4 ERROR - illegal extension
+ .long serror //$22-5 ERROR - illegal extension
+ .long serror //$22-6 ERROR - illegal extension
+ .long serror //$22-7 ERROR - illegal extension
+
+ .long serror //$23-0 ERROR - illegal extension
+ .long serror //$23-1 ERROR - illegal extension
+ .long serror //$23-2 ERROR - illegal extension
+ .long serror //$23-3 ERROR - illegal extension
+ .long serror //$23-4 ERROR - illegal extension
+ .long serror //$23-5 ERROR - illegal extension
+ .long serror //$23-6 ERROR - illegal extension
+ .long serror //$23-7 ERROR - illegal extension
+
+ .long serror //$24-0 ERROR - illegal extension
+ .long serror //$24-1 ERROR - illegal extension
+ .long serror //$24-2 ERROR - illegal extension
+ .long serror //$24-3 ERROR - illegal extension
+ .long serror //$24-4 ERROR - illegal extension
+ .long serror //$24-5 ERROR - illegal extension
+ .long serror //$24-6 ERROR - illegal extension
+ .long serror //$24-7 ERROR - illegal extension
+
+ .long prem //$25-0 frem all
+ .long prem //$25-1 frem all
+ .long prem //$25-2 frem all
+ .long prem //$25-3 frem all
+ .long prem //$25-4 frem all
+ .long serror //$25-5 frem ERROR
+ .long serror //$25-6 frem ERROR
+ .long serror //$25-7 frem ERROR
+
+ .long pscale //$26-0 fscale all
+ .long pscale //$26-1 fscale all
+ .long pscale //$26-2 fscale all
+ .long pscale //$26-3 fscale all
+ .long pscale //$26-4 fscale all
+ .long serror //$26-5 fscale ERROR
+ .long serror //$26-6 fscale ERROR
+ .long serror //$26-7 fscale ERROR
+
+ .long serror //$27-0 ERROR - illegal extension
+ .long serror //$27-1 ERROR - illegal extension
+ .long serror //$27-2 ERROR - illegal extension
+ .long serror //$27-3 ERROR - illegal extension
+ .long serror //$27-4 ERROR - illegal extension
+ .long serror //$27-5 ERROR - illegal extension
+ .long serror //$27-6 ERROR - illegal extension
+ .long serror //$27-7 ERROR - illegal extension
+
+ .long serror //$28-0 ERROR - illegal extension
+ .long serror //$28-1 ERROR - illegal extension
+ .long serror //$28-2 ERROR - illegal extension
+ .long serror //$28-3 ERROR - illegal extension
+ .long serror //$28-4 ERROR - illegal extension
+ .long serror //$28-5 ERROR - illegal extension
+ .long serror //$28-6 ERROR - illegal extension
+ .long serror //$28-7 ERROR - illegal extension
+
+ .long serror //$29-0 ERROR - illegal extension
+ .long serror //$29-1 ERROR - illegal extension
+ .long serror //$29-2 ERROR - illegal extension
+ .long serror //$29-3 ERROR - illegal extension
+ .long serror //$29-4 ERROR - illegal extension
+ .long serror //$29-5 ERROR - illegal extension
+ .long serror //$29-6 ERROR - illegal extension
+ .long serror //$29-7 ERROR - illegal extension
+
+ .long serror //$2a-0 ERROR - illegal extension
+ .long serror //$2a-1 ERROR - illegal extension
+ .long serror //$2a-2 ERROR - illegal extension
+ .long serror //$2a-3 ERROR - illegal extension
+ .long serror //$2a-4 ERROR - illegal extension
+ .long serror //$2a-5 ERROR - illegal extension
+ .long serror //$2a-6 ERROR - illegal extension
+ .long serror //$2a-7 ERROR - illegal extension
+
+ .long serror //$2b-0 ERROR - illegal extension
+ .long serror //$2b-1 ERROR - illegal extension
+ .long serror //$2b-2 ERROR - illegal extension
+ .long serror //$2b-3 ERROR - illegal extension
+ .long serror //$2b-4 ERROR - illegal extension
+ .long serror //$2b-5 ERROR - illegal extension
+ .long serror //$2b-6 ERROR - illegal extension
+ .long serror //$2b-7 ERROR - illegal extension
+
+ .long serror //$2c-0 ERROR - illegal extension
+ .long serror //$2c-1 ERROR - illegal extension
+ .long serror //$2c-2 ERROR - illegal extension
+ .long serror //$2c-3 ERROR - illegal extension
+ .long serror //$2c-4 ERROR - illegal extension
+ .long serror //$2c-5 ERROR - illegal extension
+ .long serror //$2c-6 ERROR - illegal extension
+ .long serror //$2c-7 ERROR - illegal extension
+
+ .long serror //$2d-0 ERROR - illegal extension
+ .long serror //$2d-1 ERROR - illegal extension
+ .long serror //$2d-2 ERROR - illegal extension
+ .long serror //$2d-3 ERROR - illegal extension
+ .long serror //$2d-4 ERROR - illegal extension
+ .long serror //$2d-5 ERROR - illegal extension
+ .long serror //$2d-6 ERROR - illegal extension
+ .long serror //$2d-7 ERROR - illegal extension
+
+ .long serror //$2e-0 ERROR - illegal extension
+ .long serror //$2e-1 ERROR - illegal extension
+ .long serror //$2e-2 ERROR - illegal extension
+ .long serror //$2e-3 ERROR - illegal extension
+ .long serror //$2e-4 ERROR - illegal extension
+ .long serror //$2e-5 ERROR - illegal extension
+ .long serror //$2e-6 ERROR - illegal extension
+ .long serror //$2e-7 ERROR - illegal extension
+
+ .long serror //$2f-0 ERROR - illegal extension
+ .long serror //$2f-1 ERROR - illegal extension
+ .long serror //$2f-2 ERROR - illegal extension
+ .long serror //$2f-3 ERROR - illegal extension
+ .long serror //$2f-4 ERROR - illegal extension
+ .long serror //$2f-5 ERROR - illegal extension
+ .long serror //$2f-6 ERROR - illegal extension
+ .long serror //$2f-7 ERROR - illegal extension
+
+ .long ssincos //$30-0 fsincos norm
+ .long ssincosz //$30-1 fsincos zero
+ .long ssincosi //$30-2 fsincos inf
+ .long ssincosnan //$30-3 fsincos nan
+ .long ssincosd //$30-4 fsincos denorm
+ .long serror //$30-5 fsincos ERROR
+ .long serror //$30-6 fsincos ERROR
+ .long serror //$30-7 fsincos ERROR
+
+ .long ssincos //$31-0 fsincos norm
+ .long ssincosz //$31-1 fsincos zero
+ .long ssincosi //$31-2 fsincos inf
+ .long ssincosnan //$31-3 fsincos nan
+ .long ssincosd //$31-4 fsincos denorm
+ .long serror //$31-5 fsincos ERROR
+ .long serror //$31-6 fsincos ERROR
+ .long serror //$31-7 fsincos ERROR
+
+ .long ssincos //$32-0 fsincos norm
+ .long ssincosz //$32-1 fsincos zero
+ .long ssincosi //$32-2 fsincos inf
+ .long ssincosnan //$32-3 fsincos nan
+ .long ssincosd //$32-4 fsincos denorm
+ .long serror //$32-5 fsincos ERROR
+ .long serror //$32-6 fsincos ERROR
+ .long serror //$32-7 fsincos ERROR
+
+ .long ssincos //$33-0 fsincos norm
+ .long ssincosz //$33-1 fsincos zero
+ .long ssincosi //$33-2 fsincos inf
+ .long ssincosnan //$33-3 fsincos nan
+ .long ssincosd //$33-4 fsincos denorm
+ .long serror //$33-5 fsincos ERROR
+ .long serror //$33-6 fsincos ERROR
+ .long serror //$33-7 fsincos ERROR
+
+ .long ssincos //$34-0 fsincos norm
+ .long ssincosz //$34-1 fsincos zero
+ .long ssincosi //$34-2 fsincos inf
+ .long ssincosnan //$34-3 fsincos nan
+ .long ssincosd //$34-4 fsincos denorm
+ .long serror //$34-5 fsincos ERROR
+ .long serror //$34-6 fsincos ERROR
+ .long serror //$34-7 fsincos ERROR
+
+ .long ssincos //$35-0 fsincos norm
+ .long ssincosz //$35-1 fsincos zero
+ .long ssincosi //$35-2 fsincos inf
+ .long ssincosnan //$35-3 fsincos nan
+ .long ssincosd //$35-4 fsincos denorm
+ .long serror //$35-5 fsincos ERROR
+ .long serror //$35-6 fsincos ERROR
+ .long serror //$35-7 fsincos ERROR
+
+ .long ssincos //$36-0 fsincos norm
+ .long ssincosz //$36-1 fsincos zero
+ .long ssincosi //$36-2 fsincos inf
+ .long ssincosnan //$36-3 fsincos nan
+ .long ssincosd //$36-4 fsincos denorm
+ .long serror //$36-5 fsincos ERROR
+ .long serror //$36-6 fsincos ERROR
+ .long serror //$36-7 fsincos ERROR
+
+ .long ssincos //$37-0 fsincos norm
+ .long ssincosz //$37-1 fsincos zero
+ .long ssincosi //$37-2 fsincos inf
+ .long ssincosnan //$37-3 fsincos nan
+ .long ssincosd //$37-4 fsincos denorm
+ .long serror //$37-5 fsincos ERROR
+ .long serror //$37-6 fsincos ERROR
+ .long serror //$37-7 fsincos ERROR
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/util.s b/c/src/lib/libcpu/m68k/m68040/fpsp/util.s
new file mode 100644
index 0000000000..c6f6570437
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/util.s
@@ -0,0 +1,748 @@
+//
+// util.sa 3.7 7/29/91
+//
+// This file contains routines used by other programs.
+//
+// ovf_res: used by overflow to force the correct
+// result. ovf_r_k, ovf_r_x2, ovf_r_x3 are
+// derivatives of this routine.
+// get_fline: get user's opcode word
+// g_dfmtou: returns the destination format.
+// g_opcls: returns the opclass of the float instruction.
+// g_rndpr: returns the rounding precision.
+// reg_dest: write byte, word, or long data to Dn
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+//UTIL idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref mem_read
+
+ .global g_dfmtou
+ .global g_opcls
+ .global g_rndpr
+ .global get_fline
+ .global reg_dest
+
+//
+// Final result table for ovf_res. Note that the negative counterparts
+// are unnecessary as ovf_res always returns the sign separately from
+// the exponent.
+// ;+inf
+EXT_PINF: .long 0x7fff0000,0x00000000,0x00000000,0x00000000
+// ;largest +ext
+EXT_PLRG: .long 0x7ffe0000,0xffffffff,0xffffffff,0x00000000
+// ;largest magnitude +sgl in ext
+SGL_PLRG: .long 0x407e0000,0xffffff00,0x00000000,0x00000000
+// ;largest magnitude +dbl in ext
+DBL_PLRG: .long 0x43fe0000,0xffffffff,0xfffff800,0x00000000
+// ;largest -ext
+
+tblovfl:
+ .long EXT_RN
+ .long EXT_RZ
+ .long EXT_RM
+ .long EXT_RP
+ .long SGL_RN
+ .long SGL_RZ
+ .long SGL_RM
+ .long SGL_RP
+ .long DBL_RN
+ .long DBL_RZ
+ .long DBL_RM
+ .long DBL_RP
+ .long error
+ .long error
+ .long error
+ .long error
+
+
+//
+// ovf_r_k --- overflow result calculation
+//
+// This entry point is used by kernel_ex.
+//
+// This forces the destination precision to be extended
+//
+// Input: operand in ETEMP
+// Output: a result is in ETEMP (internal extended format)
+//
+ .global ovf_r_k
+ovf_r_k:
+ lea ETEMP(%a6),%a0 //a0 points to source operand
+ bclrb #sign_bit,ETEMP_EX(%a6)
+ sne ETEMP_SGN(%a6) //convert to internal IEEE format
+
+//
+// ovf_r_x2 --- overflow result calculation
+//
+// This entry point used by x_ovfl. (opclass 0 and 2)
+//
+// Input a0 points to an operand in the internal extended format
+// Output a0 points to the result in the internal extended format
+//
+// This sets the round precision according to the user's FPCR unless the
+// instruction is fsgldiv or fsglmul or fsadd, fdadd, fsub, fdsub, fsmul,
+// fdmul, fsdiv, fddiv, fssqrt, fsmove, fdmove, fsabs, fdabs, fsneg, fdneg.
+// If the instruction is fsgldiv of fsglmul, the rounding precision must be
+// extended. If the instruction is not fsgldiv or fsglmul but a force-
+// precision instruction, the rounding precision is then set to the force
+// precision.
+
+ .global ovf_r_x2
+ovf_r_x2:
+ btstb #E3,E_BYTE(%a6) //check for nu exception
+ beql ovf_e1_exc //it is cu exception
+ovf_e3_exc:
+ movew CMDREG3B(%a6),%d0 //get the command word
+ andiw #0x00000060,%d0 //clear all bits except 6 and 5
+ cmpil #0x00000040,%d0
+ beql ovff_sgl //force precision is single
+ cmpil #0x00000060,%d0
+ beql ovff_dbl //force precision is double
+ movew CMDREG3B(%a6),%d0 //get the command word again
+ andil #0x7f,%d0 //clear all except operation
+ cmpil #0x33,%d0
+ beql ovf_fsgl //fsglmul or fsgldiv
+ cmpil #0x30,%d0
+ beql ovf_fsgl
+ bra ovf_fpcr //instruction is none of the above
+// ;use FPCR
+ovf_e1_exc:
+ movew CMDREG1B(%a6),%d0 //get command word
+ andil #0x00000044,%d0 //clear all bits except 6 and 2
+ cmpil #0x00000040,%d0
+ beql ovff_sgl //the instruction is force single
+ cmpil #0x00000044,%d0
+ beql ovff_dbl //the instruction is force double
+ movew CMDREG1B(%a6),%d0 //again get the command word
+ andil #0x0000007f,%d0 //clear all except the op code
+ cmpil #0x00000027,%d0
+ beql ovf_fsgl //fsglmul
+ cmpil #0x00000024,%d0
+ beql ovf_fsgl //fsgldiv
+ bra ovf_fpcr //none of the above, use FPCR
+//
+//
+// Inst is either fsgldiv or fsglmul. Force extended precision.
+//
+ovf_fsgl:
+ clrl %d0
+ bras ovf_res
+
+ovff_sgl:
+ movel #0x00000001,%d0 //set single
+ bras ovf_res
+ovff_dbl:
+ movel #0x00000002,%d0 //set double
+ bras ovf_res
+//
+// The precision is in the fpcr.
+//
+ovf_fpcr:
+ bfextu FPCR_MODE(%a6){#0:#2},%d0 //set round precision
+ bras ovf_res
+
+//
+//
+// ovf_r_x3 --- overflow result calculation
+//
+// This entry point used by x_ovfl. (opclass 3 only)
+//
+// Input a0 points to an operand in the internal extended format
+// Output a0 points to the result in the internal extended format
+//
+// This sets the round precision according to the destination size.
+//
+ .global ovf_r_x3
+ovf_r_x3:
+ bsr g_dfmtou //get dest fmt in d0{1:0}
+// ;for fmovout, the destination format
+// ;is the rounding precision
+
+//
+// ovf_res --- overflow result calculation
+//
+// Input:
+// a0 points to operand in internal extended format
+// Output:
+// a0 points to result in internal extended format
+//
+ .global ovf_res
+ovf_res:
+ lsll #2,%d0 //move round precision to d0{3:2}
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //set round mode
+ orl %d1,%d0 //index is fmt:mode in d0{3:0}
+ leal tblovfl,%a1 //load a1 with table address
+ movel %a1@(%d0:l:4),%a1 //use d0 as index to the table
+ jmp (%a1) //go to the correct routine
+//
+//case DEST_FMT = EXT
+//
+EXT_RN:
+ leal EXT_PINF,%a1 //answer is +/- infinity
+ bsetb #inf_bit,FPSR_CC(%a6)
+ bra set_sign //now go set the sign
+EXT_RZ:
+ leal EXT_PLRG,%a1 //answer is +/- large number
+ bra set_sign //now go set the sign
+EXT_RM:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs e_rm_pos
+e_rm_neg:
+ leal EXT_PINF,%a1 //answer is negative infinity
+ orl #neginf_mask,USER_FPSR(%a6)
+ bra end_ovfr
+e_rm_pos:
+ leal EXT_PLRG,%a1 //answer is large positive number
+ bra end_ovfr
+EXT_RP:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs e_rp_pos
+e_rp_neg:
+ leal EXT_PLRG,%a1 //answer is large negative number
+ bsetb #neg_bit,FPSR_CC(%a6)
+ bra end_ovfr
+e_rp_pos:
+ leal EXT_PINF,%a1 //answer is positive infinity
+ bsetb #inf_bit,FPSR_CC(%a6)
+ bra end_ovfr
+//
+//case DEST_FMT = DBL
+//
+DBL_RN:
+ leal EXT_PINF,%a1 //answer is +/- infinity
+ bsetb #inf_bit,FPSR_CC(%a6)
+ bra set_sign
+DBL_RZ:
+ leal DBL_PLRG,%a1 //answer is +/- large number
+ bra set_sign //now go set the sign
+DBL_RM:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs d_rm_pos
+d_rm_neg:
+ leal EXT_PINF,%a1 //answer is negative infinity
+ orl #neginf_mask,USER_FPSR(%a6)
+ bra end_ovfr //inf is same for all precisions (ext,dbl,sgl)
+d_rm_pos:
+ leal DBL_PLRG,%a1 //answer is large positive number
+ bra end_ovfr
+DBL_RP:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs d_rp_pos
+d_rp_neg:
+ leal DBL_PLRG,%a1 //answer is large negative number
+ bsetb #neg_bit,FPSR_CC(%a6)
+ bra end_ovfr
+d_rp_pos:
+ leal EXT_PINF,%a1 //answer is positive infinity
+ bsetb #inf_bit,FPSR_CC(%a6)
+ bra end_ovfr
+//
+//case DEST_FMT = SGL
+//
+SGL_RN:
+ leal EXT_PINF,%a1 //answer is +/- infinity
+ bsetb #inf_bit,FPSR_CC(%a6)
+ bras set_sign
+SGL_RZ:
+ leal SGL_PLRG,%a1 //answer is +/- large number
+ bras set_sign
+SGL_RM:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs s_rm_pos
+s_rm_neg:
+ leal EXT_PINF,%a1 //answer is negative infinity
+ orl #neginf_mask,USER_FPSR(%a6)
+ bras end_ovfr
+s_rm_pos:
+ leal SGL_PLRG,%a1 //answer is large positive number
+ bras end_ovfr
+SGL_RP:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs s_rp_pos
+s_rp_neg:
+ leal SGL_PLRG,%a1 //answer is large negative number
+ bsetb #neg_bit,FPSR_CC(%a6)
+ bras end_ovfr
+s_rp_pos:
+ leal EXT_PINF,%a1 //answer is positive infinity
+ bsetb #inf_bit,FPSR_CC(%a6)
+ bras end_ovfr
+
+set_sign:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs end_ovfr
+neg_sign:
+ bsetb #neg_bit,FPSR_CC(%a6)
+
+end_ovfr:
+ movew LOCAL_EX(%a1),LOCAL_EX(%a0) //do not overwrite sign
+ movel LOCAL_HI(%a1),LOCAL_HI(%a0)
+ movel LOCAL_LO(%a1),LOCAL_LO(%a0)
+ rts
+
+
+//
+// ERROR
+//
+error:
+ rts
+//
+// get_fline --- get f-line opcode of interrupted instruction
+//
+// Returns opcode in the low word of d0.
+//
+get_fline:
+ movel USER_FPIAR(%a6),%a0 //opcode address
+ movel #0,-(%a7) //reserve a word on the stack
+ leal 2(%a7),%a1 //point to low word of temporary
+ movel #2,%d0 //count
+ bsrl mem_read
+ movel (%a7)+,%d0
+ rts
+//
+// g_rndpr --- put rounding precision in d0{1:0}
+//
+// valid return codes are:
+// 00 - extended
+// 01 - single
+// 10 - double
+//
+// begin
+// get rounding precision (cmdreg3b{6:5})
+// begin
+// case opclass = 011 (move out)
+// get destination format - this is the also the rounding precision
+//
+// case opclass = 0x0
+// if E3
+// *case RndPr(from cmdreg3b{6:5} = 11 then RND_PREC = DBL
+// *case RndPr(from cmdreg3b{6:5} = 10 then RND_PREC = SGL
+// case RndPr(from cmdreg3b{6:5} = 00 | 01
+// use precision from FPCR{7:6}
+// case 00 then RND_PREC = EXT
+// case 01 then RND_PREC = SGL
+// case 10 then RND_PREC = DBL
+// else E1
+// use precision in FPCR{7:6}
+// case 00 then RND_PREC = EXT
+// case 01 then RND_PREC = SGL
+// case 10 then RND_PREC = DBL
+// end
+//
+g_rndpr:
+ bsr g_opcls //get opclass in d0{2:0}
+ cmpw #0x0003,%d0 //check for opclass 011
+ bnes op_0x0
+
+//
+// For move out instructions (opclass 011) the destination format
+// is the same as the rounding precision. Pass results from g_dfmtou.
+//
+ bsr g_dfmtou
+ rts
+op_0x0:
+ btstb #E3,E_BYTE(%a6)
+ beql unf_e1_exc //branch to e1 underflow
+unf_e3_exc:
+ movel CMDREG3B(%a6),%d0 //rounding precision in d0{10:9}
+ bfextu %d0{#9:#2},%d0 //move the rounding prec bits to d0{1:0}
+ cmpil #0x2,%d0
+ beql unff_sgl //force precision is single
+ cmpil #0x3,%d0 //force precision is double
+ beql unff_dbl
+ movew CMDREG3B(%a6),%d0 //get the command word again
+ andil #0x7f,%d0 //clear all except operation
+ cmpil #0x33,%d0
+ beql unf_fsgl //fsglmul or fsgldiv
+ cmpil #0x30,%d0
+ beql unf_fsgl //fsgldiv or fsglmul
+ bra unf_fpcr
+unf_e1_exc:
+ movel CMDREG1B(%a6),%d0 //get 32 bits off the stack, 1st 16 bits
+// ;are the command word
+ andil #0x00440000,%d0 //clear all bits except bits 6 and 2
+ cmpil #0x00400000,%d0
+ beql unff_sgl //force single
+ cmpil #0x00440000,%d0 //force double
+ beql unff_dbl
+ movel CMDREG1B(%a6),%d0 //get the command word again
+ andil #0x007f0000,%d0 //clear all bits except the operation
+ cmpil #0x00270000,%d0
+ beql unf_fsgl //fsglmul
+ cmpil #0x00240000,%d0
+ beql unf_fsgl //fsgldiv
+ bra unf_fpcr
+
+//
+// Convert to return format. The values from cmdreg3b and the return
+// values are:
+// cmdreg3b return precision
+// -------- ------ ---------
+// 00,01 0 ext
+// 10 1 sgl
+// 11 2 dbl
+// Force single
+//
+unff_sgl:
+ movel #1,%d0 //return 1
+ rts
+//
+// Force double
+//
+unff_dbl:
+ movel #2,%d0 //return 2
+ rts
+//
+// Force extended
+//
+unf_fsgl:
+ movel #0,%d0
+ rts
+//
+// Get rounding precision set in FPCR{7:6}.
+//
+unf_fpcr:
+ movel USER_FPCR(%a6),%d0 //rounding precision bits in d0{7:6}
+ bfextu %d0{#24:#2},%d0 //move the rounding prec bits to d0{1:0}
+ rts
+//
+// g_opcls --- put opclass in d0{2:0}
+//
+g_opcls:
+ btstb #E3,E_BYTE(%a6)
+ beqs opc_1b //if set, go to cmdreg1b
+opc_3b:
+ clrl %d0 //if E3, only opclass 0x0 is possible
+ rts
+opc_1b:
+ movel CMDREG1B(%a6),%d0
+ bfextu %d0{#0:#3},%d0 //shift opclass bits d0{31:29} to d0{2:0}
+ rts
+//
+// g_dfmtou --- put destination format in d0{1:0}
+//
+// If E1, the format is from cmdreg1b{12:10}
+// If E3, the format is extended.
+//
+// Dest. Fmt.
+// extended 010 -> 00
+// single 001 -> 01
+// double 101 -> 10
+//
+g_dfmtou:
+ btstb #E3,E_BYTE(%a6)
+ beqs op011
+ clrl %d0 //if E1, size is always ext
+ rts
+op011:
+ movel CMDREG1B(%a6),%d0
+ bfextu %d0{#3:#3},%d0 //dest fmt from cmdreg1b{12:10}
+ cmpb #1,%d0 //check for single
+ bnes not_sgl
+ movel #1,%d0
+ rts
+not_sgl:
+ cmpb #5,%d0 //check for double
+ bnes not_dbl
+ movel #2,%d0
+ rts
+not_dbl:
+ clrl %d0 //must be extended
+ rts
+
+//
+//
+// Final result table for unf_sub. Note that the negative counterparts
+// are unnecessary as unf_sub always returns the sign separately from
+// the exponent.
+// ;+zero
+EXT_PZRO: .long 0x00000000,0x00000000,0x00000000,0x00000000
+// ;+zero
+SGL_PZRO: .long 0x3f810000,0x00000000,0x00000000,0x00000000
+// ;+zero
+DBL_PZRO: .long 0x3c010000,0x00000000,0x00000000,0x00000000
+// ;smallest +ext denorm
+EXT_PSML: .long 0x00000000,0x00000000,0x00000001,0x00000000
+// ;smallest +sgl denorm
+SGL_PSML: .long 0x3f810000,0x00000100,0x00000000,0x00000000
+// ;smallest +dbl denorm
+DBL_PSML: .long 0x3c010000,0x00000000,0x00000800,0x00000000
+//
+// UNF_SUB --- underflow result calculation
+//
+// Input:
+// d0 contains round precision
+// a0 points to input operand in the internal extended format
+//
+// Output:
+// a0 points to correct internal extended precision result.
+//
+
+tblunf:
+ .long uEXT_RN
+ .long uEXT_RZ
+ .long uEXT_RM
+ .long uEXT_RP
+ .long uSGL_RN
+ .long uSGL_RZ
+ .long uSGL_RM
+ .long uSGL_RP
+ .long uDBL_RN
+ .long uDBL_RZ
+ .long uDBL_RM
+ .long uDBL_RP
+ .long uDBL_RN
+ .long uDBL_RZ
+ .long uDBL_RM
+ .long uDBL_RP
+
+ .global unf_sub
+unf_sub:
+ lsll #2,%d0 //move round precision to d0{3:2}
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //set round mode
+ orl %d1,%d0 //index is fmt:mode in d0{3:0}
+ leal tblunf,%a1 //load a1 with table address
+ movel %a1@(%d0:l:4),%a1 //use d0 as index to the table
+ jmp (%a1) //go to the correct routine
+//
+//case DEST_FMT = EXT
+//
+uEXT_RN:
+ leal EXT_PZRO,%a1 //answer is +/- zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bra uset_sign //now go set the sign
+uEXT_RZ:
+ leal EXT_PZRO,%a1 //answer is +/- zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bra uset_sign //now go set the sign
+uEXT_RM:
+ tstb LOCAL_SGN(%a0) //if negative underflow
+ beqs ue_rm_pos
+ue_rm_neg:
+ leal EXT_PSML,%a1 //answer is negative smallest denorm
+ bsetb #neg_bit,FPSR_CC(%a6)
+ bra end_unfr
+ue_rm_pos:
+ leal EXT_PZRO,%a1 //answer is positive zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bra end_unfr
+uEXT_RP:
+ tstb LOCAL_SGN(%a0) //if negative underflow
+ beqs ue_rp_pos
+ue_rp_neg:
+ leal EXT_PZRO,%a1 //answer is negative zero
+ oril #negz_mask,USER_FPSR(%a6)
+ bra end_unfr
+ue_rp_pos:
+ leal EXT_PSML,%a1 //answer is positive smallest denorm
+ bra end_unfr
+//
+//case DEST_FMT = DBL
+//
+uDBL_RN:
+ leal DBL_PZRO,%a1 //answer is +/- zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bra uset_sign
+uDBL_RZ:
+ leal DBL_PZRO,%a1 //answer is +/- zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bra uset_sign //now go set the sign
+uDBL_RM:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs ud_rm_pos
+ud_rm_neg:
+ leal DBL_PSML,%a1 //answer is smallest denormalized negative
+ bsetb #neg_bit,FPSR_CC(%a6)
+ bra end_unfr
+ud_rm_pos:
+ leal DBL_PZRO,%a1 //answer is positive zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bra end_unfr
+uDBL_RP:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs ud_rp_pos
+ud_rp_neg:
+ leal DBL_PZRO,%a1 //answer is negative zero
+ oril #negz_mask,USER_FPSR(%a6)
+ bra end_unfr
+ud_rp_pos:
+ leal DBL_PSML,%a1 //answer is smallest denormalized negative
+ bra end_unfr
+//
+//case DEST_FMT = SGL
+//
+uSGL_RN:
+ leal SGL_PZRO,%a1 //answer is +/- zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bras uset_sign
+uSGL_RZ:
+ leal SGL_PZRO,%a1 //answer is +/- zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bras uset_sign
+uSGL_RM:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs us_rm_pos
+us_rm_neg:
+ leal SGL_PSML,%a1 //answer is smallest denormalized negative
+ bsetb #neg_bit,FPSR_CC(%a6)
+ bras end_unfr
+us_rm_pos:
+ leal SGL_PZRO,%a1 //answer is positive zero
+ bsetb #z_bit,FPSR_CC(%a6)
+ bras end_unfr
+uSGL_RP:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs us_rp_pos
+us_rp_neg:
+ leal SGL_PZRO,%a1 //answer is negative zero
+ oril #negz_mask,USER_FPSR(%a6)
+ bras end_unfr
+us_rp_pos:
+ leal SGL_PSML,%a1 //answer is smallest denormalized positive
+ bras end_unfr
+
+uset_sign:
+ tstb LOCAL_SGN(%a0) //if negative overflow
+ beqs end_unfr
+uneg_sign:
+ bsetb #neg_bit,FPSR_CC(%a6)
+
+end_unfr:
+ movew LOCAL_EX(%a1),LOCAL_EX(%a0) //be careful not to overwrite sign
+ movel LOCAL_HI(%a1),LOCAL_HI(%a0)
+ movel LOCAL_LO(%a1),LOCAL_LO(%a0)
+ rts
+//
+// reg_dest --- write byte, word, or long data to Dn
+//
+//
+// Input:
+// L_SCR1: Data
+// d1: data size and dest register number formatted as:
+//
+// 32 5 4 3 2 1 0
+// -----------------------------------------------
+// | 0 | Size | Dest Reg # |
+// -----------------------------------------------
+//
+// Size is:
+// 0 - Byte
+// 1 - Word
+// 2 - Long/Single
+//
+pregdst:
+ .long byte_d0
+ .long byte_d1
+ .long byte_d2
+ .long byte_d3
+ .long byte_d4
+ .long byte_d5
+ .long byte_d6
+ .long byte_d7
+ .long word_d0
+ .long word_d1
+ .long word_d2
+ .long word_d3
+ .long word_d4
+ .long word_d5
+ .long word_d6
+ .long word_d7
+ .long long_d0
+ .long long_d1
+ .long long_d2
+ .long long_d3
+ .long long_d4
+ .long long_d5
+ .long long_d6
+ .long long_d7
+
+reg_dest:
+ leal pregdst,%a0
+ movel %a0@(%d1:l:4),%a0
+ jmp (%a0)
+
+byte_d0:
+ moveb L_SCR1(%a6),USER_D0+3(%a6)
+ rts
+byte_d1:
+ moveb L_SCR1(%a6),USER_D1+3(%a6)
+ rts
+byte_d2:
+ moveb L_SCR1(%a6),%d2
+ rts
+byte_d3:
+ moveb L_SCR1(%a6),%d3
+ rts
+byte_d4:
+ moveb L_SCR1(%a6),%d4
+ rts
+byte_d5:
+ moveb L_SCR1(%a6),%d5
+ rts
+byte_d6:
+ moveb L_SCR1(%a6),%d6
+ rts
+byte_d7:
+ moveb L_SCR1(%a6),%d7
+ rts
+word_d0:
+ movew L_SCR1(%a6),USER_D0+2(%a6)
+ rts
+word_d1:
+ movew L_SCR1(%a6),USER_D1+2(%a6)
+ rts
+word_d2:
+ movew L_SCR1(%a6),%d2
+ rts
+word_d3:
+ movew L_SCR1(%a6),%d3
+ rts
+word_d4:
+ movew L_SCR1(%a6),%d4
+ rts
+word_d5:
+ movew L_SCR1(%a6),%d5
+ rts
+word_d6:
+ movew L_SCR1(%a6),%d6
+ rts
+word_d7:
+ movew L_SCR1(%a6),%d7
+ rts
+long_d0:
+ movel L_SCR1(%a6),USER_D0(%a6)
+ rts
+long_d1:
+ movel L_SCR1(%a6),USER_D1(%a6)
+ rts
+long_d2:
+ movel L_SCR1(%a6),%d2
+ rts
+long_d3:
+ movel L_SCR1(%a6),%d3
+ rts
+long_d4:
+ movel L_SCR1(%a6),%d4
+ rts
+long_d5:
+ movel L_SCR1(%a6),%d5
+ rts
+long_d6:
+ movel L_SCR1(%a6),%d6
+ rts
+long_d7:
+ movel L_SCR1(%a6),%d7
+ rts
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_bsun.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_bsun.s
new file mode 100644
index 0000000000..c5094f0159
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_bsun.s
@@ -0,0 +1,47 @@
+//
+// x_bsun.sa 3.3 7/1/91
+//
+// fpsp_bsun --- FPSP handler for branch/set on unordered exception
+//
+// Copy the PC to FPIAR to maintain 881/882 compatibility
+//
+// The real_bsun handler will need to perform further corrective
+// measures as outlined in the 040 User's Manual on pages
+// 9-41f, section 9.8.3.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_BSUN: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref real_bsun
+
+ .global fpsp_bsun
+fpsp_bsun:
+//
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+
+//
+ movel EXC_PC(%a6),USER_FPIAR(%a6)
+//
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_bsun
+//
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_fline.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_fline.s
new file mode 100644
index 0000000000..100a86a083
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_fline.s
@@ -0,0 +1,104 @@
+//
+// x_fline.sa 3.3 1/10/91
+//
+// fpsp_fline --- FPSP handler for fline exception
+//
+// First determine if the exception is one of the unimplemented
+// floating point instructions. If so, let fpsp_unimp handle it.
+// Next, determine if the instruction is an fmovecr with a non-zero
+// <ea> field. If so, handle here and return. Otherwise, it
+// must be a real F-line exception.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_FLINE: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref real_fline
+ |xref fpsp_unimp
+ |xref uni_2
+ |xref mem_read
+ |xref fpsp_fmt_error
+
+ .global fpsp_fline
+fpsp_fline:
+//
+// check for unimplemented vector first. Use EXC_VEC-4 because
+// the equate is valid only after a 'link a6' has pushed one more
+// long onto the stack.
+//
+ cmpw #UNIMP_VEC,EXC_VEC-4(%a7)
+ beql fpsp_unimp
+
+//
+// fmovecr with non-zero <ea> handling here
+//
+ subl #4,%a7 //4 accounts for 2-word difference
+// ;between six word frame (unimp) and
+// ;four word frame
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ moveal EXC_PC+4(%a6),%a0 //get address of fline instruction
+ leal L_SCR1(%a6),%a1 //use L_SCR1 as scratch
+ movel #4,%d0
+ addl #4,%a6 //to offset the sub.l #4,a7 above so that
+// ;a6 can point correctly to the stack frame
+// ;before branching to mem_read
+ bsrl mem_read
+ subl #4,%a6
+ movel L_SCR1(%a6),%d0 //d0 contains the fline and command word
+ bfextu %d0{#4:#3},%d1 //extract coprocessor id
+ cmpib #1,%d1 //check if cpid=1
+ bne not_mvcr //exit if not
+ bfextu %d0{#16:#6},%d1
+ cmpib #0x17,%d1 //check if it is an FMOVECR encoding
+ bne not_mvcr
+// ;if an FMOVECR instruction, fix stack
+// ;and go to FPSP_UNIMP
+fix_stack:
+ cmpib #VER_40,(%a7) //test for orig unimp frame
+ bnes ck_rev
+ subl #UNIMP_40_SIZE-4,%a7 //emulate an orig fsave
+ moveb #VER_40,(%a7)
+ moveb #UNIMP_40_SIZE-4,1(%a7)
+ clrw 2(%a7)
+ bras fix_con
+ck_rev:
+ cmpib #VER_41,(%a7) //test for rev unimp frame
+ bnel fpsp_fmt_error //if not $40 or $41, exit with error
+ subl #UNIMP_41_SIZE-4,%a7 //emulate a rev fsave
+ moveb #VER_41,(%a7)
+ moveb #UNIMP_41_SIZE-4,1(%a7)
+ clrw 2(%a7)
+fix_con:
+ movew EXC_SR+4(%a6),EXC_SR(%a6) //move stacked sr to new position
+ movel EXC_PC+4(%a6),EXC_PC(%a6) //move stacked pc to new position
+ fmovel EXC_PC(%a6),%FPIAR //point FPIAR to fline inst
+ movel #4,%d1
+ addl %d1,EXC_PC(%a6) //increment stacked pc value to next inst
+ movew #0x202c,EXC_VEC(%a6) //reformat vector to unimp
+ clrl EXC_EA(%a6) //clear the EXC_EA field
+ movew %d0,CMDREG1B(%a6) //move the lower word into CMDREG1B
+ clrl E_BYTE(%a6)
+ bsetb #UFLAG,T_BYTE(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1 //restore data registers
+ bral uni_2
+
+not_mvcr:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1 //restore data registers
+ frestore (%a7)+
+ unlk %a6
+ addl #4,%a7
+ bral real_fline
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_operr.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_operr.s
new file mode 100644
index 0000000000..7d63af6dd9
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_operr.s
@@ -0,0 +1,356 @@
+//
+// x_operr.sa 3.5 7/1/91
+//
+// fpsp_operr --- FPSP handler for operand error exception
+//
+// See 68040 User's Manual pp. 9-44f
+//
+// Note 1: For trap disabled 040 does the following:
+// If the dest is a fp reg, then an extended precision non_signaling
+// NAN is stored in the dest reg. If the dest format is b, w, or l and
+// the source op is a NAN, then garbage is stored as the result (actually
+// the upper 32 bits of the mantissa are sent to the integer unit). If
+// the dest format is integer (b, w, l) and the operr is caused by
+// integer overflow, or the source op is inf, then the result stored is
+// garbage.
+// There are three cases in which operr is incorrectly signaled on the
+// 040. This occurs for move_out of format b, w, or l for the largest
+// negative integer (-2^7 for b, -2^15 for w, -2^31 for l).
+//
+// On opclass = 011 fmove.(b,w,l) that causes a conversion
+// overflow -> OPERR, the exponent in wbte (and fpte) is:
+// byte 56 - (62 - exp)
+// word 48 - (62 - exp)
+// long 32 - (62 - exp)
+//
+// where exp = (true exp) - 1
+//
+// So, wbtemp and fptemp will contain the following on erroneously
+// signalled operr:
+// fpts = 1
+// fpte = $4000 (15 bit externally)
+// byte fptm = $ffffffff ffffff80
+// word fptm = $ffffffff ffff8000
+// long fptm = $ffffffff 80000000
+//
+// Note 2: For trap enabled 040 does the following:
+// If the inst is move_out, then same as Note 1.
+// If the inst is not move_out, the dest is not modified.
+// The exceptional operand is not defined for integer overflow
+// during a move_out.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_OPERR: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref mem_write
+ |xref real_operr
+ |xref real_inex
+ |xref get_fline
+ |xref fpsp_done
+ |xref reg_dest
+
+ .global fpsp_operr
+fpsp_operr:
+//
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+
+//
+// Check if this is an opclass 3 instruction.
+// If so, fall through, else branch to operr_end
+//
+ btstb #TFLAG,T_BYTE(%a6)
+ beqs operr_end
+
+//
+// If the destination size is B,W,or L, the operr must be
+// handled here.
+//
+ movel CMDREG1B(%a6),%d0
+ bfextu %d0{#3:#3},%d0 //0=long, 4=word, 6=byte
+ cmpib #0,%d0 //determine size; check long
+ beq operr_long
+ cmpib #4,%d0 //check word
+ beq operr_word
+ cmpib #6,%d0 //check byte
+ beq operr_byte
+
+//
+// The size is not B,W,or L, so the operr is handled by the
+// kernel handler. Set the operr bits and clean up, leaving
+// only the integer exception frame on the stack, and the
+// fpu in the original exceptional state.
+//
+operr_end:
+ bsetb #operr_bit,FPSR_EXCEPT(%a6)
+ bsetb #aiop_bit,FPSR_AEXCEPT(%a6)
+
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_operr
+
+operr_long:
+ moveql #4,%d1 //write size to d1
+ moveb STAG(%a6),%d0 //test stag for nan
+ andib #0xe0,%d0 //clr all but tag
+ cmpib #0x60,%d0 //check for nan
+ beq operr_nan
+ cmpil #0x80000000,FPTEMP_LO(%a6) //test if ls lword is special
+ bnes chklerr //if not equal, check for incorrect operr
+ bsr check_upper //check if exp and ms mant are special
+ tstl %d0
+ bnes chklerr //if d0 is true, check for incorrect operr
+ movel #0x80000000,%d0 //store special case result
+ bsr operr_store
+ bra not_enabled //clean and exit
+//
+// CHECK FOR INCORRECTLY GENERATED OPERR EXCEPTION HERE
+//
+chklerr:
+ movew FPTEMP_EX(%a6),%d0
+ andw #0x7FFF,%d0 //ignore sign bit
+ cmpw #0x3FFE,%d0 //this is the only possible exponent value
+ bnes chklerr2
+fixlong:
+ movel FPTEMP_LO(%a6),%d0
+ bsr operr_store
+ bra not_enabled
+chklerr2:
+ movew FPTEMP_EX(%a6),%d0
+ andw #0x7FFF,%d0 //ignore sign bit
+ cmpw #0x4000,%d0
+ bcc store_max //exponent out of range
+
+ movel FPTEMP_LO(%a6),%d0
+ andl #0x7FFF0000,%d0 //look for all 1's on bits 30-16
+ cmpl #0x7FFF0000,%d0
+ beqs fixlong
+
+ tstl FPTEMP_LO(%a6)
+ bpls chklepos
+ cmpl #0xFFFFFFFF,FPTEMP_HI(%a6)
+ beqs fixlong
+ bra store_max
+chklepos:
+ tstl FPTEMP_HI(%a6)
+ beqs fixlong
+ bra store_max
+
+operr_word:
+ moveql #2,%d1 //write size to d1
+ moveb STAG(%a6),%d0 //test stag for nan
+ andib #0xe0,%d0 //clr all but tag
+ cmpib #0x60,%d0 //check for nan
+ beq operr_nan
+ cmpil #0xffff8000,FPTEMP_LO(%a6) //test if ls lword is special
+ bnes chkwerr //if not equal, check for incorrect operr
+ bsr check_upper //check if exp and ms mant are special
+ tstl %d0
+ bnes chkwerr //if d0 is true, check for incorrect operr
+ movel #0x80000000,%d0 //store special case result
+ bsr operr_store
+ bra not_enabled //clean and exit
+//
+// CHECK FOR INCORRECTLY GENERATED OPERR EXCEPTION HERE
+//
+chkwerr:
+ movew FPTEMP_EX(%a6),%d0
+ andw #0x7FFF,%d0 //ignore sign bit
+ cmpw #0x3FFE,%d0 //this is the only possible exponent value
+ bnes store_max
+ movel FPTEMP_LO(%a6),%d0
+ swap %d0
+ bsr operr_store
+ bra not_enabled
+
+operr_byte:
+ moveql #1,%d1 //write size to d1
+ moveb STAG(%a6),%d0 //test stag for nan
+ andib #0xe0,%d0 //clr all but tag
+ cmpib #0x60,%d0 //check for nan
+ beqs operr_nan
+ cmpil #0xffffff80,FPTEMP_LO(%a6) //test if ls lword is special
+ bnes chkberr //if not equal, check for incorrect operr
+ bsr check_upper //check if exp and ms mant are special
+ tstl %d0
+ bnes chkberr //if d0 is true, check for incorrect operr
+ movel #0x80000000,%d0 //store special case result
+ bsr operr_store
+ bra not_enabled //clean and exit
+//
+// CHECK FOR INCORRECTLY GENERATED OPERR EXCEPTION HERE
+//
+chkberr:
+ movew FPTEMP_EX(%a6),%d0
+ andw #0x7FFF,%d0 //ignore sign bit
+ cmpw #0x3FFE,%d0 //this is the only possible exponent value
+ bnes store_max
+ movel FPTEMP_LO(%a6),%d0
+ asll #8,%d0
+ swap %d0
+ bsr operr_store
+ bra not_enabled
+
+//
+// This operr condition is not of the special case. Set operr
+// and aiop and write the portion of the nan to memory for the
+// given size.
+//
+operr_nan:
+ orl #opaop_mask,USER_FPSR(%a6) //set operr & aiop
+
+ movel ETEMP_HI(%a6),%d0 //output will be from upper 32 bits
+ bsr operr_store
+ bra end_operr
+//
+// Store_max loads the max pos or negative for the size, sets
+// the operr and aiop bits, and clears inex and ainex, incorrectly
+// set by the 040.
+//
+store_max:
+ orl #opaop_mask,USER_FPSR(%a6) //set operr & aiop
+ bclrb #inex2_bit,FPSR_EXCEPT(%a6)
+ bclrb #ainex_bit,FPSR_AEXCEPT(%a6)
+ fmovel #0,%FPSR
+
+ tstw FPTEMP_EX(%a6) //check sign
+ blts load_neg
+ movel #0x7fffffff,%d0
+ bsr operr_store
+ bra end_operr
+load_neg:
+ movel #0x80000000,%d0
+ bsr operr_store
+ bra end_operr
+
+//
+// This routine stores the data in d0, for the given size in d1,
+// to memory or data register as required. A read of the fline
+// is required to determine the destination.
+//
+operr_store:
+ movel %d0,L_SCR1(%a6) //move write data to L_SCR1
+ movel %d1,-(%a7) //save register size
+ bsrl get_fline //fline returned in d0
+ movel (%a7)+,%d1
+ bftst %d0{#26:#3} //if mode is zero, dest is Dn
+ bnes dest_mem
+//
+// Destination is Dn. Get register number from d0. Data is on
+// the stack at (a7). D1 has size: 1=byte,2=word,4=long/single
+//
+ andil #7,%d0 //isolate register number
+ cmpil #4,%d1
+ beqs op_long //the most frequent case
+ cmpil #2,%d1
+ bnes op_con
+ orl #8,%d0
+ bras op_con
+op_long:
+ orl #0x10,%d0
+op_con:
+ movel %d0,%d1 //format size:reg for reg_dest
+ bral reg_dest //call to reg_dest returns to caller
+// ;of operr_store
+//
+// Destination is memory. Get <ea> from integer exception frame
+// and call mem_write.
+//
+dest_mem:
+ leal L_SCR1(%a6),%a0 //put ptr to write data in a0
+ movel EXC_EA(%a6),%a1 //put user destination address in a1
+ movel %d1,%d0 //put size in d0
+ bsrl mem_write
+ rts
+//
+// Check the exponent for $c000 and the upper 32 bits of the
+// mantissa for $ffffffff. If both are true, return d0 clr
+// and store the lower n bits of the least lword of FPTEMP
+// to d0 for write out. If not, it is a real operr, and set d0.
+//
+check_upper:
+ cmpil #0xffffffff,FPTEMP_HI(%a6) //check if first byte is all 1's
+ bnes true_operr //if not all 1's then was true operr
+ cmpiw #0xc000,FPTEMP_EX(%a6) //check if incorrectly signalled
+ beqs not_true_operr //branch if not true operr
+ cmpiw #0xbfff,FPTEMP_EX(%a6) //check if incorrectly signalled
+ beqs not_true_operr //branch if not true operr
+true_operr:
+ movel #1,%d0 //signal real operr
+ rts
+not_true_operr:
+ clrl %d0 //signal no real operr
+ rts
+
+//
+// End_operr tests for operr enabled. If not, it cleans up the stack
+// and does an rte. If enabled, it cleans up the stack and branches
+// to the kernel operr handler with only the integer exception
+// frame on the stack and the fpu in the original exceptional state
+// with correct data written to the destination.
+//
+end_operr:
+ btstb #operr_bit,FPCR_ENABLE(%a6)
+ beqs not_enabled
+enabled:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_operr
+
+not_enabled:
+//
+// It is possible to have either inex2 or inex1 exceptions with the
+// operr. If the inex enable bit is set in the FPCR, and either
+// inex2 or inex1 occurred, we must clean up and branch to the
+// real inex handler.
+//
+ck_inex:
+ moveb FPCR_ENABLE(%a6),%d0
+ andb FPSR_EXCEPT(%a6),%d0
+ andib #0x3,%d0
+ beq operr_exit
+//
+// Inexact enabled and reported, and we must take an inexact exception.
+//
+take_inex:
+ moveb #INEX_VEC,EXC_VEC+1(%a6)
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_inex
+//
+// Since operr is only an E1 exception, there is no need to frestore
+// any state back to the fpu.
+//
+operr_exit:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ unlk %a6
+ bral fpsp_done
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_ovfl.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_ovfl.s
new file mode 100644
index 0000000000..29b2c1f06d
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_ovfl.s
@@ -0,0 +1,186 @@
+//
+// x_ovfl.sa 3.5 7/1/91
+//
+// fpsp_ovfl --- FPSP handler for overflow exception
+//
+// Overflow occurs when a floating-point intermediate result is
+// too large to be represented in a floating-point data register,
+// or when storing to memory, the contents of a floating-point
+// data register are too large to be represented in the
+// destination format.
+//
+// Trap disabled results
+//
+// If the instruction is move_out, then garbage is stored in the
+// destination. If the instruction is not move_out, then the
+// destination is not affected. For 68881 compatibility, the
+// following values should be stored at the destination, based
+// on the current rounding mode:
+//
+// RN Infinity with the sign of the intermediate result.
+// RZ Largest magnitude number, with the sign of the
+// intermediate result.
+// RM For pos overflow, the largest pos number. For neg overflow,
+// -infinity
+// RP For pos overflow, +infinity. For neg overflow, the largest
+// neg number
+//
+// Trap enabled results
+// All trap disabled code applies. In addition the exceptional
+// operand needs to be made available to the users exception handler
+// with a bias of $6000 subtracted from the exponent.
+//
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_OVFL: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref ovf_r_x2
+ |xref ovf_r_x3
+ |xref store
+ |xref real_ovfl
+ |xref real_inex
+ |xref fpsp_done
+ |xref g_opcls
+ |xref b1238_fix
+
+ .global fpsp_ovfl
+fpsp_ovfl:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+
+//
+// The 040 doesn't set the AINEX bit in the FPSR, the following
+// line temporarily rectifies this error.
+//
+ bsetb #ainex_bit,FPSR_AEXCEPT(%a6)
+//
+ bsrl ovf_adj //denormalize, round & store interm op
+//
+// if overflow traps not enabled check for inexact exception
+//
+ btstb #ovfl_bit,FPCR_ENABLE(%a6)
+ beqs ck_inex
+//
+ btstb #E3,E_BYTE(%a6)
+ beqs no_e3_1
+ bfextu CMDREG3B(%a6){#6:#3},%d0 //get dest reg no
+ bclrb %d0,FPR_DIRTY_BITS(%a6) //clr dest dirty bit
+ bsrl b1238_fix
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+no_e3_1:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_ovfl
+//
+// It is possible to have either inex2 or inex1 exceptions with the
+// ovfl. If the inex enable bit is set in the FPCR, and either
+// inex2 or inex1 occurred, we must clean up and branch to the
+// real inex handler.
+//
+ck_inex:
+// move.b FPCR_ENABLE(%a6),%d0
+// and.b FPSR_EXCEPT(%a6),%d0
+// andi.b #$3,%d0
+ btstb #inex2_bit,FPCR_ENABLE(%a6)
+ beqs ovfl_exit
+//
+// Inexact enabled and reported, and we must take an inexact exception.
+//
+take_inex:
+ btstb #E3,E_BYTE(%a6)
+ beqs no_e3_2
+ bfextu CMDREG3B(%a6){#6:#3},%d0 //get dest reg no
+ bclrb %d0,FPR_DIRTY_BITS(%a6) //clr dest dirty bit
+ bsrl b1238_fix
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+no_e3_2:
+ moveb #INEX_VEC,EXC_VEC+1(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_inex
+
+ovfl_exit:
+ bclrb #E3,E_BYTE(%a6) //test and clear E3 bit
+ beqs e1_set
+//
+// Clear dirty bit on dest resister in the frame before branching
+// to b1238_fix.
+//
+ bfextu CMDREG3B(%a6){#6:#3},%d0 //get dest reg no
+ bclrb %d0,FPR_DIRTY_BITS(%a6) //clr dest dirty bit
+ bsrl b1238_fix //test for bug1238 case
+
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral fpsp_done
+e1_set:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ unlk %a6
+ bral fpsp_done
+
+//
+// ovf_adj
+//
+ovf_adj:
+//
+// Have a0 point to the correct operand.
+//
+ btstb #E3,E_BYTE(%a6) //test E3 bit
+ beqs ovf_e1
+
+ lea WBTEMP(%a6),%a0
+ bras ovf_com
+ovf_e1:
+ lea ETEMP(%a6),%a0
+
+ovf_com:
+ bclrb #sign_bit,LOCAL_EX(%a0)
+ sne LOCAL_SGN(%a0)
+
+ bsrl g_opcls //returns opclass in d0
+ cmpiw #3,%d0 //check for opclass3
+ bnes not_opc011
+
+//
+// FPSR_CC is saved and restored because ovf_r_x3 affects it. The
+// CCs are defined to be 'not affected' for the opclass3 instruction.
+//
+ moveb FPSR_CC(%a6),L_SCR1(%a6)
+ bsrl ovf_r_x3 //returns a0 pointing to result
+ moveb L_SCR1(%a6),FPSR_CC(%a6)
+ bral store //stores to memory or register
+
+not_opc011:
+ bsrl ovf_r_x2 //returns a0 pointing to result
+ bral store //stores to memory or register
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_snan.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_snan.s
new file mode 100644
index 0000000000..a89369e3f3
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_snan.s
@@ -0,0 +1,277 @@
+//
+// x_snan.sa 3.3 7/1/91
+//
+// fpsp_snan --- FPSP handler for signalling NAN exception
+//
+// SNAN for float -> integer conversions (integer conversion of
+// an SNAN) is a non-maskable run-time exception.
+//
+// For trap disabled the 040 does the following:
+// If the dest data format is s, d, or x, then the SNAN bit in the NAN
+// is set to one and the resulting non-signaling NAN (truncated if
+// necessary) is transferred to the dest. If the dest format is b, w,
+// or l, then garbage is written to the dest (actually the upper 32 bits
+// of the mantissa are sent to the integer unit).
+//
+// For trap enabled the 040 does the following:
+// If the inst is move_out, then the results are the same as for trap
+// disabled with the exception posted. If the instruction is not move_
+// out, the dest. is not modified, and the exception is posted.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_SNAN: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref get_fline
+ |xref mem_write
+ |xref real_snan
+ |xref real_inex
+ |xref fpsp_done
+ |xref reg_dest
+
+ .global fpsp_snan
+fpsp_snan:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+
+//
+// Check if trap enabled
+//
+ btstb #snan_bit,FPCR_ENABLE(%a6)
+ bnes ena //If enabled, then branch
+
+ bsrl move_out //else SNAN disabled
+//
+// It is possible to have an inex1 exception with the
+// snan. If the inex enable bit is set in the FPCR, and either
+// inex2 or inex1 occurred, we must clean up and branch to the
+// real inex handler.
+//
+ck_inex:
+ moveb FPCR_ENABLE(%a6),%d0
+ andb FPSR_EXCEPT(%a6),%d0
+ andib #0x3,%d0
+ beq end_snan
+//
+// Inexact enabled and reported, and we must take an inexact exception.
+//
+take_inex:
+ moveb #INEX_VEC,EXC_VEC+1(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_inex
+//
+// SNAN is enabled. Check if inst is move_out.
+// Make any corrections to the 040 output as necessary.
+//
+ena:
+ btstb #5,CMDREG1B(%a6) //if set, inst is move out
+ beq not_out
+
+ bsrl move_out
+
+report_snan:
+ moveb (%a7),VER_TMP(%a6)
+ cmpib #VER_40,(%a7) //test for orig unimp frame
+ bnes ck_rev
+ moveql #13,%d0 //need to zero 14 lwords
+ bras rep_con
+ck_rev:
+ moveql #11,%d0 //need to zero 12 lwords
+rep_con:
+ clrl (%a7)
+loop1:
+ clrl -(%a7) //clear and dec a7
+ dbra %d0,loop1
+ moveb VER_TMP(%a6),(%a7) //format a busy frame
+ moveb #BUSY_SIZE-4,1(%a7)
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_snan
+//
+// Exit snan handler by expanding the unimp frame into a busy frame
+//
+end_snan:
+ bclrb #E1,E_BYTE(%a6)
+
+ moveb (%a7),VER_TMP(%a6)
+ cmpib #VER_40,(%a7) //test for orig unimp frame
+ bnes ck_rev2
+ moveql #13,%d0 //need to zero 14 lwords
+ bras rep_con2
+ck_rev2:
+ moveql #11,%d0 //need to zero 12 lwords
+rep_con2:
+ clrl (%a7)
+loop2:
+ clrl -(%a7) //clear and dec a7
+ dbra %d0,loop2
+ moveb VER_TMP(%a6),(%a7) //format a busy frame
+ moveb #BUSY_SIZE-4,1(%a7) //write busy size
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral fpsp_done
+
+//
+// Move_out
+//
+move_out:
+ movel EXC_EA(%a6),%a0 //get <ea> from exc frame
+
+ bfextu CMDREG1B(%a6){#3:#3},%d0 //move rx field to d0{2:0}
+ cmpil #0,%d0 //check for long
+ beqs sto_long //branch if move_out long
+
+ cmpil #4,%d0 //check for word
+ beqs sto_word //branch if move_out word
+
+ cmpil #6,%d0 //check for byte
+ beqs sto_byte //branch if move_out byte
+
+//
+// Not byte, word or long
+//
+ rts
+//
+// Get the 32 most significant bits of etemp mantissa
+//
+sto_long:
+ movel ETEMP_HI(%a6),%d1
+ movel #4,%d0 //load byte count
+//
+// Set signalling nan bit
+//
+ bsetl #30,%d1
+//
+// Store to the users destination address
+//
+ tstl %a0 //check if <ea> is 0
+ beqs wrt_dn //destination is a data register
+
+ movel %d1,-(%a7) //move the snan onto the stack
+ movel %a0,%a1 //load dest addr into a1
+ movel %a7,%a0 //load src addr of snan into a0
+ bsrl mem_write //write snan to user memory
+ movel (%a7)+,%d1 //clear off stack
+ rts
+//
+// Get the 16 most significant bits of etemp mantissa
+//
+sto_word:
+ movel ETEMP_HI(%a6),%d1
+ movel #2,%d0 //load byte count
+//
+// Set signalling nan bit
+//
+ bsetl #30,%d1
+//
+// Store to the users destination address
+//
+ tstl %a0 //check if <ea> is 0
+ beqs wrt_dn //destination is a data register
+
+ movel %d1,-(%a7) //move the snan onto the stack
+ movel %a0,%a1 //load dest addr into a1
+ movel %a7,%a0 //point to low word
+ bsrl mem_write //write snan to user memory
+ movel (%a7)+,%d1 //clear off stack
+ rts
+//
+// Get the 8 most significant bits of etemp mantissa
+//
+sto_byte:
+ movel ETEMP_HI(%a6),%d1
+ movel #1,%d0 //load byte count
+//
+// Set signalling nan bit
+//
+ bsetl #30,%d1
+//
+// Store to the users destination address
+//
+ tstl %a0 //check if <ea> is 0
+ beqs wrt_dn //destination is a data register
+ movel %d1,-(%a7) //move the snan onto the stack
+ movel %a0,%a1 //load dest addr into a1
+ movel %a7,%a0 //point to source byte
+ bsrl mem_write //write snan to user memory
+ movel (%a7)+,%d1 //clear off stack
+ rts
+
+//
+// wrt_dn --- write to a data register
+//
+// We get here with D1 containing the data to write and D0 the
+// number of bytes to write: 1=byte,2=word,4=long.
+//
+wrt_dn:
+ movel %d1,L_SCR1(%a6) //data
+ movel %d0,-(%a7) //size
+ bsrl get_fline //returns fline word in d0
+ movel %d0,%d1
+ andil #0x7,%d1 //d1 now holds register number
+ movel (%sp)+,%d0 //get original size
+ cmpil #4,%d0
+ beqs wrt_long
+ cmpil #2,%d0
+ bnes wrt_byte
+wrt_word:
+ orl #0x8,%d1
+ bral reg_dest
+wrt_long:
+ orl #0x10,%d1
+ bral reg_dest
+wrt_byte:
+ bral reg_dest
+//
+// Check if it is a src nan or dst nan
+//
+not_out:
+ movel DTAG(%a6),%d0
+ bfextu %d0{#0:#3},%d0 //isolate dtag in lsbs
+
+ cmpib #3,%d0 //check for nan in destination
+ bnes issrc //destination nan has priority
+dst_nan:
+ btstb #6,FPTEMP_HI(%a6) //check if dest nan is an snan
+ bnes issrc //no, so check source for snan
+ movew FPTEMP_EX(%a6),%d0
+ bras cont
+issrc:
+ movew ETEMP_EX(%a6),%d0
+cont:
+ btstl #15,%d0 //test for sign of snan
+ beqs clr_neg
+ bsetb #neg_bit,FPSR_CC(%a6)
+ bra report_snan
+clr_neg:
+ bclrb #neg_bit,FPSR_CC(%a6)
+ bra report_snan
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_store.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_store.s
new file mode 100644
index 0000000000..0dcb6798f7
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_store.s
@@ -0,0 +1,256 @@
+//
+// x_store.sa 3.2 1/24/91
+//
+// store --- store operand to memory or register
+//
+// Used by underflow and overflow handlers.
+//
+// a6 = points to fp value to be stored.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_STORE: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+fpreg_mask:
+ .byte 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01
+
+ .include "fpsp.defs"
+
+ |xref mem_write
+ |xref get_fline
+ |xref g_opcls
+ |xref g_dfmtou
+ |xref reg_dest
+
+ .global dest_ext
+ .global dest_dbl
+ .global dest_sgl
+
+ .global store
+store:
+ btstb #E3,E_BYTE(%a6)
+ beqs E1_sto
+E3_sto:
+ movel CMDREG3B(%a6),%d0
+ bfextu %d0{#6:#3},%d0 //isolate dest. reg from cmdreg3b
+sto_fp:
+ lea fpreg_mask,%a1
+ moveb (%a1,%d0.w),%d0 //convert reg# to dynamic register mask
+ tstb LOCAL_SGN(%a0)
+ beqs is_pos
+ bsetb #sign_bit,LOCAL_EX(%a0)
+is_pos:
+ fmovemx (%a0),%d0 //move to correct register
+//
+// if fp0-fp3 is being modified, we must put a copy
+// in the USER_FPn variable on the stack because all exception
+// handlers restore fp0-fp3 from there.
+//
+ cmpb #0x80,%d0
+ bnes not_fp0
+ fmovemx %fp0-%fp0,USER_FP0(%a6)
+ rts
+not_fp0:
+ cmpb #0x40,%d0
+ bnes not_fp1
+ fmovemx %fp1-%fp1,USER_FP1(%a6)
+ rts
+not_fp1:
+ cmpb #0x20,%d0
+ bnes not_fp2
+ fmovemx %fp2-%fp2,USER_FP2(%a6)
+ rts
+not_fp2:
+ cmpb #0x10,%d0
+ bnes not_fp3
+ fmovemx %fp3-%fp3,USER_FP3(%a6)
+ rts
+not_fp3:
+ rts
+
+E1_sto:
+ bsrl g_opcls //returns opclass in d0
+ cmpib #3,%d0
+ beq opc011 //branch if opclass 3
+ movel CMDREG1B(%a6),%d0
+ bfextu %d0{#6:#3},%d0 //extract destination register
+ bras sto_fp
+
+opc011:
+ bsrl g_dfmtou //returns dest format in d0
+// ;ext=00, sgl=01, dbl=10
+ movel %a0,%a1 //save source addr in a1
+ movel EXC_EA(%a6),%a0 //get the address
+ cmpil #0,%d0 //if dest format is extended
+ beq dest_ext //then branch
+ cmpil #1,%d0 //if dest format is single
+ beqs dest_sgl //then branch
+//
+// fall through to dest_dbl
+//
+
+//
+// dest_dbl --- write double precision value to user space
+//
+//Input
+// a0 -> destination address
+// a1 -> source in extended precision
+//Output
+// a0 -> destroyed
+// a1 -> destroyed
+// d0 -> 0
+//
+//Changes extended precision to double precision.
+// Note: no attempt is made to round the extended value to double.
+// dbl_sign = ext_sign
+// dbl_exp = ext_exp - $3fff(ext bias) + $7ff(dbl bias)
+// get rid of ext integer bit
+// dbl_mant = ext_mant{62:12}
+//
+// --------------- --------------- ---------------
+// extended -> |s| exp | |1| ms mant | | ls mant |
+// --------------- --------------- ---------------
+// 95 64 63 62 32 31 11 0
+// | |
+// | |
+// | |
+// v v
+// --------------- ---------------
+// double -> |s|exp| mant | | mant |
+// --------------- ---------------
+// 63 51 32 31 0
+//
+dest_dbl:
+ clrl %d0 //clear d0
+ movew LOCAL_EX(%a1),%d0 //get exponent
+ subw #0x3fff,%d0 //subtract extended precision bias
+ cmpw #0x4000,%d0 //check if inf
+ beqs inf //if so, special case
+ addw #0x3ff,%d0 //add double precision bias
+ swap %d0 //d0 now in upper word
+ lsll #4,%d0 //d0 now in proper place for dbl prec exp
+ tstb LOCAL_SGN(%a1)
+ beqs get_mant //if positive, go process mantissa
+ bsetl #31,%d0 //if negative, put in sign information
+// ; before continuing
+ bras get_mant //go process mantissa
+inf:
+ movel #0x7ff00000,%d0 //load dbl inf exponent
+ clrl LOCAL_HI(%a1) //clear msb
+ tstb LOCAL_SGN(%a1)
+ beqs dbl_inf //if positive, go ahead and write it
+ bsetl #31,%d0 //if negative put in sign information
+dbl_inf:
+ movel %d0,LOCAL_EX(%a1) //put the new exp back on the stack
+ bras dbl_wrt
+get_mant:
+ movel LOCAL_HI(%a1),%d1 //get ms mantissa
+ bfextu %d1{#1:#20},%d1 //get upper 20 bits of ms
+ orl %d1,%d0 //put these bits in ms word of double
+ movel %d0,LOCAL_EX(%a1) //put the new exp back on the stack
+ movel LOCAL_HI(%a1),%d1 //get ms mantissa
+ movel #21,%d0 //load shift count
+ lsll %d0,%d1 //put lower 11 bits in upper bits
+ movel %d1,LOCAL_HI(%a1) //build lower lword in memory
+ movel LOCAL_LO(%a1),%d1 //get ls mantissa
+ bfextu %d1{#0:#21},%d0 //get ls 21 bits of double
+ orl %d0,LOCAL_HI(%a1) //put them in double result
+dbl_wrt:
+ movel #0x8,%d0 //byte count for double precision number
+ exg %a0,%a1 //a0=supervisor source, a1=user dest
+ bsrl mem_write //move the number to the user's memory
+ rts
+//
+// dest_sgl --- write single precision value to user space
+//
+//Input
+// a0 -> destination address
+// a1 -> source in extended precision
+//
+//Output
+// a0 -> destroyed
+// a1 -> destroyed
+// d0 -> 0
+//
+//Changes extended precision to single precision.
+// sgl_sign = ext_sign
+// sgl_exp = ext_exp - $3fff(ext bias) + $7f(sgl bias)
+// get rid of ext integer bit
+// sgl_mant = ext_mant{62:12}
+//
+// --------------- --------------- ---------------
+// extended -> |s| exp | |1| ms mant | | ls mant |
+// --------------- --------------- ---------------
+// 95 64 63 62 40 32 31 12 0
+// | |
+// | |
+// | |
+// v v
+// ---------------
+// single -> |s|exp| mant |
+// ---------------
+// 31 22 0
+//
+dest_sgl:
+ clrl %d0
+ movew LOCAL_EX(%a1),%d0 //get exponent
+ subw #0x3fff,%d0 //subtract extended precision bias
+ cmpw #0x4000,%d0 //check if inf
+ beqs sinf //if so, special case
+ addw #0x7f,%d0 //add single precision bias
+ swap %d0 //put exp in upper word of d0
+ lsll #7,%d0 //shift it into single exp bits
+ tstb LOCAL_SGN(%a1)
+ beqs get_sman //if positive, continue
+ bsetl #31,%d0 //if negative, put in sign first
+ bras get_sman //get mantissa
+sinf:
+ movel #0x7f800000,%d0 //load single inf exp to d0
+ tstb LOCAL_SGN(%a1)
+ beqs sgl_wrt //if positive, continue
+ bsetl #31,%d0 //if negative, put in sign info
+ bras sgl_wrt
+
+get_sman:
+ movel LOCAL_HI(%a1),%d1 //get ms mantissa
+ bfextu %d1{#1:#23},%d1 //get upper 23 bits of ms
+ orl %d1,%d0 //put these bits in ms word of single
+
+sgl_wrt:
+ movel %d0,L_SCR1(%a6) //put the new exp back on the stack
+ movel #0x4,%d0 //byte count for single precision number
+ tstl %a0 //users destination address
+ beqs sgl_Dn //destination is a data register
+ exg %a0,%a1 //a0=supervisor source, a1=user dest
+ leal L_SCR1(%a6),%a0 //point a0 to data
+ bsrl mem_write //move the number to the user's memory
+ rts
+sgl_Dn:
+ bsrl get_fline //returns fline word in d0
+ andw #0x7,%d0 //isolate register number
+ movel %d0,%d1 //d1 has size:reg formatted for reg_dest
+ orl #0x10,%d1 //reg_dest wants size added to reg#
+ bral reg_dest //size is X, rts in reg_dest will
+// ;return to caller of dest_sgl
+
+dest_ext:
+ tstb LOCAL_SGN(%a1) //put back sign into exponent word
+ beqs dstx_cont
+ bsetb #sign_bit,LOCAL_EX(%a1)
+dstx_cont:
+ clrb LOCAL_SGN(%a1) //clear out the sign byte
+
+ movel #0x0c,%d0 //byte count for extended number
+ exg %a0,%a1 //a0=supervisor source, a1=user dest
+ bsrl mem_write //move the number to the user's memory
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_unfl.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unfl.s
new file mode 100644
index 0000000000..205f466e73
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unfl.s
@@ -0,0 +1,269 @@
+//
+// x_unfl.sa 3.4 7/1/91
+//
+// fpsp_unfl --- FPSP handler for underflow exception
+//
+// Trap disabled results
+// For 881/2 compatibility, sw must denormalize the intermediate
+// result, then store the result. Denormalization is accomplished
+// by taking the intermediate result (which is always normalized) and
+// shifting the mantissa right while incrementing the exponent until
+// it is equal to the denormalized exponent for the destination
+// format. After denormalization, the result is rounded to the
+// destination format.
+//
+// Trap enabled results
+// All trap disabled code applies. In addition the exceptional
+// operand needs to made available to the user with a bias of $6000
+// added to the exponent.
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_UNFL: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref denorm
+ |xref round
+ |xref store
+ |xref g_rndpr
+ |xref g_opcls
+ |xref g_dfmtou
+ |xref real_unfl
+ |xref real_inex
+ |xref fpsp_done
+ |xref b1238_fix
+
+ .global fpsp_unfl
+fpsp_unfl:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+
+//
+ bsrl unf_res //denormalize, round & store interm op
+//
+// If underflow exceptions are not enabled, check for inexact
+// exception
+//
+ btstb #unfl_bit,FPCR_ENABLE(%a6)
+ beqs ck_inex
+
+ btstb #E3,E_BYTE(%a6)
+ beqs no_e3_1
+//
+// Clear dirty bit on dest resister in the frame before branching
+// to b1238_fix.
+//
+ bfextu CMDREG3B(%a6){#6:#3},%d0 //get dest reg no
+ bclrb %d0,FPR_DIRTY_BITS(%a6) //clr dest dirty bit
+ bsrl b1238_fix //test for bug1238 case
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+no_e3_1:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_unfl
+//
+// It is possible to have either inex2 or inex1 exceptions with the
+// unfl. If the inex enable bit is set in the FPCR, and either
+// inex2 or inex1 occurred, we must clean up and branch to the
+// real inex handler.
+//
+ck_inex:
+ moveb FPCR_ENABLE(%a6),%d0
+ andb FPSR_EXCEPT(%a6),%d0
+ andib #0x3,%d0
+ beqs unfl_done
+
+//
+// Inexact enabled and reported, and we must take an inexact exception
+//
+take_inex:
+ btstb #E3,E_BYTE(%a6)
+ beqs no_e3_2
+//
+// Clear dirty bit on dest resister in the frame before branching
+// to b1238_fix.
+//
+ bfextu CMDREG3B(%a6){#6:#3},%d0 //get dest reg no
+ bclrb %d0,FPR_DIRTY_BITS(%a6) //clr dest dirty bit
+ bsrl b1238_fix //test for bug1238 case
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+no_e3_2:
+ moveb #INEX_VEC,EXC_VEC+1(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral real_inex
+
+unfl_done:
+ bclrb #E3,E_BYTE(%a6)
+ beqs e1_set //if set then branch
+//
+// Clear dirty bit on dest resister in the frame before branching
+// to b1238_fix.
+//
+ bfextu CMDREG3B(%a6){#6:#3},%d0 //get dest reg no
+ bclrb %d0,FPR_DIRTY_BITS(%a6) //clr dest dirty bit
+ bsrl b1238_fix //test for bug1238 case
+ movel USER_FPSR(%a6),FPSR_SHADOW(%a6)
+ orl #sx_mask,E_BYTE(%a6)
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ frestore (%a7)+
+ unlk %a6
+ bral fpsp_done
+e1_set:
+ moveml USER_DA(%a6),%d0-%d1/%a0-%a1
+ fmovemx USER_FP0(%a6),%fp0-%fp3
+ fmoveml USER_FPCR(%a6),%fpcr/%fpsr/%fpiar
+ unlk %a6
+ bral fpsp_done
+//
+// unf_res --- underflow result calculation
+//
+unf_res:
+ bsrl g_rndpr //returns RND_PREC in d0 0=ext,
+// ;1=sgl, 2=dbl
+// ;we need the RND_PREC in the
+// ;upper word for round
+ movew #0,-(%a7)
+ movew %d0,-(%a7) //copy RND_PREC to stack
+//
+//
+// If the exception bit set is E3, the exceptional operand from the
+// fpu is in WBTEMP; else it is in FPTEMP.
+//
+ btstb #E3,E_BYTE(%a6)
+ beqs unf_E1
+unf_E3:
+ lea WBTEMP(%a6),%a0 //a0 now points to operand
+//
+// Test for fsgldiv and fsglmul. If the inst was one of these, then
+// force the precision to extended for the denorm routine. Use
+// the user's precision for the round routine.
+//
+ movew CMDREG3B(%a6),%d1 //check for fsgldiv or fsglmul
+ andiw #0x7f,%d1
+ cmpiw #0x30,%d1 //check for sgldiv
+ beqs unf_sgl
+ cmpiw #0x33,%d1 //check for sglmul
+ bnes unf_cont //if not, use fpcr prec in round
+unf_sgl:
+ clrl %d0
+ movew #0x1,(%a7) //override g_rndpr precision
+// ;force single
+ bras unf_cont
+unf_E1:
+ lea FPTEMP(%a6),%a0 //a0 now points to operand
+unf_cont:
+ bclrb #sign_bit,LOCAL_EX(%a0) //clear sign bit
+ sne LOCAL_SGN(%a0) //store sign
+
+ bsrl denorm //returns denorm, a0 points to it
+//
+// WARNING:
+// ;d0 has guard,round sticky bit
+// ;make sure that it is not corrupted
+// ;before it reaches the round subroutine
+// ;also ensure that a0 isn't corrupted
+
+//
+// Set up d1 for round subroutine d1 contains the PREC/MODE
+// information respectively on upper/lower register halves.
+//
+ bfextu FPCR_MODE(%a6){#2:#2},%d1 //get mode from FPCR
+// ;mode in lower d1
+ addl (%a7)+,%d1 //merge PREC/MODE
+//
+// WARNING: a0 and d0 are assumed to be intact between the denorm and
+// round subroutines. All code between these two subroutines
+// must not corrupt a0 and d0.
+//
+//
+// Perform Round
+// Input: a0 points to input operand
+// d0{31:29} has guard, round, sticky
+// d1{01:00} has rounding mode
+// d1{17:16} has rounding precision
+// Output: a0 points to rounded operand
+//
+
+ bsrl round //returns rounded denorm at (a0)
+//
+// Differentiate between store to memory vs. store to register
+//
+unf_store:
+ bsrl g_opcls //returns opclass in d0{2:0}
+ cmpib #0x3,%d0
+ bnes not_opc011
+//
+// At this point, a store to memory is pending
+//
+opc011:
+ bsrl g_dfmtou
+ tstb %d0
+ beqs ext_opc011 //If extended, do not subtract
+// ;If destination format is sgl/dbl,
+ tstb LOCAL_HI(%a0) //If rounded result is normal,don't
+// ;subtract
+ bmis ext_opc011
+ subqw #1,LOCAL_EX(%a0) //account for denorm bias vs.
+// ;normalized bias
+// ; normalized denormalized
+// ;single $7f $7e
+// ;double $3ff $3fe
+//
+ext_opc011:
+ bsrl store //stores to memory
+ bras unf_done //finish up
+
+//
+// At this point, a store to a float register is pending
+//
+not_opc011:
+ bsrl store //stores to float register
+// ;a0 is not corrupted on a store to a
+// ;float register.
+//
+// Set the condition codes according to result
+//
+ tstl LOCAL_HI(%a0) //check upper mantissa
+ bnes ck_sgn
+ tstl LOCAL_LO(%a0) //check lower mantissa
+ bnes ck_sgn
+ bsetb #z_bit,FPSR_CC(%a6) //set condition codes if zero
+ck_sgn:
+ btstb #sign_bit,LOCAL_EX(%a0) //check the sign bit
+ beqs unf_done
+ bsetb #neg_bit,FPSR_CC(%a6)
+
+//
+// Finish.
+//
+unf_done:
+ btstb #inex2_bit,FPSR_EXCEPT(%a6)
+ beqs no_aunfl
+ bsetb #aunfl_bit,FPSR_AEXCEPT(%a6)
+no_aunfl:
+ rts
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s
new file mode 100644
index 0000000000..e8aecfd985
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unimp.s
@@ -0,0 +1,77 @@
+//
+// x_unimp.sa 3.3 7/1/91
+//
+// fpsp_unimp --- FPSP handler for unimplemented instruction
+// exception.
+//
+// Invoked when the user program encounters a floating-point
+// op-code that hardware does not support. Trap vector# 11
+// (See table 8-1 MC68030 User's Manual).
+//
+//
+// Note: An fsave for an unimplemented inst. will create a short
+// fsave stack.
+//
+// Input: 1. Six word stack frame for unimplemented inst, four word
+// for illegal
+// (See table 8-7 MC68030 User's Manual).
+// 2. Unimp (short) fsave state frame created here by fsave
+// instruction.
+//
+//
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_UNIMP: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref get_op
+ |xref do_func
+ |xref sto_res
+ |xref gen_except
+ |xref fpsp_fmt_error
+
+ .global fpsp_unimp
+ .global uni_2
+fpsp_unimp:
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+uni_2:
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+ moveb (%a7),%d0 //test for valid version num
+ andib #0xf0,%d0 //test for $4x
+ cmpib #VER_4,%d0 //must be $4x or exit
+ bnel fpsp_fmt_error
+//
+// Temporary D25B Fix
+// The following lines are used to ensure that the FPSR
+// exception byte and condition codes are clear before proceeding
+//
+ movel USER_FPSR(%a6),%d0
+ andl #0xFF00FF,%d0 //clear all but accrued exceptions
+ movel %d0,USER_FPSR(%a6)
+ fmovel #0,%FPSR //clear all user bits
+ fmovel #0,%FPCR //clear all user exceptions for FPSP
+
+ clrb UFLG_TMP(%a6) //clr flag for unsupp data
+
+ bsrl get_op //go get operand(s)
+ clrb STORE_FLG(%a6)
+ bsrl do_func //do the function
+ fsave -(%a7) //capture possible exc state
+ tstb STORE_FLG(%a6)
+ bnes no_store //if STORE_FLG is set, no store
+ bsrl sto_res //store the result in user space
+no_store:
+ bral gen_except //post any exceptions and return
+
+ |end
diff --git a/c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s
new file mode 100644
index 0000000000..b6e7e51b0a
--- /dev/null
+++ b/c/src/lib/libcpu/m68k/m68040/fpsp/x_unsupp.s
@@ -0,0 +1,83 @@
+//
+// x_unsupp.sa 3.3 7/1/91
+//
+// fpsp_unsupp --- FPSP handler for unsupported data type exception
+//
+// Trap vector #55 (See table 8-1 Mc68030 User's manual).
+// Invoked when the user program encounters a data format (packed) that
+// hardware does not support or a data type (denormalized numbers or un-
+// normalized numbers).
+// Normalizes denorms and unnorms, unpacks packed numbers then stores
+// them back into the machine to let the 040 finish the operation.
+//
+// Unsupp calls two routines:
+// 1. get_op - gets the operand(s)
+// 2. res_func - restore the function back into the 040 or
+// if fmove.p fpm,<ea> then pack source (fpm)
+// and store in users memory <ea>.
+//
+// Input: Long fsave stack frame
+//
+//
+
+// Copyright (C) Motorola, Inc. 1990
+// All Rights Reserved
+//
+// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
+// The copyright notice above does not evidence any
+// actual or intended publication of such source code.
+
+X_UNSUPP: //idnt 2,1 | Motorola 040 Floating Point Software Package
+
+ |section 8
+
+ .include "fpsp.defs"
+
+ |xref get_op
+ |xref res_func
+ |xref gen_except
+ |xref fpsp_fmt_error
+
+ .global fpsp_unsupp
+fpsp_unsupp:
+//
+ link %a6,#-LOCAL_SIZE
+ fsave -(%a7)
+ moveml %d0-%d1/%a0-%a1,USER_DA(%a6)
+ fmovemx %fp0-%fp3,USER_FP0(%a6)
+ fmoveml %fpcr/%fpsr/%fpiar,USER_FPCR(%a6)
+
+
+ moveb (%a7),VER_TMP(%a6) //save version number
+ moveb (%a7),%d0 //test for valid version num
+ andib #0xf0,%d0 //test for $4x
+ cmpib #VER_4,%d0 //must be $4x or exit
+ bnel fpsp_fmt_error
+
+ fmovel #0,%FPSR //clear all user status bits
+ fmovel #0,%FPCR //clear all user control bits
+//
+// The following lines are used to ensure that the FPSR
+// exception byte and condition codes are clear before proceeding,
+// except in the case of fmove, which leaves the cc's intact.
+//
+unsupp_con:
+ movel USER_FPSR(%a6),%d1
+ btst #5,CMDREG1B(%a6) //looking for fmove out
+ bne fmove_con
+ andl #0xFF00FF,%d1 //clear all but aexcs and qbyte
+ bras end_fix
+fmove_con:
+ andl #0x0FFF40FF,%d1 //clear all but cc's, snan bit, aexcs, and qbyte
+end_fix:
+ movel %d1,USER_FPSR(%a6)
+
+ st UFLG_TMP(%a6) //set flag for unsupp data
+
+ bsrl get_op //everything okay, go get operand(s)
+ bsrl res_func //fix up stack frame so can restore it
+ clrl -(%a7)
+ moveb VER_TMP(%a6),(%a7) //move idle fmt word to top of stack
+ bral gen_except
+//
+ |end
diff --git a/c/src/lib/libcpu/mips/clock/ckinit.c b/c/src/lib/libcpu/mips/clock/ckinit.c
new file mode 100644
index 0000000000..f2b41c997c
--- /dev/null
+++ b/c/src/lib/libcpu/mips/clock/ckinit.c
@@ -0,0 +1,249 @@
+
+/* ckinit.c
+ *
+ * This file contains the clock driver initialization for the IDT 4650.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)ckinit.c 08/20/96 1.3\n";
+ */
+
+
+#include <stdlib.h>
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <bsp.h>
+
+#define EXT_INT5 0x8000 /* external interrupt 5 */
+
+#include "clock.h"
+
+#define CLOCKS_PER_MICROSECOND ( CPU_CLOCK_RATE_MHZ ) /* equivalent to CPU clock speed in MHz */
+
+void Clock_exit( void );
+rtems_isr Clock_isr( rtems_vector_number vector );
+
+
+/*
+ * The interrupt vector number associated with the clock tick device
+ * driver.
+ */
+
+#define CLOCK_VECTOR_MASK EXT_INT5
+#define CLOCK_VECTOR 0x7
+
+/*
+ * Clock_driver_ticks is a monotonically increasing counter of the
+ * number of clock ticks since the driver was initialized.
+ */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+/*
+ * Clock_isrs is the number of clock ISRs until the next invocation of
+ * the RTEMS clock tick routine. The clock tick device driver
+ * gets an interrupt once a millisecond and counts down until the
+ * length of time between the user configured microseconds per tick
+ * has passed.
+ */
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * The previous ISR on this clock tick interrupt vector.
+ */
+
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+static unsigned32 mips_timer_rate = 0;
+
+/*
+ * Isr Handler
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+/*
+ * bump the number of clock driver ticks since initialization
+ *
+ * determine if it is time to announce the passing of tick as configured
+ * to RTEMS through the rtems_clock_tick directive
+ *
+ * perform any timer dependent tasks
+ */
+
+ /* refresh the internal CPU timer */
+ mips_set_timer( mips_timer_rate );
+
+ Clock_driver_ticks += 1;
+
+ rtems_clock_tick();
+}
+
+/* User callback shell (set from Clock_Control) */
+static void (*user_callback)(void);
+
+rtems_isr User_Clock_isr(
+ rtems_vector_number vector
+)
+{
+ /* refresh the internal CPU timer */
+ mips_set_timer( mips_timer_rate );
+
+ if (user_callback)
+ user_callback();
+}
+
+/*
+ * Install_clock
+ *
+ * Install a clock tick handleR and reprograms the chip. This
+ * is used to initially establish the clock tick.
+ */
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ /*
+ * Initialize the clock tick device driver variables
+ */
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ /*
+ * If ticks_per_timeslice is configured as non-zero, then the user
+ * wants a clock tick.
+ */
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ /*
+ * Hardware specific initialize goes here
+ */
+
+ mips_timer_rate = BSP_Configuration.microseconds_per_tick * CLOCKS_PER_MICROSECOND;
+ mips_set_timer( mips_timer_rate );
+ enable_int(CLOCK_VECTOR_MASK);
+ }
+
+ /*
+ * Schedule the clock cleanup routine to execute if the application exits.
+ */
+
+ atexit( Clock_exit );
+}
+
+/*
+ * Clean up before the application exits
+ */
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+
+ /* mips: turn off the timer interrupts */
+ disable_int(CLOCK_VECTOR_MASK);
+
+ }
+}
+
+/*
+ * Clock_initialize
+ *
+ * Device driver entry point for clock tick driver initialization.
+ */
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ user_callback = (void (*)(void))args->buffer;
+ (void) set_vector( User_Clock_isr, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libcpu/mips/clock/clock.S b/c/src/lib/libcpu/mips/clock/clock.S
new file mode 100644
index 0000000000..ec0280f494
--- /dev/null
+++ b/c/src/lib/libcpu/mips/clock/clock.S
@@ -0,0 +1,45 @@
+/* clock.s
+ *
+ * This file contains the assembly code for the IDT 4650 clock driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+/* @(#)clock.S 08/20/96 1.2 */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+FRAME(mips_set_timer,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_COUNT
+ nop
+ addu t0,a0,t0
+ mtc0 t0,C0_COMPARE
+ nop
+ j ra
+ .set reorder
+ENDFRAME(mips_set_timer)
+
+FRAME(mips_get_timer,sp,0,ra)
+ .set noreorder
+ mfc0 v0,C0_COUNT
+ nop
+ j ra
+ .set reorder
+ENDFRAME(mips_get_timer)
diff --git a/c/src/lib/libcpu/mips/clock/clock.h b/c/src/lib/libcpu/mips/clock/clock.h
new file mode 100644
index 0000000000..a14304f668
--- /dev/null
+++ b/c/src/lib/libcpu/mips/clock/clock.h
@@ -0,0 +1,25 @@
+/* clock.s
+ *
+ * This file contains the assembly code for the IDT 4650 clock driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+/* @(#)clock.h 08/20/96 1.2 */
+
+extern void mips_set_timer( unsigned32 timer_clock_interval );
diff --git a/c/src/lib/libcpu/mips/timer/gettime.S b/c/src/lib/libcpu/mips/timer/gettime.S
new file mode 100644
index 0000000000..a00f2d5819
--- /dev/null
+++ b/c/src/lib/libcpu/mips/timer/gettime.S
@@ -0,0 +1,35 @@
+/* gettime.s
+ *
+ * This file contains the assembly code for the IDT 4650 timer driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+/* @(#)gettime.S 08/20/96 1.2 */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+FRAME(mips_read_timer,sp,0,ra)
+ .set noreorder
+ mfc0 v0,C0_COUNT
+ nop
+ j ra
+ .set reorder
+ENDFRAME(mips_read_timer)
diff --git a/c/src/lib/libcpu/mips/timer/timer.c b/c/src/lib/libcpu/mips/timer/timer.c
new file mode 100644
index 0000000000..e8be7a2b3f
--- /dev/null
+++ b/c/src/lib/libcpu/mips/timer/timer.c
@@ -0,0 +1,140 @@
+/* timer.c
+ *
+ * This file contains the initialization code for the IDT 4650 timer driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * derived from src/lib/libbsp/no_cpu/no_bsp/timer/timer.c
+ *
+ * This file manages the benchmark timer used by the RTEMS Timing Test
+ * Suite. Each measured time period is demarcated by calls to
+ * Timer_initialize() and Read_timer(). Read_timer() usually returns
+ * the number of microseconds since Timer_initialize() exitted.
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)timer.c 08/20/96 1.5\n";
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+#define CLOCKS_PER_MICROSECOND ( CPU_CLOCK_RATE_MHZ )
+#define TIMER_MAX_VALUE 0xffffffff
+
+extern unsigned32 mips_read_timer( void );
+
+static rtems_boolean Timer_driver_Find_average_overhead;
+static unsigned32 Timer_initial_value = 0;
+
+void Timer_initialize( void )
+{
+ Timer_initial_value = mips_read_timer();
+ /*
+ * Somehow start the timer
+ */
+
+ /* Timer on 4650 is always running */
+}
+
+/*
+ * The following controls the behavior of Read_timer().
+ *
+ * AVG_OVEREHAD is the overhead for starting and stopping the timer. It
+ * is usually deducted from the number returned.
+ *
+ * LEAST_VALID is the lowest number this routine should trust. Numbers
+ * below this are "noise" and zero is returned.
+ */
+
+#define AVG_OVERHEAD 8 /* It typically takes X.X microseconds */
+ /* (Y countdowns) to start/stop the timer. */
+ /* This value is in cycles. */
+#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */
+
+int Read_timer( void )
+{
+ unsigned64 clicks;
+ unsigned32 total;
+
+ /*
+ * Read the timer and see how many clicks it has been since we started.
+ */
+
+ clicks = mips_read_timer(); /* XXX: read some HW here */
+ if (clicks < Timer_initial_value)
+ {
+ clicks += TIMER_MAX_VALUE;
+ }
+ clicks -= Timer_initial_value;
+
+ /*
+ * Total is calculated by taking into account the number of timer overflow
+ * interrupts since the timer was initialized and clicks since the last
+ * interrupts.
+ */
+#if 0 /* leave total in number of cycles */
+ total = clicks / CLOCKS_PER_MICROSECOND;
+#else
+ total = clicks;
+#endif
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in # cycles units */
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ /*
+ * leave total in cycles
+ */
+ return (total - AVG_OVERHEAD);
+ }
+}
+
+/*
+ * Empty function call used in loops to measure basic cost of looping
+ * in Timing Test Suite.
+ */
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
+
diff --git a/c/src/lib/libcpu/mips64orion/Makefile.in b/c/src/lib/libcpu/mips64orion/Makefile.in
new file mode 100644
index 0000000000..ac8c9d81f2
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=include clock timer
diff --git a/c/src/lib/libcpu/mips64orion/clock/Makefile.in b/c/src/lib/libcpu/mips64orion/clock/Makefile.in
new file mode 100644
index 0000000000..41735e9e07
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/clock/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=ckinit
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=clock
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/mips64orion/clock/ckinit.c b/c/src/lib/libcpu/mips64orion/clock/ckinit.c
new file mode 100644
index 0000000000..f2b41c997c
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/clock/ckinit.c
@@ -0,0 +1,249 @@
+
+/* ckinit.c
+ *
+ * This file contains the clock driver initialization for the IDT 4650.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/clock/ckinit.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)ckinit.c 08/20/96 1.3\n";
+ */
+
+
+#include <stdlib.h>
+
+#include <rtems.h>
+#include <rtems/libio.h>
+#include <bsp.h>
+
+#define EXT_INT5 0x8000 /* external interrupt 5 */
+
+#include "clock.h"
+
+#define CLOCKS_PER_MICROSECOND ( CPU_CLOCK_RATE_MHZ ) /* equivalent to CPU clock speed in MHz */
+
+void Clock_exit( void );
+rtems_isr Clock_isr( rtems_vector_number vector );
+
+
+/*
+ * The interrupt vector number associated with the clock tick device
+ * driver.
+ */
+
+#define CLOCK_VECTOR_MASK EXT_INT5
+#define CLOCK_VECTOR 0x7
+
+/*
+ * Clock_driver_ticks is a monotonically increasing counter of the
+ * number of clock ticks since the driver was initialized.
+ */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+
+/*
+ * Clock_isrs is the number of clock ISRs until the next invocation of
+ * the RTEMS clock tick routine. The clock tick device driver
+ * gets an interrupt once a millisecond and counts down until the
+ * length of time between the user configured microseconds per tick
+ * has passed.
+ */
+
+rtems_unsigned32 Clock_isrs; /* ISRs until next tick */
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+/*
+ * The previous ISR on this clock tick interrupt vector.
+ */
+
+rtems_isr_entry Old_ticker;
+
+void Clock_exit( void );
+
+static unsigned32 mips_timer_rate = 0;
+
+/*
+ * Isr Handler
+ */
+
+rtems_isr Clock_isr(
+ rtems_vector_number vector
+)
+{
+/*
+ * bump the number of clock driver ticks since initialization
+ *
+ * determine if it is time to announce the passing of tick as configured
+ * to RTEMS through the rtems_clock_tick directive
+ *
+ * perform any timer dependent tasks
+ */
+
+ /* refresh the internal CPU timer */
+ mips_set_timer( mips_timer_rate );
+
+ Clock_driver_ticks += 1;
+
+ rtems_clock_tick();
+}
+
+/* User callback shell (set from Clock_Control) */
+static void (*user_callback)(void);
+
+rtems_isr User_Clock_isr(
+ rtems_vector_number vector
+)
+{
+ /* refresh the internal CPU timer */
+ mips_set_timer( mips_timer_rate );
+
+ if (user_callback)
+ user_callback();
+}
+
+/*
+ * Install_clock
+ *
+ * Install a clock tick handleR and reprograms the chip. This
+ * is used to initially establish the clock tick.
+ */
+
+void Install_clock(
+ rtems_isr_entry clock_isr
+)
+{
+ /*
+ * Initialize the clock tick device driver variables
+ */
+
+ Clock_driver_ticks = 0;
+ Clock_isrs = BSP_Configuration.microseconds_per_tick / 1000;
+
+ /*
+ * If ticks_per_timeslice is configured as non-zero, then the user
+ * wants a clock tick.
+ */
+
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+ Old_ticker = (rtems_isr_entry) set_vector( clock_isr, CLOCK_VECTOR, 1 );
+ /*
+ * Hardware specific initialize goes here
+ */
+
+ mips_timer_rate = BSP_Configuration.microseconds_per_tick * CLOCKS_PER_MICROSECOND;
+ mips_set_timer( mips_timer_rate );
+ enable_int(CLOCK_VECTOR_MASK);
+ }
+
+ /*
+ * Schedule the clock cleanup routine to execute if the application exits.
+ */
+
+ atexit( Clock_exit );
+}
+
+/*
+ * Clean up before the application exits
+ */
+
+void Clock_exit( void )
+{
+ if ( BSP_Configuration.ticks_per_timeslice ) {
+
+ /* mips: turn off the timer interrupts */
+ disable_int(CLOCK_VECTOR_MASK);
+
+ }
+}
+
+/*
+ * Clock_initialize
+ *
+ * Device driver entry point for clock tick driver initialization.
+ */
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_unsigned32 isrlevel;
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(CLOCK_VECTOR);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ rtems_interrupt_disable( isrlevel );
+ user_callback = (void (*)(void))args->buffer;
+ (void) set_vector( User_Clock_isr, CLOCK_VECTOR, 1 );
+ rtems_interrupt_enable( isrlevel );
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libcpu/mips64orion/clock/clock.S b/c/src/lib/libcpu/mips64orion/clock/clock.S
new file mode 100644
index 0000000000..ec0280f494
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/clock/clock.S
@@ -0,0 +1,45 @@
+/* clock.s
+ *
+ * This file contains the assembly code for the IDT 4650 clock driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+/* @(#)clock.S 08/20/96 1.2 */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+FRAME(mips_set_timer,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_COUNT
+ nop
+ addu t0,a0,t0
+ mtc0 t0,C0_COMPARE
+ nop
+ j ra
+ .set reorder
+ENDFRAME(mips_set_timer)
+
+FRAME(mips_get_timer,sp,0,ra)
+ .set noreorder
+ mfc0 v0,C0_COUNT
+ nop
+ j ra
+ .set reorder
+ENDFRAME(mips_get_timer)
diff --git a/c/src/lib/libcpu/mips64orion/clock/clock.h b/c/src/lib/libcpu/mips64orion/clock/clock.h
new file mode 100644
index 0000000000..a14304f668
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/clock/clock.h
@@ -0,0 +1,25 @@
+/* clock.s
+ *
+ * This file contains the assembly code for the IDT 4650 clock driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+/* @(#)clock.h 08/20/96 1.2 */
+
+extern void mips_set_timer( unsigned32 timer_clock_interval );
diff --git a/c/src/lib/libcpu/mips64orion/include/Makefile.in b/c/src/lib/libcpu/mips64orion/include/Makefile.in
new file mode 100644
index 0000000000..5c369d39f7
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/include/Makefile.in
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# Install any include files needed by libcpu.
+# Mainly this just means bsp.h which would normally be installed
+# after libcpu is built.
+# This is a bit of a hack.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+all: FORCEIT
+ cd ../../../libbsp/$(RTEMS_CPU)/$(RTEMS_BSP)/include; $(MAKE) all
+
+
diff --git a/c/src/lib/libcpu/mips64orion/timer/Makefile.in b/c/src/lib/libcpu/mips64orion/timer/Makefile.in
new file mode 100644
index 0000000000..e5a4218f1f
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/timer/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# NOTE: timerisr is normally an assembly file!!!
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=gettime
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/mips64orion/timer/gettime.S b/c/src/lib/libcpu/mips64orion/timer/gettime.S
new file mode 100644
index 0000000000..a00f2d5819
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/timer/gettime.S
@@ -0,0 +1,35 @@
+/* gettime.s
+ *
+ * This file contains the assembly code for the IDT 4650 timer driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+/* @(#)gettime.S 08/20/96 1.2 */
+
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+FRAME(mips_read_timer,sp,0,ra)
+ .set noreorder
+ mfc0 v0,C0_COUNT
+ nop
+ j ra
+ .set reorder
+ENDFRAME(mips_read_timer)
diff --git a/c/src/lib/libcpu/mips64orion/timer/timer.c b/c/src/lib/libcpu/mips64orion/timer/timer.c
new file mode 100644
index 0000000000..e8be7a2b3f
--- /dev/null
+++ b/c/src/lib/libcpu/mips64orion/timer/timer.c
@@ -0,0 +1,140 @@
+/* timer.c
+ *
+ * This file contains the initialization code for the IDT 4650 timer driver.
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * derived from src/lib/libbsp/no_cpu/no_bsp/timer/timer.c
+ *
+ * This file manages the benchmark timer used by the RTEMS Timing Test
+ * Suite. Each measured time period is demarcated by calls to
+ * Timer_initialize() and Read_timer(). Read_timer() usually returns
+ * the number of microseconds since Timer_initialize() exitted.
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)timer.c 08/20/96 1.5\n";
+ */
+
+
+#include <rtems.h>
+#include <bsp.h>
+
+#define CLOCKS_PER_MICROSECOND ( CPU_CLOCK_RATE_MHZ )
+#define TIMER_MAX_VALUE 0xffffffff
+
+extern unsigned32 mips_read_timer( void );
+
+static rtems_boolean Timer_driver_Find_average_overhead;
+static unsigned32 Timer_initial_value = 0;
+
+void Timer_initialize( void )
+{
+ Timer_initial_value = mips_read_timer();
+ /*
+ * Somehow start the timer
+ */
+
+ /* Timer on 4650 is always running */
+}
+
+/*
+ * The following controls the behavior of Read_timer().
+ *
+ * AVG_OVEREHAD is the overhead for starting and stopping the timer. It
+ * is usually deducted from the number returned.
+ *
+ * LEAST_VALID is the lowest number this routine should trust. Numbers
+ * below this are "noise" and zero is returned.
+ */
+
+#define AVG_OVERHEAD 8 /* It typically takes X.X microseconds */
+ /* (Y countdowns) to start/stop the timer. */
+ /* This value is in cycles. */
+#define LEAST_VALID 1 /* Don't trust a clicks value lower than this */
+
+int Read_timer( void )
+{
+ unsigned64 clicks;
+ unsigned32 total;
+
+ /*
+ * Read the timer and see how many clicks it has been since we started.
+ */
+
+ clicks = mips_read_timer(); /* XXX: read some HW here */
+ if (clicks < Timer_initial_value)
+ {
+ clicks += TIMER_MAX_VALUE;
+ }
+ clicks -= Timer_initial_value;
+
+ /*
+ * Total is calculated by taking into account the number of timer overflow
+ * interrupts since the timer was initialized and clicks since the last
+ * interrupts.
+ */
+#if 0 /* leave total in number of cycles */
+ total = clicks / CLOCKS_PER_MICROSECOND;
+#else
+ total = clicks;
+#endif
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in # cycles units */
+ else {
+ if ( total < LEAST_VALID )
+ return 0; /* below timer resolution */
+ /*
+ * leave total in cycles
+ */
+ return (total - AVG_OVERHEAD);
+ }
+}
+
+/*
+ * Empty function call used in loops to measure basic cost of looping
+ * in Timing Test Suite.
+ */
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
+
diff --git a/c/src/lib/libcpu/powerpc/Makefile.in b/c/src/lib/libcpu/powerpc/Makefile.in
new file mode 100644
index 0000000000..2dda77e7a4
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=ppc403
diff --git a/c/src/lib/libcpu/powerpc/README b/c/src/lib/libcpu/powerpc/README
new file mode 100644
index 0000000000..32e4aed60c
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/README
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+This hierarchy contains support routines for the various
+PowerPC processors.
+
+Since these routines can differ amongst different members
+of the PowerPC family, an entry per CPU type is provided.
+
+Currently only the PPC403 is supported.
+
+Andrew Bray 4/December/1995
diff --git a/c/src/lib/libcpu/powerpc/ppc403/Makefile.in b/c/src/lib/libcpu/powerpc/ppc403/Makefile.in
new file mode 100644
index 0000000000..f7dab552c0
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=include console clock timer vectors
diff --git a/c/src/lib/libcpu/powerpc/ppc403/README b/c/src/lib/libcpu/powerpc/ppc403/README
new file mode 100644
index 0000000000..528506d3dd
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/README
@@ -0,0 +1,22 @@
+#
+# $Id$
+#
+
+Various non BSP dependant support routines.
+
+clock - Uses the 403 PIT (Programmable interval timer) to
+ generate RTEMS clock ticks.
+
+console - Uses the 403 Internal serial port to do RTEMS
+ console I/O. Not ALL members of the 403 family
+ have this.
+
+include - Currently empty
+
+timer - Uses the 403 timebase register for timing
+ tests. Other PowerPCs have slightly different
+ timebase register definitions.
+
+vectors - PowerPC 403 specific vector entry points.
+ Includes CPU dependant, application independant
+ handlers: alignment.
diff --git a/c/src/lib/libcpu/powerpc/ppc403/clock/Makefile.in b/c/src/lib/libcpu/powerpc/ppc403/clock/Makefile.in
new file mode 100644
index 0000000000..20bef5121e
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/clock/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/clock.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=clock
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# libbsp/hppa/BSP/wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c b/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c
new file mode 100644
index 0000000000..678df47f9d
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c
@@ -0,0 +1,265 @@
+/* clock.c
+ *
+ * This routine initializes the interval timer on the
+ * PowerPC 403 CPU. The tick frequency is specified by the bsp.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libcpu/hppa1_1/clock/clock.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <clockdrv.h>
+#include <rtems/libio.h>
+
+#include <stdlib.h> /* for atexit() */
+
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+volatile rtems_unsigned32 Clock_driver_ticks;
+static rtems_unsigned32 pit_value, tick_time;
+static rtems_boolean auto_restart;
+
+void Clock_exit( void );
+
+/*
+ * These are set by clock driver during its init
+ */
+
+rtems_device_major_number rtems_clock_major = ~0;
+rtems_device_minor_number rtems_clock_minor;
+
+static inline rtems_unsigned32 get_itimer(void)
+{
+ register rtems_unsigned32 rc;
+
+ asm volatile ("mfspr %0, 0x3dd" : "=r" ((rc))); /* TBLO */
+
+ return rc;
+}
+
+/*
+ * ISR Handler
+ */
+
+rtems_isr
+Clock_isr(rtems_vector_number vector)
+{
+ if (!auto_restart)
+ {
+ rtems_unsigned32 clicks_til_next_interrupt;
+ rtems_unsigned32 itimer_value;
+
+ /*
+ * setup for next interrupt; making sure the new value is reasonably
+ * in the future.... in case we lost out on an interrupt somehow
+ */
+
+ itimer_value = get_itimer();
+ tick_time += pit_value;
+
+ /*
+ * how far away is next interrupt *really*
+ * It may be a long time; this subtraction works even if
+ * Clock_clicks_interrupt < Clock_clicks_low_order via
+ * the miracle of unsigned math.
+ */
+ clicks_til_next_interrupt = tick_time - itimer_value;
+
+ /*
+ * If it is too soon then bump it up.
+ * This should only happen if CPU_HPPA_CLICKS_PER_TICK is too small.
+ * But setting it low is useful for debug, so...
+ */
+
+ if (clicks_til_next_interrupt < 400)
+ {
+ tick_time = itimer_value + 1000;
+ clicks_til_next_interrupt = 1000;
+ /* XXX: count these! this should be rare */
+ }
+
+ /*
+ * If it is too late, that means we missed the interrupt somehow.
+ * Rather than wait 35-50s for a wrap, we just fudge it here.
+ */
+
+ if (clicks_til_next_interrupt > pit_value)
+ {
+ tick_time = itimer_value + 1000;
+ clicks_til_next_interrupt = 1000;
+ /* XXX: count these! this should never happen :-) */
+ }
+
+ asm volatile ("mtspr 0x3db, %0" :: "r"
+ (clicks_til_next_interrupt)); /* PIT */
+ }
+
+ asm volatile ( "mtspr 0x3d8, %0" :: "r" (0x08000000)); /* TSR */
+
+ Clock_driver_ticks++;
+
+ rtems_clock_tick();
+}
+
+void Install_clock(rtems_isr_entry clock_isr)
+{
+ rtems_isr_entry previous_isr;
+ rtems_unsigned32 pvr, iocr;
+
+ Clock_driver_ticks = 0;
+
+ asm volatile ("mfdcr %0, 0xa0" : "=r" (iocr)); /* IOCR */
+ iocr &= ~4;
+ iocr |= 4; /* Select external timer clock */
+ asm volatile ("mtdcr 0xa0, %0" : "=r" (iocr) : "0" (iocr)); /* IOCR */
+
+ asm volatile ("mfspr %0, 0x11f" : "=r" ((pvr))); /* PVR */
+
+ if (((pvr & 0xffff0000) >> 16) != 0x0020)
+ return; /* Not a ppc403 */
+
+ if ((pvr & 0xff00) == 0x0000) /* 403GA */
+ auto_restart = (pvr & 0x00f0) > 0x0000 ? 1 : 0;
+ else if ((pvr & 0xff00) == 0x0100) /* 403GB */
+ auto_restart = 1;
+
+ pit_value = BSP_Configuration.microseconds_per_tick *
+ Cpu_table.clicks_per_usec;
+
+ if (BSP_Configuration.ticks_per_timeslice)
+ {
+ register rtems_unsigned32 tcr;
+
+ /*
+ * initialize the interval here
+ * First tick is set to right amount of time in the future
+ * Future ticks will be incremented over last value set
+ * in order to provide consistent clicks in the face of
+ * interrupt overhead
+ */
+
+ rtems_interrupt_catch(clock_isr, PPC_IRQ_PIT, &previous_isr);
+
+ asm volatile ("mtspr 0x3db, %0" : : "r" (pit_value)); /* PIT */
+
+ asm volatile ("mfspr %0, 0x3da" : "=r" ((tcr))); /* TCR */
+
+ tcr &= ~ 0x04400000;
+
+ tcr |= (auto_restart ? 0x04400000 : 0x04000000);
+
+ tick_time = get_itimer() + pit_value;
+
+ asm volatile ("mtspr 0x3da, %0" : "=r" ((tcr)) : "0" ((tcr))); /* TCR */
+ }
+ atexit(Clock_exit);
+}
+
+void
+ReInstall_clock(rtems_isr_entry new_clock_isr)
+{
+ rtems_isr_entry previous_isr;
+ rtems_unsigned32 isrlevel = 0;
+
+ rtems_interrupt_disable(isrlevel);
+
+ rtems_interrupt_catch(new_clock_isr, PPC_IRQ_PIT, &previous_isr);
+
+ rtems_interrupt_enable(isrlevel);
+}
+
+
+/*
+ * Called via atexit()
+ * Remove the clock interrupt handler by setting handler to NULL
+ */
+
+void
+Clock_exit(void)
+{
+ if ( BSP_Configuration.ticks_per_timeslice )
+ {
+ register rtems_unsigned32 tcr;
+
+ asm volatile ("mfspr %0, 0x3da" : "=r" ((tcr))); /* TCR */
+
+ tcr &= ~ 0x04400000;
+
+ asm volatile ("mtspr 0x3da, %0" : "=r" ((tcr)) : "0" ((tcr))); /* TCR */
+
+ (void) set_vector(0, PPC_IRQ_PIT, 1);
+ }
+
+}
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ Install_clock( Clock_isr );
+
+ /*
+ * make major/minor avail to others such as shared memory driver
+ */
+
+ rtems_clock_major = major;
+ rtems_clock_minor = minor;
+
+ return RTEMS_SUCCESSFUL;
+}
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ rtems_libio_ioctl_args_t *args = pargp;
+
+ if (args == 0)
+ goto done;
+
+ /*
+ * This is hokey, but until we get a defined interface
+ * to do this, it will just be this simple...
+ */
+
+ if (args->command == rtems_build_name('I', 'S', 'R', ' '))
+ {
+ Clock_isr(PPC_IRQ_PIT);
+ }
+ else if (args->command == rtems_build_name('N', 'E', 'W', ' '))
+ {
+ ReInstall_clock(args->buffer);
+ }
+
+done:
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libcpu/powerpc/ppc403/console/Makefile.in b/c/src/lib/libcpu/powerpc/ppc403/console/Makefile.in
new file mode 100644
index 0000000000..58d2734659
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/console/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/console.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=console
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/powerpc/ppc403/console/console.c b/c/src/lib/libcpu/powerpc/ppc403/console/console.c
new file mode 100644
index 0000000000..1680e65351
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/console/console.c
@@ -0,0 +1,387 @@
+/*
+ * This file contains the PowerPC 403GA console IO package.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libbsp/no_cpu/no_bsp/console/console.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define NO_BSP_INIT
+
+#include <bsp.h>
+#include <rtems/libio.h>
+
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+struct async {
+/*-----------------------------------------------------------------------------+
+| Line Status Register.
++-----------------------------------------------------------------------------*/
+ unsigned char SPLS;
+ unsigned char SPLSset;
+#define LSRDataReady 0x80
+#define LSRFramingError 0x40
+#define LSROverrunError 0x20
+#define LSRParityError 0x10
+#define LSRBreakInterrupt 0x08
+#define LSRTxHoldEmpty 0x04
+#define LSRTxShiftEmpty 0x02
+
+/*-----------------------------------------------------------------------------+
+| Handshake Status Register.
++-----------------------------------------------------------------------------*/
+ unsigned char SPHS;
+ unsigned char SPHSset;
+#define HSRDsr 0x80
+#define HSRCts 0x40
+
+/*-----------------------------------------------------------------------------+
+| Baud rate divisor registers
++-----------------------------------------------------------------------------*/
+ unsigned char BRDH;
+ unsigned char BRDL;
+
+/*-----------------------------------------------------------------------------+
+| Control Register.
++-----------------------------------------------------------------------------*/
+ unsigned char SPCTL;
+#define CRNormal 0x00
+#define CRLoopback 0x40
+#define CRAutoEcho 0x80
+#define CRDtr 0x20
+#define CRRts 0x10
+#define CRWordLength7 0x00
+#define CRWordLength8 0x08
+#define CRParityDisable 0x00
+#define CRParityEnable 0x04
+#define CREvenParity 0x00
+#define CROddParity 0x02
+#define CRStopBitsOne 0x00
+#define CRStopBitsTwo 0x01
+#define CRDisableDtrRts 0x00
+
+/*-----------------------------------------------------------------------------+
+| Receiver Command Register.
++-----------------------------------------------------------------------------*/
+ unsigned char SPRC;
+#define RCRDisable 0x00
+#define RCREnable 0x80
+#define RCRIntDisable 0x00
+#define RCRIntEnabled 0x20
+#define RCRDMACh2 0x40
+#define RCRDMACh3 0x60
+#define RCRErrorInt 0x10
+#define RCRPauseEnable 0x08
+
+/*-----------------------------------------------------------------------------+
+| Transmitter Command Register.
++-----------------------------------------------------------------------------*/
+ unsigned char SPTC;
+#define TCRDisable 0x00
+#define TCREnable 0x80
+#define TCRIntDisable 0x00
+#define TCRIntEnabled 0x20
+#define TCRDMACh2 0x40
+#define TCRDMACh3 0x60
+#define TCRTxEmpty 0x10
+#define TCRErrorInt 0x08
+#define TCRStopPause 0x04
+#define TCRBreakGen 0x02
+
+/*-----------------------------------------------------------------------------+
+| Miscellanies defines.
++-----------------------------------------------------------------------------*/
+ unsigned char SPTB;
+#define SPRB SPTB
+};
+
+#define XOFFchar 0x13
+#define XONchar 0x11
+
+typedef volatile struct async *pasync;
+static const pasync port = (pasync)0x40000000;
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+ register unsigned tmp;
+
+ /* Initialise the serial port */
+ asm volatile ("mfdcr %0, 0xa0" : "=r" (tmp)); /* IOCR */
+ tmp &= ~3;
+ tmp |= (Cpu_table.serial_external_clock ? 2 : 0) |
+ (Cpu_table.serial_cts_rts ? 1 : 0);
+ asm volatile ("mtdcr 0xa0, %0" : "=r" (tmp) : "0" (tmp)); /* IOCR */
+ port->SPLS = (LSRDataReady | LSRFramingError | LSROverrunError |
+ LSRParityError | LSRBreakInterrupt);
+ tmp = Cpu_table.serial_per_sec / Cpu_table.serial_rate;
+ tmp = ((tmp + 8) >> 4) - 1;
+ port->BRDL = tmp & 0x255;
+ port->BRDH = tmp >> 8;
+ port->SPCTL = (CRNormal | CRDtr | CRRts | CRWordLength8 | CRParityDisable |
+ CRStopBitsOne);
+ port->SPRC = (RCREnable | RCRIntDisable | RCRPauseEnable);
+ port->SPTC = (TCREnable | TCRIntDisable);
+ port->SPHS = (HSRDsr | HSRCts);
+
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ unsigned char status;
+
+ if ((status = port->SPLS) & LSRDataReady)
+ {
+ *ch = port->SPRB;
+ return(TRUE);
+ }
+
+ /* Clean any dodgy status */
+ if ((status & (LSRFramingError | LSROverrunError | LSRParityError |
+ LSRBreakInterrupt)) != 0)
+ {
+ port->SPLS = (LSRFramingError | LSROverrunError | LSRParityError |
+ LSRBreakInterrupt);
+ }
+
+ return FALSE;
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SOURCE.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SOURCE
+ */
+
+char inbyte( void )
+{
+ unsigned char status;
+
+ while (1)
+ {
+ if ((status = port->SPLS) & LSRDataReady)
+ break;
+
+ /* Clean any dodgy status */
+ if ((status & (LSRFramingError | LSROverrunError | LSRParityError |
+ LSRBreakInterrupt)) != 0)
+ {
+ port->SPLS = (LSRFramingError | LSROverrunError | LSRParityError |
+ LSRBreakInterrupt);
+ }
+ }
+
+ return port->SPRB;
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SOURCE. It may support
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte(
+ char ch
+)
+{
+ unsigned char status;
+
+ while (port->SPHS)
+ port->SPHS = (HSRDsr | HSRCts);
+
+ while (1)
+ {
+ status = port->SPLS;
+
+ if (port->SPHS)
+ port->SPHS = (HSRDsr | HSRCts);
+ else if (status & LSRTxHoldEmpty)
+ break;
+ }
+
+ if (Cpu_table.serial_xon_xoff)
+ while (is_character_ready(&status))
+ {
+ if (status == XOFFchar)
+ do {
+ while (!is_character_ready(&status));
+ } while (status != XONchar);
+ }
+
+ port->SPTB = ch;
+}
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * Close entry point
+ */
+
+rtems_device_driver console_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+/*
+ * read bytes from the serial port. We only have stdin.
+ */
+
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte();
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ break;
+ }
+ }
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * write bytes to the serial port. Stdout and stderr are the same.
+ */
+
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ int count;
+ int maximum;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r');
+ }
+ outbyte( buffer[ count ] );
+ }
+ return maximum;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
+}
+
diff --git a/c/src/lib/libcpu/powerpc/ppc403/include/Makefile.in b/c/src/lib/libcpu/powerpc/ppc403/include/Makefile.in
new file mode 100644
index 0000000000..373231afc8
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/include/Makefile.in
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# Install any include files needed by libcpu.
+# Mainly this just means bsp.h which would normally be installed
+# after libcpu is built.
+# This is a bit of a hack.
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+all: FORCEIT
+ cd ../../../../libbsp/$(RTEMS_CPU)/$(RTEMS_BSP)/include; $(MAKE) all
+
+
diff --git a/c/src/lib/libcpu/powerpc/ppc403/timer/Makefile.in b/c/src/lib/libcpu/powerpc/ppc403/timer/Makefile.in
new file mode 100644
index 0000000000..03af6fc92a
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/timer/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/timer.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# libbsp/hppa/BSP/wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/powerpc/ppc403/timer/timer.c b/c/src/lib/libcpu/powerpc/ppc403/timer/timer.c
new file mode 100644
index 0000000000..9f266e847d
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/timer/timer.c
@@ -0,0 +1,98 @@
+/* timer.c
+ *
+ * This file manages the interval timer on the PowerPC 403*.
+ * We shall use the bottom 32 bits of the timebase register,
+ *
+ * NOTE: It is important that the timer start/stop overhead be
+ * determined when porting or modifying this code.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/lib/libcpu/hppa1_1/timer/timer.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+#include <rtems.h>
+
+extern rtems_cpu_table Cpu_table; /* owned by BSP */
+
+static volatile rtems_unsigned32 Timer_starting;
+static rtems_boolean Timer_driver_Find_average_overhead;
+
+/*
+ * This is so small that this code will be reproduced where needed.
+ */
+static inline rtems_unsigned32 get_itimer(void)
+{
+ rtems_unsigned32 ret;
+
+ asm volatile ("mfspr %0, 0x3dd" : "=r" ((ret))); /* TBLO */
+
+ return ret;
+}
+
+void Timer_initialize()
+{
+ rtems_unsigned32 iocr;
+
+ asm volatile ("mfdcr %0, 0xa0" : "=r" (iocr)); /* IOCR */
+ iocr &= ~4;
+ iocr |= 4; /* Select external timer clock */
+ asm volatile ("mtdcr 0xa0, %0" : "=r" (iocr) : "0" (iocr)); /* IOCR */
+
+ Timer_starting = get_itimer();
+}
+
+int Read_timer()
+{
+ rtems_unsigned32 clicks;
+ rtems_unsigned32 total;
+
+ clicks = get_itimer();
+
+ total = clicks - Timer_starting;
+
+ if ( Timer_driver_Find_average_overhead == 1 )
+ return total; /* in XXX microsecond units */
+
+ else {
+ if ( total < Cpu_table.timer_least_valid )
+ return 0; /* below timer resolution */
+ return (total - Cpu_table.timer_average_overhead);
+ }
+}
+
+rtems_status_code Empty_function( void )
+{
+ return RTEMS_SUCCESSFUL;
+}
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+)
+{
+ Timer_driver_Find_average_overhead = find_flag;
+}
diff --git a/c/src/lib/libcpu/powerpc/ppc403/vectors/Makefile.in b/c/src/lib/libcpu/powerpc/ppc403/vectors/Makefile.in
new file mode 100644
index 0000000000..8d089d85ec
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/vectors/Makefile.in
@@ -0,0 +1,58 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/vectors.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=vectors align_h
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by ../wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/powerpc/ppc403/vectors/README b/c/src/lib/libcpu/powerpc/ppc403/vectors/README
new file mode 100644
index 0000000000..4081ae2525
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/vectors/README
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+The location of the vectors file object is critical.
+
+From the comments at the head of vectors.s:
+
+ The issue with this file is getting it loaded at the right place.
+ The first vector MUST be at address 0x????0100.
+ How this is achieved is dependant on the tool chain.
+
+ However the basic mechanism for ELF assemblers is to create a
+ section called ".vectors", which will be loaded to an address
+ between 0x????0000 and 0x????0100 (inclusive) via a link script.
+
+ The basic mechanism for XCOFF assemblers is to place it in the
+ normal text section, and arrange for this file to be located
+ at an appropriate position on the linker command line.
+
+ The variable 'PPC_VECTOR_FILE_BASE' must be defined to be the
+ offset from 0x????0000 to the first location in the file. This
+ will usually be 0x0000 or 0x0100.
+
+Andrew Bray 18/8/1995
diff --git a/c/src/lib/libcpu/powerpc/ppc403/vectors/align_h.s b/c/src/lib/libcpu/powerpc/ppc403/vectors/align_h.s
new file mode 100644
index 0000000000..d16298343d
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/vectors/align_h.s
@@ -0,0 +1,434 @@
+/* align_h.s 1.1 - 95/12/04
+ *
+ * This file contains the assembly code for the PowerPC 403
+ * alignment exception handler for RTEMS.
+ *
+ * Based upon IBM provided code with the following release:
+ *
+ * This source code has been made available to you by IBM on an AS-IS
+ * basis. Anyone receiving this source is licensed under IBM
+ * copyrights to use it in any way he or she deems fit, including
+ * copying it, modifying it, compiling it, and redistributing it either
+ * with or without modifications. No license under IBM patents or
+ * patent applications is to be implied by the copyright license.
+ *
+ * Any user of this software should understand that IBM cannot provide
+ * technical support for this software and will not be responsible for
+ * any consequences resulting from the use of this software.
+ *
+ * Any person who transfers this source code or any derivative work
+ * must include the IBM copyright notice, this paragraph, and the
+ * preceding two paragraphs in the transferred software.
+ *
+ * COPYRIGHT I B M CORPORATION 1995
+ * LICENSED MATERIAL - PROGRAM PROPERTY OF I B M
+ *
+ * Modifications:
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+#include "bsp.h"
+
+.set CACHE_SIZE,16 # cache line size of 32 bytes
+.set CACHE_SIZE_L2,4 # cache line size, log 2
+
+.set Open_gpr0,0
+.set Open_gpr1,4
+.set Open_gpr2,8
+.set Open_gpr3,12
+.set Open_gpr4,16
+.set Open_gpr5,20
+.set Open_gpr6,24
+.set Open_gpr7,28
+.set Open_gpr8,32
+.set Open_gpr9,36
+.set Open_gpr10,40
+.set Open_gpr11,44
+.set Open_gpr12,48
+.set Open_gpr13,52
+.set Open_gpr14,56
+.set Open_gpr15,60
+.set Open_gpr16,64
+.set Open_gpr17,68
+.set Open_gpr18,72
+.set Open_gpr19,76
+.set Open_gpr20,80
+.set Open_gpr21,84
+.set Open_gpr22,88
+.set Open_gpr23,92
+.set Open_gpr24,96
+.set Open_gpr25,100
+.set Open_gpr26,104
+.set Open_gpr27,108
+.set Open_gpr28,112
+.set Open_gpr29,116
+.set Open_gpr30,120
+.set Open_gpr31,124
+.set Open_xer,128
+.set Open_lr,132
+.set Open_ctr,136
+.set Open_cr,140
+.set Open_srr2,144
+.set Open_srr3,148
+.set Open_srr0,152
+.set Open_srr1,156
+
+
+/*
+ * This code makes several assumptions for processing efficiency
+ * * General purpose registers are continuous in the image, beginning with
+ * Open_gpr0
+ * * Hash table is highly dependent on opcodes - opcode changes *will*
+ * require rework of the instruction decode mechanism.
+ */
+
+ .text
+ .globl align_h
+
+ .align CACHE_SIZE_L2
+align_h:
+ /*-----------------------------------------------------------------------
+ * Store GPRs in Open Reg save area
+ * Set up r2 as base reg, r1 pointing to Open Reg save area
+ *----------------------------------------------------------------------*/
+ stmw r0,ALIGN_REGS(r0)
+ li r1,ALIGN_REGS
+ /*-----------------------------------------------------------------------
+ * Store special purpose registers in reg save area
+ *----------------------------------------------------------------------*/
+ mfxer r7
+ mflr r8
+ mfcr r9
+ mfctr r10
+ stw r7,Open_xer(r1)
+ stw r8,Open_lr(r1)
+ stw r9,Open_cr(r1)
+ stw r10,Open_ctr(r1)
+ mfspr r7, srr2 /* SRR 2 */
+ mfspr r8, srr3 /* SRR 3 */
+ mfspr r9, srr0 /* SRR 0 */
+ mfspr r10, srr1 /* SRR 1 */
+ stw r7,Open_srr2(r1)
+ stw r8,Open_srr3(r1)
+ stw r9,Open_srr0(r1)
+ stw r10,Open_srr1(r1)
+
+/* Set up common registers */
+ mfspr r5, dear /* DEAR: R5 is data exception address */
+ lwz r9,Open_srr0(r1) /* get faulting instruction */
+ addi r7,r9,4 /* bump instruction */
+ stw r7,Open_srr0(r1) /* restore to image */
+ lwz r9, 0(r9) /* retrieve actual instruction */
+ rlwinm r6,r9,18,25,29 /* r6 is RA * 4 field from instruction */
+ rlwinm r7,r9,6,26,31 /* r7 is primary opcode */
+ bl ref_point /* establish addressibility */
+ref_point:
+ mflr r11 /* r11 is the anchor point for ref_point */
+ addi r10, r7, -31 /* r10 = r7 - 31 */
+ rlwinm r10,r10,2,2,31 /* r10 *= 4 */
+ add r10, r10, r11 /* r10 += anchor point */
+ lwz r10, primary_jt-ref_point(r10)
+ mtlr r10
+ rlwinm r8,r9,13,25,29 /* r8 is RD * 4 */
+ la r7,Open_gpr0(r1) /* r7 is address of GPR 0 in list */
+ blr
+primary_jt:
+ .long xform
+ .long lwz
+ .long lwzu
+ .long 0
+ .long 0
+ .long stw
+ .long stwu
+ .long 0
+ .long 0
+ .long lhz
+ .long lhzu
+ .long lha
+ .long lhau
+ .long sth
+ .long sthu
+ .long lmw
+ .long stmw
+/*
+ * handlers
+ */
+/*
+ * xform instructions require an additional decode. Fortunately, a relatively
+ * simple hash step breaks the instructions out with no collisions
+ */
+xform:
+ rlwinm r7,r9,31,22,31 /* r7 is secondary opcode */
+ rlwinm r10,r7,27,5,31 /* r10 = r7 >> 5 */
+ add r10,r7,r10 /* r10 = r7 + r10 */
+ rlwinm r10,r10,2,25,29 /* r10 = (r10 & 0x1F) * 4 */
+ add r10,r10,r11 /* r10 += anchor point */
+ lwz r10, secondary_ht-ref_point(r10)
+ mtlr r10
+ la r7,Open_gpr0(r1) /* r7 is address of GPR 0 in list */
+ rlwinm r8,r9,13,25,29 /* r8 is RD * 4 */
+ blrl
+
+secondary_ht:
+ .long lhzux /* b 0 0x137 */
+ .long lhax /* b 1 0x157 */
+ .long lhaux /* b 2 0x177 */
+ .long sthx /* b 3 0x197 */
+ .long sthux /* b 4 0x1b7 */
+ .long 0 /* b 5 */
+ .long lwbrx /* b 6 0x216 */
+ .long 0 /* b 7 */
+ .long 0 /* b 8 */
+ .long 0 /* b 9 */
+ .long stwbrx /* b A 0x296 */
+ .long 0 /* b B */
+ .long 0 /* b C */
+ .long 0 /* b D */
+ .long lhbrx /* b E 0x316 */
+ .long 0 /* b F */
+ .long 0 /* b 10 */
+ .long 0 /* b 11 */
+ .long sthbrx /* b 12 0x396 */
+ .long 0 /* b 13 */
+ .long lwarx /* b 14 0x014 */
+ .long dcbz /* b 15 0x3f6 */
+ .long 0 /* b 16 */
+ .long lwzx /* b 17 0x017 */
+ .long lwzux /* b 18 0x037 */
+ .long 0 /* b 19 */
+ .long stwcx /* b 1A 0x096 */
+ .long stwx /* b 1B 0x097 */
+ .long stwux /* b 1C 0x0B7 */
+ .long 0 /* b 1D */
+ .long 0 /* b 1E */
+ .long lhzx /* b 1F 0x117 */
+
+/*
+ * for all handlers
+ * r4 - Addressability to interrupt context
+ * r5 - DEAR address (faulting data address)
+ * r6 - RA field * 4
+ * r7 - Address of GPR 0 in image
+ * r8 - RD field * 4
+ * r9 - Failing instruction
+ */
+
+/* Load halfword algebraic with update */
+lhau:
+/* Load halfword algebraic with update indexed */
+lhaux:
+ stwx r5,r7,r6 /* update RA with effective addr */
+
+/* Load halfword algebraic */
+lha:
+/* Load halfword algebraic indexed */
+lhax:
+ lswi r10,r5,2 /* load two bytes into r10 */
+ srawi r10,r10,16 /* shift right 2 bytes, extending sign */
+ stwx r10,r7,r8 /* update reg image */
+ b align_complete /* return */
+
+/* Load Half Word Byte-Reversed Indexed */
+lhbrx:
+ lswi r10,r5,2 /* load two bytes from DEAR into r10 */
+ rlwinm r10,r10,0,0,15 /* mask off lower 2 bytes */
+ stwbrx r10,r7,r8 /* store reversed in reg image */
+ b align_complete /* return */
+
+/* Load Half Word and Zero with Update */
+lhzu:
+/* Load Half Word and Zero with Update Indexed */
+lhzux:
+ stwx r5,r7,r6 /* update RA with effective addr */
+
+/* Load Half Word and Zero */
+lhz:
+/* Load Half Word and Zero Indexed */
+lhzx:
+ lswi r10,r5,2 /* load two bytes from DEAR into r10 */
+ rlwinm r10,r10,16,16,31 /* shift right 2 bytes, with zero fill */
+ stwx r10,r7,r8 /* update reg image */
+ b align_complete /* return */
+
+/*
+ * Load Multiple Word
+ */
+lmw:
+ lwzx r9,r6,r7 /* R9 contains saved value of RA */
+ addi r10,r7,32*4 /* r10 points to r31 in image + 4 */
+ rlwinm r8,r8,30,2,31 /* r8 >>= 2 (recovers RT) */
+ subfic r8,r8,32 /* r8 is reg count to load */
+ mtctr r8 /* load counter */
+ addi r8,r8,-1 /* r8-- */
+ rlwinm r8,r8,2,2,31 /* r8 *= 4 */
+ add r5,r5,r8 /* update DEAR to point to last reg */
+lwmloop:
+ lswi r11,r5,4 /* load r11 with 4 bytes from DEAR */
+ stwu r11,-4(r10) /* load image and decrement pointer */
+ addi r5,r5,-4 /* decrement effective address */
+ bdnz lwmloop
+ stwx r9,r6,r7 /* restore RA (in case it was trashed) */
+ b align_complete /* return */
+
+/*
+ * Load Word and Reserve Indexed
+ */
+lwarx:
+ lswi r10,r5,4 /* load four bytes from DEAR into r10 */
+ stwx r10,r7,r8 /* update reg image */
+ rlwinm r5,r5,0,0,29 /* Word align address */
+ lwarx r10,0,r5 /* Set reservation */
+ b align_complete /* return */
+
+/*
+ * Load Word Byte-Reversed Indexed
+ */
+lwbrx:
+ lswi r10,r5,4 /* load four bytes from DEAR into r10 */
+ stwbrx r10,r7,r8 /* store reversed in reg image */
+ b align_complete /* return */
+
+/* Load Word and Zero with Update */
+lwzu:
+/* Load Word and Zero with Update Indexed */
+lwzux:
+ stwx r5,r7,r6 /* update RA with effective addr */
+
+/* Load Word and Zero */
+lwz:
+/* Load Word and Zero Indexed */
+lwzx:
+ lswi r10,r5,4 /* load four bytes from DEAR into r10 */
+ stwx r10,r7,r8 /* update reg image */
+ b align_complete /* return */
+
+/* Store instructions */
+
+/* */
+/* Store Half Word and Update */
+sthu:
+/* Store Half Word and Update Indexed */
+sthux:
+ stwx r5,r7,r6 /* Update RA with effective address */
+
+/* Store Half Word */
+sth:
+/* Store Half Word Indexed */
+sthx:
+ lwzx r10,r8,r7 /* retrieve source register value */
+ rlwinm r10,r10,16,0,15 /* move two bytes to high end of reg */
+ stswi r10,r5,2 /* store bytes to DEAR address */
+ b align_complete /* return */
+
+/* */
+/* Store Half Word Byte-Reversed Indexed */
+sthbrx:
+ lwbrx r10,r8,r7 /* retrieve src reg value byte reversed */
+ stswi r10,r5,2 /* move two bytes to DEAR address */
+ b align_complete /* return */
+
+/* */
+/* Store Multiple Word */
+stmw:
+ addi r10,r7,32*4 /* r10 points to r31 in image + 4 */
+ rlwinm r8,r8,30,2,31 /* r8 >>= 2 (recovers RT) */
+ subfic r8,r8,32 /* r8 is reg count to load */
+ mtctr r8 /* load counter */
+ addi r8,r8,-1 /* r8-- */
+ rlwinm r8,r8,2,2,31 /* r8 *= 4 */
+ add r5,r5,r8 /* update DEAR to point to last reg */
+stmloop:
+ lwzu r11,-4(r10) /* get register value */
+ stswi r11,r5,4 /* output to DEAR address */
+ addi r5,r5,-4 /* decrement effective address */
+ bdnz stmloop
+ b align_complete /* return */
+
+/* */
+/* Store Word and Update */
+stwu:
+/* Store Word and Update Indexed */
+stwux:
+ stwx r5,r7,r6 /* Update RA with effective address */
+
+/* Store Word */
+stw:
+/* Store Word Indexed */
+stwx:
+ lwzx r10,r8,r7 /* retrieve source register value */
+ stswi r10,r5,4 /* store bytes to DEAR address */
+ b align_complete /* return */
+
+/* */
+/* Store Word Byte-Reversed Indexed */
+stwbrx:
+ lwbrx r10,r8,r7 /* retrieve src reg value byte reversed */
+ stswi r10,r5,4 /* move two bytes to DEAR address */
+ b align_complete /* return */
+
+/* */
+/* Store Word Conditional Indexed */
+stwcx:
+ rlwinm r10,r5,0,0,29 /* r10 = word aligned DEAR */
+ lwz r11,0(r10) /* save original value of store */
+ stwcx. r11,r0,r10 /* attempt store to address */
+ bne stwcx_moveon /* store failed, move on */
+ stw r11,0(r10) /* repair damage */
+ lwzx r9,r7,r8 /* get register value */
+ stswi r10,r5,4 /* store bytes to DEAR address */
+stwcx_moveon:
+ mfcr r11 /* get condition reg */
+ lwz r9,Open_cr(r1) /* get condition reg image */
+ rlwimi r9,r11,0,0,2 /* insert 3 CR bits into cr image */
+ lwz r11,Open_xer(r1) /* get XER reg */
+ rlwimi r9,r11,29,2,2 /* insert XER SO bit into cr image */
+ stw r9,Open_cr(r1) /* store cr image */
+ b align_complete /* return */
+
+/* */
+/* Data Cache Block Zero */
+dcbz:
+ rlwinm r5,r5,0,0,31-CACHE_SIZE_L2
+ /* get address to nearest Cache line */
+ addi r5,r5,-4 /* adjust by a word */
+ addi r10,r0,CACHE_SIZE/4 /* set counter value */
+ mtctr r10
+ addi r11,r0,0 /* r11 = 0 */
+dcbz_loop:
+ stwu r11,4(r5) /* store a word and update EA */
+ bdnz dcbz_loop
+ b align_complete /* return */
+
+align_complete:
+ /*-----------------------------------------------------------------------
+ * Restore regs and return from the interrupt
+ *----------------------------------------------------------------------*/
+ lmw r24,Open_xer+ALIGN_REGS(r0)
+ mtxer r24
+ mtlr r25
+ mtctr r26
+ mtcrf 0xFF, r27
+ mtspr srr2, r28 /* SRR 2 */
+ mtspr srr3, r29 /* SRR 3 */
+ mtspr srr0, r30 /* SRR 0 */
+ mtspr srr1, r31 /* SRR 1 */
+ lmw r1,Open_gpr1+ALIGN_REGS(r0)
+ lwz r0,Open_gpr0+ALIGN_REGS(r0)
+ rfi
diff --git a/c/src/lib/libcpu/powerpc/ppc403/vectors/vectors.s b/c/src/lib/libcpu/powerpc/ppc403/vectors/vectors.s
new file mode 100644
index 0000000000..45865c37ad
--- /dev/null
+++ b/c/src/lib/libcpu/powerpc/ppc403/vectors/vectors.s
@@ -0,0 +1,299 @@
+/* vectors.s 1.1 - 95/12/04
+ *
+ * This file contains the assembly code for the PowerPC 403
+ * interrupt veneers for RTEMS.
+ *
+ * Author: Andrew Bray <andy@i-cubed.co.uk>
+ *
+ * COPYRIGHT (c) 1995 by i-cubed ltd.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of i-cubed limited not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * i-cubed limited makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ */
+
+/*
+ * The issue with this file is getting it loaded at the right place.
+ * The first vector MUST be at address 0x????0100.
+ * How this is achieved is dependant on the tool chain.
+ *
+ * However the basic mechanism for ELF assemblers is to create a
+ * section called ".vectors", which will be loaded to an address
+ * between 0x????0000 and 0x????0100 (inclusive) via a link script.
+ *
+ * The basic mechanism for XCOFF assemblers is to place it in the
+ * normal text section, and arrange for this file to be located
+ * at an appropriate position on the linker command line.
+ *
+ * The variable 'PPC_VECTOR_FILE_BASE' must be defined to be the
+ * offset from 0x????0000 to the first location in the file. This
+ * will usually be 0x0000 or 0x0100.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+#ifndef PPC_VECTOR_FILE_BASE
+#error "PPC_VECTOR_FILE_BASE is not defined."
+#endif
+
+ /* Where this file will be loaded */
+ .set file_base, PPC_VECTOR_FILE_BASE
+
+ /* Offset to store reg 0 */
+
+ .set IP_LINK, 0
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+ .set IP_0, (IP_LINK + 56)
+#else
+ .set IP_0, (IP_LINK + 8)
+#endif
+ .set IP_2, (IP_0 + 4)
+
+ .set IP_3, (IP_2 + 4)
+ .set IP_4, (IP_3 + 4)
+ .set IP_5, (IP_4 + 4)
+ .set IP_6, (IP_5 + 4)
+
+ .set IP_7, (IP_6 + 4)
+ .set IP_8, (IP_7 + 4)
+ .set IP_9, (IP_8 + 4)
+ .set IP_10, (IP_9 + 4)
+
+ .set IP_11, (IP_10 + 4)
+ .set IP_12, (IP_11 + 4)
+ .set IP_13, (IP_12 + 4)
+ .set IP_28, (IP_13 + 4)
+
+ .set IP_29, (IP_28 + 4)
+ .set IP_30, (IP_29 + 4)
+ .set IP_31, (IP_30 + 4)
+ .set IP_CR, (IP_31 + 4)
+
+ .set IP_CTR, (IP_CR + 4)
+ .set IP_XER, (IP_CTR + 4)
+ .set IP_LR, (IP_XER + 4)
+ .set IP_PC, (IP_LR + 4)
+
+ .set IP_MSR, (IP_PC + 4)
+
+ .set IP_END, (IP_MSR + 16)
+
+ /* Vector offsets */
+ .set begin_vector,0x0000
+ .set crit_vector,0x0100
+ .set mach_vector,0x0200
+ .set prot_vector,0x0300
+ .set ext_vector,0x0500
+ .set align_vector,0x0600
+ .set prog_vector,0x0700
+ .set dec_vector,0x0900
+ .set sys_vector,0x0C00
+ .set pit_vector,0x1000
+ .set fit_vector,0x1010
+ .set wadt_vector,0x1020
+ .set debug_vector,0x2000
+
+/* Go to the right section */
+#if PPC_ASM == PPC_ASM_ELF
+ .section .vectors,"awx",@progbits
+#elif PPC_ASM == PPC_ASM_XCOFF
+ .csect .text[PR]
+#endif
+
+ PUBLIC_VAR (__vectors)
+SYM (__vectors):
+
+/* Critical error handling */
+ .org crit_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_CRIT
+ b PROC (_ISR_HandlerC)
+
+/* Machine check exception */
+ .org mach_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_MCHECK
+ b PROC (_ISR_HandlerC)
+
+/* Protection exception */
+ .org prot_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_PROTECT
+ b PROC (_ISR_Handler)
+
+/* External interrupt */
+ .org ext_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_EXTERNAL
+ b PROC (_ISR_Handler)
+
+/* Align exception */
+ .org align_vector - file_base
+ .extern align_h
+ b align_h
+
+/* Program exception */
+ .org prog_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_PROGRAM
+ b PROC (_ISR_Handler)
+
+/* Decrementer exception */
+ .org dec_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_PROGRAM
+ b PROC (_ISR_Handler)
+
+/* System call */
+ .org sys_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_SCALL
+ b PROC (_ISR_Handler)
+
+/* PIT interrupt */
+ .org pit_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_PIT
+ b PROC (_ISR_Handler)
+
+/* FIT interrupt */
+ .org fit_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_FIT
+ b PROC (_ISR_Handler)
+
+/* Watchdog interrupt */
+ .org wadt_vector - file_base
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_WATCHDOG
+ b PROC (_ISR_HandlerC)
+
+/* Debug exception */
+debug:
+#if (PPC_ABI == PPC_ABI_POWEROPEN || PPC_ABI == PPC_ABI_GCC27)
+#if (PPC_HAS_FPU)
+ stwu r1, -(20*4 + 18*8 + IP_END)(r1)
+#else
+ stwu r1, -(20*4 + IP_END)(r1)
+#endif
+#else
+ stwu r1, -(IP_END)(r1)
+#endif
+ stw r0, IP_0(r1)
+
+ li r0, PPC_IRQ_DEBUG
+ b PROC (_ISR_HandlerC)
+
+/* Debug exception */
+ .org debug_vector - file_base
+ b debug
diff --git a/c/src/lib/libcpu/sparc/Makefile.in b/c/src/lib/libcpu/sparc/Makefile.in
new file mode 100644
index 0000000000..20d5882104
--- /dev/null
+++ b/c/src/lib/libcpu/sparc/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=reg_win
diff --git a/c/src/lib/libcpu/sparc/include/erc32.h b/c/src/lib/libcpu/sparc/include/erc32.h
new file mode 100644
index 0000000000..d8d70e3e30
--- /dev/null
+++ b/c/src/lib/libcpu/sparc/include/erc32.h
@@ -0,0 +1,521 @@
+/* erc32.h
+ *
+ * This include file contains information pertaining to the ERC32.
+ * The ERC32 is a custom SPARC V7 implementation based on the Cypress
+ * 601/602 chipset. This CPU has a number of on-board peripherals and
+ * was developed by the European Space Agency to target space applications.
+ *
+ * NOTE: Other than where absolutely required, this version currently
+ * supports only the peripherals and bits used by the basic board
+ * support package. This includes at least significant pieces of
+ * the following items:
+ *
+ * + UART Channels A and B
+ * + General Purpose Timer
+ * + Real Time Clock
+ * + Watchdog Timer (so it can be disabled)
+ * + Control Register (so powerdown mode can be enabled)
+ * + Memory Control Register
+ * + Interrupt Control
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ERC32_h
+#define _INCLUDE_ERC32_h
+
+#include <rtems/score/sparc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Interrupt Sources
+ *
+ * The interrupt source numbers directly map to the trap type and to
+ * the bits used in the Interrupt Clear, Interrupt Force, Interrupt Mask,
+ * and the Interrupt Pending Registers.
+ */
+
+#define ERC32_INTERRUPT_MASKED_ERRORS 1
+#define ERC32_INTERRUPT_EXTERNAL_1 2
+#define ERC32_INTERRUPT_EXTERNAL_2 3
+#define ERC32_INTERRUPT_UART_A_RX_TX 4
+#define ERC32_INTERRUPT_UART_B_RX_TX 5
+#define ERC32_INTERRUPT_CORRECTABLE_MEMORY_ERROR 6
+#define ERC32_INTERRUPT_UART_ERROR 7
+#define ERC32_INTERRUPT_DMA_ACCESS_ERROR 8
+#define ERC32_INTERRUPT_DMA_TIMEOUT 9
+#define ERC32_INTERRUPT_EXTERNAL_3 10
+#define ERC32_INTERRUPT_EXTERNAL_4 11
+#define ERC32_INTERRUPT_GENERAL_PURPOSE_TIMER 12
+#define ERC32_INTERRUPT_REAL_TIME_CLOCK 13
+#define ERC32_INTERRUPT_EXTERNAL_5 14
+#define ERC32_INTERRUPT_WATCHDOG_TIMEOUT 15
+
+#ifndef ASM
+
+/*
+ * Trap Types for on-chip peripherals
+ *
+ * Source: Table 8 - Interrupt Trap Type and Default Priority Assignments
+ *
+ * NOTE: The priority level for each source corresponds to the least
+ * significant nibble of the trap type.
+ */
+
+#define ERC32_TRAP_TYPE( _source ) SPARC_ASYNCHRONOUS_TRAP((_source) + 0x10)
+
+#define ERC32_TRAP_SOURCE( _trap ) ((_trap) - 0x10)
+
+#define ERC32_Is_MEC_Trap( _trap ) \
+ ( (_trap) >= ERC32_TRAP_TYPE( ERC32_INTERRUPT_MASKED_ERRORS ) && \
+ (_trap) <= ERC32_TRAP_TYPE( ERC32_INTERRUPT_WATCHDOG_TIMEOUT ) )
+
+/*
+ * Structure for ERC32 memory mapped registers.
+ *
+ * Source: Section 3.25.2 - Register Address Map
+ *
+ * NOTE: There is only one of these structures per CPU, its base address
+ * is 0x01f80000, and the variable MEC is placed there by the
+ * linkcmds file.
+ */
+
+typedef struct {
+ volatile unsigned32 Control; /* offset 0x00 */
+ volatile unsigned32 Software_Reset; /* offset 0x04 */
+ volatile unsigned32 Power_Down; /* offset 0x08 */
+ volatile unsigned32 Unimplemented_0; /* offset 0x0c */
+ volatile unsigned32 Memory_Configuration; /* offset 0x10 */
+ volatile unsigned32 IO_Configuration; /* offset 0x14 */
+ volatile unsigned32 Wait_State_Configuration; /* offset 0x18 */
+ volatile unsigned32 Unimplemented_1; /* offset 0x1c */
+ volatile unsigned32 Memory_Access_0; /* offset 0x20 */
+ volatile unsigned32 Memory_Access_1; /* offset 0x24 */
+ volatile unsigned32 Unimplemented_2[ 7 ]; /* offset 0x28 */
+ volatile unsigned32 Interrupt_Shape; /* offset 0x44 */
+ volatile unsigned32 Interrupt_Pending; /* offset 0x48 */
+ volatile unsigned32 Interrupt_Mask; /* offset 0x4c */
+ volatile unsigned32 Interrupt_Clear; /* offset 0x50 */
+ volatile unsigned32 Interrupt_Force; /* offset 0x54 */
+ volatile unsigned32 Unimplemented_3[ 2 ]; /* offset 0x58 */
+ /* offset 0x60 */
+ volatile unsigned32 Watchdog_Program_and_Timeout_Acknowledge;
+ volatile unsigned32 Watchdog_Trap_Door_Set; /* offset 0x64 */
+ volatile unsigned32 Unimplemented_4[ 6 ]; /* offset 0x68 */
+ volatile unsigned32 Real_Time_Clock_Counter; /* offset 0x80 */
+ volatile unsigned32 Real_Time_Clock_Scalar; /* offset 0x84 */
+ volatile unsigned32 General_Purpose_Timer_Counter; /* offset 0x88 */
+ volatile unsigned32 General_Purpose_Timer_Scalar; /* offset 0x8c */
+ volatile unsigned32 Unimplemented_5[ 2 ]; /* offset 0x90 */
+ volatile unsigned32 Timer_Control; /* offset 0x98 */
+ volatile unsigned32 Unimplemented_6; /* offset 0x9c */
+ volatile unsigned32 System_Fault_Status; /* offset 0xa0 */
+ volatile unsigned32 First_Failing_Address; /* offset 0xa4 */
+ volatile unsigned32 First_Failing_Data; /* offset 0xa8 */
+ volatile unsigned32 First_Failing_Syndrome_and_Check_Bits;/* offset 0xac */
+ volatile unsigned32 Error_and_Reset_Status; /* offset 0xb0 */
+ volatile unsigned32 Error_Mask; /* offset 0xb4 */
+ volatile unsigned32 Unimplemented_7[ 2 ]; /* offset 0xb8 */
+ volatile unsigned32 Debug_Control; /* offset 0xc0 */
+ volatile unsigned32 Breakpoint; /* offset 0xc4 */
+ volatile unsigned32 Watchpoint; /* offset 0xc8 */
+ volatile unsigned32 Unimplemented_8; /* offset 0xcc */
+ volatile unsigned32 Test_Control; /* offset 0xd0 */
+ volatile unsigned32 Test_Data; /* offset 0xd4 */
+ volatile unsigned32 Unimplemented_9[ 2 ]; /* offset 0xd8 */
+ volatile unsigned32 UART_Channel_A; /* offset 0xe0 */
+ volatile unsigned32 UART_Channel_B; /* offset 0xe4 */
+ volatile unsigned32 UART_Status; /* offset 0xe8 */
+} ERC32_Register_Map;
+
+#endif
+
+/*
+ * The following constants are intended to be used ONLY in assembly
+ * language files.
+ *
+ * NOTE: The intended style of usage is to load the address of MEC
+ * into a register and then use these as displacements from
+ * that register.
+ */
+
+#ifdef ASM
+
+#define ERC32_MEC_CONTROL_OFFSET 0x00
+#define ERC32_MEC_SOFTWARE_RESET_OFFSET 0x04
+#define ERC32_MEC_POWER_DOWN_OFFSET 0x08
+#define ERC32_MEC_UNIMPLEMENTED_0_OFFSET 0x0C
+#define ERC32_MEC_MEMORY_CONFIGURATION_OFFSET 0x10
+#define ERC32_MEC_IO_CONFIGURATION_OFFSET 0x14
+#define ERC32_MEC_WAIT_STATE_CONFIGURATION_OFFSET 0x18
+#define ERC32_MEC_UNIMPLEMENTED_1_OFFSET 0x1C
+#define ERC32_MEC_MEMORY_ACCESS_0_OFFSET 0x20
+#define ERC32_MEC_MEMORY_ACCESS_1_OFFSET 0x24
+#define ERC32_MEC_UNIMPLEMENTED_2_OFFSET 0x28
+#define ERC32_MEC_INTERRUPT_SHAPE_OFFSET 0x44
+#define ERC32_MEC_INTERRUPT_PENDING_OFFSET 0x48
+#define ERC32_MEC_INTERRUPT_MASK_OFFSET 0x4C
+#define ERC32_MEC_INTERRUPT_CLEAR_OFFSET 0x50
+#define ERC32_MEC_INTERRUPT_FORCE_OFFSET 0x54
+#define ERC32_MEC_UNIMPLEMENTED_3_OFFSET 0x58
+#define ERC32_MEC_WATCHDOG_PROGRAM_AND_TIMEOUT_ACKNOWLEDGE_OFFSET 0x60
+#define ERC32_MEC_WATCHDOG_TRAP_DOOR_SET_OFFSET 0x64
+#define ERC32_MEC_UNIMPLEMENTED_4_OFFSET 0x6C
+#define ERC32_MEC_REAL_TIME_CLOCK_COUNTER_OFFSET 0x80
+#define ERC32_MEC_REAL_TIME_CLOCK_SCALAR_OFFSET 0x84
+#define ERC32_MEC_GENERAL_PURPOSE_TIMER_COUNTER_OFFSET 0x88
+#define ERC32_MEC_GENERAL_PURPOSE_TIMER_SCALAR_OFFSET 0x8C
+#define ERC32_MEC_UNIMPLEMENTED_5_OFFSET 0x90
+#define ERC32_MEC_TIMER_CONTROL_OFFSET 0x98
+#define ERC32_MEC_UNIMPLEMENTED_6_OFFSET 0x9C
+#define ERC32_MEC_SYSTEM_FAULT_STATUS_OFFSET 0xA0
+#define ERC32_MEC_FIRST_FAILING_ADDRESS_OFFSET 0xA4
+#define ERC32_MEC_FIRST_FAILING_DATA_OFFSET 0xA8
+#define ERC32_MEC_FIRST_FAILING_SYNDROME_AND_CHECK_BITS_OFFSET 0xAC
+#define ERC32_MEC_ERROR_AND_RESET_STATUS_OFFSET 0xB0
+#define ERC32_MEC_ERROR_MASK_OFFSET 0xB4
+#define ERC32_MEC_UNIMPLEMENTED_7_OFFSET 0xB8
+#define ERC32_MEC_DEBUG_CONTROL_OFFSET 0xC0
+#define ERC32_MEC_BREAKPOINT_OFFSET 0xC4
+#define ERC32_MEC_WATCHPOINT_OFFSET 0xC8
+#define ERC32_MEC_UNIMPLEMENTED_8_OFFSET 0xCC
+#define ERC32_MEC_TEST_CONTROL_OFFSET 0xD0
+#define ERC32_MEC_TEST_DATA_OFFSET 0xD4
+#define ERC32_MEC_UNIMPLEMENTED_9_OFFSET 0xD8
+#define ERC32_MEC_UART_CHANNEL_A_OFFSET 0xE0
+#define ERC32_MEC_UART_CHANNEL_B_OFFSET 0xE4
+#define ERC32_MEC_UART_STATUS_OFFSET 0xE8
+
+#endif
+
+/*
+ * The following defines the bits in the Configuration Register.
+ */
+
+#define ERC32_CONFIGURATION_POWER_DOWN_MASK 0x00000001
+#define ERC32_CONFIGURATION_POWER_DOWN_ALLOWED 0x00000001
+#define ERC32_CONFIGURATION_POWER_DOWN_DISABLED 0x00000000
+
+#define ERC32_CONFIGURATION_SOFTWARE_RESET_MASK 0x00000002
+#define ERC32_CONFIGURATION_SOFTWARE_RESET_ALLOWED 0x00000002
+#define ERC32_CONFIGURATION_SOFTWARE_RESET_DISABLED 0x00000000
+
+#define ERC32_CONFIGURATION_BUS_TIMEOUT_MASK 0x00000004
+#define ERC32_CONFIGURATION_BUS_TIMEOUT_ENABLED 0x00000004
+#define ERC32_CONFIGURATION_BUS_TIMEOUT_DISABLED 0x00000000
+
+#define ERC32_CONFIGURATION_ACCESS_PROTECTION_MASK 0x00000008
+#define ERC32_CONFIGURATION_ACCESS_PROTECTION_ENABLED 0x00000008
+#define ERC32_CONFIGURATION_ACCESS_PROTECTION_DISABLED 0x00000000
+
+
+/*
+ * The following defines the bits in the Memory Configuration Register.
+ */
+
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_MASK 0x00001C00
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_256K ( 0 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_512K ( 1 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_1MB ( 2 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_2MB ( 3 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_4MB ( 4 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_8MB ( 5 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_16MB ( 6 << 10 )
+#define ERC32_MEMORY_CONFIGURATION_RAM_SIZE_32MB ( 7 << 10 )
+
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_MASK 0x001C0000
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_128K ( 0 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_256K ( 1 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_512K ( 2 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_1M ( 3 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_2M ( 4 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_4M ( 5 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_8M ( 6 << 18 )
+#define ERC32_MEMORY_CONFIGURATION_PROM_SIZE_16M ( 7 << 18 )
+
+/*
+ * The following defines the bits in the Timer Control Register.
+ */
+
+#define ERC32_MEC_TIMER_CONTROL_GCR 0x00000001 /* 1 = reload at 0 */
+ /* 0 = stop at 0 */
+#define ERC32_MEC_TIMER_CONTROL_GCL 0x00000002 /* 1 = load and start */
+ /* 0 = no function */
+#define ERC32_MEC_TIMER_CONTROL_GSE 0x00000004 /* 1 = enable counting */
+ /* 0 = hold scalar and counter */
+#define ERC32_MEC_TIMER_CONTROL_GSL 0x00000008 /* 1 = load scalar and start */
+ /* 0 = no function */
+
+#define ERC32_MEC_TIMER_CONTROL_RTCCR 0x00000100 /* 1 = reload at 0 */
+ /* 0 = stop at 0 */
+#define ERC32_MEC_TIMER_CONTROL_RTCCL 0x00000200 /* 1 = load and start */
+ /* 0 = no function */
+#define ERC32_MEC_TIMER_CONTROL_RTCSE 0x00000400 /* 1 = enable counting */
+ /* 0 = hold scalar and counter */
+#define ERC32_MEC_TIMER_CONTROL_RTCSL 0x00000800 /* 1 = load scalar and start */
+ /* 0 = no function */
+
+/*
+ * The following defines the bits in the UART Control Registers.
+ *
+ */
+
+#define ERC32_MEC_UART_CONTROL_RTD 0x000000FF /* RX/TX data */
+
+/*
+ * The following defines the bits in the MEC UART Control Registers.
+ */
+
+#define ERC32_MEC_UART_STATUS_DR 0x00000001 /* Data Ready */
+#define ERC32_MEC_UART_STATUS_TSE 0x00000002 /* TX Send Register Empty */
+#define ERC32_MEC_UART_STATUS_THE 0x00000004 /* TX Hold Register Empty */
+#define ERC32_MEC_UART_STATUS_FE 0x00000010 /* RX Framing Error */
+#define ERC32_MEC_UART_STATUS_PE 0x00000020 /* RX Parity Error */
+#define ERC32_MEC_UART_STATUS_OE 0x00000040 /* RX Overrun Error */
+#define ERC32_MEC_UART_STATUS_CU 0x00000080 /* Clear Errors */
+#define ERC32_MEC_UART_STATUS_TXE 0x00000006 /* TX Empty */
+#define ERC32_MEC_UART_STATUS_CLRA 0x00000080 /* Clear UART A */
+#define ERC32_MEC_UART_STATUS_CLRB 0x00800000 /* Clear UART B */
+#define ERC32_MEC_UART_STATUS_ERRA 0x00000070 /* Error in UART A */
+#define ERC32_MEC_UART_STATUS_ERRB 0x00700000 /* Error in UART B */
+
+#define ERC32_MEC_UART_STATUS_DRA (ERC32_MEC_UART_STATUS_DR << 0)
+#define ERC32_MEC_UART_STATUS_TSEA (ERC32_MEC_UART_STATUS_TSE << 0)
+#define ERC32_MEC_UART_STATUS_THEA (ERC32_MEC_UART_STATUS_THE << 0)
+#define ERC32_MEC_UART_STATUS_FEA (ERC32_MEC_UART_STATUS_FE << 0)
+#define ERC32_MEC_UART_STATUS_PEA (ERC32_MEC_UART_STATUS_PE << 0)
+#define ERC32_MEC_UART_STATUS_OEA (ERC32_MEC_UART_STATUS_OE << 0)
+#define ERC32_MEC_UART_STATUS_CUA (ERC32_MEC_UART_STATUS_CU << 0)
+#define ERC32_MEC_UART_STATUS_TXEA (ERC32_MEC_UART_STATUS_TXE << 0)
+
+#define ERC32_MEC_UART_STATUS_DRB (ERC32_MEC_UART_STATUS_DR << 16)
+#define ERC32_MEC_UART_STATUS_TSEB (ERC32_MEC_UART_STATUS_TSE << 16)
+#define ERC32_MEC_UART_STATUS_THEB (ERC32_MEC_UART_STATUS_THE << 16)
+#define ERC32_MEC_UART_STATUS_FEB (ERC32_MEC_UART_STATUS_FE << 16)
+#define ERC32_MEC_UART_STATUS_PEB (ERC32_MEC_UART_STATUS_PE << 16)
+#define ERC32_MEC_UART_STATUS_OEB (ERC32_MEC_UART_STATUS_OE << 16)
+#define ERC32_MEC_UART_STATUS_CUB (ERC32_MEC_UART_STATUS_CU << 16)
+#define ERC32_MEC_UART_STATUS_TXEB (ERC32_MEC_UART_STATUS_TXE << 16)
+
+#ifndef ASM
+
+/*
+ * This is used to manipulate the on-chip registers.
+ *
+ * The following symbol must be defined in the linkcmds file and point
+ * to the correct location.
+ */
+
+extern ERC32_Register_Map ERC32_MEC;
+
+/*
+ * Macros to manipulate the Interrupt Clear, Interrupt Force, Interrupt Mask,
+ * and the Interrupt Pending Registers.
+ *
+ * NOTE: For operations which are not atomic, this code disables interrupts
+ * to guarantee there are no intervening accesses to the same register.
+ * The operations which read the register, modify the value and then
+ * store the result back are vulnerable.
+ */
+
+#define ERC32_Clear_interrupt( _source ) \
+ do { \
+ ERC32_MEC.Interrupt_Clear = (1 << (_source)); \
+ } while (0)
+
+#define ERC32_Force_interrupt( _source ) \
+ do { \
+ unsigned32 _level; \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Test_Control = ERC32_MEC.Test_Control | 0x80000; \
+ ERC32_MEC.Interrupt_Force = (1 << (_source)); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+#define ERC32_Is_interrupt_pending( _source ) \
+ (ERC32_MEC.Interrupt_Pending & (1 << (_source)))
+
+#define ERC32_Is_interrupt_masked( _source ) \
+ (ERC32_MEC.Interrupt_Masked & (1 << (_source)))
+
+#define ERC32_Mask_interrupt( _source ) \
+ do { \
+ unsigned32 _level; \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Interrupt_Mask |= (1 << (_source)); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+#define ERC32_Unmask_interrupt( _source ) \
+ do { \
+ unsigned32 _level; \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Interrupt_Mask &= ~(1 << (_source)); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+#define ERC32_Disable_interrupt( _source, _previous ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _mask = 1 << (_source); \
+ \
+ sparc_disable_interrupts( _level ); \
+ (_previous) = ERC32_MEC.Interrupt_Mask; \
+ ERC32_MEC.Interrupt_Mask = _previous | _mask; \
+ sparc_enable_interrupts( _level ); \
+ (_previous) &= ~_mask; \
+ } while (0)
+
+#define ERC32_Restore_interrupt( _source, _previous ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _mask = 1 << (_source); \
+ \
+ sparc_disable_interrupts( _level ); \
+ ERC32_MEC.Interrupt_Mask = \
+ (ERC32_MEC.Interrupt_Mask & ~_mask) | (_previous); \
+ sparc_enable_interrupts( _level ); \
+ } while (0)
+
+/*
+ * The following macros attempt to hide the fact that the General Purpose
+ * Timer and Real Time Clock Timer share the Timer Control Register. Because
+ * the Timer Control Register is write only, we must mirror it in software
+ * and insure that writes to one timer do not alter the current settings
+ * and status of the other timer.
+ *
+ * This code promotes the view that the two timers are completely independent.
+ * By exclusively using the routines below to access the Timer Control
+ * Register, the application can view the system as having a General Purpose
+ * Timer Control Register and a Real Time Clock Timer Control Register
+ * rather than the single shared value.
+ *
+ * Each logical timer control register is organized as follows:
+ *
+ * D0 - Counter Reload
+ * 1 = reload counter at zero and restart
+ * 0 = stop counter at zero
+ *
+ * D1 - Counter Load
+ * 1 = load counter with preset value and restart
+ * 0 = no function
+ *
+ * D2 - Enable
+ * 1 = enable counting
+ * 0 = hold scaler and counter
+ *
+ * D3 - Scaler Load
+ * 1 = load scalar with preset value and restart
+ * 0 = no function
+ *
+ * To insure the management of the mirror is atomic, we disable interrupts
+ * around updates.
+ */
+
+#define ERC32_MEC_TIMER_COUNTER_RELOAD_AT_ZERO 0x00000001
+#define ERC32_MEC_TIMER_COUNTER_STOP_AT_ZERO 0x00000000
+
+#define ERC32_MEC_TIMER_COUNTER_LOAD_COUNTER 0x00000002
+
+#define ERC32_MEC_TIMER_COUNTER_ENABLE_COUNTING 0x00000004
+#define ERC32_MEC_TIMER_COUNTER_DISABLE_COUNTING 0x00000000
+
+#define ERC32_MEC_TIMER_COUNTER_LOAD_SCALER 0x00000008
+
+#define ERC32_MEC_TIMER_COUNTER_RELOAD_MASK 0x00000001
+#define ERC32_MEC_TIMER_COUNTER_ENABLE_MASK 0x00000004
+
+#define ERC32_MEC_TIMER_COUNTER_DEFINED_MASK 0x0000000F
+#define ERC32_MEC_TIMER_COUNTER_CURRENT_MODE_MASK 0x00000005
+
+extern unsigned32 _ERC32_MEC_Timer_Control_Mirror;
+
+/*
+ * This macros manipulate the General Purpose Timer portion of the
+ * Timer Control register and promote the view that there are actually
+ * two independent Timer Control Registers.
+ */
+
+#define ERC32_MEC_Set_General_Purpose_Timer_Control( _value ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _control; \
+ unsigned32 __value; \
+ \
+ __value = ((_value) & 0x0f); \
+ sparc_disable_interrupts( _level ); \
+ _control = _ERC32_MEC_Timer_Control_Mirror; \
+ _control &= ERC32_MEC_TIMER_COUNTER_DEFINED_MASK << 8; \
+ _ERC32_MEC_Timer_Control_Mirror = _control | _value; \
+ _control &= (ERC32_MEC_TIMER_COUNTER_CURRENT_MODE_MASK << 8); \
+ _control |= __value; \
+ /* printf( "GPT 0x%x 0x%x 0x%x\n", _value, __value, _control ); */ \
+ ERC32_MEC.Timer_Control = _control; \
+ sparc_enable_interrupts( _level ); \
+ } while ( 0 )
+
+#define ERC32_MEC_Get_General_Purpose_Timer_Control( _value ) \
+ do { \
+ (_value) = _ERC32_MEC_Timer_Control_Mirror & 0xf; \
+ } while ( 0 )
+
+/*
+ * This macros manipulate the Real Timer Clock Timer portion of the
+ * Timer Control register and promote the view that there are actually
+ * two independent Timer Control Registers.
+ */
+
+#define ERC32_MEC_Set_Real_Time_Clock_Timer_Control( _value ) \
+ do { \
+ unsigned32 _level; \
+ unsigned32 _control; \
+ unsigned32 __value; \
+ \
+ __value = ((_value) & 0x0f) << 8; \
+ sparc_disable_interrupts( _level ); \
+ _control = _ERC32_MEC_Timer_Control_Mirror; \
+ _control &= ERC32_MEC_TIMER_COUNTER_DEFINED_MASK; \
+ _ERC32_MEC_Timer_Control_Mirror = _control | __value; \
+ _control &= ERC32_MEC_TIMER_COUNTER_CURRENT_MODE_MASK; \
+ _control |= __value; \
+ /* printf( "RTC 0x%x 0x%x 0x%x\n", _value, __value, _control ); */ \
+ ERC32_MEC.Timer_Control = _control; \
+ sparc_enable_interrupts( _level ); \
+ } while ( 0 )
+
+#define ERC32_MEC_Get_Real_Time_Clock_Timer_Control( _value ) \
+ do { \
+ (_value) = (_ERC32_MEC_Timer_Control_Mirror >> 8) & 0xf; \
+ } while ( 0 )
+
+
+#endif /* !ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_INCLUDE_ERC32_h */
+/* end of include file */
+
diff --git a/c/src/lib/libcpu/sparc/reg_win/Makefile.in b/c/src/lib/libcpu/sparc/reg_win/Makefile.in
new file mode 100644
index 0000000000..1af0b25c59
--- /dev/null
+++ b/c/src/lib/libcpu/sparc/reg_win/Makefile.in
@@ -0,0 +1,59 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/reg_win.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=window
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+
+# the .rel file built here will be put into libbsp.a by
+# libbsp/sparc/BSP/wrapup/Makefile
+install: all
diff --git a/c/src/lib/libcpu/sparc/reg_win/window.s b/c/src/lib/libcpu/sparc/reg_win/window.s
new file mode 100644
index 0000000000..c21e73ebb4
--- /dev/null
+++ b/c/src/lib/libcpu/sparc/reg_win/window.s
@@ -0,0 +1,257 @@
+/*
+ * window.s
+ *
+ * This file contains the register window management routines for the
+ * SPARC architecture. Trap handlers for the following capabilities
+ * are included in this file:
+ *
+ * + Window Overflow
+ * + Window Underflow
+ * + Flushing All Windows
+ *
+ * COPYRIGHT:
+ *
+ * This file includes the window overflow and underflow handlers from
+ * the file srt0.s provided with the binary distribution of the SPARC
+ * Instruction Simulator (SIS) found at
+ * ftp://ftp.estec.esa.nl/pub/ws/wsd/erc32.
+ *
+ * COPYRIGHT (c) 1995. European Space Agency.
+ *
+ * This terms of the RTEMS license apply to this file.
+ *
+ * $Id$
+ */
+
+#include <asm.h>
+
+ .seg "text"
+ /*
+ * Window overflow trap handler.
+ *
+ * On entry:
+ *
+ * l0 = psr (from trap table)
+ * l1 = pc
+ * l2 = npc
+ */
+
+ PUBLIC(window_overflow_trap_handler)
+
+SYM(window_overflow_trap_handler):
+
+ /*
+ * Calculate new WIM by "rotating" the valid bits in the WIM right
+ * by one position. The following shows how the bits move for a SPARC
+ * cpu implementation where SPARC_NUMBER_OF_REGISTER_WINDOWS is 8.
+ *
+ * OLD WIM = 76543210
+ * NEW WIM = 07654321
+ *
+ * NOTE: New WIM must be stored in a global register since the
+ * "save" instruction just prior to the load of the wim
+ * register will result in the local register set changing.
+ */
+
+ mov %wim, %l3 ! l3 = WIM
+ mov %g1, %l7 ! save g1
+ srl %l3, 1, %g1 ! g1 = WIM >> 1
+ sll %l3, SPARC_NUMBER_OF_REGISTER_WINDOWS-1 , %l4
+ ! l4 = WIM << (Number Windows - 1)
+ or %l4, %g1, %g1 ! g1 = (WIM >> 1) |
+ ! (WIM << (Number Windows - 1))
+
+ save ! Get into window to be saved.
+ mov %g1, %wim ! load new WIM
+ nop; nop; nop ! 3 slot delay
+ std %l0, [%sp + 0x00] ! save local register set
+ std %l2, [%sp + 0x08]
+ std %l4, [%sp + 0x10]
+ std %l6, [%sp + 0x18]
+ std %i0, [%sp + 0x20] ! save input register set
+ std %i2, [%sp + 0x28]
+ std %i4, [%sp + 0x30]
+ std %i6, [%sp + 0x38]
+ restore ! Go back to trap window.
+ mov %l7, %g1 ! restore g1
+ jmp %l1 ! Re-execute save.
+ rett %l2
+
+ /*
+ * Window underflow trap handler.
+ *
+ * On entry:
+ *
+ * l0 = psr (from trap table)
+ * l1 = pc
+ * l2 = npc
+ */
+
+ PUBLIC(window_underflow_trap_handler)
+
+SYM(window_underflow_trap_handler):
+
+ /*
+ * Calculate new WIM by "rotating" the valid bits in the WIM left
+ * by one position. The following shows how the bits move for a SPARC
+ * cpu implementation where SPARC_NUMBER_OF_REGISTER_WINDOWS is 8.
+ *
+ * OLD WIM = 76543210
+ * NEW WIM = 07654321
+ *
+ * NOTE: New WIM must be stored in a global register since the
+ * "save" instruction just prior to the load of the wim
+ * register will result in the local register set changing.
+ */
+
+ mov %wim, %l3 ! Calculate new WIM
+ sll %l3, 1, %l4 ! l4 = WIM << 1
+ srl %l3, SPARC_NUMBER_OF_REGISTER_WINDOWS-1, %l5
+ ! l5 = WIM >> (Number Windows-1)
+ or %l5, %l4, %l5 ! l5 = (WIM << 1) |
+ ! (WIM >> (Number Windows-1))
+ mov %l5, %wim ! load the new WIM
+ nop; nop; nop
+ restore ! Two restores to get into the
+ restore ! window to restore
+ ldd [%sp + 0x00], %l0 ! First the local register set
+ ldd [%sp + 0x08], %l2
+ ldd [%sp + 0x10], %l4
+ ldd [%sp + 0x18], %l6
+ ldd [%sp + 0x20], %i0 ! Then the input registers
+ ldd [%sp + 0x28], %i2
+ ldd [%sp + 0x30], %i4
+ ldd [%sp + 0x38], %i6
+ save ! Get back to the trap window.
+ save
+ jmp %l1 ! Re-execute restore.
+ rett %l2
+
+ /*
+ * Flush All Windows trap handler.
+ *
+ * Flush all windows with valid contents except the current one
+ * and the one we will be returning to.
+ *
+ * In examining the set register windows, one may logically divide
+ * the windows into sets (some of which may be empty) based on their
+ * current status:
+ *
+ * + current (i.e. in use),
+ * + used (i.e. a restore would not trap)
+ * + invalid (i.e. 1 in corresponding bit in WIM)
+ * + unused
+ *
+ * Either the used or unused set of windows may be empty.
+ *
+ * NOTE: We assume only one bit is set in the WIM at a time.
+ *
+ * Given a CWP of 5 and a WIM of 0x1, the registers are divided
+ * into sets as follows:
+ *
+ * + 0 - invalid
+ * + 1-4 - unused
+ * + 5 - current
+ * + 6-7 - used
+ *
+ * In this case, we only would save the used windows which we
+ * will not be returning to -- 6.
+ *
+ * Register Usage while saving the windows:
+ * g1 = current PSR
+ * g2 = current wim
+ * g3 = CWP
+ * g4 = wim scratch
+ * g5 = scratch
+ *
+ * On entry:
+ *
+ * l0 = psr (from trap table)
+ * l1 = pc
+ * l2 = npc
+ */
+
+ PUBLIC(window_flush_trap_handler)
+
+SYM(window_flush_trap_handler):
+ /*
+ * Save the global registers we will be using
+ */
+
+ mov %g1, %l3
+ mov %g2, %l4
+ mov %g3, %l5
+ mov %g4, %l6
+ mov %g5, %l7
+
+ mov %l0, %g1 ! g1 = psr
+ mov %wim, %g2 ! g2 = wim
+ and %l0, SPARC_PSR_CWP_MASK, %g3 ! g3 = CWP
+
+ add %g3, 1, %g5 ! g5 = CWP + 1
+ and %g5, SPARC_NUMBER_OF_REGISTER_WINDOWS - 1, %g5
+
+ mov 1, %g4
+ sll %g4, %g5, %g4 ! g4 = WIM mask for CWP+1 invalid
+
+ restore ! go back one register window
+
+save_frame_loop:
+ sll %g4, 1, %g5 ! rotate the "wim" left 1
+ srl %g4, SPARC_NUMBER_OF_REGISTER_WINDOWS - 1, %g4
+ or %g4, %g5, %g4 ! g4 = wim if we do one restore
+
+ /*
+ * If a restore would not underflow, then continue.
+ */
+
+ andcc %g4, %g2, %g0 ! Any windows to flush?
+ bnz done_flushing ! No, then continue
+ nop
+
+ restore ! back one window
+
+ /*
+ * Now save the window just as if we overflowed to it.
+ */
+
+ std %l0, [%sp + CPU_STACK_FRAME_L0_OFFSET]
+ std %l2, [%sp + CPU_STACK_FRAME_L2_OFFSET]
+ std %l4, [%sp + CPU_STACK_FRAME_L4_OFFSET]
+ std %l6, [%sp + CPU_STACK_FRAME_L6_OFFSET]
+
+ std %i0, [%sp + CPU_STACK_FRAME_I0_OFFSET]
+ std %i2, [%sp + CPU_STACK_FRAME_I2_OFFSET]
+ std %i4, [%sp + CPU_STACK_FRAME_I4_OFFSET]
+ std %i6, [%sp + CPU_STACK_FRAME_I6_FP_OFFSET]
+
+ ba save_frame_loop
+ nop
+
+done_flushing:
+
+ add %g3, 2, %g3 ! calculate desired WIM
+ and %g3, SPARC_NUMBER_OF_REGISTER_WINDOWS - 1, %g3
+ mov 1, %g4
+ sll %g4, %g3, %g4 ! g4 = new WIM
+ mov %g4, %wim
+
+ mov %g1, %psr ! restore PSR
+ nop
+ nop
+ nop
+
+ /*
+ * Restore the global registers we used
+ */
+
+ mov %l3, %g1
+ mov %l4, %g2
+ mov %l5, %g3
+ mov %l6, %g4
+ mov %l7, %g5
+
+ jmpl %l2, %g0
+ rett %l2 + 4
+
+/* end of file */
diff --git a/c/src/lib/libmisc/Makefile.in b/c/src/lib/libmisc/Makefile.in
new file mode 100644
index 0000000000..20974965bd
--- /dev/null
+++ b/c/src/lib/libmisc/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=assoc error stackchk monitor cpuuse rtmonuse wrapup
diff --git a/c/src/lib/libmisc/README b/c/src/lib/libmisc/README
new file mode 100644
index 0000000000..6825898121
--- /dev/null
+++ b/c/src/lib/libmisc/README
@@ -0,0 +1,16 @@
+#
+# $Id$
+#
+
+This directory contains for the "miscellaneous" library. Currently
+the only item in this library is a user extension set which checks
+for a task "blowing" it's stack.
+
+The following ideas have been mentioned for items which could go
+in this library, but this list is not all inclusive:
+
+ + Workspace Consistency Checker
+ + Task Execution Time Monitor
+
+The intent of this library is to provide a home for useful utility routines
+which are dependent upon RTEMS.
diff --git a/c/src/lib/libmisc/assoc/Makefile.in b/c/src/lib/libmisc/assoc/Makefile.in
new file mode 100644
index 0000000000..c7189808b5
--- /dev/null
+++ b/c/src/lib/libmisc/assoc/Makefile.in
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libassoc-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=assoc
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/assoc.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/lib/libmisc/assoc/assoc.c b/c/src/lib/libmisc/assoc/assoc.c
new file mode 100644
index 0000000000..74387a8c5b
--- /dev/null
+++ b/c/src/lib/libmisc/assoc/assoc.c
@@ -0,0 +1,260 @@
+/*
+ * assoc.c
+ * rtems assoc routines
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "assoc.h"
+
+#include <stdio.h> /* sprintf */
+#include <string.h> /* strcat, strcmp */
+
+#define STREQ(a,b) (strcmp((a), (b)) == 0)
+#define rtems_assoc_is_default(ap) ((ap)->name && STREQ(ap->name, RTEMS_ASSOC_DEFAULT_NAME))
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (strcmp(ap->name, name) == 0)
+ return ap;
+
+ return default_ap;
+}
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->local_value == local_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->remote_value == remote_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+/*
+ * Get values
+ */
+
+unsigned32
+rtems_assoc_remote_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_remote_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+/*
+ * what to return if a value is not found
+ * this is not reentrant, but it really shouldn't be invoked anyway
+ */
+
+const char *
+rtems_assoc_name_bad(
+ unsigned32 bad_value
+)
+{
+#ifdef RTEMS_DEBUG
+ static char bad_buffer[32];
+
+ sprintf(bad_buffer, "< %d [0x%x] >", bad_value, bad_value);
+#else
+ static char bad_buffer[32] = "<assoc.c: BAD NAME>";
+#endif
+ return bad_buffer;
+}
+
+
+const char *
+rtems_assoc_name_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(local_value);
+}
+
+const char *
+rtems_assoc_name_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(remote_value);
+}
+
+/*
+ * Bitfield functions assume just 1 bit set in each of remote and local
+ * entries; they do not check for this.
+ */
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ unsigned32 b;
+ unsigned32 remote_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & local_value)
+ remote_value |= rtems_assoc_remote_by_local(ap, b);
+
+ return remote_value;
+}
+
+
+unsigned32 rtems_assoc_local_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ unsigned32 b;
+ unsigned32 local_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & remote_value)
+ local_value |= rtems_assoc_local_by_remote(ap, b);
+
+ return local_value;
+}
+
+char *
+rtems_assoc_name_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_remote(ap, b));
+ }
+
+ return buffer;
+}
+
+char *
+rtems_assoc_name_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_local(ap, b));
+ }
+
+ return buffer;
+}
diff --git a/c/src/lib/libmisc/assoc/assoc.h b/c/src/lib/libmisc/assoc/assoc.h
new file mode 100644
index 0000000000..1982d654ac
--- /dev/null
+++ b/c/src/lib/libmisc/assoc/assoc.h
@@ -0,0 +1,42 @@
+/*
+ *
+ * Rtems associativity routines. Mainly used to convert a value from
+ * one space to another (eg: our errno's to host errno's and v.v)
+ *
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ASSOC_H
+#define _INCLUDE_ASSOC_H
+
+typedef struct {
+ const char *name;
+ unsigned32 local_value;
+ unsigned32 remote_value;
+} rtems_assoc_t;
+
+/*
+ * Flag/marker for optional default value in each table
+ */
+
+#define RTEMS_ASSOC_DEFAULT_NAME "(default)"
+
+const rtems_assoc_t *rtems_assoc_ptr_by_name(const rtems_assoc_t *, const char *);
+const rtems_assoc_t *rtems_assoc_ptr_by_value(const rtems_assoc_t *, unsigned32);
+const rtems_assoc_t *rtems_assoc_ptr_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_local_by_remote(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_remote_by_name(const rtems_assoc_t *, const char *);
+unsigned32 rtems_assoc_local_by_name(const rtems_assoc_t *, const char *);
+const char *rtems_assoc_name_by_local(const rtems_assoc_t *, unsigned32);
+const char *rtems_assoc_name_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(const rtems_assoc_t *, unsigned32);
+char *rtems_assoc_name_by_local_bitfield(const rtems_assoc_t *, unsigned32, char *);
+char *rtems_assoc_name_by_remote_bitfield(const rtems_assoc_t *, unsigned32, char *);
+unsigned32 rtems_assoc_local_by_remote_bitfield(const rtems_assoc_t *, unsigned32);
+
+
+#endif /* ! _INCLUDE_ASSOC_H */
diff --git a/c/src/lib/libmisc/cpuuse/Makefile.in b/c/src/lib/libmisc/cpuuse/Makefile.in
new file mode 100644
index 0000000000..5311e1c271
--- /dev/null
+++ b/c/src/lib/libmisc/cpuuse/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libcpuuse-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpuuse
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+INSTALLED_H_FILES=$(srcdir)/cpuuse.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
+# $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/lib/libmisc/cpuuse/README b/c/src/lib/libmisc/cpuuse/README
new file mode 100644
index 0000000000..e8a30006a1
--- /dev/null
+++ b/c/src/lib/libmisc/cpuuse/README
@@ -0,0 +1,41 @@
+#
+# README,v 1.3 1995/12/19 20:13:47 joel Exp
+#
+
+This directory contains a stack bounds checker. It provides two
+primary features:
+
+ + check for stack overflow at each context switch
+ + provides an educated guess at each task's stack usage
+
+The stack overflow check at context switch works by looking for
+a 16 byte pattern at the logical end of the stack to be corrupted.
+The "guesser" assumes that the entire stack was prefilled with a known
+pattern and assumes that the pattern is still in place if the memory
+has not been used as a stack.
+
+Both of these can be fooled by pushing large holes onto the stack
+and not writing to them... or (much more unlikely) writing the
+magic patterns into memory.
+
+This code has not been extensively tested. It is provided as a tool
+for RTEMS users to catch the most common mistake in multitasking
+systems ... too little stack space. Suggestions and comments are appreciated.
+
+NOTES:
+
+1. Stack usage information is questionable on CPUs which push
+ large holes on stack.
+
+2. The stack checker has a tendency to generate a fault when
+ trying to print the helpful diagnostic message. If it comes
+ out, congratulations. If not, then the variable Stack_check_Blown_task
+ contains a pointer to the TCB of the offending task. This
+ is usually enough to go on.
+
+FUTURE:
+
+1. Determine how/if gcc will generate stack probe calls and support that.
+
+2. Get accurate stack usage numbers on i960.. it pushes very large
+ holes on the stack.
diff --git a/c/src/lib/libmisc/cpuuse/cpuuse.c b/c/src/lib/libmisc/cpuuse/cpuuse.c
new file mode 100644
index 0000000000..475765b4db
--- /dev/null
+++ b/c/src/lib/libmisc/cpuuse/cpuuse.c
@@ -0,0 +1,142 @@
+/*
+ * CPU Usage Reporter
+ *
+ * COPYRIGHT (c) 1989-1997. 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * check.c,v 1.13 1996/04/22 16:51:52 joel Exp
+ *
+ */
+
+#include <rtems.h>
+
+extern rtems_configuration_table BSP_Configuration;
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "cpuuse.h"
+
+unsigned32 CPU_usage_Ticks_at_last_reset;
+
+/*PAGE
+ *
+ * CPU_usage_Dump
+ */
+
+void CPU_usage_Dump( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+ unsigned32 u32_name;
+ char name[5];
+ unsigned32 total_units = 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 ];
+
+ if ( the_thread )
+ total_units += the_thread->ticks_executed;
+ }
+ }
+ }
+
+ printf("CPU Usage by thread\n");
+#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
+ printf( " ID NAME TICKS PERCENT\n" );
+#else
+ printf( " ID NAME TICKS\n" );
+#endif
+
+ 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 ];
+
+ if ( !the_thread )
+ continue;
+
+ u32_name = *(unsigned32 *)the_thread->Object.name;
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
+ printf( "0x%08x %4s %8d %5.3f\n",
+ the_thread->Object.id,
+ name,
+ the_thread->ticks_executed,
+ (total_units) ?
+ (double)the_thread->ticks_executed / (double)total_units :
+ (double)total_units
+ );
+#else
+ printf( "0x%08x %4s %8d\n",
+ the_thread->Object.id,
+ name,
+ the_thread->ticks_executed
+ );
+#endif
+ }
+ }
+ }
+
+ printf(
+ "\nTicks since last reset = %d\n",
+ _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset
+ );
+ printf( "\nTotal Units = %d\n", total_units );
+}
+
+/*PAGE
+ *
+ * CPU_usage_Reset
+ */
+
+void CPU_usage_Reset( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+
+ CPU_usage_Ticks_at_last_reset = _Watchdog_Ticks_since_boot;
+
+ 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 ];
+
+ if ( !the_thread )
+ continue;
+
+ the_thread->ticks_executed = 0;
+ }
+ }
+ }
+
+}
+
diff --git a/c/src/lib/libmisc/cpuuse/cpuuse.h b/c/src/lib/libmisc/cpuuse/cpuuse.h
new file mode 100644
index 0000000000..db5a258e7e
--- /dev/null
+++ b/c/src/lib/libmisc/cpuuse/cpuuse.h
@@ -0,0 +1,41 @@
+/* cpuuse.h
+ *
+ * This include file contains information necessary to utilize
+ * and install the cpu usage reporting mechanism.
+ *
+ * COPYRIGHT (c) 1989-1997. 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * stackchk.h,v 1.3 1995/12/19 20:13:52 joel Exp
+ */
+
+#ifndef __CPU_USE_h
+#define __CPU_USE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * CPU_usage_Dump
+ */
+
+void CPU_usage_Dump( void );
+
+/*
+ * CPU_usage_Reset
+ */
+
+void CPU_usage_Reset( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libmisc/cpuuse/internal.h b/c/src/lib/libmisc/cpuuse/internal.h
new file mode 100644
index 0000000000..678973f517
--- /dev/null
+++ b/c/src/lib/libmisc/cpuuse/internal.h
@@ -0,0 +1,96 @@
+/* internal.h
+ *
+ * This include file contains internal information
+ * for the RTEMS stack checker.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * internal.h,v 1.5 1995/12/19 20:13:50 joel Exp
+ */
+
+#ifndef __INTERNAL_STACK_CHECK_h
+#define __INTERNAL_STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This structure is used to fill in and compare the "end of stack"
+ * marker pattern.
+ * pattern area must be a multiple of 4 words.
+ */
+
+#ifdef CPU_STACK_CHECK_SIZE
+#define PATTERN_SIZE_WORDS (((CPU_STACK_CHECK_SIZE / 4) + 3) & ~0x3)
+#else
+#define PATTERN_SIZE_WORDS 4
+#endif
+
+#define PATTERN_SIZE_BYTES (PATTERN_SIZE_WORDS * 4)
+
+typedef struct {
+ unsigned32 pattern[ PATTERN_SIZE_WORDS ];
+} Stack_check_Control;
+
+/*
+ * The pattern used to fill the entire stack.
+ */
+
+#define BYTE_PATTERN 0xA5
+#define U32_PATTERN 0xA5A5A5A5
+
+/*
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+);
+
+/*
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+);
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libmisc/error/Makefile.in b/c/src/lib/libmisc/error/Makefile.in
new file mode 100644
index 0000000000..67b73d713f
--- /dev/null
+++ b/c/src/lib/libmisc/error/Makefile.in
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/liberror-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=error
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/error.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/lib/libmisc/error/error.c b/c/src/lib/libmisc/error/error.c
new file mode 100644
index 0000000000..5bd481c3e6
--- /dev/null
+++ b/c/src/lib/libmisc/error/error.c
@@ -0,0 +1,209 @@
+/*
+ * report errors and panics to RTEMS' stderr.
+ * Currently just used by RTEMS monitor.
+ *
+ * $Id$
+ */
+
+
+/*
+ * These routines provide general purpose error reporting.
+ * rtems_error reports an error to stderr and allows use of
+ * printf style formatting. A newline is appended to all messages.
+ *
+ * error_flag can be specified as any of the following:
+ *
+ * RTEMS_ERROR_ERRNO -- include errno text in output
+ * RTEMS_ERROR_PANIC -- halts local system after output
+ * RTEMS_ERROR_ABORT -- abort after output
+ *
+ * It can also include a rtems_status value which can be OR'd
+ * with the above flags. *
+ *
+ * EXAMPLE
+ * #include <rtems.h>
+ * #include <rtems/error.h>
+ * rtems_error(0, "stray interrupt %d", intr);
+ *
+ * EXAMPLE
+ * if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL)
+ * {
+ * rtems_error(status | RTEMS_ERROR_ABORT,
+ * "could not create task");
+ * }
+ *
+ * EXAMPLE
+ * if ((fd = open(pathname, O_RDNLY)) < 0)
+ * {
+ * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname);
+ * goto failed;
+ * }
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "error.h"
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h> /* _exit() */
+
+/* bug in hpux <errno.h>: no prototypes unless you are C++ */
+#ifdef hpux9
+char *strerror(int);
+#endif
+
+extern char *rtems_progname;
+int rtems_panic_in_progress;
+
+rtems_assoc_t rtems_status_assoc[] = {
+ { "successful completion", RTEMS_SUCCESSFUL, },
+ { "returned from a thread", RTEMS_TASK_EXITTED, },
+ { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, },
+ { "invalid object name", RTEMS_INVALID_NAME, },
+ { "invalid object id", RTEMS_INVALID_ID, },
+ { "too many", RTEMS_TOO_MANY, },
+ { "timed out waiting", RTEMS_TIMEOUT, },
+ { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, },
+ { "specified size was invalid", RTEMS_INVALID_SIZE, },
+ { "address specified is invalid", RTEMS_INVALID_ADDRESS, },
+ { "number was invalid", RTEMS_INVALID_NUMBER, },
+ { "item has not been initialized", RTEMS_NOT_DEFINED, },
+ { "resources still outstanding", RTEMS_RESOURCE_IN_USE, },
+ { "request not satisfied", RTEMS_UNSATISFIED, },
+ { "thread is in wrong state", RTEMS_INCORRECT_STATE, },
+ { "thread already in state", RTEMS_ALREADY_SUSPENDED, },
+ { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, },
+ { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, },
+ { "called from wrong environment", RTEMS_CALLED_FROM_ISR, },
+ { "invalid thread priority", RTEMS_INVALID_PRIORITY, },
+ { "invalid date/time", RTEMS_INVALID_CLOCK, },
+ { "invalid node id", RTEMS_INVALID_NODE, },
+ { "directive not configured", RTEMS_NOT_CONFIGURED, },
+ { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , },
+ { "directive not implemented", RTEMS_NOT_IMPLEMENTED, },
+ { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, },
+ { "could not get enough memory", RTEMS_NO_MEMORY, },
+ { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
+ { 0, 0, 0 },
+};
+
+
+const char *
+rtems_status_text(
+ rtems_status_code status
+)
+{
+ return rtems_assoc_name_by_local(rtems_status_assoc, status);
+}
+
+
+static int rtems_verror(
+ unsigned32 error_flag,
+ const char *printf_format,
+ va_list arglist
+)
+{
+ int local_errno = 0;
+ int chars_written = 0;
+ rtems_status_code status;
+
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_panic_in_progress++;
+
+ /* disable task switches */
+ _Thread_Disable_dispatch();
+
+ /* don't aggravate things */
+ if (rtems_panic_in_progress > 2)
+ return 0;
+ }
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ status = error_flag & ~RTEMS_ERROR_MASK;
+ if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
+ local_errno = errno;
+
+ if (_System_state_Is_multiprocessing)
+ fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
+
+ if (rtems_progname && *rtems_progname)
+ chars_written += fprintf(stderr, "%s: ", rtems_progname);
+ chars_written += vfprintf(stderr, printf_format, arglist);
+
+ if (status)
+ chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status));
+
+ if (local_errno)
+ if ((local_errno > 0) && *strerror(local_errno))
+ chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
+ else
+ chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
+
+ chars_written += fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT))
+ {
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_error(0, "fatal error, exiting");
+ _exit(local_errno);
+ }
+ else
+ {
+ rtems_error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+ return chars_written;
+}
+
+
+/*
+ * Report an error.
+ * error_flag is as above; printf_format is a normal
+ * printf(3) format string, with its concommitant arguments.
+ *
+ * Returns the number of characters written.
+ */
+
+int rtems_error(
+ int error_flag,
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+ int chars_written;
+
+ va_start(arglist, printf_format);
+ chars_written = rtems_verror(error_flag, printf_format, arglist);
+ va_end(arglist);
+
+ return chars_written;
+}
+
+/*
+ * rtems_panic is shorthand for rtems_error(RTEMS_ERROR_PANIC, ...)
+ */
+
+void rtems_panic(
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+
+ va_start(arglist, printf_format);
+ (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
+ va_end(arglist);
+}
diff --git a/c/src/lib/libmisc/error/error.h b/c/src/lib/libmisc/error/error.h
new file mode 100644
index 0000000000..a0698afb5d
--- /dev/null
+++ b/c/src/lib/libmisc/error/error.h
@@ -0,0 +1,38 @@
+/*
+ * Defines and externs for rtems error reporting
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ERROR_h
+#define __RTEMS_ERROR_h
+
+/*
+ * rtems_error() and rtems_panic() support
+ */
+
+#define RTEMS_ERROR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */
+#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */
+
+#define RTEMS_ERROR_MASK (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \
+ RTEMS_ERROR_PANIC) /* all */
+
+const char *rtems_status_text(rtems_status_code);
+int rtems_error(int error_code, const char *printf_format, ...);
+#ifdef __GNUC__
+void rtems_panic(const char *printf_format, ...);
+/*
+ * We should be able to use this attribute but gcc complains that
+ * rtems_panic does in fact return. :(
+ *
+ * __attribute__ ((__noreturn__));
+ */
+#else
+void rtems_panic(const char *printf_format, ...);
+#endif
+
+extern int rtems_panic_in_progress;
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libmisc/monitor/Makefile.in b/c/src/lib/libmisc/monitor/Makefile.in
new file mode 100644
index 0000000000..0f6600f59c
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/Makefile.in
@@ -0,0 +1,57 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libmonitor-tmp.a
+# C source names, if any, go here -- minus the .c
+C_PIECES=mon-command mon-symbols mon-prmisc mon-monitor mon-object mon-server \
+ mon-task mon-queue mon-driver mon-dname mon-itask \
+ mon-extension mon-manager mon-config mon-mpci
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+INSTALLED_H_FILES=$(srcdir)/monitor.h $(srcdir)/symbols.h
+
+SRCS=README $(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I$(srcdir)
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+.PHONY: preinstall
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: preinstall ${ARCH} $(SRCS) $(LIB)
+
+preinstall: $(INSTALLED_H_FILES)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libmisc/monitor/README b/c/src/lib/libmisc/monitor/README
new file mode 100644
index 0000000000..d5a73da140
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/README
@@ -0,0 +1,97 @@
+#
+# $Id$
+#
+
+monitor task
+
+The monitor task is an optional task that knows about RTEMS
+data structures and can print out information about them.
+It is a work-in-progress and needs many more commands, but
+is useful now.
+
+The monitor works best when it is the highest priority task,
+so all your other tasks should ideally be at some priority
+greater than 1.
+
+To use the monitor:
+-------------------
+
+ #include <rtems/monitor.h>
+
+ ...
+
+ rtems_monitor_init(0);
+
+ The parameter to rtems_monitor_init() tells the monitor whether
+ to suspend itself on startup. A value of 0 causes the monitor
+ to immediately enter command mode; a non-zero value causes the
+ monitor to suspend itself after creation and wait for explicit
+ wakeup.
+
+
+ rtems_monitor_wakeup();
+
+ wakes up a suspended monitor and causes it to reenter command mode.
+
+Monitor commands
+----------------
+
+ The monitor prompt is 'rtems> '.
+ Can abbreviate commands to "uniquity"
+ There is a 'help' command. Here is the output from various
+ help commands:
+
+ Commands (may be abbreviated)
+
+ help -- get this message or command specific help
+ task -- show task information
+ queue -- show message queue information
+ symbol -- show entries from symbol table
+ pause -- pause monitor for a specified number of ticks
+ fatal -- invoke a fatal RTEMS error
+
+ task [id [id ...] ]
+ display information about the specified tasks.
+ Default is to display information about all tasks on this node
+
+ queue [id [id ... ] ]
+ display information about the specified message queues
+ Default is to display information about all queues on this node
+
+ symbol [ symbolname [symbolname ... ] ]
+ display value associated with specified symbol.
+ Defaults to displaying all known symbols.
+
+ pause [ticks]
+ monitor goes to "sleep" for specified ticks (default is 1)
+ monitor will resume at end of period or if explicitly awakened
+
+ fatal [status]
+ Invoke 'rtems_fatal_error_occurred' with 'status'
+ (default is RTEMS_INTERNAL_ERROR)
+
+ continue
+ put the monitor to sleep waiting for an explicit wakeup from the
+ program running.
+
+
+Sample output from 'task' command
+---------------------------------
+
+ rtems> task
+ ID NAME PRIO STAT MODES EVENTS WAITID WAITARG NOTES
+ ------------------------------------------------------------------------
+ 00010001 UI1 2 READY P:T:nA NONE15: 0x40606348
+ 00010002 RMON 1 READY nP NONE15: 0x40604110
+
+ 'RMON' is the monitor itself, so we have 1 "user" task.
+ Its modes are P:T:nA which translate to:
+
+ preemptable
+ timesliced
+ no ASRS
+
+ It has no events.
+ It has a notepad value for notepad 15 which is 0x40606348
+ (this is the libc thread state)
+
diff --git a/c/src/lib/libmisc/monitor/mon-command.c b/c/src/lib/libmisc/monitor/mon-command.c
new file mode 100644
index 0000000000..87d31dfa2a
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-command.c
@@ -0,0 +1,187 @@
+/*
+ * Command parsing routines for RTEMS monitor
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * make_argv(cp): token-count
+ * Break up the command line in 'cp' into global argv[] and argc (return
+ * value).
+ */
+
+int
+rtems_monitor_make_argv(
+ char *cp,
+ int *argc_p,
+ char **argv)
+{
+ int argc = 0;
+
+ while ((cp = strtok(cp, " \t\n\r")))
+ {
+ argv[argc++] = cp;
+ cp = (char *) NULL;
+ }
+ argv[argc] = (char *) NULL; /* end of argv */
+
+ return *argc_p = argc;
+}
+
+
+/*
+ * Read and break up a monitor command
+ *
+ * We have to loop on the gets call, since it will return NULL under UNIX
+ * RTEMS when we get a signal (eg: SIGALRM).
+ */
+
+int
+rtems_monitor_command_read(char *command,
+ int *argc,
+ char **argv)
+{
+ extern rtems_configuration_table BSP_Configuration;
+ static char monitor_prompt[32];
+
+ /*
+ * put node number in the prompt if we are multiprocessing
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table == 0)
+ sprintf(monitor_prompt, "%s", MONITOR_PROMPT);
+ else if (rtems_monitor_default_node != rtems_monitor_node)
+ sprintf(monitor_prompt, "%d-%s-%d", rtems_monitor_node, MONITOR_PROMPT, rtems_monitor_default_node);
+ else
+ sprintf(monitor_prompt, "%d-%s", rtems_monitor_node, MONITOR_PROMPT);
+
+#ifdef RTEMS_UNIX
+ /* RTEMS on unix gets so many interrupt system calls this is hosed */
+ printf("%s> ", monitor_prompt);
+ fflush(stdout);
+ while (gets(command) == (char *) 0)
+ ;
+#else
+ do
+ {
+ printf("%s> ", monitor_prompt);
+ fflush(stdout);
+ } while (gets(command) == (char *) 0);
+#endif
+
+ return rtems_monitor_make_argv(command, argc, argv);
+}
+
+/*
+ * Look up a command in a command table
+ *
+ */
+
+rtems_monitor_command_entry_t *
+rtems_monitor_command_lookup(
+ rtems_monitor_command_entry_t *table,
+ int argc,
+ char **argv
+)
+{
+ rtems_monitor_command_entry_t *p;
+ rtems_monitor_command_entry_t *abbreviated_match = 0;
+ int abbreviated_matches = 0;
+ char *command;
+ int command_length;
+
+ command = argv[0];
+
+ if ((table == 0) || (command == 0))
+ goto failed;
+
+ command_length = strlen(command);
+
+ for (p = table; p->command; p++)
+ if (STREQ(command, p->command)) /* exact match */
+ goto done;
+ else if (STRNEQ(command, p->command, command_length))
+ {
+ abbreviated_matches++;
+ abbreviated_match = p;
+ }
+
+ /* no perfect match; is there a non-ambigous abbreviated match? */
+ if ( ! abbreviated_match)
+ {
+ printf("Unrecognized command '%s'; try 'help'\n", command);
+ goto failed;
+ }
+
+ if (abbreviated_matches > 1)
+ {
+ printf("Command '%s' is ambiguous; try 'help'\n", command);
+ goto failed;
+ }
+
+ p = abbreviated_match;
+
+done:
+ if (p->command_function == 0)
+ goto failed;
+ return p;
+
+failed:
+ return 0;
+}
+
+void
+rtems_monitor_command_usage(rtems_monitor_command_entry_t *table,
+ char *command_string)
+{
+ rtems_monitor_command_entry_t *help = 0;
+ char *help_command_argv[2];
+
+ /* if first entry in table is a usage, then print it out */
+ if (command_string == 0)
+ {
+ if (STREQ(table->command, "--usage--") && table->usage)
+ help = table;
+ }
+ else
+ {
+ help_command_argv[0] = command_string;
+ help_command_argv[1] = 0;
+ help = rtems_monitor_command_lookup(table, 1, help_command_argv);
+ }
+
+ if (help)
+ printf("%s\n", help->usage);
+}
+
+
+void
+rtems_monitor_help_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_monitor_command_entry_t *command;
+
+ command = (rtems_monitor_command_entry_t *) command_arg;
+
+ if (argc == 1)
+ rtems_monitor_command_usage(command, 0);
+ else
+ {
+ for (arg=1; argv[arg]; arg++)
+ rtems_monitor_command_usage(command, argv[arg]);
+ }
+}
diff --git a/c/src/lib/libmisc/monitor/mon-config.c b/c/src/lib/libmisc/monitor/mon-config.c
new file mode 100644
index 0000000000..d7593dc912
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-config.c
@@ -0,0 +1,131 @@
+/*
+ * RTEMS Config display support
+ *
+ * TODO
+ *
+ * $Id$
+ */
+
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+/*
+ * Fill in entire monitor config table
+ * for sending to a remote monitor or printing on the local system
+ */
+
+void
+rtems_monitor_config_canonical(
+ rtems_monitor_config_t *canonical_config,
+ void *config_void
+)
+{
+ rtems_configuration_table *c = (rtems_configuration_table *) config_void;
+ rtems_api_configuration_table *r = c->RTEMS_api_configuration;
+
+ canonical_config->work_space_start = c->work_space_start;
+ canonical_config->work_space_size = c->work_space_size;
+ canonical_config->maximum_tasks = r->maximum_tasks;
+ canonical_config->maximum_timers = r->maximum_timers;
+ canonical_config->maximum_semaphores = r->maximum_semaphores;
+ canonical_config->maximum_message_queues = r->maximum_message_queues;
+ canonical_config->maximum_partitions = r->maximum_partitions;
+ canonical_config->maximum_regions = r->maximum_regions;
+ canonical_config->maximum_ports = r->maximum_ports;
+ canonical_config->maximum_periods = r->maximum_periods;
+ canonical_config->maximum_extensions = c->maximum_extensions;
+ canonical_config->microseconds_per_tick = c->microseconds_per_tick;
+ canonical_config->ticks_per_timeslice = c->ticks_per_timeslice;
+ canonical_config->number_of_initialization_tasks = r->number_of_initialization_tasks;
+}
+
+/*
+ * This is easy, since there is only 1 (altho we could get them from
+ * other nodes...)
+ */
+
+void *
+rtems_monitor_config_next(
+ void *object_info,
+ rtems_monitor_config_t *canonical_config,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= 1)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) c;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_config_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+INITIAL (startup) Configuration Info\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+
+void
+rtems_monitor_config_dump(
+ rtems_monitor_config_t *monitor_config,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length = 0;
+ length += printf("WORKSPACE");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("start: 0x%x; size: 0x%x\n",
+ (unsigned32) monitor_config->work_space_start,
+ monitor_config->work_space_size);
+
+ length = 0;
+ length += printf("TIME");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("usec/tick: %d; tick/timeslice: %d; tick/sec: %d\n",
+ monitor_config->microseconds_per_tick,
+ monitor_config->ticks_per_timeslice,
+ 1000000 / monitor_config->microseconds_per_tick);
+
+ length = 0;
+ length += printf("MAXIMUMS");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("tasks: %d; timers: %d; sems: %d; que's: %d; ext's: %d\n",
+ monitor_config->maximum_tasks,
+ monitor_config->maximum_timers,
+ monitor_config->maximum_semaphores,
+ monitor_config->maximum_message_queues,
+ monitor_config->maximum_extensions);
+ length = 0;
+ length += rtems_monitor_pad(CONTCOL, length);
+ length += printf("partitions: %d; regions: %d; ports: %d; periods: %d\n",
+ monitor_config->maximum_partitions,
+ monitor_config->maximum_regions,
+ monitor_config->maximum_ports,
+ monitor_config->maximum_periods);
+}
diff --git a/c/src/lib/libmisc/monitor/mon-dname.c b/c/src/lib/libmisc/monitor/mon-dname.c
new file mode 100644
index 0000000000..e6993e18f7
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-dname.c
@@ -0,0 +1,112 @@
+/*
+ * RTEMS monitor driver names support.
+ *
+ * There are 2 "driver" things the monitor knows about.
+ *
+ * 1. Regular RTEMS drivers.
+ * This is a table indexed by major device number and
+ * containing driver entry points only.
+ *
+ * 2. Driver name table.
+ * A separate table of names for drivers.
+ * The table converts driver names to a major number
+ * as index into the driver table and a minor number
+ * for an argument to driver.
+ *
+ * Drivers are displayed with 'driver' command.
+ * Names are displayed with 'dname' command.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+#include <string.h> /* strncpy() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+void
+rtems_monitor_dname_canonical(
+ rtems_monitor_dname_t *canonical_dname,
+ void *dname_void
+)
+{
+ rtems_driver_name_t *np = (rtems_driver_name_t *) dname_void;
+
+ (void) strncpy(canonical_dname->name_string, np->device_name, sizeof(canonical_dname->name_string));
+ canonical_dname->major = np->major;
+ canonical_dname->minor = np->minor;
+}
+
+void *
+rtems_monitor_dname_next(
+ void *object_information,
+ rtems_monitor_dname_t *canonical_dname,
+ rtems_id *next_id
+)
+{
+ int n = rtems_get_index(*next_id);
+ rtems_driver_name_t *table = _IO_Driver_name_table;
+ rtems_driver_name_t *np = 0;
+
+/* 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;
+
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+
+done:
+ _Thread_Disable_dispatch();
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_dname->id = n;
+ canonical_dname->name = rtems_build_name('-', '-', '-', '-');
+
+ *next_id += 1;
+ return np;
+}
+
+void
+rtems_monitor_dname_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ Major:Minor Name\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+void
+rtems_monitor_dname_dump(
+ rtems_monitor_dname_t *monitor_dname,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_pad(6, length);
+ length += rtems_monitor_dump_hex(monitor_dname->major);
+ length += printf(":");
+ length += rtems_monitor_dump_hex(monitor_dname->minor);
+
+ length += rtems_monitor_pad(16, length);
+ length += printf("%.*s",
+ (int) sizeof(monitor_dname->name_string),
+ (char *) monitor_dname->name_string);
+
+ length += printf("\n");
+ length = 0;
+}
diff --git a/c/src/lib/libmisc/monitor/mon-driver.c b/c/src/lib/libmisc/monitor/mon-driver.c
new file mode 100644
index 0000000000..065172534c
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-driver.c
@@ -0,0 +1,136 @@
+/*
+ * RTEMS monitor IO (device drivers) support
+ *
+ * There are 2 "driver" things the monitor knows about.
+ *
+ * 1. Regular RTEMS drivers.
+ * This is a table indexed by major device number and
+ * containing driver entry points only.
+ *
+ * 2. Driver name table.
+ * A separate table of names for drivers.
+ * The table converts driver names to a major number
+ * as index into the driver table and a minor number
+ * for an argument to driver.
+ *
+ * Drivers are displayed with 'driver' command.
+ * Names are displayed with 'name' command.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+
+void
+rtems_monitor_driver_canonical(
+ rtems_monitor_driver_t *canonical_driver,
+ void *driver_void
+)
+{
+ rtems_driver_address_table *d = (rtems_driver_address_table *) driver_void;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->initialization,
+ (void *) d->initialization);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->open,
+ (void *) d->open);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->close,
+ (void *) d->close);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->read,
+ (void *) d->read);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->write,
+ (void *) d->write);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->control,
+ (void *) d->control);
+}
+
+
+void *
+rtems_monitor_driver_next(
+ void *object_info,
+ rtems_monitor_driver_t *canonical_driver,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= c->number_of_device_drivers)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_driver->id = n;
+ canonical_driver->name = rtems_build_name('-', '-', '-', '-');
+
+ *next_id += 1;
+ return (void *) (c->Device_driver_table + n);
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_driver_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ Major Entry points\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+void
+rtems_monitor_driver_dump(
+ rtems_monitor_driver_t *monitor_driver,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += printf(" %d", monitor_driver->id);
+
+ length += rtems_monitor_pad(13, length);
+ length += printf("init: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->initialization, verbose);
+ length += printf("; control: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->control, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(13, length);
+
+ length += printf("open: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->open, verbose);
+ length += printf("; close: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->close, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(13, length);
+
+ length += printf("read: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->read, verbose);
+ length += printf("; write: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->write, verbose);
+ length += printf("\n");
+ length = 0;
+}
diff --git a/c/src/lib/libmisc/monitor/mon-extension.c b/c/src/lib/libmisc/monitor/mon-extension.c
new file mode 100644
index 0000000000..18f6cf2d47
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-extension.c
@@ -0,0 +1,98 @@
+/*
+ * RTEMS Monitor extension support
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+void
+rtems_monitor_extension_canonical(
+ rtems_monitor_extension_t *canonical_extension,
+ void *extension_void
+)
+{
+ Extension_Control *rtems_extension = (Extension_Control *) extension_void;
+ rtems_extensions_table *e = &rtems_extension->Extension.Callouts;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_create,
+ (void *) e->thread_create);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_start,
+ (void *) e->thread_start);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_restart,
+ (void *) e->thread_restart);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_delete,
+ (void *) e->thread_delete);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_tswitch,
+ (void *) e->thread_switch);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_begin,
+ (void *) e->thread_begin);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_exitted,
+ (void *) e->thread_exitted);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_fatal,
+ (void *) e->fatal);
+}
+
+void
+rtems_monitor_extension_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+
+/*
+ * Dump out the canonical form
+ */
+
+void
+rtems_monitor_extension_dump(
+ rtems_monitor_extension_t *monitor_extension,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_dump_id(monitor_extension->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_extension->name);
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("create: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_create, verbose);
+ length += printf("; start: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_start, verbose);
+ length += printf("; restart: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_restart, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("delete: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_delete, verbose);
+ length += printf("; switch: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_tswitch, verbose);
+ length += printf("; begin: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_begin, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("exitted: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_exitted, verbose);
+ length += printf("; fatal: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_fatal, verbose);
+ length += printf("\n");
+ length = 0;
+ printf("\n");
+}
diff --git a/c/src/lib/libmisc/monitor/mon-itask.c b/c/src/lib/libmisc/monitor/mon-itask.c
new file mode 100644
index 0000000000..0f7c2740ce
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-itask.c
@@ -0,0 +1,115 @@
+/*
+ * RTEMS Monitor init task support
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+/*
+ * As above, but just for init tasks
+ */
+void
+rtems_monitor_init_task_canonical(
+ rtems_monitor_init_task_t *canonical_itask,
+ void *itask_void
+)
+{
+ rtems_initialization_tasks_table *rtems_itask = itask_void;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_itask->entry,
+ (void *) rtems_itask->entry_point);
+
+ canonical_itask->argument = rtems_itask->argument;
+ canonical_itask->stack_size = rtems_itask->stack_size;
+ canonical_itask->priority = rtems_itask->initial_priority;
+ canonical_itask->modes = rtems_itask->mode_set;
+ canonical_itask->attributes = rtems_itask->attribute_set;
+}
+
+void *
+rtems_monitor_init_task_next(
+ void *object_info,
+ rtems_monitor_init_task_t *canonical_init_task,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ rtems_initialization_tasks_table *itask;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= c->RTEMS_api_configuration->number_of_initialization_tasks)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ itask = c->RTEMS_api_configuration->User_initialization_tasks_table + n;
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_init_task->id = n;
+ canonical_init_task->name = itask->name;
+
+ *next_id += 1;
+ return (void *) itask;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_init_task_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ # NAME ENTRY ARGUMENT PRIO MODES ATTRIBUTES STACK SIZE\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+/*
+ */
+
+void
+rtems_monitor_init_task_dump(
+ rtems_monitor_init_task_t *monitor_itask,
+ boolean verbose
+)
+{
+ int length = 0;
+
+ length += rtems_monitor_dump_decimal(monitor_itask->id);
+
+ length += rtems_monitor_pad(7, length);
+ length += rtems_monitor_dump_name(monitor_itask->name);
+
+ length += rtems_monitor_pad(14, length);
+ length += rtems_monitor_symbol_dump(&monitor_itask->entry, verbose);
+
+ length += rtems_monitor_pad(25, length);
+ length += printf("%d [0x%x]", monitor_itask->argument, monitor_itask->argument);
+
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_priority(monitor_itask->priority);
+
+ length += rtems_monitor_pad(46, length);
+ length += rtems_monitor_dump_modes(monitor_itask->modes);
+
+ length += rtems_monitor_pad(54, length);
+ length += rtems_monitor_dump_attributes(monitor_itask->attributes);
+
+ length += rtems_monitor_pad(66, length);
+ length += printf("%d [0x%x]", monitor_itask->stack_size, monitor_itask->stack_size);
+
+ printf("\n");
+}
diff --git a/c/src/lib/libmisc/monitor/mon-manager.c b/c/src/lib/libmisc/monitor/mon-manager.c
new file mode 100644
index 0000000000..523fa6aded
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-manager.c
@@ -0,0 +1,50 @@
+/*
+ * RTEMS Monitor "manager" support.
+ * Used to traverse object (chain) lists and print them out.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+#include <monitor.h>
+
+/*
+ * "next" routine for all objects that are RTEMS manager objects
+ */
+
+void *
+rtems_monitor_manager_next(
+ void *table_void,
+ void *canonical,
+ rtems_id *next_id
+)
+{
+ Objects_Information *table = table_void;
+ rtems_monitor_generic_t *copy;
+ Objects_Control *object = 0;
+ Objects_Locations location;
+
+ /*
+ * When we are called, it must be local
+ */
+
+ if ( ! _Objects_Is_local_id(*next_id))
+ goto done;
+
+ object = _Objects_Get_next(table, *next_id, &location, next_id);
+
+ if (object)
+ {
+ copy = (rtems_monitor_generic_t *) canonical;
+ copy->id = object->id;
+ _Objects_Copy_name_raw(object->name, &copy->name, sizeof(copy->name));
+ }
+
+done:
+ return object;
+}
+
diff --git a/c/src/lib/libmisc/monitor/mon-monitor.c b/c/src/lib/libmisc/monitor/mon-monitor.c
new file mode 100644
index 0000000000..0025266e03
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-monitor.c
@@ -0,0 +1,518 @@
+/*
+ * RTEMS monitor main body
+ *
+ * TODO:
+ * add stuff to RTEMS api
+ * rtems_get_name(id)
+ * rtems_get_type(id)
+ * rtems_build_id(node, type, num)
+ * Add a command to dump out info about an arbitrary id when
+ * types are added to id's
+ * rtems> id idnum
+ * idnum: node n, object: whatever, id: whatever
+ * allow id's to be specified as n:t:id, where 'n:t' is optional
+ * should have a separate monitor FILE stream (ala the debugger)
+ * remote request/response stuff should be cleaned up
+ * maybe we can use real rpc??
+ * 'info' command to print out:
+ * interrupt stack location, direction and size
+ * floating point config stuff
+ * interrupt config stuff
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "monitor.h"
+
+/* set by trap handler */
+extern rtems_tcb *debugger_interrupted_task;
+extern rtems_context *debugger_interrupted_task_context;
+extern rtems_unsigned32 debugger_trap;
+
+/*
+ * Various id's for the monitor
+ * They need to be public variables for access by other agencies
+ * such as debugger and remote servers'
+ */
+
+rtems_id rtems_monitor_task_id;
+
+unsigned32 rtems_monitor_node; /* our node number */
+unsigned32 rtems_monitor_default_node; /* current default for commands */
+
+/*
+ * The rtems symbol table
+ */
+
+rtems_symbol_table_t *rtems_monitor_symbols;
+
+/*
+ * The top-level commands
+ */
+
+rtems_monitor_command_entry_t rtems_monitor_commands[] = {
+ { "--usage--",
+ "\n"
+ "RTEMS monitor\n"
+ "\n"
+ "Commands (may be abbreviated)\n"
+ "\n"
+ " help -- get this message or command specific help\n"
+ " pause -- pause monitor for a specified number of ticks\n"
+ " exit -- invoke a fatal RTEMS error\n"
+ " symbol -- show entries from symbol table\n"
+ " continue -- put monitor to sleep waiting for explicit wakeup\n"
+ " config -- show system configuration\n"
+ " itask -- list init tasks\n"
+ " mpci -- list mpci config\n"
+ " task -- show task information\n"
+ " queue -- show message queue information\n"
+ " extension -- user extensions\n"
+ " driver -- show information about named drivers\n"
+ " dname -- show information about named drivers\n"
+ " object -- generic object information\n"
+ " node -- specify default node for commands that take id's\n"
+#ifdef CPU_INVOKE_DEBUGGER
+ " debugger -- invoke system debugger\n"
+#endif
+ ,
+ 0,
+ 0,
+ (unsigned32) rtems_monitor_commands,
+ },
+ { "config",
+ "config\n"
+ " Show the system configuration.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_CONFIG,
+ },
+ { "itask",
+ "itask\n"
+ " List init tasks for the system\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_INIT_TASK,
+ },
+ { "mpci",
+ "mpci\n"
+ " Show the MPCI system configuration, if configured.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_MPCI,
+ },
+ { "pause",
+ "pause [ticks]\n"
+ " monitor goes to \"sleep\" for specified ticks (default is 1)\n"
+ " monitor will resume at end of period or if explicitly awakened\n",
+ 0,
+ rtems_monitor_pause_cmd,
+ 0,
+ },
+ { "continue",
+ "continue\n"
+ " put the monitor to sleep waiting for an explicit wakeup from the\n"
+ " program running.\n",
+ 0,
+ rtems_monitor_continue_cmd,
+ 0,
+ },
+ { "go",
+ "go\n"
+ " Alias for 'continue'\n",
+ 0,
+ rtems_monitor_continue_cmd,
+ 0,
+ },
+ { "node",
+ "node [ node number ]\n"
+ " Specify default node number for commands that take id's\n",
+ 0,
+ rtems_monitor_node_cmd,
+ 0,
+ },
+ { "symbol",
+ "symbol [ symbolname [symbolname ... ] ]\n"
+ " display value associated with specified symbol.\n"
+ " Defaults to displaying all known symbols.\n",
+ 0,
+ rtems_monitor_symbol_cmd,
+ (unsigned32) &rtems_monitor_symbols,
+ },
+ { "extension",
+ "extension [id [id ...] ]\n"
+ " display information about specified extensions.\n"
+ " Default is to display information about all extensions on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_EXTENSION,
+ },
+ { "task",
+ "task [id [id ...] ]\n"
+ " display information about the specified tasks.\n"
+ " Default is to display information about all tasks on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_TASK,
+ },
+ { "queue",
+ "queue [id [id ... ] ]\n"
+ " display information about the specified message queues\n"
+ " Default is to display information about all queues on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_QUEUE,
+ },
+ { "object",
+ "object [id [id ...] ]\n"
+ " display information about specified RTEMS objects.\n"
+ " Object id's must include 'type' information.\n"
+ " (which may normally be defaulted)\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_INVALID,
+ },
+ { "driver",
+ "driver [ major [ major ... ] ]\n"
+ " Display the RTEMS device driver table.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_DRIVER,
+ },
+ { "dname",
+ "dname\n"
+ " Displays information about named drivers.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_DNAME,
+ },
+ { "exit",
+ "exit [status]\n"
+ " Invoke 'rtems_fatal_error_occurred' with 'status'\n"
+ " (default is RTEMS_SUCCESSFUL)\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_SUCCESSFUL,
+ },
+ { "fatal",
+ "fatal [status]\n"
+ " 'exit' with fatal error; default error is RTEMS_TASK_EXITTED\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_TASK_EXITTED, /* exit value */
+ },
+ { "quit",
+ "quit [status]\n"
+ " Alias for 'exit'\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_SUCCESSFUL, /* exit value */
+ },
+ { "help",
+ "help [ command [ command ] ]\n"
+ " provide information about commands\n"
+ " Default is show basic command summary.\n",
+ 0,
+ rtems_monitor_help_cmd,
+ (unsigned32) rtems_monitor_commands,
+ },
+#ifdef CPU_INVOKE_DEBUGGER
+ { "debugger",
+ "debugger\n"
+ " Enter the debugger, if possible.\n"
+ " A continue from the debugger will return to the monitor.\n",
+ 0,
+ rtems_monitor_debugger_cmd,
+ 0,
+ },
+#endif
+ { 0, 0, 0, 0, 0 },
+};
+
+
+rtems_status_code
+rtems_monitor_suspend(rtems_interval timeout)
+{
+ rtems_event_set event_set;
+ rtems_status_code status;
+
+ status = rtems_event_receive(MONITOR_WAKEUP_EVENT,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout,
+ &event_set);
+ return status;
+}
+
+void
+rtems_monitor_wakeup(void)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send(rtems_monitor_task_id, MONITOR_WAKEUP_EVENT);
+}
+
+void
+rtems_monitor_debugger_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+#ifdef CPU_INVOKE_DEBUGGER
+ CPU_INVOKE_DEBUGGER;
+#endif
+}
+
+void
+rtems_monitor_pause_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ if (argc == 1)
+ rtems_monitor_suspend(1);
+ else
+ rtems_monitor_suspend(strtoul(argv[1], 0, 0));
+}
+
+void
+rtems_monitor_fatal_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ if (argc == 1)
+ rtems_fatal_error_occurred(command_arg);
+ else
+ rtems_fatal_error_occurred(strtoul(argv[1], 0, 0));
+}
+
+void
+rtems_monitor_continue_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ rtems_monitor_suspend(RTEMS_NO_TIMEOUT);
+}
+
+void
+rtems_monitor_node_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ unsigned32 new_node = rtems_monitor_default_node;
+
+ switch (argc)
+ {
+ case 1: /* no node, just set back to ours */
+ new_node = rtems_monitor_node;
+ break;
+
+ case 2:
+ new_node = strtoul(argv[1], 0, 0);
+ break;
+
+ default:
+ printf("invalid syntax, try 'help node'\n");
+ break;
+ }
+
+ if ((new_node >= 1) &&
+ _Configuration_MP_table &&
+ (new_node <= _Configuration_MP_table->maximum_nodes))
+ rtems_monitor_default_node = new_node;
+}
+
+
+/*
+ * Function: rtems_monitor_symbols_loadup
+ *
+ * Description:
+ * Create and load the monitor's symbol table.
+ * We are reading the output format of 'gnm' which looks like this:
+ *
+ * 400a7068 ? _Rate_monotonic_Information
+ * 400a708c ? _Thread_Dispatch_disable_level
+ * 400a7090 ? _Configuration_Table
+ *
+ * We ignore the type field.
+ *
+ * Side Effects:
+ * Creates and fills in 'rtems_monitor_symbols' table
+ *
+ * TODO
+ * there should be a BSP #define or something like that
+ * to do this; Assuming stdio is crazy.
+ * Someday this should know BFD
+ * Maybe we could get objcopy to just copy the symbol areas
+ * and copy that down.
+ *
+ */
+
+void
+rtems_monitor_symbols_loadup(void)
+{
+ FILE *fp;
+ char buffer[128];
+
+ if (rtems_monitor_symbols)
+ rtems_symbol_table_destroy(rtems_monitor_symbols);
+
+ rtems_monitor_symbols = rtems_symbol_table_create(10);
+ if (rtems_monitor_symbols == 0)
+ return;
+
+ fp = fopen("symbols", "r");
+
+ if (fp == 0)
+ return;
+
+ while (fgets(buffer, sizeof(buffer) - 1, fp))
+ {
+ char *symbol;
+ char *value;
+ char *ignored_type;
+
+ value = strtok(buffer, " \t\n");
+ ignored_type = strtok(0, " \t\n");
+ symbol = strtok(0, " \t\n");
+
+ if (symbol && ignored_type && value)
+ {
+ rtems_symbol_t *sp;
+ sp = rtems_symbol_create(rtems_monitor_symbols,
+ symbol,
+ (rtems_unsigned32) strtoul(value, 0, 16));
+ if (sp == 0)
+ {
+ printf("could not define symbol '%s'\n", symbol);
+ goto done;
+ }
+ }
+ else
+ {
+ printf("parsing error on '%s'\n", buffer);
+ goto done;
+ }
+ }
+
+done:
+ return;
+}
+
+
+/*
+ * Main monitor command loop
+ */
+
+void
+rtems_monitor_task(
+ rtems_task_argument monitor_flags
+)
+{
+ rtems_tcb *debugee = 0;
+ rtems_context *rp;
+ rtems_context_fp *fp;
+ char command_buffer[513];
+ int argc;
+ char *argv[64];
+ boolean verbose = FALSE;
+
+ if (monitor_flags & RTEMS_MONITOR_SUSPEND)
+ (void) rtems_monitor_suspend(RTEMS_NO_TIMEOUT);
+
+ for (;;)
+ {
+ extern rtems_tcb * _Thread_Executing;
+ rtems_monitor_command_entry_t *command;
+
+ debugee = _Thread_Executing;
+ rp = &debugee->Registers;
+ fp = (rtems_context_fp *) debugee->fp_context; /* possibly 0 */
+
+ if (0 == rtems_monitor_command_read(command_buffer, &argc, argv))
+ continue;
+ if ((command = rtems_monitor_command_lookup(rtems_monitor_commands,
+ argc,
+ argv)) == 0)
+ continue;
+
+ command->command_function(argc, argv, command->command_arg, verbose);
+
+ fflush(stdout);
+ }
+}
+
+
+void
+rtems_monitor_kill(void)
+{
+ if (rtems_monitor_task_id)
+ rtems_task_delete(rtems_monitor_task_id);
+ rtems_monitor_task_id = 0;
+
+ rtems_monitor_server_kill();
+}
+
+void
+rtems_monitor_init(
+ unsigned32 monitor_flags
+)
+{
+ rtems_status_code status;
+
+ rtems_monitor_kill();
+
+ status = rtems_task_create(RTEMS_MONITOR_NAME,
+ 1,
+ 0 /* default stack */,
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &rtems_monitor_task_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor task");
+ goto done;
+ }
+
+ rtems_monitor_node = rtems_get_node(rtems_monitor_task_id);
+ rtems_monitor_default_node = rtems_monitor_node;
+
+ rtems_monitor_symbols_loadup();
+
+ if (monitor_flags & RTEMS_MONITOR_GLOBAL)
+ rtems_monitor_server_init(monitor_flags);
+
+ /*
+ * Start the monitor task itself
+ */
+
+ status = rtems_task_start(rtems_monitor_task_id,
+ rtems_monitor_task,
+ monitor_flags);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not start monitor");
+ goto done;
+ }
+
+done:
+}
diff --git a/c/src/lib/libmisc/monitor/mon-mpci.c b/c/src/lib/libmisc/monitor/mon-mpci.c
new file mode 100644
index 0000000000..cf88922b2b
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-mpci.c
@@ -0,0 +1,159 @@
+/*
+ * RTEMS MPCI Config display support
+ *
+ * TODO
+ *
+ * $Id$
+ */
+
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+
+/*
+ * Fill in entire monitor config table
+ * for sending to a remote monitor or printing on the local system
+ */
+
+void
+rtems_monitor_mpci_canonical(
+ rtems_monitor_mpci_t *canonical_mpci,
+ void *config_void
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ rtems_multiprocessing_table *m;
+ rtems_mpci_table *mt;
+
+ m = c->User_multiprocessing_table;
+ if (m == 0)
+ return;
+ mt = m->User_mpci_table;
+
+ canonical_mpci->node = m->node;
+ canonical_mpci->maximum_nodes = m->maximum_nodes;
+ canonical_mpci->maximum_global_objects = m->maximum_global_objects;
+ canonical_mpci->maximum_proxies = m->maximum_proxies;
+
+ canonical_mpci->default_timeout = mt->default_timeout;
+ canonical_mpci->maximum_packet_size = mt->maximum_packet_size;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->initialization,
+ (void *) mt->initialization);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->get_packet,
+ (void *) mt->get_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->return_packet,
+ (void *) mt->return_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->send_packet,
+ (void *) mt->send_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->receive_packet,
+ (void *) mt->receive_packet);
+}
+
+/*
+ * This is easy, since there is only 1 (altho we could get them from
+ * other nodes...)
+ */
+
+void *
+rtems_monitor_mpci_next(
+ void *object_info,
+ rtems_monitor_mpci_t *canonical_mpci,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= 1)
+ goto failed;
+
+ if ( ! c->User_multiprocessing_table)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) c;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_mpci_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ max max max default max\n\
+ node nodes globals proxies timeout pktsize\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+
+void
+rtems_monitor_mpci_dump(
+ rtems_monitor_mpci_t *monitor_mpci,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_pad(2, length);
+ length += printf(" %d", monitor_mpci->node);
+ length += rtems_monitor_pad(11, length);
+ length += printf("%d", monitor_mpci->maximum_nodes);
+
+ length += rtems_monitor_pad(18, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_global_objects);
+
+ length += rtems_monitor_pad(28, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_proxies);
+
+ length += rtems_monitor_pad(37, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->default_timeout);
+
+ length += rtems_monitor_pad(46, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_packet_size);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("init: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->initialization, verbose);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("get: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->get_packet, verbose);
+ length += printf("; return: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->return_packet, verbose);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("send: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->send_packet, verbose);
+ length += printf("; receive: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->receive_packet, verbose);
+
+ printf("\n");
+ length = 0;
+}
diff --git a/c/src/lib/libmisc/monitor/mon-object.c b/c/src/lib/libmisc/monitor/mon-object.c
new file mode 100644
index 0000000000..90de35ee7b
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-object.c
@@ -0,0 +1,376 @@
+/*
+ * RTEMS Monitor "object" support.
+ *
+ * Used to traverse object lists and print them out.
+ * An object can be an RTEMS object (chain based stuff) or
+ * a "misc" object such as a device driver.
+ *
+ * Each object has its own file in this directory (eg: extension.c)
+ * That file provides routines to convert a "native" structure
+ * to its canonical form, print a canonical structure, etc.
+ *
+ * TODO:
+ * should allow for non-numeric id's???
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+#include <string.h> /* memcpy() */
+
+#include <monitor.h>
+
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * add:
+ * next
+ */
+
+rtems_monitor_object_info_t rtems_monitor_object_info[] =
+{
+ { RTEMS_MONITOR_OBJECT_CONFIG,
+ (void *) 0,
+ sizeof(rtems_monitor_config_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_config_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_config_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_config_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_config_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_MPCI,
+ (void *) 0,
+ sizeof(rtems_monitor_mpci_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_mpci_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_mpci_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_mpci_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_mpci_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_INIT_TASK,
+ (void *) 0,
+ sizeof(rtems_monitor_init_task_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_init_task_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_init_task_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_init_task_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_init_task_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_TASK,
+ (void *) &_RTEMS_tasks_Information,
+ sizeof(rtems_monitor_task_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_task_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_task_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_task_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_QUEUE,
+ (void *) &_Message_queue_Information,
+ sizeof(rtems_monitor_queue_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_queue_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_queue_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_queue_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_EXTENSION,
+ (void *) &_Extension_Information,
+ sizeof(rtems_monitor_extension_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_extension_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_extension_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_extension_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_DRIVER,
+ (void *) 0,
+ sizeof(rtems_monitor_driver_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_driver_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_driver_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_driver_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_driver_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_DNAME,
+ /* 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,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_dname_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_dname_dump,
+ },
+};
+
+/*
+ * Allow id's to be specified without the node number or
+ * type for convenience.
+ */
+
+rtems_id
+rtems_monitor_id_fixup(
+ rtems_id id,
+ unsigned32 default_node,
+ rtems_monitor_object_type_t type
+)
+{
+ unsigned32 node;
+
+ node = rtems_get_node(id);
+ if (node == 0)
+ {
+ if (rtems_get_class(id) != OBJECTS_NO_CLASS)
+ type = rtems_get_class(id);
+
+ id = _Objects_Build_id(type, default_node, rtems_get_index(id));
+ }
+ return id;
+}
+
+
+rtems_monitor_object_info_t *
+rtems_monitor_object_lookup(
+ rtems_monitor_object_type_t type
+)
+{
+ rtems_monitor_object_info_t *p;
+ for (p = &rtems_monitor_object_info[0];
+ p < &rtems_monitor_object_info[NUMELEMS(rtems_monitor_object_info)];
+ p++)
+ {
+ if (p->type == type)
+ return p;
+ }
+ return 0;
+}
+
+rtems_id
+rtems_monitor_object_canonical_next_remote(
+ rtems_monitor_object_type_t type,
+ rtems_id id,
+ void *canonical
+)
+{
+ rtems_id next_id;
+ rtems_status_code status;
+ rtems_monitor_server_request_t request;
+ rtems_monitor_server_response_t response;
+
+ /*
+ * Send request
+ */
+
+ request.command = RTEMS_MONITOR_SERVER_CANONICAL;
+ request.argument0 = (unsigned32) type;
+ request.argument1 = (unsigned32) id;
+
+ status = rtems_monitor_server_request(rtems_get_node(id), &request, &response);
+ if (status != RTEMS_SUCCESSFUL)
+ goto failed;
+
+ /*
+ * process response
+ */
+
+ next_id = (rtems_id) response.result0;
+ if (next_id != RTEMS_OBJECT_ID_FINAL)
+ (void) memcpy(canonical, &response.payload, response.result1);
+
+ return next_id;
+
+failed:
+ return RTEMS_OBJECT_ID_FINAL;
+
+}
+
+
+rtems_id
+rtems_monitor_object_canonical_next(
+ rtems_monitor_object_info_t *info,
+ rtems_id id,
+ void *canonical
+)
+{
+ rtems_id next_id;
+ void *raw_item;
+
+ if ( ! _Objects_Is_local_id(id))
+ next_id = rtems_monitor_object_canonical_next_remote(info->type,
+ id,
+ canonical);
+ else
+ {
+ next_id = id;
+
+ raw_item = (void *) info->next(info->object_information,
+ canonical,
+ &next_id);
+
+ if (raw_item)
+ {
+ info->canonical(canonical, raw_item);
+ _Thread_Enable_dispatch();
+ }
+ }
+ return next_id;
+}
+
+
+/*
+ * this is routine server invokes locally to get the type
+ */
+
+rtems_id
+rtems_monitor_object_canonical_get(
+ rtems_monitor_object_type_t type,
+ rtems_id id,
+ void *canonical,
+ unsigned32 *size_p
+)
+{
+ rtems_monitor_object_info_t *info;
+ rtems_id next_id;
+
+ *size_p = 0;
+
+ info = rtems_monitor_object_lookup(type);
+
+ if (info == 0)
+ return RTEMS_OBJECT_ID_FINAL;
+
+ next_id = rtems_monitor_object_canonical_next(info, id, canonical);
+ *size_p = info->size;
+
+ return next_id;
+}
+
+
+void
+rtems_monitor_object_dump_1(
+ rtems_monitor_object_info_t *info,
+ rtems_id id,
+ boolean verbose
+)
+{
+ rtems_id next_id;
+ rtems_monitor_union_t canonical;
+
+ if ((next_id = rtems_monitor_object_canonical_next(
+ info,
+ id,
+ &canonical)) != RTEMS_OBJECT_ID_FINAL)
+ {
+ /*
+ * If the one we actually got is the one we wanted, then
+ * print it out.
+ * For ones that have an id field, this works fine,
+ * for all others, always dump it out.
+ *
+ * HACK: the way we determine whether there is an id is a hack.
+ *
+ * by the way: the reason we try to not have an id, is that some
+ * of the canonical structures are almost too big for shared
+ * memory driver (eg: mpci)
+ */
+
+ if ((info->next != rtems_monitor_manager_next) ||
+ (id == canonical.generic.id))
+ info->dump(&canonical, verbose);
+ }
+}
+
+void
+rtems_monitor_object_dump_all(
+ rtems_monitor_object_info_t *info,
+ boolean verbose
+)
+{
+ rtems_id next_id;
+ rtems_monitor_union_t canonical;
+
+ next_id = RTEMS_OBJECT_ID_INITIAL(info->type, rtems_monitor_default_node);
+
+ while ((next_id = rtems_monitor_object_canonical_next(
+ info,
+ next_id,
+ &canonical)) != RTEMS_OBJECT_ID_FINAL)
+ {
+ info->dump(&canonical, verbose);
+ }
+}
+
+void
+rtems_monitor_object_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_monitor_object_info_t *info = 0;
+ rtems_monitor_object_type_t type = (rtems_monitor_object_type_t) command_arg;
+
+ /* what is the default type? */
+ type = (rtems_monitor_object_type_t) command_arg;
+
+ if (argc == 1)
+ {
+ if (type == RTEMS_MONITOR_OBJECT_INVALID)
+ {
+ printf("A type must be specified to \"dump all\"\n");
+ goto done;
+ }
+
+ info = rtems_monitor_object_lookup(type);
+ if (info == 0)
+ goto not_found;
+
+ if (info->dump_header)
+ info->dump_header(verbose);
+ rtems_monitor_object_dump_all(info, verbose);
+ }
+ else
+ {
+ unsigned32 default_node = rtems_monitor_default_node;
+ rtems_monitor_object_type_t last_type = RTEMS_MONITOR_OBJECT_INVALID;
+ rtems_id id;
+
+ for (arg=1; argv[arg]; arg++)
+ {
+ id = (rtems_id) strtoul(argv[arg], 0, 16);
+ id = rtems_monitor_id_fixup(id, default_node, type);
+ type = (rtems_monitor_object_type_t) rtems_get_class(id);
+
+ /*
+ * Allow the item type to change in the middle
+ * of the command. If the type changes, then
+ * just dump out a new header and keep on going.
+ */
+ if (type != last_type)
+ {
+ info = rtems_monitor_object_lookup(type);
+ if (info == 0)
+ goto not_found;
+
+ if (info->dump_header)
+ info->dump_header(verbose);
+ }
+
+ if (info == 0)
+ {
+not_found: printf("Invalid or unsupported type %d\n", type);
+ goto done;
+ }
+
+ rtems_monitor_object_dump_1(info, id, verbose);
+
+ default_node = rtems_get_node(id);
+
+ last_type = type;
+ }
+ }
+done:
+ return;
+}
diff --git a/c/src/lib/libmisc/monitor/mon-prmisc.c b/c/src/lib/libmisc/monitor/mon-prmisc.c
new file mode 100644
index 0000000000..3c7dc62d9a
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-prmisc.c
@@ -0,0 +1,254 @@
+/*
+ * Print misc stuff for the monitor dump routines
+ * Each routine returns the number of characters it output.
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <ctype.h>
+
+void
+rtems_monitor_separator(void)
+{
+ printf("------------------------------------------------------------------------------\n");
+}
+
+unsigned32
+rtems_monitor_pad(
+ unsigned32 destination_column,
+ unsigned32 current_column
+)
+{
+ int pad_length;
+
+ if (destination_column <= current_column)
+ pad_length = 1;
+ else
+ pad_length = destination_column - current_column;
+
+ return printf("%*s", pad_length, "");
+}
+
+unsigned32
+rtems_monitor_dump_char(rtems_unsigned8 ch)
+{
+ if (isprint(ch))
+ return printf("%c", ch);
+ else
+ return printf("%02x", ch);
+}
+
+unsigned32
+rtems_monitor_dump_decimal(unsigned32 num)
+{
+ return printf("%4d", num);
+}
+
+unsigned32
+rtems_monitor_dump_hex(unsigned32 num)
+{
+ return printf("0x%x", num);
+}
+
+unsigned32
+rtems_monitor_dump_assoc_bitfield(
+ rtems_assoc_t *ap,
+ char *separator,
+ unsigned32 value
+ )
+{
+ unsigned32 b;
+ unsigned32 length = 0;
+ const char *name;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (length)
+ length += printf("%s", separator);
+
+ name = rtems_assoc_name_by_local(ap, b);
+
+ if (name)
+ length += printf("%s", name);
+ else
+ length += printf("0x%x", b);
+ }
+
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_id(rtems_id id)
+{
+ return printf("%08x", id);
+}
+
+unsigned32
+rtems_monitor_dump_name(rtems_name name)
+{
+ unsigned32 i;
+ unsigned32 length = 0;
+ union {
+ unsigned32 ui;
+ char c[4];
+ } u;
+
+ u.ui = (rtems_unsigned32) name;
+
+ for (i=0; i<sizeof(u.c); i++)
+ length += rtems_monitor_dump_char(u.c[i]);
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_priority(rtems_task_priority priority)
+{
+ return printf("%3d", priority);
+}
+
+
+rtems_assoc_t rtems_monitor_state_assoc[] = {
+ { "DORM", STATES_DORMANT },
+ { "SUSP", STATES_SUSPENDED },
+ { "TRANS", STATES_TRANSIENT },
+ { "DELAY", STATES_DELAYING },
+ { "Wbuf", STATES_WAITING_FOR_BUFFER },
+ { "Wseg", STATES_WAITING_FOR_SEGMENT },
+ { "Wmsg" , STATES_WAITING_FOR_MESSAGE },
+ { "Wevnt", STATES_WAITING_FOR_EVENT },
+ { "Wsem", STATES_WAITING_FOR_SEMAPHORE },
+ { "Wtime", STATES_WAITING_FOR_TIME },
+ { "Wrpc", STATES_WAITING_FOR_RPC_REPLY },
+ { "WRATE", STATES_WAITING_FOR_PERIOD },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_state(States_Control state)
+{
+ unsigned32 length = 0;
+
+ if (state == STATES_READY) /* assoc doesn't deal with this as it is 0 */
+ length += printf("READY");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_state_assoc,
+ ":",
+ state);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_attribute_assoc[] = {
+ { "FL", RTEMS_FLOATING_POINT },
+ { "GL", RTEMS_GLOBAL },
+ { "PR", RTEMS_PRIORITY },
+ { "BI", RTEMS_BINARY_SEMAPHORE },
+ { "IN", RTEMS_INHERIT_PRIORITY },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_attributes(rtems_attribute attributes)
+{
+ unsigned32 length = 0;
+
+ if (attributes == RTEMS_DEFAULT_ATTRIBUTES) /* value is 0 */
+ length += printf("DEFAULT");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_attribute_assoc,
+ ":",
+ attributes);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_modes_assoc[] = {
+ { "nP", RTEMS_NO_PREEMPT },
+ { "T", RTEMS_TIMESLICE },
+ { "nA", RTEMS_NO_ASR },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_modes(rtems_mode modes)
+{
+ unsigned32 length = 0;
+
+ if (modes == RTEMS_DEFAULT_MODES) /* value is 0 */
+ length += printf("P:T:nA");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_modes_assoc,
+ ":",
+ modes);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_events_assoc[] = {
+ { "0", RTEMS_EVENT_0 },
+ { "1", RTEMS_EVENT_1 },
+ { "2", RTEMS_EVENT_2 },
+ { "3", RTEMS_EVENT_3 },
+ { "4", RTEMS_EVENT_4 },
+ { "5", RTEMS_EVENT_5 },
+ { "6", RTEMS_EVENT_6 },
+ { "7", RTEMS_EVENT_7 },
+ { "8", RTEMS_EVENT_8 },
+ { "9", RTEMS_EVENT_9 },
+ { "10", RTEMS_EVENT_10 },
+ { "11", RTEMS_EVENT_11 },
+ { "12", RTEMS_EVENT_12 },
+ { "13", RTEMS_EVENT_13 },
+ { "14", RTEMS_EVENT_14 },
+ { "15", RTEMS_EVENT_15 },
+ { "16", RTEMS_EVENT_16 },
+ { "17", RTEMS_EVENT_17 },
+ { "18", RTEMS_EVENT_18 },
+ { "19", RTEMS_EVENT_19 },
+ { "20", RTEMS_EVENT_20 },
+ { "21", RTEMS_EVENT_21 },
+ { "22", RTEMS_EVENT_22 },
+ { "23", RTEMS_EVENT_23 },
+ { "24", RTEMS_EVENT_24 },
+ { "25", RTEMS_EVENT_25 },
+ { "26", RTEMS_EVENT_26 },
+ { "27", RTEMS_EVENT_27 },
+ { "28", RTEMS_EVENT_28 },
+ { "29", RTEMS_EVENT_29 },
+ { "30", RTEMS_EVENT_30 },
+ { "31", RTEMS_EVENT_31 },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_events(rtems_event_set events)
+{
+ unsigned32 length = 0;
+
+ if (events == EVENT_SETS_NONE_PENDING) /* value is 0 */
+ length += printf("NONE");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_events_assoc,
+ ":",
+ events);
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_notepad(unsigned32 *notepad)
+{
+ unsigned32 length = 0;
+ int i;
+
+ for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
+ if (notepad[i])
+ length += printf("%d: 0x%x ", i, notepad[i]);
+
+ return length;
+}
diff --git a/c/src/lib/libmisc/monitor/mon-queue.c b/c/src/lib/libmisc/monitor/mon-queue.c
new file mode 100644
index 0000000000..08c1d9474e
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-queue.c
@@ -0,0 +1,64 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+void
+rtems_monitor_queue_canonical(
+ rtems_monitor_queue_t *canonical_queue,
+ void *queue_void
+)
+{
+ Message_queue_Control *rtems_queue = (Message_queue_Control *) queue_void;
+
+ canonical_queue->attributes = rtems_queue->attribute_set;
+ canonical_queue->maximum_message_size = rtems_queue->message_queue.maximum_message_size;
+ canonical_queue->maximum_pending_messages = rtems_queue->message_queue.maximum_pending_messages;
+ canonical_queue->number_of_pending_messages = rtems_queue->message_queue.number_of_pending_messages;
+}
+
+void
+rtems_monitor_queue_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME ATTRIBUTES PEND MAXPEND MAXSIZE\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+
+/*
+ * Dump out the "next" queue indicated by 'id'.
+ * Returns next one to check.
+ * Returns RTEMS_OBJECT_ID_FINAL when all done
+ */
+
+void
+rtems_monitor_queue_dump(
+ rtems_monitor_queue_t *monitor_queue,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_dump_id(monitor_queue->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_queue->name);
+ length += rtems_monitor_pad(19, length);
+ length += rtems_monitor_dump_attributes(monitor_queue->attributes);
+ length += rtems_monitor_pad(31, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->number_of_pending_messages);
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->maximum_pending_messages);
+ length += rtems_monitor_pad(48, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->maximum_message_size);
+
+ printf("\n");
+}
diff --git a/c/src/lib/libmisc/monitor/mon-server.c b/c/src/lib/libmisc/monitor/mon-server.c
new file mode 100644
index 0000000000..af155684fb
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-server.c
@@ -0,0 +1,303 @@
+/*
+ * RTEMS monitor server (handles requests for info from RTEMS monitors
+ * running on other nodes)
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "monitor.h"
+
+/*
+ * Various id's for the server
+ */
+
+rtems_id rtems_monitor_server_task_id;
+rtems_id rtems_monitor_server_request_queue_id; /* our server */
+rtems_id *rtems_monitor_server_request_queue_ids; /* all servers */
+rtems_id rtems_monitor_server_response_queue_id; /* our server */
+
+
+/*
+ * Send a request to a server task
+ */
+
+rtems_status_code
+rtems_monitor_server_request(
+ unsigned32 server_node,
+ rtems_monitor_server_request_t *request,
+ rtems_monitor_server_response_t *response
+)
+{
+ rtems_id server_id;
+ rtems_status_code status;
+ unsigned32 size;
+
+ /*
+ * What is id of monitor on target node?
+ * Look it up if we don't know it yet.
+ */
+
+ server_id = rtems_monitor_server_request_queue_ids[server_node];
+ if (server_id == 0)
+ {
+ status = rtems_message_queue_ident(RTEMS_MONITOR_QUEUE_NAME,
+ server_node,
+ &server_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "ident of remote server failed");
+ goto done;
+ }
+
+ rtems_monitor_server_request_queue_ids[server_node] = server_id;
+ }
+
+ request->return_id = rtems_monitor_server_response_queue_id;
+
+ status = rtems_message_queue_send(server_id, request, sizeof(*request));
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "monitor server request send failed");
+ goto done;
+ }
+
+ /*
+ * Await response, if requested
+ */
+
+ if (response)
+ {
+ status = rtems_message_queue_receive(rtems_monitor_server_response_queue_id,
+ response,
+ &size,
+ RTEMS_WAIT,
+ 100);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "server did not respond");
+
+ /* maybe server task was restarted; look it up again next time */
+ rtems_monitor_server_request_queue_ids[server_node] = 0;
+
+ goto done;
+ }
+
+ if (response->command != RTEMS_MONITOR_SERVER_RESPONSE)
+ {
+ status = RTEMS_INCORRECT_STATE;
+ goto done;
+ }
+ }
+
+done:
+ return status;
+}
+
+
+
+/*
+ * monitor server task
+ */
+
+void
+rtems_monitor_server_task(
+ rtems_task_argument monitor_flags
+)
+{
+ rtems_monitor_server_request_t request;
+ rtems_monitor_server_response_t response;
+ rtems_status_code status;
+ unsigned32 size;
+
+ for (;;)
+ {
+ status = rtems_message_queue_receive(
+ rtems_monitor_server_request_queue_id,
+ &request,
+ &size,
+ RTEMS_WAIT,
+ (rtems_interval) 0);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "monitor server msg queue receive error");
+ goto failed;
+ }
+
+ if (size != sizeof(request))
+ {
+ rtems_error(0, "monitor server bad size on receive");
+ goto failed;
+ }
+
+ switch (request.command)
+ {
+ case RTEMS_MONITOR_SERVER_CANONICAL:
+ {
+ rtems_monitor_object_type_t object_type;
+ rtems_id id;
+ rtems_id next_id;
+
+ object_type = (rtems_monitor_object_type_t) request.argument0;
+ id = (rtems_id) request.argument1;
+ next_id = rtems_monitor_object_canonical_get(object_type,
+ id,
+ &response.payload,
+ &size);
+
+ response.command = RTEMS_MONITOR_SERVER_RESPONSE;
+ response.result0 = next_id;
+ response.result1 = size;
+
+#define SERVER_OVERHEAD (RTEMS_offsetof(rtems_monitor_server_response_t, \
+ payload))
+
+ status = rtems_message_queue_send(request.return_id,
+ &response,
+ size + SERVER_OVERHEAD);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "response send failed");
+ goto failed;
+ }
+ break;
+ }
+
+ default:
+ {
+ rtems_error(0, "invalid command to monitor server: %d", request.command);
+ goto failed;
+ }
+ }
+ }
+
+failed:
+ rtems_task_delete(RTEMS_SELF);
+}
+
+
+/*
+ * Kill off any old server
+ * Not sure if this is useful, but it doesn't help
+ */
+
+void
+rtems_monitor_server_kill(void)
+{
+ if (rtems_monitor_server_task_id)
+ rtems_task_delete(rtems_monitor_server_task_id);
+ rtems_monitor_task_id = 0;
+
+ if (rtems_monitor_server_request_queue_id)
+ rtems_message_queue_delete(rtems_monitor_server_request_queue_id);
+ rtems_monitor_server_response_queue_id = 0;
+
+ if (rtems_monitor_server_response_queue_id)
+ rtems_message_queue_delete(rtems_monitor_server_response_queue_id);
+ rtems_monitor_server_request_queue_ids = 0;
+
+ if (rtems_monitor_server_request_queue_ids)
+ free(rtems_monitor_server_request_queue_ids);
+ rtems_monitor_server_request_queue_ids = 0;
+}
+
+
+void
+rtems_monitor_server_init(
+ unsigned32 monitor_flags
+)
+{
+ rtems_status_code status;
+
+ if (_System_state_Is_multiprocessing &&
+ (_Configuration_MP_table->maximum_nodes > 1))
+ {
+ unsigned32 maximum_nodes = _Configuration_MP_table->maximum_nodes;
+
+ /*
+ * create the msg que our server will listen
+ * Since we only get msgs from other RTEMS monitors, we just
+ * need reserve space for 1 msg from each node.
+ */
+
+ status = rtems_message_queue_create(
+ RTEMS_MONITOR_QUEUE_NAME,
+ maximum_nodes,
+ sizeof(rtems_monitor_server_request_t),
+ RTEMS_GLOBAL,
+ &rtems_monitor_server_request_queue_id);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor server message queue");
+ goto done;
+ }
+
+ /*
+ * create the msg que our responses will come on
+ * Since monitor just does one thing at a time, we only need 1 item
+ * message queue.
+ */
+
+ status = rtems_message_queue_create(
+ RTEMS_MONITOR_RESPONSE_QUEUE_NAME,
+ 1, /* depth */
+ sizeof(rtems_monitor_server_response_t),
+ RTEMS_GLOBAL,
+ &rtems_monitor_server_response_queue_id);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor response message queue");
+ goto done;
+ }
+
+ /* need an id for queue of each other server we might talk to */
+ /* indexed by node, so add 1 to maximum_nodes */
+ rtems_monitor_server_request_queue_ids =
+ (rtems_id *) malloc((maximum_nodes + 1) * sizeof(rtems_id));
+ (void) memset(rtems_monitor_server_request_queue_ids,
+ 0,
+ (maximum_nodes + 1) * sizeof(rtems_id));
+
+ rtems_monitor_server_request_queue_ids[rtems_monitor_node] =
+ rtems_monitor_server_request_queue_id;
+
+ /*
+ * create the server task
+ */
+ status = rtems_task_create(RTEMS_MONITOR_SERVER_NAME,
+ 1,
+ 0 /* default stack */,
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &rtems_monitor_server_task_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor server task");
+ goto done;
+ }
+
+ /*
+ * Start the server task
+ */
+ status = rtems_task_start(rtems_monitor_server_task_id,
+ rtems_monitor_server_task,
+ monitor_flags);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not start monitor server");
+ goto done;
+ }
+ }
+
+done:
+ return;
+}
diff --git a/c/src/lib/libmisc/monitor/mon-symbols.c b/c/src/lib/libmisc/monitor/mon-symbols.c
new file mode 100644
index 0000000000..6c6589d38f
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-symbols.c
@@ -0,0 +1,481 @@
+/*
+ * File: symbols.c
+ *
+ * Description:
+ * Symbol table manager for the RTEMS monitor.
+ * These routines may be used by other system resources also.
+ *
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "monitor.h"
+#include "symbols.h"
+
+
+rtems_symbol_table_t *
+rtems_symbol_table_create()
+{
+ rtems_symbol_table_t *table;
+
+ table = (rtems_symbol_table_t *) malloc(sizeof(rtems_symbol_table_t));
+ memset((void *) table, 0, sizeof(*table));
+
+ table->growth_factor = 30; /* 30 percent */
+
+ return table;
+}
+
+void
+rtems_symbol_table_destroy(rtems_symbol_table_t *table)
+{
+ rtems_symbol_string_block_t *p, *pnext;
+
+ if (table)
+ {
+ if (table->addresses)
+ (void) free(table->addresses);
+ table->addresses = 0;
+ p = table->string_buffer_head;
+ while (p)
+ {
+ pnext = p->next;
+ free(p);
+ p = pnext;
+ }
+ table->string_buffer_head = 0;
+ table->string_buffer_current = 0;
+
+ free(table);
+ }
+}
+
+rtems_symbol_t *
+rtems_symbol_create(
+ rtems_symbol_table_t *table,
+ char *name,
+ rtems_unsigned32 value
+ )
+{
+ int symbol_length;
+ size_t newsize;
+ rtems_symbol_t *sp;
+
+ symbol_length = strlen(name) + 1; /* include '\000' in length */
+
+ /* need to grow the table? */
+ if (table->next >= table->size)
+ {
+ if (table->size == 0)
+ newsize = 100;
+ else
+ newsize = table->size + (table->size / (100 / table->growth_factor));
+
+ table->addresses = (rtems_symbol_t *) realloc((void *) table->addresses, newsize * sizeof(rtems_symbol_t));
+ if (table->addresses == 0) /* blew it; lost orig */
+ goto failed;
+ table->size = newsize;
+ }
+
+ sp = &table->addresses[table->next];
+ sp->value = value;
+
+ /* Have to add it to string pool */
+ /* need to grow pool? */
+
+ if ((table->string_buffer_head == 0) ||
+ (table->strings_next + symbol_length) >= SYMBOL_STRING_BLOCK_SIZE)
+ {
+ rtems_symbol_string_block_t *p;
+
+ p = (rtems_symbol_string_block_t *) malloc(sizeof(rtems_symbol_string_block_t));
+ if (p == 0)
+ goto failed;
+ p->next = 0;
+ if (table->string_buffer_head == 0)
+ table->string_buffer_head = p;
+ else
+ table->string_buffer_current->next = p;
+ table->string_buffer_current = p;
+
+ table->strings_next = 0;
+ }
+
+ sp->name = table->string_buffer_current->buffer + table->strings_next;
+ (void) strcpy(sp->name, name);
+
+ table->strings_next += symbol_length;
+ table->sorted = 0;
+ table->next++;
+
+ return sp;
+
+/* XXX Not sure what to do here. We've possibly destroyed the initial
+ symbol table due to realloc failure */
+failed:
+ return 0;
+}
+
+/*
+ * Qsort entry point for compare by address
+ */
+
+static int
+rtems_symbol_compare(const void *e1,
+ const void *e2)
+{
+ rtems_symbol_t *s1, *s2;
+ s1 = (rtems_symbol_t *) e1;
+ s2 = (rtems_symbol_t *) e2;
+
+ if (s1->value < s2->value)
+ return -1;
+ if (s1->value > s2->value)
+ return 1;
+ return 0;
+}
+
+
+/*
+ * Sort the symbol table using qsort
+ */
+
+static void
+rtems_symbol_sort(rtems_symbol_table_t *table)
+{
+ qsort((void *) table->addresses, (size_t) table->next,
+ sizeof(rtems_symbol_t), rtems_symbol_compare);
+ table->sorted = 1;
+}
+
+
+/*
+ * Search the symbol table by address
+ * This code based on CYGNUS newlib bsearch, but changed
+ * to allow for finding closest symbol <= key
+ */
+
+rtems_symbol_t *
+rtems_symbol_value_lookup(
+ rtems_symbol_table_t *table,
+ rtems_unsigned32 value
+ )
+{
+ rtems_symbol_t *sp;
+ rtems_symbol_t *base;
+ rtems_symbol_t *best = 0;
+ rtems_unsigned32 distance;
+ rtems_unsigned32 best_distance = ~0;
+ rtems_unsigned32 elements;
+
+ if (table == 0)
+ table = rtems_monitor_symbols;
+
+ if ((table == 0) || (table->size == 0))
+ return 0;
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ base = table->addresses;
+ elements = table->next;
+
+ while (elements)
+ {
+ sp = base + (elements / 2);
+ if (value < sp->value)
+ elements /= 2;
+ else if (value > sp->value)
+ {
+ distance = value - sp->value;
+ if (distance < best_distance)
+ {
+ best_distance = distance;
+ best = sp;
+ }
+ base = sp + 1;
+ elements = (elements / 2) - (elements % 2 ? 0 : 1);
+ }
+ else
+ return sp;
+ }
+
+ if (value == base->value)
+ return base;
+
+ return best;
+}
+
+/*
+ * Search the symbol table for the exact matching address.
+ * If the symbol table has already been sorted, then
+ * call the regular symbol value lookup, however, it it
+ * has not yet been sorted, search it sequentially.
+ * This routine is primarily used for low level symbol
+ * lookups (eg. from exception handler and interrupt routines)
+ * where the penality of sorted is not wanted and where
+ * an exact match is needed such that symbol table order
+ * is not important.
+ */
+const rtems_symbol_t *
+rtems_symbol_value_lookup_exact(
+ rtems_symbol_table_t *table,
+ rtems_unsigned32 value
+ )
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return NULL;
+ }
+
+ if (table->sorted)
+ {
+ sp = rtems_symbol_value_lookup(table, value);
+ if ( rtems_symbol_value(sp) == value )
+ return sp;
+ else
+ return NULL; /* not an exact match */
+ }
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ if ( sp->value == value )
+ return sp;
+ }
+
+ return NULL;
+
+}
+
+
+/*
+ * Search the symbol table by string name (case independent)
+ */
+
+rtems_symbol_t *
+rtems_symbol_name_lookup(
+ rtems_symbol_table_t *table,
+ char *name
+ )
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return NULL;
+ }
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ if ( strcasecmp(sp->name, name) == 0 )
+ return sp;
+ }
+
+ return NULL;
+}
+
+void *
+rtems_monitor_symbol_next(
+ void *object_info,
+ rtems_monitor_symbol_t *canonical,
+ rtems_id *next_id
+)
+{
+ rtems_symbol_table_t *table;
+ int n = rtems_get_index(*next_id);
+
+ table = *(rtems_symbol_table_t **) object_info;
+ if (table == 0)
+ goto failed;
+
+ if (n >= table->next)
+ goto failed;
+
+ /* NOTE: symbols do not have id and name fields */
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) (table->addresses + n);
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+void
+rtems_monitor_symbol_canonical(
+ rtems_monitor_symbol_t *canonical_symbol,
+ rtems_symbol_t *sp
+)
+{
+ canonical_symbol->value = sp->value;
+ canonical_symbol->offset = 0;
+ strncpy(canonical_symbol->name, sp->name, sizeof(canonical_symbol->name));
+}
+
+
+void
+rtems_monitor_symbol_canonical_by_name(
+ rtems_monitor_symbol_t *canonical_symbol,
+ char *name
+)
+{
+ rtems_symbol_t *sp;
+
+ sp = rtems_symbol_name_lookup(0, name);
+
+ canonical_symbol->value = sp ? sp->value : 0;
+
+ strncpy(canonical_symbol->name, name, sizeof(canonical_symbol->name));
+ canonical_symbol->offset = 0;
+}
+
+void
+rtems_monitor_symbol_canonical_by_value(
+ rtems_monitor_symbol_t *canonical_symbol,
+ void *value_void_p
+)
+{
+ unsigned32 value = (unsigned32) value_void_p;
+ rtems_symbol_t *sp;
+
+ sp = rtems_symbol_value_lookup(0, value);
+ if (sp)
+ {
+ canonical_symbol->value = sp->value;
+ canonical_symbol->offset = value - sp->value;
+ strncpy(canonical_symbol->name, sp->name, sizeof(canonical_symbol->name));
+ }
+ else
+ {
+ canonical_symbol->value = value;
+ canonical_symbol->offset = 0;
+ canonical_symbol->name[0] = '\0';
+ }
+}
+
+
+unsigned32
+rtems_monitor_symbol_dump(
+ rtems_monitor_symbol_t *canonical_symbol,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ /*
+ * print the name if it exists AND if value is non-zero
+ * Ie: don't print some garbage symbol for address 0
+ */
+
+ if (canonical_symbol->name[0] && (canonical_symbol->value != 0))
+ {
+ if (canonical_symbol->offset == 0)
+ length += printf("%.*s",
+ (int) sizeof(canonical_symbol->name),
+ canonical_symbol->name);
+ else
+ length += printf("<%.*s+0x%x>",
+ (int) sizeof(canonical_symbol->name),
+ canonical_symbol->name,
+ canonical_symbol->offset);
+ if (verbose)
+ length += printf(" [0x%x]", canonical_symbol->value);
+ }
+ else
+ length += printf("[0x%x]", canonical_symbol->value);
+
+ return length;
+}
+
+
+void
+rtems_monitor_symbol_dump_all(
+ rtems_symbol_table_t *table,
+ boolean verbose
+)
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return;
+ }
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ rtems_monitor_symbol_t canonical_symbol;
+
+ rtems_monitor_symbol_canonical(&canonical_symbol, sp);
+ rtems_monitor_symbol_dump(&canonical_symbol, TRUE);
+ printf("\n");
+ }
+}
+
+
+/*
+ * 'symbol' command
+ */
+
+void
+rtems_monitor_symbol_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_symbol_table_t *table;
+
+ table = *(rtems_symbol_table_t **) command_arg;
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return;
+ }
+
+ /*
+ * Use object command to dump out whole symbol table
+ */
+ if (argc == 1)
+ rtems_monitor_symbol_dump_all(table, verbose);
+ else
+ {
+ rtems_monitor_symbol_t canonical_symbol;
+
+ for (arg=1; argv[arg]; arg++)
+ {
+ rtems_monitor_symbol_canonical_by_name(&canonical_symbol, argv[arg]);
+ rtems_monitor_symbol_dump(&canonical_symbol, verbose);
+ printf("\n");
+ }
+ }
+}
diff --git a/c/src/lib/libmisc/monitor/mon-task.c b/c/src/lib/libmisc/monitor/mon-task.c
new file mode 100644
index 0000000000..9592d9d99b
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/mon-task.c
@@ -0,0 +1,93 @@
+/*
+ * RTEMS Monitor task support
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <string.h> /* memcpy() */
+
+void
+rtems_monitor_task_canonical(
+ rtems_monitor_task_t *canonical_task,
+ void *thread_void
+)
+{
+ 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;
+ canonical_task->stack = rtems_thread->Start.Initial_stack.area;
+ canonical_task->stack_size = rtems_thread->Start.Initial_stack.size;
+ 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 = 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));
+*/
+}
+
+
+void
+rtems_monitor_task_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME PRIO STAT MODES EVENTS WAITID WAITARG NOTES\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+/*
+ */
+
+void
+rtems_monitor_task_dump(
+ rtems_monitor_task_t *monitor_task,
+ boolean verbose
+)
+{
+ int length = 0;
+
+ length += rtems_monitor_dump_id(monitor_task->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_task->name);
+ length += rtems_monitor_pad(18, length);
+ length += rtems_monitor_dump_priority(monitor_task->priority);
+ length += rtems_monitor_pad(24, length);
+ length += rtems_monitor_dump_state(monitor_task->state);
+ length += rtems_monitor_pad(31, length);
+ length += rtems_monitor_dump_modes(monitor_task->modes);
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_events(monitor_task->events);
+ if (monitor_task->wait_id)
+ {
+ length += rtems_monitor_pad(47, length);
+ length += rtems_monitor_dump_id(monitor_task->wait_id);
+ length += rtems_monitor_pad(57, length);
+ length += rtems_monitor_dump_hex(monitor_task->wait_args);
+ }
+
+ length += rtems_monitor_pad(65, length);
+ length += rtems_monitor_dump_notepad(monitor_task->notepad);
+ printf("\n");
+}
+
diff --git a/c/src/lib/libmisc/monitor/monitor.h b/c/src/lib/libmisc/monitor/monitor.h
new file mode 100644
index 0000000000..1844add643
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/monitor.h
@@ -0,0 +1,443 @@
+/*
+ * File: monitor.h
+ *
+ * Description:
+ * The RTEMS monitor task include file.
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#ifndef __MONITOR_H
+#define __MONITOR_H
+
+#include "symbols.h"
+#include <rtems/error.h> /* rtems_error() */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Monitor types are derived from rtems object classes
+ */
+
+typedef enum {
+ RTEMS_MONITOR_OBJECT_INVALID = OBJECTS_NO_CLASS,
+ RTEMS_MONITOR_OBJECT_TASK = OBJECTS_RTEMS_TASKS,
+ RTEMS_MONITOR_OBJECT_EXTENSION = OBJECTS_RTEMS_EXTENSIONS,
+ RTEMS_MONITOR_OBJECT_QUEUE = OBJECTS_RTEMS_MESSAGE_QUEUES,
+ RTEMS_MONITOR_OBJECT_SEMAPHORE = OBJECTS_RTEMS_SEMAPHORES,
+ RTEMS_MONITOR_OBJECT_PARTITION = OBJECTS_RTEMS_PARTITIONS,
+ RTEMS_MONITOR_OBJECT_REGION = OBJECTS_RTEMS_REGIONS,
+ RTEMS_MONITOR_OBJECT_PORT = OBJECTS_RTEMS_PORTS,
+
+ /* following monitor objects are not known to RTEMS, but
+ * we like to have "types" for them anyway */
+
+ RTEMS_MONITOR_OBJECT_DRIVER = OBJECTS_CLASSES_LAST+1,
+ RTEMS_MONITOR_OBJECT_DNAME,
+ RTEMS_MONITOR_OBJECT_CONFIG,
+ RTEMS_MONITOR_OBJECT_INIT_TASK,
+ RTEMS_MONITOR_OBJECT_MPCI,
+ RTEMS_MONITOR_OBJECT_SYMBOL
+} rtems_monitor_object_type_t;
+
+/*
+ * rtems_monitor_init() flags
+ */
+
+#define RTEMS_MONITOR_SUSPEND 0x0001 /* suspend monitor on startup */
+#define RTEMS_MONITOR_GLOBAL 0x0002 /* monitor should be global */
+
+
+/*
+ * Public interfaces for RTEMS data structures monitor is aware of.
+ * These are only used by the monitor.
+ *
+ * NOTE:
+ * All the canonical objects that correspond to RTEMS managed "objects"
+ * must have an identical first portion with 'id' and 'name' fields.
+ *
+ * Others do not have that restriction, even tho we would like them to.
+ * This is because some of the canonical structures are almost too big
+ * for shared memory driver (eg: mpci) and we are nickel and diming it.
+ */
+
+/*
+ * Type of a pointer that may be a symbol
+ */
+
+#define MONITOR_SYMBOL_LEN 20
+typedef struct {
+ char name[MONITOR_SYMBOL_LEN];
+ unsigned32 value;
+ unsigned32 offset;
+} rtems_monitor_symbol_t;
+
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+} rtems_monitor_generic_t;
+
+/*
+ * Task
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ Thread_Entry entry;
+ unsigned32 argument;
+ void *stack;
+ unsigned32 stack_size;
+ rtems_task_priority priority;
+ States_Control state;
+ rtems_event_set events;
+ rtems_mode modes;
+ rtems_attribute attributes;
+ unsigned32 notepad[RTEMS_NUMBER_NOTEPADS];
+ rtems_id wait_id;
+ unsigned32 wait_args;
+} rtems_monitor_task_t;
+
+/*
+ * Init task
+ */
+
+typedef struct {
+ rtems_id id; /* not really an id */
+ rtems_name name;
+ /* end of common portion */
+ rtems_monitor_symbol_t entry;
+ unsigned32 argument;
+ unsigned32 stack_size;
+ rtems_task_priority priority;
+ rtems_mode modes;
+ rtems_attribute attributes;
+} rtems_monitor_init_task_t;
+
+
+/*
+ * Message queue
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ rtems_attribute attributes;
+ unsigned32 number_of_pending_messages;
+ unsigned32 maximum_pending_messages;
+ unsigned32 maximum_message_size;
+} rtems_monitor_queue_t;
+
+/*
+ * Extension
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ rtems_monitor_symbol_t e_create;
+ rtems_monitor_symbol_t e_start;
+ rtems_monitor_symbol_t e_restart;
+ rtems_monitor_symbol_t e_delete;
+ rtems_monitor_symbol_t e_tswitch;
+ rtems_monitor_symbol_t e_begin;
+ rtems_monitor_symbol_t e_exitted;
+ rtems_monitor_symbol_t e_fatal;
+} rtems_monitor_extension_t;
+
+/*
+ * Device driver
+ */
+
+typedef struct {
+ rtems_id id; /* not really an id (should be tho) */
+ rtems_name name; /* ditto */
+ /* end of common portion */
+ rtems_monitor_symbol_t initialization; /* initialization procedure */
+ rtems_monitor_symbol_t open; /* open request procedure */
+ rtems_monitor_symbol_t close; /* close request procedure */
+ rtems_monitor_symbol_t read; /* read request procedure */
+ rtems_monitor_symbol_t write; /* write request procedure */
+ rtems_monitor_symbol_t control; /* special functions procedure */
+} rtems_monitor_driver_t;
+
+typedef struct {
+ rtems_id id; /* not used for drivers (yet) */
+ rtems_name name; /* not used for drivers (yet) */
+ /* end of common portion */
+ unsigned32 major;
+ unsigned32 minor;
+ char name_string[64];
+} rtems_monitor_dname_t;
+
+/*
+ * System config
+ */
+
+typedef struct {
+ void *work_space_start;
+ unsigned32 work_space_size;
+ unsigned32 maximum_tasks;
+ unsigned32 maximum_timers;
+ unsigned32 maximum_semaphores;
+ unsigned32 maximum_message_queues;
+ unsigned32 maximum_partitions;
+ unsigned32 maximum_regions;
+ unsigned32 maximum_ports;
+ unsigned32 maximum_periods;
+ unsigned32 maximum_extensions;
+ unsigned32 microseconds_per_tick;
+ unsigned32 ticks_per_timeslice;
+ unsigned32 number_of_initialization_tasks;
+} rtems_monitor_config_t;
+
+/*
+ * MPCI config
+ */
+
+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 */
+
+ unsigned32 default_timeout; /* in ticks */
+ unsigned32 maximum_packet_size;
+ rtems_monitor_symbol_t initialization;
+ rtems_monitor_symbol_t get_packet;
+ rtems_monitor_symbol_t return_packet;
+ rtems_monitor_symbol_t send_packet;
+ rtems_monitor_symbol_t receive_packet;
+} rtems_monitor_mpci_t;
+
+/*
+ * The generic canonical information union
+ */
+
+typedef union {
+ rtems_monitor_generic_t generic;
+ rtems_monitor_task_t task;
+ rtems_monitor_queue_t queue;
+ rtems_monitor_extension_t extension;
+ rtems_monitor_driver_t driver;
+ rtems_monitor_dname_t dname;
+ rtems_monitor_config_t config;
+ rtems_monitor_mpci_t mpci;
+ rtems_monitor_init_task_t itask;
+} rtems_monitor_union_t;
+
+/*
+ * Support for talking to other monitors
+ */
+
+/*
+ * Names of other monitors
+ */
+
+#define RTEMS_MONITOR_NAME (rtems_build_name('R', 'M', 'O', 'N'))
+#define RTEMS_MONITOR_SERVER_NAME (rtems_build_name('R', 'M', 'S', 'V'))
+#define RTEMS_MONITOR_QUEUE_NAME (rtems_build_name('R', 'M', 'S', 'Q'))
+#define RTEMS_MONITOR_RESPONSE_QUEUE_NAME (rtems_build_name('R', 'M', 'R', 'Q'))
+
+#define RTEMS_MONITOR_SERVER_RESPONSE 0x0001
+#define RTEMS_MONITOR_SERVER_CANONICAL 0x0002
+
+typedef struct
+{
+ unsigned32 command;
+ rtems_id return_id;
+ unsigned32 argument0;
+ unsigned32 argument1;
+ unsigned32 argument2;
+ unsigned32 argument3;
+ unsigned32 argument4;
+ unsigned32 argument5;
+} rtems_monitor_server_request_t;
+
+typedef struct
+{
+ unsigned32 command;
+ unsigned32 result0;
+ unsigned32 result1;
+ rtems_monitor_union_t payload;
+} rtems_monitor_server_response_t;
+
+extern rtems_id rtems_monitor_task_id;
+
+extern unsigned32 rtems_monitor_node; /* our node number */
+extern unsigned32 rtems_monitor_default_node; /* current default for commands */
+
+/*
+ * Monitor command function and table entry
+ */
+
+typedef struct rtems_monitor_command_entry_s rtems_monitor_command_entry_t;
+
+typedef void ( *rtems_monitor_command_function_t )(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+ );
+
+struct rtems_monitor_command_entry_s {
+ char *command; /* command name */
+ char *usage; /* usage string for the command */
+ unsigned32 arguments_required; /* # of required args */
+ rtems_monitor_command_function_t command_function;
+
+ /* Some argument for the command */
+ unsigned32 command_arg;
+};
+
+typedef void *(*rtems_monitor_object_next_fn)(void *, void *, rtems_id *);
+typedef void (*rtems_monitor_object_canonical_fn)(void *, void *);
+typedef void (*rtems_monitor_object_dump_header_fn)(boolean);
+typedef void (*rtems_monitor_object_dump_fn)(void *, boolean);
+
+typedef struct {
+ rtems_monitor_object_type_t type;
+ void *object_information;
+ int size; /* of canonical object */
+ rtems_monitor_object_next_fn next;
+ rtems_monitor_object_canonical_fn canonical;
+ rtems_monitor_object_dump_header_fn dump_header;
+ rtems_monitor_object_dump_fn dump;
+} rtems_monitor_object_info_t;
+
+
+/* monitor.c */
+void rtems_monitor_kill(void);
+void rtems_monitor_init(rtems_boolean);
+void rtems_monitor_wakeup(void);
+void rtems_monitor_pause_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_fatal_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_continue_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_debugger_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_node_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_symbols_loadup(void);
+void rtems_monitor_task(rtems_task_argument);
+
+/* server.c */
+void rtems_monitor_server_kill(void);
+rtems_status_code rtems_monitor_server_request(unsigned32, rtems_monitor_server_request_t *, rtems_monitor_server_response_t *);
+void rtems_monitor_server_task(rtems_task_argument);
+void rtems_monitor_server_init(unsigned32);
+
+/* command.c */
+int rtems_monitor_make_argv(char *, int *, char **);
+int rtems_monitor_command_read(char *, int *, char **);
+rtems_monitor_command_entry_t *rtems_monitor_command_lookup(
+ rtems_monitor_command_entry_t * table, int argc, char **argv);
+void rtems_monitor_command_usage(rtems_monitor_command_entry_t *, char *);
+void rtems_monitor_help_cmd(int, char **, unsigned32, boolean);
+
+/* prmisc.c */
+void rtems_monitor_separator(void);
+unsigned32 rtems_monitor_pad(unsigned32 dest_col, unsigned32 curr_col);
+unsigned32 rtems_monitor_dump_char(unsigned8 ch);
+unsigned32 rtems_monitor_dump_decimal(unsigned32 num);
+unsigned32 rtems_monitor_dump_hex(unsigned32 num);
+unsigned32 rtems_monitor_dump_id(rtems_id id);
+unsigned32 rtems_monitor_dump_name(rtems_name name);
+unsigned32 rtems_monitor_dump_priority(rtems_task_priority priority);
+unsigned32 rtems_monitor_dump_state(States_Control state);
+unsigned32 rtems_monitor_dump_modes(rtems_mode modes);
+unsigned32 rtems_monitor_dump_attributes(rtems_attribute attributes);
+unsigned32 rtems_monitor_dump_events(rtems_event_set events);
+unsigned32 rtems_monitor_dump_notepad(unsigned32 *notepad);
+
+/* object.c */
+rtems_id rtems_monitor_id_fixup(rtems_id, unsigned32, rtems_monitor_object_type_t);
+rtems_id rtems_monitor_object_canonical_get(rtems_monitor_object_type_t, rtems_id, void *, unsigned32 *size_p);
+rtems_id rtems_monitor_object_canonical_next(rtems_monitor_object_info_t *, rtems_id, void *);
+void *rtems_monitor_object_next(void *, void *, rtems_id, rtems_id *);
+rtems_id rtems_monitor_object_canonical(rtems_id, void *);
+void rtems_monitor_object_cmd(int, char **, unsigned32, boolean);
+
+/* manager.c */
+void *rtems_monitor_manager_next(void *, void *, rtems_id *);
+
+/* config.c */
+void rtems_monitor_config_canonical(rtems_monitor_config_t *, void *);
+void *rtems_monitor_config_next(void *, rtems_monitor_config_t *, rtems_id *);
+void rtems_monitor_config_dump_header(boolean);
+void rtems_monitor_config_dump(rtems_monitor_config_t *, boolean verbose);
+
+/* mpci.c */
+void rtems_monitor_mpci_canonical(rtems_monitor_mpci_t *, void *);
+void *rtems_monitor_mpci_next(void *, rtems_monitor_mpci_t *, rtems_id *);
+void rtems_monitor_mpci_dump_header(boolean);
+void rtems_monitor_mpci_dump(rtems_monitor_mpci_t *, boolean verbose);
+
+/* itask.c */
+void rtems_monitor_init_task_canonical(rtems_monitor_init_task_t *, void *);
+void *rtems_monitor_init_task_next(void *, rtems_monitor_init_task_t *, rtems_id *);
+void rtems_monitor_init_task_dump_header(boolean);
+void rtems_monitor_init_task_dump(rtems_monitor_init_task_t *, boolean verbose);
+
+/* extension.c */
+void rtems_monitor_extension_canonical(rtems_monitor_extension_t *, void *);
+void rtems_monitor_extension_dump_header(boolean verbose);
+void rtems_monitor_extension_dump(rtems_monitor_extension_t *, boolean);
+
+/* task.c */
+void rtems_monitor_task_canonical(rtems_monitor_task_t *, void *);
+void rtems_monitor_task_dump_header(boolean verbose);
+void rtems_monitor_task_dump(rtems_monitor_task_t *, boolean);
+
+/* queue.c */
+void rtems_monitor_queue_canonical(rtems_monitor_queue_t *, void *);
+void rtems_monitor_queue_dump_header(boolean verbose);
+void rtems_monitor_queue_dump(rtems_monitor_queue_t *, boolean);
+
+/* driver.c */
+void *rtems_monitor_driver_next(void *, rtems_monitor_driver_t *, rtems_id *);
+void rtems_monitor_driver_canonical(rtems_monitor_driver_t *, void *);
+void rtems_monitor_driver_dump_header(boolean);
+void rtems_monitor_driver_dump(rtems_monitor_driver_t *, boolean);
+
+/* dname.c */
+void *rtems_monitor_dname_next(void *, rtems_monitor_dname_t *, rtems_id *);
+void rtems_monitor_dname_canonical(rtems_monitor_dname_t *, void *);
+void rtems_monitor_dname_dump_header(boolean);
+void rtems_monitor_dname_dump(rtems_monitor_dname_t *, boolean);
+
+/* symbols.c */
+rtems_symbol_table_t *rtems_symbol_table_create();
+void rtems_symbol_table_destroy(rtems_symbol_table_t *table);
+
+rtems_symbol_t *rtems_symbol_create(rtems_symbol_table_t *, char *, unsigned32);
+rtems_symbol_t *rtems_symbol_value_lookup(rtems_symbol_table_t *, unsigned32);
+const rtems_symbol_t *rtems_symbol_value_lookup_exact(rtems_symbol_table_t *, unsigned32);
+rtems_symbol_t *rtems_symbol_name_lookup(rtems_symbol_table_t *, char *);
+void *rtems_monitor_symbol_next(void *object_info, rtems_monitor_symbol_t *, rtems_id *);
+void rtems_monitor_symbol_canonical(rtems_monitor_symbol_t *, rtems_symbol_t *);
+void rtems_monitor_symbol_canonical_by_name(rtems_monitor_symbol_t *, char *);
+void rtems_monitor_symbol_canonical_by_value(rtems_monitor_symbol_t *, void *);
+unsigned32 rtems_monitor_symbol_dump(rtems_monitor_symbol_t *, boolean);
+void rtems_monitor_symbol_cmd(int, char **, unsigned32, boolean);
+
+
+extern rtems_symbol_table_t *rtems_monitor_symbols;
+
+#ifndef MONITOR_PROMPT
+#define MONITOR_PROMPT "rtems" /* will have '> ' appended */
+#endif
+
+#define MONITOR_WAKEUP_EVENT RTEMS_EVENT_0
+
+
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define STRNEQ(a,b,n) (strncmp(a,b,n) == 0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! __MONITOR_H */
diff --git a/c/src/lib/libmisc/monitor/symbols.h b/c/src/lib/libmisc/monitor/symbols.h
new file mode 100644
index 0000000000..061ccdd952
--- /dev/null
+++ b/c/src/lib/libmisc/monitor/symbols.h
@@ -0,0 +1,64 @@
+/*
+ * RTEMS monitor symbol table functions
+ *
+ * Description:
+ * Entry points for symbol table routines.
+ *
+ *
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_SYMBOLS_H
+#define _INCLUDE_SYMBOLS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ rtems_unsigned32 value;
+ char *name;
+} rtems_symbol_t;
+
+#define SYMBOL_STRING_BLOCK_SIZE 4080
+typedef struct rtems_symbol_string_block_s {
+ struct rtems_symbol_string_block_s *next;
+ char buffer[SYMBOL_STRING_BLOCK_SIZE];
+} rtems_symbol_string_block_t;
+
+typedef struct {
+
+ rtems_unsigned32 sorted; /* are symbols sorted right now? */
+
+ rtems_unsigned32 growth_factor; /* % to grow by when needed */
+
+ rtems_unsigned32 next; /* next symbol slot to use when adding */
+ rtems_unsigned32 size; /* max # of symbols */
+
+ /*
+ * Symbol list -- sorted by address (when we do a lookup)
+ */
+
+ rtems_symbol_t *addresses; /* symbol array by address */
+
+ /*
+ * String pool, unsorted, a list of blocks of string data
+ */
+
+ rtems_symbol_string_block_t *string_buffer_head;
+ rtems_symbol_string_block_t *string_buffer_current;
+ rtems_unsigned32 strings_next; /* next byte to use in this block */
+
+} rtems_symbol_table_t;
+
+#define rtems_symbol_name(sp) ((sp)->name)
+#define rtems_symbol_value(sp) ((sp)->value)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_SYMBOLS_H */
diff --git a/c/src/lib/libmisc/rtmonuse/Makefile.in b/c/src/lib/libmisc/rtmonuse/Makefile.in
new file mode 100644
index 0000000000..6f0808f8f2
--- /dev/null
+++ b/c/src/lib/libmisc/rtmonuse/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/librtmonuse-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=rtmonuse
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+INSTALLED_H_FILES=$(srcdir)/rtmonuse.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
+# $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/lib/libmisc/rtmonuse/rtmonuse.c b/c/src/lib/libmisc/rtmonuse/rtmonuse.c
new file mode 100644
index 0000000000..272290176e
--- /dev/null
+++ b/c/src/lib/libmisc/rtmonuse/rtmonuse.c
@@ -0,0 +1,173 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "rtmonuse.h"
+
+typedef struct {
+ rtems_id id;
+ unsigned32 count;
+ unsigned32 missed_count;
+ unsigned32 min_cpu_time;
+ unsigned32 max_cpu_time;
+ unsigned32 total_cpu_time;
+ unsigned32 min_wall_time;
+ unsigned32 max_wall_time;
+ unsigned32 total_wall_time;
+} Period_usage_t;
+
+Period_usage_t *Period_usage_Information;
+
+/*PAGE
+ *
+ * Period_usage_Initialize
+ */
+
+void Period_usage_Initialize( void )
+{
+ int maximum;
+
+ maximum = _Configuration_Table->RTEMS_api_configuration->maximum_periods;
+
+ Period_usage_Information = malloc( sizeof(Period_usage_t) * (maximum+1) );
+
+ Period_usage_Reset();
+}
+
+/*PAGE
+ *
+ * Period_usage_Reset
+ */
+
+void Period_usage_Reset( void )
+{
+ unsigned32 i;
+ Period_usage_t *the_usage;
+
+ for ( i=0 ;
+ i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
+ i++ ) {
+ the_usage = &Period_usage_Information[ i ];
+
+ the_usage->count = 0;
+ the_usage->missed_count = 0;
+ the_usage->min_cpu_time = 0xFFFFFFFF;
+ the_usage->max_cpu_time = 0;
+ the_usage->total_cpu_time = 0;
+ the_usage->min_wall_time = 0xFFFFFFFF;
+ the_usage->max_wall_time = 0;
+ the_usage->total_wall_time = 0;
+
+ }
+}
+
+/*PAGE
+ *
+ * Period_usage_Update
+ */
+
+void Period_usage_Update(
+ rtems_id id
+)
+{
+ rtems_rate_monotonic_period_status rm_status;
+ rtems_status_code status;
+ Period_usage_t *the_usage;
+
+ assert( Period_usage_Information );
+
+ status = rtems_rate_monotonic_get_status( id, &rm_status );
+ assert( status == RTEMS_SUCCESSFUL );
+
+ the_usage = &Period_usage_Information[ rtems_get_index( id ) ];
+
+ the_usage->id = id;
+ the_usage->count++;
+ if ( rm_status.state == RATE_MONOTONIC_EXPIRED )
+ the_usage->missed_count++;
+ the_usage->total_cpu_time += rm_status.ticks_executed_since_last_period;
+ the_usage->total_wall_time += rm_status.ticks_since_last_period;
+
+ /*
+ * Update CPU time
+ */
+
+ if ( rm_status.ticks_executed_since_last_period < the_usage->min_cpu_time )
+ the_usage->min_cpu_time = rm_status.ticks_executed_since_last_period;
+
+ if ( rm_status.ticks_executed_since_last_period > the_usage->max_cpu_time )
+ the_usage->max_cpu_time = rm_status.ticks_executed_since_last_period;
+
+ /*
+ * Update Wall time
+ */
+
+ if ( rm_status.ticks_since_last_period < the_usage->min_wall_time )
+ the_usage->min_wall_time = rm_status.ticks_since_last_period;
+
+ if ( rm_status.ticks_since_last_period > the_usage->max_wall_time )
+ the_usage->max_wall_time = rm_status.ticks_since_last_period;
+
+}
+
+/*PAGE
+ *
+ * Period_usage_Dump
+ */
+
+void Period_usage_Dump( void )
+{
+ unsigned32 i;
+ Period_usage_t *the_usage;
+ Rate_monotonic_Control *the_period;
+ unsigned32 u32_name;
+ char name[5];
+
+ printf( "Period information by period\n" );
+ printf( " ID OWNER PERIODS MISSED CPU TIME WALL TIME\n" );
+
+ /*
+ * RTEMS does not use an index of zero for object ids.
+ */
+
+ for ( i=1 ;
+ i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
+ i++ ) {
+ the_usage = &Period_usage_Information[ i ];
+ if ( the_usage->count == 0 )
+ continue;
+
+ the_period =
+ (Rate_monotonic_Control *)_Rate_monotonic_Information.local_table[ i ];
+
+ if ( the_period->owner )
+ u32_name = *(unsigned32 *)the_period->owner->Object.name;
+ else
+ u32_name = rtems_build_name(' ', ' ', ' ', ' ');
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+ printf(
+ "0x%08x %4s %6d %3d %d/%d/%5.2f %d/%d/%3.2f\n",
+ the_usage->id,
+ name,
+ the_usage->count,
+ the_usage->missed_count,
+ the_usage->min_cpu_time,
+ the_usage->max_cpu_time,
+ (double) the_usage->total_cpu_time / (double) the_usage->count,
+ the_usage->min_wall_time,
+ the_usage->max_wall_time,
+ (double) the_usage->total_wall_time / (double) the_usage->count
+ );
+ }
+}
diff --git a/c/src/lib/libmisc/rtmonuse/rtmonuse.h b/c/src/lib/libmisc/rtmonuse/rtmonuse.h
new file mode 100644
index 0000000000..f0580a4f0b
--- /dev/null
+++ b/c/src/lib/libmisc/rtmonuse/rtmonuse.h
@@ -0,0 +1,18 @@
+/*
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_USAGE_h
+#define __RATE_MONOTONIC_USAGE_h
+
+void Period_usage_Initialize( void );
+
+void Period_usage_Reset( void );
+
+void Period_usage_Update(
+ rtems_id id
+);
+
+void Period_usage_Dump( void );
+
+#endif
diff --git a/c/src/lib/libmisc/stackchk/Makefile.in b/c/src/lib/libmisc/stackchk/Makefile.in
new file mode 100644
index 0000000000..ebaf092657
--- /dev/null
+++ b/c/src/lib/libmisc/stackchk/Makefile.in
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libstackchk-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=check
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=internal.h
+INSTALLED_H_FILES=$(srcdir)/stackchk.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/lib/libmisc/stackchk/README b/c/src/lib/libmisc/stackchk/README
new file mode 100644
index 0000000000..20e76f07bc
--- /dev/null
+++ b/c/src/lib/libmisc/stackchk/README
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+This directory contains a stack bounds checker. It provides two
+primary features:
+
+ + check for stack overflow at each context switch
+ + provides an educated guess at each task's stack usage
+
+The stack overflow check at context switch works by looking for
+a 16 byte pattern at the logical end of the stack to be corrupted.
+The "guesser" assumes that the entire stack was prefilled with a known
+pattern and assumes that the pattern is still in place if the memory
+has not been used as a stack.
+
+Both of these can be fooled by pushing large holes onto the stack
+and not writing to them... or (much more unlikely) writing the
+magic patterns into memory.
+
+This code has not been extensively tested. It is provided as a tool
+for RTEMS users to catch the most common mistake in multitasking
+systems ... too little stack space. Suggestions and comments are appreciated.
+
+NOTES:
+
+1. Stack usage information is questionable on CPUs which push
+ large holes on stack.
+
+2. The stack checker has a tendency to generate a fault when
+ trying to print the helpful diagnostic message. If it comes
+ out, congratulations. If not, then the variable Stack_check_Blown_task
+ contains a pointer to the TCB of the offending task. This
+ is usually enough to go on.
+
+FUTURE:
+
+1. Determine how/if gcc will generate stack probe calls and support that.
+
+2. Get accurate stack usage numbers on i960.. it pushes very large
+ holes on the stack.
diff --git a/c/src/lib/libmisc/stackchk/check.c b/c/src/lib/libmisc/stackchk/check.c
new file mode 100644
index 0000000000..45887c3929
--- /dev/null
+++ b/c/src/lib/libmisc/stackchk/check.c
@@ -0,0 +1,525 @@
+/*
+ * Stack Overflow Check User Extension Set
+ *
+ * NOTE: This extension set automatically determines at
+ * initialization time whether the stack for this
+ * CPU grows up or down and installs the correct
+ * extension routines for that direction.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+#include <rtems.h>
+
+/*
+ * HACK
+ * the stack dump information should be printed by a "fatal" extension.
+ * Fatal extensions only get called via rtems_fatal_error_occurred()
+ * and not when rtems_shutdown_executive() is called.
+ * I hope/think this is changing so that fatal extensions are renamed
+ * to "shutdown" extensions.
+ * When that happens, this #define should be deleted and all the code
+ * it marks.
+ */
+#define DONT_USE_FATAL_EXTENSION
+
+
+extern rtems_configuration_table BSP_Configuration;
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "stackchk.h"
+#include "internal.h"
+
+/*
+ * This variable contains the name of the task which "blew" the stack.
+ * It is NULL if the system is all right.
+ */
+
+Thread_Control *Stack_check_Blown_task;
+
+/*
+ * The extension table for the stack checker.
+ */
+
+rtems_extensions_table Stack_check_Extension_table = {
+ Stack_check_Create_extension, /* rtems_task_create */
+ 0, /* rtems_task_start */
+ 0, /* rtems_task_restart */
+ 0, /* rtems_task_delete */
+ Stack_check_Switch_extension, /* task_switch */
+ Stack_check_Begin_extension, /* task_begin */
+ 0, /* task_exitted */
+#ifdef DONT_USE_FATAL_EXTENSION
+ 0, /* fatal */
+#else
+ Stack_check_Fatal_extension, /* fatal */
+#endif
+};
+
+/*
+ * The "magic pattern" used to mark the end of the stack.
+ */
+
+Stack_check_Control Stack_check_Pattern;
+
+/*
+ * Where the pattern goes in the stack area is dependent upon
+ * whether the stack grow to the high or low area of the memory.
+ *
+ */
+
+#if ( CPU_STACK_GROWS_UP == TRUE )
+
+#define Stack_check_Get_pattern_area( _the_stack ) \
+ ((Stack_check_Control *) ((char *)(_the_stack)->area + \
+ (_the_stack)->size - sizeof( Stack_check_Control ) ))
+
+#define Stack_check_Calculate_used( _low, _size, _high_water ) \
+ ((char *)(_high_water) - (char *)(_low))
+
+#define Stack_check_usable_stack_start(_the_stack) \
+ ((_the_stack)->area)
+
+#else
+
+#define Stack_check_Get_pattern_area( _the_stack ) \
+ ((Stack_check_Control *) ((char *)(_the_stack)->area + HEAP_OVERHEAD))
+
+#define Stack_check_Calculate_used( _low, _size, _high_water) \
+ ( ((char *)(_low) + (_size)) - (char *)(_high_water) )
+
+#define Stack_check_usable_stack_start(_the_stack) \
+ ((char *)(_the_stack)->area + sizeof(Stack_check_Control))
+
+#endif
+
+#define Stack_check_usable_stack_size(_the_stack) \
+ ((_the_stack)->size - sizeof(Stack_check_Control))
+
+
+/*
+ * Do we have an interrupt stack?
+ * XXX it would sure be nice if the interrupt stack were also
+ * stored in a "stack" structure!
+ */
+
+
+Stack_Control stack_check_interrupt_stack;
+
+/*
+ * Prototypes necessary for forward references
+ */
+
+void Stack_check_Dump_usage( void );
+
+/*
+ * Fill an entire stack area with BYTE_PATTERN.
+ * This will be used by a Fatal extension to check for
+ * amount of actual stack used
+ */
+
+void
+stack_check_dope_stack(Stack_Control *stack)
+{
+ memset(stack->area, BYTE_PATTERN, stack->size);
+}
+
+
+/*PAGE
+ *
+ * Stack_check_Initialize
+ */
+
+unsigned32 stack_check_initialized = 0;
+
+void Stack_check_Initialize( void )
+{
+ rtems_status_code status;
+ Objects_Id id_ignored;
+ unsigned32 *p;
+#if 0
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+#endif
+
+ if (stack_check_initialized)
+ return;
+
+ /*
+ * Dope the pattern and fill areas
+ */
+
+ for ( p = Stack_check_Pattern.pattern;
+ p < &Stack_check_Pattern.pattern[PATTERN_SIZE_WORDS];
+ p += 4
+ )
+ {
+ p[0] = 0xFEEDF00D; /* FEED FOOD to BAD DOG */
+ p[1] = 0x0BAD0D06;
+ p[2] = 0xDEADF00D; /* DEAD FOOD GOOD DOG */
+ p[3] = 0x600D0D06;
+ };
+
+ status = rtems_extension_create(
+ rtems_build_name( 'S', 'T', 'C', 'K' ),
+ &Stack_check_Extension_table,
+ &id_ignored
+ );
+ assert ( status == RTEMS_SUCCESSFUL );
+
+ Stack_check_Blown_task = 0;
+
+ /*
+ * If installed by a task, that task will not get setup properly
+ * since it missed out on the create hook. This will cause a
+ * failure on first switch out of that task.
+ * 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
+ * also.
+ */
+ if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high)
+ {
+ stack_check_interrupt_stack.area = _CPU_Interrupt_stack_low;
+ stack_check_interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
+ (char *) _CPU_Interrupt_stack_low;
+
+ stack_check_dope_stack(&stack_check_interrupt_stack);
+ }
+
+#ifdef DONT_USE_FATAL_EXTENSION
+#ifdef RTEMS_DEBUG
+ /*
+ * this would normally be called by a fatal extension
+ * handler, but we don't run fatal extensions unless
+ * we fatal error.
+ */
+ atexit(Stack_check_Dump_usage);
+#endif
+#endif
+
+ stack_check_initialized = 1;
+}
+
+/*PAGE
+ *
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+)
+{
+ if (the_thread /* XXX && (the_thread != _Thread_Executing) */ )
+ stack_check_dope_stack(&the_thread->Start.Initial_stack);
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+)
+{
+ Stack_check_Control *the_pattern;
+
+ if ( the_thread->Object.id == 0 ) /* skip system tasks */
+ return;
+
+ the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack);
+
+ *the_pattern = Stack_check_Pattern;
+}
+
+/*PAGE
+ *
+ * Stack_check_report_blown_task
+ * Report a blown stack. Needs to be a separate routine
+ * so that interrupt handlers can use this too.
+ *
+ * Caller must have set the Stack_check_Blown_task.
+ *
+ * NOTE: The system is in a questionable state... we may not get
+ * the following message out.
+ */
+
+void Stack_check_report_blown_task(void)
+{
+ Stack_Control *stack;
+ Thread_Control *running;
+
+ running = Stack_check_Blown_task;
+ stack = &running->Start.Initial_stack;
+
+ fprintf(
+ stderr,
+ "BLOWN STACK!!! Offending task(%p): id=0x%08x; name=0x%08x",
+ running,
+ running->Object.id,
+ *(unsigned32 *)running->Object.name
+ );
+ fflush(stderr);
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ fprintf(
+ stderr,
+ "; node=%d\n",
+ BSP_Configuration.User_multiprocessing_table->node
+ );
+ else
+ fprintf(stderr, "\n");
+ fflush(stderr);
+
+ fprintf(
+ stderr,
+ " stack covers range 0x%08x - 0x%08x (%d bytes)\n",
+ (unsigned32) stack->area,
+ (unsigned32) stack->area + stack->size - 1,
+ (unsigned32) stack->size);
+ fflush(stderr);
+
+ fprintf(
+ stderr,
+ " Damaged pattern begins at 0x%08x and is %d bytes long\n",
+ (unsigned32) Stack_check_Get_pattern_area(stack), PATTERN_SIZE_BYTES);
+ fflush(stderr);
+
+ rtems_fatal_error_occurred( (unsigned32) "STACK BLOWN" );
+}
+
+/*PAGE
+ *
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+)
+{
+ if ( running->Object.id == 0 ) /* skip system tasks */
+ return;
+
+ if (0 != memcmp( (void *) Stack_check_Get_pattern_area( &running->Start.Initial_stack)->pattern,
+ (void *) Stack_check_Pattern.pattern,
+ PATTERN_SIZE_BYTES))
+ {
+ Stack_check_Blown_task = running;
+ Stack_check_report_blown_task();
+ }
+}
+
+void *Stack_check_find_high_water_mark(
+ const void *s,
+ size_t n
+)
+{
+ const unsigned32 *base, *ebase;
+ unsigned32 length;
+
+ base = s;
+ length = n/4;
+
+#if ( CPU_STACK_GROWS_UP == TRUE )
+ /*
+ * start at higher memory and find first word that does not
+ * match pattern
+ */
+
+ base += length - 1;
+ for (ebase = s; base > ebase; base--)
+ if (*base != U32_PATTERN)
+ return (void *) base;
+#else
+ /*
+ * start at lower memory and find first word that does not
+ * match pattern
+ */
+
+ base += PATTERN_SIZE_WORDS;
+ for (ebase = base + length; base < ebase; base++)
+ if (*base != U32_PATTERN)
+ return (void *) base;
+#endif
+
+ return (void *)0;
+}
+
+/*PAGE
+ *
+ * Stack_check_Dump_threads_usage
+ * Try to print out how much stack was actually used by the task.
+ *
+ */
+
+void Stack_check_Dump_threads_usage(
+ Thread_Control *the_thread
+)
+{
+ unsigned32 size, used;
+ void *low;
+ void *high_water_mark;
+ Stack_Control *stack;
+ unsigned32 u32_name;
+ char name[5];
+
+
+ if ( !the_thread )
+ return;
+
+ /*
+ * XXX HACK to get to interrupt stack
+ */
+
+ if (the_thread == (Thread_Control *) -1)
+ {
+ if (stack_check_interrupt_stack.area)
+ {
+ stack = &stack_check_interrupt_stack;
+ the_thread = 0;
+ }
+ else
+ return;
+ }
+ else
+ stack = &the_thread->Start.Initial_stack;
+
+ low = Stack_check_usable_stack_start(stack);
+ size = Stack_check_usable_stack_size(stack);
+
+ high_water_mark = Stack_check_find_high_water_mark(low, size);
+
+ if ( high_water_mark )
+ used = Stack_check_Calculate_used( low, size, high_water_mark );
+ else
+ used = 0;
+
+ if ( the_thread )
+ u32_name = *(unsigned32 *)the_thread->Object.name;
+ else
+ u32_name = rtems_build_name('I', 'N', 'T', 'R');
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+ printf( "0x%08x %4s 0x%08x 0x%08x %8d %8d\n",
+ the_thread ? the_thread->Object.id : ~0,
+ name,
+ (unsigned32) stack->area,
+ (unsigned32) stack->area + (unsigned32) stack->size - 1,
+ size,
+ used
+ );
+}
+
+/*PAGE
+ *
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+)
+{
+#ifndef DONT_USE_FATAL_EXTENSION
+ if (status == 0)
+ Stack_check_Dump_usage();
+#endif
+}
+
+
+/*PAGE
+ *
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ unsigned32 hit_running = 0;
+ Objects_Information *information;
+
+ if (stack_check_initialized == 0)
+ return;
+
+ printf("Stack usage by thread\n");
+ printf(
+ " ID NAME LOW HIGH AVAILABLE USED\n"
+ );
+
+ 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_Dump_threads_usage( the_thread );
+ if ( the_thread == _Thread_Executing )
+ hit_running = 1;
+ }
+ }
+ }
+
+ if ( !hit_running )
+ Stack_check_Dump_threads_usage( _Thread_Executing );
+
+ /* dump interrupt stack info if any */
+ Stack_check_Dump_threads_usage((Thread_Control *) -1);
+}
+
diff --git a/c/src/lib/libmisc/stackchk/internal.h b/c/src/lib/libmisc/stackchk/internal.h
new file mode 100644
index 0000000000..6d665a4594
--- /dev/null
+++ b/c/src/lib/libmisc/stackchk/internal.h
@@ -0,0 +1,96 @@
+/* internal.h
+ *
+ * This include file contains internal information
+ * for the RTEMS stack checker.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INTERNAL_STACK_CHECK_h
+#define __INTERNAL_STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This structure is used to fill in and compare the "end of stack"
+ * marker pattern.
+ * pattern area must be a multiple of 4 words.
+ */
+
+#ifdef CPU_STACK_CHECK_SIZE
+#define PATTERN_SIZE_WORDS (((CPU_STACK_CHECK_SIZE / 4) + 3) & ~0x3)
+#else
+#define PATTERN_SIZE_WORDS 4
+#endif
+
+#define PATTERN_SIZE_BYTES (PATTERN_SIZE_WORDS * 4)
+
+typedef struct {
+ unsigned32 pattern[ PATTERN_SIZE_WORDS ];
+} Stack_check_Control;
+
+/*
+ * The pattern used to fill the entire stack.
+ */
+
+#define BYTE_PATTERN 0xA5
+#define U32_PATTERN 0xA5A5A5A5
+
+/*
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+);
+
+/*
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+);
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libmisc/stackchk/stackchk.h b/c/src/lib/libmisc/stackchk/stackchk.h
new file mode 100644
index 0000000000..006b6f3727
--- /dev/null
+++ b/c/src/lib/libmisc/stackchk/stackchk.h
@@ -0,0 +1,41 @@
+/* stackchk.h
+ *
+ * This include file contains information necessary to utilize
+ * and install the stack checker mechanism.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_CHECK_h
+#define __STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Stack_check_Initialize
+ */
+
+void Stack_check_Initialize( void );
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/lib/libmisc/wrapup/Makefile.in b/c/src/lib/libmisc/wrapup/Makefile.in
new file mode 100644
index 0000000000..5884336105
--- /dev/null
+++ b/c/src/lib/libmisc/wrapup/Makefile.in
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=$(ARCH)/libmisc.a
+
+# Using the wildcard on the Purify support makes sure it may not be there
+
+LIBS=../monitor/$(ARCH)/libmonitor-tmp.a \
+ ../error/$(ARCH)/liberror-tmp.a \
+ ../assoc/$(ARCH)/libassoc-tmp.a \
+ ../stackchk/$(ARCH)/libstackchk-tmp.a \
+ ../cpuuse/$(ARCH)/libcpuuse-tmp.a \
+ ../rtmonuse/$(ARCH)/librtmonuse-tmp.a \
+ $(wildcard ../purify/$(ARCH)/libpurify-tmp.a)
+RELS=
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${LIBS} $(RELS)
+ $(RM) -r $(ARCH)
+ $(MKDIR) $(ARCH)
+ cd $(ARCH); for lib in $(LIBS:%=../%); do \
+ $(AR) -xv $$lib; \
+ done
+ $(RM) $@
+ $(AR) ruv $@ $(ARCH)/*
+ $(MKLIB) $@
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/lib/start/Makefile.in b/c/src/lib/start/Makefile.in
new file mode 100644
index 0000000000..db59fa1142
--- /dev/null
+++ b/c/src/lib/start/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=$(wildcard $(RTEMS_CPU))
diff --git a/c/src/lib/start/README b/c/src/lib/start/README
new file mode 100644
index 0000000000..bec0349374
--- /dev/null
+++ b/c/src/lib/start/README
@@ -0,0 +1,10 @@
+$Id$
+
+For each processor there may be some start up code
+(like crt.o) in the appropriate entry subdirectory. This
+entry code transfers control to target board specific
+code).
+
+For some processors this code exists in some external (to RTEMS)
+library such as libgloss or the host system (for example the hppa1_1
+and UNIX cpu's)
diff --git a/c/src/lib/start/a29k/Makefile.in b/c/src/lib/start/a29k/Makefile.in
new file mode 100644
index 0000000000..12f1cbfc6d
--- /dev/null
+++ b/c/src/lib/start/a29k/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=crt0 register
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+PGM=${ARCH}/crt0.o ${ARCH}/register.o
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/start/a29k/amd.ah b/c/src/lib/start/a29k/amd.ah
new file mode 100644
index 0000000000..69f34f173e
--- /dev/null
+++ b/c/src/lib/start/a29k/amd.ah
@@ -0,0 +1,517 @@
+; /* @(#)amd.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Initialization values for registers after RESET
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+;
+;* File information and includes.
+
+ .file "amd.ah"
+ .ident "@(#)amd.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+
+;
+;* AMD PROCESSOR SPECIFIC VALUES...
+;
+
+;
+;* Processor revision levels...
+;
+
+; PRL values: 31-28 27-24
+; Am29000 0 x
+; Am29005 1 x
+; Am29050 2 x
+; Am29035 3 x
+; Am29030 4 x
+; Am29200 5 x
+; Am29205 5 1x
+; Am29240 6 0
+; Manx 7 0
+; Cougar 8 0
+
+
+ .equ AM29000_PRL, 0x00
+
+ .equ AM29005_PRL, 0x10
+
+ .equ AM29050_PRL, 0x20
+
+ .equ AM29035_PRL, 0x30
+
+ .equ AM29030_PRL, 0x40
+
+ .equ AM29200_PRL, 0x50
+
+ .equ AM29205_PRL, 0x58
+
+ .equ AM29240_PRL, 0x60
+
+ .equ AM29040_PRL, 0x70
+
+ .equ MANX_PRL, 0x70
+
+ .equ COUGAR_PRL, 0x80
+
+;
+;* data structures sizes.
+;
+ .equ CFGINFO_SIZE, 16*4
+
+ .equ PGMINFO_SIZE, 16*4
+
+ .equ VARARGS_SPACE, 16*4
+
+ .equ WINDOWSIZE, 0x80
+;
+;* Am29027 Mode registers
+;
+
+ .equ Am29027Mode1, 0x0fc00820
+
+ .equ Am29027Mode2, 0x00001375
+
+
+
+;* Processor Based Equates and Defines
+
+ .equ SIG_SYNC, -1
+
+ .equ ENABLE, (SM)
+
+ .equ DISABLE, (ENABLE | DI | DA)
+
+ .equ DISABLE_FZ, (FZ | ENABLE | DI | DA)
+
+ .equ CLR_TRAP, (FZ | DA)
+
+ .equ InitOPS, (TD | SM | (3<<IMShift) | DI | DA)
+
+ .equ InitCPS, (TD | SM | (0<<IMShift) | DI | DA)
+
+ .equ InitCPS1, (TD | SM | (0<<IMShift) | DI )
+
+ .equ CPS_TMR, (SM | (0<<IMShift) | DI)
+
+ .equ CPS_INT0, (TD | SM | (0<<IMShift))
+
+ .equ CPS_TMRINT0, (SM | (0<<IMShift))
+
+ .equ InitCFG, 0x0
+
+ .equ InitRBP, (B0|B1|B2|B3|B4|B5)
+
+ .equ TMC_VALUE, 0xFFFFFF
+
+ .equ TMR_VALUE, (IE | TMC_VALUE)
+
+
+
+
+
+
+;* 29205 specific (internal) peripheral initialization constants.
+
+; Current Processor Status (CPS) Register.
+; Old Processor Status Register (OPS).
+
+ .equ DA, 0x00001
+ .equ DI, 0x00002
+ .equ IMShift,0x2
+ .equ SM, 0x00010
+ .equ PI, 0x00020
+ .equ PD, 0x00040
+ .equ WM, 0x00080
+ .equ RE, 0x00100
+ .equ LK, 0x00200
+ .equ FZ, 0x00400
+ .equ TU, 0x00800
+ .equ TP, 0x01000
+ .equ TE, 0x02000
+ .equ IP, 0x04000
+ .equ CA, 0x08000
+ .equ MM, 0x10000
+ .equ TD, 0x20000
+
+; Configuration Register (CFG)
+
+ .equ CD, 0x01
+ .equ CP, 0x02
+ .equ BO, 0x04
+ .equ RV, 0x08
+ .equ VF, 0x10
+ .equ DW, 0x20
+ .equ CO, 0x40
+ .equ EE, 0x80
+ .equ IDShift, 8
+ .equ CFG_ID, 0x100
+ .equ ILShift, 9
+ .equ CFG_ILMask, 0x600
+ .equ DDShift, 11
+ .equ CFG_DD, 0x800
+ .equ DLShift, 12
+ .equ CFG_DLMask, 0x3000
+ .equ PCEShift, 14
+ .equ CFG_PCE, 0x4000
+ .equ PMBShift, 16
+ .equ D16, 0x8000
+ .equ TBOShift, 23
+ .equ PRLShift, 24
+
+; Channel Control Register (CHC)
+
+ .equ CV, 0x1
+ .equ NN, 0x2
+ .equ TRShift, 2
+ .equ TF, 0x400
+ .equ PER, 0x800
+ .equ LA, 0x1000
+ .equ ST, 0x2000
+ .equ ML, 0x4000
+ .equ LS, 0x8000
+ .equ CRShift, 16
+ .equ CNTLShift, 24
+ .equ CEShift, 31
+ .equ WBERShift, 31
+
+; Register Bank Protect (RBP)
+ .equ B0, 0x1
+ .equ B1, 0x2
+ .equ B2, 0x4
+ .equ B3, 0x8
+ .equ B4, 0x10
+ .equ B5, 0x20
+ .equ B6, 0x40
+ .equ B7, 0x80
+ .equ B8, 0x100
+ .equ B9, 0x200
+ .equ B10, 0x400
+ .equ B11, 0x800
+ .equ B12, 0x1000
+ .equ B13, 0x2000
+ .equ B14, 0x4000
+ .equ B15, 0x8000
+
+; Timer Counter
+
+ .equ TCVMask, 0xffffff
+
+; Timer Reload Register
+
+ .equ IE, 0x1000000
+ .equ IN, 0x2000000
+ .equ OV, 0x4000000
+ .equ TRVMAsk, 0xffffff
+
+; MMU Configuration
+
+ .equ PSShift, 8
+ .equ PS0Shift, 8
+ .equ PS1Shift, 12
+
+; LRU Recommendation (LRU)
+ .equ LRUMask, 0xff
+
+; Reason Vector (RSN)
+ .equ RSNMask, 0xff
+
+; Region Mapping Address (RMA0 | RMA1)
+ .equ PBAMask,0xffff
+ .equ VBAShift, 16
+
+; Region Mapping Control (RMC0 | RMC1)
+ .equ TIDMask, 0xff
+ .equ RMC_UE, 0x100
+ .equ RMC_UW, 0x200
+ .equ RMC_UR, 0x400
+ .equ RMC_SE, 0x800
+ .equ RMC_SW, 0x1000
+ .equ RMC_SR, 0x2000
+ .equ RMC_VE, 0x4000
+ .equ RMC_IO, 0x10000
+ .equ RGSShift, 17
+ .equ RMC_PGMShift, 22
+
+; Instruction breakpoint Control (IBC0 | IBC1)
+ .equ BPIDMask, 0xff
+ .equ BTE, 0x100
+ .equ BRM, 0x200
+ .equ IBC_BSY, 0x400
+ .equ BEN, 0x800
+ .equ BHO, 0x1000
+
+; Cache Data Register (CDR)
+ .equ CDR_US, 0x1
+ .equ P, 0x2
+ .equ CDR_V, 0x4
+ .equ IATAGShift, 20
+
+; Cache Interface Register (CIR)
+ .equ CPTRShift, 2
+ .equ CIR_RW, 0x1000000
+ .equ FSELShift, 28
+
+; Indirect Pointer A, B, C (IPA, IPB, IPC)
+ .equ IPShift, 2
+
+; ALU Status (ALU)
+ .equ FCMask, 0x1F
+ .equ BPShift, 5
+ .equ C, 0x80
+ .equ Z, 0x100
+ .equ N, 0x200
+ .equ ALU_V, 0x400
+ .equ DF, 0x800
+
+; Byte Pointer
+ .equ BPMask, 0x3
+
+; Load/Store Count Remaining (CR)
+ .equ CRMask, 0xff
+
+; Floating Point Environment (FPE)
+ .equ NM, 0x1
+ .equ RM, 0x2
+ .equ VM, 0x4
+ .equ UM, 0x8
+ .equ XM, 0x10
+ .equ DM, 0x20
+ .equ FRMShift, 6
+ .equ FF, 0x100
+ .equ ACFShift, 9
+
+; Integer Environment (INTE)
+ .equ MO, 0x1
+ .equ DO, 0x2
+
+; Floating Point Status (FPS)
+ .equ NS, 0x1
+ .equ RS, 0x2
+ .equ VS, 0x4
+ .equ FPS_US, 0x8
+ .equ XS, 0x10
+ .equ DS, 0x20
+ .equ NT, 0x100
+ .equ RT, 0x200
+ .equ VT, 0x400
+ .equ UT, 0x800
+ .equ XT, 0x1000
+ .equ DT, 0x2000
+
+; Exception Opcode (EXOP)
+ .equ IOPMask, 0xff
+
+; TLB Entry Word 0
+; .equ TIDMask, 0xff already defined above
+ .equ TLB_UE, 0x100
+ .equ TLB_UW, 0x200
+ .equ TLB_UR, 0x400
+ .equ TLB_SE, 0x800
+ .equ TLB_SW, 0x1000
+ .equ TLB_SR, 0x2000
+ .equ TLB_VE, 0x4000
+ .equ VTAGShift, 15
+
+; TLB Entry Word 1
+ .equ TLB_IO, 0x1
+ .equ U, 0x2
+ .equ TLB_PGMShift, 6
+ .equ RPNShift, 10
+
+; Am29200 ROM Control bits.
+ .equ RMCT_DW0Shift, 29
+ .equ RMCT_DW1Shift, 21
+ .equ RMCT_DW2Shift, 13
+ .equ RMCT_DW3Shift, 5
+
+; Am29200 DRAM Control bits.
+ .equ DW3, (1<<18)
+ .equ DW2, (1<<22)
+ .equ DW1, (1<<26)
+ .equ DW0, (1<<30)
+
+ ; Internal peripheral address assignments.
+ .equ RMCT, 0x80000000
+ .equ RMCF, 0x80000004
+ .equ DRCT, 0x80000008
+ .equ DRCF, 0x8000000C
+ .equ DRM0, 0x80000010
+ .equ DRM1, 0x80000014
+ .equ DRM2, 0x80000018
+ .equ DRM3, 0x8000001C
+ .equ PIACT0, 0x80000020
+ .equ PIACT1, 0x80000020
+ .equ ICT, 0x80000028
+ .equ DMCT0, 0x80000030
+ .equ DMAD0, 0x80000034
+ .ifdef revA
+ .equ TAD0, 0x80000036
+ .equ TCN0, 0x8000003A
+ .else
+ .equ TAD0, 0x80000070 ; default
+ .equ TCN0, 0x8000003C ; default
+ .endif
+ .equ DMCN0, 0x80000038
+ .equ DMCT1, 0x80000040
+ .equ DMAD1, 0x80000044
+ .equ DMCN1, 0x80000048
+ .equ SPCT, 0x80000080
+ .equ SPST, 0x80000084
+ .equ SPTH, 0x80000088
+ .equ SPRB, 0x8000008C
+ .equ BAUD, 0x80000090
+ .equ PPCT, 0x800000C0
+ .equ PPST, 0x800000C1
+ .equ PPDT, 0x800000C4
+ .equ POCT, 0x800000D0
+ .equ PIN, 0x800000D4
+ .equ POUT, 0x800000D8
+ .equ POEN, 0x800000DC
+ .equ VCT, 0x800000E0
+ .equ TOP, 0x800000E4
+ .equ SIDE, 0x800000E8
+ .equ VDT, 0x800000EC
+
+ ; Interrupt Controller Register bits.
+ .equ TXDI, (1<<5)
+ .equ RXDI, (1<<6)
+ .equ RXSI, (1<<7)
+ .equ PPI, (1<<11)
+ .equ DMA1I, (1<<13)
+ .equ DMA0I, (1<<14)
+ .equ IOPIMask, (0xFF<<16)
+ .equ VDI, (1<<27)
+ .equ ICT200_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+ .equ ICT205_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+
+ ; Serial port Initialization bits
+ .equ NO_PARITY, 0
+
+
+ ; SPST bits
+ .equ THREShift, 22
+
+;* REGISTER Addresses
+
+ .equ ROMCntlRegAddr, 0x80000000
+
+ .equ ROMCfgRegAddr, 0x80000004
+
+ .equ DRAMCntlRegAddr, 0x80000008
+
+ .equ DRAMCfgRegAddr, 0x8000000C
+
+ .equ DRAMMap0RegAddr, 0x80000010
+
+ .equ DRAMMap1RegAddr, 0x80000014
+
+ .equ DRAMMap2RegAddr, 0x80000018
+
+ .equ DRAMMap3RegAddr, 0x8000001C
+
+ .equ PIACntl0RegAddr, 0x80000020
+
+ .equ PIACntl1RegAddr, 0x80000024
+
+ .equ INTRCntlRegAddr, 0x80000028
+
+ .equ DMACntl0RegAddr, 0x80000030
+
+ .equ DMACntl1RegAddr, 0x80000040
+
+ .equ SERPortCntlRegAddr, 0x80000080
+
+ .equ SERPortStatRegAddr, 0x80000084
+
+ .equ SERPortTHLDRegAddr, 0x80000088
+
+ .equ SERPortRbufRegAddr, 0x8000008C
+
+ .equ SERPortBaudRegAddr, 0x80000090
+
+ .equ PARPortCntlRegAddr, 0x800000C0
+
+ .equ PIOCntlRegAddr, 0x800000D0
+
+ .equ PIOInpRegAddr, 0x800000D4
+
+ .equ PIOOutRegAddr, 0x800000D8
+
+ .equ PIOOutEnaRegAddr, 0x800000DC
+
+ .equ VCTCntlRegAddr, 0x800000E0
+
+;
+;* Control constants
+;
+
+;* AM29030 Timer related constants.
+
+ .equ TMR_IE, 0x01000000
+
+ .equ TMR_IN, 0x02000000
+
+ .equ TMR_OV, 0x04000000
+
+ .equ TMC_INITCNT, 1613
+
+;
+;* System initialization values.
+;
+
+ .equ __os_version, 0x0001 ;
+
+ .equ STACKSize, 0x8000 ;
+
+ .equ PGMExecMode, 0x0000 ;
+
+ .equ TSTCK_OFST, 28 * 4
+
+ .equ CSTCK_OFST, 29 * 4
+
+ .equ TMSTCK_OFST, 30 * 4
+
+ .equ CMSTCK_OFST, 31 * 4
+
+ .equ CTXSW_OK, 0xA55A ; ctx switch ok
+
+ .set NV_STARTOFST, 0x20 ; 32 bytes
+
+ .set NV_BAUDOFST, 0x00 ; 00 bytes
+
+ .set reg_cir, 29
+
+ .set reg_cdr, 30
+
+ .equ MSG_BUFSIZE, 0x1000 ; serial buffer size
+
+ .equ ILLOPTRAP, 0
+
+ .equ UATRAP, 1
+
+ .equ PVTRAP, 5
+
+ .equ UITLBMISSTRAP, 8
+
+ .equ UDTLBMISSTRAP, 9
+
+ .equ TIMERTRAP, 14
+
+ .equ TRACETRAP, 15
+
+ .equ XLINXTRAP, 16
+
+ .equ SERIALTRAP, 17
+
+ .equ SLOWTMRTRAP, 18
+
+ .equ PORTTRAP, 19
+
+ .equ SVSCTRAP, 80
+
+ .equ SVSCTRAP1, 81
+
+ .equ V_CACHETRAP, 66 ;
+
+ .equ V_SETSERVICE, 67 ;
diff --git a/c/src/lib/start/a29k/crt0.s b/c/src/lib/start/a29k/crt0.s
new file mode 100644
index 0000000000..017f2d4cca
--- /dev/null
+++ b/c/src/lib/start/a29k/crt0.s
@@ -0,0 +1,288 @@
+; @(#)crt0.s 1.3 96/05/31 14:40:27, AMD
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Copyright 1988, 1989, 1990 Advanced Micro Devices, Inc.
+;
+; This software is the property of Advanced Micro Devices, Inc (AMD) which
+; specifically grants the user the right to modify, use and distribute this
+; software provided this notice is not removed or altered. All other rights
+; are reserved by AMD.
+;
+; AMD MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS
+; SOFTWARE. IN NO EVENT SHALL AMD BE LIABLE FOR INCIDENTAL OR CONSEQUENTIAL
+; DAMAGES IN CONNECTION WITH OR ARISING FROM THE FURNISHING, PERFORMANCE, OR
+; USE OF THIS SOFTWARE.
+;
+; So that all may benefit from your experience, please report any problems
+; or suggestions about this software to the 29K Technical Support Center at
+; 800-29-29-AMD (800-292-9263) in the USA, or 0800-89-1131 in the UK, or
+; 0031-11-1129 in Japan, toll free. The direct dial number is 512-462-4118.
+;
+; Advanced Micro Devices, Inc.
+; 29K Support Products
+; Mail Stop 573
+; 5900 E. Ben White Blvd.
+; Austin, TX 78741
+; 800-292-9263
+;
+; /* $Id$ */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ .file "crt0.s"
+
+; crt0.s version 3.3-0
+;
+; This module gets control from the OS.
+; It saves away the Am29027 Mode register settings and
+; then sets up the pointers to the resident spill and fill
+; trap handlers. It then establishes argv and argc for passing
+; to main. It then calls _main. If main returns, it calls _exit.
+;
+; void = start( );
+; NOTE - not C callable (no lead underscore)
+;
+ .include "sysmac.h"
+;
+;
+ .extern V_SPILL, V_FILL
+; .comm __29027Mode, 8 ; A shadow of the mode register
+ .comm __LibInit, 4
+
+ .text
+ .extern _main, _exit, _atexit
+
+ .word 0 ; Terminating tag word
+ .global start
+start:
+ sub gr1, gr1, 6 * 4
+ asgeu V_SPILL, gr1, rab ; better not ever happen
+ add lr1, gr1, 6 * 4
+
+;
+; Save the initial value of the Am29027's Mode register
+;
+; If your system does not enter crt0 with value for Am29027's Mode
+; register in gr96 and gr97, and also the coprocessor is active
+; uncomment the next 4 instructions.
+;
+; const gr96, 0xfc00820
+; consth gr96, 0xfc00820
+; const gr97, 0x1375
+; store 1, 3, gr96, gr97
+;
+; const gr98, __29027Mode
+; consth gr98, __29027Mode
+; store 0, 0, gr96, gr98
+; add gr98, gr98, 4
+; store 0, 0, gr97, gr98
+;
+; Now call the system to setup the spill and fill trap handlers
+;
+ const lr3, spill
+ consth lr3, spill
+ const lr2, V_SPILL
+ syscall setvec
+ const lr3, fill
+ consth lr3, fill
+ const lr2, V_FILL
+ syscall setvec
+
+;
+; atexit(_fini)
+;
+; const lr0, _atexit
+; consth lr0, _atexit
+; const lr2,__fini
+; calli lr0,lr0
+; consth lr2,__fini
+;
+; Now call _init
+;
+; const lr0, __init
+; consth lr0, __init
+; calli lr0,lr0
+; nop
+
+;
+; Get the argv base address and calculate argc.
+;
+ syscall getargs
+ add lr3, v0, 0 ; argv
+ add lr4, v0, 0
+ constn lr2, -1
+argcloop: ; scan for NULL terminator
+ load 0, 0, gr97, lr4
+ add lr4, lr4, 4
+ cpeq gr97, gr97, 0
+ jmpf gr97, argcloop
+ add lr2, lr2, 1
+;
+; Now call LibInit, if there is one. To aid runtime libraries
+; that need to do some startup initialization, we have created
+; a bss variable called LibInit. If the library doesn't need
+; any run-time initialization, the variable is still 0. If the
+; library does need run-time initialization, the library will
+; contain a definition like
+; void (*_LibInit)(void) = LibInitFunction;
+; The linker will match up our bss LibInit with this data LibInit
+; and the variable will not be 0. This results in the LibInit routine
+; being called via the calli instruction below.
+;
+ const lr0, __LibInit
+ consth lr0, __LibInit
+ load 0, 0, lr0, lr0
+ cpeq gr96, lr0, 0
+ jmpt gr96, NoLibInit
+ nop
+ calli lr0, lr0
+ nop
+NoLibInit:
+
+;
+; Call RAMInit to initialize the data memory.
+;
+; The following code segment was used to create the two flavors of the
+; run-time initialization routines (crt0_1.o, and crt0_2.o) as described
+; in the User's Manual. If osboot is used to create a stand-alone
+; application, or the call to RAMInit is made in the start-up routine,
+; then the following is not needed.
+;
+; .ifdef ROM_LOAD
+; .extern RAMInit
+;
+; const lr0, RAMInit
+; consth lr0, RAMInit
+; calli gr96, lr0
+; nop
+; .else
+; nop
+; nop
+; nop
+; nop
+; .endif
+
+;
+; Uncomment the following .comm, if you ARE NOT using osboot as released
+; with the High C 29K product, AND plan to use the romcoff utility to
+; move code and/or data sections to ROM.
+;
+; .comm RAMInit, 4
+;
+; Furthermore, if the above is uncommented, then use the following logic
+; to call the RAMInit function, if needed.
+;
+; const lr0, RAMInit
+; consth lr0, RAMInit
+; load 0, 0, gr96, lr0
+; cpeq gr96, gr96, 0 ; nothing there?
+; jmpt gr96, endRAMInit ; yes, nothing to init
+; nop
+; calli gr96, lr0 ; no, then instruction found
+; nop ; execute function.
+;
+
+
+;
+; call main, passing it 2 arguments. main( argc, argv )
+;
+ const lr0, _main
+ consth lr0, _main
+ calli lr0, lr0
+ nop
+;
+; call exit
+;
+ const lr0, _exit
+ consth lr0, _exit
+ calli lr0, lr0
+ add lr2, gr96, 0
+;
+; Should never get here, but just in case
+;
+loop:
+ syscall exit
+ jmp loop
+ nop
+ .sbttl "Spill and Fill trap handlers"
+ .eject
+;
+; SPILL, FILL trap handlers
+;
+; Note that these Spill and Fill trap handlers allow the OS to
+; assume that the only registers of use are between gr1 and rfb.
+; Therefore, if the OS desires to, it may simply preserve from
+; lr0 for (rfb-gr1)/4 registers when doing a context save.
+;
+;
+; Here is the spill handler
+;
+; spill registers from [*gr1..*rab)
+; and move rab downto where gr1 points
+;
+; rab must change before rfb for signals to work
+;
+; On entry: rfb - rab = windowsize, gr1 < rab
+; Near the end: rfb - rab > windowsize, gr1 == rab
+; On exit: rfb - rab = windowsize, gr1 == rab
+;
+ .global spill
+spill:
+ sub tav, rab, gr1 ; tav = number of bytes to spill
+ srl tav, tav, 2 ; change byte count to word count
+ sub tav, tav, 1 ; make count zero based
+ mtsr CR, tav ; set Count Remaining register
+ sub tav, rab, gr1
+ sub tav, rfb, tav ; pull down free bound and save it in rab
+ add rab, gr1, 0 ; first pull down allocate bound
+ storem 0, 0, lr0, tav ; store lr0..lr(tav) into rfb
+ jmpi tpc ; return...
+ add rfb, tav, 0
+;
+; Here is the fill handler
+;
+; fill registers from [*rfb..*lr1)
+; and move rfb upto where lr1 points.
+;
+; rab must change before rfb for signals to work
+;
+; On entry: rfb - rab = windowsize, lr1 > rfb
+; Near the end: rfb - rab < windowsize, lr1 == rab + windowsize
+; On exit: rfb - rab = windowsize, lr1 == rfb
+;
+ .global fill
+fill:
+ const tav, 0x80 << 2
+ or tav, tav, rfb ; tav = ((rfb>>2) | 0x80)<<2 == [rfb]<<2
+ mtsr IPA, tav ; ipa = [rfb]<<2 == 1st reg to fill
+ ; gr0 is now the first reg to fill
+ sub tav, lr1, rfb ; tav = number of bytes to fill
+ add rab, rab, tav ; push up allocate bound
+ srl tav, tav, 2 ; change byte count to word count
+ sub tav, tav, 1 ; make count zero based
+ mtsr CR, tav ; set Count Remaining register
+ loadm 0, 0, gr0, rfb ; load registers
+ jmpi tpc ; return...
+ add rfb, lr1, 0 ; ... first pushing up free bound
+
+;
+; The __init function
+;
+; .sect .init,text
+; .use .init
+; .global __init
+;__init:
+; sub gr1,gr1,16
+; asgeu V_SPILL,gr1,gr126
+; add lr1,gr1,24
+;
+;
+; The __fini function
+;
+; .sect .fini,text
+; .use .fini
+; .global __fini
+;__fini:
+; sub gr1,gr1,16
+; asgeu V_SPILL,gr1,gr126
+; add lr1,gr1,24
+;
+ .end
diff --git a/c/src/lib/start/a29k/pswmacro.ah b/c/src/lib/start/a29k/pswmacro.ah
new file mode 100644
index 0000000000..a994719c58
--- /dev/null
+++ b/c/src/lib/start/a29k/pswmacro.ah
@@ -0,0 +1,442 @@
+; /* @(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; macros: Do_install and init_TLB
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+
+;* File information and includes.
+
+ .file "macro.ah"
+ .ident "@(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+ .macro CONST32, RegName, RegValue
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endm
+
+ .macro CONSTX, RegName, RegValue
+ .if (RegValue) <= 0x0000ffff
+ const RegName, RegValue
+ .else
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endif
+ .endm
+
+ .macro PRODEV, RegName
+ srl RegName, RegName, 24
+ .endm
+
+;
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+;
+
+;* Assumes vector table address in v0
+
+ .macro _setvec, trapnum, trapaddr
+ mfsr v0, vab ;
+ const v2, trapnum ;
+ sll v1, v2, 2 ;
+ add v1, v1, v0 ; v0 has location of vector tab
+
+ const v2, trapaddr ;
+ consth v2, trapaddr ;
+ store 0, 0, v2, v1 ;
+ nop ;
+ .endm
+
+ .macro syscall, name
+ const tav, HIF_@name ;
+ asneq V_SYSCALL, gr1, gr1 ;
+ nop ;
+ nop ;
+ .endm
+
+
+
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+
+ .macro Do_Install, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_Install
+ nop
+ .endm
+
+ .macro Do_InstallX, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_InstallX
+ nop
+ .endm
+
+
+
+; push a register onto the stack
+ .macro pushreg, reg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ store 0, 0, reg, sp ; push register
+ .endm
+
+ .macro push, sp, reg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop the register from stack
+ .macro popreg, reg, sp
+ load 0, 0, reg, sp ; pop register
+ add sp, sp, 4 ; adjust stack pointer
+ .endm
+ .macro pop, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ .endm
+
+; push a special register onto stack
+ .macro pushspcl, spcl, tmpreg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ mfsr tmpreg, spcl ; get spcl reg
+ store 0, 0, tmpreg, sp ; push onto stack
+ .endm
+
+ .macro pushsr, sp, reg, sreg
+ mfsr reg, sreg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop a special register from stack
+ .macro popspcl, spcl, tmpreg, sp
+ load 0, 0, tmpreg, sp ; pop from stack
+ add sp, sp, 4 ; adjust stack pointer
+ mtsr spcl, tmpreg ; set spcl reg
+ .endm
+
+ .macro popsr, sreg, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ mtsr sreg, reg
+ .endm
+
+;
+; save freeze mode registers on memory stack.
+;
+
+ .macro SaveFZState, tmp1, tmp2
+
+ ; save freeze mode registers.
+
+ pushspcl pc0, tmp1, msp
+ pushspcl pc1, tmp1, msp
+ pushspcl alu, tmp1, msp
+
+ pushspcl cha, tmp1, msp
+ pushspcl chd, tmp1, msp
+ pushspcl chc, tmp1, msp
+
+ pushspcl ops, tmp1, msp
+
+ ; turn freeze off
+
+ const tmp2, FZ
+ mfsr tmp1, cps
+ andn tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+ .endm
+
+; restore freeze mode registers from memory stack.
+
+ .macro RestoreFZState, tmp1, tmp2
+
+ ; turn freeze on
+
+ const tmp2, (FZ|DI|DA)
+ mfsr tmp1, cps
+ or tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+
+ ; restore freeze mode registers.
+
+ popspcl ops, tmp1, msp
+ popspcl chc, tmp1, msp
+ popspcl chd, tmp1, msp
+ popspcl cha, tmp1, msp
+ popspcl alu, tmp1, msp
+ popspcl pc1, tmp1, msp
+ popspcl pc0, tmp1, msp
+ .endm
+
+;
+;*
+;
+ .equ WS, 512 ; window size
+ .equ RALLOC, 4 * 4 ; stack alloc for C
+ .equ SIGCTX_UM_SIZE, 40 * 4 ;
+ .equ SIGCTX_RFB, (38) * 4 ; user mode saved
+ .equ SIGCTX_SM_SIZE, 12 * 4 ;
+ .equ SIGCTX_SIG, (11)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_GR1, (10)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_RAB, (9)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC0, (8)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC1, (7)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC2, (6)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_CHC, (3)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_OPS, (1)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_TAV, (0)*4 + SIGCTX_UM_SIZE ;
+
+ .macro sup_sv
+ add it2, trapreg, 0 ; transfer signal #
+ sub msp, msp, 4 ;
+ store 0, 0, it2, msp ; save signal number
+ sub msp, msp, 4 ; push gr1
+
+ store 0, 0, gr1, msp ;
+ sub msp, msp, 4 ; push rab
+ store 0, 0, rab, msp ;
+ const it0, WS ; Window size
+
+ sub rab, rfb, it0 ; set rab = rfb-512
+ pushsr msp, it0, PC0 ; save program counter0
+ pushsr msp, it0, PC1 ; save program counter1
+ pushsr msp, it0, PC2 ; save program counter2
+
+ pushsr msp, it0, CHA ; save channel address
+ pushsr msp, it0, CHD ; save channel data
+ pushsr msp, it0, CHC ; save channel control
+ pushsr msp, it0, ALU ; save alu
+
+ pushsr msp, it0, OPS ; save ops
+ sub msp, msp, 4 ;
+ store 0, 0, tav, msp ; push tav
+ mtsrim chc, 0 ; no loadm/storem
+
+ mfsr it0, ops ; get ops value
+ const it1, (TD | DI) ; disable interrupts
+ consth it1, (TD | DI) ; disable interrupts
+ or it0, it0, it1 ; set bits
+
+ mtsr ops, it0 ; set new ops
+ const it0, sigcode ; signal handler
+ consth it0, sigcode ; signal handler
+ mtsr pc1, it0 ; store pc1
+
+ add it1, it0, 4 ; next addr
+ mtsr pc0, it1 ; store pc1 location
+ iret ; return
+ nop ; ALIGN
+ .endm
+
+ .macro sig_return
+ mfsr it0, cps ; get processor status
+ const it1, FZ|DA ; Freeze + traps disable
+ or it0, it0, it1 ; to set FZ+DA
+ mtsr cps, it0 ; in freeze mode
+
+ load 0, 0, tav, msp ; restore tav
+ add msp, msp, 4 ;
+
+ popsr OPS,it0, msp ;
+ popsr ALU,it0, msp ;
+ popsr CHC,it0, msp ;
+ popsr CHD,it0, msp ;
+
+ popsr CHA,it0, msp ;
+ popsr PC2,it0, msp ;
+ popsr PC1,it0, msp ;
+ popsr PC0,it0, msp ;
+
+ load 0, 0, rab, msp ;
+ add msp, msp, 4 ;
+ load 0, 0, it0, msp ;
+ add gr1, it0, 0 ; pop rsp
+
+ add msp, msp, 8 ; discount signal #
+ iret
+ .endm
+
+ .macro repair_R_stack
+ add v0, msp, SIGCTX_GR1 ; interrupted gr1
+ load 0, 0, v2, v0 ;
+ add v0, msp, SIGCTX_RFB ;
+ load 0, 0, v3, v0 ; interupted rfb
+
+ const v1, WS ;
+ sub v1, v3, v1 ; rfb-512
+ cpltu v0, v2, v1 ; test gr1 < rfb-512
+ jmpf v0, $1 ;
+
+ add gr1, rab, 0 ;
+ add v2, v1, 0 ; set LB = rfb-512
+$1:
+;* if gr1 < rfb-512 yes LB = rfb-512 signalled during spill
+;* if no, LB=gr1 interrupted cache < 126 registers
+ cpleu v0, v2, rfb ; test LB<=rfb
+ jmpf v0, $2 ;
+ nop ;
+ add v2, rfb, 0 ;
+$2:
+ cpeq v0, v3, rfb ; fill rfb->'rfb
+ jmpt v0, $3 ; if rfb==rfb'
+ const tav, (0x80<<2) ; prepare for fill
+ or tav, tav, v2 ;
+
+ mtsr IPA, tav ; IPA=LA<<2
+ sub tav, v3, gr98 ; cache fill LA->rfb
+ srl tav, tav, 2 ; convert to words
+ sub tav, tav, 1 ;
+
+ mtsr cr, tav ;
+ loadm 0, 0, gr0, v2 ; fill from LA->rfb
+$3:
+ add rfb, v3, 0 ; move rfb upto 'rfb
+ sub rab, v1, 0 ; assign rab to rfb-512
+
+ add v0, msp, SIGCTX_GR1 ;
+ load 0, 0, v2, v0 ; v0 = interrupted gr1
+ add gr1, v2, 0 ; move gr1 upto 'gr1
+ nop ;
+ .endm
+
+ .macro repair_regs
+ mtsrim cr, 29 - 1 ; to restore locals
+ loadm 0, 0, v0, msp ;
+ add msp, msp, 29*4 ;
+ popsr Q, tav, msp ;
+
+ popsr IPC, tav, msp ;
+ popsr IPB, tav, msp ;
+ popsr IPA, tav, msp ;
+ pop FPStat3, msp ; floating point regs
+
+ pop FPStat2, msp ; floating point regs
+ pop FPStat1, msp ; floating point regs
+ pop FPStat0, msp ; floating point regs
+
+ add msp, msp, 3*4 ; R-stack repaired
+ .endm
+
+;
+;*HIF related...
+;
+
+
+
+
+; send the message in bufaddr to Montip.
+ .macro SendMessageToMontip, bufaddr
+ const lr2, bufaddr
+$1:
+ call lr0, _msg_send
+ consth lr2, bufaddr
+ cpeq gr96, gr96, 0
+ jmpf gr96, $1
+ const lr2, bufaddr
+ .endm
+
+; build a HIF_CALL message in bufaddr to send to montip.
+ .macro BuildHIFCALLMsg, bufaddr, tmp1, tmp2
+ const tmp1, bufaddr
+ consth tmp1, bufaddr
+ const tmp2, HIF_CALL_MSGCODE
+ store 0, 0, tmp2, tmp1 ; msg code
+ add tmp1, tmp1, 4
+ const tmp2, HIF_CALL_MSGLEN
+ store 0, 0, tmp2, tmp1 ; msg len
+ add tmp1, tmp1, 4
+ store 0, 0, gr121, tmp1 ; service number
+ add tmp1, tmp1, 4
+ store 0, 0, lr2, tmp1 ; lr2
+ add tmp1, tmp1, 4
+ store 0, 0, lr3, tmp1 ; lr3
+ add tmp1, tmp1, 4
+ store 0, 0, lr4, tmp1 ; lr4
+ .endm
+
+;
+;*
+;* All the funky AMD style macros go in here...simply for
+;* compatility
+;
+;
+ .macro IMPORT, symbol
+ .extern symbol
+ .endm
+
+ .macro GLOBAL, symbol
+ .global symbol
+ .endm
+
+ .macro USESECT, name, type
+ .sect name, type
+ .use name
+ .endm
+
+ .macro SECTION, name, type
+ .sect name, type
+ .endm
+
+ .macro FUNC, fname, lineno
+ .global fname
+fname:
+ .endm
+
+ .macro ENDFUNC, fname, lineno
+ .endm
+
+;*************************************LONG
+ .macro LONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************UNSIGNED LONG
+ .macro ULONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************SHORT
+ .macro SHORT, varname
+varname:
+ .block 2
+ .endm
+
+;*************************************CHAR
+ .macro CHAR, varname
+varname:
+ .block 1
+ .endm
+
+;*************************************LONGARRAY
+ .macro LONGARRAY, name, count
+name:
+ .block count*4
+ .endm
+
+;*************************************SHORTARRAY
+
+ .macro SHORTARRAY, name, count
+name:
+ .block count*2
+ .endm
+
+;*************************************CHARARRAY
+
+ .macro CHARARRAY, name, count
+name:
+ .block count
+ .endm
+
+
+;*************************************VOID_FPTR
+
+ .macro VOID_FPTR, name
+name:
+ .block 4
+ .endm
diff --git a/c/src/lib/start/a29k/register.ah b/c/src/lib/start/a29k/register.ah
new file mode 100644
index 0000000000..1dced5b043
--- /dev/null
+++ b/c/src/lib/start/a29k/register.ah
@@ -0,0 +1,214 @@
+; /* @(#)register.ah 1.1 96/05/23 08:56:57, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; naming of various registers
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+
+;* File information and includes.
+
+ .file "register.ah"
+ .ident "@(#)register.ah 1.1 96/05/23 08:56:57, TEI\n"
+
+;* Register Stack pointer and frame pointer registers.
+
+ .extern Rrsp, Rfp
+
+ .reg regsp, %%Rrsp
+ .reg fp, %%Rfp
+
+
+ .extern RTrapReg
+ .extern Rtrapreg
+
+ .reg TrapReg, %%RTrapReg
+ .reg trapreg, %%Rtrapreg
+
+
+;* Operating system Interrupt handler registers (gr64-gr67)
+
+ .extern ROSint0, ROSint1, ROSint2, ROSint3
+
+ .reg OSint0, %%ROSint0
+ .reg OSint1, %%ROSint1
+ .reg OSint2, %%ROSint2
+ .reg OSint3, %%ROSint3
+
+ .reg it0, %%ROSint0
+ .reg it1, %%ROSint1
+ .reg it2, %%ROSint2
+ .reg it3, %%ROSint3
+
+
+
+;* Operating system temporary (or scratch) registers (gr68-gr79)
+
+ .extern ROStmp0, ROStmp1, ROStmp2, ROStmp3
+ .extern ROStmp4, ROStmp5, ROStmp6, ROStmp7
+ .extern ROStmp8, ROStmp9, ROStmp10, ROStmp11
+
+ .reg OStmp0, %%ROStmp0
+ .reg OStmp1, %%ROStmp1
+ .reg OStmp2, %%ROStmp2
+ .reg OStmp3, %%ROStmp3
+
+ .reg OStmp4, %%ROStmp4
+ .reg OStmp5, %%ROStmp5
+ .reg OStmp6, %%ROStmp6
+ .reg OStmp7, %%ROStmp7
+
+ .reg OStmp8, %%ROStmp8
+ .reg OStmp9, %%ROStmp9
+ .reg OStmp10, %%ROStmp10
+ .reg OStmp11, %%ROStmp11
+
+
+ .reg kt0, %%ROStmp0
+ .reg kt1, %%ROStmp1
+ .reg kt2, %%ROStmp2
+ .reg kt3, %%ROStmp3
+
+ .reg kt4, %%ROStmp4
+ .reg kt5, %%ROStmp5
+ .reg kt6, %%ROStmp6
+ .reg kt7, %%ROStmp7
+
+ .reg kt8, %%ROStmp8
+ .reg kt9, %%ROStmp9
+ .reg kt10, %%ROStmp10
+ .reg kt11, %%ROStmp11
+
+
+ .reg TempReg0, %%ROSint0
+ .reg TempReg1, %%ROSint1
+ .reg TempReg2, %%ROSint2
+ .reg TempReg3, %%ROSint3
+
+ .reg TempReg4, %%ROStmp0
+ .reg TempReg5, %%ROStmp1
+ .reg TempReg6, %%ROStmp2
+ .reg TempReg7, %%ROStmp3
+
+ .reg TempReg8, %%ROStmp4
+ .reg TempReg9, %%ROStmp5
+ .reg TempReg10, %%ROStmp6
+ .reg TempReg11, %%ROStmp7
+
+ .reg TempReg12, %%ROStmp8
+ .reg TempReg13, %%ROStmp9
+ .reg TempReg14, %%ROStmp10
+ .reg TempReg15, %%ROStmp11
+
+
+;* Assigned static registers
+
+ .extern RSpillAddrReg, RFillAddrReg, RSignalAddrReg
+ .extern Rpcb, Retc
+ .extern RTimerExt, RTimerUtil, RLEDReg, RERRReg
+ .extern Ret0, Ret1, Ret2, Ret3, Ret4, Ret5, Ret6, Ret7, Reta, Retb
+ .extern Retx, Rety, Retz
+
+
+ .reg SpillAddrReg, %%RSpillAddrReg
+ .reg FillAddrReg, %%RFillAddrReg
+ .reg SignalAddrReg, %%RSignalAddrReg
+ .reg pcb, %%Rpcb
+
+ .reg etx, %%Retx
+ .reg ety, %%Rety
+ .reg etz, %%Retz
+ .reg eta, %%Reta
+
+ .reg etb, %%Retb
+ .reg etc, %%Retc
+ .reg TimerExt, %%RTimerExt
+ .reg TimerUtil, %%RTimerUtil
+
+ .reg LEDReg, %%RLEDReg
+ .reg ERRReg, %%RERRReg
+
+
+ .reg et0, %%Ret0
+ .reg et1, %%Ret1
+ .reg et2, %%Ret2
+ .reg et3, %%Ret3
+
+ .reg et4, %%Ret4
+ .reg et5, %%Ret5
+ .reg et6, %%Ret6
+ .reg et7, %%Ret7
+
+;
+ .equ SCB1REG_NUM, 88
+ .reg SCB1REG_PTR, %%Ret0
+
+; The floating point trap handlers need a few static registers
+
+ .extern RFPStat0, RFPStat1, RFPStat2, RFPStat3
+ .extern Rheapptr, RHeapPtr, RArgvPtr
+
+ .reg FPStat0, %%RFPStat0
+ .reg FPStat1, %%RFPStat1
+ .reg FPStat2, %%RFPStat2
+ .reg FPStat3, %%RFPStat3
+
+ .reg heapptr, %%Rheapptr
+ .reg HeapPtr, %%RHeapPtr
+ .reg ArgvPtr, %%RArgvPtr
+
+ .extern RXLINXReg, RVMBCReg, RUARTReg, RETHERReg
+
+ .reg XLINXReg, %%RXLINXReg
+ .reg VMBCReg, %%RVMBCReg
+ .reg UARTReg, %%RUARTReg
+ .reg ETHERReg, %%RXLINXReg
+
+;* Compiler and programmer registers. (gr96-gr127)
+
+ .extern Rv0, Rv1, Rv2, Rv3, Rv4, Rv5, Rv6, Rv7, Rv8, Rv9
+ .extern Rv10, Rv11, Rv12, Rv13, Rv14, Rv15
+
+ .reg v0, %%Rv0
+ .reg v1, %%Rv1
+ .reg v2, %%Rv2
+ .reg v3, %%Rv3
+
+ .reg v4, %%Rv4
+ .reg v5, %%Rv5
+ .reg v6, %%Rv6
+ .reg v7, %%Rv7
+
+ .reg v8, %%Rv8
+ .reg v9, %%Rv9
+ .reg v10, %%Rv10
+ .reg v11, %%Rv11
+
+ .reg v12, %%Rv12
+ .reg v13, %%Rv13
+ .reg v14, %%Rv14
+ .reg v15, %%Rv15
+
+ .extern Rtv0, Rtv1, Rtv2, Rtv3, Rtv4
+
+ .reg tv0, %%Rtv0
+ .reg tv1, %%Rtv1
+ .reg tv2, %%Rtv2
+ .reg tv3, %%Rtv3
+ .reg tv4, %%Rtv4
+
+; ****************************************************************************
+; For uatrap
+; register definitions -- since this trap handler must allow for
+; nested traps and interrupts such as TLB miss, protection violation,
+; or Data Access Exception, and these trap handlers use the shared
+; Temp registers, we must maintain our own that are safe over user-
+; mode loads and stores. The following must be assigned global
+; registers which are not used in INTR[0-3], TRAP[0-1], TLB miss,
+; TLB protection violation, or data exception trap handlers.
+
+; .reg cha_cpy, OStmp4 ; copy of CHA
+; .reg chd_cpy, OStmp5 ; copy of CHD
+; .reg chc_cpy, OStmp6 ; copy of CHC
+; .reg LTemp0, OStmp7 ; local temp 0
+; .reg LTemp1, OStmp8 ; local temp 1
+
+; ****************************************************************************
diff --git a/c/src/lib/start/a29k/register.s b/c/src/lib/start/a29k/register.s
new file mode 100644
index 0000000000..4d17071ed1
--- /dev/null
+++ b/c/src/lib/start/a29k/register.s
@@ -0,0 +1,393 @@
+; /* @(#)register.s 1.1 96/05/23 08:57:34, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Register Definitions and Usage Conventions
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+;
+
+;* File information and includes.
+
+ .file "c_register.s"
+ .ident "@(#)register.s 1.1 96/05/23 08:57:34, TEI\n"
+
+; Basic guidelines for register distribution and usage are derived from
+; the AMD application notes. It would be best to stick with the conventions
+; laid out by AMD.
+; Application Note: Context Switching with 29000 Processor By Daniel Mann.
+
+;
+;*************************************************************************
+;
+
+;
+; Rule 1:
+; Gr1 is used as a pointer to the register stack
+; Lr1 is used as frame pointer
+;
+
+ .reg regsp, gr1 ; Register Stack Pointer
+ .reg fp, lr1 ; frame pointer
+
+ .equ Rrsp, &regsp
+ .equ Rfp, &fp
+
+ .global Rrsp, Rfp
+
+;
+;*************************************************************************
+;
+
+;
+; Gr2-Gr63 are not implemented in silicon
+;
+
+;
+;*************************************************************************
+;
+
+;
+; Rule 2:
+; The registers GR64-GR95 are dedicated for operating system use.
+;
+
+; The register range GR64-GR95 i.e 32 Registers is furthur sub-divided as
+; follows...
+; gr64-gr67 interrupt handlers.
+; gr68-gr71 OS temporaries I
+; gr72-gr79 OS temporaries II
+; gr80-gr95 OS statics. Dedicated throughout the operation of a program.
+
+
+;
+; 32 Registers for Operating System Use.
+;
+
+;
+; Assigning Names to Interrupt Handlers Registers.
+;
+
+ .reg OSint0, gr64
+ .reg OSint1, gr65
+ .reg OSint2, gr66
+ .reg OSint3, gr67
+
+ .equ ROSint0, &OSint0
+ .equ ROSint1, &OSint1
+ .equ ROSint2, &OSint2
+ .equ ROSint3, &OSint3
+
+ .global ROSint0, ROSint1, ROSint2, ROSint3
+
+ .reg TrapReg, gr64 ; trap register
+ .reg trapreg, gr64 ; trapreg
+
+ .equ RTrapReg, &TrapReg
+ .equ Rtrapreg, &trapreg
+
+ .global RTrapReg, Rtrapreg
+
+
+;
+; Assigning Names to Scratch/Temporary Registers.
+;
+
+ .reg OStmp0, gr68
+ .reg OStmp1, gr69
+ .reg OStmp2, gr70
+ .reg OStmp3, gr71
+
+ .reg OStmp4, gr72
+ .reg OStmp5, gr73
+ .reg OStmp6, gr74
+ .reg OStmp7, gr75
+
+ .reg OStmp8, gr76
+ .reg OStmp9, gr77
+ .reg OStmp10, gr78
+ .reg OStmp11, gr79
+
+ .equ ROStmp0, &OStmp0
+ .equ ROStmp1, &OStmp1
+ .equ ROStmp2, &OStmp2
+ .equ ROStmp3, &OStmp3
+
+ .equ ROStmp4, &OStmp4
+ .equ ROStmp5, &OStmp5
+ .equ ROStmp6, &OStmp6
+ .equ ROStmp7, &OStmp7
+
+ .equ ROStmp8, &OStmp8
+ .equ ROStmp9, &OStmp9
+ .equ ROStmp10, &OStmp10
+ .equ ROStmp11, &OStmp11
+
+ .global ROStmp0, ROStmp1, ROStmp2, ROStmp3
+ .global ROStmp4, ROStmp5, ROStmp6, ROStmp7
+ .global ROStmp8, ROStmp9, ROStmp10, ROStmp11
+
+;
+; Assigning Names to Statics/Permanent Registers.
+;
+
+ .reg OSsta0, gr80 ; Spill Address Register
+ .reg OSsta1, gr81 ; Fill Address Register
+ .reg OSsta2, gr82 ; Signal Address Register
+ .reg OSsta3, gr83 ; pcb Register
+
+ .reg OSsta4, gr84 ;
+ .reg OSsta5, gr85 ;
+ .reg OSsta6, gr86 ;
+ .reg OSsta7, gr87 ;
+
+ .reg OSsta8, gr88 ;
+ .reg OSsta9, gr89 ;
+ .reg OSsta10, gr90 ;
+ .reg OSsta11, gr91 ;
+
+ .reg OSsta12, gr92 ;
+ .reg OSsta13, gr93 ;
+ .reg OSsta14, gr94 ;
+ .reg OSsta15, gr95 ;
+
+;
+; Round 2 of Name Assignments
+;
+
+;
+; Assignment of Specific Use oriented names to statics.
+;
+ .reg SpillAddrReg, gr80
+ .reg FillAddrReg, gr81
+ .reg SignalAddrReg, gr82
+ .reg pcb, gr83
+
+ .reg etx, gr80
+ .reg ety, gr81
+ .reg etz, gr82
+ .reg etc, gr83
+
+;*
+
+ .reg TimerExt, gr84
+ .reg TimerUtil, gr85
+
+;*
+
+ .reg LEDReg, gr86
+ .reg ERRReg, gr87
+
+ .reg eta, gr86
+ .reg etb, gr87
+
+;*
+
+
+;* The following registers are used by switching code
+
+ .reg et0, gr88
+ .reg et1, gr89
+ .reg et2, gr90
+ .reg et3, gr91
+
+ .reg et4, gr92
+ .reg et5, gr93
+ .reg et6, gr94
+ .reg et7, gr95
+
+
+; The floating point trap handlers need a few static registers
+
+ .reg FPStat0, gr88
+ .reg FPStat1, gr89
+ .reg FPStat2, gr90
+ .reg FPStat3, gr91
+
+; The following registers are used temporarily during diagnostics.
+
+ .reg XLINXReg, gr92
+ .reg VMBCReg, gr93
+ .reg UARTReg, gr94
+ .reg ETHERReg, gr95
+
+;*
+
+;;*
+ .reg heapptr, gr90
+ .reg ArgvPtr, gr91
+;;*
+
+
+
+;
+;* Preparing to export Register Names for the Linkers benefit.
+;
+
+ .equ RSpillAddrReg, &SpillAddrReg
+ .equ RFillAddrReg, &FillAddrReg
+ .equ RSignalAddrReg, &SignalAddrReg
+ .equ Rpcb, &pcb
+
+ .equ Retx, &etx
+ .equ Rety, &ety
+ .equ Retz, &etz
+ .equ Reta, &eta
+
+ .equ Retb, &etb
+ .equ Retc, &etc
+ .equ RTimerExt, &TimerExt
+ .equ RTimerUtil, &TimerUtil
+
+ .equ RLEDReg, &LEDReg
+ .equ RERRReg, &ERRReg
+
+ .equ Ret0, &et0
+ .equ Ret1, &et1
+ .equ Ret2, &et2
+ .equ Ret3, &et3
+
+ .equ RFPStat0, &FPStat0
+ .equ RFPStat1, &FPStat1
+ .equ RFPStat2, &FPStat2
+ .equ RFPStat3, &FPStat3
+
+ .equ Rheapptr, &heapptr
+ .equ RHeapPtr, &heapptr
+ .equ RArgvPtr, &ArgvPtr
+
+ .equ Ret4, &et4
+ .equ Ret5, &et5
+ .equ Ret6, &et6
+ .equ Ret7, &et7
+
+ .equ RXLINXReg, &XLINXReg
+ .equ RVMBCReg, &VMBCReg
+ .equ RUARTReg, &UARTReg
+ .equ RETHERReg, &ETHERReg
+
+ .global RSpillAddrReg, RFillAddrReg, RSignalAddrReg
+ .global Rpcb, Retc
+ .global RTimerExt, RTimerUtil, RLEDReg, RERRReg
+ .global Ret0, Ret1, Ret2, Ret3, Ret4, Ret5, Ret6, Ret7, Reta, Retb
+ .global Retx, Rety, Retz
+ .global RFPStat0, RFPStat1, RFPStat2, RFPStat3
+ .global Rheapptr, RHeapPtr, RArgvPtr
+ .global RXLINXReg, RVMBCReg, RUARTReg, RETHERReg
+
+;
+;*************************************************************************
+;
+
+
+;
+; Rule 3:
+; Gr96-Gr127 Compiler & Programmer use registers.
+; 32 Registers for Compiler & Programmer use
+
+;
+; 16 Registers for Compiler Use.
+;
+
+;
+; Compiler Temporaries and Function Return Values
+;
+
+ .reg v0, gr96 ; First word of Return Value
+ .reg v1, gr97
+ .reg v2, gr98
+ .reg v3, gr99
+
+ .reg v4, gr100
+ .reg v5, gr101
+ .reg v6, gr102
+ .reg v7, gr103
+
+ .reg v8, gr104
+ .reg v9, gr105
+ .reg v10, gr106
+ .reg v11, gr107
+
+ .reg v12, gr108
+ .reg v13, gr109
+ .reg v14, gr110
+ .reg v15, gr111
+
+ .equ Rv0, &v0
+ .equ Rv1, &v1
+ .equ Rv2, &v2
+ .equ Rv3, &v3
+
+ .equ Rv4, &v4
+ .equ Rv5, &v5
+ .equ Rv6, &v6
+ .equ Rv7, &v7
+
+ .equ Rv8, &v8
+ .equ Rv9, &v9
+ .equ Rv10, &v10
+ .equ Rv11, &v11
+
+ .equ Rv12, &v12
+ .equ Rv13, &v13
+ .equ Rv14, &v14
+ .equ Rv15, &v15
+
+ .global Rv0, Rv1, Rv2, Rv3, Rv4, Rv5, Rv6, Rv7, Rv8, Rv9
+ .global Rv10, Rv11, Rv12, Rv13, Rv14, Rv15
+
+
+;
+; User Process Statics Registers
+;
+
+ .reg rp0, gr112 ; Reserved for Programmer, #0
+ .reg rp1, gr113 ; Reserved for Programmer, #1
+ .reg rp2, gr114 ; Reserved for Programmer, #2
+ .reg rp3, gr115 ; Reserved for Programmer, #3
+
+ .equ Rrp0, &rp0
+ .equ Rrp1, &rp1
+ .equ Rrp2, &rp2
+ .equ Rrp3, &rp3
+
+ .global Rrp0, Rrp1, Rrp2, Rrp3
+
+;
+; Compiler Temporaries II
+;
+
+ .reg tv0, gr116 ;
+ .reg tv1, gr117 ;
+ .reg tv2, gr118 ;
+ .reg tv3, gr119 ;
+ .reg tv4, gr120 ;
+
+ .equ Rtv0, &tv0 ;
+ .equ Rtv1, &tv1 ;
+ .equ Rtv2, &tv2 ;
+ .equ Rtv3, &tv3 ;
+ .equ Rtv4, &tv4 ;
+
+ .global Rtv0, Rtv1, Rtv2, Rtv3, Rtv4
+
+;
+; Special pointers and registers for handlers and stack operations.
+;
+
+ .reg tav, gr121 ; Temp, Arg for Trap Handlers
+ .reg tpc, gr122 ; Temp, Ret PC for Trap Handlers
+ .reg lrp, gr123 ; Large Return Pointer
+ .reg slp, gr124 ; Static Link Pointer
+
+ .reg msp, gr125 ; Memory Stack Pointer
+ .reg rab, gr126 ; Register Allocate Bound
+ .reg rfb, gr127 ; Register Free Bound
+
+ .equ Rtav, &tav
+ .equ Rtpc, &tpc
+ .equ Rlrp, &lrp
+ .equ Rslp, &slp
+ .equ Rmsp, &msp
+ .equ Rrab, &rab
+ .equ Rrfb, &rfb
+
+ .global Rtav, Rtpc, Rlrp, Rslp, Rmsp, Rrab, Rrfb
diff --git a/c/src/lib/start/i960/Makefile.in b/c/src/lib/start/i960/Makefile.in
new file mode 100644
index 0000000000..ca57ecd097
--- /dev/null
+++ b/c/src/lib/start/i960/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=start
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+PGM=${ARCH}/start.o
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/start/i960/start.s b/c/src/lib/start/i960/start.s
new file mode 100644
index 0000000000..0e5becb50d
--- /dev/null
+++ b/c/src/lib/start/i960/start.s
@@ -0,0 +1,110 @@
+/* entry.s
+ *
+ * This file contains the entry point for the application.
+ * The name of this entry point is compiler dependent.
+ * It jumps to the BSP which is responsible for performing
+ * all initialization.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+ BEGIN_CODE
+ PUBLIC(start) # GNU960 default entry point
+
+SYM(start):
+ mov 3, r12
+ modpc r12, r12, r12 # enable tracing/trace faults
+ mov g5, g5 # NOP
+ mov 0, g14 # initialize constant for C
+
+ /*
+ * zero out uninitialized data area
+ */
+zerobss:
+ lda _end, r4 /* find end of .bss */
+ lda _bss_start, r5 /* find beginning of .bss */
+ ldconst 0, r6
+
+loop: st r6, (r5) /* to zero out uninitialized */
+ addo 4, r5, r5 /* data area */
+ cmpobl r5, r4, loop /* loop until _end reached */
+
+/* set up stack pointer:
+ * The heap will begin at '_end'; its length is 'heap_size'
+ * bytes. The stack will begin at the first 64-byte-aligned
+ * block after the heap.
+ *
+ * A default value of 'heap_size' is set by linking with libnindy.a
+ * The default can be overridden by redefining this symbol at link
+ * time (with a line of the form 'heap_size=XXXX;' in the lnk960
+ * linker specification file; or one of the form
+ * "-defsym heap_size=XXXX" on the gld960 invocation line).
+ */
+
+ ldconst _end, sp /* set sp = address of end of heap */
+ lda heap_size(sp),sp
+ lda 64(sp), sp /* Now round up to 64-byte boundary */
+ ldconst 0xffffffc0, r12
+ and r12, sp, sp
+ st sp, _stack_start /* Save for brk() routine */
+
+ call init_frames
+ ret /* return to monitor */
+
+init_frames:
+ mov 0, g14 /* initialize constant for C */
+ ldconst 0x3b001000, g0
+ ldconst 0x00009107, g1
+ modac g1, g0, g0 /* set AC controls */
+
+ /*
+ * remember the frame, so that we can set it up if necessary
+ */
+
+ st fp, _start_frame
+
+ /*
+ * Call application mainline.
+ * Someday, real values of argc and argv will be set up.
+ * For now, they are set to 0.
+ */
+ ldconst 0,g0
+ ldconst 0,g1
+ ldconst 0,g2
+ call _main
+ ret
+
+END_CODE
+
+ BEGIN_DATA
+
+ PUBLIC(_start_frame)
+ PUBLIC(start_frame)
+SYM (_start_frame):
+SYM (start_frame):
+ .word 0 # addr of first user frame: for gdb960
+
+ PUBLIC(_stack_start)
+ PUBLIC(stack_start)
+SYM (_stack_start):
+SYM (stack_start):
+ .word 0 # addr of first user frame: for gdb960
+
+END_DATA
+
+BEGIN_BSS
+ PUBLIC(heap_size)
+ .set heap_size,0x2000
+END_BSS
+
+END
diff --git a/c/src/lib/start/m68k/Makefile.in b/c/src/lib/start/m68k/Makefile.in
new file mode 100644
index 0000000000..81f1f8d3dd
--- /dev/null
+++ b/c/src/lib/start/m68k/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGMS=${ARCH}/start.o
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=start
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGMS} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/start/m68k/start.s b/c/src/lib/start/m68k/start.s
new file mode 100644
index 0000000000..5c39cd52e2
--- /dev/null
+++ b/c/src/lib/start/m68k/start.s
@@ -0,0 +1,167 @@
+/* entry.s
+ *
+ * This file contains the entry point for the application.
+ * The name of this entry point is compiler dependent.
+ * It jumps to the BSP which is responsible for performing
+ * all initialization.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "asm.h"
+
+BEGIN_CODE
+ | Default entry points for:
+ PUBLIC (start) | GNU
+ PUBLIC (M68Kvec) | Vector Table
+
+SYM (start):
+SYM (M68Kvec): | standard location for vectors
+ nop | for linkers with problem
+ | location zero
+ jmp SYM (start_around)
+
+ /*
+ * We can use the following space as our vector table
+ * if the CPU has a VBR or we can save vector table in it
+ * if the CPU does not.
+ */
+
+ .space 4088 | to avoid initial intr stack
+ | from 135BUG on MVME13?
+ | and start code at 0x4000
+SYM (vectors):
+ .space 1016 | reserve space for rest of vectors
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+SYM (lowintstack):
+ .space 4092 | reserve for interrupt stack
+SYM (hiintstack):
+ .space 4 | end of interrupt stack
+#endif
+
+ PUBLIC (start_around)
+SYM (start_around):
+ move.w sr, SYM (initial_sr)
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ movec isp,a0
+ move.l a0, SYM (initial_isp)
+ movec usp,a0
+ move.l a0, SYM (initial_usp)
+ movec msp,a0
+ move.l a0, SYM (initial_msp)
+#else
+ move.l a7, SYM (initial_msp)
+#endif
+ oriw #0x0700,sr | INTERRUPTS OFF!!!
+
+
+
+ |
+ | zero out uninitialized data area
+ |
+zerobss:
+ moveal # SYM (end),a0 | find end of .bss
+ moveal # SYM (bss_start),a1 | find beginning of .bss
+ movel #0,d0
+
+loop: movel #0,a1@+ | to zero out uninitialized
+ cmpal a0,a1
+ jlt loop | loop until _end reached
+
+ movel # SYM (end),d0 | d0 = end of bss/start of heap
+ addl # SYM (heap_size),d0 | d0 = end of heap
+ movel d0, SYM (stack_start) | Save for brk() routine
+ addl # SYM (stack_size),d0 | make room for stack
+ andl #0xffffffc0,d0 | align it on 16 byte boundary
+ movw #0x3700,sr | SUPV MODE,INTERRUPTS OFF!!!
+ movel d0,a7 | set master stack pointer
+ movel d0,a6 | set base pointer
+
+ /*
+ * RTEMS should maintiain a separate interrupt stack on CPUs
+ * without one in hardware. This is currently not supported
+ * on versions of the m68k without a HW intr stack.
+ */
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ lea SYM (hiintstack),a0 | a0 = high end of intr stack
+ movec a0,isp | set interrupt stack
+#endif
+
+
+ movel #0,a7@- | push environp
+ movel #0,a7@- | push argv
+ movel #0,a7@- | push argc
+
+ jsr SYM (main)
+ addl #12,a7
+
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ move.l SYM (initial_isp),a0
+ movec a0,isp
+ move.l SYM (initial_usp),a0
+ movec a0,usp
+ move.l SYM (initial_msp),a0
+ movec a0,msp
+#else
+ movea.l SYM (initial_msp),a7
+#endif
+ move.w SYM (initial_sr),sr
+ rts
+
+END_CODE
+
+BEGIN_DATA
+
+ PUBLIC (start_frame)
+SYM (start_frame):
+ .space 4,0
+
+ PUBLIC (stack_start)
+SYM (stack_start):
+ .space 4,0
+END_DATA
+
+BEGIN_BSS
+
+ PUBLIC (environ)
+ .align 2
+SYM (environ):
+ .long 0
+
+ PUBLIC (initial_isp)
+SYM (initial_isp):
+ .space 4
+
+ PUBLIC (initial_msp)
+SYM (initial_msp):
+ .space 4
+
+ PUBLIC (initial_usp)
+SYM (initial_usp):
+ .space 4
+
+ PUBLIC (initial_sr)
+SYM (initial_sr):
+ .space 2
+
+ PUBLIC (heap_size)
+ .set SYM (heap_size),0x2000
+
+ PUBLIC (stack_size)
+ .set SYM (stack_size),0x1000
+
+
+END_DATA
+END
+
+
diff --git a/c/src/lib/start/mips64orion/Makefile.in b/c/src/lib/start/mips64orion/Makefile.in
new file mode 100644
index 0000000000..67478f0a83
--- /dev/null
+++ b/c/src/lib/start/mips64orion/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=idt_csu
+S_FILES=$(S_PIECES:%=%.S)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+PGM=${ARCH}/idt_csu.o
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(OBJS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/lib
diff --git a/c/src/lib/start/mips64orion/idt_csu.S b/c/src/lib/start/mips64orion/idt_csu.S
new file mode 100644
index 0000000000..8dc31c8999
--- /dev/null
+++ b/c/src/lib/start/mips64orion/idt_csu.S
@@ -0,0 +1,299 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*************************************************************************
+**
+** Copyright 1991-95 Integrated Device Technology, Inc.
+** All Rights Reserved
+**
+** idt_csu.S -- IDT stand alone startup code
+**
+**************************************************************************/
+#include <rtems/score/iregdef.h>
+#include <rtems/score/idtcpu.h>
+#include <rtems/score/idtmon.h>
+
+
+.extern _fbss,4 /* this is defined by the linker */
+.extern end,4 /* this is defined by the linker */
+
+.lcomm sim_mem_cfg_struct,12
+
+ .text
+
+
+#define TMP_STKSIZE 1024
+
+/**************************************************************************
+**
+** start - Typicl standalone start up code required for R3000/R4000
+**
+**
+** 1) Initialize the STATUS Register
+** a) Clear parity error bit
+** b) Set co_processor 1 usable bit ON
+** c) Clear all IntMask Enables
+** d) Set kernel/disabled mode
+** 2) Initialize Cause Register
+** a) clear software interrupt bits
+** 3) Determine FPU installed or not
+** if not, clear CoProcessor 1 usable bit
+** 4) Clear bss area
+** 5) MUST allocate temporary stack until memory size determined
+** It MUST be uncached to prevent overwriting when caches are cleared
+** 6) Install exception handlers
+** 7) Determine memory and cache sizes
+** 8) Establish permanent stack (cached or uncached as defined by bss)
+** 9) Flush Instruction and Data caches
+** 10) If there is a Translation Lookaside Buffer, Clear the TLB
+** 11) Execute initialization code if the IDT/c library is to be used
+**
+** 12) Jump to user's "main()"
+** 13) Jump to promexit
+**
+** IDT/C 5.x defines _R3000, IDT/C 6.x defines _R4000 internally.
+** This is used to mark code specific to R3xxx or R4xxx processors.
+** IDT/C 6.x defines __mips to be the ISA level for which we're
+** generating code. This is used to make sure the stack etc. is
+** double word aligned, when using -mips3 (default) or -mips2,
+** when compiling with IDT/C6.x
+**
+***************************************************************************/
+
+FRAME(start,sp,0,ra)
+
+ .set noreorder
+#ifdef _R3000
+ li v0,SR_PE|SR_CU1 /* reset parity error and set */
+ /* cp1 usable */
+#endif
+#ifdef _R4000
+#if __mips==3 || defined(R4650)
+ li v0,SR_CU1|SR_DE|SR_FR /* initally clear ERL, enable FPA 64bit regs*/
+ /* 4650: Need fr to be set anyway */
+#else
+ li v0,SR_CU1|SR_DE /* initally clear ERL, enable FPA 32bit regs*/
+#endif mips3
+#endif
+
+ mtc0 v0,C0_SR /* clr IntMsks/ kernel/disabled mode */
+ nop
+ mtc0 zero,C0_CAUSE /* clear software interrupts */
+ nop
+
+#ifdef _R4000
+ li v0,CFG_C_NONCOHERENT # initialise default cache mode
+ mtc0 v0,C0_CONFIG
+#endif
+
+/*
+** check to see if an fpu is really plugged in
+*/
+ li t3,0xaaaa5555 /* put a's and 5's in t3 */
+ mtc1 t3,fp0 /* try to write them into fp0 */
+ mtc1 zero,fp1 /* try to write zero in fp */
+ mfc1 t0,fp0
+ mfc1 t1,fp1
+ nop
+ bne t0,t3,1f /* branch if no match */
+ nop
+ bne t1,zero,1f /* double check for positive id */
+ nop
+ /* We have a FPU. clear fcsr */
+ ctc1 zero, fcr31
+ j 2f /* status register already correct */
+ nop
+1:
+#ifdef _R3000
+ li v0, SR_PE /* reset parity error/NO cp1 usable */
+#endif
+
+#ifdef _R4000
+ li v0,SR_DE /* clear ERL and disable FPA */
+#endif
+
+ mtc0 v0, C0_SR /* reset status register */
+2:
+ la gp, _gp
+
+ la v0,_fbss /* clear bss before using it */
+ la v1,end /* end of bss */
+3: sw zero,0(v0)
+ bltu v0,v1,3b
+ add v0,4
+
+
+/************************************************************************
+**
+** Temporary Stack - needed to handle stack saves until
+** memory size is determined and permanent stack set
+**
+** MUST be uncached to avoid confusion at cache
+** switching during memory sizing
+**
+*************************************************************************/
+#if __mips==3
+ /* For MIPS 3, we need to be sure that the stack is aligned on a
+ * double word boundary.
+ */
+ andi t0, v0, 0x7
+ beqz t0, 11f /* Last three bits Zero, already aligned */
+ nop
+ add v0, 4
+11:
+#endif
+
+ or v0, K1BASE /* switch to uncached */
+ add v1, v0, TMP_STKSIZE /* end of bss + length of tmp stack */
+ sub v1, v1, (4*4) /* overhead */
+ move sp, v1 /* set sp to top of stack */
+4: sw zero, 0(v0)
+ bltu v0, v1, 4b /* clear out temp stack */
+ add v0, 4
+
+ jal init_exc_vecs /* install exception handlers */
+ nop /* MUST do before memory probes */
+
+ la v0, 5f
+ li v1, K1BASE /* force into uncached space */
+ or v0, v1 /* during memory/cache probes */
+ j v0
+ nop
+5:
+ la a0, sim_mem_cfg_struct
+ jal sim_mem_cfg /* Make SIM call to get mem size */
+ nop
+ la a0, sim_mem_cfg_struct
+ lw a0, 0(a0) /* Get memory size from struct */
+#ifdef _R3000
+ jal config_Icache
+ nop
+ jal config_Dcache /* determine size of D & I caches */
+ nop
+#endif
+#ifdef _R4000
+ jal config_cache /* determine size of D & I caches */
+ nop
+#endif
+
+ move v0, a0 /* mem_size */
+
+#if __mips==3
+ /* For MIPS 3, we need to be sure that the stack (and hence v0
+ * here) is aligned on a double word boundary.
+ */
+ andi t0, v0, 0x7
+ beqz t0, 12f /* Last three bits Zero, already aligned */
+ nop
+ subu v0, 4 /* mem_size was not aligned on doubleword bdry????*/
+12:
+#endif
+
+
+
+/**************************************************************************
+**
+** Permanent Stack - now know top of memory, put permanent stack there
+**
+***************************************************************************/
+
+ la t2, _fbss /* cache mode as linked */
+ and t2, 0xF0000000 /* isolate segment */
+ la t1, 6f
+ j t1 /* back to original cache mode */
+ nop
+6:
+ or v0, t2 /* stack back to original cache mode */
+ addiu v0,v0,-16 /* overhead */
+ move sp, v0 /* now replace count w top of memory */
+ move v1, v0
+ subu v1, P_STACKSIZE /* clear requested stack size */
+
+7: sw zero, 0(v1) /* clear P_STACKSIZE stack */
+ bltu v1,v0,7b
+ add v1, 4
+ .set reorder
+
+#ifdef _R3000
+ jal flush_Icache
+ jal flush_Dcache /* flush Data & Instruction caches */
+#endif
+#ifdef _R4000
+ jal flush_cache_nowrite /* flush Data & Instruction caches */
+#endif
+
+
+
+/**************************************************************************
+**
+** If this chip supports a Translation Lookaside Buffer, clear it
+**
+***************************************************************************/
+
+ .set noreorder
+ mfc0 t1, C0_SR /* look at Status Register */
+ nop
+ .set reorder
+#ifdef _R3000
+ li t2, SR_TS /* TLB Shutdown bit */
+ and t1,t2 /* TLB Shutdown if 1 */
+ bnez t1, 8f /* skip clearing if no TLB */
+#endif
+
+#ifndef R4650
+ jal init_tlb /* clear the tlb */
+#endif
+
+
+/************************************************************************
+**
+** Initialization required if using IDT/c or libc.a, standard C Lib
+**
+** can SKIP if not necessary for application
+**
+************************************************************************/
+8:
+
+ jal idtsim_init_sbrk
+ jal idtsim_init_file
+/*********************** END I/O initialization **********************/
+
+
+ jal main
+
+ jal idtsim_promexit
+
+ENDFRAME(start)
+
+
+ .globl sim_mem_cfg
+sim_mem_cfg:
+ .set noat
+ .set noreorder
+ li AT, (0xbfc00000+((55)*8))
+ jr AT
+ nop
+ .set at
+ .set reorder
diff --git a/c/src/lib/wrapup/Makefile.in b/c/src/lib/wrapup/Makefile.in
new file mode 100644
index 0000000000..0316d5c56b
--- /dev/null
+++ b/c/src/lib/wrapup/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+# build and install "glommed" librtemsall.a
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+LIB=$(PROJECT_HOME)/lib/librtemsall.a
+
+SRCS=$(wildcard $(PROJECT_HOME)/lib/libbsp$(LIB_VARIANT).a) \
+ $(PROJECT_HOME)/lib/librtems$(LIB_VARIANT).a \
+ $(wildcard $(PROJECT_HOME)/lib/libposix$(LIB_VARIANT).a) \
+ $(PROJECT_HOME)/lib/libcsupport$(LIB_VARIANT).a \
+ $(wildcard $(PROJECT_HOME)/lib/rtems-ctor$(LIB_VARIANT).o) \
+ $(wildcard $(PROJECT_HOME)/lib/libno-ctor$(LIB_VARIANT).a)
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(ARCH) $(LIB)
+
+$(LIB): $(SRCS)
+ $(PROJECT_RELEASE)/build-tools/rtems-glom \
+ -d $(PROJECT_HOME)/lib -v -V "$(LIB_VARIANT)" -a $(AR)
+
+install: all
+
diff --git a/c/src/libchip/shmdr/README b/c/src/libchip/shmdr/README
new file mode 100644
index 0000000000..5ed9e861b0
--- /dev/null
+++ b/c/src/libchip/shmdr/README
@@ -0,0 +1,9 @@
+#
+# $Id$
+#
+
+The mpci.h file provided in here is too simple for an MPCI with
+multiple ways to get to a node.
+
+This version of the shm driver needs to be reorganized to follow
+the better model of the Ada version.
diff --git a/c/src/libchip/shmdr/addlq.c b/c/src/libchip/shmdr/addlq.c
new file mode 100644
index 0000000000..f139fbf645
--- /dev/null
+++ b/c/src/libchip/shmdr/addlq.c
@@ -0,0 +1,43 @@
+/* void Shm_Locked_queue_Add( lq_cb, ecb )
+ *
+ * This routine adds an envelope control block to a shared memory queue.
+ *
+ * Input parameters:
+ * lq_cb - pointer to a locked queue control block
+ * ecb - pointer to an envelope control block
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Locked_queue_Add(
+ Shm_Locked_queue_Control *lq_cb,
+ Shm_Envelope_control *ecb
+)
+{
+ rtems_unsigned32 index;
+
+ ecb->next = Shm_Locked_queue_End_of_list;
+ ecb->queue = lq_cb->owner;
+ index = ecb->index;
+
+ Shm_Lock( lq_cb );
+ if ( Shm_Convert(lq_cb->front) != Shm_Locked_queue_End_of_list )
+ Shm_Envelopes[ Shm_Convert(lq_cb->rear) ].next = index;
+ else
+ lq_cb->front = index;
+ lq_cb->rear = index;
+ Shm_Unlock( lq_cb );
+}
diff --git a/c/src/libchip/shmdr/cnvpkt.c b/c/src/libchip/shmdr/cnvpkt.c
new file mode 100644
index 0000000000..70f3047d8c
--- /dev/null
+++ b/c/src/libchip/shmdr/cnvpkt.c
@@ -0,0 +1,42 @@
+/* void Shm_Convert_packet( &packet )
+ *
+ * This routine is the shared memory locked queue MPCI driver routine
+ * used to convert the RTEMS's information in a packet from non-native
+ * format to processor native format.
+ *
+ * Input parameters:
+ * packet - pointer to a packet
+ *
+ * Output parameters:
+ * *packet - packet in native format
+ *
+ * NOTE: Message buffers are not manipulated.
+ * Endian conversion is currently the only conversion.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Convert_packet(
+ rtems_packet_prefix *packet
+)
+{
+ rtems_unsigned32 *pkt, i;
+
+ pkt = (rtems_unsigned32 *) packet;
+ for ( i=RTEMS_MINIMUN_HETERO_CONVERSION ; i ; i--, pkt++ )
+ *pkt = CPU_swap_u32( *pkt );
+
+ for ( i=packet->to_convert ; i ; i--, pkt++ )
+ *pkt = CPU_swap_u32( *pkt );
+}
diff --git a/c/src/libchip/shmdr/dump.c b/c/src/libchip/shmdr/dump.c
new file mode 100644
index 0000000000..dc0bf850a7
--- /dev/null
+++ b/c/src/libchip/shmdr/dump.c
@@ -0,0 +1,51 @@
+/*
+ * This routine is invoked following a reset to report the statistics
+ * gathered during the previous execution.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdio.h>
+
+#include "shm.h"
+
+void
+Shm_Print_statistics(void)
+{
+ rtems_unsigned32 ticks;
+ rtems_unsigned32 ticks_per_second;
+ rtems_unsigned32 seconds;
+ int packets_per_second;
+
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &ticks );
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticks_per_second );
+
+ seconds = ticks / ticks_per_second;
+ if ( seconds == 0 )
+ seconds = 1;
+
+ packets_per_second = Shm_Receive_message_count / seconds;
+ if ( (Shm_Receive_message_count % seconds) >= (seconds / 2) )
+ packets_per_second++;
+
+ printf( "\n\nSHMDR STATISTICS (NODE %d)\n", Shm_Local_node );
+ printf( "TICKS SINCE BOOT = %d\n", ticks );
+ printf( "TICKS PER SECOND = %d\n", ticks_per_second );
+ printf( "ISRs=%d\n", Shm_Interrupt_count );
+ printf( "RECV=%d\n", Shm_Receive_message_count );
+ printf( "NULL=%d\n", Shm_Null_message_count );
+ printf( "PKTS/SEC=%d\n", packets_per_second );
+}
diff --git a/c/src/libchip/shmdr/fatal.c b/c/src/libchip/shmdr/fatal.c
new file mode 100644
index 0000000000..453349d0e0
--- /dev/null
+++ b/c/src/libchip/shmdr/fatal.c
@@ -0,0 +1,39 @@
+/* void MPCI_Fatal( error )
+ *
+ * This routine is the shared memory driver fatal error handler.
+ *
+ * Input parameters:
+ * error - fatal error code
+ *
+ * Output parameters: NEVER RETURNS
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void MPCI_Fatal(
+ Internal_errors_Source source,
+ boolean is_internal,
+ rtems_unsigned32 error
+)
+{
+ /* Eventually need to attempt to broadcast a K_FATAL message
+ * without checking for all possible errors (do not want to
+ * recurse).
+ *
+ * Also need to avoid using Shm_Node_statuses if the driver has not been
+ * initialized.
+ */
+
+ Shm_Local_node_status->error = Shm_Convert(error);
+}
diff --git a/c/src/libchip/shmdr/getlq.c b/c/src/libchip/shmdr/getlq.c
new file mode 100644
index 0000000000..6233226eaa
--- /dev/null
+++ b/c/src/libchip/shmdr/getlq.c
@@ -0,0 +1,48 @@
+/* Shm_Envelope_control *Shm_Locked_queue_Get( lq_cb )
+ *
+ * This routine returns an envelope control block from a shared
+ * memory queue.
+ *
+ * Input parameters:
+ * lq_cb - pointer to a locked queue control block
+ *
+ * Output parameters:
+ * returns - pointer to an envelope control block
+ * - NULL if no envelopes on specified queue
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <shm.h>
+
+Shm_Envelope_control *Shm_Locked_queue_Get(
+ Shm_Locked_queue_Control *lq_cb
+)
+{
+ Shm_Envelope_control *tmp_ecb;
+ rtems_unsigned32 tmpfront;
+
+ tmp_ecb = NULL;
+ Shm_Lock( lq_cb );
+
+ tmpfront = Shm_Convert(lq_cb->front);
+ if ( tmpfront != Shm_Locked_queue_End_of_list ) {
+ tmp_ecb = &Shm_Envelopes[ tmpfront ];
+ lq_cb->front = tmp_ecb->next;
+ if ( tmp_ecb->next == Shm_Locked_queue_End_of_list )
+ lq_cb->rear = Shm_Locked_queue_End_of_list;
+ tmp_ecb->next = Shm_Locked_queue_Not_on_list;
+ }
+
+ Shm_Unlock( lq_cb );
+ return( tmp_ecb );
+}
diff --git a/c/src/libchip/shmdr/getpkt.c b/c/src/libchip/shmdr/getpkt.c
new file mode 100644
index 0000000000..842b312816
--- /dev/null
+++ b/c/src/libchip/shmdr/getpkt.c
@@ -0,0 +1,36 @@
+/* Shm_Get_packet
+ *
+ * This routine is the shared memory locked queue MPCI driver
+ * routine used to obtain an empty message packet.
+ *
+ * Input parameters:
+ * packet - address of pointer to packet
+ *
+ * Output parameters:
+ * *(cpb->get_packet) - address of allocated packet
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_mpci_entry Shm_Get_packet(
+ rtems_packet_prefix **packet
+)
+{
+ Shm_Envelope_control *ecb;
+
+ ecb = Shm_Allocate_envelope();
+ if ( !ecb )
+ rtems_fatal_error_occurred ( SHM_NO_FREE_PKTS );
+ *packet = Shm_Envelope_control_to_packet_prefix_pointer( ecb );
+}
diff --git a/c/src/libchip/shmdr/init.c b/c/src/libchip/shmdr/init.c
new file mode 100644
index 0000000000..c77d527682
--- /dev/null
+++ b/c/src/libchip/shmdr/init.c
@@ -0,0 +1,254 @@
+/* Shm_Initialization
+ *
+ * This routine is the shared memory communications initerface
+ * driver initialization routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define _SHM_INIT
+
+#include <rtems.h>
+#include <shm.h>
+
+#include <string.h> /* memset() */
+#include <stdlib.h> /* malloc() */
+#include <assert.h>
+
+/*
+ * User extension to install MPCI_Fatal as a fatal error
+ * handler extension
+ */
+
+rtems_extensions_table MPCI_Shm_extensions;
+
+rtems_mpci_entry Shm_Initialization( void )
+
+{
+ rtems_unsigned32 i, all_initialized;
+ rtems_unsigned32 interrupt_cause, interrupt_value;
+ void *interrupt_address;
+ Shm_Node_status_control *nscb;
+ rtems_unsigned32 extension_id; /* for installation of MPCI_Fatal */
+ rtems_unsigned32 remaining_memory;
+/* XXX these should use "public" methods to set their values.... */
+ rtems_configuration_table *configuration = _Configuration_Table;
+ rtems_multiprocessing_table *mp_configuration = _Configuration_MP_table;
+
+ Shm_RTEMS_Configuration = configuration;
+ Shm_RTEMS_MP_Configuration = mp_configuration;
+
+ Shm_Local_node = Shm_RTEMS_MP_Configuration->node;
+ Shm_Maximum_nodes = Shm_RTEMS_MP_Configuration->maximum_nodes;
+
+ Shm_Get_configuration( Shm_Local_node, &Shm_Configuration );
+
+ Shm_Interrupt_table = (Shm_Interrupt_information *) malloc(
+ sizeof(Shm_Interrupt_information) * (Shm_Maximum_nodes + 1)
+ );
+
+ assert( Shm_Interrupt_table );
+
+
+ Shm_Receive_message_count = 0;
+ Shm_Null_message_count = 0;
+ Shm_Interrupt_count = 0;
+
+ /*
+ * Set the Node Status indicators
+ */
+
+ Shm_Pending_initialization =
+ Shm_Convert(rtems_build_name( 'P', 'E', 'N', 'D' ));
+ Shm_Initialization_complete =
+ Shm_Convert(rtems_build_name( 'C', 'O', 'M', 'P' ));
+ Shm_Active_node =
+ Shm_Convert(rtems_build_name( 'A', 'C', 'T', 'V' ));
+
+ /*
+ * Initialize the constants used by the Locked Queue code.
+ */
+
+ Shm_Locked_queue_End_of_list = Shm_Convert( 0xffffffff );
+ Shm_Locked_queue_Not_on_list = Shm_Convert( 0xfffffffe );
+
+ /*
+ * Set the base addresses for the:
+ * + Node Status Table
+ * + Free Pool and Receive Queues
+ * + Envelopes
+ */
+
+ Shm_Node_statuses = (Shm_Node_status_control *) START_NS_CBS;
+ Shm_Locked_queues = (Shm_Locked_queue_Control *) START_LQ_CBS;
+ Shm_Envelopes = (Shm_Envelope_control *) START_ENVELOPES;
+
+ /*
+ * Calculate the maximum number of envelopes which can be
+ * placed the remaining shared memory.
+ */
+
+ remaining_memory =
+ ((void *)Shm_Configuration->base + Shm_Configuration->length) -
+ ((void *)Shm_Envelopes);
+
+ Shm_Maximum_envelopes = remaining_memory / sizeof( Shm_Envelope_control );
+ Shm_Maximum_envelopes -= 1;
+
+ /*
+ * Set the pointer to the receive queue for the local node.
+ * When we receive a node, we will get it from here before
+ * processing it.
+ */
+
+ Shm_Local_receive_queue = &Shm_Locked_queues[ Shm_Local_node ];
+ Shm_Local_node_status = &Shm_Node_statuses[ Shm_Local_node ];
+
+ /*
+ * Convert local interrupt cause information into the
+ * neutral format so other nodes will be able to
+ * understand it.
+ */
+
+ interrupt_address =
+ (void *) Shm_Convert( (rtems_unsigned32)Shm_Configuration->Intr.address );
+ interrupt_value = Shm_Convert( Shm_Configuration->Intr.value );
+ interrupt_cause = Shm_Convert( Shm_Configuration->Intr.length );
+
+ if ( Shm_Configuration->poll_intr == POLLED_MODE ) Shm_setclockvec();
+ else Shm_setvec();
+
+ if ( Shm_Is_master_node() ) {
+
+ /*
+ * Zero out the shared memory area.
+ */
+
+ (void) memset(
+ (void *) Shm_Configuration->base,
+ 0,
+ Shm_Configuration->length
+ );
+
+ /*
+ * Initialize all of the locked queues (the free envelope
+ * pool and a receive queue per node) and set all of the
+ * node's status so they will be waiting to initialization
+ * to complete.
+ */
+
+ Shm_Locked_queue_Initialize( FREE_ENV_CB, FREE_ENV_POOL );
+
+ for ( i=SHM_FIRST_NODE ; i<=Shm_Maximum_nodes ; i++ ) {
+ Shm_Initialize_receive_queue( i );
+
+ Shm_Node_statuses[ i ].status = Shm_Pending_initialization;
+ Shm_Node_statuses[ i ].error = 0;
+ }
+
+ /*
+ * Initialize all of the envelopes and place them in the
+ * free pool.
+ */
+
+ for ( i=0 ; i<Shm_Maximum_envelopes ; i++ ) {
+ Shm_Envelopes[ i ].index = Shm_Convert(i);
+ Shm_Free_envelope( &Shm_Envelopes[ i ] );
+ }
+
+ /*
+ * Initialize this node's interrupt information in the
+ * shared area so other nodes can interrupt us.
+ */
+
+ Shm_Local_node_status->int_address = (rtems_unsigned32) interrupt_address;
+ Shm_Local_node_status->int_value = interrupt_value;
+ Shm_Local_node_status->int_length = interrupt_cause;
+
+ Shm_Local_node_status->status = Shm_Initialization_complete;
+
+ /*
+ * Loop until all nodes have completed initialization.
+ */
+
+ do {
+ all_initialized = 1;
+
+ for ( i = SHM_FIRST_NODE ; i <= Shm_Maximum_nodes ; i++ )
+ if ( Shm_Node_statuses[ i ].status != Shm_Initialization_complete )
+ all_initialized = 0;
+
+ } while ( all_initialized == 0 );
+
+ /*
+ * Tell the other nodes we think that the system is up.
+ */
+
+ for ( i = SHM_FIRST_NODE ; i <= Shm_Maximum_nodes ; i++ )
+ Shm_Node_statuses[ i ].status = Shm_Active_node;
+
+ } else { /* is not MASTER node */
+
+ /*
+ * Initialize the node status for the non-master nodes.
+ * Because the master node zeroes out memory, it is
+ * necessary for them to keep putting their values in
+ * the node status area until the master says they
+ * should become active.
+ */
+
+ Shm_Local_node_status->status = Shm_Pending_initialization;
+
+ do {
+
+ if ( Shm_Local_node_status->status == Shm_Pending_initialization ) {
+
+ /*
+ * Initialize this node's interrupt information in the
+ * shared area so other nodes can interrupt us.
+ */
+
+ Shm_Local_node_status->int_address =
+ (rtems_unsigned32) interrupt_address;
+ Shm_Local_node_status->int_value = interrupt_value;
+ Shm_Local_node_status->int_length = interrupt_cause;
+
+ Shm_Local_node_status->status = Shm_Initialization_complete;
+ }
+ } while ( Shm_Local_node_status->status != Shm_Active_node ) ;
+ }
+
+ /*
+ * Initialize the Interrupt Information Table
+ */
+
+ for ( i = SHM_FIRST_NODE ; i <= Shm_Maximum_nodes ; i++ ) {
+ nscb = &Shm_Node_statuses[ i ];
+
+ Shm_Interrupt_table[i].address = Shm_Convert_address(
+ (void *)Shm_Convert(((vol_u32) nscb->int_address))
+ );
+ Shm_Interrupt_table[i].value = Shm_Convert( nscb->int_value );
+ Shm_Interrupt_table[i].length = Shm_Convert( nscb->int_length );
+ }
+
+ MPCI_Shm_extensions.fatal = MPCI_Fatal;
+
+ (void) rtems_extension_create(
+ rtems_build_name( 'M', 'P', 'E', 'X' ),
+ &MPCI_Shm_extensions,
+ &extension_id
+ );
+}
diff --git a/c/src/libchip/shmdr/initlq.c b/c/src/libchip/shmdr/initlq.c
new file mode 100644
index 0000000000..eb98d82176
--- /dev/null
+++ b/c/src/libchip/shmdr/initlq.c
@@ -0,0 +1,35 @@
+/* void Shm_Locked_queue_Initialize( lq_cb, owner )
+ *
+ * This routine initializes a shared memory locked queue.
+ *
+ * Input parameters:
+ * lq_cb - pointer to the control block of the queue
+ * to be initialized
+ * owner - unique idenitifier of who owns this queue.
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Locked_queue_Initialize(
+ Shm_Locked_queue_Control *lq_cb,
+ rtems_unsigned32 owner
+)
+{
+ Shm_Initialize_lock( lq_cb );
+ lq_cb->front = Shm_Locked_queue_End_of_list;
+ lq_cb->rear = Shm_Locked_queue_End_of_list;
+ lq_cb->owner = Shm_Convert(owner);
+}
diff --git a/c/src/libchip/shmdr/intr.c b/c/src/libchip/shmdr/intr.c
new file mode 100644
index 0000000000..d809471fec
--- /dev/null
+++ b/c/src/libchip/shmdr/intr.c
@@ -0,0 +1,58 @@
+/* void Shm_Cause_interrupt( node )
+ *
+ * This routine is the shared memory driver routine which
+ * generates interrupts to other CPUs.
+ *
+ * It uses the information placed in the node status control
+ * block by each node. For example, when used with the Motorola
+ * MVME136 board, the MPCSR is used.
+ *
+ * Input parameters:
+ * node - destination of this packet (0 = broadcast)
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+void Shm_Cause_interrupt(
+ rtems_unsigned32 node
+)
+{
+ Shm_Interrupt_information *intr;
+ rtems_unsigned8 *u8;
+ rtems_unsigned16 *u16;
+ rtems_unsigned32 *u32;
+ rtems_unsigned32 value;
+
+ intr = &Shm_Interrupt_table[node];
+ value = intr->value;
+
+ switch ( intr->length ) {
+ case NO_INTERRUPT:
+ break;
+ case BYTE:
+ u8 = (rtems_unsigned8 *)intr->address;
+ *u8 = (rtems_unsigned8) value;
+ break;
+ case WORD:
+ u16 = (rtems_unsigned16 *)intr->address;
+ *u16 = (rtems_unsigned16) value;
+ break;
+ case LONG:
+ u32 = (rtems_unsigned32 *)intr->address;
+ *u32 = (rtems_unsigned32) value;
+ break;
+ }
+}
diff --git a/c/src/libchip/shmdr/mpci.h b/c/src/libchip/shmdr/mpci.h
new file mode 100644
index 0000000000..8c6aaf8654
--- /dev/null
+++ b/c/src/libchip/shmdr/mpci.h
@@ -0,0 +1,59 @@
+/* mpci.h
+ *
+ * This include file contains all the renaming necessary to
+ * have an application use the Shared Memory Driver as its
+ * sole mechanism for MPCI.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SHM_MPCI_h
+#define __SHM_MPCI_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <shm.h>
+
+#define MPCI_Initialization( _configuration ) \
+ Shm_Initialization( _configuration )
+
+#define MPCI_Get_packet( _the_packet ) \
+ Shm_Get_packet( _the_packet )
+
+#define MPCI_Return_packet( _the_packet ) \
+ Shm_Return_packet( _the_packet )
+
+#define MPCI_Receive_packet( _the_packet ) \
+ Shm_Receive_packet( _the_packet )
+
+#define MPCI_Send_packet( _destination, _the_packet ) \
+ Shm_Send_packet( _destination, _the_packet )
+
+/* Unnecessary... mapped in shm.h
+#define MPCI_Fatal( _the_error ) \
+ Shm_Fatal( _the_error )
+*/
+
+#define MPCI_Enable_statistics()
+
+#define MPCI_Print_statistics() \
+ Shm_Print_statistics()
+
+/* no need to rename the MPCI_Table either */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/libchip/shmdr/mpisr.c b/c/src/libchip/shmdr/mpisr.c
new file mode 100644
index 0000000000..116956fe2e
--- /dev/null
+++ b/c/src/libchip/shmdr/mpisr.c
@@ -0,0 +1,23 @@
+/* _Shm_isr()
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_isr Shm_isr(
+ rtems_vector_number vector
+)
+{
+ Shm_Interrupt_count += 1;
+ rtems_multiprocessing_announce();
+}
diff --git a/c/src/libchip/shmdr/poll.c b/c/src/libchip/shmdr/poll.c
new file mode 100644
index 0000000000..9afe6883df
--- /dev/null
+++ b/c/src/libchip/shmdr/poll.c
@@ -0,0 +1,53 @@
+/* void Shm_Poll()
+ *
+ * This routine polls to see if a packet has arrived. If one
+ * has it informs the executive. It is typically called from
+ * the clock tick interrupt service routine.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/libio.h>
+
+#include "shm.h"
+
+void Shm_Poll()
+{
+ rtems_unsigned32 tmpfront;
+ rtems_libio_ioctl_args_t args;
+
+ /* invoke clock isr */
+ args.iop = 0;
+ args.command = rtems_build_name('I', 'S', 'R', ' ');
+ (void) rtems_io_control(rtems_clock_major, rtems_clock_minor, &args);
+
+ /*
+ * Check for msgs only if we are "up"
+ * This avoids a race condition where we may get a clock
+ * interrupt before MPCI has completed its init
+ */
+
+ if (_System_state_Is_up(_System_state_Get()))
+ {
+ tmpfront = Shm_Local_receive_queue->front;
+ if ( Shm_Convert(tmpfront) != Shm_Locked_queue_End_of_list )
+ {
+ rtems_multiprocessing_announce();
+ Shm_Interrupt_count++;
+ }
+ }
+}
diff --git a/c/src/libchip/shmdr/receive.c b/c/src/libchip/shmdr/receive.c
new file mode 100644
index 0000000000..f786379bde
--- /dev/null
+++ b/c/src/libchip/shmdr/receive.c
@@ -0,0 +1,44 @@
+/* Shm_Receive_packet
+ *
+ * This routine is the shared memory locked queue MPCI driver routine
+ * used to obtain a packet containing a message from this node's
+ * receive queue.
+ *
+ * Input parameters:
+ * packet - address of a pointer to a packet
+ *
+ * Output parameters:
+ * *(rpb->packet) - pointer to packet
+ * NULL if no packet currently available
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_mpci_entry Shm_Receive_packet(
+ rtems_packet_prefix **packet
+)
+{
+ Shm_Envelope_control *ecb;
+
+ ecb = Shm_Locked_queue_Get( Shm_Local_receive_queue );
+ if ( ecb ) {
+ *(packet) = Shm_Envelope_control_to_packet_prefix_pointer( ecb );
+ if ( ecb->Preamble.endian != Shm_Configuration->format )
+ Shm_Convert_packet( *packet );
+ Shm_Receive_message_count++;
+ } else {
+ *(packet) = NULL;
+ Shm_Null_message_count++;
+ }
+}
diff --git a/c/src/libchip/shmdr/retpkt.c b/c/src/libchip/shmdr/retpkt.c
new file mode 100644
index 0000000000..4cdc07e097
--- /dev/null
+++ b/c/src/libchip/shmdr/retpkt.c
@@ -0,0 +1,32 @@
+/* Shm_Return_packet
+ *
+ * This routine is the shared memory locked queue MPCI driver
+ * routine used to return a message packet to a free envelope
+ * pool accessible by this node.
+ *
+ * Input parameters:
+ * packet - address of pointer to packet
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+rtems_mpci_entry Shm_Return_packet(
+ rtems_packet_prefix *packet
+)
+{
+ Shm_Free_envelope( Shm_Packet_prefix_to_envelope_control_pointer(packet) );
+}
+
diff --git a/c/src/libchip/shmdr/send.c b/c/src/libchip/shmdr/send.c
new file mode 100644
index 0000000000..5150aa4869
--- /dev/null
+++ b/c/src/libchip/shmdr/send.c
@@ -0,0 +1,61 @@
+/* Shm_Send_packet
+ *
+ * This routine is the shared memory driver locked queue write
+ * MPCI driver routine. This routine sends the specified packet
+ * to the destination specified by "node". A "node" value of
+ * zero designates that this packet is to be broadcasted.
+ *
+ * Input parameters:
+ * node - destination of this packet (0 = broadcast)
+ * packet - address of packet
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "shm.h"
+
+struct pkt_cpy {
+ rtems_unsigned32 packet[MAX_PACKET_SIZE/4];
+};
+
+rtems_mpci_entry Shm_Send_packet(
+ rtems_unsigned32 node,
+ rtems_packet_prefix *packet
+)
+{
+ Shm_Envelope_control *ecb, *tmp_ecb;
+ rtems_unsigned32 nnum;
+
+ ecb = Shm_Packet_prefix_to_envelope_control_pointer( packet );
+ if ( node ) {
+ Shm_Build_preamble( ecb, node );
+ Shm_Build_postamble( ecb );
+ Shm_Append_to_receive_queue( node, ecb );
+ (*Shm_Configuration->cause_intr)( node );
+ }
+ else {
+ for( nnum = SHM_FIRST_NODE ; nnum <= Shm_Maximum_nodes ; nnum++ )
+ if ( Shm_Local_node != nnum ) {
+ tmp_ecb = Shm_Allocate_envelope();
+ if ( !tmp_ecb )
+ rtems_fatal_error_occurred( SHM_NO_FREE_PKTS );
+ Shm_Build_preamble( tmp_ecb, nnum );
+ *((struct pkt_cpy *)tmp_ecb->packet) = *((struct pkt_cpy *)packet);
+ Shm_Build_postamble( tmp_ecb );
+ Shm_Append_to_receive_queue( nnum, tmp_ecb );
+ (*Shm_Configuration->cause_intr)( nnum );
+ }
+ Shm_Free_envelope( ecb );
+ }
+}
diff --git a/c/src/libchip/shmdr/setckvec.c b/c/src/libchip/shmdr/setckvec.c
new file mode 100644
index 0000000000..68477e1cf7
--- /dev/null
+++ b/c/src/libchip/shmdr/setckvec.c
@@ -0,0 +1,34 @@
+/* Shm_setclockvec
+ *
+ * This routines installs the shared memory clock interrupt handler
+ * used when the driver is used in polling mode.
+ *
+ * INPUT PARAMETERS: NONE
+ *
+ * OUTPUT PARAMETERS: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/libio.h>
+
+#include "shm.h"
+
+rtems_isr Shm_setclockvec()
+{
+ rtems_libio_ioctl_args_t args;
+ args.iop = 0;
+ args.command = rtems_build_name('N', 'E', 'W', ' ');
+ args.buffer = (void *) Shm_Poll;
+
+ (void) rtems_io_control(rtems_clock_major, rtems_clock_minor, &args);
+}
diff --git a/c/src/libchip/shmdr/shm_driver.h b/c/src/libchip/shmdr/shm_driver.h
new file mode 100644
index 0000000000..45c4c76ad5
--- /dev/null
+++ b/c/src/libchip/shmdr/shm_driver.h
@@ -0,0 +1,539 @@
+/* shm.h
+ *
+ * This include file contains all the constants, structures,
+ * and global variables for this RTEMS based shared memory
+ * communications interface driver.
+ *
+ * Processor board dependencies are in other files.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SHM_h
+#define __SHM_h
+
+#include <clockdrv.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The information contained in the Node Status, Locked Queue, and
+ * Envelope Control Blocks must be maintained in a NEUTRAL format.
+ * Currently the neutral format may be selected as big or little
+ * endian by simply defining either NEUTRAL_BIG or NEUTRAL_LITTLE.
+ *
+ * It is CRITICAL to note that the neutral format can ONLY be
+ * changed by modifying this file and recompiling the ENTIRE
+ * SHM driver including ALL target specific support files.
+ *
+ * The following table details the memory contents for the endian
+ * field of the Node Status Control Block in the various
+ * data format configurations (data is in hexadecimal):
+ *
+ * NEUTRAL NATIVE BYTE 0 BYTE 1 BYTE 2 BYTE 3
+ * ======= ====== ====== ====== ====== ======
+ * BIG BIG 00 00 00 01
+ * BIG LITTLE 10 00 00 00
+ * LITTLE BIG 01 00 00 00
+ * LITTLE LITTLE 00 00 00 10
+ *
+ *
+ * NOTE: XXX
+ * PORTABILITY OF LOCKING INSTRUCTIONS
+ * ===================================
+ * The locking mechanism described below is not
+ * general enough. Where the hardware supports
+ * it we should use "atomic swap" instructions
+ * so the values in the lock can be tailored to
+ * support a CPU with only weak atomic memory
+ * instructions. There are combinations of
+ * CPUs with inflexible atomic memory instructions
+ * which appear to be incompatible. For example,
+ * the SPARClite instruction uses a byte which is
+ * 0xFF when locked. The PA-RISC uses 1 to indicate
+ * locked and 0 when unlocked. These CPUs appear to
+ * have incompatible lock instructions. But
+ * they could be used in a heterogenous system
+ * with does not mix SPARCs and PA-RISCs. For
+ * example, the i386 and SPARC or i386 and SPARC
+ * could work together. The bottom line is that
+ * not every CPU will work together using this
+ * locking scheme. There are supposed to be
+ * algorithms to do this without hardware assist
+ * and one of these should be incorporated into
+ * the shared memory driver.
+ *
+ * The most flexible scheme using the instructions
+ * of the various CPUs for efficiency would be to use
+ * "atomic swaps" wherever possible. Make the lock
+ * and unlock configurable much like BIG vs LITTLE
+ * endian use of shared memory is now. The values
+ * of the lock could then reflect the "worst"
+ * CPU in a system. This still results in mixes
+ * of CPUs which are incompatible.
+ *
+ * The current locking mechanism is based upon the MC68020
+ * "tas" instruction which is atomic. All ports to other CPUs
+ * comply with the restrictive placement of lock bit by this
+ * instruction. The lock bit is the most significant bit in a
+ * big-endian rtems_unsigned32. On other processors, the lock is
+ * typically implemented via an atomic swap or atomic modify
+ * bits type instruction.
+ */
+
+#define NEUTRAL_BIG
+
+#ifdef NEUTRAL_BIG
+#define SHM_BIG 0x00000001
+#define SHM_LITTLE 0x10000000
+#endif
+
+#ifdef NEUTRAL_LITTLE
+#define SHM_BIG 0x01000000
+#define SHM_LITTLE 0x00000010
+#endif
+
+/*
+ * The following are the values used to fill in the lock field. Some CPUs
+ * are able to write only a single value into field. By making the
+ * lock and unlock values configurable, CPUs which support "atomic swap"
+ * instructions can generally be made to work in any heterogeneous
+ * configuration. However, it is possible for two CPUs to be incompatible
+ * in regards to the lock field values. This occurs when two CPUs
+ * which write only a single value to the field are used in a system
+ * but the two CPUs write different incompatible values.
+ *
+ * NOTE: The following is a first attempt at defining values which
+ * have a chance at working together. The m68k should use
+ * chk2 instead of tas to be less restrictive. Target endian
+ * problems (like the Force CPU386 which has (broken) big endian
+ * view of the VMEbus address space) are not addressed yet.
+ */
+
+#if defined(i960)
+#define SHM_LOCK_VALUE 0x00000080
+#define SHM_UNLOCK_VALUE 0
+#elif defined(m68k)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(i386)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(mips64orion)
+#define SHM_LOCK_VALUE 0x80000000
+#define SHM_UNLOCK_VALUE 0
+#elif defined(hppa1_1)
+#define SHM_LOCK_VALUE 0
+#define SHM_UNLOCK_VALUE 1
+#elif defined(unix)
+#define SHM_LOCK_VALUE 0
+#define SHM_UNLOCK_VALUE 1
+#elif defined(no_cpu) /* for this values are irrelevant */
+#define SHM_LOCK_VALUE 1
+#define SHM_UNLOCK_VALUE 0
+#else
+#error "shm.h - no SHM_LOCK_VALUE defined for this CPU architecture"
+#endif
+
+#define Shm_Convert( value ) \
+ ((Shm_Configuration->convert) ? \
+ (*Shm_Configuration->convert)(value) : (value))
+
+/* constants */
+
+#define SHM_MASTER 1 /* master initialization node */
+#define SHM_FIRST_NODE 1
+
+/* size constants */
+
+#define KILOBYTE (1024)
+#define MEGABYTE (1024*1024)
+
+/* inter-node interrupt values */
+
+#define NO_INTERRUPT 0 /* used for polled nodes */
+#define BYTE 1
+#define WORD 2
+#define LONG 4
+
+/* operational mode constants -- used in SHM Configuration Table */
+#define POLLED_MODE 0
+#define INTR_MODE 1
+
+/* error codes */
+
+#define NO_ERROR 0
+#define SHM_NO_FREE_PKTS 0xf0000
+
+/* null pointers of different types */
+
+#define NULL_ENV_CB ((Shm_Envelope_control *) 0)
+#define NULL_CONVERT 0
+
+/*
+ * size of stuff before preamble in envelope.
+ * It must be a constant since we will use it to generate MAX_PACKET_SIZE
+ */
+
+#define SHM_ENVELOPE_PREFIX_OVERHEAD (4 * sizeof(vol_u32))
+
+/*
+ * The following is adjusted so envelopes are MAX_ENVELOPE_SIZE bytes long.
+ * It must be >= RTEMS_MINIMUM_PACKET_SIZE in mppkt.h.
+ */
+
+#ifndef MAX_ENVELOPE_SIZE
+#define MAX_ENVELOPE_SIZE 0x180
+#endif
+
+#define MAX_PACKET_SIZE (MAX_ENVELOPE_SIZE - \
+ SHM_ENVELOPE_PREFIX_OVERHEAD + \
+ sizeof(Shm_Envelope_preamble) + \
+ sizeof(Shm_Envelope_postamble))
+
+
+/* constants pertinent to Locked Queue routines */
+
+#define LQ_UNLOCKED SHM_UNLOCK_VALUE
+#define LQ_LOCKED SHM_LOCK_VALUE
+
+/* constants related to the Free Envelope Pool */
+
+#define FREE_ENV_POOL 0
+#define FREE_ENV_CB (&Shm_Locked_queues[ FREE_ENV_POOL ])
+
+/* The following are important when dealing with
+ * the shared memory communications interface area.
+ *
+ * NOTE: The starting address and length of the shared memory
+ * is defined in a system dependent file.
+ */
+
+#define START_NS_CBS ((void *)Shm_Configuration->base)
+#define START_LQ_CBS ((START_NS_CBS) + \
+ ( (sizeof (Shm_Node_status_control)) * (Shm_Maximum_nodes + 1) ) )
+#define START_ENVELOPES ( ((void *) START_LQ_CBS) + \
+ ( (sizeof (Shm_Locked_queue_Control)) * (Shm_Maximum_nodes + 1) ) )
+#define END_SHMCI_AREA ( (void *) START_ENVELOPES + \
+ ( (sizeof (Shm_Envelope_control)) * Shm_Maximum_envelopes ) )
+#define END_SHARED_MEM (START_NS_CBS+Shm_Configuration->length)
+
+/* macros */
+
+#define Shm_Is_master_node() \
+ ( SHM_MASTER == Shm_Local_node )
+
+#define Shm_Free_envelope( ecb ) \
+ Shm_Locked_queue_Add( FREE_ENV_CB, (ecb) )
+#define Shm_Allocate_envelope() \
+ Shm_Locked_queue_Get(FREE_ENV_CB)
+
+#define Shm_Initialize_receive_queue(node) \
+ Shm_Locked_queue_Initialize( &Shm_Locked_queues[node], node )
+
+#define Shm_Append_to_receive_queue(node, ecb) \
+ Shm_Locked_queue_Add( &Shm_Locked_queues[node], (ecb) )
+
+#define Shm_Envelope_control_to_packet_prefix_pointer(ecb) \
+ ((void *)(ecb)->packet)
+
+#define Shm_Packet_prefix_to_envelope_control_pointer( pkt ) \
+ ((Shm_Envelope_control *)((rtems_unsigned8 *)(pkt) - \
+ (sizeof(Shm_Envelope_preamble) + SHM_ENVELOPE_PREFIX_OVERHEAD)))
+
+#define Shm_Build_preamble(ecb, node) \
+ (ecb)->Preamble.endian = Shm_Configuration->format
+
+#define Shm_Build_postamble( ecb )
+
+/* volatile types */
+
+typedef volatile rtems_unsigned8 vol_u8;
+typedef volatile rtems_unsigned32 vol_u32;
+
+/* shm control information */
+
+struct shm_info {
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+ vol_u32 not_currently_used_3;
+};
+
+typedef struct {
+ /*byte start_of_text;*/
+ vol_u32 endian;
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+} Shm_Envelope_preamble;
+
+typedef struct {
+} Shm_Envelope_postamble;
+
+/* WARNING! If you change this structure, don't forget to change
+ * SHM_ENVELOPE_PREFIX_OVERHEAD and
+ * Shm_Packet_prefix_to_envelope_control_pointer() above.
+ */
+
+/* This comment block describes the contents of each field
+ * of the Envelope Control Block:
+ *
+ * next - The index of the next envelope on this queue.
+ * queue - The index of the queue this envelope is on.
+ * index - The index of this envelope.
+ * Preamble - Generic packet preamble. One day this structure
+ * could be enhanced to contain routing information.
+ * packet - RTEMS MPCI packet. Untouched by SHM Driver
+ * other than copying and format conversion as
+ * documented in the RTEMS User's Guide.
+ * Postamble - Generic packet postamble. One day this structure
+ * could be enhanced to contain checksum information.
+ */
+
+typedef struct {
+ vol_u32 next; /* next envelope on queue */
+ vol_u32 queue; /* queue on which this resides */
+ vol_u32 index; /* index into array of envelopes*/
+ vol_u32 pad0; /* insure the next one is aligned */
+ Shm_Envelope_preamble Preamble; /* header information */
+ vol_u8 packet[MAX_PACKET_SIZE]; /* RTEMS INFO */
+ Shm_Envelope_postamble Postamble;/* trailer information */
+} Shm_Envelope_control;
+
+/* This comment block describes the contents of each field
+ * of the Locked Queue Control Block:
+ *
+ * lock - Lock used to insure mutually exclusive access.
+ * front - Index of first envelope on queue. This field
+ * is used to remove head of queue (receive).
+ * rear - Index of last envelope on queue. This field
+ * is used to add evelope to queue (send).
+ * owner - The node number of the recipient (owning) node.
+ * RTEMS does not use the node number zero (0).
+ * The zero node is used by the SHM Driver for the
+ * Free Envelope Queue shared by all nodes.
+ */
+
+typedef struct {
+ vol_u32 lock; /* lock field for this queue */
+ vol_u32 front; /* first envelope on queue */
+ vol_u32 rear; /* last envelope on queue */
+ vol_u32 owner; /* receiving (i.e. owning) node */
+} Shm_Locked_queue_Control;
+
+/* This comment block describes the contents of each field
+ * of the Node Status Control Block:
+ *
+ * status - Node status. Current values are Pending Initialization,
+ * Initialization Complete, and Active Node. Other values
+ * could be added to enhance fault tolerance.
+ * error - Zero if the node has not failed. Otherwise,
+ * this field contains a status indicating the
+ * failure reason.
+ * int_address, int_value, and int_length
+ * - These field are the Interrupt Information table
+ * for this node in neutral format. This is how
+ * each node knows how to generate interrupts.
+ */
+
+typedef struct {
+ vol_u32 status; /* node status information */
+ vol_u32 error; /* fatal error code */
+ vol_u32 int_address; /* write here for interrupt */
+ vol_u32 int_value; /* this value causes interrupt */
+ vol_u32 int_length; /* for this length (0,1,2,4) */
+ vol_u32 not_currently_used_0;
+ vol_u32 not_currently_used_1;
+ vol_u32 not_currently_used_2;
+} Shm_Node_status_control;
+
+/* This comment block describes the contents of each field
+ * of the Interrupt Information Table. This table describes
+ * how another node can generate an interrupt to this node.
+ * This information is target board dependent. If the
+ * SHM Driver is in POLLED_MODE, then all fields should
+ * be initialized to NO_INTERRUPT.
+ *
+ * address - The address to which another node should
+ * write to cause an interrupt.
+ * value - The value which must be written
+ * length - The size of the value to write. Valid
+ * values are BYTE, WORD, and LONG.
+ *
+ * NOTE: The Node Status Control Block contains this
+ * information in neutral format and not in a
+ * structure to avoid potential alignment problems.
+ */
+
+typedef struct {
+ vol_u32 *address; /* write here for interrupt */
+ vol_u32 value; /* this value causes interrupt */
+ vol_u32 length; /* for this length (0,1,2,4) */
+} Shm_Interrupt_information;
+
+/* SHM Configuration Table
+ *
+ * This comment block describes the contents of each field
+ * of the SHM Configuration Table.
+ *
+ * base - The base address of the shared memory. This
+ * address may be specific to this node.
+ * length - The length of the shared memory in bytes.
+ * format - The natural format for rtems_unsigned32's in the
+ * shared memory. Valid values are currently
+ * only SHM_LITTLE and SHM_BIG.
+ * convert - The address of the routine which converts
+ * between neutral and local format.
+ * poll_intr - The operational mode of the driver. Some
+ * target boards may not provide hardware for
+ * an interprocessor interrupt. If POLLED_MODE
+ * is selected, the SHM driver will install a
+ * wrapper around the Clock_isr() to poll for
+ * incoming packets. Throughput is dependent
+ * on the time between clock interrupts.
+ * Valid values are POLLED_MODE and INTR_MODE.
+ * cause_intr - This is the address of the routine used to
+ * write to a particular address and cause an
+ * interrupt on another node. This routine
+ * may need to be target dependent if something
+ * other than a normal write from C does not work.
+ * Intr - This structure describes the operation required
+ * to cause an interrupt to this node. The actual
+ * contents of this structure are described above.
+ */
+
+struct shm_config_info {
+ vol_u32 *base; /* base address of SHM */
+ vol_u32 length; /* length (in bytes) of SHM */
+ vol_u32 format; /* SHM is big or little endian */
+ vol_u32 (*convert)();/* neutral conversion routine */
+ vol_u32 poll_intr;/* POLLED or INTR driven mode */
+ void (*cause_intr)( rtems_unsigned32 );
+ Shm_Interrupt_information Intr; /* cause intr information */
+};
+
+typedef struct shm_config_info shm_config_table;
+
+/* global variables */
+
+#ifdef _SHM_INIT
+#define SHM_EXTERN
+#else
+#define SHM_EXTERN extern
+#endif
+
+SHM_EXTERN shm_config_table *Shm_Configuration;
+SHM_EXTERN Shm_Interrupt_information *Shm_Interrupt_table;
+SHM_EXTERN Shm_Node_status_control *Shm_Node_statuses;
+SHM_EXTERN Shm_Locked_queue_Control *Shm_Locked_queues;
+SHM_EXTERN Shm_Envelope_control *Shm_Envelopes;
+SHM_EXTERN rtems_configuration_table *Shm_RTEMS_Configuration;
+SHM_EXTERN rtems_multiprocessing_table *Shm_RTEMS_MP_Configuration;
+SHM_EXTERN rtems_unsigned32 Shm_Receive_message_count;
+SHM_EXTERN rtems_unsigned32 Shm_Null_message_count;
+SHM_EXTERN rtems_unsigned32 Shm_Interrupt_count;
+SHM_EXTERN rtems_unsigned32 Shm_Local_node;
+SHM_EXTERN Shm_Locked_queue_Control *Shm_Local_receive_queue;
+SHM_EXTERN Shm_Node_status_control *Shm_Local_node_status;
+SHM_EXTERN rtems_unsigned32 Shm_isrstat;
+ /* reported by shmdr */
+
+SHM_EXTERN rtems_unsigned32 Shm_Pending_initialization;
+SHM_EXTERN rtems_unsigned32 Shm_Initialization_complete;
+SHM_EXTERN rtems_unsigned32 Shm_Active_node;
+
+SHM_EXTERN rtems_unsigned32 Shm_Maximum_nodes;
+SHM_EXTERN rtems_unsigned32 Shm_Maximum_envelopes;
+
+SHM_EXTERN rtems_unsigned32 Shm_Locked_queue_End_of_list;
+SHM_EXTERN rtems_unsigned32 Shm_Locked_queue_Not_on_list;
+
+/* functions */
+
+/* locked queue routines */
+void Shm_Locked_queue_Add(
+ Shm_Locked_queue_Control *, Shm_Envelope_control * );
+Shm_Envelope_control *Shm_Locked_queue_Get( Shm_Locked_queue_Control * );
+void Shm_Locked_queue_Initialize(
+ Shm_Locked_queue_Control *, rtems_unsigned32 );
+ /* Shm_Initialize_lock is CPU dependent */
+ /* Shm_Lock is CPU dependent */
+ /* Shm_Unlock is CPU dependent */
+
+/* portable routines */
+void Init_env_pool();
+void Shm_Print_statistics( void );
+void MPCI_Fatal( Internal_errors_Source, boolean, rtems_unsigned32 );
+rtems_task Shm_Cause_interrupt( rtems_unsigned32 );
+void Shm_Poll();
+void Shm_setclockvec();
+void Shm_Convert_packet( rtems_packet_prefix * );
+
+/* CPU specific routines are inlined in shmcpu.h */
+
+/* target specific routines */
+void *Shm_Convert_address( void * );
+void Shm_Get_configuration( rtems_unsigned32, shm_config_table ** );
+void Shm_isr();
+void Shm_setvec( void );
+
+void Shm_Initialize_lock( Shm_Locked_queue_Control * );
+void Shm_Lock( Shm_Locked_queue_Control * );
+void Shm_Unlock( Shm_Locked_queue_Control * );
+
+/* MPCI entry points */
+rtems_mpci_entry Shm_Get_packet(
+ rtems_packet_prefix **
+);
+
+rtems_mpci_entry Shm_Initialization( void );
+
+rtems_mpci_entry Shm_Receive_packet(
+ rtems_packet_prefix **
+);
+
+rtems_mpci_entry Shm_Return_packet(
+ rtems_packet_prefix *
+);
+
+rtems_mpci_entry Shm_Send_packet(
+ rtems_unsigned32,
+ rtems_packet_prefix *
+);
+
+extern rtems_mpci_table MPCI_table;
+
+#ifdef _SHM_INIT
+
+/* multiprocessor communications interface (MPCI) table */
+
+rtems_mpci_table MPCI_table = {
+ 100000, /* default timeout value in ticks */
+ MAX_PACKET_SIZE, /* maximum packet size */
+ Shm_Initialization, /* initialization procedure */
+ Shm_Get_packet, /* get packet procedure */
+ Shm_Return_packet, /* return packet procedure */
+ Shm_Send_packet, /* packet send procedure */
+ Shm_Receive_packet /* packet receive procedure */
+};
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/libmisc/README b/c/src/libmisc/README
new file mode 100644
index 0000000000..6825898121
--- /dev/null
+++ b/c/src/libmisc/README
@@ -0,0 +1,16 @@
+#
+# $Id$
+#
+
+This directory contains for the "miscellaneous" library. Currently
+the only item in this library is a user extension set which checks
+for a task "blowing" it's stack.
+
+The following ideas have been mentioned for items which could go
+in this library, but this list is not all inclusive:
+
+ + Workspace Consistency Checker
+ + Task Execution Time Monitor
+
+The intent of this library is to provide a home for useful utility routines
+which are dependent upon RTEMS.
diff --git a/c/src/libmisc/assoc/Makefile.in b/c/src/libmisc/assoc/Makefile.in
new file mode 100644
index 0000000000..c7189808b5
--- /dev/null
+++ b/c/src/libmisc/assoc/Makefile.in
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libassoc-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=assoc
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/assoc.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/libmisc/assoc/assoc.c b/c/src/libmisc/assoc/assoc.c
new file mode 100644
index 0000000000..74387a8c5b
--- /dev/null
+++ b/c/src/libmisc/assoc/assoc.c
@@ -0,0 +1,260 @@
+/*
+ * assoc.c
+ * rtems assoc routines
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "assoc.h"
+
+#include <stdio.h> /* sprintf */
+#include <string.h> /* strcat, strcmp */
+
+#define STREQ(a,b) (strcmp((a), (b)) == 0)
+#define rtems_assoc_is_default(ap) ((ap)->name && STREQ(ap->name, RTEMS_ASSOC_DEFAULT_NAME))
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (strcmp(ap->name, name) == 0)
+ return ap;
+
+ return default_ap;
+}
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->local_value == local_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->remote_value == remote_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+/*
+ * Get values
+ */
+
+unsigned32
+rtems_assoc_remote_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_remote_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+/*
+ * what to return if a value is not found
+ * this is not reentrant, but it really shouldn't be invoked anyway
+ */
+
+const char *
+rtems_assoc_name_bad(
+ unsigned32 bad_value
+)
+{
+#ifdef RTEMS_DEBUG
+ static char bad_buffer[32];
+
+ sprintf(bad_buffer, "< %d [0x%x] >", bad_value, bad_value);
+#else
+ static char bad_buffer[32] = "<assoc.c: BAD NAME>";
+#endif
+ return bad_buffer;
+}
+
+
+const char *
+rtems_assoc_name_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(local_value);
+}
+
+const char *
+rtems_assoc_name_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(remote_value);
+}
+
+/*
+ * Bitfield functions assume just 1 bit set in each of remote and local
+ * entries; they do not check for this.
+ */
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ unsigned32 b;
+ unsigned32 remote_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & local_value)
+ remote_value |= rtems_assoc_remote_by_local(ap, b);
+
+ return remote_value;
+}
+
+
+unsigned32 rtems_assoc_local_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ unsigned32 b;
+ unsigned32 local_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & remote_value)
+ local_value |= rtems_assoc_local_by_remote(ap, b);
+
+ return local_value;
+}
+
+char *
+rtems_assoc_name_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_remote(ap, b));
+ }
+
+ return buffer;
+}
+
+char *
+rtems_assoc_name_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_local(ap, b));
+ }
+
+ return buffer;
+}
diff --git a/c/src/libmisc/assoc/assoc.h b/c/src/libmisc/assoc/assoc.h
new file mode 100644
index 0000000000..1982d654ac
--- /dev/null
+++ b/c/src/libmisc/assoc/assoc.h
@@ -0,0 +1,42 @@
+/*
+ *
+ * Rtems associativity routines. Mainly used to convert a value from
+ * one space to another (eg: our errno's to host errno's and v.v)
+ *
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ASSOC_H
+#define _INCLUDE_ASSOC_H
+
+typedef struct {
+ const char *name;
+ unsigned32 local_value;
+ unsigned32 remote_value;
+} rtems_assoc_t;
+
+/*
+ * Flag/marker for optional default value in each table
+ */
+
+#define RTEMS_ASSOC_DEFAULT_NAME "(default)"
+
+const rtems_assoc_t *rtems_assoc_ptr_by_name(const rtems_assoc_t *, const char *);
+const rtems_assoc_t *rtems_assoc_ptr_by_value(const rtems_assoc_t *, unsigned32);
+const rtems_assoc_t *rtems_assoc_ptr_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_local_by_remote(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_remote_by_name(const rtems_assoc_t *, const char *);
+unsigned32 rtems_assoc_local_by_name(const rtems_assoc_t *, const char *);
+const char *rtems_assoc_name_by_local(const rtems_assoc_t *, unsigned32);
+const char *rtems_assoc_name_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(const rtems_assoc_t *, unsigned32);
+char *rtems_assoc_name_by_local_bitfield(const rtems_assoc_t *, unsigned32, char *);
+char *rtems_assoc_name_by_remote_bitfield(const rtems_assoc_t *, unsigned32, char *);
+unsigned32 rtems_assoc_local_by_remote_bitfield(const rtems_assoc_t *, unsigned32);
+
+
+#endif /* ! _INCLUDE_ASSOC_H */
diff --git a/c/src/libmisc/cpuuse/Makefile.in b/c/src/libmisc/cpuuse/Makefile.in
new file mode 100644
index 0000000000..5311e1c271
--- /dev/null
+++ b/c/src/libmisc/cpuuse/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libcpuuse-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cpuuse
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+INSTALLED_H_FILES=$(srcdir)/cpuuse.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
+# $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/libmisc/cpuuse/README b/c/src/libmisc/cpuuse/README
new file mode 100644
index 0000000000..e8a30006a1
--- /dev/null
+++ b/c/src/libmisc/cpuuse/README
@@ -0,0 +1,41 @@
+#
+# README,v 1.3 1995/12/19 20:13:47 joel Exp
+#
+
+This directory contains a stack bounds checker. It provides two
+primary features:
+
+ + check for stack overflow at each context switch
+ + provides an educated guess at each task's stack usage
+
+The stack overflow check at context switch works by looking for
+a 16 byte pattern at the logical end of the stack to be corrupted.
+The "guesser" assumes that the entire stack was prefilled with a known
+pattern and assumes that the pattern is still in place if the memory
+has not been used as a stack.
+
+Both of these can be fooled by pushing large holes onto the stack
+and not writing to them... or (much more unlikely) writing the
+magic patterns into memory.
+
+This code has not been extensively tested. It is provided as a tool
+for RTEMS users to catch the most common mistake in multitasking
+systems ... too little stack space. Suggestions and comments are appreciated.
+
+NOTES:
+
+1. Stack usage information is questionable on CPUs which push
+ large holes on stack.
+
+2. The stack checker has a tendency to generate a fault when
+ trying to print the helpful diagnostic message. If it comes
+ out, congratulations. If not, then the variable Stack_check_Blown_task
+ contains a pointer to the TCB of the offending task. This
+ is usually enough to go on.
+
+FUTURE:
+
+1. Determine how/if gcc will generate stack probe calls and support that.
+
+2. Get accurate stack usage numbers on i960.. it pushes very large
+ holes on the stack.
diff --git a/c/src/libmisc/cpuuse/cpuuse.c b/c/src/libmisc/cpuuse/cpuuse.c
new file mode 100644
index 0000000000..475765b4db
--- /dev/null
+++ b/c/src/libmisc/cpuuse/cpuuse.c
@@ -0,0 +1,142 @@
+/*
+ * CPU Usage Reporter
+ *
+ * COPYRIGHT (c) 1989-1997. 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * check.c,v 1.13 1996/04/22 16:51:52 joel Exp
+ *
+ */
+
+#include <rtems.h>
+
+extern rtems_configuration_table BSP_Configuration;
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "cpuuse.h"
+
+unsigned32 CPU_usage_Ticks_at_last_reset;
+
+/*PAGE
+ *
+ * CPU_usage_Dump
+ */
+
+void CPU_usage_Dump( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+ unsigned32 u32_name;
+ char name[5];
+ unsigned32 total_units = 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 ];
+
+ if ( the_thread )
+ total_units += the_thread->ticks_executed;
+ }
+ }
+ }
+
+ printf("CPU Usage by thread\n");
+#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
+ printf( " ID NAME TICKS PERCENT\n" );
+#else
+ printf( " ID NAME TICKS\n" );
+#endif
+
+ 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 ];
+
+ if ( !the_thread )
+ continue;
+
+ u32_name = *(unsigned32 *)the_thread->Object.name;
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
+ printf( "0x%08x %4s %8d %5.3f\n",
+ the_thread->Object.id,
+ name,
+ the_thread->ticks_executed,
+ (total_units) ?
+ (double)the_thread->ticks_executed / (double)total_units :
+ (double)total_units
+ );
+#else
+ printf( "0x%08x %4s %8d\n",
+ the_thread->Object.id,
+ name,
+ the_thread->ticks_executed
+ );
+#endif
+ }
+ }
+ }
+
+ printf(
+ "\nTicks since last reset = %d\n",
+ _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset
+ );
+ printf( "\nTotal Units = %d\n", total_units );
+}
+
+/*PAGE
+ *
+ * CPU_usage_Reset
+ */
+
+void CPU_usage_Reset( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+
+ CPU_usage_Ticks_at_last_reset = _Watchdog_Ticks_since_boot;
+
+ 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 ];
+
+ if ( !the_thread )
+ continue;
+
+ the_thread->ticks_executed = 0;
+ }
+ }
+ }
+
+}
+
diff --git a/c/src/libmisc/cpuuse/cpuuse.h b/c/src/libmisc/cpuuse/cpuuse.h
new file mode 100644
index 0000000000..db5a258e7e
--- /dev/null
+++ b/c/src/libmisc/cpuuse/cpuuse.h
@@ -0,0 +1,41 @@
+/* cpuuse.h
+ *
+ * This include file contains information necessary to utilize
+ * and install the cpu usage reporting mechanism.
+ *
+ * COPYRIGHT (c) 1989-1997. 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * stackchk.h,v 1.3 1995/12/19 20:13:52 joel Exp
+ */
+
+#ifndef __CPU_USE_h
+#define __CPU_USE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * CPU_usage_Dump
+ */
+
+void CPU_usage_Dump( void );
+
+/*
+ * CPU_usage_Reset
+ */
+
+void CPU_usage_Reset( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/libmisc/cpuuse/internal.h b/c/src/libmisc/cpuuse/internal.h
new file mode 100644
index 0000000000..678973f517
--- /dev/null
+++ b/c/src/libmisc/cpuuse/internal.h
@@ -0,0 +1,96 @@
+/* internal.h
+ *
+ * This include file contains internal information
+ * for the RTEMS stack checker.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * internal.h,v 1.5 1995/12/19 20:13:50 joel Exp
+ */
+
+#ifndef __INTERNAL_STACK_CHECK_h
+#define __INTERNAL_STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This structure is used to fill in and compare the "end of stack"
+ * marker pattern.
+ * pattern area must be a multiple of 4 words.
+ */
+
+#ifdef CPU_STACK_CHECK_SIZE
+#define PATTERN_SIZE_WORDS (((CPU_STACK_CHECK_SIZE / 4) + 3) & ~0x3)
+#else
+#define PATTERN_SIZE_WORDS 4
+#endif
+
+#define PATTERN_SIZE_BYTES (PATTERN_SIZE_WORDS * 4)
+
+typedef struct {
+ unsigned32 pattern[ PATTERN_SIZE_WORDS ];
+} Stack_check_Control;
+
+/*
+ * The pattern used to fill the entire stack.
+ */
+
+#define BYTE_PATTERN 0xA5
+#define U32_PATTERN 0xA5A5A5A5
+
+/*
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+);
+
+/*
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+);
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/libmisc/error/Makefile.in b/c/src/libmisc/error/Makefile.in
new file mode 100644
index 0000000000..67b73d713f
--- /dev/null
+++ b/c/src/libmisc/error/Makefile.in
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/liberror-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=error
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/error.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/libmisc/error/error.c b/c/src/libmisc/error/error.c
new file mode 100644
index 0000000000..5bd481c3e6
--- /dev/null
+++ b/c/src/libmisc/error/error.c
@@ -0,0 +1,209 @@
+/*
+ * report errors and panics to RTEMS' stderr.
+ * Currently just used by RTEMS monitor.
+ *
+ * $Id$
+ */
+
+
+/*
+ * These routines provide general purpose error reporting.
+ * rtems_error reports an error to stderr and allows use of
+ * printf style formatting. A newline is appended to all messages.
+ *
+ * error_flag can be specified as any of the following:
+ *
+ * RTEMS_ERROR_ERRNO -- include errno text in output
+ * RTEMS_ERROR_PANIC -- halts local system after output
+ * RTEMS_ERROR_ABORT -- abort after output
+ *
+ * It can also include a rtems_status value which can be OR'd
+ * with the above flags. *
+ *
+ * EXAMPLE
+ * #include <rtems.h>
+ * #include <rtems/error.h>
+ * rtems_error(0, "stray interrupt %d", intr);
+ *
+ * EXAMPLE
+ * if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL)
+ * {
+ * rtems_error(status | RTEMS_ERROR_ABORT,
+ * "could not create task");
+ * }
+ *
+ * EXAMPLE
+ * if ((fd = open(pathname, O_RDNLY)) < 0)
+ * {
+ * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname);
+ * goto failed;
+ * }
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "error.h"
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h> /* _exit() */
+
+/* bug in hpux <errno.h>: no prototypes unless you are C++ */
+#ifdef hpux9
+char *strerror(int);
+#endif
+
+extern char *rtems_progname;
+int rtems_panic_in_progress;
+
+rtems_assoc_t rtems_status_assoc[] = {
+ { "successful completion", RTEMS_SUCCESSFUL, },
+ { "returned from a thread", RTEMS_TASK_EXITTED, },
+ { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, },
+ { "invalid object name", RTEMS_INVALID_NAME, },
+ { "invalid object id", RTEMS_INVALID_ID, },
+ { "too many", RTEMS_TOO_MANY, },
+ { "timed out waiting", RTEMS_TIMEOUT, },
+ { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, },
+ { "specified size was invalid", RTEMS_INVALID_SIZE, },
+ { "address specified is invalid", RTEMS_INVALID_ADDRESS, },
+ { "number was invalid", RTEMS_INVALID_NUMBER, },
+ { "item has not been initialized", RTEMS_NOT_DEFINED, },
+ { "resources still outstanding", RTEMS_RESOURCE_IN_USE, },
+ { "request not satisfied", RTEMS_UNSATISFIED, },
+ { "thread is in wrong state", RTEMS_INCORRECT_STATE, },
+ { "thread already in state", RTEMS_ALREADY_SUSPENDED, },
+ { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, },
+ { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, },
+ { "called from wrong environment", RTEMS_CALLED_FROM_ISR, },
+ { "invalid thread priority", RTEMS_INVALID_PRIORITY, },
+ { "invalid date/time", RTEMS_INVALID_CLOCK, },
+ { "invalid node id", RTEMS_INVALID_NODE, },
+ { "directive not configured", RTEMS_NOT_CONFIGURED, },
+ { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , },
+ { "directive not implemented", RTEMS_NOT_IMPLEMENTED, },
+ { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, },
+ { "could not get enough memory", RTEMS_NO_MEMORY, },
+ { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
+ { 0, 0, 0 },
+};
+
+
+const char *
+rtems_status_text(
+ rtems_status_code status
+)
+{
+ return rtems_assoc_name_by_local(rtems_status_assoc, status);
+}
+
+
+static int rtems_verror(
+ unsigned32 error_flag,
+ const char *printf_format,
+ va_list arglist
+)
+{
+ int local_errno = 0;
+ int chars_written = 0;
+ rtems_status_code status;
+
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_panic_in_progress++;
+
+ /* disable task switches */
+ _Thread_Disable_dispatch();
+
+ /* don't aggravate things */
+ if (rtems_panic_in_progress > 2)
+ return 0;
+ }
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ status = error_flag & ~RTEMS_ERROR_MASK;
+ if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
+ local_errno = errno;
+
+ if (_System_state_Is_multiprocessing)
+ fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
+
+ if (rtems_progname && *rtems_progname)
+ chars_written += fprintf(stderr, "%s: ", rtems_progname);
+ chars_written += vfprintf(stderr, printf_format, arglist);
+
+ if (status)
+ chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status));
+
+ if (local_errno)
+ if ((local_errno > 0) && *strerror(local_errno))
+ chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
+ else
+ chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
+
+ chars_written += fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT))
+ {
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_error(0, "fatal error, exiting");
+ _exit(local_errno);
+ }
+ else
+ {
+ rtems_error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+ return chars_written;
+}
+
+
+/*
+ * Report an error.
+ * error_flag is as above; printf_format is a normal
+ * printf(3) format string, with its concommitant arguments.
+ *
+ * Returns the number of characters written.
+ */
+
+int rtems_error(
+ int error_flag,
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+ int chars_written;
+
+ va_start(arglist, printf_format);
+ chars_written = rtems_verror(error_flag, printf_format, arglist);
+ va_end(arglist);
+
+ return chars_written;
+}
+
+/*
+ * rtems_panic is shorthand for rtems_error(RTEMS_ERROR_PANIC, ...)
+ */
+
+void rtems_panic(
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+
+ va_start(arglist, printf_format);
+ (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
+ va_end(arglist);
+}
diff --git a/c/src/libmisc/error/error.h b/c/src/libmisc/error/error.h
new file mode 100644
index 0000000000..a0698afb5d
--- /dev/null
+++ b/c/src/libmisc/error/error.h
@@ -0,0 +1,38 @@
+/*
+ * Defines and externs for rtems error reporting
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ERROR_h
+#define __RTEMS_ERROR_h
+
+/*
+ * rtems_error() and rtems_panic() support
+ */
+
+#define RTEMS_ERROR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */
+#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */
+
+#define RTEMS_ERROR_MASK (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \
+ RTEMS_ERROR_PANIC) /* all */
+
+const char *rtems_status_text(rtems_status_code);
+int rtems_error(int error_code, const char *printf_format, ...);
+#ifdef __GNUC__
+void rtems_panic(const char *printf_format, ...);
+/*
+ * We should be able to use this attribute but gcc complains that
+ * rtems_panic does in fact return. :(
+ *
+ * __attribute__ ((__noreturn__));
+ */
+#else
+void rtems_panic(const char *printf_format, ...);
+#endif
+
+extern int rtems_panic_in_progress;
+
+#endif
+/* end of include file */
diff --git a/c/src/libmisc/monitor/Makefile.in b/c/src/libmisc/monitor/Makefile.in
new file mode 100644
index 0000000000..0f6600f59c
--- /dev/null
+++ b/c/src/libmisc/monitor/Makefile.in
@@ -0,0 +1,57 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libmonitor-tmp.a
+# C source names, if any, go here -- minus the .c
+C_PIECES=mon-command mon-symbols mon-prmisc mon-monitor mon-object mon-server \
+ mon-task mon-queue mon-driver mon-dname mon-itask \
+ mon-extension mon-manager mon-config mon-mpci
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+INSTALLED_H_FILES=$(srcdir)/monitor.h $(srcdir)/symbols.h
+
+SRCS=README $(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I$(srcdir)
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+.PHONY: preinstall
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: preinstall ${ARCH} $(SRCS) $(LIB)
+
+preinstall: $(INSTALLED_H_FILES)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/libmisc/monitor/README b/c/src/libmisc/monitor/README
new file mode 100644
index 0000000000..d5a73da140
--- /dev/null
+++ b/c/src/libmisc/monitor/README
@@ -0,0 +1,97 @@
+#
+# $Id$
+#
+
+monitor task
+
+The monitor task is an optional task that knows about RTEMS
+data structures and can print out information about them.
+It is a work-in-progress and needs many more commands, but
+is useful now.
+
+The monitor works best when it is the highest priority task,
+so all your other tasks should ideally be at some priority
+greater than 1.
+
+To use the monitor:
+-------------------
+
+ #include <rtems/monitor.h>
+
+ ...
+
+ rtems_monitor_init(0);
+
+ The parameter to rtems_monitor_init() tells the monitor whether
+ to suspend itself on startup. A value of 0 causes the monitor
+ to immediately enter command mode; a non-zero value causes the
+ monitor to suspend itself after creation and wait for explicit
+ wakeup.
+
+
+ rtems_monitor_wakeup();
+
+ wakes up a suspended monitor and causes it to reenter command mode.
+
+Monitor commands
+----------------
+
+ The monitor prompt is 'rtems> '.
+ Can abbreviate commands to "uniquity"
+ There is a 'help' command. Here is the output from various
+ help commands:
+
+ Commands (may be abbreviated)
+
+ help -- get this message or command specific help
+ task -- show task information
+ queue -- show message queue information
+ symbol -- show entries from symbol table
+ pause -- pause monitor for a specified number of ticks
+ fatal -- invoke a fatal RTEMS error
+
+ task [id [id ...] ]
+ display information about the specified tasks.
+ Default is to display information about all tasks on this node
+
+ queue [id [id ... ] ]
+ display information about the specified message queues
+ Default is to display information about all queues on this node
+
+ symbol [ symbolname [symbolname ... ] ]
+ display value associated with specified symbol.
+ Defaults to displaying all known symbols.
+
+ pause [ticks]
+ monitor goes to "sleep" for specified ticks (default is 1)
+ monitor will resume at end of period or if explicitly awakened
+
+ fatal [status]
+ Invoke 'rtems_fatal_error_occurred' with 'status'
+ (default is RTEMS_INTERNAL_ERROR)
+
+ continue
+ put the monitor to sleep waiting for an explicit wakeup from the
+ program running.
+
+
+Sample output from 'task' command
+---------------------------------
+
+ rtems> task
+ ID NAME PRIO STAT MODES EVENTS WAITID WAITARG NOTES
+ ------------------------------------------------------------------------
+ 00010001 UI1 2 READY P:T:nA NONE15: 0x40606348
+ 00010002 RMON 1 READY nP NONE15: 0x40604110
+
+ 'RMON' is the monitor itself, so we have 1 "user" task.
+ Its modes are P:T:nA which translate to:
+
+ preemptable
+ timesliced
+ no ASRS
+
+ It has no events.
+ It has a notepad value for notepad 15 which is 0x40606348
+ (this is the libc thread state)
+
diff --git a/c/src/libmisc/monitor/mon-command.c b/c/src/libmisc/monitor/mon-command.c
new file mode 100644
index 0000000000..87d31dfa2a
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-command.c
@@ -0,0 +1,187 @@
+/*
+ * Command parsing routines for RTEMS monitor
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * make_argv(cp): token-count
+ * Break up the command line in 'cp' into global argv[] and argc (return
+ * value).
+ */
+
+int
+rtems_monitor_make_argv(
+ char *cp,
+ int *argc_p,
+ char **argv)
+{
+ int argc = 0;
+
+ while ((cp = strtok(cp, " \t\n\r")))
+ {
+ argv[argc++] = cp;
+ cp = (char *) NULL;
+ }
+ argv[argc] = (char *) NULL; /* end of argv */
+
+ return *argc_p = argc;
+}
+
+
+/*
+ * Read and break up a monitor command
+ *
+ * We have to loop on the gets call, since it will return NULL under UNIX
+ * RTEMS when we get a signal (eg: SIGALRM).
+ */
+
+int
+rtems_monitor_command_read(char *command,
+ int *argc,
+ char **argv)
+{
+ extern rtems_configuration_table BSP_Configuration;
+ static char monitor_prompt[32];
+
+ /*
+ * put node number in the prompt if we are multiprocessing
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table == 0)
+ sprintf(monitor_prompt, "%s", MONITOR_PROMPT);
+ else if (rtems_monitor_default_node != rtems_monitor_node)
+ sprintf(monitor_prompt, "%d-%s-%d", rtems_monitor_node, MONITOR_PROMPT, rtems_monitor_default_node);
+ else
+ sprintf(monitor_prompt, "%d-%s", rtems_monitor_node, MONITOR_PROMPT);
+
+#ifdef RTEMS_UNIX
+ /* RTEMS on unix gets so many interrupt system calls this is hosed */
+ printf("%s> ", monitor_prompt);
+ fflush(stdout);
+ while (gets(command) == (char *) 0)
+ ;
+#else
+ do
+ {
+ printf("%s> ", monitor_prompt);
+ fflush(stdout);
+ } while (gets(command) == (char *) 0);
+#endif
+
+ return rtems_monitor_make_argv(command, argc, argv);
+}
+
+/*
+ * Look up a command in a command table
+ *
+ */
+
+rtems_monitor_command_entry_t *
+rtems_monitor_command_lookup(
+ rtems_monitor_command_entry_t *table,
+ int argc,
+ char **argv
+)
+{
+ rtems_monitor_command_entry_t *p;
+ rtems_monitor_command_entry_t *abbreviated_match = 0;
+ int abbreviated_matches = 0;
+ char *command;
+ int command_length;
+
+ command = argv[0];
+
+ if ((table == 0) || (command == 0))
+ goto failed;
+
+ command_length = strlen(command);
+
+ for (p = table; p->command; p++)
+ if (STREQ(command, p->command)) /* exact match */
+ goto done;
+ else if (STRNEQ(command, p->command, command_length))
+ {
+ abbreviated_matches++;
+ abbreviated_match = p;
+ }
+
+ /* no perfect match; is there a non-ambigous abbreviated match? */
+ if ( ! abbreviated_match)
+ {
+ printf("Unrecognized command '%s'; try 'help'\n", command);
+ goto failed;
+ }
+
+ if (abbreviated_matches > 1)
+ {
+ printf("Command '%s' is ambiguous; try 'help'\n", command);
+ goto failed;
+ }
+
+ p = abbreviated_match;
+
+done:
+ if (p->command_function == 0)
+ goto failed;
+ return p;
+
+failed:
+ return 0;
+}
+
+void
+rtems_monitor_command_usage(rtems_monitor_command_entry_t *table,
+ char *command_string)
+{
+ rtems_monitor_command_entry_t *help = 0;
+ char *help_command_argv[2];
+
+ /* if first entry in table is a usage, then print it out */
+ if (command_string == 0)
+ {
+ if (STREQ(table->command, "--usage--") && table->usage)
+ help = table;
+ }
+ else
+ {
+ help_command_argv[0] = command_string;
+ help_command_argv[1] = 0;
+ help = rtems_monitor_command_lookup(table, 1, help_command_argv);
+ }
+
+ if (help)
+ printf("%s\n", help->usage);
+}
+
+
+void
+rtems_monitor_help_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_monitor_command_entry_t *command;
+
+ command = (rtems_monitor_command_entry_t *) command_arg;
+
+ if (argc == 1)
+ rtems_monitor_command_usage(command, 0);
+ else
+ {
+ for (arg=1; argv[arg]; arg++)
+ rtems_monitor_command_usage(command, argv[arg]);
+ }
+}
diff --git a/c/src/libmisc/monitor/mon-config.c b/c/src/libmisc/monitor/mon-config.c
new file mode 100644
index 0000000000..d7593dc912
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-config.c
@@ -0,0 +1,131 @@
+/*
+ * RTEMS Config display support
+ *
+ * TODO
+ *
+ * $Id$
+ */
+
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+/*
+ * Fill in entire monitor config table
+ * for sending to a remote monitor or printing on the local system
+ */
+
+void
+rtems_monitor_config_canonical(
+ rtems_monitor_config_t *canonical_config,
+ void *config_void
+)
+{
+ rtems_configuration_table *c = (rtems_configuration_table *) config_void;
+ rtems_api_configuration_table *r = c->RTEMS_api_configuration;
+
+ canonical_config->work_space_start = c->work_space_start;
+ canonical_config->work_space_size = c->work_space_size;
+ canonical_config->maximum_tasks = r->maximum_tasks;
+ canonical_config->maximum_timers = r->maximum_timers;
+ canonical_config->maximum_semaphores = r->maximum_semaphores;
+ canonical_config->maximum_message_queues = r->maximum_message_queues;
+ canonical_config->maximum_partitions = r->maximum_partitions;
+ canonical_config->maximum_regions = r->maximum_regions;
+ canonical_config->maximum_ports = r->maximum_ports;
+ canonical_config->maximum_periods = r->maximum_periods;
+ canonical_config->maximum_extensions = c->maximum_extensions;
+ canonical_config->microseconds_per_tick = c->microseconds_per_tick;
+ canonical_config->ticks_per_timeslice = c->ticks_per_timeslice;
+ canonical_config->number_of_initialization_tasks = r->number_of_initialization_tasks;
+}
+
+/*
+ * This is easy, since there is only 1 (altho we could get them from
+ * other nodes...)
+ */
+
+void *
+rtems_monitor_config_next(
+ void *object_info,
+ rtems_monitor_config_t *canonical_config,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= 1)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) c;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_config_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+INITIAL (startup) Configuration Info\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+
+void
+rtems_monitor_config_dump(
+ rtems_monitor_config_t *monitor_config,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length = 0;
+ length += printf("WORKSPACE");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("start: 0x%x; size: 0x%x\n",
+ (unsigned32) monitor_config->work_space_start,
+ monitor_config->work_space_size);
+
+ length = 0;
+ length += printf("TIME");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("usec/tick: %d; tick/timeslice: %d; tick/sec: %d\n",
+ monitor_config->microseconds_per_tick,
+ monitor_config->ticks_per_timeslice,
+ 1000000 / monitor_config->microseconds_per_tick);
+
+ length = 0;
+ length += printf("MAXIMUMS");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("tasks: %d; timers: %d; sems: %d; que's: %d; ext's: %d\n",
+ monitor_config->maximum_tasks,
+ monitor_config->maximum_timers,
+ monitor_config->maximum_semaphores,
+ monitor_config->maximum_message_queues,
+ monitor_config->maximum_extensions);
+ length = 0;
+ length += rtems_monitor_pad(CONTCOL, length);
+ length += printf("partitions: %d; regions: %d; ports: %d; periods: %d\n",
+ monitor_config->maximum_partitions,
+ monitor_config->maximum_regions,
+ monitor_config->maximum_ports,
+ monitor_config->maximum_periods);
+}
diff --git a/c/src/libmisc/monitor/mon-dname.c b/c/src/libmisc/monitor/mon-dname.c
new file mode 100644
index 0000000000..e6993e18f7
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-dname.c
@@ -0,0 +1,112 @@
+/*
+ * RTEMS monitor driver names support.
+ *
+ * There are 2 "driver" things the monitor knows about.
+ *
+ * 1. Regular RTEMS drivers.
+ * This is a table indexed by major device number and
+ * containing driver entry points only.
+ *
+ * 2. Driver name table.
+ * A separate table of names for drivers.
+ * The table converts driver names to a major number
+ * as index into the driver table and a minor number
+ * for an argument to driver.
+ *
+ * Drivers are displayed with 'driver' command.
+ * Names are displayed with 'dname' command.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+#include <string.h> /* strncpy() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+void
+rtems_monitor_dname_canonical(
+ rtems_monitor_dname_t *canonical_dname,
+ void *dname_void
+)
+{
+ rtems_driver_name_t *np = (rtems_driver_name_t *) dname_void;
+
+ (void) strncpy(canonical_dname->name_string, np->device_name, sizeof(canonical_dname->name_string));
+ canonical_dname->major = np->major;
+ canonical_dname->minor = np->minor;
+}
+
+void *
+rtems_monitor_dname_next(
+ void *object_information,
+ rtems_monitor_dname_t *canonical_dname,
+ rtems_id *next_id
+)
+{
+ int n = rtems_get_index(*next_id);
+ rtems_driver_name_t *table = _IO_Driver_name_table;
+ rtems_driver_name_t *np = 0;
+
+/* 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;
+
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+
+done:
+ _Thread_Disable_dispatch();
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_dname->id = n;
+ canonical_dname->name = rtems_build_name('-', '-', '-', '-');
+
+ *next_id += 1;
+ return np;
+}
+
+void
+rtems_monitor_dname_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ Major:Minor Name\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+void
+rtems_monitor_dname_dump(
+ rtems_monitor_dname_t *monitor_dname,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_pad(6, length);
+ length += rtems_monitor_dump_hex(monitor_dname->major);
+ length += printf(":");
+ length += rtems_monitor_dump_hex(monitor_dname->minor);
+
+ length += rtems_monitor_pad(16, length);
+ length += printf("%.*s",
+ (int) sizeof(monitor_dname->name_string),
+ (char *) monitor_dname->name_string);
+
+ length += printf("\n");
+ length = 0;
+}
diff --git a/c/src/libmisc/monitor/mon-driver.c b/c/src/libmisc/monitor/mon-driver.c
new file mode 100644
index 0000000000..065172534c
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-driver.c
@@ -0,0 +1,136 @@
+/*
+ * RTEMS monitor IO (device drivers) support
+ *
+ * There are 2 "driver" things the monitor knows about.
+ *
+ * 1. Regular RTEMS drivers.
+ * This is a table indexed by major device number and
+ * containing driver entry points only.
+ *
+ * 2. Driver name table.
+ * A separate table of names for drivers.
+ * The table converts driver names to a major number
+ * as index into the driver table and a minor number
+ * for an argument to driver.
+ *
+ * Drivers are displayed with 'driver' command.
+ * Names are displayed with 'name' command.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+
+void
+rtems_monitor_driver_canonical(
+ rtems_monitor_driver_t *canonical_driver,
+ void *driver_void
+)
+{
+ rtems_driver_address_table *d = (rtems_driver_address_table *) driver_void;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->initialization,
+ (void *) d->initialization);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->open,
+ (void *) d->open);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->close,
+ (void *) d->close);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->read,
+ (void *) d->read);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->write,
+ (void *) d->write);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->control,
+ (void *) d->control);
+}
+
+
+void *
+rtems_monitor_driver_next(
+ void *object_info,
+ rtems_monitor_driver_t *canonical_driver,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= c->number_of_device_drivers)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_driver->id = n;
+ canonical_driver->name = rtems_build_name('-', '-', '-', '-');
+
+ *next_id += 1;
+ return (void *) (c->Device_driver_table + n);
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_driver_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ Major Entry points\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+void
+rtems_monitor_driver_dump(
+ rtems_monitor_driver_t *monitor_driver,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += printf(" %d", monitor_driver->id);
+
+ length += rtems_monitor_pad(13, length);
+ length += printf("init: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->initialization, verbose);
+ length += printf("; control: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->control, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(13, length);
+
+ length += printf("open: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->open, verbose);
+ length += printf("; close: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->close, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(13, length);
+
+ length += printf("read: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->read, verbose);
+ length += printf("; write: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->write, verbose);
+ length += printf("\n");
+ length = 0;
+}
diff --git a/c/src/libmisc/monitor/mon-extension.c b/c/src/libmisc/monitor/mon-extension.c
new file mode 100644
index 0000000000..18f6cf2d47
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-extension.c
@@ -0,0 +1,98 @@
+/*
+ * RTEMS Monitor extension support
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+void
+rtems_monitor_extension_canonical(
+ rtems_monitor_extension_t *canonical_extension,
+ void *extension_void
+)
+{
+ Extension_Control *rtems_extension = (Extension_Control *) extension_void;
+ rtems_extensions_table *e = &rtems_extension->Extension.Callouts;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_create,
+ (void *) e->thread_create);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_start,
+ (void *) e->thread_start);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_restart,
+ (void *) e->thread_restart);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_delete,
+ (void *) e->thread_delete);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_tswitch,
+ (void *) e->thread_switch);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_begin,
+ (void *) e->thread_begin);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_exitted,
+ (void *) e->thread_exitted);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_fatal,
+ (void *) e->fatal);
+}
+
+void
+rtems_monitor_extension_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+
+/*
+ * Dump out the canonical form
+ */
+
+void
+rtems_monitor_extension_dump(
+ rtems_monitor_extension_t *monitor_extension,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_dump_id(monitor_extension->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_extension->name);
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("create: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_create, verbose);
+ length += printf("; start: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_start, verbose);
+ length += printf("; restart: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_restart, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("delete: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_delete, verbose);
+ length += printf("; switch: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_tswitch, verbose);
+ length += printf("; begin: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_begin, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("exitted: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_exitted, verbose);
+ length += printf("; fatal: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_fatal, verbose);
+ length += printf("\n");
+ length = 0;
+ printf("\n");
+}
diff --git a/c/src/libmisc/monitor/mon-itask.c b/c/src/libmisc/monitor/mon-itask.c
new file mode 100644
index 0000000000..0f7c2740ce
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-itask.c
@@ -0,0 +1,115 @@
+/*
+ * RTEMS Monitor init task support
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+/*
+ * As above, but just for init tasks
+ */
+void
+rtems_monitor_init_task_canonical(
+ rtems_monitor_init_task_t *canonical_itask,
+ void *itask_void
+)
+{
+ rtems_initialization_tasks_table *rtems_itask = itask_void;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_itask->entry,
+ (void *) rtems_itask->entry_point);
+
+ canonical_itask->argument = rtems_itask->argument;
+ canonical_itask->stack_size = rtems_itask->stack_size;
+ canonical_itask->priority = rtems_itask->initial_priority;
+ canonical_itask->modes = rtems_itask->mode_set;
+ canonical_itask->attributes = rtems_itask->attribute_set;
+}
+
+void *
+rtems_monitor_init_task_next(
+ void *object_info,
+ rtems_monitor_init_task_t *canonical_init_task,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ rtems_initialization_tasks_table *itask;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= c->RTEMS_api_configuration->number_of_initialization_tasks)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ itask = c->RTEMS_api_configuration->User_initialization_tasks_table + n;
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_init_task->id = n;
+ canonical_init_task->name = itask->name;
+
+ *next_id += 1;
+ return (void *) itask;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_init_task_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ # NAME ENTRY ARGUMENT PRIO MODES ATTRIBUTES STACK SIZE\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+/*
+ */
+
+void
+rtems_monitor_init_task_dump(
+ rtems_monitor_init_task_t *monitor_itask,
+ boolean verbose
+)
+{
+ int length = 0;
+
+ length += rtems_monitor_dump_decimal(monitor_itask->id);
+
+ length += rtems_monitor_pad(7, length);
+ length += rtems_monitor_dump_name(monitor_itask->name);
+
+ length += rtems_monitor_pad(14, length);
+ length += rtems_monitor_symbol_dump(&monitor_itask->entry, verbose);
+
+ length += rtems_monitor_pad(25, length);
+ length += printf("%d [0x%x]", monitor_itask->argument, monitor_itask->argument);
+
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_priority(monitor_itask->priority);
+
+ length += rtems_monitor_pad(46, length);
+ length += rtems_monitor_dump_modes(monitor_itask->modes);
+
+ length += rtems_monitor_pad(54, length);
+ length += rtems_monitor_dump_attributes(monitor_itask->attributes);
+
+ length += rtems_monitor_pad(66, length);
+ length += printf("%d [0x%x]", monitor_itask->stack_size, monitor_itask->stack_size);
+
+ printf("\n");
+}
diff --git a/c/src/libmisc/monitor/mon-manager.c b/c/src/libmisc/monitor/mon-manager.c
new file mode 100644
index 0000000000..523fa6aded
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-manager.c
@@ -0,0 +1,50 @@
+/*
+ * RTEMS Monitor "manager" support.
+ * Used to traverse object (chain) lists and print them out.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+#include <monitor.h>
+
+/*
+ * "next" routine for all objects that are RTEMS manager objects
+ */
+
+void *
+rtems_monitor_manager_next(
+ void *table_void,
+ void *canonical,
+ rtems_id *next_id
+)
+{
+ Objects_Information *table = table_void;
+ rtems_monitor_generic_t *copy;
+ Objects_Control *object = 0;
+ Objects_Locations location;
+
+ /*
+ * When we are called, it must be local
+ */
+
+ if ( ! _Objects_Is_local_id(*next_id))
+ goto done;
+
+ object = _Objects_Get_next(table, *next_id, &location, next_id);
+
+ if (object)
+ {
+ copy = (rtems_monitor_generic_t *) canonical;
+ copy->id = object->id;
+ _Objects_Copy_name_raw(object->name, &copy->name, sizeof(copy->name));
+ }
+
+done:
+ return object;
+}
+
diff --git a/c/src/libmisc/monitor/mon-monitor.c b/c/src/libmisc/monitor/mon-monitor.c
new file mode 100644
index 0000000000..0025266e03
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-monitor.c
@@ -0,0 +1,518 @@
+/*
+ * RTEMS monitor main body
+ *
+ * TODO:
+ * add stuff to RTEMS api
+ * rtems_get_name(id)
+ * rtems_get_type(id)
+ * rtems_build_id(node, type, num)
+ * Add a command to dump out info about an arbitrary id when
+ * types are added to id's
+ * rtems> id idnum
+ * idnum: node n, object: whatever, id: whatever
+ * allow id's to be specified as n:t:id, where 'n:t' is optional
+ * should have a separate monitor FILE stream (ala the debugger)
+ * remote request/response stuff should be cleaned up
+ * maybe we can use real rpc??
+ * 'info' command to print out:
+ * interrupt stack location, direction and size
+ * floating point config stuff
+ * interrupt config stuff
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "monitor.h"
+
+/* set by trap handler */
+extern rtems_tcb *debugger_interrupted_task;
+extern rtems_context *debugger_interrupted_task_context;
+extern rtems_unsigned32 debugger_trap;
+
+/*
+ * Various id's for the monitor
+ * They need to be public variables for access by other agencies
+ * such as debugger and remote servers'
+ */
+
+rtems_id rtems_monitor_task_id;
+
+unsigned32 rtems_monitor_node; /* our node number */
+unsigned32 rtems_monitor_default_node; /* current default for commands */
+
+/*
+ * The rtems symbol table
+ */
+
+rtems_symbol_table_t *rtems_monitor_symbols;
+
+/*
+ * The top-level commands
+ */
+
+rtems_monitor_command_entry_t rtems_monitor_commands[] = {
+ { "--usage--",
+ "\n"
+ "RTEMS monitor\n"
+ "\n"
+ "Commands (may be abbreviated)\n"
+ "\n"
+ " help -- get this message or command specific help\n"
+ " pause -- pause monitor for a specified number of ticks\n"
+ " exit -- invoke a fatal RTEMS error\n"
+ " symbol -- show entries from symbol table\n"
+ " continue -- put monitor to sleep waiting for explicit wakeup\n"
+ " config -- show system configuration\n"
+ " itask -- list init tasks\n"
+ " mpci -- list mpci config\n"
+ " task -- show task information\n"
+ " queue -- show message queue information\n"
+ " extension -- user extensions\n"
+ " driver -- show information about named drivers\n"
+ " dname -- show information about named drivers\n"
+ " object -- generic object information\n"
+ " node -- specify default node for commands that take id's\n"
+#ifdef CPU_INVOKE_DEBUGGER
+ " debugger -- invoke system debugger\n"
+#endif
+ ,
+ 0,
+ 0,
+ (unsigned32) rtems_monitor_commands,
+ },
+ { "config",
+ "config\n"
+ " Show the system configuration.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_CONFIG,
+ },
+ { "itask",
+ "itask\n"
+ " List init tasks for the system\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_INIT_TASK,
+ },
+ { "mpci",
+ "mpci\n"
+ " Show the MPCI system configuration, if configured.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_MPCI,
+ },
+ { "pause",
+ "pause [ticks]\n"
+ " monitor goes to \"sleep\" for specified ticks (default is 1)\n"
+ " monitor will resume at end of period or if explicitly awakened\n",
+ 0,
+ rtems_monitor_pause_cmd,
+ 0,
+ },
+ { "continue",
+ "continue\n"
+ " put the monitor to sleep waiting for an explicit wakeup from the\n"
+ " program running.\n",
+ 0,
+ rtems_monitor_continue_cmd,
+ 0,
+ },
+ { "go",
+ "go\n"
+ " Alias for 'continue'\n",
+ 0,
+ rtems_monitor_continue_cmd,
+ 0,
+ },
+ { "node",
+ "node [ node number ]\n"
+ " Specify default node number for commands that take id's\n",
+ 0,
+ rtems_monitor_node_cmd,
+ 0,
+ },
+ { "symbol",
+ "symbol [ symbolname [symbolname ... ] ]\n"
+ " display value associated with specified symbol.\n"
+ " Defaults to displaying all known symbols.\n",
+ 0,
+ rtems_monitor_symbol_cmd,
+ (unsigned32) &rtems_monitor_symbols,
+ },
+ { "extension",
+ "extension [id [id ...] ]\n"
+ " display information about specified extensions.\n"
+ " Default is to display information about all extensions on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_EXTENSION,
+ },
+ { "task",
+ "task [id [id ...] ]\n"
+ " display information about the specified tasks.\n"
+ " Default is to display information about all tasks on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_TASK,
+ },
+ { "queue",
+ "queue [id [id ... ] ]\n"
+ " display information about the specified message queues\n"
+ " Default is to display information about all queues on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_QUEUE,
+ },
+ { "object",
+ "object [id [id ...] ]\n"
+ " display information about specified RTEMS objects.\n"
+ " Object id's must include 'type' information.\n"
+ " (which may normally be defaulted)\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_INVALID,
+ },
+ { "driver",
+ "driver [ major [ major ... ] ]\n"
+ " Display the RTEMS device driver table.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_DRIVER,
+ },
+ { "dname",
+ "dname\n"
+ " Displays information about named drivers.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_DNAME,
+ },
+ { "exit",
+ "exit [status]\n"
+ " Invoke 'rtems_fatal_error_occurred' with 'status'\n"
+ " (default is RTEMS_SUCCESSFUL)\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_SUCCESSFUL,
+ },
+ { "fatal",
+ "fatal [status]\n"
+ " 'exit' with fatal error; default error is RTEMS_TASK_EXITTED\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_TASK_EXITTED, /* exit value */
+ },
+ { "quit",
+ "quit [status]\n"
+ " Alias for 'exit'\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_SUCCESSFUL, /* exit value */
+ },
+ { "help",
+ "help [ command [ command ] ]\n"
+ " provide information about commands\n"
+ " Default is show basic command summary.\n",
+ 0,
+ rtems_monitor_help_cmd,
+ (unsigned32) rtems_monitor_commands,
+ },
+#ifdef CPU_INVOKE_DEBUGGER
+ { "debugger",
+ "debugger\n"
+ " Enter the debugger, if possible.\n"
+ " A continue from the debugger will return to the monitor.\n",
+ 0,
+ rtems_monitor_debugger_cmd,
+ 0,
+ },
+#endif
+ { 0, 0, 0, 0, 0 },
+};
+
+
+rtems_status_code
+rtems_monitor_suspend(rtems_interval timeout)
+{
+ rtems_event_set event_set;
+ rtems_status_code status;
+
+ status = rtems_event_receive(MONITOR_WAKEUP_EVENT,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout,
+ &event_set);
+ return status;
+}
+
+void
+rtems_monitor_wakeup(void)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send(rtems_monitor_task_id, MONITOR_WAKEUP_EVENT);
+}
+
+void
+rtems_monitor_debugger_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+#ifdef CPU_INVOKE_DEBUGGER
+ CPU_INVOKE_DEBUGGER;
+#endif
+}
+
+void
+rtems_monitor_pause_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ if (argc == 1)
+ rtems_monitor_suspend(1);
+ else
+ rtems_monitor_suspend(strtoul(argv[1], 0, 0));
+}
+
+void
+rtems_monitor_fatal_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ if (argc == 1)
+ rtems_fatal_error_occurred(command_arg);
+ else
+ rtems_fatal_error_occurred(strtoul(argv[1], 0, 0));
+}
+
+void
+rtems_monitor_continue_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ rtems_monitor_suspend(RTEMS_NO_TIMEOUT);
+}
+
+void
+rtems_monitor_node_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ unsigned32 new_node = rtems_monitor_default_node;
+
+ switch (argc)
+ {
+ case 1: /* no node, just set back to ours */
+ new_node = rtems_monitor_node;
+ break;
+
+ case 2:
+ new_node = strtoul(argv[1], 0, 0);
+ break;
+
+ default:
+ printf("invalid syntax, try 'help node'\n");
+ break;
+ }
+
+ if ((new_node >= 1) &&
+ _Configuration_MP_table &&
+ (new_node <= _Configuration_MP_table->maximum_nodes))
+ rtems_monitor_default_node = new_node;
+}
+
+
+/*
+ * Function: rtems_monitor_symbols_loadup
+ *
+ * Description:
+ * Create and load the monitor's symbol table.
+ * We are reading the output format of 'gnm' which looks like this:
+ *
+ * 400a7068 ? _Rate_monotonic_Information
+ * 400a708c ? _Thread_Dispatch_disable_level
+ * 400a7090 ? _Configuration_Table
+ *
+ * We ignore the type field.
+ *
+ * Side Effects:
+ * Creates and fills in 'rtems_monitor_symbols' table
+ *
+ * TODO
+ * there should be a BSP #define or something like that
+ * to do this; Assuming stdio is crazy.
+ * Someday this should know BFD
+ * Maybe we could get objcopy to just copy the symbol areas
+ * and copy that down.
+ *
+ */
+
+void
+rtems_monitor_symbols_loadup(void)
+{
+ FILE *fp;
+ char buffer[128];
+
+ if (rtems_monitor_symbols)
+ rtems_symbol_table_destroy(rtems_monitor_symbols);
+
+ rtems_monitor_symbols = rtems_symbol_table_create(10);
+ if (rtems_monitor_symbols == 0)
+ return;
+
+ fp = fopen("symbols", "r");
+
+ if (fp == 0)
+ return;
+
+ while (fgets(buffer, sizeof(buffer) - 1, fp))
+ {
+ char *symbol;
+ char *value;
+ char *ignored_type;
+
+ value = strtok(buffer, " \t\n");
+ ignored_type = strtok(0, " \t\n");
+ symbol = strtok(0, " \t\n");
+
+ if (symbol && ignored_type && value)
+ {
+ rtems_symbol_t *sp;
+ sp = rtems_symbol_create(rtems_monitor_symbols,
+ symbol,
+ (rtems_unsigned32) strtoul(value, 0, 16));
+ if (sp == 0)
+ {
+ printf("could not define symbol '%s'\n", symbol);
+ goto done;
+ }
+ }
+ else
+ {
+ printf("parsing error on '%s'\n", buffer);
+ goto done;
+ }
+ }
+
+done:
+ return;
+}
+
+
+/*
+ * Main monitor command loop
+ */
+
+void
+rtems_monitor_task(
+ rtems_task_argument monitor_flags
+)
+{
+ rtems_tcb *debugee = 0;
+ rtems_context *rp;
+ rtems_context_fp *fp;
+ char command_buffer[513];
+ int argc;
+ char *argv[64];
+ boolean verbose = FALSE;
+
+ if (monitor_flags & RTEMS_MONITOR_SUSPEND)
+ (void) rtems_monitor_suspend(RTEMS_NO_TIMEOUT);
+
+ for (;;)
+ {
+ extern rtems_tcb * _Thread_Executing;
+ rtems_monitor_command_entry_t *command;
+
+ debugee = _Thread_Executing;
+ rp = &debugee->Registers;
+ fp = (rtems_context_fp *) debugee->fp_context; /* possibly 0 */
+
+ if (0 == rtems_monitor_command_read(command_buffer, &argc, argv))
+ continue;
+ if ((command = rtems_monitor_command_lookup(rtems_monitor_commands,
+ argc,
+ argv)) == 0)
+ continue;
+
+ command->command_function(argc, argv, command->command_arg, verbose);
+
+ fflush(stdout);
+ }
+}
+
+
+void
+rtems_monitor_kill(void)
+{
+ if (rtems_monitor_task_id)
+ rtems_task_delete(rtems_monitor_task_id);
+ rtems_monitor_task_id = 0;
+
+ rtems_monitor_server_kill();
+}
+
+void
+rtems_monitor_init(
+ unsigned32 monitor_flags
+)
+{
+ rtems_status_code status;
+
+ rtems_monitor_kill();
+
+ status = rtems_task_create(RTEMS_MONITOR_NAME,
+ 1,
+ 0 /* default stack */,
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &rtems_monitor_task_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor task");
+ goto done;
+ }
+
+ rtems_monitor_node = rtems_get_node(rtems_monitor_task_id);
+ rtems_monitor_default_node = rtems_monitor_node;
+
+ rtems_monitor_symbols_loadup();
+
+ if (monitor_flags & RTEMS_MONITOR_GLOBAL)
+ rtems_monitor_server_init(monitor_flags);
+
+ /*
+ * Start the monitor task itself
+ */
+
+ status = rtems_task_start(rtems_monitor_task_id,
+ rtems_monitor_task,
+ monitor_flags);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not start monitor");
+ goto done;
+ }
+
+done:
+}
diff --git a/c/src/libmisc/monitor/mon-mpci.c b/c/src/libmisc/monitor/mon-mpci.c
new file mode 100644
index 0000000000..cf88922b2b
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-mpci.c
@@ -0,0 +1,159 @@
+/*
+ * RTEMS MPCI Config display support
+ *
+ * TODO
+ *
+ * $Id$
+ */
+
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+
+/*
+ * Fill in entire monitor config table
+ * for sending to a remote monitor or printing on the local system
+ */
+
+void
+rtems_monitor_mpci_canonical(
+ rtems_monitor_mpci_t *canonical_mpci,
+ void *config_void
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ rtems_multiprocessing_table *m;
+ rtems_mpci_table *mt;
+
+ m = c->User_multiprocessing_table;
+ if (m == 0)
+ return;
+ mt = m->User_mpci_table;
+
+ canonical_mpci->node = m->node;
+ canonical_mpci->maximum_nodes = m->maximum_nodes;
+ canonical_mpci->maximum_global_objects = m->maximum_global_objects;
+ canonical_mpci->maximum_proxies = m->maximum_proxies;
+
+ canonical_mpci->default_timeout = mt->default_timeout;
+ canonical_mpci->maximum_packet_size = mt->maximum_packet_size;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->initialization,
+ (void *) mt->initialization);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->get_packet,
+ (void *) mt->get_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->return_packet,
+ (void *) mt->return_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->send_packet,
+ (void *) mt->send_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->receive_packet,
+ (void *) mt->receive_packet);
+}
+
+/*
+ * This is easy, since there is only 1 (altho we could get them from
+ * other nodes...)
+ */
+
+void *
+rtems_monitor_mpci_next(
+ void *object_info,
+ rtems_monitor_mpci_t *canonical_mpci,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= 1)
+ goto failed;
+
+ if ( ! c->User_multiprocessing_table)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) c;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_mpci_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ max max max default max\n\
+ node nodes globals proxies timeout pktsize\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+
+void
+rtems_monitor_mpci_dump(
+ rtems_monitor_mpci_t *monitor_mpci,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_pad(2, length);
+ length += printf(" %d", monitor_mpci->node);
+ length += rtems_monitor_pad(11, length);
+ length += printf("%d", monitor_mpci->maximum_nodes);
+
+ length += rtems_monitor_pad(18, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_global_objects);
+
+ length += rtems_monitor_pad(28, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_proxies);
+
+ length += rtems_monitor_pad(37, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->default_timeout);
+
+ length += rtems_monitor_pad(46, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_packet_size);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("init: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->initialization, verbose);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("get: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->get_packet, verbose);
+ length += printf("; return: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->return_packet, verbose);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("send: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->send_packet, verbose);
+ length += printf("; receive: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->receive_packet, verbose);
+
+ printf("\n");
+ length = 0;
+}
diff --git a/c/src/libmisc/monitor/mon-object.c b/c/src/libmisc/monitor/mon-object.c
new file mode 100644
index 0000000000..90de35ee7b
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-object.c
@@ -0,0 +1,376 @@
+/*
+ * RTEMS Monitor "object" support.
+ *
+ * Used to traverse object lists and print them out.
+ * An object can be an RTEMS object (chain based stuff) or
+ * a "misc" object such as a device driver.
+ *
+ * Each object has its own file in this directory (eg: extension.c)
+ * That file provides routines to convert a "native" structure
+ * to its canonical form, print a canonical structure, etc.
+ *
+ * TODO:
+ * should allow for non-numeric id's???
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+#include <string.h> /* memcpy() */
+
+#include <monitor.h>
+
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * add:
+ * next
+ */
+
+rtems_monitor_object_info_t rtems_monitor_object_info[] =
+{
+ { RTEMS_MONITOR_OBJECT_CONFIG,
+ (void *) 0,
+ sizeof(rtems_monitor_config_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_config_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_config_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_config_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_config_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_MPCI,
+ (void *) 0,
+ sizeof(rtems_monitor_mpci_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_mpci_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_mpci_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_mpci_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_mpci_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_INIT_TASK,
+ (void *) 0,
+ sizeof(rtems_monitor_init_task_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_init_task_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_init_task_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_init_task_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_init_task_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_TASK,
+ (void *) &_RTEMS_tasks_Information,
+ sizeof(rtems_monitor_task_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_task_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_task_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_task_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_QUEUE,
+ (void *) &_Message_queue_Information,
+ sizeof(rtems_monitor_queue_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_queue_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_queue_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_queue_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_EXTENSION,
+ (void *) &_Extension_Information,
+ sizeof(rtems_monitor_extension_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_extension_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_extension_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_extension_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_DRIVER,
+ (void *) 0,
+ sizeof(rtems_monitor_driver_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_driver_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_driver_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_driver_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_driver_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_DNAME,
+ /* 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,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_dname_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_dname_dump,
+ },
+};
+
+/*
+ * Allow id's to be specified without the node number or
+ * type for convenience.
+ */
+
+rtems_id
+rtems_monitor_id_fixup(
+ rtems_id id,
+ unsigned32 default_node,
+ rtems_monitor_object_type_t type
+)
+{
+ unsigned32 node;
+
+ node = rtems_get_node(id);
+ if (node == 0)
+ {
+ if (rtems_get_class(id) != OBJECTS_NO_CLASS)
+ type = rtems_get_class(id);
+
+ id = _Objects_Build_id(type, default_node, rtems_get_index(id));
+ }
+ return id;
+}
+
+
+rtems_monitor_object_info_t *
+rtems_monitor_object_lookup(
+ rtems_monitor_object_type_t type
+)
+{
+ rtems_monitor_object_info_t *p;
+ for (p = &rtems_monitor_object_info[0];
+ p < &rtems_monitor_object_info[NUMELEMS(rtems_monitor_object_info)];
+ p++)
+ {
+ if (p->type == type)
+ return p;
+ }
+ return 0;
+}
+
+rtems_id
+rtems_monitor_object_canonical_next_remote(
+ rtems_monitor_object_type_t type,
+ rtems_id id,
+ void *canonical
+)
+{
+ rtems_id next_id;
+ rtems_status_code status;
+ rtems_monitor_server_request_t request;
+ rtems_monitor_server_response_t response;
+
+ /*
+ * Send request
+ */
+
+ request.command = RTEMS_MONITOR_SERVER_CANONICAL;
+ request.argument0 = (unsigned32) type;
+ request.argument1 = (unsigned32) id;
+
+ status = rtems_monitor_server_request(rtems_get_node(id), &request, &response);
+ if (status != RTEMS_SUCCESSFUL)
+ goto failed;
+
+ /*
+ * process response
+ */
+
+ next_id = (rtems_id) response.result0;
+ if (next_id != RTEMS_OBJECT_ID_FINAL)
+ (void) memcpy(canonical, &response.payload, response.result1);
+
+ return next_id;
+
+failed:
+ return RTEMS_OBJECT_ID_FINAL;
+
+}
+
+
+rtems_id
+rtems_monitor_object_canonical_next(
+ rtems_monitor_object_info_t *info,
+ rtems_id id,
+ void *canonical
+)
+{
+ rtems_id next_id;
+ void *raw_item;
+
+ if ( ! _Objects_Is_local_id(id))
+ next_id = rtems_monitor_object_canonical_next_remote(info->type,
+ id,
+ canonical);
+ else
+ {
+ next_id = id;
+
+ raw_item = (void *) info->next(info->object_information,
+ canonical,
+ &next_id);
+
+ if (raw_item)
+ {
+ info->canonical(canonical, raw_item);
+ _Thread_Enable_dispatch();
+ }
+ }
+ return next_id;
+}
+
+
+/*
+ * this is routine server invokes locally to get the type
+ */
+
+rtems_id
+rtems_monitor_object_canonical_get(
+ rtems_monitor_object_type_t type,
+ rtems_id id,
+ void *canonical,
+ unsigned32 *size_p
+)
+{
+ rtems_monitor_object_info_t *info;
+ rtems_id next_id;
+
+ *size_p = 0;
+
+ info = rtems_monitor_object_lookup(type);
+
+ if (info == 0)
+ return RTEMS_OBJECT_ID_FINAL;
+
+ next_id = rtems_monitor_object_canonical_next(info, id, canonical);
+ *size_p = info->size;
+
+ return next_id;
+}
+
+
+void
+rtems_monitor_object_dump_1(
+ rtems_monitor_object_info_t *info,
+ rtems_id id,
+ boolean verbose
+)
+{
+ rtems_id next_id;
+ rtems_monitor_union_t canonical;
+
+ if ((next_id = rtems_monitor_object_canonical_next(
+ info,
+ id,
+ &canonical)) != RTEMS_OBJECT_ID_FINAL)
+ {
+ /*
+ * If the one we actually got is the one we wanted, then
+ * print it out.
+ * For ones that have an id field, this works fine,
+ * for all others, always dump it out.
+ *
+ * HACK: the way we determine whether there is an id is a hack.
+ *
+ * by the way: the reason we try to not have an id, is that some
+ * of the canonical structures are almost too big for shared
+ * memory driver (eg: mpci)
+ */
+
+ if ((info->next != rtems_monitor_manager_next) ||
+ (id == canonical.generic.id))
+ info->dump(&canonical, verbose);
+ }
+}
+
+void
+rtems_monitor_object_dump_all(
+ rtems_monitor_object_info_t *info,
+ boolean verbose
+)
+{
+ rtems_id next_id;
+ rtems_monitor_union_t canonical;
+
+ next_id = RTEMS_OBJECT_ID_INITIAL(info->type, rtems_monitor_default_node);
+
+ while ((next_id = rtems_monitor_object_canonical_next(
+ info,
+ next_id,
+ &canonical)) != RTEMS_OBJECT_ID_FINAL)
+ {
+ info->dump(&canonical, verbose);
+ }
+}
+
+void
+rtems_monitor_object_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_monitor_object_info_t *info = 0;
+ rtems_monitor_object_type_t type = (rtems_monitor_object_type_t) command_arg;
+
+ /* what is the default type? */
+ type = (rtems_monitor_object_type_t) command_arg;
+
+ if (argc == 1)
+ {
+ if (type == RTEMS_MONITOR_OBJECT_INVALID)
+ {
+ printf("A type must be specified to \"dump all\"\n");
+ goto done;
+ }
+
+ info = rtems_monitor_object_lookup(type);
+ if (info == 0)
+ goto not_found;
+
+ if (info->dump_header)
+ info->dump_header(verbose);
+ rtems_monitor_object_dump_all(info, verbose);
+ }
+ else
+ {
+ unsigned32 default_node = rtems_monitor_default_node;
+ rtems_monitor_object_type_t last_type = RTEMS_MONITOR_OBJECT_INVALID;
+ rtems_id id;
+
+ for (arg=1; argv[arg]; arg++)
+ {
+ id = (rtems_id) strtoul(argv[arg], 0, 16);
+ id = rtems_monitor_id_fixup(id, default_node, type);
+ type = (rtems_monitor_object_type_t) rtems_get_class(id);
+
+ /*
+ * Allow the item type to change in the middle
+ * of the command. If the type changes, then
+ * just dump out a new header and keep on going.
+ */
+ if (type != last_type)
+ {
+ info = rtems_monitor_object_lookup(type);
+ if (info == 0)
+ goto not_found;
+
+ if (info->dump_header)
+ info->dump_header(verbose);
+ }
+
+ if (info == 0)
+ {
+not_found: printf("Invalid or unsupported type %d\n", type);
+ goto done;
+ }
+
+ rtems_monitor_object_dump_1(info, id, verbose);
+
+ default_node = rtems_get_node(id);
+
+ last_type = type;
+ }
+ }
+done:
+ return;
+}
diff --git a/c/src/libmisc/monitor/mon-prmisc.c b/c/src/libmisc/monitor/mon-prmisc.c
new file mode 100644
index 0000000000..3c7dc62d9a
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-prmisc.c
@@ -0,0 +1,254 @@
+/*
+ * Print misc stuff for the monitor dump routines
+ * Each routine returns the number of characters it output.
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <ctype.h>
+
+void
+rtems_monitor_separator(void)
+{
+ printf("------------------------------------------------------------------------------\n");
+}
+
+unsigned32
+rtems_monitor_pad(
+ unsigned32 destination_column,
+ unsigned32 current_column
+)
+{
+ int pad_length;
+
+ if (destination_column <= current_column)
+ pad_length = 1;
+ else
+ pad_length = destination_column - current_column;
+
+ return printf("%*s", pad_length, "");
+}
+
+unsigned32
+rtems_monitor_dump_char(rtems_unsigned8 ch)
+{
+ if (isprint(ch))
+ return printf("%c", ch);
+ else
+ return printf("%02x", ch);
+}
+
+unsigned32
+rtems_monitor_dump_decimal(unsigned32 num)
+{
+ return printf("%4d", num);
+}
+
+unsigned32
+rtems_monitor_dump_hex(unsigned32 num)
+{
+ return printf("0x%x", num);
+}
+
+unsigned32
+rtems_monitor_dump_assoc_bitfield(
+ rtems_assoc_t *ap,
+ char *separator,
+ unsigned32 value
+ )
+{
+ unsigned32 b;
+ unsigned32 length = 0;
+ const char *name;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (length)
+ length += printf("%s", separator);
+
+ name = rtems_assoc_name_by_local(ap, b);
+
+ if (name)
+ length += printf("%s", name);
+ else
+ length += printf("0x%x", b);
+ }
+
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_id(rtems_id id)
+{
+ return printf("%08x", id);
+}
+
+unsigned32
+rtems_monitor_dump_name(rtems_name name)
+{
+ unsigned32 i;
+ unsigned32 length = 0;
+ union {
+ unsigned32 ui;
+ char c[4];
+ } u;
+
+ u.ui = (rtems_unsigned32) name;
+
+ for (i=0; i<sizeof(u.c); i++)
+ length += rtems_monitor_dump_char(u.c[i]);
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_priority(rtems_task_priority priority)
+{
+ return printf("%3d", priority);
+}
+
+
+rtems_assoc_t rtems_monitor_state_assoc[] = {
+ { "DORM", STATES_DORMANT },
+ { "SUSP", STATES_SUSPENDED },
+ { "TRANS", STATES_TRANSIENT },
+ { "DELAY", STATES_DELAYING },
+ { "Wbuf", STATES_WAITING_FOR_BUFFER },
+ { "Wseg", STATES_WAITING_FOR_SEGMENT },
+ { "Wmsg" , STATES_WAITING_FOR_MESSAGE },
+ { "Wevnt", STATES_WAITING_FOR_EVENT },
+ { "Wsem", STATES_WAITING_FOR_SEMAPHORE },
+ { "Wtime", STATES_WAITING_FOR_TIME },
+ { "Wrpc", STATES_WAITING_FOR_RPC_REPLY },
+ { "WRATE", STATES_WAITING_FOR_PERIOD },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_state(States_Control state)
+{
+ unsigned32 length = 0;
+
+ if (state == STATES_READY) /* assoc doesn't deal with this as it is 0 */
+ length += printf("READY");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_state_assoc,
+ ":",
+ state);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_attribute_assoc[] = {
+ { "FL", RTEMS_FLOATING_POINT },
+ { "GL", RTEMS_GLOBAL },
+ { "PR", RTEMS_PRIORITY },
+ { "BI", RTEMS_BINARY_SEMAPHORE },
+ { "IN", RTEMS_INHERIT_PRIORITY },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_attributes(rtems_attribute attributes)
+{
+ unsigned32 length = 0;
+
+ if (attributes == RTEMS_DEFAULT_ATTRIBUTES) /* value is 0 */
+ length += printf("DEFAULT");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_attribute_assoc,
+ ":",
+ attributes);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_modes_assoc[] = {
+ { "nP", RTEMS_NO_PREEMPT },
+ { "T", RTEMS_TIMESLICE },
+ { "nA", RTEMS_NO_ASR },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_modes(rtems_mode modes)
+{
+ unsigned32 length = 0;
+
+ if (modes == RTEMS_DEFAULT_MODES) /* value is 0 */
+ length += printf("P:T:nA");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_modes_assoc,
+ ":",
+ modes);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_events_assoc[] = {
+ { "0", RTEMS_EVENT_0 },
+ { "1", RTEMS_EVENT_1 },
+ { "2", RTEMS_EVENT_2 },
+ { "3", RTEMS_EVENT_3 },
+ { "4", RTEMS_EVENT_4 },
+ { "5", RTEMS_EVENT_5 },
+ { "6", RTEMS_EVENT_6 },
+ { "7", RTEMS_EVENT_7 },
+ { "8", RTEMS_EVENT_8 },
+ { "9", RTEMS_EVENT_9 },
+ { "10", RTEMS_EVENT_10 },
+ { "11", RTEMS_EVENT_11 },
+ { "12", RTEMS_EVENT_12 },
+ { "13", RTEMS_EVENT_13 },
+ { "14", RTEMS_EVENT_14 },
+ { "15", RTEMS_EVENT_15 },
+ { "16", RTEMS_EVENT_16 },
+ { "17", RTEMS_EVENT_17 },
+ { "18", RTEMS_EVENT_18 },
+ { "19", RTEMS_EVENT_19 },
+ { "20", RTEMS_EVENT_20 },
+ { "21", RTEMS_EVENT_21 },
+ { "22", RTEMS_EVENT_22 },
+ { "23", RTEMS_EVENT_23 },
+ { "24", RTEMS_EVENT_24 },
+ { "25", RTEMS_EVENT_25 },
+ { "26", RTEMS_EVENT_26 },
+ { "27", RTEMS_EVENT_27 },
+ { "28", RTEMS_EVENT_28 },
+ { "29", RTEMS_EVENT_29 },
+ { "30", RTEMS_EVENT_30 },
+ { "31", RTEMS_EVENT_31 },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_events(rtems_event_set events)
+{
+ unsigned32 length = 0;
+
+ if (events == EVENT_SETS_NONE_PENDING) /* value is 0 */
+ length += printf("NONE");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_events_assoc,
+ ":",
+ events);
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_notepad(unsigned32 *notepad)
+{
+ unsigned32 length = 0;
+ int i;
+
+ for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
+ if (notepad[i])
+ length += printf("%d: 0x%x ", i, notepad[i]);
+
+ return length;
+}
diff --git a/c/src/libmisc/monitor/mon-queue.c b/c/src/libmisc/monitor/mon-queue.c
new file mode 100644
index 0000000000..08c1d9474e
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-queue.c
@@ -0,0 +1,64 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+void
+rtems_monitor_queue_canonical(
+ rtems_monitor_queue_t *canonical_queue,
+ void *queue_void
+)
+{
+ Message_queue_Control *rtems_queue = (Message_queue_Control *) queue_void;
+
+ canonical_queue->attributes = rtems_queue->attribute_set;
+ canonical_queue->maximum_message_size = rtems_queue->message_queue.maximum_message_size;
+ canonical_queue->maximum_pending_messages = rtems_queue->message_queue.maximum_pending_messages;
+ canonical_queue->number_of_pending_messages = rtems_queue->message_queue.number_of_pending_messages;
+}
+
+void
+rtems_monitor_queue_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME ATTRIBUTES PEND MAXPEND MAXSIZE\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+
+/*
+ * Dump out the "next" queue indicated by 'id'.
+ * Returns next one to check.
+ * Returns RTEMS_OBJECT_ID_FINAL when all done
+ */
+
+void
+rtems_monitor_queue_dump(
+ rtems_monitor_queue_t *monitor_queue,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_dump_id(monitor_queue->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_queue->name);
+ length += rtems_monitor_pad(19, length);
+ length += rtems_monitor_dump_attributes(monitor_queue->attributes);
+ length += rtems_monitor_pad(31, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->number_of_pending_messages);
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->maximum_pending_messages);
+ length += rtems_monitor_pad(48, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->maximum_message_size);
+
+ printf("\n");
+}
diff --git a/c/src/libmisc/monitor/mon-server.c b/c/src/libmisc/monitor/mon-server.c
new file mode 100644
index 0000000000..af155684fb
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-server.c
@@ -0,0 +1,303 @@
+/*
+ * RTEMS monitor server (handles requests for info from RTEMS monitors
+ * running on other nodes)
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "monitor.h"
+
+/*
+ * Various id's for the server
+ */
+
+rtems_id rtems_monitor_server_task_id;
+rtems_id rtems_monitor_server_request_queue_id; /* our server */
+rtems_id *rtems_monitor_server_request_queue_ids; /* all servers */
+rtems_id rtems_monitor_server_response_queue_id; /* our server */
+
+
+/*
+ * Send a request to a server task
+ */
+
+rtems_status_code
+rtems_monitor_server_request(
+ unsigned32 server_node,
+ rtems_monitor_server_request_t *request,
+ rtems_monitor_server_response_t *response
+)
+{
+ rtems_id server_id;
+ rtems_status_code status;
+ unsigned32 size;
+
+ /*
+ * What is id of monitor on target node?
+ * Look it up if we don't know it yet.
+ */
+
+ server_id = rtems_monitor_server_request_queue_ids[server_node];
+ if (server_id == 0)
+ {
+ status = rtems_message_queue_ident(RTEMS_MONITOR_QUEUE_NAME,
+ server_node,
+ &server_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "ident of remote server failed");
+ goto done;
+ }
+
+ rtems_monitor_server_request_queue_ids[server_node] = server_id;
+ }
+
+ request->return_id = rtems_monitor_server_response_queue_id;
+
+ status = rtems_message_queue_send(server_id, request, sizeof(*request));
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "monitor server request send failed");
+ goto done;
+ }
+
+ /*
+ * Await response, if requested
+ */
+
+ if (response)
+ {
+ status = rtems_message_queue_receive(rtems_monitor_server_response_queue_id,
+ response,
+ &size,
+ RTEMS_WAIT,
+ 100);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "server did not respond");
+
+ /* maybe server task was restarted; look it up again next time */
+ rtems_monitor_server_request_queue_ids[server_node] = 0;
+
+ goto done;
+ }
+
+ if (response->command != RTEMS_MONITOR_SERVER_RESPONSE)
+ {
+ status = RTEMS_INCORRECT_STATE;
+ goto done;
+ }
+ }
+
+done:
+ return status;
+}
+
+
+
+/*
+ * monitor server task
+ */
+
+void
+rtems_monitor_server_task(
+ rtems_task_argument monitor_flags
+)
+{
+ rtems_monitor_server_request_t request;
+ rtems_monitor_server_response_t response;
+ rtems_status_code status;
+ unsigned32 size;
+
+ for (;;)
+ {
+ status = rtems_message_queue_receive(
+ rtems_monitor_server_request_queue_id,
+ &request,
+ &size,
+ RTEMS_WAIT,
+ (rtems_interval) 0);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "monitor server msg queue receive error");
+ goto failed;
+ }
+
+ if (size != sizeof(request))
+ {
+ rtems_error(0, "monitor server bad size on receive");
+ goto failed;
+ }
+
+ switch (request.command)
+ {
+ case RTEMS_MONITOR_SERVER_CANONICAL:
+ {
+ rtems_monitor_object_type_t object_type;
+ rtems_id id;
+ rtems_id next_id;
+
+ object_type = (rtems_monitor_object_type_t) request.argument0;
+ id = (rtems_id) request.argument1;
+ next_id = rtems_monitor_object_canonical_get(object_type,
+ id,
+ &response.payload,
+ &size);
+
+ response.command = RTEMS_MONITOR_SERVER_RESPONSE;
+ response.result0 = next_id;
+ response.result1 = size;
+
+#define SERVER_OVERHEAD (RTEMS_offsetof(rtems_monitor_server_response_t, \
+ payload))
+
+ status = rtems_message_queue_send(request.return_id,
+ &response,
+ size + SERVER_OVERHEAD);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "response send failed");
+ goto failed;
+ }
+ break;
+ }
+
+ default:
+ {
+ rtems_error(0, "invalid command to monitor server: %d", request.command);
+ goto failed;
+ }
+ }
+ }
+
+failed:
+ rtems_task_delete(RTEMS_SELF);
+}
+
+
+/*
+ * Kill off any old server
+ * Not sure if this is useful, but it doesn't help
+ */
+
+void
+rtems_monitor_server_kill(void)
+{
+ if (rtems_monitor_server_task_id)
+ rtems_task_delete(rtems_monitor_server_task_id);
+ rtems_monitor_task_id = 0;
+
+ if (rtems_monitor_server_request_queue_id)
+ rtems_message_queue_delete(rtems_monitor_server_request_queue_id);
+ rtems_monitor_server_response_queue_id = 0;
+
+ if (rtems_monitor_server_response_queue_id)
+ rtems_message_queue_delete(rtems_monitor_server_response_queue_id);
+ rtems_monitor_server_request_queue_ids = 0;
+
+ if (rtems_monitor_server_request_queue_ids)
+ free(rtems_monitor_server_request_queue_ids);
+ rtems_monitor_server_request_queue_ids = 0;
+}
+
+
+void
+rtems_monitor_server_init(
+ unsigned32 monitor_flags
+)
+{
+ rtems_status_code status;
+
+ if (_System_state_Is_multiprocessing &&
+ (_Configuration_MP_table->maximum_nodes > 1))
+ {
+ unsigned32 maximum_nodes = _Configuration_MP_table->maximum_nodes;
+
+ /*
+ * create the msg que our server will listen
+ * Since we only get msgs from other RTEMS monitors, we just
+ * need reserve space for 1 msg from each node.
+ */
+
+ status = rtems_message_queue_create(
+ RTEMS_MONITOR_QUEUE_NAME,
+ maximum_nodes,
+ sizeof(rtems_monitor_server_request_t),
+ RTEMS_GLOBAL,
+ &rtems_monitor_server_request_queue_id);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor server message queue");
+ goto done;
+ }
+
+ /*
+ * create the msg que our responses will come on
+ * Since monitor just does one thing at a time, we only need 1 item
+ * message queue.
+ */
+
+ status = rtems_message_queue_create(
+ RTEMS_MONITOR_RESPONSE_QUEUE_NAME,
+ 1, /* depth */
+ sizeof(rtems_monitor_server_response_t),
+ RTEMS_GLOBAL,
+ &rtems_monitor_server_response_queue_id);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor response message queue");
+ goto done;
+ }
+
+ /* need an id for queue of each other server we might talk to */
+ /* indexed by node, so add 1 to maximum_nodes */
+ rtems_monitor_server_request_queue_ids =
+ (rtems_id *) malloc((maximum_nodes + 1) * sizeof(rtems_id));
+ (void) memset(rtems_monitor_server_request_queue_ids,
+ 0,
+ (maximum_nodes + 1) * sizeof(rtems_id));
+
+ rtems_monitor_server_request_queue_ids[rtems_monitor_node] =
+ rtems_monitor_server_request_queue_id;
+
+ /*
+ * create the server task
+ */
+ status = rtems_task_create(RTEMS_MONITOR_SERVER_NAME,
+ 1,
+ 0 /* default stack */,
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &rtems_monitor_server_task_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor server task");
+ goto done;
+ }
+
+ /*
+ * Start the server task
+ */
+ status = rtems_task_start(rtems_monitor_server_task_id,
+ rtems_monitor_server_task,
+ monitor_flags);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not start monitor server");
+ goto done;
+ }
+ }
+
+done:
+ return;
+}
diff --git a/c/src/libmisc/monitor/mon-symbols.c b/c/src/libmisc/monitor/mon-symbols.c
new file mode 100644
index 0000000000..6c6589d38f
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-symbols.c
@@ -0,0 +1,481 @@
+/*
+ * File: symbols.c
+ *
+ * Description:
+ * Symbol table manager for the RTEMS monitor.
+ * These routines may be used by other system resources also.
+ *
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "monitor.h"
+#include "symbols.h"
+
+
+rtems_symbol_table_t *
+rtems_symbol_table_create()
+{
+ rtems_symbol_table_t *table;
+
+ table = (rtems_symbol_table_t *) malloc(sizeof(rtems_symbol_table_t));
+ memset((void *) table, 0, sizeof(*table));
+
+ table->growth_factor = 30; /* 30 percent */
+
+ return table;
+}
+
+void
+rtems_symbol_table_destroy(rtems_symbol_table_t *table)
+{
+ rtems_symbol_string_block_t *p, *pnext;
+
+ if (table)
+ {
+ if (table->addresses)
+ (void) free(table->addresses);
+ table->addresses = 0;
+ p = table->string_buffer_head;
+ while (p)
+ {
+ pnext = p->next;
+ free(p);
+ p = pnext;
+ }
+ table->string_buffer_head = 0;
+ table->string_buffer_current = 0;
+
+ free(table);
+ }
+}
+
+rtems_symbol_t *
+rtems_symbol_create(
+ rtems_symbol_table_t *table,
+ char *name,
+ rtems_unsigned32 value
+ )
+{
+ int symbol_length;
+ size_t newsize;
+ rtems_symbol_t *sp;
+
+ symbol_length = strlen(name) + 1; /* include '\000' in length */
+
+ /* need to grow the table? */
+ if (table->next >= table->size)
+ {
+ if (table->size == 0)
+ newsize = 100;
+ else
+ newsize = table->size + (table->size / (100 / table->growth_factor));
+
+ table->addresses = (rtems_symbol_t *) realloc((void *) table->addresses, newsize * sizeof(rtems_symbol_t));
+ if (table->addresses == 0) /* blew it; lost orig */
+ goto failed;
+ table->size = newsize;
+ }
+
+ sp = &table->addresses[table->next];
+ sp->value = value;
+
+ /* Have to add it to string pool */
+ /* need to grow pool? */
+
+ if ((table->string_buffer_head == 0) ||
+ (table->strings_next + symbol_length) >= SYMBOL_STRING_BLOCK_SIZE)
+ {
+ rtems_symbol_string_block_t *p;
+
+ p = (rtems_symbol_string_block_t *) malloc(sizeof(rtems_symbol_string_block_t));
+ if (p == 0)
+ goto failed;
+ p->next = 0;
+ if (table->string_buffer_head == 0)
+ table->string_buffer_head = p;
+ else
+ table->string_buffer_current->next = p;
+ table->string_buffer_current = p;
+
+ table->strings_next = 0;
+ }
+
+ sp->name = table->string_buffer_current->buffer + table->strings_next;
+ (void) strcpy(sp->name, name);
+
+ table->strings_next += symbol_length;
+ table->sorted = 0;
+ table->next++;
+
+ return sp;
+
+/* XXX Not sure what to do here. We've possibly destroyed the initial
+ symbol table due to realloc failure */
+failed:
+ return 0;
+}
+
+/*
+ * Qsort entry point for compare by address
+ */
+
+static int
+rtems_symbol_compare(const void *e1,
+ const void *e2)
+{
+ rtems_symbol_t *s1, *s2;
+ s1 = (rtems_symbol_t *) e1;
+ s2 = (rtems_symbol_t *) e2;
+
+ if (s1->value < s2->value)
+ return -1;
+ if (s1->value > s2->value)
+ return 1;
+ return 0;
+}
+
+
+/*
+ * Sort the symbol table using qsort
+ */
+
+static void
+rtems_symbol_sort(rtems_symbol_table_t *table)
+{
+ qsort((void *) table->addresses, (size_t) table->next,
+ sizeof(rtems_symbol_t), rtems_symbol_compare);
+ table->sorted = 1;
+}
+
+
+/*
+ * Search the symbol table by address
+ * This code based on CYGNUS newlib bsearch, but changed
+ * to allow for finding closest symbol <= key
+ */
+
+rtems_symbol_t *
+rtems_symbol_value_lookup(
+ rtems_symbol_table_t *table,
+ rtems_unsigned32 value
+ )
+{
+ rtems_symbol_t *sp;
+ rtems_symbol_t *base;
+ rtems_symbol_t *best = 0;
+ rtems_unsigned32 distance;
+ rtems_unsigned32 best_distance = ~0;
+ rtems_unsigned32 elements;
+
+ if (table == 0)
+ table = rtems_monitor_symbols;
+
+ if ((table == 0) || (table->size == 0))
+ return 0;
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ base = table->addresses;
+ elements = table->next;
+
+ while (elements)
+ {
+ sp = base + (elements / 2);
+ if (value < sp->value)
+ elements /= 2;
+ else if (value > sp->value)
+ {
+ distance = value - sp->value;
+ if (distance < best_distance)
+ {
+ best_distance = distance;
+ best = sp;
+ }
+ base = sp + 1;
+ elements = (elements / 2) - (elements % 2 ? 0 : 1);
+ }
+ else
+ return sp;
+ }
+
+ if (value == base->value)
+ return base;
+
+ return best;
+}
+
+/*
+ * Search the symbol table for the exact matching address.
+ * If the symbol table has already been sorted, then
+ * call the regular symbol value lookup, however, it it
+ * has not yet been sorted, search it sequentially.
+ * This routine is primarily used for low level symbol
+ * lookups (eg. from exception handler and interrupt routines)
+ * where the penality of sorted is not wanted and where
+ * an exact match is needed such that symbol table order
+ * is not important.
+ */
+const rtems_symbol_t *
+rtems_symbol_value_lookup_exact(
+ rtems_symbol_table_t *table,
+ rtems_unsigned32 value
+ )
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return NULL;
+ }
+
+ if (table->sorted)
+ {
+ sp = rtems_symbol_value_lookup(table, value);
+ if ( rtems_symbol_value(sp) == value )
+ return sp;
+ else
+ return NULL; /* not an exact match */
+ }
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ if ( sp->value == value )
+ return sp;
+ }
+
+ return NULL;
+
+}
+
+
+/*
+ * Search the symbol table by string name (case independent)
+ */
+
+rtems_symbol_t *
+rtems_symbol_name_lookup(
+ rtems_symbol_table_t *table,
+ char *name
+ )
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return NULL;
+ }
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ if ( strcasecmp(sp->name, name) == 0 )
+ return sp;
+ }
+
+ return NULL;
+}
+
+void *
+rtems_monitor_symbol_next(
+ void *object_info,
+ rtems_monitor_symbol_t *canonical,
+ rtems_id *next_id
+)
+{
+ rtems_symbol_table_t *table;
+ int n = rtems_get_index(*next_id);
+
+ table = *(rtems_symbol_table_t **) object_info;
+ if (table == 0)
+ goto failed;
+
+ if (n >= table->next)
+ goto failed;
+
+ /* NOTE: symbols do not have id and name fields */
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) (table->addresses + n);
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+void
+rtems_monitor_symbol_canonical(
+ rtems_monitor_symbol_t *canonical_symbol,
+ rtems_symbol_t *sp
+)
+{
+ canonical_symbol->value = sp->value;
+ canonical_symbol->offset = 0;
+ strncpy(canonical_symbol->name, sp->name, sizeof(canonical_symbol->name));
+}
+
+
+void
+rtems_monitor_symbol_canonical_by_name(
+ rtems_monitor_symbol_t *canonical_symbol,
+ char *name
+)
+{
+ rtems_symbol_t *sp;
+
+ sp = rtems_symbol_name_lookup(0, name);
+
+ canonical_symbol->value = sp ? sp->value : 0;
+
+ strncpy(canonical_symbol->name, name, sizeof(canonical_symbol->name));
+ canonical_symbol->offset = 0;
+}
+
+void
+rtems_monitor_symbol_canonical_by_value(
+ rtems_monitor_symbol_t *canonical_symbol,
+ void *value_void_p
+)
+{
+ unsigned32 value = (unsigned32) value_void_p;
+ rtems_symbol_t *sp;
+
+ sp = rtems_symbol_value_lookup(0, value);
+ if (sp)
+ {
+ canonical_symbol->value = sp->value;
+ canonical_symbol->offset = value - sp->value;
+ strncpy(canonical_symbol->name, sp->name, sizeof(canonical_symbol->name));
+ }
+ else
+ {
+ canonical_symbol->value = value;
+ canonical_symbol->offset = 0;
+ canonical_symbol->name[0] = '\0';
+ }
+}
+
+
+unsigned32
+rtems_monitor_symbol_dump(
+ rtems_monitor_symbol_t *canonical_symbol,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ /*
+ * print the name if it exists AND if value is non-zero
+ * Ie: don't print some garbage symbol for address 0
+ */
+
+ if (canonical_symbol->name[0] && (canonical_symbol->value != 0))
+ {
+ if (canonical_symbol->offset == 0)
+ length += printf("%.*s",
+ (int) sizeof(canonical_symbol->name),
+ canonical_symbol->name);
+ else
+ length += printf("<%.*s+0x%x>",
+ (int) sizeof(canonical_symbol->name),
+ canonical_symbol->name,
+ canonical_symbol->offset);
+ if (verbose)
+ length += printf(" [0x%x]", canonical_symbol->value);
+ }
+ else
+ length += printf("[0x%x]", canonical_symbol->value);
+
+ return length;
+}
+
+
+void
+rtems_monitor_symbol_dump_all(
+ rtems_symbol_table_t *table,
+ boolean verbose
+)
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return;
+ }
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ rtems_monitor_symbol_t canonical_symbol;
+
+ rtems_monitor_symbol_canonical(&canonical_symbol, sp);
+ rtems_monitor_symbol_dump(&canonical_symbol, TRUE);
+ printf("\n");
+ }
+}
+
+
+/*
+ * 'symbol' command
+ */
+
+void
+rtems_monitor_symbol_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_symbol_table_t *table;
+
+ table = *(rtems_symbol_table_t **) command_arg;
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return;
+ }
+
+ /*
+ * Use object command to dump out whole symbol table
+ */
+ if (argc == 1)
+ rtems_monitor_symbol_dump_all(table, verbose);
+ else
+ {
+ rtems_monitor_symbol_t canonical_symbol;
+
+ for (arg=1; argv[arg]; arg++)
+ {
+ rtems_monitor_symbol_canonical_by_name(&canonical_symbol, argv[arg]);
+ rtems_monitor_symbol_dump(&canonical_symbol, verbose);
+ printf("\n");
+ }
+ }
+}
diff --git a/c/src/libmisc/monitor/mon-task.c b/c/src/libmisc/monitor/mon-task.c
new file mode 100644
index 0000000000..9592d9d99b
--- /dev/null
+++ b/c/src/libmisc/monitor/mon-task.c
@@ -0,0 +1,93 @@
+/*
+ * RTEMS Monitor task support
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <string.h> /* memcpy() */
+
+void
+rtems_monitor_task_canonical(
+ rtems_monitor_task_t *canonical_task,
+ void *thread_void
+)
+{
+ 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;
+ canonical_task->stack = rtems_thread->Start.Initial_stack.area;
+ canonical_task->stack_size = rtems_thread->Start.Initial_stack.size;
+ 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 = 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));
+*/
+}
+
+
+void
+rtems_monitor_task_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME PRIO STAT MODES EVENTS WAITID WAITARG NOTES\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+/*
+ */
+
+void
+rtems_monitor_task_dump(
+ rtems_monitor_task_t *monitor_task,
+ boolean verbose
+)
+{
+ int length = 0;
+
+ length += rtems_monitor_dump_id(monitor_task->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_task->name);
+ length += rtems_monitor_pad(18, length);
+ length += rtems_monitor_dump_priority(monitor_task->priority);
+ length += rtems_monitor_pad(24, length);
+ length += rtems_monitor_dump_state(monitor_task->state);
+ length += rtems_monitor_pad(31, length);
+ length += rtems_monitor_dump_modes(monitor_task->modes);
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_events(monitor_task->events);
+ if (monitor_task->wait_id)
+ {
+ length += rtems_monitor_pad(47, length);
+ length += rtems_monitor_dump_id(monitor_task->wait_id);
+ length += rtems_monitor_pad(57, length);
+ length += rtems_monitor_dump_hex(monitor_task->wait_args);
+ }
+
+ length += rtems_monitor_pad(65, length);
+ length += rtems_monitor_dump_notepad(monitor_task->notepad);
+ printf("\n");
+}
+
diff --git a/c/src/libmisc/monitor/monitor.h b/c/src/libmisc/monitor/monitor.h
new file mode 100644
index 0000000000..1844add643
--- /dev/null
+++ b/c/src/libmisc/monitor/monitor.h
@@ -0,0 +1,443 @@
+/*
+ * File: monitor.h
+ *
+ * Description:
+ * The RTEMS monitor task include file.
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#ifndef __MONITOR_H
+#define __MONITOR_H
+
+#include "symbols.h"
+#include <rtems/error.h> /* rtems_error() */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Monitor types are derived from rtems object classes
+ */
+
+typedef enum {
+ RTEMS_MONITOR_OBJECT_INVALID = OBJECTS_NO_CLASS,
+ RTEMS_MONITOR_OBJECT_TASK = OBJECTS_RTEMS_TASKS,
+ RTEMS_MONITOR_OBJECT_EXTENSION = OBJECTS_RTEMS_EXTENSIONS,
+ RTEMS_MONITOR_OBJECT_QUEUE = OBJECTS_RTEMS_MESSAGE_QUEUES,
+ RTEMS_MONITOR_OBJECT_SEMAPHORE = OBJECTS_RTEMS_SEMAPHORES,
+ RTEMS_MONITOR_OBJECT_PARTITION = OBJECTS_RTEMS_PARTITIONS,
+ RTEMS_MONITOR_OBJECT_REGION = OBJECTS_RTEMS_REGIONS,
+ RTEMS_MONITOR_OBJECT_PORT = OBJECTS_RTEMS_PORTS,
+
+ /* following monitor objects are not known to RTEMS, but
+ * we like to have "types" for them anyway */
+
+ RTEMS_MONITOR_OBJECT_DRIVER = OBJECTS_CLASSES_LAST+1,
+ RTEMS_MONITOR_OBJECT_DNAME,
+ RTEMS_MONITOR_OBJECT_CONFIG,
+ RTEMS_MONITOR_OBJECT_INIT_TASK,
+ RTEMS_MONITOR_OBJECT_MPCI,
+ RTEMS_MONITOR_OBJECT_SYMBOL
+} rtems_monitor_object_type_t;
+
+/*
+ * rtems_monitor_init() flags
+ */
+
+#define RTEMS_MONITOR_SUSPEND 0x0001 /* suspend monitor on startup */
+#define RTEMS_MONITOR_GLOBAL 0x0002 /* monitor should be global */
+
+
+/*
+ * Public interfaces for RTEMS data structures monitor is aware of.
+ * These are only used by the monitor.
+ *
+ * NOTE:
+ * All the canonical objects that correspond to RTEMS managed "objects"
+ * must have an identical first portion with 'id' and 'name' fields.
+ *
+ * Others do not have that restriction, even tho we would like them to.
+ * This is because some of the canonical structures are almost too big
+ * for shared memory driver (eg: mpci) and we are nickel and diming it.
+ */
+
+/*
+ * Type of a pointer that may be a symbol
+ */
+
+#define MONITOR_SYMBOL_LEN 20
+typedef struct {
+ char name[MONITOR_SYMBOL_LEN];
+ unsigned32 value;
+ unsigned32 offset;
+} rtems_monitor_symbol_t;
+
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+} rtems_monitor_generic_t;
+
+/*
+ * Task
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ Thread_Entry entry;
+ unsigned32 argument;
+ void *stack;
+ unsigned32 stack_size;
+ rtems_task_priority priority;
+ States_Control state;
+ rtems_event_set events;
+ rtems_mode modes;
+ rtems_attribute attributes;
+ unsigned32 notepad[RTEMS_NUMBER_NOTEPADS];
+ rtems_id wait_id;
+ unsigned32 wait_args;
+} rtems_monitor_task_t;
+
+/*
+ * Init task
+ */
+
+typedef struct {
+ rtems_id id; /* not really an id */
+ rtems_name name;
+ /* end of common portion */
+ rtems_monitor_symbol_t entry;
+ unsigned32 argument;
+ unsigned32 stack_size;
+ rtems_task_priority priority;
+ rtems_mode modes;
+ rtems_attribute attributes;
+} rtems_monitor_init_task_t;
+
+
+/*
+ * Message queue
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ rtems_attribute attributes;
+ unsigned32 number_of_pending_messages;
+ unsigned32 maximum_pending_messages;
+ unsigned32 maximum_message_size;
+} rtems_monitor_queue_t;
+
+/*
+ * Extension
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ rtems_monitor_symbol_t e_create;
+ rtems_monitor_symbol_t e_start;
+ rtems_monitor_symbol_t e_restart;
+ rtems_monitor_symbol_t e_delete;
+ rtems_monitor_symbol_t e_tswitch;
+ rtems_monitor_symbol_t e_begin;
+ rtems_monitor_symbol_t e_exitted;
+ rtems_monitor_symbol_t e_fatal;
+} rtems_monitor_extension_t;
+
+/*
+ * Device driver
+ */
+
+typedef struct {
+ rtems_id id; /* not really an id (should be tho) */
+ rtems_name name; /* ditto */
+ /* end of common portion */
+ rtems_monitor_symbol_t initialization; /* initialization procedure */
+ rtems_monitor_symbol_t open; /* open request procedure */
+ rtems_monitor_symbol_t close; /* close request procedure */
+ rtems_monitor_symbol_t read; /* read request procedure */
+ rtems_monitor_symbol_t write; /* write request procedure */
+ rtems_monitor_symbol_t control; /* special functions procedure */
+} rtems_monitor_driver_t;
+
+typedef struct {
+ rtems_id id; /* not used for drivers (yet) */
+ rtems_name name; /* not used for drivers (yet) */
+ /* end of common portion */
+ unsigned32 major;
+ unsigned32 minor;
+ char name_string[64];
+} rtems_monitor_dname_t;
+
+/*
+ * System config
+ */
+
+typedef struct {
+ void *work_space_start;
+ unsigned32 work_space_size;
+ unsigned32 maximum_tasks;
+ unsigned32 maximum_timers;
+ unsigned32 maximum_semaphores;
+ unsigned32 maximum_message_queues;
+ unsigned32 maximum_partitions;
+ unsigned32 maximum_regions;
+ unsigned32 maximum_ports;
+ unsigned32 maximum_periods;
+ unsigned32 maximum_extensions;
+ unsigned32 microseconds_per_tick;
+ unsigned32 ticks_per_timeslice;
+ unsigned32 number_of_initialization_tasks;
+} rtems_monitor_config_t;
+
+/*
+ * MPCI config
+ */
+
+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 */
+
+ unsigned32 default_timeout; /* in ticks */
+ unsigned32 maximum_packet_size;
+ rtems_monitor_symbol_t initialization;
+ rtems_monitor_symbol_t get_packet;
+ rtems_monitor_symbol_t return_packet;
+ rtems_monitor_symbol_t send_packet;
+ rtems_monitor_symbol_t receive_packet;
+} rtems_monitor_mpci_t;
+
+/*
+ * The generic canonical information union
+ */
+
+typedef union {
+ rtems_monitor_generic_t generic;
+ rtems_monitor_task_t task;
+ rtems_monitor_queue_t queue;
+ rtems_monitor_extension_t extension;
+ rtems_monitor_driver_t driver;
+ rtems_monitor_dname_t dname;
+ rtems_monitor_config_t config;
+ rtems_monitor_mpci_t mpci;
+ rtems_monitor_init_task_t itask;
+} rtems_monitor_union_t;
+
+/*
+ * Support for talking to other monitors
+ */
+
+/*
+ * Names of other monitors
+ */
+
+#define RTEMS_MONITOR_NAME (rtems_build_name('R', 'M', 'O', 'N'))
+#define RTEMS_MONITOR_SERVER_NAME (rtems_build_name('R', 'M', 'S', 'V'))
+#define RTEMS_MONITOR_QUEUE_NAME (rtems_build_name('R', 'M', 'S', 'Q'))
+#define RTEMS_MONITOR_RESPONSE_QUEUE_NAME (rtems_build_name('R', 'M', 'R', 'Q'))
+
+#define RTEMS_MONITOR_SERVER_RESPONSE 0x0001
+#define RTEMS_MONITOR_SERVER_CANONICAL 0x0002
+
+typedef struct
+{
+ unsigned32 command;
+ rtems_id return_id;
+ unsigned32 argument0;
+ unsigned32 argument1;
+ unsigned32 argument2;
+ unsigned32 argument3;
+ unsigned32 argument4;
+ unsigned32 argument5;
+} rtems_monitor_server_request_t;
+
+typedef struct
+{
+ unsigned32 command;
+ unsigned32 result0;
+ unsigned32 result1;
+ rtems_monitor_union_t payload;
+} rtems_monitor_server_response_t;
+
+extern rtems_id rtems_monitor_task_id;
+
+extern unsigned32 rtems_monitor_node; /* our node number */
+extern unsigned32 rtems_monitor_default_node; /* current default for commands */
+
+/*
+ * Monitor command function and table entry
+ */
+
+typedef struct rtems_monitor_command_entry_s rtems_monitor_command_entry_t;
+
+typedef void ( *rtems_monitor_command_function_t )(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+ );
+
+struct rtems_monitor_command_entry_s {
+ char *command; /* command name */
+ char *usage; /* usage string for the command */
+ unsigned32 arguments_required; /* # of required args */
+ rtems_monitor_command_function_t command_function;
+
+ /* Some argument for the command */
+ unsigned32 command_arg;
+};
+
+typedef void *(*rtems_monitor_object_next_fn)(void *, void *, rtems_id *);
+typedef void (*rtems_monitor_object_canonical_fn)(void *, void *);
+typedef void (*rtems_monitor_object_dump_header_fn)(boolean);
+typedef void (*rtems_monitor_object_dump_fn)(void *, boolean);
+
+typedef struct {
+ rtems_monitor_object_type_t type;
+ void *object_information;
+ int size; /* of canonical object */
+ rtems_monitor_object_next_fn next;
+ rtems_monitor_object_canonical_fn canonical;
+ rtems_monitor_object_dump_header_fn dump_header;
+ rtems_monitor_object_dump_fn dump;
+} rtems_monitor_object_info_t;
+
+
+/* monitor.c */
+void rtems_monitor_kill(void);
+void rtems_monitor_init(rtems_boolean);
+void rtems_monitor_wakeup(void);
+void rtems_monitor_pause_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_fatal_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_continue_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_debugger_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_node_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_symbols_loadup(void);
+void rtems_monitor_task(rtems_task_argument);
+
+/* server.c */
+void rtems_monitor_server_kill(void);
+rtems_status_code rtems_monitor_server_request(unsigned32, rtems_monitor_server_request_t *, rtems_monitor_server_response_t *);
+void rtems_monitor_server_task(rtems_task_argument);
+void rtems_monitor_server_init(unsigned32);
+
+/* command.c */
+int rtems_monitor_make_argv(char *, int *, char **);
+int rtems_monitor_command_read(char *, int *, char **);
+rtems_monitor_command_entry_t *rtems_monitor_command_lookup(
+ rtems_monitor_command_entry_t * table, int argc, char **argv);
+void rtems_monitor_command_usage(rtems_monitor_command_entry_t *, char *);
+void rtems_monitor_help_cmd(int, char **, unsigned32, boolean);
+
+/* prmisc.c */
+void rtems_monitor_separator(void);
+unsigned32 rtems_monitor_pad(unsigned32 dest_col, unsigned32 curr_col);
+unsigned32 rtems_monitor_dump_char(unsigned8 ch);
+unsigned32 rtems_monitor_dump_decimal(unsigned32 num);
+unsigned32 rtems_monitor_dump_hex(unsigned32 num);
+unsigned32 rtems_monitor_dump_id(rtems_id id);
+unsigned32 rtems_monitor_dump_name(rtems_name name);
+unsigned32 rtems_monitor_dump_priority(rtems_task_priority priority);
+unsigned32 rtems_monitor_dump_state(States_Control state);
+unsigned32 rtems_monitor_dump_modes(rtems_mode modes);
+unsigned32 rtems_monitor_dump_attributes(rtems_attribute attributes);
+unsigned32 rtems_monitor_dump_events(rtems_event_set events);
+unsigned32 rtems_monitor_dump_notepad(unsigned32 *notepad);
+
+/* object.c */
+rtems_id rtems_monitor_id_fixup(rtems_id, unsigned32, rtems_monitor_object_type_t);
+rtems_id rtems_monitor_object_canonical_get(rtems_monitor_object_type_t, rtems_id, void *, unsigned32 *size_p);
+rtems_id rtems_monitor_object_canonical_next(rtems_monitor_object_info_t *, rtems_id, void *);
+void *rtems_monitor_object_next(void *, void *, rtems_id, rtems_id *);
+rtems_id rtems_monitor_object_canonical(rtems_id, void *);
+void rtems_monitor_object_cmd(int, char **, unsigned32, boolean);
+
+/* manager.c */
+void *rtems_monitor_manager_next(void *, void *, rtems_id *);
+
+/* config.c */
+void rtems_monitor_config_canonical(rtems_monitor_config_t *, void *);
+void *rtems_monitor_config_next(void *, rtems_monitor_config_t *, rtems_id *);
+void rtems_monitor_config_dump_header(boolean);
+void rtems_monitor_config_dump(rtems_monitor_config_t *, boolean verbose);
+
+/* mpci.c */
+void rtems_monitor_mpci_canonical(rtems_monitor_mpci_t *, void *);
+void *rtems_monitor_mpci_next(void *, rtems_monitor_mpci_t *, rtems_id *);
+void rtems_monitor_mpci_dump_header(boolean);
+void rtems_monitor_mpci_dump(rtems_monitor_mpci_t *, boolean verbose);
+
+/* itask.c */
+void rtems_monitor_init_task_canonical(rtems_monitor_init_task_t *, void *);
+void *rtems_monitor_init_task_next(void *, rtems_monitor_init_task_t *, rtems_id *);
+void rtems_monitor_init_task_dump_header(boolean);
+void rtems_monitor_init_task_dump(rtems_monitor_init_task_t *, boolean verbose);
+
+/* extension.c */
+void rtems_monitor_extension_canonical(rtems_monitor_extension_t *, void *);
+void rtems_monitor_extension_dump_header(boolean verbose);
+void rtems_monitor_extension_dump(rtems_monitor_extension_t *, boolean);
+
+/* task.c */
+void rtems_monitor_task_canonical(rtems_monitor_task_t *, void *);
+void rtems_monitor_task_dump_header(boolean verbose);
+void rtems_monitor_task_dump(rtems_monitor_task_t *, boolean);
+
+/* queue.c */
+void rtems_monitor_queue_canonical(rtems_monitor_queue_t *, void *);
+void rtems_monitor_queue_dump_header(boolean verbose);
+void rtems_monitor_queue_dump(rtems_monitor_queue_t *, boolean);
+
+/* driver.c */
+void *rtems_monitor_driver_next(void *, rtems_monitor_driver_t *, rtems_id *);
+void rtems_monitor_driver_canonical(rtems_monitor_driver_t *, void *);
+void rtems_monitor_driver_dump_header(boolean);
+void rtems_monitor_driver_dump(rtems_monitor_driver_t *, boolean);
+
+/* dname.c */
+void *rtems_monitor_dname_next(void *, rtems_monitor_dname_t *, rtems_id *);
+void rtems_monitor_dname_canonical(rtems_monitor_dname_t *, void *);
+void rtems_monitor_dname_dump_header(boolean);
+void rtems_monitor_dname_dump(rtems_monitor_dname_t *, boolean);
+
+/* symbols.c */
+rtems_symbol_table_t *rtems_symbol_table_create();
+void rtems_symbol_table_destroy(rtems_symbol_table_t *table);
+
+rtems_symbol_t *rtems_symbol_create(rtems_symbol_table_t *, char *, unsigned32);
+rtems_symbol_t *rtems_symbol_value_lookup(rtems_symbol_table_t *, unsigned32);
+const rtems_symbol_t *rtems_symbol_value_lookup_exact(rtems_symbol_table_t *, unsigned32);
+rtems_symbol_t *rtems_symbol_name_lookup(rtems_symbol_table_t *, char *);
+void *rtems_monitor_symbol_next(void *object_info, rtems_monitor_symbol_t *, rtems_id *);
+void rtems_monitor_symbol_canonical(rtems_monitor_symbol_t *, rtems_symbol_t *);
+void rtems_monitor_symbol_canonical_by_name(rtems_monitor_symbol_t *, char *);
+void rtems_monitor_symbol_canonical_by_value(rtems_monitor_symbol_t *, void *);
+unsigned32 rtems_monitor_symbol_dump(rtems_monitor_symbol_t *, boolean);
+void rtems_monitor_symbol_cmd(int, char **, unsigned32, boolean);
+
+
+extern rtems_symbol_table_t *rtems_monitor_symbols;
+
+#ifndef MONITOR_PROMPT
+#define MONITOR_PROMPT "rtems" /* will have '> ' appended */
+#endif
+
+#define MONITOR_WAKEUP_EVENT RTEMS_EVENT_0
+
+
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define STRNEQ(a,b,n) (strncmp(a,b,n) == 0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! __MONITOR_H */
diff --git a/c/src/libmisc/monitor/symbols.h b/c/src/libmisc/monitor/symbols.h
new file mode 100644
index 0000000000..061ccdd952
--- /dev/null
+++ b/c/src/libmisc/monitor/symbols.h
@@ -0,0 +1,64 @@
+/*
+ * RTEMS monitor symbol table functions
+ *
+ * Description:
+ * Entry points for symbol table routines.
+ *
+ *
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_SYMBOLS_H
+#define _INCLUDE_SYMBOLS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ rtems_unsigned32 value;
+ char *name;
+} rtems_symbol_t;
+
+#define SYMBOL_STRING_BLOCK_SIZE 4080
+typedef struct rtems_symbol_string_block_s {
+ struct rtems_symbol_string_block_s *next;
+ char buffer[SYMBOL_STRING_BLOCK_SIZE];
+} rtems_symbol_string_block_t;
+
+typedef struct {
+
+ rtems_unsigned32 sorted; /* are symbols sorted right now? */
+
+ rtems_unsigned32 growth_factor; /* % to grow by when needed */
+
+ rtems_unsigned32 next; /* next symbol slot to use when adding */
+ rtems_unsigned32 size; /* max # of symbols */
+
+ /*
+ * Symbol list -- sorted by address (when we do a lookup)
+ */
+
+ rtems_symbol_t *addresses; /* symbol array by address */
+
+ /*
+ * String pool, unsorted, a list of blocks of string data
+ */
+
+ rtems_symbol_string_block_t *string_buffer_head;
+ rtems_symbol_string_block_t *string_buffer_current;
+ rtems_unsigned32 strings_next; /* next byte to use in this block */
+
+} rtems_symbol_table_t;
+
+#define rtems_symbol_name(sp) ((sp)->name)
+#define rtems_symbol_value(sp) ((sp)->value)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_SYMBOLS_H */
diff --git a/c/src/libmisc/rtmonuse/Makefile.in b/c/src/libmisc/rtmonuse/Makefile.in
new file mode 100644
index 0000000000..6f0808f8f2
--- /dev/null
+++ b/c/src/libmisc/rtmonuse/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/librtmonuse-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=rtmonuse
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+INSTALLED_H_FILES=$(srcdir)/rtmonuse.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
+# $(INSTALL) -m 444 ${H_FILES} ${PROJECT_RELEASE}/include/rtems
diff --git a/c/src/libmisc/rtmonuse/rtmonuse.c b/c/src/libmisc/rtmonuse/rtmonuse.c
new file mode 100644
index 0000000000..272290176e
--- /dev/null
+++ b/c/src/libmisc/rtmonuse/rtmonuse.c
@@ -0,0 +1,173 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "rtmonuse.h"
+
+typedef struct {
+ rtems_id id;
+ unsigned32 count;
+ unsigned32 missed_count;
+ unsigned32 min_cpu_time;
+ unsigned32 max_cpu_time;
+ unsigned32 total_cpu_time;
+ unsigned32 min_wall_time;
+ unsigned32 max_wall_time;
+ unsigned32 total_wall_time;
+} Period_usage_t;
+
+Period_usage_t *Period_usage_Information;
+
+/*PAGE
+ *
+ * Period_usage_Initialize
+ */
+
+void Period_usage_Initialize( void )
+{
+ int maximum;
+
+ maximum = _Configuration_Table->RTEMS_api_configuration->maximum_periods;
+
+ Period_usage_Information = malloc( sizeof(Period_usage_t) * (maximum+1) );
+
+ Period_usage_Reset();
+}
+
+/*PAGE
+ *
+ * Period_usage_Reset
+ */
+
+void Period_usage_Reset( void )
+{
+ unsigned32 i;
+ Period_usage_t *the_usage;
+
+ for ( i=0 ;
+ i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
+ i++ ) {
+ the_usage = &Period_usage_Information[ i ];
+
+ the_usage->count = 0;
+ the_usage->missed_count = 0;
+ the_usage->min_cpu_time = 0xFFFFFFFF;
+ the_usage->max_cpu_time = 0;
+ the_usage->total_cpu_time = 0;
+ the_usage->min_wall_time = 0xFFFFFFFF;
+ the_usage->max_wall_time = 0;
+ the_usage->total_wall_time = 0;
+
+ }
+}
+
+/*PAGE
+ *
+ * Period_usage_Update
+ */
+
+void Period_usage_Update(
+ rtems_id id
+)
+{
+ rtems_rate_monotonic_period_status rm_status;
+ rtems_status_code status;
+ Period_usage_t *the_usage;
+
+ assert( Period_usage_Information );
+
+ status = rtems_rate_monotonic_get_status( id, &rm_status );
+ assert( status == RTEMS_SUCCESSFUL );
+
+ the_usage = &Period_usage_Information[ rtems_get_index( id ) ];
+
+ the_usage->id = id;
+ the_usage->count++;
+ if ( rm_status.state == RATE_MONOTONIC_EXPIRED )
+ the_usage->missed_count++;
+ the_usage->total_cpu_time += rm_status.ticks_executed_since_last_period;
+ the_usage->total_wall_time += rm_status.ticks_since_last_period;
+
+ /*
+ * Update CPU time
+ */
+
+ if ( rm_status.ticks_executed_since_last_period < the_usage->min_cpu_time )
+ the_usage->min_cpu_time = rm_status.ticks_executed_since_last_period;
+
+ if ( rm_status.ticks_executed_since_last_period > the_usage->max_cpu_time )
+ the_usage->max_cpu_time = rm_status.ticks_executed_since_last_period;
+
+ /*
+ * Update Wall time
+ */
+
+ if ( rm_status.ticks_since_last_period < the_usage->min_wall_time )
+ the_usage->min_wall_time = rm_status.ticks_since_last_period;
+
+ if ( rm_status.ticks_since_last_period > the_usage->max_wall_time )
+ the_usage->max_wall_time = rm_status.ticks_since_last_period;
+
+}
+
+/*PAGE
+ *
+ * Period_usage_Dump
+ */
+
+void Period_usage_Dump( void )
+{
+ unsigned32 i;
+ Period_usage_t *the_usage;
+ Rate_monotonic_Control *the_period;
+ unsigned32 u32_name;
+ char name[5];
+
+ printf( "Period information by period\n" );
+ printf( " ID OWNER PERIODS MISSED CPU TIME WALL TIME\n" );
+
+ /*
+ * RTEMS does not use an index of zero for object ids.
+ */
+
+ for ( i=1 ;
+ i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
+ i++ ) {
+ the_usage = &Period_usage_Information[ i ];
+ if ( the_usage->count == 0 )
+ continue;
+
+ the_period =
+ (Rate_monotonic_Control *)_Rate_monotonic_Information.local_table[ i ];
+
+ if ( the_period->owner )
+ u32_name = *(unsigned32 *)the_period->owner->Object.name;
+ else
+ u32_name = rtems_build_name(' ', ' ', ' ', ' ');
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+ printf(
+ "0x%08x %4s %6d %3d %d/%d/%5.2f %d/%d/%3.2f\n",
+ the_usage->id,
+ name,
+ the_usage->count,
+ the_usage->missed_count,
+ the_usage->min_cpu_time,
+ the_usage->max_cpu_time,
+ (double) the_usage->total_cpu_time / (double) the_usage->count,
+ the_usage->min_wall_time,
+ the_usage->max_wall_time,
+ (double) the_usage->total_wall_time / (double) the_usage->count
+ );
+ }
+}
diff --git a/c/src/libmisc/rtmonuse/rtmonuse.h b/c/src/libmisc/rtmonuse/rtmonuse.h
new file mode 100644
index 0000000000..f0580a4f0b
--- /dev/null
+++ b/c/src/libmisc/rtmonuse/rtmonuse.h
@@ -0,0 +1,18 @@
+/*
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_USAGE_h
+#define __RATE_MONOTONIC_USAGE_h
+
+void Period_usage_Initialize( void );
+
+void Period_usage_Reset( void );
+
+void Period_usage_Update(
+ rtems_id id
+);
+
+void Period_usage_Dump( void );
+
+#endif
diff --git a/c/src/libmisc/stackchk/Makefile.in b/c/src/libmisc/stackchk/Makefile.in
new file mode 100644
index 0000000000..ebaf092657
--- /dev/null
+++ b/c/src/libmisc/stackchk/Makefile.in
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=${ARCH}/libstackchk-tmp.a
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=check
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=internal.h
+INSTALLED_H_FILES=$(srcdir)/stackchk.h
+
+SRCS=$(C_FILES) $(H_FILES) $(INSTALLED_H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${LIB}: ${SRCS} ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL) -m 444 ${INSTALLED_H_FILES} ${PROJECT_RELEASE}/include
diff --git a/c/src/libmisc/stackchk/README b/c/src/libmisc/stackchk/README
new file mode 100644
index 0000000000..20e76f07bc
--- /dev/null
+++ b/c/src/libmisc/stackchk/README
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+This directory contains a stack bounds checker. It provides two
+primary features:
+
+ + check for stack overflow at each context switch
+ + provides an educated guess at each task's stack usage
+
+The stack overflow check at context switch works by looking for
+a 16 byte pattern at the logical end of the stack to be corrupted.
+The "guesser" assumes that the entire stack was prefilled with a known
+pattern and assumes that the pattern is still in place if the memory
+has not been used as a stack.
+
+Both of these can be fooled by pushing large holes onto the stack
+and not writing to them... or (much more unlikely) writing the
+magic patterns into memory.
+
+This code has not been extensively tested. It is provided as a tool
+for RTEMS users to catch the most common mistake in multitasking
+systems ... too little stack space. Suggestions and comments are appreciated.
+
+NOTES:
+
+1. Stack usage information is questionable on CPUs which push
+ large holes on stack.
+
+2. The stack checker has a tendency to generate a fault when
+ trying to print the helpful diagnostic message. If it comes
+ out, congratulations. If not, then the variable Stack_check_Blown_task
+ contains a pointer to the TCB of the offending task. This
+ is usually enough to go on.
+
+FUTURE:
+
+1. Determine how/if gcc will generate stack probe calls and support that.
+
+2. Get accurate stack usage numbers on i960.. it pushes very large
+ holes on the stack.
diff --git a/c/src/libmisc/stackchk/check.c b/c/src/libmisc/stackchk/check.c
new file mode 100644
index 0000000000..45887c3929
--- /dev/null
+++ b/c/src/libmisc/stackchk/check.c
@@ -0,0 +1,525 @@
+/*
+ * Stack Overflow Check User Extension Set
+ *
+ * NOTE: This extension set automatically determines at
+ * initialization time whether the stack for this
+ * CPU grows up or down and installs the correct
+ * extension routines for that direction.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+#include <rtems.h>
+
+/*
+ * HACK
+ * the stack dump information should be printed by a "fatal" extension.
+ * Fatal extensions only get called via rtems_fatal_error_occurred()
+ * and not when rtems_shutdown_executive() is called.
+ * I hope/think this is changing so that fatal extensions are renamed
+ * to "shutdown" extensions.
+ * When that happens, this #define should be deleted and all the code
+ * it marks.
+ */
+#define DONT_USE_FATAL_EXTENSION
+
+
+extern rtems_configuration_table BSP_Configuration;
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "stackchk.h"
+#include "internal.h"
+
+/*
+ * This variable contains the name of the task which "blew" the stack.
+ * It is NULL if the system is all right.
+ */
+
+Thread_Control *Stack_check_Blown_task;
+
+/*
+ * The extension table for the stack checker.
+ */
+
+rtems_extensions_table Stack_check_Extension_table = {
+ Stack_check_Create_extension, /* rtems_task_create */
+ 0, /* rtems_task_start */
+ 0, /* rtems_task_restart */
+ 0, /* rtems_task_delete */
+ Stack_check_Switch_extension, /* task_switch */
+ Stack_check_Begin_extension, /* task_begin */
+ 0, /* task_exitted */
+#ifdef DONT_USE_FATAL_EXTENSION
+ 0, /* fatal */
+#else
+ Stack_check_Fatal_extension, /* fatal */
+#endif
+};
+
+/*
+ * The "magic pattern" used to mark the end of the stack.
+ */
+
+Stack_check_Control Stack_check_Pattern;
+
+/*
+ * Where the pattern goes in the stack area is dependent upon
+ * whether the stack grow to the high or low area of the memory.
+ *
+ */
+
+#if ( CPU_STACK_GROWS_UP == TRUE )
+
+#define Stack_check_Get_pattern_area( _the_stack ) \
+ ((Stack_check_Control *) ((char *)(_the_stack)->area + \
+ (_the_stack)->size - sizeof( Stack_check_Control ) ))
+
+#define Stack_check_Calculate_used( _low, _size, _high_water ) \
+ ((char *)(_high_water) - (char *)(_low))
+
+#define Stack_check_usable_stack_start(_the_stack) \
+ ((_the_stack)->area)
+
+#else
+
+#define Stack_check_Get_pattern_area( _the_stack ) \
+ ((Stack_check_Control *) ((char *)(_the_stack)->area + HEAP_OVERHEAD))
+
+#define Stack_check_Calculate_used( _low, _size, _high_water) \
+ ( ((char *)(_low) + (_size)) - (char *)(_high_water) )
+
+#define Stack_check_usable_stack_start(_the_stack) \
+ ((char *)(_the_stack)->area + sizeof(Stack_check_Control))
+
+#endif
+
+#define Stack_check_usable_stack_size(_the_stack) \
+ ((_the_stack)->size - sizeof(Stack_check_Control))
+
+
+/*
+ * Do we have an interrupt stack?
+ * XXX it would sure be nice if the interrupt stack were also
+ * stored in a "stack" structure!
+ */
+
+
+Stack_Control stack_check_interrupt_stack;
+
+/*
+ * Prototypes necessary for forward references
+ */
+
+void Stack_check_Dump_usage( void );
+
+/*
+ * Fill an entire stack area with BYTE_PATTERN.
+ * This will be used by a Fatal extension to check for
+ * amount of actual stack used
+ */
+
+void
+stack_check_dope_stack(Stack_Control *stack)
+{
+ memset(stack->area, BYTE_PATTERN, stack->size);
+}
+
+
+/*PAGE
+ *
+ * Stack_check_Initialize
+ */
+
+unsigned32 stack_check_initialized = 0;
+
+void Stack_check_Initialize( void )
+{
+ rtems_status_code status;
+ Objects_Id id_ignored;
+ unsigned32 *p;
+#if 0
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+#endif
+
+ if (stack_check_initialized)
+ return;
+
+ /*
+ * Dope the pattern and fill areas
+ */
+
+ for ( p = Stack_check_Pattern.pattern;
+ p < &Stack_check_Pattern.pattern[PATTERN_SIZE_WORDS];
+ p += 4
+ )
+ {
+ p[0] = 0xFEEDF00D; /* FEED FOOD to BAD DOG */
+ p[1] = 0x0BAD0D06;
+ p[2] = 0xDEADF00D; /* DEAD FOOD GOOD DOG */
+ p[3] = 0x600D0D06;
+ };
+
+ status = rtems_extension_create(
+ rtems_build_name( 'S', 'T', 'C', 'K' ),
+ &Stack_check_Extension_table,
+ &id_ignored
+ );
+ assert ( status == RTEMS_SUCCESSFUL );
+
+ Stack_check_Blown_task = 0;
+
+ /*
+ * If installed by a task, that task will not get setup properly
+ * since it missed out on the create hook. This will cause a
+ * failure on first switch out of that task.
+ * 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
+ * also.
+ */
+ if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high)
+ {
+ stack_check_interrupt_stack.area = _CPU_Interrupt_stack_low;
+ stack_check_interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
+ (char *) _CPU_Interrupt_stack_low;
+
+ stack_check_dope_stack(&stack_check_interrupt_stack);
+ }
+
+#ifdef DONT_USE_FATAL_EXTENSION
+#ifdef RTEMS_DEBUG
+ /*
+ * this would normally be called by a fatal extension
+ * handler, but we don't run fatal extensions unless
+ * we fatal error.
+ */
+ atexit(Stack_check_Dump_usage);
+#endif
+#endif
+
+ stack_check_initialized = 1;
+}
+
+/*PAGE
+ *
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+)
+{
+ if (the_thread /* XXX && (the_thread != _Thread_Executing) */ )
+ stack_check_dope_stack(&the_thread->Start.Initial_stack);
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+)
+{
+ Stack_check_Control *the_pattern;
+
+ if ( the_thread->Object.id == 0 ) /* skip system tasks */
+ return;
+
+ the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack);
+
+ *the_pattern = Stack_check_Pattern;
+}
+
+/*PAGE
+ *
+ * Stack_check_report_blown_task
+ * Report a blown stack. Needs to be a separate routine
+ * so that interrupt handlers can use this too.
+ *
+ * Caller must have set the Stack_check_Blown_task.
+ *
+ * NOTE: The system is in a questionable state... we may not get
+ * the following message out.
+ */
+
+void Stack_check_report_blown_task(void)
+{
+ Stack_Control *stack;
+ Thread_Control *running;
+
+ running = Stack_check_Blown_task;
+ stack = &running->Start.Initial_stack;
+
+ fprintf(
+ stderr,
+ "BLOWN STACK!!! Offending task(%p): id=0x%08x; name=0x%08x",
+ running,
+ running->Object.id,
+ *(unsigned32 *)running->Object.name
+ );
+ fflush(stderr);
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ fprintf(
+ stderr,
+ "; node=%d\n",
+ BSP_Configuration.User_multiprocessing_table->node
+ );
+ else
+ fprintf(stderr, "\n");
+ fflush(stderr);
+
+ fprintf(
+ stderr,
+ " stack covers range 0x%08x - 0x%08x (%d bytes)\n",
+ (unsigned32) stack->area,
+ (unsigned32) stack->area + stack->size - 1,
+ (unsigned32) stack->size);
+ fflush(stderr);
+
+ fprintf(
+ stderr,
+ " Damaged pattern begins at 0x%08x and is %d bytes long\n",
+ (unsigned32) Stack_check_Get_pattern_area(stack), PATTERN_SIZE_BYTES);
+ fflush(stderr);
+
+ rtems_fatal_error_occurred( (unsigned32) "STACK BLOWN" );
+}
+
+/*PAGE
+ *
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+)
+{
+ if ( running->Object.id == 0 ) /* skip system tasks */
+ return;
+
+ if (0 != memcmp( (void *) Stack_check_Get_pattern_area( &running->Start.Initial_stack)->pattern,
+ (void *) Stack_check_Pattern.pattern,
+ PATTERN_SIZE_BYTES))
+ {
+ Stack_check_Blown_task = running;
+ Stack_check_report_blown_task();
+ }
+}
+
+void *Stack_check_find_high_water_mark(
+ const void *s,
+ size_t n
+)
+{
+ const unsigned32 *base, *ebase;
+ unsigned32 length;
+
+ base = s;
+ length = n/4;
+
+#if ( CPU_STACK_GROWS_UP == TRUE )
+ /*
+ * start at higher memory and find first word that does not
+ * match pattern
+ */
+
+ base += length - 1;
+ for (ebase = s; base > ebase; base--)
+ if (*base != U32_PATTERN)
+ return (void *) base;
+#else
+ /*
+ * start at lower memory and find first word that does not
+ * match pattern
+ */
+
+ base += PATTERN_SIZE_WORDS;
+ for (ebase = base + length; base < ebase; base++)
+ if (*base != U32_PATTERN)
+ return (void *) base;
+#endif
+
+ return (void *)0;
+}
+
+/*PAGE
+ *
+ * Stack_check_Dump_threads_usage
+ * Try to print out how much stack was actually used by the task.
+ *
+ */
+
+void Stack_check_Dump_threads_usage(
+ Thread_Control *the_thread
+)
+{
+ unsigned32 size, used;
+ void *low;
+ void *high_water_mark;
+ Stack_Control *stack;
+ unsigned32 u32_name;
+ char name[5];
+
+
+ if ( !the_thread )
+ return;
+
+ /*
+ * XXX HACK to get to interrupt stack
+ */
+
+ if (the_thread == (Thread_Control *) -1)
+ {
+ if (stack_check_interrupt_stack.area)
+ {
+ stack = &stack_check_interrupt_stack;
+ the_thread = 0;
+ }
+ else
+ return;
+ }
+ else
+ stack = &the_thread->Start.Initial_stack;
+
+ low = Stack_check_usable_stack_start(stack);
+ size = Stack_check_usable_stack_size(stack);
+
+ high_water_mark = Stack_check_find_high_water_mark(low, size);
+
+ if ( high_water_mark )
+ used = Stack_check_Calculate_used( low, size, high_water_mark );
+ else
+ used = 0;
+
+ if ( the_thread )
+ u32_name = *(unsigned32 *)the_thread->Object.name;
+ else
+ u32_name = rtems_build_name('I', 'N', 'T', 'R');
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+ printf( "0x%08x %4s 0x%08x 0x%08x %8d %8d\n",
+ the_thread ? the_thread->Object.id : ~0,
+ name,
+ (unsigned32) stack->area,
+ (unsigned32) stack->area + (unsigned32) stack->size - 1,
+ size,
+ used
+ );
+}
+
+/*PAGE
+ *
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+)
+{
+#ifndef DONT_USE_FATAL_EXTENSION
+ if (status == 0)
+ Stack_check_Dump_usage();
+#endif
+}
+
+
+/*PAGE
+ *
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ unsigned32 hit_running = 0;
+ Objects_Information *information;
+
+ if (stack_check_initialized == 0)
+ return;
+
+ printf("Stack usage by thread\n");
+ printf(
+ " ID NAME LOW HIGH AVAILABLE USED\n"
+ );
+
+ 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_Dump_threads_usage( the_thread );
+ if ( the_thread == _Thread_Executing )
+ hit_running = 1;
+ }
+ }
+ }
+
+ if ( !hit_running )
+ Stack_check_Dump_threads_usage( _Thread_Executing );
+
+ /* dump interrupt stack info if any */
+ Stack_check_Dump_threads_usage((Thread_Control *) -1);
+}
+
diff --git a/c/src/libmisc/stackchk/internal.h b/c/src/libmisc/stackchk/internal.h
new file mode 100644
index 0000000000..6d665a4594
--- /dev/null
+++ b/c/src/libmisc/stackchk/internal.h
@@ -0,0 +1,96 @@
+/* internal.h
+ *
+ * This include file contains internal information
+ * for the RTEMS stack checker.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INTERNAL_STACK_CHECK_h
+#define __INTERNAL_STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This structure is used to fill in and compare the "end of stack"
+ * marker pattern.
+ * pattern area must be a multiple of 4 words.
+ */
+
+#ifdef CPU_STACK_CHECK_SIZE
+#define PATTERN_SIZE_WORDS (((CPU_STACK_CHECK_SIZE / 4) + 3) & ~0x3)
+#else
+#define PATTERN_SIZE_WORDS 4
+#endif
+
+#define PATTERN_SIZE_BYTES (PATTERN_SIZE_WORDS * 4)
+
+typedef struct {
+ unsigned32 pattern[ PATTERN_SIZE_WORDS ];
+} Stack_check_Control;
+
+/*
+ * The pattern used to fill the entire stack.
+ */
+
+#define BYTE_PATTERN 0xA5
+#define U32_PATTERN 0xA5A5A5A5
+
+/*
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+);
+
+/*
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+);
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/libmisc/stackchk/stackchk.h b/c/src/libmisc/stackchk/stackchk.h
new file mode 100644
index 0000000000..006b6f3727
--- /dev/null
+++ b/c/src/libmisc/stackchk/stackchk.h
@@ -0,0 +1,41 @@
+/* stackchk.h
+ *
+ * This include file contains information necessary to utilize
+ * and install the stack checker mechanism.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_CHECK_h
+#define __STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Stack_check_Initialize
+ */
+
+void Stack_check_Initialize( void );
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/libmisc/wrapup/Makefile.in b/c/src/libmisc/wrapup/Makefile.in
new file mode 100644
index 0000000000..5884336105
--- /dev/null
+++ b/c/src/libmisc/wrapup/Makefile.in
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+LIB=$(ARCH)/libmisc.a
+
+# Using the wildcard on the Purify support makes sure it may not be there
+
+LIBS=../monitor/$(ARCH)/libmonitor-tmp.a \
+ ../error/$(ARCH)/liberror-tmp.a \
+ ../assoc/$(ARCH)/libassoc-tmp.a \
+ ../stackchk/$(ARCH)/libstackchk-tmp.a \
+ ../cpuuse/$(ARCH)/libcpuuse-tmp.a \
+ ../rtmonuse/$(ARCH)/librtmonuse-tmp.a \
+ $(wildcard ../purify/$(ARCH)/libpurify-tmp.a)
+RELS=
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${LIBS} $(RELS)
+ $(RM) -r $(ARCH)
+ $(MKDIR) $(ARCH)
+ cd $(ARCH); for lib in $(LIBS:%=../%); do \
+ $(AR) -xv $$lib; \
+ done
+ $(RM) $@
+ $(AR) ruv $@ $(ARCH)/*
+ $(MKLIB) $@
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/optman/rtems/no-dpmem.c b/c/src/optman/rtems/no-dpmem.c
new file mode 100644
index 0000000000..bab609f42f
--- /dev/null
+++ b/c/src/optman/rtems/no-dpmem.c
@@ -0,0 +1,98 @@
+/*
+ * Dual Port Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/dpmem.h>
+
+void _Dual_ported_memory_Manager_initialization(
+ unsigned32 maximum_ports
+)
+{
+}
+
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ unsigned32 length,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_internal_to_external(
+ Objects_Id id,
+ void *internal,
+ void **external
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_port_external_to_internal(
+ Objects_Id id,
+ void *external,
+ void **internal
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/optman/rtems/no-event.c b/c/src/optman/rtems/no-event.c
new file mode 100644
index 0000000000..63b1014351
--- /dev/null
+++ b/c/src/optman/rtems/no-event.c
@@ -0,0 +1,56 @@
+/*
+ * Event Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _Event_Manager_initialization( void )
+{
+}
+
+rtems_status_code rtems_event_send(
+ Objects_Id id,
+ rtems_event_set event_in
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_event_receive(
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
diff --git a/c/src/optman/rtems/no-mp.c b/c/src/optman/rtems/no-mp.c
new file mode 100644
index 0000000000..bad3476729
--- /dev/null
+++ b/c/src/optman/rtems/no-mp.c
@@ -0,0 +1,201 @@
+/*
+ * Multiprocessing Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/interr.h>
+
+void _Multiprocessing_Manager_initialization ( void )
+{
+}
+
+void rtems_multiprocessing_announce ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table,
+ unsigned32 timeout_status
+)
+{
+}
+
+void _MPCI_Create_server( void )
+{
+}
+
+void _MPCI_Initialization ( void )
+{
+}
+
+void _MPCI_Register_packet_processor(
+ MP_packet_Classes the_class,
+ MPCI_Packet_processor the_packet_processor
+
+)
+{
+}
+
+MP_packet_Prefix *_MPCI_Get_packet ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+void _MPCI_Return_packet (
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Send_process_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+unsigned32 _MPCI_Send_request_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet,
+ States_Control extra_state
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return 0;
+}
+
+void _MPCI_Send_response_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+MP_packet_Prefix *_MPCI_Receive_packet ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+Thread_Control *_MPCI_Process_response (
+ MP_packet_Prefix *the_packet
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+Thread _MPCI_Receive_server(
+ unsigned32 ignore
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Announce ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+
+void _MPCI_Internal_packets_Send_process_packet (
+ MPCI_Internal_Remote_operations operation
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+void _MPCI_Internal_packets_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+MPCI_Internal_packet *_MPCI_Internal_packets_Get_packet ( void )
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return NULL;
+}
+
+/* end of file */
diff --git a/c/src/optman/rtems/no-msg.c b/c/src/optman/rtems/no-msg.c
new file mode 100644
index 0000000000..f5f3d6e551
--- /dev/null
+++ b/c/src/optman/rtems/no-msg.c
@@ -0,0 +1,192 @@
+/*
+ * Message Queue Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/message.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/interr.h>
+
+void _Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+)
+{
+}
+
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ unsigned32 count,
+ unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_send(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_urgent(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_broadcast(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ unsigned32 *count
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_receive(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size_p,
+ unsigned32 option_set,
+ rtems_interval timeout
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_message_queue_flush(
+ Objects_Id id,
+ unsigned32 *count
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+unsigned32 _Message_queue_Flush_support(
+ Message_queue_Control *the_message_queue
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+ return 0;
+}
+
+boolean _Message_queue_Seize(
+ Message_queue_Control *the_message_queue,
+ rtems_option option_set,
+ void *buffer,
+ unsigned32 *size_p
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+ _Thread_Executing->Wait.return_code = RTEMS_UNSATISFIED;
+ return TRUE;
+}
+
+rtems_status_code _Message_queue_Submit(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ Message_queue_Submit_types submit_type
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/optman/rtems/no-part.c b/c/src/optman/rtems/no-part.c
new file mode 100644
index 0000000000..7efb5b6f06
--- /dev/null
+++ b/c/src/optman/rtems/no-part.c
@@ -0,0 +1,97 @@
+/*
+ * Partition Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _Partition_Manager_initialization(
+ unsigned32 maximum_partitions
+)
+{
+}
+
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_get_buffer(
+ Objects_Id id,
+ void **buffer
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_partition_return_buffer(
+ Objects_Id id,
+ void *buffer
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/optman/rtems/no-region.c b/c/src/optman/rtems/no-region.c
new file mode 100644
index 0000000000..da97953e56
--- /dev/null
+++ b/c/src/optman/rtems/no-region.c
@@ -0,0 +1,114 @@
+/*
+ * Region Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _Region_Manager_initialization(
+ unsigned32 maximum_regions
+)
+{
+}
+
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 page_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_get_segment(
+ Objects_Id id,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_get_segment_size(
+ Objects_Id id,
+ void *segment,
+ unsigned32 *size
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_region_return_segment(
+ Objects_Id id,
+ void *segment
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/optman/rtems/no-rtmon.c b/c/src/optman/rtems/no-rtmon.c
new file mode 100644
index 0000000000..01f539524b
--- /dev/null
+++ b/c/src/optman/rtems/no-rtmon.c
@@ -0,0 +1,117 @@
+/*
+ * Rate Monotonic Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/ratemon.h>
+
+void _Rate_monotonic_Manager_initialization(
+ unsigned32 maximum_periods
+)
+{
+}
+
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_cancel(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_rate_monotonic_period(
+ Objects_Id id,
+ rtems_interval length
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+void _Rate_monotonic_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+}
+
+boolean _Rate_monotonic_Set_state(
+Rate_monotonic_Control *the_period
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return FALSE;
+}
diff --git a/c/src/optman/rtems/no-sem.c b/c/src/optman/rtems/no-sem.c
new file mode 100644
index 0000000000..334b94233e
--- /dev/null
+++ b/c/src/optman/rtems/no-sem.c
@@ -0,0 +1,114 @@
+/*
+ * Semaphore Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/interr.h>
+
+void _Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+)
+{
+}
+
+rtems_status_code rtems_semaphore_create(
+ rtems_name name,
+ unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_obtain(
+ Objects_Id id,
+ unsigned32 option_set,
+ rtems_interval timeout
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_semaphore_release(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+boolean _Semaphore_Seize(
+ Semaphore_Control *the_semaphore,
+ rtems_option option_set
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ _Thread_Executing->Wait.return_code = RTEMS_UNSATISFIED;
+ return TRUE;
+}
diff --git a/c/src/optman/rtems/no-signal.c b/c/src/optman/rtems/no-signal.c
new file mode 100644
index 0000000000..a8e0b4e610
--- /dev/null
+++ b/c/src/optman/rtems/no-signal.c
@@ -0,0 +1,56 @@
+/*
+ * Signal Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/rtems/signal.h>
+
+void _Signal_Manager_initialization( void )
+{
+}
+
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry handler,
+ rtems_mode mode_set
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_signal_send(
+ rtems_id id,
+ rtems_signal_set signal_set
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+/* end of file */
diff --git a/c/src/optman/rtems/no-timer.c b/c/src/optman/rtems/no-timer.c
new file mode 100644
index 0000000000..6a8f17e0f9
--- /dev/null
+++ b/c/src/optman/rtems/no-timer.c
@@ -0,0 +1,123 @@
+/*
+ * Timer Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/interr.h>
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/timer.h>
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+)
+{
+}
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_fire_after(
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_fire_when(
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/optman/sapi/no-ext.c b/c/src/optman/sapi/no-ext.c
new file mode 100644
index 0000000000..92387ba6cb
--- /dev/null
+++ b/c/src/optman/sapi/no-ext.c
@@ -0,0 +1,67 @@
+/*
+ * Extension Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/extension.h>
+#include <rtems/score/interr.h>
+
+void _Extension_Manager_initialization(
+ unsigned32 maximum_extensions
+)
+{
+}
+
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *extension_table,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_extension_delete(
+ Objects_Id id
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/optman/sapi/no-io.c b/c/src/optman/sapi/no-io.c
new file mode 100644
index 0000000000..273d9208ef
--- /dev/null
+++ b/c/src/optman/sapi/no-io.c
@@ -0,0 +1,144 @@
+/*
+ * Input/Output Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/io.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/interr.h>
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+)
+{
+}
+
+void _IO_Initialize_all_drivers( void )
+{
+}
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_lookup_name(
+ const char *pathname,
+ rtems_driver_name_t **rnp
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_RTEMS_API,
+ FALSE,
+ RTEMS_NOT_CONFIGURED
+ );
+ return RTEMS_NOT_CONFIGURED;
+}
diff --git a/c/src/tests/Makefile.in b/c/src/tests/Makefile.in
new file mode 100644
index 0000000000..d3db5eb6a7
--- /dev/null
+++ b/c/src/tests/Makefile.in
@@ -0,0 +1,29 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+all: README
+
+# mptests are the multiprocessing test suite
+# We only build them if HAS_MP was defined
+
+MP_TESTS_yes_V = mptests
+MP_TESTS = $(MP_TESTS_$(HAS_MP)_V)
+
+# psxtests are the POSIX API test suite
+# We only build them if HAS_POSIX_API was defined
+
+POSIX_TESTS_yes_V = psxtests
+POSIX_TESTS = $(POSIX_TESTS_$(HAS_POSIX_API)_V)
+
+SUB_DIRS=tools support samples libtests \
+ sptests $(MP_TESTS) $(POSIX_TESTS) tmtests
+
diff --git a/c/src/tests/README b/c/src/tests/README
new file mode 100644
index 0000000000..f799370569
--- /dev/null
+++ b/c/src/tests/README
@@ -0,0 +1,44 @@
+#
+# $Id$
+#
+
+This is the directory under which the RTEMS
+test programs provided with the release are located. The
+following is a description of the contents of each file and
+subdirectory directly in this directory:
+
+NOTE: Other than the 'samples' directory these tests are intended
+ only to exercise RTEMS features and are *not* good examples
+ of programming for RTEMS.
+
+ samples
+
+ This directory contains a set of simple sample applications
+ which can be used either to test a board support package
+ or as the starting point for a custom application.
+
+ mptests
+
+ This directory contains the RTEMS Multiprocessor Test Suite.
+ The tests in this directory provide near complete (98%+) test
+ coverage of the multiprocessor specific code in RTEMS.
+
+ psxtests
+
+ This directory contains the RTEMS POSIX API Test Suite.
+ The tests in this directory test the POSIX API support in RTEMS.
+
+ sptests
+
+ This directory contains the RTEMS Single Processor Test Suite.
+ The tests in this directory provide near complete (98%+) test
+ coverage of the non-multiprocessor code in RTEMS.
+
+ tmtests
+
+ This directory contains the RTEMS Timing Test Suite.
+ The tests in this directory are used to measure the execution
+ time of RTEMS directive and some critical internal functions.
+ The results of these test are reported in the Fact Sheets
+ and Supplental Manuals.
+
diff --git a/c/src/tests/libtests/Makefile.in b/c/src/tests/libtests/Makefile.in
new file mode 100644
index 0000000000..c6875734a0
--- /dev/null
+++ b/c/src/tests/libtests/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=cpuuse rtmonuse malloctest stackchk
diff --git a/c/src/tests/libtests/README b/c/src/tests/libtests/README
new file mode 100644
index 0000000000..bc4b217832
--- /dev/null
+++ b/c/src/tests/libtests/README
@@ -0,0 +1,10 @@
+#
+# $Id$
+#
+
+This directory contains tests for some of the items in
+the lib directories. The intent is to be able to
+verify the basic functionality of a library. For example,
+it is important to know that the stack checker successfully
+detects tasks which both stay within and exceed their
+stack limits.
diff --git a/c/src/tests/libtests/cpuuse/Makefile.in b/c/src/tests/libtests/cpuuse/Makefile.in
new file mode 100644
index 0000000000..6f2d36a842
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=cpuuse
+
+MANAGERS=io rate_monotonic
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3 tswitch
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/libtests/cpuuse/cpuuse.scn b/c/src/tests/libtests/cpuuse/cpuuse.scn
new file mode 100644
index 0000000000..f104c0c482
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/cpuuse.scn
@@ -0,0 +1,24 @@
+*** TEST 4 ***
+TA1 - 09:15:00 12/31/1988
+TA1 - rtems_task_suspend - on Task 2
+TA1 - rtems_task_suspend - on Task 3
+TA1 - killing time
+TA1 - rtems_task_resume - on Task 2
+TA1 - rtems_task_resume - on Task 3
+TA2 - 09:15:03 12/31/1988
+TA3 - 09:15:04 12/31/1988
+TA1 - 09:15:05 12/31/1988
+TA2 - 09:15:06 12/31/1988
+TA3 - 09:15:07 12/31/1988
+TA1 - 09:15:08 12/31/1988
+TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT
+TA1 - 09:15:09 12/31/1988
+TA1 - 09:15:10 12/31/1988
+TA1 - 09:15:11 12/31/1988
+TA1 - 09:15:12 12/31/1988
+TA1 - 09:15:13 12/31/1988
+TA1 - 09:15:14 12/31/1988
+TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT
+TA2 - 09:15:15 12/31/1988
+TA3 - 09:15:16 12/31/1988
+*** END OF TEST 4 ***
diff --git a/c/src/tests/libtests/cpuuse/init.c b/c/src/tests/libtests/cpuuse/init.c
new file mode 100644
index 0000000000..743e32ccf9
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/init.c
@@ -0,0 +1,106 @@
+/*
+ * This is a clone of sp04 which has been modified to use the cpu monitoring
+ * library.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997. 1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * init.c,v 1.6 1996/02/13 22:16:22 joel Exp
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_extensions_table Extensions = {
+ NULL, /* task create user extension */
+ NULL, /* task start user extension */
+ NULL, /* task restart user extension */
+ NULL, /* task delete user extension */
+ Task_switch, /* task switch user extension */
+ NULL, /* task begin user extension */
+ NULL, /* task exitted user extension */
+ NULL /* fatal error user extension */
+};
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ puts( "\n\n*** CPU USAGE LIBRARY TEST ***" );
+ build_time( &time, 12, 31, 1988, 9, 15, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Extension_name[ 1 ] = rtems_build_name( 'E', 'X', 'T', ' ' );
+
+ status = rtems_extension_create(
+ Extension_name[ 1 ],
+ &Extensions,
+ &Extension_id[ 1 ]
+ );
+ directive_failed( status, "rtems_extension_create" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Run_count[ 1 ] = 0;
+ Run_count[ 2 ] = 0;
+ Run_count[ 3 ] = 0;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/libtests/cpuuse/system.h b/c/src/tests/libtests/cpuuse/system.h
new file mode 100644
index 0000000000..0f427edcda
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/system.h
@@ -0,0 +1,67 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * system.h,v 1.6 1995/12/19 20:18:39 joel Exp
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+void Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Extension_id[ 4 ];
+TEST_EXTERN rtems_name Extension_name[ 4 ]; /* array of task names */
+
+/* array of task run counts */
+TEST_EXTERN volatile rtems_unsigned32 Run_count[ 4 ];
+
+/* end of include file */
diff --git a/c/src/tests/libtests/cpuuse/task1.c b/c/src/tests/libtests/cpuuse/task1.c
new file mode 100644
index 0000000000..0c86e6bddf
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/task1.c
@@ -0,0 +1,103 @@
+/* Task_1
+ *
+ * This test serves as a test task. It verifies timeslicing activities
+ * and tswitch extension processing.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task1.c,v 1.6 1995/12/19 20:18:40 joel Exp
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 seconds;
+ rtems_unsigned32 old_seconds;
+ rtems_mode previous_mode;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ rtems_unsigned32 start_time;
+ rtems_unsigned32 end_time;
+
+ puts( "TA1 - rtems_task_suspend - on Task 2" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_suspend - on Task 3" );
+ status = rtems_task_suspend( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_suspend of TA3" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &start_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ puts( "TA1 - killing time" );
+
+ for ( ; ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &end_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( end_time > (start_time + 2) )
+ break;
+ }
+
+ puts( "TA1 - rtems_task_resume - on Task 2" );
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_resume of TA2" );
+
+ puts( "TA1 - rtems_task_resume - on Task 3" );
+ status = rtems_task_resume( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_resume of TA3" );
+
+ while ( FOREVER ) {
+ if ( Run_count[ 1 ] == 3 ) {
+ puts( "TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT" );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ old_seconds = time.second;
+
+ for ( seconds = 0 ; seconds < 6 ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second != old_seconds ) {
+ old_seconds = time.second;
+ seconds++;
+ print_time( "TA1 - ", &time, "\n" );
+ }
+ }
+
+ puts( "TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT" );
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ while ( FOREVER );
+ }
+ }
+}
diff --git a/c/src/tests/libtests/cpuuse/task2.c b/c/src/tests/libtests/cpuuse/task2.c
new file mode 100644
index 0000000000..4133eae42c
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/task2.c
@@ -0,0 +1,29 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task2.c,v 1.3 1995/12/19 20:18:42 joel Exp
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/c/src/tests/libtests/cpuuse/task3.c b/c/src/tests/libtests/cpuuse/task3.c
new file mode 100644
index 0000000000..cbf7e9a242
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/task3.c
@@ -0,0 +1,29 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task3.c,v 1.3 1995/12/19 20:18:43 joel Exp
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/c/src/tests/libtests/cpuuse/tswitch.c b/c/src/tests/libtests/cpuuse/tswitch.c
new file mode 100644
index 0000000000..4c208a35dd
--- /dev/null
+++ b/c/src/tests/libtests/cpuuse/tswitch.c
@@ -0,0 +1,62 @@
+/* Task_switch
+ *
+ * This routine is the tswitch user extension. It determines which
+ * task is being switched to and displays a message indicating the
+ * time and date that it gained control.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * heir - pointer to heir TCB
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * tswitch.c,v 1.4 1995/12/19 20:18:44 joel Exp
+ */
+
+#include "system.h"
+
+#include "cpuuse.h"
+
+rtems_extension Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+)
+{
+ rtems_unsigned32 index;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ index = task_number( heir->Object.id );
+
+ switch( index ) {
+ case 1:
+ case 2:
+ case 3:
+ Run_count[ index ] += 1;
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ index ], FALSE );
+ print_time( "- ", &time, "\n" );
+
+ if ( time.second >= 16 ) {
+ CPU_usage_Dump();
+ puts( "*** END OF CPU USAGE LIBRARY TEST ***" );
+ exit( 0 );
+ }
+ break;
+
+ case 0:
+ default:
+ break;
+ }
+}
diff --git a/c/src/tests/libtests/malloctest/Makefile.in b/c/src/tests/libtests/malloctest/Makefile.in
new file mode 100644
index 0000000000..dc78b897af
--- /dev/null
+++ b/c/src/tests/libtests/malloctest/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=malloctest
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/libtests/malloctest/init.c b/c/src/tests/libtests/malloctest/init.c
new file mode 100644
index 0000000000..a43766d3c6
--- /dev/null
+++ b/c/src/tests/libtests/malloctest/init.c
@@ -0,0 +1,114 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** MALLOC TEST ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA5" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/libtests/malloctest/system.h b/c/src/tests/libtests/malloctest/system.h
new file mode 100644
index 0000000000..7b81f2adb9
--- /dev/null
+++ b/c/src/tests/libtests/malloctest/system.h
@@ -0,0 +1,49 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* macros */
+
+#define TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE*3)
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+);
+
+void blow_stack( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/libtests/malloctest/task1.c b/c/src/tests/libtests/malloctest/task1.c
new file mode 100644
index 0000000000..d18a748c25
--- /dev/null
+++ b/c/src/tests/libtests/malloctest/task1.c
@@ -0,0 +1,67 @@
+/* task1.c
+ *
+ * This set of three tasks do some simple task switching for about
+ * 15 seconds and then call a routine to "blow the stack".
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <libcsupport.h> /* for malloc_dump, malloc_walk */
+#include <string.h> /* for memset */
+
+#define NUM_PASSES 100
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+)
+{
+ int i;
+ unsigned int passes = 0;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ unsigned char *mem_ptr;
+ int mem_amt;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ while (TRUE)
+ {
+ if ( passes++ > NUM_PASSES )
+ exit(0);
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ mem_amt = rand() * task_number( tid );
+ printf("mallocing %d bytes\n",mem_amt);
+ mem_ptr = malloc ( mem_amt);
+ memset( mem_ptr, mem_amt, mem_amt );
+ malloc_dump();
+ malloc_walk(1,FALSE);
+ status = rtems_task_wake_after( task_number( tid ) * 1 * TICKS_PER_SECOND/4 );
+ for (i=0; i < mem_amt; i++)
+ {
+ if ( mem_ptr[i] != (mem_amt & 0xff))
+ {
+ printf("failed %d, %d, 0x%x, 0x%x\n",i,mem_amt,mem_ptr[i],mem_amt&0xff);
+ exit(1);
+ }
+ }
+ directive_failed( status, "rtems_task_wake_after" );
+ free( mem_ptr );
+ }
+}
diff --git a/c/src/tests/libtests/rtmonuse/Makefile.in b/c/src/tests/libtests/rtmonuse/Makefile.in
new file mode 100644
index 0000000000..b12e2a75e5
--- /dev/null
+++ b/c/src/tests/libtests/rtmonuse/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=rtmonuse
+
+MANAGERS=io rate_monotonic
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init getall task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/libtests/rtmonuse/getall.c b/c/src/tests/libtests/rtmonuse/getall.c
new file mode 100644
index 0000000000..a6081a70ca
--- /dev/null
+++ b/c/src/tests/libtests/rtmonuse/getall.c
@@ -0,0 +1,43 @@
+/* Get_all_counters
+ *
+ * This routine allows TA5 to atomically obtain the iteration counters.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * getall.c,v 1.3 1995/12/19 20:21:07 joel Exp
+ */
+
+#include "system.h"
+
+void Get_all_counters()
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode to RTEMS_NO_PREEMPT" );
+
+ Temporary_count = Count;
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_mode( RTEMS_PREEMPT, RTEMS_PREEMPT_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode to RTEMS_PREEMPT" );
+}
diff --git a/c/src/tests/libtests/rtmonuse/init.c b/c/src/tests/libtests/rtmonuse/init.c
new file mode 100644
index 0000000000..16527c2812
--- /dev/null
+++ b/c/src/tests/libtests/rtmonuse/init.c
@@ -0,0 +1,71 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * init.c,v 1.6 1995/12/19 20:21:09 joel Exp
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+#include "rtmonuse.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ puts( "\n\n*** RATE MONOTONIC PERIOD STATISTICS TEST ***" );
+ Period_usage_Initialize();
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_create(
+ Task_name[ index ],
+ Priorities[ index ],
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ (index == 5) ? RTEMS_FLOATING_POINT : RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+ }
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_start( Task_id[ index ], Task_1_through_5, index );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/libtests/rtmonuse/rtmonuse.scn b/c/src/tests/libtests/rtmonuse/rtmonuse.scn
new file mode 100644
index 0000000000..bb4e8814da
--- /dev/null
+++ b/c/src/tests/libtests/rtmonuse/rtmonuse.scn
@@ -0,0 +1,27 @@
+*** TEST 20 ***
+TA1 - rtems_rate_monotonic_create id = 0x28010001
+TA1 - rtems_rate_monotonic_ident id = 0x28010001
+TA1 - (0x28010001) period 2
+TA2 - rtems_rate_monotonic_create id = 0x28010002
+TA2 - rtems_rate_monotonic_ident id = 0x28010002
+TA2 - (0x28010002) period 2
+TA3 - rtems_rate_monotonic_create id = 0x28010003
+TA3 - rtems_rate_monotonic_ident id = 0x28010003
+TA3 - (0x28010003) period 2
+TA4 - rtems_rate_monotonic_create id = 0x28010004
+TA4 - rtems_rate_monotonic_ident id = 0x28010004
+TA4 - (0x28010004) period 2
+TA5 - rtems_rate_monotonic_create id = 0x28010005
+TA5 - rtems_rate_monotonic_ident id = 0x28010005
+TA5 - (0x28010005) period 100
+TA5 - PERIODS CHECK OK (1)
+TA5 - PERIODS CHECK OK (2)
+TA5 - PERIODS CHECK OK (3)
+TA5 - PERIODS CHECK OK (4)
+TA5 - PERIODS CHECK OK (5)
+TA5 - PERIODS CHECK OK (6)
+TA5 - PERIODS CHECK OK (7)
+TA5 - PERIODS CHECK OK (8)
+TA5 - PERIODS CHECK OK (9)
+TA5 - PERIODS CHECK OK (10)
+*** END OF TEST 20 ***
diff --git a/c/src/tests/libtests/rtmonuse/system.h b/c/src/tests/libtests/rtmonuse/system.h
new file mode 100644
index 0000000000..4563730893
--- /dev/null
+++ b/c/src/tests/libtests/rtmonuse/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* types */
+
+struct counters {
+ rtems_unsigned32 count[6];
+};
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+);
+
+void Get_all_counters( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INIT_TASK_PRIORITY 10
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+#define CONFIGURE_MAXIMUM_PERIODS 10
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN struct counters Count; /* iteration counters */
+TEST_EXTERN struct counters Temporary_count;
+extern rtems_task_priority Priorities[ 6 ];
+
+/* end of include file */
diff --git a/c/src/tests/libtests/rtmonuse/task1.c b/c/src/tests/libtests/rtmonuse/task1.c
new file mode 100644
index 0000000000..89ec308fce
--- /dev/null
+++ b/c/src/tests/libtests/rtmonuse/task1.c
@@ -0,0 +1,124 @@
+/* Task_1_through_5
+ *
+ * This routine serves as a test task for the period capabilities of the
+ * Rate Monotonic Manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task1.c,v 1.3 1995/12/19 20:21:14 joel Exp
+ */
+
+#include "system.h"
+
+#include <cpuuse.h>
+#include "rtmonuse.h"
+
+rtems_unsigned32 Periods[6] = { 0, 2, 2, 2, 2, 100 };
+rtems_unsigned32 Iterations[6] = { 0, 50, 50, 50, 50, 1 };
+rtems_task_priority Priorities[6] = { 0, 1, 1, 3, 4, 5 };
+
+rtems_task Task_1_through_5(
+ rtems_unsigned32 argument
+)
+{
+ rtems_id rmid;
+ rtems_id test_rmid;
+ rtems_unsigned32 index;
+ rtems_unsigned32 pass;
+ rtems_unsigned32 failed;
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( argument, &rmid );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_create id = 0x%08x\n", rmid );
+
+ status = rtems_rate_monotonic_ident( argument, &test_rmid );
+ directive_failed( status, "rtems_rate_monotonic_ident" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_ident id = 0x%08x\n", test_rmid );
+
+ if ( rmid != test_rmid ) {
+ printf( "RMID's DO NOT MATCH (0x%x and 0x%x)\n", rmid, test_rmid );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- (0x%08x) period %d\n", rmid, Periods[ argument ] );
+
+ status = rtems_task_wake_after( 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ switch ( argument ) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ while ( FOREVER ) {
+ Period_usage_Update( rmid );
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+ Count.count[ argument ]++;
+ }
+ break;
+ case 5:
+ pass = 0;
+ failed = 0;
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 1 of TA5" );
+
+ Get_all_counters();
+
+ while ( FOREVER ) {
+ Period_usage_Update( rmid );
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 2 of TA5" );
+
+ Get_all_counters();
+
+ for( index = 1 ; index <= 4 ; index++ ) {
+ if ( Temporary_count.count[ index ] != Iterations[ index ] ) {
+ puts_nocr( "FAIL -- " );
+ put_name ( Task_name[ index ], FALSE );
+ printf ( " Actual=%d, Expected=%d\n",
+ Temporary_count.count[ index ],
+ Iterations[ index ]
+ );
+ failed += 1;
+ }
+ }
+
+ if ( failed == 5 )
+ exit( 0 );
+
+ pass += 1;
+
+ printf( "TA5 - PERIODS CHECK OK (%d)\n", pass );
+
+ fflush( stdout );
+
+ if ( pass == 10 ) {
+ puts( "*** END OF RATE MONOTONIC PERIOD STATISTICS TEST ***" );
+ CPU_usage_Dump();
+ Period_usage_Dump();
+ exit( 0 );
+ }
+
+ }
+ break;
+ }
+}
diff --git a/c/src/tests/libtests/stackchk/Makefile.in b/c/src/tests/libtests/stackchk/Makefile.in
new file mode 100644
index 0000000000..0800fc37ad
--- /dev/null
+++ b/c/src/tests/libtests/stackchk/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=stackchk
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=blow init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/libtests/stackchk/blow.c b/c/src/tests/libtests/stackchk/blow.c
new file mode 100644
index 0000000000..53bcc5b6e5
--- /dev/null
+++ b/c/src/tests/libtests/stackchk/blow.c
@@ -0,0 +1,49 @@
+/* task1.c
+ *
+ * This set of three tasks do some simple task switching for about
+ * 15 seconds and then call a routine to "blow the stack".
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+void b() {}
+
+void blow_stack( void )
+{
+ volatile unsigned32 *low, *high;
+ unsigned char *area;
+
+b();
+ /*
+ * Destroy the first and last 16 bytes of our stack... Hope it
+ * does not cause problems :)
+ */
+
+ area = (unsigned char *)_Thread_Executing->Start.Initial_stack.area;
+
+ low = (volatile unsigned32 *) (area + HEAP_OVERHEAD);
+ high = (volatile unsigned32 *)
+ (area + _Thread_Executing->Start.Initial_stack.size - 16);
+
+
+ low[0] = 0x11111111;
+ low[1] = 0x22222222;
+ low[2] = 0x33333333;
+ low[3] = 0x44444444;
+
+ high[0] = 0x55555555;
+ high[1] = 0x66666666;
+ high[2] = 0x77777777;
+ high[3] = 0x88888888;
+
+}
diff --git a/c/src/tests/libtests/stackchk/init.c b/c/src/tests/libtests/stackchk/init.c
new file mode 100644
index 0000000000..40fb30d124
--- /dev/null
+++ b/c/src/tests/libtests/stackchk/init.c
@@ -0,0 +1,86 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST STACK CHECKER ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/libtests/stackchk/stackchk.scn b/c/src/tests/libtests/stackchk/stackchk.scn
new file mode 100644
index 0000000000..84a5c5e342
--- /dev/null
+++ b/c/src/tests/libtests/stackchk/stackchk.scn
@@ -0,0 +1,9 @@
+*** TEST STACK CHECKER ***
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+---> error indictation
diff --git a/c/src/tests/libtests/stackchk/system.h b/c/src/tests/libtests/stackchk/system.h
new file mode 100644
index 0000000000..9afe054ec0
--- /dev/null
+++ b/c/src/tests/libtests/stackchk/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* macros */
+
+#define TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE*3)
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+);
+
+void blow_stack( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/libtests/stackchk/task1.c b/c/src/tests/libtests/stackchk/task1.c
new file mode 100644
index 0000000000..69fe9aa98d
--- /dev/null
+++ b/c/src/tests/libtests/stackchk/task1.c
@@ -0,0 +1,44 @@
+/* task1.c
+ *
+ * This set of three tasks do some simple task switching for about
+ * 15 seconds and then call a routine to "blow the stack".
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 15 && tid == Task_id[ 1 ] ) {
+ blow_stack();
+ }
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_wake_after( task_number( tid ) * 5 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/c/src/tests/mptests/Makefile.in b/c/src/tests/mptests/Makefile.in
new file mode 100644
index 0000000000..88d6b572fd
--- /dev/null
+++ b/c/src/tests/mptests/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+all: README
+
+SUB_DIRS=mp01 mp02 mp03 mp04 mp05 mp06 mp07 mp08 mp09 mp10 mp11 mp12 mp13 mp14
diff --git a/c/src/tests/mptests/README b/c/src/tests/mptests/README
new file mode 100644
index 0000000000..68cb459b55
--- /dev/null
+++ b/c/src/tests/mptests/README
@@ -0,0 +1,10 @@
+#
+# $Id$
+#
+
+This directory contains the RTEMS Multiprocessor Test Suite.
+The tests in this directory provide near complete (98%+) test
+coverage of the multiprocessor specific code in RTEMS.
+
+These tests are designed to test RTEMS in a two node configuration.
+
diff --git a/c/src/tests/mptests/mp01/Makefile.in b/c/src/tests/mptests/mp01/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp01/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp01/init.c b/c/src/tests/mptests/mp01/init.c
new file mode 100644
index 0000000000..bedb37bb97
--- /dev/null
+++ b/c/src/tests/mptests/mp01/init.c
@@ -0,0 +1,96 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+ char c;
+
+ printf(
+ "\n\n*** TEST 1 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ if ( Multiprocessing_configuration.node != 1 ) c = 'S';
+ else c = 'M';
+
+ Task_name[ 1 ] = rtems_build_name( c, 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( c, 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( c, 'A', '3', ' ' );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ puts( "Creating task 1 (Global)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of Task 1" );
+
+ puts( "Creating task 2 (Global)" );
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of Task 2" );
+
+ puts( "Creating task 3 (Local)" );
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of Task 3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of Task 1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of Task 2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of Task 3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp01/node1/Makefile.in b/c/src/tests/mptests/mp01/node1/Makefile.in
new file mode 100644
index 0000000000..560d4fe93e
--- /dev/null
+++ b/c/src/tests/mptests/mp01/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp01
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp01/node1/mp01.doc b/c/src/tests/mptests/mp01/node1/mp01.doc
new file mode 100644
index 0000000000..d339393655
--- /dev/null
+++ b/c/src/tests/mptests/mp01/node1/mp01.doc
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test50
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter, t_delete
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of a global task on the local processor.
+
+ i. Verifies that a task can delete itself or a global task on
+ the local processor.
+
+ j. Verifies Shared Memory Locked Queue driver for initialization,
+ getting a packet, broadcasting a packet, and returning a packet.
+
+ k. Can be used to verify that global packet type P_SYSVERIFY,
+ P_OBJCREATE (task), and P_OBJDELETE (task) are sent and
+ correctly processed by a remote node.
diff --git a/c/src/tests/mptests/mp01/node1/mp01.scn b/c/src/tests/mptests/mp01/node1/mp01.scn
new file mode 100644
index 0000000000..d399f79b2a
--- /dev/null
+++ b/c/src/tests/mptests/mp01/node1/mp01.scn
@@ -0,0 +1,15 @@
+*** TEST 1 -- NODE 1 ***
+Creating task 1 (Global)
+Creating task 2 (Global)
+Creating task 3 (Local)
+MA1 - rtems_clock_get - 09:00:00 12/31/1988
+MA2 - rtems_clock_get - 09:00:00 12/31/1988
+MA3 - rtems_clock_get - 09:00:00 12/31/1988
+MA1 - rtems_clock_get - 09:00:05 12/31/1988
+MA1 - deleting self
+MA2 - rtems_clock_get - 09:00:10 12/31/1988
+MA2 - waiting to be deleted by MA3
+MA3 - rtems_clock_get - 09:00:15 12/31/1988
+MA3 - getting TID of MA2
+MA3 - deleting MA2
+*** END OF TEST 1 ***
diff --git a/c/src/tests/mptests/mp01/node2/Makefile.in b/c/src/tests/mptests/mp01/node2/Makefile.in
new file mode 100644
index 0000000000..cda6cb6969
--- /dev/null
+++ b/c/src/tests/mptests/mp01/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp01
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp01/node2/mp01.doc b/c/src/tests/mptests/mp01/node2/mp01.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp01/node2/mp01.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp01/node2/mp01.scn b/c/src/tests/mptests/mp01/node2/mp01.scn
new file mode 100644
index 0000000000..c9831ff9db
--- /dev/null
+++ b/c/src/tests/mptests/mp01/node2/mp01.scn
@@ -0,0 +1,15 @@
+*** TEST 1 -- NODE 2 ***
+Creating task 1 (Global)
+Creating task 2 (Global)
+Creating task 3 (Local)
+SA1 - rtems_clock_get - 09:00:00 12/31/1988
+SA2 - rtems_clock_get - 09:00:00 12/31/1988
+SA3 - rtems_clock_get - 09:00:00 12/31/1988
+SA1 - rtems_clock_get - 09:00:05 12/31/1988
+SA1 - deleting self
+SA2 - rtems_clock_get - 09:00:10 12/31/1988
+SA2 - waiting to be deleted by SA3
+SA3 - rtems_clock_get - 09:00:15 12/31/1988
+SA3 - getting TID of SA2
+SA3 - deleting SA2
+*** END OF TEST 1 ***
diff --git a/c/src/tests/mptests/mp01/system.h b/c/src/tests/mptests/mp01/system.h
new file mode 100644
index 0000000000..b62ffe5c20
--- /dev/null
+++ b/c/src/tests/mptests/mp01/system.h
@@ -0,0 +1,46 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_GLOBAL
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp01/task1.c b/c/src/tests/mptests/mp01/task1.c
new file mode 100644
index 0000000000..7b767637f6
--- /dev/null
+++ b/c/src/tests/mptests/mp01/task1.c
@@ -0,0 +1,84 @@
+/* Test_task
+ *
+ * This task is used for three test tasks. It obtains its task id and
+ * based upon that id, performs certain actions.
+ *
+ * Task_1 delays 5 seconds and deletes itself.
+ * Task_2 delays 10 seconds and then loops until
+ * deleted by the third task.
+ * Task 3 delays 15 seconds, then deletes task 2 and itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_wake_after( task_number( tid ) * 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ if ( task_number(tid) == 1 ) { /* TASK 1 */
+ put_name( Task_name[ 1 ], FALSE );
+ printf( " - deleting self\n" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+ }
+ else if ( task_number(tid) == 2 ) { /* TASK 2 */
+ put_name( Task_name[ 2 ], FALSE );
+ printf( " - waiting to be deleted by " );
+ put_name( Task_name[ 3 ], TRUE );
+ while ( FOREVER );
+ }
+ else { /* TASK 3 */
+ put_name( Task_name[ 3 ], FALSE );
+ printf( " - getting TID of " );
+ put_name( Task_name[ 2 ], TRUE );
+ do {
+ status = rtems_task_ident( Task_name[ 2 ], RTEMS_SEARCH_ALL_NODES, &tid );
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_task_ident" );
+
+ put_name( Task_name[ 3 ], FALSE );
+ printf( " - deleting " );
+ put_name( Task_name[ 2 ], TRUE );
+ status = rtems_task_delete( tid );
+ directive_failed( status, "rtems_task_delete of Task 2" );
+
+ puts( "*** END OF TEST 1 ***" );
+ exit(0);
+ }
+}
diff --git a/c/src/tests/mptests/mp02/Makefile.in b/c/src/tests/mptests/mp02/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp02/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp02/init.c b/c/src/tests/mptests/mp02/init.c
new file mode 100644
index 0000000000..6342835ae5
--- /dev/null
+++ b/c/src/tests/mptests/mp02/init.c
@@ -0,0 +1,60 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 2 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp02/node1/Makefile.in b/c/src/tests/mptests/mp02/node1/Makefile.in
new file mode 100644
index 0000000000..b993795d93
--- /dev/null
+++ b/c/src/tests/mptests/mp02/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp02
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp02/node1/mp02.doc b/c/src/tests/mptests/mp02/node1/mp02.doc
new file mode 100644
index 0000000000..a7096e474a
--- /dev/null
+++ b/c/src/tests/mptests/mp02/node1/mp02.doc
@@ -0,0 +1,47 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test51
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter, t_delete, t_restart, t_getreg, t_setreg
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ c. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ d. Verifies executive initialization performed correctly.
+
+ e. Verifies that a task can get the task identification number of itself.
+
+ f. Verifies that a task can get the task identification number
+ of another task.
+
+ g. Verifies that a task can delete itself or another task.
+
+ h. Verifies that errors are returned in the following situations:
+ 1) when attempting to delete a remote task.
+ 2) when attempting to start a remote task.
+ 3) when attempting to restart a remote task.
+
+ i. Verifies that a remote task's registers can be set and read.
diff --git a/c/src/tests/mptests/mp02/node1/mp02.scn b/c/src/tests/mptests/mp02/node1/mp02.scn
new file mode 100644
index 0000000000..72fdefe69d
--- /dev/null
+++ b/c/src/tests/mptests/mp02/node1/mp02.scn
@@ -0,0 +1,14 @@
+*** TEST 2 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 222
+Getting TID of remote task (all nodes)
+Getting TID of remote task (1 node)
+rtems_task_delete of remote task returned the correct error
+rtems_task_start of remote task returned the correct error
+rtems_task_restart of remote task returned the correct error
+Setting notepad 1 of the remote task to 1
+Getting a notepad of the remote task
+Remote notepad set and read correctly
+*** END OF TEST 2 ***
diff --git a/c/src/tests/mptests/mp02/node2/Makefile.in b/c/src/tests/mptests/mp02/node2/Makefile.in
new file mode 100644
index 0000000000..96b5e3e527
--- /dev/null
+++ b/c/src/tests/mptests/mp02/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp02
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp02/node2/mp02.doc b/c/src/tests/mptests/mp02/node2/mp02.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp02/node2/mp02.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp02/node2/mp02.scn b/c/src/tests/mptests/mp02/node2/mp02.scn
new file mode 100644
index 0000000000..233a910999
--- /dev/null
+++ b/c/src/tests/mptests/mp02/node2/mp02.scn
@@ -0,0 +1,14 @@
+*** TEST 2 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 111
+Getting TID of remote task (all nodes)
+Getting TID of remote task (1 node)
+rtems_task_delete of remote task returned the correct error
+rtems_task_start of remote task returned the correct error
+rtems_task_restart of remote task returned the correct error
+Setting notepad 2 of the remote task to 2
+Getting a notepad of the remote task
+Remote notepad set and read correctly
+*** END OF TEST 2 ***
diff --git a/c/src/tests/mptests/mp02/system.h b/c/src/tests/mptests/mp02/system.h
new file mode 100644
index 0000000000..e5759bc158
--- /dev/null
+++ b/c/src/tests/mptests/mp02/system.h
@@ -0,0 +1,45 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp02/task1.c b/c/src/tests/mptests/mp02/task1.c
new file mode 100644
index 0000000000..7b9caab328
--- /dev/null
+++ b/c/src/tests/mptests/mp02/task1.c
@@ -0,0 +1,118 @@
+/* Test_task
+ *
+ * This task tests the rtems_task_set_note directive on a remote task and that
+ * errors are returned when attempting to delete, start, or restart
+ * a remote task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_id test_tid;
+ rtems_unsigned32 note;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ printf( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task (all nodes)" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+
+ directive_failed( status, "rtems_task_ident" );
+
+ puts( "Getting TID of remote task (1 node)" );
+ status = rtems_task_ident( Task_name[ remote_node ], remote_node, &test_tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ if ( test_tid != remote_tid ) {
+ puts( "rtems_task_ident tid's do not match!!" );
+ rtems_fatal_error_occurred( status );
+ }
+
+ status = rtems_task_delete( remote_tid );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_task_delete of remote task"
+ );
+ puts( "rtems_task_delete of remote task returned the correct error" );
+
+ status = rtems_task_start( remote_tid, Test_task, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_task_start of remote task"
+ );
+ puts( "rtems_task_start of remote task returned the correct error" );
+
+ status = rtems_task_restart( remote_tid, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_task_restart of remote task"
+ );
+ puts( "rtems_task_restart of remote task returned the correct error" );
+
+ printf(
+ "Setting notepad %d of the remote task to %d\n",
+ rtems_get_node(tid),
+ rtems_get_node(tid)
+ );
+ status = rtems_task_set_note(
+ remote_tid,
+ rtems_get_node(tid),
+ rtems_get_node(tid)
+ );
+ directive_failed( status, "rtems_task_set_note" );
+
+ puts( "Getting a notepad of the remote task" );
+ status = rtems_task_get_note( remote_tid, rtems_get_node(tid), &note );
+ directive_failed( status, "rtems_task_get_note" );
+
+ if ( note == rtems_get_node(tid) )
+ puts( "Remote notepad set and read correctly" );
+ else
+ printf(
+ "FAILURE!! Remote notepad was not set and read correctly (%d, %d)\n",
+ note,
+ rtems_get_node( tid )
+ );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 2 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp03/Makefile.in b/c/src/tests/mptests/mp03/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp03/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp03/delay.c b/c/src/tests/mptests/mp03/delay.c
new file mode 100644
index 0000000000..aa52d05c8e
--- /dev/null
+++ b/c/src/tests/mptests/mp03/delay.c
@@ -0,0 +1,31 @@
+/* Delayed_send_event
+ *
+ * This routine is a timer service routine which sends an event to task 1.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+}
diff --git a/c/src/tests/mptests/mp03/init.c b/c/src/tests/mptests/mp03/init.c
new file mode 100644
index 0000000000..ea3077ac97
--- /dev/null
+++ b/c/src/tests/mptests/mp03/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 3 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp03/node1/Makefile.in b/c/src/tests/mptests/mp03/node1/Makefile.in
new file mode 100644
index 0000000000..4a5f5c2ce9
--- /dev/null
+++ b/c/src/tests/mptests/mp03/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp03
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp timer event
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 delay
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp03/node1/mp03.doc b/c/src/tests/mptests/mp03/node1/mp03.doc
new file mode 100644
index 0000000000..1afc836704
--- /dev/null
+++ b/c/src/tests/mptests/mp03/node1/mp03.doc
@@ -0,0 +1,45 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test52
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_wkafter, t_suspend, t_resume
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task (on another node).
+
+ i. Verifies that a task can suspend and resume a remote task.
diff --git a/c/src/tests/mptests/mp03/node1/mp03.scn b/c/src/tests/mptests/mp03/node1/mp03.scn
new file mode 100644
index 0000000000..129e5bccba
--- /dev/null
+++ b/c/src/tests/mptests/mp03/node1/mp03.scn
@@ -0,0 +1,24 @@
+*** TEST 3 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 222
+111 - Suspending remote task
+111 - Resuming remote task
+111 - Suspending remote task
+111 - Resuming remote task
+111 - Suspending remote task
+111 - Resuming remote task
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+
+ ........
+
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+*** END OF TEST 3 ***
diff --git a/c/src/tests/mptests/mp03/node2/Makefile.in b/c/src/tests/mptests/mp03/node2/Makefile.in
new file mode 100644
index 0000000000..a3d187b476
--- /dev/null
+++ b/c/src/tests/mptests/mp03/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp03
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp timer event
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init delay task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp03/node2/mp03.doc b/c/src/tests/mptests/mp03/node2/mp03.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp03/node2/mp03.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp03/node2/mp03.scn b/c/src/tests/mptests/mp03/node2/mp03.scn
new file mode 100644
index 0000000000..d77c09e9f7
--- /dev/null
+++ b/c/src/tests/mptests/mp03/node2/mp03.scn
@@ -0,0 +1,24 @@
+*** TEST 3 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 111
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+
+ ........
+
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Suspending remote task
+222 - Resuming remote task
+222 - Suspending remote task
+222 - Resuming remote task
+222 - Suspending remote task
+222 - Resuming remote task
+*** END OF TEST 3 ***
diff --git a/c/src/tests/mptests/mp03/system.h b/c/src/tests/mptests/mp03/system.h
new file mode 100644
index 0000000000..4ddc6029d0
--- /dev/null
+++ b/c/src/tests/mptests/mp03/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+
+TEST_EXTERN rtems_unsigned32 remote_node;
+TEST_EXTERN rtems_id remote_tid;
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp03/task1.c b/c/src/tests/mptests/mp03/task1.c
new file mode 100644
index 0000000000..11ccab539b
--- /dev/null
+++ b/c/src/tests/mptests/mp03/task1.c
@@ -0,0 +1,155 @@
+/* Test_task
+ *
+ * This task suspends and resumes a remote task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+/*PAGE
+ *
+ * Test_Task_Support
+ *
+ */
+
+void Test_Task_Support(
+ rtems_unsigned32 node
+)
+{
+ rtems_event_set events;
+ rtems_status_code status;
+
+ if ( Multiprocessing_configuration.node == node ) {
+
+ for ( ; ; ) {
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &events
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+
+ fatal_directive_status(status, RTEMS_UNSATISFIED, "rtems_event_receive");
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ put_name( Task_name[ node ], FALSE );
+ puts( " - Suspending remote task" );
+
+ status = rtems_task_suspend( remote_tid );
+ directive_failed( status, "rtems_task_suspend" );
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ put_name( Task_name[ node ], FALSE );
+ puts( " - Resuming remote task" );
+
+ status = rtems_task_resume( remote_tid ) ;
+ directive_failed( status, "rtems_task_resume" );
+
+ }
+
+ } else {
+
+ for ( ; ; ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &events
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+
+ fatal_directive_status(status, RTEMS_UNSATISFIED, "rtems_event_receive");
+
+ put_name( Task_name[ remote_node ], FALSE );
+ puts( " - have I been suspended???" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ }
+
+}
+
+/*PAGE
+ *
+ * Test_task
+ */
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ puts( "Getting TID of remote task" );
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ printf( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Delayed_send_event,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ Test_Task_Support( 1 );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Delayed_send_event,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ Test_Task_Support( 2 );
+
+ puts( "*** END OF TEST 3 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp04/Makefile.in b/c/src/tests/mptests/mp04/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp04/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp04/init.c b/c/src/tests/mptests/mp04/init.c
new file mode 100644
index 0000000000..5c4f5e1608
--- /dev/null
+++ b/c/src/tests/mptests/mp04/init.c
@@ -0,0 +1,60 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 4 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ Multiprocessing_configuration.node,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp04/node1/Makefile.in b/c/src/tests/mptests/mp04/node1/Makefile.in
new file mode 100644
index 0000000000..580f6f462e
--- /dev/null
+++ b/c/src/tests/mptests/mp04/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp04
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp04/node1/mp04.doc b/c/src/tests/mptests/mp04/node1/mp04.doc
new file mode 100644
index 0000000000..075c2d90f8
--- /dev/null
+++ b/c/src/tests/mptests/mp04/node1/mp04.doc
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test53
+
+directives:
+ ex_init, ex_start, t_create, t_start, i_return, t_ident, tm_get,
+ tm_wkafter, tm_setpri
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies that the system can get the id of a remote task.
+
+ c. Verifies that the system can change the priority of a remote
+ task.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can delete itself or another task.
diff --git a/c/src/tests/mptests/mp04/node1/mp04.scn b/c/src/tests/mptests/mp04/node1/mp04.scn
new file mode 100644
index 0000000000..e9518f3ac2
--- /dev/null
+++ b/c/src/tests/mptests/mp04/node1/mp04.scn
@@ -0,0 +1,8 @@
+*** TEST 4 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 222
+Local task priority has been set
+*** END OF TEST 4 ***
diff --git a/c/src/tests/mptests/mp04/node2/Makefile.in b/c/src/tests/mptests/mp04/node2/Makefile.in
new file mode 100644
index 0000000000..1f14042d59
--- /dev/null
+++ b/c/src/tests/mptests/mp04/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp04
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp04/node2/mp04.doc b/c/src/tests/mptests/mp04/node2/mp04.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp04/node2/mp04.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp04/node2/mp04.scn b/c/src/tests/mptests/mp04/node2/mp04.scn
new file mode 100644
index 0000000000..8ccfcfef79
--- /dev/null
+++ b/c/src/tests/mptests/mp04/node2/mp04.scn
@@ -0,0 +1,8 @@
+*** TEST 4 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 111
+Local task priority has been set
+*** END OF TEST 4 ***
diff --git a/c/src/tests/mptests/mp04/system.h b/c/src/tests/mptests/mp04/system.h
new file mode 100644
index 0000000000..687a25d169
--- /dev/null
+++ b/c/src/tests/mptests/mp04/system.h
@@ -0,0 +1,47 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp04/task1.c b/c/src/tests/mptests/mp04/task1.c
new file mode 100644
index 0000000000..4710d7c7b8
--- /dev/null
+++ b/c/src/tests/mptests/mp04/task1.c
@@ -0,0 +1,83 @@
+/* Test_task
+ *
+ * This task tests the rtems_task_set_priority directive on a remote task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_task_priority previous_priority;
+ rtems_task_priority previous_priority_1;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ puts( "Getting TID of remote task" );
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_task_set_priority(
+ remote_tid,
+ Multiprocessing_configuration.node,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ if ( previous_priority != remote_node ) {
+ printf(
+ "Remote priority (0x%x) does not match remote node (0x%x)!!!\n",
+ previous_priority,
+ remote_node
+ );
+ exit( 0xf0000 );
+ }
+
+ do {
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ RTEMS_CURRENT_PRIORITY,
+ &previous_priority_1
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ } while ( previous_priority_1 != remote_node );
+
+ puts( "Local task priority has been set" );
+
+ puts( "*** END OF TEST 4 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp05/Makefile.in b/c/src/tests/mptests/mp05/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp05/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp05/asr.c b/c/src/tests/mptests/mp05/asr.c
new file mode 100644
index 0000000000..7ce01d6606
--- /dev/null
+++ b/c/src/tests/mptests/mp05/asr.c
@@ -0,0 +1,37 @@
+/* Process_asr
+ *
+ * This routine performs the processing for task 1's RTEMS_ASR. It is called
+ * by an assembly routine which saves the necessary registers.
+ *
+ * Input parameters:
+ * signal - signal set
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_asr Process_asr(
+ rtems_signal_set signal
+)
+{
+ if ( signal != expected_signal ) {
+ printf(
+ "ERROR: I was expecting signal 0x%.8x got 0x%.8x\n",
+ expected_signal,
+ signal
+ );
+ rtems_fatal_error_occurred( 0xf0000 );
+ }
+ signal_caught = 1;
+}
diff --git a/c/src/tests/mptests/mp05/init.c b/c/src/tests/mptests/mp05/init.c
new file mode 100644
index 0000000000..b066be530f
--- /dev/null
+++ b/c/src/tests/mptests/mp05/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 5 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp05/node1/Makefile.in b/c/src/tests/mptests/mp05/node1/Makefile.in
new file mode 100644
index 0000000000..11152003b2
--- /dev/null
+++ b/c/src/tests/mptests/mp05/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp05
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp signal timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init asr task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp05/node1/mp05.doc b/c/src/tests/mptests/mp05/node1/mp05.doc
new file mode 100644
index 0000000000..d252619bec
--- /dev/null
+++ b/c/src/tests/mptests/mp05/node1/mp05.doc
@@ -0,0 +1,45 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test54
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_wkafter, as_catch, as_return
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that a signal can be sent to a remote task.
diff --git a/c/src/tests/mptests/mp05/node1/mp05.scn b/c/src/tests/mptests/mp05/node1/mp05.scn
new file mode 100644
index 0000000000..472740ba18
--- /dev/null
+++ b/c/src/tests/mptests/mp05/node1/mp05.scn
@@ -0,0 +1,11 @@
+*** TEST 5 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+rtems_signal_catch: initializing signal catcher
+Remote task's name is : 222
+Getting TID of remote task
+Sending signal to remote task
+....................................................
+....................................................
+*** END OF TEST 5 ***
diff --git a/c/src/tests/mptests/mp05/node2/Makefile.in b/c/src/tests/mptests/mp05/node2/Makefile.in
new file mode 100644
index 0000000000..7c870c4a71
--- /dev/null
+++ b/c/src/tests/mptests/mp05/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp05
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp signal timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init asr task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp05/node2/mp05.doc b/c/src/tests/mptests/mp05/node2/mp05.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp05/node2/mp05.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp05/node2/mp05.scn b/c/src/tests/mptests/mp05/node2/mp05.scn
new file mode 100644
index 0000000000..0c4b412f65
--- /dev/null
+++ b/c/src/tests/mptests/mp05/node2/mp05.scn
@@ -0,0 +1,10 @@
+*** TEST 5 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+rtems_signal_catch: initializing signal catcher
+Remote task's name is : 111
+Getting TID of remote task
+....................................................
+....................................................
+*** END OF TEST 5 ***
diff --git a/c/src/tests/mptests/mp05/system.h b/c/src/tests/mptests/mp05/system.h
new file mode 100644
index 0000000000..1ba4a78f87
--- /dev/null
+++ b/c/src/tests/mptests/mp05/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_asr Process_asr( rtems_signal_set );
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+
+TEST_EXTERN rtems_unsigned32 remote_node;
+TEST_EXTERN rtems_id remote_tid;
+TEST_EXTERN rtems_signal_set remote_signal;
+TEST_EXTERN rtems_signal_set expected_signal;
+TEST_EXTERN volatile rtems_unsigned32 signal_count;
+TEST_EXTERN volatile rtems_unsigned32 signal_caught;
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp05/task1.c b/c/src/tests/mptests/mp05/task1.c
new file mode 100644
index 0000000000..21f984847d
--- /dev/null
+++ b/c/src/tests/mptests/mp05/task1.c
@@ -0,0 +1,106 @@
+/* Test_task
+ *
+ * This task initializes the signal catcher, sends the first signal
+ * if running on the first node, and loops while waiting for signals.
+ *
+ * NOTE: The signal catcher is not reentrant and hence RTEMS_NO_ASR must
+ * be a part of its execution mode.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define SIGNALS_PER_DOT 15
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Stop_Test = FALSE;
+
+ signal_caught = 0;
+ signal_count = 0;
+
+ puts( "rtems_signal_catch: initializing signal catcher" );
+ status = rtems_signal_catch( Process_asr, RTEMS_NO_ASR|RTEMS_NO_PREEMPT );
+ directive_failed( status, "rtems_signal_catch" );
+
+ if (Multiprocessing_configuration.node == 1) {
+ remote_node = 2;
+ remote_signal = RTEMS_SIGNAL_18;
+ expected_signal = RTEMS_SIGNAL_17;
+ }
+ else {
+ remote_node = 1;
+ remote_signal = RTEMS_SIGNAL_17;
+ expected_signal = RTEMS_SIGNAL_18;
+ }
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 3 * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Sending signal to remote task" );
+ do {
+ status = rtems_signal_send( remote_tid, remote_signal );
+ if ( status == RTEMS_NOT_DEFINED )
+ continue;
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_signal_send" );
+ }
+
+ while ( Stop_Test == FALSE ) {
+ if ( signal_caught ) {
+ signal_caught = 0;
+ if ( ++signal_count >= SIGNALS_PER_DOT ) {
+ signal_count = 0;
+ put_dot( '.' );
+ }
+ status = rtems_signal_send( remote_tid, remote_signal );
+ directive_failed( status, "rtems_signal_send" );
+ }
+ }
+ puts( "\n*** END OF TEST 5 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp06/Makefile.in b/c/src/tests/mptests/mp06/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp06/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp06/init.c b/c/src/tests/mptests/mp06/init.c
new file mode 100644
index 0000000000..a595dd75bd
--- /dev/null
+++ b/c/src/tests/mptests/mp06/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 6 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp06/node1/Makefile.in b/c/src/tests/mptests/mp06/node1/Makefile.in
new file mode 100644
index 0000000000..9a27b95e7a
--- /dev/null
+++ b/c/src/tests/mptests/mp06/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp06
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp event timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp06/node1/mp06.doc b/c/src/tests/mptests/mp06/node1/mp06.doc
new file mode 100644
index 0000000000..501cabbe24
--- /dev/null
+++ b/c/src/tests/mptests/mp06/node1/mp06.doc
@@ -0,0 +1,45 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test55
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ ev_send, ev_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that events can be sent to a remote task.
diff --git a/c/src/tests/mptests/mp06/node1/mp06.scn b/c/src/tests/mptests/mp06/node1/mp06.scn
new file mode 100644
index 0000000000..592777e5d7
--- /dev/null
+++ b/c/src/tests/mptests/mp06/node1/mp06.scn
@@ -0,0 +1,11 @@
+*** TEST 6 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 222
+Getting TID of remote task
+Sending events to remote task
+....................................................
+....................................................
+*** END OF TEST 6 ***
+
diff --git a/c/src/tests/mptests/mp06/node2/Makefile.in b/c/src/tests/mptests/mp06/node2/Makefile.in
new file mode 100644
index 0000000000..0305346d30
--- /dev/null
+++ b/c/src/tests/mptests/mp06/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp06
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp event timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp06/node2/mp06.doc b/c/src/tests/mptests/mp06/node2/mp06.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp06/node2/mp06.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp06/node2/mp06.scn b/c/src/tests/mptests/mp06/node2/mp06.scn
new file mode 100644
index 0000000000..9cb653c2f3
--- /dev/null
+++ b/c/src/tests/mptests/mp06/node2/mp06.scn
@@ -0,0 +1,12 @@
+*** TEST 6 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 111
+Getting TID of remote task
+Receiving events from remote task
+....................................................
+....................................................
+rtems_event_receive - correctly returned RTEMS_TIMEOUT
+*** END OF TEST 6 ***
+
diff --git a/c/src/tests/mptests/mp06/system.h b/c/src/tests/mptests/mp06/system.h
new file mode 100644
index 0000000000..ee57a64147
--- /dev/null
+++ b/c/src/tests/mptests/mp06/system.h
@@ -0,0 +1,52 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp06/task1.c b/c/src/tests/mptests/mp06/task1.c
new file mode 100644
index 0000000000..473f566e2e
--- /dev/null
+++ b/c/src/tests/mptests/mp06/task1.c
@@ -0,0 +1,176 @@
+/* Test_task
+ *
+ * This task tests global event operations. If running on node one, it
+ * continuously sends events. If running on node two, it continuously
+ * receives events.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define DOT_COUNT 25
+
+/*PAGE
+ *
+ * Stop_Test_TSR
+ */
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+/*PAGE
+ *
+ * Event_set_table
+ */
+
+rtems_event_set Event_set_table[] = {
+ RTEMS_EVENT_0,
+ RTEMS_EVENT_1,
+ RTEMS_EVENT_2,
+ RTEMS_EVENT_3,
+ RTEMS_EVENT_4,
+ RTEMS_EVENT_5,
+ RTEMS_EVENT_6,
+ RTEMS_EVENT_7,
+ RTEMS_EVENT_8,
+ RTEMS_EVENT_9,
+ RTEMS_EVENT_10,
+ RTEMS_EVENT_11,
+ RTEMS_EVENT_12,
+ RTEMS_EVENT_13,
+ RTEMS_EVENT_14,
+ RTEMS_EVENT_15,
+ RTEMS_EVENT_16,
+ RTEMS_EVENT_17,
+ RTEMS_EVENT_18,
+ RTEMS_EVENT_19,
+ RTEMS_EVENT_20,
+ RTEMS_EVENT_21,
+ RTEMS_EVENT_22,
+ RTEMS_EVENT_23,
+ RTEMS_EVENT_24,
+ RTEMS_EVENT_25,
+ RTEMS_EVENT_26,
+ RTEMS_EVENT_27,
+ RTEMS_EVENT_28,
+ RTEMS_EVENT_29,
+ RTEMS_EVENT_30,
+ RTEMS_EVENT_31
+};
+
+/*PAGE
+ *
+ * Test_task
+ */
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_event_set event_out;
+ rtems_event_set event_for_this_iteration;
+
+ Stop_Test = FALSE;
+
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_task_ident FAILED!!" );
+
+ if ( Multiprocessing_configuration.node == 1 )
+ puts( "Sending events to remote task" );
+ else
+ puts( "Receiving events from remote task" );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ count = 0;
+
+ for ( ; ; ) {
+ if ( Stop_Test == TRUE )
+ break;
+
+ event_for_this_iteration = Event_set_table[ count % 32 ];
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_event_send( remote_tid, event_for_this_iteration );
+ directive_failed( status, "rtems_event_send" );
+
+ status = rtems_task_wake_after( 1 );
+ directive_failed( status, "rtems_task_wake_after" );
+ } else {
+ status = rtems_event_receive(
+ event_for_this_iteration,
+ RTEMS_DEFAULT_OPTIONS,
+ 1 * TICKS_PER_SECOND,
+ &event_out
+ );
+ if ( rtems_are_statuses_equal( status, RTEMS_TIMEOUT ) ) {
+ if ( Multiprocessing_configuration.node == 2 )
+ puts( "\nCorrect behavior if the other node exitted." );
+ else
+ puts( "\nERROR... node 1 died" );
+ break;
+ } else
+ directive_failed( status, "rtems_event_receive" );
+ }
+
+ if ( (count % DOT_COUNT) == 0 )
+ put_dot('.');
+
+ count++;
+ }
+
+ putchar( '\n' );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ 1 * TICKS_PER_SECOND,
+ &event_out
+ );
+ fatal_directive_status( status, RTEMS_TIMEOUT, "rtems_event_receive" );
+ puts( "rtems_event_receive - correctly returned RTEMS_TIMEOUT" );
+ }
+ puts( "*** END OF TEST 6 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp07/Makefile.in b/c/src/tests/mptests/mp07/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp07/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp07/init.c b/c/src/tests/mptests/mp07/init.c
new file mode 100644
index 0000000000..ce607eb555
--- /dev/null
+++ b/c/src/tests/mptests/mp07/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 7 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp07/node1/Makefile.in b/c/src/tests/mptests/mp07/node1/Makefile.in
new file mode 100644
index 0000000000..b5cf487125
--- /dev/null
+++ b/c/src/tests/mptests/mp07/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp07
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp event timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp07/node1/mp07.doc b/c/src/tests/mptests/mp07/node1/mp07.doc
new file mode 100644
index 0000000000..fcabab9e06
--- /dev/null
+++ b/c/src/tests/mptests/mp07/node1/mp07.doc
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test56
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ ev_send, ev_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that two tasks on different processors can alternate
+ sending each other events.
diff --git a/c/src/tests/mptests/mp07/node1/mp07.scn b/c/src/tests/mptests/mp07/node1/mp07.scn
new file mode 100644
index 0000000000..d348f48612
--- /dev/null
+++ b/c/src/tests/mptests/mp07/node1/mp07.scn
@@ -0,0 +1,10 @@
+*** TEST 7 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 222
+Getting TID of remote task
+Sending first event to remote task
+....................................................
+....................................................
+*** END OF TEST 7 ***
diff --git a/c/src/tests/mptests/mp07/node2/Makefile.in b/c/src/tests/mptests/mp07/node2/Makefile.in
new file mode 100644
index 0000000000..a04cb326ea
--- /dev/null
+++ b/c/src/tests/mptests/mp07/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp07
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp event timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp07/node2/mp07.doc b/c/src/tests/mptests/mp07/node2/mp07.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp07/node2/mp07.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp07/node2/mp07.scn b/c/src/tests/mptests/mp07/node2/mp07.scn
new file mode 100644
index 0000000000..9e361d713c
--- /dev/null
+++ b/c/src/tests/mptests/mp07/node2/mp07.scn
@@ -0,0 +1,9 @@
+*** TEST 7 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 111
+Getting TID of remote task
+....................................................
+....................................................
+*** END OF TEST 7 ***
diff --git a/c/src/tests/mptests/mp07/system.h b/c/src/tests/mptests/mp07/system.h
new file mode 100644
index 0000000000..ee57a64147
--- /dev/null
+++ b/c/src/tests/mptests/mp07/system.h
@@ -0,0 +1,52 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp07/task1.c b/c/src/tests/mptests/mp07/task1.c
new file mode 100644
index 0000000000..44986f8bf5
--- /dev/null
+++ b/c/src/tests/mptests/mp07/task1.c
@@ -0,0 +1,103 @@
+/* Test_task
+ *
+ * This task continuously sends an event to its counterpart on the
+ * other node, and then waits for it to send an event. The copy
+ * running on node one send the first event.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define DOT_COUNT 100
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_event_set event_out;
+
+ Stop_Test = FALSE;
+
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Sending first event to remote task" );
+ status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+ }
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ while ( Stop_Test == FALSE ) {
+ for ( count=DOT_COUNT ; count && (Stop_Test == FALSE) ; count-- ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ if ( status == RTEMS_TIMEOUT ) {
+ puts( "\nTA1 - RTEMS_TIMEOUT .. probably OK if the other node exits" );
+ break;
+ } else
+ directive_failed( status, "rtems_event_receive" );
+
+ status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+ }
+ put_dot('.');
+ }
+
+ /*
+ * Wait a bit before shutting down so we don't screw up the other node
+ * when our MPCI shuts down
+ */
+
+ rtems_task_wake_after(10);
+
+ puts( "\n*** END OF TEST 7 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp08/Makefile.in b/c/src/tests/mptests/mp08/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp08/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp08/init.c b/c/src/tests/mptests/mp08/init.c
new file mode 100644
index 0000000000..ea4002cade
--- /dev/null
+++ b/c/src/tests/mptests/mp08/init.c
@@ -0,0 +1,74 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 8 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', '\0' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Sempahore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+ }
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp08/node1/Makefile.in b/c/src/tests/mptests/mp08/node1/Makefile.in
new file mode 100644
index 0000000000..aa1a3618d7
--- /dev/null
+++ b/c/src/tests/mptests/mp08/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp08
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp08/node1/mp08.doc b/c/src/tests/mptests/mp08/node1/mp08.doc
new file mode 100644
index 0000000000..174188dc63
--- /dev/null
+++ b/c/src/tests/mptests/mp08/node1/mp08.doc
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test57
+
+GLOBAL SEMAPHORE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ sm_create, sm_ident, sm_p, sm_v, sm_delete
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the identification number of
+ a global sempahore.
+
+ h. Verifies that two tasks on different processors can
+ alternate accessing a semaphore.
+
+ i. Verifies operation of sm_delete on global semaphores
+ for both normal and error case.
+
+ j. Verifies Rpc and Process_pkt for packet types Q_SMP, Q_SMV,
+ P_OBJCREATE (semaphore), P_OBJDELETE (semaphore), P_SMDEL_TQ.
+
diff --git a/c/src/tests/mptests/mp08/node1/mp08.scn b/c/src/tests/mptests/mp08/node1/mp08.scn
new file mode 100644
index 0000000000..cde263420c
--- /dev/null
+++ b/c/src/tests/mptests/mp08/node1/mp08.scn
@@ -0,0 +1,11 @@
+*** TEST 8 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting SMID of semaphore
+pvpvpvpvpvp.......
+(continued) pvp
+
+Deleting global semaphore
+*** END OF TEST 8 ***
+
diff --git a/c/src/tests/mptests/mp08/node2/Makefile.in b/c/src/tests/mptests/mp08/node2/Makefile.in
new file mode 100644
index 0000000000..877a5994cf
--- /dev/null
+++ b/c/src/tests/mptests/mp08/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp08
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp08/node2/mp08.doc b/c/src/tests/mptests/mp08/node2/mp08.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp08/node2/mp08.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp08/node2/mp08.scn b/c/src/tests/mptests/mp08/node2/mp08.scn
new file mode 100644
index 0000000000..5a613f45e5
--- /dev/null
+++ b/c/src/tests/mptests/mp08/node2/mp08.scn
@@ -0,0 +1,12 @@
+*** TEST 8 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting SMID of semaphore
+rtems_semaphore_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+pvpvpvpvpvp.......
+(continued) pvp
+
+Global semaphore deleted
+*** END OF TEST 8 ***
+
diff --git a/c/src/tests/mptests/mp08/system.h b/c/src/tests/mptests/mp08/system.h
new file mode 100644
index 0000000000..6a769bf062
--- /dev/null
+++ b/c/src/tests/mptests/mp08/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp08/task1.c b/c/src/tests/mptests/mp08/task1.c
new file mode 100644
index 0000000000..411b83aed2
--- /dev/null
+++ b/c/src/tests/mptests/mp08/task1.c
@@ -0,0 +1,89 @@
+/* Test_task
+ *
+ * This task tests global semaphore operations. It verifies that
+ * global semaphore errors are correctly returned.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ puts( "Getting SMID of semaphore" );
+
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_semaphore_delete did not return RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+ puts(
+ "rtems_semaphore_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+ }
+
+ count = 0; /* number of times node 1 releases semaphore */
+ while ( FOREVER ) {
+ put_dot( 'p' );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_semaphore_obtain"
+ );
+ puts( "\nGlobal semaphore deleted" );
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+ }
+
+ if ( Multiprocessing_configuration.node == 1 && ++count == 1000 ) {
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "\nDeleting global semaphore" );
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_delete" );
+
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+ }
+ else {
+ put_dot( 'v' );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release FAILED!!" );
+ }
+ }
+}
diff --git a/c/src/tests/mptests/mp09/Makefile.in b/c/src/tests/mptests/mp09/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp09/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp09/init.c b/c/src/tests/mptests/mp09/init.c
new file mode 100644
index 0000000000..74a34fceba
--- /dev/null
+++ b/c/src/tests/mptests/mp09/init.c
@@ -0,0 +1,74 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 9 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+ }
+
+ puts( "Creating Test_task (local)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (local)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp09/node1/Makefile.in b/c/src/tests/mptests/mp09/node1/Makefile.in
new file mode 100644
index 0000000000..30821bfba0
--- /dev/null
+++ b/c/src/tests/mptests/mp09/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp09
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 recvmsg sendmsg
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp09/node1/mp09.doc b/c/src/tests/mptests/mp09/node1/mp09.doc
new file mode 100644
index 0000000000..a517608fb2
--- /dev/null
+++ b/c/src/tests/mptests/mp09/node1/mp09.doc
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test58
+
+GLOBAL MESSAGE QUEUE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ tm_wkafter, q_create, q_send, q_broadcast, q_urgent, q_receive,
+ q_delete
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can delete itself.
+
+ i. Verifies Rpc and Process_pkt for message queue related packets.
+
+ j. Verifies normal and error paths for global message queue handling.
+
+NOTE: The SLAVE must be started first for this test to successfully run.
diff --git a/c/src/tests/mptests/mp09/node1/mp09.scn b/c/src/tests/mptests/mp09/node1/mp09.scn
new file mode 100644
index 0000000000..74cf06904d
--- /dev/null
+++ b/c/src/tests/mptests/mp09/node1/mp09.scn
@@ -0,0 +1,22 @@
+*** TEST 9 -- NODE 1 ***
+Creating Message Queue (Global)
+Creating Test_task (local)
+Starting Test_task (local)
+Deleting initialization task
+Getting QID of message queue
+Receiving message ...
+Received : 123456789012345
+Receiving message ...
+Received : abcdefghijklmno
+Receiving message ...
+Received : ABCDEFGHIJKLMNO
+Receiver delaying for a second
+rtems_message_queue_send: 123456789012345
+Delaying for a second
+rtems_message_queue_urgent: abcdefghijklmno
+Delaying for a second
+rtems_message_queue_broadcast: ABCDEFGHIJKLMNO
+Delaying for a second
+Delaying for 5 seconds
+Deleting Message queue
+*** END OF TEST 9 ***
diff --git a/c/src/tests/mptests/mp09/node2/Makefile.in b/c/src/tests/mptests/mp09/node2/Makefile.in
new file mode 100644
index 0000000000..bc24b57f72
--- /dev/null
+++ b/c/src/tests/mptests/mp09/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp09
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 recvmsg sendmsg
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp09/node2/mp09.doc b/c/src/tests/mptests/mp09/node2/mp09.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp09/node2/mp09.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp09/node2/mp09.scn b/c/src/tests/mptests/mp09/node2/mp09.scn
new file mode 100644
index 0000000000..1bd17cecd9
--- /dev/null
+++ b/c/src/tests/mptests/mp09/node2/mp09.scn
@@ -0,0 +1,27 @@
+*** TEST 9 -- NODE 2 ***
+Creating Test_task (local)
+Starting Test_task (local)
+Deleting initialization task
+Getting QID of message queue
+rtems_message_queue_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+rtems_message_queue_send: 123456789012345
+Delaying for a second
+rtems_message_queue_urgent: abcdefghijklmno
+Delaying for a second
+rtems_message_queue_broadcast: ABCDEFGHIJKLMNO
+Delaying for a second
+Receiving message ...
+Received : 123456789012345
+Receiving message ...
+Received : abcdefghijklmno
+Receiving message ...
+Received : ABCDEFGHIJKLMNO
+Receiver delaying for a second
+Flushing remote empty queue
+0 messages were flushed on the remote queue
+Send messages to be flushed from remote queue
+Flushing remote queue
+1 messages were flushed on the remote queue
+Waiting for message queue to be deleted
+Global message queue deleted
+*** END OF TEST 9 ***
diff --git a/c/src/tests/mptests/mp09/recvmsg.c b/c/src/tests/mptests/mp09/recvmsg.c
new file mode 100644
index 0000000000..5bac302d83
--- /dev/null
+++ b/c/src/tests/mptests/mp09/recvmsg.c
@@ -0,0 +1,47 @@
+/* Receive_messages
+ *
+ * This routine receives and prints three messages.
+ * an error condition.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Receive_messages()
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_unsigned32 size;
+ char receive_buffer[16];
+
+ for ( index=1 ; index <=3 ; index++ ) {
+ puts( "Receiving message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "Received : ");
+ puts( receive_buffer );
+ }
+
+ puts( "Receiver delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+}
diff --git a/c/src/tests/mptests/mp09/sendmsg.c b/c/src/tests/mptests/mp09/sendmsg.c
new file mode 100644
index 0000000000..0d72d27c07
--- /dev/null
+++ b/c/src/tests/mptests/mp09/sendmsg.c
@@ -0,0 +1,60 @@
+/* Send_messages
+ *
+ * This routine sends a series of three messages.
+ * an error condition.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Send_messages()
+{
+ rtems_status_code status;
+ rtems_unsigned32 broadcast_count;
+
+ puts_nocr( "rtems_message_queue_send: " );
+ puts( buffer1 );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer1, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "Delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr( "rtems_message_queue_urgent: " );
+ puts( buffer2 );
+ status = rtems_message_queue_urgent( Queue_id[ 1 ], (long (*)[4])buffer2, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ puts( "Delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr( "rtems_message_queue_broadcast: " );
+ puts( buffer3 );
+ status = rtems_message_queue_broadcast(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer3,
+ 16,
+ &broadcast_count
+ );
+ directive_failed( status, "rtems_message_queue_broadcast" );
+
+ puts( "Delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+}
diff --git a/c/src/tests/mptests/mp09/system.h b/c/src/tests/mptests/mp09/system.h
new file mode 100644
index 0000000000..3c5f710ad9
--- /dev/null
+++ b/c/src/tests/mptests/mp09/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+void Receive_messages( void );
+
+void Send_messages( void );
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+extern char buffer1[16];
+extern char buffer2[16];
+extern char buffer3[16];
+extern char buffer4[16];
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp09/task1.c b/c/src/tests/mptests/mp09/task1.c
new file mode 100644
index 0000000000..bc0c75e404
--- /dev/null
+++ b/c/src/tests/mptests/mp09/task1.c
@@ -0,0 +1,109 @@
+/* Test_task
+ *
+ * This task tests global message queue operations. It also generates
+ * an error condition.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+char buffer1[16] = "123456789012345";
+char buffer2[16] = "abcdefghijklmno";
+char buffer3[16] = "ABCDEFGHIJKLMNO";
+char buffer4[16] = "PQRSTUVWXYZ(){}";
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 size;
+ char receive_buffer[16];
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting QID of message queue" );
+
+ do {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_message_queue_delete"
+ );
+ puts(
+ "rtems_message_queue_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+
+ Send_messages();
+ Receive_messages();
+
+ puts( "Flushing remote empty queue" );
+ status = rtems_message_queue_flush( Queue_id[ 1 ], &count );
+ directive_failed( status, "rtems_message_queue_flush" );
+ printf( "%d messages were flushed on the remote queue\n", count );
+
+ puts( "Send messages to be flushed from remote queue" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer1, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "Flushing remote queue" );
+ status = rtems_message_queue_flush( Queue_id[ 1 ], &count );
+ directive_failed( status, "rtems_message_queue_flush" );
+ printf( "%d messages were flushed on the remote queue\n", count );
+
+ puts( "Waiting for message queue to be deleted" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_message_queue_receive"
+ );
+ puts( "\nGlobal message queue deleted" );
+ }
+ else { /* node == 1 */
+ Receive_messages();
+ Send_messages();
+
+ puts( "Delaying for 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Deleting Message queue" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+ }
+
+ puts( "*** END OF TEST 9 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp10/Makefile.in b/c/src/tests/mptests/mp10/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp10/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp10/init.c b/c/src/tests/mptests/mp10/init.c
new file mode 100644
index 0000000000..45400525a5
--- /dev/null
+++ b/c/src/tests/mptests/mp10/init.c
@@ -0,0 +1,143 @@
+/* Init
+ *
+ * This routine is the initialization routine for this test program.
+ * Other than creating all objects needed by this test, if this routine
+ * is running on node one, it acquires a global semaphore to
+ * force all other tasks to pend. If running on node two, this task
+ * sleeps for a while, and then deletes two local tasks which are
+ * waiting on a remote message queue or a semaphore.
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 10 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'S', 'A', '3', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ puts( "Creating Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 0,
+ RTEMS_GLOBAL | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ status = rtems_task_wake_after( 10 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ } else {
+
+ puts( "Creating Test_task 1 (local)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 1 (local)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task1, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Test_task 2 (local)" );
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 2 (local)" );
+ status = rtems_task_start( Task_id[ 2 ], Test_task2, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Test_task 3 (local)" );
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 3 (local)" );
+ status = rtems_task_start( Task_id[ 3 ], Test_task2, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Sleeping for 1 seconds ..." );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Deleting Test_task2" );
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of Task 2" );
+
+ puts( "Deleting Test_task1" );
+ status = rtems_task_delete( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_delete of Task 1" );
+
+ puts( "Restarting Test_task3" );
+ status = rtems_task_restart( Task_id[ 3 ], 1 );
+ directive_failed( status, "rtems_task_restart of Task 3" );
+
+ }
+ puts( "*** END OF TEST 10 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp10/node1/Makefile.in b/c/src/tests/mptests/mp10/node1/Makefile.in
new file mode 100644
index 0000000000..7ddff180ec
--- /dev/null
+++ b/c/src/tests/mptests/mp10/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp10
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp10/node1/mp10.doc b/c/src/tests/mptests/mp10/node1/mp10.doc
new file mode 100644
index 0000000000..412c6c7b46
--- /dev/null
+++ b/c/src/tests/mptests/mp10/node1/mp10.doc
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test59
+
+GLOBAL SEMAPHORE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that a task can delete itself or another task.
diff --git a/c/src/tests/mptests/mp10/node1/mp10.scn b/c/src/tests/mptests/mp10/node1/mp10.scn
new file mode 100644
index 0000000000..deeafc0a9a
--- /dev/null
+++ b/c/src/tests/mptests/mp10/node1/mp10.scn
@@ -0,0 +1,4 @@
+*** TEST 10 -- NODE 1 ***
+Creating Message Queue (Global)
+Creating Semaphore (Global)
+*** END OF TEST 10 ***
diff --git a/c/src/tests/mptests/mp10/node2/Makefile.in b/c/src/tests/mptests/mp10/node2/Makefile.in
new file mode 100644
index 0000000000..5233a109be
--- /dev/null
+++ b/c/src/tests/mptests/mp10/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp10
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp10/node2/mp10.doc b/c/src/tests/mptests/mp10/node2/mp10.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp10/node2/mp10.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp10/node2/mp10.scn b/c/src/tests/mptests/mp10/node2/mp10.scn
new file mode 100644
index 0000000000..25c07e6202
--- /dev/null
+++ b/c/src/tests/mptests/mp10/node2/mp10.scn
@@ -0,0 +1,19 @@
+*** TEST 10 -- NODE 2 ***
+Creating Test_task 1 (local)
+Starting Test_task 1 (local)
+Creating Test_task 2 (local)
+Starting Test_task 2 (local)
+Creating Test_task 3 (local)
+Starting Test_task 3 (local)
+Sleeping for 1 seconds ...
+Getting QID of message queue
+Attempting to receive message ...
+Getting SMID of semaphore
+Attempting to acquire semaphore ...
+Getting SMID of semaphore
+Attempting to acquire semaphore ...
+Deleting Test_task2
+Deleting Test_task1
+Restarting Test_task3
+*** END OF TEST 10 ***
+
diff --git a/c/src/tests/mptests/mp10/system.h b/c/src/tests/mptests/mp10/system.h
new file mode 100644
index 0000000000..128a62363c
--- /dev/null
+++ b/c/src/tests/mptests/mp10/system.h
@@ -0,0 +1,64 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task3(
+ rtems_task_argument restart
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp10/task1.c b/c/src/tests/mptests/mp10/task1.c
new file mode 100644
index 0000000000..b9ce51bcc3
--- /dev/null
+++ b/c/src/tests/mptests/mp10/task1.c
@@ -0,0 +1,52 @@
+/* Test_task1
+ *
+ * This task attempts to receive a message from a global message queue.
+ * It should never actually receive the message.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+)
+{
+ char receive_buffer[16];
+ rtems_unsigned32 size;
+ rtems_status_code status;
+
+ puts( "Getting QID of message queue" );
+
+ do {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to receive message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+
+}
diff --git a/c/src/tests/mptests/mp10/task2.c b/c/src/tests/mptests/mp10/task2.c
new file mode 100644
index 0000000000..0627f795b3
--- /dev/null
+++ b/c/src/tests/mptests/mp10/task2.c
@@ -0,0 +1,47 @@
+/* Test_task2
+ *
+ * This task attempts to receive control of a global semaphore.
+ * It should never receive control of the semaphore.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "Getting SMID of semaphore" );
+
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to acquire semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+}
diff --git a/c/src/tests/mptests/mp10/task3.c b/c/src/tests/mptests/mp10/task3.c
new file mode 100644
index 0000000000..2c3cd2b297
--- /dev/null
+++ b/c/src/tests/mptests/mp10/task3.c
@@ -0,0 +1,50 @@
+/* Test_task3
+ *
+ * This task attempts to receive control of a global semaphore.
+ * It should never receive control of the semaphore.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task3( restart )
+rtems_task_argument restart;
+{
+ rtems_status_code status;
+
+ if ( restart == 1 ) {
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete" );
+ }
+
+ puts( "Getting SMID of semaphore" );
+
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to acquire semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+}
diff --git a/c/src/tests/mptests/mp11/Makefile.in b/c/src/tests/mptests/mp11/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp11/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp11/init.c b/c/src/tests/mptests/mp11/init.c
new file mode 100644
index 0000000000..85cb06f2ee
--- /dev/null
+++ b/c/src/tests/mptests/mp11/init.c
@@ -0,0 +1,105 @@
+/* Init
+ *
+ * This routine is the initialization and test routine for
+ * this test program. It attempts to create more global
+ * objects than are configured (zero should be configured).
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 my_partition[0x30000] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id junk_id;
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 11 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Attempting to create Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &junk_id
+ );
+ fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_task_create" );
+ puts( "rtems_task_create correctly returned RTEMS_TOO_MANY" );
+
+ puts( "Attempting to create Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_create"
+ );
+ puts( "rtems_message_queue_create correctly returned RTEMS_TOO_MANY" );
+
+ puts( "Attempting to create Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &junk_id
+ );
+ fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_semaphore_create" );
+ puts( "rtems_semaphore_create correctly returned RTEMS_TOO_MANY" );
+
+ puts( "Attempting to create Partition (Global)" );
+ status = rtems_partition_create(
+ 1,
+ (rtems_unsigned8 *) my_partition,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &junk_id
+ );
+ fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_partition_create" );
+ puts( "rtems_partition_create correctly returned RTEMS_TOO_MANY" );
+ }
+ puts( "*** END OF TEST 11 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp11/node1/Makefile.in b/c/src/tests/mptests/mp11/node1/Makefile.in
new file mode 100644
index 0000000000..dc17049681
--- /dev/null
+++ b/c/src/tests/mptests/mp11/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp11
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message partition semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp11/node1/mp11.doc b/c/src/tests/mptests/mp11/node1/mp11.doc
new file mode 100644
index 0000000000..613a4bfe67
--- /dev/null
+++ b/c/src/tests/mptests/mp11/node1/mp11.doc
@@ -0,0 +1,42 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test60
+
+TOO MANY GLOBAL OBJECTS ERROR TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ t_create, q_create, sm_create, pt_create
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that all object create directives correctly return
+ E_TOOMANYGOBJECTS.
diff --git a/c/src/tests/mptests/mp11/node1/mp11.scn b/c/src/tests/mptests/mp11/node1/mp11.scn
new file mode 100644
index 0000000000..fb26583852
--- /dev/null
+++ b/c/src/tests/mptests/mp11/node1/mp11.scn
@@ -0,0 +1,10 @@
+*** TEST 11 -- NODE 1 ***
+Attempting to create Test_task (Global)
+rtems_task_create correctly returned RTEMS_TOO_MANY
+Attempting to create Message Queue (Global)
+rtems_message_queue_create correctly returned RTEMS_TOO_MANY
+Attempting to create Semaphore (Global)
+rtems_semaphore_create correctly returned RTEMS_TOO_MANY
+Attempting to create Partition (Global)
+rtems_partition_create correctly returned RTEMS_TOO_MANY
+*** END OF TEST 11 ***
diff --git a/c/src/tests/mptests/mp11/node2/Makefile.in b/c/src/tests/mptests/mp11/node2/Makefile.in
new file mode 100644
index 0000000000..8c72c8ec40
--- /dev/null
+++ b/c/src/tests/mptests/mp11/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp11
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message partition semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp11/node2/mp11.doc b/c/src/tests/mptests/mp11/node2/mp11.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp11/node2/mp11.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp11/node2/mp11.scn b/c/src/tests/mptests/mp11/node2/mp11.scn
new file mode 100644
index 0000000000..49bd8a3219
--- /dev/null
+++ b/c/src/tests/mptests/mp11/node2/mp11.scn
@@ -0,0 +1,2 @@
+*** TEST 11 -- NODE 2 ***
+*** END OF TEST 11 ***
diff --git a/c/src/tests/mptests/mp11/system.h b/c/src/tests/mptests/mp11/system.h
new file mode 100644
index 0000000000..afd105e708
--- /dev/null
+++ b/c/src/tests/mptests/mp11/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 0
+#define CONFIGURE_MP_MAXIMUM_PROXIES 0
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp12/Makefile.in b/c/src/tests/mptests/mp12/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp12/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp12/init.c b/c/src/tests/mptests/mp12/init.c
new file mode 100644
index 0000000000..1aac821240
--- /dev/null
+++ b/c/src/tests/mptests/mp12/init.c
@@ -0,0 +1,113 @@
+/* Init
+ *
+ * This routine is the initialization routine and test code for
+ * global partitions. It creates a global partition, obtains and
+ * releases a buffer, and deletes the partition. The partition
+ * is created on node one, and an attempt is made to delete it
+ * by node two.
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 Partition_area[ 1024 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ void *bufaddr;
+
+ printf(
+ "\n\n*** TEST 12 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'A', 'R', ' ' );
+
+ puts( "Got to initialization task" );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting ID of remote Partition (Global)" );
+
+ do {
+ status = rtems_partition_ident(
+ Partition_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Partition_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to delete remote Partition (Global)" );
+ status = rtems_partition_delete( Partition_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_partition_delete"
+ );
+ puts(
+ "rtems_partition_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+
+ puts( "Obtaining a buffer from the global partition" );
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &bufaddr );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ printf( "Address returned was : 0x%p\n", bufaddr );
+
+ puts( "Releasing a buffer to the global partition" );
+ status = rtems_partition_return_buffer( Partition_id[ 1 ], bufaddr );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+ else {
+ puts( "Creating Partition (Global)" );
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_area,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create" );
+
+ puts( "Sleeping for two seconds" );
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Deleting Partition (Global)" );
+ status = rtems_partition_delete( Partition_id[ 1 ] );
+ directive_failed( status, "rtems_partition_delete" );
+ }
+ puts( "*** END OF TEST 12 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp12/node1/Makefile.in b/c/src/tests/mptests/mp12/node1/Makefile.in
new file mode 100644
index 0000000000..f0d8a983ae
--- /dev/null
+++ b/c/src/tests/mptests/mp12/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp12
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp partition
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp12/node1/mp12.doc b/c/src/tests/mptests/mp12/node1/mp12.doc
new file mode 100644
index 0000000000..6c670b7da8
--- /dev/null
+++ b/c/src/tests/mptests/mp12/node1/mp12.doc
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test61
+
+GLOBAL PARTITION TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, tm_wkafter,
+ pt_create, pt_delete, pt_getbuf, pt_retbuf
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies the Shared Memory Locked Queue Driver.
+
+ h. Verifies _Rpc() and _Process_pkt() for the following packet types:
+ P_OBJCREATE (partitions),
+ P_OBJDELETE (partitions),
+ P_PTGETBUF, and
+ P_PTRETBUF.
+
+ i. Verifies normal and error paths (other than E_TOOMANYGOBJECTS)
+ for global partitions.
+
+ j. Verifies that a task can delete itself.
diff --git a/c/src/tests/mptests/mp12/node1/mp12.scn b/c/src/tests/mptests/mp12/node1/mp12.scn
new file mode 100644
index 0000000000..605a2c11db
--- /dev/null
+++ b/c/src/tests/mptests/mp12/node1/mp12.scn
@@ -0,0 +1,6 @@
+*** TEST 12 -- NODE 1 ***
+Got to initialization task
+Creating Partition (Global)
+Sleeping for two seconds
+Deleting Partition (Global)
+*** END OF TEST 12 ***
diff --git a/c/src/tests/mptests/mp12/node2/Makefile.in b/c/src/tests/mptests/mp12/node2/Makefile.in
new file mode 100644
index 0000000000..be4d681aa5
--- /dev/null
+++ b/c/src/tests/mptests/mp12/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp12
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp partition
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp12/node2/mp12.doc b/c/src/tests/mptests/mp12/node2/mp12.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp12/node2/mp12.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp12/node2/mp12.scn b/c/src/tests/mptests/mp12/node2/mp12.scn
new file mode 100644
index 0000000000..ad65e9cb32
--- /dev/null
+++ b/c/src/tests/mptests/mp12/node2/mp12.scn
@@ -0,0 +1,10 @@
+*** TEST 12 -- NODE 2 ***
+Got to initialization task
+Getting ID of remote Partition (Global)
+Attempting to delete remote Partition (Global)
+rtems_partition_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+Obtaining a buffer from the global partition
+>>>>>>> address returned will differ
+Address returned was : 0x200f0000
+Releasing a buffer to the global partition
+*** END OF TEST 12 ***
diff --git a/c/src/tests/mptests/mp12/system.h b/c/src/tests/mptests/mp12/system.h
new file mode 100644
index 0000000000..af91912676
--- /dev/null
+++ b/c/src/tests/mptests/mp12/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+#define PT_NAME rtems_build_name( 'P', 'A', 'R', '\0' )
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 1
+#define CONFIGURE_MP_MAXIMUM_PROXIES 0
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#elif ( NODE_NUMBER == 2 )
+#define CONFIGURE_MAXIMUM_PARTITIONS 2
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Partition_id[ 2 ]; /* array of partition ids */
+TEST_EXTERN rtems_name Partition_name[ 2 ]; /* array of partition names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp13/Makefile.in b/c/src/tests/mptests/mp13/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp13/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp13/init.c b/c/src/tests/mptests/mp13/init.c
new file mode 100644
index 0000000000..92ff0b396a
--- /dev/null
+++ b/c/src/tests/mptests/mp13/init.c
@@ -0,0 +1,115 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 13 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ puts( "Creating Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+ }
+
+ puts( "Creating Test_task 1 (local)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 1 (local)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task1, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Test_task 2 (local)" );
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 2 (local)" );
+ status = rtems_task_start( Task_id[ 2 ], Test_task2, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_task_wake_after( 5 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+ }
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp13/node1/Makefile.in b/c/src/tests/mptests/mp13/node1/Makefile.in
new file mode 100644
index 0000000000..cc9eaac83f
--- /dev/null
+++ b/c/src/tests/mptests/mp13/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp13
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp13/node1/mp13.doc b/c/src/tests/mptests/mp13/node1/mp13.doc
new file mode 100644
index 0000000000..999ec29615
--- /dev/null
+++ b/c/src/tests/mptests/mp13/node1/mp13.doc
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test62
+
+GLOBAL SEMAPHORE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, tm_wkafter,
+ sm_create, q_create, sm_p, q_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies the Shared Memory Locked Queue Driver.
+
+ h. Verifies that E_MESSAGETIMEOUT is when waiting on a
+ remote message queue.
+
+ i. Verifies that E_SEMTIMEOUT is when waiting on a remote semaphore.
+
+ j. Verifies that a task can delete itself.
diff --git a/c/src/tests/mptests/mp13/node1/mp13.scn b/c/src/tests/mptests/mp13/node1/mp13.scn
new file mode 100644
index 0000000000..d3bd11f65e
--- /dev/null
+++ b/c/src/tests/mptests/mp13/node1/mp13.scn
@@ -0,0 +1,14 @@
+*** TEST 13 -- NODE 1 ***
+Creating Message Queue (Global)
+Creating Semaphore (Global)
+Creating Test_task 1 (local)
+Starting Test_task 1 (local)
+Creating Test_task 2 (local)
+Starting Test_task 2 (local)
+Getting QID of message queue
+Receiving message ...
+Getting SMID of semaphore
+Releasing semaphore ...
+Getting semaphore ...
+Getting semaphore ...
+*** END OF TEST 13 ***
diff --git a/c/src/tests/mptests/mp13/node2/Makefile.in b/c/src/tests/mptests/mp13/node2/Makefile.in
new file mode 100644
index 0000000000..42e9ee7d89
--- /dev/null
+++ b/c/src/tests/mptests/mp13/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp13
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp message semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp13/node2/mp13.doc b/c/src/tests/mptests/mp13/node2/mp13.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp13/node2/mp13.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp13/node2/mp13.scn b/c/src/tests/mptests/mp13/node2/mp13.scn
new file mode 100644
index 0000000000..e9df202a94
--- /dev/null
+++ b/c/src/tests/mptests/mp13/node2/mp13.scn
@@ -0,0 +1,16 @@
+*** TEST 13 -- NODE 2 ***
+Creating Test_task 1 (local)
+Starting Test_task 1 (local)
+Creating Test_task 2 (local)
+Starting Test_task 2 (local)
+Deleting initialization task
+Getting QID of message queue
+Getting SMID of semaphore
+Getting semaphore ...
+Receiving message ...
+Releasing semaphore ...
+Getting semaphore ...
+rtems_message_queue_receive correctly returned RTEMS_TIMEOUT
+Deleting self
+rtems_semaphore_obtain correctly returned RTEMS_TIMEOUT
+*** END OF TEST 13 ***
diff --git a/c/src/tests/mptests/mp13/system.h b/c/src/tests/mptests/mp13/system.h
new file mode 100644
index 0000000000..cae888d912
--- /dev/null
+++ b/c/src/tests/mptests/mp13/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/c/src/tests/mptests/mp13/task1.c b/c/src/tests/mptests/mp13/task1.c
new file mode 100644
index 0000000000..a82104573e
--- /dev/null
+++ b/c/src/tests/mptests/mp13/task1.c
@@ -0,0 +1,73 @@
+/* Test_task1
+ *
+ * This task attempts to receive a message from a global message queue.
+ * If running on the node on which the queue resides, the wait is
+ * forever, otherwise it times out on a remote message queue.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+)
+{
+ char receive_buffer[16];
+ rtems_unsigned32 size;
+ rtems_status_code status;
+
+ puts( "Getting QID of message queue" );
+
+ do {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Receiving message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "How did I get back from here????" );
+ directive_failed( status, "rtems_message_queue_receive" );
+ }
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Receiving message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 2 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(status, RTEMS_TIMEOUT, "rtems_message_queue_receive");
+ puts( "rtems_message_queue_receive correctly returned RTEMS_TIMEOUT" );
+
+ puts( "Deleting self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/mptests/mp13/task2.c b/c/src/tests/mptests/mp13/task2.c
new file mode 100644
index 0000000000..51ce76e95e
--- /dev/null
+++ b/c/src/tests/mptests/mp13/task2.c
@@ -0,0 +1,106 @@
+/* Test_task2
+ *
+ * This task attempts to receive control of a global semaphore.
+ * If running on the node on which the semaphore resides, the wait is
+ * forever, otherwise it times out on a remote semaphore.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "Getting SMID of semaphore" );
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ directive_failed( status, "rtems_semaphore_ident" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Releasing semaphore ..." );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "How did I get back from here????" );
+ directive_failed( status, "rtems_semaphore_obtain" );
+ }
+
+/*
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+*/
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+
+ puts( "Releasing semaphore ..." );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ 2 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_semaphore_obtain"
+ );
+ puts( "rtems_semaphore_obtain correctly returned RTEMS_TIMEOUT" );
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/mptests/mp14/Makefile.in b/c/src/tests/mptests/mp14/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/mptests/mp14/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/mptests/mp14/delay.c b/c/src/tests/mptests/mp14/delay.c
new file mode 100644
index 0000000000..81e79d99ea
--- /dev/null
+++ b/c/src/tests/mptests/mp14/delay.c
@@ -0,0 +1,34 @@
+/* Delayed_send_event
+ *
+ * This routine is a timer service routine which sends an event to a task.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id timer_id,
+ void *ignored
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send(
+ Task_id[ rtems_get_index( timer_id ) ],
+ RTEMS_EVENT_16
+ );
+ directive_failed( status, "rtems_event_send" );
+}
diff --git a/c/src/tests/mptests/mp14/evtask1.c b/c/src/tests/mptests/mp14/evtask1.c
new file mode 100644
index 0000000000..7242d08b77
--- /dev/null
+++ b/c/src/tests/mptests/mp14/evtask1.c
@@ -0,0 +1,87 @@
+/* Test_task
+ *
+ * This task either continuously sends events to a remote task, or
+ * continuously receives events sent by a remote task. This decision
+ * is based upon the local node number.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_event_set event_out;
+
+ remote_node = ((Multiprocessing_configuration.node == 1) ? 2 : 1);
+
+ puts( "About to go to sleep!" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ puts( "Waking up!" );
+
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ while ( FOREVER ) {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+ puts( "rtems_task_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Sending events to remote task" );
+ while ( Stop_Test == FALSE ) {
+ for ( count=EVENT_TASK_DOT_COUNT; Stop_Test == FALSE && count; count-- ) {
+ status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+ }
+ put_dot( 'e' );
+ }
+ }
+
+ puts( "Receiving events from remote task" );
+ while ( Stop_Test == FALSE ) {
+ for ( count=EVENT_TASK_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ directive_failed( status, "rtems_event_receive" );
+ }
+ put_dot( 'e' );
+ }
+
+ Exit_test();
+}
diff --git a/c/src/tests/mptests/mp14/evtmtask.c b/c/src/tests/mptests/mp14/evtmtask.c
new file mode 100644
index 0000000000..8a724b9f54
--- /dev/null
+++ b/c/src/tests/mptests/mp14/evtmtask.c
@@ -0,0 +1,65 @@
+/* Delayed_events_task
+ *
+ * This task continuously sends itself events at one tick
+ * intervals.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Delayed_events_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_unsigned32 previous_mode;
+ rtems_status_code status;
+ rtems_event_set events;
+
+ status = rtems_task_mode(
+ RTEMS_PREEMPT | RTEMS_TIMESLICE,
+ RTEMS_PREEMPT_MASK | RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ while ( Stop_Test == FALSE ) {
+ for ( count=DELAYED_EVENT_DOT_COUNT; Stop_Test == FALSE && count; count-- ){
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 1,
+ Delayed_send_event,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_reset" );
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &events
+ );
+ directive_failed( status, "rtems_event_receive" );
+ }
+ put_dot('.');
+ }
+
+ Exit_test();
+}
diff --git a/c/src/tests/mptests/mp14/exit.c b/c/src/tests/mptests/mp14/exit.c
new file mode 100644
index 0000000000..8825a4bf13
--- /dev/null
+++ b/c/src/tests/mptests/mp14/exit.c
@@ -0,0 +1,40 @@
+/* Exit_test
+ *
+ * This routine safely stops the test and prints some information
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Exit_test( void )
+{
+ rtems_status_code status;
+ rtems_mode old_mode;
+
+ /*
+ * Wait a bit before shutting down so we don't screw up the other node
+ * when our MPCI shuts down
+ */
+
+ rtems_task_wake_after(20);
+
+ status = rtems_task_mode( RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &old_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ MPCI_Print_statistics();
+
+ rtems_shutdown_executive( 0 );
+}
diff --git a/c/src/tests/mptests/mp14/init.c b/c/src/tests/mptests/mp14/init.c
new file mode 100644
index 0000000000..61eca70a6e
--- /dev/null
+++ b/c/src/tests/mptests/mp14/init.c
@@ -0,0 +1,191 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 my_partition[0x30000] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+
+ printf(
+ "\n\n*** TEST 14 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Stop_Test = FALSE;
+
+ status = rtems_timer_create(
+ rtems_build_name('S', 'T', 'O', 'P'),
+ &timer_id
+ );
+ directive_failed( status, "rtems_timer_create" );
+
+ status = rtems_timer_fire_after(
+ timer_id,
+ MAX_LONG_TEST_DURATION * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_task_name[ 1 ] = rtems_build_name( 'M', 'T', '1', ' ' );
+ Queue_task_name[ 2 ] = rtems_build_name( 'M', 'T', '2', ' ' );
+
+ Partition_task_name[ 1 ] = rtems_build_name( 'P', 'T', '1', ' ' );
+ Partition_task_name[ 2 ] = rtems_build_name( 'P', 'T', '2', ' ' );
+
+ Semaphore_task_name[ 1 ] = rtems_build_name( 'S', 'M', '1', ' ' );
+ Semaphore_task_name[ 2 ] = rtems_build_name( 'S', 'M', '2', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'A', 'R', ' ' );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', 'R', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 1,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ puts( "Creating Partition (Global)" );
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ (void *)my_partition,
+ 0x8000,
+ 0x3800,
+ RTEMS_GLOBAL,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create" );
+ }
+
+ puts( "Creating Event task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Event_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Event task (Global)" );
+ status = rtems_task_start( Event_task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Semaphore task (Global)" );
+ status = rtems_task_create(
+ Semaphore_task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Semaphore_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Semaphore task (Global)" );
+ status = rtems_task_start( Semaphore_task_id[ 1 ], Semaphore_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Message Queue task (Global)" );
+ status = rtems_task_create(
+ Queue_task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Queue_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ /* argument is index into Buffers */
+ puts( "Starting Message Queue task (Global)" );
+ status = rtems_task_start( Queue_task_id[ 1 ], Message_queue_task, 1 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Partition task (Global)" );
+ status = rtems_task_create(
+ Partition_task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Partition_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Partition task (Global)" );
+ status = rtems_task_start( Partition_task_id[ 1 ], Partition_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_set_priority( RTEMS_SELF, 2, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_task_ident(
+ RTEMS_SELF,
+ RTEMS_SEARCH_ALL_NODES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_ident" );
+
+ Delayed_events_task( 1 );
+}
diff --git a/c/src/tests/mptests/mp14/msgtask1.c b/c/src/tests/mptests/mp14/msgtask1.c
new file mode 100644
index 0000000000..6f9033cf17
--- /dev/null
+++ b/c/src/tests/mptests/mp14/msgtask1.c
@@ -0,0 +1,107 @@
+/* Message_queue_task
+ *
+ * This task continuously sends messages to and receives messages from
+ * a global message queue. The message buffer is viewed as an array
+ * of two sixty-four bit counts which are incremented when a message is
+ * received.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Message_queue_task(
+ rtems_task_argument index
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 yield_count;
+ rtems_unsigned32 *buffer_count;
+ rtems_unsigned32 *overflow_count;
+ rtems_unsigned32 size;
+
+ Msg_buffer[ index ][0] = 0;
+ Msg_buffer[ index ][1] = 0;
+ Msg_buffer[ index ][2] = 0;
+ Msg_buffer[ index ][3] = 0;
+
+ puts( "Getting ID of msg queue" );
+ while ( FOREVER ) {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+ puts( "rtems_message_queue_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_message_queue_send(
+ Queue_id[ 1 ],
+ (long (*)[4])Msg_buffer[ index ],
+ 16
+ );
+ directive_failed( status, "rtems_message_queue_send" );
+ overflow_count = &Msg_buffer[ index ][0];
+ buffer_count = &Msg_buffer[ index ][1];
+ } else {
+ overflow_count = &Msg_buffer[ index ][2];
+ buffer_count = &Msg_buffer[ index ][3];
+ }
+
+ while ( Stop_Test == FALSE ) {
+ yield_count = 100;
+
+ for ( count=MESSAGE_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])Msg_buffer[ index ],
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+
+ if ( *buffer_count == (rtems_unsigned32)0xffffffff ) {
+ *buffer_count = 0;
+ *overflow_count += 1;
+ } else
+ *buffer_count += 1;
+
+ status = rtems_message_queue_send(
+ Queue_id[ 1 ],
+ (long (*)[4])Msg_buffer[ index ],
+ 16
+ );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ if (Stop_Test == FALSE)
+ if ( Multiprocessing_configuration.node == 1 && --yield_count == 0 ) {
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ yield_count = 100;
+ }
+ }
+ put_dot( 'm' );
+ }
+
+ Exit_test();
+}
diff --git a/c/src/tests/mptests/mp14/node1/Makefile.in b/c/src/tests/mptests/mp14/node1/Makefile.in
new file mode 100644
index 0000000000..27fda0aef6
--- /dev/null
+++ b/c/src/tests/mptests/mp14/node1/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+TEST=mp14
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp event partition semaphore timer message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=exit init delay evtask1 evtmtask pttask1 smtask1 msgtask1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp14/node1/mp14.doc b/c/src/tests/mptests/mp14/node1/mp14.doc
new file mode 100644
index 0000000000..4e7dde6c38
--- /dev/null
+++ b/c/src/tests/mptests/mp14/node1/mp14.doc
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test63
+
+INTERRUPT SATURATION TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_ident, tm_tick,
+ tm_evwhen, tm_wkafter, i_return, ev_send, ev_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies printing of strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies printing of strings to the CRT on port 2 of the mvme136 board
+ using Write and Writeln and the TTY driver.
+
+ e. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ f. Verifies executive initialization performed correctly.
+
+ g. Verifies the executive trap handler except for the halt function.
+
+ h. Verifies that a task can get the task identification number of itself.
+
+ i. Verifies that a task can get the task identification number
+ of another task.
+
+ j. Verifies that events can be sent to a remote task.
diff --git a/c/src/tests/mptests/mp14/node1/mp14.scn b/c/src/tests/mptests/mp14/node1/mp14.scn
new file mode 100644
index 0000000000..f57c4f47b3
--- /dev/null
+++ b/c/src/tests/mptests/mp14/node1/mp14.scn
@@ -0,0 +1,41 @@
+*** TEST 14 -- NODE 1 ***
+Creating Semaphore (Global)
+Creating Message Queue (Global)
+Creating Partition (Global)
+Creating Event task (Global)
+Starting Event task (Global)
+Creating Semaphore task (Global)
+About to go to sleep!
+Starting Semaphore task (Global)
+Creating Message Queue task (Global)
+Getting SMID of semaphore
+Starting Message Queue task (Global)
+Creating Partition task (Global)
+Getting ID of msg queue
+Starting Partition task (Global)
+Getting ID of partition
+Waking up!
+Remote task's name is : 222
+Getting TID of remote task
+Sending events to remote task
+<stream of following characters>
+
+. - indicates 100 iterations of
+ tm_evafter of 1 tick and rtems_event_receive.
+
+e - indicates that 100
+ events have been sent to the remote task.
+
+m - indicates 100 iterations of
+ rtems_message_queue_send and rtems_message_queue_receive.
+
+p - indicates 100 iterations of
+ rtems_partition_get_buffer and rtems_partition_return_buffer.
+
+s - indicates 100 iterations of
+ rtems_semaphore_obtain and rtems_semaphore_release.
+
+NOTES: 1. The messages could be interspersed.
+ 2. If one of the nodes exits first, the other may report
+ timeout errors on blocking directives.
+
diff --git a/c/src/tests/mptests/mp14/node2/Makefile.in b/c/src/tests/mptests/mp14/node2/Makefile.in
new file mode 100644
index 0000000000..82e5a46a8d
--- /dev/null
+++ b/c/src/tests/mptests/mp14/node2/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+TEST=mp14
+PGM=${ARCH}/$(TEST)-node$(NODE).exe
+
+MANAGERS=io mp event partition semaphore timer message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=exit init delay evtask1 evtmtask pttask1 smtask1 msgtask1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/mptests/node$(NODE)/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/mptests/mp14/node2/mp14.doc b/c/src/tests/mptests/mp14/node2/mp14.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/mptests/mp14/node2/mp14.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/mptests/mp14/node2/mp14.scn b/c/src/tests/mptests/mp14/node2/mp14.scn
new file mode 100644
index 0000000000..d128c870e9
--- /dev/null
+++ b/c/src/tests/mptests/mp14/node2/mp14.scn
@@ -0,0 +1,38 @@
+*** TEST 14 -- NODE 2 ***
+Creating Event task (Global)
+Starting Event task (Global)
+Creating Semaphore task (Global)
+About to go to sleep!
+Starting Semaphore task (Global)
+Creating Message Queue task (Global)
+Getting SMID of semaphore
+Starting Message Queue task (Global)
+Creating Partition task (Global)
+Getting ID of msg queue
+Starting Partition task (Global)
+Getting ID of partition
+Waking up!
+Remote task's name is : 111
+Getting TID of remote task
+Receiving events from remote task
+<stream of following characters>
+
+. - indicates 100 iterations of
+ tm_evafter of 1 tick and rtems_event_receive.
+
+e - indicates that 100
+ events have been sent to the remote task.
+
+m - indicates 100 iterations of
+ rtems_message_queue_send and rtems_message_queue_receive.
+
+p - indicates 100 iterations of
+ rtems_partition_get_buffer and rtems_partition_return_buffer.
+
+s - indicates 100 iterations of
+ rtems_semaphore_obtain and rtems_semaphore_release.
+
+NOTES: 1. The messages could be interspersed.
+ 2. If one of the nodes exits first, the other may report
+ timeout errors on blocking directives.
+
diff --git a/c/src/tests/mptests/mp14/pttask1.c b/c/src/tests/mptests/mp14/pttask1.c
new file mode 100644
index 0000000000..f2ab42f0cd
--- /dev/null
+++ b/c/src/tests/mptests/mp14/pttask1.c
@@ -0,0 +1,71 @@
+/* Partition_task
+ *
+ * This task continuously gets a buffer from and returns that buffer
+ * to a global partition.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Partition_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+ rtems_unsigned32 yield_count;
+ void *buffer;
+
+ puts( "Getting ID of partition" );
+ while ( FOREVER ) {
+ status = rtems_partition_ident(
+ Partition_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Partition_id[ 1 ]
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+
+ puts( "rtems_partition_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ yield_count = 100;
+
+ while ( Stop_Test == FALSE ) {
+ for ( count=PARTITION_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer );
+ directive_failed( status, "rtems_partition_get_buffer" );
+
+ status = rtems_partition_return_buffer( Partition_id[ 1 ], buffer );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ if (Stop_Test == FALSE)
+ if ( Multiprocessing_configuration.node == 1 && --yield_count == 0 ) {
+ status = rtems_task_wake_after( 1 );
+ directive_failed( status, "rtems_task_wake_after" );
+ yield_count = 100;
+ }
+ }
+ put_dot( 'p' );
+ }
+
+ Exit_test();
+}
diff --git a/c/src/tests/mptests/mp14/smtask1.c b/c/src/tests/mptests/mp14/smtask1.c
new file mode 100644
index 0000000000..fbba4d8280
--- /dev/null
+++ b/c/src/tests/mptests/mp14/smtask1.c
@@ -0,0 +1,73 @@
+/* Sm_test_task
+ *
+ * This task continuously obtains and releases a global semaphore.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Semaphore_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+ rtems_unsigned32 yield_count;
+
+ puts( "Getting SMID of semaphore" );
+ while ( FOREVER ) {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+ puts( "rtems_semaphore_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ yield_count = 100;
+
+ while ( Stop_Test == FALSE ) {
+
+ for ( count=SEMAPHORE_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ if ( Stop_Test == FALSE )
+ if ( Multiprocessing_configuration.node == 1 && --yield_count == 0 ) {
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ yield_count = 100;
+ }
+ }
+ put_dot( 's' );
+ }
+
+ Exit_test();
+}
diff --git a/c/src/tests/mptests/mp14/system.h b/c/src/tests/mptests/mp14/system.h
new file mode 100644
index 0000000000..689614676f
--- /dev/null
+++ b/c/src/tests/mptests/mp14/system.h
@@ -0,0 +1,117 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id timer_id,
+ void *ignored_address
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_task Delayed_events_task(
+ rtems_task_argument argument
+);
+
+rtems_task Message_queue_task(
+ rtems_task_argument index
+);
+
+rtems_task Partition_task(
+ rtems_task_argument argument
+);
+
+rtems_task Semaphore_task(
+ rtems_task_argument argument
+);
+
+void Exit_test( void );
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 1
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(1)
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_TIMERS 12
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#elif ( NODE_NUMBER == 2 )
+#define CONFIGURE_MAXIMUM_TIMERS 2
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Event_task_id[ 2 ]; /* event task ids */
+
+TEST_EXTERN rtems_id Semaphore_task_id[ 2 ]; /* semaphore task ids */
+TEST_EXTERN rtems_name Semaphore_task_name[ 2 ]; /* semaphore task names */
+
+TEST_EXTERN rtems_id Queue_task_id[ 3 ]; /* message queue task ids */
+TEST_EXTERN rtems_name Queue_task_name[ 3 ]; /* message queue task names */
+
+TEST_EXTERN rtems_id Partition_task_id[ 4 ]; /* partition task ids */
+TEST_EXTERN rtems_name Partition_task_name[ 4 ]; /* partition task names */
+
+TEST_EXTERN rtems_id Partition_id[ 3 ]; /* partition ids */
+TEST_EXTERN rtems_name Partition_name[ 3 ]; /* partition names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 3 ]; /* semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 3 ]; /* semaphore names */
+
+TEST_EXTERN rtems_id Queue_id[ 3 ]; /* message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 3 ]; /* message queue names */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* remote event task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* remote event task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* event timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* event timer names */
+
+TEST_EXTERN rtems_unsigned32 Msg_buffer[ 4 ][ 4 ];
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+TEST_EXTERN rtems_id timer_id;
+
+#define EVENT_TASK_DOT_COUNT 100
+#define EVENT_SEND_DOT_COUNT 100
+#define DELAYED_EVENT_DOT_COUNT 1000
+#define MESSAGE_DOT_COUNT 200
+#define PARTITION_DOT_COUNT 200
+#define SEMAPHORE_DOT_COUNT 200
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/Makefile.in b/c/src/tests/psxtests/Makefile.in
new file mode 100644
index 0000000000..7ff5f4dd83
--- /dev/null
+++ b/c/src/tests/psxtests/Makefile.in
@@ -0,0 +1,15 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=support psxhdrs psx01 psx02 psx03 psx04 psx05 psx06 psx07 psx08 \
+ psx09 psx10 psx11 psx12
+
diff --git a/c/src/tests/psxtests/include/pmacros.h b/c/src/tests/psxtests/include/pmacros.h
new file mode 100644
index 0000000000..1f15dac9c0
--- /dev/null
+++ b/c/src/tests/psxtests/include/pmacros.h
@@ -0,0 +1,85 @@
+/*
+ * $Id$
+ */
+
+#ifndef __POSIX_TEST_MACROS_h
+#define __POSIX_TEST_MACROS_h
+
+#include <bsp.h>
+#include <pthread.h>
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+/*
+ * These help manipulate the "struct tm" form of time
+ */
+
+#define TM_SUNDAY 0
+#define TM_MONDAY 1
+#define TM_TUESDAY 2
+#define TM_WEDNESDAY 3
+#define TM_THURSDAY 4
+#define TM_FRIDAY 5
+#define TM_SATURDAY 6
+
+#define TM_JANUARY 0
+#define TM_FEBRUARY 1
+#define TM_MARCH 2
+#define TM_APRIL 3
+#define TM_MAY 4
+#define TM_JUNE 5
+#define TM_JULY 6
+#define TM_AUGUST 7
+#define TM_SEPTEMBER 8
+#define TM_OCTOBER 10
+#define TM_NOVEMBER 12
+#define TM_DECEMBER 12
+
+#define build_time( TM, WEEKDAY, MON, DAY, YR, HR, MIN, SEC ) \
+ { (TM)->tm_year = YR; \
+ (TM)->tm_mon = MON; \
+ (TM)->tm_mday = DAY; \
+ (TM)->tm_wday = WEEKDAY; \
+ (TM)->tm_hour = HR; \
+ (TM)->tm_min = MIN; \
+ (TM)->tm_sec = SEC; }
+
+#define set_time( WEEKDAY, MON, DAY, YR, HR, MIN, SEC ) \
+ do { \
+ struct tm tm; \
+ struct timespec tv; \
+ int status; \
+ \
+ build_time( &tm, WEEKDAY, MON, DAY, YR, HR, MIN, SEC ); \
+ \
+ tv.tv_sec = mktime( &tm ); \
+ tv.tv_nsec = 0; \
+ assert( tv.tv_sec != -1 ); \
+ \
+ status = clock_settime( CLOCK_REALTIME, &tv ); \
+ assert( !status ); \
+ } while ( 0 )
+
+#define print_current_time(s1, s2) \
+ do { \
+ char _buffer[32]; \
+ int _status; \
+ struct timespec _tv; \
+ \
+ _status = clock_gettime( CLOCK_REALTIME, &_tv ); \
+ assert( !_status ); \
+ \
+ (void) ctime_r( &_tv.tv_sec, _buffer ); \
+ _buffer[ strlen( _buffer ) - 1 ] = 0; \
+ printf( "%s%s%s\n", s1, _buffer, s2 ); \
+ fflush(stdout); \
+ } while ( 0 )
+
+#define empty_line() puts( "" )
+
+#endif
+
+/* end of file */
diff --git a/c/src/tests/psxtests/psx01/Makefile.in b/c/src/tests/psxtests/psx01/Makefile.in
new file mode 100644
index 0000000000..ccea784217
--- /dev/null
+++ b/c/src/tests/psxtests/psx01/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx01
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx01/init.c b/c/src/tests/psxtests/psx01/init.c
new file mode 100644
index 0000000000..848d130fb2
--- /dev/null
+++ b/c/src/tests/psxtests/psx01/init.c
@@ -0,0 +1,225 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <sched.h>
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ struct timespec tv;
+ struct timespec tr;
+ int status;
+ int priority;
+ pthread_t thread_id;
+ time_t seconds;
+ time_t seconds1;
+ time_t remaining;
+ struct tm tm;
+
+ puts( "\n\n*** POSIX TEST 1 ***" );
+
+ build_time( &tm, TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* error cases in clock_gettime and clock_settime */
+
+ puts( "Init: clock_gettime - EINVAL (invalid clockid)" );
+ status = clock_settime( -1, &tv );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ puts( "Init: clock_settime - EINVAL (invalid clockid)" );
+ status = clock_settime( -1, &tv );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ /* exercise clock_getres */
+
+ puts( "Init: clock_getres - EINVAL (invalid clockid)" );
+ status = clock_getres( -1, &tv );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ puts( "Init: clock_getres - EINVAL (NULL resolution)" );
+ status = clock_getres( CLOCK_REALTIME, NULL );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ puts( "Init: clock_getres - SUCCESSFUL" );
+ status = clock_getres( CLOCK_REALTIME, &tv );
+ printf( "Init: resolution = sec (%ld), nsec (%ld)\n", tv.tv_sec, tv.tv_nsec );
+ assert( !status );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ tv.tv_sec = mktime( &tm );
+ assert( tv.tv_sec != -1 );
+
+ tv.tv_nsec = 0;
+
+ /* now set the time of day */
+
+ empty_line();
+
+ printf( asctime( &tm ) );
+ puts( "Init: clock_settime - SUCCESSFUL" );
+ status = clock_settime( CLOCK_REALTIME, &tv );
+ assert( !status );
+
+ printf( asctime( &tm ) );
+ printf( ctime( &tv.tv_sec ) );
+
+ /* use sleep to delay */
+
+ remaining = sleep( 3 );
+ assert( !remaining );
+
+ /* print new times to make sure it has changed and we can get the realtime */
+
+ status = clock_gettime( CLOCK_REALTIME, &tv );
+ assert( !status );
+
+ printf( ctime( &tv.tv_sec ) );
+
+ seconds = time( NULL );
+ printf( ctime( &seconds ) );
+
+ /* just to have the value copied out through the parameter */
+
+ seconds = time( &seconds1 );
+ assert( seconds == seconds1 );
+
+ /* check the time remaining */
+
+ printf( "Init: seconds remaining (%d)\n", (int)remaining );
+ assert( !remaining );
+
+ /* error cases in nanosleep */
+
+ empty_line();
+ puts( "Init: nanosleep - EINVAL (NULL time)" );
+ status = nanosleep ( NULL, &tr );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ tv.tv_sec = 0;
+ tv.tv_nsec = TOD_NANOSECONDS_PER_SECOND * 2;
+ puts( "Init: nanosleep - EINVAL (too many nanoseconds)" );
+ status = nanosleep ( &tv, &tr );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ /* this is actually a small delay or yield */
+ tv.tv_sec = -1;
+ tv.tv_nsec = 0;
+ puts( "Init: nanosleep - negative seconds small delay " );
+ status = nanosleep ( &tv, &tr );
+ assert( !status );
+
+ /* use nanosleep to yield */
+
+ tv.tv_sec = 0;
+ tv.tv_nsec = 0;
+
+ puts( "Init: nanosleep - yield" );
+ status = nanosleep ( &tv, &tr );
+ assert( !status );
+ assert( !tr.tv_sec );
+ assert( !tr.tv_nsec );
+
+ /* use nanosleep to delay */
+
+ tv.tv_sec = 3;
+ tv.tv_nsec = 500000;
+
+ puts( "Init: nanosleep - 3.05 seconds" );
+ status = nanosleep ( &tv, &tr );
+ assert( !status );
+
+ /* print the current real time again */
+
+ status = clock_gettime( CLOCK_REALTIME, &tv );
+ assert( !status );
+
+ printf( ctime( &tv.tv_sec ) );
+
+ /* check the time remaining */
+
+ printf( "Init: sec (%ld), nsec (%ld) remaining\n", tr.tv_sec, tr.tv_nsec );
+ assert( !tr.tv_sec && !tr.tv_nsec );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init: ID is 0x%08x\n", Init_id );
+
+ /* exercise get minimum priority */
+
+ priority = sched_get_priority_min( SCHED_FIFO );
+ printf( "Init: sched_get_priority_min (SCHED_FIFO) -- %d\n", priority );
+ assert( priority != -1 );
+
+ puts( "Init: sched_get_priority_min -- EINVAL (invalid policy)" );
+ priority = sched_get_priority_min( -1 );
+ assert( priority == -1 );
+ assert( errno == EINVAL );
+
+ /* exercise get maximum priority */
+
+ priority = sched_get_priority_max( SCHED_FIFO );
+ printf( "Init: sched_get_priority_max (SCHED_FIFO) -- %d\n", priority );
+ assert( priority != -1 );
+
+ puts( "Init: sched_get_priority_min -- EINVAL (invalid policy)" );
+ priority = sched_get_priority_min( -1 );
+ assert( priority == -1 );
+ assert( errno == EINVAL );
+
+ /* print the round robin time quantum */
+
+ status = sched_rr_get_interval( getpid(), &tr );
+ printf(
+ "Init: Round Robin quantum is %ld seconds, %ld nanoseconds\n",
+ tr.tv_sec,
+ tr.tv_nsec
+ );
+ assert( !status );
+
+ /* create a thread */
+
+ puts( "Init: pthread_create - SUCCESSFUL" );
+ status = pthread_create( &thread_id, NULL, Task_1_through_3, NULL );
+ assert( !status );
+
+ /* too may threads error */
+
+ puts( "Init: pthread_create - EAGAIN (too many threads)" );
+ status = pthread_create( &thread_id, NULL, Task_1_through_3, NULL );
+ assert( status == EAGAIN );
+
+ puts( "Init: sched_yield to Task_1" );
+ status = sched_yield();
+ assert( !status );
+
+ /* switch to Task_1 */
+
+ /* exit this thread */
+
+ puts( "Init: pthread_exit" );
+ pthread_exit( NULL );
+
+ /* switch to Task_1 */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx01/psx01.scn b/c/src/tests/psxtests/psx01/psx01.scn
new file mode 100644
index 0000000000..8f563dd26c
--- /dev/null
+++ b/c/src/tests/psxtests/psx01/psx01.scn
@@ -0,0 +1,46 @@
+*** POSIX TEST 1 ***
+Init: clock_gettime - EINVAL (invalid clockid)
+Init: clock_settime - EINVAL (invalid clockid)
+Init: clock_getres - EINVAL (invalid clockid)
+Init: clock_getres - EINVAL (NULL resolution)
+Init: clock_getres - SUCCESSFUL
+Init: resolution = sec (100), nsec (0)
+
+Fri May 24 11:05:00 1996
+Init: clock_settime - SUCCESSFUL
+Fri May 24 11:05:00 1996
+Fri May 24 11:05:00 1996
+Fri May 24 11:05:03 1996
+Fri May 24 11:05:03 1996
+Init: seconds remaining (0)
+
+Init: nanosleep - EINVAL (NULL time)
+Init: nanosleep - EAGAIN (negative seconds)
+Init: nanosleep - EINVAL (too many nanoseconds)
+Init: nanosleep - yield
+Init: nanosleep - 3.05 seconds
+Fri May 24 11:05:06 1996
+Init: sec (0), nsec (0) remaining
+Init: ID is 0x0c010001
+Init: sched_get_priority_min (SCHED_FIFO) -- 1
+Init: sched_get_priority_min -- EINVAL (invalid policy)
+Init: sched_get_priority_max (SCHED_FIFO) -- 254
+Init: sched_get_priority_min -- EINVAL (invalid policy)
+Init: Round Robin quantum is 0 seconds, 500000000 nanoseconds
+Init: pthread_create - SUCCESSFUL
+Init: pthread_create - EAGAIN (too many threads)
+Init: sched_yield to Task_1
+Task_1: sched_yield to Init
+Init: pthread_exit
+
+Task_1: ID is 0x0c010002
+Task_1: pthread_equal - match case passed
+Task_1: pthread_equal - different case passed
+Task_1: pthread_equal - first id bad
+Task_1: pthread_equal - second id bad
+Task_1: pthread_once - EINVAL (NULL once_control)
+Task_1: pthread_once - EINVAL (NULL init_routine)
+Task_1: pthread_once - SUCCESSFUL (init_routine executes)
+Test_init_routine: invoked
+Task_1: pthread_once - SUCCESSFUL (init_routine does not execute)
+*** END OF POSIX TEST 1 ***
diff --git a/c/src/tests/psxtests/psx01/system.h b/c/src/tests/psxtests/psx01/system.h
new file mode 100644
index 0000000000..08be4fecd5
--- /dev/null
+++ b/c/src/tests/psxtests/psx01/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sched.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1_through_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx01/task.c b/c/src/tests/psxtests/psx01/task.c
new file mode 100644
index 0000000000..13ce3bb67a
--- /dev/null
+++ b/c/src/tests/psxtests/psx01/task.c
@@ -0,0 +1,94 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Test_init_routine( void )
+{
+ puts( "Test_init_routine: invoked" );
+}
+
+
+void *Task_1_through_3(
+ void *argument
+)
+{
+ int status;
+ pthread_once_t once = PTHREAD_ONCE_INIT;
+
+ puts( "Task_1: sched_yield to Init" );
+ status = sched_yield();
+ assert( !status );
+
+ /* switch to Task_1 */
+
+ /* now do some real testing */
+
+ empty_line();
+
+ /* get id of this thread */
+
+ Task_id = pthread_self();
+ printf( "Task_1: ID is 0x%08x\n", Task_id );
+
+ /* exercise pthread_equal */
+
+ status = pthread_equal( Task_id, Task_id );
+ if ( status )
+ puts( "Task_1: pthread_equal - match case passed" );
+ assert( status );
+
+ status = pthread_equal( Init_id, Task_id );
+ if ( !status )
+ puts( "Task_1: pthread_equal - different case passed" );
+ assert( !status );
+
+ puts( "Task_1: pthread_equal - first id bad" );
+ status = pthread_equal( -1, Task_id );
+ assert( !status );
+
+ puts( "Task_1: pthread_equal - second id bad" );
+ status = pthread_equal( Init_id, -1 );
+ assert( !status );
+
+ /* exercise pthread_once */
+
+ puts( "Task_1: pthread_once - EINVAL (NULL once_control)" );
+ status = pthread_once( NULL, Test_init_routine );
+ assert( status == EINVAL );
+
+ puts( "Task_1: pthread_once - EINVAL (NULL init_routine)" );
+ status = pthread_once( &once, NULL );
+ assert( status == EINVAL );
+
+ puts( "Task_1: pthread_once - SUCCESSFUL (init_routine executes)" );
+ status = pthread_once( &once, Test_init_routine );
+ assert( !status );
+
+ puts( "Task_1: pthread_once - SUCCESSFUL (init_routine does not execute)" );
+ status = pthread_once( &once, Test_init_routine );
+ assert( !status );
+
+ puts( "*** END OF POSIX TEST 1 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx02/Makefile.in b/c/src/tests/psxtests/psx02/Makefile.in
new file mode 100644
index 0000000000..f21ed68dca
--- /dev/null
+++ b/c/src/tests/psxtests/psx02/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx02
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx02/init.c b/c/src/tests/psxtests/psx02/init.c
new file mode 100644
index 0000000000..14a850fca4
--- /dev/null
+++ b/c/src/tests/psxtests/psx02/init.c
@@ -0,0 +1,146 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <signal.h>
+
+volatile int Signal_occurred;
+volatile int Signal_count;
+
+void Signal_handler(
+ int signo
+)
+{
+ Signal_count++;
+ printf(
+ "Signal: %d caught by 0x%x (%d)\n",
+ signo,
+ pthread_self(),
+ Signal_count
+ );
+ Signal_occurred = 1;
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct timespec tv;
+ struct timespec tr;
+ struct sigaction act;
+ sigset_t mask;
+ sigset_t pending_set;
+
+ puts( "\n\n*** POSIX TEST 2 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* install a signal handler */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* simple signal to self */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ Signal_occurred = 0;
+
+ /* now block the signal, send it, see if it is pending, and unblock it */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Init: Block SIGUSR1\n" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+
+ printf( "Init: send SIGUSR1 to self\n" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ printf( "Init: Unblock SIGUSR1\n" );
+ status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
+ assert( !status );
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_1_through_3, NULL );
+ assert( !status );
+
+ /*
+ * Loop for 5 seconds seeing how many signals we catch
+ */
+
+ tr.tv_sec = 5;
+ tr.tv_nsec = 0;
+
+ do {
+ tv = tr;
+
+ Signal_occurred = 0;
+
+ status = nanosleep ( &tv, &tr );
+
+ if ( status == -1 ) {
+ assert( errno == EINTR );
+ assert( tr.tv_nsec || tr.tv_sec );
+ } else if ( !status ) {
+ assert( !tr.tv_nsec && !tr.tv_sec );
+ }
+
+ printf(
+ "Init: signal was %sprocessed with %d:%d time remaining\n",
+ (Signal_occurred) ? "" : "not ",
+ (int) tr.tv_sec,
+ (int) tr.tv_nsec
+ );
+
+ } while ( tr.tv_sec || tr.tv_nsec );
+
+ /* exit this thread */
+
+ puts( "*** END OF POSIX TEST 2 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx02/psx02.scn b/c/src/tests/psxtests/psx02/psx02.scn
new file mode 100644
index 0000000000..3b0d373b16
--- /dev/null
+++ b/c/src/tests/psxtests/psx02/psx02.scn
@@ -0,0 +1,26 @@
+*** POSIX TEST 2 ***
+Init's ID is 0x0c010001
+Signal: 16 caught by 0xc010001 (1)
+Init: Block SIGUSR1
+Init: Signals pending 0x00000000
+Init: send SIGUSR1 to self
+Init: Signals pending 0x00008000
+Init: Unblock SIGUSR1
+Signal: 16 caught by 0xc010001 (2)
+Task1: Fri May 24 11:05:00 1996
+Signal: 16 caught by 0xc010001 (3)
+Init: signal was processed with 5:0 time remaining
+Task1: Fri May 24 11:05:01 1996
+Signal: 16 caught by 0xc010001 (4)
+Init: signal was processed with 3:990000000 time remaining
+Task1: Fri May 24 11:05:02 1996
+Signal: 16 caught by 0xc010001 (5)
+Init: signal was processed with 2:980000000 time remaining
+Task1: Fri May 24 11:05:03 1996
+Signal: 16 caught by 0xc010001 (6)
+Init: signal was processed with 1:970000000 time remaining
+Task1: Fri May 24 11:05:04 1996
+Signal: 16 caught by 0xc010001 (7)
+Init: signal was processed with 0:960000000 time remaining
+Init: signal was not processed with 0:0 time remaining
+*** END OF POSIX TEST 2 ***
diff --git a/c/src/tests/psxtests/psx02/system.h b/c/src/tests/psxtests/psx02/system.h
new file mode 100644
index 0000000000..2f9aaac4c7
--- /dev/null
+++ b/c/src/tests/psxtests/psx02/system.h
@@ -0,0 +1,52 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1_through_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx02/task.c b/c/src/tests/psxtests/psx02/task.c
new file mode 100644
index 0000000000..1b86d61f84
--- /dev/null
+++ b/c/src/tests/psxtests/psx02/task.c
@@ -0,0 +1,45 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_1_through_3(
+ void *argument
+)
+{
+ int seconds;
+ int i;
+ int status;
+
+ for ( i=0 ; i<5 ; i++ ) {
+ print_current_time( "Task1: ", "" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ seconds = sleep( 1 );
+ assert( !seconds );
+ }
+ puts( "*** END OF POSIX TEST 2 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx03/Makefile.in b/c/src/tests/psxtests/psx03/Makefile.in
new file mode 100644
index 0000000000..706846c1c4
--- /dev/null
+++ b/c/src/tests/psxtests/psx03/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx03
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx03/init.c b/c/src/tests/psxtests/psx03/init.c
new file mode 100644
index 0000000000..1dab1c7558
--- /dev/null
+++ b/c/src/tests/psxtests/psx03/init.c
@@ -0,0 +1,176 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <signal.h>
+#include <errno.h>
+
+volatile int Signal_occurred;
+volatile int Signal_count;
+
+void Signal_handler(
+ int signo
+)
+{
+ Signal_count++;
+ printf(
+ "Signal: %d caught by 0x%x (%d)\n",
+ signo,
+ pthread_self(),
+ Signal_count
+ );
+ Signal_occurred = 1;
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct timespec timeout;
+ struct sigaction act;
+ sigset_t mask;
+ sigset_t waitset;
+ int signo;
+ siginfo_t siginfo;
+
+ puts( "\n\n*** POSIX TEST 3 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* install a signal handler */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* initialize signal handler variables */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ /*
+ * wait on SIGUSR1 for 3 seconds, will timeout
+ */
+
+ /* initialize the signal set we will wait for to SIGUSR1 */
+
+ status = sigemptyset( &waitset );
+ assert( !status );
+
+ status = sigaddset( &waitset, SIGUSR1 );
+ assert( !status );
+
+ timeout.tv_sec = 3;
+ timeout.tv_nsec = 0;
+
+ puts( "Init: waiting on any signal for 3 seconds." );
+ signo = sigtimedwait( &waitset, &siginfo, &timeout );
+ assert( signo == -1 );
+
+ if ( errno == EAGAIN )
+ puts( "Init: correctly timed out waiting for SIGUSR1." );
+ else
+ printf( "sigtimedwait returned wrong errno - %d\n", errno );
+
+ Signal_occurred = 0;
+
+ /*
+ * wait on SIGUSR1 for 3 seconds, will timeout because Task_1 sends SIGUSR2
+ */
+
+ empty_line();
+
+ /* initialize a mask to block SIGUSR2 */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR2 );
+ assert( !status );
+
+ printf( "Init: Block SIGUSR2\n" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ /* signal handler is still installed, waitset is still set for SIGUSR1 */
+
+ timeout.tv_sec = 3;
+ timeout.tv_nsec = 0;
+
+ puts( "Init: waiting on any signal for 3 seconds." );
+ signo = sigtimedwait( &waitset, &siginfo, &timeout );
+
+ /* switch to Task 1 */
+
+ if ( errno == EAGAIN )
+ puts( "Init: correctly timed out waiting for SIGUSR1." );
+ else
+ printf( "sigtimedwait returned wrong errno - %d\n", errno );
+ assert( signo == -1 );
+
+ /*
+ * wait on SIGUSR1 for 3 seconds, Task_2 will send it to us
+ */
+
+ empty_line();
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ /* signal handler is still installed, waitset is still set for SIGUSR1 */
+
+ /* wait on SIGUSR1 for 3 seconds, will receive SIGUSR1 from Task_2 */
+
+ timeout.tv_sec = 3;
+ timeout.tv_nsec = 0;
+
+ /* just so we can check that these were altered */
+
+ siginfo.si_code = -1;
+ siginfo.si_signo = -1;
+ siginfo.si_value.sival_int = -1;
+
+ puts( "Init: waiting on any signal for 3 seconds." );
+ signo = sigtimedwait( &waitset, &siginfo, &timeout );
+ printf( "Init: received (%d) SIGUSR1=%d\n", siginfo.si_signo, SIGUSR1 );
+ assert( signo == SIGUSR1 );
+ assert( siginfo.si_signo == SIGUSR1 );
+ assert( siginfo.si_code == SI_USER );
+ assert( siginfo.si_value.sival_int != -1 ); /* rtems does always set this */
+
+ /* exit this thread */
+
+ puts( "*** END OF POSIX TEST 3 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx03/psx03.scn b/c/src/tests/psxtests/psx03/psx03.scn
new file mode 100644
index 0000000000..61ba36592a
--- /dev/null
+++ b/c/src/tests/psxtests/psx03/psx03.scn
@@ -0,0 +1,17 @@
+*** POSIX TEST 3 ***
+Init's ID is 0x0c010001
+Init: waiting on any signal for 3 seconds.
+Init: correctly timed out waiting for SIGUSR1.
+
+Init: Block SIGUSR2
+Init: waiting on any signal for 3 seconds.
+Task_1: Fri May 24 11:05:03 1996
+Task_1: pthread_kill - SIGUSR2 to Init
+Init: correctly timed out waiting for SIGUSR1.
+
+Init: waiting on any signal for 3 seconds.
+Task_2: Fri May 24 11:05:06 1996
+Task_1: pthread_kill - SIGUSR1 to Init
+Signal: 16 caught by 0xc010001 (1)
+Init: received (16) SIGUSR1=16
+*** END OF POSIX TEST 3 ***
diff --git a/c/src/tests/psxtests/psx03/system.h b/c/src/tests/psxtests/psx03/system.h
new file mode 100644
index 0000000000..b5f82b7817
--- /dev/null
+++ b/c/src/tests/psxtests/psx03/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx03/task.c b/c/src/tests/psxtests/psx03/task.c
new file mode 100644
index 0000000000..c35f958315
--- /dev/null
+++ b/c/src/tests/psxtests/psx03/task.c
@@ -0,0 +1,65 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+
+ /* send SIGUSR2 to Init which is waiting on SIGUSR1 */
+
+ print_current_time( "Task_1: ", "" );
+
+ puts( "Task_1: pthread_kill - SIGUSR2 to Init" );
+ status = pthread_kill( Init_id, SIGUSR2 );
+ assert( !status );
+
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ /* send SIGUSR1 to Init which is waiting on SIGUSR1 */
+
+ print_current_time( "Task_2: ", "" );
+
+ puts( "Task_1: pthread_kill - SIGUSR1 to Init" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx04/Makefile.in b/c/src/tests/psxtests/psx04/Makefile.in
new file mode 100644
index 0000000000..9a6fe56590
--- /dev/null
+++ b/c/src/tests/psxtests/psx04/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx04
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx04/init.c b/c/src/tests/psxtests/psx04/init.c
new file mode 100644
index 0000000000..6d87afad55
--- /dev/null
+++ b/c/src/tests/psxtests/psx04/init.c
@@ -0,0 +1,564 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <signal.h>
+#include <errno.h>
+
+volatile int Signal_occurred;
+volatile int Signal_count;
+
+void Signal_handler(
+ int signo
+)
+{
+ Signal_count++;
+ printf(
+ "Signal: %d caught by 0x%x (%d)\n",
+ signo,
+ pthread_self(),
+ Signal_count
+ );
+ Signal_occurred = 1;
+}
+
+void Signal_info_handler(
+ int signo,
+ siginfo_t *info,
+ void *context
+)
+{
+ Signal_count++;
+ printf(
+ "Signal_info: %d caught by 0x%x (%d) si_signo= %d si_code= %d value= %d\n",
+ signo,
+ pthread_self(),
+ Signal_count,
+ info->si_signo,
+ info->si_code,
+ info->si_value.sival_int
+ );
+ Signal_occurred = 1;
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct sigaction act;
+ sigset_t mask;
+ sigset_t pending_set;
+ sigset_t oset;
+ struct timespec timeout;
+ siginfo_t info;
+
+ puts( "\n\n*** POSIX TEST 4 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+/* install a signal handler for SIGUSR1 */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+ printf( "Init: sigemptyset - set= 0x%08x\n", act.sa_mask );
+
+ /* test sigfillset following the above sigemptyset */
+
+ status = sigfillset( &act.sa_mask );
+ assert( !status );
+ printf( "Init: sigfillset - set= 0x%08x\n", act.sa_mask );
+
+ /* test sigdelset */
+
+ status = sigdelset( &act.sa_mask, SIGUSR1 );
+ assert( !status );
+ printf( "Init: sigdelset - delete SIGUSR1 set= 0x%08x\n", act.sa_mask );
+
+ /* test sigismember - FALSE */
+
+ status = sigismember( &act.sa_mask, SIGUSR1 );
+ assert( !status );
+ puts( "Init: sigismember - FALSE since SIGUSR1 is not a member" );
+
+ /* test sigismember - TRUE */
+
+ status = sigismember( &act.sa_mask, SIGUSR2 );
+ assert( status );
+ puts( "Init: sigismember - TRUE since SIGUSR2 is a member" );
+
+ /* return the set to empty */
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* simple signal to process */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+/* end of install a signal handler for SIGUSR1 */
+
+ Signal_occurred = 0;
+
+ /* now block the signal, send it, see if it is pending, and unblock it */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* simple signal to process */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ Signal_occurred = 0;
+
+ /* now block the signal, send it, see if it is pending, and unblock it */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: Unblock SIGUSR1" );
+ status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
+ assert( !status );
+
+ /* now let another task get interrupted by a signal */
+
+ empty_line();
+
+ puts( "Init: create a thread interested in SIGUSR1" );
+ status = pthread_create( &Task1_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: sleep so the other task can block" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: sleep so the other task can catch signal" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ /* test alarm */
+
+ empty_line();
+
+ /* install a signal handler for SIGALRM and unblock it */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGALRM, &act, NULL );
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGALRM );
+ assert( !status );
+
+ puts( "Init: Unblock SIGALRM" );
+ status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
+ assert( !status );
+
+ /* schedule the alarm */
+
+ puts( "Init: Firing alarm in 5 seconds" );
+ status = alarm( 5 );
+ printf( "Init: %d seconds left on previous alarm\n", status );
+ assert( !status );
+
+ puts( "Init: Firing alarm in 2 seconds" );
+ status = alarm( 2 );
+ printf( "Init: %d seconds left on previous alarm\n", status );
+ assert( status );
+
+ puts( "Init: Wait 4 seconds for alarm" );
+ status = sleep( 4 );
+ printf( "Init: %d seconds left in sleep\n", status );
+ assert( status );
+
+ /* test SIG_SETMASK case and returning oset of pthread_sigmask */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR2 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1 and SIGUSR2 only" );
+ status = pthread_sigmask( SIG_SETMASK, &mask, &oset );
+ printf( "Init: Previous blocked set was 0x%08x\n", oset );
+ assert( !status );
+
+ /* test inquiry about current blocked set with pthread_sigmask */
+
+ status = pthread_sigmask( 0, NULL, &oset );
+ printf( "Init: Current blocked set is 0x%08x\n", oset );
+ assert( !status );
+
+ /* return blocked mask to no signals blocked */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ puts( "Init: Unblock all signals" );
+ status = pthread_sigmask( SIG_SETMASK, &mask, &oset );
+ printf( "Init: Previous blocked set was 0x%08x\n", oset );
+ assert( !status );
+
+ /* test sigsuspend */
+
+ empty_line();
+
+ puts( "Init: create a thread to send Init SIGUSR1" );
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ puts( "Init: sigsuspend for any signal" );
+ status = sigsuspend( &mask );
+ assert( status );
+ printf( "Init: awakended from sigsuspend status=%08d \n", status );
+
+ /* test a SIGINFO case, these are signals sent to a process only */
+
+ empty_line();
+
+ puts( "Init: create a thread to sent Process SIGUSR1 with SA_SIGINFO" );
+ status = pthread_create( &Task3_id, NULL, Task_3, NULL );
+ assert( !status );
+
+ /* set action on SIGUSR1 to an info case */
+ act.sa_handler = Signal_handler;
+ act.sa_flags = SA_SIGINFO;
+ act.sa_sigaction = Signal_info_handler;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ puts( "Init: sleep so the Task_3 can sigqueue SIGUSR1" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ puts( "Init: sigqueue occurred" );
+
+ /* Send SIGUSR1, Task_3 has issued a sigwaitinfo */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: sleep so the Task_3 can receive SIGUSR1" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* Send SIGUSR1, Task_3 has issued a sigwait */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: sleep so the Task_3 can receive SIGUSR1" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* Send SIGUSR1, Task_3 has issued a sigwaitinfo */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR2 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR2" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ puts( "Init: send SIGUSR2 to process" );
+ status = kill( getpid(), SIGUSR2 );
+ assert( !status );
+
+ puts( "Init: sleep so the Task_3 can receive SIGUSR2" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* Suspend for signal that has already be sent */
+
+ puts( "Init: sigsuspend for any signal" );
+ status = sigsuspend( &mask );
+ assert( status );
+ printf( "Init: awakended from sigsuspend status=%d \n", status );
+
+ /* generate error cases for psignal */
+
+ empty_line();
+
+ status = sigemptyset( NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigemptyset - EINVAL (set invalid)" );
+
+ status = sigfillset( NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigfillset - EINVAL (set invalid)" );
+
+ status = sigaddset( NULL, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaddset - EINVAL (set invalid)" );
+
+ status = sigaddset( &mask, 0 );
+ assert( !status );
+ puts( "Init: sigaddset - SUCCESSFUL (signal = 0)" );
+
+ status = sigaddset( &mask, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaddset - EINVAL (set invalid)" );
+
+ status = sigdelset( NULL, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigdelset - EINVAL (set invalid)" );
+
+ status = sigdelset( &mask, 0 );
+ assert( !status );
+ puts( "Init: sigdelset - SUCCESSFUL (signal = 0)" );
+
+ status = sigdelset( &mask, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigdelset - EINVAL (set invalid)" );
+
+ status = sigismember( NULL, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigismember - EINVAL (set invalid)" );
+
+ status = sigismember( &mask, 0 );
+ assert( !status );
+ puts( "Init: sigismember - SUCCESSFUL (signal = 0)" );
+
+ status = sigismember( &mask, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigismember - EINVAL (signal invalid)" );
+
+ status = sigaction( 0, &act, 0 );
+ assert( !status );
+ puts( "Init: sigaction - SUCCESSFUL (signal = 0)" );
+
+ status = sigaction( 999, &act, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaction - EINVAL (signal invalid)" );
+
+ status = sigaction( SIGKILL, &act, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaction - EINVAL (SIGKILL)" );
+
+ status = pthread_sigmask( SIG_BLOCK, NULL, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (set and oset invalid)" );
+
+ status = pthread_sigmask( 999, &pending_set, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (how invalid)" );
+
+ status = sigpending( NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigpending - EINVAL (set invalid)" );
+
+ timeout.tv_nsec = -1;
+ status = sigtimedwait( &mask, &info, &timeout );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (timout->nsec invalid < 0)" );
+
+ timeout.tv_nsec = 0x7fffffff;
+ status = sigtimedwait( &mask, &info, &timeout );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (timout->nsec invalid to large)" );
+
+ status = pthread_kill( Init_id, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_kill - EINVAL (sig invalid)" );
+
+ status = pthread_kill( 0, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == ENOSYS );
+ puts( "Init: pthread_kill - ENOSYS (signal SA_SIGINFO)" );
+
+ status = pthread_kill( 0, SIGUSR2 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == ESRCH );
+ puts( "Init: pthread_kill - ESRCH (signal SA_SIGINFO)" );
+
+ status = pthread_kill( Init_id, 0 );
+ assert( !status );
+ puts( "Init: pthread_kill - SUCCESSFUL (signal = 0)" );
+
+ act.sa_handler = SIG_IGN;
+ act.sa_flags = 0;
+ sigaction( SIGUSR2, &act, NULL );
+ status = pthread_kill( Init_id, SIGUSR2 );
+ assert( !status );
+ puts( "Init: pthread_kill - SUCCESSFUL (signal = SIG_IGN)" );
+
+ status = kill( 0x7fffffff, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == ESRCH );
+ puts( "Init: kill - ESRCH (pid invalid)" );
+
+ status = kill( getpid(), 0 );
+ assert( !status );
+ puts( "Init: kill - SUCCESSFUL (signal = 0)" );
+
+ status = kill( getpid(), 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: kill - EINVAL (sig invalid)" );
+
+ /* exit this thread */
+
+ puts( "*** END OF POSIX TEST 4 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx04/psx04.scn b/c/src/tests/psxtests/psx04/psx04.scn
new file mode 100644
index 0000000000..83237ec768
--- /dev/null
+++ b/c/src/tests/psxtests/psx04/psx04.scn
@@ -0,0 +1,112 @@
+*** POSIX TEST 4 ***
+Init's ID is 0x0c010001
+Init: sigemptyset - set= 0x00000000
+Init: sigfillset - set= 0xffffffff
+Init: sigdelset - delete SIGUSR1 set= 0xffff7fff
+Init: sigismember - FALSE since SIGUSR1 is not a member
+Init: sigismember - TRUE since SIGUSR2 is a member
+Init: send SIGUSR1 to process
+Signal: 16 caught by 0xc010001 (1)
+
+Init: Block SIGUSR1
+Init: send SIGUSR1 to process
+Signal: 16 caught by 0xc010001 (1)
+
+Init: Block SIGUSR1
+Init: Signals pending 0x00000000
+Init: send SIGUSR1 to process
+Init: Signals pending 0x00008000
+Init: Unblock SIGUSR1
+Signal: 16 caught by 0xc010001 (2)
+
+Init: create a thread interested in SIGUSR1
+Init: Block SIGUSR1
+Init: Signals pending 0x00000000
+Init: sleep so the other task can block
+Task_1: sleeping for 5 seconds
+Init: send SIGUSR1 to process
+Init: Signals pending 0x00008000
+Init: sleep so the other task can catch signal
+Signal: 16 caught by 0xc010002 (3)
+Task_1: 4 seconds left
+Task_1: exit
+
+Init: Unblock SIGALRM
+Init: Firing alarm in 5 seconds
+Init: 0 seconds left on previous alarm
+Init: Firing alarm in 2 seconds
+Init: 4 seconds left on previous alarm
+Init: Wait 4 seconds for alarm
+Signal: 14 caught by 0xc010001 (4)
+Init: 2 seconds left in sleep
+
+Init: Block SIGUSR1 and SIGUSR2 only
+Init: Previous blocked set was 0x00008000
+Init: Current blocked set is 0x00018000
+Init: Unblock all signals
+Init: Previous blocked set was 0x00018000
+
+Init: create a thread to send Init SIGUSR1
+Init: sigsuspend for any signal
+Task_2: sending SIGUSR1
+Task_2: exit
+Signal: 16 caught by 0xc010001 (5)
+Init: awakended from sigsuspend status=00000016
+
+Init: create a thread to sent Process SIGUSR1 with SA_SIGINFO
+Init: sleep so the Task_3 can sigqueue SIGUSR1
+Task_3: sigqueue SIGUSR1 with value= 16
+Signal_info: 16 caught by 0xc010004 (6) si_signo= 16 si_code= 1 value= 16
+
+Task_3: sigwaitinfo SIGUSR1 with value= 16
+Init: sigqueue occurred
+Init: Block SIGUSR1
+Init: send SIGUSR1 to process
+Init: sleep so the Task_3 can receive SIGUSR1
+Task_3: si_signo= 16 si_code= 1 value= 0
+
+Task_3: sigwait SIGUSR1
+Init: Block SIGUSR1
+Init: send SIGUSR1 to process
+Init: sleep so the Task_3 can receive SIGUSR1
+Task_3: signo= 16
+
+Task_3: pause
+Init: Block SIGUSR2
+Init: send SIGUSR2 to process
+Init: sleep so the Task_3 can receive SIGUSR2
+Task_3: pause= 17
+
+Task_3: sending SIGUSR2
+Task_3: sleep so the Init task can reguest a signal
+Init: sigsuspend for any signal
+Init: awakended from sigsuspend status=17
+
+Init: sigemptyset - EINVAL (set invalid)
+Init: sigfillset - EINVAL (set invalid)
+Init: sigaddset - EINVAL (set invalid)
+Init: sigaddset - SUCCESSFUL (signal = 0)
+Init: sigaddset - EINVAL (set invalid)
+Init: sigdelset - EINVAL (set invalid)
+Init: sigdelset - SUCCESSFUL (signal = 0)
+Init: sigdelset - EINVAL (set invalid)
+Init: sigismember - EINVAL (set invalid)
+Init: sigismember - SUCCESSFUL (signal = 0)
+Init: sigismember - EINVAL (signal invalid)
+Init: sigaction - SUCCESSFUL (signal = 0)
+Init: sigaction - EINVAL (signal invalid)
+Init: sigaction - EINVAL (SIGKILL)
+Init: pthread_sigmask - EINVAL (set and oset invalid)
+Init: pthread_sigmask - EINVAL (how invalid)
+Init: sigpending - EINVAL (set invalid)
+Init: pthread_sigmask - EINVAL (timout->nsec invalid < 0)
+Init: pthread_sigmask - EINVAL (timout->nsec invalid to large)
+Init: pthread_kill - EINVAL (sig invalid)
+Init: pthread_kill - ENOSYS (signal SA_SIGINFO)
+Init: pthread_kill - ESRCH (signal SA_SIGINFO)
+Init: pthread_kill - SUCCESSFUL (signal = 0)
+Init: pthread_kill - SUCCESSFUL (signal = SIG_IGN)
+Init: kill - ESRCH (pid invalid)
+Init: kill - SUCCESSFUL (signal = 0)
+Init: kill - EINVAL (sig invalid)
+*** END OF POSIX TEST 4 ***
diff --git a/c/src/tests/psxtests/psx04/system.h b/c/src/tests/psxtests/psx04/system.h
new file mode 100644
index 0000000000..5d996f8601
--- /dev/null
+++ b/c/src/tests/psxtests/psx04/system.h
@@ -0,0 +1,63 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+void *Task_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 5
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task1_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_t Task3_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx04/task1.c b/c/src/tests/psxtests/psx04/task1.c
new file mode 100644
index 0000000000..8e2fe957c3
--- /dev/null
+++ b/c/src/tests/psxtests/psx04/task1.c
@@ -0,0 +1,44 @@
+/* Task_1
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int seconds;
+
+ printf( "Task_1: sleeping for 5 seconds\n" );
+
+ seconds = sleep( 5 );
+ printf( "Task_1: %d seconds left\n", seconds );
+ assert( seconds );
+
+ /* switch to Init */
+
+ printf( "Task_1: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx04/task2.c b/c/src/tests/psxtests/psx04/task2.c
new file mode 100644
index 0000000000..fbdd2011c7
--- /dev/null
+++ b/c/src/tests/psxtests/psx04/task2.c
@@ -0,0 +1,42 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ printf( "Task_2: sending SIGUSR1\n" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ /* switch to Init */
+
+ printf( "Task_2: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx04/task3.c b/c/src/tests/psxtests/psx04/task3.c
new file mode 100644
index 0000000000..e32a0a341c
--- /dev/null
+++ b/c/src/tests/psxtests/psx04/task3.c
@@ -0,0 +1,119 @@
+/* Task_3
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_3(
+ void *argument
+)
+{
+ int status;
+ int sig;
+ union sigval value;
+ sigset_t mask;
+ siginfo_t info;
+
+ value.sival_int = SIGUSR1;
+
+ printf( "Task_3: sigqueue SIGUSR1 with value= %d\n", value.sival_int );
+ status = sigqueue( getpid(), SIGUSR1, value );
+ assert( !status );
+
+ /* catch signal with sigwaitinfo */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Task_3: sigwaitinfo SIGUSR1 with value= %d\n", value.sival_int );
+ status = sigwaitinfo( &mask, &info );
+
+ /* switch to Init */
+
+ assert( !(status==-1) );
+ printf(
+ "Task_3: si_signo= %d si_code= %d value= %d\n",
+ info.si_signo,
+ info.si_code,
+ info.si_value.sival_int
+ );
+
+ /* catch signal with sigwait */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Task_3: sigwait SIGUSR1\n" );
+ status = sigwait( &mask, &sig );
+
+ /* switch to Init */
+
+ assert( !status );
+ printf( "Task_3: signo= %d\n", sig );
+
+ /* catch signal with pause */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Task_3: pause\n" );
+ status = pause( );
+
+ /* switch to Init */
+
+ assert( !(status==-1) );
+ printf( "Task_3: pause= %d\n", status );
+
+
+ /* send signal to Init task before it has pended for a signal */
+
+ empty_line();
+
+ printf( "Task_3: sending SIGUSR2\n" );
+ status = pthread_kill( Init_id, SIGUSR2 );
+ assert( !status );
+
+ printf( "Task_3: sleep so the Init task can reguest a signal\n" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* end of task 3 */
+ printf( "Task_3: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx05/Makefile.in b/c/src/tests/psxtests/psx05/Makefile.in
new file mode 100644
index 0000000000..cec495e5f7
--- /dev/null
+++ b/c/src/tests/psxtests/psx05/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx05
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx05/init.c b/c/src/tests/psxtests/psx05/init.c
new file mode 100644
index 0000000000..1593cc65a7
--- /dev/null
+++ b/c/src/tests/psxtests/psx05/init.c
@@ -0,0 +1,569 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+#define MUTEX_BAD_ID 0xfffffffe
+
+void Print_mutexattr(
+ char *msg,
+ pthread_mutexattr_t *attr
+)
+{
+ int status;
+ int protocol;
+ int prioceiling;
+ int pshared;
+
+ /* protocol */
+
+ status = pthread_mutexattr_getprotocol( attr, &protocol );
+ assert( !status );
+
+ printf( "%smutex protocol is (%d) -- ", msg, protocol );
+ switch ( protocol ) {
+ case PTHREAD_PRIO_NONE:
+ puts( "PTHREAD_PRIO_NONE" );
+ break;
+ case PTHREAD_PRIO_INHERIT:
+ puts( "PTHREAD_PRIO_INHERIT" );
+ break;
+ case PTHREAD_PRIO_PROTECT:
+ puts( "PTHREAD_PRIO_PROTECT" );
+ break;
+ default:
+ puts( "UNKNOWN" );
+ assert( 0 );
+ break;
+ }
+
+ /* priority ceiling */
+
+ status = pthread_mutexattr_getprioceiling( attr, &prioceiling );
+ assert( !status );
+ printf( "%smutex priority ceiling is %d\n", msg, prioceiling );
+
+ /* process shared */
+
+ status = pthread_mutexattr_getpshared( attr, &pshared );
+ assert( !status );
+ printf( "%smutex process shared is (%d) -- ", msg, pshared );
+ switch ( pshared ) {
+ case PTHREAD_PROCESS_PRIVATE:
+ puts( "PTHREAD_PROCESS_PRIVATE" );
+ break;
+ case PTHREAD_PROCESS_SHARED:
+ puts( "PTHREAD_PROCESS_SHARED" );
+ break;
+ default:
+ puts( "UNKNOWN" );
+ assert( 0 );
+ break;
+ }
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_t destroyed_attr;
+ struct timespec times;
+ struct sched_param param;
+ int pshared;
+ int policy;
+ int protocol;
+ int ceiling;
+ int old_ceiling;
+
+ assert( MUTEX_BAD_ID != PTHREAD_MUTEX_INITIALIZER );
+ Mutex_bad_id = MUTEX_BAD_ID;
+
+ puts( "\n\n*** POSIX TEST 5 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* tes pthread_mutex_attr_init */
+
+ puts( "Init: pthread_mutexattr_init - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_init( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ Print_mutexattr( "Init: ", &attr );
+
+ /* create an "uninitialized" attribute structure */
+
+ status = pthread_mutexattr_init( &destroyed_attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
+ status = pthread_mutexattr_destroy( &destroyed_attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutexattr_destroy - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_destroy( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_destroy - EINVAL (not initialized)" );
+ status = pthread_mutexattr_destroy( &destroyed_attr );
+ assert( status == EINVAL );
+
+ /* error cases for set and get pshared attribute */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_getpshared - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_getpshared( NULL, &pshared );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getpshared - EINVAL (NULL pshared)" );
+ status = pthread_mutexattr_getpshared( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getpshared - EINVAL (not initialized)" );
+ status = pthread_mutexattr_getpshared( &destroyed_attr, &pshared );
+ assert( status == EINVAL );
+
+ pshared = PTHREAD_PROCESS_PRIVATE;
+ puts( "Init: pthread_mutexattr_setpshared - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_setpshared( NULL, pshared );
+ assert( status == EINVAL );
+
+ pshared = PTHREAD_PROCESS_PRIVATE;
+ puts( "Init: pthread_mutexattr_setpshared - EINVAL (not initialized)" );
+ status = pthread_mutexattr_setpshared( &destroyed_attr, pshared );
+ assert( status == EINVAL );
+
+ /* error cases for set and get protocol attribute */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_getprotocol - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_getprotocol( NULL, &protocol );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprotocol - EINVAL (NULL protocol)" );
+ status = pthread_mutexattr_getprotocol( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprotocol - EINVAL (not initialized)" );
+ status = pthread_mutexattr_getprotocol( &destroyed_attr, &protocol );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprotocol - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_setprotocol( NULL, PTHREAD_PRIO_NONE );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprotocol - EINVAL (invalid protocol)" );
+ status = pthread_mutexattr_setprotocol( &attr, -1 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprotocol - EINVAL (not initialized)" );
+ status = pthread_mutexattr_setprotocol( &destroyed_attr, -1 );
+ assert( status == EINVAL );
+
+ /* error cases for set and get prioceiling attribute */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_getprioceiling - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_getprioceiling( NULL, &ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprioceiling - EINVAL (NULL prioceiling)" );
+ status = pthread_mutexattr_getprioceiling( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprioceiling - EINVAL (not initialized)" );
+ status = pthread_mutexattr_getprioceiling( &destroyed_attr, &ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_setprioceiling( NULL, 128 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (invalid priority)" );
+ status = pthread_mutexattr_setprioceiling( &attr, 512 );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (not initialized)" );
+ status = pthread_mutexattr_setprioceiling( &destroyed_attr, -1 );
+ assert( status == EINVAL );
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ /* now try some basic mutex operations */
+
+ empty_line();
+
+ puts( "Init: pthread_mutex_init - EINVAL (NULL mutex_id)" );
+ status = pthread_mutex_init( NULL, &attr );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_init - EINVAL (not initialized attr)" );
+ status = pthread_mutex_init( &Mutex_id, &destroyed_attr );
+ assert( status == EINVAL );
+
+ /* must get around error checks in attribute set routines */
+ attr.protocol = -1;
+
+ puts( "Init: pthread_mutex_init - EINVAL (bad protocol)" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ assert( status == EINVAL );
+
+ /* must get around error checks in attribute set routines */
+ attr.protocol = PTHREAD_PRIO_INHERIT;
+ attr.prio_ceiling = -1;
+
+ puts( "Init: pthread_mutex_init - EINVAL (bad priority ceiling)" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ assert( status == EINVAL );
+
+ /* now set up for a success pthread_mutex_init */
+
+ puts( "Init: Resetting mutex attributes" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: Changing mutex attributes" );
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_INHERIT );
+ assert( !status );
+
+ status = pthread_mutexattr_setprioceiling( &attr, 128 );
+ assert( !status );
+
+ status = pthread_mutexattr_setpshared( &attr, PTHREAD_PROCESS_SHARED );
+ assert( !status );
+
+ Print_mutexattr( "Init: ", &attr );
+
+ puts( "Init: Resetting mutex attributes" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - EBUSY (attempt to initialize an existing mutex)" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ if ( !status )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+
+ puts( "Init: pthread_mutex_trylock - EINVAL (illegal ID)" );
+ status = pthread_mutex_trylock( &Mutex_bad_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_trylock - EDEADLK (already locked)" );
+ status = pthread_mutex_trylock( &Mutex_id );
+ if ( status != EDEADLK )
+ printf( "status = %d\n", status );
+ assert( status == EDEADLK );
+
+ puts( "Init: pthread_mutex_lock - EDEADLK (already locked)" );
+ status = pthread_mutex_lock( &Mutex_id );
+ if ( status != EDEADLK )
+ printf( "status = %d\n", status );
+ assert( status == EDEADLK );
+
+ puts( "Init: Sleep 1 second" );
+
+ sleep( 1 );
+
+ /* switch to task 1 */
+
+ puts( "Init: pthread_mutex_unlock - EINVAL (invalid id)" );
+ status = pthread_mutex_unlock( &Mutex_bad_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_unlock - EPERM (not owner)" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ if ( status != EPERM )
+ printf( "status = %d\n", status );
+ assert( status == EPERM );
+
+ times.tv_sec = 0;
+ times.tv_nsec = 500000000;
+ puts( "Init: pthread_mutex_timedlock - time out in 1/2 second" );
+ status = pthread_mutex_timedlock( &Mutex_id, &times );
+ if ( status != EAGAIN )
+ printf( "status = %d\n", status );
+ assert( status == EAGAIN );
+
+ /* switch to idle */
+
+ puts( "Init: pthread_mutex_timedlock - EAGAIN (timeout)" );
+
+ /* destroy a mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - EAGAIN (too many)" );
+ status = pthread_mutex_init( &Mutex3_id, &attr );
+ assert( status == EAGAIN );
+
+ puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
+ status = pthread_mutexattr_destroy( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - EINVAL (invalid id)" );
+ status = pthread_mutex_destroy( &Mutex_bad_id );
+ assert( status == EINVAL );
+
+ /* destroy a busy mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex2_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - EBUSY (already locked)" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ if ( status != EBUSY )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ assert( !status );
+
+ /* priority inherit mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts(
+ "Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_INHERIT)"
+ );
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_INHERIT );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex2_id );
+ assert( !status );
+
+ /* create a thread at a lower priority */
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ /* set priority of Task2 to highest priority */
+
+ param.sched_priority = 254;
+
+ puts( "Init: pthread_setschedparam - Setting Task2 priority to highest" );
+ status = pthread_setschedparam( Task2_id, SCHED_FIFO, &param );
+ assert( !status );
+
+ /* switching to Task2 */
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf( "Init: pthread_getschedparam - priority = %d\n", param.sched_priority);
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
+ status = pthread_mutexattr_destroy( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ assert( !status );
+
+ /* priority ceiling mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts(
+ "Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_PROTECT)"
+ );
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_getprioceiling - EINVAL (invalid id)" );
+ status = pthread_mutex_getprioceiling( &Mutex_bad_id, &ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_getprioceiling - EINVAL (NULL ceiling)" );
+ status = pthread_mutex_getprioceiling( &Mutex2_id, NULL );
+ assert( status == EINVAL );
+
+ status = pthread_mutex_getprioceiling( &Mutex2_id, &ceiling );
+ assert( !status );
+ printf( "Init: pthread_mutex_getprioceiling - %d\n", ceiling );
+
+ puts( "Init: pthread_mutex_setprioceiling - EINVAL (invalid id)" );
+ status = pthread_mutex_setprioceiling( &Mutex_bad_id, 200, &old_ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_setprioceiling - EINVAL (illegal priority)" );
+ status = pthread_mutex_setprioceiling( &Mutex2_id, 512, &old_ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_setprioceiling - EINVAL (NULL ceiling)" );
+ status = pthread_mutex_setprioceiling( &Mutex2_id, 128, NULL );
+ assert( status == EINVAL );
+
+ /* normal cases of set priority ceiling */
+
+ puts( "Init: pthread_mutex_setprioceiling - new ceiling = 200" );
+ status = pthread_mutex_setprioceiling( &Mutex2_id, 200, &old_ceiling );
+ assert( !status );
+ printf(
+ "Init: pthread_mutex_setprioceiling - old ceiling = %d\n",old_ceiling
+ );
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf(
+ "Init: pthread_getschedparam - priority = %d\n", param.sched_priority
+ );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex2_id );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf(
+ "Init: pthread_getschedparam - priority = %d\n", param.sched_priority
+ );
+
+ /* create a thread at a higher priority */
+
+ status = pthread_create( &Task3_id, NULL, Task_3, NULL );
+ assert( !status );
+
+ /* set priority of Task3 to highest priority */
+
+ param.sched_priority = 199;
+
+ status = pthread_setschedparam( Task3_id, SCHED_FIFO, &param );
+ assert( !status );
+ puts( "Init: pthread_setschedparam - set Task3 priority to highest" );
+
+ /* DOES NOT SWITCH to Task3 */
+
+ puts( "Init: Sleep 1 second" );
+ assert( !status );
+ sleep( 1 );
+
+ /* switch to task 3 */
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ status = pthread_mutex_getprioceiling( &Mutex2_id, &ceiling );
+ assert( !status );
+ printf( "Init: pthread_mutex_getprioceiling- ceiling = %d\n", ceiling );
+
+ /* set priority of Init to highest priority */
+
+ param.sched_priority = 254;
+
+ status = pthread_setschedparam( Init_id, SCHED_FIFO, &param );
+ assert( !status );
+ puts( "Init: pthread_setschedparam - set Init priority to highest" );
+
+ puts( "Init: pthread_mutex_lock - EINVAL (priority ceiling violation)" );
+ status = pthread_mutex_lock( &Mutex2_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "*** END OF POSIX TEST 5 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx05/psx05.scn b/c/src/tests/psxtests/psx05/psx05.scn
new file mode 100644
index 0000000000..6e4bc7320d
--- /dev/null
+++ b/c/src/tests/psxtests/psx05/psx05.scn
@@ -0,0 +1,111 @@
+*** POSIX TEST 5 ***
+Init's ID is 0x0c010001
+Init: pthread_mutexattr_init - EINVAL (NULL attr)
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: mutex protocol is (0) -- PTHREAD_PRIO_NONE
+Init: mutex priority ceiling is 254
+Init: mutex process shared is (0) -- PTHREAD_PROCESS_PRIVATE
+Init: pthread_mutexattr_destroy - SUCCESSFUL
+Init: pthread_mutexattr_destroy - EINVAL (NULL attr)
+Init: pthread_mutexattr_destroy - EINVAL (not initialized)
+
+Init: pthread_mutexattr_getpshared - EINVAL (NULL attr)
+Init: pthread_mutexattr_getpshared - EINVAL (NULL pshared)
+Init: pthread_mutexattr_getpshared - EINVAL (not initialized)
+Init: pthread_mutexattr_setpshared - EINVAL (NULL attr)
+Init: pthread_mutexattr_setpshared - EINVAL (not initialized)
+
+Init: pthread_mutexattr_getprotocol - EINVAL (NULL attr)
+Init: pthread_mutexattr_getprotocol - EINVAL (NULL protocol)
+Init: pthread_mutexattr_getprotocol - EINVAL (not initialized)
+Init: pthread_mutexattr_setprotocol - EINVAL (NULL attr)
+Init: pthread_mutexattr_setprotocol - EINVAL (invalid protocol)
+Init: pthread_mutexattr_setprotocol - EINVAL (not initialized)
+
+Init: pthread_mutexattr_getprioceiling - EINVAL (NULL attr)
+Init: pthread_mutexattr_getprioceiling - EINVAL (NULL prioceiling)
+Init: pthread_mutexattr_getprioceiling - EINVAL (not initialized)
+Init: pthread_mutexattr_setprioceiling - EINVAL (NULL attr)
+Init: pthread_mutexattr_setprioceiling - EINVAL (invalid priority)
+Init: pthread_mutexattr_setprioceiling - EINVAL (not initialized)
+
+Init: pthread_mutex_init - EINVAL (NULL mutex_id)
+Init: pthread_mutex_init - EINVAL (not initialized attr)
+Init: pthread_mutex_init - EINVAL (bad protocol)
+Init: pthread_mutex_init - EINVAL (bad priority ceiling)
+Init: Resetting mutex attributes
+Init: Changing mutex attributes
+Init: mutex protocol is (1) -- PTHREAD_PRIO_INHERIT
+Init: mutex priority ceiling is 128
+Init: mutex process shared is (1) -- PTHREAD_PROCESS_SHARED
+Init: Resetting mutex attributes
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_init - EBUSY (attempt to initialize an existing mutex)
+Init: pthread_mutex_trylock - EINVAL (illegal ID)
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_mutex_trylock - EDEADLK (already locked)
+Init: pthread_mutex_lock - EDEADLK (already locked)
+Init: Sleep 1 second
+Task: pthread_mutex_trylock already locked
+Task: pthread_mutex_lock unavailable
+Init: pthread_mutex_unlock - EINVAL (invalid id)
+Init: pthread_mutex_unlock - SUCCESSFUL
+Init: pthread_mutex_unlock - EPERM (not owner)
+Init: pthread_mutex_timedlock - time out in 1/2 second
+Task: mutex acquired
+Task: sleep for 2 seconds
+Init: pthread_mutex_timedlock - EAGAIN (timeout)
+
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_init - EAGAIN (too many)
+Init: pthread_mutexattr_destroy - SUCCESSFUL
+Init: pthread_mutex_destroy - SUCCESSFUL
+Init: pthread_mutex_destroy - EINVAL (invalid id)
+
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_mutex_destroy - EBUSY (already locked)
+Init: pthread_mutex_unlock - SUCCESSFUL
+Init: pthread_mutex_destroy - SUCCESSFUL
+
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_INHERIT)
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_setschedparam - Setting Task2 priority to highest
+Task 2: pthread_mutex_lock unavailable (inherit case)
+Init: pthread_getschedparam - priority = 254
+Init: pthread_mutex_unlock - SUCCESSFUL
+Task 2: mutex acquired
+Task 2: unlock Mutex 2
+Task 2: exit
+Init: pthread_mutexattr_destroy - SUCCESSFUL
+Init: pthread_mutex_destroy - SUCCESSFUL
+
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_PROTECT)
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_getprioceiling - EINVAL (invalid id)
+Init: pthread_mutex_getprioceiling - EINVAL (NULL ceiling)
+Init: pthread_mutex_getprioceiling - 254
+Init: pthread_mutex_setprioceiling - EINVAL (invalid id)
+Init: pthread_mutex_setprioceiling - EINVAL (illegal priority)
+Init: pthread_mutex_setprioceiling - EINVAL (NULL ceiling)
+Init: pthread_mutex_setprioceiling - new ceiling = 200
+Init: pthread_mutex_setprioceiling - old ceiling = 1
+Init: pthread_getschedparam - priority = 2
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_getschedparam - priority = 200
+Init: pthread_setschedparam - set Task3 priority to highest
+Init: Sleep 1 second
+Task 3: pthread_mutex_lock unavailable (inherit case)
+Init: pthread_mutex_unlock - SUCCESSFUL
+Task 3: mutex acquired
+Task 3: unlock Mutex 2
+Task 3: pthread_getschedparam priority = 199
+Task 3: exit
+Init: pthread_mutex_getprioceiling- ceiling = 200
+Init: pthread_setschedparam - set Init priority to highest
+Init: pthread_mutex_lock - EINVAL (priority ceiling violation)
+*** END OF POSIX TEST 5 ***
diff --git a/c/src/tests/psxtests/psx05/system.h b/c/src/tests/psxtests/psx05/system.h
new file mode 100644
index 0000000000..7dff6eef2f
--- /dev/null
+++ b/c/src/tests/psxtests/psx05/system.h
@@ -0,0 +1,67 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+void *Task_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_t Task3_id;
+TEST_EXTERN pthread_mutex_t Mutex_id;
+TEST_EXTERN pthread_mutex_t Mutex2_id;
+TEST_EXTERN pthread_mutex_t Mutex3_id;
+TEST_EXTERN pthread_mutex_t Mutex_bad_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx05/task.c b/c/src/tests/psxtests/psx05/task.c
new file mode 100644
index 0000000000..44c6d04c13
--- /dev/null
+++ b/c/src/tests/psxtests/psx05/task.c
@@ -0,0 +1,58 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+
+ printf( "Task: pthread_mutex_trylock already locked\n" );
+ status = pthread_mutex_trylock( &Mutex_id );
+ if ( status != EBUSY )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+
+ printf( "Task: pthread_mutex_lock unavailable\n" );
+ status = pthread_mutex_lock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ /* switch to init */
+
+ printf( "Task: mutex acquired\n" );
+
+ printf( "Task: sleep for 2 seconds\n" );
+ sleep( 2 );
+
+ /* switch to init */
+
+ printf( "Task: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx05/task2.c b/c/src/tests/psxtests/psx05/task2.c
new file mode 100644
index 0000000000..13164518d5
--- /dev/null
+++ b/c/src/tests/psxtests/psx05/task2.c
@@ -0,0 +1,49 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ printf( "Task 2: pthread_mutex_lock unavailable (inherit case)\n" );
+ status = pthread_mutex_lock( &Mutex2_id );
+ if ( status )
+ printf( "status =%d\n", status );
+ assert( !status );
+ printf( "Task 2: mutex acquired\n" );
+
+ /* switch to init */
+
+ printf( "Task 2: unlock Mutex 2\n" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ printf( "Task 2: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx05/task3.c b/c/src/tests/psxtests/psx05/task3.c
new file mode 100644
index 0000000000..f3adb243d1
--- /dev/null
+++ b/c/src/tests/psxtests/psx05/task3.c
@@ -0,0 +1,51 @@
+/* Task_3
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_3(
+ void *argument
+)
+{
+ int status;
+ struct sched_param param;
+ int policy;
+
+ printf( "Task 3: pthread_mutex_lock unavailable (inherit case)\n" );
+ status = pthread_mutex_lock( &Mutex2_id );
+ printf( "Task 3: mutex acquired\n" );
+ assert( !status );
+
+ printf( "Task 3: unlock Mutex 2\n" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf( "Task 3: pthread_getschedparam priority = %d\n", param.sched_priority );
+
+ printf( "Task 3: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx06/Makefile.in b/c/src/tests/psxtests/psx06/Makefile.in
new file mode 100644
index 0000000000..00f3b9e573
--- /dev/null
+++ b/c/src/tests/psxtests/psx06/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx06
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task task2
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx06/init.c b/c/src/tests/psxtests/psx06/init.c
new file mode 100644
index 0000000000..e8bd1f5f0e
--- /dev/null
+++ b/c/src/tests/psxtests/psx06/init.c
@@ -0,0 +1,121 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void Key_destructor(
+ void *key_data
+)
+{
+ Destructor_invoked++;
+
+ /*
+ * This checks out that we only run the destructor multiple times
+ * when the key data is non null.
+ */
+
+ if ( Destructor_invoked == 5 )
+ (void) pthread_setspecific( Key_id, NULL );
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ unsigned int remaining;
+ rtems_unsigned32 *key_data;
+
+ puts( "\n\n*** POSIX TEST 6 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* create a couple of threads */
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ /* create a key */
+
+ empty_line();
+
+ Destructor_invoked = 0;
+ puts( "Init: pthread_key_create - SUCCESSFUL" );
+ status = pthread_key_create( &Key_id, Key_destructor );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ printf( "Destructor invoked %d times\n", Destructor_invoked );
+
+ puts( "Init: pthread_key_create - EAGAIN (too many keys)" );
+ status = pthread_key_create( &Key_id, Key_destructor );
+ assert( status == EAGAIN );
+
+ puts( "Init: pthread_setspecific - EINVAL (invalid key)" );
+ status = pthread_setspecific( -1, &Data_array[ 0 ] );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_getspecific - EINVAL (invalid key)" );
+ key_data = pthread_getspecific( -1 );
+ assert( !key_data );
+
+ puts( "Init: pthread_key_delete - EINVAL (invalid key)" );
+ status = pthread_key_delete( -1 );
+ assert( status == EINVAL );
+
+ printf( "Init: Setting the key to %d\n", 0 );
+ status = pthread_setspecific( Key_id, &Data_array[ 0 ] );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ key_data = pthread_getspecific( Key_id );
+ printf( "Init: Got the key value of %ld\n",
+ (unsigned long) ((rtems_unsigned32 *)key_data - Data_array) );
+
+ remaining = sleep( 3 );
+ if ( remaining )
+ printf( "seconds remaining = %d\n", remaining );
+ assert( !remaining );
+
+ /* switch to task 1 */
+
+ /* delete the key */
+
+ puts( "Init: pthread_key_delete - SUCCESSFUL" );
+ status = pthread_key_delete( Key_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ printf( "Destructor invoked %d times\n", Destructor_invoked );
+
+ puts( "*** END OF POSIX TEST 6 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx06/psx06.scn b/c/src/tests/psxtests/psx06/psx06.scn
new file mode 100644
index 0000000000..a17fa043ee
--- /dev/null
+++ b/c/src/tests/psxtests/psx06/psx06.scn
@@ -0,0 +1,21 @@
+*** POSIX TEST 6 ***
+Init's ID is 0x0c010001
+
+Init: pthread_key_create - SUCCESSFUL
+Destructor invoked 0 times
+Init: pthread_key_create - EAGAIN (too many keys)
+Init: pthread_setspecific - EINVAL (invalid key)
+Init: pthread_getspecific - EINVAL (invalid key)
+Init: pthread_key_delete - EINVAL (invalid key)
+Init: Setting the key to 0
+Init: Got the key value of 0
+Task_1: Setting the key to 1
+Task_1: Got the key value of 1
+Task_1: exitting
+Destructor invoked 4 times
+Task_2: Setting the key to 2
+Task_2: Got the key value of 2
+Task2: exitting
+Init: pthread_key_delete - SUCCESSFUL
+Destructor invoked 5 times
+*** END OF POSIX TEST 6 ***
diff --git a/c/src/tests/psxtests/psx06/system.h b/c/src/tests/psxtests/psx06/system.h
new file mode 100644
index 0000000000..6a856e8bf6
--- /dev/null
+++ b/c/src/tests/psxtests/psx06/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 1
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_key_t Key_id;
+TEST_EXTERN rtems_unsigned32 Data_array[ CONFIGURE_MAXIMUM_POSIX_THREADS ];
+TEST_EXTERN rtems_unsigned32 Destructor_invoked;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx06/task.c b/c/src/tests/psxtests/psx06/task.c
new file mode 100644
index 0000000000..c64efb7190
--- /dev/null
+++ b/c/src/tests/psxtests/psx06/task.c
@@ -0,0 +1,51 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+ rtems_unsigned32 *key_data;
+
+ printf( "Task_1: Setting the key to %d\n", 1 );
+ status = pthread_setspecific( Key_id, &Data_array[ 1 ] );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ key_data = pthread_getspecific( Key_id );
+ printf( "Task_1: Got the key value of %ld\n",
+ (unsigned long) ((rtems_unsigned32 *)key_data - Data_array) );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ /* switch to task 2 */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx06/task2.c b/c/src/tests/psxtests/psx06/task2.c
new file mode 100644
index 0000000000..48418d4a46
--- /dev/null
+++ b/c/src/tests/psxtests/psx06/task2.c
@@ -0,0 +1,52 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+ rtems_unsigned32 *key_data;
+
+ printf( "Destructor invoked %d times\n", Destructor_invoked );
+
+ printf( "Task_2: Setting the key to %d\n", 2 );
+ status = pthread_setspecific( Key_id, &Data_array[ 2 ] );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ key_data = pthread_getspecific( Key_id );
+ printf( "Task_2: Got the key value of %ld\n",
+ (unsigned long) ((rtems_unsigned32 *)key_data - Data_array) );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Task2: exitting" );
+ pthread_exit( NULL );
+
+ /* switch to init task */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx07/Makefile.in b/c/src/tests/psxtests/psx07/Makefile.in
new file mode 100644
index 0000000000..8b926b006a
--- /dev/null
+++ b/c/src/tests/psxtests/psx07/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx07
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx07/init.c b/c/src/tests/psxtests/psx07/init.c
new file mode 100644
index 0000000000..9e31b1605b
--- /dev/null
+++ b/c/src/tests/psxtests/psx07/init.c
@@ -0,0 +1,491 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void print_schedparam(
+ char *prefix,
+ struct sched_param *schedparam
+)
+{
+ printf( "%ssched priority = %d\n", prefix, schedparam->sched_priority );
+#if defined(_POSIX_SPORADIC_SERVER)
+ printf( "%sss_low_priority = %d\n", prefix, schedparam->ss_low_priority );
+ printf( "%sss_replenish_period = (%ld, %ld)\n", prefix,
+ schedparam->ss_replenish_period.tv_sec,
+ schedparam->ss_replenish_period.tv_nsec );
+ printf( "%sss_initial_budget = (%ld, %ld)\n", prefix,
+ schedparam->ss_initial_budget.tv_sec,
+ schedparam->ss_initial_budget.tv_nsec );
+#else
+ printf( "%s_POSIX_SPORADIC_SERVER is not defined\n" );
+#endif
+}
+
+extern rtems_configuration_table BSP_Configuration;
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ int scope;
+ int inheritsched;
+ int schedpolicy;
+ size_t stacksize;
+ void *stackaddr;
+ int detachstate;
+ struct sched_param schedparam;
+ pthread_attr_t attr;
+ pthread_attr_t destroyed_attr;
+
+ puts( "\n\n*** POSIX TEST 7 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* exercise init and destroy */
+
+ puts( "Init: pthread_attr_init - EINVAL (NULL attr)" );
+ status = pthread_attr_init( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_init - SUCCESSFUL" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ puts( "Init: initialize and destroy an attribute - SUCCESSFUL" );
+ status = pthread_attr_init( &destroyed_attr );
+ assert( !status );
+
+ status = pthread_attr_destroy( &destroyed_attr );
+ assert( !status );
+
+ puts( "Init: pthread_attr_destroy - EINVAL (NULL attr)" );
+ status = pthread_attr_destroy( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_destroy - EINVAL (not initialized)" );
+ status = pthread_attr_destroy( &destroyed_attr );
+ assert( status == EINVAL );
+
+ /* check some errors in pthread_create */
+
+ puts( "Init: pthread_create - EINVAL (attr not initialized)" );
+ status = pthread_create( &Task_id, &destroyed_attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* junk stack address */
+ status = pthread_attr_setstackaddr( &attr, (void *)&schedparam );
+ assert( !status );
+
+ /* must go around pthread_attr_setstacksize to set a bad stack size */
+ attr.stacksize = 0;
+
+ puts( "Init: pthread_create - EINVAL (stacksize too small)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ attr.stacksize = BSP_Configuration.work_space_size;
+ puts( "Init: pthread_create - EAGAIN (stacksize too large)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EAGAIN );
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ /* must go around pthread_attr_set routines to set a bad value */
+ attr.inheritsched = -1;
+
+ puts( "Init: pthread_create - EINVAL (invalid inherit scheduler)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* check out the error case for system scope not supported */
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ /* must go around pthread_attr_set routines to set a bad value */
+ attr.contentionscope = PTHREAD_SCOPE_SYSTEM;
+
+ puts( "Init: pthread_create - ENOTSUP (unsupported system contention scope)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == ENOTSUP );
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ /* now check out pthread_create for inherit scheduler */
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_INHERIT_SCHED );
+ assert( !status );
+
+ puts( "Init: pthread_create - SUCCESSFUL (inherit scheduler)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ /* switch to Task_1 */
+
+ /* exercise get and set scope */
+
+ empty_line();
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_attr_setscope - EINVAL (NULL attr)" );
+ status = pthread_attr_setscope( NULL, PTHREAD_SCOPE_PROCESS );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setscope - ENOTSUP" );
+ status = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
+ assert( status == ENOTSUP );
+
+ puts( "Init: pthread_attr_setscope - EINVAL (not initialized attr)" );
+ status = pthread_attr_setscope( &destroyed_attr, PTHREAD_SCOPE_PROCESS );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setscope - EINVAL (invalid scope)" );
+ status = pthread_attr_setscope( &attr, -1 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setscope - SUCCESSFUL" );
+ status = pthread_attr_setscope( &attr, PTHREAD_SCOPE_PROCESS );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getscope - EINVAL (NULL attr)" );
+ status = pthread_attr_getscope( NULL, &scope );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getscope - EINVAL (NULL scope)" );
+ status = pthread_attr_getscope( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getscope - EINVAL (not initialized attr)" );
+ status = pthread_attr_getscope( &destroyed_attr, &scope );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getscope - SUCCESSFUL" );
+ status = pthread_attr_getscope( &attr, &scope );
+ assert( !status );
+ printf( "Init: current scope attribute = %d\n", scope );
+
+ /* exercise get and set inherit scheduler */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setinheritsched - EINVAL (NULL attr)" );
+ status = pthread_attr_setinheritsched( NULL, PTHREAD_INHERIT_SCHED );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setinheritsched - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setinheritsched( &destroyed_attr, PTHREAD_INHERIT_SCHED );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setinheritsched - ENOTSUP (invalid inheritsched)" );
+ status = pthread_attr_setinheritsched( &attr, -1 );
+ assert( status == ENOTSUP );
+
+ puts( "Init: pthread_attr_setinheritsched - SUCCESSFUL" );
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_INHERIT_SCHED );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getinheritsched - EINVAL (NULL attr)" );
+ status = pthread_attr_getinheritsched( NULL, &inheritsched );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getinheritsched - EINVAL (NULL inheritsched)" );
+ status = pthread_attr_getinheritsched( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getinheritsched - EINVAL (not initialized attr)" );
+ status = pthread_attr_getinheritsched( &destroyed_attr, &inheritsched );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getinheritsched - SUCCESSFUL" );
+ status = pthread_attr_getinheritsched( &attr, &inheritsched );
+ assert( !status );
+ printf( "Init: current inherit scheduler attribute = %d\n", inheritsched );
+
+ /* exercise get and set inherit scheduler */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setschedpolicy - EINVAL (NULL attr)" );
+ status = pthread_attr_setschedpolicy( NULL, SCHED_FIFO );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedpolicy - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setschedpolicy( &destroyed_attr, SCHED_OTHER );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedpolicy - ENOTSUP (invalid schedpolicy)" );
+ status = pthread_attr_setschedpolicy( &attr, -1 );
+ assert( status == ENOTSUP );
+
+ puts( "Init: pthread_attr_setschedpolicy - SUCCESSFUL" );
+ status = pthread_attr_setschedpolicy( &attr, SCHED_RR );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getschedpolicy - EINVAL (NULL attr)" );
+ status = pthread_attr_getschedpolicy( NULL, &schedpolicy );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedpolicy - EINVAL (NULL schedpolicy)" );
+ status = pthread_attr_getschedpolicy( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedpolicy - EINVAL (not initialized attr)" );
+ status = pthread_attr_getschedpolicy( &destroyed_attr, &schedpolicy );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedpolicy - SUCCESSFUL" );
+ status = pthread_attr_getschedpolicy( &attr, &schedpolicy );
+ assert( !status );
+ printf( "Init: current scheduler policy attribute = %d\n", schedpolicy );
+
+ /* exercise get and set stack size */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setstacksize - EINVAL (NULL attr)" );
+ status = pthread_attr_setstacksize( NULL, 0 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstacksize - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setstacksize( &destroyed_attr, 0 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstacksize - SUCCESSFUL (low stacksize)" );
+ status = pthread_attr_setstacksize( &attr, 0 );
+ assert( !status );
+
+ puts( "Init: pthread_attr_setstacksize - SUCCESSFUL (high stacksize)" );
+ status = pthread_attr_setstacksize( &attr, STACK_MINIMUM_SIZE * 2 );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getstacksize - EINVAL (NULL attr)" );
+ status = pthread_attr_getstacksize( NULL, &stacksize );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstacksize - EINVAL (NULL stacksize)" );
+ status = pthread_attr_getstacksize( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstacksize - EINVAL (not initialized attr)" );
+ status = pthread_attr_getstacksize( &destroyed_attr, &stacksize );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstacksize - SUCCESSFUL" );
+ status = pthread_attr_getstacksize( &attr, &stacksize );
+ assert( !status );
+ printf( "Init: current stack size attribute = %ld\n", (long) stacksize );
+
+ /* exercise get and set stack address */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setstackaddr - EINVAL (NULL attr)" );
+ status = pthread_attr_setstackaddr( NULL, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstackaddr - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setstackaddr( &destroyed_attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstackaddr - SUCCESSFUL" );
+ status = pthread_attr_setstackaddr( &attr, 0 );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getstackaddr - EINVAL (NULL attr)" );
+ status = pthread_attr_getstackaddr( NULL, &stackaddr );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstackaddr - EINVAL (NULL stackaddr)" );
+ status = pthread_attr_getstackaddr( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstackaddr - EINVAL (not initialized attr)" );
+ status = pthread_attr_getstackaddr( &destroyed_attr, &stackaddr );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstackaddr - SUCCESSFUL" );
+ status = pthread_attr_getstackaddr( &attr, &stackaddr );
+ assert( !status );
+ printf( "Init: current stack address attribute = %p\n", stackaddr );
+
+ /* exercise get and set detach state */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setdetachstate - EINVAL (NULL attr)" );
+ status = pthread_attr_setdetachstate( NULL, PTHREAD_CREATE_DETACHED );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setdetachstate - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setdetachstate( &destroyed_attr, PTHREAD_CREATE_JOINABLE );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setdetachstate - EINVAL (invalid detachstate)" );
+ status = pthread_attr_setdetachstate( &attr, -1 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setdetachstate - SUCCESSFUL" );
+ status = pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getdetachstate - EINVAL (NULL attr)" );
+ status = pthread_attr_getdetachstate( NULL, &detachstate );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getdetachstate - EINVAL (NULL detatchstate)" );
+ status = pthread_attr_getdetachstate( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getdetachstate - EINVAL (not initialized attr)" );
+ status = pthread_attr_getdetachstate( &destroyed_attr, &detachstate );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getdetachstate - SUCCESSFUL" );
+ status = pthread_attr_getdetachstate( &attr, &detachstate );
+ assert( !status );
+ printf( "Init: current detach state attribute = %d\n", detachstate );
+
+ /* exercise get and set scheduling parameters */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_getschedparam - SUCCESSFUL" );
+ status = pthread_attr_getschedparam( &attr, &schedparam );
+ assert( !status );
+
+ print_schedparam( "Init: ", &schedparam );
+
+ puts( "Init: pthread_attr_setschedparam - EINVAL (NULL attr)" );
+ status = pthread_attr_setschedparam( NULL, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedparam - EINVAL (not initialized attr)" );
+ status = pthread_attr_setschedparam( &destroyed_attr, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_attr_setschedparam( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedparam - SUCCESSFUL" );
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getschedparam - EINVAL (NULL attr)" );
+ status = pthread_attr_getschedparam( NULL, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedparam - EINVAL (not initialized attr)" );
+ status = pthread_attr_getschedparam( &destroyed_attr, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_attr_getschedparam( &attr, NULL );
+ assert( status == EINVAL );
+
+ /* exercise pthread_getschedparam */
+
+ empty_line();
+
+ puts( "Init: pthread_getschedparam - EINVAL (NULL policy)" );
+ status = pthread_getschedparam( pthread_self(), NULL, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_getschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_getschedparam - ESRCH (bad thread)" );
+ status = pthread_getschedparam( -1, &schedpolicy, &schedparam );
+ assert( status == ESRCH );
+
+ puts( "Init: pthread_getschedparam - SUCCESSFUL" );
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ printf( "Init: policy = %d\n", schedpolicy );
+
+ print_schedparam( "Init: ", &schedparam );
+
+ /* exercise pthread_setschedparam */
+
+ empty_line();
+
+ puts( "Init: pthread_setschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_OTHER, NULL );
+ assert( status == EINVAL );
+
+ schedparam.sched_priority = -1;
+
+ puts( "Init: pthread_setschedparam - EINVAL (invalid priority)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_OTHER, NULL );
+ assert( status == EINVAL );
+
+ schedparam.sched_priority = 128;
+
+ puts( "Init: pthread_setschedparam - EINVAL (invalid policy)" );
+ status = pthread_setschedparam( pthread_self(), -1, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_setschedparam - ESRCH (invalid thread)" );
+ status = pthread_setschedparam( -1, SCHED_OTHER, &schedparam );
+ assert( status == ESRCH );
+
+ /* now get sporadic server errors */
+
+ schedparam.ss_replenish_period.tv_sec = 1;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 1;
+
+ puts( "Init: pthread_setschedparam - EINVAL (replenish < budget)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( status == EINVAL );
+
+ schedparam.ss_replenish_period.tv_sec = 2;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+ schedparam.ss_low_priority = -1;
+
+ puts( "Init: pthread_setschedparam - EINVAL (invalid priority)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "*** END OF POSIX TEST 7 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx07/psx07.scn b/c/src/tests/psxtests/psx07/psx07.scn
new file mode 100644
index 0000000000..33f5c68f6a
--- /dev/null
+++ b/c/src/tests/psxtests/psx07/psx07.scn
@@ -0,0 +1,105 @@
+*** POSIX TEST 7 ***
+Init's ID is 0x0c010001
+Init: pthread_attr_init - EINVAL (NULL attr)
+Init: pthread_attr_init - SUCCESSFUL
+Init: initialize and destroy an attribute - SUCCESSFUL
+Init: pthread_attr_destroy - EINVAL (NULL attr)
+Init: pthread_attr_destroy - EINVAL (not initialized)
+Init: pthread_create - EINVAL (attr not initialized)
+Init: pthread_create - EINVAL (stacksize too small)
+Init: pthread_create - EAGAIN (stacksize too large)
+Init: pthread_create - EINVAL (invalid inherit scheduler)
+Init: pthread_create - ENOTSUP (unsupported system contention scope)
+Init: pthread_create - SUCCESSFUL (inherit scheduler)
+Task_1: exitting
+
+Init: pthread_attr_setscope - EINVAL (NULL attr)
+Init: pthread_attr_setscope - ENOTSUP
+Init: pthread_attr_setscope - EINVAL (not initialized attr)
+Init: pthread_attr_setscope - EINVAL (invalid scope)
+Init: pthread_attr_setscope - SUCCESSFUL
+Init: pthread_attr_getscope - EINVAL (NULL attr)
+Init: pthread_attr_getscope - EINVAL (NULL scope)
+Init: pthread_attr_getscope - EINVAL (not initialized attr)
+Init: pthread_attr_getscope - SUCCESSFUL
+Init: current scope attribute = 0
+
+Init: pthread_attr_setinheritsched - EINVAL (NULL attr)
+Init: pthread_attr_setinheritsched - EINVAL (not initialized attr)
+Init: pthread_attr_setinheritsched - ENOTSUP (invalid inheritsched)
+Init: pthread_attr_setinheritsched - SUCCESSFUL
+Init: pthread_attr_getinheritsched - EINVAL (NULL attr)
+Init: pthread_attr_getinheritsched - EINVAL (NULL inheritsched)
+Init: pthread_attr_getinheritsched - EINVAL (not initialized attr)
+Init: pthread_attr_getinheritsched - SUCCESSFUL
+Init: current inherit scheduler attribute = 1
+
+Init: pthread_attr_setschedpolicy - EINVAL (NULL attr)
+Init: pthread_attr_setschedpolicy - EINVAL (not initialized attr)
+Init: pthread_attr_setschedpolicy - ENOTSUP (invalid schedpolicy)
+Init: pthread_attr_setschedpolicy - SUCCESSFUL
+Init: pthread_attr_getschedpolicy - EINVAL (NULL attr)
+Init: pthread_attr_getschedpolicy - EINVAL (NULL schedpolicy)
+Init: pthread_attr_getschedpolicy - EINVAL (not initialized attr)
+Init: pthread_attr_getschedpolicy - SUCCESSFUL
+Init: current scheduler policy attribute = 2
+
+Init: pthread_attr_setstacksize - EINVAL (NULL attr)
+Init: pthread_attr_setstacksize - EINVAL (not initialized attr)
+Init: pthread_attr_setstacksize - SUCCESSFUL (low stacksize)
+Init: pthread_attr_setstacksize - SUCCESSFUL (high stacksize)
+Init: pthread_attr_getstacksize - EINVAL (NULL attr)
+Init: pthread_attr_getstacksize - EINVAL (NULL stacksize)
+Init: pthread_attr_getstacksize - EINVAL (not initialized attr)
+Init: pthread_attr_getstacksize - SUCCESSFUL
+Init: current stack size attribute = 5120
+
+Init: pthread_attr_setstackaddr - EINVAL (NULL attr)
+Init: pthread_attr_setstackaddr - EINVAL (not initialized attr)
+Init: pthread_attr_setstackaddr - SUCCESSFUL
+Init: pthread_attr_getstackaddr - EINVAL (NULL attr)
+Init: pthread_attr_getstackaddr - EINVAL (NULL stackaddr)
+Init: pthread_attr_getstackaddr - EINVAL (not initialized attr)
+Init: pthread_attr_getstackaddr - SUCCESSFUL
+Init: current stack address attribute = 0x0
+
+Init: pthread_attr_setdetachstate - EINVAL (NULL attr)
+Init: pthread_attr_setdetachstate - EINVAL (not initialized attr)
+Init: pthread_attr_setdetachstate - EINVAL (invalid detachstate)
+Init: pthread_attr_setdetachstate - SUCCESSFUL
+Init: pthread_attr_getdetachstate - EINVAL (NULL attr)
+Init: pthread_attr_getdetachstate - EINVAL (NULL detatchstate)
+Init: pthread_attr_getdetachstate - EINVAL (not initialized attr)
+Init: pthread_attr_getdetachstate - SUCCESSFUL
+Init: current detach state attribute = 1
+
+Init: pthread_attr_getschedparam - SUCCESSFUL
+Init: sched priority = 2
+Init: ss_low_priority = 0
+Init: ss_replenish_period = (0, 0)
+Init: ss_initial_budget = (0, 0)
+Init: pthread_attr_setschedparam - EINVAL (NULL attr)
+Init: pthread_attr_setschedparam - EINVAL (not initialized attr)
+Init: pthread_attr_setschedparam - EINVAL (NULL schedparam)
+Init: pthread_attr_setschedparam - SUCCESSFUL
+Init: pthread_attr_getschedparam - EINVAL (NULL attr)
+Init: pthread_attr_getschedparam - EINVAL (not initialized attr)
+Init: pthread_attr_getschedparam - EINVAL (NULL schedparam)
+
+Init: pthread_getschedparam - EINVAL (NULL policy)
+Init: pthread_getschedparam - EINVAL (NULL schedparam)
+Init: pthread_getschedparam - ESRCH (bad thread)
+Init: pthread_getschedparam - SUCCESSFUL
+Init: policy = 1
+Init: sched priority = 2
+Init: ss_low_priority = 0
+Init: ss_replenish_period = (0, 0)
+Init: ss_initial_budget = (0, 0)
+
+Init: pthread_setschedparam - EINVAL (NULL schedparam)
+Init: pthread_setschedparam - EINVAL (invalid priority)
+Init: pthread_setschedparam - EINVAL (invalid policy)
+Init: pthread_setschedparam - ESRCH (invalid thread)
+Init: pthread_setschedparam - EINVAL (replenish < budget)
+Init: pthread_setschedparam - EINVAL (invalid priority)
+*** END OF POSIX TEST 7 ***
diff --git a/c/src/tests/psxtests/psx07/system.h b/c/src/tests/psxtests/psx07/system.h
new file mode 100644
index 0000000000..cda511751e
--- /dev/null
+++ b/c/src/tests/psxtests/psx07/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx07/task.c b/c/src/tests/psxtests/psx07/task.c
new file mode 100644
index 0000000000..d4dc39d840
--- /dev/null
+++ b/c/src/tests/psxtests/psx07/task.c
@@ -0,0 +1,34 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <time.h>
+#include <sched.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx08/Makefile.in b/c/src/tests/psxtests/psx08/Makefile.in
new file mode 100644
index 0000000000..2e772d44dc
--- /dev/null
+++ b/c/src/tests/psxtests/psx08/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx08
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task task2
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx08/init.c b/c/src/tests/psxtests/psx08/init.c
new file mode 100644
index 0000000000..bd6ad8c2b1
--- /dev/null
+++ b/c/src/tests/psxtests/psx08/init.c
@@ -0,0 +1,82 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ void *return_pointer;
+
+ puts( "\n\n*** POSIX TEST 8 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ puts( "Init: pthread_detach - ESRCH (invalid id)" );
+ status = pthread_detach( -1 );
+ assert( status == ESRCH );
+
+ /* detach this thread */
+
+ puts( "Init: pthread_detach self" );
+ status = pthread_detach( pthread_self() );
+ assert( !status );
+
+ /* create thread */
+
+ puts( "Init: creating two tasks" );
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ puts( "Init: pthread_join - ESRCH (invalid id)" );
+ status = pthread_join( -1, &return_pointer );
+ assert( status == ESRCH );
+
+ puts( "Init: pthread_join - SUCCESSFUL" );
+ status = pthread_join( Task_id, &return_pointer );
+ /* assert is below comment */
+
+ /* switch to Task 1 */
+
+ puts( "Init: returned from pthread_join" );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ if ( return_pointer == &Task_id )
+ puts( "Init: pthread_join returned correct pointer" );
+ else
+ printf(
+ "Init: pthread_join returned incorrect pointer (%p != %p)\n",
+ return_pointer,
+ &Task_id
+ );
+
+ puts( "Init: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx08/psx08.scn b/c/src/tests/psxtests/psx08/psx08.scn
new file mode 100644
index 0000000000..34c1934f59
--- /dev/null
+++ b/c/src/tests/psxtests/psx08/psx08.scn
@@ -0,0 +1,18 @@
+*** POSIX TEST 8 ***
+Init's ID is 0x0c010001
+Init: pthread_detach - ESRCH (invalid id)
+Init: pthread_detach self
+Init: creating two tasks
+Init: pthread_join - ESRCH (invalid id)
+Init: pthread_join - SUCCESSFUL
+Task_1: sleep 1 second
+Task_2: join to Task_1
+Task_1: join to detached task (Init) -- EINVAL
+Task_1: join to self task (Init) -- EDEADLK
+Task_1: exitting
+Init: returned from pthread_join
+Init: pthread_join returned correct pointer
+Init: exitting
+Task_2: returned from pthread_join
+Task_2: pthread_join returned correct pointer
+*** END OF POSIX TEST 8 ***
diff --git a/c/src/tests/psxtests/psx08/system.h b/c/src/tests/psxtests/psx08/system.h
new file mode 100644
index 0000000000..84622608e0
--- /dev/null
+++ b/c/src/tests/psxtests/psx08/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx08/task.c b/c/src/tests/psxtests/psx08/task.c
new file mode 100644
index 0000000000..2724d49783
--- /dev/null
+++ b/c/src/tests/psxtests/psx08/task.c
@@ -0,0 +1,56 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+
+ puts( "Task_1: sleep 1 second" );
+
+ sleep( 1 );
+
+ /* switch to task 2 */
+
+ puts( "Task_1: join to detached task (Init) -- EINVAL" );
+ status = pthread_join( Init_id, NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Task_1: join to self task (Init) -- EDEADLK" );
+ status = pthread_join( pthread_self(), NULL );
+ if ( status != EDEADLK )
+ printf( "status = %d\n", status );
+ assert( status == EDEADLK );
+
+ puts( "Task_1: exitting" );
+
+ pthread_exit( &Task_id );
+
+ /* switch to init task */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx08/task2.c b/c/src/tests/psxtests/psx08/task2.c
new file mode 100644
index 0000000000..eceefe5553
--- /dev/null
+++ b/c/src/tests/psxtests/psx08/task2.c
@@ -0,0 +1,52 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+ void *return_pointer;
+
+ puts( "Task_2: join to Task_1" );
+ status = pthread_join( Task_id, &return_pointer );
+ puts( "Task_2: returned from pthread_join" );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ if ( return_pointer == &Task_id )
+ puts( "Task_2: pthread_join returned correct pointer" );
+ else
+ printf(
+ "Task_2: pthread_join returned incorrect pointer (%p != %p)\n",
+ return_pointer,
+ &Task_id
+ );
+
+ puts( "*** END OF POSIX TEST 8 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx09/Makefile.in b/c/src/tests/psxtests/psx09/Makefile.in
new file mode 100644
index 0000000000..488121e67a
--- /dev/null
+++ b/c/src/tests/psxtests/psx09/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx09
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx09/init.c b/c/src/tests/psxtests/psx09/init.c
new file mode 100644
index 0000000000..50119c3bc9
--- /dev/null
+++ b/c/src/tests/psxtests/psx09/init.c
@@ -0,0 +1,226 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void print_schedparam(
+ char *prefix,
+ struct sched_param *schedparam
+)
+{
+ printf( "%ssched priority = %d\n", prefix, schedparam->sched_priority );
+#if defined(_POSIX_SPORADIC_SERVER)
+ printf( "%sss_low_priority = %d\n", prefix, schedparam->ss_low_priority );
+ printf( "%sss_replenish_period = (%ld, %ld)\n", prefix,
+ schedparam->ss_replenish_period.tv_sec,
+ schedparam->ss_replenish_period.tv_nsec );
+ printf( "%sss_initial_budget = (%ld, %ld)\n", prefix,
+ schedparam->ss_initial_budget.tv_sec,
+ schedparam->ss_initial_budget.tv_nsec );
+#else
+ printf( "%s_POSIX_SPORADIC_SERVER is not defined\n" );
+#endif
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ int passes;
+ int schedpolicy;
+ int priority;
+ struct sched_param schedparam;
+ char buffer[ 80 ];
+ pthread_mutexattr_t attr;
+
+ puts( "\n\n*** POSIX TEST 9 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* try to use this thread as a sporadic server */
+
+ puts( "Init: pthread_getschedparam - SUCCESSFUL" );
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - current priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ schedparam.ss_replenish_period.tv_sec = 0;
+ schedparam.ss_replenish_period.tv_nsec = 500000000; /* 1/2 second */
+ schedparam.ss_initial_budget.tv_sec = 0;
+ schedparam.ss_initial_budget.tv_nsec = 250000000; /* 1/4 second */
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = 100;
+
+ puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ /* go into a loop consuming CPU time to watch our priority change */
+
+ for ( passes=0 ; passes <= 3 ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( priority != schedparam.sched_priority ) {
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+ passes++;
+ }
+ }
+
+ /* now see if this works if we are holding a priority ceiling mutex */
+
+ empty_line();
+
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ schedparam.ss_replenish_period.tv_sec = 0;
+ schedparam.ss_replenish_period.tv_nsec = 500000000; /* 1/2 second */
+ schedparam.ss_initial_budget.tv_sec = 0;
+ schedparam.ss_initial_budget.tv_nsec = 250000000; /* 1/4 second */
+
+#define HIGH_PRIORITY 150
+#define MEDIUM_PRIORITY 131
+#define LOW_PRIORITY 100
+
+ schedparam.sched_priority = HIGH_PRIORITY;
+ schedparam.ss_low_priority = LOW_PRIORITY;
+
+ puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( !status );
+
+ puts( "Init: Initializing mutex attributes for priority ceiling" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT );
+ assert( !status );
+
+ status = pthread_mutexattr_setprioceiling( &attr, MEDIUM_PRIORITY );
+ assert( !status );
+
+ puts( "Init: Creating a mutex" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ /* go into a loop consuming CPU time to watch our priority lower */
+
+ for ( ; ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( schedparam.sched_priority != LOW_PRIORITY )
+ continue;
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ puts( "Init: pthread_mutex_lock acquire the lock" );
+ status = pthread_mutex_lock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ break;
+ }
+
+ /* now spin waiting for our budget to be replenished */
+
+ for ( ; ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( schedparam.sched_priority == HIGH_PRIORITY )
+ break;
+ }
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ /* with this unlock we should be able to go to low priority */
+
+ puts( "Init: unlock mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ for ( ; ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( schedparam.sched_priority == LOW_PRIORITY )
+ break;
+ }
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ puts( "*** END OF POSIX TEST 9 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx09/psx09.scn b/c/src/tests/psxtests/psx09/psx09.scn
new file mode 100644
index 0000000000..afc609c456
--- /dev/null
+++ b/c/src/tests/psxtests/psx09/psx09.scn
@@ -0,0 +1,23 @@
+*** POSIX TEST 9 ***
+Init's ID is 0x0c010001
+Init: pthread_getschedparam - SUCCESSFUL
+Init: Fri May 24 11:05:00 1996 - current priority = 2
+Init: pthread_setschedparam - SUCCESSFUL (sporadic server)
+Init: Fri May 24 11:05:00 1996 - new priority = 200
+Init: Fri May 24 11:05:00 1996 - new priority = 100
+Init: Fri May 24 11:05:00 1996 - new priority = 200
+Init: Fri May 24 11:05:00 1996 - new priority = 100
+Init: Fri May 24 11:05:01 1996 - new priority = 200
+
+Init: pthread_setschedparam - SUCCESSFUL (sporadic server)
+Init: Initializing mutex attributes for priority ceiling
+Init: Creating a mutex
+Init: Fri May 24 11:05:01 1996 - new priority = 150
+Init: Fri May 24 11:05:01 1996 - new priority = 100
+Init: pthread_mutex_lock acquire the lock
+Init: Fri May 24 11:05:01 1996 - new priority = 131
+Init: Fri May 24 11:05:01 1996 - new priority = 150
+Init: unlock mutex
+Init: Fri May 24 11:05:01 1996 - new priority = 150
+Init: Fri May 24 11:05:01 1996 - new priority = 100
+*** END OF POSIX TEST 9 ***
diff --git a/c/src/tests/psxtests/psx09/system.h b/c/src/tests/psxtests/psx09/system.h
new file mode 100644
index 0000000000..32518e58b6
--- /dev/null
+++ b/c/src/tests/psxtests/psx09/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 10
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_mutex_t Mutex_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx10/Makefile.in b/c/src/tests/psxtests/psx10/Makefile.in
new file mode 100644
index 0000000000..29911a9cd3
--- /dev/null
+++ b/c/src/tests/psxtests/psx10/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx10
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx10/init.c b/c/src/tests/psxtests/psx10/init.c
new file mode 100644
index 0000000000..17105591a6
--- /dev/null
+++ b/c/src/tests/psxtests/psx10/init.c
@@ -0,0 +1,312 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <sched.h>
+
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ pthread_condattr_t attr;
+ pthread_condattr_t attr_error;
+ int pshared;
+ pthread_cond_t cond;
+ struct timespec timeout;
+
+ puts( "\n\n*** POSIX TEST 10 ***" );
+
+ puts( "Init: pthread_condattr_init" );
+ status = pthread_condattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_init - EINVAL (attribute invalid)" );
+ status = pthread_condattr_init( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_condattr_destroy" );
+ status = pthread_condattr_destroy( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_destroy - EINVAL (attribute invalid)" );
+ status = pthread_condattr_destroy( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_condattr_init" );
+ status = pthread_condattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_setpshared - PTHREAD_PROCESS_SHARED" );
+ status = pthread_condattr_setpshared( &attr, PTHREAD_PROCESS_SHARED );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_setpshared - PTHREAD_PROCESS_PRIVATE" );
+ status = pthread_condattr_setpshared( &attr, PTHREAD_PROCESS_PRIVATE );
+ assert( !status );
+
+ status = pthread_condattr_setpshared( NULL, PTHREAD_PROCESS_PRIVATE );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_condattr_setpshared - EINVAL (attribute invalid)" );
+
+ status = pthread_condattr_setpshared( &attr, 0xFFFFFF );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_condattr_setpshared - EINVAL (pshared invalid)" );
+
+ status = pthread_condattr_getpshared( &attr, &pshared );
+ assert( !status );
+ printf( "Init: pthread_condattr_getpshared - %d\n", pshared );
+
+ status = pthread_condattr_getpshared( NULL, &pshared );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_condattr_getpshared - EINVAL (attribute invalid)" );
+
+ puts( "Init: pthread_cond_init - NULL attr" );
+ status = pthread_cond_init( &cond, NULL );
+ assert( !status );
+
+/* error for attribute not initialized */
+
+ attr_error.is_initialized = FALSE;
+ status = pthread_cond_init( &cond, &attr_error );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_init - EINVAL (attr not initialized)" );
+
+ status = pthread_cond_init( &cond, NULL );
+ if ( status != ENOMEM )
+ printf( "status = %d\n", status );
+ assert( status == ENOMEM );
+ puts( "Init: pthread_cond_init - ENOMEM (too many conds)" );
+
+ puts( "Init: pthread_cond_destroy" );
+ status = pthread_cond_destroy( &cond );
+ assert( !status );
+
+/* error for bad condition variable passed */
+
+ status = pthread_cond_destroy( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_destroy - EINVAL (cond invalid)" );
+
+/* initiailize the attribute for the rest of the test */
+
+ puts( "Init: pthread_cond_init - attr" );
+ status = pthread_cond_init( &Cond1_id, &attr );
+ assert( !status );
+
+/* signal task1 with a condition variable */
+
+ empty_line();
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+/* switch to task1 to allow it to wait for a condition variable */
+
+ puts( "Init: sleep to switch to Task_1" );
+ sleep( 1 );
+
+ status = pthread_cond_destroy( &Cond1_id );
+ if ( status != EBUSY )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+ puts( "Init: pthread_cond_destroy - EBUSY (task1 waiting)" );
+
+ puts( "Init: pthread_cond_signal" );
+ status = pthread_cond_signal( &Cond1_id );
+ assert( !status );
+
+ empty_line();
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+/* switch to task1 and task2 to allow them to wait for broadcast signal */
+
+ puts( "Init: sleep - switch to Task_1 and Task_2" );
+ sleep( 1 );
+
+/* broadcast a condition variable to task1 and task2 */
+
+ puts( "Init: pthread_cond_broadcast" );
+ status = pthread_cond_broadcast( &Cond1_id );
+ assert( !status );
+
+ puts( "Init: sleep - switch to Task_1" );
+ sleep( 0 );
+
+/* timedwait case - timeout */
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+/* set timeout to 3 seconds */
+
+ status = clock_gettime( CLOCK_REALTIME, &timeout );
+ assert( !status );
+ timeout.tv_sec += 3;
+ timeout.tv_nsec = 0;
+
+ puts( "Init: pthread_cond_timedwait for 3 seconds" );
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ if ( status != ETIMEDOUT )
+ printf( "status = %d\n", status );
+ assert( status == ETIMEDOUT );
+ puts( "Init: pthread_cond_timedwait - ETIMEDOUT - (mutex not acquired)" );
+
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+/* remaining error messages */
+
+ empty_line();
+
+/* errors for bad variable passed */
+
+ status = pthread_cond_signal( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_signal - EINVAL (cond invalid)" );
+
+ status = pthread_cond_broadcast( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_broadcast - EINVAL (cond invalid)" );
+
+/* acquire mutex so errors will occur */
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ status = pthread_cond_wait( NULL, &Mutex_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_wait - EINVAL (cond invalid)" );
+
+ status = pthread_cond_timedwait( NULL, &Mutex_id, &timeout );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_timedwait - EINVAL (cond invalid)" );
+
+ status = pthread_cond_wait( &Cond1_id, NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_wait - EINVAL (mutex invalid)" );
+
+ status = pthread_cond_timedwait( &Cond1_id, NULL, &timeout );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_timedwait - EINVAL (mutex invalid)" );
+
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_timedwait - EINVAL (abstime NULL)" );
+
+ status = clock_gettime( CLOCK_REALTIME, &timeout );
+ assert( !status );
+ timeout.tv_sec -= 1;
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ if ( status != ETIMEDOUT )
+ printf( "status = %d\n", status );
+ assert( status == ETIMEDOUT );
+ puts( "Init: pthread_cond_timedwait - ETIMEDOUT (abstime->tv_sec < current time)" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+ status = clock_gettime( CLOCK_REALTIME, &timeout );
+ assert( !status );
+ timeout.tv_nsec -= 1;
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ if ( status != ETIMEDOUT )
+ printf( "status = %d\n", status );
+ assert( status == ETIMEDOUT );
+ puts( "Init: pthread_cond_timedwait - ETIMEDOUT (abstime->tv_nsec < current time)" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+/* wait and timedwait without mutex */
+
+/* XXX - this case is commented out in the code pending review
+ *
+ * status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ * if ( status != EINVAL )
+ * printf( "status = %d\n", status );
+ * assert( status == EINVAL );
+ */
+ puts( "Init: pthread_cond_wait - EINVAL (mutex not locked before call)" );
+
+/* XXX - this case is commented out in the code pending review
+ *
+ * status = clock_gettime( CLOCK_REALTIME, &timeout );
+ * assert( !status );
+ * timeout.tv_sec += 1;
+ * status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ * if ( status != EINVAL )
+ * printf( "status = %d\n", status );
+ * assert( status == EINVAL );
+ */
+ puts( "Init: pthread_cond_timedwait - EINVAL (mutex not locked before call)");
+
+ empty_line();
+
+ status = pthread_create( &Task3_id, NULL, Task_3, NULL );
+ assert( !status );
+
+/* switch to task3 to allow it to wait for broadcast signal */
+
+ puts( "Init: sleep - switch to Task_3" );
+ sleep( 1 );
+
+/* destroy the mutex so Task3 can not acguire at the end of Wait_support */
+
+ status = pthread_mutex_destroy( &Mutex_id );
+ assert( !status );
+
+/* signal a condition variable to task3 */
+
+ puts( "Init: pthread_cond_signal" );
+ status = pthread_cond_signal( &Cond1_id );
+
+ puts( "Init: sleep - switch to Task_3" );
+ sleep( 1 );
+
+ puts( "*** END OF POSIX TEST 10 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx10/psx10.scn b/c/src/tests/psxtests/psx10/psx10.scn
new file mode 100644
index 0000000000..a19b9d8c49
--- /dev/null
+++ b/c/src/tests/psxtests/psx10/psx10.scn
@@ -0,0 +1,60 @@
+*** POSIX TEST 10 ***
+Init: pthread_condattr_init
+Init: pthread_condattr_init - EINVAL (attribute invalid)
+Init: pthread_condattr_destroy
+Init: pthread_condattr_destroy - EINVAL (attribute invalid)
+Init: pthread_condattr_init
+Init: pthread_condattr_setpshared - PTHREAD_PROCESS_SHARED
+Init: pthread_condattr_setpshared - PTHREAD_PROCESS_PRIVATE
+Init: pthread_condattr_setpshared - EINVAL (attribute invalid)
+Init: pthread_condattr_setpshared - EINVAL (pshared invalid)
+Init: pthread_condattr_getpshared - 0
+Init: pthread_condattr_getpshared - EINVAL (attribute invalid)
+Init: pthread_cond_init - NULL attr
+Init: pthread_cond_init - EINVAL (attr not initialized)
+Init: pthread_cond_init - ENOMEM (too many conds)
+Init: pthread_cond_destroy
+Init: pthread_cond_destroy - EINVAL (cond invalid)
+Init: pthread_cond_init - attr
+
+Init: sleep to switch to Task_1
+Task_1: ID is 0x0c010002
+Task_1: pthread_cond_wait
+Init: pthread_cond_destroy - EBUSY (task1 waiting)
+Init: pthread_cond_signal
+
+Init: sleep - switch to Task_1 and Task_2
+Task_1: back from pthread_cond_wait release mutex
+Task_1: pthread_cond_wait
+Task_2: ID is 0x0c010003
+Task_2: pthread_cond_wait
+Init: pthread_cond_broadcast
+Init: sleep - switch to Task_1
+Task_1: back from pthread_cond_wait release mutex
+Task_1: task exit
+Task_2: back from pthread_cond_wait release mutex
+Task_2: task exit
+Init: pthread_cond_timedwait for 3 seconds
+Init: pthread_cond_timedwait - ETIMEDOUT - (mutex not acquired)
+
+Init: pthread_cond_signal - EINVAL (cond invalid)
+Init: pthread_cond_broadcast - EINVAL (cond invalid)
+Init: pthread_cond_wait - EINVAL (cond invalid)
+Init: pthread_cond_timedwait - EINVAL (cond invalid)
+Init: pthread_cond_wait - EINVAL (mutex invalid)
+Init: pthread_cond_timedwait - EINVAL (mutex invalid)
+Init: pthread_cond_timedwait - EINVAL (abstime NULL)
+Init: pthread_cond_timedwait - EINVAL (abstime->tv_sec invalid)
+Init: pthread_cond_timedwait - EINVAL (abstime->tv_nsec invalid)
+Init: pthread_cond_timedwait - EINVAL (abstime->tv_nsec to large)
+Init: pthread_cond_wait - EINVAL (mutex not locked before call)
+Init: pthread_cond_timedwait - EINVAL (mutex not locked before call)
+
+Init: sleep - switch to Task_3
+Task_3: ID is 0x0c010004
+Task_3: pthread_cond_wait
+Init: pthread_cond_signal
+Init: sleep - switch to Task_3
+Task_3: pthread_cond_wait - EINVAL (mutex not locked after signal)
+Task_3: task exit
+*** END OF POSIX TEST 10 ***
diff --git a/c/src/tests/psxtests/psx10/system.h b/c/src/tests/psxtests/psx10/system.h
new file mode 100644
index 0000000000..a3dfc0766d
--- /dev/null
+++ b/c/src/tests/psxtests/psx10/system.h
@@ -0,0 +1,69 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+#include <unistd.h>
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+void *Task_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 1
+
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_t Task3_id;
+TEST_EXTERN pthread_cond_t Cond1_id;
+TEST_EXTERN pthread_mutex_t Mutex_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx10/task.c b/c/src/tests/psxtests/psx10/task.c
new file mode 100644
index 0000000000..017d44e80d
--- /dev/null
+++ b/c/src/tests/psxtests/psx10/task.c
@@ -0,0 +1,65 @@
+/* Task_1
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+
+/* wait for a condition variable signal from Init */
+
+ Task_id = pthread_self();
+ printf( "Task_1: ID is 0x%08x\n", Task_id );
+
+ status = pthread_mutex_init( &Mutex_id, NULL );
+ assert( !status );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: back from pthread_cond_wait release mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+/* wait for a condition variable broadcast from Init */
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: back from pthread_cond_wait release mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: task exit" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx10/task2.c b/c/src/tests/psxtests/psx10/task2.c
new file mode 100644
index 0000000000..9190082bc8
--- /dev/null
+++ b/c/src/tests/psxtests/psx10/task2.c
@@ -0,0 +1,47 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ Task_id = pthread_self();
+ printf( "Task_2: ID is 0x%08x\n", Task_id );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_2: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ assert( !status );
+
+ puts( "Task_2: back from pthread_cond_wait release mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_2: task exit" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx10/task3.c b/c/src/tests/psxtests/psx10/task3.c
new file mode 100644
index 0000000000..3d73290440
--- /dev/null
+++ b/c/src/tests/psxtests/psx10/task3.c
@@ -0,0 +1,46 @@
+/* Task_3
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void *Task_3(
+ void *argument
+)
+{
+ int status;
+
+ Task_id = pthread_self();
+ printf( "Task_3: ID is 0x%08x\n", Task_id );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_3: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Task_3: pthread_cond_wait - EINVAL (mutex not locked after signal)");
+
+ puts( "Task_3: task exit" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx11/Makefile.in b/c/src/tests/psxtests/psx11/Makefile.in
new file mode 100644
index 0000000000..0e2628982a
--- /dev/null
+++ b/c/src/tests/psxtests/psx11/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx11
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx11/init.c b/c/src/tests/psxtests/psx11/init.c
new file mode 100644
index 0000000000..8eeca0f618
--- /dev/null
+++ b/c/src/tests/psxtests/psx11/init.c
@@ -0,0 +1,108 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct sched_param param;
+ pthread_attr_t attr;
+
+ puts( "\n\n*** POSIX TEST 11 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* exercise pthread_setschedparam */
+
+ param.sched_priority = 127;
+
+ puts( "Init: Setting scheduling parameters to FIFO with priority 127" );
+ status = pthread_setschedparam( Init_id, SCHED_FIFO, &param );
+ assert( !status );
+
+ param.sched_priority = 125;
+
+ puts( "Init: Setting scheduling parameters to RR with priority 125" );
+ status = pthread_setschedparam( Init_id, SCHED_RR, &param );
+ assert( !status );
+
+ param.sched_priority = 121;
+
+ puts( "Init: Setting scheduling parameters to OTHER with priority 121" );
+ status = pthread_setschedparam( Init_id, SCHED_OTHER, &param );
+ assert( !status );
+
+ /* create a thread as SCHED_FIFO */
+
+ puts( "Init: create a thread of SCHED_FIFO with priority 120" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ attr.schedpolicy = SCHED_FIFO;
+ attr.schedparam.sched_priority = 120;
+
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: join with the other thread" );
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ /* create a thread as SCHED_RR */
+
+ puts( "Init: create a thread of SCHED_RR with priority 120" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ attr.schedpolicy = SCHED_RR;
+ attr.schedparam.sched_priority = 120;
+
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: join with the other thread" );
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ /* create a thread as SCHED_OTHER */
+
+ puts( "Init: create a thread of SCHED_OTHER with priority 120" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ attr.schedpolicy = SCHED_OTHER;
+ attr.schedparam.sched_priority = 120;
+
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: join with the other thread" );
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ puts( "*** END OF POSIX TEST 11 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx11/psx11.scn b/c/src/tests/psxtests/psx11/psx11.scn
new file mode 100644
index 0000000000..69df5ec1b9
--- /dev/null
+++ b/c/src/tests/psxtests/psx11/psx11.scn
@@ -0,0 +1,18 @@
+*** POSIX TEST 11 ***
+Init's ID is 0x0c010001
+Init: Setting scheduling parameters to FIFO with priority 127
+Init: Setting scheduling parameters to RR with priority 125
+Init: Setting scheduling parameters to OTHER with priority 121
+Init: create a thread of SCHED_FIFO with priority 120
+Init: join with the other thread
+Task_1: killing time
+Task_1: exitting
+Init: create a thread of SCHED_RR with priority 120
+Init: join with the other thread
+Task_1: killing time
+Task_1: exitting
+Init: create a thread of SCHED_OTHER with priority 120
+Init: join with the other thread
+Task_1: killing time
+Task_1: exitting
+*** END OF POSIX TEST 11 ***
diff --git a/c/src/tests/psxtests/psx11/system.h b/c/src/tests/psxtests/psx11/system.h
new file mode 100644
index 0000000000..cda511751e
--- /dev/null
+++ b/c/src/tests/psxtests/psx11/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx11/task.c b/c/src/tests/psxtests/psx11/task.c
new file mode 100644
index 0000000000..5c0a3751b0
--- /dev/null
+++ b/c/src/tests/psxtests/psx11/task.c
@@ -0,0 +1,92 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <time.h>
+#include <sched.h>
+
+void diff_timespec(
+ struct timespec *start,
+ struct timespec *stop,
+ struct timespec *result
+)
+{
+ int nsecs_per_sec = 1000000000;
+
+ result->tv_sec = stop->tv_sec - start->tv_sec;
+ if ( stop->tv_nsec < start->tv_nsec ) {
+ result->tv_nsec = nsecs_per_sec - start->tv_nsec + stop->tv_nsec;
+ result->tv_sec--;
+ } else
+ result->tv_nsec = stop->tv_nsec - start->tv_nsec;
+
+}
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+ struct timespec start;
+ struct timespec current;
+ struct timespec difference;
+ struct timespec delay;
+
+ status = clock_gettime( CLOCK_REALTIME, &start );
+ assert( !status );
+
+ status = sched_rr_get_interval( getpid(), &delay );
+ assert( !status );
+
+ /* double the rr interval for confidence */
+
+ delay.tv_sec *= 2;
+ delay.tv_nsec *= 2;
+ if ( delay.tv_nsec >= 1000000000 ) { /* handle overflow/carry */
+ delay.tv_nsec -= 1000000000;
+ delay.tv_sec++;
+ }
+
+
+ puts( "Task_1: killing time" );
+ for ( ; ; ) {
+
+ status = clock_gettime( CLOCK_REALTIME, &current );
+ assert( !status );
+
+ diff_timespec( &start, &current, &difference );
+
+ if ( difference.tv_sec < delay.tv_sec )
+ continue;
+
+ if ( difference.tv_sec > delay.tv_sec )
+ break;
+
+ if ( difference.tv_nsec > delay.tv_nsec )
+ break;
+
+ }
+
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx12/Makefile.in b/c/src/tests/psxtests/psx12/Makefile.in
new file mode 100644
index 0000000000..e1f3d19845
--- /dev/null
+++ b/c/src/tests/psxtests/psx12/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=psx12
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/psxtests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/psxtests/psx12/init.c b/c/src/tests/psxtests/psx12/init.c
new file mode 100644
index 0000000000..aa223f1b91
--- /dev/null
+++ b/c/src/tests/psxtests/psx12/init.c
@@ -0,0 +1,140 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void print_schedparam(
+ char *prefix,
+ struct sched_param *schedparam
+)
+{
+ printf( "%ssched priority = %d\n", prefix, schedparam->sched_priority );
+#if defined(_POSIX_SPORADIC_SERVER)
+ printf( "%sss_low_priority = %d\n", prefix, schedparam->ss_low_priority );
+ printf( "%sss_replenish_period = (%ld, %ld)\n", prefix,
+ schedparam->ss_replenish_period.tv_sec,
+ schedparam->ss_replenish_period.tv_nsec );
+ printf( "%sss_initial_budget = (%ld, %ld)\n", prefix,
+ schedparam->ss_initial_budget.tv_sec,
+ schedparam->ss_initial_budget.tv_nsec );
+#else
+ printf( "%s_POSIX_SPORADIC_SERVER is not defined\n" );
+#endif
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ pthread_attr_t attr;
+ struct sched_param schedparam;
+
+ puts( "\n\n*** POSIX TEST 12 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* invalid scheduling policy error */
+
+ puts( "Init: pthread_attr_init - SUCCESSFUL" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
+ assert( !status );
+ attr.schedpolicy = -1;
+
+ puts( "Init: pthread_create - EINVAL (invalid scheduling policy)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* replenish period < budget error */
+
+ puts( "Init: pthread_attr_init - SUCCESSFUL" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ puts( "Init: set scheduling parameter attributes for sporadic server" );
+ status = pthread_attr_setschedpolicy( &attr, SCHED_SPORADIC );
+ assert( !status );
+
+ schedparam.ss_replenish_period.tv_sec = 1;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 2;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = 100;
+
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
+ assert( !status );
+
+ puts( "Init: pthread_create - EINVAL (replenish < budget)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* invalid ss_low_priority error */
+
+ schedparam.ss_replenish_period.tv_sec = 2;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = -1;
+
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ puts( "Init: pthread_create - EINVAL (invalid ss_low_priority)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* create a thread as a sporadic server */
+
+ schedparam.ss_replenish_period.tv_sec = 2;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = 100;
+
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ puts( "Init: pthread_create - SUCCESSFUL" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_join( Task_id, NULL );
+ assert( status );
+
+ /* switch to Task_1 */
+
+ puts( "*** END OF POSIX TEST 12 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psx12/psx12.scn b/c/src/tests/psxtests/psx12/psx12.scn
new file mode 100644
index 0000000000..fd969cb122
--- /dev/null
+++ b/c/src/tests/psxtests/psx12/psx12.scn
@@ -0,0 +1,11 @@
+*** POSIX TEST 12 ***
+Init's ID is 0x0c010001
+Init: pthread_attr_init - SUCCESSFUL
+Init: pthread_create - EINVAL (invalid scheduling policy)
+Init: pthread_attr_init - SUCCESSFUL
+Init: set scheduling parameter attributes for sporadic server
+Init: pthread_create - EINVAL (replenish < budget)
+Init: pthread_create - EINVAL (invalid ss_low_priority)
+Init: pthread_create - SUCCESSFUL
+Task_1: exitting
+*** END OF POSIX TEST 12 ***
diff --git a/c/src/tests/psxtests/psx12/system.h b/c/src/tests/psxtests/psx12/system.h
new file mode 100644
index 0000000000..87e8f92f94
--- /dev/null
+++ b/c/src/tests/psxtests/psx12/system.h
@@ -0,0 +1,54 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 10
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/c/src/tests/psxtests/psx12/task.c b/c/src/tests/psxtests/psx12/task.c
new file mode 100644
index 0000000000..d4dc39d840
--- /dev/null
+++ b/c/src/tests/psxtests/psx12/task.c
@@ -0,0 +1,34 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <time.h>
+#include <sched.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/c/src/tests/psxtests/psxhdrs/Makefile.in b/c/src/tests/psxtests/psxhdrs/Makefile.in
new file mode 100644
index 0000000000..178f498121
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/Makefile.in
@@ -0,0 +1,66 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# C source names, if any, go here -- minus the
+C_PIECES=\
+ clock01 clock02 clock03 clock04 clock05 \
+ cond01 cond02 cond03 cond04 cond05 cond06 cond07 \
+ cond08 cond09 cond10 \
+ key01 key02 key03 key04 \
+ mutex01 mutex02 mutex03 mutex04 mutex05 mutex06 mutex07 \
+ mutex08 mutex09 mutex10 mutex11 mutex12 mutex13 mutex14 \
+ mutex15 mutex16 \
+ pthread01 pthread02 pthread03 pthread04 pthread05 pthread06 \
+ pthread07 pthread08 pthread09 pthread10 pthread11 pthread12 \
+ pthread13 pthread14 pthread15 pthread16 pthread17 pthread18 \
+ pthread19 pthread20 pthread21 pthread22 pthread23 pthread24 \
+ pthread25 pthread26 pthread27 pthread28 pthread29 pthread30 \
+ pthread31 pthread32 pthread33 pthread34 pthread35 pthread36 \
+ proc01 proc02 proc03 proc04 proc05 proc06 proc07 proc08 \
+ proc09 proc10 proc11 proc12 proc13 proc14 \
+ sched01 sched02 sched03 sched04 sched05 sched06 sched07 sched08 \
+ signal01 signal02 signal03 signal04 signal05 signal06 signal07 \
+ signal08 signal09 signal10 signal11 signal12 signal13 signal14 \
+ signal15 signal16 signal17 signal18 signal19 signal20 signal21 \
+ signal22 \
+ time01 time02 time03 time04 time05 time06 time07 time08 time09 \
+ time10 time11 time12 time13 \
+ timer01 timer02 timer03 timer04 timer05 timer06
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(LIB)
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) ${OBJS}
diff --git a/c/src/tests/psxtests/psxhdrs/clock01.c b/c/src/tests/psxtests/psxhdrs/clock01.c
new file mode 100644
index 0000000000..db6c7a1113
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/clock01.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have clock_gettime"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ struct timespec tp;
+ int result;
+
+ result = clock_gettime( clock_id, &tp );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/clock02.c b/c/src/tests/psxtests/psxhdrs/clock02.c
new file mode 100644
index 0000000000..f18c8f8f12
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/clock02.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have clock_settime"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ struct timespec tp;
+ int result;
+
+ result = clock_settime( clock_id, &tp );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/clock03.c b/c/src/tests/psxtests/psxhdrs/clock03.c
new file mode 100644
index 0000000000..5a8d51b501
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/clock03.c
@@ -0,0 +1,30 @@
+
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have clock_getres"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ struct timespec res;
+ int result;
+
+ result = clock_getres( clock_id, &res );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/clock04.c b/c/src/tests/psxtests/psxhdrs/clock04.c
new file mode 100644
index 0000000000..3bdd0fe65c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/clock04.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_CPUTIME
+#error "rtems is supposed to have clock_getcpuclockid"
+#endif
+
+void test( void )
+{
+ pid_t pid = 0;
+ clockid_t clock_id;
+ int result;
+
+ result = clock_getcpuclockid( pid, &clock_id );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/clock05.c b/c/src/tests/psxtests/psxhdrs/clock05.c
new file mode 100644
index 0000000000..58d886f2d1
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/clock05.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_CPUTIME
+#error "rtems is supposed to have clock_setenable_attr"
+#endif
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have clock_setenable_attr"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ int attr;
+ int result;
+
+ attr = CLOCK_ENABLED;
+ attr = CLOCK_DISABLED;
+
+ result = clock_setenable_attr( clock_id, attr );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/clock06.c b/c/src/tests/psxtests/psxhdrs/clock06.c
new file mode 100644
index 0000000000..8f38f4d217
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/clock06.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_CPUTIME
+#error "rtems is supposed to have clock_getenable_attr"
+#endif
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have clock_getenable_attr"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ int attr;
+ int result;
+
+ result = clock_getenable_attr( clock_id, &attr );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond01.c b/c/src/tests/psxtests/psxhdrs/cond01.c
new file mode 100644
index 0000000000..9d77394ffc
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond01.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_init"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int result;
+
+ result = pthread_condattr_init( &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond02.c b/c/src/tests/psxtests/psxhdrs/cond02.c
new file mode 100644
index 0000000000..75575fe97b
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_destroy"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int result;
+
+ result = pthread_condattr_destroy( &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond03.c b/c/src/tests/psxtests/psxhdrs/cond03.c
new file mode 100644
index 0000000000..0a3b58852b
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond03.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_init"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ pthread_condattr_t attribute;
+ int result;
+
+ result = pthread_cond_init( &cond, &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond04.c b/c/src/tests/psxtests/psxhdrs/cond04.c
new file mode 100644
index 0000000000..d06183e21f
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond04.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_destroy"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ int result;
+
+ result = pthread_cond_destroy( &cond );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond05.c b/c/src/tests/psxtests/psxhdrs/cond05.c
new file mode 100644
index 0000000000..4775866dcc
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_signal"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ int result;
+
+ result = pthread_cond_signal( &cond );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond06.c b/c/src/tests/psxtests/psxhdrs/cond06.c
new file mode 100644
index 0000000000..39280757bc
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond06.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_wait"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_cond_wait( &cond, &mutex );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond07.c b/c/src/tests/psxtests/psxhdrs/cond07.c
new file mode 100644
index 0000000000..66524c1beb
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond07.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_timedwait"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ struct timespec abstime;
+ int result;
+
+ result = pthread_cond_timedwait( &cond, &mutex, &abstime );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond08.c b/c/src/tests/psxtests/psxhdrs/cond08.c
new file mode 100644
index 0000000000..65e90f5830
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond08.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_getpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_condattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int pshared;
+ int result;
+
+ result = pthread_condattr_getpshared( &attribute, &pshared );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond09.c b/c/src/tests/psxtests/psxhdrs/cond09.c
new file mode 100644
index 0000000000..76b8f3c46e
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond09.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_setpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_condattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int pshared;
+ int result;
+
+ pshared = PTHREAD_PROCESS_SHARED;
+ pshared = PTHREAD_PROCESS_PRIVATE;
+
+ result = pthread_condattr_setpshared( &attribute, pshared );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/cond10.c b/c/src/tests/psxtests/psxhdrs/cond10.c
new file mode 100644
index 0000000000..19acf9bb0b
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/cond10.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_broadcast"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ int result;
+
+ result = pthread_cond_broadcast( &cond );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/key01.c b/c/src/tests/psxtests/psxhdrs/key01.c
new file mode 100644
index 0000000000..c85c09772a
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/key01.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_key_create"
+#endif
+
+void key_destructor(
+ void *argument
+)
+{
+}
+
+void test( void )
+{
+ pthread_key_t key;
+ int result;
+
+ result = pthread_key_create( &key, key_destructor );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/key02.c b/c/src/tests/psxtests/psxhdrs/key02.c
new file mode 100644
index 0000000000..89bac33ca9
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/key02.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setspecific"
+#endif
+
+void test( void )
+{
+ pthread_key_t key;
+ int value;
+ int result;
+
+ key = 0;
+ value = 0;
+
+ result = pthread_setspecific( key, &value );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/key03.c b/c/src/tests/psxtests/psxhdrs/key03.c
new file mode 100644
index 0000000000..c139dfbb34
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/key03.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_getspecific"
+#endif
+
+void test( void )
+{
+ pthread_key_t key;
+ void *value;
+
+ key = 0;
+
+ value = pthread_getspecific( key );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/key04.c b/c/src/tests/psxtests/psxhdrs/key04.c
new file mode 100644
index 0000000000..258748ff99
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/key04.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_key_delete"
+#endif
+
+void test( void )
+{
+ pthread_key_t key = 0;
+ int result;
+
+ result = pthread_key_delete( key );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex01.c b/c/src/tests/psxtests/psxhdrs/mutex01.c
new file mode 100644
index 0000000000..afaab3a6f8
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex01.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_init"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int result;
+
+ result = pthread_mutexattr_init( &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex02.c b/c/src/tests/psxtests/psxhdrs/mutex02.c
new file mode 100644
index 0000000000..e707656aaa
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_destroy"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int result;
+
+ result = pthread_mutexattr_destroy( &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex03.c b/c/src/tests/psxtests/psxhdrs/mutex03.c
new file mode 100644
index 0000000000..30c6226c28
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex03.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_init"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ pthread_mutexattr_t attribute;
+ int result;
+
+ result = pthread_mutex_init( &mutex, &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex04.c b/c/src/tests/psxtests/psxhdrs/mutex04.c
new file mode 100644
index 0000000000..860f293621
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex04.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_destroy"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_destroy( &mutex );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex05.c b/c/src/tests/psxtests/psxhdrs/mutex05.c
new file mode 100644
index 0000000000..1ea0d1140e
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_lock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_lock( &mutex );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex06.c b/c/src/tests/psxtests/psxhdrs/mutex06.c
new file mode 100644
index 0000000000..1d89311a62
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex06.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_unlock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_unlock( &mutex );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex07.c b/c/src/tests/psxtests/psxhdrs/mutex07.c
new file mode 100644
index 0000000000..01edc72da7
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex07.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_setprotocol"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_setprotocol"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int protocol;
+ int result;
+
+ protocol = PTHREAD_PRIO_NONE;
+ protocol = PTHREAD_PRIO_INHERIT;
+ protocol = PTHREAD_PRIO_PROTECT;
+
+ result = pthread_mutexattr_setprotocol( &attribute, protocol );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex08.c b/c/src/tests/psxtests/psxhdrs/mutex08.c
new file mode 100644
index 0000000000..56e31ca630
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex08.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_getprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_getprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int prioceiling = 0;
+ int result;
+
+ result = pthread_mutexattr_getprioceiling( &attribute, &prioceiling );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex09.c b/c/src/tests/psxtests/psxhdrs/mutex09.c
new file mode 100644
index 0000000000..af326a2611
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex09.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_setprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_setprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int prioceiling = 0;
+ int result;
+
+ result = pthread_mutexattr_setprioceiling( &attribute, prioceiling );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex10.c b/c/src/tests/psxtests/psxhdrs/mutex10.c
new file mode 100644
index 0000000000..ea5eeb0faa
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex10.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_getpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_mutexattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int pshared;
+ int result;
+
+ result = pthread_mutexattr_getpshared( &attribute, &pshared );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex11.c b/c/src/tests/psxtests/psxhdrs/mutex11.c
new file mode 100644
index 0000000000..d9421ff6f6
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex11.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_setpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_mutexattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int pshared;
+ int result;
+
+ pshared = PTHREAD_PROCESS_SHARED;
+ pshared = PTHREAD_PROCESS_PRIVATE;
+
+ result = pthread_mutexattr_setpshared( &attribute, pshared );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex12.c b/c/src/tests/psxtests/psxhdrs/mutex12.c
new file mode 100644
index 0000000000..8167e27cd8
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex12.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_trylock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_trylock( &mutex );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex13.c b/c/src/tests/psxtests/psxhdrs/mutex13.c
new file mode 100644
index 0000000000..09ee561ad9
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex13.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_timedlock"
+#endif
+#ifndef _POSIX_TIMEOUTS
+#error "rtems is supposed to have pthread_mutex_timedlock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ struct timespec timeout;
+ int result;
+
+ result = pthread_mutex_timedlock( &mutex, &timeout );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex14.c b/c/src/tests/psxtests/psxhdrs/mutex14.c
new file mode 100644
index 0000000000..9cba669732
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex14.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_getprotocol"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_getprotocol"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int protocol;
+ int result;
+
+ result = pthread_mutexattr_getprotocol( &attribute, &protocol );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex15.c b/c/src/tests/psxtests/psxhdrs/mutex15.c
new file mode 100644
index 0000000000..e57abc68e5
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex15.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutex_getprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutex_getprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex;
+ int prioceiling;
+ int result;
+
+ result = pthread_mutex_getprioceiling( &mutex, &prioceiling );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/mutex16.c b/c/src/tests/psxtests/psxhdrs/mutex16.c
new file mode 100644
index 0000000000..1ffdad38ca
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/mutex16.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutex_setprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutex_setprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex;
+ int prioceiling;
+ int oldceiling;
+ int result;
+
+ prioceiling = 0;
+
+ result = pthread_mutex_setprioceiling( &mutex, prioceiling, &oldceiling );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc01.c b/c/src/tests/psxtests/psxhdrs/proc01.c
new file mode 100644
index 0000000000..024caf436b
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc01.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid;
+
+ pid = getpid();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc02.c b/c/src/tests/psxtests/psxhdrs/proc02.c
new file mode 100644
index 0000000000..3c578bf29d
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc02.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid;
+
+ pid = getppid();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc03.c b/c/src/tests/psxtests/psxhdrs/proc03.c
new file mode 100644
index 0000000000..1e5014b3b4
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc03.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ uid_t uid;
+
+ uid = getuid();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc04.c b/c/src/tests/psxtests/psxhdrs/proc04.c
new file mode 100644
index 0000000000..f569b6ffcc
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc04.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ uid_t uid;
+
+ uid = geteuid();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc05.c b/c/src/tests/psxtests/psxhdrs/proc05.c
new file mode 100644
index 0000000000..5881dd83a0
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc05.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t gid;
+
+ gid = getgid();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc06.c b/c/src/tests/psxtests/psxhdrs/proc06.c
new file mode 100644
index 0000000000..882bf09eec
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc06.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t gid;
+
+ gid = getegid();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc07.c b/c/src/tests/psxtests/psxhdrs/proc07.c
new file mode 100644
index 0000000000..e0e4e42cd4
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc07.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ uid_t uid;
+ int result;
+
+ uid = 0;
+
+ result = setuid( uid );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc08.c b/c/src/tests/psxtests/psxhdrs/proc08.c
new file mode 100644
index 0000000000..720e6a4641
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc08.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t gid;
+ int result;
+
+ gid = 0;
+
+ result = setgid( gid );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc09.c b/c/src/tests/psxtests/psxhdrs/proc09.c
new file mode 100644
index 0000000000..f83e2e31b0
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc09.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t grouplist[ 20 ];
+ int gidsetsize;
+ int result;
+
+ gidsetsize = 20;
+
+ result = getgroups( gidsetsize, grouplist );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc10.c b/c/src/tests/psxtests/psxhdrs/proc10.c
new file mode 100644
index 0000000000..4d491f2c76
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc10.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ char *loginname;
+
+ loginname = getlogin();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc11.c b/c/src/tests/psxtests/psxhdrs/proc11.c
new file mode 100644
index 0000000000..fb7adc5b89
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc11.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+#include <limits.h> /* for LOGIN_NAME_MAX */
+
+void test( void )
+{
+ char loginnamebuffer[ LOGIN_NAME_MAX ];
+ int result;
+
+ result = getlogin_r( loginnamebuffer, LOGIN_NAME_MAX );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc12.c b/c/src/tests/psxtests/psxhdrs/proc12.c
new file mode 100644
index 0000000000..67d35ce40c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc12.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pgrp;
+
+ pgrp = getpgrp();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc13.c b/c/src/tests/psxtests/psxhdrs/proc13.c
new file mode 100644
index 0000000000..326777d254
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc13.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid;
+
+ pid = setsid();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/proc14.c b/c/src/tests/psxtests/psxhdrs/proc14.c
new file mode 100644
index 0000000000..c07b0a8846
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/proc14.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid = 0;
+ pid_t pgid = 0;
+ int result;
+
+ result = setpgid( pid, pgid );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread01.c b/c/src/tests/psxtests/psxhdrs/pthread01.c
new file mode 100644
index 0000000000..83656a33b5
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread01.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_init"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int result;
+
+ result = pthread_attr_init( &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread02.c b/c/src/tests/psxtests/psxhdrs/pthread02.c
new file mode 100644
index 0000000000..a232be1a4c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_destroy"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int result;
+
+ result = pthread_attr_destroy( &attribute );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread03.c b/c/src/tests/psxtests/psxhdrs/pthread03.c
new file mode 100644
index 0000000000..1c3e476e27
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread03.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_setdetachstate"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int state;
+ int result;
+
+ state = PTHREAD_CREATE_DETACHED;
+ state = PTHREAD_CREATE_JOINABLE;
+
+ result = pthread_attr_setdetachstate( &attribute, state );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread04.c b/c/src/tests/psxtests/psxhdrs/pthread04.c
new file mode 100644
index 0000000000..3b3f355f33
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread04.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_getdetachstate"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int state;
+ int result;
+
+ result = pthread_attr_getdetachstate( &attribute, &state );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread05.c b/c/src/tests/psxtests/psxhdrs/pthread05.c
new file mode 100644
index 0000000000..8abc331f6b
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread05.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <limits.h> /* only for PTHREAD_STACK_MIN */
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setstacksize"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKSIZE
+#error "rtems is supposed to have pthread_setstacksize"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ size_t size;
+ int result;
+
+ size = PTHREAD_STACK_MIN;
+
+ result = pthread_attr_setstacksize( &attribute, size );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread06.c b/c/src/tests/psxtests/psxhdrs/pthread06.c
new file mode 100644
index 0000000000..5bdbd0502a
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread06.c
@@ -0,0 +1,33 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_getstacksize"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKSIZE
+#error "rtems is supposed to have pthread_getstacksize"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ size_t size;
+ int result;
+
+ result = pthread_attr_getstacksize( &attribute, &size );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread07.c b/c/src/tests/psxtests/psxhdrs/pthread07.c
new file mode 100644
index 0000000000..24db17e912
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread07.c
@@ -0,0 +1,38 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_create"
+#endif
+
+void *test_task(
+ void * arg
+)
+{
+ for ( ; ; )
+ ;
+}
+
+void test( void )
+{
+ pthread_t thread;
+ pthread_attr_t attribute;
+ void *arg = NULL;
+ int result;
+
+ result = pthread_create( &thread, &attribute, test_task, arg );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread08.c b/c/src/tests/psxtests/psxhdrs/pthread08.c
new file mode 100644
index 0000000000..5a77557c4e
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread08.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_exit"
+#endif
+
+void test( void )
+{
+ void *status = NULL;
+
+ pthread_exit( status );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread09.c b/c/src/tests/psxtests/psxhdrs/pthread09.c
new file mode 100644
index 0000000000..5c2399bedc
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread09.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_self"
+#endif
+
+void test( void )
+{
+ pthread_t self;
+
+ self = pthread_self();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread10.c b/c/src/tests/psxtests/psxhdrs/pthread10.c
new file mode 100644
index 0000000000..ab7c39f4af
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread10.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_equal"
+#endif
+
+void test( void )
+{
+ pthread_t id_1 = 0;
+ pthread_t id_2 = 0;
+ int result;
+
+ result = pthread_equal( id_1, id_2 );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread11.c b/c/src/tests/psxtests/psxhdrs/pthread11.c
new file mode 100644
index 0000000000..48d09ea6d2
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread11.c
@@ -0,0 +1,52 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_setschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ thread = 0;
+
+ policy = SCHED_OTHER;
+ policy = SCHED_FIFO;
+ policy = SCHED_RR;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = pthread_setschedparam( thread, policy, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread12.c b/c/src/tests/psxtests/psxhdrs/pthread12.c
new file mode 100644
index 0000000000..aa1aa7cef1
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread12.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_getschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ thread = 0;
+
+ result = pthread_getschedparam( thread, &policy, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread13.c b/c/src/tests/psxtests/psxhdrs/pthread13.c
new file mode 100644
index 0000000000..a116cadedb
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread13.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setscope"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int contentionscope;
+ int result;
+
+ contentionscope = PTHREAD_SCOPE_SYSTEM;
+ contentionscope = PTHREAD_SCOPE_PROCESS;
+
+ result = pthread_attr_setscope( &attr, contentionscope );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread14.c b/c/src/tests/psxtests/psxhdrs/pthread14.c
new file mode 100644
index 0000000000..c0e5d62f5c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread14.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getscope"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int contentionscope;
+ int result;
+
+ result = pthread_attr_getscope( &attr, &contentionscope );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread15.c b/c/src/tests/psxtests/psxhdrs/pthread15.c
new file mode 100644
index 0000000000..560e4b3998
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread15.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setinheritsched"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int inheritsched;
+ int result;
+
+ inheritsched = PTHREAD_INHERIT_SCHED;
+ inheritsched = PTHREAD_EXPLICIT_SCHED;
+
+ result = pthread_attr_setinheritsched( &attr, inheritsched );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread16.c b/c/src/tests/psxtests/psxhdrs/pthread16.c
new file mode 100644
index 0000000000..006022ac8f
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread16.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getinheritsched"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int inheritsched;
+ int result;
+
+ result = pthread_attr_getinheritsched( &attr, &inheritsched );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread17.c b/c/src/tests/psxtests/psxhdrs/pthread17.c
new file mode 100644
index 0000000000..b234bde16e
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread17.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setschedpolicy"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int policy;
+ int result;
+
+ policy = SCHED_FIFO;
+ policy = SCHED_RR;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ result = pthread_attr_setschedpolicy( &attr, policy );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread18.c b/c/src/tests/psxtests/psxhdrs/pthread18.c
new file mode 100644
index 0000000000..95ebdb88a0
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread18.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getschedpolicy"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int policy;
+ int result;
+
+ result = pthread_attr_getschedpolicy( &attr, &policy );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread19.c b/c/src/tests/psxtests/psxhdrs/pthread19.c
new file mode 100644
index 0000000000..9dec23a7c7
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread19.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setschedparam"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ struct sched_param param;
+ int result;
+
+ result = pthread_attr_setschedparam( &attr, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread20.c b/c/src/tests/psxtests/psxhdrs/pthread20.c
new file mode 100644
index 0000000000..066dffc549
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread20.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getschedparam"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ struct sched_param param;
+ int result;
+
+ result = pthread_attr_getschedparam( &attr, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread21.c b/c/src/tests/psxtests/psxhdrs/pthread21.c
new file mode 100644
index 0000000000..2afe366675
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread21.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_detach"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int result;
+
+ thread = 0;
+ result = pthread_detach( thread );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread22.c b/c/src/tests/psxtests/psxhdrs/pthread22.c
new file mode 100644
index 0000000000..2f864248c0
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread22.c
@@ -0,0 +1,50 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_setschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread = 0;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ policy = SCHED_OTHER;
+ policy = SCHED_FIFO;
+ policy = SCHED_RR;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = pthread_setschedparam( thread, policy, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread23.c b/c/src/tests/psxtests/psxhdrs/pthread23.c
new file mode 100644
index 0000000000..cea26984c4
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread23.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_getschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread = 0;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ result = pthread_getschedparam( thread, &policy, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread24.c b/c/src/tests/psxtests/psxhdrs/pthread24.c
new file mode 100644
index 0000000000..85be962d15
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread24.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <limits.h> /* only for PTHREAD_STACK_MIN */
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setstackaddr"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKADDR
+#error "rtems is supposed to have pthread_setstackaddr"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ void *stackaddr;
+ int result;
+
+ stackaddr = NULL;
+
+ result = pthread_attr_setstackaddr( &attribute, stackaddr );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread25.c b/c/src/tests/psxtests/psxhdrs/pthread25.c
new file mode 100644
index 0000000000..bc25003db8
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread25.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <limits.h> /* only for PTHREAD_STACK_MIN */
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_getstackaddr"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKADDR
+#error "rtems is supposed to have pthread_getstackaddr"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ void *stackaddr;
+ int result;
+
+ result = pthread_attr_getstackaddr( &attribute, &stackaddr );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread26.c b/c/src/tests/psxtests/psxhdrs/pthread26.c
new file mode 100644
index 0000000000..c32d313028
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread26.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_join"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ void *value_ptr;
+ int result;
+
+ thread = 0;
+
+ result = pthread_join( thread, &value_ptr );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread27.c b/c/src/tests/psxtests/psxhdrs/pthread27.c
new file mode 100644
index 0000000000..f91e4d777c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread27.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_once"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ pthread_once_t once_control = PTHREAD_ONCE_INIT;
+ int result;
+
+ result = pthread_once( &once_control, init_routine );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread28.c b/c/src/tests/psxtests/psxhdrs/pthread28.c
new file mode 100644
index 0000000000..2cd78427e4
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread28.c
@@ -0,0 +1,33 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cancel"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ pthread_t thread;
+ int result;
+
+ thread = 0;
+ result = pthread_cancel( thread );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread29.c b/c/src/tests/psxtests/psxhdrs/pthread29.c
new file mode 100644
index 0000000000..0c0e3589cf
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread29.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setcancelstate"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ int state;
+ int oldstate;
+ int result;
+
+ state = PTHREAD_CANCEL_ENABLE;
+ state = PTHREAD_CANCEL_DISABLE;
+
+ result = pthread_setcancelstate( state, &oldstate );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread30.c b/c/src/tests/psxtests/psxhdrs/pthread30.c
new file mode 100644
index 0000000000..092ffeeed2
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread30.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setcanceltype"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ int type;
+ int oldtype;
+ int result;
+
+ type = PTHREAD_CANCEL_DEFERRED;
+ type = PTHREAD_CANCEL_ASYNCHRONOUS;
+
+ result = pthread_setcanceltype( type, &oldtype );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread31.c b/c/src/tests/psxtests/psxhdrs/pthread31.c
new file mode 100644
index 0000000000..fc40bc0b5a
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread31.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_testcancel"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ pthread_testcancel();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread32.c b/c/src/tests/psxtests/psxhdrs/pthread32.c
new file mode 100644
index 0000000000..9de9781b80
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread32.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cleanup_push"
+#endif
+
+void cleanup_routine(
+ void *argument
+)
+{
+}
+
+void test( void )
+{
+ int argument;
+
+ argument = 0;
+
+ pthread_cleanup_push( cleanup_routine, &argument );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread33.c b/c/src/tests/psxtests/psxhdrs/pthread33.c
new file mode 100644
index 0000000000..ea650919d9
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread33.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cleanup_pop"
+#endif
+
+void test( void )
+{
+ pthread_cleanup_pop( 1 );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread34.c b/c/src/tests/psxtests/psxhdrs/pthread34.c
new file mode 100644
index 0000000000..2e162dd8a1
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread34.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have pthread_getcpuclockid"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ clockid_t clock_id;
+ int result;
+
+ thread = 0;
+
+ result = pthread_getcpuclockid( thread, &clock_id );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread35.c b/c/src/tests/psxtests/psxhdrs/pthread35.c
new file mode 100644
index 0000000000..d868eda810
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread35.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have pthread_attr_setcputime"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int clock_allowed;
+ int result;
+
+ clock_allowed = CLOCK_ALLOWED;
+ clock_allowed = CLOCK_DISALLOWED;
+
+ result = pthread_attr_setcputime( &attr, clock_allowed );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/pthread36.c b/c/src/tests/psxtests/psxhdrs/pthread36.c
new file mode 100644
index 0000000000..ebe54464e6
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/pthread36.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have pthread_attr_getcputime"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int clock_allowed;
+ int result;
+
+ result = pthread_attr_getcputime( &attr, &clock_allowed );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched01.c b/c/src/tests/psxtests/psxhdrs/sched01.c
new file mode 100644
index 0000000000..224bd08be1
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched01.c
@@ -0,0 +1,44 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_setparam"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ struct sched_param param;
+ int result;
+
+ pid = 0;
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = sched_setparam( pid, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched02.c b/c/src/tests/psxtests/psxhdrs/sched02.c
new file mode 100644
index 0000000000..34bd1f2468
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched02.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_getparam"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ struct sched_param param;
+ int result;
+
+ pid = 0;
+
+ result = sched_getparam( pid, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched03.c b/c/src/tests/psxtests/psxhdrs/sched03.c
new file mode 100644
index 0000000000..def9ca05cf
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched03.c
@@ -0,0 +1,52 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_setscheduler"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ pid = 0;
+
+ policy = SCHED_RR;
+ policy = SCHED_FIFO;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = sched_setscheduler( pid, policy, &param );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched04.c b/c/src/tests/psxtests/psxhdrs/sched04.c
new file mode 100644
index 0000000000..1473562c4c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched04.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_getscheduler"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ int result;
+
+ pid = 0;
+
+ result = sched_getscheduler( pid );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched05.c b/c/src/tests/psxtests/psxhdrs/sched05.c
new file mode 100644
index 0000000000..812bde66ef
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched05.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_yield"
+#endif
+
+void test( void )
+{
+ int result;
+
+ result = sched_yield();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched06.c b/c/src/tests/psxtests/psxhdrs/sched06.c
new file mode 100644
index 0000000000..1539dae3bb
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched06.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_get_priority_max"
+#endif
+
+void test( void )
+{
+ int policy;
+ int result;
+
+ policy = SCHED_RR;
+ policy = SCHED_FIFO;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ result = sched_get_priority_max( policy );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched07.c b/c/src/tests/psxtests/psxhdrs/sched07.c
new file mode 100644
index 0000000000..beeb9fd6ef
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched07.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_get_priority_min"
+#endif
+
+void test( void )
+{
+ int policy;
+ int result;
+
+ policy = SCHED_RR;
+ policy = SCHED_FIFO;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ result = sched_get_priority_min( policy );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/sched08.c b/c/src/tests/psxtests/psxhdrs/sched08.c
new file mode 100644
index 0000000000..787c4c305c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/sched08.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_rr_get_interval"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ struct timespec interval;
+ int result;
+
+ pid = 0;
+
+ result = sched_rr_get_interval( pid, &interval );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal01.c b/c/src/tests/psxtests/psxhdrs/signal01.c
new file mode 100644
index 0000000000..7c12e3d55b
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal01.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = sigaddset( &signal_set, signal_number );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal02.c b/c/src/tests/psxtests/psxhdrs/signal02.c
new file mode 100644
index 0000000000..7aa18d7364
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal02.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = sigdelset( &signal_set, signal_number );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal03.c b/c/src/tests/psxtests/psxhdrs/signal03.c
new file mode 100644
index 0000000000..75eedad35c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal03.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int result;
+
+ result = sigfillset( &signal_set );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal04.c b/c/src/tests/psxtests/psxhdrs/signal04.c
new file mode 100644
index 0000000000..807d13d2eb
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal04.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = sigismember( &signal_set, signal_number );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal05.c b/c/src/tests/psxtests/psxhdrs/signal05.c
new file mode 100644
index 0000000000..dcd94620b3
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal05.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int result;
+
+ result = sigemptyset( &signal_set );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal06.c b/c/src/tests/psxtests/psxhdrs/signal06.c
new file mode 100644
index 0000000000..2a7b6ddd42
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal06.c
@@ -0,0 +1,39 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int signal_number;
+ struct sigaction act;
+ struct sigaction oact;
+ int result;
+
+ signal_number = SIGALRM;
+
+ /*
+ * Really should not reference sa_handler and sa_signction simultaneously.
+ */
+
+ act.sa_handler = SIG_DFL;
+ act.sa_handler = SIG_IGN;
+ act.sa_mask = 0;
+ act.sa_flags = SA_NOCLDSTOP;
+ act.sa_flags = SA_SIGINFO;
+ act.sa_sigaction = NULL;
+
+ result = sigaction( signal_number, &act, &oact );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal07.c b/c/src/tests/psxtests/psxhdrs/signal07.c
new file mode 100644
index 0000000000..bf0c4343ff
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal07.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_kill"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int signal_number;
+ int result;
+
+ thread = 0;
+ signal_number = SIGALRM;
+
+ result = pthread_kill( thread, signal_number );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal08.c b/c/src/tests/psxtests/psxhdrs/signal08.c
new file mode 100644
index 0000000000..62356abf6c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal08.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_sigmask"
+#endif
+
+void test( void )
+{
+ int how;
+ sigset_t set;
+ sigset_t oset;
+ int result;
+
+ how = SIG_BLOCK;
+ how = SIG_UNBLOCK;
+ how = SIG_SETMASK;
+
+ result = pthread_sigmask( how, &set, &oset );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal09.c b/c/src/tests/psxtests/psxhdrs/signal09.c
new file mode 100644
index 0000000000..8c618ed1a3
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal09.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+
+void test( void )
+{
+ pid_t pid;
+ int signal_number;
+ int result;
+
+ pid = 0;
+ signal_number = SIGALRM;
+
+ result = kill( pid, signal_number );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal10.c b/c/src/tests/psxtests/psxhdrs/signal10.c
new file mode 100644
index 0000000000..b0fd6e4c01
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal10.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ int sig;
+ int result;
+
+ result = sigwait( &set, &sig );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal11.c b/c/src/tests/psxtests/psxhdrs/signal11.c
new file mode 100644
index 0000000000..bf9e552c31
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal11.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = raise( signal_number );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal12.c b/c/src/tests/psxtests/psxhdrs/signal12.c
new file mode 100644
index 0000000000..cfe2deecae
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal12.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ void (*signal_function_pointer)();
+ int signal_number;
+
+ signal_number = SIGALRM;
+
+ signal_function_pointer = signal( signal_number, SIG_IGN );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal13.c b/c/src/tests/psxtests/psxhdrs/signal13.c
new file mode 100644
index 0000000000..0d8c23184e
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal13.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int how;
+ sigset_t set;
+ sigset_t oset;
+ int result;
+
+ how = SIG_BLOCK;
+ how = SIG_UNBLOCK;
+ how = SIG_SETMASK;
+
+ (void) sigemptyset( &set );
+
+ result = sigprocmask( how, &set, &oset );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal14.c b/c/src/tests/psxtests/psxhdrs/signal14.c
new file mode 100644
index 0000000000..460cfeb00c
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal14.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigpending( &set );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal15.c b/c/src/tests/psxtests/psxhdrs/signal15.c
new file mode 100644
index 0000000000..e9a6b29826
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal15.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t sigmask;
+ int result;
+
+ (void) sigemptyset( &sigmask );
+
+ result = sigsuspend( &sigmask );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal16.c b/c/src/tests/psxtests/psxhdrs/signal16.c
new file mode 100644
index 0000000000..9a53d6ba39
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal16.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+#ifndef _POSIX_THREADS
+#define "rtems is supposed to have pthread_sigmask"
+#endif
+
+void test( void )
+{
+ int how;
+ sigset_t set;
+ sigset_t oset;
+ int result;
+
+ how = SIG_BLOCK;
+ how = SIG_UNBLOCK;
+ how = SIG_SETMASK;
+
+ (void) sigemptyset( &set );
+
+ result = pthread_sigmask( how, &set, &oset );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal17.c b/c/src/tests/psxtests/psxhdrs/signal17.c
new file mode 100644
index 0000000000..e71d600f41
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal17.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ siginfo_t info;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigwaitinfo( &set, &info );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal18.c b/c/src/tests/psxtests/psxhdrs/signal18.c
new file mode 100644
index 0000000000..eae94ed30a
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal18.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ siginfo_t info;
+ struct timespec timeout;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigtimedwait( &set, &info, &timeout );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal19.c b/c/src/tests/psxtests/psxhdrs/signal19.c
new file mode 100644
index 0000000000..e84b5df8af
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal19.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ int sig;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigwait( &set, &sig );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal20.c b/c/src/tests/psxtests/psxhdrs/signal20.c
new file mode 100644
index 0000000000..ae6755b53a
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal20.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ unsigned int seconds;
+ unsigned int result;
+
+ seconds = 10;
+
+ result = alarm( seconds );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal21.c b/c/src/tests/psxtests/psxhdrs/signal21.c
new file mode 100644
index 0000000000..1655a837ba
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal21.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int result;
+
+ result = pause();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/signal22.c b/c/src/tests/psxtests/psxhdrs/signal22.c
new file mode 100644
index 0000000000..6105899637
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/signal22.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <unistd.h>
+
+void test( void )
+{
+ unsigned int seconds;
+ unsigned int result;
+
+ seconds = 10;
+
+ result = sleep( seconds );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time01.c b/c/src/tests/psxtests/psxhdrs/time01.c
new file mode 100644
index 0000000000..2528c0ee81
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time01.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ clock_t clock_ticks;
+
+ clock_ticks = clock();
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time02.c b/c/src/tests/psxtests/psxhdrs/time02.c
new file mode 100644
index 0000000000..20a1183dd3
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time1;
+ time_t time2;
+ double difference;
+
+ time1 = 0;
+ time2 = 0;
+
+ difference = difftime( time1, time2 );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time03.c b/c/src/tests/psxtests/psxhdrs/time03.c
new file mode 100644
index 0000000000..b470864da2
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time03.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ struct tm timestruct;
+ time_t time_encoded;
+
+ timestruct.tm_sec = 0;
+ timestruct.tm_min = 0;
+ timestruct.tm_hour = 0;
+ timestruct.tm_mday = 1;
+ timestruct.tm_mon = 0;
+ timestruct.tm_year = 0;
+ timestruct.tm_wday = 0;
+ timestruct.tm_yday = 0;
+ timestruct.tm_isdst = 0;
+
+ time_encoded = mktime( &timestruct );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time04.c b/c/src/tests/psxtests/psxhdrs/time04.c
new file mode 100644
index 0000000000..02e18451d5
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time04.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t new_time;
+
+ new_time = time( &new_time );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time05.c b/c/src/tests/psxtests/psxhdrs/time05.c
new file mode 100644
index 0000000000..ad12f12e3b
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ size_t length;
+ size_t max_length;
+ char buffer[ 80 ];
+ struct tm timestruct;
+
+ max_length = sizeof( buffer );
+
+ length = strftime( buffer, max_length, "%A", &timestruct );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time06.c b/c/src/tests/psxtests/psxhdrs/time06.c
new file mode 100644
index 0000000000..f44fcaeceb
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time06.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer;
+ struct tm timestruct;
+
+ buffer = asctime( &timestruct );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time07.c b/c/src/tests/psxtests/psxhdrs/time07.c
new file mode 100644
index 0000000000..cc6b947c4a
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time07.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer;
+ time_t time;
+
+ buffer = ctime( &time );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time08.c b/c/src/tests/psxtests/psxhdrs/time08.c
new file mode 100644
index 0000000000..c66378e741
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time08.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct;
+
+ timestruct = gmtime( &time );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time09.c b/c/src/tests/psxtests/psxhdrs/time09.c
new file mode 100644
index 0000000000..d85ece0b27
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time09.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct;
+
+ timestruct = localtime( &time );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time10.c b/c/src/tests/psxtests/psxhdrs/time10.c
new file mode 100644
index 0000000000..6e7bd4dd45
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time10.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer_pointer;
+ struct tm timestruct;
+ char buffer[ 80 ];
+
+ buffer_pointer = asctime_r( &timestruct, buffer );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time11.c b/c/src/tests/psxtests/psxhdrs/time11.c
new file mode 100644
index 0000000000..588ea174be
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time11.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer_pointer;
+ char buffer[ 80 ];
+ time_t time;
+
+ buffer_pointer = ctime_r( &time, buffer );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time12.c b/c/src/tests/psxtests/psxhdrs/time12.c
new file mode 100644
index 0000000000..3568bad319
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time12.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct_pointer;
+ struct tm timestruct;
+
+ timestruct_pointer = gmtime_r( &time, &timestruct );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/time13.c b/c/src/tests/psxtests/psxhdrs/time13.c
new file mode 100644
index 0000000000..a0d2e4e4bc
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/time13.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct_pointer;
+ struct tm timestruct;
+
+ timestruct_pointer = localtime_r( &time, &timestruct );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/timer01.c b/c/src/tests/psxtests/psxhdrs/timer01.c
new file mode 100644
index 0000000000..9ca32a2bc6
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/timer01.c
@@ -0,0 +1,37 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_create"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ timer_t timerid = 0;
+ struct sigevent evp;
+ int result;
+
+ evp.sigev_notify = SIGEV_NONE;
+ evp.sigev_notify = SIGEV_SIGNAL;
+ evp.sigev_notify = SIGEV_THREAD;
+ evp.sigev_signo = SIGALRM;
+ evp.sigev_value.sival_int = 0;
+ evp.sigev_value.sival_ptr = NULL;
+
+ result = timer_create( clock_id, &evp, &timerid );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/timer02.c b/c/src/tests/psxtests/psxhdrs/timer02.c
new file mode 100644
index 0000000000..ff6b7ab1f6
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/timer02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_delete"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ int result;
+
+ result = timer_delete( timerid );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/timer03.c b/c/src/tests/psxtests/psxhdrs/timer03.c
new file mode 100644
index 0000000000..abbf3399f9
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/timer03.c
@@ -0,0 +1,39 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_settime"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ int flags;
+ struct itimerspec value;
+ struct itimerspec ovalue;
+ int result;
+
+ value.it_interval.tv_sec = 0;
+ value.it_interval.tv_nsec = 0;
+ value.it_value.tv_sec = 0;
+ value.it_value.tv_nsec = 0;
+
+ flags = TIMER_ABSTIME;
+ flags = CLOCK_REALTIME;
+
+ result = timer_settime( timerid, flags, &value, &ovalue );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/timer04.c b/c/src/tests/psxtests/psxhdrs/timer04.c
new file mode 100644
index 0000000000..ae70418d00
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/timer04.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_gettime"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ struct itimerspec value;
+ int result;
+
+ result = timer_gettime( timerid, &value );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/timer05.c b/c/src/tests/psxtests/psxhdrs/timer05.c
new file mode 100644
index 0000000000..f420b9c9ee
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/timer05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_getoverrun"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ int result;
+
+ result = timer_getoverrun( timerid );
+}
diff --git a/c/src/tests/psxtests/psxhdrs/timer06.c b/c/src/tests/psxtests/psxhdrs/timer06.c
new file mode 100644
index 0000000000..9989c87da7
--- /dev/null
+++ b/c/src/tests/psxtests/psxhdrs/timer06.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have nanosleep"
+#endif
+
+void test( void )
+{
+ struct timespec rqtp;
+ struct timespec rmtp;
+ int result;
+
+ rqtp.tv_sec = 0;
+ rqtp.tv_nsec = 0;
+ result = nanosleep( &rqtp, &rmtp );
+}
diff --git a/c/src/tests/psxtests/support/Makefile.in b/c/src/tests/psxtests/support/Makefile.in
new file mode 100644
index 0000000000..b2929a91d1
--- /dev/null
+++ b/c/src/tests/psxtests/support/Makefile.in
@@ -0,0 +1,16 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+all:
+
+SUB_DIRS=include
+
diff --git a/c/src/tests/psxtests/support/include/Makefile.in b/c/src/tests/psxtests/support/include/Makefile.in
new file mode 100644
index 0000000000..d51a4547b2
--- /dev/null
+++ b/c/src/tests/psxtests/support/include/Makefile.in
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES= $(srcdir)/pmacros.h
+
+SYS_H_FILES=
+
+SRCS=$(H_FILES) $(SYS_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+# $(INSTALL) -m 444 $(SYS_H_FILES) ${PROJECT_RELEASE}/include/sys
+
diff --git a/c/src/tests/psxtests/support/include/pmacros.h b/c/src/tests/psxtests/support/include/pmacros.h
new file mode 100644
index 0000000000..1f15dac9c0
--- /dev/null
+++ b/c/src/tests/psxtests/support/include/pmacros.h
@@ -0,0 +1,85 @@
+/*
+ * $Id$
+ */
+
+#ifndef __POSIX_TEST_MACROS_h
+#define __POSIX_TEST_MACROS_h
+
+#include <bsp.h>
+#include <pthread.h>
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+/*
+ * These help manipulate the "struct tm" form of time
+ */
+
+#define TM_SUNDAY 0
+#define TM_MONDAY 1
+#define TM_TUESDAY 2
+#define TM_WEDNESDAY 3
+#define TM_THURSDAY 4
+#define TM_FRIDAY 5
+#define TM_SATURDAY 6
+
+#define TM_JANUARY 0
+#define TM_FEBRUARY 1
+#define TM_MARCH 2
+#define TM_APRIL 3
+#define TM_MAY 4
+#define TM_JUNE 5
+#define TM_JULY 6
+#define TM_AUGUST 7
+#define TM_SEPTEMBER 8
+#define TM_OCTOBER 10
+#define TM_NOVEMBER 12
+#define TM_DECEMBER 12
+
+#define build_time( TM, WEEKDAY, MON, DAY, YR, HR, MIN, SEC ) \
+ { (TM)->tm_year = YR; \
+ (TM)->tm_mon = MON; \
+ (TM)->tm_mday = DAY; \
+ (TM)->tm_wday = WEEKDAY; \
+ (TM)->tm_hour = HR; \
+ (TM)->tm_min = MIN; \
+ (TM)->tm_sec = SEC; }
+
+#define set_time( WEEKDAY, MON, DAY, YR, HR, MIN, SEC ) \
+ do { \
+ struct tm tm; \
+ struct timespec tv; \
+ int status; \
+ \
+ build_time( &tm, WEEKDAY, MON, DAY, YR, HR, MIN, SEC ); \
+ \
+ tv.tv_sec = mktime( &tm ); \
+ tv.tv_nsec = 0; \
+ assert( tv.tv_sec != -1 ); \
+ \
+ status = clock_settime( CLOCK_REALTIME, &tv ); \
+ assert( !status ); \
+ } while ( 0 )
+
+#define print_current_time(s1, s2) \
+ do { \
+ char _buffer[32]; \
+ int _status; \
+ struct timespec _tv; \
+ \
+ _status = clock_gettime( CLOCK_REALTIME, &_tv ); \
+ assert( !_status ); \
+ \
+ (void) ctime_r( &_tv.tv_sec, _buffer ); \
+ _buffer[ strlen( _buffer ) - 1 ] = 0; \
+ printf( "%s%s%s\n", s1, _buffer, s2 ); \
+ fflush(stdout); \
+ } while ( 0 )
+
+#define empty_line() puts( "" )
+
+#endif
+
+/* end of file */
diff --git a/c/src/tests/samples/Makefile.in b/c/src/tests/samples/Makefile.in
new file mode 100644
index 0000000000..155202988e
--- /dev/null
+++ b/c/src/tests/samples/Makefile.in
@@ -0,0 +1,27 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+# cdtest is a C++ constructor/destructor test
+# We only build it if HAS_CPLUSCPLUS was defined
+
+CPLUSPLUS_TESTS_yes_V = cdtest
+CPLUSPLUS_TESTS = $(CPLUSPLUS_TESTS_$(HAS_CPLUSPLUS)_V)
+
+# base_mp is a sample multiprocessing test
+# We only build it if HAS_MP was defined
+
+MP_TESTS_yes_V = base_mp
+MP_TESTS = $(MP_TESTS_$(HAS_MP)_V)
+
+FP_TESTS = paranoia
+
+SUB_DIRS=hello ticker base_sp $(MP_TESTS) $(CPLUSPLUS_TESTS) $(FP_TESTS)
diff --git a/c/src/tests/samples/README b/c/src/tests/samples/README
new file mode 100644
index 0000000000..d4ed109e3b
--- /dev/null
+++ b/c/src/tests/samples/README
@@ -0,0 +1,73 @@
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+# $Id$
+#
+
+This directory contains the RTEMS Sample Application Suite.
+The tests in this directory perform two functions:
+
+ + provide simple examples of applications which can be
+ used as a starting point for your application.
+
+ + help test a new board support package
+
+The hello and ticker applications are useful when first bringing up
+a new board support package. The base_mp test is useful when
+performing initial checkout on a new MPCI layer.
+
+The following describes each of the sample applications:
+
+ base_mp
+
+ This is a very simple two node multiprocessor application. It consists
+ of a single initialization task on each node which print out
+ their respective node numbers and task IDs. This test can be
+ used as a simple test of a new MPCI layer because it minimizes
+ the number of packets sent by RTEMS.
+
+ This is intended as a starting point for custom developed multiprocessor
+ applications.
+
+ base_sp
+
+ This is a simple single processor application which consists of
+ an initialization task which creates another task.
+
+ This is intended as a starting point for custom developed single
+ processor applications.
+
+ cdtest
+
+ A very simple C++ application which demonstrates that it is
+ possible to use C++ contructors and destructors in an RTEMS
+ application. Also does a perfunctory iostream test.
+
+ hello
+
+ This is the RTEMS version of the classic hello world program.
+ It consists of single initialization task which prints out
+ a few messages.
+
+ This test does not include a Clock Tick device driver and can
+ be used to test the startup code of the board support package
+ as well as console output.
+
+ paranoia
+
+ A public domain test of the floating point and math library
+ capabilities of a toolset. It reports discrepancies between
+ actual and expected results. It is a large test.
+
+ ticker
+
+ This is a simple test of the user's Clock Tick device driver.
+ This test has an initialization task create three application
+ tasks which sleep and periodically wake up and print the time.
+
diff --git a/c/src/tests/samples/base_mp/Makefile.in b/c/src/tests/samples/base_mp/Makefile.in
new file mode 100644
index 0000000000..1752394129
--- /dev/null
+++ b/c/src/tests/samples/base_mp/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=node1 node2
diff --git a/c/src/tests/samples/base_mp/apptask.c b/c/src/tests/samples/base_mp/apptask.c
new file mode 100644
index 0000000000..d73f4e612c
--- /dev/null
+++ b/c/src/tests/samples/base_mp/apptask.c
@@ -0,0 +1,37 @@
+/* Application_task
+ *
+ * This routine is as an example of an application task which
+ * prints a message including its RTEMS task id. This task
+ * then invokes exit to return to the monitor.
+ *
+ * Input parameters:
+ * node - processor's node number
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Application_task(
+ rtems_task_argument node
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ printf( "This task was invoked with the node argument (%d)\n", node );
+ printf( "This task has the id of 0x%x\n", tid );
+ printf( "*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***\n" );
+ exit( 0 );
+}
diff --git a/c/src/tests/samples/base_mp/init.c b/c/src/tests/samples/base_mp/init.c
new file mode 100644
index 0000000000..00ff01b1cf
--- /dev/null
+++ b/c/src/tests/samples/base_mp/init.c
@@ -0,0 +1,46 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the application, the current time might be
+ * set by this task.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_name task_name;
+ rtems_id tid;
+ rtems_status_code status;
+
+ printf( "\n\n*** SAMPLE MULTIPROCESSOR APPLICATION ***\n" );
+ printf( "Creating and starting an application task\n" );
+ task_name = rtems_build_name( 'T', 'A', '1', ' ' );
+ status = rtems_task_create( task_name, 1, RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_INTERRUPT_LEVEL(0), RTEMS_DEFAULT_ATTRIBUTES, &tid );
+ status = rtems_task_start(
+ tid,
+ Application_task,
+ Multiprocessing_configuration.node
+ );
+ status = rtems_task_delete( RTEMS_SELF );
+}
diff --git a/c/src/tests/samples/base_mp/node1/Makefile.in b/c/src/tests/samples/base_mp/node1/Makefile.in
new file mode 100644
index 0000000000..5cc463bdcd
--- /dev/null
+++ b/c/src/tests/samples/base_mp/node1/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=1
+SAMPLE=base_mp
+PGM=${ARCH}/$(SAMPLE)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init apptask
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(SAMPLE).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/samples
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/samples/base_mp/node1/base_mp.doc b/c/src/tests/samples/base_mp/node1/base_mp.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/samples/base_mp/node1/base_mp.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/samples/base_mp/node1/base_mp.scn b/c/src/tests/samples/base_mp/node1/base_mp.scn
new file mode 100644
index 0000000000..a2d2f359be
--- /dev/null
+++ b/c/src/tests/samples/base_mp/node1/base_mp.scn
@@ -0,0 +1,5 @@
+*** SAMPLE MULTIPROCESSOR APPLICATION ***
+Creating and starting an application task
+This task was invoked with the node argument (1)
+This task has the id of 0x10002
+*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***
diff --git a/c/src/tests/samples/base_mp/node2/Makefile.in b/c/src/tests/samples/base_mp/node2/Makefile.in
new file mode 100644
index 0000000000..ca901d5619
--- /dev/null
+++ b/c/src/tests/samples/base_mp/node2/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@:@srcdir@/..
+
+NODE=2
+SAMPLE=base_mp
+PGM=${ARCH}/$(SAMPLE)-node$(NODE).exe
+
+MANAGERS=io mp
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init apptask
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(SAMPLE).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES += -DNODE_NUMBER=$(NODE)
+CPPFLAGS += -I.
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/samples
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/samples/base_mp/node2/base_mp.doc b/c/src/tests/samples/base_mp/node2/base_mp.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/samples/base_mp/node2/base_mp.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/samples/base_mp/node2/base_mp.scn b/c/src/tests/samples/base_mp/node2/base_mp.scn
new file mode 100644
index 0000000000..95bc96a808
--- /dev/null
+++ b/c/src/tests/samples/base_mp/node2/base_mp.scn
@@ -0,0 +1,5 @@
+*** SAMPLE MULTIPROCESSOR APPLICATION ***
+Creating and starting an application task
+This task was invoked with the node argument (2)
+This task has the id of 0x20002
+*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***
diff --git a/c/src/tests/samples/base_mp/system.h b/c/src/tests/samples/base_mp/system.h
new file mode 100644
index 0000000000..0e86d0cce6
--- /dev/null
+++ b/c/src/tests/samples/base_mp/system.h
@@ -0,0 +1,48 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Application_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+/*
+ * Put the overrides of default configuration parameters here.
+ */
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/c/src/tests/samples/base_sp/Makefile.in b/c/src/tests/samples/base_sp/Makefile.in
new file mode 100644
index 0000000000..b9a5adb5b1
--- /dev/null
+++ b/c/src/tests/samples/base_sp/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+SAMPLE=base_sp
+PGM=${ARCH}/$(SAMPLE).exe
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init apptask
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(SAMPLE).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/samples
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
+
diff --git a/c/src/tests/samples/base_sp/apptask.c b/c/src/tests/samples/base_sp/apptask.c
new file mode 100644
index 0000000000..f3a7ff2bc8
--- /dev/null
+++ b/c/src/tests/samples/base_sp/apptask.c
@@ -0,0 +1,38 @@
+/* Application_task
+ *
+ * This routine is as an example of an application task which
+ * prints a message including its RTEMS task id. This task
+ * then invokes exit to return to the monitor.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Application_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+
+ printf( "Application task was invoked with argument (%d) "
+ "and has id of 0x%x\n", argument, tid );
+
+ printf( "*** END OF SAMPLE SINGLE PROCESSOR APPLICATION ***\n" );
+ exit( 0 );
+}
diff --git a/c/src/tests/samples/base_sp/base_sp.doc b/c/src/tests/samples/base_sp/base_sp.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/samples/base_sp/base_sp.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/samples/base_sp/base_sp.scn b/c/src/tests/samples/base_sp/base_sp.scn
new file mode 100644
index 0000000000..117ddaecb8
--- /dev/null
+++ b/c/src/tests/samples/base_sp/base_sp.scn
@@ -0,0 +1,5 @@
+*** SAMPLE SINGLE PROCESSOR APPLICATION ***
+Creating and starting an application task
+Application task was invoked with argument (0) and has id of 0x10002
+*** END OF SAMPLE SINGLE PROCESSOR APPLICATION ***
+
diff --git a/c/src/tests/samples/base_sp/init.c b/c/src/tests/samples/base_sp/init.c
new file mode 100644
index 0000000000..7d3e8a0d6d
--- /dev/null
+++ b/c/src/tests/samples/base_sp/init.c
@@ -0,0 +1,48 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the application, the current time might be
+ * set by this task.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+#define ARGUMENT 0
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_name task_name;
+ rtems_id tid;
+ rtems_status_code status;
+
+ printf( "\n\n*** SAMPLE SINGLE PROCESSOR APPLICATION ***\n" );
+ printf( "Creating and starting an application task\n" );
+
+ task_name = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create( task_name, 1, RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_INTERRUPT_LEVEL(0), RTEMS_DEFAULT_ATTRIBUTES, &tid );
+
+ status = rtems_task_start( tid, Application_task, ARGUMENT );
+
+ status = rtems_task_delete( RTEMS_SELF );
+}
diff --git a/c/src/tests/samples/base_sp/system.h b/c/src/tests/samples/base_sp/system.h
new file mode 100644
index 0000000000..e86654304e
--- /dev/null
+++ b/c/src/tests/samples/base_sp/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Application_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/c/src/tests/samples/cdtest/Makefile.in b/c/src/tests/samples/cdtest/Makefile.in
new file mode 100644
index 0000000000..75529f072b
--- /dev/null
+++ b/c/src/tests/samples/cdtest/Makefile.in
@@ -0,0 +1,66 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+SAMPLE=cdtest
+PGM=${ARCH}/$(SAMPLE).exe
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+# C++ source names, if any, go here -- minus the .cc
+CC_PIECES=main
+CC_FILES=$(CC_PIECES:%=%.cc)
+CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o)
+H_FILES=system.h
+
+DOCTYPES=
+DOCS=$(DOCTYPES:%=$(SAMPLE).%)
+
+SRCS=$(DOCS) $(C_FILES) $(CC_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(SAMPLE).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS += $(CPLUS_LD_LIBS)
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/samples
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/samples/cdtest/cdtest.scn b/c/src/tests/samples/cdtest/cdtest.scn
new file mode 100644
index 0000000000..a832a72372
--- /dev/null
+++ b/c/src/tests/samples/cdtest/cdtest.scn
@@ -0,0 +1,31 @@
+Hey I'm in base class constructor number 1 for 0x400010cc.
+Hey I'm in base class constructor number 2 for 0x400010d4.
+Hey I'm in derived class constructor number 3 for 0x400010d4.
+
+
+*** CONSTRUCTOR/DESTRUCTOR TEST ***
+Hey I'm in base class constructor number 4 for 0x4009ee08.
+Hey I'm in base class constructor number 5 for 0x4009ee10.
+Hey I'm in base class constructor number 6 for 0x4009ee18.
+Hey I'm in base class constructor number 7 for 0x4009ee20.
+Hey I'm in derived class constructor number 8 for 0x4009ee20.
+Testing a C++ I/O stream
+Hey I'm in derived class destructor number 8 for 0x4009ee20.
+Derived class - Instantiation order 8
+Hey I'm in base class destructor number 7 for 0x4009ee20.
+Instantiation order 8
+Hey I'm in base class destructor number 6 for 0x4009ee18.
+Instantiation order 6
+Hey I'm in base class destructor number 5 for 0x4009ee10.
+Instantiation order 5
+Hey I'm in base class destructor number 4 for 0x4009ee08.
+Instantiation order 5
+*** END OF CONSTRUCTOR/DESTRUCTOR TEST ***
+
+
+Hey I'm in derived class destructor number 3 for 0x400010d4.
+Derived class - Instantiation order 3
+Hey I'm in base class destructor number 2 for 0x400010d4.
+Instantiation order 3
+Hey I'm in base class destructor number 1 for 0x400010cc.
+Instantiation order 1
diff --git a/c/src/tests/samples/cdtest/init.c b/c/src/tests/samples/cdtest/init.c
new file mode 100644
index 0000000000..d033fd4dda
--- /dev/null
+++ b/c/src/tests/samples/cdtest/init.c
@@ -0,0 +1,26 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+#include <stdio.h>
diff --git a/c/src/tests/samples/cdtest/main.cc b/c/src/tests/samples/cdtest/main.cc
new file mode 100644
index 0000000000..d55f96e9f0
--- /dev/null
+++ b/c/src/tests/samples/cdtest/main.cc
@@ -0,0 +1,137 @@
+/*
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ * Based in part on OAR works.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdio.h>
+#include <iostream.h>
+
+extern "C" {
+extern rtems_task main_task(rtems_task_argument);
+}
+
+static int num_inst = 0;
+
+class A {
+public:
+ A(void)
+ {
+ num_inst++;
+ printf(
+ "Hey I'm in base class constructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+
+ /*
+ * Make sure we use some space
+ */
+
+ string = new char[50];
+ sprintf(string, "Instantiation order %d", num_inst);
+ };
+
+ virtual ~A()
+ {
+ printf(
+ "Hey I'm in base class destructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+ print();
+ num_inst--;
+ };
+
+ virtual void print() { printf("%s\n", string); };
+
+protected:
+ char *string;
+};
+
+class B : public A {
+public:
+ B(void)
+ {
+ num_inst++;
+ printf(
+ "Hey I'm in derived class constructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+
+ /*
+ * Make sure we use some space
+ */
+
+ string = new char[50];
+ sprintf(string, "Instantiation order %d", num_inst);
+ };
+
+ ~B()
+ {
+ printf(
+ "Hey I'm in derived class destructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+ print();
+ num_inst--;
+ };
+
+ void print() { printf("Derived class - %s\n", string); }
+};
+
+
+A foo;
+B foobar;
+
+void
+cdtest(void)
+{
+ A bar, blech, blah;
+ B bleak;
+
+ cout << "Testing a C++ I/O stream" << endl;
+
+ bar = blech;
+}
+
+//
+// main equivalent
+// It can not be called 'main' since the bsp owns that name
+// in many implementations in order to get global constructors
+// run.
+//
+// Ref: c/src/lib/libbsp/hppa1_1/pxfl/startup/bspstart.c
+//
+
+
+rtems_task main_task(
+ rtems_task_argument ignored
+)
+{
+ printf( "\n\n*** CONSTRUCTOR/DESTRUCTOR TEST ***\n" );
+
+ cdtest();
+
+ printf( "*** END OF CONSTRUCTOR/DESTRUCTOR TEST ***\n\n\n" );
+
+ exit(0);
+}
diff --git a/c/src/tests/samples/cdtest/system.h b/c/src/tests/samples/cdtest/system.h
new file mode 100644
index 0000000000..b7cea0b062
--- /dev/null
+++ b/c/src/tests/samples/cdtest/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task main_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_INIT_TASK_ENTRY_POINT main_task
+#define CONFIGURE_INIT_TASK_NAME rtems_build_name( 'C', 'T', 'O', 'R' )
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/c/src/tests/samples/hello/Makefile.in b/c/src/tests/samples/hello/Makefile.in
new file mode 100644
index 0000000000..39f11f5d6d
--- /dev/null
+++ b/c/src/tests/samples/hello/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+SAMPLE=hello
+PGM=${ARCH}/$(SAMPLE).exe
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(SAMPLE).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(SAMPLE).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/samples
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/samples/hello/hello.doc b/c/src/tests/samples/hello/hello.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/samples/hello/hello.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/samples/hello/hello.scn b/c/src/tests/samples/hello/hello.scn
new file mode 100644
index 0000000000..d9e92d81d5
--- /dev/null
+++ b/c/src/tests/samples/hello/hello.scn
@@ -0,0 +1,3 @@
+*** HELLO WORLD TEST ***
+Hello World
+*** END OF HELLO WORLD TEST ***
diff --git a/c/src/tests/samples/hello/init.c b/c/src/tests/samples/hello/init.c
new file mode 100644
index 0000000000..0fc3555260
--- /dev/null
+++ b/c/src/tests/samples/hello/init.c
@@ -0,0 +1,36 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+#include <stdio.h>
+
+rtems_task Init(
+ rtems_task_argument ignored
+)
+{
+ printf( "\n\n*** HELLO WORLD TEST ***\n" );
+ printf( "Hello World\n" );
+ printf( "*** END OF HELLO WORLD TEST ***\n" );
+ exit( 0 );
+}
diff --git a/c/src/tests/samples/hello/system.h b/c/src/tests/samples/hello/system.h
new file mode 100644
index 0000000000..f3beb5cbce
--- /dev/null
+++ b/c/src/tests/samples/hello/system.h
@@ -0,0 +1,37 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/c/src/tests/samples/paranoia/Makefile.in b/c/src/tests/samples/paranoia/Makefile.in
new file mode 100644
index 0000000000..080f5203c5
--- /dev/null
+++ b/c/src/tests/samples/paranoia/Makefile.in
@@ -0,0 +1,64 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+SAMPLE=paranoia
+PGM=${ARCH}/$(SAMPLE).exe
+
+MANAGERS=all
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init paranoia
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(SAMPLE).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(SAMPLE).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+# -DCYGNUS turns on more verbose msgs
+#
+
+DEFINES += -DNOSIGNAL -DCYGNUS -DNOMAIN
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS += -lm
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/samples
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/samples/paranoia/init.c b/c/src/tests/samples/paranoia/init.c
new file mode 100644
index 0000000000..00466ebb02
--- /dev/null
+++ b/c/src/tests/samples/paranoia/init.c
@@ -0,0 +1,39 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+extern int paranoia(int, char **);
+
+char *args[2] = { "paranoia", 0 };
+
+rtems_task Init(
+ rtems_task_argument ignored
+)
+{
+ printf( "\n\n*** PARANOIA TEST ***\n" );
+ paranoia(1, args);
+ printf( "*** END OF PARANOIA TEST ***\n" );
+ exit( 0 );
+}
diff --git a/c/src/tests/samples/paranoia/paranoia.c b/c/src/tests/samples/paranoia/paranoia.c
new file mode 100644
index 0000000000..3b860c3b4a
--- /dev/null
+++ b/c/src/tests/samples/paranoia/paranoia.c
@@ -0,0 +1,2300 @@
+/*
+ * $Id$
+ *
+ * A C version of Kahan's Floating Point Test "Paranoia"
+ *
+ * Thos Sumner, UCSF, Feb. 1985
+ * David Gay, BTL, Jan. 1986
+ *
+ * This is a rewrite from the Pascal version by
+ *
+ * B. A. Wichmann, 18 Jan. 1985
+ *
+ * (and does NOT exhibit good C programming style).
+ *
+ * Sun May 16 18:21:51 MDT 1993 Jeffrey Wheat (cassidy@cygnus.com)
+ * Removed KR_headers defines, removed ANSI prototyping
+ * Cleaned up and reformated code. Added special CYGNUS
+ * "verbose" mode type messages (-DCYGNUS).
+ * Note: This code is VERY NASTY.
+ *
+ * Adjusted to use Standard C headers 19 Jan. 1992 (dmg);
+ * compile with -DKR_headers or insert
+ * #define KR_headers
+ * at the beginning if you have an old-style C compiler.
+ *
+ * (C) Apr 19 1983 in BASIC version by:
+ * Professor W. M. Kahan,
+ * 567 Evans Hall
+ * Electrical Engineering & Computer Science Dept.
+ * University of California
+ * Berkeley, California 94720
+ * USA
+ *
+ * converted to Pascal by:
+ * B. A. Wichmann
+ * National Physical Laboratory
+ * Teddington Middx
+ * TW11 OLW
+ * UK
+ *
+ * converted to C by:
+ *
+ * David M. Gay and Thos Sumner
+ * AT&T Bell Labs Computer Center, Rm. U-76
+ * 600 Mountain Avenue University of California
+ * Murray Hill, NJ 07974 San Francisco, CA 94143
+ * USA USA
+ *
+ * with simultaneous corrections to the Pascal source (reflected
+ * in the Pascal source available over netlib).
+ * [A couple of bug fixes from dgh = sun!dhough incorporated 31 July 1986.]
+ *
+ * Reports of results on various systems from all the versions
+ * of Paranoia are being collected by Richard Karpinski at the
+ * same address as Thos Sumner. This includes sample outputs,
+ * bug reports, and criticisms.
+ *
+ * You may copy this program freely if you acknowledge its source.
+ * Comments on the Pascal version to NPL, please.
+ *
+ *
+ * The C version catches signals from floating-point exceptions.
+ * If signal(SIGFPE,...) is unavailable in your environment, you may
+ * #define NOSIGNAL to comment out the invocations of signal.
+ *
+ * This source file is too big for some C compilers, but may be split
+ * into pieces. Comments containing "SPLIT" suggest convenient places
+ * for this splitting. At the end of these comments is an "ed script"
+ * (for the UNIX(tm) editor ed) that will do this splitting.
+ *
+ * By #defining SINGLE_PRECISION when you compile this source, you may
+ * obtain a single-precision C version of Paranoia.
+ *
+ * The following is from the introductory commentary from Wichmann's work:
+ *
+ * The BASIC program of Kahan is written in Microsoft BASIC using many
+ * facilities which have no exact analogy in Pascal. The Pascal
+ * version below cannot therefore be exactly the same. Rather than be
+ * a minimal transcription of the BASIC program, the Pascal coding
+ * follows the conventional style of block-structured languages. Hence
+ * the Pascal version could be useful in producing versions in other
+ * structured languages.
+ *
+ * Rather than use identifiers of minimal length (which therefore have
+ * little mnemonic significance), the Pascal version uses meaningful
+ * identifiers as follows [Note: A few changes have been made for C]:
+ *
+ *
+ * BASIC C BASIC C BASIC C
+ *
+ * A J S StickyBit
+ * A1 AInverse J0 NoErrors T
+ * B Radix [Failure] T0 Underflow
+ * B1 BInverse J1 NoErrors T2 ThirtyTwo
+ * B2 RadixD2 [SeriousDefect] T5 OneAndHalf
+ * B9 BMinusU2 J2 NoErrors T7 TwentySeven
+ * C [Defect] T8 TwoForty
+ * C1 CInverse J3 NoErrors U OneUlp
+ * D [Flaw] U0 UnderflowThreshold
+ * D4 FourD K PageNo U1
+ * E0 L Milestone U2
+ * E1 M V
+ * E2 Exp2 N V0
+ * E3 N1 V8
+ * E5 MinSqEr O Zero V9
+ * E6 SqEr O1 One W
+ * E7 MaxSqEr O2 Two X
+ * E8 O3 Three X1
+ * E9 O4 Four X8
+ * F1 MinusOne O5 Five X9 Random1
+ * F2 Half O8 Eight Y
+ * F3 Third O9 Nine Y1
+ * F6 P Precision Y2
+ * F9 Q Y9 Random2
+ * G1 GMult Q8 Z
+ * G2 GDiv Q9 Z0 PseudoZero
+ * G3 GAddSub R Z1
+ * H R1 RMult Z2
+ * H1 HInverse R2 RDiv Z9
+ * I R3 RAddSub
+ * IO NoTrials R4 RSqrt
+ * I3 IEEE R9 Random9
+ *
+ * SqRWrng
+ *
+ * All the variables in BASIC are true variables and in consequence,
+ * the program is more difficult to follow since the "constants" must
+ * be determined (the glossary is very helpful). The Pascal version
+ * uses Real constants, but checks are added to ensure that the values
+ * are correctly converted by the compiler.
+ *
+ * The major textual change to the Pascal version apart from the
+ * identifiersis that named procedures are used, inserting parameters
+ * wherehelpful. New procedures are also introduced. The
+ * correspondence is as follows:
+ *
+ *
+ * BASIC Pascal
+ * lines
+ *
+ * 90- 140 Pause
+ * 170- 250 Instructions
+ * 380- 460 Heading
+ * 480- 670 Characteristics
+ * 690- 870 History
+ * 2940-2950 Random
+ * 3710-3740 NewD
+ * 4040-4080 DoesYequalX
+ * 4090-4110 PrintIfNPositive
+ * 4640-4850 TestPartialUnderflow
+ *
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * To compile this on host using only libm from newlib (and using host libc)
+ * do:
+ * gcc -g -DNEED_REENT -DCYGNUS paranoia.c .../newlib-1.6/newlib/libm.a
+ */
+
+#ifdef NEED_REENT
+#include <reent.h>
+struct _reent libm_reent = _REENT_INIT(libm_reent);
+struct _reent *_impure_ptr = &libm_reent;
+#endif
+
+#ifndef NOSIGNAL
+#include <signal.h>
+#include <setjmp.h>
+#else /* NOSIGNAL */
+#define longjmp(e,v)
+#define setjmp(e) 0
+#define jmp_buf int
+#endif /* NOSIGNAL */
+
+#ifdef SINGLE_PRECISION
+#define FLOAT float
+#define FABS(x) (float)fabs((double)(x))
+#define FLOOR(x) (float)floor((double)(x))
+#define LOG(x) (float)log((double)(x))
+#define POW(x,y) (float)pow((double)(x),(double)(y))
+#define SQRT(x) (float)sqrt((double)(x))
+#else /* !SINGLE_PRECISION */
+#define FLOAT double
+#define FABS(x) fabs(x)
+#define FLOOR(x) floor(x)
+#define LOG(x) log(x)
+#define POW(x,y) pow(x,y)
+#define SQRT(x) sqrt(x)
+#endif /* SINGLE_PRECISION */
+
+jmp_buf ovfl_buf;
+extern double fabs (), floor (), log (), pow (), sqrt ();
+extern void exit ();
+typedef void (*Sig_type) ();
+FLOAT Sign (), Random ();
+extern void BadCond ();
+extern void SqXMinX ();
+extern void TstCond ();
+extern void notify ();
+extern int read ();
+extern void Characteristics ();
+extern void Heading ();
+extern void History ();
+extern void Instructions ();
+extern void IsYeqX ();
+extern void NewD ();
+extern void Pause ();
+extern void PrintIfNPositive ();
+extern void SR3750 ();
+extern void SR3980 ();
+extern void TstPtUf ();
+
+Sig_type sigsave;
+
+#define KEYBOARD 0
+
+FLOAT Radix, BInvrse, RadixD2, BMinusU2;
+
+/*Small floating point constants.*/
+FLOAT Zero = 0.0;
+FLOAT Half = 0.5;
+FLOAT One = 1.0;
+FLOAT Two = 2.0;
+FLOAT Three = 3.0;
+FLOAT Four = 4.0;
+FLOAT Five = 5.0;
+FLOAT Eight = 8.0;
+FLOAT Nine = 9.0;
+FLOAT TwentySeven = 27.0;
+FLOAT ThirtyTwo = 32.0;
+FLOAT TwoForty = 240.0;
+FLOAT MinusOne = -1.0;
+FLOAT OneAndHalf = 1.5;
+
+/*Integer constants*/
+int NoTrials = 20; /*Number of tests for commutativity. */
+#define False 0
+#define True 1
+
+/*
+ * Definitions for declared types
+ * Guard == (Yes, No);
+ * Rounding == (Chopped, Rounded, Other);
+ * Message == packed array [1..40] of char;
+ * Class == (Flaw, Defect, Serious, Failure);
+ */
+#define Yes 1
+#define No 0
+#define Chopped 2
+#define Rounded 1
+#define Other 0
+#define Flaw 3
+#define Defect 2
+#define Serious 1
+#define Failure 0
+typedef int Guard, Rounding, Class;
+typedef char Message;
+
+/* Declarations of Variables */
+int Indx;
+char ch[8];
+FLOAT AInvrse, A1;
+FLOAT C, CInvrse;
+FLOAT D, FourD;
+FLOAT E0, E1, Exp2, E3, MinSqEr;
+FLOAT SqEr, MaxSqEr, E9;
+FLOAT Third;
+FLOAT F6, F9;
+FLOAT H, HInvrse;
+int I;
+FLOAT StickyBit, J;
+FLOAT MyZero;
+FLOAT Precision;
+FLOAT Q, Q9;
+FLOAT R, Random9;
+FLOAT T, Underflow, S;
+FLOAT OneUlp, UfThold, U1, U2;
+FLOAT V, V0, V9;
+FLOAT W;
+FLOAT X, X1, X2, X8, Random1;
+FLOAT Y, Y1, Y2, Random2;
+FLOAT Z, PseudoZero, Z1, Z2, Z9;
+int ErrCnt[4];
+int fpecount;
+int Milestone;
+int PageNo;
+int M, N, N1;
+Guard GMult, GDiv, GAddSub;
+Rounding RMult, RDiv, RAddSub, RSqrt;
+int Break, Done, NotMonot, Monot, Anomaly, IEEE, SqRWrng, UfNGrad;
+
+/* Computed constants.
+ * U1 gap below 1.0, i.e, 1.0 - U1 is next number below 1.0
+ * U2 gap above 1.0, i.e, 1.0 + U2 is next number above 1.0
+ */
+
+int batchmode; /* global batchmode test */
+
+/* program name and version variables and macro */
+char *temp;
+char *program_name;
+char *program_vers;
+
+#ifndef VERSION
+#define VERSION "1.1 [cygnus]"
+#endif /* VERSION */
+
+#define basename(cp) ((temp=(char *)strrchr((cp), '/')) ? temp+1 : (cp))
+
+#ifndef BATCHMODE
+# ifdef CYGNUS
+# define BATCHMODE
+# endif
+#endif
+
+/* floating point exception receiver */
+void
+_sigfpe (x)
+int x;
+{
+ fpecount++;
+ printf ("\n* * * FLOATING-POINT ERROR %d * * *\n", x);
+ fflush (stdout);
+ if (sigsave) {
+#ifndef NOSIGNAL
+ signal (SIGFPE, sigsave);
+#endif /* NOSIGNAL */
+ sigsave = 0;
+ longjmp (ovfl_buf, 1);
+ }
+ exit (1);
+}
+
+#ifdef NOMAIN
+#define main paranoia
+#endif
+
+int
+main (argc, argv)
+int argc;
+char **argv;
+{
+ /* First two assignments use integer right-hand sides. */
+ Zero = 0;
+ One = 1;
+ Two = One + One;
+ Three = Two + One;
+ Four = Three + One;
+ Five = Four + One;
+ Eight = Four + Four;
+ Nine = Three * Three;
+ TwentySeven = Nine * Three;
+ ThirtyTwo = Four * Eight;
+ TwoForty = Four * Five * Three * Four;
+ MinusOne = -One;
+ Half = One / Two;
+ OneAndHalf = One + Half;
+ ErrCnt[Failure] = 0;
+ ErrCnt[Serious] = 0;
+ ErrCnt[Defect] = 0;
+ ErrCnt[Flaw] = 0;
+ PageNo = 1;
+
+#ifdef BATCHMODE
+ batchmode = 1; /* run test in batchmode? */
+#else /* !BATCHMODE */
+ batchmode = 0; /* run test interactively */
+#endif /* BATCHMODE */
+
+ program_name = basename (argv[0]);
+ program_vers = VERSION;
+
+ printf ("%s version %s\n", program_name, program_vers);
+
+ /*=============================================*/
+ Milestone = 0;
+ /*=============================================*/
+#ifndef NOSIGNAL
+ signal (SIGFPE, _sigfpe);
+#endif
+
+ if (!batchmode) {
+ Instructions ();
+ Pause ();
+ Heading ();
+ Instructions ();
+ Pause ();
+ Heading ();
+ Pause ();
+ Characteristics ();
+ Pause ();
+ History ();
+ Pause ();
+ }
+
+ /*=============================================*/
+ Milestone = 7;
+ /*=============================================*/
+ printf ("Program is now RUNNING tests on small integers:\n");
+ TstCond (Failure, (Zero + Zero == Zero) && (One - One == Zero)
+ && (One > Zero) && (One + One == Two),
+ "0+0 != 0, 1-1 != 0, 1 <= 0, or 1+1 != 2");
+ Z = -Zero;
+ if (Z != 0.0) {
+ ErrCnt[Failure] = ErrCnt[Failure] + 1;
+ printf ("Comparison alleges that -0.0 is Non-zero!\n");
+ U1 = 0.001;
+ Radix = 1;
+ TstPtUf ();
+ }
+ TstCond (Failure, (Three == Two + One) && (Four == Three + One)
+ && (Four + Two * (-Two) == Zero)
+ && (Four - Three - One == Zero),
+ "3 != 2+1, 4 != 3+1, 4+2*(-2) != 0, or 4-3-1 != 0");
+ TstCond (Failure, (MinusOne == (0 - One))
+ && (MinusOne + One == Zero) && (One + MinusOne == Zero)
+ && (MinusOne + FABS (One) == Zero)
+ && (MinusOne + MinusOne * MinusOne == Zero),
+ "-1+1 != 0, (-1)+abs(1) != 0, or -1+(-1)*(-1) != 0");
+ TstCond (Failure, Half + MinusOne + Half == Zero,
+ "1/2 + (-1) + 1/2 != 0");
+ /*=============================================*/
+ Milestone = 10;
+ /*=============================================*/
+ TstCond (Failure, (Nine == Three * Three)
+ && (TwentySeven == Nine * Three) && (Eight == Four + Four)
+ && (ThirtyTwo == Eight * Four)
+ && (ThirtyTwo - TwentySeven - Four - One == Zero),
+ "9 != 3*3, 27 != 9*3, 32 != 8*4, or 32-27-4-1 != 0");
+ TstCond (Failure, (Five == Four + One) &&
+ (TwoForty == Four * Five * Three * Four)
+ && (TwoForty / Three - Four * Four * Five == Zero)
+ && (TwoForty / Four - Five * Three * Four == Zero)
+ && (TwoForty / Five - Four * Three * Four == Zero),
+ "5 != 4+1, 240/3 != 80, 240/4 != 60, or 240/5 != 48");
+ if (ErrCnt[Failure] == 0) {
+ printf ("-1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K.\n");
+ printf ("\n");
+ }
+ printf ("Searching for Radix and Precision.\n");
+ W = One;
+ do {
+ W = W + W;
+ Y = W + One;
+ Z = Y - W;
+ Y = Z - One;
+ }
+ while (MinusOne + FABS (Y) < Zero);
+ /*.. now W is just big enough that |((W+1)-W)-1| >= 1 ...*/
+ Precision = Zero;
+ Y = One;
+ do {
+ Radix = W + Y;
+ Y = Y + Y;
+ Radix = Radix - W;
+ }
+ while (Radix == Zero);
+ if (Radix < Two)
+ Radix = One;
+ printf ("Radix = %f .\n", Radix);
+ if (Radix != 1) {
+ W = One;
+ do {
+ Precision = Precision + One;
+ W = W * Radix;
+ Y = W + One;
+ }
+ while ((Y - W) == One);
+ }
+ /*... now W == Radix^Precision is barely too big to satisfy (W+1)-W == 1
+ ...*/
+ U1 = One / W;
+ U2 = Radix * U1;
+ printf ("Closest relative separation found is U1 = %.7e .\n\n", U1);
+ printf ("Recalculating radix and precision\n ");
+
+ /*save old values*/
+ E0 = Radix;
+ E1 = U1;
+ E9 = U2;
+ E3 = Precision;
+
+ X = Four / Three;
+ Third = X - One;
+ F6 = Half - Third;
+ X = F6 + F6;
+ X = FABS (X - Third);
+ if (X < U2)
+ X = U2;
+
+ /*... now X = (unknown no.) ulps of 1+...*/
+ do {
+ U2 = X;
+ Y = Half * U2 + ThirtyTwo * U2 * U2;
+ Y = One + Y;
+ X = Y - One;
+ }
+ while (!((U2 <= X) || (X <= Zero)));
+
+ /*... now U2 == 1 ulp of 1 + ... */
+ X = Two / Three;
+ F6 = X - Half;
+ Third = F6 + F6;
+ X = Third - Half;
+ X = FABS (X + F6);
+ if (X < U1)
+ X = U1;
+
+ /*... now X == (unknown no.) ulps of 1 -... */
+ do {
+ U1 = X;
+ Y = Half * U1 + ThirtyTwo * U1 * U1;
+ Y = Half - Y;
+ X = Half + Y;
+ Y = Half - X;
+ X = Half + Y;
+ }
+ while (!((U1 <= X) || (X <= Zero)));
+ /*... now U1 == 1 ulp of 1 - ... */
+ if (U1 == E1)
+ printf ("confirms closest relative separation U1 .\n");
+ else
+ printf ("gets better closest relative separation U1 = %.7e .\n", U1);
+ W = One / U1;
+ F9 = (Half - U1) + Half;
+ Radix = FLOOR (0.01 + U2 / U1);
+ if (Radix == E0)
+ printf ("Radix confirmed.\n");
+ else
+ printf ("MYSTERY: recalculated Radix = %.7e .\n", Radix);
+ TstCond (Defect, Radix <= Eight + Eight,
+ "Radix is too big: roundoff problems");
+ TstCond (Flaw, (Radix == Two) || (Radix == 10)
+ || (Radix == One), "Radix is not as good as 2 or 10");
+ /*=============================================*/
+ Milestone = 20;
+ /*=============================================*/
+ TstCond (Failure, F9 - Half < Half,
+ "(1-U1)-1/2 < 1/2 is FALSE, prog. fails?");
+ X = F9;
+ I = 1;
+ Y = X - Half;
+ Z = Y - Half;
+ TstCond (Failure, (X != One)
+ || (Z == Zero), "Comparison is fuzzy,X=1 but X-1/2-1/2 != 0");
+ X = One + U2;
+ I = 0;
+ /*=============================================*/
+ Milestone = 25;
+ /*=============================================*/
+ /*... BMinusU2 = nextafter(Radix, 0) */
+ BMinusU2 = Radix - One;
+ BMinusU2 = (BMinusU2 - U2) + One;
+ /* Purify Integers */
+ if (Radix != One) {
+ X = -TwoForty * LOG (U1) / LOG (Radix);
+ Y = FLOOR (Half + X);
+ if (FABS (X - Y) * Four < One)
+ X = Y;
+ Precision = X / TwoForty;
+ Y = FLOOR (Half + Precision);
+ if (FABS (Precision - Y) * TwoForty < Half)
+ Precision = Y;
+ }
+ if ((Precision != FLOOR (Precision)) || (Radix == One)) {
+ printf ("Precision cannot be characterized by an Integer number\n");
+ printf ("of significant digits but, by itself, this is a minor flaw.\n");
+ }
+ if (Radix == One)
+ printf ("logarithmic encoding has precision characterized solely by U1.\n");
+ else
+ printf ("The number of significant digits of the Radix is %f .\n",
+ Precision);
+ TstCond (Serious, U2 * Nine * Nine * TwoForty < One,
+ "Precision worse than 5 decimal figures ");
+ /*=============================================*/
+ Milestone = 30;
+ /*=============================================*/
+ /* Test for extra-precise subepressions */
+ X = FABS (((Four / Three - One) - One / Four) * Three - One / Four);
+ do {
+ Z2 = X;
+ X = (One + (Half * Z2 + ThirtyTwo * Z2 * Z2)) - One;
+ }
+ while (!((Z2 <= X) || (X <= Zero)));
+ X = Y = Z = FABS ((Three / Four - Two / Three) * Three - One / Four);
+ do {
+ Z1 = Z;
+ Z = (One / Two - ((One / Two - (Half * Z1 + ThirtyTwo * Z1 * Z1))
+ + One / Two)) + One / Two;
+ }
+ while (!((Z1 <= Z) || (Z <= Zero)));
+ do {
+ do {
+ Y1 = Y;
+ Y = (Half - ((Half - (Half * Y1 + ThirtyTwo * Y1 * Y1)) + Half
+ )) + Half;
+ }
+ while (!((Y1 <= Y) || (Y <= Zero)));
+ X1 = X;
+ X = ((Half * X1 + ThirtyTwo * X1 * X1) - F9) + F9;
+ }
+ while (!((X1 <= X) || (X <= Zero)));
+ if ((X1 != Y1) || (X1 != Z1)) {
+ BadCond (Serious, "Disagreements among the values X1, Y1, Z1,\n");
+ printf ("respectively %.7e, %.7e, %.7e,\n", X1, Y1, Z1);
+ printf ("are symptoms of inconsistencies introduced\n");
+ printf ("by extra-precise evaluation of arithmetic subexpressions.\n");
+ notify ("Possibly some part of this");
+ if ((X1 == U1) || (Y1 == U1) || (Z1 == U1))
+ printf (
+ "That feature is not tested further by this program.\n");
+ } else {
+ if ((Z1 != U1) || (Z2 != U2)) {
+ if ((Z1 >= U1) || (Z2 >= U2)) {
+ BadCond (Failure, "");
+ notify ("Precision");
+ printf ("\tU1 = %.7e, Z1 - U1 = %.7e\n", U1, Z1 - U1);
+ printf ("\tU2 = %.7e, Z2 - U2 = %.7e\n", U2, Z2 - U2);
+ } else {
+ if ((Z1 <= Zero) || (Z2 <= Zero)) {
+ printf ("Because of unusual Radix = %f", Radix);
+ printf (", or exact rational arithmetic a result\n");
+ printf ("Z1 = %.7e, or Z2 = %.7e ", Z1, Z2);
+ notify ("of an\nextra-precision");
+ }
+ if (Z1 != Z2 || Z1 > Zero) {
+ X = Z1 / U1;
+ Y = Z2 / U2;
+ if (Y > X)
+ X = Y;
+ Q = -LOG (X);
+ printf ("Some subexpressions appear to be calculated extra\n");
+ printf ("precisely with about %g extra B-digits, i.e.\n",
+ (Q / LOG (Radix)));
+ printf ("roughly %g extra significant decimals.\n",
+ Q / LOG (10.));
+ }
+ printf ("That feature is not tested further by this program.\n");
+ }
+ }
+ }
+ Pause ();
+ /*=============================================*/
+ Milestone = 35;
+ /*=============================================*/
+ if (Radix >= Two) {
+ X = W / (Radix * Radix);
+ Y = X + One;
+ Z = Y - X;
+ T = Z + U2;
+ X = T - Z;
+ TstCond (Failure, X == U2,
+ "Subtraction is not normalized X=Y,X+Z != Y+Z!");
+ if (X == U2)
+ printf (
+ "Subtraction appears to be normalized, as it should be.");
+ }
+ printf ("\nChecking for guard digit in *, /, and -.\n");
+ Y = F9 * One;
+ Z = One * F9;
+ X = F9 - Half;
+ Y = (Y - Half) - X;
+ Z = (Z - Half) - X;
+ X = One + U2;
+ T = X * Radix;
+ R = Radix * X;
+ X = T - Radix;
+ X = X - Radix * U2;
+ T = R - Radix;
+ T = T - Radix * U2;
+ X = X * (Radix - One);
+ T = T * (Radix - One);
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero))
+ GMult = Yes;
+ else {
+ GMult = No;
+ TstCond (Serious, False,
+ "* lacks a Guard Digit, so 1*X != X");
+ }
+ Z = Radix * U2;
+ X = One + Z;
+ Y = FABS ((X + Z) - X * X) - U2;
+ X = One - U2;
+ Z = FABS ((X - U2) - X * X) - U1;
+ TstCond (Failure, (Y <= Zero)
+ && (Z <= Zero), "* gets too many final digits wrong.\n");
+ Y = One - U2;
+ X = One + U2;
+ Z = One / Y;
+ Y = Z - X;
+ X = One / Three;
+ Z = Three / Nine;
+ X = X - Z;
+ T = Nine / TwentySeven;
+ Z = Z - T;
+ TstCond (Defect, X == Zero && Y == Zero && Z == Zero,
+ "Division lacks a Guard Digit, so error can exceed 1 ulp\n\
+or 1/3 and 3/9 and 9/27 may disagree");
+ Y = F9 / One;
+ X = F9 - Half;
+ Y = (Y - Half) - X;
+ X = One + U2;
+ T = X / One;
+ X = T - X;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero))
+ GDiv = Yes;
+ else {
+ GDiv = No;
+ TstCond (Serious, False,
+ "Division lacks a Guard Digit, so X/1 != X");
+ }
+ X = One / (One + U2);
+ Y = X - Half - Half;
+ TstCond (Serious, Y < Zero,
+ "Computed value of 1/1.000..1 >= 1");
+ X = One - U2;
+ Y = One + Radix * U2;
+ Z = X * Radix;
+ T = Y * Radix;
+ R = Z / Radix;
+ StickyBit = T / Radix;
+ X = R - X;
+ Y = StickyBit - Y;
+ TstCond (Failure, X == Zero && Y == Zero,
+ "* and/or / gets too many last digits wrong");
+ Y = One - U1;
+ X = One - F9;
+ Y = One - Y;
+ T = Radix - U2;
+ Z = Radix - BMinusU2;
+ T = Radix - T;
+ if ((X == U1) && (Y == U1) && (Z == U2) && (T == U2))
+ GAddSub = Yes;
+ else {
+ GAddSub = No;
+ TstCond (Serious, False,
+ "- lacks Guard Digit, so cancellation is obscured");
+ }
+ if (F9 != One && F9 - One >= Zero) {
+ BadCond (Serious, "comparison alleges (1-U1) < 1 although\n");
+ printf (" subtraction yields (1-U1) - 1 = 0 , thereby vitiating\n");
+ printf (" such precautions against division by zero as\n");
+ printf (" ... if (X == 1.0) {.....} else {.../(X-1.0)...}\n");
+ }
+ if (GMult == Yes && GDiv == Yes && GAddSub == Yes)
+ printf (
+ " *, /, and - appear to have guard digits, as they should.\n");
+ /*=============================================*/
+ Milestone = 40;
+ /*=============================================*/
+ Pause ();
+ printf ("Checking rounding on multiply, divide and add/subtract.\n");
+ RMult = Other;
+ RDiv = Other;
+ RAddSub = Other;
+ RadixD2 = Radix / Two;
+ A1 = Two;
+ Done = False;
+ do {
+ AInvrse = Radix;
+ do {
+ X = AInvrse;
+ AInvrse = AInvrse / A1;
+ }
+ while (!(FLOOR (AInvrse) != AInvrse));
+ Done = (X == One) || (A1 > Three);
+ if (!Done)
+ A1 = Nine + One;
+ }
+ while (!(Done));
+ if (X == One)
+ A1 = Radix;
+ AInvrse = One / A1;
+ X = A1;
+ Y = AInvrse;
+ Done = False;
+ do {
+ Z = X * Y - Half;
+ TstCond (Failure, Z == Half,
+ "X * (1/X) differs from 1");
+ Done = X == Radix;
+ X = Radix;
+ Y = One / X;
+ }
+ while (!(Done));
+ Y2 = One + U2;
+ Y1 = One - U2;
+ X = OneAndHalf - U2;
+ Y = OneAndHalf + U2;
+ Z = (X - U2) * Y2;
+ T = Y * Y1;
+ Z = Z - X;
+ T = T - X;
+ X = X * Y2;
+ Y = (Y + U2) * Y1;
+ X = X - OneAndHalf;
+ Y = Y - OneAndHalf;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T <= Zero)) {
+ X = (OneAndHalf + U2) * Y2;
+ Y = OneAndHalf - U2 - U2;
+ Z = OneAndHalf + U2 + U2;
+ T = (OneAndHalf - U2) * Y1;
+ X = X - (Z + U2);
+ StickyBit = Y * Y1;
+ S = Z * Y2;
+ T = T - Y;
+ Y = (U2 - Y) + StickyBit;
+ Z = S - (Z + U2 + U2);
+ StickyBit = (Y2 + U2) * Y1;
+ Y1 = Y2 * Y1;
+ StickyBit = StickyBit - Y2;
+ Y1 = Y1 - Half;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero)
+ && (StickyBit == Zero) && (Y1 == Half)) {
+ RMult = Rounded;
+ printf ("Multiplication appears to round correctly.\n");
+ } else if ((X + U2 == Zero) && (Y < Zero) && (Z + U2 == Zero)
+ && (T < Zero) && (StickyBit + U2 == Zero)
+ && (Y1 < Half)) {
+ RMult = Chopped;
+ printf ("Multiplication appears to chop.\n");
+ } else
+ printf ("* is neither chopped nor correctly rounded.\n");
+ if ((RMult == Rounded) && (GMult == No))
+ notify ("Multiplication");
+ } else
+ printf ("* is neither chopped nor correctly rounded.\n");
+ /*=============================================*/
+ Milestone = 45;
+ /*=============================================*/
+ Y2 = One + U2;
+ Y1 = One - U2;
+ Z = OneAndHalf + U2 + U2;
+ X = Z / Y2;
+ T = OneAndHalf - U2 - U2;
+ Y = (T - U2) / Y1;
+ Z = (Z + U2) / Y2;
+ X = X - OneAndHalf;
+ Y = Y - T;
+ T = T / Y1;
+ Z = Z - (OneAndHalf + U2);
+ T = (U2 - OneAndHalf) + T;
+ if (!((X > Zero) || (Y > Zero) || (Z > Zero) || (T > Zero))) {
+ X = OneAndHalf / Y2;
+ Y = OneAndHalf - U2;
+ Z = OneAndHalf + U2;
+ X = X - Y;
+ T = OneAndHalf / Y1;
+ Y = Y / Y1;
+ T = T - (Z + U2);
+ Y = Y - Z;
+ Z = Z / Y2;
+ Y1 = (Y2 + U2) / Y2;
+ Z = Z - OneAndHalf;
+ Y2 = Y1 - Y2;
+ Y1 = (F9 - U1) / F9;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero)
+ && (Y2 == Zero) && (Y2 == Zero)
+ && (Y1 - Half == F9 - Half)) {
+ RDiv = Rounded;
+ printf ("Division appears to round correctly.\n");
+ if (GDiv == No)
+ notify ("Division");
+ } else if ((X < Zero) && (Y < Zero) && (Z < Zero) && (T < Zero)
+ && (Y2 < Zero) && (Y1 - Half < F9 - Half)) {
+ RDiv = Chopped;
+ printf ("Division appears to chop.\n");
+ }
+ }
+ if (RDiv == Other)
+ printf ("/ is neither chopped nor correctly rounded.\n");
+ BInvrse = One / Radix;
+ TstCond (Failure, (BInvrse * Radix - Half == Half),
+ "Radix * ( 1 / Radix ) differs from 1");
+ /*=============================================*/
+ Milestone = 50;
+ /*=============================================*/
+ TstCond (Failure, ((F9 + U1) - Half == Half)
+ && ((BMinusU2 + U2) - One == Radix - One),
+ "Incomplete carry-propagation in Addition");
+ X = One - U1 * U1;
+ Y = One + U2 * (One - U2);
+ Z = F9 - Half;
+ X = (X - Half) - Z;
+ Y = Y - One;
+ if ((X == Zero) && (Y == Zero)) {
+ RAddSub = Chopped;
+ printf ("Add/Subtract appears to be chopped.\n");
+ }
+ if (GAddSub == Yes) {
+ X = (Half + U2) * U2;
+ Y = (Half - U2) * U2;
+ X = One + X;
+ Y = One + Y;
+ X = (One + U2) - X;
+ Y = One - Y;
+ if ((X == Zero) && (Y == Zero)) {
+ X = (Half + U2) * U1;
+ Y = (Half - U2) * U1;
+ X = One - X;
+ Y = One - Y;
+ X = F9 - X;
+ Y = One - Y;
+ if ((X == Zero) && (Y == Zero)) {
+ RAddSub = Rounded;
+ printf ("Addition/Subtraction appears to round correctly.\n");
+ if (GAddSub == No)
+ notify ("Add/Subtract");
+ } else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ } else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ } else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ S = One;
+ X = One + Half * (One + Half);
+ Y = (One + U2) * Half;
+ Z = X - Y;
+ T = Y - X;
+ StickyBit = Z + T;
+ if (StickyBit != Zero) {
+ S = Zero;
+ BadCond (Flaw, "(X - Y) + (Y - X) is non zero!\n");
+ }
+ StickyBit = Zero;
+ if ((GMult == Yes) && (GDiv == Yes) && (GAddSub == Yes)
+ && (RMult == Rounded) && (RDiv == Rounded)
+ && (RAddSub == Rounded) && (FLOOR (RadixD2) == RadixD2)) {
+ printf ("Checking for sticky bit.\n");
+ X = (Half + U1) * U2;
+ Y = Half * U2;
+ Z = One + Y;
+ T = One + X;
+ if ((Z - One <= Zero) && (T - One >= U2)) {
+ Z = T + Y;
+ Y = Z - X;
+ if ((Z - T >= U2) && (Y - T == Zero)) {
+ X = (Half + U1) * U1;
+ Y = Half * U1;
+ Z = One - Y;
+ T = One - X;
+ if ((Z - One == Zero) && (T - F9 == Zero)) {
+ Z = (Half - U1) * U1;
+ T = F9 - Z;
+ Q = F9 - Y;
+ if ((T - F9 == Zero) && (F9 - U1 - Q == Zero)) {
+ Z = (One + U2) * OneAndHalf;
+ T = (OneAndHalf + U2) - Z + U2;
+ X = One + Half / Radix;
+ Y = One + Radix * U2;
+ Z = X * Y;
+ if (T == Zero && X + Radix * U2 - Z == Zero) {
+ if (Radix != Two) {
+ X = Two + U2;
+ Y = X / Two;
+ if ((Y - One == Zero))
+ StickyBit = S;
+ } else
+ StickyBit = S;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (StickyBit == One)
+ printf ("Sticky bit apparently used correctly.\n");
+ else
+ printf ("Sticky bit used incorrectly or not at all.\n");
+ TstCond (Flaw, !(GMult == No || GDiv == No || GAddSub == No ||
+ RMult == Other || RDiv == Other || RAddSub == Other),
+ "lack(s) of guard digits or failure(s) to correctly round or chop\n\
+(noted above) count as one flaw in the final tally below");
+ /*=============================================*/
+ Milestone = 60;
+ /*=============================================*/
+ printf ("\n");
+ printf ("Does Multiplication commute? ");
+ printf ("Testing on %d random pairs.\n", NoTrials);
+ Random9 = SQRT (3.0);
+ Random1 = Third;
+ I = 1;
+ do {
+ X = Random ();
+ Y = Random ();
+ Z9 = Y * X;
+ Z = X * Y;
+ Z9 = Z - Z9;
+ I = I + 1;
+ }
+ while (!((I > NoTrials) || (Z9 != Zero)));
+ if (I == NoTrials) {
+ Random1 = One + Half / Three;
+ Random2 = (U2 + U1) + One;
+ Z = Random1 * Random2;
+ Y = Random2 * Random1;
+ Z9 = (One + Half / Three) * ((U2 + U1) + One) - (One + Half /
+ Three) * ((U2 + U1) + One);
+ }
+ if (!((I == NoTrials) || (Z9 == Zero)))
+ BadCond (Defect, "X * Y == Y * X trial fails.\n");
+ else
+ printf (" No failures found in %d integer pairs.\n", NoTrials);
+ /*=============================================*/
+ Milestone = 70;
+ /*=============================================*/
+ printf ("\nRunning test of square root(x).\n");
+ TstCond (Failure, (Zero == SQRT (Zero))
+ && (-Zero == SQRT (-Zero))
+ && (One == SQRT (One)), "Square root of 0.0, -0.0 or 1.0 wrong");
+ MinSqEr = Zero;
+ MaxSqEr = Zero;
+ J = Zero;
+ X = Radix;
+ OneUlp = U2;
+ SqXMinX (Serious);
+ X = BInvrse;
+ OneUlp = BInvrse * U1;
+ SqXMinX (Serious);
+ X = U1;
+ OneUlp = U1 * U1;
+ SqXMinX (Serious);
+ if (J != Zero)
+ Pause ();
+ printf ("Testing if sqrt(X * X) == X for %d Integers X.\n", NoTrials);
+ J = Zero;
+ X = Two;
+ Y = Radix;
+ if ((Radix != One))
+ do {
+ X = Y;
+ Y = Radix * Y;
+ }
+ while (!((Y - X >= NoTrials)));
+ OneUlp = X * U2;
+ I = 1;
+ while (I <= NoTrials) {
+ X = X + One;
+ SqXMinX (Defect);
+ if (J > Zero)
+ break;
+ I = I + 1;
+ }
+ printf ("Test for sqrt monotonicity.\n");
+ I = -1;
+ X = BMinusU2;
+ Y = Radix;
+ Z = Radix + Radix * U2;
+ NotMonot = False;
+ Monot = False;
+ while (!(NotMonot || Monot)) {
+ I = I + 1;
+ X = SQRT (X);
+ Q = SQRT (Y);
+ Z = SQRT (Z);
+ if ((X > Q) || (Q > Z))
+ NotMonot = True;
+ else {
+ Q = FLOOR (Q + Half);
+ if ((I > 0) || (Radix == Q * Q))
+ Monot = True;
+ else if (I > 0) {
+ if (I > 1)
+ Monot = True;
+ else {
+ Y = Y * BInvrse;
+ X = Y - U1;
+ Z = Y + U1;
+ }
+ } else {
+ Y = Q;
+ X = Y - U2;
+ Z = Y + U2;
+ }
+ }
+ }
+ if (Monot)
+ printf ("sqrt has passed a test for Monotonicity.\n");
+ else {
+ BadCond (Defect, "");
+ printf ("sqrt(X) is non-monotonic for X near %.7e .\n", Y);
+ }
+ /*=============================================*/
+ Milestone = 80;
+ /*=============================================*/
+ MinSqEr = MinSqEr + Half;
+ MaxSqEr = MaxSqEr - Half;
+ Y = (SQRT (One + U2) - One) / U2;
+ SqEr = (Y - One) + U2 / Eight;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ SqEr = Y + U2 / Eight;
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ Y = ((SQRT (F9) - U2) - (One - U2)) / U1;
+ SqEr = Y + U1 / Eight;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ SqEr = (Y + One) + U1 / Eight;
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ OneUlp = U2;
+ X = OneUlp;
+ for (Indx = 1; Indx <= 3; ++Indx) {
+ Y = SQRT ((X + U1 + X) + F9);
+ Y = ((Y - U2) - ((One - U2) + X)) / OneUlp;
+ Z = ((U1 - X) + F9) * Half * X * X / OneUlp;
+ SqEr = (Y + Half) + Z;
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ SqEr = (Y - Half) + Z;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ if (((Indx == 1) || (Indx == 3)))
+ X = OneUlp * Sign (X) * FLOOR (Eight / (Nine * SQRT (OneUlp)));
+ else {
+ OneUlp = U1;
+ X = -OneUlp;
+ }
+ }
+ /*=============================================*/
+ Milestone = 85;
+ /*=============================================*/
+ SqRWrng = False;
+ Anomaly = False;
+ RSqrt = Other; /* ~dgh */
+ if (Radix != One) {
+ printf ("Testing whether sqrt is rounded or chopped.\n");
+ D = FLOOR (Half + POW (Radix, One + Precision - FLOOR (Precision)));
+ /* ... == Radix^(1 + fract) if (Precision == Integer + fract. */
+ X = D / Radix;
+ Y = D / A1;
+ if ((X != FLOOR (X)) || (Y != FLOOR (Y))) {
+ Anomaly = True;
+ } else {
+ X = Zero;
+ Z2 = X;
+ Y = One;
+ Y2 = Y;
+ Z1 = Radix - One;
+ FourD = Four * D;
+ do {
+ if (Y2 > Z2) {
+ Q = Radix;
+ Y1 = Y;
+ do {
+ X1 = FABS (Q + FLOOR (Half - Q / Y1) * Y1);
+ Q = Y1;
+ Y1 = X1;
+ }
+ while (!(X1 <= Zero));
+ if (Q <= One) {
+ Z2 = Y2;
+ Z = Y;
+ }
+ }
+ Y = Y + Two;
+ X = X + Eight;
+ Y2 = Y2 + X;
+ if (Y2 >= FourD)
+ Y2 = Y2 - FourD;
+ }
+ while (!(Y >= D));
+ X8 = FourD - Z2;
+ Q = (X8 + Z * Z) / FourD;
+ X8 = X8 / Eight;
+ if (Q != FLOOR (Q))
+ Anomaly = True;
+ else {
+ Break = False;
+ do {
+ X = Z1 * Z;
+ X = X - FLOOR (X / Radix) * Radix;
+ if (X == One)
+ Break = True;
+ else
+ Z1 = Z1 - One;
+ }
+ while (!(Break || (Z1 <= Zero)));
+ if ((Z1 <= Zero) && (!Break))
+ Anomaly = True;
+ else {
+ if (Z1 > RadixD2)
+ Z1 = Z1 - Radix;
+ do {
+ NewD ();
+ }
+ while (!(U2 * D >= F9));
+ if (D * Radix - D != W - D)
+ Anomaly = True;
+ else {
+ Z2 = D;
+ I = 0;
+ Y = D + (One + Z) * Half;
+ X = D + Z + Q;
+ SR3750 ();
+ Y = D + (One - Z) * Half + D;
+ X = D - Z + D;
+ X = X + Q + X;
+ SR3750 ();
+ NewD ();
+ if (D - Z2 != W - Z2)
+ Anomaly = True;
+ else {
+ Y = (D - Z2) + (Z2 + (One - Z) * Half);
+ X = (D - Z2) + (Z2 - Z + Q);
+ SR3750 ();
+ Y = (One + Z) * Half;
+ X = Q;
+ SR3750 ();
+ if (I == 0)
+ Anomaly = True;
+ }
+ }
+ }
+ }
+ }
+ if ((I == 0) || Anomaly) {
+ BadCond (Failure, "Anomalous arithmetic with Integer < ");
+ printf ("Radix^Precision = %.7e\n", W);
+ printf (" fails test whether sqrt rounds or chops.\n");
+ SqRWrng = True;
+ }
+ }
+ if (!Anomaly) {
+ if (!((MinSqEr < Zero) || (MaxSqEr > Zero))) {
+ RSqrt = Rounded;
+ printf ("Square root appears to be correctly rounded.\n");
+ } else {
+ if ((MaxSqEr + U2 > U2 - Half) || (MinSqEr > Half)
+ || (MinSqEr + Radix < Half))
+ SqRWrng = True;
+ else {
+ RSqrt = Chopped;
+ printf ("Square root appears to be chopped.\n");
+ }
+ }
+ }
+ if (SqRWrng) {
+ printf ("Square root is neither chopped nor correctly rounded.\n");
+ printf ("Observed errors run from %.7e ", MinSqEr - Half);
+ printf ("to %.7e ulps.\n", Half + MaxSqEr);
+ TstCond (Serious, MaxSqEr - MinSqEr < Radix * Radix,
+ "sqrt gets too many last digits wrong");
+ }
+ /*=============================================*/
+ Milestone = 90;
+ /*=============================================*/
+ Pause ();
+ printf ("Testing powers Z^i for small Integers Z and i.\n");
+ N = 0;
+ /* ... test powers of zero. */
+ I = 0;
+ Z = -Zero;
+ M = 3;
+ Break = False;
+ do {
+ X = One;
+ SR3980 ();
+ if (I <= 10) {
+ I = 1023;
+ SR3980 ();
+ }
+ if (Z == MinusOne)
+ Break = True;
+ else {
+ Z = MinusOne;
+ /* .. if(-1)^N is invalid, replace MinusOne by One. */
+ I = -4;
+ }
+ }
+ while (!Break);
+ PrintIfNPositive ();
+ N1 = N;
+ N = 0;
+ Z = A1;
+ M = (int) FLOOR (Two * LOG (W) / LOG (A1));
+ Break = False;
+ do {
+ X = Z;
+ I = 1;
+ SR3980 ();
+ if (Z == AInvrse)
+ Break = True;
+ else
+ Z = AInvrse;
+ }
+ while (!(Break));
+ /*=============================================*/
+ Milestone = 100;
+ /*=============================================*/
+ /* Powers of Radix have been tested, */
+ /* next try a few primes */
+ M = NoTrials;
+ Z = Three;
+ do {
+ X = Z;
+ I = 1;
+ SR3980 ();
+ do {
+ Z = Z + Two;
+ }
+ while (Three * FLOOR (Z / Three) == Z);
+ }
+ while (Z < Eight * Three);
+ if (N > 0) {
+ printf ("Errors like this may invalidate financial calculations\n");
+ printf ("\tinvolving interest rates.\n");
+ }
+ PrintIfNPositive ();
+ N += N1;
+ if (N == 0)
+ printf ("... no discrepancies found.\n");
+ if (N > 0)
+ Pause ();
+ else
+ printf ("\n");
+ /*=============================================*/
+ Milestone = 110;
+ /*=============================================*/
+ printf ("Seeking Underflow thresholds UfThold and E0.\n");
+ D = U1;
+ if (Precision != FLOOR (Precision)) {
+ D = BInvrse;
+ X = Precision;
+ do {
+ D = D * BInvrse;
+ X = X - One;
+ }
+ while (X > Zero);
+ }
+ Y = One;
+ Z = D;
+ /* ... D is power of 1/Radix < 1. */
+ do {
+ C = Y;
+ Y = Z;
+ Z = Y * Y;
+ }
+ while ((Y > Z) && (Z + Z > Z));
+ Y = C;
+ Z = Y * D;
+ do {
+ C = Y;
+ Y = Z;
+ Z = Y * D;
+ }
+ while ((Y > Z) && (Z + Z > Z));
+ if (Radix < Two)
+ HInvrse = Two;
+ else
+ HInvrse = Radix;
+ H = One / HInvrse;
+ /* ... 1/HInvrse == H == Min(1/Radix, 1/2) */
+ CInvrse = One / C;
+ E0 = C;
+ Z = E0 * H;
+ /* ...1/Radix^(BIG Integer) << 1 << CInvrse == 1/C */
+ do {
+ Y = E0;
+ E0 = Z;
+ Z = E0 * H;
+ }
+ while ((E0 > Z) && (Z + Z > Z));
+ UfThold = E0;
+ E1 = Zero;
+ Q = Zero;
+ E9 = U2;
+ S = One + E9;
+ D = C * S;
+ if (D <= C) {
+ E9 = Radix * U2;
+ S = One + E9;
+ D = C * S;
+ if (D <= C) {
+ BadCond (Failure, "multiplication gets too many last digits wrong.\n");
+ Underflow = E0;
+ Y1 = Zero;
+ PseudoZero = Z;
+ Pause ();
+ }
+ } else {
+ Underflow = D;
+ PseudoZero = Underflow * H;
+ UfThold = Zero;
+ do {
+ Y1 = Underflow;
+ Underflow = PseudoZero;
+ if (E1 + E1 <= E1) {
+ Y2 = Underflow * HInvrse;
+ E1 = FABS (Y1 - Y2);
+ Q = Y1;
+ if ((UfThold == Zero) && (Y1 != Y2))
+ UfThold = Y1;
+ }
+ PseudoZero = PseudoZero * H;
+ }
+ while ((Underflow > PseudoZero)
+ && (PseudoZero + PseudoZero > PseudoZero));
+ }
+ /* Comment line 4530 .. 4560 */
+ if (PseudoZero != Zero) {
+ printf ("\n");
+ Z = PseudoZero;
+ /* ... Test PseudoZero for "phoney- zero" violates */
+ /* ... PseudoZero < Underflow or PseudoZero < PseudoZero + PseudoZero
+ ... */
+ if (PseudoZero <= Zero) {
+ BadCond (Failure, "Positive expressions can underflow to an\n");
+ printf ("allegedly negative value\n");
+ printf ("PseudoZero that prints out as: %g .\n", PseudoZero);
+ X = -PseudoZero;
+ if (X <= Zero) {
+ printf ("But -PseudoZero, which should be\n");
+ printf ("positive, isn't; it prints out as %g .\n", X);
+ }
+ } else {
+ BadCond (Flaw, "Underflow can stick at an allegedly positive\n");
+ printf ("value PseudoZero that prints out as %g .\n", PseudoZero);
+ }
+ TstPtUf ();
+ }
+ /*=============================================*/
+ Milestone = 120;
+ /*=============================================*/
+ if (CInvrse * Y > CInvrse * Y1) {
+ S = H * S;
+ E0 = Underflow;
+ }
+ if (!((E1 == Zero) || (E1 == E0))) {
+ BadCond (Defect, "");
+ if (E1 < E0) {
+ printf ("Products underflow at a higher");
+ printf (" threshold than differences.\n");
+ if (PseudoZero == Zero)
+ E0 = E1;
+ } else {
+ printf ("Difference underflows at a higher");
+ printf (" threshold than products.\n");
+ }
+ }
+ printf ("Smallest strictly positive number found is E0 = %g .\n", E0);
+ Z = E0;
+ TstPtUf ();
+ Underflow = E0;
+ if (N == 1)
+ Underflow = Y;
+ I = 4;
+ if (E1 == Zero)
+ I = 3;
+ if (UfThold == Zero)
+ I = I - 2;
+ UfNGrad = True;
+ switch (I) {
+ case 1:
+ UfThold = Underflow;
+ if ((CInvrse * Q) != ((CInvrse * Y) * S)) {
+ UfThold = Y;
+ BadCond (Failure, "Either accuracy deteriorates as numbers\n");
+ printf ("approach a threshold = %.17e\n", UfThold);;
+ printf (" coming down from %.17e\n", C);
+ printf (" or else multiplication gets too many last digits wrong.\n");
+ }
+ Pause ();
+ break;
+
+ case 2:
+ BadCond (Failure, "Underflow confuses Comparison, which alleges that\n");
+ printf ("Q == Y while denying that |Q - Y| == 0; these values\n");
+ printf ("print out as Q = %.17e, Y = %.17e .\n", Q, Y2);
+ printf ("|Q - Y| = %.17e .\n", FABS (Q - Y2));
+ UfThold = Q;
+ break;
+
+ case 3:
+ X = X;
+ break;
+
+ case 4:
+ if ((Q == UfThold) && (E1 == E0)
+ && (FABS (UfThold - E1 / E9) <= E1)) {
+ UfNGrad = False;
+ printf ("Underflow is gradual; it incurs Absolute Error =\n");
+ printf ("(roundoff in UfThold) < E0.\n");
+ Y = E0 * CInvrse;
+ Y = Y * (OneAndHalf + U2);
+ X = CInvrse * (One + U2);
+ Y = Y / X;
+ IEEE = (Y == E0);
+ }
+ }
+ if (UfNGrad) {
+ printf ("\n");
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf)) {
+ printf ("Underflow / UfThold failed!\n");
+ R = H + H;
+ } else
+ R = SQRT (Underflow / UfThold);
+ sigsave = 0;
+ if (R <= H) {
+ Z = R * UfThold;
+ X = Z * (One + R * H * (One + H));
+ } else {
+ Z = UfThold;
+ X = Z * (One + H * H * (One + H));
+ }
+ if (!((X == Z) || (X - Z != Zero))) {
+ BadCond (Flaw, "");
+ printf ("X = %.17e\n\tis not equal to Z = %.17e .\n", X, Z);
+ Z9 = X - Z;
+ printf ("yet X - Z yields %.17e .\n", Z9);
+ printf (" Should this NOT signal Underflow, ");
+ printf ("this is a SERIOUS DEFECT\nthat causes ");
+ printf ("confusion when innocent statements like\n");;
+ printf (" if (X == Z) ... else");
+ printf (" ... (f(X) - f(Z)) / (X - Z) ...\n");
+ printf ("encounter Division by Zero although actually\n");
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf))
+ printf ("X / Z fails!\n");
+ else
+ printf ("X / Z = 1 + %g .\n", (X / Z - Half) - Half);
+ sigsave = 0;
+ }
+ }
+ printf ("The Underflow threshold is %.17e, %s\n", UfThold,
+ " below which");
+ printf ("calculation may suffer larger Relative error than ");
+ printf ("merely roundoff.\n");
+ Y2 = U1 * U1;
+ Y = Y2 * Y2;
+ Y2 = Y * U1;
+ if (Y2 <= UfThold) {
+ if (Y > E0) {
+ BadCond (Defect, "");
+ I = 5;
+ } else {
+ BadCond (Serious, "");
+ I = 4;
+ }
+ printf ("Range is too narrow; U1^%d Underflows.\n", I);
+ }
+ /*=============================================*/
+ Milestone = 130;
+ /*=============================================*/
+ Y = -FLOOR (Half - TwoForty * LOG (UfThold) / LOG (HInvrse)) / TwoForty;
+ Y2 = Y + Y;
+ printf ("Since underflow occurs below the threshold\n");
+ printf ("UfThold = (%.17e) ^ (%.17e)\nonly underflow ", HInvrse, Y);
+ printf ("should afflict the expression\n\t(%.17e) ^ (%.17e);\n",
+ HInvrse, Y2);
+ printf ("actually calculating yields:");
+ if (setjmp (ovfl_buf)) {
+ sigsave = 0;
+ BadCond (Serious, "trap on underflow.\n");
+ } else {
+ sigsave = _sigfpe;
+ V9 = POW (HInvrse, Y2);
+ sigsave = 0;
+ printf (" %.17e .\n", V9);
+ if (!((V9 >= Zero) && (V9 <= (Radix + Radix + E9) * UfThold))) {
+ BadCond (Serious, "this is not between 0 and underflow\n");
+ printf (" threshold = %.17e .\n", UfThold);
+ } else if (!(V9 > UfThold * (One + E9)))
+ printf ("This computed value is O.K.\n");
+ else {
+ BadCond (Defect, "this is not between 0 and underflow\n");
+ printf (" threshold = %.17e .\n", UfThold);
+ }
+ }
+ /*=============================================*/
+ Milestone = 140;
+ /*=============================================*/
+ printf ("\n");
+ /* ...calculate Exp2 == exp(2) == 7.389056099... */
+ X = Zero;
+ I = 2;
+ Y = Two * Three;
+ Q = Zero;
+ N = 0;
+ do {
+ Z = X;
+ I = I + 1;
+ Y = Y / (I + I);
+ R = Y + Q;
+ X = Z + R;
+ Q = (Z - X) + R;
+ }
+ while (X > Z);
+ Z = (OneAndHalf + One / Eight) + X / (OneAndHalf * ThirtyTwo);
+ X = Z * Z;
+ Exp2 = X * X;
+ X = F9;
+ Y = X - U1;
+ printf ("Testing X^((X + 1) / (X - 1)) vs. exp(2) = %.17e as X -> 1.\n",
+ Exp2);
+ for (I = 1;;) {
+ Z = X - BInvrse;
+ Z = (X + One) / (Z - (One - BInvrse));
+ Q = POW (X, Z) - Exp2;
+ if (FABS (Q) > TwoForty * U2) {
+ N = 1;
+ V9 = (X - BInvrse) - (One - BInvrse);
+ BadCond (Defect, "Calculated");
+ printf (" %.17e for\n", POW (X, Z));
+ printf ("\t(1 + (%.17e) ^ (%.17e);\n", V9, Z);
+ printf ("\tdiffers from correct value by %.17e .\n", Q);
+ printf ("\tThis much error may spoil financial\n");
+ printf ("\tcalculations involving tiny interest rates.\n");
+ break;
+ } else {
+ Z = (Y - X) * Two + Y;
+ X = Y;
+ Y = Z;
+ Z = One + (X - F9) * (X - F9);
+ if (Z > One && I < NoTrials)
+ I++;
+ else {
+ if (X > One) {
+ if (N == 0)
+ printf ("Accuracy seems adequate.\n");
+ break;
+ } else {
+ X = One + U2;
+ Y = U2 + U2;
+ Y += X;
+ I = 1;
+ }
+ }
+ }
+ }
+ /*=============================================*/
+ Milestone = 150;
+ /*=============================================*/
+ printf ("Testing powers Z^Q at four nearly extreme values.\n");
+ N = 0;
+ Z = A1;
+ Q = FLOOR (Half - LOG (C) / LOG (A1));
+ Break = False;
+ do {
+ X = CInvrse;
+ Y = POW (Z, Q);
+ IsYeqX ();
+ Q = -Q;
+ X = C;
+ Y = POW (Z, Q);
+ IsYeqX ();
+ if (Z < One)
+ Break = True;
+ else
+ Z = AInvrse;
+ }
+ while (!(Break));
+ PrintIfNPositive ();
+ if (N == 0)
+ printf (" ... no discrepancies found.\n");
+ printf ("\n");
+
+ /*=============================================*/
+ Milestone = 160;
+ /*=============================================*/
+ Pause ();
+ printf ("Searching for Overflow threshold:\n");
+ printf ("This may generate an error.\n");
+ Y = -CInvrse;
+ V9 = HInvrse * Y;
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf)) {
+ I = 0;
+ V9 = Y;
+ goto overflow;
+ }
+ do {
+ V = Y;
+ Y = V9;
+ V9 = HInvrse * Y;
+ }
+ while (V9 < Y);
+ I = 1;
+ overflow:
+ sigsave = 0;
+ Z = V9;
+ printf ("Can `Z = -Y' overflow?\n");
+ printf ("Trying it on Y = %.17e .\n", Y);
+ V9 = -Y;
+ V0 = V9;
+ if (V - Y == V + V0)
+ printf ("Seems O.K.\n");
+ else {
+ printf ("finds a ");
+ BadCond (Flaw, "-(-Y) differs from Y.\n");
+ }
+ if (Z != Y) {
+ BadCond (Serious, "");
+ printf ("overflow past %.17e\n\tshrinks to %.17e .\n", Y, Z);
+ }
+ if (I) {
+ Y = V * (HInvrse * U2 - HInvrse);
+ Z = Y + ((One - HInvrse) * U2) * V;
+ if (Z < V0)
+ Y = Z;
+ if (Y < V0)
+ V = Y;
+ if (V0 - V < V0)
+ V = V0;
+ } else {
+ V = Y * (HInvrse * U2 - HInvrse);
+ V = V + ((One - HInvrse) * U2) * Y;
+ }
+ printf ("Overflow threshold is V = %.17e .\n", V);
+ if (I)
+ printf ("Overflow saturates at V0 = %.17e .\n", V0);
+ else
+ printf ("There is no saturation value because \
+the system traps on overflow.\n");
+ V9 = V * One;
+ printf ("No Overflow should be signaled for V * 1 = %.17e\n", V9);
+ V9 = V / One;
+ printf (" nor for V / 1 = %.17e .\n", V9);
+ printf ("Any overflow signal separating this * from the one\n");
+ printf ("above is a DEFECT.\n");
+ /*=============================================*/
+ Milestone = 170;
+ /*=============================================*/
+ if (!(-V < V && -V0 < V0 && -UfThold < V && UfThold < V)) {
+ BadCond (Failure, "Comparisons involving ");
+ printf ("+-%g, +-%g\nand +-%g are confused by Overflow.",
+ V, V0, UfThold);
+ }
+ /*=============================================*/
+ Milestone = 175;
+ /*=============================================*/
+ printf ("\n");
+ for (Indx = 1; Indx <= 3; ++Indx) {
+ switch (Indx) {
+ case 1:
+ Z = UfThold;
+ break;
+ case 2:
+ Z = E0;
+ break;
+ case 3:
+ Z = PseudoZero;
+ break;
+ }
+ if (Z != Zero) {
+ V9 = SQRT (Z);
+ Y = V9 * V9;
+ if (Y / (One - Radix * E9) < Z
+ || Y > (One + Radix * E9) * Z) { /* dgh: + E9 --> * E9 */
+ if (V9 > U1)
+ BadCond (Serious, "");
+ else
+ BadCond (Defect, "");
+ printf ("Comparison alleges that what prints as Z = %.17e\n", Z);
+ printf (" is too far from sqrt(Z) ^ 2 = %.17e .\n", Y);
+ }
+ }
+ }
+ /*=============================================*/
+ Milestone = 180;
+ /*=============================================*/
+ for (Indx = 1; Indx <= 2; ++Indx) {
+ if (Indx == 1)
+ Z = V;
+ else
+ Z = V0;
+ V9 = SQRT (Z);
+ X = (One - Radix * E9) * V9;
+ V9 = V9 * X;
+ if (((V9 < (One - Two * Radix * E9) * Z) || (V9 > Z))) {
+ Y = V9;
+ if (X < W)
+ BadCond (Serious, "");
+ else
+ BadCond (Defect, "");
+ printf ("Comparison alleges that Z = %17e\n", Z);
+ printf (" is too far from sqrt(Z) ^ 2 (%.17e) .\n", Y);
+ }
+ }
+ /*=============================================*/
+ Milestone = 190;
+ /*=============================================*/
+ Pause ();
+ X = UfThold * V;
+ Y = Radix * Radix;
+ if (X * Y < One || X > Y) {
+ if (X * Y < U1 || X > Y / U1)
+ BadCond (Defect, "Badly");
+ else
+ BadCond (Flaw, "");
+
+ printf (" unbalanced range; UfThold * V = %.17e\n\t%s\n",
+ X, "is too far from 1.\n");
+ }
+ /*=============================================*/
+ Milestone = 200;
+ /*=============================================*/
+ for (Indx = 1; Indx <= 5; ++Indx) {
+ X = F9;
+ switch (Indx) {
+ case 2:
+ X = One + U2;
+ break;
+ case 3:
+ X = V;
+ break;
+ case 4:
+ X = UfThold;
+ break;
+ case 5:
+ X = Radix;
+ }
+ Y = X;
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf))
+ printf (" X / X traps when X = %g\n", X);
+ else {
+ V9 = (Y / X - Half) - Half;
+ if (V9 == Zero)
+ continue;
+ if (V9 == -U1 && Indx < 5)
+ BadCond (Flaw, "");
+ else
+ BadCond (Serious, "");
+ printf (" X / X differs from 1 when X = %.17e\n", X);
+ printf (" instead, X / X - 1/2 - 1/2 = %.17e .\n", V9);
+ }
+ sigsave = 0;
+ }
+ /*=============================================*/
+ Milestone = 210;
+ /*=============================================*/
+ MyZero = Zero;
+ printf ("\n");
+ printf ("What message and/or values does Division by Zero produce?\n");
+#ifndef BATCHMODE
+ printf ("This can interupt your program. You can ");
+ printf ("skip this part if you wish.\n");
+ printf ("Do you wish to compute 1 / 0? ");
+ fflush (stdout);
+ read (KEYBOARD, ch, 8);
+ if ((ch[0] == 'Y') || (ch[0] == 'y')) {
+#endif /* !BATCHMODE */
+ sigsave = _sigfpe;
+ printf (" Trying to compute 1 / 0 produces ...");
+ if (!setjmp (ovfl_buf))
+ printf (" %.7e .\n", One / MyZero);
+ sigsave = 0;
+#ifndef BATCHMODE
+ } else
+ printf ("O.K.\n");
+ printf ("\nDo you wish to compute 0 / 0? ");
+ fflush (stdout);
+ read (KEYBOARD, ch, 80);
+ if ((ch[0] == 'Y') || (ch[0] == 'y')) {
+#endif /* !BATCHMODE */
+ sigsave = _sigfpe;
+ printf ("\n Trying to compute 0 / 0 produces ...");
+ if (!setjmp (ovfl_buf))
+ printf (" %.7e .\n", Zero / MyZero);
+ sigsave = 0;
+#ifndef BATCHMODE
+ } else
+ printf ("O.K.\n");
+#endif /* !BATCHMODE */
+ /*=============================================*/
+ Milestone = 220;
+ /*=============================================*/
+
+ Pause ();
+ printf ("\n");
+ {
+ static char *msg[] =
+ {
+ "FAILUREs encountered =",
+ "SERIOUS DEFECTs discovered =",
+ "DEFECTs discovered =",
+ "FLAWs discovered ="};
+ int i;
+ for (i = 0; i < 4; i++)
+ if (ErrCnt[i])
+ printf ("The number of %-29s %d.\n",
+ msg[i], ErrCnt[i]);
+ }
+
+ printf ("\n");
+ if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[Defect]
+ + ErrCnt[Flaw]) > 0) {
+ if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[
+ Defect] == 0) && (ErrCnt[Flaw] > 0)) {
+ printf ("The arithmetic diagnosed seems ");
+ printf ("Satisfactory though flawed.\n");
+ }
+ if ((ErrCnt[Failure] + ErrCnt[Serious] == 0)
+ && (ErrCnt[Defect] > 0)) {
+ printf ("The arithmetic diagnosed may be Acceptable\n");
+ printf ("despite inconvenient Defects.\n");
+ }
+ if ((ErrCnt[Failure] + ErrCnt[Serious]) > 0) {
+ printf ("The arithmetic diagnosed has ");
+ printf ("unacceptable Serious Defects.\n");
+ }
+ if (ErrCnt[Failure] > 0) {
+ printf ("Potentially fatal FAILURE may have spoiled this");
+ printf (" program's subsequent diagnoses.\n");
+ }
+ } else {
+
+ printf ("No failures, defects nor flaws have been discovered.\n");
+ if (!((RMult == Rounded) && (RDiv == Rounded)
+ && (RAddSub == Rounded) && (RSqrt == Rounded)))
+ printf ("The arithmetic diagnosed seems Satisfactory.\n");
+ else {
+ if (StickyBit >= One &&
+ (Radix - Two) * (Radix - Nine - One) == Zero) {
+ printf ("Rounding appears to conform to ");
+ printf ("the proposed IEEE standard P");
+ if ((Radix == Two) &&
+ ((Precision - Four * Three * Two) *
+ (Precision - TwentySeven -
+ TwentySeven + One) == Zero))
+ printf ("754");
+ else
+ printf ("854");
+ if (IEEE)
+ printf (".\n");
+ else {
+ printf (",\nexcept for possibly Double Rounding");
+ printf (" during Gradual Underflow.\n");
+ }
+ }
+ printf ("The arithmetic diagnosed appears to be Excellent!\n");
+ }
+ }
+
+ if (fpecount)
+ printf ("\nA total of %d floating point exceptions were registered.\n",
+ fpecount);
+ printf ("END OF TEST.\n");
+ return 0;
+}
+
+FLOAT
+Sign (X)
+ FLOAT X;
+{
+ return X >= 0. ? 1.0 : -1.0;
+}
+
+void
+Pause ()
+{
+#ifndef BATCHMODE
+ char ch[8];
+
+ printf ("\nTo continue, press RETURN");
+ fflush (stdout);
+ read (KEYBOARD, ch, 8);
+#endif /* !BATCHMODE */
+#ifndef CYGNUS
+ printf ("\nDiagnosis resumes after milestone Number %d", Milestone);
+ printf (" Page: %d\n\n", PageNo);
+ ++Milestone;
+ ++PageNo;
+#endif /* !CYGNUS */
+}
+
+void
+TstCond (K, Valid, T)
+ int K, Valid;
+ char *T;
+{
+#ifdef CYGNUS
+ printf ("TEST: %s\n", T);
+#endif /* CYGNUS */
+ if (!Valid) {
+ BadCond (K, T);
+ printf (".\n");
+ }
+#ifdef CYGNUS
+ printf ("PASS: %s\n", T);
+#endif /* CYGNUS */
+}
+
+void
+BadCond (K, T)
+ int K;
+ char *T;
+{
+ static char *msg[] =
+ {"FAILURE", "SERIOUS DEFECT", "DEFECT", "FLAW"};
+
+ ErrCnt[K] = ErrCnt[K] + 1;
+#ifndef CYGNUS
+ printf ("%s: %s", msg[K], T);
+#else
+ printf ("ERROR: Severity: %s: %s", msg[K], T);
+#endif /* CYGNUS */
+}
+
+/*
+ * Random computes
+ * X = (Random1 + Random9)^5
+ * Random1 = X - FLOOR(X) + 0.000005 * X;
+ * and returns the new value of Random1
+*/
+FLOAT
+Random ()
+{
+ FLOAT X, Y;
+
+ X = Random1 + Random9;
+ Y = X * X;
+ Y = Y * Y;
+ X = X * Y;
+ Y = X - FLOOR (X);
+ Random1 = Y + X * 0.000005;
+ return (Random1);
+}
+
+void
+SqXMinX (ErrKind)
+ int ErrKind;
+{
+ FLOAT XA, XB;
+
+ XB = X * BInvrse;
+ XA = X - XB;
+ SqEr = ((SQRT (X * X) - XB) - XA) / OneUlp;
+ if (SqEr != Zero) {
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ J = J + 1.0;
+ BadCond (ErrKind, "\n");
+ printf ("sqrt( %.17e) - %.17e = %.17e\n", X * X, X, OneUlp * SqEr);
+ printf ("\tinstead of correct value 0 .\n");
+ }
+}
+
+void
+NewD ()
+{
+ X = Z1 * Q;
+ X = FLOOR (Half - X / Radix) * Radix + X;
+ Q = (Q - X * Z) / Radix + X * X * (D / Radix);
+ Z = Z - Two * X * D;
+ if (Z <= Zero) {
+ Z = -Z;
+ Z1 = -Z1;
+ }
+ D = Radix * D;
+}
+
+void
+SR3750 ()
+{
+ if (!((X - Radix < Z2 - Radix) || (X - Z2 > W - Z2))) {
+ I = I + 1;
+ X2 = SQRT (X * D);
+ Y2 = (X2 - Z2) - (Y - Z2);
+ X2 = X8 / (Y - Half);
+ X2 = X2 - Half * X2 * X2;
+ SqEr = (Y2 + Half) + (Half - X2);
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ SqEr = Y2 - X2;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ }
+}
+
+void
+IsYeqX ()
+{
+ if (Y != X) {
+ if (N <= 0) {
+ if (Z == Zero && Q <= Zero)
+ printf ("WARNING: computing\n");
+ else
+ BadCond (Defect, "computing\n");
+ printf ("\t(%.17e) ^ (%.17e)\n", Z, Q);
+ printf ("\tyielded %.17e;\n", Y);
+ printf ("\twhich compared unequal to correct %.17e ;\n",
+ X);
+ printf ("\t\tthey differ by %.17e .\n", Y - X);
+ }
+ N = N + 1; /* ... count discrepancies. */
+ }
+}
+
+void
+SR3980 ()
+{
+ do {
+ Q = (FLOAT) I;
+ Y = POW (Z, Q);
+ IsYeqX ();
+ if (++I > M)
+ break;
+ X = Z * X;
+ }
+ while (X < W);
+}
+
+void
+PrintIfNPositive ()
+{
+ if (N > 0)
+ printf ("Similar discrepancies have occurred %d times.\n", N);
+}
+
+void
+TstPtUf ()
+{
+ N = 0;
+ if (Z != Zero) {
+ printf ("Since comparison denies Z = 0, evaluating ");
+ printf ("(Z + Z) / Z should be safe.\n");
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf))
+ goto very_serious;
+ Q9 = (Z + Z) / Z;
+ printf ("What the machine gets for (Z + Z) / Z is %.17e .\n",
+ Q9);
+ if (FABS (Q9 - Two) < Radix * U2) {
+ printf ("This is O.K., provided Over/Underflow");
+ printf (" has NOT just been signaled.\n");
+ } else {
+ if ((Q9 < One) || (Q9 > Two)) {
+ very_serious:
+ N = 1;
+ ErrCnt[Serious] = ErrCnt[Serious] + 1;
+ printf ("This is a VERY SERIOUS DEFECT!\n");
+ } else {
+ N = 1;
+ ErrCnt[Defect] = ErrCnt[Defect] + 1;
+ printf ("This is a DEFECT!\n");
+ }
+ }
+ sigsave = 0;
+ V9 = Z * One;
+ Random1 = V9;
+ V9 = One * Z;
+ Random2 = V9;
+ V9 = Z / One;
+ if ((Z == Random1) && (Z == Random2) && (Z == V9)) {
+ if (N > 0)
+ Pause ();
+ } else {
+ N = 1;
+ BadCond (Defect, "What prints as Z = ");
+ printf ("%.17e\n\tcompares different from ", Z);
+ if (Z != Random1)
+ printf ("Z * 1 = %.17e ", Random1);
+ if (!((Z == Random2)
+ || (Random2 == Random1)))
+ printf ("1 * Z == %g\n", Random2);
+ if (!(Z == V9))
+ printf ("Z / 1 = %.17e\n", V9);
+ if (Random2 != Random1) {
+ ErrCnt[Defect] = ErrCnt[Defect] + 1;
+ BadCond (Defect, "Multiplication does not commute!\n");
+ printf ("\tComparison alleges that 1 * Z = %.17e\n",
+ Random2);
+ printf ("\tdiffers from Z * 1 = %.17e\n", Random1);
+ }
+ Pause ();
+ }
+ }
+}
+
+void
+notify (s)
+ char *s;
+{
+ printf ("%s test appears to be inconsistent...\n", s);
+ printf (" PLEASE NOTIFY KARPINKSI!\n");
+}
+
+void
+msglist (s)
+ char **s;
+{
+ while (*s)
+ printf ("%s\n", *s++);
+}
+
+void
+Instructions ()
+{
+ static char *instr[] =
+ {
+ "Lest this program stop prematurely, i.e. before displaying\n",
+ " `END OF TEST',\n",
+ "try to persuade the computer NOT to terminate execution when an",
+ "error like Over/Underflow or Division by Zero occurs, but rather",
+ "to persevere with a surrogate value after, perhaps, displaying some",
+ "warning. If persuasion avails naught, don't despair but run this",
+ "program anyway to see how many milestones it passes, and then",
+ "amend it to make further progress.\n",
+ "Answer questions with Y, y, N or n (unless otherwise indicated).\n",
+ 0};
+
+ msglist (instr);
+}
+
+void
+Heading ()
+{
+ static char *head[] =
+ {
+ "Users are invited to help debug and augment this program so it will",
+ "cope with unanticipated and newly uncovered arithmetic pathologies.\n",
+ "Please send suggestions and interesting results to",
+ "\tRichard Karpinski",
+ "\tComputer Center U-76",
+ "\tUniversity of California",
+ "\tSan Francisco, CA 94143-0704, USA\n",
+ "In doing so, please include the following information:",
+#ifdef SINGLE_PRECISION
+ "\tPrecision:\tsingle;",
+#else /* !SINGLE_PRECISION */
+ "\tPrecision:\tdouble;",
+#endif /* SINGLE_PRECISION */
+ "\tVersion:\t10 February 1989;",
+ "\tComputer:\n",
+ "\tCompiler:\n",
+ "\tOptimization level:\n",
+ "\tOther relevant compiler options:",
+ 0};
+
+ msglist (head);
+}
+
+void
+Characteristics ()
+{
+ static char *chars[] =
+ {
+ "Running this program should reveal these characteristics:",
+ " Radix = 1, 2, 4, 8, 10, 16, 100, 256 ...",
+ " Precision = number of significant digits carried.",
+ " U2 = Radix/Radix^Precision = One Ulp",
+ "\t(OneUlpnit in the Last Place) of 1.000xxx .",
+ " U1 = 1/Radix^Precision = One Ulp of numbers a little less than 1.0 .",
+ " Adequacy of guard digits for Mult., Div. and Subt.",
+ " Whether arithmetic is chopped, correctly rounded, or something else",
+ "\tfor Mult., Div., Add/Subt. and Sqrt.",
+ " Whether a Sticky Bit used correctly for rounding.",
+ " UnderflowThreshold = an underflow threshold.",
+ " E0 and PseudoZero tell whether underflow is abrupt, gradual, or fuzzy.",
+ " V = an overflow threshold, roughly.",
+ " V0 tells, roughly, whether Infinity is represented.",
+ " Comparisions are checked for consistency with subtraction",
+ "\tand for contamination with pseudo-zeros.",
+ " Sqrt is tested. Y^X is not tested.",
+ " Extra-precise subexpressions are revealed but NOT YET tested.",
+ " Decimal-Binary conversion is NOT YET tested for accuracy.",
+ 0};
+
+ msglist (chars);
+}
+
+void
+History ()
+{ /* History */
+ /* Converted from Brian Wichmann's Pascal version to C by Thos Sumner,
+ with further massaging by David M. Gay. */
+
+ static char *hist[] =
+ {
+ "The program attempts to discriminate among",
+ " FLAWs, like lack of a sticky bit,",
+ " Serious DEFECTs, like lack of a guard digit, and",
+ " FAILUREs, like 2+2 == 5 .",
+ "Failures may confound subsequent diagnoses.\n",
+ "The diagnostic capabilities of this program go beyond an earlier",
+ "program called `MACHAR', which can be found at the end of the",
+ "book `Software Manual for the Elementary Functions' (1980) by",
+ "W. J. Cody and W. Waite. Although both programs try to discover",
+ "the Radix, Precision and range (over/underflow thresholds)",
+ "of the arithmetic, this program tries to cope with a wider variety",
+ "of pathologies, and to say how well the arithmetic is implemented.",
+ "\nThe program is based upon a conventional radix representation for",
+ "floating-point numbers, but also allows logarithmic encoding",
+ "as used by certain early WANG machines.\n",
+ "BASIC version of this program (C) 1983 by Prof. W. M. Kahan;",
+ "see source comments for more history.",
+ 0};
+
+ msglist (hist);
+}
diff --git a/c/src/tests/samples/paranoia/paranoia.doc b/c/src/tests/samples/paranoia/paranoia.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/samples/paranoia/paranoia.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/samples/paranoia/system.h b/c/src/tests/samples/paranoia/system.h
new file mode 100644
index 0000000000..76bc3b25a2
--- /dev/null
+++ b/c/src/tests/samples/paranoia/system.h
@@ -0,0 +1,40 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+#define CONFIGURE_INIT_TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE * 2)
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/c/src/tests/samples/ticker/Makefile.in b/c/src/tests/samples/ticker/Makefile.in
new file mode 100644
index 0000000000..dd5d8115f7
--- /dev/null
+++ b/c/src/tests/samples/ticker/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+SAMPLE=ticker
+PGM=${ARCH}/$(SAMPLE).exe
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init tasks
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc scn
+DOCS=$(DOCTYPES:%=$(SAMPLE).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(SAMPLE).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/samples
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/samples/ticker/init.c b/c/src/tests/samples/ticker/init.c
new file mode 100644
index 0000000000..68da76ff07
--- /dev/null
+++ b/c/src/tests/samples/ticker/init.c
@@ -0,0 +1,61 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ puts( "\n\n*** CLOCK TICK TEST ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ], 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 1 ]
+ );
+ status = rtems_task_create(
+ Task_name[ 2 ], 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 2 ]
+ );
+ status = rtems_task_create(
+ Task_name[ 3 ], 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 3 ]
+ );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 1 );
+ status = rtems_task_start( Task_id[ 2 ], Test_task, 2 );
+ status = rtems_task_start( Task_id[ 3 ], Test_task, 3 );
+
+ status = rtems_task_delete( RTEMS_SELF );
+}
diff --git a/c/src/tests/samples/ticker/system.h b/c/src/tests/samples/ticker/system.h
new file mode 100644
index 0000000000..e12ae48f95
--- /dev/null
+++ b/c/src/tests/samples/ticker/system.h
@@ -0,0 +1,45 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/samples/ticker/tasks.c b/c/src/tests/samples/ticker/tasks.c
new file mode 100644
index 0000000000..189b16f6da
--- /dev/null
+++ b/c/src/tests/samples/ticker/tasks.c
@@ -0,0 +1,44 @@
+/* Test_task
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument unused
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ task_index = task_number( tid );
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ if ( time.second >= 35 ) {
+ puts( "*** END OF CLOCK TICK TEST ***" );
+ exit( 0 );
+ }
+ put_name( Task_name[ task_index ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+ status = rtems_task_wake_after( task_index * 5 * TICKS_PER_SECOND );
+ }
+}
diff --git a/c/src/tests/samples/ticker/ticker.doc b/c/src/tests/samples/ticker/ticker.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/samples/ticker/ticker.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/samples/ticker/ticker.scn b/c/src/tests/samples/ticker/ticker.scn
new file mode 100644
index 0000000000..35952e6170
--- /dev/null
+++ b/c/src/tests/samples/ticker/ticker.scn
@@ -0,0 +1,16 @@
+*** CLOCK TICK TEST ***
+TA1 - tm_get - 09:00:00 12/31/1988
+TA2 - tm_get - 09:00:00 12/31/1988
+TA3 - tm_get - 09:00:00 12/31/1988
+TA1 - tm_get - 09:00:05 12/31/1988
+TA1 - tm_get - 09:00:10 12/31/1988
+TA2 - tm_get - 09:00:10 12/31/1988
+TA1 - tm_get - 09:00:15 12/31/1988
+TA3 - tm_get - 09:00:15 12/31/1988
+TA1 - tm_get - 09:00:20 12/31/1988
+TA2 - tm_get - 09:00:20 12/31/1988
+TA1 - tm_get - 09:00:25 12/31/1988
+TA1 - tm_get - 09:00:30 12/31/1988
+TA2 - tm_get - 09:00:30 12/31/1988
+TA3 - tm_get - 09:00:30 12/31/1988
+*** END OF CLOCK TICK TEST ***
diff --git a/c/src/tests/sptests/Makefile.in b/c/src/tests/sptests/Makefile.in
new file mode 100644
index 0000000000..c3f9cb8d0a
--- /dev/null
+++ b/c/src/tests/sptests/Makefile.in
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+all: README
+
+# sp10 is not included for now
+SUB_DIRS=sp01 sp02 sp03 sp04 sp05 sp06 sp07 sp08 sp09 \
+ sp11 sp12 sp13 sp14 sp15 sp16 sp17 sp19 \
+ sp20 sp21 sp22 sp23 sp24 sp25 spfatal spsize
+
+
diff --git a/c/src/tests/sptests/README b/c/src/tests/sptests/README
new file mode 100644
index 0000000000..2843063c31
--- /dev/null
+++ b/c/src/tests/sptests/README
@@ -0,0 +1,9 @@
+#
+# $Id$
+#
+
+This directory contains the RTEMS Single Processor Test Suite.
+The tests in this directory provide near complete (98%+) test
+coverage of the non-multiprocessor code in RTEMS.
+
+
diff --git a/c/src/tests/sptests/sp01/Makefile.in b/c/src/tests/sptests/sp01/Makefile.in
new file mode 100644
index 0000000000..37f1149b67
--- /dev/null
+++ b/c/src/tests/sptests/sp01/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp01
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp01/init.c b/c/src/tests/sptests/sp01/init.c
new file mode 100644
index 0000000000..99d5922a16
--- /dev/null
+++ b/c/src/tests/sptests/sp01/init.c
@@ -0,0 +1,86 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 1 ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_INTERRUPT_LEVEL(31),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 3,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp01/sp01.doc b/c/src/tests/sptests/sp01/sp01.doc
new file mode 100644
index 0000000000..d89d855f3c
--- /dev/null
+++ b/c/src/tests/sptests/sp01/sp01.doc
@@ -0,0 +1,43 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test1
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handle a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+output:
+ "TA1" is printed once every 5 seconds. "TA2" is printed once
+ every 10 seconds. "TA3" is printed once every 15 seconds.
diff --git a/c/src/tests/sptests/sp01/sp01.scn b/c/src/tests/sptests/sp01/sp01.scn
new file mode 100644
index 0000000000..6d687d042a
--- /dev/null
+++ b/c/src/tests/sptests/sp01/sp01.scn
@@ -0,0 +1,18 @@
+*** TEST 1 ***
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA3 - rtems_clock_get - 09:00:15 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+TA2 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:25 12/31/1988
+TA3 - rtems_clock_get - 09:00:30 12/31/1988
+TA2 - rtems_clock_get - 09:00:30 12/31/1988
+TA1 - rtems_clock_get - 09:00:30 12/31/1988
+*** END OF TEST 1 ***
+
+NOTE: The order of the prints at each time interval is irrelevant.
diff --git a/c/src/tests/sptests/sp01/system.h b/c/src/tests/sptests/sp01/system.h
new file mode 100644
index 0000000000..423315e590
--- /dev/null
+++ b/c/src/tests/sptests/sp01/system.h
@@ -0,0 +1,45 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp01/task1.c b/c/src/tests/sptests/sp01/task1.c
new file mode 100644
index 0000000000..e911abd595
--- /dev/null
+++ b/c/src/tests/sptests/sp01/task1.c
@@ -0,0 +1,50 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 35 ) {
+ puts( "*** END OF TEST 1 ***" );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_wake_after( task_number( tid ) * 5 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/c/src/tests/sptests/sp02/Makefile.in b/c/src/tests/sptests/sp02/Makefile.in
new file mode 100644
index 0000000000..5c1607c767
--- /dev/null
+++ b/c/src/tests/sptests/sp02/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp02
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3 preempt
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp02/init.c b/c/src/tests/sptests/sp02/init.c
new file mode 100644
index 0000000000..e55f887074
--- /dev/null
+++ b/c/src/tests/sptests/sp02/init.c
@@ -0,0 +1,152 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 2 ***" );
+
+ Preempt_task_name = rtems_build_name( 'P', 'R', 'M', 'T' );
+
+ status = rtems_task_create(
+ Preempt_task_name,
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Preempt_task_id
+ );
+ directive_failed( status, "rtems_task_create of RTEMS_PREEMPT" );
+
+ status = rtems_task_start( Preempt_task_id, Preempt_task, 0 );
+ directive_failed( status, "rtems_task_start of RTEMS_PREEMPT" );
+
+ puts( "INIT - rtems_task_wake_after - yielding processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ puts( "INIT - suspending TA2 while middle task on a ready chain" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ status = rtems_task_delete( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_delete of TA1" );
+
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of TA2" );
+
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp02/preempt.c b/c/src/tests/sptests/sp02/preempt.c
new file mode 100644
index 0000000000..925b1d04a7
--- /dev/null
+++ b/c/src/tests/sptests/sp02/preempt.c
@@ -0,0 +1,32 @@
+/* Preempt_task
+ *
+ * This routine serves as a test task. It verifies the task manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "PREEMPT - rtems_task_delete - deleting self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_PREEMPT" );
+}
diff --git a/c/src/tests/sptests/sp02/sp02.doc b/c/src/tests/sptests/sp02/sp02.doc
new file mode 100644
index 0000000000..0c4c99e31e
--- /dev/null
+++ b/c/src/tests/sptests/sp02/sp02.doc
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test2
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ t_delete, tm_wkafter, t_setpri, t_suspend
+
+concepts:
+
+ a. Verifies that a task can delete another task and also delete itself.
+
+ b. Verifies that memory is freed back to the heap correctly.
+
+ c. Verifies that TCBs are freed back to the inactive chain correctly.
+
+ d. Verifies that a task can get the task identification number of
+ another task.
+
+ e. Verifies the _Set_state routine where the task is not READY.
+
+ f. Verifies the break statement in the _Block_activate routine.
+
+ g. Verifies the while loop in the _Prev_tcb routine.
diff --git a/c/src/tests/sptests/sp02/sp02.scn b/c/src/tests/sptests/sp02/sp02.scn
new file mode 100644
index 0000000000..d3f3d61cd1
--- /dev/null
+++ b/c/src/tests/sptests/sp02/sp02.scn
@@ -0,0 +1,15 @@
+*** TEST 2 ***
+INIT - rtems_task_wake_after - yielding processor
+PREEMPT - rtems_task_delete - deleting self
+INIT - suspending TA2 while middle task on a ready chain
+TA1 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 minute
+TA3 - rtems_task_wake_after - sleep 5 seconds
+TA1 - rtems_task_ident - tid of TA2 (0x08010007)
+TA1 - rtems_task_ident - tid of TA3 (0x08010008)
+TA1 - rtems_task_set_priority - set TA3's priority to 2
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_delete - delete TA2
+TA1 - rtems_task_wake_after - sleep for 5 seconds
+TA3 - rtems_task_delete - delete self
+*** END OF TEST 2 ***
diff --git a/c/src/tests/sptests/sp02/system.h b/c/src/tests/sptests/sp02/system.h
new file mode 100644
index 0000000000..15c15e1a18
--- /dev/null
+++ b/c/src/tests/sptests/sp02/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Preempt_task_id; /* preempt task id */
+TEST_EXTERN rtems_name Preempt_task_name; /* preempt task name */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp02/task1.c b/c/src/tests/sptests/sp02/task1.c
new file mode 100644
index 0000000000..560facc32c
--- /dev/null
+++ b/c/src/tests/sptests/sp02/task1.c
@@ -0,0 +1,66 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the task manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid2;
+ rtems_id tid3;
+ rtems_status_code status;
+ rtems_unsigned32 previous_priority;
+
+ puts( "TA1 - rtems_task_wake_after - sleep 1 second" );
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_task_ident( Task_name[ 2 ], RTEMS_SEARCH_ALL_NODES, &tid2 );
+ directive_failed( status, "rtems_task_ident of TA2" );
+
+ printf( "TA1 - rtems_task_ident - tid of TA2 (0x%.8x)\n", tid2 );
+
+ status = rtems_task_ident( Task_name[ 3 ], RTEMS_SEARCH_ALL_NODES, &tid3 );
+ directive_failed( status, "rtems_task_ident of TA3" );
+
+ printf( "TA1 - rtems_task_ident - tid of TA3 (0x%.8x)\n", tid3 );
+
+ status = rtems_task_set_priority( tid3, 2, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ puts( "TA1 - rtems_task_set_priority - set TA3's priority to 2" );
+
+
+ puts( "TA1 - rtems_task_suspend - suspend TA2" );
+ status = rtems_task_suspend( tid2 );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_delete - delete TA2" );
+ status = rtems_task_delete( tid2 );
+ directive_failed( status, "rtems_task_delete of TA2" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep for 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 2 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp02/task2.c b/c/src/tests/sptests/sp02/task2.c
new file mode 100644
index 0000000000..16c95eb798
--- /dev/null
+++ b/c/src/tests/sptests/sp02/task2.c
@@ -0,0 +1,34 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It sleeps for 1 minute but
+ * does not expect to wake up. Task 1 should suspend then delete it
+ * so that it appears to never wake up.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_task_wake_after - sleep 1 minute" );
+ status = rtems_task_wake_after( 60*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after in TA2" );
+}
diff --git a/c/src/tests/sptests/sp02/task3.c b/c/src/tests/sptests/sp02/task3.c
new file mode 100644
index 0000000000..c9231e7bd2
--- /dev/null
+++ b/c/src/tests/sptests/sp02/task3.c
@@ -0,0 +1,37 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It simply sleeps for 5 seconds
+ * and then deletes itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA3 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after in TA3" );
+
+ puts( "TA3 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA3" );
+}
diff --git a/c/src/tests/sptests/sp03/Makefile.in b/c/src/tests/sptests/sp03/Makefile.in
new file mode 100644
index 0000000000..46e10a59ca
--- /dev/null
+++ b/c/src/tests/sptests/sp03/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp03
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp03/init.c b/c/src/tests/sptests/sp03/init.c
new file mode 100644
index 0000000000..615a974c8b
--- /dev/null
+++ b/c/src/tests/sptests/sp03/init.c
@@ -0,0 +1,67 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 3 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp03/sp03.doc b/c/src/tests/sptests/sp03/sp03.doc
new file mode 100644
index 0000000000..97dac0fd61
--- /dev/null
+++ b/c/src/tests/sptests/sp03/sp03.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test3
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, tm_wkafter,
+ tm_wkwhen, tm_set, tm_get
+
+concepts:
+
+ a. Verifies conversion routines - _Utd_to_etd and _Etd_to_utd
diff --git a/c/src/tests/sptests/sp03/sp03.scn b/c/src/tests/sptests/sp03/sp03.scn
new file mode 100644
index 0000000000..496982e86f
--- /dev/null
+++ b/c/src/tests/sptests/sp03/sp03.scn
@@ -0,0 +1,26 @@
+*** TEST 3 ***
+TA1 sets clock: 09:15:00 12/31/1988
+TA1 going to sleep: 09:15:00 12/31/1988
+TA2 09:15:01 12/31/1988
+TA2 09:15:02 12/31/1988
+TA2 09:15:03 12/31/1988
+TA2 09:15:04 12/31/1988
+TA1 awakened: 09:15:05 12/31/1988
+TA1 going to sleep: 09:15:05 12/31/1988
+TA2 09:15:05 12/31/1988
+TA2 09:15:06 12/31/1988
+TA2 09:15:07 12/31/1988
+TA2 09:15:08 12/31/1988
+TA2 09:15:09 12/31/1988
+TA1 awakened: 09:15:10 12/31/1988
+TA1 going to sleep: 09:15:10 12/31/1988
+TA2 09:15:10 12/31/1988
+TA2 09:15:11 12/31/1988
+TA2 09:15:12 12/31/1988
+TA2 09:15:13 12/31/1988
+TA2 09:15:14 12/31/1988
+TA1 awakened: 09:15:15 12/31/1988
+TA1 going to sleep: 09:15:15 12/31/1988
+TA2 09:15:15 12/31/1988
+TA2 09:15:16 12/31/1988
+*** END OF TEST 3 ***
diff --git a/c/src/tests/sptests/sp03/system.h b/c/src/tests/sptests/sp03/system.h
new file mode 100644
index 0000000000..2766458732
--- /dev/null
+++ b/c/src/tests/sptests/sp03/system.h
@@ -0,0 +1,49 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp03/task1.c b/c/src/tests/sptests/sp03/task1.c
new file mode 100644
index 0000000000..8ad2adba27
--- /dev/null
+++ b/c/src/tests/sptests/sp03/task1.c
@@ -0,0 +1,59 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the capability to
+ * set and read the executives calender and clock.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ build_time( &time, 12, 31, 1988, 9, 15, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( " sets clock: ", &time, "\n" );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( " going to sleep: ", &time, "\n" );
+
+ time.second += 5;
+ time.minute += ( time.second / 60 );
+ time.second %= 60;
+ time.hour += ( time.minute / 60 );
+ time.minute %= 60;
+ time.hour %= 24;
+
+ status = rtems_task_wake_when( &time );
+ directive_failed( status, "rtems_task_wake_when" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( " awakened: ", &time, "\n" );
+ }
+}
diff --git a/c/src/tests/sptests/sp03/task2.c b/c/src/tests/sptests/sp03/task2.c
new file mode 100644
index 0000000000..b25699ca45
--- /dev/null
+++ b/c/src/tests/sptests/sp03/task2.c
@@ -0,0 +1,46 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It repeatedly gets the system time
+ * and date, converts it to printable form, and print it.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ while( FOREVER ) {
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 17 ) {
+ puts( "*** END OF TEST 3 *** " );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ 2 ], FALSE );
+ print_time( " ", &time, "\n" );
+ }
+}
diff --git a/c/src/tests/sptests/sp04/Makefile.in b/c/src/tests/sptests/sp04/Makefile.in
new file mode 100644
index 0000000000..2146fdc0a4
--- /dev/null
+++ b/c/src/tests/sptests/sp04/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp04
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3 tswitch
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp04/init.c b/c/src/tests/sptests/sp04/init.c
new file mode 100644
index 0000000000..954e8b1f32
--- /dev/null
+++ b/c/src/tests/sptests/sp04/init.c
@@ -0,0 +1,110 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_extensions_table Extensions = {
+ NULL, /* task create user extension */
+ NULL, /* task start user extension */
+ NULL, /* task restart user extension */
+ NULL, /* task delete user extension */
+ Task_switch, /* task switch user extension */
+ NULL, /* task begin user extension */
+ NULL, /* task exitted user extension */
+ NULL /* fatal error user extension */
+};
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ puts( "\n\n*** TEST 4 ***" );
+ build_time( &time, 12, 31, 1988, 9, 15, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Extension_name[ 1 ] = rtems_build_name( 'E', 'X', 'T', ' ' );
+
+ status = rtems_extension_create(
+ Extension_name[ 1 ],
+ &Extensions,
+ &Extension_id[ 1 ]
+ );
+ directive_failed( status, "rtems_extension_create" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Run_count[ 1 ] = 0;
+ Run_count[ 2 ] = 0;
+ Run_count[ 3 ] = 0;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp04/sp04.doc b/c/src/tests/sptests/sp04/sp04.doc
new file mode 100644
index 0000000000..f15d9b73ef
--- /dev/null
+++ b/c/src/tests/sptests/sp04/sp04.doc
@@ -0,0 +1,38 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test4
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ tm_set, tm_get, ev_receive, t_mode
+
+concepts:
+
+ a. Verifies timeslicing ( all tasks are in timeslice mode ).
+
+ b. Verifies the tswitch user extension.
+
+ c. Verifies the no preemption mode.
+
+ d. Verifies time-slice gets reset even if only one task ready.
+
+output:
+ The task name and the current time are printed out each time that a new
+ task is being dispatched. The configured timeslice is 100 ticks
+ ( 1 second ); therefore, a task name and the time are printed once
+ every second. After each task runs 3 times, task 1 changes its mode to
+ no preempt and runs for about 6 seconds and then changes its mode back to
+ preempt mode.
diff --git a/c/src/tests/sptests/sp04/sp04.scn b/c/src/tests/sptests/sp04/sp04.scn
new file mode 100644
index 0000000000..1acd83a82f
--- /dev/null
+++ b/c/src/tests/sptests/sp04/sp04.scn
@@ -0,0 +1,23 @@
+*** TEST 4 ***
+TA1 - 09:15:00 12/31/1988
+TA1 - rtems_task_suspend - on Task 2
+TA1 - rtems_task_suspend - on Task 3
+TA1 - killing time
+TA1 - rtems_task_resume - on Task 2
+TA1 - rtems_task_resume - on Task 3
+TA2 - 09:15:04 12/31/1988
+TA3 - 09:15:05 12/31/1988
+TA1 - 09:15:06 12/31/1988
+TA2 - 09:15:07 12/31/1988
+TA3 - 09:15:08 12/31/1988
+TA1 - 09:15:09 12/31/1988
+TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT
+TA1 - 09:15:10 12/31/1988
+TA1 - 09:15:11 12/31/1988
+TA1 - 09:15:12 12/31/1988
+TA1 - 09:15:13 12/31/1988
+TA1 - 09:15:14 12/31/1988
+TA1 - 09:15:15 12/31/1988
+TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT
+TA2 - 09:15:16 12/31/1988
+*** END OF TEST 4 ***
diff --git a/c/src/tests/sptests/sp04/system.h b/c/src/tests/sptests/sp04/system.h
new file mode 100644
index 0000000000..eb9dc8ed14
--- /dev/null
+++ b/c/src/tests/sptests/sp04/system.h
@@ -0,0 +1,67 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+void Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Extension_id[ 4 ];
+TEST_EXTERN rtems_name Extension_name[ 4 ]; /* array of task names */
+
+/* array of task run counts */
+TEST_EXTERN volatile rtems_unsigned32 Run_count[ 4 ];
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp04/task1.c b/c/src/tests/sptests/sp04/task1.c
new file mode 100644
index 0000000000..b6dcdd6659
--- /dev/null
+++ b/c/src/tests/sptests/sp04/task1.c
@@ -0,0 +1,103 @@
+/* Task_1
+ *
+ * This test serves as a test task. It verifies timeslicing activities
+ * and tswitch extension processing.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 seconds;
+ rtems_unsigned32 old_seconds;
+ rtems_mode previous_mode;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ rtems_unsigned32 start_time;
+ rtems_unsigned32 end_time;
+
+ puts( "TA1 - rtems_task_suspend - on Task 2" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_suspend - on Task 3" );
+ status = rtems_task_suspend( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_suspend of TA3" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &start_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ puts( "TA1 - killing time" );
+
+ for ( ; ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &end_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( end_time > (start_time + 2) )
+ break;
+ }
+
+ puts( "TA1 - rtems_task_resume - on Task 2" );
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_resume of TA2" );
+
+ puts( "TA1 - rtems_task_resume - on Task 3" );
+ status = rtems_task_resume( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_resume of TA3" );
+
+ while ( FOREVER ) {
+ if ( Run_count[ 1 ] == 3 ) {
+ puts( "TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT" );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ old_seconds = time.second;
+
+ for ( seconds = 0 ; seconds < 6 ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second != old_seconds ) {
+ old_seconds = time.second;
+ seconds++;
+ print_time( "TA1 - ", &time, "\n" );
+ }
+ }
+
+ puts( "TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT" );
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ while ( FOREVER );
+ }
+ }
+}
diff --git a/c/src/tests/sptests/sp04/task2.c b/c/src/tests/sptests/sp04/task2.c
new file mode 100644
index 0000000000..245c5a29bb
--- /dev/null
+++ b/c/src/tests/sptests/sp04/task2.c
@@ -0,0 +1,29 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/c/src/tests/sptests/sp04/task3.c b/c/src/tests/sptests/sp04/task3.c
new file mode 100644
index 0000000000..424fb28d4f
--- /dev/null
+++ b/c/src/tests/sptests/sp04/task3.c
@@ -0,0 +1,29 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/c/src/tests/sptests/sp04/tswitch.c b/c/src/tests/sptests/sp04/tswitch.c
new file mode 100644
index 0000000000..8697b9670a
--- /dev/null
+++ b/c/src/tests/sptests/sp04/tswitch.c
@@ -0,0 +1,59 @@
+/* Task_switch
+ *
+ * This routine is the tswitch user extension. It determines which
+ * task is being switched to and displays a message indicating the
+ * time and date that it gained control.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * heir - pointer to heir TCB
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+)
+{
+ rtems_unsigned32 index;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ index = task_number( heir->Object.id );
+
+ switch( index ) {
+ case 1:
+ case 2:
+ case 3:
+ Run_count[ index ] += 1;
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ index ], FALSE );
+ print_time( "- ", &time, "\n" );
+
+ if ( time.second >= 16 ) {
+ puts( "*** END OF TEST 4 ***" );
+ exit( 0 );
+ }
+ break;
+
+ case 0:
+ default:
+ break;
+ }
+}
diff --git a/c/src/tests/sptests/sp05/Makefile.in b/c/src/tests/sptests/sp05/Makefile.in
new file mode 100644
index 0000000000..0f3cbd5eb3
--- /dev/null
+++ b/c/src/tests/sptests/sp05/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp05
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp05/init.c b/c/src/tests/sptests/sp05/init.c
new file mode 100644
index 0000000000..10db3b6321
--- /dev/null
+++ b/c/src/tests/sptests/sp05/init.c
@@ -0,0 +1,81 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 5 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp05/sp05.doc b/c/src/tests/sptests/sp05/sp05.doc
new file mode 100644
index 0000000000..69c4a468b2
--- /dev/null
+++ b/c/src/tests/sptests/sp05/sp05.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test5
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident
+ tm_wkafter, t_suspend, t_resume
+
+concepts:
+
+ a. Verifies that a task can be suspended and resumed.
+
+ b. Verifies that a task can suspend itself.
diff --git a/c/src/tests/sptests/sp05/sp05.scn b/c/src/tests/sptests/sp05/sp05.scn
new file mode 100644
index 0000000000..40afb2d4b2
--- /dev/null
+++ b/c/src/tests/sptests/sp05/sp05.scn
@@ -0,0 +1,47 @@
+*** TEST 5 ***
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_suspend - suspend self
+TA3 - rtems_task_suspend - suspend self
+TA1 - rtems_task_suspend - suspend TA3
+TA1 - rtems_task_resume - resume TA2
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_resume - resume TA3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA3
+TA1 - rtems_task_resume - resume TA2
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_resume - resume TA3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA3
+TA1 - rtems_task_resume - resume TA2
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_resume - resume TA3
+*** END OF TEST 5 ***
diff --git a/c/src/tests/sptests/sp05/system.h b/c/src/tests/sptests/sp05/system.h
new file mode 100644
index 0000000000..fa31776238
--- /dev/null
+++ b/c/src/tests/sptests/sp05/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp05/task1.c b/c/src/tests/sptests/sp05/task1.c
new file mode 100644
index 0000000000..878e1b447a
--- /dev/null
+++ b/c/src/tests/sptests/sp05/task1.c
@@ -0,0 +1,78 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies that tasks can
+ * be suspended and resumed.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: The rtems_task_suspend() directives fail on the first iteration.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid2;
+ rtems_id tid3;
+ rtems_unsigned32 pass;
+ rtems_status_code status;
+
+ status = rtems_task_ident( Task_name[ 2 ], 1, &tid2 );
+ directive_failed( status, "rtems_task_ident of TA2" );
+
+ status = rtems_task_ident( Task_name[ 3 ], 1, &tid3 );
+ directive_failed( status, "rtems_task_ident of TA3" );
+
+ for ( pass=1 ; pass <= 3 ; pass++ ) {
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after of TA1" );
+
+ puts( "TA1 - rtems_task_suspend - suspend TA3" );
+ status = rtems_task_suspend( tid3 );
+ if ( pass == 1 ) {
+ fatal_directive_status(
+ status,
+ RTEMS_ALREADY_SUSPENDED,
+ "rtems_task_suspend of TA3"
+ );
+ } else {
+ directive_failed( status, "rtems_task_suspend of TA3" );
+ }
+
+ puts( "TA1 - rtems_task_resume - resume TA2" );
+ status = rtems_task_resume( tid2 );
+ directive_failed( status, "rtems_task_resume of TA2" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_suspend - suspend TA2" );
+ status = rtems_task_suspend( tid2 );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_resume - resume TA3" );
+ status = rtems_task_resume( tid3 );
+ directive_failed( status, "rtems_task_resume" );
+ }
+
+ puts( "*** END OF TEST 5 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp05/task2.c b/c/src/tests/sptests/sp05/task2.c
new file mode 100644
index 0000000000..c631d53cd8
--- /dev/null
+++ b/c/src/tests/sptests/sp05/task2.c
@@ -0,0 +1,39 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Makes sure a task can suspend
+ * itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_task_suspend - suspend self" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ while( FOREVER ) {
+ puts( "TA2 - rtems_task_wake_after - sleep 1 second" );
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after of TA2" );
+ }
+}
diff --git a/c/src/tests/sptests/sp05/task3.c b/c/src/tests/sptests/sp05/task3.c
new file mode 100644
index 0000000000..e0af170ce3
--- /dev/null
+++ b/c/src/tests/sptests/sp05/task3.c
@@ -0,0 +1,39 @@
+/* Task_3
+ *
+ * This routine serves as a test task. Makes sure a task can suspend
+ * itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA3 - rtems_task_suspend - suspend self" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA3" );
+
+ while( FOREVER ) {
+ puts( "TA3 - rtems_task_wake_after - sleep 1 second" );
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after of TA3" );
+ }
+}
diff --git a/c/src/tests/sptests/sp06/Makefile.in b/c/src/tests/sptests/sp06/Makefile.in
new file mode 100644
index 0000000000..198b7c529b
--- /dev/null
+++ b/c/src/tests/sptests/sp06/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp06
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp06/init.c b/c/src/tests/sptests/sp06/init.c
new file mode 100644
index 0000000000..3471294562
--- /dev/null
+++ b/c/src/tests/sptests/sp06/init.c
@@ -0,0 +1,87 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+
+ puts( "\n\n*** TEST 6 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Argument = 0;
+ Restart_argument = 1;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, Argument );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, Argument );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_set_priority( Task_id[ 3 ], 5, &previous_priority );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp06/sp06.doc b/c/src/tests/sptests/sp06/sp06.doc
new file mode 100644
index 0000000000..e09b7c04f2
--- /dev/null
+++ b/c/src/tests/sptests/sp06/sp06.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test6
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ tm_wkafter, t_restart
+
+concepts:
+
+ a. Verifies that a task can restart a task other than itself.
+
+ b. Verifies that a task can restart itself.
diff --git a/c/src/tests/sptests/sp06/sp06.scn b/c/src/tests/sptests/sp06/sp06.scn
new file mode 100644
index 0000000000..64f6489dc8
--- /dev/null
+++ b/c/src/tests/sptests/sp06/sp06.scn
@@ -0,0 +1,40 @@
+*** TEST 6 ***
+TA1 - is beginning to run
+TA1 - restarting TA3
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+*** END OF TEST 6 ***
+
+NOTE: The prints from TA2 may not be as regular as indicated in the screen.
+ The important point is that TA2 is running and gets restarted.
diff --git a/c/src/tests/sptests/sp06/system.h b/c/src/tests/sptests/sp06/system.h
new file mode 100644
index 0000000000..e2065c8196
--- /dev/null
+++ b/c/src/tests/sptests/sp06/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_task_argument Argument; /* generic task argument */
+TEST_EXTERN rtems_task_argument Restart_argument; /* task 1 restart argument */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp06/task1.c b/c/src/tests/sptests/sp06/task1.c
new file mode 100644
index 0000000000..033b33b348
--- /dev/null
+++ b/c/src/tests/sptests/sp06/task1.c
@@ -0,0 +1,61 @@
+/* Task_1
+ *
+ * This task serves as a test task. Verifies that a task can restart
+ * both itself and other tasks.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1( argument )
+rtems_unsigned32 argument;
+{
+ rtems_unsigned32 pass;
+ rtems_status_code status;
+
+ puts( "TA1 - is beginning to run" );
+
+ pass = argument + 1;
+
+ if ( pass == 5 ) {
+ puts( "*** END OF TEST 6 ***" );
+ exit( 0 );
+ }
+
+ if ( pass == 1 ) {
+ puts( "TA1 - restarting TA3" );
+ status = rtems_task_restart( Task_id[ 3 ], Restart_argument );
+ directive_failed( status, "rtems_task_restart of TA3" );
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_restart - restarting TA2" );
+ status = rtems_task_restart( Task_id[ 2 ], Restart_argument );
+ directive_failed( status, "rtems_task_restart TA2" );
+
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_restart - restarting self" );
+ status = rtems_task_restart( Task_id[ 1 ], pass );
+ directive_failed( status, "rtems_task_restart of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp06/task2.c b/c/src/tests/sptests/sp06/task2.c
new file mode 100644
index 0000000000..04d16dbffc
--- /dev/null
+++ b/c/src/tests/sptests/sp06/task2.c
@@ -0,0 +1,40 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It simply runs forever so
+ * another task can restart it.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2( argument )
+rtems_task_argument argument;
+{
+ rtems_status_code status;
+
+ puts( "TA2 - is beginning to run" );
+ if ( argument == Argument ) {
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ while( FOREVER ) {
+ puts( "TA2 - rtems_task_wake_after - sleep 1/2 second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/c/src/tests/sptests/sp06/task3.c b/c/src/tests/sptests/sp06/task3.c
new file mode 100644
index 0000000000..21da8aea9f
--- /dev/null
+++ b/c/src/tests/sptests/sp06/task3.c
@@ -0,0 +1,32 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It is started, has its priority
+ * changed, and when it runs it deletes itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp07/Makefile.in b/c/src/tests/sptests/sp07/Makefile.in
new file mode 100644
index 0000000000..78e64bfdcb
--- /dev/null
+++ b/c/src/tests/sptests/sp07/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp07
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3 task4 taskexit tcreate tdelete trestart tstart
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp07/init.c b/c/src/tests/sptests/sp07/init.c
new file mode 100644
index 0000000000..545bace5a7
--- /dev/null
+++ b/c/src/tests/sptests/sp07/init.c
@@ -0,0 +1,128 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_extensions_table Extensions = {
+ Task_create_extension, /* task create user extension */
+ Task_start_extension, /* task start user extension */
+ Task_restart_extension, /* task restart user extension */
+ Task_delete_extension, /* task delete user extension */
+ NULL, /* task switch user extension */
+ NULL, /* begin user extension */
+ Task_exit_extension, /* task exitted user extension */
+ NULL /* fatal error extension */
+};
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 7 ***" );
+
+ Extension_name[ 1 ] = rtems_build_name( 'E', 'X', 'T', ' ' );
+
+ status = rtems_extension_create(
+ Extension_name[ 1 ],
+ &Extensions,
+ &Extension_id[ 1 ]
+ );
+ directive_failed( status, "rtems_extension_create" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_restart( Task_id[ 3 ], 0 );
+ directive_failed( status, "rtems_task_restart of TA3" );
+
+ status = rtems_task_set_note( Task_id[ 1 ], RTEMS_NOTEPAD_8, 4 );
+ directive_failed( status, "task_set_node of TA1" );
+ printf( "INIT - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8 " );
+ puts ( "to TA1's priority: 04" );
+
+ status = rtems_task_set_note( Task_id[ 2 ], RTEMS_NOTEPAD_8, 4 );
+ directive_failed( status, "task_set_node of TA2" );
+ printf( "INIT - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8 " );
+ puts ( "to TA2's priority: 04");
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp07/sp07.doc b/c/src/tests/sptests/sp07/sp07.doc
new file mode 100644
index 0000000000..01af734c06
--- /dev/null
+++ b/c/src/tests/sptests/sp07/sp07.doc
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test7
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ t_delete, t_setreg, t_getreg, t_setpri, t_suspend
+
+concepts:
+
+ a. Verifies that tasks can communicate with each other via the
+ t_setreg and t_getreg directives.
+
+ b. Verifies that the highest priority task is dispatched to execute.
+
+ c. Verifies setting the priority of both a ready and a blocked task.
+
+ d. Verifies the deletion of ready and blocked tasks.
+
+ e. Verifies the tcreate user extension.
+
+ f. Verifies the tstart user extension.
+
+ g. Verifies the tdelete user extension.
diff --git a/c/src/tests/sptests/sp07/sp07.scn b/c/src/tests/sptests/sp07/sp07.scn
new file mode 100644
index 0000000000..1f6de2d93d
--- /dev/null
+++ b/c/src/tests/sptests/sp07/sp07.scn
@@ -0,0 +1,33 @@
+*** TEST 7 ***
+TASK_CREATE - TA1 - created.
+TASK_CREATE - TA2 - created.
+TASK_CREATE - TA3 - created.
+TASK_CREATE - TA4 - created.
+TASK_START - TA1 - started.
+TASK_START - TA2 - started.
+TASK_START - TA3 - started.
+TASK_START - TA4 - started.
+TASK_RESTART - TA3 - restarted.
+INIT - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8 to TA1's priority: 04
+INIT - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8 to TA2's priority: 04
+<pause>
+TA1 - rtems_task_set_priority - get initial priority of self: 04
+TA1 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 04
+TA1 - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8: 03
+TA1 - rtems_task_set_priority - set TA2's priority: 03
+TA2 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 03
+TA2 - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8: 02
+TA2 - rtems_task_set_priority - set TA1's priority: 02
+TA1 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 02
+TA1 - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8: 01
+TA1 - rtems_task_set_priority - set TA2's priority: 01
+TA2 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 01
+TA2 - rtems_task_suspend - suspend TA1
+TA2 - rtems_task_set_priority - set priority of TA1 ( blocked )
+TASK_DELETE - TA2 deleting TA1
+TASK_DELETE - TA2 deleting TA3
+TASK_DELETE - TA2 deleting TA2
+TA4 - exitting task
+RTEMS_TASK_EXITTED - extension invoked for TA4
+*** END OF TEST 7 ***
+TASK_DELETE - TA4 deleting TA4 <---- may not appear
diff --git a/c/src/tests/sptests/sp07/system.h b/c/src/tests/sptests/sp07/system.h
new file mode 100644
index 0000000000..89bc8ac9b6
--- /dev/null
+++ b/c/src/tests/sptests/sp07/system.h
@@ -0,0 +1,87 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_boolean Task_create_extension(
+ rtems_tcb *unused,
+ rtems_tcb *created_task
+);
+
+rtems_extension Task_delete_extension(
+ rtems_tcb *running_task,
+ rtems_tcb *deleted_task
+);
+
+rtems_extension Task_restart_extension(
+ rtems_tcb *unused,
+ rtems_tcb *restarted_task
+);
+
+rtems_extension Task_start_extension(
+ rtems_tcb *unused,
+ rtems_tcb *started_task
+);
+
+rtems_extension Task_exit_extension(
+ rtems_tcb *running_task
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 5 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 5 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Extension_id[ 4 ];
+TEST_EXTERN rtems_name Extension_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp07/task1.c b/c/src/tests/sptests/sp07/task1.c
new file mode 100644
index 0000000000..a829d68218
--- /dev/null
+++ b/c/src/tests/sptests/sp07/task1.c
@@ -0,0 +1,85 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies intertask communication
+ * using task notepads and verifies the the user extensions (tcreate, etc).
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority the_priority;
+ rtems_task_priority previous_priority;
+
+ rtems_test_pause();
+
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ RTEMS_CURRENT_PRIORITY,
+ &the_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ printf(
+ "TA1 - rtems_task_set_priority - get initial priority of self: %02d\n",
+ the_priority
+ );
+
+ while( FOREVER ) {
+ status = rtems_task_get_note( RTEMS_SELF, RTEMS_NOTEPAD_8, &the_priority );
+ directive_failed( status, "rtems_task_get_note" );
+ printf(
+"TA1 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: %02d\n",
+ the_priority
+ );
+
+ if ( --the_priority == 0 ) {
+ puts( "TA1 - rtems_task_suspend - suspend TA2" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend" );
+
+ puts( "TA1 - rtems_task_set_priority - set priority of TA2 ( blocked )" );
+ status = rtems_task_set_priority( Task_id[ 2 ], 5, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of TA2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+ }
+
+ printf( "TA1 - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_note( Task_id[ 2 ], RTEMS_NOTEPAD_8, the_priority );
+ directive_failed( status, "rtems_task_set_note" );
+
+ printf( "TA1 - rtems_task_set_priority - set TA2's priority: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_priority(
+ Task_id[ 2 ],
+ the_priority,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ }
+}
diff --git a/c/src/tests/sptests/sp07/task2.c b/c/src/tests/sptests/sp07/task2.c
new file mode 100644
index 0000000000..54a575b5d0
--- /dev/null
+++ b/c/src/tests/sptests/sp07/task2.c
@@ -0,0 +1,78 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Plays with priorities to verify
+ * that the highest priority task is always executed.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority the_priority;
+ rtems_task_priority previous_priority;
+
+ while( FOREVER ) {
+
+ status = rtems_task_get_note( RTEMS_SELF, RTEMS_NOTEPAD_8, &the_priority );
+ directive_failed( status, "rtems_task_get_note" );
+ printf(
+"TA2 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: %02d\n",
+ the_priority
+ );
+
+ if ( --the_priority == 0 ) {
+ puts( "TA2 - rtems_task_suspend - suspend TA1" );
+ status = rtems_task_suspend( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_suspend" );
+
+ puts( "TA2 - rtems_task_set_priority - set priority of TA1 ( blocked )" );
+ status = rtems_task_set_priority( Task_id[ 1 ], 5, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_task_delete( Task_id[ 1 ] ); /* TA1 is blocked */
+ directive_failed( status, "rtems_task_delete of TA1" );
+
+ status = rtems_task_delete( Task_id[ 3 ] ); /* TA3 is ready */
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of SELD" );
+
+ } else {
+
+ printf( "TA2 - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_note(Task_id[ 1 ], RTEMS_NOTEPAD_8, the_priority);
+ directive_failed( status, "rtems_task_set_note" );
+
+ printf( "TA2 - rtems_task_set_priority - set TA1's priority: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_priority(
+ Task_id[ 1 ],
+ the_priority,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ }
+ }
+}
diff --git a/c/src/tests/sptests/sp07/task3.c b/c/src/tests/sptests/sp07/task3.c
new file mode 100644
index 0000000000..f725488aaa
--- /dev/null
+++ b/c/src/tests/sptests/sp07/task3.c
@@ -0,0 +1,34 @@
+/* Task_3
+ *
+ * This routine serves as a low priority test task that should never
+ * execute.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ while( FOREVER ) {
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/c/src/tests/sptests/sp07/task4.c b/c/src/tests/sptests/sp07/task4.c
new file mode 100644
index 0000000000..9405a0a1f5
--- /dev/null
+++ b/c/src/tests/sptests/sp07/task4.c
@@ -0,0 +1,30 @@
+/* Task_4
+ *
+ * This routine serves as a low priority test task that should exit
+ * a soon as it runs to test the taskexitted user extension.
+ * execute.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ puts( "TA4 - exitting task" );
+}
diff --git a/c/src/tests/sptests/sp07/taskexit.c b/c/src/tests/sptests/sp07/taskexit.c
new file mode 100644
index 0000000000..27977432b8
--- /dev/null
+++ b/c/src/tests/sptests/sp07/taskexit.c
@@ -0,0 +1,33 @@
+/* Task_exit_extension
+ *
+ * This routine is the task exitted user extension.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_exit_extension(
+ rtems_tcb *running_task
+)
+{
+ if ( task_number( running_task->Object.id ) > 0 ) {
+ puts_nocr( "RTEMS_TASK_EXITTED - extension invoked for " );
+ put_name( Task_name[ task_number( running_task->Object.id ) ], TRUE );
+ }
+
+ puts("*** END OF TEST 7 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp07/tcreate.c b/c/src/tests/sptests/sp07/tcreate.c
new file mode 100644
index 0000000000..6e17e3ca56
--- /dev/null
+++ b/c/src/tests/sptests/sp07/tcreate.c
@@ -0,0 +1,35 @@
+/* Task_create_extension
+ *
+ * This routine is the tcreate user extension.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * created_task - pointer to new TCB being created
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_boolean Task_create_extension(
+ rtems_tcb *unused,
+ rtems_tcb *created_task
+)
+{
+ if ( task_number( created_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_CREATE - " );
+ put_name( Task_name[ task_number( created_task->Object.id ) ], FALSE );
+ puts( " - created." );
+ }
+ return TRUE;
+}
diff --git a/c/src/tests/sptests/sp07/tdelete.c b/c/src/tests/sptests/sp07/tdelete.c
new file mode 100644
index 0000000000..ba59d6be7d
--- /dev/null
+++ b/c/src/tests/sptests/sp07/tdelete.c
@@ -0,0 +1,37 @@
+/* Task_delete_extension
+ *
+ * This routine is the delete user extension.
+ *
+ * Input parameters:
+ * running_task - pointer to running TCB
+ * deleted_task - pointer to TCB deleted
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_delete_extension(
+ rtems_tcb *running_task,
+ rtems_tcb *deleted_task
+)
+{
+ if ( task_number( running_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_DELETE - " );
+ put_name( Task_name[ task_number( running_task->Object.id ) ], FALSE );
+ }
+ if ( task_number( deleted_task->Object.id ) > 0 ) {
+ puts_nocr( " deleting " );
+ put_name( Task_name[ task_number( deleted_task->Object.id ) ], TRUE );
+ }
+}
diff --git a/c/src/tests/sptests/sp07/trestart.c b/c/src/tests/sptests/sp07/trestart.c
new file mode 100644
index 0000000000..0e93ae506c
--- /dev/null
+++ b/c/src/tests/sptests/sp07/trestart.c
@@ -0,0 +1,34 @@
+/* Task_restart_extension
+ *
+ * This routine is the trestart user extension.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * restarted_task - pointer to new TCB being started
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Task_restart_extension(
+ rtems_tcb *unused,
+ rtems_tcb *restarted_task
+)
+{
+ if ( task_number( restarted_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_RESTART - " );
+ put_name( Task_name[ task_number( restarted_task->Object.id ) ], FALSE );
+ puts( " - restarted." );
+ }
+}
diff --git a/c/src/tests/sptests/sp07/tstart.c b/c/src/tests/sptests/sp07/tstart.c
new file mode 100644
index 0000000000..0143260c4a
--- /dev/null
+++ b/c/src/tests/sptests/sp07/tstart.c
@@ -0,0 +1,34 @@
+/* Task_start_extension
+ *
+ * This routine is the tstart user extension.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * started_task - pointer to new TCB being started
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_start_extension(
+ rtems_tcb *unused,
+ rtems_tcb *started_task
+)
+{
+ if ( task_number( started_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_START - " );
+ put_name( Task_name[ task_number( started_task->Object.id ) ], FALSE );
+ puts( " - started." );
+ }
+}
diff --git a/c/src/tests/sptests/sp08/Makefile.in b/c/src/tests/sptests/sp08/Makefile.in
new file mode 100644
index 0000000000..d177e6691c
--- /dev/null
+++ b/c/src/tests/sptests/sp08/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp08
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp08/init.c b/c/src/tests/sptests/sp08/init.c
new file mode 100644
index 0000000000..0e235a9bc9
--- /dev/null
+++ b/c/src/tests/sptests/sp08/init.c
@@ -0,0 +1,53 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 8 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp08/sp08.doc b/c/src/tests/sptests/sp08/sp08.doc
new file mode 100644
index 0000000000..72db2a37f9
--- /dev/null
+++ b/c/src/tests/sptests/sp08/sp08.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test8
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ t_mode
+
+concepts:
+
+ a. Verifies every mode change possible.
+
+ b. Verifies the fatal error handler.
diff --git a/c/src/tests/sptests/sp08/sp08.scn b/c/src/tests/sptests/sp08/sp08.scn
new file mode 100644
index 0000000000..d85ccc384f
--- /dev/null
+++ b/c/src/tests/sptests/sp08/sp08.scn
@@ -0,0 +1,22 @@
+*** TEST 8 ***
+TA1 - rtems_task_mode - RTEMS_ASR - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: 00000400
+TA1 - rtems_task_mode - RTEMS_ASR - previous mode: 00000400
+TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: 00000200
+TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: 00000200
+TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: 00000100
+TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: 00000100
+TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 3 ) - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 5 ) - previous mode: 00000003
+TA1 - rtems_task_mode - set all modes - previous mode: 00000005
+TA1 - rtems_task_mode - set all modes - previous mode: 00000703
+TA1 - rtems_task_mode - clear all modes - previous mode: 00000703
+TA1 - rtems_task_mode - get current mode - previous mode: 00000000
+*** END OF TEST 8 ***
+
+NOTE: The interrupt level lines will be different on CPUs with few levels.
diff --git a/c/src/tests/sptests/sp08/system.h b/c/src/tests/sptests/sp08/system.h
new file mode 100644
index 0000000000..2e43da787f
--- /dev/null
+++ b/c/src/tests/sptests/sp08/system.h
@@ -0,0 +1,50 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+#define put_mode( _comment, _output_mode ) \
+ printf( "%s %08x\n", _comment, _output_mode );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp08/task1.c b/c/src/tests/sptests/sp08/task1.c
new file mode 100644
index 0000000000..d2031fdde2
--- /dev/null
+++ b/c/src/tests/sptests/sp08/task1.c
@@ -0,0 +1,256 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies all combinations of
+ * task mode changes.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+/* BEGINNING OF RTEMS_ASR */
+
+ status = rtems_task_mode( RTEMS_ASR, RTEMS_ASR_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_ASR - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_ASR,
+ RTEMS_ASR_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_ASR,
+ RTEMS_ASR_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_ASR,
+ RTEMS_ASR_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_ASR - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_ASR */
+
+/* BEGINNING OF RTEMS_TIMESLICE */
+
+ status = rtems_task_mode(
+ RTEMS_NO_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_TIMESLICE */
+
+/* BEGINNING OF RTEMS_PREEMPT */
+
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_PREEMPT */
+
+/* BEGINNING OF RTEMS_INTERRUPT_LEVEL */
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(3),
+ RTEMS_INTERRUPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 3 ) - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(5),
+ RTEMS_INTERRUPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 5 ) - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_INTERRUPT_LEVEL */
+
+/* BEGINNING OF COMBINATIONS */
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(3) | RTEMS_NO_ASR |
+ RTEMS_TIMESLICE | RTEMS_NO_PREEMPT,
+ RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
+ RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - set all modes - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(3) | RTEMS_NO_ASR |
+ RTEMS_TIMESLICE | RTEMS_NO_PREEMPT,
+ RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
+ RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - set all modes - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(0) | RTEMS_ASR | RTEMS_NO_TIMESLICE | RTEMS_PREEMPT,
+ RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
+ RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - clear all modes - previous mode: ",
+ previous_mode
+ );
+
+/* END OF COMBINATIONS */
+
+/* BEGINNING OF CURRENT MODE */
+
+ status = rtems_task_mode(
+ RTEMS_CURRENT_MODE,
+ RTEMS_CURRENT_MODE,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - get current mode - previous mode: ",
+ previous_mode
+ );
+
+/* END OF CURRENT MODE */
+
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp09/Makefile.in b/c/src/tests/sptests/sp09/Makefile.in
new file mode 100644
index 0000000000..33d0dfd0bd
--- /dev/null
+++ b/c/src/tests/sptests/sp09/Makefile.in
@@ -0,0 +1,65 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp09
+
+MANAGERS=io message dual_ported_memory event multi_processor \
+ region semaphore signal rate_monotonic timer partition
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init delay isr screen01 screen02 screen03 screen04 screen05 screen06 \
+ screen07 screen08 screen09 screen10 screen11 screen12 screen13 \
+ screen14 task1 task2 task3 task4
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp09/delay.c b/c/src/tests/sptests/sp09/delay.c
new file mode 100644
index 0000000000..a21516f216
--- /dev/null
+++ b/c/src/tests/sptests/sp09/delay.c
@@ -0,0 +1,28 @@
+/* Delayed_routine
+ *
+ * This routine is used as the timer routine for Timer Manager tests.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_routine(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+}
diff --git a/c/src/tests/sptests/sp09/init.c b/c/src/tests/sptests/sp09/init.c
new file mode 100644
index 0000000000..c0ff9d86c1
--- /dev/null
+++ b/c/src/tests/sptests/sp09/init.c
@@ -0,0 +1,120 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 9 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+ Task_name[ 6 ] = rtems_build_name( 'T', 'A', '6', ' ' );
+ Task_name[ 7 ] = rtems_build_name( 'T', 'A', '7', ' ' );
+ Task_name[ 8 ] = rtems_build_name( 'T', 'A', '8', ' ' );
+ Task_name[ 9 ] = rtems_build_name( 'T', 'A', '9', ' ' );
+ Task_name[ 10 ] = rtems_build_name( 'T', 'A', 'A', ' ' );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'M', '1', ' ' );
+ Semaphore_name[ 2 ] = rtems_build_name( 'S', 'M', '2', ' ' );
+ Semaphore_name[ 3 ] = rtems_build_name( 'S', 'M', '3', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'Q', '1', ' ' );
+ Queue_name[ 2 ] = rtems_build_name( 'M', 'Q', '2', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'T', '1', ' ' );
+
+ Region_name[ 1 ] = rtems_build_name( 'R', 'N', '1', ' ' );
+
+ Port_name[ 1 ] = rtems_build_name( 'D', 'P', '1', ' ' );
+
+ Period_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+#if 0
+ status = rtems_task_create(
+ Task_name[1],
+ 4,
+ 10,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_task_create with illegal stack size"
+ );
+ puts( "INIT - rtems_task_create - RTEMS_INVALID_SIZE" );
+#endif
+ puts( "INIT - rtems_task_create - RTEMS_INVALID_SIZE -- NOT CHECKED" );
+
+ status = rtems_task_create(
+ Task_name[1],
+ 0,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_PRIORITY,
+ "rtems_task_create with illegal priority"
+ );
+ puts( "INIT - rtems_task_create - RTEMS_INVALID_PRIORITY" );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 3,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_restart( Task_id[ 1 ], 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INCORRECT_STATE,
+ "rtems_task_restart of DORMANT task"
+ );
+ puts( "INIT - rtems_task_restart - RTEMS_INCORRECT_STATE" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp09/isr.c b/c/src/tests/sptests/sp09/isr.c
new file mode 100644
index 0000000000..d829ff8944
--- /dev/null
+++ b/c/src/tests/sptests/sp09/isr.c
@@ -0,0 +1,27 @@
+/* Service_routine
+ *
+ * This routine is used as the timer routine for Interrupt Manager tests.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_isr Service_routine(
+ rtems_vector_number ignored
+)
+{
+}
diff --git a/c/src/tests/sptests/sp09/screen01.c b/c/src/tests/sptests/sp09/screen01.c
new file mode 100644
index 0000000000..25e4f58591
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen01.c
@@ -0,0 +1,168 @@
+/* Screen1
+ *
+ * This routine generates error screen 1 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen1()
+{
+ rtems_unsigned32 notepad_value;
+ rtems_id self_id;
+ rtems_task_priority previous_priority;
+ rtems_status_code status;
+
+ status = rtems_task_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_delete with illegal id"
+ );
+ puts( "TA1 - rtems_task_delete - RTEMS_INVALID_ID" );
+
+ status = rtems_task_get_note( RTEMS_SELF, 100, &notepad_value );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_task_get_note with illegal notepad"
+ );
+ puts( "TA1 - rtems_task_get_note - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_task_get_note( 100, RTEMS_NOTEPAD_LAST, &notepad_value );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_get_note with illegal id"
+ );
+ puts( "TA1 - rtems_task_get_note - RTEMS_INVALID_ID" );
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &self_id );
+ directive_failed( status, "rtems_task_ident of self" );
+
+ if ( self_id != Task_id[ 1 ] ) {
+ puts( "ERROR - rtems_task_ident - incorrect ID returned!" );
+ }
+ puts( "TA1 - rtems_task_ident - current task RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_ident( 100, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_task_ident with illegal name (local)"
+ );
+ puts( "TA1 - rtems_task_ident - global RTEMS_INVALID_NAME" );
+
+ status = rtems_task_ident( 100, 1, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_task_ident with illegal name (global)"
+ );
+ puts( "TA1 - rtems_task_ident - local RTEMS_INVALID_NAME" );
+
+ status = rtems_task_ident( 100, 2, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NODE,
+ "rtems_task_ident with illegal node"
+ );
+ puts( "TA1 - rtems_task_ident - RTEMS_INVALID_NODE" );
+
+ status = rtems_task_restart( 100, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_restart with illegal id"
+ );
+ puts( "TA1 - rtems_task_restart - RTEMS_INVALID_ID" );
+
+ status = rtems_task_resume( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_resume with illegal id"
+ );
+ puts( "TA1 - rtems_task_resume - RTEMS_INVALID_ID" );
+
+ status = rtems_task_resume( RTEMS_SELF );
+ fatal_directive_status(
+ status,
+ RTEMS_INCORRECT_STATE,
+ "rtems_task_resume of ready task"
+ );
+ puts( "TA1 - rtems_task_resume - RTEMS_INCORRECT_STATE" );
+
+ status = rtems_task_set_priority( RTEMS_SELF, 512, &previous_priority );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_PRIORITY,
+ "rtems_task_set_priority with illegal priority"
+ );
+ puts( "TA1 - rtems_task_set_priority - RTEMS_INVALID_PRIORITY" );
+
+ status = rtems_task_set_priority( 100, 8, &previous_priority );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_set_priority with illegal id"
+ );
+ puts( "TA1 - rtems_task_set_priority - RTEMS_INVALID_ID" );
+
+ status = rtems_task_set_note(
+ RTEMS_SELF,
+ RTEMS_NOTEPAD_LAST+10,
+ notepad_value
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_task_set_note with illegal notepad"
+ );
+ puts( "TA1 - rtems_task_set_note - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_task_set_note( 100, RTEMS_NOTEPAD_LAST, notepad_value );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_set_note with illegal id"
+ );
+ puts( "TA1 - rtems_task_set_note - RTEMS_INVALID_ID" );
+
+ status = rtems_task_start( 100, Task_1, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_start with illegal id"
+ );
+ puts( "TA1 - rtems_task_start - RTEMS_INVALID_ID" );
+
+ status = rtems_task_start( 0, Task_1, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INCORRECT_STATE,
+ "rtems_task_start of ready task"
+ );
+ puts( "TA1 - rtems_task_start - RTEMS_INCORRECT_STATE" );
+
+ status = rtems_task_suspend( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_suspend with illegal id"
+ );
+ puts( "TA1 - rtems_task_suspend - RTEMS_INVALID_ID" );
+}
diff --git a/c/src/tests/sptests/sp09/screen02.c b/c/src/tests/sptests/sp09/screen02.c
new file mode 100644
index 0000000000..2b4cd3142e
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen02.c
@@ -0,0 +1,192 @@
+/* Screen2
+ *
+ * This routine generates error screen 2 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen2()
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+/* errors before clock is set */
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ puts(
+ "TA1 - rtems_clock_get - RTEMS_NOT_DEFINED -- DID BSP SET THE TIME OF DAY?"
+ );
+ } else {
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_clock_get before clock is set"
+ );
+ puts( "TA1 - rtems_clock_get - RTEMS_NOT_DEFINED" );
+ }
+
+ status = rtems_task_wake_when( &time );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ puts(
+"TA1 - rtems_task_wake_when - RTEMS_NOT_DEFINED -- DID BSP SET THE TIME OF DAY?"
+ );
+ } else {
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_task_wake_when before clock is set"
+ );
+ puts( "TA1 - rtems_task_wake_when - RTEMS_NOT_DEFINED" );
+ }
+
+ status = rtems_timer_fire_when( 0, &time, Delayed_routine, NULL );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ puts(
+ "TA1 - timer_wake_when - RTEMS_NOT_DEFINED -- DID BSP SET THE TIME OF DAY?"
+ );
+ } else {
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "task_fire_when before clock is set"
+ );
+ puts( "TA1 - rtems_timer_fire_when - RTEMS_NOT_DEFINED" );
+ }
+
+ build_time( &time, 2, 5, 1987, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid year"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 15, 5, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid month"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 32, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid day"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 25, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid hour"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 61, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid minute"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 61, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid second"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 45, TICKS_PER_SECOND + 1 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid ticks per second"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set successful" );
+ puts( " - RTEMS_SUCCESSFUL" );
+
+/* rtems_task_wake_when */
+
+ build_time( &time, 2, 5, 1988, 8, 30, 48, TICKS_PER_SECOND + 1 );
+ time.second += 3;
+ puts( "TA1 - rtems_task_wake_when - TICKINVALID - sleep about 3 seconds" );
+
+ status = rtems_task_wake_when( &time );
+ directive_failed(
+ status,
+ "rtems_task_wake_when with invalid ticks per second"
+ );
+ puts( "TA1 - rtems_task_wake_when - TICKINVALID - woke up RTEMS_SUCCESSFUL" );
+
+ build_time( &time, 2, 5, 1961, 8, 30, 48, 0 );
+ print_time( "TA1 - rtems_task_wake_when - ", &time, "" );
+ status = rtems_task_wake_when( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_task_wake_when with invalid year"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 25, 30, 48, 0 );
+ print_time( "TA1 - rtems_task_wake_when - ", &time, "" );
+ status = rtems_task_wake_when( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_task_wake_when with invalid hour"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ print_time( "TA1 - current time - ", &time, "\n" );
+
+ time.month = 1;
+ print_time( "TA1 - rtems_task_wake_when - ", &time, "" );
+ status = rtems_task_wake_when( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_task_wake_when before current time"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+}
diff --git a/c/src/tests/sptests/sp09/screen03.c b/c/src/tests/sptests/sp09/screen03.c
new file mode 100644
index 0000000000..2c0b44a517
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen03.c
@@ -0,0 +1,217 @@
+/* Screen3
+ *
+ * This routine generates error screen 3 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_configuration_table BSP_Configuration;
+extern rtems_cpu_table _CPU_Table;
+
+void Screen3()
+{
+ rtems_name task_name;
+ rtems_status_code status;
+
+ task_name = 1;
+ status = rtems_task_create(
+ 0,
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_task_create with illegal name"
+ );
+ puts( "TA1 - rtems_task_create - RTEMS_INVALID_NAME" );
+
+ /*
+ * If the bsp provides its own stack allocator, then
+ * skip the test that tries to allocate a stack that is too big.
+ */
+
+ if (_CPU_Table.stack_allocate_hook)
+ {
+ puts( "TA1 - rtems_task_create - stack size - RTEMS_UNSATISFIED -- SKIPPED" );
+ }
+ else
+ {
+ status = rtems_task_create(
+ task_name,
+ 1,
+ BSP_Configuration.work_space_size,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_task_create with a stack size larger than the workspace"
+ );
+ puts( "TA1 - rtems_task_create - stack size - RTEMS_UNSATISFIED" );
+ }
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+ puts( "TA1 - rtems_task_create - TA2 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+ puts( "TA1 - rtems_task_suspend - suspend TA2 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ALREADY_SUSPENDED,
+ "rtems_task_suspend of suspended TA2"
+ );
+ puts( "TA1 - rtems_task_suspend - suspend TA2 - RTEMS_ALREADY_SUSPENDED" );
+
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_resume of TA2" );
+ puts( "TA1 - rtems_task_resume - TA2 resumed - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+ puts( "TA1 - rtems_task_create - TA3 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+ puts( "TA1 - rtems_task_create - 4 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+ puts( "TA1 - rtems_task_create - 5 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 6 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 6 ]
+ );
+ directive_failed( status, "rtems_task_create of TA6" );
+ puts( "TA1 - rtems_task_create - 6 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 7 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 7 ]
+ );
+ directive_failed( status, "rtems_task_create of TA7" );
+ puts( "TA1 - rtems_task_create - 7 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 8 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 8 ]
+ );
+ directive_failed( status, "rtems_task_create of TA8" );
+ puts( "TA1 - rtems_task_create - 8 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 9 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 9 ]
+ );
+ directive_failed( status, "rtems_task_create of TA9" );
+ puts( "TA1 - rtems_task_create - 9 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 10 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 10 ]
+ );
+ directive_failed( status, "rtems_task_create of TA10" );
+ puts( "TA1 - rtems_task_create - 10 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ task_name,
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_task_create for too many tasks"
+ );
+ puts( "TA1 - rtems_task_create - 11 - RTEMS_TOO_MANY" );
+
+ status = rtems_task_create(
+ task_name,
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_task_create of global task in a single cpu system"
+ );
+ puts( "TA1 - rtems_task_create - RTEMS_MP_NOT_CONFIGURED" );
+}
diff --git a/c/src/tests/sptests/sp09/screen04.c b/c/src/tests/sptests/sp09/screen04.c
new file mode 100644
index 0000000000..0dd78deed9
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen04.c
@@ -0,0 +1,85 @@
+/* Screen4
+ *
+ * This routine generates error screen 4 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen4()
+{
+ rtems_event_set event_out;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive unsatisfied (ALL)"
+ );
+ puts( "TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( all conditions )" );
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_EVENT_ANY | RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive unsatisfied (ANY)"
+ );
+ puts( "TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( any condition )" );
+
+ puts( "TA1 - rtems_event_receive - timeout in 3 seconds" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND,
+ &event_out
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_event_receive"
+ );
+ puts( "TA1 - rtems_event_receive - woke up with RTEMS_TIMEOUT" );
+
+ status = rtems_event_send( 100, RTEMS_EVENT_16 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_event_send with illegal id"
+ );
+ puts( "TA1 - rtems_event_send - RTEMS_INVALID_ID" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 1 second - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ puts( " - RTEMS_SUCCESSFUL" );
+}
diff --git a/c/src/tests/sptests/sp09/screen05.c b/c/src/tests/sptests/sp09/screen05.c
new file mode 100644
index 0000000000..1070e654bf
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen05.c
@@ -0,0 +1,164 @@
+/* Screen5
+ *
+ * This routine generates error screen 5 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen5()
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_create(
+ 0,
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_semaphore_create with illegal name"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+ puts( "TA1 - rtems_semaphore_create - 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 1,
+ RTEMS_BINARY_SEMAPHORE,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+ puts( "TA1 - rtems_semaphore_create - 2 - RTEMS_SUCCESSFUL" );
+
+ do {
+ status = rtems_semaphore_create(
+ Semaphore_name[ 3 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ } while (status == RTEMS_SUCCESSFUL);
+
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_semaphore_create of too many"
+ );
+ puts( "TA1 - rtems_semaphore_create - 3 - RTEMS_TOO_MANY" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_INHERIT_PRIORITY | RTEMS_BINARY_SEMAPHORE | RTEMS_FIFO,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_semaphore_create of RTEMS_FIFO RTEMS_INHERIT_PRIORITY"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_INHERIT_PRIORITY | RTEMS_COUNTING_SEMAPHORE | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_semaphore_create of RTEMS_COUNTING_SEMAPHORE RTEMS_INHERIT_PRIORITY"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 2,
+ RTEMS_BINARY_SEMAPHORE,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_semaphore_create of binary semaphore with count > 1"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 3 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_semaphore_create of mp not configured"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_MP_NOT_CONFIGURED" );
+
+ status = rtems_semaphore_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_delete with illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_semaphore_delete( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_delete with local illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_semaphore_ident( 100, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_semaphore_ident will illegal name (local)"
+ );
+ puts( "TA1 - rtems_semaphore_ident - global RTEMS_INVALID_NAME" );
+
+ status = rtems_semaphore_ident( 100, 1, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_semaphore_ident will illegal name (global)"
+ );
+ puts( "TA1 - rtems_semaphore_ident - local RTEMS_INVALID_NAME" );
+}
diff --git a/c/src/tests/sptests/sp09/screen06.c b/c/src/tests/sptests/sp09/screen06.c
new file mode 100644
index 0000000000..967b68b867
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen06.c
@@ -0,0 +1,125 @@
+/* Screen6
+ *
+ * This routine generates error screen 6 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen6()
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ 100,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_obtain with illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_obtain - RTEMS_INVALID_ID" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain successful" );
+ puts( "TA1 - rtems_semaphore_obtain - got sem 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_semaphore_obtain not available"
+ );
+ puts( "TA1 - rtems_semaphore_obtain - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_semaphore_obtain - timeout in 3 seconds" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_semaphore_obtain timeout"
+ );
+ puts( "TA1 - rtems_semaphore_obtain - woke up with RTEMS_TIMEOUT" );
+
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_OWNER_OF_RESOURCE,
+ "rtems_semaphore_release and not owner"
+ );
+ puts( "TA1 - rtems_semaphore_release - RTEMS_NOT_OWNER_OF_RESOURCE" );
+
+ status = rtems_semaphore_release( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_release with illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_release - RTEMS_INVALID_ID" );
+
+ puts( "TA1 - rtems_task_start - start TA2 - RTEMS_SUCCESSFUL" );
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+
+ puts( "TA1 - rtems_semaphore_delete - delete sem 1 - RTEMS_SUCCESSFUL" );
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM1" );
+
+ puts( "TA1 - rtems_semaphore_obtain - binary semaphore" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain");
+
+ puts( "TA1 - rtems_semaphore_delete - delete sem 2 - RTEMS_RESOURCE_IN_USE" );
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_RESOURCE_IN_USE,
+ "rtems_semaphore_delete of SM2"
+ );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+
+ status = rtems_task_delete( Task_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_delete after the task has been deleted"
+ );
+}
diff --git a/c/src/tests/sptests/sp09/screen07.c b/c/src/tests/sptests/sp09/screen07.c
new file mode 100644
index 0000000000..9fb884b45e
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen07.c
@@ -0,0 +1,192 @@
+/* Screen7
+ *
+ * This routine generates error screen 7 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen7()
+{
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ status = rtems_message_queue_broadcast( 100, (long (*)[4]) buffer, 16, &count );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_broadcast with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_broadcast - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_create(
+ 0,
+ 3,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_message_queue_create with illegal name"
+ );
+
+ puts( "TA1 - rtems_message_queue_create - Q 1 - RTEMS_INVALID_NAME" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 1,
+ 16,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_message_queue_create of mp not configured"
+ );
+ puts( "TA1 - rtems_message_queue_create - Q 1 - RTEMS_MP_NOT_CONFIGURED" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 2 ],
+ 1,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_create of too many"
+ );
+ puts( "TA1 - rtems_message_queue_create - Q 2 - RTEMS_TOO_MANY" );
+
+ status = rtems_message_queue_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_create with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_delete with local illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_ident( 100, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_message_queue_ident with illegal name"
+ );
+ puts( "TA1 - rtems_message_queue_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_message_queue_flush( 100, &count );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_flush with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_flush - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_receive(
+ 100,
+ (long (*)[4]) buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 0
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_receive wit illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_receive - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4]) buffer,
+ &size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_message_queue_receive unsatisfied"
+ );
+ puts( "TA1 - rtems_message_queue_receive - Q 1 - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_message_queue_receive - Q 1 - timeout in 3 seconds" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4]) buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_message_queue_receive 3 second timeout"
+ );
+
+ puts(
+ "TA1 - rtems_message_queue_receive - Q 1 - woke up with RTEMS_TIMEOUT"
+ );
+
+ status = rtems_message_queue_send( 100, (long (*)[4]) buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_send with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_send - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4]) buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4]) buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4]) buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_send too many to a limited queue"
+ );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY" );
+}
diff --git a/c/src/tests/sptests/sp09/screen08.c b/c/src/tests/sptests/sp09/screen08.c
new file mode 100644
index 0000000000..1aaa9df451
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen08.c
@@ -0,0 +1,128 @@
+/* Screen8
+ *
+ * This routine generates error screen 8 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen8()
+{
+ long buffer[ 4 ];
+ rtems_status_code status;
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+ puts( "TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_send too many to limited queue"
+ );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY" );
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+ puts( "TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_send too many to limited queue"
+ );
+ puts(
+ "TA1 - rtems_message_queue_send - BUFFER 4 TO Q 1 - RTEMS_TOO_MANY"
+ );
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+ puts( "TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ puts( "TA1 - rtems_task_start - start TA3 - RTEMS_SUCCESSFUL" );
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+
+ puts( "TA1 - rtems_message_queue_delete - delete Q 1 - RTEMS_SUCCESSFUL" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+}
diff --git a/c/src/tests/sptests/sp09/screen09.c b/c/src/tests/sptests/sp09/screen09.c
new file mode 100644
index 0000000000..0810c7c0ab
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen09.c
@@ -0,0 +1,144 @@
+/* Screen9
+ *
+ * This routine generates error screen 9 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen9()
+{
+ void *converted;
+ rtems_status_code status;
+ rtems_isr_entry old_service_routine;
+
+ status = rtems_interrupt_catch(
+ Service_routine,
+ ISR_INTERRUPT_MAXIMUM_VECTOR_NUMBER + 10,
+ &old_service_routine
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_interrupt_catch with invalid vector"
+ );
+ puts( "TA1 - rtems_interrupt_catch - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_interrupt_catch( NULL, 3, &old_service_routine );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_interrupt_catch with invalid handler"
+ );
+ puts( "TA1 - rtems_interrupt_catch - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_signal_send( 100, RTEMS_SIGNAL_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_signal_send with illegal id"
+ );
+ puts( "TA1 - rtems_signal_send - RTEMS_INVALID_ID" );
+
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_16 );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_signal_send with no handler"
+ );
+ puts( "TA1 - rtems_signal_send - RTEMS_NOT_DEFINED" );
+
+ status = rtems_port_create(
+ 0,
+ Internal_port_area,
+ External_port_area,
+ sizeof( Internal_port_area ),
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_port_create with illegal name"
+ );
+ puts( "TA1 - rtems_port_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_port_create(
+ Port_name[ 1 ],
+ &((char *)Internal_port_area)[ 1 ],
+ External_port_area,
+ sizeof( Internal_port_area ),
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_port_create with illegal address"
+ );
+ puts( "TA1 - rtems_port_create - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_port_create(
+ Port_name[ 1 ],
+ Internal_port_area,
+ External_port_area,
+ sizeof( Internal_port_area ),
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_port_create of too many"
+ );
+ puts( "TA1 - rtems_port_create - RTEMS_TOO_MANY" );
+
+ status = rtems_port_delete( 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_port_delete with illegal id"
+ );
+ puts( "TA1 - rtems_port_delete - RTEMS_INVALID_ID" );
+
+ status = rtems_port_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_port_ident with illegal name"
+ );
+ puts( "TA1 - rtems_port_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_port_external_to_internal(
+ 100,
+ Internal_port_area,
+ &converted
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_port_external_to_internal with illegal id"
+ );
+ puts( "TA1 - rtems_port_external_to_internal - RTEMS_INVALID_ID" );
+ status = rtems_port_internal_to_external(
+ 100,
+ Internal_port_area,
+ &converted
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_port_internal_to_external with illegal id"
+ );
+ puts( "TA1 - rtems_port_internal_to_external - RTEMS_INVALID_ID" );
+}
diff --git a/c/src/tests/sptests/sp09/screen10.c b/c/src/tests/sptests/sp09/screen10.c
new file mode 100644
index 0000000000..5b8bc1f69a
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen10.c
@@ -0,0 +1,164 @@
+/* Screen10
+ *
+ * This routine generates error screen 10 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen10()
+{
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_rate_monotonic_create with illegal name"
+ );
+ puts( "TA1 - rtems_rate_monotonic_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_rate_monotonic_create( Period_name[ 1 ], &Period_id[ 1 ] );
+ directive_failed( status, "rtems_rate_monotonic_create successful" );
+ puts( "TA1 - rtems_rate_monotonic_create - RTEMS_SUCCESSFUL" );
+
+ status = rtems_rate_monotonic_create( Period_name[ 1 ], &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_rate_monotonic_create of too many"
+ );
+ puts( "TA1 - rtems_rate_monotonic_create - RTEMS_TOO_MANY" );
+
+ status = rtems_rate_monotonic_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_rate_monotonic_ident with illegal name"
+ );
+ puts( "TA1 - rtems_rate_monotonic_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_rate_monotonic_period( 100, 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_period with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_period - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_period( 0x10100, 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_period with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_period - local RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_rate_monotonic_period status not defined"
+ );
+ puts(
+ "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_NOT_DEFINED"
+ );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 100 );
+ directive_failed( status, "rtems_rate_monotonic_period successful" );
+ puts( "TA1 - rtems_rate_monotonic_period - 100 ticks - RTEMS_SUCCESSFUL" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS );
+ directive_failed( status, "rtems_rate_monotonic_period status" );
+ puts(
+ "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_SUCCESSFUL"
+ );
+
+ while ( FOREVER ) {
+
+ status = rtems_rate_monotonic_period(Period_id[ 1 ], RTEMS_PERIOD_STATUS);
+
+ if ( status == RTEMS_TIMEOUT ) break;
+
+ directive_failed(
+ status,
+ "rtems_rate_monotonic_period waiting for timeout"
+ );
+ }
+ puts(
+ "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_TIMEOUT"
+ );
+
+ status = rtems_rate_monotonic_cancel( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_cancel with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_cancel - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_cancel( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_cancel will illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_cancel - local RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_cancel( Period_id[ 1 ] );
+ directive_failed( status, "rtems_rate_monotonic_cancel" );
+ puts( "TA1 - rtems_rate_monotonic_cancel - RTEMS_SUCCESSFUL" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 );
+ directive_failed( status, "rtems_rate_monotonic_period restart" );
+
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_rate_monotonic_period"
+ );
+ puts( "TA1 - rtems_rate_monotonic_period - 5 ticks - RTEMS_TIMEOUT" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ puts( "TA1 - yielding to TA4" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+
+ status = rtems_rate_monotonic_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_delete with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_delete with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_delete( Period_id[ 1 ] );
+ directive_failed( status, "rtems_rate_monotonic_delete" );
+ puts( "TA1 - rtems_rate_monotonic_delete - RTEMS_SUCCESSFUL" );
+}
diff --git a/c/src/tests/sptests/sp09/screen11.c b/c/src/tests/sptests/sp09/screen11.c
new file mode 100644
index 0000000000..168c4c8788
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen11.c
@@ -0,0 +1,250 @@
+/* Screen11
+ *
+ * This routine generates error screen 11 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen11()
+{
+ void *buffer_address_1;
+ void *buffer_address_2;
+ void *buffer_address_3;
+ rtems_status_code status;
+
+ status = rtems_partition_create(
+ 0,
+ Partition_good_area,
+ 128,
+ 40,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_partition_create with illegal name"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 0,
+ 80,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with illegal length"
+ );
+ puts( "TA1 - rtems_partition_create - length - RTEMS_INVALID_SIZE" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with illegal buffer size"
+ );
+ puts( "TA1 - rtems_partition_create - buffer size - RTEMS_INVALID_SIZE" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 256,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with buffer_size > length"
+ );
+ puts(
+ "TA1 - rtems_partition_create - length < buffer size - RTEMS_INVALID_SIZE"
+ );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_partition_create of global"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_MP_NOT_CONFIGURED" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_bad_area,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_partition_create with bad address"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 34,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with unaligned buffer_size"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_INVALID_SIZE" );
+
+ status = rtems_partition_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_delete with illegal id"
+ );
+ puts( "TA1 - rtems_partition_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_partition_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_delete with illegal id"
+ );
+ puts( "TA1 - rtems_partition_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_partition_get_buffer( 100, &buffer_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_get_buffer with illegal id"
+ );
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_INVALID_ID" );
+
+ status = rtems_partition_ident( 0, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_partition_ident with illegal name"
+ );
+ puts( "TA1 - rtems_partition_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_partition_return_buffer( 100, buffer_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_return_buffer with illegal id"
+ );
+ puts( "TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ID" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 64,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create" );
+ puts( "TA1 - rtems_partition_create - RTEMS_SUCCESSFUL" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 32,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_partition_create of too many"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_TOO_MANY" );
+
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer_address_1 );
+ directive_failed( status, "rtems_partition_get_buffer");
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL" );
+
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer_address_2 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL" );
+
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer_address_3 );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_partition_get_buffer unsatisfied"
+ );
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_UNSATISFIED" );
+
+ status = rtems_partition_delete( Partition_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_RESOURCE_IN_USE,
+ "rtems_partition_delete with buffers in use"
+ );
+ puts( "TA1 - rtems_partition_delete - RTEMS_RESOURCE_IN_USE" );
+
+ status = rtems_partition_return_buffer(
+ Partition_id[ 1 ],
+ Region_good_area /* NOTE: Region Memory */
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_partition_return_buffer with buffer address out of partition"
+ );
+ puts(
+ "TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ADDRESS - out of range"
+ );
+
+ status = rtems_partition_return_buffer(
+ Partition_id[ 1 ],
+ &Partition_good_area[ 7 ]
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_partition_return_buffer with buffer address not on boundary"
+ );
+ puts_nocr( "TA1 - rtems_partition_return_buffer - " );
+ puts ( "RTEMS_INVALID_ADDRESS - not on boundary");
+}
diff --git a/c/src/tests/sptests/sp09/screen12.c b/c/src/tests/sptests/sp09/screen12.c
new file mode 100644
index 0000000000..2bebb3b6d9
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen12.c
@@ -0,0 +1,337 @@
+/* Screen12
+ *
+ * This routine generates error screen 12 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen12()
+{
+ void *segment_address_1;
+ void *segment_address_2;
+ void *segment_address_3;
+ rtems_unsigned32 offset;
+ rtems_unsigned32 good_front_flag;
+ rtems_unsigned32 good_back_flag;
+ rtems_status_code status;
+
+ status = rtems_region_create(
+ 0,
+ Region_good_area,
+ 0x40,
+ 32,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_region_create with illegal name"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Region_bad_area,
+ 0x40,
+ 32,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_create with illegal address"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Region_good_area,
+ 0x40,
+ 34,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_region_create with illegal size"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_INVALID_SIZE" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET ],
+ REGION_LENGTH,
+ 0x40,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 1 ]
+ );
+ directive_failed( status, "rtems_region_create" );
+ puts( "TA1 - rtems_region_create - RTEMS_SUCCESSFUL" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Region_good_area,
+ 512,
+ 0x40,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_region_create of too many"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_TOO_MANY" );
+
+ status = rtems_region_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_delete with illegal id"
+ );
+ puts( "TA1 - rtems_region_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_region_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_delete with illegal id"
+ );
+ puts( "TA1 - rtems_region_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_region_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_region_ident with illegal name"
+ );
+ puts( "TA1 - rtems_region_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_region_get_segment(
+ 100,
+ 0x40,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_get_segment with illegal id"
+ );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_INVALID_ID" );
+
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ sizeof( Region_good_area ) * 2,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_region_get_segment with illegal size"
+ );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_INVALID_SIZE" );
+
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 384,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_SUCCESSFUL" );
+
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ REGION_LENGTH / 2,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_region_get_segment unsatisfied"
+ );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_region_get_segment - timeout in 3 seconds" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 128,
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND,
+ &segment_address_3
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_region_get_segment timeout"
+ );
+ puts( "TA1 - rtems_region_get_segment - woke up with RTEMS_TIMEOUT" );
+
+ status = rtems_region_delete( Region_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_RESOURCE_IN_USE,
+ "rtems_region_delete with buffers in use"
+ );
+ puts( "TA1 - rtems_region_delete - RTEMS_RESOURCE_IN_USE" );
+
+ status = rtems_region_return_segment( 100, segment_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_return_segment with illegal id"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ID" );
+
+ status = rtems_region_return_segment( Region_id[ 1 ], Region_good_area );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_return_segment with illegal segment"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS" );
+
+/*
+ * The following generate internal heap errors. Thus this code
+ * is subject to change if the heap code changes.
+ */
+
+ puts( "TA1 - rtems_debug_disable - RTEMS_DEBUG_REGION" );
+ rtems_debug_disable( RTEMS_DEBUG_REGION );
+
+#if 0
+
+ offset = (segment_address_1 - (void *)Region_good_area) / 4;
+
+/* bad FRONT_FLAG error */
+
+ good_front_flag = Region_good_area[ offset - 1 ];
+ Region_good_area[ offset - 1 ] = good_front_flag + 2;
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_return_segment with back_flag != front_flag"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS" );
+
+ Region_good_area[ offset - 1 ] = good_front_flag;
+
+/* bad FRONT_FLAG error */
+
+ good_back_flag = Region_good_area[ offset - 2 ];
+ Region_good_area[ offset - 2 ] = 1024;
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_return_segment with back_flag != front_flag"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS" );
+
+ Region_good_area[ offset - 2 ] = good_back_flag;
+
+#else
+ offset = 0;
+ good_front_flag = 0;
+ good_back_flag = 0;
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS - SKIPPED" );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS - SKIPPED" );
+#endif
+
+ puts( "TA1 - rtems_debug_enable - RTEMS_DEBUG_REGION" );
+ rtems_debug_enable( RTEMS_DEBUG_REGION );
+
+ status = rtems_region_extend(
+ 100,
+ Region_good_area,
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_extend with illegal id"
+ );
+ puts( "TA1 - rtems_region_extend - RTEMS_INVALID_ID" );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET + 16 ],
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_extend with illegal starting address"
+ );
+ puts( "TA1 - rtems_region_extend - within heap - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ Region_bad_area,
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_IMPLEMENTED,
+ "rtems_region_extend with unsupported starting address"
+ );
+ puts(
+ "TA1 - rtems_region_extend - non-contiguous lower - RTEMS_NOT_IMPLEMENTED"
+ );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET - REGION_LENGTH ],
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_IMPLEMENTED,
+ "rtems_region_extend with unsupported starting address"
+ );
+ puts(
+ "TA1 - rtems_region_extend - contiguous lower - RTEMS_NOT_IMPLEMENTED"
+ );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET + REGION_LENGTH + 16 ],
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_IMPLEMENTED,
+ "rtems_region_extend with unsupported starting address"
+ );
+ puts(
+ "TA1 - rtems_region_extend - non-contiguous higher - RTEMS_NOT_IMPLEMENTED"
+ );
+
+}
diff --git a/c/src/tests/sptests/sp09/screen13.c b/c/src/tests/sptests/sp09/screen13.c
new file mode 100644
index 0000000000..779ef9e4f7
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen13.c
@@ -0,0 +1,114 @@
+/* Screen13
+ *
+ * This routine generates error screen 13 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen13()
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_io_close( 0xffff, 0x0000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_close with bad major number"
+ );
+ puts( "TA1 - rtems_io_close - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_control( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_close with bad major number"
+ );
+ puts( "TA1 - rtems_io_control - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_initialize( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_initialize with bad major number"
+ );
+ puts( "TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_open( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_open with bad major number"
+ );
+ puts( "TA1 - rtems_io_open - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_read( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_read with bad major number"
+ );
+ puts( "TA1 - rtems_io_read - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_write( 0xffff, 0x0ffff, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_write with bad major number"
+ );
+ puts( "TA1 - rtems_io_write - RTEMS_INVALID_NUMBER" );
+
+ build_time( &time, 12, 31, 2000, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 1999, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 2100, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 2099, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 1991, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+}
diff --git a/c/src/tests/sptests/sp09/screen14.c b/c/src/tests/sptests/sp09/screen14.c
new file mode 100644
index 0000000000..fe39bab676
--- /dev/null
+++ b/c/src/tests/sptests/sp09/screen14.c
@@ -0,0 +1,154 @@
+/* Screen14
+ *
+ * This routine generates error screen 14 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen14()
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ status = rtems_timer_create( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_timer_create with illegal name"
+ );
+ puts( "TA1 - rtems_timer_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+ puts( "TA1 - rtems_timer_create - 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_timer_create( 2, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_timer_create for too many"
+ );
+ puts( "TA1 - rtems_timer_create - 2 - RTEMS_TOO_MANY" );
+
+ status = rtems_timer_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_delete with illegal id"
+ );
+ puts( "TA1 - rtems_timer_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_timer_delete( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_delete with illegal id"
+ );
+ puts( "TA1 - rtems_timer_delete - global RTEMS_INVALID_ID" );
+
+ status = rtems_timer_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_timer_ident with illegal name"
+ );
+ puts( "TA1 - rtems_timer_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_timer_cancel( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_cancel with illegal id"
+ );
+ puts( "TA1 - rtems_timer_cancel - RTEMS_INVALID_ID" );
+
+ status = rtems_timer_reset( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_reset with illegal id"
+ );
+ puts( "TA1 - rtems_timer_reset - RTEMS_INVALID_ID" );
+
+ status = rtems_timer_reset( Timer_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_timer_reset before initiated"
+ );
+ puts( "TA1 - rtems_timer_reset - RTEMS_NOT_DEFINED" );
+
+ status = rtems_timer_fire_after(
+ 0x010100,
+ 5 * TICKS_PER_SECOND,
+ Delayed_routine,
+ NULL
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_fire_after illegal id"
+ );
+ puts( "TA1 - rtems_timer_fire_after - RTEMS_INVALID_ID" );
+
+ build_time( &time, 12, 31, 1994, 9, 0, 0, 0 );
+ status = rtems_timer_fire_when( 0x010100, &time, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_fire_when with illegal id"
+ );
+ puts( "TA1 - rtems_timer_fire_when - RTEMS_INVALID_ID" );
+
+ status = rtems_timer_fire_after( Timer_id[ 1 ], 0, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_timer_fire_after with 0 ticks"
+ );
+ puts( "TA1 - rtems_timer_fire_after - RTEMS_INVALID_NUMBER" );
+
+ build_time( &time, 2, 5, 1987, 8, 30, 45, 0 );
+ status = rtems_timer_fire_when( Timer_id[ 1 ], &time, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_timer_fire_when with illegal time"
+ );
+ print_time(
+ "TA1 - rtems_timer_fire_when - ",
+ &time,
+ " - RTEMS_INVALID_CLOCK\n"
+ );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, "\n" );
+
+ build_time( &time, 2, 5, 1990, 8, 30, 45, 0 );
+ status = rtems_timer_fire_when( Timer_id[ 1 ], &time, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_timer_fire_when before current time"
+ );
+ print_time(
+ "TA1 - rtems_timer_fire_when - ",
+ &time,
+ " - before RTEMS_INVALID_CLOCK\n"
+ );
+}
diff --git a/c/src/tests/sptests/sp09/sp09.doc b/c/src/tests/sptests/sp09/sp09.doc
new file mode 100644
index 0000000000..a7e296ca7d
--- /dev/null
+++ b/c/src/tests/sptests/sp09/sp09.doc
@@ -0,0 +1,36 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test9
+
+directives:
+ ex_init, ex_start, tm_tick, i_return,
+ t_create,t_delete, t_getreg, t_ident, t_restart, t_resume, t_setpri,
+ t_setreg, t_start, t_suspend, tm_delete, tm_get,
+ tm_set, tm_wkafter, tm_wkwhen, ev_receive, ev_send, sm_create, sm_delete,
+ sm_ident, sm_p, sm_v, q_broadcast, q_create, q_delete, q_ident, q_receive,
+ q_send, q_urgent, as_catch, as_send, as_return, rn_create, rn_delete,
+ rn_getseg, rn_ident, rn_retseg, pt_create, pt_delete, pt_getbug, pt_ident,
+ pt_retbuf, de_close, de_cntrl, de_init, de_open, de_read, de_write
+
+concepts:
+
+ a. Verifies all error codes returned by the executive in single
+ processor configurations.
+
+ b. Verifies error conditions in the following kernel routines or macros:
+ _Ck_date_time, _Expired, _Q_submit, _Get_mnodes, _Get_node,
+ _Free_mem, _Get_mem, _Valid_block, _Set_tcb, _Set_resource,
+ _In_range, _On_boundary
diff --git a/c/src/tests/sptests/sp09/sp09.scn b/c/src/tests/sptests/sp09/sp09.scn
new file mode 100644
index 0000000000..e1c59f6397
--- /dev/null
+++ b/c/src/tests/sptests/sp09/sp09.scn
@@ -0,0 +1,249 @@
+*** TEST 9 ***
+INIT - rtems_task_create - RTEMS_INVALID_SIZE -- NOT CHECKED
+INIT - rtems_task_create - RTEMS_INVALID_PRIORITY
+INIT - rtems_task_restart - RTEMS_INCORRECT_STATE
+TA1 - rtems_task_delete - RTEMS_INVALID_ID
+TA1 - rtems_task_get_note - RTEMS_INVALID_NUMBER
+TA1 - rtems_task_get_note - RTEMS_INVALID_ID
+TA1 - rtems_task_ident - current task RTEMS_SUCCESSFUL
+TA1 - rtems_task_ident - global RTEMS_INVALID_NAME
+TA1 - rtems_task_ident - local RTEMS_INVALID_NAME
+TA1 - rtems_task_ident - RTEMS_INVALID_NODE
+TA1 - rtems_task_restart - RTEMS_INVALID_ID
+TA1 - rtems_task_resume - RTEMS_INVALID_ID
+TA1 - rtems_task_resume - RTEMS_INCORRECT_STATE
+TA1 - rtems_task_set_priority - RTEMS_INVALID_PRIORITY
+TA1 - rtems_task_set_priority - RTEMS_INVALID_ID
+TA1 - rtems_task_set_note - RTEMS_INVALID_NUMBER
+TA1 - rtems_task_set_note - RTEMS_INVALID_ID
+TA1 - rtems_task_start - RTEMS_INVALID_ID
+TA1 - rtems_task_start - RTEMS_INCORRECT_STATE
+TA1 - rtems_task_suspend - RTEMS_INVALID_ID
+<pause - screen 2>
+TA1 - rtems_clock_get - RTEMS_NOT_DEFINED
+TA1 - rtems_task_wake_when - RTEMS_NOT_DEFINED
+TA1 - rtems_timer_fire_when - RTEMS_NOT_DEFINED
+TA1 - rtems_clock_set - 08:30:45 02/05/1987 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 15/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 02/32/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 25:30:45 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:61:45 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:61 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 02/05/1988 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_when - TICKINVALID - sleep about 3 seconds
+TA1 - rtems_task_wake_when - TICKINVALID - woke up RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_when - 08:30:48 02/05/1961 - RTEMS_INVALID_CLOCK
+TA1 - rtems_task_wake_when - 25:30:48 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - current time - 08:30:51 02/05/1988
+TA1 - rtems_task_wake_when - 08:30:51 01/05/1988 - RTEMS_INVALID_CLOCK
+<pause - screen 3>
+TA1 - rtems_task_create - RTEMS_INVALID_NAME
+TA1 - rtems_task_create - stack size - RTEMS_UNSATISFIED
+TA1 - rtems_task_create - TA2 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_suspend - suspend TA2 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_suspend - suspend TA2 - RTEMS_ALREADY_SUSPENDED
+TA1 - rtems_task_resume - TA2 resumed - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - TA3 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 4 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 5 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 6 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 7 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 8 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 9 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 10 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 11 - RTEMS_TOO_MANY
+TA1 - rtems_task_create - RTEMS_MP_NOT_CONFIGURED
+<pause - screen 4>
+TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( all conditions )
+TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( any condition )
+TA1 - rtems_event_receive - timeout in 3 seconds
+TA1 - rtems_event_receive - woke up with RTEMS_TIMEOUT
+TA1 - rtems_event_send - RTEMS_INVALID_ID
+TA1 - rtems_task_wake_after - sleep 1 second - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 08:30:45 02/05/1988 - RTEMS_SUCCESSFUL
+<pause - screen 5>
+TA1 - rtems_semaphore_create - RTEMS_INVALID_NAME
+TA1 - rtems_semaphore_create - 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_create - 2 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_create - 3 - RTEMS_TOO_MANY
+TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED
+TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED
+TA1 - rtems_semaphore_create - RTEMS_INVALID_NUMBER
+TA1 - rtems_semaphore_create - RTEMS_MP_NOT_CONFIGURED
+TA1 - rtems_semaphore_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_semaphore_delete - local RTEMS_INVALID_ID
+TA1 - rtems_semaphore_ident - global RTEMS_INVALID_NAME
+TA1 - rtems_semaphore_ident - local RTEMS_INVALID_NAME
+<pause - screen 6>
+TA1 - rtems_semaphore_obtain - RTEMS_INVALID_ID
+TA1 - rtems_semaphore_obtain - got sem 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_obtain - RTEMS_UNSATISFIED
+TA1 - rtems_semaphore_obtain - timeout in 3 seconds
+TA1 - rtems_semaphore_obtain - woke up with RTEMS_TIMEOUT
+TA1 - rtems_semaphore_release - RTEMS_NOT_OWNER_OF_RESOURCE
+TA1 - rtems_semaphore_release - RTEMS_INVALID_ID
+TA1 - rtems_task_start - start TA2 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA2 - rtems_semaphore_obtain - sem 1 - RTEMS_WAIT FOREVER
+TA1 - rtems_semaphore_delete - delete sem 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_obtain - binary semaphore
+TA1 - rtems_semaphore_delete - delete sem 2 - RTEMS_RESOURCE_IN_USE
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA2 - rtems_semaphore_obtain - woke up with RTEMS_OBJECT_WAS_DELETED
+TA2 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL
+<pause - screen 7>
+TA1 - rtems_message_queue_broadcast - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_create - Q 1 - RTEMS_INVALID_NAME
+TA1 - rtems_message_queue_create - Q 1 - RTEMS_MP_NOT_CONFIGURED
+TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 2 - RTEMS_TOO_MANY
+TA1 - rtems_message_queue_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_message_queue_delete - local RTEMS_INVALID_ID
+TA1 - rtems_message_queue_ident - RTEMS_INVALID_NAME
+TA1 - rtems_message_queue_flush - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_receive - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_receive - Q 1 - RTEMS_UNSATISFIED
+TA1 - rtems_message_queue_receive - Q 1 - timeout in 3 seconds
+TA1 - rtems_message_queue_receive - Q 1 - woke up with RTEMS_TIMEOUT
+TA1 - rtems_message_queue_send - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY
+<pause - screen 8>
+TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY
+TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 4 TO Q 1 - RTEMS_TOO_MANY
+TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_task_start - start TA3 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA3 - rtems_message_queue_receive - Q 1 - RTEMS_WAIT FOREVER
+TA1 - rtems_message_queue_delete - delete Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA3 - rtems_message_queue_receive - woke up with RTEMS_OBJECT_WAS_DELETED
+TA3 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL
+<pause - screen 9>
+TA1 - rtems_interrupt_catch - RTEMS_INVALID_NUMBER
+TA1 - rtems_interrupt_catch - RTEMS_INVALID_ADDRESS
+TA1 - rtems_signal_send - RTEMS_INVALID_ID
+TA1 - rtems_signal_send - RTEMS_NOT_DEFINED
+TA1 - rtems_port_create - RTEMS_INVALID_NAME
+TA1 - rtems_port_create - RTEMS_INVALID_ADDRESS
+TA1 - rtems_port_create - RTEMS_TOO_MANY
+TA1 - rtems_port_delete - RTEMS_INVALID_ID
+TA1 - rtems_port_ident - RTEMS_INVALID_NAME
+TA1 - rtems_port_external_to_internal - RTEMS_INVALID_ID
+TA1 - rtems_port_internal_to_external - RTEMS_INVALID_ID
+<pause - screen 10>
+TA1 - rtems_rate_monotonic_create - RTEMS_INVALID_NAME
+TA1 - rtems_rate_monotonic_create - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_create - RTEMS_TOO_MANY
+TA1 - rtems_rate_monotonic_ident - RTEMS_INVALID_NAME
+TA1 - rtems_rate_monotonic_period - unknown RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_period - local RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_NOT_DEFINED
+TA1 - rtems_rate_monotonic_period - 100 ticks - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_TIMEOUT
+TA1 - rtems_rate_monotonic_cancel - unknown RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_cancel - local RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_cancel - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_period - 5 ticks - RTEMS_TIMEOUT
+TA1 - yielding to TA4
+TA4 - rtems_rate_monotonic_cancel - RTEMS_NOT_OWNER_OF_RESOURCE
+TA4 - rtems_rate_monotonic_period - RTEMS_NOT_OWNER_OF_RESOURCE
+TA4 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_delete - local RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_delete - RTEMS_SUCCESSFUL
+<pause - screen 11>
+TA1 - rtems_partition_create - RTEMS_INVALID_NAME
+TA1 - rtems_partition_create - length - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_create - buffer size - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_create - length < buffer size - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_create - RTEMS_MP_NOT_CONFIGURED
+TA1 - rtems_partition_create - RTEMS_INVALID_ADDRESS
+TA1 - rtems_partition_create - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_partition_delete - local RTEMS_INVALID_ID
+TA1 - rtems_partition_get_buffer - RTEMS_INVALID_ID
+TA1 - rtems_partition_ident - RTEMS_INVALID_NAME
+TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ID
+TA1 - rtems_partition_create - RTEMS_SUCCESSFUL
+TA1 - rtems_partition_create - RTEMS_TOO_MANY
+TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL
+TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL
+TA1 - rtems_partition_get_buffer - RTEMS_UNSATISFIED
+TA1 - rtems_partition_delete - RTEMS_RESOURCE_IN_USE
+TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ADDRESS - out of range
+TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ADDRESS - not on boundary
+<pause - screen 12>
+TA1 - rtems_region_create - RTEMS_INVALID_NAME
+TA1 - rtems_region_create - RTEMS_INVALID_ADDRESS
+TA1 - rtems_region_create - RTEMS_INVALID_SIZE
+TA1 - rtems_region_create - RTEMS_SUCCESSFUL
+TA1 - rtems_region_create - RTEMS_TOO_MANY
+TA1 - rtems_region_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_region_delete - local RTEMS_INVALID_ID
+TA1 - rtems_region_ident - RTEMS_INVALID_NAME
+TA1 - rtems_region_get_segment - RTEMS_INVALID_ID
+TA1 - rtems_region_get_segment - RTEMS_INVALID_SIZE
+TA1 - rtems_region_get_segment - RTEMS_SUCCESSFUL
+TA1 - rtems_region_get_segment - RTEMS_UNSATISFIED
+TA1 - rtems_region_get_segment - timeout in 3 seconds
+TA1 - rtems_region_get_segment - woke up with RTEMS_TIMEOUT
+TA1 - rtems_region_delete - RTEMS_RESOURCE_IN_USE
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ID
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS
+TA1 - rtems_debug_disable - RTEMS_DEBUG_REGION
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS
+TA1 - rtems_debug_enable - RTEMS_DEBUG_REGION
+TA1 - rtems_region_extend - RTEMS_INVALID_ID
+TA1 - rtems_region_extend - within heap - RTEMS_INVALID_ADDRESS
+TA1 - rtems_region_extend - non-contiguous lower - RTEMS_NOT_IMPLEMENTED
+TA1 - rtems_region_extend - contiguous lower - RTEMS_NOT_IMPLEMENTED
+TA1 - rtems_region_extend - non-contiguous higher - RTEMS_NOT_IMPLEMENTED
+<pause - screen 13>
+TA1 - rtems_io_close - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_control - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_open - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_read - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_write - RTEMS_INVALID_NUMBER
+TA1 - rtems_clock_set - 23:59:59 12/31/2000 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2001 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/1999 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2000 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/2100 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2101 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/2099 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2100 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/1991 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/1992 - RTEMS_SUCCESSFUL
+<pause - screen 14>
+TA1 - rtems_timer_create - RTEMS_INVALID_NAME
+TA1 - rtems_timer_create - 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_timer_create - 2 - RTEMS_TOO_MANY
+TA1 - rtems_timer_delete - local RTEMS_INVALID_ID
+TA1 - rtems_timer_delete - global RTEMS_INVALID_ID
+TA1 - rtems_timer_ident - RTEMS_INVALID_NAME
+TA1 - rtems_timer_cancel - RTEMS_INVALID_ID
+TA1 - rtems_timer_reset - RTEMS_INVALID_ID
+TA1 - rtems_timer_reset - RTEMS_NOT_DEFINED
+TA1 - rtems_timer_fire_after - RTEMS_INVALID_ID
+TA1 - rtems_timer_fire_when - RTEMS_INVALID_ID
+TA1 - rtems_timer_fire_after - RTEMS_INVALID_NUMBER
+TA1 - rtems_timer_fire_when - 08:30:45 02/05/1987 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_get - 00:00:00 01/01/1992
+TA1 - rtems_timer_fire_when - 08:30:45 02/05/1990 - before RTEMS_INVALID_CLOCK
+*** END OF TEST 9 ***
diff --git a/c/src/tests/sptests/sp09/system.h b/c/src/tests/sptests/sp09/system.h
new file mode 100644
index 0000000000..7c482db2a7
--- /dev/null
+++ b/c/src/tests/sptests/sp09/system.h
@@ -0,0 +1,141 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Delayed_routine(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_isr Service_routine(
+ rtems_vector_number ignored
+);
+
+rtems_timer_service_routine Io_during_interrupt(
+ rtems_id ignored
+);
+
+void Screen1( void );
+
+void Screen2( void );
+
+void Screen3( void );
+
+void Screen4( void );
+
+void Screen5( void );
+
+void Screen6( void );
+
+void Screen7( void );
+
+void Screen8( void );
+
+void Screen9( void );
+
+void Screen10( void );
+
+void Screen11( void );
+
+void Screen12( void );
+
+void Screen13( void );
+
+void Screen14( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_MAXIMUM_SEMAPHORES 2
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#define CONFIGURE_MAXIMUM_REGIONS 1
+#define CONFIGURE_MAXIMUM_PERIODS 1
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 0
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 11 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 11 ]; /* array of task names */
+
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+
+TEST_EXTERN rtems_name Semaphore_name[ 4 ]; /* array of semaphore names */
+TEST_EXTERN rtems_id Semaphore_id[ 4 ]; /* array of semaphore ids */
+
+TEST_EXTERN rtems_name Queue_name[ 3 ]; /* array of queue names */
+TEST_EXTERN rtems_id Queue_id[ 3 ]; /* array of queue ids */
+
+TEST_EXTERN rtems_name Partition_name[ 2 ]; /* array of partition names */
+TEST_EXTERN rtems_id Partition_id[ 2 ]; /* array of partition ids */
+
+TEST_EXTERN rtems_name Region_name[ 2 ]; /* array of region names */
+TEST_EXTERN rtems_id Region_id[ 2 ]; /* array of region ids */
+
+TEST_EXTERN rtems_name Port_name[ 2 ]; /* array of port names */
+TEST_EXTERN rtems_id Port_id[ 2 ]; /* array of port ids */
+
+TEST_EXTERN rtems_name Period_name[ 2 ]; /* array of period names */
+TEST_EXTERN rtems_id Period_id[ 2 ]; /* array of period ids */
+
+TEST_EXTERN rtems_id Junk_id; /* id used to return errors */
+
+#define Internal_port_area (void *) 0x00001000
+#define External_port_area (void *) 0x00002000
+
+TEST_EXTERN rtems_unsigned8 Partition_good_area[256] CPU_STRUCTURE_ALIGNMENT;
+#define Partition_bad_area (void *) 0x00000006
+
+TEST_EXTERN rtems_unsigned32 Region_good_area[4096] CPU_STRUCTURE_ALIGNMENT;
+#define Region_bad_area (void *) 0x00000006
+#define REGION_START_OFFSET 1024
+#define REGION_LENGTH 512
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp09/task1.c b/c/src/tests/sptests/sp09/task1.c
new file mode 100644
index 0000000000..fb4f3f3941
--- /dev/null
+++ b/c/src/tests/sptests/sp09/task1.c
@@ -0,0 +1,70 @@
+/* Task_1
+ *
+ * This task generates all possible errors for the RTEMS executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ Screen1();
+ rtems_test_pause_and_screen_number( 2 );
+
+ Screen2();
+ rtems_test_pause_and_screen_number( 3 );
+
+ Screen3();
+ rtems_test_pause_and_screen_number( 4 );
+
+ Screen4();
+ rtems_test_pause_and_screen_number( 5 );
+
+ Screen5();
+ rtems_test_pause_and_screen_number( 6 );
+
+ Screen6();
+ rtems_test_pause_and_screen_number( 7 );
+
+ Screen7();
+ rtems_test_pause_and_screen_number( 8 );
+
+ Screen8();
+ rtems_test_pause_and_screen_number( 9 );
+
+ Screen9();
+ rtems_test_pause_and_screen_number( 10 );
+
+ Screen10();
+ rtems_test_pause_and_screen_number( 11 );
+
+ Screen11();
+ rtems_test_pause_and_screen_number( 12 );
+
+ Screen12();
+ rtems_test_pause_and_screen_number( 13 );
+
+ Screen13();
+ rtems_test_pause_and_screen_number( 14 );
+
+ Screen14();
+
+ puts( "*** END OF TEST 9 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp09/task2.c b/c/src/tests/sptests/sp09/task2.c
new file mode 100644
index 0000000000..096a423640
--- /dev/null
+++ b/c/src/tests/sptests/sp09/task2.c
@@ -0,0 +1,48 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Its only purpose is to generate the
+ * error where a semaphore is deleted while a task is waiting for it.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_semaphore_obtain - sem 1 - RTEMS_WAIT FOREVER" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_semaphore_obtain waiting to be deleted"
+ );
+ puts(
+ "TA2 - rtems_semaphore_obtain - woke up with RTEMS_OBJECT_WAS_DELETED"
+ );
+
+ puts( "TA2 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA2" );
+}
diff --git a/c/src/tests/sptests/sp09/task3.c b/c/src/tests/sptests/sp09/task3.c
new file mode 100644
index 0000000000..a96bfa5a68
--- /dev/null
+++ b/c/src/tests/sptests/sp09/task3.c
@@ -0,0 +1,53 @@
+/* Task_3
+ *
+ * This routine serves as a test task. Its only purpose in life is to
+ * generate the error where a message queue is deleted while a task
+ * is waiting there for a message.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+
+ puts( "TA3 - rtems_message_queue_receive - Q 1 - RTEMS_WAIT FOREVER" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_message_queue_receive waiting to be deleted"
+ );
+ puts(
+ "TA3 - rtems_message_queue_receive - woke up with RTEMS_OBJECT_WAS_DELETED"
+ );
+
+ puts( "TA3 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA3" );
+}
diff --git a/c/src/tests/sptests/sp09/task4.c b/c/src/tests/sptests/sp09/task4.c
new file mode 100644
index 0000000000..05f92f0dec
--- /dev/null
+++ b/c/src/tests/sptests/sp09/task4.c
@@ -0,0 +1,50 @@
+/* Task_4
+ *
+ * This routine serves as a test task. Its only purpose in life is to
+ * generate the error where a rate monotonic period is accessed by a
+ * task other than its creator.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_cancel( Period_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_OWNER_OF_RESOURCE,
+ "rtems_rate_monotonic_cancel not the owner"
+ );
+ puts( "TA4 - rtems_rate_monotonic_cancel - RTEMS_NOT_OWNER_OF_RESOURCE" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_OWNER_OF_RESOURCE,
+ "rtems_rate_monotonic_period not the owner"
+ );
+ puts( "TA4 - rtems_rate_monotonic_period - RTEMS_NOT_OWNER_OF_RESOURCE" );
+
+ puts( "TA4 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA4" );
+}
diff --git a/c/src/tests/sptests/sp11/Makefile.in b/c/src/tests/sptests/sp11/Makefile.in
new file mode 100644
index 0000000000..3e311c9a70
--- /dev/null
+++ b/c/src/tests/sptests/sp11/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp11
+
+MANAGERS=io event timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 timer
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp11/init.c b/c/src/tests/sptests/sp11/init.c
new file mode 100644
index 0000000000..f0792ce456
--- /dev/null
+++ b/c/src/tests/sptests/sp11/init.c
@@ -0,0 +1,92 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 11 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+ Timer_name[ 2 ] = rtems_build_name( 'T', 'M', '2', ' ' );
+ Timer_name[ 3 ] = rtems_build_name( 'T', 'M', '3', ' ' );
+ Timer_name[ 4 ] = rtems_build_name( 'T', 'M', '4', ' ' );
+ Timer_name[ 5 ] = rtems_build_name( 'T', 'M', '5', ' ' );
+ Timer_name[ 6 ] = rtems_build_name( 'T', 'M', '6', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create of TM1" );
+
+ status = rtems_timer_create( Timer_name[ 2 ], &Timer_id[ 2 ] );
+ directive_failed( status, "rtems_timer_create of TM2" );
+
+ status = rtems_timer_create( Timer_name[ 3 ], &Timer_id[ 3 ] );
+ directive_failed( status, "rtems_timer_create of TM3" );
+
+ status = rtems_timer_create( Timer_name[ 4 ], &Timer_id[ 4 ] );
+ directive_failed( status, "rtems_timer_create of TM4" );
+
+ status = rtems_timer_create( Timer_name[ 5 ], &Timer_id[ 5 ] );
+ directive_failed( status, "rtems_timer_create of TM5" );
+
+ status = rtems_timer_create( Timer_name[ 6 ], &Timer_id[ 6 ] );
+ directive_failed( status, "rtems_timer_create of TM6" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp11/sp11.doc b/c/src/tests/sptests/sp11/sp11.doc
new file mode 100644
index 0000000000..22f487a56b
--- /dev/null
+++ b/c/src/tests/sptests/sp11/sp11.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test11
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ ev_send, ev_receive
+ tm_wkafter, tm_set, tm_get
+
+concepts:
+
+ a. This test checks out the event manager along with the associated
+ event directives contained in the time manager.
diff --git a/c/src/tests/sptests/sp11/sp11.scn b/c/src/tests/sptests/sp11/sp11.scn
new file mode 100644
index 0000000000..db0469eb60
--- /dev/null
+++ b/c/src/tests/sptests/sp11/sp11.scn
@@ -0,0 +1,74 @@
+*** TEST 11 ***
+TA1 - rtems_event_send - send RTEMS_EVENT_16 to TA2
+TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_14 and RTEMS_EVENT_15
+TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_16
+TA2 - RTEMS_EVENT_16 received - eventout => 00010000
+TA2 - rtems_event_send - send RTEMS_EVENT_14 and RTEMS_EVENT_15 to TA1
+TA2 - rtems_event_receive - RTEMS_EVENT_17 or RTEMS_EVENT_18 - forever and ANY
+TA1 - RTEMS_EVENT_14 and RTEMS_EVENT_15 received - eventout => 0000c000
+TA1 - rtems_event_send - send RTEMS_EVENT_18 to TA2
+TA1 - rtems_event_receive - waiting with 10 second timeout on RTEMS_EVENT_14
+TA2 - RTEMS_EVENT_17 or RTEMS_EVENT_18 received - eventout => 00040000
+TA2 - rtems_event_send - send RTEMS_EVENT_14 to TA1
+TA2 - rtems_clock_set - 08:15:00 02/12/1988
+TA2 - rtems_event_send - sending RTEMS_EVENT_10 to self after 4 seconds
+TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_10
+TA1 - RTEMS_EVENT_14 received - eventout => 00004000
+TA1 - rtems_event_send - send RTEMS_EVENT_19 to TA2
+TA1 - rtems_clock_get - 08:15:00 02/12/1988
+<pause>
+TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds
+TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_18
+TA2 - RTEMS_EVENT_10 received - eventout => 00000400
+TA2 - rtems_clock_get - 08:15:05 02/12/1988
+TA2 - rtems_event_receive - RTEMS_PENDING_EVENTS
+TA2 - eventout => 00080000
+TA2 - rtems_event_receive - RTEMS_EVENT_19 - RTEMS_NO_WAIT
+TA2 - RTEMS_EVENT_19 received - eventout => 00080000
+TA2 - rtems_task_delete - deletes self
+TA1 - RTEMS_EVENT_18 received - eventout => 00040000
+TA1 - rtems_clock_get - 08:15:05 02/12/1988
+TA1 - rtems_event_send - send RTEMS_EVENT_3 to self
+TA1 - rtems_event_receive - RTEMS_EVENT_3 or RTEMS_EVENT_22 - NO_WAIT and ANY
+TA1 - RTEMS_EVENT_3 received - eventout => 00000008
+TA1 - rtems_event_send - send RTEMS_EVENT_4 to self
+TA1 - rtems_event_receive - RTEMS_EVENT_4 or RTEMS_EVENT_5 - forever and ANY
+TA1 - RTEMS_EVENT_4 received - eventout => 00000010
+<pause>
+TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds
+TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_18
+TA1 - rtems_event_send - send RTEMS_EVENT_8 to self after 60 seconds
+TA1 - rtems_event_send - send RTEMS_EVENT_9 to self after 60 seconds
+TA1 - rtems_event_send - send RTEMS_EVENT_10 to self after 60 seconds
+TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_8
+TA1 - rtems_clock_set - 08:15:00 02/12/1988
+TA1 - rtems_event_send - send RTEMS_EVENT_1 every second
+TA1 - RTEMS_EVENT_1 received - eventout => 00000002 - at 08:15:01 02/12/1988
+TA1 - RTEMS_EVENT_1 received - eventout => 00000002 - at 08:15:02 02/12/1988
+TA1 - RTEMS_EVENT_1 received - eventout => 00000002 - at 08:15:03 02/12/1988
+TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_1
+<pause>
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 1 day
+TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_event_send - resending RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_clock_set - 08:15:03 02/15/1988
+TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_11
+TA1 - RTEMS_EVENT_11 received - eventout => 00000800
+<pause>
+TA1 - rtems_event_send/rtems_event_receive combination
+TA1 - rtems_clock_set - 08:15:00 02/12/1988
+TA1 - rtems_event_receive all outstanding events
+TA1 - rtems_event_send - sending RTEMS_EVENT_10 to self in 1 day
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_clock_set - 07:15:00 02/12/1988
+TA1 - set time backwards
+TA1 - no events received
+TA1 - rtems_clock_set - 07:15:00 02/14/1988
+TA1 - set time forwards (leave a timer)
+TA1 - RTEMS_EVENT_10 received
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 100 ticks
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 200 ticks
+*** END OF TEST 11 ***
diff --git a/c/src/tests/sptests/sp11/system.h b/c/src/tests/sptests/sp11/system.h
new file mode 100644
index 0000000000..b749025be5
--- /dev/null
+++ b/c/src/tests/sptests/sp11/system.h
@@ -0,0 +1,90 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine TA1_send_18_to_self_5_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_8_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_9_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_1_to_self_every_second(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_11_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA2_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 6
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 7 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 7 ]; /* array of timer names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp11/task1.c b/c/src/tests/sptests/sp11/task1.c
new file mode 100644
index 0000000000..a7691dd2b0
--- /dev/null
+++ b/c/src/tests/sptests/sp11/task1.c
@@ -0,0 +1,410 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the event maager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set eventout;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_16 to TA2" );
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA1 - rtems_event_receive - waiting forever on "
+ "RTEMS_EVENT_14 and RTEMS_EVENT_15"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_14 | RTEMS_EVENT_15,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf(
+ "TA1 - RTEMS_EVENT_14 and RTEMS_EVENT_15 received - eventout => %08x\n",
+ eventout
+ );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_18 to TA2" );
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_18 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA1 - rtems_event_receive - waiting with 10 second timeout on RTEMS_EVENT_14"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_14,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA1 - RTEMS_EVENT_14 received - eventout => %08x\n", eventout );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_19 to TA2" );
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_19 );
+ directive_failed( status, "rtems_event_send" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+ print_time( "TA1 - rtems_clock_get - ", &time, "\n" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ TA1_send_18_to_self_5_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 5 seconds" );
+
+ puts( "TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_18" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_18,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive of 18" );
+ printf( "TA1 - RTEMS_EVENT_18 received - eventout => %08x\n", eventout );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "TA1 rtems_clock_get" );
+ print_time( "TA1 - rtems_clock_get - ", &time, "\n" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_3 to self" );
+ status = rtems_event_send( RTEMS_SELF, RTEMS_EVENT_3 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA1 - rtems_event_receive - RTEMS_EVENT_3 or "
+ "RTEMS_EVENT_22 - NO_WAIT and ANY"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_3 | RTEMS_EVENT_22,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive of 3 and 22" );
+ printf( "TA1 - RTEMS_EVENT_3 received - eventout => %08x\n", eventout );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_4 to self" );
+ status = rtems_event_send( RTEMS_SELF, RTEMS_EVENT_4 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts (
+ "TA1 - rtems_event_receive - RTEMS_EVENT_4 or "
+ "RTEMS_EVENT_5 - forever and ANY"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_4 | RTEMS_EVENT_5,
+ RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA1 - RTEMS_EVENT_4 received - eventout => %08x\n", eventout );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ TA1_send_18_to_self_5_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 5 seconds" );
+
+ puts( "TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_18");
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_8 to self after 60 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 60 * TICKS_PER_SECOND,
+ TA1_send_8_to_self_60_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 60 seconds" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_9 to self after 60 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 2 ],
+ 60 * TICKS_PER_SECOND,
+ TA1_send_9_to_self_60_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 60 seconds" );
+
+ puts(
+ "TA1 - rtems_event_send - send RTEMS_EVENT_10 to self after 60 seconds"
+ );
+ status = rtems_timer_fire_after(
+ Timer_id[ 3 ],
+ 60 * TICKS_PER_SECOND,
+ TA1_send_10_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 60 seconds" );
+
+ puts( "TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_8" );
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ build_time( &time, 2, 12, 1988, 8, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_1 every second" );
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ TICKS_PER_SECOND,
+ TA1_send_1_to_self_every_second,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 1 second" );
+
+ for ( index = 0; index < 3; index++ ) {
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_1,
+ RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ printf( "TA1 - RTEMS_EVENT_1 received - eventout => %08x - ", eventout );
+ print_time( "at ", &time, "\n" );
+
+ if ( index < 2 ) {
+ status = rtems_timer_reset( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_reset" );
+ };
+
+ }
+
+ puts( "TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_1" );
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+rtems_test_pause();
+
+ time.day = 13;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 1 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 1 day" );
+
+ time.hour = 7;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 2 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 1 day" );
+
+ time.hour = 8; /* so code below has correct time/date */
+ time.day = 14;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 3 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 2 days" );
+
+ puts("TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 1 day");
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ puts(
+ "TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 2 days"
+ );
+ status = rtems_timer_cancel( Timer_id[ 3 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ puts(
+ "TA1 - rtems_event_send - resending RTEMS_EVENT_11 to self in 2 days"
+ );
+ status = rtems_timer_fire_when(
+ Timer_id[ 3 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 2 days" );
+
+ time.day = 15;
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "TA1 rtems_clock_set" );
+
+ puts( "TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_11" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_11,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA1 - RTEMS_EVENT_11 received - eventout => %08x\n", eventout );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_event_send/rtems_event_receive combination" );
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 10,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 10 ticks" );
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_11,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+
+ build_time( &time, 2, 12, 1988, 8, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ time.day = 13;
+ puts( "TA1 - rtems_event_receive all outstanding events" );
+ status = rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ 0,
+ &eventout
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive all events"
+ );
+
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_10 to self in 1 day" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 1 ],
+ &time,
+ TA1_send_10_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 1 day" );
+
+ time.day = 14;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 2 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 2 days" );
+
+ build_time( &time, 2, 12, 1988, 7, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ puts( "TA1 - set time backwards" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ status = rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ if ( eventout ) printf( "ERROR -0x%08x events received\n", eventout );
+ else puts( "TA1 - no events received" );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive all events"
+ );
+
+ build_time( &time, 2, 14, 1988, 7, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ puts( "TA1 - set time forwards (leave a timer)" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ status = rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ if ( eventout == RTEMS_EVENT_10 ) puts( "TA1 - RTEMS_EVENT_10 received" );
+ else printf( "ERROR -0x%08x events received\n", eventout );
+ directive_failed( status, "rtems_event_receive all events" );
+
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 100 ticks");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 100,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 100 ticks" );
+
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 200 ticks");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 200,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 200 ticks" );
+
+ puts( "*** END OF TEST 11 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp11/task2.c b/c/src/tests/sptests/sp11/task2.c
new file mode 100644
index 0000000000..9a233dd52c
--- /dev/null
+++ b/c/src/tests/sptests/sp11/task2.c
@@ -0,0 +1,126 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Multiple tasks are required to
+ * verify all capabilities of the event manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set eventout;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_16" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA2 - RTEMS_EVENT_16 received - eventout => %08x\n", eventout );
+
+ puts(
+ "TA2 - rtems_event_send - send RTEMS_EVENT_14 and RTEMS_EVENT_15 to TA1"
+ );
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_14 | RTEMS_EVENT_15 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA2 - rtems_event_receive - RTEMS_EVENT_17 or "
+ "RTEMS_EVENT_18 - forever and ANY"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_17 | RTEMS_EVENT_18,
+ RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf(
+ "TA2 - RTEMS_EVENT_17 or RTEMS_EVENT_18 received - eventout => %08x\n",
+ eventout
+ );
+
+ puts( "TA2 - rtems_event_send - send RTEMS_EVENT_14 to TA1" );
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_14 );
+ directive_failed( status, "rtems_event_send" );
+
+ build_time( &time, 2, 12, 1988, 8, 15, 0, 0 );
+ print_time( "TA2 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "TA2 rtems_clock_set" );
+
+ time.second += 4;
+ puts(
+ "TA2 - rtems_event_send - sending RTEMS_EVENT_10 to self after 4 seconds"
+ );
+ status = rtems_timer_fire_when(
+ Timer_id[ 5 ],
+ &time,
+ TA2_send_10_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when after 4 seconds" );
+
+ puts( "TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_10" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_10,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ printf( "TA2 - RTEMS_EVENT_10 received - eventout => %08x\n", eventout );
+ print_time( "TA2 - rtems_clock_get - ", &time, "\n" );
+
+ puts( "TA2 - rtems_event_receive - RTEMS_PENDING_EVENTS" );
+ status = rtems_event_receive(
+ RTEMS_PENDING_EVENTS,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA2 - eventout => %08x\n", eventout );
+
+ puts( "TA2 - rtems_event_receive - RTEMS_EVENT_19 - RTEMS_NO_WAIT" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_19,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA2 - RTEMS_EVENT_19 received - eventout => %08x\n", eventout );
+
+ puts( "TA2 - rtems_task_delete - deletes self" );
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of TA2" );
+}
diff --git a/c/src/tests/sptests/sp11/timer.c b/c/src/tests/sptests/sp11/timer.c
new file mode 100644
index 0000000000..4a7fb7044c
--- /dev/null
+++ b/c/src/tests/sptests/sp11/timer.c
@@ -0,0 +1,97 @@
+/* Timer_functions
+ *
+ * These routines are the timer service routines used by this test.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine TA1_send_18_to_self_5_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_18 );
+ directive_failed( status, "rtems_event_send of 18" );
+}
+
+rtems_timer_service_routine TA1_send_8_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_8 );
+ directive_failed( status, "rtems_event_send of 8" );
+}
+
+rtems_timer_service_routine TA1_send_9_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_9 );
+ directive_failed( status, "rtems_event_send of 9" );
+}
+
+rtems_timer_service_routine TA1_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_10 );
+ directive_failed( status, "rtems_event_send of 10" );
+}
+
+rtems_timer_service_routine TA1_send_1_to_self_every_second(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_1 );
+ directive_failed( status, "rtems_event_send of 1" );
+}
+
+rtems_timer_service_routine TA1_send_11_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_11 );
+ directive_failed( status, "rtems_event_send of 11" );
+}
+
+rtems_timer_service_routine TA2_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_10 );
+ directive_failed( status, "rtems_event_send of 10" );
+}
diff --git a/c/src/tests/sptests/sp12/Makefile.in b/c/src/tests/sptests/sp12/Makefile.in
new file mode 100644
index 0000000000..38aa0948e3
--- /dev/null
+++ b/c/src/tests/sptests/sp12/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp12
+
+MANAGERS=io semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3 task4 task5 pridrv pritask
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp12/init.c b/c/src/tests/sptests/sp12/init.c
new file mode 100644
index 0000000000..862033ce1e
--- /dev/null
+++ b/c/src/tests/sptests/sp12/init.c
@@ -0,0 +1,179 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 12 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ Priority_task_name[ 1 ] = rtems_build_name( 'P', 'R', 'I', '1' );
+ Priority_task_name[ 2 ] = rtems_build_name( 'P', 'R', 'I', '2' );
+ Priority_task_name[ 3 ] = rtems_build_name( 'P', 'R', 'I', '3' );
+ Priority_task_name[ 4 ] = rtems_build_name( 'P', 'R', 'I', '4' );
+ Priority_task_name[ 5 ] = rtems_build_name( 'P', 'R', 'I', '5' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'M', '1', ' ' );
+ Semaphore_name[ 2 ] = rtems_build_name( 'S', 'M', '2', ' ' );
+ Semaphore_name[ 3 ] = rtems_build_name( 'S', 'M', '3', ' ' );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 0,
+ RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of SM2" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 3 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 3 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of SM3" );
+
+ puts( "INIT - Forward priority queue test" );
+ Priority_test_driver( 0 );
+
+ puts( "INIT - Backward priority queue test" );
+ Priority_test_driver( 32 );
+
+rtems_test_pause();
+
+ puts( "INIT - Binary Semaphore and Priority Inheritance Test" );
+
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM2" );
+
+ puts( "INIT - rtems_semaphore_create - allocated binary semaphore" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 0,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of priority inherit SM2" );
+
+ puts( "INIT - rtems_semaphore_release - allocated binary semaphore" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release of SM2" );
+
+ puts( "INIT - rtems_semaphore_delete - allocated binary semaphore" );
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM2" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of priority inherit SM2" );
+
+ Priority_test_driver( 64 );
+
+rtems_test_pause();
+
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM2" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 0,
+ RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of priority SM2" );
+
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release of SM2" );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp12/pridrv.c b/c/src/tests/sptests/sp12/pridrv.c
new file mode 100644
index 0000000000..8ddf90749a
--- /dev/null
+++ b/c/src/tests/sptests/sp12/pridrv.c
@@ -0,0 +1,131 @@
+/* Priority_test_driver
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * priority_base - priority_base switch
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Priority_test_driver(
+ rtems_unsigned32 priority_base
+)
+{
+ rtems_task_priority previous_priority;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ switch ( index ) {
+ case 1:
+ case 2:
+ case 3:
+ Task_priority[ index ] = priority_base + index;
+ break;
+ default:
+ Task_priority[ index ] = priority_base + 3;
+ break;
+ }
+
+ status = rtems_task_create(
+ Priority_task_name[ index ],
+ Task_priority[ index ],
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Priority_task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ }
+
+ if ( priority_base == 0 ) {
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_start(
+ Priority_task_id[ index ],
+ Priority_task,
+ index
+ );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+ } else {
+ for ( index = 5 ; index >= 1 ; index-- ) {
+ status = rtems_task_start(
+ Priority_task_id[ index ],
+ Priority_task,
+ index
+ );
+ directive_failed( status, "rtems_task_start loop" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after loop" );
+
+ if ( priority_base == 64 ) {
+ if ( index == 4 ) {
+ status = rtems_task_set_priority(
+ Priority_task_id[ 5 ],
+ priority_base + 4,
+ &previous_priority
+ );
+ printf( "PDRV - change priority of PRI5 from %d to %d\n",
+ previous_priority,
+ priority_base + 4
+ );
+ directive_failed( status, "PDRV rtems_task_set_priority" );
+ }
+ status = rtems_task_set_priority(
+ Priority_task_id[ 5 ],
+ RTEMS_CURRENT_PRIORITY,
+ &previous_priority
+ );
+ directive_failed( status, "PDRV rtems_task_set_priority CURRENT" );
+ printf( "PDRV - priority of PRI5 is %d\n", previous_priority );
+ }
+ }
+ }
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after after loop" );
+
+ if ( priority_base == 0 ) {
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release loop" );
+ }
+ }
+
+ if ( priority_base == 64 ) {
+ puts( "PDRV - rtems_task_resume - PRI5" );
+ status = rtems_task_resume( Priority_task_id[ 5 ] );
+ directive_failed( status, "rtems_task_resume" );
+
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after so PRI5 can run" );
+
+ status = rtems_task_delete( Priority_task_id[ 5 ] );
+ directive_failed( status, "rtems_task_delete of PRI5" );
+ }
+ else {
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_delete( Priority_task_id[ index ] );
+ directive_failed( status, "rtems_task_delete loop" );
+ }
+ }
+}
diff --git a/c/src/tests/sptests/sp12/pritask.c b/c/src/tests/sptests/sp12/pritask.c
new file mode 100644
index 0000000000..24a1ceb4d6
--- /dev/null
+++ b/c/src/tests/sptests/sp12/pritask.c
@@ -0,0 +1,91 @@
+/* Priority_task
+ *
+ * This routine serves as a test task. It verifies the semaphore manager.
+ *
+ * Input parameters:
+ * its_index - priority index
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Priority_task(
+ rtems_task_argument its_index
+)
+{
+ rtems_interval timeout;
+ rtems_task_priority its_priority;
+ rtems_task_priority current_priority;
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ its_priority = Task_priority[ its_index ];
+
+ if ( its_priority < 3 )
+ timeout = 5 * TICKS_PER_SECOND;
+ else
+ timeout = RTEMS_NO_TIMEOUT;
+
+ put_name( Priority_task_name[ its_index ], FALSE );
+ puts( " - rtems_semaphore_obtain - wait forever on SM2" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ timeout
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM2" );
+
+ if ( its_priority < 64 ) {
+ printf( "PRI%d - WHY AM I HERE? (pri=%d)", its_index, its_priority );
+ exit( 0 );
+ }
+
+ if ( its_index == 5 )
+ puts( "PRI5 - rtems_task_suspend - until all priority tasks blocked" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ puts( "PRI5 - rtems_task_delete - all tasks waiting on SM2" );
+ for ( index = 1 ; index < 5 ; index++ ) {
+ status = rtems_task_delete( Priority_task_id[ index ] );
+ directive_failed( status, "rtems_task_delete loop" );
+ }
+
+ puts( "PRI5 - rtems_semaphore_obtain - nested" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ timeout
+ );
+ directive_failed( status, "rtems_semaphore_obtain nested" );
+
+ puts( "PRI5 - rtems_semaphore_release - nested" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release nested " );
+
+ puts( "PRI5 - rtems_semaphore_release - restore priority" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ RTEMS_CURRENT_PRIORITY,
+ &current_priority
+ );
+ directive_failed( status, "PRI5 rtems_task_set_priority CURRENT" );
+ printf( "PRI5 - priority of PRI5 is %d\n", current_priority );
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
diff --git a/c/src/tests/sptests/sp12/sp12.doc b/c/src/tests/sptests/sp12/sp12.doc
new file mode 100644
index 0000000000..c68b14bf58
--- /dev/null
+++ b/c/src/tests/sptests/sp12/sp12.doc
@@ -0,0 +1,27 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test12
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ sm_create, sm_ident, sm_delete, sm_p, sm_v, tm_wkafter, t_setpri
+
+concepts:
+
+ a. This test checks out the semaphore manager.
+
+ b. This test forces _Flush_taskq() to unblock a task waiting
+ on a deleted object.
diff --git a/c/src/tests/sptests/sp12/sp12.scn b/c/src/tests/sptests/sp12/sp12.scn
new file mode 100644
index 0000000000..e87a729259
--- /dev/null
+++ b/c/src/tests/sptests/sp12/sp12.scn
@@ -0,0 +1,78 @@
+*** TEST 12 ***
+INIT - Forward priority queue test
+PRI1 - rtems_semaphore_obtain - wait forever on SM2
+PRI2 - rtems_semaphore_obtain - wait forever on SM2
+PRI3 - rtems_semaphore_obtain - wait forever on SM2
+PRI4 - rtems_semaphore_obtain - wait forever on SM2
+PRI5 - rtems_semaphore_obtain - wait forever on SM2
+INIT - Backward priority queue test
+PRI5 - rtems_semaphore_obtain - wait forever on SM2
+PRI4 - rtems_semaphore_obtain - wait forever on SM2
+PRI3 - rtems_semaphore_obtain - wait forever on SM2
+PRI2 - rtems_semaphore_obtain - wait forever on SM2
+PRI1 - rtems_semaphore_obtain - wait forever on SM2
+<pause>
+INIT - Binary Semaphore and Priority Inheritance Test
+INIT - rtems_semaphore_create - allocated binary semaphore
+INIT - rtems_semaphore_release - allocated binary semaphore
+INIT - rtems_semaphore_delete - allocated binary semaphore
+PRI5 - rtems_semaphore_obtain - wait forever on SM2
+PRI5 - rtems_task_suspend - until all priority tasks blocked
+PDRV - priority of PRI5 is 67
+PRI4 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - change priority of PRI5 from 67 to 68
+PDRV - priority of PRI5 is 67
+PRI3 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - priority of PRI5 is 67
+PRI2 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - priority of PRI5 is 66
+PRI1 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - priority of PRI5 is 65
+PDRV - rtems_task_resume - PRI5
+PRI5 - rtems_task_delete - all tasks waiting on SM2
+PRI5 - rtems_semaphore_obtain - nested
+PRI5 - rtems_semaphore_release - nested
+PRI5 - rtems_semaphore_release - restore priority
+PRI5 - priority of PRI5 is 68
+<pause>
+TA1 - rtems_semaphore_ident - smid => 14010002
+TA1 - rtems_semaphore_obtain - wait forever on SM2
+TA1 - got SM2
+TA1 - rtems_semaphore_obtain - wait forever on SM3
+TA1 - got SM3
+TA1 - rtems_semaphore_obtain - get SM1 - RTEMS_NO_WAIT
+TA1 - got SM1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_semaphore_obtain - wait forever on SM1
+TA3 - rtems_semaphore_obtain - wait forever on SM2
+<pause>
+TA1 - rtems_semaphore_release - release SM1
+TA1 - rtems_semaphore_obtain - waiting for SM1 with 10 second timeout
+TA2 - got SM1
+TA2 - rtems_semaphore_release - release SM1
+TA2 - rtems_task_set_priority - make self highest priority task
+TA2 - rtems_semaphore_obtain - wait forever on SM2
+TA1 - got SM1
+TA1 - rtems_semaphore_release - release SM2
+TA2 - got SM2
+TA2 - rtems_semaphore_release - release SM2
+TA2 - rtems_task_delete - delete self
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - got SM2
+TA3 - rtems_semaphore_release - release SM2
+TA3 - rtems_semaphore_obtain - wait forever on SM3
+<pause>
+TA1 - rtems_task_delete - delete TA3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA4 - rtems_semaphore_obtain - wait forever on SM1
+TA5 - rtems_semaphore_obtain - wait forever on SM1
+TA1 - rtems_task_delete - delete TA4
+TA1 - rtems_semaphore_release - release SM1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA5 - got SM1
+TA5 - rtems_semaphore_obtain - wait forever on SM1
+TA1 - rtems_semaphore_delete - delete SM1
+TA1 - rtems_semaphore_delete - delete SM3
+TA1 - rtems_task_delete - delete self
+TA5 - SM1 deleted by TA1
+*** END OF TEST 12 ***
diff --git a/c/src/tests/sptests/sp12/system.h b/c/src/tests/sptests/sp12/system.h
new file mode 100644
index 0000000000..e06f3b1df8
--- /dev/null
+++ b/c/src/tests/sptests/sp12/system.h
@@ -0,0 +1,82 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+void Priority_test_driver(
+ rtems_unsigned32 priority_base
+);
+
+rtems_task Priority_task(
+ rtems_task_argument its_index
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_task Task5(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INIT_TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE * 2)
+#define CONFIGURE_MAXIMUM_SEMAPHORES 10
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Priority_task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Priority_task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN rtems_task_priority Task_priority[ 6 ];
+
+TEST_EXTERN rtems_id Semaphore_id[ 4 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 4 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp12/task1.c b/c/src/tests/sptests/sp12/task1.c
new file mode 100644
index 0000000000..75ca767d45
--- /dev/null
+++ b/c/src/tests/sptests/sp12/task1.c
@@ -0,0 +1,153 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the semaphore manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id smid;
+ rtems_status_code status;
+
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &smid
+ );
+ printf( "TA1 - rtems_semaphore_ident - smid => %08x\n", smid );
+ directive_failed( status, "rtems_semaphore_ident of SM1" );
+
+ puts( "TA1 - rtems_semaphore_obtain - wait forever on SM2" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM2" );
+ puts( "TA1 - got SM2" );
+
+ puts( "TA1 - rtems_semaphore_obtain - wait forever on SM3" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 3 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM3" );
+ puts( "TA1 - got SM3" );
+
+ puts( "TA1 - rtems_semaphore_obtain - get SM1 - RTEMS_NO_WAIT" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM1" );
+ puts( "TA1 - got SM1" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_semaphore_release - release SM1" );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release of SM1" );
+
+ puts(
+ "TA1 - rtems_semaphore_obtain - waiting for SM1 with 10 second timeout"
+ );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM1" );
+ puts( "TA1 - got SM1" );
+
+ puts( "TA1 - rtems_semaphore_release - release SM2" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release of SM2" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_task_delete - delete TA3" );
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], Task5, 0 );
+ directive_failed( status, "rtems_task_start of TA5" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_delete - delete TA4" );
+ status = rtems_task_delete( Task_id[ 4 ] );
+ directive_failed( status, "rtems_task_delete of TA4" );
+
+ puts( "TA1 - rtems_semaphore_release - release SM1" );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release on SM1" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_semaphore_delete - delete SM1" );
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM1" );
+
+ puts( "TA1 - rtems_semaphore_delete - delete SM3" );
+ status = rtems_semaphore_delete( Semaphore_id[ 3 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM3" );
+
+ puts( "TA1 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA1" );
+}
diff --git a/c/src/tests/sptests/sp12/task2.c b/c/src/tests/sptests/sp12/task2.c
new file mode 100644
index 0000000000..0e2b2a4dfc
--- /dev/null
+++ b/c/src/tests/sptests/sp12/task2.c
@@ -0,0 +1,65 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It simply obtains semaphores
+ * 1 and 2, the later when it is a high priority task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+
+ puts( "TA2 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "TA2 - got SM1" );
+ directive_failed( status, "rtems_semaphore_obtain on SM1" );
+
+ puts( "TA2 - rtems_semaphore_release - release SM1" );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release on SM1" );
+
+ puts( "TA2 - rtems_task_set_priority - make self highest priority task" );
+ status = rtems_task_set_priority( RTEMS_SELF, 3, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority on TA2" );
+
+ puts( "TA2 - rtems_semaphore_obtain - wait forever on SM2" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "TA2 - got SM2" );
+ directive_failed( status, "rtems_semaphore_obtain on SM2" );
+
+ puts( "TA2 - rtems_semaphore_release - release SM2" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release on SM2" );
+
+ puts( "TA2 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA2" );
+}
diff --git a/c/src/tests/sptests/sp12/task3.c b/c/src/tests/sptests/sp12/task3.c
new file mode 100644
index 0000000000..c951a4bdc4
--- /dev/null
+++ b/c/src/tests/sptests/sp12/task3.c
@@ -0,0 +1,50 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It simply obtains semaphore
+ * 2 and waits forever attempting to obtain semaphore 3.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA3 - rtems_semaphore_obtain - wait forever on SM2" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM2" );
+ puts( "TA3 - got SM2" );
+
+ puts( "TA3 - rtems_semaphore_release - release SM2" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release on SM2" );
+
+ puts( "TA3 - rtems_semaphore_obtain - wait forever on SM3" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 3 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM3" );
+}
diff --git a/c/src/tests/sptests/sp12/task4.c b/c/src/tests/sptests/sp12/task4.c
new file mode 100644
index 0000000000..a0c8bb40c7
--- /dev/null
+++ b/c/src/tests/sptests/sp12/task4.c
@@ -0,0 +1,37 @@
+/* Task_4
+ *
+ * This routine serves as a test task. It waits forever attempting
+ * to obtain semaphore 1. However, it should never get the semaphore!
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA4 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM1" );
+}
diff --git a/c/src/tests/sptests/sp12/task5.c b/c/src/tests/sptests/sp12/task5.c
new file mode 100644
index 0000000000..ca3957015a
--- /dev/null
+++ b/c/src/tests/sptests/sp12/task5.c
@@ -0,0 +1,55 @@
+/* Task5
+ *
+ * This routine serves as a test task. It obtains semaphore 1 correctly
+ * once, then waits for semaphore 1 again. Task 1 should delete the
+ * semaphore, thus waking this task up.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task5(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA5 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM1" );
+ puts( "TA5 - got SM1" );
+
+ puts( "TA5 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_semaphore_obtain on SM1"
+ );
+ puts( "TA5 - SM1 deleted by TA1" );
+
+ puts( "*** END OF TEST 12 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp13/Makefile.in b/c/src/tests/sptests/sp13/Makefile.in
new file mode 100644
index 0000000000..1c23f60d0a
--- /dev/null
+++ b/c/src/tests/sptests/sp13/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp13
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init fillbuff putbuff task1 task2 task3
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp13/fillbuff.c b/c/src/tests/sptests/sp13/fillbuff.c
new file mode 100644
index 0000000000..b0d1186ddc
--- /dev/null
+++ b/c/src/tests/sptests/sp13/fillbuff.c
@@ -0,0 +1,31 @@
+/* Fill_buffer
+ *
+ * This test routine copies a given source string to a given destination
+ * buffer.
+ *
+ * Input parameters:
+ * source - pointer to string to be copied
+ * buffer - pointer to message buffer to be filled
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Fill_buffer(
+ char *source,
+ long *buffer
+)
+{
+ memcpy( buffer, source, 16 );
+}
diff --git a/c/src/tests/sptests/sp13/init.c b/c/src/tests/sptests/sp13/init.c
new file mode 100644
index 0000000000..afe7d4e19b
--- /dev/null
+++ b/c/src/tests/sptests/sp13/init.c
@@ -0,0 +1,112 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 13 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ Queue_name[ 1 ] = rtems_build_name( 'Q', '1', ' ', ' ' );
+ Queue_name[ 2 ] = rtems_build_name( 'Q', '2', ' ', ' ' );
+ Queue_name[ 3 ] = rtems_build_name( 'Q', '3', ' ', ' ' );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 100,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q1" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 2 ],
+ 10,
+ 16,
+ RTEMS_PRIORITY,
+ &Queue_id[ 2 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q2" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 3 ],
+ 100,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 3 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp13/putbuff.c b/c/src/tests/sptests/sp13/putbuff.c
new file mode 100644
index 0000000000..6a4c08ee1d
--- /dev/null
+++ b/c/src/tests/sptests/sp13/putbuff.c
@@ -0,0 +1,29 @@
+/* Put_buffer
+ *
+ * This test routine prints the given buffer.
+ * buffer.
+ *
+ * Input parameters:
+ * buffer - pointer to message buffer to be printer
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Put_buffer(
+ long *buffer
+)
+{
+ printf( "%16s", (char *)buffer );
+}
diff --git a/c/src/tests/sptests/sp13/sp13.doc b/c/src/tests/sptests/sp13/sp13.doc
new file mode 100644
index 0000000000..25747815aa
--- /dev/null
+++ b/c/src/tests/sptests/sp13/sp13.doc
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test13
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ q_create, q_ident, q_delete, q_send, q_urgent, q_broadcast, q_receive,
+ tm_wkafter, t_setpri
+
+concepts:
+
+ a. This test checks out the message manager.
diff --git a/c/src/tests/sptests/sp13/sp13.scn b/c/src/tests/sptests/sp13/sp13.scn
new file mode 100644
index 0000000000..11adfb8eb3
--- /dev/null
+++ b/c/src/tests/sptests/sp13/sp13.scn
@@ -0,0 +1,72 @@
+*** TEST 13 ***
+TA1 - rtems_message_queue_ident - qid => 18010001
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_NO_WAIT
+TA2 - buffer received: BUFFER 1 TO Q 1
+TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_WAIT FOREVER
+TA2 - buffer received: BUFFER 2 TO Q 1
+TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_WAIT FOREVER
+TA3 - rtems_message_queue_receive - receive from queue 2 - RTEMS_WAIT FOREVER
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - buffer received: BUFFER 3 TO Q 1
+TA2 - rtems_task_set_priority - make self highest priority task
+TA2 - rtems_message_queue_receive - receive from queue 2 - RTEMS_WAIT FOREVER
+<pause>
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 2
+TA2 - buffer received: BUFFER 1 TO Q 2
+TA2 - rtems_message_queue_send - BUFFER 2 TO Q 2
+TA2 - rtems_message_queue_receive - receive from queue 1 - 10 second timeout
+TA1 - rtems_message_queue_receive - receive from queue 1 - 10 second timeout
+TA3 - buffer received: BUFFER 2 TO Q 2
+TA3 - rtems_message_queue_broadcast - BUFFER 3 TO Q 1
+TA2 - buffer received: BUFFER 3 TO Q 1
+TA2 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA3 - number of tasks awakened = 02
+TA3 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 3 TO Q 1
+TA1 - rtems_task_delete - delete TA2
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - buffer received: BUFFER 1 TO Q 3
+TA3 - rtems_task_delete - delete self
+<pause>
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 4 TO Q 3
+TA1 - rtems_message_queue_urgent - BUFFER 5 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 5 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 2 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 3 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 4 TO Q 3
+TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2
+TA1 - rtems_message_queue_receive - receive from queue 2 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 3 TO Q 2
+<pause>
+TA1 - rtems_message_queue_delete - delete queue 1
+TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2
+TA1 - rtems_message_queue_delete - delete queue 2
+TA1 - rtems_message_queue_flush - empty Q 3
+TA1 - 0 messages were flushed from Q 3
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3
+TA1 - rtems_message_queue_flush - Q 3
+TA1 - 3 messages were flushed from Q 3
+TA1 - rtems_message_queue_send until all message buffers consumed
+TA1 - all message buffers consumed
+TA1 - rtems_message_queue_flush - Q 3
+TA1 - 100 messages were flushed from Q 3
+<pause>
+TA1 - create message queue of 20 bytes on queue 1
+TA1 - rtems_message_queue_delete - delete queue 1
+<pause>
+TA1 - rtems_message_queue_create - variable sizes
+TA1 - rtems_message_queue_create and send - variable sizes
+*** END OF TEST 13 ***
diff --git a/c/src/tests/sptests/sp13/system.h b/c/src/tests/sptests/sp13/system.h
new file mode 100644
index 0000000000..7dbc55b933
--- /dev/null
+++ b/c/src/tests/sptests/sp13/system.h
@@ -0,0 +1,68 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+void Fill_buffer(
+ char source[],
+ long *buffer
+);
+
+void Put_buffer(
+ long *buffer
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 10
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 4 ]; /* array of queue ids */
+TEST_EXTERN rtems_name Queue_name[ 4 ]; /* array of queue names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp13/task1.c b/c/src/tests/sptests/sp13/task1.c
new file mode 100644
index 0000000000..080d4608a7
--- /dev/null
+++ b/c/src/tests/sptests/sp13/task1.c
@@ -0,0 +1,344 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the message manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <string.h> /* for memcmp */
+
+extern rtems_configuration_table BSP_Configuration;
+
+char big_send_buffer[2048];
+char big_receive_buffer[2048];
+
+long buffer[ 4 ];
+
+void dope_buffer(unsigned char *buff,
+ int buff_size,
+ unsigned32 v)
+{
+ int i;
+ unsigned char ch;
+
+ ch = (' ' + (v % (0x7f - ' ')));
+
+ for (i=0; i<buff_size; i++)
+ {
+ *buff++ = ch++;
+ if (ch >= 0x7f)
+ ch = ' ';
+ }
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id qid;
+ rtems_unsigned32 index;
+ rtems_unsigned32 count;
+ rtems_status_code status;
+ rtems_unsigned32 size;
+ rtems_unsigned32 queue_size;
+ char *cp;
+
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &qid
+ );
+ printf( "TA1 - rtems_message_queue_ident - qid => %08x\n", qid );
+ directive_failed( status, "rtems_message_queue_ident" );
+
+ Fill_buffer( "BUFFER 1 TO Q 1", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 2 TO Q 1", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Fill_buffer( "BUFFER 3 TO Q 1", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ Fill_buffer( "BUFFER 1 TO Q 2", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 2" );
+ status = rtems_message_queue_send( Queue_id[ 2 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts_nocr( "TA1 - rtems_message_queue_receive - receive from queue 1 - " );
+ puts ( "10 second timeout" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA1 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts( "TA1 - rtems_task_delete - delete TA2" );
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete" );
+
+ Fill_buffer( "BUFFER 1 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ Fill_buffer( "BUFFER 2 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 3 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 4 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 4 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 5 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_urgent - BUFFER 5 TO Q 3" );
+ status = rtems_message_queue_urgent( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ for ( index = 1 ; index <= 4 ; index++ ) {
+ puts(
+ "TA1 - rtems_message_queue_receive - receive from queue 3 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 3 ],
+ buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA1 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+ }
+
+ Fill_buffer( "BUFFER 3 TO Q 2", buffer );
+ puts( "TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2" );
+ status = rtems_message_queue_urgent( Queue_id[ 2 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ puts(
+ "TA1 - rtems_message_queue_receive - receive from queue 2 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 2 ],
+ buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA1 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_message_queue_delete - delete queue 1" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+
+ Fill_buffer( "BUFFER 3 TO Q 2", buffer );
+ puts( "TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2" );
+ status = rtems_message_queue_urgent( Queue_id[ 2 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ puts( "TA1 - rtems_message_queue_delete - delete queue 2" );
+ status = rtems_message_queue_delete( Queue_id[ 2 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+
+ puts( "TA1 - rtems_message_queue_flush - empty Q 3" );
+ status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
+ printf( "TA1 - %d messages were flushed from Q 3\n", count );
+
+ Fill_buffer( "BUFFER 1 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 2 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 3 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_message_queue_flush - Q 3" );
+ status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
+ printf( "TA1 - %d messages were flushed from Q 3\n", count );
+
+ puts( "TA1 - rtems_message_queue_send until all message buffers consumed" );
+ while ( FOREVER ) {
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ if ( status == RTEMS_TOO_MANY ) break;
+ directive_failed( status, "rtems_message_queue_send loop" );
+ }
+
+ puts( "TA1 - all message buffers consumed" );
+ puts( "TA1 - rtems_message_queue_flush - Q 3" );
+ status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
+ printf( "TA1 - %d messages were flushed from Q 3\n", count );
+
+rtems_test_pause();
+
+ puts( "TA1 - create message queue of 20 bytes on queue 1" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 100,
+ 20,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q1; 20 bytes each" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], big_send_buffer, 40 );
+ fatal_directive_status(status, RTEMS_INVALID_SIZE, "expected RTEMS_INVALID_SIZE");
+
+ puts( "TA1 - rtems_message_queue_delete - delete queue 1" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_message_queue_create - variable sizes " );
+ for (queue_size = 1; queue_size < 1030; queue_size++)
+ {
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2, /* just 2 msgs each */
+ queue_size,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ printf("TA1 - msq que size: %d\n", queue_size);
+ directive_failed( status, "rtems_message_queue_create of Q1" );
+ }
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+ }
+
+ puts( "TA1 - rtems_message_queue_create and send - variable sizes " );
+ for (queue_size = 1; queue_size < 1030; queue_size++)
+ {
+ /* printf("TA1 - message queue size: %d\n", queue_size); */
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2, /* just 2 msgs each */
+ queue_size,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+
+ directive_failed( status, "rtems_message_queue_create of Q1" );
+
+ dope_buffer(big_send_buffer, sizeof(big_send_buffer), queue_size);
+ memset(big_receive_buffer, 'Z', sizeof(big_receive_buffer));
+
+ /* send a msg too big */
+ status = rtems_message_queue_send( Queue_id[ 1 ],
+ big_send_buffer,
+ queue_size + 1 );
+
+ fatal_directive_status(status,
+ RTEMS_INVALID_SIZE,
+ "rtems_message_queue_send too large");
+
+ /* send a msg that is just right */
+ status = rtems_message_queue_send(Queue_id[ 1 ],
+ big_send_buffer,
+ queue_size);
+ directive_failed(status, "rtems_message_queue_send exact size");
+
+ /* now read and verify the message just sent */
+ status = rtems_message_queue_receive(Queue_id[ 1 ],
+ big_receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 1 * TICKS_PER_SECOND);
+ directive_failed(status, "rtems_message_queue_receive exact size");
+ if (size != queue_size)
+ {
+ puts("TA1 - exact size size match failed");
+ exit(1);
+ }
+
+ if (memcmp(big_send_buffer, big_receive_buffer, size) != 0)
+ {
+ puts("TA1 - exact size data match failed");
+ exit(1);
+ }
+
+ for (cp = (big_receive_buffer + size);
+ cp < (big_receive_buffer + sizeof(big_receive_buffer));
+ cp++)
+ if (*cp != 'Z')
+ {
+ puts("TA1 - exact size overrun match failed");
+ exit(1);
+ }
+
+ /* all done with this one; delete it */
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+ }
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp13/task2.c b/c/src/tests/sptests/sp13/task2.c
new file mode 100644
index 0000000000..00a002e31a
--- /dev/null
+++ b/c/src/tests/sptests/sp13/task2.c
@@ -0,0 +1,139 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Multiple tasks are required to
+ * verify all message manager capabilities.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+ rtems_task_priority previous_priority;
+ rtems_status_code status;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_NO_WAIT"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts( "TA2 - rtems_task_set_priority - make self highest priority task" );
+ status = rtems_task_set_priority( RTEMS_SELF, 3, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 2 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 2 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ Fill_buffer( "BUFFER 2 TO Q 2", (long *)buffer );
+ puts( "TA2 - rtems_message_queue_send - BUFFER 2 TO Q 2" );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ status = rtems_message_queue_send( Queue_id[ 2 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - "
+ "10 second timeout"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 3 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 3 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+}
diff --git a/c/src/tests/sptests/sp13/task3.c b/c/src/tests/sptests/sp13/task3.c
new file mode 100644
index 0000000000..43c1a31b12
--- /dev/null
+++ b/c/src/tests/sptests/sp13/task3.c
@@ -0,0 +1,78 @@
+/* Task_3
+ *
+ * This routine serves as a test task. Its major function is to
+ * broadcast a messge to all the other tasks.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ puts(
+ "TA3 - rtems_message_queue_receive - receive from queue 2 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 2 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA3 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ Fill_buffer( "BUFFER 3 TO Q 1", (long *)buffer );
+ puts( "TA3 - rtems_message_queue_broadcast - BUFFER 3 TO Q 1" );
+ status = rtems_message_queue_broadcast(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ 16,
+ &count
+ );
+ printf( "TA3 - number of tasks awakened = %02d\n", count );
+ puts(
+ "TA3 - rtems_message_queue_receive - receive from queue 3 - "
+ "RTEMS_WAIT FOREVER"
+ );
+
+ status = rtems_message_queue_receive(
+ Queue_id[ 3 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA3 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts( "TA3 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp14/Makefile.in b/c/src/tests/sptests/sp14/Makefile.in
new file mode 100644
index 0000000000..604e49ebfb
--- /dev/null
+++ b/c/src/tests/sptests/sp14/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp14
+
+MANAGERS=io signal timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init asr task1 task2
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp14/asr.c b/c/src/tests/sptests/sp14/asr.c
new file mode 100644
index 0000000000..85cf953b59
--- /dev/null
+++ b/c/src/tests/sptests/sp14/asr.c
@@ -0,0 +1,47 @@
+/* Process_asr
+ *
+ * This is the asynchronous signal routine (asr) for task 1.
+ * It demonstrates that ASRs can block execute and block.
+ *
+ * Input parameters:
+ * the_signal_set - signal set
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_asr Process_asr(
+ rtems_signal_set the_signal_set
+)
+{
+ rtems_status_code status;
+
+ printf( "ASR - ENTRY - signal => %08x\n", the_signal_set );
+ switch( the_signal_set ) {
+ case RTEMS_SIGNAL_16:
+ case RTEMS_SIGNAL_17:
+ case RTEMS_SIGNAL_18 | RTEMS_SIGNAL_19:
+ break;
+ case RTEMS_SIGNAL_0:
+ case RTEMS_SIGNAL_1:
+ puts( "ASR - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after yield" );
+ break;
+ case RTEMS_SIGNAL_3:
+ Asr_fired = TRUE;
+ break;
+ }
+ printf( "ASR - EXIT - signal => %08x\n", the_signal_set );
+}
diff --git a/c/src/tests/sptests/sp14/init.c b/c/src/tests/sptests/sp14/init.c
new file mode 100644
index 0000000000..b85f8bda77
--- /dev/null
+++ b/c/src/tests/sptests/sp14/init.c
@@ -0,0 +1,72 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 14 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create of TM1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp14/sp14.doc b/c/src/tests/sptests/sp14/sp14.doc
new file mode 100644
index 0000000000..ffd7c51519
--- /dev/null
+++ b/c/src/tests/sptests/sp14/sp14.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test14
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ as_catch, as_return, as_send, tm_wkafter
+
+concepts:
+
+ a. This test checks out the signal manager.
diff --git a/c/src/tests/sptests/sp14/sp14.scn b/c/src/tests/sptests/sp14/sp14.scn
new file mode 100644
index 0000000000..31e6d067d2
--- /dev/null
+++ b/c/src/tests/sptests/sp14/sp14.scn
@@ -0,0 +1,33 @@
+*** TEST 14 ***
+TA1 - rtems_signal_catch - RTEMS_INTERRUPT_LEVEL( 3 )
+TA1 - rtems_signal_send - RTEMS_SIGNAL_16 to self
+ASR - ENTRY - signal => 00010000
+ASR - EXIT - signal => 00010000
+TA1 - rtems_signal_send - RTEMS_SIGNAL_0 to self
+ASR - ENTRY - signal => 00000001
+ASR - rtems_task_wake_after - yield processor
+TA2 - rtems_signal_send - RTEMS_SIGNAL_17 to TA1
+TA2 - rtems_task_wake_after - yield processor
+ASR - ENTRY - signal => 00020000
+ASR - EXIT - signal => 00020000
+ASR - EXIT - signal => 00000001
+TA1 - rtems_signal_catch - RTEMS_NO_ASR
+<pause>
+TA1 - rtems_signal_send - RTEMS_SIGNAL_1 to self
+ASR - ENTRY - signal => 00000002
+ASR - rtems_task_wake_after - yield processor
+TA2 - rtems_signal_send - RTEMS_SIGNAL_18 and RTEMS_SIGNAL_19 to TA1
+TA2 - rtems_task_wake_after - yield processor
+ASR - EXIT - signal => 00000002
+ASR - ENTRY - signal => 000c0000
+ASR - EXIT - signal => 000c0000
+TA1 - rtems_task_mode - disable ASRs
+TA1 - sending signal to RTEMS_SELF from timer
+TA1 - waiting for signal to arrive
+TA1 - timer routine got the correct arguments
+TA1 - rtems_task_mode - enable ASRs
+ASR - ENTRY - signal => 00000008
+ASR - EXIT - signal => 00000008
+TA1 - rtems_signal_catch - asraddr of NULL
+TA1 - rtems_task_delete - delete self
+*** END OF TEST 14 ***
diff --git a/c/src/tests/sptests/sp14/system.h b/c/src/tests/sptests/sp14/system.h
new file mode 100644
index 0000000000..dbc837b435
--- /dev/null
+++ b/c/src/tests/sptests/sp14/system.h
@@ -0,0 +1,78 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Signal_3_to_task_1(
+ rtems_id id,
+ void *pointer
+);
+
+rtems_asr Process_asr(
+ rtems_signal_set the_signal_set
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 3 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 3 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_unsigned32 Signals_sent;
+ /* set to TRUE to indicate that a */
+ /* signal set has been sent from */
+ /* an ISR to the executing task */
+
+TEST_EXTERN volatile rtems_unsigned32 Asr_fired;
+ /* set to TRUE to indicate that the */
+ /* RTEMS_ASR has executed and was */
+ /* passed the correct signal set */
+
+TEST_EXTERN volatile rtems_id Timer_got_this_id;
+
+TEST_EXTERN volatile void *Timer_got_this_pointer;
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp14/task1.c b/c/src/tests/sptests/sp14/task1.c
new file mode 100644
index 0000000000..8f5463c396
--- /dev/null
+++ b/c/src/tests/sptests/sp14/task1.c
@@ -0,0 +1,116 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It establishes an RTEMS_ASR and
+ * sends signal to itself to determine if the RTEMS_ASR gets to execute.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Signal_3_to_task_1(
+ rtems_id id,
+ void *pointer
+)
+{
+ rtems_status_code status;
+
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_3 );
+ directive_failed( status, "rtems_signal_send of 3" );
+
+ Timer_got_this_id = id;
+ Timer_got_this_pointer = pointer;
+
+ Signals_sent = TRUE;
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+ puts( "TA1 - rtems_signal_catch - RTEMS_INTERRUPT_LEVEL( 3 )" );
+ status = rtems_signal_catch( Process_asr, RTEMS_INTERRUPT_LEVEL(3) );
+ directive_failed( status, "rtems_signal_catch" );
+
+ puts( "TA1 - rtems_signal_send - RTEMS_SIGNAL_16 to self" );
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_16 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA1 - rtems_signal_send - RTEMS_SIGNAL_0 to self" );
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_0 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA1 - rtems_signal_catch - RTEMS_NO_ASR" );
+ status = rtems_signal_catch( Process_asr, RTEMS_NO_ASR );
+ directive_failed( status, "rtems_signal_catch" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_signal_send - RTEMS_SIGNAL_1 to self" );
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_1 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA1 - rtems_task_mode - disable ASRs" );
+ status = rtems_task_mode( RTEMS_NO_ASR, RTEMS_ASR_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ Timer_got_this_id = 0;
+ Timer_got_this_pointer = NULL;
+
+ puts( "TA1 - sending signal to RTEMS_SELF from timer" );
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ TICKS_PER_SECOND / 2,
+ Signal_3_to_task_1,
+ (void *) Task_1
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - waiting for signal to arrive" );
+
+ Signals_sent = FALSE;
+ Asr_fired = FALSE;
+
+ while ( Signals_sent == FALSE )
+ ;
+
+ if ( Timer_got_this_id == Timer_id[ 1 ] &&
+ Timer_got_this_pointer == Task_1 )
+ puts( "TA1 - timer routine got the correct arguments" );
+ else
+ printf(
+ "TA1 - timer got (0x%x, %p) instead of (0x%x, %p)!!!!\n",
+ Timer_got_this_id,
+ Timer_got_this_pointer,
+ Timer_id[ 1 ],
+ Task_1
+ );
+
+ puts( "TA1 - rtems_task_mode - enable ASRs" );
+ status = rtems_task_mode( RTEMS_ASR, RTEMS_ASR_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ puts( "TA1 - rtems_signal_catch - asraddr of NULL" );
+ status = rtems_signal_catch( NULL, RTEMS_DEFAULT_MODES );
+ directive_failed( status, "rtems_signal_catch" );
+
+ puts( "TA1 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp14/task2.c b/c/src/tests/sptests/sp14/task2.c
new file mode 100644
index 0000000000..7a7927d981
--- /dev/null
+++ b/c/src/tests/sptests/sp14/task2.c
@@ -0,0 +1,48 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It verifies that one task can
+ * send signals to another task ( invoking the other task's RTEMS_ASR ).
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_signal_send - RTEMS_SIGNAL_17 to TA1" );
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_17 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA2 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts("TA2 - rtems_signal_send - RTEMS_SIGNAL_18 and RTEMS_SIGNAL_19 to TA1");
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_18 | RTEMS_SIGNAL_19 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA2 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 14 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp15/Makefile.in b/c/src/tests/sptests/sp15/Makefile.in
new file mode 100644
index 0000000000..656e810f5a
--- /dev/null
+++ b/c/src/tests/sptests/sp15/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp15
+
+MANAGERS=io partition
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp15/init.c b/c/src/tests/sptests/sp15/init.c
new file mode 100644
index 0000000000..23ece2e8c8
--- /dev/null
+++ b/c/src/tests/sptests/sp15/init.c
@@ -0,0 +1,78 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 15 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'T', '1', ' ' );
+ Partition_name[ 2 ] = rtems_build_name( 'P', 'T', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ puts("INIT - rtems_partition_create - partition 1");
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Area_1,
+ 4096,
+ 512,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create of PT1" );
+
+ puts("INIT - rtems_partition_create - partition 2");
+ status = rtems_partition_create(
+ Partition_name[ 2 ],
+ Area_2,
+ 274,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id[ 2 ]
+ );
+ directive_failed( status, "rtems_partition_create of PT2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp15/sp15.doc b/c/src/tests/sptests/sp15/sp15.doc
new file mode 100644
index 0000000000..33e10b068c
--- /dev/null
+++ b/c/src/tests/sptests/sp15/sp15.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test15
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ pt_create, pt_ident, pt_getbuf, pt_retbuf, pt_delete
+
+concepts:
+
+ a. This test checks out the partition manager.
diff --git a/c/src/tests/sptests/sp15/sp15.scn b/c/src/tests/sptests/sp15/sp15.scn
new file mode 100644
index 0000000000..f1a800dc0d
--- /dev/null
+++ b/c/src/tests/sptests/sp15/sp15.scn
@@ -0,0 +1,16 @@
+*** TEST 15 ***
+INIT - rtems_partition_create - partition 1
+INIT - rtems_partition_create - partition 2
+TA1 - rtems_partition_ident - partition 1 id = 1c010001
+TA1 - rtems_partition_ident - partition 2 id = 1c010002
+TA1 - rtems_partition_get_buffer - buffer 1 from partition 1 - 0x00000000
+TA1 - rtems_partition_get_buffer - buffer 2 from partition 1 - 0x00000200
+TA1 - rtems_partition_get_buffer - buffer 1 from partition 2 - 0x00000000
+TA1 - rtems_partition_get_buffer - buffer 2 from partition 2 - 0x00000080
+TA1 - rtems_partition_return_buffer - buffer 1 to partition 1 - 0x00000000
+TA1 - rtems_partition_return_buffer - buffer 2 to partition 1 - 0x00000200
+TA1 - rtems_partition_return_buffer - buffer 1 to partition 2 - 0x00000000
+TA1 - rtems_partition_return_buffer - buffer 2 to partition 2 - 0x00000080
+TA1 - rtems_partition_delete - delete partition 1
+TA1 - rtems_partition_delete - delete partition 2
+*** END OF TEST 15 ***
diff --git a/c/src/tests/sptests/sp15/system.h b/c/src/tests/sptests/sp15/system.h
new file mode 100644
index 0000000000..cbd2ae934c
--- /dev/null
+++ b/c/src/tests/sptests/sp15/system.h
@@ -0,0 +1,62 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_PARTITIONS 2
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_name Partition_id[ 4 ]; /* array of partition ids */
+TEST_EXTERN rtems_name Partition_name[ 4 ]; /* array of partition names */
+
+TEST_EXTERN rtems_unsigned8 Area_1[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_2[274] CPU_STRUCTURE_ALIGNMENT;
+
+#define Put_address_from_area_1( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long)((rtems_unsigned8 *)(_to_be_printed) - Area_1 ) )
+
+#define Put_address_from_area_2( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long)((rtems_unsigned8 *)(_to_be_printed) - Area_2 ) )
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp15/task1.c b/c/src/tests/sptests/sp15/task1.c
new file mode 100644
index 0000000000..11664da95b
--- /dev/null
+++ b/c/src/tests/sptests/sp15/task1.c
@@ -0,0 +1,129 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the partition manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id ptid_1;
+ rtems_id ptid_2;
+ void *buffer_address_1;
+ void *buffer_address_2;
+ void *buffer_address_3;
+ void *buffer_address_4;
+ rtems_status_code status;
+
+ puts_nocr( "TA1 - rtems_partition_ident - partition 1 id = " );
+ status = rtems_partition_ident(
+ Partition_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &ptid_1
+ );
+ directive_failed( status, "rtems_partition_ident of PT1" );
+ printf( "%08x\n", ptid_1 );
+
+ puts_nocr( "TA1 - rtems_partition_ident - partition 2 id = " );
+ status = rtems_partition_ident(
+ Partition_name[ 2 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &ptid_2
+ );
+ directive_failed( status, "rtems_partition_ident of PT2" );
+ printf( "%08x\n", ptid_2 );
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 1 from partition 1 - "
+ );
+ status = rtems_partition_get_buffer( ptid_1, &buffer_address_1 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_1( buffer_address_1 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 2 from partition 1 - "
+ );
+ status = rtems_partition_get_buffer( ptid_1, &buffer_address_2 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_1( buffer_address_2 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 1 from partition 2 - "
+ );
+ status = rtems_partition_get_buffer( ptid_2, &buffer_address_3 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_2( buffer_address_3 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 2 from partition 2 - "
+ );
+ status = rtems_partition_get_buffer( ptid_2, &buffer_address_4 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_2( buffer_address_4 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 1 to partition 1 - "
+ );
+ Put_address_from_area_1( buffer_address_1 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_1, buffer_address_1 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 2 to partition 1 - "
+ );
+ Put_address_from_area_1( buffer_address_2 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_1, buffer_address_2 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 1 to partition 2 - "
+ );
+ Put_address_from_area_2( buffer_address_3 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_2, buffer_address_3 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 2 to partition 2 - "
+ );
+ Put_address_from_area_2( buffer_address_4 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_2, buffer_address_4 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts( "TA1 - rtems_partition_delete - delete partition 1"
+ );
+ status = rtems_partition_delete( ptid_1 );
+ directive_failed( status, "rtems_partition_delete" );
+
+ puts( "TA1 - rtems_partition_delete - delete partition 2"
+ );
+ status = rtems_partition_delete( ptid_2 );
+ directive_failed( status, "rtems_partition_delete" );
+
+ puts( "*** END OF TEST 15 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp16/Makefile.in b/c/src/tests/sptests/sp16/Makefile.in
new file mode 100644
index 0000000000..a30f99e69f
--- /dev/null
+++ b/c/src/tests/sptests/sp16/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp16
+
+MANAGERS=io region
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1 task2 task3 task4 task5
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp16/init.c b/c/src/tests/sptests/sp16/init.c
new file mode 100644
index 0000000000..2dff7629bc
--- /dev/null
+++ b/c/src/tests/sptests/sp16/init.c
@@ -0,0 +1,128 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 16 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ Region_name[ 1 ] = rtems_build_name( 'R', 'N', '1', ' ' );
+ Region_name[ 2 ] = rtems_build_name( 'R', 'N', '2', ' ' );
+ Region_name[ 3 ] = rtems_build_name( 'R', 'N', '3', ' ' );
+ Region_name[ 4 ] = rtems_build_name( 'R', 'N', '4', ' ' );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Area_1,
+ 4096,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 1 ]
+ );
+ directive_failed( status, "rtems_region_create of RN1" );
+
+ status = rtems_region_create(
+ Region_name[ 2 ],
+ Area_2,
+ 4096,
+ 128,
+ RTEMS_PRIORITY,
+ &Region_id[ 2 ]
+ );
+ directive_failed( status, "rtems_region_create of RN2" );
+
+ status = rtems_region_create(
+ Region_name[ 3 ],
+ Area_3,
+ 4096,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 3 ]
+ );
+ directive_failed( status, "rtems_region_create of RN3" );
+
+ status = rtems_region_create(
+ Region_name[ 4 ],
+ Area_4,
+ 4096,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 4 ]
+ );
+ directive_failed( status, "rtems_region_create of RN4" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp16/sp16.doc b/c/src/tests/sptests/sp16/sp16.doc
new file mode 100644
index 0000000000..86e8d7f236
--- /dev/null
+++ b/c/src/tests/sptests/sp16/sp16.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test16
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ rn_create, rn_ident, rn_getbuf, rn_retbuf, rn_delete
+
+concepts:
+
+ a. This test checks out the region manager.
diff --git a/c/src/tests/sptests/sp16/sp16.scn b/c/src/tests/sptests/sp16/sp16.scn
new file mode 100644
index 0000000000..36d533c2b4
--- /dev/null
+++ b/c/src/tests/sptests/sp16/sp16.scn
@@ -0,0 +1,58 @@
+*** TEST 16 ***
+TA1 - rtems_region_ident - rnid => 20010002
+TA1 - rtems_region_get_segment - wait on 100 byte segment from region 2
+TA1 - got segment from region 2 - 0x00000f78
+TA1 - rtems_region_get_segment - wait on 3K segment from region 3
+TA1 - got segment from region 3 - 0x000003f8
+TA1 - rtems_region_get_segment - get 3080 byte segment from region 1 - NO_WAIT
+TA1 - got segment from region 1 - 0x00000378
+TA1 - rtems_task_wake_after - yield processor
+TA2 - rtems_region_get_segment - wait on 2K segment from region 1
+TA3 - rtems_region_get_segment - wait on 3968 byte segment from region 2
+<pause>
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x00000378
+TA1 - rtems_region_get_segment - wait 10 seconds for 3K segment from region 1
+TA2 - got segment from region 1 - 0x000007f8
+TA2 - rtems_region_return_segment - return segment to region 1 - 0x000007f8
+TA2 - rtems_task_set_priority - make self highest priority task
+TA2 - rtems_region_get_segment - wait on 3968 byte segment
+TA1 - got segment from region 1 - 0x000003f8
+TA1 - rtems_region_return_segment - return segment to region 2 - 0x00000f78
+TA2 - got segment from region 2 - 0x00000008
+TA2 - rtems_region_return_segment - return segment to region 2 - 0x00000008
+TA2 - rtems_task_delete - delete self
+TA1 - rtems_task_wake_after - yield processor
+TA3 - got segment from region 2 - 0x00000008
+TA3 - rtems_region_get_segment - wait on 2K segment from region 3
+TA1 - rtems_task_delete - delete TA3
+<pause>
+TA1 - rtems_task_wake_after - yield processor
+TA4 - rtems_region_get_segment - wait on 1.5K segment from region 1
+TA5 - rtems_region_get_segment - wait on 1.5K segment from region 1
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x000003f8
+TA1 - rtems_task_wake_after - yield processor
+TA4 - got and returned 0x000009f8
+TA5 - got and returned 0x000003f0
+TA1 - rtems_region_get_segment - wait 10 seconds for 3K segment from region 1
+TA1 - got segment from region 1 - 0x000003f8
+TA1 - rtems_task_wake_after - yield processor
+TA4 - rtems_region_get_segment - wait on 3K segment from region 1
+TA5 - rtems_region_get_segment - wait on 3K segment from region 1
+TA1 - rtems_task_delete - delete TA4
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x000003f8
+TA1 - rtems_task_wake_after - yield processor
+TA5 - got segment from region 1 - 0x000003f8
+TA5 - rtems_region_return_segment - return segment to region 1 - 0x000003f8
+TA5 - rtems_task_delete - delete self
+TA1 - rtems_region_delete - delete region 1
+TA1 - rtems_region_get_segment - get 3K segment from region 4
+TA1 - got segment from region 4 - 0x000003f8
+TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4
+TA1 - rtems_task_get_note - RTEMS_UNSATISFIED
+TA1 - rtems_region_extend - extend region 4 by 4K
+TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4
+TA1 - got 3K segment from region 4 - 0x00001400
+TA1 - rtems_region_return_segment - return segment to region 4 - 0x000003f8
+TA1 - rtems_region_return_segment - return segment to region 4 - 0x00001400
+TA1 - rtems_region_delete - delete region 4
+*** END OF TEST 16 ***
diff --git a/c/src/tests/sptests/sp16/system.h b/c/src/tests/sptests/sp16/system.h
new file mode 100644
index 0000000000..c8def60e12
--- /dev/null
+++ b/c/src/tests/sptests/sp16/system.h
@@ -0,0 +1,89 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_task Task5(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_REGIONS 4
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+TEST_EXTERN rtems_id Region_id[ 5 ]; /* array of region ids */
+TEST_EXTERN rtems_name Region_name[ 5 ]; /* array of region names */
+
+TEST_EXTERN rtems_unsigned8 Area_1[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_2[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_3[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_4[8192] CPU_STRUCTURE_ALIGNMENT;
+
+#define BASE_PRIORITY 140
+
+#define Put_address_from_area_1( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_1 ) )
+
+#define Put_address_from_area_2( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_2 ) )
+
+#define Put_address_from_area_3( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_3 ) )
+
+#define Put_address_from_area_4( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_4 ) )
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp16/task1.c b/c/src/tests/sptests/sp16/task1.c
new file mode 100644
index 0000000000..b7560d7e95
--- /dev/null
+++ b/c/src/tests/sptests/sp16/task1.c
@@ -0,0 +1,282 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the region manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id rnid;
+ void *segment_address_1;
+ void *segment_address_2;
+ void *segment_address_3;
+ void *segment_address_4;
+ rtems_status_code status;
+
+ status = rtems_region_ident( Region_name[ 1 ], &rnid );
+ printf( "TA1 - rtems_region_ident - rnid => %08x\n", rnid );
+ directive_failed( status, "rtems_region_ident of RN1" );
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 100 byte segment from region 2"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 2 ],
+ 100,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 2 - " );
+ Put_address_from_area_2( segment_address_1 );
+ new_line;
+
+ puts( "TA1 - rtems_region_get_segment - wait on 3K segment from region 3" );
+ status = rtems_region_get_segment(
+ Region_id[ 3 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 3 - " );
+ Put_address_from_area_3( segment_address_2 );
+ new_line;
+
+ puts_nocr( "TA1 - rtems_region_get_segment - get 3080 byte segment " );
+ puts ( "from region 1 - NO_WAIT" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3080,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_3
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_3 );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_3 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait 10 seconds for 3K "
+ "segment from region 1"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND,
+ &segment_address_4
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_4 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 2 - "
+ );
+ Put_address_from_area_2( segment_address_1 );
+ new_line;
+ status = rtems_region_return_segment( Region_id[ 2 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_delete - delete TA3" );
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+rtems_test_pause();
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], Task5, 0 );
+ directive_failed( status, "rtems_task_start of TA5" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_4 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_4 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr( "TA1 - rtems_region_get_segment - wait 10 seconds for 3K " );
+ puts ( "segment from region 1");
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND,
+ &segment_address_4
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_4 );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_delete - delete TA4" );
+ status = rtems_task_delete( Task_id[ 4 ] );
+ directive_failed( status, "rtems_task_delete of TA4" );
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_4 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_4 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+
+ puts( "TA1 - rtems_region_delete - delete region 1" );
+ status = rtems_region_delete( Region_id[ 1 ] );
+ directive_failed( status, "rtems_region_delete" );
+
+ puts( "TA1 - rtems_region_get_segment - get 3K segment from region 4" );
+ status = rtems_region_get_segment(
+ Region_id[ 4 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 4 - " );
+ Put_address_from_area_4( segment_address_1 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 4 ],
+ 3072,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_task_get_segment with no memory left"
+ );
+ puts( "TA1 - rtems_task_get_note - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_region_extend - extend region 4 by 4K" );
+ status = rtems_region_extend(
+ Region_id[ 4 ],
+ &Area_4[4096],
+ 4096
+ );
+ directive_failed( status, "rtems_region_extend" );
+
+ puts(
+ "TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 4 ],
+ 3072,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_3
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got 3K segment from region 4 - " );
+ Put_address_from_area_4( segment_address_3 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 4 - "
+ );
+ Put_address_from_area_4( segment_address_1 );
+ status = rtems_region_return_segment( Region_id[ 4 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 4 - "
+ );
+ Put_address_from_area_4( segment_address_3 );
+ status = rtems_region_return_segment( Region_id[ 4 ], segment_address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA1 - rtems_region_delete - delete region 4" );
+ status = rtems_region_delete( Region_id[ 4 ] );
+ directive_failed( status, "rtems_region_delete" );
+
+ puts( "*** END OF TEST 16 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp16/task2.c b/c/src/tests/sptests/sp16/task2.c
new file mode 100644
index 0000000000..980b98bbe1
--- /dev/null
+++ b/c/src/tests/sptests/sp16/task2.c
@@ -0,0 +1,86 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+ void *segment_address_1;
+ void *segment_address_2;
+
+ puts( "TA2 - rtems_region_get_segment - wait on 2K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 2048,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA2 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_1 );
+ new_line;
+
+ puts_nocr(
+ "TA2 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_1 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA2 - rtems_task_set_priority - make self highest priority task" );
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ BASE_PRIORITY-1,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ puts("TA2 - rtems_region_get_segment - wait on 3968 byte segment");
+ status = rtems_region_get_segment(
+ Region_id[ 2 ],
+ 3968,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA2 - got segment from region 2 - ");
+ Put_address_from_area_2( segment_address_2 );
+ new_line;
+
+ puts_nocr(
+ "TA2 - rtems_region_return_segment - return segment to region 2 - "
+ );
+ Put_address_from_area_2( segment_address_2 );
+ status = rtems_region_return_segment( Region_id[ 2 ], segment_address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA2 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp16/task3.c b/c/src/tests/sptests/sp16/task3.c
new file mode 100644
index 0000000000..c4d727d2e2
--- /dev/null
+++ b/c/src/tests/sptests/sp16/task3.c
@@ -0,0 +1,57 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ void *segment_address_1;
+ void *segment_address_2;
+
+ puts(
+ "TA3 - rtems_region_get_segment - wait on 3968 byte segment from region 2"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 2 ],
+ 3968,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA3 - got segment from region 2 - " );
+ Put_address_from_area_2( segment_address_1 );
+ new_line;
+ directive_failed( status, "rtems_region_return_segment" );
+
+ puts( "TA3 - rtems_region_get_segment - wait on 2K segment from region 3" );
+ status = rtems_region_get_segment(
+ Region_id[ 3 ],
+ 2048,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+}
diff --git a/c/src/tests/sptests/sp16/task4.c b/c/src/tests/sptests/sp16/task4.c
new file mode 100644
index 0000000000..7d100ce7d0
--- /dev/null
+++ b/c/src/tests/sptests/sp16/task4.c
@@ -0,0 +1,60 @@
+/* Task_4
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ void *segment_address_1;
+ void *segment_address_2;
+
+ puts( "TA4 - rtems_region_get_segment - wait on 1.5K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 1536,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ puts_nocr( "TA4 - got and returned " );
+ Put_address_from_area_1( segment_address_1 );
+ new_line;
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA4 - rtems_region_get_segment - wait on 3K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+}
diff --git a/c/src/tests/sptests/sp16/task5.c b/c/src/tests/sptests/sp16/task5.c
new file mode 100644
index 0000000000..c7f873f256
--- /dev/null
+++ b/c/src/tests/sptests/sp16/task5.c
@@ -0,0 +1,73 @@
+/* Task5
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task5(
+ rtems_task_argument argument
+)
+{
+ void *segment_address_1;
+ void *segment_address_2;
+ rtems_status_code status;
+
+ puts( "TA5 - rtems_region_get_segment - wait on 1.5K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 1536,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ puts_nocr( "TA5 - got and returned " );
+ Put_address_from_area_1( segment_address_1 );
+ new_line;
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA5 - rtems_region_get_segment - wait on 3K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ puts_nocr( "TA5 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_2 );
+ new_line;
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_2 );
+ puts_nocr(
+ "TA5 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_2 );
+ new_line;
+
+ puts( "TA5 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp17/Makefile.in b/c/src/tests/sptests/sp17/Makefile.in
new file mode 100644
index 0000000000..3ab36f94ca
--- /dev/null
+++ b/c/src/tests/sptests/sp17/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp17
+
+MANAGERS=io signal
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init asr task1 task2
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp17/asr.c b/c/src/tests/sptests/sp17/asr.c
new file mode 100644
index 0000000000..08be97bb23
--- /dev/null
+++ b/c/src/tests/sptests/sp17/asr.c
@@ -0,0 +1,32 @@
+/* Process_asr
+ *
+ * This routine performs the processing for task 1's RTEMS_ASR. It is called
+ * by an assembly routine which saves the necessary registers.
+ *
+ * Input parameters:
+ * signal - signal set
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_asr Process_asr(
+ rtems_signal_set signal_set
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "RTEMS_ASR - rtems_task_resume of TA2" );
+}
diff --git a/c/src/tests/sptests/sp17/init.c b/c/src/tests/sptests/sp17/init.c
new file mode 100644
index 0000000000..df369f0b3a
--- /dev/null
+++ b/c/src/tests/sptests/sp17/init.c
@@ -0,0 +1,69 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 17 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ Task_2_preempted = FALSE;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp17/sp17.doc b/c/src/tests/sptests/sp17/sp17.doc
new file mode 100644
index 0000000000..ff0586e337
--- /dev/null
+++ b/c/src/tests/sptests/sp17/sp17.doc
@@ -0,0 +1,35 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test17
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ as_catch, as_return
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ c. Verifies executive initialization performed correctly.
+
+ d. Verifies that a task can get the task identification number
+ of another task.
+
+ e. Verifies that a signal can be sent to a remote task.
diff --git a/c/src/tests/sptests/sp17/sp17.scn b/c/src/tests/sptests/sp17/sp17.scn
new file mode 100644
index 0000000000..47fd140e2a
--- /dev/null
+++ b/c/src/tests/sptests/sp17/sp17.scn
@@ -0,0 +1,8 @@
+*** TEST 17 ***
+TA2 - Suspending self
+TA1 - rtems_signal_catch: initializing signal catcher
+TA1 - Sending signal to self
+TA2 - signal_return preempted correctly
+TA1 - TA2 correctly preempted me
+TA1 - Got Back!!!
+*** END OF TEST 17 ***
diff --git a/c/src/tests/sptests/sp17/system.h b/c/src/tests/sptests/sp17/system.h
new file mode 100644
index 0000000000..7dd775af50
--- /dev/null
+++ b/c/src/tests/sptests/sp17/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_asr Process_asr(
+ rtems_signal_set signal_set
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(25)
+#define CONFIGURE_TICKS_PER_TIMESLICE 1000
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_unsigned32 Task_2_preempted;
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp17/task1.c b/c/src/tests/sptests/sp17/task1.c
new file mode 100644
index 0000000000..656bdabc3c
--- /dev/null
+++ b/c/src/tests/sptests/sp17/task1.c
@@ -0,0 +1,48 @@
+/* Task_1
+ *
+ * This task initializes the signal catcher, sends the first signal
+ * if running on the first node, and loops while waiting for signals.
+ *
+ * NOTE: The signal catcher is not reentrant and hence RTEMS_NO_ASR must
+ * be a part of its execution mode.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA1 - rtems_signal_catch: initializing signal catcher" );
+ status = rtems_signal_catch( Process_asr, RTEMS_NO_ASR | RTEMS_NO_PREEMPT );
+ directive_failed( status, "rtems_signal_catch" );
+
+ puts( "TA1 - Sending signal to self" );
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_16 );
+ directive_failed( status, "rtems_signal_send" );
+
+ if ( Task_2_preempted == TRUE )
+ puts( "TA1 - TA2 correctly preempted me" );
+
+ puts("TA1 - Got Back!!!");
+
+ puts( "*** END OF TEST 17 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp17/task2.c b/c/src/tests/sptests/sp17/task2.c
new file mode 100644
index 0000000000..6d9c6878e8
--- /dev/null
+++ b/c/src/tests/sptests/sp17/task2.c
@@ -0,0 +1,45 @@
+/* Task_2
+ *
+ * This task initializes the signal catcher, sends the first signal
+ * if running on the first node, and loops while waiting for signals.
+ *
+ * NOTE: The signal catcher is not reentrant and hence RTEMS_NO_ASR must
+ * be a part of its execution mode.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Task_2_preempted = FALSE;
+
+ puts( "TA2 - Suspending self" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA2 - signal_return preempted correctly" );
+
+ Task_2_preempted = TRUE;
+
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+}
diff --git a/c/src/tests/sptests/sp19/Makefile.in b/c/src/tests/sptests/sp19/Makefile.in
new file mode 100644
index 0000000000..787afbf4aa
--- /dev/null
+++ b/c/src/tests/sptests/sp19/Makefile.in
@@ -0,0 +1,63 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp19
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init first fptask task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp19/first.c b/c/src/tests/sptests/sp19/first.c
new file mode 100644
index 0000000000..c21537b1b9
--- /dev/null
+++ b/c/src/tests/sptests/sp19/first.c
@@ -0,0 +1,66 @@
+/* First_FP_task
+ *
+ * This routine serves as a floating point test task. It verifies the
+ * basic task switching capabilities of the executive when floating
+ * point is configured.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include "fptest.h"
+#include "inttest.h"
+
+rtems_task First_FP_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ INTEGER_DECLARE;
+ FP_DECLARE;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ task_index = task_number( tid );
+
+ INTEGER_LOAD( INTEGER_factors[ task_index ] );
+ FP_LOAD( FP_factors[ task_index ] );
+
+ put_name( Task_name[ task_index ], FALSE );
+ printf( " - integer base = (0x%x)\n", INTEGER_factors[ task_index ] );
+ put_name( Task_name[ task_index ], FALSE );
+#if ( RTEMS_HAS_HARDWARE_FP == 1 )
+ printf( " - float base = (%g)\n", FP_factors[ task_index ] );
+#else
+ printf( " - float base = (NA)\n" );
+#endif
+
+ if ( argument == 0 ) {
+ status = rtems_task_restart( RTEMS_SELF, 1 );
+ directive_failed( status, "rtems_task_restart of RTEMS_SELF" );
+ } else {
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+ }
+}
diff --git a/c/src/tests/sptests/sp19/fptask.c b/c/src/tests/sptests/sp19/fptask.c
new file mode 100644
index 0000000000..14da9cf5ca
--- /dev/null
+++ b/c/src/tests/sptests/sp19/fptask.c
@@ -0,0 +1,98 @@
+/* FP_task
+ *
+ * This routine serves as a floating point test task. It verifies the
+ * basic task switching capabilities of the executive when floating
+ * point is configured.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include "fptest.h"
+#include "inttest.h"
+
+rtems_task FP_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ rtems_unsigned32 previous_seconds;
+ INTEGER_DECLARE;
+ FP_DECLARE;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident of self" );
+
+ task_index = task_number( tid );
+
+ INTEGER_LOAD( INTEGER_factors[ task_index ] );
+ FP_LOAD( FP_factors[ task_index ] );
+
+ put_name( Task_name[ task_index ], FALSE );
+ printf( " - integer base = (0x%x)\n", INTEGER_factors[ task_index ] );
+ put_name( Task_name[ task_index ], FALSE );
+#if ( RTEMS_HAS_HARDWARE_FP == 1 )
+ printf( " - float base = (%g)\n", FP_factors[ task_index ] );
+#else
+ printf( " - float base = (NA)\n" );
+#endif
+
+ previous_seconds = -1;
+
+ while( FOREVER ) {
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 16 ) {
+
+ if ( task_number( tid ) == 4 ) {
+ puts( "TA4 - rtems_task_delete - self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA4" );
+ }
+ puts( "TA5 - rtems_task_delete - TA3" );
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ puts( "*** END OF TEST 19 *** " );
+ exit( 0 );
+ }
+
+ if (previous_seconds != time.second)
+ {
+ put_name( Task_name[ task_index ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+ previous_seconds = time.second;
+ }
+
+ INTEGER_CHECK( INTEGER_factors[ task_index ] );
+ FP_CHECK( FP_factors[ task_index ] );
+
+ /* for the first 4 seconds we spin as fast as possible
+ * so that we likely are interrupted
+ * After that, we go to sleep for a second at a time
+ */
+ if (time.second >= 4)
+ {
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+ }
+}
diff --git a/c/src/tests/sptests/sp19/fptest.h b/c/src/tests/sptests/sp19/fptest.h
new file mode 100644
index 0000000000..7ea1dd7fcd
--- /dev/null
+++ b/c/src/tests/sptests/sp19/fptest.h
@@ -0,0 +1,172 @@
+/* fptest.h
+ *
+ * This include file contains the CPU dependent implementation
+ * of the following routines needed to test RTEMS floating
+ * point support:
+ * FP_load( &context )
+ * FP_check( &context )
+ *
+ * FP_load - loads the specified floating point context
+ * FP_check - checks the specified floating point context
+ *
+ * NOTE: These routines are VERY CPU dependent and are thus
+ * located in in the CPU dependent include file
+ * fptest.h. These routines form the core of the
+ * floating point context switch test.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __FPTEST_h
+#define __FPTEST_h
+
+#include <stdio.h>
+
+#ifndef RTEMS_HAS_HARDWARE_FP
+#error "This CPU does not have RTEMS_HAS_HARDWARE_FP defined"
+#endif
+
+#if ( RTEMS_HAS_HARDWARE_FP == FALSE )
+
+/*
+ * The following is useless except to avoid some warnings.
+ */
+
+#define FP_DECLARE unsigned int fp01 = 0;
+#define FP_LOAD( _factor ) fp01 = 2;
+#define FP_CHECK( _factor ) \
+ if ( fp01 != 2 ) \
+ printf("%d: single integer is wrong -- (%d != 2) \n", \
+ task_index, fp01 ); \
+
+#else
+
+#define FP_DECLARE \
+ double fp01 = 1.0; \
+ double fp02 = 2.0; \
+ double fp03 = 3.0; \
+ double fp04 = 4.0; \
+ double fp05 = 5.0; \
+ double fp06 = 6.0; \
+ double fp07 = 7.0; \
+ double fp08 = 8.0; \
+ double fp09 = 9.0; \
+ double fp10 = 10.0; \
+ double fp11 = 11.0; \
+ double fp12 = 12.0; \
+ double fp13 = 13.0; \
+ double fp14 = 14.0; \
+ double fp15 = 15.0; \
+ double fp16 = 16.0; \
+ double fp17 = 17.0; \
+ double fp18 = 18.0; \
+ double fp19 = 19.0; \
+ double fp20 = 20.0; \
+ double fp21 = 21.0; \
+ double fp22 = 22.0; \
+ double fp23 = 23.0; \
+ double fp24 = 24.0; \
+ double fp25 = 25.0; \
+ double fp26 = 26.0; \
+ double fp27 = 27.0; \
+ double fp28 = 28.0; \
+ double fp29 = 29.0; \
+ double fp30 = 30.0; \
+ double fp31 = 31.0; \
+ double fp32 = 32.0
+
+#define FP_LOAD( _factor ) \
+ do { \
+ fp01 += _factor; \
+ fp02 += _factor; \
+ fp03 += _factor; \
+ fp04 += _factor; \
+ fp05 += _factor; \
+ fp06 += _factor; \
+ fp07 += _factor; \
+ fp08 += _factor; \
+ fp09 += _factor; \
+ fp10 += _factor; \
+ fp11 += _factor; \
+ fp12 += _factor; \
+ fp13 += _factor; \
+ fp14 += _factor; \
+ fp15 += _factor; \
+ fp16 += _factor; \
+ fp17 += _factor; \
+ fp18 += _factor; \
+ fp19 += _factor; \
+ fp20 += _factor; \
+ fp21 += _factor; \
+ fp22 += _factor; \
+ fp23 += _factor; \
+ fp24 += _factor; \
+ fp25 += _factor; \
+ fp26 += _factor; \
+ fp27 += _factor; \
+ fp28 += _factor; \
+ fp29 += _factor; \
+ fp30 += _factor; \
+ fp31 += _factor; \
+ fp32 += _factor; \
+ } while (0)
+
+#define EPSILON (0.0005)
+#define FPABS(d) (((d) < 0.0) ? -(d) : (d))
+#define FPNEQ(a,b) (FPABS((a)-(b)) > EPSILON)
+
+#define FP_CHECK_ONE( _v, _base, _factor ) \
+ if ( FPNEQ( (_v), ((_base) + (_factor)) ) ) { \
+ printf("%d: " #_v " wrong -- (%g not %g)\n", \
+ task_index, (_v), (_base + _factor)); \
+ }
+
+
+#define FP_CHECK( _factor ) \
+ do { \
+ FP_CHECK_ONE( fp01, 1.0, (_factor) ); \
+ FP_CHECK_ONE( fp02, 2.0, (_factor) ); \
+ FP_CHECK_ONE( fp03, 3.0, (_factor) ); \
+ FP_CHECK_ONE( fp04, 4.0, (_factor) ); \
+ FP_CHECK_ONE( fp05, 5.0, (_factor) ); \
+ FP_CHECK_ONE( fp06, 6.0, (_factor) ); \
+ FP_CHECK_ONE( fp07, 7.0, (_factor) ); \
+ FP_CHECK_ONE( fp08, 8.0, (_factor) ); \
+ FP_CHECK_ONE( fp09, 9.0, (_factor) ); \
+ FP_CHECK_ONE( fp10, 10.0, (_factor) ); \
+ FP_CHECK_ONE( fp11, 11.0, (_factor) ); \
+ FP_CHECK_ONE( fp12, 12.0, (_factor) ); \
+ FP_CHECK_ONE( fp13, 13.0, (_factor) ); \
+ FP_CHECK_ONE( fp14, 14.0, (_factor) ); \
+ FP_CHECK_ONE( fp15, 15.0, (_factor) ); \
+ FP_CHECK_ONE( fp16, 16.0, (_factor) ); \
+ FP_CHECK_ONE( fp17, 17.0, (_factor) ); \
+ FP_CHECK_ONE( fp18, 18.0, (_factor) ); \
+ FP_CHECK_ONE( fp19, 19.0, (_factor) ); \
+ FP_CHECK_ONE( fp20, 20.0, (_factor) ); \
+ FP_CHECK_ONE( fp21, 21.0, (_factor) ); \
+ FP_CHECK_ONE( fp22, 22.0, (_factor) ); \
+ FP_CHECK_ONE( fp23, 23.0, (_factor) ); \
+ FP_CHECK_ONE( fp24, 24.0, (_factor) ); \
+ FP_CHECK_ONE( fp25, 25.0, (_factor) ); \
+ FP_CHECK_ONE( fp26, 26.0, (_factor) ); \
+ FP_CHECK_ONE( fp27, 27.0, (_factor) ); \
+ FP_CHECK_ONE( fp28, 28.0, (_factor) ); \
+ FP_CHECK_ONE( fp29, 29.0, (_factor) ); \
+ FP_CHECK_ONE( fp30, 30.0, (_factor) ); \
+ FP_CHECK_ONE( fp31, 31.0, (_factor) ); \
+ FP_CHECK_ONE( fp32, 32.0, (_factor) ); \
+ } while (0)
+
+#endif
+
+#endif
diff --git a/c/src/tests/sptests/sp19/init.c b/c/src/tests/sptests/sp19/init.c
new file mode 100644
index 0000000000..016f818da2
--- /dev/null
+++ b/c/src/tests/sptests/sp19/init.c
@@ -0,0 +1,150 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 19 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+ Task_name[ 6 ] = rtems_build_name( 'F', 'P', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_create(
+ Task_name[ 6 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 6 ]
+ );
+ directive_failed( status, "rtems_task_create of FP1" );
+
+ status = rtems_task_start( Task_id[ 6 ], First_FP_task, 0 );
+ directive_failed( status, "rtems_task_start of FP1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_start( Task_id[ 4 ], FP_task, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], FP_task, 0 );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ /*
+ * Load "task dependent factors" in the context areas
+ */
+
+
+ FP_factors[0] = 0.0;
+ FP_factors[1] = 1000.1;
+ FP_factors[2] = 2000.2;
+ FP_factors[3] = 3000.3;
+ FP_factors[4] = 4000.4;
+ FP_factors[5] = 5000.5;
+ FP_factors[6] = 6000.6;
+ FP_factors[7] = 7000.7;
+ FP_factors[8] = 8000.8;
+ FP_factors[9] = 9000.9;
+
+ INTEGER_factors[0] = 0x0000;
+ INTEGER_factors[1] = 0x1000;
+ INTEGER_factors[2] = 0x2000;
+ INTEGER_factors[3] = 0x3000;
+ INTEGER_factors[4] = 0x4000;
+ INTEGER_factors[5] = 0x5000;
+ INTEGER_factors[6] = 0x6000;
+ INTEGER_factors[7] = 0x7000;
+ INTEGER_factors[8] = 0x8000;
+ INTEGER_factors[9] = 0x9000;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA1" );
+}
diff --git a/c/src/tests/sptests/sp19/inttest.h b/c/src/tests/sptests/sp19/inttest.h
new file mode 100644
index 0000000000..f06ede16ce
--- /dev/null
+++ b/c/src/tests/sptests/sp19/inttest.h
@@ -0,0 +1,149 @@
+/* inttest.h
+ *
+ * XXX: ???
+ * This include file contains the CPU dependent implementation
+ * of the following routines needed to test RTEMS floating
+ * point support:
+ * INTEGER_load( &context )
+ * INTEGER_check( &context )
+ *
+ * INTEGER_load - loads the specified floating point context
+ * INTEGER_check - checks the specified floating point context
+ *
+ * NOTE: These routines are VERY CPU dependent and are thus
+ * located in in the CPU dependent include file
+ * inttest.h. These routines form the core of the
+ * floating point context switch test.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __INTEGER_TEST_h
+#define __INTEGER_TEST_h
+
+#include <stdio.h>
+#define REG_VARIABLE rtems_unsigned32
+
+#define INTEGER_DECLARE \
+ REG_VARIABLE int01 = 1; \
+ REG_VARIABLE int02 = 2; \
+ REG_VARIABLE int03 = 3; \
+ REG_VARIABLE int04 = 4; \
+ REG_VARIABLE int05 = 5; \
+ REG_VARIABLE int06 = 6; \
+ REG_VARIABLE int07 = 7; \
+ REG_VARIABLE int08 = 8; \
+ REG_VARIABLE int09 = 9; \
+ REG_VARIABLE int10 = 10; \
+ REG_VARIABLE int11 = 11; \
+ REG_VARIABLE int12 = 12; \
+ REG_VARIABLE int13 = 13; \
+ REG_VARIABLE int14 = 14; \
+ REG_VARIABLE int15 = 15; \
+ REG_VARIABLE int16 = 16; \
+ REG_VARIABLE int17 = 17; \
+ REG_VARIABLE int18 = 18; \
+ REG_VARIABLE int19 = 19; \
+ REG_VARIABLE int20 = 20; \
+ REG_VARIABLE int21 = 21; \
+ REG_VARIABLE int22 = 22; \
+ REG_VARIABLE int23 = 23; \
+ REG_VARIABLE int24 = 24; \
+ REG_VARIABLE int25 = 25; \
+ REG_VARIABLE int26 = 26; \
+ REG_VARIABLE int27 = 27; \
+ REG_VARIABLE int28 = 28; \
+ REG_VARIABLE int29 = 29; \
+ REG_VARIABLE int30 = 30; \
+ REG_VARIABLE int31 = 31; \
+ REG_VARIABLE int32 = 32
+
+#define INTEGER_LOAD( _factor ) \
+ do { \
+ int01 += _factor; \
+ int02 += _factor; \
+ int03 += _factor; \
+ int04 += _factor; \
+ int05 += _factor; \
+ int06 += _factor; \
+ int07 += _factor; \
+ int08 += _factor; \
+ int09 += _factor; \
+ int10 += _factor; \
+ int11 += _factor; \
+ int12 += _factor; \
+ int13 += _factor; \
+ int14 += _factor; \
+ int15 += _factor; \
+ int16 += _factor; \
+ int17 += _factor; \
+ int18 += _factor; \
+ int19 += _factor; \
+ int20 += _factor; \
+ int21 += _factor; \
+ int22 += _factor; \
+ int23 += _factor; \
+ int24 += _factor; \
+ int25 += _factor; \
+ int26 += _factor; \
+ int27 += _factor; \
+ int28 += _factor; \
+ int29 += _factor; \
+ int30 += _factor; \
+ int31 += _factor; \
+ int32 += _factor; \
+ } while (0)
+
+#define INTEGER_CHECK_ONE( _v, _base, _factor ) \
+ if ( (_v) != ((_base) + (_factor)) ) { \
+ printf("%d: " #_v " wrong -- (0x%x not 0x%x)\n", \
+ task_index, (_v), (_base + _factor)); \
+ }
+
+
+#define INTEGER_CHECK( _factor ) \
+ do { \
+ INTEGER_CHECK_ONE( int01, 1, (_factor) ); \
+ INTEGER_CHECK_ONE( int02, 2, (_factor) ); \
+ INTEGER_CHECK_ONE( int03, 3, (_factor) ); \
+ INTEGER_CHECK_ONE( int04, 4, (_factor) ); \
+ INTEGER_CHECK_ONE( int05, 5, (_factor) ); \
+ INTEGER_CHECK_ONE( int06, 6, (_factor) ); \
+ INTEGER_CHECK_ONE( int07, 7, (_factor) ); \
+ INTEGER_CHECK_ONE( int08, 8, (_factor) ); \
+ INTEGER_CHECK_ONE( int09, 9, (_factor) ); \
+ INTEGER_CHECK_ONE( int10, 10, (_factor) ); \
+ INTEGER_CHECK_ONE( int11, 11, (_factor) ); \
+ INTEGER_CHECK_ONE( int12, 12, (_factor) ); \
+ INTEGER_CHECK_ONE( int13, 13, (_factor) ); \
+ INTEGER_CHECK_ONE( int14, 14, (_factor) ); \
+ INTEGER_CHECK_ONE( int15, 15, (_factor) ); \
+ INTEGER_CHECK_ONE( int16, 16, (_factor) ); \
+ INTEGER_CHECK_ONE( int17, 17, (_factor) ); \
+ INTEGER_CHECK_ONE( int18, 18, (_factor) ); \
+ INTEGER_CHECK_ONE( int19, 19, (_factor) ); \
+ INTEGER_CHECK_ONE( int20, 20, (_factor) ); \
+ INTEGER_CHECK_ONE( int21, 21, (_factor) ); \
+ INTEGER_CHECK_ONE( int22, 22, (_factor) ); \
+ INTEGER_CHECK_ONE( int23, 23, (_factor) ); \
+ INTEGER_CHECK_ONE( int24, 24, (_factor) ); \
+ INTEGER_CHECK_ONE( int25, 25, (_factor) ); \
+ INTEGER_CHECK_ONE( int26, 26, (_factor) ); \
+ INTEGER_CHECK_ONE( int27, 27, (_factor) ); \
+ INTEGER_CHECK_ONE( int28, 28, (_factor) ); \
+ INTEGER_CHECK_ONE( int29, 29, (_factor) ); \
+ INTEGER_CHECK_ONE( int30, 30, (_factor) ); \
+ INTEGER_CHECK_ONE( int31, 31, (_factor) ); \
+ INTEGER_CHECK_ONE( int32, 32, (_factor) ); \
+ } while (0)
+
+#endif
diff --git a/c/src/tests/sptests/sp19/sp19.doc b/c/src/tests/sptests/sp19/sp19.doc
new file mode 100644
index 0000000000..75a35ac0d2
--- /dev/null
+++ b/c/src/tests/sptests/sp19/sp19.doc
@@ -0,0 +1,23 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test19
+
+directives:
+
+concepts:
+
+ a. Verifies system can dispatch a mixture of floating point and
+ non-floating point tasks.
diff --git a/c/src/tests/sptests/sp19/sp19.scn b/c/src/tests/sptests/sp19/sp19.scn
new file mode 100644
index 0000000000..d70c8ad89a
--- /dev/null
+++ b/c/src/tests/sptests/sp19/sp19.scn
@@ -0,0 +1,50 @@
+*** TEST 19 ***
+FP1 - integer base = (0x6000)
+FP1 - float base = (6000.6)
+FP1 - integer base = (0x6000)
+FP1 - float base = (6000.6)
+TA1 - integer base = (0x1000)
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - integer base = (0x2000)
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - integer base = (0x3000)
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA4 - integer base = (0x4000)
+TA4 - float base = (4000.4)
+TA4 - rtems_clock_get - 09:00:00 12/31/1988
+TA4 - rtems_clock_get - 09:00:01 12/31/1988
+TA4 - rtems_clock_get - 09:00:02 12/31/1988
+TA4 - rtems_clock_get - 09:00:03 12/31/1988
+TA4 - rtems_clock_get - 09:00:04 12/31/1988
+TA5 - integer base = (0x5000)
+TA5 - float base = (5000.5)
+TA5 - rtems_clock_get - 09:00:04 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA5 - rtems_clock_get - 09:00:05 12/31/1988
+TA4 - rtems_clock_get - 09:00:05 12/31/1988
+TA5 - rtems_clock_get - 09:00:06 12/31/1988
+TA4 - rtems_clock_get - 09:00:06 12/31/1988
+TA5 - rtems_clock_get - 09:00:07 12/31/1988
+TA4 - rtems_clock_get - 09:00:07 12/31/1988
+TA5 - rtems_clock_get - 09:00:08 12/31/1988
+TA4 - rtems_clock_get - 09:00:08 12/31/1988
+TA5 - rtems_clock_get - 09:00:09 12/31/1988
+TA4 - rtems_clock_get - 09:00:09 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA5 - rtems_clock_get - 09:00:10 12/31/1988
+TA4 - rtems_clock_get - 09:00:10 12/31/1988
+TA5 - rtems_clock_get - 09:00:11 12/31/1988
+TA4 - rtems_clock_get - 09:00:11 12/31/1988
+TA5 - rtems_clock_get - 09:00:12 12/31/1988
+TA4 - rtems_clock_get - 09:00:12 12/31/1988
+TA5 - rtems_clock_get - 09:00:13 12/31/1988
+TA4 - rtems_clock_get - 09:00:13 12/31/1988
+TA5 - rtems_clock_get - 09:00:14 12/31/1988
+TA4 - rtems_clock_get - 09:00:14 12/31/1988
+TA3 - rtems_clock_get - 09:00:15 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+TA5 - rtems_clock_get - 09:00:15 12/31/1988
+TA4 - rtems_clock_get - 09:00:15 12/31/1988
+TA5 - rtems_task_delete - TA3
+*** END OF TEST 19 ***
diff --git a/c/src/tests/sptests/sp19/system.h b/c/src/tests/sptests/sp19/system.h
new file mode 100644
index 0000000000..36571c52a1
--- /dev/null
+++ b/c/src/tests/sptests/sp19/system.h
@@ -0,0 +1,57 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task First_FP_task(
+ rtems_task_argument argument
+);
+
+rtems_task FP_task(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 7 ]; /* array of task ids */
+TEST_EXTERN rtems_id Task_name[ 7 ]; /* array of task names */
+
+TEST_EXTERN rtems_double FP_factors[ 10 ]; /* FP "uniqueness" factors */
+TEST_EXTERN rtems_unsigned32 INTEGER_factors[ 10 ]; /* INT "uniqueness" factors */
+/* end of include file */
diff --git a/c/src/tests/sptests/sp19/task1.c b/c/src/tests/sptests/sp19/task1.c
new file mode 100644
index 0000000000..6337538f87
--- /dev/null
+++ b/c/src/tests/sptests/sp19/task1.c
@@ -0,0 +1,59 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include "inttest.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ INTEGER_DECLARE;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ task_index = task_number( tid );
+
+ INTEGER_LOAD( INTEGER_factors[ task_index ] );
+
+ put_name( Task_name[ task_index ], FALSE );
+ printf( " - integer base = (0x%x)\n", INTEGER_factors[ task_index ] );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ INTEGER_CHECK( INTEGER_factors[ task_index ] );
+
+ status = rtems_task_wake_after(
+ ( task_number( tid ) ) * 5 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/c/src/tests/sptests/sp20/Makefile.in b/c/src/tests/sptests/sp20/Makefile.in
new file mode 100644
index 0000000000..fee3c2f3db
--- /dev/null
+++ b/c/src/tests/sptests/sp20/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp20
+
+MANAGERS=io rate_monotonic
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init getall task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp20/getall.c b/c/src/tests/sptests/sp20/getall.c
new file mode 100644
index 0000000000..26465e3919
--- /dev/null
+++ b/c/src/tests/sptests/sp20/getall.c
@@ -0,0 +1,43 @@
+/* Get_all_counters
+ *
+ * This routine allows TA5 to atomically obtain the iteration counters.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Get_all_counters()
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode to RTEMS_NO_PREEMPT" );
+
+ Temporary_count = Count;
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_mode( RTEMS_PREEMPT, RTEMS_PREEMPT_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode to RTEMS_PREEMPT" );
+}
diff --git a/c/src/tests/sptests/sp20/init.c b/c/src/tests/sptests/sp20/init.c
new file mode 100644
index 0000000000..6fddd21688
--- /dev/null
+++ b/c/src/tests/sptests/sp20/init.c
@@ -0,0 +1,68 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 20 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_create(
+ Task_name[ index ],
+ Priorities[ index ],
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+ }
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_start( Task_id[ index ], Task_1_through_5, index );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp20/sp20.doc b/c/src/tests/sptests/sp20/sp20.doc
new file mode 100644
index 0000000000..9653ff4fa9
--- /dev/null
+++ b/c/src/tests/sptests/sp20/sp20.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test20
+
+directives:
+
+ rm_create, rm_period
+
+concepts:
+
+ a. Verifies Rate Monotonic Manager behavior.
diff --git a/c/src/tests/sptests/sp20/sp20.scn b/c/src/tests/sptests/sp20/sp20.scn
new file mode 100644
index 0000000000..bb4e8814da
--- /dev/null
+++ b/c/src/tests/sptests/sp20/sp20.scn
@@ -0,0 +1,27 @@
+*** TEST 20 ***
+TA1 - rtems_rate_monotonic_create id = 0x28010001
+TA1 - rtems_rate_monotonic_ident id = 0x28010001
+TA1 - (0x28010001) period 2
+TA2 - rtems_rate_monotonic_create id = 0x28010002
+TA2 - rtems_rate_monotonic_ident id = 0x28010002
+TA2 - (0x28010002) period 2
+TA3 - rtems_rate_monotonic_create id = 0x28010003
+TA3 - rtems_rate_monotonic_ident id = 0x28010003
+TA3 - (0x28010003) period 2
+TA4 - rtems_rate_monotonic_create id = 0x28010004
+TA4 - rtems_rate_monotonic_ident id = 0x28010004
+TA4 - (0x28010004) period 2
+TA5 - rtems_rate_monotonic_create id = 0x28010005
+TA5 - rtems_rate_monotonic_ident id = 0x28010005
+TA5 - (0x28010005) period 100
+TA5 - PERIODS CHECK OK (1)
+TA5 - PERIODS CHECK OK (2)
+TA5 - PERIODS CHECK OK (3)
+TA5 - PERIODS CHECK OK (4)
+TA5 - PERIODS CHECK OK (5)
+TA5 - PERIODS CHECK OK (6)
+TA5 - PERIODS CHECK OK (7)
+TA5 - PERIODS CHECK OK (8)
+TA5 - PERIODS CHECK OK (9)
+TA5 - PERIODS CHECK OK (10)
+*** END OF TEST 20 ***
diff --git a/c/src/tests/sptests/sp20/system.h b/c/src/tests/sptests/sp20/system.h
new file mode 100644
index 0000000000..4563730893
--- /dev/null
+++ b/c/src/tests/sptests/sp20/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* types */
+
+struct counters {
+ rtems_unsigned32 count[6];
+};
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+);
+
+void Get_all_counters( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INIT_TASK_PRIORITY 10
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+#define CONFIGURE_MAXIMUM_PERIODS 10
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN struct counters Count; /* iteration counters */
+TEST_EXTERN struct counters Temporary_count;
+extern rtems_task_priority Priorities[ 6 ];
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp20/task1.c b/c/src/tests/sptests/sp20/task1.c
new file mode 100644
index 0000000000..71dd53021e
--- /dev/null
+++ b/c/src/tests/sptests/sp20/task1.c
@@ -0,0 +1,116 @@
+/* Task_1_through_5
+ *
+ * This routine serves as a test task for the period capabilities of the
+ * Rate Monotonic Manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_unsigned32 Periods[6] = { 0, 2, 2, 2, 2, 100 };
+rtems_unsigned32 Iterations[6] = { 0, 50, 50, 50, 50, 1 };
+rtems_task_priority Priorities[6] = { 0, 1, 1, 3, 4, 5 };
+
+rtems_task Task_1_through_5(
+ rtems_unsigned32 argument
+)
+{
+ rtems_id rmid;
+ rtems_id test_rmid;
+ rtems_unsigned32 index;
+ rtems_unsigned32 pass;
+ rtems_unsigned32 failed;
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( argument, &rmid );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_create id = 0x%08x\n", rmid );
+
+ status = rtems_rate_monotonic_ident( argument, &test_rmid );
+ directive_failed( status, "rtems_rate_monotonic_ident" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_ident id = 0x%08x\n", test_rmid );
+
+ if ( rmid != test_rmid ) {
+ printf( "RMID's DO NOT MATCH (0x%x and 0x%x)\n", rmid, test_rmid );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- (0x%08x) period %d\n", rmid, Periods[ argument ] );
+
+ status = rtems_task_wake_after( 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ switch ( argument ) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ while ( FOREVER ) {
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+ Count.count[ argument ]++;
+ }
+ break;
+ case 5:
+ pass = 0;
+ failed = 0;
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 1 of TA5" );
+
+ Get_all_counters();
+
+ while ( FOREVER ) {
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 2 of TA5" );
+
+ Get_all_counters();
+
+ for( index = 1 ; index <= 4 ; index++ ) {
+ if ( Temporary_count.count[ index ] != Iterations[ index ] ) {
+ puts_nocr( "FAIL -- " );
+ put_name ( Task_name[ index ], FALSE );
+ printf ( " Actual=%d, Expected=%d\n",
+ Temporary_count.count[ index ],
+ Iterations[ index ]
+ );
+ failed += 1;
+ }
+ }
+
+ if ( failed == 5 )
+ exit( 0 );
+
+ pass += 1;
+
+ printf( "TA5 - PERIODS CHECK OK (%d)\n", pass );
+
+ fflush( stdout );
+
+ if ( pass == 10 ) {
+ puts( "*** END OF TEST 20 ***" );
+ exit( 0 );
+ }
+
+ }
+ break;
+ }
+}
diff --git a/c/src/tests/sptests/sp21/Makefile.in b/c/src/tests/sptests/sp21/Makefile.in
new file mode 100644
index 0000000000..6efca68765
--- /dev/null
+++ b/c/src/tests/sptests/sp21/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp21
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp21/init.c b/c/src/tests/sptests/sp21/init.c
new file mode 100644
index 0000000000..63a6e5ed0d
--- /dev/null
+++ b/c/src/tests/sptests/sp21/init.c
@@ -0,0 +1,53 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 21 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp21/sp21.doc b/c/src/tests/sptests/sp21/sp21.doc
new file mode 100644
index 0000000000..08f1b03c53
--- /dev/null
+++ b/c/src/tests/sptests/sp21/sp21.doc
@@ -0,0 +1,28 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test21
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_delete
+ de_init, de_open, de_close, de_read, de_write, de_cntrl
+
+concepts:
+
+ a. Verifies all I/O manager directives always return successful for
+ null drivers.
+
+ b. Verifies all I/O manager directives call and return from the driver
+ entry points in the driver address table.
diff --git a/c/src/tests/sptests/sp21/sp21.scn b/c/src/tests/sptests/sp21/sp21.scn
new file mode 100644
index 0000000000..c6392e3ea3
--- /dev/null
+++ b/c/src/tests/sptests/sp21/sp21.scn
@@ -0,0 +1,19 @@
+*** TEST 21 ***
+----- TESTING THE NULL DRIVER CHECKS -----
+TA1 - rtems_io_initialize - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_open - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_close - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_read - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_write - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_control - NULL DRIVER RTEMS_SUCCESSFUL
+----- TESTING THE I/O MANAGER DIRECTIVES -----
+TA1 - rtems_io_initialize - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_open - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_close - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_read - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_write - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_control - STUB DRIVER RTEMS_SUCCESSFUL
+----- RETURNING INVALID MAJOR NUMBER -----
+TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_open - RTEMS_INVALID_NUMBER
+*** END OF TEST 21 ***
diff --git a/c/src/tests/sptests/sp21/system.h b/c/src/tests/sptests/sp21/system.h
new file mode 100644
index 0000000000..b48bd1ea2a
--- /dev/null
+++ b/c/src/tests/sptests/sp21/system.h
@@ -0,0 +1,46 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_TEST_NEEDS_STUB_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp21/task1.c b/c/src/tests/sptests/sp21/task1.c
new file mode 100644
index 0000000000..3106ad6a88
--- /dev/null
+++ b/c/src/tests/sptests/sp21/task1.c
@@ -0,0 +1,105 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the I/O manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define STUB_DRIVER_MAJOR 0x2
+#define NO_DRIVER_MAJOR 0x3
+#define INVALID_DRIVER_MAJOR 0x5
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "----- TESTING THE NULL DRIVER CHECKS -----" );
+
+ status = rtems_io_initialize( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_initialize" );
+ puts( "TA1 - rtems_io_initialize - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_open( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_open" );
+ puts( "TA1 - rtems_io_open - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_close( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_close" );
+ puts( "TA1 - rtems_io_close - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_read( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_read" );
+ puts( "TA1 - rtems_io_read - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_write( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_write" );
+ puts( "TA1 - rtems_io_write - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_control( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_control" );
+ puts( "TA1 - rtems_io_control - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ puts( "----- TESTING THE I/O MANAGER DIRECTIVES -----" );
+
+ status = rtems_io_initialize( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_initialize" );
+ puts( "TA1 - rtems_io_initialize - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_open( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_open" );
+ puts( "TA1 - rtems_io_open - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_close( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_close" );
+ puts( "TA1 - rtems_io_close - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_read( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_read" );
+ puts( "TA1 - rtems_io_read - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_write( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_write" );
+ puts( "TA1 - rtems_io_write - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_control( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_control" );
+ puts( "TA1 - rtems_io_control - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ puts( "----- RETURNING INVALID MAJOR NUMBER -----" );
+
+ status = rtems_io_initialize( INVALID_DRIVER_MAJOR, 0, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_initialize"
+ );
+ puts( "TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_io_open( INVALID_DRIVER_MAJOR, 0, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_open"
+ );
+ puts( "TA1 - rtems_io_open - RTEMS_INVALID_NUMBER" );
+
+ puts( "*** END OF TEST 21 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp22/Makefile.in b/c/src/tests/sptests/sp22/Makefile.in
new file mode 100644
index 0000000000..7b2cc2dba3
--- /dev/null
+++ b/c/src/tests/sptests/sp22/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp22
+
+MANAGERS=io timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init prtime delay task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp22/delay.c b/c/src/tests/sptests/sp22/delay.c
new file mode 100644
index 0000000000..f63fb1877a
--- /dev/null
+++ b/c/src/tests/sptests/sp22/delay.c
@@ -0,0 +1,32 @@
+/* Delayed_resume
+ *
+ * This routine is scheduled to be fired as a timer service routine.
+ * When fired this subprogram resumes Task_1.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_resume(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_resume( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_resume of self" );
+}
diff --git a/c/src/tests/sptests/sp22/init.c b/c/src/tests/sptests/sp22/init.c
new file mode 100644
index 0000000000..1c3459254f
--- /dev/null
+++ b/c/src/tests/sptests/sp22/init.c
@@ -0,0 +1,66 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 22 ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ puts( "INIT - rtems_timer_create - creating timer 1" );
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ printf( "INIT - timer 1 has id (0x%x)\n", Timer_id[ 1 ] );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp22/prtime.c b/c/src/tests/sptests/sp22/prtime.c
new file mode 100644
index 0000000000..58b3aa66f8
--- /dev/null
+++ b/c/src/tests/sptests/sp22/prtime.c
@@ -0,0 +1,32 @@
+/* Print_time
+ *
+ * This routine prints the name of Task_1 and the current time of day.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Print_time( void )
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( "- rtems_clock_get - ", &time, "\n" );
+}
diff --git a/c/src/tests/sptests/sp22/sp22.doc b/c/src/tests/sptests/sp22/sp22.doc
new file mode 100644
index 0000000000..3b319ec311
--- /dev/null
+++ b/c/src/tests/sptests/sp22/sp22.doc
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test22
+
+directives:
+
+concepts:
diff --git a/c/src/tests/sptests/sp22/sp22.scn b/c/src/tests/sptests/sp22/sp22.scn
new file mode 100644
index 0000000000..6fb08156c5
--- /dev/null
+++ b/c/src/tests/sptests/sp22/sp22.scn
@@ -0,0 +1,29 @@
+*** TEST 22 ***
+INIT - rtems_timer_create - creating timer 1
+INIT - timer 1 has id (0x10010001)
+TA1 - rtems_timer_ident - identing timer 1
+TA1 - timer 1 has id (0x10010001)
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_timer_fire_after - timer 1 in 3 seconds
+TA1 - rtems_task_suspend( RTEMS_SELF )
+TA1 - rtems_clock_get - 09:00:03 12/31/1988
+TA1 - rtems_timer_fire_after - timer 1 in 3 seconds
+TA1 - rtems_task_wake_after - 1 second
+TA1 - rtems_clock_get - 09:00:04 12/31/1988
+TA1 - rtems_timer_reset - timer 1
+TA1 - rtems_task_suspend( RTEMS_SELF )
+TA1 - rtems_clock_get - 09:00:07 12/31/1988
+<pause>
+TA1 - rtems_timer_fire_after - timer 1 in 3 seconds
+TA1 - rtems_timer_cancel - timer 1
+TA1 - rtems_clock_get - 09:00:07 12/31/1988
+TA1 - rtems_timer_fire_when - timer 1 in 3 seconds
+TA1 - rtems_task_suspend( RTEMS_SELF )
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_timer_fire_when - timer 1 in 3 seconds
+TA1 - rtems_task_wake_after - 1 second
+TA1 - rtems_clock_get - 09:00:11 12/31/1988
+TA1 - rtems_timer_cancel - timer 1
+TA1 - rtems_task_wake_after - YIELD (only task at priority)
+TA1 - timer_deleting - timer 1
+*** END OF TEST 22 ***
diff --git a/c/src/tests/sptests/sp22/system.h b/c/src/tests/sptests/sp22/system.h
new file mode 100644
index 0000000000..5911cb1622
--- /dev/null
+++ b/c/src/tests/sptests/sp22/system.h
@@ -0,0 +1,57 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Delayed_resume(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+void Print_time( void );
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 2
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp22/task1.c b/c/src/tests/sptests/sp22/task1.c
new file mode 100644
index 0000000000..cd05c36273
--- /dev/null
+++ b/c/src/tests/sptests/sp22/task1.c
@@ -0,0 +1,164 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id tmid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+/* Get id */
+
+ puts( "TA1 - rtems_timer_ident - identing timer 1" );
+ status = rtems_timer_ident( Timer_name[ 1 ], &tmid );
+ directive_failed( status, "rtems_timer_ident" );
+ printf( "TA1 - timer 1 has id (0x%x)\n", tmid );
+
+/* after which is allowed to fire */
+
+ Print_time();
+
+ puts( "TA1 - rtems_timer_fire_after - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_after(
+ tmid,
+ 3 * TICKS_PER_SECOND,
+ Delayed_resume,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - rtems_task_suspend( RTEMS_SELF )" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ Print_time();
+
+/* after which is reset and allowed to fire */
+
+ puts( "TA1 - rtems_timer_fire_after - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_after(
+ tmid,
+ 3 * TICKS_PER_SECOND,
+ Delayed_resume,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - rtems_task_wake_after - 1 second" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Print_time();
+
+ puts( "TA1 - rtems_timer_reset - timer 1" );
+ status = rtems_timer_reset( tmid );
+ directive_failed( status, "rtems_timer_reset" );
+
+ puts( "TA1 - rtems_task_suspend( RTEMS_SELF )" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ Print_time();
+
+ rtems_test_pause();
+
+ /*
+ * Reset the time since we do not know how long the user waited
+ * before pressing <cr> at the pause. This insures that the
+ * actual output matches the screen.
+ */
+
+ build_time( &time, 12, 31, 1988, 9, 0, 7, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+/* after which is canceled */
+
+ puts( "TA1 - rtems_timer_fire_after - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_after(
+ tmid,
+ 3 * TICKS_PER_SECOND,
+ Delayed_resume,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - rtems_timer_cancel - timer 1" );
+ status = rtems_timer_cancel( tmid );
+ directive_failed( status, "rtems_timer_cancel" );
+
+/* when which is allowed to fire */
+
+ Print_time();
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ time.second += 3;
+
+ puts( "TA1 - rtems_timer_fire_when - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_when( tmid, &time, Delayed_resume, NULL );
+ directive_failed( status, "rtems_timer_fire_when" );
+
+ puts( "TA1 - rtems_task_suspend( RTEMS_SELF )" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ Print_time();
+
+/* when which is canceled */
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ time.second += 3;
+
+ puts( "TA1 - rtems_timer_fire_when - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_when( tmid, &time, Delayed_resume, NULL );
+ directive_failed( status, "rtems_timer_fire_when" );
+
+ puts( "TA1 - rtems_task_wake_after - 1 second" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Print_time();
+
+ puts( "TA1 - rtems_timer_cancel - timer 1" );
+ status = rtems_timer_cancel( tmid );
+ directive_failed( status, "rtems_timer_cancel" );
+
+/* delete */
+ puts( "TA1 - rtems_task_wake_after - YIELD (only task at priority)" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - timer_deleting - timer 1" );
+ status = rtems_timer_delete( tmid );
+ directive_failed( status, "rtems_timer_delete" );
+
+ puts( "*** END OF TEST 22 *** " );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp23/Makefile.in b/c/src/tests/sptests/sp23/Makefile.in
new file mode 100644
index 0000000000..51e626559c
--- /dev/null
+++ b/c/src/tests/sptests/sp23/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp23
+
+MANAGERS=io dual_ported_memory
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp23/init.c b/c/src/tests/sptests/sp23/init.c
new file mode 100644
index 0000000000..ddb9f51236
--- /dev/null
+++ b/c/src/tests/sptests/sp23/init.c
@@ -0,0 +1,69 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 23 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ Port_name[ 1 ] = rtems_build_name( 'D', 'P', '1', ' ' );
+
+ status = rtems_port_create(
+ Port_name[ 1 ],
+ Internal_port_area,
+ External_port_area,
+ 0xff,
+ &Port_id[ 1 ]
+ );
+ directive_failed( status, "rtems_port_create of DP1" );
+
+ printf( "INIT - rtems_port_create - DP1 - int = %p ext = %p\n",
+ Internal_port_area,
+ External_port_area
+ );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp23/sp23.doc b/c/src/tests/sptests/sp23/sp23.doc
new file mode 100644
index 0000000000..78bbc6f8cb
--- /dev/null
+++ b/c/src/tests/sptests/sp23/sp23.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test23
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_delete,
+ m_ext2int, m_int2ext
+
+concepts:
+
+ a. Verifies the dual ported RAM directives work correctly.
+
+output:
diff --git a/c/src/tests/sptests/sp23/sp23.scn b/c/src/tests/sptests/sp23/sp23.scn
new file mode 100644
index 0000000000..7d9f8ff898
--- /dev/null
+++ b/c/src/tests/sptests/sp23/sp23.scn
@@ -0,0 +1,9 @@
+*** TEST 23 ***
+INIT - rtems_port_create - DP1 - int = 0x1000 ext = 0x2000
+TA1 - rtems_port_ident - 0x24010001
+TA1 - rtems_port_external_to_internal - 0x200e => 0x100e
+TA1 - rtems_port_internal_to_external - 0x100e => 0x200e
+TA1 - rtems_port_external_to_internal - 0x300e => 0x300e
+TA1 - rtems_port_internal_to_external - 0x50e => 0x50e
+TA1 - rtems_port_delete - DP1
+*** END OF TEST 23 ***
diff --git a/c/src/tests/sptests/sp23/system.h b/c/src/tests/sptests/sp23/system.h
new file mode 100644
index 0000000000..680088dd71
--- /dev/null
+++ b/c/src/tests/sptests/sp23/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_PORTS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 2 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 2 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Port_id[ 2 ]; /* array of port ids */
+TEST_EXTERN rtems_name Port_name[ 2 ]; /* array of port names */
+
+#define Internal_port_area ((rtems_unsigned8 *) 0x00001000)
+#define External_port_area ((rtems_unsigned8 *) 0x00002000)
+
+#define Below_port_area ((rtems_unsigned8 *) 0x00000500)
+#define Above_port_area ((rtems_unsigned8 *) 0x00003000)
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp23/task1.c b/c/src/tests/sptests/sp23/task1.c
new file mode 100644
index 0000000000..cf1906ef37
--- /dev/null
+++ b/c/src/tests/sptests/sp23/task1.c
@@ -0,0 +1,96 @@
+/* Task_1
+ *
+ * This task verifies that the dual ported RAM directives work
+ * correctly by converting external addresses to internal addresses and
+ * internal addresses to external addresses.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id dpid;
+ void *to_be_converted;
+ void *converted;
+ rtems_status_code status;
+
+ status = rtems_port_ident( Port_name[ 1 ], &dpid );
+ directive_failed( status, "rtems_port_ident" );
+ printf( "TA1 - rtems_port_ident - 0x%08x\n", dpid );
+
+ to_be_converted = &External_port_area[ 0xe ];
+ status = rtems_port_external_to_internal(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_external_to_internal" );
+ printf(
+ "TA1 - rtems_port_external_to_internal - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ to_be_converted = &Internal_port_area[ 0xe ];
+ status = rtems_port_internal_to_external(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_internal_to_external" );
+ printf(
+ "TA1 - rtems_port_internal_to_external - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ to_be_converted = &Above_port_area[ 0xe ];
+ status = rtems_port_external_to_internal(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_external_to_internal" );
+ printf(
+ "TA1 - rtems_port_external_to_internal - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ to_be_converted = &Below_port_area[ 0xe ];
+ status = rtems_port_internal_to_external(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_internal_to_external" );
+ printf(
+ "TA1 - rtems_port_internal_to_external - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ status = rtems_port_delete( Port_id[ 1 ] );
+ directive_failed( status, "rtems_port_delete" );
+ puts( "TA1 - rtems_port_delete - DP1" );
+
+ puts( "*** END OF TEST 23 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/sp24/Makefile.in b/c/src/tests/sptests/sp24/Makefile.in
new file mode 100644
index 0000000000..5deaad020f
--- /dev/null
+++ b/c/src/tests/sptests/sp24/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp24
+
+MANAGERS=io event timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init resume task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp24/init.c b/c/src/tests/sptests/sp24/init.c
new file mode 100644
index 0000000000..1741f80cb0
--- /dev/null
+++ b/c/src/tests/sptests/sp24/init.c
@@ -0,0 +1,76 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 24 ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+ Timer_name[ 2 ] = rtems_build_name( 'T', 'M', '2', ' ' );
+ Timer_name[ 3 ] = rtems_build_name( 'T', 'M', '3', ' ' );
+
+ for ( index = 1 ; index <= 3 ; index++ ) {
+ status = rtems_task_create(
+ Task_name[ index ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ status = rtems_timer_create(
+ Timer_name[ index ],
+ &Timer_id[ index ]
+ );
+ directive_failed( status, "rtems_timer_create loop" );
+ }
+
+ for ( index = 1 ; index <= 3 ; index++ ) {
+ status = rtems_task_start( Task_id[ index ], Task_1_through_3, index );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp24/resume.c b/c/src/tests/sptests/sp24/resume.c
new file mode 100644
index 0000000000..8c975c5460
--- /dev/null
+++ b/c/src/tests/sptests/sp24/resume.c
@@ -0,0 +1,34 @@
+/* Resume_task
+ *
+ * This subprogram is scheduled as a timer service routine. When
+ * it fires it resumes the task which is mapped to this timer.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Resume_task(
+ rtems_id timer_id,
+ void *ignored_address
+)
+{
+ rtems_id task_to_resume;
+ rtems_status_code status;
+
+ task_to_resume = Task_id[ rtems_get_index( timer_id ) ];
+ status = rtems_task_resume( task_to_resume );
+ directive_failed( status, "rtems_task_resume" );
+}
diff --git a/c/src/tests/sptests/sp24/sp24.doc b/c/src/tests/sptests/sp24/sp24.doc
new file mode 100644
index 0000000000..d848553c93
--- /dev/null
+++ b/c/src/tests/sptests/sp24/sp24.doc
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test24
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ ev_receive
+
+concepts:
+
+ a. This test is a cyclic version of test1. The times printed by
+ each test should not skew as in test1 (see output section).
+
+ b. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ c. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ d. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ e. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ f. Verifies executive initialization performed correctly.
+
+ g. Verifies the executive trap handler except for the halt function.
+
+ h. Verifies that a task can get the task identification number of itself.
+
+output:
+ "TA1" is printed once every 5 seconds. "TA2" is printed once
+ every 10 seconds. "TA3" is printed once every 15 seconds.
+
+ The times printed should be multiples of 5 seconds for TA1, 10 seconds
+ for TA2, and 15 seconds for TA3. If this does not happen, the calendar
+ time does not correspond correctly to the number of ticks.
diff --git a/c/src/tests/sptests/sp24/sp24.scn b/c/src/tests/sptests/sp24/sp24.scn
new file mode 100644
index 0000000000..96a58f35e3
--- /dev/null
+++ b/c/src/tests/sptests/sp24/sp24.scn
@@ -0,0 +1,16 @@
+*** TEST 24 ***
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA3 - rtems_clock_get - 09:00:15 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+TA2 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:25 12/31/1988
+TA3 - rtems_clock_get - 09:00:30 12/31/1988
+TA2 - rtems_clock_get - 09:00:30 12/31/1988
+TA1 - rtems_clock_get - 09:00:30 12/31/1988
+*** END OF TEST 24 ***
diff --git a/c/src/tests/sptests/sp24/system.h b/c/src/tests/sptests/sp24/system.h
new file mode 100644
index 0000000000..a22c7cc021
--- /dev/null
+++ b/c/src/tests/sptests/sp24/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Resume_task(
+ rtems_id timer_id,
+ void *ignored_address
+);
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 3
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* array of timer names */
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp24/task1.c b/c/src/tests/sptests/sp24/task1.c
new file mode 100644
index 0000000000..19892d5aed
--- /dev/null
+++ b/c/src/tests/sptests/sp24/task1.c
@@ -0,0 +1,58 @@
+/* Task_1_through_3
+ *
+ * This task is a cyclic version of test1 to asssure that the times
+ * displayed are not skewed as in test1. "TA1" is printed once every
+ * 5 seconds, "TA2" is printed once every 10 seconds, and "TA3" is
+ * printed once every 15 seconds. The times displayed should be
+ * in multiples of 5, 10, and 15 for TA1, TA2, and TA3 respectively.
+ * If the times are skewed from these values, then the calendar time
+ * does not correspond correctly with the number of ticks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident of self" );
+
+ while ( FOREVER ) {
+ status = rtems_timer_fire_after(
+ Timer_id[ argument ],
+ task_number( tid ) * 5 * TICKS_PER_SECOND,
+ Resume_task,
+ NULL
+ );
+ directive_failed( status, "tm_fire_after failed" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get failed" );
+
+ if ( time.second >= 35 ) {
+ puts( "*** END OF TEST 24 ***" );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+ }
+}
diff --git a/c/src/tests/sptests/sp25/Makefile.in b/c/src/tests/sptests/sp25/Makefile.in
new file mode 100644
index 0000000000..212eb3106a
--- /dev/null
+++ b/c/src/tests/sptests/sp25/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=sp25
+
+MANAGERS=io region
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests/$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/sp25/init.c b/c/src/tests/sptests/sp25/init.c
new file mode 100644
index 0000000000..afb5e6f50e
--- /dev/null
+++ b/c/src/tests/sptests/sp25/init.c
@@ -0,0 +1,66 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 25 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ Region_name[ 1 ] = rtems_build_name('R', 'N', '0', '1');
+
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Area_1,
+ sizeof( Area_1 ),
+ 64,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 1 ]
+ );
+ directive_failed( status, "rtems_region_create of RN1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/sp25/sp25.doc b/c/src/tests/sptests/sp25/sp25.doc
new file mode 100644
index 0000000000..f9e6d621e1
--- /dev/null
+++ b/c/src/tests/sptests/sp25/sp25.doc
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test25
+
+directives:
+ task_create
+ task_start
+ task_delete
+ region_create
+ region_ident
+ region_get_segment
+ region_return_segment
+ region_delete
+
+concepts:
+
+ a. Verifies that the heap maintains it's integrity trhough a series
+ on region_get_segments and region_return_segments.
+
diff --git a/c/src/tests/sptests/sp25/sp25.scn b/c/src/tests/sptests/sp25/sp25.scn
new file mode 100644
index 0000000000..af2599663d
--- /dev/null
+++ b/c/src/tests/sptests/sp25/sp25.scn
@@ -0,0 +1,29 @@
+*** TEST 25 ***
+TA1 - rtems_region_ident - 0x20010002
+TA1 - rtems_region_get_segment - wait on 64 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f9b8
+TA1 - rtems_region_get_segment - wait on 128 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f930
+TA1 - rtems_region_get_segment - wait on 256 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f828
+TA1 - rtems_region_get_segment - wait on 512 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f620
+TA1 - rtems_region_get_segment - wait on 1024 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f218
+TA1 - rtems_region_get_segment - wait on 2048 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000ea10
+TA1 - rtems_region_get_segment - wait on 4096 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000da08
+TA1 - rtems_region_get_segment - wait on 8192 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000ba00
+<pause>
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f828
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f620
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f9b8
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f930
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000da08
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000ea10
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000ba00
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f218
+TA1 - rtems_region_delete - walks heap if debug enabled
+*** END OF TEST 25 ***
diff --git a/c/src/tests/sptests/sp25/system.h b/c/src/tests/sptests/sp25/system.h
new file mode 100644
index 0000000000..b1eed6cf0f
--- /dev/null
+++ b/c/src/tests/sptests/sp25/system.h
@@ -0,0 +1,57 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_REGIONS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+TEST_EXTERN rtems_id Region_id[ 2 ]; /* array of region ids */
+TEST_EXTERN rtems_name Region_name[ 2 ]; /* array of region names */
+
+TEST_EXTERN rtems_unsigned8 Area_1[64000] CPU_STRUCTURE_ALIGNMENT;
+
+#define BASE_PRIORITY 140
+
+#define Put_address_from_area_1( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_1 ) )
+
+/* end of include file */
diff --git a/c/src/tests/sptests/sp25/task1.c b/c/src/tests/sptests/sp25/task1.c
new file mode 100644
index 0000000000..e279d5c401
--- /dev/null
+++ b/c/src/tests/sptests/sp25/task1.c
@@ -0,0 +1,241 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the region manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ void *address_1;
+ void *address_2;
+ void *address_3;
+ void *address_4;
+ void *address_5;
+ void *address_6;
+ void *address_7;
+ void *address_8;
+ rtems_status_code status;
+ rtems_id region_id;
+
+ status = rtems_region_ident(Region_name[ 1 ], &region_id);
+ printf( "TA1 - rtems_region_ident - 0x%08x\n", region_id );
+ directive_failed(status, "rtems_region_ident of RN01");
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 64 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 64,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_1 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 128 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 128,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_2 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 256 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 256,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_3
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_3 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 512 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 512,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_4
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_4 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 1024 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 1024,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_5
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_5 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 2048 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 2048,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_6
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_6 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 4096 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 4096,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_7
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_7 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 8192 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 8192,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_8
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_8 );
+ new_line;
+
+rtems_test_pause();
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_3 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_3 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_4 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_4 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_4 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_1 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_1 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_2 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_2 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_7 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_7 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_7 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_6 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_6 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_6 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_8 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_8 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_8 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_5 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_5 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_5 = 0;
+
+ puts( "TA1 - rtems_region_delete - walks heap if debug enabled" );
+ rtems_region_delete(Region_id[ 1 ]);
+
+ puts( "*** END OF TEST 25 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/sptests/spfatal/Makefile.in b/c/src/tests/sptests/spfatal/Makefile.in
new file mode 100644
index 0000000000..5ecae443ec
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/Makefile.in
@@ -0,0 +1,62 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=spfatal
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init puterr fatal task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=scn doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+ $(INSTALL) $(srcdir)/$(TEST).scn \
+ ${PROJECT_RELEASE}/tests/screens/sptests//$(TEST).scn
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/spfatal/fatal.c b/c/src/tests/sptests/spfatal/fatal.c
new file mode 100644
index 0000000000..6a996ed50b
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/fatal.c
@@ -0,0 +1,136 @@
+/* Fatal Error Test
+ *
+ * NOTE:
+ *
+ * This test actually modifies the Configuration table and restarts
+ * the executive. It is very carefully constructed to do this and
+ * uses the Configuration very carefully.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#include <setjmp.h>
+
+char Workspace[ 64 * 1024 ] CPU_STRUCTURE_ALIGNMENT;
+
+typedef enum {
+ FATAL_WORKSPACE_OF_ZERO,
+ FATAL_NULL_WORKSPACE,
+ FATAL_WORKSPACE_TOO_SMALL,
+ FATAL_TASK_CREATE,
+ FATAL_TASK_START
+} Fatal_errors_t;
+
+#define FATAL_LAST FATAL_TASK_START
+
+volatile Fatal_errors_t Case_in_switch;
+
+rtems_status_code Expected_Errors[] = {
+ RTEMS_UNSATISFIED,
+ RTEMS_INVALID_ADDRESS,
+ RTEMS_UNSATISFIED,
+ RTEMS_INVALID_PRIORITY,
+ RTEMS_TASK_EXITTED
+};
+
+rtems_status_code Error_Happened[ FATAL_LAST + 1];
+
+jmp_buf Restart_Context;
+
+/*
+ * We depend on this being zeroed during initialization. This
+ * occurs automatically because this is part of the BSS.
+ */
+
+rtems_unsigned32 First_Time_Through;
+
+void Process_case();
+
+rtems_extension Fatal_extension(
+ rtems_unsigned32 source,
+ rtems_unsigned32 error,
+ boolean is_internal
+)
+{
+ int index;
+
+ Error_Happened[ Case_in_switch ] = error;
+
+ if ( First_Time_Through == 0 ) {
+ Case_in_switch = FATAL_WORKSPACE_OF_ZERO;
+ First_Time_Through = 1;
+ setjmp( Restart_Context );
+ } else if ( Case_in_switch == FATAL_LAST ) {
+
+ /*
+ * Depending on the C library we use, we cannot get the
+ * task exitted error so do not check for it.
+ */
+
+ puts( "*** TEST FATAL ***" );
+ for ( index=0 ; index< FATAL_LAST ; index++ )
+ put_error( Error_Happened[ index ], Expected_Errors[ index ] );
+ puts( "NOT TESTING FATAL ERROR WHEN TASK EXITS -- C LIBRARY CATCHES THIS" );
+ puts( "*** END OF TEST FATAL ***" );
+
+ /*
+ * returns to the default fatal error handler instead of
+ * calling rtems_shutdown_executive
+ */
+ return;
+
+ } else {
+
+ longjmp( Restart_Context, 1 );
+ }
+
+ Process_case();
+}
+
+
+
+void Process_case()
+{
+ switch ( Case_in_switch ) {
+ case FATAL_WORKSPACE_OF_ZERO:
+ New_Configuration = BSP_Configuration;
+ New_Configuration.work_space_start = NULL;
+ Case_in_switch = FATAL_NULL_WORKSPACE;
+ break;
+
+ case FATAL_NULL_WORKSPACE:
+ New_Configuration.work_space_start = Workspace;
+ New_Configuration.work_space_size = 256;
+ Case_in_switch = FATAL_WORKSPACE_TOO_SMALL;
+ break;
+
+ case FATAL_WORKSPACE_TOO_SMALL:
+ Initialization_tasks[ 0 ].initial_priority = RTEMS_CURRENT_PRIORITY;
+ New_Configuration.work_space_size = sizeof( Workspace );
+ Case_in_switch = FATAL_TASK_CREATE;
+ break;
+
+ case FATAL_TASK_CREATE:
+ Initialization_tasks[ 0 ].initial_priority = 1;
+ Initialization_tasks[ 0 ].entry_point = NULL;
+ Case_in_switch = FATAL_TASK_START;
+ break;
+
+ case FATAL_TASK_START:
+ /* this extension exits the test */
+ Initialization_tasks[ 0 ].entry_point = Init;
+ break;
+ }
+ rtems_initialize_executive( &New_Configuration, &Cpu_table );
+}
+
diff --git a/c/src/tests/sptests/spfatal/init.c b/c/src/tests/sptests/spfatal/init.c
new file mode 100644
index 0000000000..8ab0156dc7
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/init.c
@@ -0,0 +1,51 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/sptests/spfatal/puterr.c b/c/src/tests/sptests/spfatal/puterr.c
new file mode 100644
index 0000000000..d994afe231
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/puterr.c
@@ -0,0 +1,68 @@
+/* put_error
+ *
+ * This routine verifies that the given error is the expected error.
+ *
+ * Input parameters:
+ * error - actual error code
+ * expected - expected error code
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+char *Errors[] = {
+ "RTEMS_SUCCESSFUL", /* successful completion */
+ "RTEMS_TASK_EXITTED", /* returned from a task */
+ "RTEMS_MP_NOT_CONFIGURED", /* multiprocessing not configured */
+ "RTEMS_INVALID_NAME", /* invalid object name */
+ "RTEMS_INVALID_ID", /* invalid object id */
+ "RTEMS_TOO_MANY", /* too many */
+ "RTEMS_TIMEOUT", /* timed out waiting */
+ "RTEMS_OBJECT_WAS_DELETED", /* object was deleted while waiting */
+ "RTEMS_INVALID_SIZE", /* specified size was invalid */
+ "RTEMS_INVALID_ADDRESS", /* address specified is invalid */
+ "RTEMS_INVALID_NUMBER", /* number was invalid */
+ "RTEMS_NOT_DEFINED", /* item has not been initialized */
+ "RTEMS_RESOURCE_IN_USE", /* resources still outstanding */
+ "RTEMS_UNSATISFIED", /* request not satisfied */
+ "RTEMS_INCORRECT_STATE", /* task is in wrong state */
+ "RTEMS_ALREADY_SUSPENDED", /* task already in state */
+ "RTEMS_ILLEGAL_ON_SELF", /* illegal operation on calling task */
+ "RTEMS_ILLEGAL_ON_REMOTE_OBJECT", /* illegal operation for remote object */
+ "RTEMS_CALLED_FROM_ISR", /* called from ISR */
+ "RTEMS_INVALID_PRIORITY", /* invalid task priority */
+ "RTEMS_INVALID_CLOCK", /* invalid date/time */
+ "RTEMS_INVALID_NODE", /* invalid node id */
+ "RTEMS_NOT_OWNER_OF_RESOURCE", /* not owner of resource */
+ "RTEMS_NOT_CONFIGURED", /* directive not configured */
+ "RTEMS_NOT_IMPLEMENTED" /* directive not implemented */
+};
+
+/* Task states */
+
+void put_error(
+ rtems_unsigned32 error,
+ rtems_status_code expected
+)
+{
+
+ if ( error <= RTEMS_NOT_IMPLEMENTED )
+ printf( "EXPECTED FATAL - error code is correctly %s\n", Errors[ error ] );
+ else
+ printf( "ERROR - out of range error code is %d\n", error );
+
+ if ( error != expected ) {
+ printf( "ERROR - did not get expected code of %d\n", expected );
+ }
+}
diff --git a/c/src/tests/sptests/spfatal/spfatal.doc b/c/src/tests/sptests/spfatal/spfatal.doc
new file mode 100644
index 0000000000..449a87173b
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/spfatal.doc
@@ -0,0 +1,28 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: testfatal
+
+directives: none
+
+concepts:
+
+ a. Verifies that the proper error is reported by k_fatal when a task
+ exits.
+
+ b. Verifies that the task exitted extension works correctly.
+
+ c. Verifies that the fatal error extension works corectly.
+
diff --git a/c/src/tests/sptests/spfatal/spfatal.scn b/c/src/tests/sptests/spfatal/spfatal.scn
new file mode 100644
index 0000000000..ecb9f63597
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/spfatal.scn
@@ -0,0 +1,8 @@
+*** TEST FATAL ***
+EXPECTED FATAL - error code is correctly RTEMS_UNSATISFIED
+EXPECTED FATAL - error code is correctly RTEMS_INVALID_ADDRESS
+EXPECTED FATAL - error code is correctly RTEMS_UNSATISFIED
+EXPECTED FATAL - error code is correctly RTEMS_INVALID_PRIORITY
+EXPECTED FATAL - error code is correctly RTEMS_TASK_EXITTED
+NOT TESTING FATAL ERROR WHEN TASK EXITS -- C LIBRARY CATCHES THIS
+*** END OF TEST FATAL ***
diff --git a/c/src/tests/sptests/spfatal/system.h b/c/src/tests/sptests/spfatal/system.h
new file mode 100644
index 0000000000..17ed231bfa
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/system.h
@@ -0,0 +1,82 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+void put_error(
+ rtems_unsigned32 error,
+ rtems_status_code expected
+);
+
+rtems_extension Fatal_extension(
+ rtems_unsigned32 source,
+ rtems_unsigned32 error,
+ boolean is_internal
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+extern rtems_extensions_table initial_extensions;
+
+#ifdef TEST_INIT
+rtems_extensions_table initial_extensions = {
+ NULL, /* create */
+ NULL, /* start */
+ NULL, /* restart */
+ NULL, /* delete */
+ NULL, /* switch */
+ NULL, /* begin */
+ NULL, /* exitted */
+ Fatal_extension /* fatal */
+};
+#endif
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(0)
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_INITIAL_EXTENSIONS &initial_extensions
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_configuration_table New_Configuration;
+
+extern rtems_extensions_table Extensions;
+extern rtems_configuration_table BSP_Configuration;
+extern rtems_cpu_table Cpu_table;
+
+/* end of include file */
diff --git a/c/src/tests/sptests/spfatal/task1.c b/c/src/tests/sptests/spfatal/task1.c
new file mode 100644
index 0000000000..f0d0f51731
--- /dev/null
+++ b/c/src/tests/sptests/spfatal/task1.c
@@ -0,0 +1,29 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the task manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ puts( "\n\n*** TEST FATAL ***" );
+ puts( "TA1 - exitting task" );
+}
diff --git a/c/src/tests/sptests/spsize/Makefile.in b/c/src/tests/sptests/spsize/Makefile.in
new file mode 100644
index 0000000000..7c5490c574
--- /dev/null
+++ b/c/src/tests/sptests/spsize/Makefile.in
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=init getint size
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PGM=${ARCH}/size.exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/sptests/spsize/getint.c b/c/src/tests/sptests/spsize/getint.c
new file mode 100644
index 0000000000..3e0651e237
--- /dev/null
+++ b/c/src/tests/sptests/spsize/getint.c
@@ -0,0 +1,32 @@
+/* getint
+ *
+ * This routine reads and returns an integer.
+ * It assumes decimal.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters:
+ * returns - number read
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int getint( void )
+{
+ char buff[16];
+
+ gets(buff);
+ return atoi(buff);
+}
diff --git a/c/src/tests/sptests/spsize/init.c b/c/src/tests/sptests/spsize/init.c
new file mode 100644
index 0000000000..f8dee65981
--- /dev/null
+++ b/c/src/tests/sptests/spsize/init.c
@@ -0,0 +1,64 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+/* #define HAVE_MENU */
+
+rtems_task Test_task();
+void size_rtems( int mode );
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+#if defined(HAVE_MENU)
+ int choice = 0;
+#endif
+
+ setvbuf(stdout, 0, _IONBF, 0);
+
+ puts( "\n*** RTEMS SIZE PROGRAM ***" );
+ size_rtems( 1 );
+ puts( "*** END OF RTEMS SIZE PROGRAM ***" );
+ exit( 0 );
+#if defined(HAVE_MENU)
+ do {
+ printf( "\n\nPlease select program mode:\n" );
+ printf( " 1) Print Formulas\n" );
+ printf( " 2) Determine Workspace Size\n" );
+ printf( " 3) Exit\n" );
+ printf( "Enter number of choice (1,2,3) : " );
+
+ choice = getint();
+ switch( choice ) {
+ case 1: size_rtems( 1 ); break;
+ case 2: size_rtems( 0 ); break;
+ case 3: exit( 0 );
+ default: continue;
+ }
+ } while ( FOREVER );
+#endif
+}
diff --git a/c/src/tests/sptests/spsize/size.c b/c/src/tests/sptests/spsize/size.c
new file mode 100644
index 0000000000..e7183bb1d0
--- /dev/null
+++ b/c/src/tests/sptests/spsize/size.c
@@ -0,0 +1,651 @@
+/* main
+ *
+ * This program is run to determine the data space and work space
+ * requirements of the current version of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/config.h>
+#include <rtems/directives.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/copyrt.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/dpmem.h>
+#include <rtems/rtems/event.h>
+#include <rtems/extension.h>
+#include <rtems/fatal.h>
+#include <rtems/init.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/io.h>
+#include <rtems/rtems/message.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/score/mpci.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/ratemon.h>
+#include <rtems/rtems/region.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+
+#include <stdlib.h>
+
+/* These are always defined by the executive.
+ *
+ * #include <rtems/copyrt.h>
+ * #include <rtems/tables.h>
+ * #include <rtems/sptables.h>
+ */
+#define HEAP_OVHD 16 /* wasted heap space per task stack */
+#define NAME_PTR_SIZE 8 /* size of name and pointer table entries */
+#define READYCHAINS_SIZE \
+ ((RTEMS_MAXIMUM_PRIORITY + 1) * sizeof(Chain_Control ))
+
+#define PER_TASK \
+ (long) (sizeof (Thread_Control) + \
+ NAME_PTR_SIZE + HEAP_OVHD + sizeof( RTEMS_API_Control ))
+#define PER_SEMAPHORE \
+ (long) (sizeof (Semaphore_Control) + NAME_PTR_SIZE)
+#define PER_TIMER \
+ (long) (sizeof (Timer_Control) + NAME_PTR_SIZE)
+#define PER_MSGQ \
+ (long) (sizeof (Message_queue_Control) + NAME_PTR_SIZE)
+#define PER_REGN \
+ (long) (sizeof (Region_Control) + NAME_PTR_SIZE)
+#define PER_PART \
+ (long) (sizeof (Partition_Control) + NAME_PTR_SIZE)
+#define PER_PERIOD \
+ (long) (sizeof (Rate_monotonic_Control) + NAME_PTR_SIZE)
+#define PER_PORT \
+ (long) (sizeof (Dual_ported_memory_Control) + NAME_PTR_SIZE)
+#define PER_EXTENSION \
+ (long) (sizeof (Extension_Control) + NAME_PTR_SIZE)
+
+#define PER_DRV (long) (0)
+#define PER_FPTASK (long) (CONTEXT_FP_SIZE)
+#define PER_GOBTBL (long) (sizeof (Chain_Control)*4)
+#define PER_NODE (long) PER_GOBTBL
+#define PER_GOBJECT (long) (sizeof (Objects_MP_Control))
+#define PER_PROXY (long) (sizeof (Thread_Proxy_control))
+
+#if (CPU_ALL_TASKS_ARE_FP == TRUE)
+#define MPCI_RECEIVE_SERVER_FP (long) (sizeof( Context_Control_fp ))
+#else
+#define MPCI_RECEIVE_SERVER_FP (long) 0
+#endif
+
+#if (CPU_IDLE_TASK_IS_FP == TRUE)
+#define SYSTEM_IDLE_FP (long) (sizeof( Context_Control_fp ))
+#else
+#define SYSTEM_IDLE_FP (long) 0
+#endif
+
+#define SYSTEM_TASKS \
+ (THREAD_IDLE_STACK_SIZE + \
+ MPCI_RECEIVE_SERVER_STACK_SIZE + \
+ (2*sizeof(Thread_Control))) + \
+ MPCI_RECEIVE_SERVER_FP + \
+ SYSTEM_IDLE_FP
+
+#define rtems_unsigned32 unsigned32
+
+rtems_unsigned32 sys_req;
+
+/* to avoid warnings */
+int puts();
+int printf();
+int getint();
+#undef getchar
+int getchar();
+void help_size();
+void print_formula();
+
+void size_rtems(
+ int mode
+)
+{
+int uninitialized = 0;
+int initialized = 0;
+
+/*
+ * The following data is allocated for each Manager:
+ *
+ * + Per Manager Object Information
+ * - local pointer table
+ * - local name table
+ * - the object's control blocks
+ * - global name chains
+ *
+ * The following is the data allocate from the RTEMS Workspace Area.
+ * The order indicates the order in which RTEMS allocates it.
+ *
+ * + Object MP
+ * - Global Object CB's
+ * + Thread
+ * - Ready Chain
+ * + Thread MP
+ * - Proxies Chain
+ * + Interrupt Manager
+ * - Interrupt Stack
+ * + Timer Manager
+ * - per Manager Object Data
+ * + Extension Manager
+ * - per Manager Object Data
+ * + Message Queue Manager
+ * - per Manager Object Data
+ * - Message Buffers
+ * + Semaphore Manager
+ * - per Manager Object Data
+ * + Partition Manager
+ * - per Manager Object Data
+ * + Region Manager
+ * - per Manager Object Data
+ * + Dual Ported Memory Manager
+ * - per Manager Object Data
+ * + Rate Monotonic Manager
+ * - per Manager Object Data
+ * + Internal Threads Handler
+ * - MPCI Receive Server Thread TCB
+ * - IDLE Thread TCB
+ * - MPCI Receive Server Thread stack
+ * - MPCI Receive Server Thread FP area (if CPU requires this)
+ * - IDLE Thread stack
+ * - IDLE Thread FP area (if CPU requires this)
+ *
+ * This does not take into account any CPU dependent alignment requirements.
+ *
+ * The following calculates the overhead needed by RTEMS from the
+ * Workspace Area.
+ */
+sys_req = SYSTEM_TASKS + /* MPCI Receive Server and IDLE */
+ NAME_PTR_SIZE + /* Task Overhead */
+ READYCHAINS_SIZE + /* Ready Chains */
+ NAME_PTR_SIZE + /* Timer Overhead */
+ NAME_PTR_SIZE + /* Semaphore Overhead */
+ NAME_PTR_SIZE + /* Message Queue Overhead */
+ NAME_PTR_SIZE + /* Region Overhead */
+ NAME_PTR_SIZE + /* Partition Overhead */
+ NAME_PTR_SIZE + /* Dual-Ported Memory Overhead */
+ NAME_PTR_SIZE + /* Rate Monotonic Overhead */
+ NAME_PTR_SIZE + /* Extension Overhead */
+ PER_NODE; /* Extra Gobject Table */
+
+uninitialized =
+/*address.h*/ 0 +
+
+/*apiext.h*/ (sizeof _API_extensions_List) +
+
+/*asr.h*/ 0 +
+
+/*attr.h*/ 0 +
+
+/*bitfield.h*/ 0 +
+
+/*chain.h*/ 0 +
+
+/*clock.h*/ 0 +
+
+/*config.h*/ (sizeof _Configuration_Table) +
+ (sizeof _Configuration_MP_table) +
+
+/*context.h*/ (sizeof _Context_Switch_necessary) +
+
+/*copyrt.h*/ 0 +
+
+/*debug.h*/ (sizeof _Debug_Level) +
+
+/*dpmem.h*/ (sizeof _Dual_ported_memory_Information) +
+
+/*event.h*/ (sizeof _Event_Sync_state) +
+
+/*eventmp.h*/ 0 +
+
+/*eventset.h*/ 0 +
+
+/*extension.h*/ (sizeof _Extension_Information) +
+
+/*fatal.h*/ 0 +
+
+/*heap.h*/ 0 +
+
+/*init.h*/ 0 +
+
+/*interr.h*/ (sizeof Internal_errors_What_happened) +
+
+/*intr.h*/ 0 +
+
+/*io.h*/ (sizeof _IO_Number_of_drivers) +
+ (sizeof _IO_Driver_address_table) +
+ (sizeof _IO_Number_of_devices) +
+ (sizeof _IO_Driver_name_table) +
+
+/*isr.h*/ (sizeof _ISR_Nest_level) +
+ (sizeof _ISR_Vector_table) +
+ (sizeof _ISR_Signals_to_thread_executing) +
+
+/*message.h*/ (sizeof _Message_queue_Information) +
+
+/*modes.h*/ 0 +
+
+/*mp.h*/ 0 +
+
+/*mpci.h*/ (sizeof _MPCI_Remote_blocked_threads) +
+ (sizeof _MPCI_Semaphore) +
+ (sizeof _MPCI_table) +
+ (sizeof _MPCI_Receive_server_tcb) +
+ (sizeof _MPCI_Packet_processors) +
+
+/*mppkt.h*/ 0 +
+
+/*mptables.h*/ 0 +
+
+/*msgmp.h*/ 0 +
+
+/*object.h*/ (sizeof _Objects_Local_node) +
+ (sizeof _Objects_Maximum_nodes) +
+ (sizeof _Objects_Information_table) +
+
+/*objectmp.h*/ (sizeof _Objects_MP_Maximum_global_objects) +
+ (sizeof _Objects_MP_Inactive_global_objects) +
+
+/*options.h*/ 0 +
+
+/*part.h*/ (sizeof _Partition_Information) +
+
+/*partmp.h*/ 0 +
+
+/*priority.h*/ (sizeof _Priority_Major_bit_map) +
+ (sizeof _Priority_Bit_map) +
+
+/*ratemon.h*/ (sizeof _Rate_monotonic_Information) +
+
+/*region.h*/ (sizeof _Region_Information) +
+
+/*regionmp.h*/ 0 +
+
+/*rtems.h*/ /* Not applicable */
+
+/*sem.h*/ (sizeof _Semaphore_Information) +
+
+/*semmp.h*/ 0 +
+
+/*signal.h*/ 0 +
+
+/*signalmp.h*/ 0 +
+
+/*stack.h*/ 0 +
+
+/*states.h*/ 0 +
+
+/*status.h*/ 0 +
+
+/*sysstate.h*/ (sizeof _System_state_Is_multiprocessing) +
+ (sizeof _System_state_Current) +
+
+/*system.h*/ (sizeof _CPU_Table) +
+
+/*taskmp.h*/ 0 +
+
+/*tasks.h*/ (sizeof _RTEMS_tasks_Information) +
+ (sizeof _RTEMS_tasks_User_initialization_tasks) +
+ (sizeof _RTEMS_tasks_Number_of_initialization_tasks) +
+
+/*thread.h*/ (sizeof _Thread_BSP_context) +
+ (sizeof _Thread_Dispatch_disable_level) +
+ (sizeof _Thread_Do_post_task_switch_extension) +
+ (sizeof _Thread_Maximum_extensions) +
+ (sizeof _Thread_Ticks_per_timeslice) +
+ (sizeof _Thread_Ready_chain) +
+ (sizeof _Thread_Executing) +
+ (sizeof _Thread_Heir) +
+ (sizeof _Thread_Allocated_fp) +
+ (sizeof _Thread_Internal_information) +
+ (sizeof _Thread_Idle) +
+
+/*threadmp.h*/ (sizeof _Thread_MP_Receive) +
+ (sizeof _Thread_MP_Active_proxies) +
+ (sizeof _Thread_MP_Inactive_proxies) +
+
+/*threadq.h*/ (sizeof _Thread_queue_Extract_table) +
+
+/*timer.h*/ (sizeof _Timer_Information) +
+
+/*tod.h*/ (sizeof _TOD_Current) +
+ (sizeof _TOD_Seconds_since_epoch) +
+ (sizeof _TOD_Microseconds_per_tick) +
+ (sizeof _TOD_Ticks_per_second) +
+ (sizeof _TOD_Seconds_watchdog) +
+
+/*tqdata.h*/ 0 +
+
+/*types.h*/ 0 +
+
+/*userext.h*/ (sizeof _User_extensions_Initial) +
+ (sizeof _User_extensions_List) +
+
+/*watchdog.h*/ (sizeof _Watchdog_Sync_level) +
+ (sizeof _Watchdog_Sync_count) +
+ (sizeof _Watchdog_Ticks_since_boot) +
+ (sizeof _Watchdog_Ticks_chain) +
+ (sizeof _Watchdog_Seconds_chain) +
+
+/*wkspace.h*/ (sizeof _Workspace_Area);
+
+uninitialized = 0;
+
+#ifndef unix /* make sure this is not a native compile */
+
+#ifdef i386
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Null_fp_context) +
+ (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+
+#endif
+
+#ifdef i960
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+
+#endif
+
+#ifdef hppa1_1
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Null_fp_context) +
+#ifndef RTEMS_UNIX
+ (sizeof _CPU_Default_gr27) +
+#endif
+ (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+#endif
+
+#ifdef m68k
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+
+#endif
+
+#ifdef sparc
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high) +
+ (sizeof _CPU_Null_fp_context);
+
+#ifndef NO_TABLE_MOVE
+uninitialized += (sizeof _CPU_Trap_Table_area);
+#endif
+
+#ifdef erc32
+uninitialized += (sizeof _ERC32_MEC_Timer_Control_Mirror);
+#endif
+
+
+#endif
+
+
+#ifdef no_cpu
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Null_fp_context) +
+ (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high) +
+ (sizeof _CPU_Thread_dispatch_pointer);
+
+#endif
+
+#ifdef ppc
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high) +
+ (sizeof _CPU_IRQ_info);
+
+#endif
+#endif /* !unix */
+
+initialized +=
+/*copyrt.h*/ (strlen(_Copyright_Notice)+1) +
+
+/*sptables.h*/ (sizeof _Initialization_Default_multiprocessing_table) +
+ (strlen(_RTEMS_version)+1) +
+ (sizeof _Entry_points) +
+
+
+/*tod.h*/ (sizeof _TOD_Days_per_month) +
+ (sizeof _TOD_Days_to_date) +
+ (sizeof _TOD_Days_since_last_leap_year);
+
+#ifndef unix /* make sure this is not native */
+#ifdef sparc
+
+initialized += (sizeof _CPU_Trap_slot_template);
+
+#endif
+#endif /* !unix */
+
+puts( "" );
+
+ if ( mode == 0 ) help_size();
+ else print_formula();
+
+printf( "\n" );
+printf( "RTEMS uninitialized data consumes %d bytes\n", uninitialized );
+printf( "RTEMS intialized data consumes %d bytes\n", initialized );
+
+}
+
+void help_size()
+{
+int c = '\0';
+int break_loop;
+int total_size;
+int task_stacks;
+int interrupt_stack;
+int maximum_tasks, size_tasks;
+int maximum_sems, size_sems;
+int maximum_timers, size_timers;
+int maximum_msgqs, size_msgqs;
+int maximum_msgs, size_msgs_overhead;
+int maximum_regns, size_regns;
+int maximum_parts, size_parts;
+int maximum_ports, size_ports;
+int maximum_periods, size_periods;
+int maximum_extensions, size_extensions;
+int maximum_drvs, size_drvs;
+int maximum_fps, size_fps;
+int maximum_nodes, size_nodes;
+int maximum_gobjs, size_gobjs;
+int maximum_proxies, size_proxies;
+
+total_size = sys_req; /* Fixed Overhead */
+printf( "What is maximum_tasks? " );
+maximum_tasks = getint();
+size_tasks = PER_TASK * maximum_tasks;
+total_size += size_tasks;
+
+printf( "What is maximum_semaphores? " );
+maximum_sems = getint();
+size_sems = PER_SEMAPHORE * maximum_sems;
+total_size += size_sems;
+
+printf( "What is maximum_timers? " );
+maximum_timers = getint();
+size_timers = PER_TIMER * maximum_timers;
+total_size += size_timers;
+
+printf( "What is maximum_message_queues? " );
+maximum_msgqs = getint();
+size_msgqs = PER_MSGQ * maximum_msgqs;
+total_size += size_msgqs;
+
+printf( "What is maximum_messages? XXXX " );
+maximum_msgs = getint();
+size_msgs_overhead = 0;
+total_size += size_msgs_overhead;
+
+printf( "What is maximum_regions? " );
+maximum_regns = getint();
+size_regns = PER_REGN * maximum_regns;
+total_size += size_regns;
+
+printf( "What is maximum_partitions? " );
+maximum_parts = getint();
+size_parts = PER_PART * maximum_parts;
+total_size += size_parts;
+
+printf( "What is maximum_ports? " );
+maximum_ports = getint();
+size_ports = PER_PORT * maximum_ports;
+total_size += size_ports;
+
+printf( "What is maximum_periods? " );
+maximum_periods = getint();
+size_periods = PER_PORT * maximum_periods;
+total_size += size_periods;
+
+printf( "What is maximum_extensions? " );
+maximum_extensions = getint();
+size_extensions = PER_EXTENSION * maximum_extensions;
+total_size += size_extensions;
+
+printf( "What is number_of_device_drivers? " );
+maximum_drvs = getint();
+size_drvs = PER_DRV * maximum_drvs;
+total_size += size_drvs;
+
+printf( "What will be total stack requirement for all tasks? " );
+task_stacks = getint();
+total_size += task_stacks;
+
+printf( "What is the size of the interrupt stack? " );
+interrupt_stack = getint();
+total_size += interrupt_stack;
+
+printf( "How many tasks will be created with the FP flag? " );
+maximum_fps = getint();
+size_fps = PER_FPTASK * maximum_fps;
+total_size += size_fps;
+
+printf( "Is this a single processor system? " );
+for ( break_loop=0 ; !break_loop; c = getchar() ) {
+ switch ( c ) {
+ case 'Y': case 'y':
+ case 'N': case 'n':
+ break_loop = 1;
+ break;
+ }
+}
+printf( "%c\n", c );
+if ( c == 'n' || c == 'N' ) {
+ printf( "What is maximum_nodes? " );
+ maximum_nodes = getint();
+ size_nodes = PER_NODE * maximum_nodes;
+ total_size += size_nodes;
+ printf( "What is maximum_global_objects? " );
+ maximum_gobjs = getint();
+ size_gobjs = PER_GOBJECT * maximum_gobjs;
+ total_size += size_gobjs;
+ printf( "What is maximum_proxies? " );
+ maximum_proxies = getint();
+ size_proxies = PER_PROXY * maximum_proxies;
+ total_size += size_proxies;
+} else {
+ maximum_nodes = 0;
+ size_nodes = PER_NODE * 0;
+ maximum_gobjs = 0;
+ size_gobjs = PER_GOBJECT * 0;
+ maximum_proxies = 0;
+ size_proxies = PER_PROXY * 0;
+}
+
+printf( "\n\n" );
+printf( " ************** EXECUTIVE WORK SPACE REQUIRED **************\n" );
+printf( " Tasks - %03d * %03ld = %ld\n",
+ maximum_tasks, PER_TASK, (long) size_tasks );
+printf( " Semaphores - %03d * %03ld = %ld\n",
+ maximum_sems, PER_SEMAPHORE, (long) size_sems );
+printf( " Timers - %03d * %03ld = %ld\n",
+ maximum_timers, PER_TIMER, (long) size_timers );
+printf( " Msg Queues - %03d * %03ld = %ld\n",
+ maximum_msgqs, PER_MSGQ, (long) size_msgqs );
+printf( " Messages Overhead - %03d * %03d = %ld\n",
+ maximum_msgs, 0 /* PER_MSG_OVERHEAD */, (long) size_msgs_overhead );
+printf( " Regions - %03d * %03ld = %ld\n",
+ maximum_regns, PER_REGN, (long) size_regns);
+printf( " Partitions - %03d * %03ld = %ld\n",
+ maximum_parts, PER_PART, (long) size_parts );
+printf( " Periods - %03d * %03ld = %ld\n",
+ maximum_periods, PER_PERIOD, (long) size_periods );
+printf( " Extensions - %03d * %03ld = %ld\n",
+ maximum_extensions, PER_EXTENSION, (long) size_extensions );
+printf( " Device Drivers - %03d * %03ld = %ld\n",
+ maximum_drvs, PER_DRV, (long) size_drvs );
+
+printf( " System Requirements - %04d = %d\n",
+ sys_req, sys_req );
+
+printf( " Floating Point Tasks - %03d * %03ld = %ld\n",
+ maximum_fps, PER_FPTASK, (long) size_fps );
+printf( " Application Task Stacks - = %d\n",
+ task_stacks );
+printf( " Interrupt Stacks - = %d\n",
+ task_stacks );
+printf( " \n" );
+printf( " Global object tables - %03d * %03ld = %ld\n",
+ maximum_nodes, PER_NODE, (long) size_nodes );
+printf( " Global objects - %03d * %03ld = %ld\n",
+ maximum_gobjs, PER_GOBJECT, (long) size_gobjs );
+printf( " Proxies - %03d * %03ld = %ld\n",
+ maximum_proxies, PER_PROXY, (long) size_proxies );
+printf( "\n\n" );
+printf( " TOTAL = %d bytes\n",
+ total_size );
+}
+
+void print_formula()
+{
+printf( " ************** EXECUTIVE WORK SPACE FORMULA **************\n" );
+printf( " Tasks - maximum_tasks * %ld\n", PER_TASK );
+printf( " Timers - maximum_timers * %ld\n", PER_TIMER );
+printf( " Semaphores - maximum_semaphores * %ld\n", PER_SEMAPHORE);
+printf( " Message Queues - maximum_message_queues * %ld\n", PER_MSGQ );
+printf( " Messages -\n");
+printf( " Regions - maximum_regions * %ld\n", PER_REGN );
+printf( " Partitions - maximum_partitions * %ld\n", PER_PART );
+printf( " Ports - maximum_ports * %ld\n", PER_PORT );
+printf( " Periods - maximum_periods * %ld\n", PER_PORT );
+printf( " Extensions - maximum_extensions * %ld\n", PER_EXTENSION );
+printf( " Device Drivers - number_of_device_drivers * %ld\n", PER_DRV);
+printf( " System Requirements - %d\n", sys_req );
+printf( " Floating Point Tasks - FPMASK Tasks * %ld\n", PER_FPTASK );
+printf( " User's Tasks' Stacks -\n" );
+printf( " Interrupt Stack -\n" );
+printf( " \n" );
+printf( " Global object tables - maximum_nodes * %ld\n", PER_NODE );
+printf( " Global objects - maximum_global_objects * %ld\n", PER_GOBJECT );
+printf( " Proxies - maximum_proxies * %ld\n", PER_PROXY );
+}
diff --git a/c/src/tests/sptests/spsize/system.h b/c/src/tests/sptests/spsize/system.h
new file mode 100644
index 0000000000..9b4c33cf8d
--- /dev/null
+++ b/c/src/tests/sptests/spsize/system.h
@@ -0,0 +1,47 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+int getint( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/support/Makefile.in b/c/src/tests/support/Makefile.in
new file mode 100644
index 0000000000..4f26fb9337
--- /dev/null
+++ b/c/src/tests/support/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=include stubdr wrapup
diff --git a/c/src/tests/support/include/Makefile.in b/c/src/tests/support/include/Makefile.in
new file mode 100644
index 0000000000..5599c9fe1a
--- /dev/null
+++ b/c/src/tests/support/include/Makefile.in
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES= $(srcdir)/tmacros.h
+
+SYS_H_FILES=
+
+SRCS=$(H_FILES) $(SYS_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(SYS_H_FILES) ${PROJECT_RELEASE}/include/sys
+
diff --git a/c/src/tests/support/include/tmacros.h b/c/src/tests/support/include/tmacros.h
new file mode 100644
index 0000000000..7f27f0b9c8
--- /dev/null
+++ b/c/src/tests/support/include/tmacros.h
@@ -0,0 +1,140 @@
+/* tmacros.h
+ *
+ * This include file contains macros which are useful in the RTEMS
+ * test suites.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TMACROS_h
+#define __TMACROS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <bsp.h> /* includes <rtems.h> */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FOREVER 1 /* infinite loop */
+
+#ifdef TEST_INIT
+#define TEST_EXTERN
+#define CONFIGURE_INIT
+#else
+#define TEST_EXTERN extern
+#endif
+
+#define directive_failed( dirstat, failmsg ) \
+ fatal_directive_status( dirstat, RTEMS_SUCCESSFUL, failmsg )
+
+#define fatal_directive_status( stat, desired, msg ) \
+ do { \
+ if ( (stat) != (desired) ) { \
+ printf( "\n%s FAILED -- expected (%d) got (%d)\n", \
+ (msg), (desired), (stat) ); \
+ fflush(stdout); \
+ exit( stat ); \
+ } \
+ } while ( 0 )
+
+#define sprint_time(str,s1,tb,s2) \
+ do { \
+ sprintf( (str), "%s%02d:%02d:%02d %02d/%02d/%04d%s", \
+ s1, (tb)->hour, (tb)->minute, (tb)->second, \
+ (tb)->month, (tb)->day, (tb)->year, s2 ); \
+ } while ( 0 )
+
+#define print_time(s1,tb,s2) \
+ do { \
+ printf( "%s%02d:%02d:%02d %02d/%02d/%04d%s", \
+ s1, (tb)->hour, (tb)->minute, (tb)->second, \
+ (tb)->month, (tb)->day, (tb)->year, s2 ); \
+ fflush(stdout); \
+ } while ( 0 )
+
+#define put_dot( c ) putchar( c ); fflush( stdout )
+
+#define new_line puts( "" )
+
+#define puts_nocr printf
+
+#ifdef RTEMS_TEST_NO_PAUSE
+#define rtems_test_pause() \
+ do { \
+ printf( "<pause>\n" ); fflush( stdout ); \
+ } while ( 0 )
+
+#define rtems_test_pause_and_screen_number( _screen ) \
+ do { \
+ printf( "<pause - screen %d>\n", (_screen) ); fflush( stdout ); \
+ } while ( 0 )
+#else
+#define rtems_test_pause() \
+ do { \
+ char buffer[ 80 ]; \
+ printf( "<pause>" ); fflush( stdout ); \
+ gets( buffer ); \
+ puts( "" ); \
+ } while ( 0 )
+
+#define rtems_test_pause_and_screen_number( _screen ) \
+ do { \
+ char buffer[ 80 ]; \
+ printf( "<pause - screen %d>", (_screen) ); fflush( stdout ); \
+ gets( buffer ); \
+ puts( "" ); \
+ } while ( 0 )
+#endif
+
+#define put_name( name, crlf ) \
+{ rtems_unsigned32 c0, c1, c2, c3; \
+ c0 = (name >> 24) & 0xff; \
+ c1 = (name >> 16) & 0xff; \
+ c2 = (name >> 8) & 0xff; \
+ c3 = name & 0xff; \
+ putchar( (char)c0 ); \
+ if ( c1 ) putchar( (char)c1 ); \
+ if ( c2 ) putchar( (char)c2 ); \
+ if ( c3 ) putchar( (char)c3 ); \
+ if ( crlf ) \
+ putchar( '\n' ); \
+}
+
+#define build_time( TB, MON, DAY, YR, HR, MIN, SEC, TK ) \
+ { (TB)->year = YR; \
+ (TB)->month = MON; \
+ (TB)->day = DAY; \
+ (TB)->hour = HR; \
+ (TB)->minute = MIN; \
+ (TB)->second = SEC; \
+ (TB)->ticks = TK; }
+
+#define task_number( tid ) \
+ ( rtems_get_index( tid ) - \
+ BSP_Configuration.RTEMS_api_configuration->number_of_initialization_tasks )
+
+static inline rtems_unsigned32 get_ticks_per_second( void )
+{
+ rtems_interval ticks_per_second;
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticks_per_second );
+ return ticks_per_second;
+}
+
+#define TICKS_PER_SECOND get_ticks_per_second()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/c/src/tests/support/stubdr/Makefile.in b/c/src/tests/support/stubdr/Makefile.in
new file mode 100644
index 0000000000..d3265fdde5
--- /dev/null
+++ b/c/src/tests/support/stubdr/Makefile.in
@@ -0,0 +1,57 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+PGM=${ARCH}/stubdr.rel
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=open close read write init cntrl
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=$(srcdir)/stubdrv.h
+
+# Assembly source names, if any, go here -- minus the .s
+S_PIECES=
+S_FILES=$(S_PIECES:%=%.s)
+S_O_FILES=$(S_FILES:%.s=${ARCH}/%.o)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+${PGM}: ${SRCS} ${OBJS}
+ $(make-rel)
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL_VARIANT) -m 644 $(PGM) ${PROJECT_RELEASE}/lib
diff --git a/c/src/tests/support/stubdr/close.c b/c/src/tests/support/stubdr/close.c
new file mode 100644
index 0000000000..4a6eadcc82
--- /dev/null
+++ b/c/src/tests/support/stubdr/close.c
@@ -0,0 +1,34 @@
+/* Stub_close
+ *
+ * This routine is the terminal driver close routine.
+ *
+ * Input parameters:
+ * major - device major number
+ * minor - device minor number
+ * pargb - pointer to close parameter block
+ *
+ * Output parameters:
+ * rval - STUB_SUCCESSFUL
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "stubdrv.h"
+
+rtems_device_driver Stub_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ return STUB_SUCCESSFUL;
+}
diff --git a/c/src/tests/support/stubdr/cntrl.c b/c/src/tests/support/stubdr/cntrl.c
new file mode 100644
index 0000000000..1a9f142fe0
--- /dev/null
+++ b/c/src/tests/support/stubdr/cntrl.c
@@ -0,0 +1,34 @@
+/* Stub_control
+ *
+ * This routine is the terminal driver control routine.
+ *
+ * Input parameters:
+ * major - device major number
+ * minor - device minor number
+ * pargp - pointer to cntrl parameter block
+ *
+ * Output parameters:
+ * rval - STUB_SUCCESSFUL
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "stubdrv.h"
+
+rtems_device_driver Stub_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ return STUB_SUCCESSFUL;
+}
diff --git a/c/src/tests/support/stubdr/init.c b/c/src/tests/support/stubdr/init.c
new file mode 100644
index 0000000000..15af01ef48
--- /dev/null
+++ b/c/src/tests/support/stubdr/init.c
@@ -0,0 +1,37 @@
+/* Stub_initialize
+ *
+ * This routine is the terminal driver init routine.
+ *
+ * Input parameters:
+ * major - device major number
+ * minor - device minor number
+ * pargp - pointer to parameter block
+ *
+ * Output parameters:
+ * rval - STUB_SUCCESSFUL
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "stubdrv.h"
+
+rtems_unsigned32 STUB_major;
+
+rtems_device_driver Stub_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ STUB_major = major;
+ return STUB_SUCCESSFUL;
+}
diff --git a/c/src/tests/support/stubdr/open.c b/c/src/tests/support/stubdr/open.c
new file mode 100644
index 0000000000..743b464cc7
--- /dev/null
+++ b/c/src/tests/support/stubdr/open.c
@@ -0,0 +1,34 @@
+/* Stub_open
+ *
+ * This routine is the terminal driver open routine.
+ *
+ * Input parameters:
+ * major - device major number
+ * minor - device minor number
+ * pargb - pointer to open parameter block
+ *
+ * Output parameters:
+ * rval - STUB_SUCCESSFUL
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "stubdrv.h"
+
+rtems_device_driver Stub_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ return STUB_SUCCESSFUL;
+}
diff --git a/c/src/tests/support/stubdr/read.c b/c/src/tests/support/stubdr/read.c
new file mode 100644
index 0000000000..146ccf2b12
--- /dev/null
+++ b/c/src/tests/support/stubdr/read.c
@@ -0,0 +1,34 @@
+/* Stub_read
+ *
+ * This routine is the terminal driver read routine.
+ *
+ * Input parameters:
+ * major - device major number
+ * minor - device minor number
+ * pargp - pointer to read parameter block
+ *
+ * Output parameters:
+ * rval - STUB_SUCCESSFUL
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "stubdrv.h"
+
+rtems_device_driver Stub_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ return STUB_SUCCESSFUL;
+}
diff --git a/c/src/tests/support/stubdr/stubdrv.h b/c/src/tests/support/stubdr/stubdrv.h
new file mode 100644
index 0000000000..b2a190f340
--- /dev/null
+++ b/c/src/tests/support/stubdr/stubdrv.h
@@ -0,0 +1,69 @@
+/* stubdrv.h
+ *
+ * This file describes the Stub Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STUB_DRIVER_h
+#define __STUB_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define STUB_DRIVER_TABLE_ENTRY \
+ { Stub_initialize, NULL, NULL, NULL, NULL, NULL }
+
+#define STUB_SUCCESSFUL RTEMS_SUCCESSFUL
+
+rtems_device_driver Stub_initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Stub_open(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Stub_close(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Stub_read(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Stub_write(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Stub_control(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/c/src/tests/support/stubdr/write.c b/c/src/tests/support/stubdr/write.c
new file mode 100644
index 0000000000..98984c1290
--- /dev/null
+++ b/c/src/tests/support/stubdr/write.c
@@ -0,0 +1,34 @@
+/* Stub_write
+ *
+ * This routine is the terminal driver write routine.
+ *
+ * Input parameters:
+ * major - device major number
+ * minor - device minor number
+ * pargp - pointer to write parameter block
+ *
+ * Output parameters:
+ * rval - STUB_SUCCESSFUL
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "stubdrv.h"
+
+rtems_device_driver Stub_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+)
+{
+ return STUB_SUCCESSFUL;
+}
diff --git a/c/src/tests/support/wrapup/Makefile.in b/c/src/tests/support/wrapup/Makefile.in
new file mode 100644
index 0000000000..4d8bb8c0ca
--- /dev/null
+++ b/c/src/tests/support/wrapup/Makefile.in
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+GENERIC_PIECES=stubdr
+
+# bummer; have to use $foreach since % pattern subst rules only replace 1x
+OBJS=$(foreach piece, $(GENERIC_PIECES), ../$(piece)/$(ARCH)/$(piece).rel)
+LIB=$(ARCH)/libtest.a
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+$(LIB): ${OBJS}
+ $(make-library)
+
+all: ${ARCH} $(SRCS) $(LIB)
+ $(INSTALL_VARIANT) -m 644 $(LIB) ${PROJECT_RELEASE}/lib
+
diff --git a/c/src/tests/tmtests/Makefile.in b/c/src/tests/tmtests/Makefile.in
new file mode 100644
index 0000000000..c4cb5a62da
--- /dev/null
+++ b/c/src/tests/tmtests/Makefile.in
@@ -0,0 +1,19 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+all: README
+
+SUB_DIRS=include \
+ tmck tmoverhd \
+ tm01 tm02 tm03 tm04 tm05 tm06 tm07 tm08 tm09 \
+ tm10 tm11 tm12 tm13 tm14 tm15 tm16 tm17 tm18 tm19 \
+ tm20 tm21 tm22 tm23 tm24 tm25 tm26 tm27 tm28 tm29
diff --git a/c/src/tests/tmtests/README b/c/src/tests/tmtests/README
new file mode 100644
index 0000000000..c27617d5a3
--- /dev/null
+++ b/c/src/tests/tmtests/README
@@ -0,0 +1,21 @@
+#
+# $Id$
+#
+
+This directory contains the RTEMS Timing Test Suite.
+The tests in this directory are used to measure the execution
+time of RTEMS directive and some critical internal functions.
+The results of these test are reported in the Fact Sheets
+and Supplental Manuals.
+
+These tests attempt to benchmark RTEMS as the user would. They measure
+the execution time for a directive (under various circumstances)
+from the time RTEMS is entered until it is executed. Where possible,
+the time is the average of at least 100 invocations of the directive.
+
+The accuracy of the times reported by these benchmarks is very dependent
+on the resolution of the timer being used. It is also important to
+insure that all sources of hardware interrupts are disabled during
+execution of the tests. This insures that the directive time reported
+does not include any interrupt time.
+
diff --git a/c/src/tests/tmtests/include/Makefile.in b/c/src/tests/tmtests/include/Makefile.in
new file mode 100644
index 0000000000..a53e59e10d
--- /dev/null
+++ b/c/src/tests/tmtests/include/Makefile.in
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+H_FILES= $(srcdir)/timesys.h
+
+SYS_H_FILES=
+
+SRCS=$(H_FILES) $(SYS_H_FILES)
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(SRCS)
+ $(INSTALL) -m 444 $(H_FILES) ${PROJECT_RELEASE}/include
+ $(INSTALL) -m 444 $(SYS_H_FILES) ${PROJECT_RELEASE}/include/sys
+
diff --git a/c/src/tests/tmtests/include/timesys.h b/c/src/tests/tmtests/include/timesys.h
new file mode 100644
index 0000000000..fb68ccb284
--- /dev/null
+++ b/c/src/tests/tmtests/include/timesys.h
@@ -0,0 +1,58 @@
+/* timesys.h
+ *
+ * This header file contains the global variables for the Time
+ * suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/*
+ * How many times a particular operation is performed while timed.
+ */
+
+#define OPERATION_COUNT 100
+#define IT_COUNT 100
+
+/* functions */
+
+#define put_time( _message, _total_time, \
+ _iterations, _loop_overhead, _overhead ) \
+ printf( \
+ "%s %d\n", \
+ (_message), \
+ (((_total_time) - (_loop_overhead)) / (_iterations)) - (_overhead) \
+ )
+
+#if defined(STACK_CHECKER_ON) || defined(RTEMS_DEBUG)
+#define Print_Warning() \
+ do { \
+ puts( \
+ "\n" \
+ "THE TIMES REPORTED BY THIS TEST INCLUDE DEBUG CODE!\n" \
+ "\n" \
+ ); \
+ } while (0)
+
+#else
+#define Print_Warning()
+#endif
+
+/* variables */
+
+TEST_EXTERN volatile rtems_unsigned32 end_time; /* ending time variable */
+TEST_EXTERN volatile rtems_unsigned32 overhead; /* loop overhead variable */
+
+TEST_EXTERN rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */
+TEST_EXTERN rtems_id Task_name[ OPERATION_COUNT+1 ]; /* array of task names */
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm01/Makefile.in b/c/src/tests/tmtests/tm01/Makefile.in
new file mode 100644
index 0000000000..8d4d3d24f4
--- /dev/null
+++ b/c/src/tests/tmtests/tm01/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm01
+
+MANAGERS=io semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm01/system.h b/c/src/tests/tmtests/tm01/system.h
new file mode 100644
index 0000000000..25d3dede71
--- /dev/null
+++ b/c/src/tests/tmtests/tm01/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm01/task1.c b/c/src/tests/tmtests/tm01/task1.c
new file mode 100644
index 0000000000..64f5fa1f3c
--- /dev/null
+++ b/c/src/tests/tmtests/tm01/task1.c
@@ -0,0 +1,189 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 1 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+
+}
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 semaphore_obtain_time;
+ rtems_unsigned32 semaphore_release_time;
+ rtems_unsigned32 semaphore_obtain_no_wait_time;
+ rtems_unsigned32 semaphore_obtain_loop_time;
+ rtems_unsigned32 semaphore_release_loop_time;
+ rtems_unsigned32 index;
+ rtems_unsigned32 iterations;
+ rtems_name name;
+ rtems_id smid;
+ rtems_status_code status;
+
+ name = rtems_build_name( 'S', 'M', '1', ' ' );
+
+ semaphore_obtain_time = 0;
+ semaphore_release_time = 0;
+ semaphore_obtain_no_wait_time = 0;
+ semaphore_obtain_loop_time = 0;
+ semaphore_release_loop_time = 0;
+
+
+ /* Time one invocation of rtems_semaphore_create */
+
+ Timer_initialize();
+ (void) rtems_semaphore_create(
+ name,
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_NO_PRIORITY,
+ &smid
+ );
+ end_time = Read_timer();
+ put_time(
+ "rtems_semaphore_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_CREATE
+ );
+
+ /* Time one invocation of rtems_semaphore_delete */
+
+ Timer_initialize();
+ (void) rtems_semaphore_delete( smid );
+ end_time = Read_timer();
+ put_time(
+ "rtems_semaphore_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_CREATE
+ );
+
+ status = rtems_semaphore_create(
+ name,
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &smid
+ );
+
+ for ( iterations=OPERATION_COUNT ; iterations ; iterations-- ) {
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ semaphore_obtain_loop_time += end_time;
+ semaphore_release_loop_time += end_time;
+
+ /* rtems_semaphore_obtain (available) */
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ (void) rtems_semaphore_obtain(
+ smid,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ end_time = Read_timer();
+
+ semaphore_obtain_time += end_time;
+
+ /* rtems_semaphore_release */
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ (void) rtems_semaphore_release( smid );
+ end_time = Read_timer();
+
+ semaphore_release_time += end_time;
+
+ /* semaphore obtain (RTEMS_NO_WAIT) */
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ rtems_semaphore_obtain( smid, RTEMS_NO_WAIT, RTEMS_NO_TIMEOUT );
+ semaphore_obtain_no_wait_time += Read_timer();
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ rtems_semaphore_release( smid );
+ end_time = Read_timer();
+
+ semaphore_release_time += end_time;
+ }
+
+ put_time(
+ "rtems_semaphore_obtain: available",
+ semaphore_obtain_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ semaphore_obtain_loop_time,
+ CALLING_OVERHEAD_SEMAPHORE_OBTAIN
+ );
+
+ put_time(
+ "rtems_semaphore_obtain: not available -- NO_WAIT",
+ semaphore_obtain_no_wait_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ semaphore_obtain_loop_time,
+ CALLING_OVERHEAD_SEMAPHORE_OBTAIN
+ );
+
+ put_time(
+ "rtems_semaphore_release: no waiting tasks",
+ semaphore_release_time,
+ OPERATION_COUNT * OPERATION_COUNT * 2,
+ semaphore_release_loop_time * 2,
+ CALLING_OVERHEAD_SEMAPHORE_RELEASE
+ );
+
+ puts( "*** END OF TEST 1 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm01/tm01.doc b/c/src/tests/tmtests/tm01/tm01.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm01/tm01.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm02/Makefile.in b/c/src/tests/tmtests/tm02/Makefile.in
new file mode 100644
index 0000000000..9117f90304
--- /dev/null
+++ b/c/src/tests/tmtests/tm02/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm02
+
+MANAGERS=io semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm02/system.h b/c/src/tests/tmtests/tm02/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/c/src/tests/tmtests/tm02/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm02/task1.c b/c/src/tests/tmtests/tm02/task1.c
new file mode 100644
index 0000000000..5e415fa8bb
--- /dev/null
+++ b/c/src/tests/tmtests/tm02/task1.c
@@ -0,0 +1,158 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id High_id;
+rtems_id Low_id;
+rtems_id Semaphore_id;
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 2 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_task_priority priority;
+
+ priority = 5;
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &High_id
+ );
+ directive_failed( status, "rtems_task_create of high task" );
+
+ priority++;
+
+ status = rtems_task_start( High_id, High_task, 0 );
+ directive_failed( status, "rtems_task_start of high task" );
+
+ for ( index=2 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Low_id
+ );
+ directive_failed( status, "rtems_task_create middle" );
+
+ priority++;
+
+ status = rtems_task_start( Low_id, Middle_tasks, 0 );
+ directive_failed( status, "rtems_task_start middle" );
+ }
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Low_id
+ );
+ directive_failed( status, "rtems_task_create low" );
+
+ status = rtems_task_start( Low_id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start low" );
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', ' '),
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Timer_initialize(); /* start blocking rtems_semaphore_obtain time */
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_obtain: not available -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_OBTAIN
+ );
+
+ puts( "*** END OF TEST 2 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm02/tm02.doc b/c/src/tests/tmtests/tm02/tm02.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm02/tm02.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm03/Makefile.in b/c/src/tests/tmtests/tm03/Makefile.in
new file mode 100644
index 0000000000..b455e1dacd
--- /dev/null
+++ b/c/src/tests/tmtests/tm03/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm03
+
+MANAGERS=io semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm03/system.h b/c/src/tests/tmtests/tm03/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/c/src/tests/tmtests/tm03/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm03/task1.c b/c/src/tests/tmtests/tm03/task1.c
new file mode 100644
index 0000000000..f4526f5a00
--- /dev/null
+++ b/c/src/tests/tmtests/tm03/task1.c
@@ -0,0 +1,151 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Semaphore_id;
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id task_id;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 3 ***" );
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '1', ' ' ),
+ 252,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of test_init" );
+
+ status = rtems_task_start( task_id, test_init, 0 );
+ directive_failed( status, "rtems_task_start of test_init" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_id task_id;
+ rtems_task_priority priority;
+
+ priority = 250;
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', '\0'),
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+
+ for ( index = 2 ; index <= OPERATION_COUNT ; index ++ ) {
+ rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create middle" );
+
+ priority--;
+
+ rtems_task_start( task_id, Middle_tasks, 0 );
+ directive_failed( status, "rtems_task_start middle" );
+ }
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of high task" );
+
+ status = rtems_task_start( task_id, High_task, 0 );
+ directive_failed( status, "rtems_task_start of high task" );
+
+ Timer_initialize(); /* start the timer */
+ status = rtems_semaphore_release( Semaphore_id );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ status = rtems_semaphore_release( Semaphore_id );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_release: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_RELEASE
+ );
+
+ puts( "*** END OF TEST 3 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm03/tm03.doc b/c/src/tests/tmtests/tm03/tm03.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm03/tm03.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm04/Makefile.in b/c/src/tests/tmtests/tm04/Makefile.in
new file mode 100644
index 0000000000..ee63afb8c3
--- /dev/null
+++ b/c/src/tests/tmtests/tm04/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm04
+
+MANAGERS=io semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm04/system.h b/c/src/tests/tmtests/tm04/system.h
new file mode 100644
index 0000000000..b984fea8b9
--- /dev/null
+++ b/c/src/tests/tmtests/tm04/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm04/task1.c b/c/src/tests/tmtests/tm04/task1.c
new file mode 100644
index 0000000000..74cccadf2b
--- /dev/null
+++ b/c/src/tests/tmtests/tm04/task1.c
@@ -0,0 +1,388 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Semaphore_id;
+rtems_id Task_id[OPERATION_COUNT+1];
+rtems_unsigned32 task_count;
+rtems_id Highest_id;
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Restart_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 4 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ task_count = OPERATION_COUNT;
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ status = rtems_task_start( Task_id[ index ], Low_tasks, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', ' ' ),
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+}
+
+rtems_task Highest_task(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority old_priority;
+ rtems_status_code status;
+
+ if ( argument == 1 ) {
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: blocked task -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ status = rtems_task_set_priority(
+ RTEMS_CURRENT_PRIORITY,
+ 254,
+ &old_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ } else if ( argument == 2 ) {
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: ready task -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+
+ } else
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_name name;
+ rtems_task_priority old_priority;
+
+ Timer_initialize();
+ (void) rtems_task_restart( Highest_id, 1 );
+ /* preempted by Higher_task */
+
+ Timer_initialize();
+ (void) rtems_task_restart( Highest_id, 2 );
+ /* preempted by Higher_task */
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ rtems_semaphore_release( Semaphore_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_release: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_RELEASE
+ );
+
+ name = rtems_build_name( 'T', 'I', 'M', 'E' );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_delete( Task_id[index] );
+ directive_failed( status, "rtems_task_delete" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ rtems_task_create(
+ name,
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_CREATE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ rtems_task_start( Task_id[ index ], Low_tasks, 0 );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_start",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_START
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_delete( Task_id[ index ] );
+ directive_failed( status, "rtems_task_delete" );
+ }
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ name,
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( Task_id[ index ], Restart_task, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+
+ status = rtems_task_suspend( Task_id[ index ] );
+ directive_failed( status, "rtems_task_suspend LOOP" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_restart( Task_id[ index ], 0 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: suspended task -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_suspend( Task_id[ index ] );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_delete( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: suspended task",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_DELETE
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ name,
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( Task_id[ index ], Restart_task, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_restart( Task_id[ index ], 1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: ready task -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_set_priority( Task_id[ index ], 5, &old_priority );
+ directive_failed( status, "rtems_task_set_priority loop" );
+ }
+
+ /* yield processor -- tasks block */
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_restart( Task_id[ index ], 1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: blocked task -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ /* yield processor -- tasks block */
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_delete( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: blocked task",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_DELETE
+ );
+
+ puts( "*** END OF TEST 4 ***" );
+ exit( 0 );
+}
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ task_count--;
+
+ if ( task_count == 0 ) {
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', ' ', ' ' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create HI" );
+
+ status = rtems_task_start( id, High_task, 0 );
+ directive_failed( status, "rtems_task_start HI" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Highest_id
+ );
+ directive_failed( status, "rtems_task_create HIGH" );
+
+ status = rtems_task_start( Highest_id, Highest_task, 0 );
+ directive_failed( status, "rtems_task_start HIGH" );
+
+ }
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Restart_task(
+ rtems_task_argument argument
+)
+{
+ if ( argument == 1 )
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
diff --git a/c/src/tests/tmtests/tm04/tm04.doc b/c/src/tests/tmtests/tm04/tm04.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm04/tm04.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm05/Makefile.in b/c/src/tests/tmtests/tm05/Makefile.in
new file mode 100644
index 0000000000..399ac7e46a
--- /dev/null
+++ b/c/src/tests/tmtests/tm05/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm05
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm05/system.h b/c/src/tests/tmtests/tm05/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/c/src/tests/tmtests/tm05/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm05/task1.c b/c/src/tests/tmtests/tm05/task1.c
new file mode 100644
index 0000000000..46e10407bd
--- /dev/null
+++ b/c/src/tests/tmtests/tm05/task1.c
@@ -0,0 +1,132 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Task_id[OPERATION_COUNT+1];
+rtems_unsigned32 Task_index;
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 5 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_unsigned32 index;
+
+ priority = 250;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ priority--;
+
+ if ( index==0 ) task_entry = Low_task;
+ else if ( index==OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[ index ], task_entry, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_resume: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESUME
+ );
+
+ puts( "*** END OF TEST 5 ***" );
+ exit( 0 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ Task_index++;
+ (void) rtems_task_resume( Task_id[ Task_index ] );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_suspend: calling task",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_SUSPEND
+ );
+
+ Task_index = 1;
+ Timer_initialize();
+ (void) rtems_task_resume( Task_id[ Task_index ] );
+}
diff --git a/c/src/tests/tmtests/tm05/tm05.doc b/c/src/tests/tmtests/tm05/tm05.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm05/tm05.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm06/Makefile.in b/c/src/tests/tmtests/tm06/Makefile.in
new file mode 100644
index 0000000000..bb83a8d716
--- /dev/null
+++ b/c/src/tests/tmtests/tm06/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm06
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm06/system.h b/c/src/tests/tmtests/tm06/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/c/src/tests/tmtests/tm06/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm06/task1.c b/c/src/tests/tmtests/tm06/task1.c
new file mode 100644
index 0000000000..6edeb7a8e1
--- /dev/null
+++ b/c/src/tests/tmtests/tm06/task1.c
@@ -0,0 +1,162 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Task_id[ OPERATION_COUNT + 1 ];
+
+rtems_unsigned32 Task_restarted;
+
+rtems_task null_task(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+void test_init( void );
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 6 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init( void )
+{
+ rtems_status_code status;
+ rtems_id id;
+
+ Task_restarted = OPERATION_COUNT;
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ if ( Task_restarted == OPERATION_COUNT )
+ Timer_initialize();
+
+ Task_restarted--;
+
+ if ( Task_restarted != 0 )
+ (void) rtems_task_restart( RTEMS_SELF, 0 );
+
+ end_time = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ put_time(
+ "rtems_task_restart: calling task",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ status = rtems_task_start( Task_id[ index ], null_task, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_suspend( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_suspend: returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_SUSPEND
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_resume( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_resume: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESUME
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_delete( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: ready task",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESUME
+ );
+
+ puts( "*** END OF TEST 6 ***" );
+ exit( 0 );
+}
+
+rtems_task null_task(
+ rtems_task_argument argument
+)
+{
+ while ( FOREVER )
+ ;
+}
diff --git a/c/src/tests/tmtests/tm06/tm06.doc b/c/src/tests/tmtests/tm06/tm06.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm06/tm06.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm07/Makefile.in b/c/src/tests/tmtests/tm07/Makefile.in
new file mode 100644
index 0000000000..aef6648cd3
--- /dev/null
+++ b/c/src/tests/tmtests/tm07/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm07
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm07/system.h b/c/src/tests/tmtests/tm07/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/c/src/tests/tmtests/tm07/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm07/task1.c b/c/src/tests/tmtests/tm07/task1.c
new file mode 100644
index 0000000000..518cc28148
--- /dev/null
+++ b/c/src/tests/tmtests/tm07/task1.c
@@ -0,0 +1,120 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Task_id[ OPERATION_COUNT+1 ], task_index;
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 7 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_task_priority priority;
+ rtems_task_entry task_entry;
+ rtems_unsigned32 index;
+
+ priority = 250;
+
+ for( index=0 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[index]
+ );
+ directive_failed( status, "rtems_task_create" );
+ priority--;
+
+ if ( index == 0 ) task_entry = Low_task;
+ else if ( index == OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[index], task_entry, 0 );
+ directive_failed( status, "rtems_task_start" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ if ( argument != 0 ) {
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: suspended task -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+ } else
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ puts( "*** END OF TEST 7 ***" );
+ exit( 0 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ task_index++;
+
+ if ( argument != 0 )
+ (void) rtems_task_restart( Task_id[ task_index ], 0xffffffff );
+ else
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ task_index = 1;
+
+ Timer_initialize();
+ (void) rtems_task_restart( Task_id[ task_index ], 0xffffffff );
+}
diff --git a/c/src/tests/tmtests/tm07/tm07.doc b/c/src/tests/tmtests/tm07/tm07.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm07/tm07.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm08/Makefile.in b/c/src/tests/tmtests/tm08/Makefile.in
new file mode 100644
index 0000000000..81e1c35751
--- /dev/null
+++ b/c/src/tests/tmtests/tm08/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm08
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm08/system.h b/c/src/tests/tmtests/tm08/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/c/src/tests/tmtests/tm08/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm08/task1.c b/c/src/tests/tmtests/tm08/task1.c
new file mode 100644
index 0000000000..1b02b5e0ee
--- /dev/null
+++ b/c/src/tests/tmtests/tm08/task1.c
@@ -0,0 +1,255 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Test_task_id;
+
+rtems_task test_task(
+ rtems_task_argument argument
+);
+rtems_task test_task1(
+ rtems_task_argument argument
+);
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 8 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+
+ status = rtems_task_create(
+ 1,
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Test_task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Test_task_id, test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_create(
+ 1,
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Test_task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Test_task_id, test_task1, 0 );
+ directive_failed( status, "rtems_task_start" );
+}
+
+rtems_task test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_task_priority old_priority;
+ rtems_time_of_day time;
+ rtems_unsigned32 old_note;
+ rtems_unsigned32 old_mode;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_set_priority(
+ Test_task_id,
+ RTEMS_CURRENT_PRIORITY,
+ &old_priority
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority: obtain current priority",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_PRIORITY
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_set_priority( Test_task_id, 253, &old_priority );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority: returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_PRIORITY
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_mode(
+ RTEMS_CURRENT_MODE,
+ RTEMS_CURRENT_MODE,
+ &old_mode
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: obtain current mode",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ (void) rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(1),
+ RTEMS_INTERRUPT_MASK,
+ &old_mode
+ );
+ (void) rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_INTERRUPT_MASK,
+ &old_mode
+ );
+ }
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: no reschedule",
+ end_time,
+ OPERATION_COUNT * 2,
+ overhead,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ Timer_initialize(); /* must be one host */
+ (void) rtems_task_mode( RTEMS_NO_ASR, RTEMS_ASR_MASK, &old_mode );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: reschedule -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ status = rtems_task_mode( RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &old_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_task_set_priority( Test_task_id, 1, &old_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ /* preempted by test_task1 */
+ Timer_initialize();
+ (void) rtems_task_mode( RTEMS_PREEMPT, RTEMS_PREEMPT_MASK, &old_mode );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_set_note( Test_task_id, 8, 10 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_NOTE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_get_note( Test_task_id, 8, &old_note );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_get_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_GET_NOTE
+ );
+
+ build_time( &time, 1, 1, 1988, 0, 0, 0, 0 );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_clock_set( &time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_set",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_CLOCK_SET
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_get",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_CLOCK_GET
+ );
+
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+}
+
+rtems_task test_task1(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: reschedule -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
diff --git a/c/src/tests/tmtests/tm08/tm08.doc b/c/src/tests/tmtests/tm08/tm08.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm08/tm08.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm09/Makefile.in b/c/src/tests/tmtests/tm09/Makefile.in
new file mode 100644
index 0000000000..c9240a7903
--- /dev/null
+++ b/c/src/tests/tmtests/tm09/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm09
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm09/system.h b/c/src/tests/tmtests/tm09/system.h
new file mode 100644
index 0000000000..4db3a16eea
--- /dev/null
+++ b/c/src/tests/tmtests/tm09/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm09/task1.c b/c/src/tests/tmtests/tm09/task1.c
new file mode 100644
index 0000000000..90d454b3d4
--- /dev/null
+++ b/c/src/tests/tmtests/tm09/task1.c
@@ -0,0 +1,226 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+void queue_test();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 9 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Test_task (
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+ rtems_message_queue_create(
+ 1,
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE
+ );
+
+ queue_test();
+
+ Timer_initialize();
+ rtems_message_queue_delete( Queue_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE
+ );
+
+ puts( "*** END OF TEST 9 ***" );
+ exit( 0 );
+}
+
+void queue_test()
+{
+ rtems_unsigned32 send_loop_time;
+ rtems_unsigned32 urgent_loop_time;
+ rtems_unsigned32 receive_loop_time;
+ rtems_unsigned32 send_time;
+ rtems_unsigned32 urgent_time;
+ rtems_unsigned32 receive_time;
+ rtems_unsigned32 empty_flush_time;
+ rtems_unsigned32 flush_time;
+ rtems_unsigned32 empty_flush_count;
+ rtems_unsigned32 flush_count;
+ rtems_unsigned32 index;
+ rtems_unsigned32 iterations;
+ long buffer[4];
+ rtems_status_code status;
+ rtems_unsigned32 size;
+
+ send_loop_time = 0;
+ urgent_loop_time = 0;
+ receive_loop_time = 0;
+ send_time = 0;
+ urgent_time = 0;
+ receive_time = 0;
+ empty_flush_time = 0;
+ flush_time = 0;
+ flush_count = 0;
+ empty_flush_count = 0;
+
+ for ( iterations = 1 ; iterations <= OPERATION_COUNT ; iterations++ ) {
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ send_loop_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ urgent_loop_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ receive_loop_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4])buffer, 16 );
+ send_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ receive_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4])buffer, 16 );
+ urgent_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ receive_time += Read_timer();
+
+ Timer_initialize();
+ rtems_message_queue_flush( Queue_id, &empty_flush_count );
+ empty_flush_time += Read_timer();
+
+ /* send one message to flush */
+ status = rtems_message_queue_send(
+ Queue_id,
+ (long (*)[4])buffer,
+ 16
+ );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Timer_initialize();
+ rtems_message_queue_flush( Queue_id, &flush_count );
+ flush_time += Read_timer();
+ }
+
+ put_time(
+ "rtems_message_queue_send: no waiting tasks",
+ send_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ send_loop_time,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_SEND
+ );
+
+ put_time(
+ "rtems_message_queue_urgent: no waiting tasks",
+ urgent_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ urgent_loop_time,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT
+ );
+
+ put_time(
+ "rtems_message_queue_receive: available",
+ receive_time,
+ OPERATION_COUNT * OPERATION_COUNT * 2,
+ receive_loop_time * 2,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE
+ );
+
+ put_time(
+ "rtems_message_queue_flush: no messages flushed",
+ empty_flush_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH
+ );
+
+ put_time(
+ "rtems_message_queue_flush: messages flushed",
+ flush_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH
+ );
+
+}
diff --git a/c/src/tests/tmtests/tm09/tm09.doc b/c/src/tests/tmtests/tm09/tm09.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm09/tm09.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm10/Makefile.in b/c/src/tests/tmtests/tm10/Makefile.in
new file mode 100644
index 0000000000..8f0561f6b7
--- /dev/null
+++ b/c/src/tests/tmtests/tm10/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm10
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm10/system.h b/c/src/tests/tmtests/tm10/system.h
new file mode 100644
index 0000000000..f16004b87b
--- /dev/null
+++ b/c/src/tests/tmtests/tm10/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 110
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm10/task1.c b/c/src/tests/tmtests/tm10/task1.c
new file mode 100644
index 0000000000..7cb30f1c33
--- /dev/null
+++ b/c/src/tests/tmtests/tm10/task1.c
@@ -0,0 +1,165 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+long Buffer[4];
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 10 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_unsigned32 index;
+ rtems_unsigned32 size;
+ rtems_task_entry task_entry;
+ rtems_status_code status;
+ rtems_task_priority priority;
+ rtems_id task_id;
+
+ priority = 5;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority++;
+
+ if ( index==0 ) task_entry = High_task;
+ else if ( index==OPERATION_COUNT ) task_entry = Low_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_message_queue_create(
+ 1,
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_receive: not available -- NO_WAIT",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE
+ );
+
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ Timer_initialize();
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_receive: not available -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE
+ );
+
+ puts( "*** END OF TEST 10 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm10/tm10.doc b/c/src/tests/tmtests/tm10/tm10.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm10/tm10.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm11/Makefile.in b/c/src/tests/tmtests/tm11/Makefile.in
new file mode 100644
index 0000000000..6ea99cad62
--- /dev/null
+++ b/c/src/tests/tmtests/tm11/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm11
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm11/system.h b/c/src/tests/tmtests/tm11/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm11/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm11/task1.c b/c/src/tests/tmtests/tm11/task1.c
new file mode 100644
index 0000000000..a255c7cf2e
--- /dev/null
+++ b/c/src/tests/tmtests/tm11/task1.c
@@ -0,0 +1,155 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+
+void Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id id;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 11 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+/* As each task is started, it preempts this task and
+ * performs a blocking rtems_message_queue_receive. Upon completion of
+ * this loop all created tasks are blocked.
+ */
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index < OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT-1 ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4]) Buffer, 16 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4]) Buffer, size );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_send: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_SEND
+ );
+
+ puts( "*** END OF TEST 11 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm11/tm11.doc b/c/src/tests/tmtests/tm11/tm11.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm11/tm11.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm12/Makefile.in b/c/src/tests/tmtests/tm12/Makefile.in
new file mode 100644
index 0000000000..a32bf08fd6
--- /dev/null
+++ b/c/src/tests/tmtests/tm12/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm12
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm12/system.h b/c/src/tests/tmtests/tm12/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm12/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm12/task1.c b/c/src/tests/tmtests/tm12/task1.c
new file mode 100644
index 0000000000..d36f90a253
--- /dev/null
+++ b/c/src/tests/tmtests/tm12/task1.c
@@ -0,0 +1,146 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id task_id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 12 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( task_id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Low_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4]) Buffer, 16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_send: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_SEND
+ );
+
+ puts( "*** END OF TEST 12 ***" );
+ exit( 0 );
+}
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
diff --git a/c/src/tests/tmtests/tm12/tm12.doc b/c/src/tests/tmtests/tm12/tm12.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm12/tm12.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm13/Makefile.in b/c/src/tests/tmtests/tm13/Makefile.in
new file mode 100644
index 0000000000..ad21ae46b3
--- /dev/null
+++ b/c/src/tests/tmtests/tm13/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm13
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm13/system.h b/c/src/tests/tmtests/tm13/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm13/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm13/task1.c b/c/src/tests/tmtests/tm13/task1.c
new file mode 100644
index 0000000000..b32f323064
--- /dev/null
+++ b/c/src/tests/tmtests/tm13/task1.c
@@ -0,0 +1,154 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+void Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id id;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 13 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+/* As each task is started, it preempts this task and
+ * performs a blocking rtems_message_queue_receive. Upon completion of
+ * this loop all created tasks are blocked.
+ */
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index < OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT-1 ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4]) Buffer, 16 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4]) Buffer, size );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_urgent: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT
+ );
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm13/tm13.doc b/c/src/tests/tmtests/tm13/tm13.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm13/tm13.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm14/Makefile.in b/c/src/tests/tmtests/tm14/Makefile.in
new file mode 100644
index 0000000000..e3536ac790
--- /dev/null
+++ b/c/src/tests/tmtests/tm14/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm14
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm14/system.h b/c/src/tests/tmtests/tm14/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm14/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm14/task1.c b/c/src/tests/tmtests/tm14/task1.c
new file mode 100644
index 0000000000..39dfd85c31
--- /dev/null
+++ b/c/src/tests/tmtests/tm14/task1.c
@@ -0,0 +1,146 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id task_id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 14 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( task_id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Low_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4]) Buffer, 16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_urgent: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT
+ );
+
+ puts( "*** END OF TEST 14 ***" );
+ exit( 0 );
+}
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
diff --git a/c/src/tests/tmtests/tm14/tm14.doc b/c/src/tests/tmtests/tm14/tm14.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm14/tm14.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm15/Makefile.in b/c/src/tests/tmtests/tm15/Makefile.in
new file mode 100644
index 0000000000..d114a93cee
--- /dev/null
+++ b/c/src/tests/tmtests/tm15/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm15
+
+MANAGERS=io event
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm15/system.h b/c/src/tests/tmtests/tm15/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm15/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm15/task1.c b/c/src/tests/tmtests/tm15/task1.c
new file mode 100644
index 0000000000..85cb8d2e4d
--- /dev/null
+++ b/c/src/tests/tmtests/tm15/task1.c
@@ -0,0 +1,222 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 time_set, eventout;
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 15 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_event_set event_out;
+ rtems_status_code status;
+
+ time_set = FALSE;
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOW" );
+
+ status = rtems_task_start( id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( Task_id[ index ], High_tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ {
+ (void) rtems_event_receive(
+ RTEMS_PENDING_EVENTS,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ }
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: obtain current events",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ {
+ (void) rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ }
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: not available -- NO_WAIT",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_event_set event_out;
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: not available -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_event_send( RTEMS_SELF, RTEMS_EVENT_16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send: no task readied",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_SEND
+ );
+
+ Timer_initialize();
+ (void) rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_event_send( Task_id[ index ], RTEMS_EVENT_16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_SEND
+ );
+
+ puts( "*** END OF TEST 15 ***" );
+ exit( 0 );
+}
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ if ( time_set )
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ else {
+ time_set = 1;
+ Timer_initialize(); /* start blocking rtems_event_receive time */
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ }
+}
diff --git a/c/src/tests/tmtests/tm15/tm15.doc b/c/src/tests/tmtests/tm15/tm15.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm15/tm15.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm16/Makefile.in b/c/src/tests/tmtests/tm16/Makefile.in
new file mode 100644
index 0000000000..d3b9224b5a
--- /dev/null
+++ b/c/src/tests/tmtests/tm16/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm16
+
+MANAGERS=io event
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm16/system.h b/c/src/tests/tmtests/tm16/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm16/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm16/task1.c b/c/src/tests/tmtests/tm16/task1.c
new file mode 100644
index 0000000000..142512c053
--- /dev/null
+++ b/c/src/tests/tmtests/tm16/task1.c
@@ -0,0 +1,148 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 Task_count;
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 16 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of test_init" );
+
+ status = rtems_task_start( id, test_init, 0 );
+ directive_failed( status, "rtems_task_start of test_init" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority priority;
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+
+/* As each task is started, it preempts this task and
+ * performs a blocking rtems_event_receive. Upon completion of
+ * this loop all created tasks are blocked.
+ */
+
+ priority = 250;
+
+ for( index = 0 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ if ( index == OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[ index ], task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+
+ priority--;
+ }
+
+ Task_count = 0;
+
+ Timer_initialize();
+ (void) rtems_event_send( Task_id[ Task_count ], RTEMS_EVENT_16 );
+ /* preempts task */
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set event_out;
+
+ (void) rtems_event_receive( /* task blocks */
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+
+ Task_count++;
+
+ (void) rtems_event_send( /* preempts task */
+ Task_id[ Task_count ],
+ RTEMS_EVENT_16
+ );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set event_out;
+
+ (void) rtems_event_receive( /* task blocks */
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_EVENT_SEND
+ );
+
+ puts( "*** END OF TEST 16 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm16/tm16.doc b/c/src/tests/tmtests/tm16/tm16.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm16/tm16.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm17/Makefile.in b/c/src/tests/tmtests/tm17/Makefile.in
new file mode 100644
index 0000000000..37a9af17c9
--- /dev/null
+++ b/c/src/tests/tmtests/tm17/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm17
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm17/system.h b/c/src/tests/tmtests/tm17/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm17/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm17/task1.c b/c/src/tests/tmtests/tm17/task1.c
new file mode 100644
index 0000000000..e7cbc8052f
--- /dev/null
+++ b/c/src/tests/tmtests/tm17/task1.c
@@ -0,0 +1,127 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 Task_count;
+rtems_task_priority Task_priority;
+
+rtems_task First_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Last_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_task_entry task_entry;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 17 ***" );
+
+ Task_priority = 254;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ Task_priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ if ( index == OPERATION_COUNT ) task_entry = Last_task;
+ else if ( index == 0 ) task_entry = First_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[ index ], task_entry, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Task_count = 1;
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task First_task(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority previous_priority;
+
+ Timer_initialize();
+
+ Task_priority--;
+ Task_count++;
+
+ (void) rtems_task_set_priority(
+ Task_id[ Task_count ],
+ Task_priority,
+ &previous_priority
+ );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority previous_priority;
+
+ Task_priority--;
+ Task_count++;
+
+ (void) rtems_task_set_priority(
+ Task_id[ Task_count ],
+ Task_priority,
+ &previous_priority
+ );
+}
+
+rtems_task Last_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ end_time = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority: preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_PRIORITY
+ );
+
+ puts( "*** END OF TEST 17 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm17/tm17.doc b/c/src/tests/tmtests/tm17/tm17.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm17/tm17.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm18/Makefile.in b/c/src/tests/tmtests/tm18/Makefile.in
new file mode 100644
index 0000000000..69bbcfc86a
--- /dev/null
+++ b/c/src/tests/tmtests/tm18/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm18
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm18/system.h b/c/src/tests/tmtests/tm18/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm18/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm18/task1.c b/c/src/tests/tmtests/tm18/task1.c
new file mode 100644
index 0000000000..f7a877d7ca
--- /dev/null
+++ b/c/src/tests/tmtests/tm18/task1.c
@@ -0,0 +1,112 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 taskcount;
+rtems_task_priority taskpri;
+
+rtems_task First_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Last_task(
+ rtems_task_argument argument
+);
+
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 18 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_id id;
+ rtems_task_entry task_entry;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ for ( index = 0 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ if ( index == OPERATION_COUNT ) task_entry = Last_task;
+ else if ( index == 0 ) task_entry = First_task;
+ else task_entry = Middle_tasks;
+
+
+ status = rtems_task_start( id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+}
+
+rtems_task First_task(
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+
+ (void) rtems_task_delete( RTEMS_SELF );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_delete( RTEMS_SELF );
+}
+
+rtems_task Last_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: calling task",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_DELETE
+ );
+
+ puts( "*** END OF TEST 18 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm18/tm18.doc b/c/src/tests/tmtests/tm18/tm18.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm18/tm18.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm19/Makefile.in b/c/src/tests/tmtests/tm19/Makefile.in
new file mode 100644
index 0000000000..47bf4b8cfa
--- /dev/null
+++ b/c/src/tests/tmtests/tm19/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm19
+
+MANAGERS=io signal
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm19/system.h b/c/src/tests/tmtests/tm19/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/c/src/tests/tmtests/tm19/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm19/task1.c b/c/src/tests/tmtests/tm19/task1.c
new file mode 100644
index 0000000000..6c503531f1
--- /dev/null
+++ b/c/src/tests/tmtests/tm19/task1.c
@@ -0,0 +1,208 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_asr Process_asr_for_pass_1(
+ rtems_signal_set signals
+);
+
+rtems_asr Process_asr_for_pass_2(
+ rtems_signal_set signals
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 19 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TASK1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 127,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TASK2" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 126,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK3" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TASK3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_asr Process_asr_for_pass_1(
+ rtems_signal_set signals
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_send: signal to self",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SIGNAL_SEND
+ );
+
+ Timer_initialize();
+}
+
+rtems_asr Process_asr_for_pass_2(
+ rtems_signal_set signals
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_resume( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_resume" );
+
+ Timer_initialize();
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Timer_initialize();
+ (void) rtems_signal_catch( Process_asr_for_pass_1, RTEMS_DEFAULT_MODES );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_catch",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SIGNAL_CATCH
+ );
+
+ Timer_initialize();
+ rtems_signal_send( Task_id[ 2 ], 1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_send: returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SIGNAL_SEND
+ );
+
+ Timer_initialize();
+ (void) rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_1 );
+
+ /* end time is done is RTEMS_ASR */
+
+ end_time = Read_timer();
+
+ put_time(
+ "exit ASR overhead: returns to calling task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ status = rtems_signal_catch( Process_asr_for_pass_2, RTEMS_NO_PREEMPT );
+ directive_failed( status, "rtems_signal_catch" );
+
+ Timer_initialize();
+ (void) rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_1 );
+}
+
+rtems_asr Process_asr_for_task_2(
+ rtems_signal_set signals
+)
+{
+ ;
+}
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_signal_catch( Process_asr_for_task_2, RTEMS_DEFAULT_MODES );
+ directive_failed( status, "rtems_signal_catch" );
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ end_time = Read_timer();
+
+ put_time(
+ "exit ASR overhead: returns to preempting task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ puts( "*** END OF TEST 19 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm19/tm19.doc b/c/src/tests/tmtests/tm19/tm19.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm19/tm19.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm20/Makefile.in b/c/src/tests/tmtests/tm20/Makefile.in
new file mode 100644
index 0000000000..6c38a32845
--- /dev/null
+++ b/c/src/tests/tmtests/tm20/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm20
+
+MANAGERS=io partition region
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm20/system.h b/c/src/tests/tmtests/tm20/system.h
new file mode 100644
index 0000000000..54be275388
--- /dev/null
+++ b/c/src/tests/tmtests/tm20/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+#define CONFIGURE_TEST_NEEDS_STUB_DRIVER
+
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#define CONFIGURE_MAXIMUM_REGIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm20/task1.c b/c/src/tests/tmtests/tm20/task1.c
new file mode 100644
index 0000000000..62d9d9a261
--- /dev/null
+++ b/c/src/tests/tmtests/tm20/task1.c
@@ -0,0 +1,466 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_device_major_number _STUB_major = 1;
+
+rtems_id Region_id;
+rtems_name Region_name;
+rtems_unsigned8 Region_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_id Partition_id;
+rtems_name Partition_name;
+rtems_unsigned8 Partition_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+
+void *Buffer_address_1;
+void *Buffer_address_2;
+void *Buffer_address_3;
+void *Buffer_address_4;
+
+rtems_unsigned32 buffer_count;
+
+void *Buffer_addresses[ OPERATION_COUNT+1 ];
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 20 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', '1' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TASK1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', '2' ),
+ 129,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TASK2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_mode previous_mode;
+ rtems_task_priority previous_priority;
+ rtems_status_code status;
+
+ Partition_name = rtems_build_name( 'P', 'A', 'R', 'T' );
+
+ Timer_initialize();
+ rtems_partition_create(
+ Partition_name,
+ Partition_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_CREATE
+ );
+
+ Region_name = rtems_build_name( 'R', 'E', 'G', 'N' );
+
+ Timer_initialize();
+ rtems_region_create(
+ Region_name,
+ Region_area,
+ 2048,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_CREATE
+ );
+
+ Timer_initialize();
+ (void) rtems_partition_get_buffer( Partition_id, &Buffer_address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_get_buffer: available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_GET_BUFFER
+ );
+
+ buffer_count = 0;
+ while ( FOREVER ) {
+
+ status = rtems_partition_get_buffer(
+ Partition_id,
+ &Buffer_addresses[ buffer_count ]
+ );
+
+ if ( status == RTEMS_UNSATISFIED ) break;
+
+ buffer_count++;
+ }
+
+ Timer_initialize();
+ (void) rtems_partition_get_buffer( Partition_id, &Buffer_address_2 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_get_buffer: not available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_GET_BUFFER
+ );
+
+ Timer_initialize();
+ (void) rtems_partition_return_buffer( Partition_id, Buffer_address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_return_buffer",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_RETURN_BUFFER
+ );
+
+ for ( index = 0 ; index < buffer_count ; index++ ) {
+
+ status = rtems_partition_return_buffer(
+ Partition_id,
+ Buffer_addresses[ index ]
+ );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ }
+
+ Timer_initialize();
+ (void) rtems_partition_delete( Partition_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_DELETE
+ );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_2
+ );
+ directive_failed( status, "region_get_semgent" );
+
+ Timer_initialize();
+ (void) rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_3
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment: available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_GET_SEGMENT
+ );
+
+ Timer_initialize();
+ (void) rtems_region_get_segment(
+ Region_id,
+ 1998,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_4
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment: not available -- NO_WAIT",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_GET_SEGMENT
+ );
+
+ status = rtems_region_return_segment( Region_id, Buffer_address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ Timer_initialize();
+ (void) rtems_region_return_segment( Region_id, Buffer_address_2 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment: no waiting tasks",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_RETURN_SEGMENT
+ );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ Timer_initialize();
+ (void) rtems_region_get_segment(
+ Region_id,
+ 1998,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_2
+ );
+
+ /* execute Task_2 */
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment: task readied -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_RETURN_SEGMENT
+ );
+
+ status = rtems_region_return_segment( Region_id, Buffer_address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_task_set_priority( RTEMS_SELF, 254, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_1
+ );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 1998,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ /* execute Task_2 */
+
+ status = rtems_region_return_segment( Region_id, Buffer_address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ Timer_initialize();
+ (void) rtems_region_delete( Region_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_DELETE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_initialize( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_initialize",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_INITIALIZE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_open( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_open",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_OPEN
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_close( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_close",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_CLOSE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_read( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_read",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_READ
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_write( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_write",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_WRITE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_control( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_control",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_CONTROL
+ );
+
+ puts( "*** END OF TEST 20 ***" );
+ exit( 0 );
+}
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment: not available -- caller blocks",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_GET_SEGMENT
+ );
+
+ Timer_initialize();
+ (void) rtems_region_return_segment( Region_id, Buffer_address_1 );
+
+ /* preempt back to Task_1 */
+
+ Timer_initialize();
+ (void) rtems_region_return_segment( Region_id, Buffer_address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment: task readied -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_RETURN_SEGMENT
+ );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/c/src/tests/tmtests/tm20/tm20.doc b/c/src/tests/tmtests/tm20/tm20.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm20/tm20.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm21/Makefile.in b/c/src/tests/tmtests/tm21/Makefile.in
new file mode 100644
index 0000000000..fff407ea61
--- /dev/null
+++ b/c/src/tests/tmtests/tm21/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm21
+
+MANAGERS=io dpmem message partition region semaphore rate_monotonic timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm21/system.h b/c/src/tests/tmtests/tm21/system.h
new file mode 100644
index 0000000000..4dd9ff035b
--- /dev/null
+++ b/c/src/tests/tmtests/tm21/system.h
@@ -0,0 +1,50 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 102
+#define CONFIGURE_MAXIMUM_TIMERS 100
+#define CONFIGURE_MAXIMUM_SEMAPHORES 100
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 100
+#define CONFIGURE_MAXIMUM_PARTITIONS 100
+#define CONFIGURE_MAXIMUM_REGIONS 100
+#define CONFIGURE_MAXIMUM_PORTS 100
+#define CONFIGURE_MAXIMUM_PERIODS 100
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm21/task1.c b/c/src/tests/tmtests/tm21/task1.c
new file mode 100644
index 0000000000..29184daecf
--- /dev/null
+++ b/c/src/tests/tmtests/tm21/task1.c
@@ -0,0 +1,236 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 Region_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+rtems_unsigned8 Partition_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 21 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of TASK1" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TASK1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_id id;
+ rtems_status_code status;
+
+ for( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create (
+ index,
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_message_queue_create(
+ index,
+ 1, /* only going to ident this queue */
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ status = rtems_semaphore_create(
+ index,
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &id
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ status = rtems_region_create(
+ index,
+ Region_area,
+ 2048,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_region_create" );
+
+ status = rtems_partition_create(
+ index,
+ Partition_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_partition_create" );
+
+ status = rtems_port_create(
+ index,
+ Partition_area,
+ Region_area,
+ 0xff,
+ &id
+ );
+ directive_failed( status, "rtems_port_create" );
+
+ status = rtems_timer_create( index, &id );
+ directive_failed( status, "rtems_timer_create" );
+
+ status = rtems_rate_monotonic_create( index, &id );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_semaphore_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_SEMAPHORE_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_partition_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PARTITION_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_region_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_REGION_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_port_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PORT_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_rate_monotonic_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_RATE_MONOTONIC_IDENT
+ );
+
+ puts( "*** END OF TEST 21 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm21/tm21.doc b/c/src/tests/tmtests/tm21/tm21.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm21/tm21.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm22/Makefile.in b/c/src/tests/tmtests/tm22/Makefile.in
new file mode 100644
index 0000000000..ac64d4e15b
--- /dev/null
+++ b/c/src/tests/tmtests/tm22/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm22
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm22/system.h b/c/src/tests/tmtests/tm22/system.h
new file mode 100644
index 0000000000..a91f3af44f
--- /dev/null
+++ b/c/src/tests/tmtests/tm22/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 103
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm22/task1.c b/c/src/tests/tmtests/tm22/task1.c
new file mode 100644
index 0000000000..ed71c734b8
--- /dev/null
+++ b/c/src/tests/tmtests/tm22/task1.c
@@ -0,0 +1,200 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 22 ***" );
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' '),
+ 100,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ status = rtems_task_create(
+ 1,
+ 11,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create RTEMS_PREEMPT" );
+
+ status = rtems_task_start( id, Preempt_task, 0 );
+ directive_failed( status, "rtems_task_start RTEMS_PREEMPT" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ Timer_initialize();
+ (void) rtems_message_queue_broadcast(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ 16,
+ &count
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast: task readied -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST
+ );
+
+ status = rtems_task_suspend(RTEMS_SELF);
+ directive_failed( status, "rtems_task_suspend" );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_unsigned32 count;
+ rtems_unsigned32 size;
+ rtems_status_code status;
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, High_task, 0 );
+ directive_failed( status, "rtems_task_start HIGH" );
+
+ status = rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "message_queu_receive" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_broadcast(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ 16,
+ &count
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast: no waiting tasks",
+ end_time,
+ OPERATION_COUNT,
+ 1,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST
+ );
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ /* should go to Preempt_task here */
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast: task readied -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST
+ );
+
+ puts( "*** END OF TEST 22 ***" );
+ exit( 0 );
+}
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+
+ Timer_initialize();
+ (void) rtems_message_queue_broadcast(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ 16,
+ &count
+ );
+
+ /* should be preempted by low task */
+}
diff --git a/c/src/tests/tmtests/tm22/tm22.doc b/c/src/tests/tmtests/tm22/tm22.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm22/tm22.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm23/Makefile.in b/c/src/tests/tmtests/tm23/Makefile.in
new file mode 100644
index 0000000000..e57520c1c3
--- /dev/null
+++ b/c/src/tests/tmtests/tm23/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm23
+
+MANAGERS=io event timer
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm23/system.h b/c/src/tests/tmtests/tm23/system.h
new file mode 100644
index 0000000000..a76f89f27d
--- /dev/null
+++ b/c/src/tests/tmtests/tm23/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm23/task1.c b/c/src/tests/tmtests/tm23/task1.c
new file mode 100644
index 0000000000..2ee1ae247b
--- /dev/null
+++ b/c/src/tests/tmtests/tm23/task1.c
@@ -0,0 +1,302 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Timer_id[ OPERATION_COUNT+1 ];
+
+rtems_time_of_day time_of_day;
+
+void null_delay(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+
+ rtems_task_priority priority;
+ rtems_unsigned32 index;
+ rtems_id id;
+ rtems_task_entry task_entry;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 23 ***" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ priority = 5;
+
+ for( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ if ( index == 1 ) task_entry = High_task;
+ else if ( index == OPERATION_COUNT ) task_entry = Low_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+
+ priority++;
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void null_delay(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_status_code status;
+ int i;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_create( index, &Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_CREATE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_after( Timer_id[ index ], 500, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_after: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_AFTER
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_after( Timer_id[ index ], 500, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_after: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_AFTER
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_cancel( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_cancel: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_CANCEL
+ );
+
+ for ( Timer_initialize(), i=0 ; i<OPERATION_COUNT ; i++ )
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_cancel( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_cancel: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_CANCEL
+ );
+
+ for ( Timer_initialize(), i=0 ; i<OPERATION_COUNT ; i++ )
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_reset( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_reset: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_RESET
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_reset( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_reset: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_RESET
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_reset( Timer_id[ index ] );
+
+ build_time( &time_of_day, 12, 31, 1988, 9, 0, 0, 0 );
+
+ status = rtems_clock_set( &time_of_day );
+ directive_failed( status, "rtems_clock_set" );
+
+ time_of_day.year = 1989;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_when(
+ Timer_id[ index ], &time_of_day, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_when: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_WHEN
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_when(
+ Timer_id[ index ], &time_of_day, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_when: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_WHEN
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_delete( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_delete: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_DELETE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_timer_create( index, &Timer_id[ index ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ status = rtems_timer_fire_after( Timer_id[ index ], 500, null_delay, NULL );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ status = rtems_timer_cancel( Timer_id[ index ] );
+ directive_failed( status, "rtems_timer_cancel" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_delete( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_delete: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_DELETE
+ );
+
+ Timer_initialize();
+ (void) rtems_task_wake_when( &time_of_day );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_wake_when( &time_of_day );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_when",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_WAKE_WHEN
+ );
+
+ puts( "*** END OF TEST 23 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm23/tm23.doc b/c/src/tests/tmtests/tm23/tm23.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm23/tm23.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm24/Makefile.in b/c/src/tests/tmtests/tm24/Makefile.in
new file mode 100644
index 0000000000..61a6a94012
--- /dev/null
+++ b/c/src/tests/tmtests/tm24/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm24
+
+MANAGERS=io message
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm24/system.h b/c/src/tests/tmtests/tm24/system.h
new file mode 100644
index 0000000000..87dab5b295
--- /dev/null
+++ b/c/src/tests/tmtests/tm24/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm24/task1.c b/c/src/tests/tmtests/tm24/task1.c
new file mode 100644
index 0000000000..379e5eb54b
--- /dev/null
+++ b/c/src/tests/tmtests/tm24/task1.c
@@ -0,0 +1,124 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 Task_count;
+
+rtems_task Tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 24 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create HIGH" );
+
+ status = rtems_task_start( id, High_task, 0 );
+ directive_failed( status, "rtems_task_create HIGH" );
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'R', 'E', 'S', 'T' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( id, Tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_after: yield -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_WAKE_AFTER
+ );
+
+ Task_count = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Tasks(
+ rtems_task_argument argument
+)
+{
+ Task_count++;
+
+ if ( Task_count == 1 )
+ Timer_initialize();
+ else if ( Task_count == OPERATION_COUNT ) {
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_after: yields -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_WAKE_AFTER
+ );
+
+ puts( "*** END OF TEST 24 ***" );
+ exit( 0 );
+ }
+ (void) rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+}
diff --git a/c/src/tests/tmtests/tm24/tm24.doc b/c/src/tests/tmtests/tm24/tm24.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm24/tm24.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm25/Makefile.in b/c/src/tests/tmtests/tm25/Makefile.in
new file mode 100644
index 0000000000..e8f7c00d1c
--- /dev/null
+++ b/c/src/tests/tmtests/tm25/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm25
+
+MANAGERS=io semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm25/system.h b/c/src/tests/tmtests/tm25/system.h
new file mode 100644
index 0000000000..b984fea8b9
--- /dev/null
+++ b/c/src/tests/tmtests/tm25/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm25/task1.c b/c/src/tests/tmtests/tm25/task1.c
new file mode 100644
index 0000000000..888946b04f
--- /dev/null
+++ b/c/src/tests/tmtests/tm25/task1.c
@@ -0,0 +1,109 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Semaphore_id;
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id task_id;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 25 ***" );
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', ' ') ,
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOW" );
+
+ status = rtems_task_start( task_id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( task_id, High_tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ 0xffffffff
+ );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+ (void) rtems_clock_tick();
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_tick",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_CLOCK_TICK
+ );
+
+ puts( "*** END OF TEST 25 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm25/tm25.doc b/c/src/tests/tmtests/tm25/tm25.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm25/tm25.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm26/Makefile.in b/c/src/tests/tmtests/tm26/Makefile.in
new file mode 100644
index 0000000000..0c39fb4067
--- /dev/null
+++ b/c/src/tests/tmtests/tm26/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm26
+
+MANAGERS=io semaphore
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm26/fptest.h b/c/src/tests/tmtests/tm26/fptest.h
new file mode 100644
index 0000000000..daeab550ce
--- /dev/null
+++ b/c/src/tests/tmtests/tm26/fptest.h
@@ -0,0 +1,165 @@
+/* fptest.h
+ *
+ * This include file contains the CPU dependent implementation
+ * of the following routines needed to test RTEMS floating
+ * point support:
+ * FP_load( &context )
+ * FP_check( &context )
+ *
+ * FP_load - loads the specified floating point context
+ * FP_check - checks the specified floating point context
+ *
+ * NOTE: These routines are VERY CPU dependent and are thus
+ * located in in the CPU dependent include file
+ * fptest.h. These routines form the core of the
+ * floating point context switch test.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __FPTEST_h
+#define __FPTEST_h
+
+#include <stdio.h>
+
+#ifndef CPU_HARDWARE_FP
+#error "This CPU does not have CPU_HARDWARE_FP defined"
+#endif
+
+#if ( CPU_HARDWARE_FP == FALSE )
+
+#define FP_DECLARE
+#define FP_LOAD( _factor )
+#define FP_CHECK( _factor ) 0
+
+#else
+
+#define FP_DECLARE \
+ double fp01 = 1.0; \
+ double fp02 = 2.0; \
+ double fp03 = 3.0; \
+ double fp04 = 4.0; \
+ double fp05 = 5.0; \
+ double fp06 = 6.0; \
+ double fp07 = 7.0; \
+ double fp08 = 8.0; \
+ double fp09 = 9.0; \
+ double fp10 = 10.0; \
+ double fp11 = 11.0; \
+ double fp12 = 12.0; \
+ double fp13 = 13.0; \
+ double fp14 = 14.0; \
+ double fp15 = 15.0; \
+ double fp16 = 16.0; \
+ double fp17 = 17.0; \
+ double fp18 = 18.0; \
+ double fp19 = 19.0; \
+ double fp20 = 20.0; \
+ double fp21 = 21.0; \
+ double fp22 = 22.0; \
+ double fp23 = 23.0; \
+ double fp24 = 24.0; \
+ double fp25 = 25.0; \
+ double fp26 = 26.0; \
+ double fp27 = 27.0; \
+ double fp28 = 28.0; \
+ double fp29 = 29.0; \
+ double fp30 = 30.0; \
+ double fp31 = 31.0; \
+ double fp32 = 32.0
+
+#define FP_LOAD( _factor ) \
+ do { \
+ fp01 += _factor; \
+ fp02 += _factor; \
+ fp03 += _factor; \
+ fp04 += _factor; \
+ fp05 += _factor; \
+ fp06 += _factor; \
+ fp07 += _factor; \
+ fp08 += _factor; \
+ fp09 += _factor; \
+ fp10 += _factor; \
+ fp11 += _factor; \
+ fp12 += _factor; \
+ fp13 += _factor; \
+ fp14 += _factor; \
+ fp15 += _factor; \
+ fp16 += _factor; \
+ fp17 += _factor; \
+ fp18 += _factor; \
+ fp19 += _factor; \
+ fp20 += _factor; \
+ fp21 += _factor; \
+ fp22 += _factor; \
+ fp23 += _factor; \
+ fp24 += _factor; \
+ fp25 += _factor; \
+ fp26 += _factor; \
+ fp27 += _factor; \
+ fp28 += _factor; \
+ fp29 += _factor; \
+ fp30 += _factor; \
+ fp31 += _factor; \
+ fp32 += _factor; \
+ } while (0)
+
+#define EPSILON (0.0005)
+#define FPABS(d) (((d) < 0.0) ? -(d) : (d))
+#define FPNEQ(a,b) (FPABS((a)-(b)) > EPSILON)
+
+#define FP_CHECK_ONE( _v, _base, _factor ) \
+ if ( FPNEQ( (_v), ((_base) + (_factor)) ) ) { \
+ printf("%d: " #_v " wrong -- (%g not %g)\n", \
+ task_index, (_v), (_base + _factor)); \
+ }
+
+
+#define FP_CHECK( _factor ) \
+ do { \
+ FP_CHECK_ONE( fp01, 1.0, (_factor) ); \
+ FP_CHECK_ONE( fp02, 2.0, (_factor) ); \
+ FP_CHECK_ONE( fp03, 3.0, (_factor) ); \
+ FP_CHECK_ONE( fp04, 4.0, (_factor) ); \
+ FP_CHECK_ONE( fp05, 5.0, (_factor) ); \
+ FP_CHECK_ONE( fp06, 6.0, (_factor) ); \
+ FP_CHECK_ONE( fp07, 7.0, (_factor) ); \
+ FP_CHECK_ONE( fp08, 8.0, (_factor) ); \
+ FP_CHECK_ONE( fp09, 9.0, (_factor) ); \
+ FP_CHECK_ONE( fp10, 10.0, (_factor) ); \
+ FP_CHECK_ONE( fp11, 11.0, (_factor) ); \
+ FP_CHECK_ONE( fp12, 12.0, (_factor) ); \
+ FP_CHECK_ONE( fp13, 13.0, (_factor) ); \
+ FP_CHECK_ONE( fp14, 14.0, (_factor) ); \
+ FP_CHECK_ONE( fp15, 15.0, (_factor) ); \
+ FP_CHECK_ONE( fp16, 16.0, (_factor) ); \
+ FP_CHECK_ONE( fp17, 17.0, (_factor) ); \
+ FP_CHECK_ONE( fp18, 18.0, (_factor) ); \
+ FP_CHECK_ONE( fp19, 19.0, (_factor) ); \
+ FP_CHECK_ONE( fp20, 20.0, (_factor) ); \
+ FP_CHECK_ONE( fp21, 21.0, (_factor) ); \
+ FP_CHECK_ONE( fp22, 22.0, (_factor) ); \
+ FP_CHECK_ONE( fp23, 23.0, (_factor) ); \
+ FP_CHECK_ONE( fp24, 24.0, (_factor) ); \
+ FP_CHECK_ONE( fp25, 25.0, (_factor) ); \
+ FP_CHECK_ONE( fp26, 26.0, (_factor) ); \
+ FP_CHECK_ONE( fp27, 27.0, (_factor) ); \
+ FP_CHECK_ONE( fp28, 28.0, (_factor) ); \
+ FP_CHECK_ONE( fp29, 29.0, (_factor) ); \
+ FP_CHECK_ONE( fp30, 30.0, (_factor) ); \
+ FP_CHECK_ONE( fp31, 31.0, (_factor) ); \
+ FP_CHECK_ONE( fp32, 32.0, (_factor) ); \
+ } while (0)
+
+#endif
+
+#endif
diff --git a/c/src/tests/tmtests/tm26/system.h b/c/src/tests/tmtests/tm26/system.h
new file mode 100644
index 0000000000..b984fea8b9
--- /dev/null
+++ b/c/src/tests/tmtests/tm26/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm26/task1.c b/c/src/tests/tmtests/tm26/task1.c
new file mode 100644
index 0000000000..804418f9cd
--- /dev/null
+++ b/c/src/tests/tmtests/tm26/task1.c
@@ -0,0 +1,550 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "system.h"
+#include "fptest.h"
+#include <coverhd.h>
+#include <tmacros.h>
+#include <timesys.h>
+
+
+/* TEST DATA */
+rtems_id Semaphore_id;
+
+Objects_Locations location; /* uses internal RTEMS type */
+
+Thread_Control *Middle_tcb; /* uses internal RTEMS type */
+
+Thread_Control *Low_tcb; /* uses internal RTEMS type */
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_task(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task Floating_point_task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Floating_point_task_2(
+ rtems_task_argument argument
+);
+
+void complete_test( void );
+
+rtems_task null_task(
+ rtems_task_argument argument
+)
+{
+}
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_id task_id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 26 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'F', 'P', '1', ' ' ),
+ 201,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of FP1" );
+
+ status = rtems_task_start( task_id, Floating_point_task_1, 0 );
+ directive_failed( status, "rtems_task_start of FP1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'F', 'P', '2', ' ' ),
+ 202,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of FP2" );
+
+ status = rtems_task_start( task_id, Floating_point_task_2, 0 );
+ directive_failed( status, "rtems_task_start of FP2" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 200,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of LOW" );
+
+ status = rtems_task_start( task_id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start of LOW" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of MIDDLE" );
+
+ status = rtems_task_start( task_id, Middle_task, 0 );
+ directive_failed( status, "rtems_task_start of MIDDLE" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of HIGH" );
+
+ status = rtems_task_start( task_id, High_task, 0 );
+ directive_failed( status, "rtems_task_start of HIGH" );
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'E', 'M', '1' ),
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'N', 'U', 'L', 'L' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( task_id, null_task, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_interrupt_level level;
+
+ Timer_initialize();
+ rtems_interrupt_disable( level );
+ end_time = Read_timer();
+
+ put_time(
+ "_ISR_Disable",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ rtems_interrupt_flash( level );
+ end_time = Read_timer();
+
+ put_time(
+ "_ISR_Flash",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ rtems_interrupt_enable( level );
+ end_time = Read_timer();
+
+ put_time(
+ "_ISR_Enable",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ _Thread_Disable_dispatch();
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Disable_dispatch",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ _Thread_Enable_dispatch();
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Enable_dispatch",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ _Thread_Set_state( _Thread_Executing, STATES_SUSPENDED );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Set_state",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Context_Switch_necessary = TRUE;
+
+ Timer_initialize();
+ _Thread_Dispatch(); /* dispatches Middle_task */
+}
+
+rtems_task Middle_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Disptach (NO FP)",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Set_state( _Thread_Executing, STATES_SUSPENDED );
+
+ Middle_tcb = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[200].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Switch( &Middle_tcb->Registers, &_Thread_Executing->Registers );
+
+ Timer_initialize();
+ _Context_Switch(&Middle_tcb->Registers, &Low_tcb->Registers);
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ Thread_Control *executing;
+
+ end_time = Read_timer();
+
+ put_time(
+ "context switch: no floating point contexts",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ executing = _Thread_Executing;
+
+ Low_tcb = executing;
+
+ Timer_initialize();
+ _Context_Switch( &executing->Registers, &executing->Registers );
+
+ end_time = Read_timer();
+
+ put_time(
+ "context switch: self",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Context_Switch(&executing->Registers, &Middle_tcb->Registers);
+
+ end_time = Read_timer();
+
+ put_time(
+ "context switch: to another task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[201].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+}
+
+rtems_task Floating_point_task_1(
+ rtems_task_argument argument
+)
+{
+ Thread_Control *executing;
+ FP_DECLARE;
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: restore 1st FP task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ executing = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[202].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Save_fp( &executing->fp_context );
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+ /* switch to Floating_point_task_2 */
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: save idle, restore initialized",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ FP_LOAD( 1.0 );
+
+ executing = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[202].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Save_fp( &executing->fp_context );
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+ /* switch to Floating_point_task_2 */
+}
+
+rtems_task Floating_point_task_2(
+ rtems_task_argument argument
+)
+{
+ Thread_Control *executing;
+ FP_DECLARE;
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: save idle, restore idle",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ executing = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[201].first;
+
+ FP_LOAD( 1.0 );
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Save_fp( &executing->fp_context );
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+ /* switch to Floating_point_task_1 */
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: save initialized, restore initialized",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ complete_test();
+}
+
+void complete_test( void )
+{
+ rtems_unsigned32 index;
+ rtems_id task_id;
+
+ Timer_initialize();
+ _Thread_Resume( Middle_tcb );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Resume",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Set_state( Middle_tcb, STATES_WAITING_FOR_MESSAGE );
+
+ Timer_initialize();
+ _Thread_Unblock( Middle_tcb );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Unblock",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Set_state( Middle_tcb, STATES_WAITING_FOR_MESSAGE );
+
+ Timer_initialize();
+ _Thread_Ready( Middle_tcb );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Ready",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ task_id = Middle_tcb->Object.id;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) _Thread_Get( task_id, &location );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Get",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) _Semaphore_Get( Semaphore_id, &location );
+ end_time = Read_timer();
+
+ put_time(
+ "_Semaphore_Get",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) _Thread_Get( 0x3, &location );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Get: invalid id",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ 0
+ );
+
+ puts( "*** END OF TEST 26 ***" );
+ exit( 0 );
+}
+
diff --git a/c/src/tests/tmtests/tm26/tm26.doc b/c/src/tests/tmtests/tm26/tm26.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm26/tm26.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm27/Makefile.in b/c/src/tests/tmtests/tm27/Makefile.in
new file mode 100644
index 0000000000..4a458b25d0
--- /dev/null
+++ b/c/src/tests/tmtests/tm27/Makefile.in
@@ -0,0 +1,63 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm27
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+
+# since we essentially are building an interrupt handler, must use CFLAGS_OS_V
+
+CFLAGS += $(CFLAGS_OS_V)
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm27/system.h b/c/src/tests/tmtests/tm27/system.h
new file mode 100644
index 0000000000..87dab5b295
--- /dev/null
+++ b/c/src/tests/tmtests/tm27/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm27/task1.c b/c/src/tests/tmtests/tm27/task1.c
new file mode 100644
index 0000000000..cb1c21da4a
--- /dev/null
+++ b/c/src/tests/tmtests/tm27/task1.c
@@ -0,0 +1,272 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * WARNING!!!!!!!!!
+ *
+ * THIS TEST USES INTERNAL RTEMS VARIABLES!!!
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+#include <bsp.h>
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+volatile rtems_unsigned32 Interrupt_occurred;
+volatile rtems_unsigned32 Interrupt_enter_time, Interrupt_enter_nested_time;
+volatile rtems_unsigned32 Interrupt_return_time, Interrupt_return_nested_time;
+rtems_unsigned32 Interrupt_nest;
+
+rtems_isr Isr_handler(
+ rtems_vector_number vector
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 27 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '1', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create Task_1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start Task_1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '2', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of Task_2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of Task_2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ Install_tm27_vector( Isr_handler );
+
+ /*
+ * No preempt .. no nesting
+ */
+
+ Interrupt_nest = 0;
+
+ _Thread_Dispatch_disable_level = 0;
+
+ Interrupt_occurred = 0;
+ Timer_initialize();
+ Cause_tm27_intr();
+ /* goes to Isr_handler */
+
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ Interrupt_return_time = Read_timer();
+
+ put_time(
+ "interrupt entry overhead: returns to interrupted task",
+ Interrupt_enter_time,
+ 1,
+ 0,
+ 0
+ );
+
+ put_time(
+ "interrupt exit overhead: returns to interrupted task",
+ Interrupt_return_time,
+ 1,
+ 0,
+ 0
+ );
+
+ /*
+ * No preempt .. nested
+ */
+
+ _Thread_Dispatch_disable_level = 1;
+
+ Interrupt_nest = 1;
+
+ Interrupt_occurred = 0;
+ Timer_initialize();
+ Cause_tm27_intr();
+ /* goes to Isr_handler */
+
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ Interrupt_return_time = Read_timer();
+
+ put_time(
+ "interrupt entry overhead: returns to nested interrupt",
+ Interrupt_enter_nested_time,
+ 1,
+ 0,
+ 0
+ );
+
+ put_time(
+ "interrupt exit overhead: returns to nested interrupt",
+ Interrupt_return_nested_time,
+ 1,
+ 0,
+ 0
+ );
+
+ /*
+ * Does a preempt .. not nested
+ */
+
+ _Thread_Dispatch_disable_level = 0;
+
+ _Thread_Heir = (rtems_tcb *) _Thread_Ready_chain[254].last;
+
+ _Context_Switch_necessary = 1;
+
+ Interrupt_occurred = 0;
+ Timer_initialize();
+ Cause_tm27_intr();
+
+ /*
+ * goes to Isr_handler and then returns
+ */
+
+ puts( "*** END OF TEST 27 ***" );
+ exit( 0 );
+}
+
+/*
+ * NOTE: When this task is executing, some of the assumptions made
+ * regarding the placement of the currently executing task's TCB
+ * on the ready chains have been violated. At least the assumption
+ * that this task is at the head of the chain for its priority
+ * has been violated.
+ */
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ end_time = Read_timer();
+
+ put_time(
+ "interrupt entry overhead: returns to preempting task",
+ Interrupt_enter_time,
+ 1,
+ 0,
+ 0
+ );
+
+ put_time(
+ "interrupt exit overhead: returns to preempting task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ fflush( stdout );
+
+ /*
+ * Switch back to the other task to exit the test.
+ */
+
+ _Thread_Dispatch_disable_level = 0;
+
+ _Thread_Heir = (rtems_tcb *) _Thread_Ready_chain[254].first;
+
+ _Context_Switch_necessary = 1;
+
+ _Thread_Dispatch();
+
+}
+
+/* The Isr_handler() and Isr_handler_inner() routines are structured
+ * so that there will be as little entry overhead as possible included
+ * in the interrupt entry time.
+ */
+
+void Isr_handler_inner( void );
+
+rtems_isr Isr_handler(
+ rtems_vector_number vector
+)
+{
+ end_time = Read_timer();
+
+ Interrupt_occurred = 1;
+ Isr_handler_inner();
+}
+
+void Isr_handler_inner( void )
+{
+
+ /*enable_tracing();*/
+ Clear_tm27_intr();
+ switch ( Interrupt_nest ) {
+ case 0:
+ Interrupt_enter_time = end_time;
+ break;
+ case 1:
+ Interrupt_enter_time = end_time;
+ Interrupt_nest = 2;
+ Interrupt_occurred = 0;
+ Lower_tm27_intr();
+ Timer_initialize();
+ Cause_tm27_intr();
+ /* goes to a nested copy of Isr_handler */
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ Interrupt_return_nested_time = Read_timer();
+ break;
+ case 2:
+ Interrupt_enter_nested_time = end_time;
+ break;
+ }
+
+ Timer_initialize();
+}
diff --git a/c/src/tests/tmtests/tm27/tm27.doc b/c/src/tests/tmtests/tm27/tm27.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm27/tm27.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm28/Makefile.in b/c/src/tests/tmtests/tm28/Makefile.in
new file mode 100644
index 0000000000..89be392315
--- /dev/null
+++ b/c/src/tests/tmtests/tm28/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm28
+
+MANAGERS=io dpmem
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm28/system.h b/c/src/tests/tmtests/tm28/system.h
new file mode 100644
index 0000000000..ae0265c1eb
--- /dev/null
+++ b/c/src/tests/tmtests/tm28/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_MAXIMUM_PORTS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm28/task1.c b/c/src/tests/tmtests/tm28/task1.c
new file mode 100644
index 0000000000..96c8707c76
--- /dev/null
+++ b/c/src/tests/tmtests/tm28/task1.c
@@ -0,0 +1,134 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Port_id;
+
+rtems_unsigned8 Internal_area[ 256 ] CPU_STRUCTURE_ALIGNMENT;
+rtems_unsigned8 External_area[ 256 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 28 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Test_task (
+ rtems_task_argument argument
+)
+{
+ rtems_name name;
+ rtems_unsigned32 index;
+ void *converted;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ name = rtems_build_name( 'P', 'O', 'R', 'T' ),
+
+ Timer_initialize();
+ rtems_port_create(
+ name,
+ Internal_area,
+ External_area,
+ 0xff,
+ &Port_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PORT_CREATE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_port_external_to_internal(
+ Port_id,
+ &External_area[ 0xf ],
+ &converted
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_external_to_internal",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_port_internal_to_external(
+ Port_id,
+ &Internal_area[ 0xf ],
+ &converted
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_internal_to_external",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL
+ );
+
+ Timer_initialize();
+ rtems_port_delete( Port_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PORT_DELETE
+ );
+
+ puts( "*** END OF TEST 28 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm28/tm28.doc b/c/src/tests/tmtests/tm28/tm28.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm28/tm28.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tm29/Makefile.in b/c/src/tests/tmtests/tm29/Makefile.in
new file mode 100644
index 0000000000..69995fab5b
--- /dev/null
+++ b/c/src/tests/tmtests/tm29/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tm29
+
+MANAGERS=io rate_monotonic
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tm29/system.h b/c/src/tests/tmtests/tm29/system.h
new file mode 100644
index 0000000000..276d7b92f6
--- /dev/null
+++ b/c/src/tests/tmtests/tm29/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_PERIODS 111
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tm29/task1.c b/c/src/tests/tmtests/tm29/task1.c
new file mode 100644
index 0000000000..6c54b4a120
--- /dev/null
+++ b/c/src/tests/tmtests/tm29/task1.c
@@ -0,0 +1,207 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_name Period_name;
+
+rtems_task Tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_unsigned32 Task_count;
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 29 ***" );
+
+ Period_name = rtems_build_name( 'P', 'R', 'D', ' ' );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_create( Period_name, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_CREATE
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_period( id, 10 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period: initiate period -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_period( id, RTEMS_PERIOD_STATUS );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period: obtain status",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_cancel( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_cancel",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_delete: inactive",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_DELETE
+ );
+
+ status = rtems_rate_monotonic_create( Period_name, &id );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+
+ status = rtems_rate_monotonic_period( id, 10 );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+
+ Timer_initialize();
+ rtems_rate_monotonic_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_delete: active",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_DELETE
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( id, Tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 200,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOW" );
+
+ status = rtems_task_start( id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ Task_count = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( 1, &id );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+
+ status = rtems_rate_monotonic_period( id, 100 );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+
+ /*
+ * Give up the processor to allow all tasks to actually
+ * create and start their period timer before the benchmark
+ * timer is initialized.
+ */
+
+ (void) rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+
+ Task_count++;
+
+ if ( Task_count == 1 )
+ Timer_initialize();
+
+ (void) rtems_rate_monotonic_period( id, 100 );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ end_time = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period: conclude periods -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD
+ );
+
+ puts( "*** END OF TEST 29 ***" );
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tm29/tm29.doc b/c/src/tests/tmtests/tm29/tm29.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tm29/tm29.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tmtests/tmck/Makefile.in b/c/src/tests/tmtests/tmck/Makefile.in
new file mode 100644
index 0000000000..fa78ad7846
--- /dev/null
+++ b/c/src/tests/tmtests/tmck/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tmck
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=task1
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tmck/system.h b/c/src/tests/tmtests/tmck/system.h
new file mode 100644
index 0000000000..e5c25a505f
--- /dev/null
+++ b/c/src/tests/tmtests/tmck/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tmck/task1.c b/c/src/tests/tmtests/tmck/task1.c
new file mode 100644
index 0000000000..2a6f3db9bb
--- /dev/null
+++ b/c/src/tests/tmtests/tmck/task1.c
@@ -0,0 +1,180 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#define TEST_INIT
+#include "system.h"
+
+#define MAXIMUM_DISTRIBUTION 10000
+
+#undef OPERATION_COUNT
+#define OPERATION_COUNT 100000
+
+int Distribution[ MAXIMUM_DISTRIBUTION + 1 ];
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+void check_read_timer( void );
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ /*
+ * Tell the Timer Driver what we are doing
+ */
+
+ Set_find_average_overhead( 1 );
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME CHECKER ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' ),
+
+ status = rtems_task_create(
+ 1,
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ check_read_timer();
+rtems_test_pause();
+
+ Timer_initialize();
+ end_time = Read_timer();
+
+ put_time(
+ "NULL timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 1000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (1000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 10000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (10000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 50000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (50000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 100000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (100000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ puts( "*** END OF TIME CHECKER ***" );
+ exit( 0 );
+}
+
+void check_read_timer()
+{
+ rtems_unsigned32 index;
+ rtems_unsigned32 time;
+
+ for ( index = 1 ; index <= MAXIMUM_DISTRIBUTION ; index++ )
+ Distribution[ index ] = 0;
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ Timer_initialize();
+ end_time = Read_timer();
+ if ( end_time > MAXIMUM_DISTRIBUTION ) {
+ /*
+ * Under UNIX a simple process swap takes longer than we
+ * consider valid for our testing purposes.
+ */
+ printf( "TOO LONG (%d) at index %d!!!\n", end_time, index );
+#if defined(unix) || defined(go32)
+ index--;
+ continue;
+#else
+ exit( 1 );
+#endif
+ }
+ else
+ Distribution[ end_time ]++;
+ }
+
+ printf( "Units may not be in microseconds for this test!!!\n" );
+ time = 0;
+ for ( index = 0 ; index <= MAXIMUM_DISTRIBUTION ; index++ ) {
+ time += (Distribution[ index ] * index);
+ if ( Distribution[ index ] != 0 )
+ printf( "%d %d\n", index, Distribution[ index ] );
+ }
+ printf( "Total time = %d\n", time );
+ printf( "Average time = %d\n", time / OPERATION_COUNT );
+}
diff --git a/c/src/tests/tmtests/tmck/tmck.doc b/c/src/tests/tmtests/tmck/tmck.doc
new file mode 100644
index 0000000000..a4fa6eb188
--- /dev/null
+++ b/c/src/tests/tmtests/tmck/tmck.doc
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives timed by this test.
+
+benchmark name: timecheck
+
+This becnchmark is used to calibrate the timer. It is only used to
+when initial timing begins on a particular processor board.
+
diff --git a/c/src/tests/tmtests/tmoverhd/Makefile.in b/c/src/tests/tmtests/tmoverhd/Makefile.in
new file mode 100644
index 0000000000..8d5b26f915
--- /dev/null
+++ b/c/src/tests/tmtests/tmoverhd/Makefile.in
@@ -0,0 +1,60 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+TEST=tmoverhd
+
+MANAGERS=io
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=testtask empty
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=system.h
+
+DOCTYPES=doc
+DOCS=$(DOCTYPES:%=$(TEST).%)
+
+SRCS=$(DOCS) $(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PRINT_SRCS=$(DOCS)
+
+PGM=${ARCH}/$(TEST).exe
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGM)
+ $(INSTALL_VARIANT) -m 555 ${PGM} ${PROJECT_RELEASE}/tests
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
diff --git a/c/src/tests/tmtests/tmoverhd/dumrtems.h b/c/src/tests/tmtests/tmoverhd/dumrtems.h
new file mode 100644
index 0000000000..db1146e3ae
--- /dev/null
+++ b/c/src/tests/tmtests/tmoverhd/dumrtems.h
@@ -0,0 +1,255 @@
+/* dumrtems.h
+ *
+ * This include file contains phony macros to map
+ * executive calls to Empty_directive().
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __DUMRTEMS_h
+#define __DUMRTEMS_h
+
+/* RTEMS call redefinition macros */
+
+#undef rtems_signal_catch
+#undef rtems_signal_send
+#undef rtems_io_close
+#undef rtems_io_control
+#undef rtems_io_initialize
+#undef rtems_io_open
+#undef rtems_io_read
+#undef rtems_io_write
+#undef rtems_port_internal_to_external
+#undef rtems_port_external_to_internal
+#undef rtems_port_create
+#undef rtems_port_delete
+#undef rtems_port_ident
+#undef rtems_event_receive
+#undef rtems_event_send
+#undef rtems_initialize_executive
+#undef rtems_shutdown_executive
+#undef rtems_interrupt_catch
+#undef rtems_partition_create
+#undef rtems_partition_delete
+#undef rtems_partition_get_buffer
+#undef rtems_partition_ident
+#undef rtems_partition_return_buffer
+#undef rtems_message_queue_broadcast
+#undef rtems_message_queue_create
+#undef rtems_message_queue_delete
+#undef rtems_message_queue_flush
+#undef rtems_message_queue_ident
+#undef rtems_message_queue_receive
+#undef rtems_message_queue_send
+#undef rtems_message_queue_urgent
+#undef rtems_region_create
+#undef rtems_region_delete
+#undef rtems_region_get_segment
+#undef rtems_region_ident
+#undef rtems_region_return_segment
+#undef rtems_semaphore_create
+#undef rtems_semaphore_delete
+#undef rtems_semaphore_ident
+#undef rtems_semaphore_obtain
+#undef rtems_semaphore_release
+#undef rtems_task_create
+#undef rtems_task_delete
+#undef rtems_task_get_note
+#undef rtems_task_ident
+#undef rtems_task_mode
+#undef rtems_task_restart
+#undef rtems_task_resume
+#undef rtems_task_set_note
+#undef rtems_task_set_priority
+#undef rtems_task_start
+#undef rtems_task_suspend
+#undef rtems_clock_get
+#undef rtems_clock_set
+#undef rtems_clock_tick
+#undef rtems_task_wake_after
+#undef rtems_task_wake_when
+#undef rtems_fatal_error_occurred
+#undef rtems_rate_monotonic_create
+#undef rtems_rate_monotonic_ident
+#undef rtems_rate_monotonic_delete
+#undef rtems_rate_monotonic_cancel
+#undef rtems_rate_monotonic_period
+#undef rtems_multiprocessing_announce
+#undef rtems_timer_create
+#undef rtems_timer_ident
+#undef rtems_timer_delete
+#undef rtems_timer_cancel
+#undef rtems_timer_fire_after
+#undef rtems_timer_fire_when
+#undef rtems_timer_reset
+
+#define rtems_signal_catch( asraddr, mode ) \
+ Empty_directive( asraddr, mode )
+#define rtems_signal_send( tid, signal ) \
+ Empty_directive( tid, signal )
+
+#define rtems_io_close( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_control( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_initialize( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_open( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_read( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_write( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+
+#define rtems_port_internal_to_external( dpid, internal, external ) \
+ Empty_directive( dpid, internal, external )
+#define rtems_port_external_to_internal( dpid, external, internal ) \
+ Empty_directive( dpid, external, internal )
+#define rtems_port_create( name, intaddr, extaddr, length, dpid ) \
+ Empty_directive( name, intaddr, extaddr, length, dpid )
+#define rtems_port_delete( dpid ) \
+ Empty_directive( dpid )
+#define rtems_port_ident( name, dpid ) \
+ Empty_directive( name, dpid )
+
+#define rtems_event_receive( eventin, options, timeout, eventout ) \
+ Empty_directive( eventin, options, timeout, eventout )
+#define rtems_event_send( tid, event ) \
+ Empty_directive( tid, event )
+
+#define rtems_initialize_executive( conftbl, cputbl ) \
+ Empty_directive( conftbl, cputbl )
+#define rtems_shutdown_executive( the_error ) \
+ Empty_directive( the_error )
+
+#define rtems_interrupt_catch( israddr, vector, oldisr ) \
+ Empty_directive( israddr, vector, oldisr )
+
+#define rtems_partition_create( name, paddr, length, bsize, attr, ptid ) \
+ Empty_directive( name, paddr, length, bsize, attr, ptid )
+#define rtems_partition_delete( ptid ) \
+ Empty_directive( ptid )
+#define rtems_partition_get_buffer( ptid, bufaddr ) \
+ Empty_directive( ptid, bufaddr )
+#define rtems_partition_ident( name, node, ptid ) \
+ Empty_directive( name, node, ptid )
+#define rtems_partition_return_buffer( ptid, bufaddr ) \
+ Empty_directive( ptid, bufaddr )
+
+#define rtems_message_queue_broadcast( qid, buffer, count ) \
+ Empty_directive( qid, buffer, count )
+#define rtems_message_queue_create( name, count, attr, qid ) \
+ Empty_directive( name, count, attr, qid )
+#define rtems_message_queue_delete( qid ) \
+ Empty_directive( qid )
+#define rtems_message_queue_flush( qid, count ) \
+ Empty_directive( qid, count )
+#define rtems_message_queue_ident( name, node, qid ) \
+ Empty_directive( name, node, qid )
+#define rtems_message_queue_receive( qid, buffer, options, timeout ) \
+ Empty_directive( qid, buffer, options, timeout )
+#define rtems_message_queue_send( qid, buffer ) \
+ Empty_directive( qid, buffer )
+#define rtems_message_queue_urgent( qid, buffer ) \
+ Empty_directive( qid, buffer )
+
+#define rtems_region_create( name, paddr, length, pagesize, attr, rnid ) \
+ Empty_directive( name, paddr, length, pagesize, attr, rnid )
+#define rtems_region_delete( rnid ) \
+ Empty_directive( rnid )
+#define rtems_region_get_segment( rnid, size, options, timeout, segaddr ) \
+ Empty_directive( rnid, size, options, timeout, segaddr )
+#define rtems_region_ident( name, rnid ) \
+ Empty_directive( name, rnid )
+#define rtems_region_return_segment( rnid, segaddr ) \
+ Empty_directive( rnid, segaddr )
+
+#define rtems_semaphore_create( name, count, attr, priceil, smid ) \
+ Empty_directive( name, count, attr, priceil, smid )
+#define rtems_semaphore_delete( smid ) \
+ Empty_directive( smid )
+#define rtems_semaphore_ident( name, node, smid ) \
+ Empty_directive( name, node, smid )
+#define rtems_semaphore_obtain( smid, options, timeout ) \
+ Empty_directive( smid, options, timeout )
+#define rtems_semaphore_release( smid ) \
+ Empty_directive( smid )
+
+#define rtems_task_create( name, priority, stack_size, mode, attr, tid ) \
+ Empty_directive( name, priority, stack_size, mode, attr, tid )
+#define rtems_task_delete( tid ) \
+ Empty_directive( tid )
+#define rtems_task_get_note( tid, notepad, note ) \
+ Empty_directive( tid, notepad, note )
+#define rtems_task_ident( name, node, tid ) \
+ Empty_directive( name, node, tid )
+#define rtems_task_mode( mode, mask, pmode ) \
+ Empty_directive( mode, mask, pmode )
+#define rtems_task_restart( tid, arg ) \
+ Empty_directive( tid, arg )
+#define rtems_task_resume( tid ) \
+ Empty_directive( tid )
+#define rtems_task_set_note( tid, notepad, note ) \
+ Empty_directive( tid, notepad, note )
+#define rtems_task_set_priority( tid, priority, ppriority ) \
+ Empty_directive( tid, priority, ppriority )
+#define rtems_task_start( tid, saddr, arg ) \
+ Empty_directive( tid, saddr, arg )
+#define rtems_task_suspend( tid ) \
+ Empty_directive( tid )
+
+#define rtems_clock_get( options, time ) \
+ Empty_directive( options, time )
+#define rtems_clock_set( time ) \
+ Empty_directive( time )
+#define rtems_clock_tick() \
+ Empty_directive()
+#define rtems_task_wake_after( ticks ) \
+ Empty_directive( ticks )
+#define rtems_task_wake_when( time ) \
+ Empty_directive( time )
+
+#define rtems_fatal_error_occurred( errcode ) \
+ Empty_directive( errcode )
+
+#define rtems_rate_monotonic_create( name, id ) \
+ Empty_directive( name, id )
+#define rtems_rate_monotonic_ident( name, id ) \
+ Empty_directive( name, id )
+#define rtems_rate_monotonic_delete( id ) \
+ Empty_directive( id )
+#define rtems_rate_monotonic_cancel( id ) \
+ Empty_directive( id )
+#define rtems_rate_monotonic_period( id, period ) \
+ Empty_directive( id, period )
+
+#define rtems_multiprocessing_announce() \
+ Empty_directive()
+
+#define rtems_timer_create( name, tmid ) \
+ Empty_directive( name, tmid )
+#define rtems_timer_delete( tmid ) \
+ Empty_directive( tmid )
+#define rtems_timer_cancel( tmid ) \
+ Empty_directive( tmid )
+#define rtems_timer_ident( name, tmid ) \
+ Empty_directive( name, tmid )
+#define rtems_timer_fire_after( tmid, ticks, routine, user_data ) \
+ Empty_directive( tmid, ticks, routine, user_data )
+#define rtems_timer_fire_when( tmid, time, routine, user_data ) \
+ Empty_directive( tmid, time, routine, user_data )
+#define rtems_timer_reset( tmid ) \
+ Empty_directive( tmid )
+
+rtems_status_code Empty_directive();
+
+#endif
+/* end of include file */
diff --git a/c/src/tests/tmtests/tmoverhd/empty.c b/c/src/tests/tmtests/tmoverhd/empty.c
new file mode 100644
index 0000000000..8450272b3a
--- /dev/null
+++ b/c/src/tests/tmtests/tmoverhd/empty.c
@@ -0,0 +1,41 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Timer_handler(
+ rtems_id argument
+)
+{
+}
+
+rtems_asr Isr_handler(
+ rtems_signal_set signals
+)
+{
+}
+
+rtems_asr Asr_handler(
+ rtems_signal_set signals
+)
+{
+}
+
+rtems_task task_func() {}
+
+void null_func() {}
+
+rtems_status_code Empty_directive()
+{
+ return( RTEMS_SUCCESSFUL );
+}
diff --git a/c/src/tests/tmtests/tmoverhd/system.h b/c/src/tests/tmtests/tmoverhd/system.h
new file mode 100644
index 0000000000..4e12e00e24
--- /dev/null
+++ b/c/src/tests/tmtests/tmoverhd/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Timer_handler(
+ rtems_id argument
+);
+
+rtems_asr Isr_handler(
+ rtems_signal_set signals
+);
+
+rtems_asr Asr_handler(
+ rtems_signal_set signals
+);
+
+rtems_task task_func();
+
+void null_func();
+
+rtems_status_code Empty_directive();
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/c/src/tests/tmtests/tmoverhd/testtask.c b/c/src/tests/tmtests/tmoverhd/testtask.c
new file mode 100644
index 0000000000..bc1d64279c
--- /dev/null
+++ b/c/src/tests/tmtests/tmoverhd/testtask.c
@@ -0,0 +1,1279 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 Memory_area[ 2048 ];
+rtems_unsigned8 Internal_port_area[ 256 ];
+rtems_unsigned8 External_port_area[ 256 ];
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{ rtems_id id;
+ rtems_status_code status;
+
+ Set_find_average_overhead( TRUE );
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST OVERHEAD ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '1', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+/* comment out the following include to verify type are correct */
+#include "dumrtems.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_name name;
+ rtems_unsigned32 index;
+ rtems_cpu_table cpu_table;
+ rtems_id id;
+ rtems_task_priority in_priority;
+ rtems_task_priority out_priority;
+ rtems_mode in_mode;
+ rtems_mode mask;
+ rtems_mode out_mode;
+ rtems_unsigned32 note;
+ rtems_time_of_day time;
+ rtems_interval timeout;
+ rtems_signal_set signals;
+ void *address_1;
+ rtems_event_set events;
+ long buffer[ 4 ];
+ rtems_unsigned32 count;
+ rtems_device_major_number major;
+ rtems_device_minor_number minor;
+ rtems_unsigned32 io_result;
+ rtems_unsigned32 error;
+ rtems_clock_get_options options;
+
+ name = rtems_build_name( 'N', 'A', 'M', 'E' );
+ in_priority = 250;
+ in_mode = RTEMS_NO_PREEMPT;
+ mask = RTEMS_PREEMPT_MASK;
+ note = 8;
+ timeout = 100;
+ signals = RTEMS_SIGNAL_1 | RTEMS_SIGNAL_3;
+ major = 10;
+ minor = 0;
+ error = 100;
+ options = 0;
+
+/* rtems_initialize_executive */
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_initialize_executive( &BSP_Configuration, &cpu_table );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_initialize_executive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_shutdown_executive */
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_shutdown_executive( error );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_shutdown_executive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_create(
+ name,
+ in_priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_ident( name, RTEMS_SEARCH_ALL_NODES, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_start */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_start( id, Task_1, 0 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_start",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_restart */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_restart( id, 0 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_suspend */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_suspend( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_suspend",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_resume */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_resume( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_resume",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_set_priority */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_set_priority( id, in_priority, &out_priority );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_mode */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_mode( in_mode, mask, &out_mode );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_get_note */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_get_note( id, 1, note );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_get_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_set_note */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_set_note( id, 1, note );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_wake_when */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_wake_when( time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_when",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_wake_after */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_wake_after( timeout );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_after",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_interrupt_catch */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_interrupt_catch( Isr_handler, 5, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_interrupt_catch",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_clock_get */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_clock_get( options, time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_get",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_clock_set */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_clock_set( time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_set",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_clock_tick */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_clock_tick();
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_tick",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+rtems_test_pause();
+
+/* rtems_timer_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_create( name, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_fire_after */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_fire_after(
+ id,
+ timeout,
+ Timer_handler,
+ NULL
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_after",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_fire_when */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_fire_when(
+ id,
+ time,
+ Timer_handler,
+ NULL
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_when",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_reset */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_reset( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_reset",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_cancel */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_cancel( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_cancel",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_create(
+ name,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_ident( name, RTEMS_SEARCH_ALL_NODES, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_obtain */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_obtain( id, RTEMS_DEFAULT_OPTIONS, timeout );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_obtain",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_release */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_release( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_release",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_create(
+ name,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_ident(
+ name,
+ RTEMS_SEARCH_ALL_NODES,
+ id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_send */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_send( id, (long (*)[4])buffer );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_send",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_urgent */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_urgent( id, (long (*)[4])buffer );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_urgent",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_broadcast */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_broadcast(
+ id,
+ (long (*)[4])buffer,
+ &count
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_receive */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_receive(
+ id,
+ (long (*)[4])buffer,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_receive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_flush */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_flush( id, &count );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_flush",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+rtems_test_pause();
+
+/* rtems_event_send */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_event_send( id, events );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_event_receive */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout,
+ &events
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_signal_catch */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_signal_catch( Asr_handler, RTEMS_DEFAULT_MODES );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_catch",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_signal_send */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_signal_send( id, signals );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_send",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_create(
+ name,
+ Memory_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_ident( name, RTEMS_SEARCH_ALL_NODES, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_get_buffer */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_get_buffer( id, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_get_buffer",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_return_buffer */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_return_buffer( id, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_return_buffer",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_create(
+ name,
+ Memory_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_get_segment */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_get_segment(
+ id,
+ 243,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout,
+ &address_1
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_return_segment */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_return_segment( id, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_create(
+ name,
+ Internal_port_area,
+ External_port_area,
+ 0xff,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_external_to_internal */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_external_to_internal(
+ id,
+ &External_port_area[ 7 ],
+ address_1
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_external_to_internal",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_internal_to_external */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_internal_to_external(
+ id,
+ &Internal_port_area[ 7 ],
+ address_1
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_internal_to_external",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+rtems_test_pause();
+
+/* rtems_io_initialize */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_initialize(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_initialize",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_open */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_open(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_open",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_close */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_close(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_close",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_read */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_read(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_read",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_write */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_write(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_write",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_control */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_control(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_control",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_fatal_error_occurred */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_fatal_error_occurred( error );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_fatal_error_occurred",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_create( name, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_cancel */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_cancel( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_cancel",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_period */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_period( id, timeout );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_multiprocessing_announce */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_multiprocessing_announce();
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_multiprocessing_announce",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+ puts( "*** END OF TIME OVERHEAD ***" );
+
+ exit( 0 );
+}
diff --git a/c/src/tests/tmtests/tmoverhd/tmoverhd.doc b/c/src/tests/tmtests/tmoverhd/tmoverhd.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/c/src/tests/tmtests/tmoverhd/tmoverhd.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/c/src/tests/tools/generic/Makefile.in b/c/src/tests/tools/generic/Makefile.in
new file mode 100644
index 0000000000..aa7318f8cb
--- /dev/null
+++ b/c/src/tests/tools/generic/Makefile.in
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/tests
+
+PGMS=difftest sorttimes
+
+INSTALLED=$(PGMS:%=$(DESTDIR)/%)
+
+all: $(DESTDIR) $(PGMS) install
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
diff --git a/c/src/tests/tools/generic/difftest b/c/src/tests/tools/generic/difftest
new file mode 100644
index 0000000000..45f0df81ac
--- /dev/null
+++ b/c/src/tests/tools/generic/difftest
@@ -0,0 +1,114 @@
+#!KSHELL -p
+#
+# Check test results against official output from the src tree
+#
+# $Id$
+#
+
+# XXX: do not run size.exe with this; it asks questions we don't answer
+
+# how to do arith in bash
+# i=$((i * 2))
+# b=$((b + 1))
+
+# progname=`basename $0`
+progname=${0##*/} # fast basename hack for ksh, bash
+
+USAGE=\
+"usage: $progname [ -opts ] test [ test ... ]
+ -v -- verbose
+ -l logdir -- specify log directory (default is 'logdir')
+"
+
+# log an error to stderr
+prerr()
+{
+ echo "$*" >&2
+}
+
+fatal() {
+ [ "$1" ] && prerr $*
+ prerr "$USAGE"
+ exit 1
+}
+
+warn() {
+ [ "$1" ] && prerr $*
+}
+
+#
+# process the options
+#
+# defaults for getopt vars
+#
+
+verbose=""
+logdir=log
+
+while getopts v12o:l: OPT
+do
+ case "$OPT" in
+ v)
+ verbose="yes";;
+ l)
+ logdir="$OPTARG";;
+ *)
+ fatal;;
+ esac
+done
+shiftcount=`expr $OPTIND - 1`
+shift $shiftcount
+
+args=$*
+
+#
+# Run the tests
+#
+
+test -d $logdir || fatal "No log directory: ./$logdir"
+
+tests="$args"
+if [ ! "$tests" ]
+then
+ cd $logdir
+ set -- `echo sp?? mp??_? psx??`
+ cd ..
+ tests="$*"
+fi
+
+for t in $tests
+do
+ logfile=$t
+
+ if [ ! -f $logdir/$logfile ]
+ then
+ continue
+ fi
+
+ echo $logfile
+ echo
+
+ case $t in
+ mp*)
+ mptest=`echo $t | sed 's/_.//'`
+ node=`echo $t | sed 's/...._//'`
+ scn_file=mptests/node$node/$mptest.scn;;
+ sp*)
+ scn_file=sptests/$t.scn;;
+ psx*)
+ scn_file=psxtests/$t.scn;;
+ *)
+ fatal "unknown test $t";;
+ esac
+
+ sed -e '/^$/d' < $logdir/$logfile | diff -b screens/$scn_file -
+ echo
+ echo
+done
+
+exit 0
+
+# Local Variables: ***
+# mode:ksh ***
+# End: ***
+
diff --git a/c/src/tests/tools/generic/sorttimes b/c/src/tests/tools/generic/sorttimes
new file mode 100644
index 0000000000..161f5e30b0
--- /dev/null
+++ b/c/src/tests/tools/generic/sorttimes
@@ -0,0 +1,192 @@
+#!KSHELL -p
+#
+# This script takes the output from the Timing Test Suite, reorders
+# it, and adds headers so it is in the same order as is printed in
+# the supplement.
+#
+
+usage()
+{
+ echo "${progname} file [more files]"
+}
+
+header()
+{
+ echo
+ echo $*
+ echo
+}
+
+lookup()
+{
+ grep "$*" $files
+
+}
+
+progname=$0
+
+if [ $# -eq 0 ] ; then
+ usage
+ exit 0
+fi
+
+files=$*
+
+header Context Switch
+lookup context switch: self
+lookup context switch: to another task
+lookup context switch: no floating point contexts
+lookup fp context switch: restore 1st FP task
+lookup fp context switch: save initialized, restore initialized
+lookup fp context switch: save idle, restore initialized
+lookup fp context switch: save idle, restore idle
+
+header Task Manager
+lookup rtems_task_create
+lookup rtems_task_ident
+lookup rtems_task_start
+lookup rtems_task_restart: calling task
+lookup rtems_task_restart: suspended task -- returns to caller
+lookup rtems_task_restart: blocked task -- returns to caller
+lookup rtems_task_restart: ready task -- returns to caller
+lookup rtems_task_restart: suspended task -- preempts caller
+lookup rtems_task_restart: blocked task -- preempts caller
+lookup rtems_task_restart: ready task -- preempts caller
+lookup rtems_task_delete: calling task
+lookup rtems_task_delete: suspended task
+lookup rtems_task_delete: blocked task
+lookup rtems_task_delete: ready task
+lookup rtems_task_suspend: calling task
+lookup rtems_task_suspend: returns to caller
+lookup rtems_task_resume: task readied -- returns to caller
+lookup rtems_task_resume: task readied -- preempts caller
+lookup rtems_task_set_priority: obtain current priority
+lookup rtems_task_set_priority: returns to caller
+lookup rtems_task_set_priority: preempts caller
+lookup rtems_task_mode: obtain current mode
+lookup rtems_task_mode: no reschedule
+lookup rtems_task_mode: reschedule -- returns to caller
+lookup rtems_task_mode: reschedule -- preempts caller
+lookup rtems_task_get_note
+lookup rtems_task_set_note
+lookup rtems_task_wake_after: yield -- returns to caller
+lookup rtems_task_wake_after: yields -- preempts caller
+lookup rtems_task_wake_when
+
+header Interrupt Manager
+lookup interrupt entry overhead: returns to nested interrupt
+lookup interrupt entry overhead: returns to interrupted task
+lookup interrupt entry overhead: returns to preempting task
+lookup interrupt exit overhead: returns to nested interrupt
+lookup interrupt exit overhead: returns to interrupted task
+lookup interrupt exit overhead: returns to preempting task
+
+header Clock Manager
+lookup rtems_clock_set
+lookup rtems_clock_get
+lookup rtems_clock_tick
+
+header Timer Manager
+lookup rtems_timer_create
+lookup rtems_timer_ident
+lookup rtems_timer_delete: inactive
+lookup rtems_timer_delete: active
+lookup rtems_timer_fire_after: inactive
+lookup rtems_timer_fire_after: active
+lookup rtems_timer_fire_when: inactive
+lookup rtems_timer_fire_when: active
+lookup rtems_timer_reset: inactive
+lookup rtems_timer_reset: active
+lookup rtems_timer_cancel: inactive
+lookup rtems_timer_cancel: active
+
+header Semaphore Manager
+lookup rtems_semaphore_create
+lookup rtems_semaphore_ident
+lookup rtems_semaphore_delete
+lookup rtems_semaphore_obtain: available
+lookup rtems_semaphore_obtain: not available -- NO_WAIT
+lookup rtems_semaphore_obtain: not available -- caller blocks
+lookup rtems_semaphore_release: no waiting tasks
+lookup rtems_semaphore_release: task readied -- returns to caller
+lookup rtems_semaphore_release: task readied -- preempts caller
+
+header Message Queue Manager
+lookup rtems_message_queue_create
+lookup rtems_message_queue_ident
+lookup rtems_message_queue_delete
+lookup rtems_message_queue_send: no waiting tasks
+lookup rtems_message_queue_send: task readied -- returns to caller
+lookup rtems_message_queue_send: task readied -- preempts caller
+lookup rtems_message_queue_urgent: no waiting tasks
+lookup rtems_message_queue_urgent: task readied -- returns to caller
+lookup rtems_message_queue_urgent: task readied -- preempts caller
+lookup rtems_message_queue_broadcast: no waiting tasks
+lookup rtems_message_queue_broadcast: task readied -- returns to caller
+lookup rtems_message_queue_broadcast: task readied -- preempts caller
+lookup rtems_message_queue_receive: available
+lookup rtems_message_queue_receive: not available -- NO_WAIT
+lookup rtems_message_queue_receive: not available -- caller blocks
+lookup rtems_message_queue_flush: no messages flushed
+lookup rtems_message_queue_flush: messages flushed
+
+header Event Manager
+lookup rtems_event_send: no task readied
+lookup rtems_event_send: task readied -- returns to caller
+lookup rtems_event_send: task readied -- preempts caller
+lookup rtems_event_receive: obtain current events
+lookup rtems_event_receive: available
+lookup rtems_event_receive: not available -- NO_WAIT
+lookup rtems_event_receive: not available -- caller blocks
+
+header Signal Manager
+lookup rtems_signal_catch
+lookup rtems_signal_send: returns to caller
+lookup rtems_signal_send: signal to self
+lookup exit ASR overhead: returns to calling task
+lookup exit ASR overhead: returns to preempting task
+
+header Partition Manager
+lookup rtems_partition_create
+lookup rtems_partition_ident
+lookup rtems_partition_delete
+lookup rtems_partition_get_buffer: available
+lookup rtems_partition_get_buffer: not available
+lookup rtems_partition_return_buffer
+
+header Region Manager
+lookup rtems_region_create
+lookup rtems_region_ident
+lookup rtems_region_delete
+lookup rtems_region_get_segment: available
+lookup rtems_region_get_segment: not available -- NO_WAIT
+lookup rtems_region_get_segment: not available -- caller blocks
+lookup rtems_region_return_segment: no waiting tasks
+lookup rtems_region_return_segment: task readied -- returns to caller
+lookup rtems_region_return_segment: task readied -- preempts caller
+
+header Dual-Ported Memory Manager
+lookup rtems_port_create
+lookup rtems_port_ident
+lookup rtems_port_delete
+lookup rtems_port_internal_to_external
+lookup rtems_port_external_to_internal
+
+header IO Manager
+lookup rtems_io_initialize
+lookup rtems_io_open
+lookup rtems_io_close
+lookup rtems_io_read
+lookup rtems_io_write
+lookup rtems_io_control
+
+header Rate Monotonic Manager
+lookup rtems_rate_monotonic_create
+lookup rtems_rate_monotonic_ident
+lookup rtems_rate_monotonic_cancel
+lookup rtems_rate_monotonic_delete: active
+lookup rtems_rate_monotonic_delete: inactive
+lookup rtems_rate_monotonic_period: obtain status
+lookup rtems_rate_monotonic_period: initiate period -- returns to caller
+lookup rtems_rate_monotonic_period: conclude periods -- caller blocks
+exit 0
diff --git a/c/src/wrapup/Makefile.in b/c/src/wrapup/Makefile.in
new file mode 100644
index 0000000000..0316d5c56b
--- /dev/null
+++ b/c/src/wrapup/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+# build and install "glommed" librtemsall.a
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/lib.cfg
+
+LIB=$(PROJECT_HOME)/lib/librtemsall.a
+
+SRCS=$(wildcard $(PROJECT_HOME)/lib/libbsp$(LIB_VARIANT).a) \
+ $(PROJECT_HOME)/lib/librtems$(LIB_VARIANT).a \
+ $(wildcard $(PROJECT_HOME)/lib/libposix$(LIB_VARIANT).a) \
+ $(PROJECT_HOME)/lib/libcsupport$(LIB_VARIANT).a \
+ $(wildcard $(PROJECT_HOME)/lib/rtems-ctor$(LIB_VARIANT).o) \
+ $(wildcard $(PROJECT_HOME)/lib/libno-ctor$(LIB_VARIANT).a)
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: $(ARCH) $(LIB)
+
+$(LIB): $(SRCS)
+ $(PROJECT_RELEASE)/build-tools/rtems-glom \
+ -d $(PROJECT_HOME)/lib -v -V "$(LIB_VARIANT)" -a $(AR)
+
+install: all
+
diff --git a/c/update-tools/310_to_320_list b/c/update-tools/310_to_320_list
new file mode 100644
index 0000000000..b4add28685
--- /dev/null
+++ b/c/update-tools/310_to_320_list
@@ -0,0 +1,543 @@
+#
+# External API name
+#
+initialize_executive rtems_initialize_executive
+initialize_executive_early rtems_initialize_executive_early
+initialize_executive_late rtems_initialize_executive_late
+shutdown_executive rtems_shutdown_executive
+task_create rtems_task_create
+task_ident rtems_task_ident
+task_start rtems_task_start
+task_restart rtems_task_restart
+task_delete rtems_task_delete
+task_suspend rtems_task_suspend
+task_resume rtems_task_resume
+task_set_priority rtems_task_set_priority
+task_mode rtems_task_mode
+task_get_note rtems_task_get_note
+task_set_note rtems_task_set_note
+task_wake_after rtems_task_wake_after
+task_wake_when rtems_task_wake_when
+interrupt_catch rtems_interrupt_catch
+clock_set rtems_clock_set
+clock_get rtems_clock_get
+clock_tick rtems_clock_tick
+extension_create rtems_extension_create
+extension_ident rtems_extension_ident
+extension_delete rtems_extension_delete
+timer_create rtems_timer_create
+timer_ident rtems_timer_ident
+timer_cancel rtems_timer_cancel
+timer_delete rtems_timer_delete
+timer_fire_after rtems_timer_fire_after
+timer_fire_when rtems_timer_fire_when
+timer_reset rtems_timer_reset
+semaphore_create rtems_semaphore_create
+semaphore_ident rtems_semaphore_ident
+semaphore_delete rtems_semaphore_delete
+semaphore_obtain rtems_semaphore_obtain
+semaphore_release rtems_semaphore_release
+message_queue_create rtems_message_queue_create
+message_queue_ident rtems_message_queue_ident
+message_queue_delete rtems_message_queue_delete
+message_queue_send rtems_message_queue_send
+message_queue_urgent rtems_message_queue_urgent
+message_queue_broadcast rtems_message_queue_broadcast
+message_queue_receive rtems_message_queue_receive
+message_queue_flush rtems_message_queue_flush
+event_send rtems_event_send
+event_receive rtems_event_receive
+signal_catch rtems_signal_catch
+signal_send rtems_signal_send
+partition_create rtems_partition_create
+partition_ident rtems_partition_ident
+partition_delete rtems_partition_delete
+partition_get_buffer rtems_partition_get_buffer
+partition_return_buffer rtems_partition_return_buffer
+region_create rtems_region_create
+region_extend rtems_region_extend
+region_ident rtems_region_ident
+region_delete rtems_region_delete
+region_get_segment rtems_region_get_segment
+region_get_segment_size rtems_region_get_segment_size
+region_return_segment rtems_region_return_segment
+port_create rtems_port_create
+port_ident rtems_port_ident
+port_delete rtems_port_delete
+port_external_to_internal rtems_port_external_to_internal
+port_internal_to_external rtems_port_internal_to_external
+io_initialize rtems_io_initialize
+io_open rtems_io_open
+io_close rtems_io_close
+io_read rtems_io_read
+io_write rtems_io_write
+io_control rtems_io_control
+fatal_error_occurred rtems_fatal_error_occurred
+rate_monotonic_create rtems_rate_monotonic_create
+rate_monotonic_ident rtems_rate_monotonic_ident
+rate_monotonic_delete rtems_rate_monotonic_delete
+rate_monotonic_cancel rtems_rate_monotonic_cancel
+rate_monotonic_period rtems_rate_monotonic_period
+multiprocessing_announce rtems_multiprocessing_announce
+#
+# Internal Names for API
+#
+_Initialize_Executive rtems_initialize_executive
+_Initialize_Executive_early rtems_initialize_executive_early
+_Initialize_Executive_late rtems_initialize_executive_late
+_Shutdown_Executive rtems_shutdown_executive
+_RTEMS_tasks_Create rtems_task_create
+_RTEMS_tasks_Name_to_id rtems_task_ident
+_RTEMS_tasks_Start rtems_task_start
+_RTEMS_tasks_Restart rtems_task_restart
+_RTEMS_tasks_Delete rtems_task_delete
+_RTEMS_tasks_Suspend rtems_task_suspend
+_RTEMS_tasks_Resume rtems_task_resume
+_RTEMS_tasks_Set_priority rtems_task_set_priority
+_RTEMS_tasks_Mode rtems_task_mode
+_RTEMS_tasks_Get_note rtems_task_get_note
+_RTEMS_tasks_Set_note rtems_task_set_note
+_RTEMS_tasks_Wake_after rtems_task_wake_after
+_RTEMS_tasks_Wake_when rtems_task_wake_when
+_Interrupt_Catch rtems_interrupt_catch
+_Clock_Set rtems_clock_set
+_Clock_Get rtems_clock_get
+_Clock_Tick rtems_clock_tick
+_Extension_Create rtems_extension_create
+_Extension_Name_to_id rtems_extension_ident
+_Extension_Delete rtems_extension_delete
+_Timer_Create rtems_timer_create
+_Timer_Name_to_id rtems_timer_ident
+_Timer_Cancel rtems_timer_cancel
+_Timer_Delete rtems_timer_delete
+_Timer_Fire_after rtems_timer_fire_after
+_Timer_Fire_when rtems_timer_fire_when
+_Timer_Reset rtems_timer_reset
+_Semaphore_Create rtems_semaphore_create
+_Semaphore_Name_to_id rtems_semaphore_ident
+_Semaphore_Delete rtems_semaphore_delete
+_Semaphore_Obtain rtems_semaphore_obtain
+_Semaphore_Release rtems_semaphore_release
+_Message_queue_Create rtems_message_queue_create
+_Message_queue_Name_to_id rtems_message_queue_ident
+_Message_queue_Delete rtems_message_queue_delete
+_Message_queue_Send rtems_message_queue_send
+_Message_queue_Urgent rtems_message_queue_urgent
+_Message_queue_Broadcast rtems_message_queue_broadcast
+_Message_queue_Receive rtems_message_queue_receive
+_Message_queue_Flush rtems_message_queue_flush
+_Event_Send rtems_event_send
+_Event_Receive rtems_event_receive
+_Signal_Catch rtems_signal_catch
+_Signal_Send rtems_signal_send
+_Partition_Create rtems_partition_create
+_Partition_Name_to_id rtems_partition_ident
+_Partition_Delete rtems_partition_delete
+_Partition_Get_buffer rtems_partition_get_buffer
+_Partition_Return_buffer rtems_partition_return_buffer
+_Region_Create rtems_region_create
+_Region_Extend rtems_region_extend
+_Region_Name_to_id rtems_region_ident
+_Region_Delete rtems_region_delete
+_Region_Get_segment rtems_region_get_segment
+_Region_Get_segment_size rtems_region_get_segment_size
+_Region_Return_segment rtems_region_return_segment
+_Dual_ported_memory_Create rtems_port_create
+_Dual_ported_memory_Name_to_id rtems_port_ident
+_Dual_ported_memory_Delete rtems_port_delete
+_Dual_ported_memory_External_to_internal rtems_port_external_to_internal
+_Dual_ported_memory_Internal_to_external rtems_port_internal_to_external
+_IO_Initialize rtems_io_initialize
+_IO_Open rtems_io_open
+_IO_Close rtems_io_close
+_IO_Read rtems_io_read
+_IO_Write rtems_io_write
+_IO_Control rtems_io_control
+_Fatal_Error_occurred rtems_fatal_error_occurred
+_Rate_monotonic_Create rtems_rate_monotonic_create
+_Rate_monotonic_Name_to_id rtems_rate_monotonic_ident
+_Rate_monotonic_Delete rtems_rate_monotonic_delete
+_Rate_monotonic_Cancel rtems_rate_monotonic_cancel
+_Rate_monotonic_Period rtems_rate_monotonic_period
+_Multiprocessing_Announce rtems_multiprocessing_announce
+#
+# Status (API names)
+#
+SUCCESSFUL RTEMS_SUCCESSFUL
+TASK_EXITTED RTEMS_TASK_EXITTED
+MP_NOT_CONFIGURED RTEMS_MP_NOT_CONFIGURED
+INVALID_NAME RTEMS_INVALID_NAME
+INVALID_ID RTEMS_INVALID_ID
+TOO_MANY RTEMS_TOO_MANY
+TIMEOUT RTEMS_TIMEOUT
+OBJECT_WAS_DELETED RTEMS_OBJECT_WAS_DELETED
+INVALID_SIZE RTEMS_INVALID_SIZE
+INVALID_ADDRESS RTEMS_INVALID_ADDRESS
+INVALID_NUMBER RTEMS_INVALID_NUMBER
+NOT_DEFINED RTEMS_NOT_DEFINED
+RESOURCE_IN_USE RTEMS_RESOURCE_IN_USE
+UNSATISFIED RTEMS_UNSATISFIED
+INCORRECT_STATE RTEMS_INCORRECT_STATE
+ALREADY_SUSPENDED RTEMS_ALREADY_SUSPENDED
+ILLEGAL_ON_SELF RTEMS_ILLEGAL_ON_SELF
+ILLEGAL_ON_REMOTE_OBJECT RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+CALLED_FROM_ISR RTEMS_CALLED_FROM_ISR
+INVALID_PRIORITY RTEMS_INVALID_PRIORITY
+INVALID_CLOCK RTEMS_INVALID_CLOCK
+INVALID_NODE RTEMS_INVALID_NODE
+NOT_CONFIGURED RTEMS_NOT_CONFIGURED
+NOT_OWNER_OF_RESOURCE RTEMS_NOT_OWNER_OF_RESOURCE
+NOT_IMPLEMENTED RTEMS_NOT_IMPLEMENTED
+INTERNAL_ERROR RTEMS_INTERNAL_ERROR
+PROXY_BLOCKING RTEMS_PROXY_BLOCKING
+NO_MEMORY RTEMS_NO_MEMORY
+STATUS_CODES_FIRST RTEMS_STATUS_CODES_FIRST
+STATUS_CODES_LAST RTEMS_STATUS_CODES_LAST
+#
+# Status (Internal names)
+#
+STATUS_SUCCESSFUL RTEMS_SUCCESSFUL
+STATUS_TASK_EXITTED RTEMS_TASK_EXITTED
+STATUS_MP_NOT_CONFIGURED RTEMS_MP_NOT_CONFIGURED
+STATUS_INVALID_NAME RTEMS_INVALID_NAME
+STATUS_INVALID_ID RTEMS_INVALID_ID
+STATUS_TOO_MANY RTEMS_TOO_MANY
+STATUS_TIMEOUT RTEMS_TIMEOUT
+STATUS_OBJECT_WAS_DELETED RTEMS_OBJECT_WAS_DELETED
+STATUS_INVALID_SIZE RTEMS_INVALID_SIZE
+STATUS_INVALID_ADDRESS RTEMS_INVALID_ADDRESS
+STATUS_INVALID_NUMBER RTEMS_INVALID_NUMBER
+STATUS_NOT_DEFINED RTEMS_NOT_DEFINED
+STATUS_RESOURCE_IN_USE RTEMS_RESOURCE_IN_USE
+STATUS_UNSATISFIED RTEMS_UNSATISFIED
+STATUS_INCORRECT_STATE RTEMS_INCORRECT_STATE
+STATUS_ALREADY_SUSPENDED RTEMS_ALREADY_SUSPENDED
+STATUS_ILLEGAL_ON_SELF RTEMS_ILLEGAL_ON_SELF
+STATUS_ILLEGAL_ON_REMOTE_OBJECT RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+STATUS_CALLED_FROM_ISR RTEMS_CALLED_FROM_ISR
+STATUS_INVALID_PRIORITY RTEMS_INVALID_PRIORITY
+STATUS_INVALID_CLOCK RTEMS_INVALID_CLOCK
+STATUS_INVALID_NODE RTEMS_INVALID_NODE
+STATUS_NOT_CONFIGURED RTEMS_NOT_CONFIGURED
+STATUS_NOT_OWNER_OF_RESOURCE RTEMS_NOT_OWNER_OF_RESOURCE
+STATUS_NOT_IMPLEMENTED RTEMS_NOT_IMPLEMENTED
+STATUS_INTERNAL_ERROR RTEMS_INTERNAL_ERROR
+STATUS_PROXY_BLOCKING RTEMS_PROXY_BLOCKING
+STATUS_NO_MEMORY RTEMS_NO_MEMORY
+#
+# Attributes (External)
+#
+DEFAULT_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
+NO_FLOATING_POINT RTEMS_NO_FLOATING_POINT
+FLOATING_POINT RTEMS_FLOATING_POINT
+LOCAL RTEMS_LOCAL
+GLOBAL RTEMS_GLOBAL
+FIFO RTEMS_FIFO
+PRIORITY RTEMS_PRIORITY
+NO_LIMIT RTEMS_NO_LIMIT
+LIMIT RTEMS_LIMIT
+COUNTING_SEMAPHORE RTEMS_COUNTING_SEMAPHORE
+BINARY_SEMAPHORE RTEMS_BINARY_SEMAPHORE
+NO_INHERIT_PRIORITY RTEMS_NO_INHERIT_PRIORITY
+INHERIT_PRIORITY RTEMS_INHERIT_PRIORITY
+#
+# Attributes (Internal)
+#
+ATTRIBUTES_DEFAULTS RTEMS_DEFAULT_ATTRIBUTES
+ATTRIBUTES_NO_FLOATING_POINT RTEMS_NO_FLOATING_POINT
+ATTRIBUTES_FLOATING_POINT RTEMS_FLOATING_POINT
+ATTRIBUTES_LOCAL RTEMS_LOCAL
+ATTRIBUTES_GLOBAL RTEMS_GLOBAL
+ATTRIBUTES_FIFO RTEMS_FIFO
+ATTRIBUTES_PRIORITY RTEMS_PRIORITY
+ATTRIBUTES_NO_LIMIT RTEMS_NO_LIMIT
+ATTRIBUTES_LIMIT RTEMS_LIMIT
+ATTRIBUTES_COUNTING_SEMAPHORE RTEMS_COUNTING_SEMAPHORE
+ATTRIBUTES_BINARY_SEMAPHORE RTEMS_BINARY_SEMAPHORE
+ATTRIBUTES_NO_INHERIT_PRIORITY RTEMS_NO_INHERIT_PRIORITY
+ATTRIBUTES_INHERIT_PRIORITY RTEMS_INHERIT_PRIORITY
+#
+# Options (External)
+#
+DEFAULT_OPTIONS RTEMS_DEFAULT_OPTIONS
+WAIT RTEMS_WAIT
+NO_WAIT RTEMS_NO_WAIT
+EVENT_ALL RTEMS_EVENT_ALL
+EVENT_ANY RTEMS_EVENT_ANY
+#
+# Options (Internal)
+#
+OPTIONS_DEFAULT RTEMS_DEFAULT_OPTIONS
+OPTIONS_WAIT RTEMS_WAIT
+OPTIONS_NO_WAIT RTEMS_NO_WAIT
+OPTIONS_EVENT_ALL RTEMS_EVENT_ALL
+OPTIONS_EVENT_ANY RTEMS_EVENT_ANY
+#
+# Masks (External)
+#
+ALL_MODE_MASKS RTEMS_ALL_MODE_MASKS
+PREEMPT_MASK RTEMS_PREEMPT_MASK
+TIMESLICE_MASK RTEMS_TIMESLICE_MASK
+ASR_MASK RTEMS_ASR_MASK
+INTERRUPT_MASK RTEMS_INTERRUPT_MASK
+#
+# Masks (Internal)
+#
+MODES_ALL_MASK RTEMS_ALL_MODE_MASKS
+MODES_PREEMPT_MASK RTEMS_PREEMPT_MASK
+MODES_TIMESLICE_MASK RTEMS_TIMESLICE_MASK
+MODES_ASR_MASK RTEMS_ASR_MASK
+MODES_INTERRUPT_MASK RTEMS_INTERRUPT_MASK
+#
+# Modes (Internal)
+#
+MODES_DEFAULTS RTEMS_DEFAULT_MODES
+MODES_PREEMPT RTEMS_PREEMPT
+MODES_NO_PREEMPT RTEMS_NO_PREEMPT
+MODES_NO_TIMESLICE RTEMS_NO_TIMESLICE
+MODES_TIMESLICE RTEMS_TIMESLICE
+MODES_ASR RTEMS_ASR
+MODES_NO_ASR RTEMS_NO_ASR
+_Modes_Interrupt_level RTEMS_INTERRUPT_LEVEL
+#
+# Modes (External)
+#
+DEFAULT_MODES RTEMS_DEFAULT_MODES
+PREEMPT RTEMS_PREEMPT
+NO_PREEMPT RTEMS_NO_PREEMPT
+NO_TIMESLICE RTEMS_NO_TIMESLICE
+TIMESLICE RTEMS_TIMESLICE
+ASR RTEMS_ASR
+NO_ASR RTEMS_NO_ASR
+INTERRUPT_LEVEL RTEMS_INTERRUPT_LEVEL
+#
+# Identification (External)
+#
+SEARCH_ALL_NODES RTEMS_SEARCH_ALL_NODES
+SEARCH_OTHER_NODES RTEMS_SEARCH_OTHER_NODES
+SEARCH_LOCAL_NODE RTEMS_SEARCH_LOCAL_NODE
+WHO_AM_I RTEMS_WHO_AM_I
+#
+# Identification (Internal)
+#
+OBJECTS_SEARCH_ALL_NODES RTEMS_SEARCH_ALL_NODES
+OBJECTS_SEARCH_OTHER_NODES RTEMS_SEARCH_OTHER_NODES
+OBJECTS_SEARCH_LOCAL_NODE RTEMS_SEARCH_LOCAL_NODE
+OBJECTS_WHO_AM_I RTEMS_WHO_AM_I
+#
+# Miscellaneous (External API)
+#
+CURRENT_MODE RTEMS_CURRENT_MODE
+CURRENT_PRIORITY RTEMS_CURRENT_PRIORITY
+PENDING_EVENTS RTEMS_PENDING_EVENTS
+NO_TIMEOUT RTEMS_NO_TIMEOUT
+SELF RTEMS_SELF
+PERIOD_STATUS RTEMS_PERIOD_STATUS
+YIELD_PROCESSOR RTEMS_YIELD_PROCESSOR
+MINIMUM_PRIORITY RTEMS_MINIMUM_PRIORITY
+MAXIMUM_PRIORITY RTEMS_MAXIMUM_PRIORITY
+MINIMUM_STACK_SIZE RTEMS_MINIMUM_STACK_SIZE
+#
+# Miscellaneous (External API)
+#
+MODES_CURRENT RTEMS_CURRENT_MODE
+PRIORITY_CURRENT RTEMS_CURRENT_PRIORITY
+#
+# Events
+#
+ALL_EVENTS RTEMS_ALL_EVENTS
+EVENT_0 RTEMS_EVENT_0
+EVENT_1 RTEMS_EVENT_1
+EVENT_2 RTEMS_EVENT_2
+EVENT_3 RTEMS_EVENT_3
+EVENT_4 RTEMS_EVENT_4
+EVENT_5 RTEMS_EVENT_5
+EVENT_6 RTEMS_EVENT_6
+EVENT_7 RTEMS_EVENT_7
+EVENT_8 RTEMS_EVENT_8
+EVENT_9 RTEMS_EVENT_9
+EVENT_10 RTEMS_EVENT_10
+EVENT_11 RTEMS_EVENT_11
+EVENT_12 RTEMS_EVENT_12
+EVENT_13 RTEMS_EVENT_13
+EVENT_14 RTEMS_EVENT_14
+EVENT_15 RTEMS_EVENT_15
+EVENT_16 RTEMS_EVENT_16
+EVENT_17 RTEMS_EVENT_17
+EVENT_18 RTEMS_EVENT_18
+EVENT_19 RTEMS_EVENT_19
+EVENT_20 RTEMS_EVENT_20
+EVENT_21 RTEMS_EVENT_21
+EVENT_22 RTEMS_EVENT_22
+EVENT_23 RTEMS_EVENT_23
+EVENT_24 RTEMS_EVENT_24
+EVENT_25 RTEMS_EVENT_25
+EVENT_26 RTEMS_EVENT_26
+EVENT_27 RTEMS_EVENT_27
+EVENT_28 RTEMS_EVENT_28
+EVENT_29 RTEMS_EVENT_29
+EVENT_30 RTEMS_EVENT_30
+EVENT_31 RTEMS_EVENT_31
+#
+# Signals
+#
+SIGNAL_0 RTEMS_SIGNAL_0
+SIGNAL_1 RTEMS_SIGNAL_1
+SIGNAL_2 RTEMS_SIGNAL_2
+SIGNAL_3 RTEMS_SIGNAL_3
+SIGNAL_4 RTEMS_SIGNAL_4
+SIGNAL_5 RTEMS_SIGNAL_5
+SIGNAL_6 RTEMS_SIGNAL_6
+SIGNAL_7 RTEMS_SIGNAL_7
+SIGNAL_8 RTEMS_SIGNAL_8
+SIGNAL_9 RTEMS_SIGNAL_9
+SIGNAL_10 RTEMS_SIGNAL_10
+SIGNAL_11 RTEMS_SIGNAL_11
+SIGNAL_12 RTEMS_SIGNAL_12
+SIGNAL_13 RTEMS_SIGNAL_13
+SIGNAL_14 RTEMS_SIGNAL_14
+SIGNAL_15 RTEMS_SIGNAL_15
+SIGNAL_16 RTEMS_SIGNAL_16
+SIGNAL_17 RTEMS_SIGNAL_17
+SIGNAL_18 RTEMS_SIGNAL_18
+SIGNAL_19 RTEMS_SIGNAL_19
+SIGNAL_20 RTEMS_SIGNAL_20
+SIGNAL_21 RTEMS_SIGNAL_21
+SIGNAL_22 RTEMS_SIGNAL_22
+SIGNAL_23 RTEMS_SIGNAL_23
+SIGNAL_24 RTEMS_SIGNAL_24
+SIGNAL_25 RTEMS_SIGNAL_25
+SIGNAL_26 RTEMS_SIGNAL_26
+SIGNAL_27 RTEMS_SIGNAL_27
+SIGNAL_28 RTEMS_SIGNAL_28
+SIGNAL_29 RTEMS_SIGNAL_29
+SIGNAL_30 RTEMS_SIGNAL_30
+SIGNAL_31 RTEMS_SIGNAL_31
+#
+# Notepads
+#
+NOTEPAD_FIRST RTEMS_NOTEPAD_FIRST
+NOTEPAD_0 RTEMS_NOTEPAD_0
+NOTEPAD_1 RTEMS_NOTEPAD_1
+NOTEPAD_2 RTEMS_NOTEPAD_2
+NOTEPAD_3 RTEMS_NOTEPAD_3
+NOTEPAD_4 RTEMS_NOTEPAD_4
+NOTEPAD_5 RTEMS_NOTEPAD_5
+NOTEPAD_6 RTEMS_NOTEPAD_6
+NOTEPAD_7 RTEMS_NOTEPAD_7
+NOTEPAD_8 RTEMS_NOTEPAD_8
+NOTEPAD_9 RTEMS_NOTEPAD_9
+NOTEPAD_10 RTEMS_NOTEPAD_10
+NOTEPAD_11 RTEMS_NOTEPAD_11
+NOTEPAD_12 RTEMS_NOTEPAD_12
+NOTEPAD_13 RTEMS_NOTEPAD_13
+NOTEPAD_14 RTEMS_NOTEPAD_14
+NOTEPAD_15 RTEMS_NOTEPAD_15
+NOTEPAD_LAST RTEMS_NOTEPAD_LAST
+#
+# Multiprocessing
+#
+MIN_PKTSIZE RTEMS_MINIMUM_PACKET_SIZE
+MIN_HETERO_CONV RTEMS_MINIMUN_HETERO_CONVERSION
+#
+# Name and ID External
+#
+get_node rtems_get_node
+get_index rtems_get_index
+build_name rtems_build_name
+name_to_characters rtems_name_to_characters
+#
+# Name and ID Internal
+#
+_Objects_Get_node rtems_get_node
+_Objects_Get_index rtems_get_index
+_Objects_Build_name rtems_build_name
+_Objects_Name_to_characters rtems_name_to_characters
+#
+# clock_get
+#
+CLOCK_GET_TOD RTEMS_CLOCK_GET_TOD
+CLOCK_GET_SECONDS_SINCE_EPOCH RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH
+CLOCK_GET_TICKS_SINCE_BOOT RTEMS_CLOCK_GET_TICKS_SINCE_BOOT
+CLOCK_GET_TICKS_PER_SECOND RTEMS_CLOCK_GET_TICKS_PER_SECOND
+CLOCK_GET_TIME_VALUE RTEMS_CLOCK_GET_TIME_VALUE
+#
+# Status Code Support Routines (External) -- NO CHANGES
+#
+#
+# Status Code Support Routines (Internal)
+#
+_Status_Is_successful rtems_is_status_successful
+_Status_Is_equal rtems_are_statuses_equal
+#
+# Time Conversion Support Routines (External) -- NO CHANGES
+#
+#
+# Time Conversion Support Routines (Internal)
+#
+_TOD_Milliseconds_to_microseconds RTEMS_MILLISECONDS_TO_MICROSECONDS
+_TOD_Milliseconds_to_ticks RTEMS_MILLISECONDS_TO_MICROSECONDS
+#
+# MP packet
+#
+MP_PACKET_INTERNAL_THREADS RTEMS_MP_PACKET_INTERNAL_THREADS
+MP_PACKET_RTEMS_TASKS RTEMS_MP_PACKET_TASKS
+MP_PACKET_MESSAGE_QUEUE RTEMS_MP_PACKET_MESSAGE_QUEUE
+MP_PACKET_SEMAPHORE RTEMS_MP_PACKET_SEMAPHORE
+MP_PACKET_PARTITION RTEMS_MP_PACKET_PARTITION
+MP_PACKET_REGION RTEMS_MP_PACKET_REGION
+MP_PACKET_EVENT RTEMS_MP_PACKET_EVENT
+MP_PACKET_SIGNAL RTEMS_MP_PACKET_SIGNAL
+#
+#
+#
+IO_Major_control rtems_device_major_number
+IO_Minor_control rtems_device_minor_number
+#
+# Configuration Info
+#
+Configuration_Table rtems_configuration_table
+Configuration_Initialization_tasks_table rtems_initialization_tasks_table
+Configuration_Driver_address_table rtems_driver_address_table
+Configuration_Extension_table rtems_extensions_table
+rtems_tasks_create_extension rtems_task_create_extension
+rtems_tasks_start_extension rtems_task_start_extension
+rtems_tasks_restart_extension rtems_task_restart_extension
+rtems_tasks_delete_extension rtems_task_delete_extension
+rtems_tasks_switch_extension rtems_task_switch_extension
+rtems_tasks_begin_extension rtems_task_begin_extension
+rtems_tasks_exitted_extension rtems_task_exitted_extension
+rtems_fatal_extension rtems_fatal_extension
+Configuration_MPCI_table rtems_mpci_table
+Configuration_Multiprocessing_table rtems_multiprocessing_table
+CPU_Table rtems_cpu_table
+#
+Clock_Get_options rtems_clock_get_options
+Clock_Time_value rtems_clock_time_value
+MP_packet_Prefix rtems_packet_prefix
+MP_packet_Classes rtems_mp_packet_classes
+TOD_Control rtems_time_of_day
+ISR_Vector rtems_vector_number
+Watchdog_Interval rtems_interval
+Watchdog_Service rtems_timer_service_routine_entry
+Attributes_Control rtems_attribute
+Modes_Control rtems_mode
+Options_Control rtems_option
+Priority_Control rtems_task_priority
+PRIORITY_MINIMUM RTEMS_MINIMUM_PRIORITY
+PRIORITY_MAXIMUM RTEMS_MAXIMUM_PRIORITY
+Event_sets_Control rtems_event_set
+ASR_Signal_set_control rtems_signal_set
+Status_Codes rtems_status_code
+RTEMS_TASKS_YIELD_PROCESSOR RTEMS_YIELD_PROCESSOR
+RATE_MONOTONIC_PERIOD_STATUS RTEMS_PERIOD_STATUS
+WATCHDOG_FOREVER RTEMS_NO_TIMEOUT
+STACK_MINIMUM_SIZE RTEMS_MINIMUM_STACK_SIZE
+#
+ASR_Handler rtems_asr_entry
+Thread_Entry rtems_task_entry
+#
+disable_intr rtems_interrupt_disable
+enable_intr rtems_interrupt_enable
+flash_intr rtems_interrupt_flash
+
diff --git a/c/update-tools/Makefile.in b/c/update-tools/Makefile.in
new file mode 100644
index 0000000000..200a2b5c6a
--- /dev/null
+++ b/c/update-tools/Makefile.in
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+# NOTE: of course we can't use any of these tools
+# in this Makefile. Most notably: install-if-change
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/update-tools
+
+PGMS=update word-replace
+MISC_SUPPORT=310_to_320_list
+
+INSTALL_LIST= $(PGMS) $(MISC_SUPPORT)
+
+INSTALLED=$(INSTALL_LIST:%=$(DESTDIR)/%)
+
+all: $(DESTDIR)
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
+ $(INSTALL) -m 555 $(PERL_PGMS) ${DESTDIR}
+ $(INSTALL) -m 444 $(srcdir)/$(MISC_SUPPORT) ${DESTDIR}
diff --git a/c/update-tools/README b/c/update-tools/README
new file mode 100644
index 0000000000..bbf99cb71d
--- /dev/null
+++ b/c/update-tools/README
@@ -0,0 +1,7 @@
+#
+# $Id$
+#
+
+This directory contains tools which aid in upgrading from RTEMS 3.1.0
+to RTEMS 3.2.0.
+
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000000..e9e44559f8
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,693 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ alpha:OSF1:*:*)
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-cbm-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-atari-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-sun-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-apple-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ sed 's/^ //' << EOF >dummy.c
+ int main (argc, argv) int argc; char **argv; {
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy \
+ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ sed 's/^ //' << EOF >dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:4)
+ if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=4.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[3478]??:HP-UX:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
+ 9000/8?? ) HP_ARCH=hppa1.0 ;;
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ sed 's/^ //' << EOF >dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i?86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp3[0-9][05]:OpenBSD:*:*)
+ echo m68k-hp-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo i386-pc-cygwin32
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin32
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+ if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
+ echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0
+ elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then
+ echo "powerpc-unknown-linux-gnu" ; exit 0
+ elif test "${UNAME_MACHINE}" = "alpha" ; then
+ echo alpha-unknown-linux-gnu ; exit 0
+ elif test "${UNAME_MACHINE}" = "sparc" ; then
+ echo sparc-unknown-linux-gnu ; exit 0
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us
+ # useful --help. Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ test ! -d /usr/lib/ldscripts/. \
+ && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+ # Determine whether the default compiler is a.out or elf
+ cat >dummy.c <<EOF
+main(argc, argv)
+int argc;
+char *argv[];
+{
+#ifdef __ELF__
+ printf ("%s-pc-linux-gnu\n", argv[1]);
+#else
+ printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ i?86:LynxOS:2.*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000000..f2685b4d4d
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,933 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ linux-gnu*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple)
+ os=
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \
+ | arme[lb] | pyramid \
+ | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
+ | alpha | we32k | ns16k | clipper | i370 | sh \
+ | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
+ | pdp11 | mips64el | mips64orion | mips64orionel \
+ | sparc | sparclet | sparclite | sparc64 | no_cpu)
+ if [ $os != -rtems ]
+ then
+ basic_machine=$basic_machine-unknown
+ fi
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i[3456]86)
+ if [ $os != -rtems ]
+ then
+ basic_machine=$basic_machine-pc
+ fi
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+ | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
+ | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+ | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+ | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* | f301-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-cbm
+ ;;
+ amigados)
+ basic_machine=m68k-cbm
+ os=-amigados
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[3456]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[3456]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[3456]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[3456]86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5)
+ basic_machine=i586-intel
+ ;;
+ pentiumpro | p6)
+ basic_machine=i686-intel
+ ;;
+ pentium-* | p5-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ k5)
+ # We don't have specific support for AMD's K5 yet, so just call it a Pentium
+ basic_machine=i586-amd
+ ;;
+ nexen)
+ # We don't have specific support for Nexgen yet, so just call it a Pentium
+ basic_machine=i586-nexgen
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ mips)
+ basic_machine=mips-mips
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -unixware* | svr4*)
+ os=-sysv4
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -linux-gnu* | -uxpv*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigados
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f301-fujitsu)
+ os=-uxpv
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/configure b/configure
new file mode 100644
index 0000000000..5518a08200
--- /dev/null
+++ b/configure
@@ -0,0 +1,1738 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --with-cross-host=HOST host (cygnus)"
+ac_help="$ac_help
+\
+ --disable-posix disable posix interface"
+ac_help="$ac_help
+\
+ --disable-rtems-inlines disable RTEMS inline functions (use macros)"
+ac_help="$ac_help
+\
+ --enable-gcc28 enable use of gcc 2.8.x features"
+ac_help="$ac_help
+\
+ --enable-libcdir=directory set the directory for the C library"
+ac_help="$ac_help
+\
+ --disable-tests disable tests"
+ac_help="$ac_help
+\
+ --enable-hwapi enable hardware API library"
+ac_help="$ac_help
+\
+ --enable-rtemsbsp=bsp1 bsp2 .. prefix for cross-tools"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.12"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=README
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+a29k_mk="c/src/exec/score/cpu/a29k/Makefile \
+c/src/lib/libbsp/a29k/Makefile \
+c/src/lib/libbsp/a29k/portsw/Makefile \
+c/src/lib/libbsp/a29k/portsw/console/Makefile \
+c/src/lib/libbsp/a29k/portsw/include/Makefile \
+c/src/lib/libbsp/a29k/portsw/shmsupp/Makefile \
+c/src/lib/libbsp/a29k/portsw/startup/Makefile \
+c/src/lib/libbsp/a29k/portsw/wrapup/Makefile \
+c/src/lib/start/a29k/Makefile"
+
+i386_mk="c/src/exec/score/cpu/i386/Makefile \
+c/src/lib/libbsp/i386/Makefile \
+c/src/lib/libbsp/i386/force386/Makefile \
+c/src/lib/libbsp/i386/force386/clock/Makefile \
+c/src/lib/libbsp/i386/force386/console/Makefile \
+c/src/lib/libbsp/i386/force386/include/Makefile \
+c/src/lib/libbsp/i386/force386/shmsupp/Makefile \
+c/src/lib/libbsp/i386/force386/startup/Makefile \
+c/src/lib/libbsp/i386/force386/timer/Makefile \
+c/src/lib/libbsp/i386/force386/wrapup/Makefile \
+c/src/lib/libbsp/i386/i386ex/Makefile \
+c/src/lib/libbsp/i386/i386ex/clock/Makefile \
+c/src/lib/libbsp/i386/i386ex/console/Makefile \
+c/src/lib/libbsp/i386/i386ex/include/Makefile \
+c/src/lib/libbsp/i386/i386ex/startup/Makefile \
+c/src/lib/libbsp/i386/i386ex/timer/Makefile \
+c/src/lib/libbsp/i386/i386ex/wrapup/Makefile \
+c/src/lib/start/i386/Makefile"
+
+i386_go32_mk="c/src/exec/score/cpu/i386/Makefile \
+c/src/lib/libbsp/i386/Makefile \
+c/src/lib/libbsp/i386/go32/Makefile \
+c/src/lib/libbsp/i386/go32/clock/Makefile \
+c/src/lib/libbsp/i386/go32/console/Makefile \
+c/src/lib/libbsp/i386/go32/include/Makefile \
+c/src/lib/libbsp/i386/go32/startup/Makefile \
+c/src/lib/libbsp/i386/go32/timer/Makefile \
+c/src/lib/libbsp/i386/go32/wrapup/Makefile"
+
+m68k_mk="c/src/exec/score/cpu/m68k/Makefile \
+c/src/lib/libbsp/m68k/Makefile \
+c/src/lib/libbsp/m68k/dmv152/Makefile \
+c/src/lib/libbsp/m68k/dmv152/clock/Makefile \
+c/src/lib/libbsp/m68k/dmv152/console/Makefile \
+c/src/lib/libbsp/m68k/dmv152/include/Makefile \
+c/src/lib/libbsp/m68k/dmv152/spurious/Makefile \
+c/src/lib/libbsp/m68k/dmv152/startup/Makefile \
+c/src/lib/libbsp/m68k/dmv152/timer/Makefile \
+c/src/lib/libbsp/m68k/dmv152/wrapup/Makefile \
+c/src/lib/libbsp/m68k/efi332/Makefile \
+c/src/lib/libbsp/m68k/efi332/clock/Makefile \
+c/src/lib/libbsp/m68k/efi332/console/Makefile \
+c/src/lib/libbsp/m68k/efi332/include/Makefile \
+c/src/lib/libbsp/m68k/efi332/spurious/Makefile \
+c/src/lib/libbsp/m68k/efi332/startup/Makefile \
+c/src/lib/libbsp/m68k/efi332/start332/Makefile \
+c/src/lib/libbsp/m68k/efi332/timer/Makefile \
+c/src/lib/libbsp/m68k/efi332/wrapup/Makefile \
+c/src/lib/libbsp/m68k/efi68k/Makefile \
+c/src/lib/libbsp/m68k/efi68k/clock/Makefile \
+c/src/lib/libbsp/m68k/efi68k/console/Makefile \
+c/src/lib/libbsp/m68k/efi68k/include/Makefile \
+c/src/lib/libbsp/m68k/efi68k/spurious/Makefile \
+c/src/lib/libbsp/m68k/efi68k/startup/Makefile \
+c/src/lib/libbsp/m68k/efi68k/start68k/Makefile \
+c/src/lib/libbsp/m68k/efi68k/timer/Makefile \
+c/src/lib/libbsp/m68k/efi68k/wrapup/Makefile \
+c/src/lib/libbsp/m68k/gen68302/Makefile \
+c/src/lib/libbsp/m68k/gen68302/clock/Makefile \
+c/src/lib/libbsp/m68k/gen68302/console/Makefile \
+c/src/lib/libbsp/m68k/gen68302/include/Makefile \
+c/src/lib/libbsp/m68k/gen68302/start302/Makefile \
+c/src/lib/libbsp/m68k/gen68302/startup/Makefile \
+c/src/lib/libbsp/m68k/gen68302/timer/Makefile \
+c/src/lib/libbsp/m68k/gen68302/wrapup/Makefile \
+c/src/lib/libbsp/m68k/gen68360/Makefile \
+c/src/lib/libbsp/m68k/gen68360/clock/Makefile \
+c/src/lib/libbsp/m68k/gen68360/console/Makefile \
+c/src/lib/libbsp/m68k/gen68360/include/Makefile \
+c/src/lib/libbsp/m68k/gen68360/start360/Makefile \
+c/src/lib/libbsp/m68k/gen68360/startup/Makefile \
+c/src/lib/libbsp/m68k/gen68360/timer/Makefile \
+c/src/lib/libbsp/m68k/gen68360/network/Makefile \
+c/src/lib/libbsp/m68k/gen68360/wrapup/Makefile \
+c/src/lib/libbsp/m68k/idp/Makefile \
+c/src/lib/libbsp/m68k/idp/clock/Makefile \
+c/src/lib/libbsp/m68k/idp/console/Makefile \
+c/src/lib/libbsp/m68k/idp/include/Makefile \
+c/src/lib/libbsp/m68k/idp/startup/Makefile \
+c/src/lib/libbsp/m68k/idp/timer/Makefile \
+c/src/lib/libbsp/m68k/idp/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme136/Makefile \
+c/src/lib/libbsp/m68k/mvme136/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme136/console/Makefile \
+c/src/lib/libbsp/m68k/mvme136/include/Makefile \
+c/src/lib/libbsp/m68k/mvme136/shmsupp/Makefile \
+c/src/lib/libbsp/m68k/mvme136/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme136/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme136/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme147/Makefile \
+c/src/lib/libbsp/m68k/mvme147/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme147/console/Makefile \
+c/src/lib/libbsp/m68k/mvme147/include/Makefile \
+c/src/lib/libbsp/m68k/mvme147/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme147/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme147/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/console/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/include/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/shmsupp/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme162/Makefile \
+c/src/lib/libbsp/m68k/mvme162/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme162/console/Makefile \
+c/src/lib/libbsp/m68k/mvme162/include/Makefile \
+c/src/lib/libbsp/m68k/mvme162/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme162/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme162/tools/Makefile \
+c/src/lib/libbsp/m68k/mvme162/wrapup/Makefile \
+c/src/lib/start/m68k/Makefile"
+
+no_cpu_mk="c/src/exec/score/cpu/no_cpu/Makefile \
+c/src/lib/libbsp/no_cpu/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/clock/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/console/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/include/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/startup/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/timer/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/wrapup/Makefile"
+
+sparc_mk="c/src/exec/score/cpu/sparc/Makefile \
+c/src/lib/libbsp/sparc/Makefile \
+c/src/lib/libbsp/sparc/erc32/Makefile \
+c/src/lib/libbsp/sparc/erc32/clock/Makefile \
+c/src/lib/libbsp/sparc/erc32/console/Makefile \
+c/src/lib/libbsp/sparc/erc32/include/Makefile \
+c/src/lib/libbsp/sparc/erc32/startsis/Makefile \
+c/src/lib/libbsp/sparc/erc32/startup/Makefile \
+c/src/lib/libbsp/sparc/erc32/timer/Makefile \
+c/src/lib/libbsp/sparc/erc32/wrapup/Makefile \
+c/src/lib/libcpu/sparc/Makefile \
+c/src/lib/libcpu/sparc/reg_win/Makefile"
+
+hppa1_1_mk="c/src/exec/score/cpu/hppa1_1/Makefile \
+c/src/exec/score/tools/hppa1_1/Makefile \
+c/src/lib/libbsp/hppa1_1/Makefile \
+c/src/lib/libbsp/hppa1_1/pxfl/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/include/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/shmsupp/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/startup/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/tools/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/tty/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/wrapup/Makefile \
+c/src/lib/libcpu/hppa1_1/Makefile \
+c/src/lib/libcpu/hppa1_1/clock/Makefile \
+c/src/lib/libcpu/hppa1_1/include/Makefile \
+c/src/lib/libcpu/hppa1_1/milli/Makefile \
+c/src/lib/libcpu/hppa1_1/runway/Makefile \
+c/src/lib/libcpu/hppa1_1/semaphore/Makefile \
+c/src/lib/libcpu/hppa1_1/timer/Makefile \
+c/src/lib/start/hppa1_1/Makefile"
+
+i960_mk="c/src/exec/score/cpu/i960/Makefile \
+c/src/lib/libbsp/i960/Makefile \
+c/src/lib/libbsp/i960/cvme961/Makefile \
+c/src/lib/libbsp/i960/cvme961/clock/Makefile \
+c/src/lib/libbsp/i960/cvme961/console/Makefile \
+c/src/lib/libbsp/i960/cvme961/include/Makefile \
+c/src/lib/libbsp/i960/cvme961/shmsupp/Makefile \
+c/src/lib/libbsp/i960/cvme961/startup/Makefile \
+c/src/lib/libbsp/i960/cvme961/timer/Makefile \
+c/src/lib/libbsp/i960/cvme961/wrapup/Makefile \
+c/src/lib/start/i960/Makefile"
+
+mips64orion_mk="c/src/exec/score/cpu/mips64orion/Makefile \
+c/src/lib/libbsp/mips64orion/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/console/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/include/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/liblnk/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/startup/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/wrapup/Makefile \
+c/src/lib/libcpu/mips64orion/Makefile \
+c/src/lib/libcpu/mips64orion/clock/Makefile \
+c/src/lib/libcpu/mips64orion/include/Makefile \
+c/src/lib/libcpu/mips64orion/timer/Makefile \
+c/src/lib/start/mips64orion/Makefile"
+
+powerpc_mk="c/src/exec/score/cpu/ppc/Makefile \
+c/src/lib/libbsp/ppc/Makefile \
+c/src/lib/libbsp/ppc/papyrus/Makefile \
+c/src/lib/libbsp/ppc/papyrus/dlentry/Makefile \
+c/src/lib/libbsp/ppc/papyrus/flashentry/Makefile \
+c/src/lib/libbsp/ppc/papyrus/include/Makefile \
+c/src/lib/libbsp/ppc/papyrus/startup/Makefile \
+c/src/lib/libbsp/ppc/papyrus/wrapup/Makefile \
+c/src/lib/libcpu/ppc/Makefile \
+c/src/lib/libcpu/ppc/ppc403/Makefile \
+c/src/lib/libcpu/ppc/ppc403/clock/Makefile \
+c/src/lib/libcpu/ppc/ppc403/console/Makefile \
+c/src/lib/libcpu/ppc/ppc403/include/Makefile \
+c/src/lib/libcpu/ppc/ppc403/timer/Makefile \
+c/src/lib/libcpu/ppc/ppc403/vectors/Makefile"
+
+posix_mk="c/src/exec/score/cpu/unix/Makefile \
+c/src/exec/score/tools/unix/Makefile \
+c/src/lib/libbsp/unix/Makefile \
+c/src/lib/libbsp/unix/posix/Makefile \
+c/src/lib/libbsp/unix/posix/clock/Makefile \
+c/src/lib/libbsp/unix/posix/console/Makefile \
+c/src/lib/libbsp/unix/posix/include/Makefile \
+c/src/lib/libbsp/unix/posix/shmsupp/Makefile \
+c/src/lib/libbsp/unix/posix/startup/Makefile \
+c/src/lib/libbsp/unix/posix/timer/Makefile \
+c/src/lib/libbsp/unix/posix/wrapup/Makefile"
+
+hwapi_mk="\
+c/src/lib/libhwapi/Makefile \
+c/src/lib/libhwapi/eeprom/Makefile \
+c/src/lib/libhwapi/eeprom/wrapup/Makefile \
+c/src/lib/libhwapi/eeprom/eeprom/Makefile \
+c/src/lib/libhwapi/drivers/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/dmv202/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/dmv536/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/dmv666/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/wrapup/Makefile \
+c/src/lib/libhwapi/serial/Makefile \
+c/src/lib/libhwapi/serial/default/Makefile \
+c/src/lib/libhwapi/serial/stream/Makefile \
+c/src/lib/libhwapi/serial/template/Makefile \
+c/src/lib/libhwapi/serial/wrapup/Makefile \
+c/src/lib/libhwapi/serial/channel/Makefile \
+c/src/lib/libhwapi/discrete/Makefile \
+c/src/lib/libhwapi/discrete/tools/Makefile \
+c/src/lib/libhwapi/discrete/relay/Makefile \
+c/src/lib/libhwapi/discrete/wrapup/Makefile \
+c/src/lib/libhwapi/discrete/greycode/Makefile \
+c/src/lib/libhwapi/discrete/discrete_in/Makefile \
+c/src/lib/libhwapi/discrete/discrete_out/Makefile \
+c/src/lib/libhwapi/discrete/discrete_input/Makefile \
+c/src/lib/libhwapi/discrete/discrete_output/Makefile \
+c/src/lib/libhwapi/discrete/discrete_flag/Makefile \
+c/src/lib/libhwapi/discrete/discrete_bitfield/Makefile \
+c/src/lib/libhwapi/analog/Makefile \
+c/src/lib/libhwapi/analog/dac/Makefile \
+c/src/lib/libhwapi/analog/wrapup/Makefile \
+c/src/lib/libhwapi/analog/linear_dac/Makefile \
+c/src/lib/libhwapi/analog/linear_adc/Makefile \
+c/src/lib/libhwapi/analog/adc/Makefile \
+c/src/lib/libhwapi/wrapup/Makefile \
+c/src/lib/libhwapi/support/Makefile \
+c/src/lib/libhwapi/support/chain/Makefile \
+c/src/lib/libhwapi/support/checksum/Makefile \
+c/src/lib/libhwapi/support/wrapup/Makefile \
+c/src/lib/libhwapi/support/dumpbuf/Makefile"
+
+tests_mk="c/src/tests/Makefile \
+c/src/tests/libtests/Makefile \
+c/src/tests/libtests/cpuuse/Makefile \
+c/src/tests/libtests/malloctest/Makefile \
+c/src/tests/libtests/rtmonuse/Makefile \
+c/src/tests/libtests/stackchk/Makefile \
+c/src/tests/mptests/Makefile \
+c/src/tests/mptests/mp01/Makefile \
+c/src/tests/mptests/mp01/node1/Makefile \
+c/src/tests/mptests/mp01/node2/Makefile \
+c/src/tests/mptests/mp02/Makefile \
+c/src/tests/mptests/mp02/node1/Makefile \
+c/src/tests/mptests/mp02/node2/Makefile \
+c/src/tests/mptests/mp03/Makefile \
+c/src/tests/mptests/mp03/node1/Makefile \
+c/src/tests/mptests/mp03/node2/Makefile \
+c/src/tests/mptests/mp04/Makefile \
+c/src/tests/mptests/mp04/node1/Makefile \
+c/src/tests/mptests/mp04/node2/Makefile \
+c/src/tests/mptests/mp05/Makefile \
+c/src/tests/mptests/mp05/node1/Makefile \
+c/src/tests/mptests/mp05/node2/Makefile \
+c/src/tests/mptests/mp06/Makefile \
+c/src/tests/mptests/mp06/node1/Makefile \
+c/src/tests/mptests/mp06/node2/Makefile \
+c/src/tests/mptests/mp07/Makefile \
+c/src/tests/mptests/mp07/node1/Makefile \
+c/src/tests/mptests/mp07/node2/Makefile \
+c/src/tests/mptests/mp08/Makefile \
+c/src/tests/mptests/mp08/node1/Makefile \
+c/src/tests/mptests/mp08/node2/Makefile \
+c/src/tests/mptests/mp09/Makefile \
+c/src/tests/mptests/mp09/node1/Makefile \
+c/src/tests/mptests/mp09/node2/Makefile \
+c/src/tests/mptests/mp10/Makefile \
+c/src/tests/mptests/mp10/node1/Makefile \
+c/src/tests/mptests/mp10/node2/Makefile \
+c/src/tests/mptests/mp11/Makefile \
+c/src/tests/mptests/mp11/node1/Makefile \
+c/src/tests/mptests/mp11/node2/Makefile \
+c/src/tests/mptests/mp12/Makefile \
+c/src/tests/mptests/mp12/node1/Makefile \
+c/src/tests/mptests/mp12/node2/Makefile \
+c/src/tests/mptests/mp13/Makefile \
+c/src/tests/mptests/mp13/node1/Makefile \
+c/src/tests/mptests/mp13/node2/Makefile \
+c/src/tests/mptests/mp14/Makefile \
+c/src/tests/mptests/mp14/node1/Makefile \
+c/src/tests/mptests/mp14/node2/Makefile \
+c/src/tests/psxtests/Makefile \
+c/src/tests/psxtests/psx01/Makefile \
+c/src/tests/psxtests/psx02/Makefile \
+c/src/tests/psxtests/psx03/Makefile \
+c/src/tests/psxtests/psx04/Makefile \
+c/src/tests/psxtests/psx05/Makefile \
+c/src/tests/psxtests/psx06/Makefile \
+c/src/tests/psxtests/psx07/Makefile \
+c/src/tests/psxtests/psx08/Makefile \
+c/src/tests/psxtests/psx09/Makefile \
+c/src/tests/psxtests/psx10/Makefile \
+c/src/tests/psxtests/psx11/Makefile \
+c/src/tests/psxtests/psx12/Makefile \
+c/src/tests/psxtests/psxhdrs/Makefile \
+c/src/tests/psxtests/support/Makefile \
+c/src/tests/psxtests/support/include/Makefile \
+c/src/tests/samples/Makefile \
+c/src/tests/samples/base_mp/Makefile \
+c/src/tests/samples/base_mp/node1/Makefile \
+c/src/tests/samples/base_mp/node2/Makefile \
+c/src/tests/samples/base_sp/Makefile \
+c/src/tests/samples/cdtest/Makefile \
+c/src/tests/samples/hello/Makefile \
+c/src/tests/samples/paranoia/Makefile \
+c/src/tests/samples/ticker/Makefile \
+c/src/tests/sptests/Makefile \
+c/src/tests/sptests/sp01/Makefile \
+c/src/tests/sptests/sp02/Makefile \
+c/src/tests/sptests/sp03/Makefile \
+c/src/tests/sptests/sp04/Makefile \
+c/src/tests/sptests/sp05/Makefile \
+c/src/tests/sptests/sp06/Makefile \
+c/src/tests/sptests/sp07/Makefile \
+c/src/tests/sptests/sp08/Makefile \
+c/src/tests/sptests/sp09/Makefile \
+c/src/tests/sptests/sp11/Makefile \
+c/src/tests/sptests/sp12/Makefile \
+c/src/tests/sptests/sp13/Makefile \
+c/src/tests/sptests/sp14/Makefile \
+c/src/tests/sptests/sp15/Makefile \
+c/src/tests/sptests/sp16/Makefile \
+c/src/tests/sptests/sp17/Makefile \
+c/src/tests/sptests/sp19/Makefile \
+c/src/tests/sptests/sp20/Makefile \
+c/src/tests/sptests/sp21/Makefile \
+c/src/tests/sptests/sp22/Makefile \
+c/src/tests/sptests/sp23/Makefile \
+c/src/tests/sptests/sp24/Makefile \
+c/src/tests/sptests/sp25/Makefile \
+c/src/tests/sptests/spfatal/Makefile \
+c/src/tests/sptests/spsize/Makefile \
+c/src/tests/support/Makefile \
+c/src/tests/support/include/Makefile \
+c/src/tests/support/stubdr/Makefile \
+c/src/tests/support/wrapup/Makefile \
+c/src/tests/tmtests/Makefile \
+c/src/tests/tmtests/include/Makefile \
+c/src/tests/tmtests/tm01/Makefile \
+c/src/tests/tmtests/tm02/Makefile \
+c/src/tests/tmtests/tm03/Makefile \
+c/src/tests/tmtests/tm04/Makefile \
+c/src/tests/tmtests/tm05/Makefile \
+c/src/tests/tmtests/tm06/Makefile \
+c/src/tests/tmtests/tm07/Makefile \
+c/src/tests/tmtests/tm08/Makefile \
+c/src/tests/tmtests/tm09/Makefile \
+c/src/tests/tmtests/tm10/Makefile \
+c/src/tests/tmtests/tm11/Makefile \
+c/src/tests/tmtests/tm12/Makefile \
+c/src/tests/tmtests/tm13/Makefile \
+c/src/tests/tmtests/tm14/Makefile \
+c/src/tests/tmtests/tm15/Makefile \
+c/src/tests/tmtests/tm16/Makefile \
+c/src/tests/tmtests/tm17/Makefile \
+c/src/tests/tmtests/tm18/Makefile \
+c/src/tests/tmtests/tm19/Makefile \
+c/src/tests/tmtests/tm20/Makefile \
+c/src/tests/tmtests/tm21/Makefile \
+c/src/tests/tmtests/tm22/Makefile \
+c/src/tests/tmtests/tm23/Makefile \
+c/src/tests/tmtests/tm24/Makefile \
+c/src/tests/tmtests/tm25/Makefile \
+c/src/tests/tmtests/tm26/Makefile \
+c/src/tests/tmtests/tm27/Makefile \
+c/src/tests/tmtests/tm28/Makefile \
+c/src/tests/tmtests/tm29/Makefile \
+c/src/tests/tmtests/tmck/Makefile \
+c/src/tests/tmtests/tmoverhd/Makefile \
+c/src/tests/tools/Makefile \
+c/src/tests/tools/generic/Makefile \
+c/src/tests/tools/hppa1_1/Makefile \
+c/src/tests/tools/hppa1_1/simhppa/Makefile \
+c/src/tests/tools/sparc/Makefile \
+c/src/tests/tools/sparc/erc32/Makefile \
+c/src/tests/tools/unix/Makefile \
+c/src/tests/tools/unix/posix/Makefile"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:956: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:1029: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`$ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`$ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:1050: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`$ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:1068: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`$ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+# Check whether --with-cross-host or --without-cross-host was given.
+if test "${with_cross_host+set}" = set; then
+ withval="$with_cross_host"
+ \
+host=$withval
+fi
+
+
+# Check whether --enable-posix or --disable-posix was given.
+if test "${enable_posix+set}" = set; then
+ enableval="$enable_posix"
+ \
+case "${enableval}" in
+ yes) RTEMS_HAS_POSIX_API=yes ;;
+ no) RTEMS_HAS_POSIX_API=no ;;
+ *) { echo "configure: error: bad value ${enableval} for disable-posix option" 1>&2; exit 1; } ;;
+esac
+else
+ RTEMS_HAS_POSIX_API=yes
+fi
+
+
+# Check whether --enable-rtems-inlines or --disable-rtems-inlines was given.
+if test "${enable_rtems_inlines+set}" = set; then
+ enableval="$enable_rtems_inlines"
+ \
+case "${enableval}" in
+ yes) RTEMS_USE_MACROS=yes ;;
+ no) RTEMS_USE_MACROS=no ;;
+ *) { echo "configure: error: bad value ${enableval} for disable-rtems-inlines option" 1>&2; exit 1; } ;;
+esac
+else
+ RTEMS_USE_MACROS=no
+fi
+
+
+# Check whether --enable-gcc28 or --disable-gcc28 was given.
+if test "${enable_gcc28+set}" = set; then
+ enableval="$enable_gcc28"
+ \
+case "${enableval}" in
+ yes) RTEMS_USE_GCC272=no ;;
+ no) RTEMS_USE_GCC272=yes ;;
+ *) { echo "configure: error: bad value ${enableval} for gcc-28 option" 1>&2; exit 1; } ;;
+esac
+else
+ RTEMS_USE_GCC272=yes
+fi
+
+
+# Check whether --enable-libcdir or --disable-libcdir was given.
+if test "${enable_libcdir+set}" = set; then
+ enableval="$enable_libcdir"
+ \
+ RTEMS_LIBC_DIR="${enableval}" ; \
+test -d ${enableval} || { echo "configure: error: "$enableval is not a directory" " 1>&2; exit 1; }
+fi
+
+
+RTEMS_PREFIX=${target_cpu}-${target_vendor}
+
+#
+# Target configurations are listed in alphabetical order.
+# The BSPs for a target configuration are also listed in alphabetical order.
+#
+
+case "${target}" in
+ a29k-rtems*)
+ rtems_bsp=portsw
+ makefiles=$a29k_mk
+ ;;
+ # hpux unix port should go here
+ hppa1.1-rtems*)
+ rtems_bsp=simhppa
+ makefiles=$hppa1_1_mk
+ ;;
+ i[3456]86-go32-rtems*)
+ rtems_bsp="go32 go32_p5"
+ makefiles=$i386_go32_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ i[3456]86-rtems*)
+ rtems_bsp="force386 i386ex"
+ makefiles=$i386_mk
+ ;;
+ i[3456]86-pc-linux*) # unix "simulator" port
+ rtems_bsp=posix
+ makefiles=$posix_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ i960-rtems*)
+ rtems_bsp=cvme961
+ makefiles=$i960_mk
+ ;;
+ m68k-rtems*)
+ rtems_bsp="dmv152 efi332 efi68k gen68302 gen68360 gen68360_040 idp \
+ mvme136 mvme147 mvme147s mvme162"
+ makefiles=$m68k_mk
+ ;;
+ mips64orion-rtems*)
+ rtems_bsp="p4600 p4650"
+ makefiles=$mips64orion_mk
+ ;;
+ no_cpu-rtems*)
+ rtems_bsp=no_bsp
+ makefiles=$no_cpu_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ powerpc-rtems*)
+ rtems_bsp=papyrus
+ makefiles=$powerpc_mk
+ ;;
+ sparc-sun-solaris*) # unix "simulator" port
+ rtems_bsp=posix
+ makefiles=$posix_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ sparc-rtems*)
+ rtems_bsp=erc32
+ makefiles=$sparc_mk
+ ;;
+ *)
+ rtems_bsp=no_bsp
+ makefiles=$no_cpu_mk
+ echo Error: RTEMS is not supported on target: $target
+ exit 1
+ ;;
+esac
+
+case "${host}" in
+ *-pc-linux*) host_os=Linux ;;
+ sparc-sun-sunos*) host_os=SunOS ;;
+ sparc-sun-solaris*) host_os=Solaris ;;
+ *-nextstep*) host_os=Nextstep3;;
+ mips*-sgi-irix5*) host_os=Irix5;;
+ *-hp-hpux9*) host_os=HPUX9;;
+ *) host_os=none
+ echo RTEMS not supported on host: $host
+ exit 1;;
+esac
+
+if [ "${program_prefix}" = "NONE" ] ; then
+ if [ "${target}" = "${host}" ] ; then
+ program_prefix=
+ else
+ program_prefix=${target}-
+ fi
+fi
+
+
+for ac_prog in mawk gawk nawk awk
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1245: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AWK="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+AWK="$ac_cv_prog_AWK"
+if test -n "$AWK"; then
+ echo "$ac_t""$AWK" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$AWK" && break
+done
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1274: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+RTEMS_BSP=$rtems_bsp
+RTEMS_HOST=$host_os
+RTEMS_ROOT=`cd $srcdir/c; pwd`
+PROJECT_ROOT=`pwd;`
+
+# Check whether --enable-tests or --disable-tests was given.
+if test "${enable_tests+set}" = set; then
+ enableval="$enable_tests"
+ \
+tests_mk=
+else
+ makefiles="${makefiles} ${tests_mk}"
+fi
+
+
+# Check whether --enable-hwapi or --disable-hwapi was given.
+if test "${enable_hwapi+set}" = set; then
+ enableval="$enable_hwapi"
+ \
+makefiles="${makefiles} ${hwapi_mk}"
+else
+ hwapi_mk=
+fi
+
+
+# Check whether --enable-rtemsbsp or --disable-rtemsbsp was given.
+if test "${enable_rtemsbsp+set}" = set; then
+ enableval="$enable_rtemsbsp"
+ \
+RTEMS_BSP=$enableval
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile \
+c/Makefile \
+c/build-tools/Makefile \
+c/build-tools/os/Makefile \
+c/build-tools/os/msdos/Makefile \
+c/build-tools/scripts/Makefile \
+c/build-tools/src/Makefile \
+c/make/Makefile \
+c/make/Templates/Makefile.inc \
+c/src/Makefile \
+c/src/exec/Makefile \
+c/src/exec/posix/Makefile \
+c/src/exec/posix/base/Makefile \
+c/src/exec/posix/headers/Makefile \
+c/src/exec/posix/inline/Makefile \
+c/src/exec/posix/macros/Makefile \
+c/src/exec/posix/optman/Makefile \
+c/src/exec/posix/src/Makefile \
+c/src/exec/posix/sys/Makefile \
+c/src/exec/rtems/Makefile \
+c/src/exec/rtems/headers/Makefile \
+c/src/exec/rtems/inline/Makefile \
+c/src/exec/rtems/macros/Makefile \
+c/src/exec/rtems/optman/Makefile \
+c/src/exec/rtems/src/Makefile \
+c/src/exec/sapi/Makefile \
+c/src/exec/sapi/headers/Makefile \
+c/src/exec/sapi/inline/Makefile \
+c/src/exec/sapi/macros/Makefile \
+c/src/exec/sapi/optman/Makefile \
+c/src/exec/sapi/src/Makefile \
+c/src/exec/score/Makefile \
+c/src/exec/score/cpu/Makefile \
+c/src/exec/score/headers/Makefile \
+c/src/exec/score/inline/Makefile \
+c/src/exec/score/macros/Makefile \
+c/src/exec/score/src/Makefile \
+c/src/exec/score/tools/Makefile \
+c/src/exec/score/tools/generic/Makefile \
+c/src/exec/wrapup/Makefile \
+c/src/exec/wrapup/posix/Makefile \
+c/src/exec/wrapup/rtems/Makefile \
+c/src/lib/Makefile \
+c/src/lib/include/Makefile \
+c/src/lib/libbsp/Makefile \
+c/src/lib/libbsp/shmdr/Makefile \
+c/src/lib/libc/Makefile \
+c/src/lib/libcpu/Makefile \
+c/src/lib/libmisc/Makefile \
+c/src/lib/libmisc/assoc/Makefile \
+c/src/lib/libmisc/cpuuse/Makefile \
+c/src/lib/libmisc/error/Makefile \
+c/src/lib/libmisc/monitor/Makefile \
+c/src/lib/libmisc/rtmonuse/Makefile \
+c/src/lib/libmisc/stackchk/Makefile \
+c/src/lib/libmisc/wrapup/Makefile \
+c/src/lib/start/Makefile \
+c/src/lib/wrapup/Makefile \
+$makefiles \
+c/update-tools/Makefile " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@AWK@%$AWK%g
+s%@LN_S@%$LN_S%g
+s%@RTEMS_BSP@%$RTEMS_BSP%g
+s%@RTEMS_HOST@%$RTEMS_HOST%g
+s%@RTEMS_LIBC_DIR@%$RTEMS_LIBC_DIR%g
+s%@RTEMS_ROOT@%$RTEMS_ROOT%g
+s%@RTEMS_HAS_POSIX_API@%$RTEMS_HAS_POSIX_API%g
+s%@RTEMS_USE_MACROS@%$RTEMS_USE_MACROS%g
+s%@RTEMS_USE_GCC272@%$RTEMS_USE_GCC272%g
+s%@PROJECT_ROOT@%$PROJECT_ROOT%g
+s%@program_prefix@%$program_prefix%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile \
+c/Makefile \
+c/build-tools/Makefile \
+c/build-tools/os/Makefile \
+c/build-tools/os/msdos/Makefile \
+c/build-tools/scripts/Makefile \
+c/build-tools/src/Makefile \
+c/make/Makefile \
+c/make/Templates/Makefile.inc \
+c/src/Makefile \
+c/src/exec/Makefile \
+c/src/exec/posix/Makefile \
+c/src/exec/posix/base/Makefile \
+c/src/exec/posix/headers/Makefile \
+c/src/exec/posix/inline/Makefile \
+c/src/exec/posix/macros/Makefile \
+c/src/exec/posix/optman/Makefile \
+c/src/exec/posix/src/Makefile \
+c/src/exec/posix/sys/Makefile \
+c/src/exec/rtems/Makefile \
+c/src/exec/rtems/headers/Makefile \
+c/src/exec/rtems/inline/Makefile \
+c/src/exec/rtems/macros/Makefile \
+c/src/exec/rtems/optman/Makefile \
+c/src/exec/rtems/src/Makefile \
+c/src/exec/sapi/Makefile \
+c/src/exec/sapi/headers/Makefile \
+c/src/exec/sapi/inline/Makefile \
+c/src/exec/sapi/macros/Makefile \
+c/src/exec/sapi/optman/Makefile \
+c/src/exec/sapi/src/Makefile \
+c/src/exec/score/Makefile \
+c/src/exec/score/cpu/Makefile \
+c/src/exec/score/headers/Makefile \
+c/src/exec/score/inline/Makefile \
+c/src/exec/score/macros/Makefile \
+c/src/exec/score/src/Makefile \
+c/src/exec/score/tools/Makefile \
+c/src/exec/score/tools/generic/Makefile \
+c/src/exec/wrapup/Makefile \
+c/src/exec/wrapup/posix/Makefile \
+c/src/exec/wrapup/rtems/Makefile \
+c/src/lib/Makefile \
+c/src/lib/include/Makefile \
+c/src/lib/libbsp/Makefile \
+c/src/lib/libbsp/shmdr/Makefile \
+c/src/lib/libc/Makefile \
+c/src/lib/libcpu/Makefile \
+c/src/lib/libmisc/Makefile \
+c/src/lib/libmisc/assoc/Makefile \
+c/src/lib/libmisc/cpuuse/Makefile \
+c/src/lib/libmisc/error/Makefile \
+c/src/lib/libmisc/monitor/Makefile \
+c/src/lib/libmisc/rtmonuse/Makefile \
+c/src/lib/libmisc/stackchk/Makefile \
+c/src/lib/libmisc/wrapup/Makefile \
+c/src/lib/start/Makefile \
+c/src/lib/wrapup/Makefile \
+$makefiles \
+c/update-tools/Makefile "}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
+echo
+echo target architecture: $target_cpu.
+echo available BSPs: $rtems_bsp.
+echo \'make all\' will build the following BSPs: $RTEMS_BSP.
+echo other BSPs can be built with \'make RTEMSBSP=\"bsp1 bsp2 ...\"\'
+echo
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000000..807fd93712
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,639 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.12)
+AC_INIT(README)
+
+a29k_mk="c/src/exec/score/cpu/a29k/Makefile \
+c/src/lib/libbsp/a29k/Makefile \
+c/src/lib/libbsp/a29k/portsw/Makefile \
+c/src/lib/libbsp/a29k/portsw/console/Makefile \
+c/src/lib/libbsp/a29k/portsw/include/Makefile \
+c/src/lib/libbsp/a29k/portsw/shmsupp/Makefile \
+c/src/lib/libbsp/a29k/portsw/startup/Makefile \
+c/src/lib/libbsp/a29k/portsw/wrapup/Makefile \
+c/src/lib/start/a29k/Makefile"
+
+i386_mk="c/src/exec/score/cpu/i386/Makefile \
+c/src/lib/libbsp/i386/Makefile \
+c/src/lib/libbsp/i386/force386/Makefile \
+c/src/lib/libbsp/i386/force386/clock/Makefile \
+c/src/lib/libbsp/i386/force386/console/Makefile \
+c/src/lib/libbsp/i386/force386/include/Makefile \
+c/src/lib/libbsp/i386/force386/shmsupp/Makefile \
+c/src/lib/libbsp/i386/force386/startup/Makefile \
+c/src/lib/libbsp/i386/force386/timer/Makefile \
+c/src/lib/libbsp/i386/force386/wrapup/Makefile \
+c/src/lib/libbsp/i386/i386ex/Makefile \
+c/src/lib/libbsp/i386/i386ex/clock/Makefile \
+c/src/lib/libbsp/i386/i386ex/console/Makefile \
+c/src/lib/libbsp/i386/i386ex/include/Makefile \
+c/src/lib/libbsp/i386/i386ex/startup/Makefile \
+c/src/lib/libbsp/i386/i386ex/timer/Makefile \
+c/src/lib/libbsp/i386/i386ex/wrapup/Makefile \
+c/src/lib/start/i386/Makefile"
+
+i386_go32_mk="c/src/exec/score/cpu/i386/Makefile \
+c/src/lib/libbsp/i386/Makefile \
+c/src/lib/libbsp/i386/go32/Makefile \
+c/src/lib/libbsp/i386/go32/clock/Makefile \
+c/src/lib/libbsp/i386/go32/console/Makefile \
+c/src/lib/libbsp/i386/go32/include/Makefile \
+c/src/lib/libbsp/i386/go32/startup/Makefile \
+c/src/lib/libbsp/i386/go32/timer/Makefile \
+c/src/lib/libbsp/i386/go32/wrapup/Makefile"
+
+m68k_mk="c/src/exec/score/cpu/m68k/Makefile \
+c/src/lib/libbsp/m68k/Makefile \
+c/src/lib/libbsp/m68k/dmv152/Makefile \
+c/src/lib/libbsp/m68k/dmv152/clock/Makefile \
+c/src/lib/libbsp/m68k/dmv152/console/Makefile \
+c/src/lib/libbsp/m68k/dmv152/include/Makefile \
+c/src/lib/libbsp/m68k/dmv152/spurious/Makefile \
+c/src/lib/libbsp/m68k/dmv152/startup/Makefile \
+c/src/lib/libbsp/m68k/dmv152/timer/Makefile \
+c/src/lib/libbsp/m68k/dmv152/wrapup/Makefile \
+c/src/lib/libbsp/m68k/efi332/Makefile \
+c/src/lib/libbsp/m68k/efi332/clock/Makefile \
+c/src/lib/libbsp/m68k/efi332/console/Makefile \
+c/src/lib/libbsp/m68k/efi332/include/Makefile \
+c/src/lib/libbsp/m68k/efi332/spurious/Makefile \
+c/src/lib/libbsp/m68k/efi332/startup/Makefile \
+c/src/lib/libbsp/m68k/efi332/start332/Makefile \
+c/src/lib/libbsp/m68k/efi332/timer/Makefile \
+c/src/lib/libbsp/m68k/efi332/wrapup/Makefile \
+c/src/lib/libbsp/m68k/efi68k/Makefile \
+c/src/lib/libbsp/m68k/efi68k/clock/Makefile \
+c/src/lib/libbsp/m68k/efi68k/console/Makefile \
+c/src/lib/libbsp/m68k/efi68k/include/Makefile \
+c/src/lib/libbsp/m68k/efi68k/spurious/Makefile \
+c/src/lib/libbsp/m68k/efi68k/startup/Makefile \
+c/src/lib/libbsp/m68k/efi68k/start68k/Makefile \
+c/src/lib/libbsp/m68k/efi68k/timer/Makefile \
+c/src/lib/libbsp/m68k/efi68k/wrapup/Makefile \
+c/src/lib/libbsp/m68k/gen68302/Makefile \
+c/src/lib/libbsp/m68k/gen68302/clock/Makefile \
+c/src/lib/libbsp/m68k/gen68302/console/Makefile \
+c/src/lib/libbsp/m68k/gen68302/include/Makefile \
+c/src/lib/libbsp/m68k/gen68302/start302/Makefile \
+c/src/lib/libbsp/m68k/gen68302/startup/Makefile \
+c/src/lib/libbsp/m68k/gen68302/timer/Makefile \
+c/src/lib/libbsp/m68k/gen68302/wrapup/Makefile \
+c/src/lib/libbsp/m68k/gen68360/Makefile \
+c/src/lib/libbsp/m68k/gen68360/clock/Makefile \
+c/src/lib/libbsp/m68k/gen68360/console/Makefile \
+c/src/lib/libbsp/m68k/gen68360/include/Makefile \
+c/src/lib/libbsp/m68k/gen68360/start360/Makefile \
+c/src/lib/libbsp/m68k/gen68360/startup/Makefile \
+c/src/lib/libbsp/m68k/gen68360/timer/Makefile \
+c/src/lib/libbsp/m68k/gen68360/network/Makefile \
+c/src/lib/libbsp/m68k/gen68360/wrapup/Makefile \
+c/src/lib/libbsp/m68k/idp/Makefile \
+c/src/lib/libbsp/m68k/idp/clock/Makefile \
+c/src/lib/libbsp/m68k/idp/console/Makefile \
+c/src/lib/libbsp/m68k/idp/include/Makefile \
+c/src/lib/libbsp/m68k/idp/startup/Makefile \
+c/src/lib/libbsp/m68k/idp/timer/Makefile \
+c/src/lib/libbsp/m68k/idp/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme136/Makefile \
+c/src/lib/libbsp/m68k/mvme136/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme136/console/Makefile \
+c/src/lib/libbsp/m68k/mvme136/include/Makefile \
+c/src/lib/libbsp/m68k/mvme136/shmsupp/Makefile \
+c/src/lib/libbsp/m68k/mvme136/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme136/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme136/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme147/Makefile \
+c/src/lib/libbsp/m68k/mvme147/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme147/console/Makefile \
+c/src/lib/libbsp/m68k/mvme147/include/Makefile \
+c/src/lib/libbsp/m68k/mvme147/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme147/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme147/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/console/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/include/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/shmsupp/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme147s/wrapup/Makefile \
+c/src/lib/libbsp/m68k/mvme162/Makefile \
+c/src/lib/libbsp/m68k/mvme162/clock/Makefile \
+c/src/lib/libbsp/m68k/mvme162/console/Makefile \
+c/src/lib/libbsp/m68k/mvme162/include/Makefile \
+c/src/lib/libbsp/m68k/mvme162/startup/Makefile \
+c/src/lib/libbsp/m68k/mvme162/timer/Makefile \
+c/src/lib/libbsp/m68k/mvme162/tools/Makefile \
+c/src/lib/libbsp/m68k/mvme162/wrapup/Makefile \
+c/src/lib/start/m68k/Makefile"
+
+no_cpu_mk="c/src/exec/score/cpu/no_cpu/Makefile \
+c/src/lib/libbsp/no_cpu/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/clock/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/console/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/include/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/shmsupp/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/startup/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/timer/Makefile \
+c/src/lib/libbsp/no_cpu/no_bsp/wrapup/Makefile"
+
+sparc_mk="c/src/exec/score/cpu/sparc/Makefile \
+c/src/lib/libbsp/sparc/Makefile \
+c/src/lib/libbsp/sparc/erc32/Makefile \
+c/src/lib/libbsp/sparc/erc32/clock/Makefile \
+c/src/lib/libbsp/sparc/erc32/console/Makefile \
+c/src/lib/libbsp/sparc/erc32/include/Makefile \
+c/src/lib/libbsp/sparc/erc32/startsis/Makefile \
+c/src/lib/libbsp/sparc/erc32/startup/Makefile \
+c/src/lib/libbsp/sparc/erc32/timer/Makefile \
+c/src/lib/libbsp/sparc/erc32/wrapup/Makefile \
+c/src/lib/libcpu/sparc/Makefile \
+c/src/lib/libcpu/sparc/reg_win/Makefile"
+
+hppa1_1_mk="c/src/exec/score/cpu/hppa1_1/Makefile \
+c/src/exec/score/tools/hppa1_1/Makefile \
+c/src/lib/libbsp/hppa1_1/Makefile \
+c/src/lib/libbsp/hppa1_1/pxfl/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/include/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/shmsupp/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/startup/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/tools/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/tty/Makefile \
+c/src/lib/libbsp/hppa1_1/simhppa/wrapup/Makefile \
+c/src/lib/libcpu/hppa1_1/Makefile \
+c/src/lib/libcpu/hppa1_1/clock/Makefile \
+c/src/lib/libcpu/hppa1_1/include/Makefile \
+c/src/lib/libcpu/hppa1_1/milli/Makefile \
+c/src/lib/libcpu/hppa1_1/runway/Makefile \
+c/src/lib/libcpu/hppa1_1/semaphore/Makefile \
+c/src/lib/libcpu/hppa1_1/timer/Makefile \
+c/src/lib/start/hppa1_1/Makefile"
+
+i960_mk="c/src/exec/score/cpu/i960/Makefile \
+c/src/lib/libbsp/i960/Makefile \
+c/src/lib/libbsp/i960/cvme961/Makefile \
+c/src/lib/libbsp/i960/cvme961/clock/Makefile \
+c/src/lib/libbsp/i960/cvme961/console/Makefile \
+c/src/lib/libbsp/i960/cvme961/include/Makefile \
+c/src/lib/libbsp/i960/cvme961/shmsupp/Makefile \
+c/src/lib/libbsp/i960/cvme961/startup/Makefile \
+c/src/lib/libbsp/i960/cvme961/timer/Makefile \
+c/src/lib/libbsp/i960/cvme961/wrapup/Makefile \
+c/src/lib/start/i960/Makefile"
+
+mips64orion_mk="c/src/exec/score/cpu/mips64orion/Makefile \
+c/src/lib/libbsp/mips64orion/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/console/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/include/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/liblnk/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/startup/Makefile \
+c/src/lib/libbsp/mips64orion/p4000/wrapup/Makefile \
+c/src/lib/libcpu/mips64orion/Makefile \
+c/src/lib/libcpu/mips64orion/clock/Makefile \
+c/src/lib/libcpu/mips64orion/include/Makefile \
+c/src/lib/libcpu/mips64orion/timer/Makefile \
+c/src/lib/start/mips64orion/Makefile"
+
+powerpc_mk="c/src/exec/score/cpu/ppc/Makefile \
+c/src/lib/libbsp/ppc/Makefile \
+c/src/lib/libbsp/ppc/papyrus/Makefile \
+c/src/lib/libbsp/ppc/papyrus/dlentry/Makefile \
+c/src/lib/libbsp/ppc/papyrus/flashentry/Makefile \
+c/src/lib/libbsp/ppc/papyrus/include/Makefile \
+c/src/lib/libbsp/ppc/papyrus/startup/Makefile \
+c/src/lib/libbsp/ppc/papyrus/wrapup/Makefile \
+c/src/lib/libcpu/ppc/Makefile \
+c/src/lib/libcpu/ppc/ppc403/Makefile \
+c/src/lib/libcpu/ppc/ppc403/clock/Makefile \
+c/src/lib/libcpu/ppc/ppc403/console/Makefile \
+c/src/lib/libcpu/ppc/ppc403/include/Makefile \
+c/src/lib/libcpu/ppc/ppc403/timer/Makefile \
+c/src/lib/libcpu/ppc/ppc403/vectors/Makefile"
+
+posix_mk="c/src/exec/score/cpu/unix/Makefile \
+c/src/exec/score/tools/unix/Makefile \
+c/src/lib/libbsp/unix/Makefile \
+c/src/lib/libbsp/unix/posix/Makefile \
+c/src/lib/libbsp/unix/posix/clock/Makefile \
+c/src/lib/libbsp/unix/posix/console/Makefile \
+c/src/lib/libbsp/unix/posix/include/Makefile \
+c/src/lib/libbsp/unix/posix/shmsupp/Makefile \
+c/src/lib/libbsp/unix/posix/startup/Makefile \
+c/src/lib/libbsp/unix/posix/timer/Makefile \
+c/src/lib/libbsp/unix/posix/wrapup/Makefile"
+
+hwapi_mk="\
+c/src/lib/libhwapi/Makefile \
+c/src/lib/libhwapi/eeprom/Makefile \
+c/src/lib/libhwapi/eeprom/wrapup/Makefile \
+c/src/lib/libhwapi/eeprom/eeprom/Makefile \
+c/src/lib/libhwapi/drivers/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/dmv202/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/dmv536/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/dmv666/Makefile \
+c/src/lib/libhwapi/drivers/vmebus/wrapup/Makefile \
+c/src/lib/libhwapi/serial/Makefile \
+c/src/lib/libhwapi/serial/default/Makefile \
+c/src/lib/libhwapi/serial/stream/Makefile \
+c/src/lib/libhwapi/serial/template/Makefile \
+c/src/lib/libhwapi/serial/wrapup/Makefile \
+c/src/lib/libhwapi/serial/channel/Makefile \
+c/src/lib/libhwapi/discrete/Makefile \
+c/src/lib/libhwapi/discrete/tools/Makefile \
+c/src/lib/libhwapi/discrete/relay/Makefile \
+c/src/lib/libhwapi/discrete/wrapup/Makefile \
+c/src/lib/libhwapi/discrete/greycode/Makefile \
+c/src/lib/libhwapi/discrete/discrete_in/Makefile \
+c/src/lib/libhwapi/discrete/discrete_out/Makefile \
+c/src/lib/libhwapi/discrete/discrete_input/Makefile \
+c/src/lib/libhwapi/discrete/discrete_output/Makefile \
+c/src/lib/libhwapi/discrete/discrete_flag/Makefile \
+c/src/lib/libhwapi/discrete/discrete_bitfield/Makefile \
+c/src/lib/libhwapi/analog/Makefile \
+c/src/lib/libhwapi/analog/dac/Makefile \
+c/src/lib/libhwapi/analog/wrapup/Makefile \
+c/src/lib/libhwapi/analog/linear_dac/Makefile \
+c/src/lib/libhwapi/analog/linear_adc/Makefile \
+c/src/lib/libhwapi/analog/adc/Makefile \
+c/src/lib/libhwapi/wrapup/Makefile \
+c/src/lib/libhwapi/support/Makefile \
+c/src/lib/libhwapi/support/chain/Makefile \
+c/src/lib/libhwapi/support/checksum/Makefile \
+c/src/lib/libhwapi/support/wrapup/Makefile \
+c/src/lib/libhwapi/support/dumpbuf/Makefile"
+
+tests_mk="c/src/tests/Makefile \
+c/src/tests/libtests/Makefile \
+c/src/tests/libtests/cpuuse/Makefile \
+c/src/tests/libtests/malloctest/Makefile \
+c/src/tests/libtests/rtmonuse/Makefile \
+c/src/tests/libtests/stackchk/Makefile \
+c/src/tests/mptests/Makefile \
+c/src/tests/mptests/mp01/Makefile \
+c/src/tests/mptests/mp01/node1/Makefile \
+c/src/tests/mptests/mp01/node2/Makefile \
+c/src/tests/mptests/mp02/Makefile \
+c/src/tests/mptests/mp02/node1/Makefile \
+c/src/tests/mptests/mp02/node2/Makefile \
+c/src/tests/mptests/mp03/Makefile \
+c/src/tests/mptests/mp03/node1/Makefile \
+c/src/tests/mptests/mp03/node2/Makefile \
+c/src/tests/mptests/mp04/Makefile \
+c/src/tests/mptests/mp04/node1/Makefile \
+c/src/tests/mptests/mp04/node2/Makefile \
+c/src/tests/mptests/mp05/Makefile \
+c/src/tests/mptests/mp05/node1/Makefile \
+c/src/tests/mptests/mp05/node2/Makefile \
+c/src/tests/mptests/mp06/Makefile \
+c/src/tests/mptests/mp06/node1/Makefile \
+c/src/tests/mptests/mp06/node2/Makefile \
+c/src/tests/mptests/mp07/Makefile \
+c/src/tests/mptests/mp07/node1/Makefile \
+c/src/tests/mptests/mp07/node2/Makefile \
+c/src/tests/mptests/mp08/Makefile \
+c/src/tests/mptests/mp08/node1/Makefile \
+c/src/tests/mptests/mp08/node2/Makefile \
+c/src/tests/mptests/mp09/Makefile \
+c/src/tests/mptests/mp09/node1/Makefile \
+c/src/tests/mptests/mp09/node2/Makefile \
+c/src/tests/mptests/mp10/Makefile \
+c/src/tests/mptests/mp10/node1/Makefile \
+c/src/tests/mptests/mp10/node2/Makefile \
+c/src/tests/mptests/mp11/Makefile \
+c/src/tests/mptests/mp11/node1/Makefile \
+c/src/tests/mptests/mp11/node2/Makefile \
+c/src/tests/mptests/mp12/Makefile \
+c/src/tests/mptests/mp12/node1/Makefile \
+c/src/tests/mptests/mp12/node2/Makefile \
+c/src/tests/mptests/mp13/Makefile \
+c/src/tests/mptests/mp13/node1/Makefile \
+c/src/tests/mptests/mp13/node2/Makefile \
+c/src/tests/mptests/mp14/Makefile \
+c/src/tests/mptests/mp14/node1/Makefile \
+c/src/tests/mptests/mp14/node2/Makefile \
+c/src/tests/psxtests/Makefile \
+c/src/tests/psxtests/psx01/Makefile \
+c/src/tests/psxtests/psx02/Makefile \
+c/src/tests/psxtests/psx03/Makefile \
+c/src/tests/psxtests/psx04/Makefile \
+c/src/tests/psxtests/psx05/Makefile \
+c/src/tests/psxtests/psx06/Makefile \
+c/src/tests/psxtests/psx07/Makefile \
+c/src/tests/psxtests/psx08/Makefile \
+c/src/tests/psxtests/psx09/Makefile \
+c/src/tests/psxtests/psx10/Makefile \
+c/src/tests/psxtests/psx11/Makefile \
+c/src/tests/psxtests/psx12/Makefile \
+c/src/tests/psxtests/psxhdrs/Makefile \
+c/src/tests/psxtests/support/Makefile \
+c/src/tests/psxtests/support/include/Makefile \
+c/src/tests/samples/Makefile \
+c/src/tests/samples/base_mp/Makefile \
+c/src/tests/samples/base_mp/node1/Makefile \
+c/src/tests/samples/base_mp/node2/Makefile \
+c/src/tests/samples/base_sp/Makefile \
+c/src/tests/samples/cdtest/Makefile \
+c/src/tests/samples/hello/Makefile \
+c/src/tests/samples/paranoia/Makefile \
+c/src/tests/samples/ticker/Makefile \
+c/src/tests/sptests/Makefile \
+c/src/tests/sptests/sp01/Makefile \
+c/src/tests/sptests/sp02/Makefile \
+c/src/tests/sptests/sp03/Makefile \
+c/src/tests/sptests/sp04/Makefile \
+c/src/tests/sptests/sp05/Makefile \
+c/src/tests/sptests/sp06/Makefile \
+c/src/tests/sptests/sp07/Makefile \
+c/src/tests/sptests/sp08/Makefile \
+c/src/tests/sptests/sp09/Makefile \
+c/src/tests/sptests/sp11/Makefile \
+c/src/tests/sptests/sp12/Makefile \
+c/src/tests/sptests/sp13/Makefile \
+c/src/tests/sptests/sp14/Makefile \
+c/src/tests/sptests/sp15/Makefile \
+c/src/tests/sptests/sp16/Makefile \
+c/src/tests/sptests/sp17/Makefile \
+c/src/tests/sptests/sp19/Makefile \
+c/src/tests/sptests/sp20/Makefile \
+c/src/tests/sptests/sp21/Makefile \
+c/src/tests/sptests/sp22/Makefile \
+c/src/tests/sptests/sp23/Makefile \
+c/src/tests/sptests/sp24/Makefile \
+c/src/tests/sptests/sp25/Makefile \
+c/src/tests/sptests/spfatal/Makefile \
+c/src/tests/sptests/spsize/Makefile \
+c/src/tests/support/Makefile \
+c/src/tests/support/include/Makefile \
+c/src/tests/support/stubdr/Makefile \
+c/src/tests/support/wrapup/Makefile \
+c/src/tests/tmtests/Makefile \
+c/src/tests/tmtests/include/Makefile \
+c/src/tests/tmtests/tm01/Makefile \
+c/src/tests/tmtests/tm02/Makefile \
+c/src/tests/tmtests/tm03/Makefile \
+c/src/tests/tmtests/tm04/Makefile \
+c/src/tests/tmtests/tm05/Makefile \
+c/src/tests/tmtests/tm06/Makefile \
+c/src/tests/tmtests/tm07/Makefile \
+c/src/tests/tmtests/tm08/Makefile \
+c/src/tests/tmtests/tm09/Makefile \
+c/src/tests/tmtests/tm10/Makefile \
+c/src/tests/tmtests/tm11/Makefile \
+c/src/tests/tmtests/tm12/Makefile \
+c/src/tests/tmtests/tm13/Makefile \
+c/src/tests/tmtests/tm14/Makefile \
+c/src/tests/tmtests/tm15/Makefile \
+c/src/tests/tmtests/tm16/Makefile \
+c/src/tests/tmtests/tm17/Makefile \
+c/src/tests/tmtests/tm18/Makefile \
+c/src/tests/tmtests/tm19/Makefile \
+c/src/tests/tmtests/tm20/Makefile \
+c/src/tests/tmtests/tm21/Makefile \
+c/src/tests/tmtests/tm22/Makefile \
+c/src/tests/tmtests/tm23/Makefile \
+c/src/tests/tmtests/tm24/Makefile \
+c/src/tests/tmtests/tm25/Makefile \
+c/src/tests/tmtests/tm26/Makefile \
+c/src/tests/tmtests/tm27/Makefile \
+c/src/tests/tmtests/tm28/Makefile \
+c/src/tests/tmtests/tm29/Makefile \
+c/src/tests/tmtests/tmck/Makefile \
+c/src/tests/tmtests/tmoverhd/Makefile \
+c/src/tests/tools/Makefile \
+c/src/tests/tools/generic/Makefile \
+c/src/tests/tools/hppa1_1/Makefile \
+c/src/tests/tools/hppa1_1/simhppa/Makefile \
+c/src/tests/tools/sparc/Makefile \
+c/src/tests/tools/sparc/erc32/Makefile \
+c/src/tests/tools/unix/Makefile \
+c/src/tests/tools/unix/posix/Makefile"
+
+dnl Checks for programs.
+AC_PROG_MAKE_SET
+AC_CANONICAL_SYSTEM
+AC_ARG_WITH(cross-host,[ --with-cross-host=HOST host (cygnus)], \
+host=$withval)
+
+AC_ARG_ENABLE(posix, \
+[ --disable-posix disable posix interface], \
+[case "${enableval}" in
+ yes) RTEMS_HAS_POSIX_API=yes ;;
+ no) RTEMS_HAS_POSIX_API=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for disable-posix option) ;;
+esac],[RTEMS_HAS_POSIX_API=yes])
+
+AC_ARG_ENABLE(rtems-inlines, \
+[ --disable-rtems-inlines disable RTEMS inline functions (use macros)], \
+[case "${enableval}" in
+ yes) RTEMS_USE_MACROS=yes ;;
+ no) RTEMS_USE_MACROS=no ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for disable-rtems-inlines option) ;;
+esac],[RTEMS_USE_MACROS=no])
+
+AC_ARG_ENABLE(gcc28, \
+[ --enable-gcc28 enable use of gcc 2.8.x features], \
+[case "${enableval}" in
+ yes) RTEMS_USE_GCC272=no ;;
+ no) RTEMS_USE_GCC272=yes ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for gcc-28 option) ;;
+esac],[RTEMS_USE_GCC272=yes])
+
+AC_ARG_ENABLE(libcdir, \
+[ --enable-libcdir=directory set the directory for the C library], \
+[ RTEMS_LIBC_DIR="${enableval}" ; \
+test -d ${enableval} || AC_MSG_ERROR("$enableval is not a directory" ) ] )
+
+RTEMS_PREFIX=${target_cpu}-${target_vendor}
+
+#
+# Target configurations are listed in alphabetical order.
+# The BSPs for a target configuration are also listed in alphabetical order.
+#
+
+case "${target}" in
+ a29k-rtems*)
+ rtems_bsp=portsw
+ makefiles=$a29k_mk
+ ;;
+ # hpux unix port should go here
+ hppa1.1-rtems*)
+ rtems_bsp=simhppa
+ makefiles=$hppa1_1_mk
+ ;;
+ i[[3456]]86-go32-rtems*)
+ rtems_bsp="go32 go32_p5"
+ makefiles=$i386_go32_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ i[[3456]]86-rtems*)
+ rtems_bsp="force386 i386ex"
+ makefiles=$i386_mk
+ ;;
+ i[[3456]]86-pc-linux*) # unix "simulator" port
+ rtems_bsp=posix
+ makefiles=$posix_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ i960-rtems*)
+ rtems_bsp=cvme961
+ makefiles=$i960_mk
+ ;;
+ m68k-rtems*)
+ rtems_bsp="dmv152 efi332 efi68k gen68302 gen68360 gen68360_040 idp \
+ mvme136 mvme147 mvme147s mvme162"
+ makefiles=$m68k_mk
+ ;;
+ mips64orion-rtems*)
+ rtems_bsp="p4600 p4650"
+ makefiles=$mips64orion_mk
+ ;;
+ no_cpu-rtems*)
+ rtems_bsp=no_bsp
+ makefiles=$no_cpu_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ powerpc-rtems*)
+ rtems_bsp=papyrus
+ makefiles=$powerpc_mk
+ ;;
+ sparc-sun-solaris*) # unix "simulator" port
+ rtems_bsp=posix
+ makefiles=$posix_mk
+ RTEMS_HAS_POSIX_API=no
+ ;;
+ sparc-rtems*)
+ rtems_bsp=erc32
+ makefiles=$sparc_mk
+ ;;
+ *)
+ rtems_bsp=no_bsp
+ makefiles=$no_cpu_mk
+ echo Error: RTEMS is not supported on target: $target
+ exit 1
+ ;;
+esac
+
+case "${host}" in
+ *-pc-linux*) host_os=Linux ;;
+ sparc-sun-sunos*) host_os=SunOS ;;
+ sparc-sun-solaris*) host_os=Solaris ;;
+ *-nextstep*) host_os=Nextstep3;;
+ mips*-sgi-irix5*) host_os=Irix5;;
+ *-hp-hpux9*) host_os=HPUX9;;
+ *) host_os=none
+ echo RTEMS not supported on host: $host
+ exit 1;;
+esac
+
+if [[ "${program_prefix}" = "NONE" ]] ; then
+ if [[ "${target}" = "${host}" ]] ; then
+ program_prefix=
+ else
+ program_prefix=${target}-
+ fi
+fi
+
+
+AC_PROG_AWK
+AC_PROG_LN_S
+dnl AC_PROG_CC
+dnl AC_PROG_CXX
+
+RTEMS_BSP=$rtems_bsp
+RTEMS_HOST=$host_os
+RTEMS_ROOT=`cd $srcdir/c; pwd`
+PROJECT_ROOT=`pwd;`
+
+AC_ARG_ENABLE(tests, \
+[ --disable-tests disable tests], \
+tests_mk=,makefiles="${makefiles} ${tests_mk}")
+
+AC_ARG_ENABLE(hwapi, \
+[ --enable-hwapi enable hardware API library], \
+makefiles="${makefiles} ${hwapi_mk}",hwapi_mk=)
+
+AC_ARG_ENABLE(rtemsbsp, \
+[ --enable-rtemsbsp=bsp1 bsp2 .. prefix for cross-tools], \
+RTEMS_BSP=$enableval)
+
+AC_SUBST(RTEMS_BSP)
+AC_SUBST(RTEMS_HOST)
+AC_SUBST(RTEMS_LIBC_DIR)
+AC_SUBST(RTEMS_ROOT)
+AC_SUBST(RTEMS_HAS_POSIX_API)
+AC_SUBST(RTEMS_USE_MACROS)
+AC_SUBST(RTEMS_USE_GCC272)
+AC_SUBST(RTEMS_LIBC_DIR)
+AC_SUBST(PROJECT_ROOT)
+AC_SUBST(program_prefix)
+
+AC_OUTPUT( Makefile \
+c/Makefile \
+c/build-tools/Makefile \
+c/build-tools/os/Makefile \
+c/build-tools/os/msdos/Makefile \
+c/build-tools/scripts/Makefile \
+c/build-tools/src/Makefile \
+c/make/Makefile \
+c/make/Templates/Makefile.inc \
+c/src/Makefile \
+c/src/exec/Makefile \
+c/src/exec/posix/Makefile \
+c/src/exec/posix/base/Makefile \
+c/src/exec/posix/headers/Makefile \
+c/src/exec/posix/inline/Makefile \
+c/src/exec/posix/macros/Makefile \
+c/src/exec/posix/optman/Makefile \
+c/src/exec/posix/src/Makefile \
+c/src/exec/posix/sys/Makefile \
+c/src/exec/rtems/Makefile \
+c/src/exec/rtems/headers/Makefile \
+c/src/exec/rtems/inline/Makefile \
+c/src/exec/rtems/macros/Makefile \
+c/src/exec/rtems/optman/Makefile \
+c/src/exec/rtems/src/Makefile \
+c/src/exec/sapi/Makefile \
+c/src/exec/sapi/headers/Makefile \
+c/src/exec/sapi/inline/Makefile \
+c/src/exec/sapi/macros/Makefile \
+c/src/exec/sapi/optman/Makefile \
+c/src/exec/sapi/src/Makefile \
+c/src/exec/score/Makefile \
+c/src/exec/score/cpu/Makefile \
+c/src/exec/score/headers/Makefile \
+c/src/exec/score/inline/Makefile \
+c/src/exec/score/macros/Makefile \
+c/src/exec/score/src/Makefile \
+c/src/exec/score/tools/Makefile \
+c/src/exec/score/tools/generic/Makefile \
+c/src/exec/wrapup/Makefile \
+c/src/exec/wrapup/posix/Makefile \
+c/src/exec/wrapup/rtems/Makefile \
+c/src/lib/Makefile \
+c/src/lib/include/Makefile \
+c/src/lib/libbsp/Makefile \
+c/src/lib/libbsp/shmdr/Makefile \
+c/src/lib/libc/Makefile \
+c/src/lib/libcpu/Makefile \
+c/src/lib/libmisc/Makefile \
+c/src/lib/libmisc/assoc/Makefile \
+c/src/lib/libmisc/cpuuse/Makefile \
+c/src/lib/libmisc/error/Makefile \
+c/src/lib/libmisc/monitor/Makefile \
+c/src/lib/libmisc/rtmonuse/Makefile \
+c/src/lib/libmisc/stackchk/Makefile \
+c/src/lib/libmisc/wrapup/Makefile \
+c/src/lib/start/Makefile \
+c/src/lib/wrapup/Makefile \
+$makefiles \
+c/update-tools/Makefile )
+
+echo
+echo target architecture: $target_cpu.
+echo available BSPs: $rtems_bsp.
+echo \'make all\' will build the following BSPs: $RTEMS_BSP.
+echo other BSPs can be built with \'make RTEMSBSP=\"bsp1 bsp2 ...\"\'
+echo
diff --git a/cpukit/libcsupport/include/clockdrv.h b/cpukit/libcsupport/include/clockdrv.h
new file mode 100644
index 0000000000..368c292f8f
--- /dev/null
+++ b/cpukit/libcsupport/include/clockdrv.h
@@ -0,0 +1,51 @@
+/* clock.h
+ *
+ * This file describes the Clock Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CLOCK_DRIVER_h
+#define __CLOCK_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* variables */
+
+extern volatile rtems_unsigned32 Clock_driver_ticks;
+extern rtems_device_major_number rtems_clock_major;
+extern rtems_device_minor_number rtems_clock_minor;
+
+/* default clock driver entry */
+
+#define CLOCK_DRIVER_TABLE_ENTRY \
+ { Clock_initialize, NULL, NULL, NULL, NULL, Clock_control }
+
+rtems_device_driver Clock_initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *
+);
+
+rtems_device_driver Clock_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *pargp
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/libcsupport/include/console.h b/cpukit/libcsupport/include/console.h
new file mode 100644
index 0000000000..b3437eed91
--- /dev/null
+++ b/cpukit/libcsupport/include/console.h
@@ -0,0 +1,69 @@
+/* console.h
+ *
+ * This file describes the Console Device Driver for all boards.
+ * This driver provides support for the standard C Library.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef _CONSOLE_DRIVER_h
+#define _CONSOLE_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define CONSOLE_DRIVER_TABLE_ENTRY \
+ { 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_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
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/libcsupport/include/iosupp.h b/cpukit/libcsupport/include/iosupp.h
new file mode 100644
index 0000000000..69e6195a2f
--- /dev/null
+++ b/cpukit/libcsupport/include/iosupp.h
@@ -0,0 +1,44 @@
+/* iosupp.h
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __IOSUPP_h
+#define __IOSUPP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* character constants */
+
+#define BS 0x08 /* backspace */
+#define LF 0x0a /* line feed */
+#define CR 0x0d /* carriage return */
+#define XON 0x11 /* control-Q */
+#define XOFF 0x13 /* control-S */
+
+/* structures */
+
+#ifdef IOSUPP_INIT
+#define IOSUPP_EXTERN
+#else
+#undef IOSUPP_EXTERN
+#define IOSUPP_EXTERN extern
+#endif
+
+/* functions */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/cpukit/libcsupport/include/ringbuf.h b/cpukit/libcsupport/include/ringbuf.h
new file mode 100644
index 0000000000..8c80aaf9c8
--- /dev/null
+++ b/cpukit/libcsupport/include/ringbuf.h
@@ -0,0 +1,53 @@
+/*
+ * ringbuf.h
+ *
+ * This file provides simple ring buffer functionality.
+ *
+ * $Id$
+ */
+
+#ifndef __RINGBUF_H__
+#define __RINGBUF_H__
+
+#ifndef RINGBUF_QUEUE_LENGTH
+#define RINGBUF_QUEUE_LENGTH 128
+#endif
+
+typedef struct {
+ char buffer[RINGBUF_QUEUE_LENGTH];
+ volatile int head;
+ volatile int tail;
+} Ring_buffer_t;
+
+#define Ring_buffer_Initialize( _buffer ) \
+ do { \
+ (_buffer)->head = (_buffer)->tail = 0; \
+ } while ( 0 )
+
+#define Ring_buffer_Is_empty( _buffer ) \
+ ( (_buffer)->head == (_buffer)->tail )
+
+#define Ring_buffer_Is_full( _buffer ) \
+ ( (_buffer)->head == ((_buffer)->tail + 1) % RINGBUF_QUEUE_LENGTH )
+
+#define Ring_buffer_Add_character( _buffer, _ch ) \
+ do { \
+ rtems_unsigned32 isrlevel; \
+ \
+ rtems_interrupt_disable( isrlevel ); \
+ (_buffer)->tail = ((_buffer)->tail+1) % RINGBUF_QUEUE_LENGTH; \
+ (_buffer)->buffer[ (_buffer)->tail ] = (_ch); \
+ rtems_interrupt_enable( isrlevel ); \
+ } while ( 0 )
+
+#define Ring_buffer_Remove_character( _buffer, _ch ) \
+ do { \
+ rtems_unsigned32 isrlevel; \
+ \
+ rtems_interrupt_disable( isrlevel ); \
+ (_buffer)->head = ((_buffer)->head+1) % RINGBUF_QUEUE_LENGTH; \
+ (_ch) = (_buffer)->buffer[ (_buffer)->head ]; \
+ rtems_interrupt_enable( isrlevel ); \
+ } while ( 0 )
+
+#endif
diff --git a/cpukit/libcsupport/include/rtems/assoc.h b/cpukit/libcsupport/include/rtems/assoc.h
new file mode 100644
index 0000000000..1982d654ac
--- /dev/null
+++ b/cpukit/libcsupport/include/rtems/assoc.h
@@ -0,0 +1,42 @@
+/*
+ *
+ * Rtems associativity routines. Mainly used to convert a value from
+ * one space to another (eg: our errno's to host errno's and v.v)
+ *
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_ASSOC_H
+#define _INCLUDE_ASSOC_H
+
+typedef struct {
+ const char *name;
+ unsigned32 local_value;
+ unsigned32 remote_value;
+} rtems_assoc_t;
+
+/*
+ * Flag/marker for optional default value in each table
+ */
+
+#define RTEMS_ASSOC_DEFAULT_NAME "(default)"
+
+const rtems_assoc_t *rtems_assoc_ptr_by_name(const rtems_assoc_t *, const char *);
+const rtems_assoc_t *rtems_assoc_ptr_by_value(const rtems_assoc_t *, unsigned32);
+const rtems_assoc_t *rtems_assoc_ptr_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_local_by_remote(const rtems_assoc_t *, unsigned32);
+unsigned32 rtems_assoc_remote_by_name(const rtems_assoc_t *, const char *);
+unsigned32 rtems_assoc_local_by_name(const rtems_assoc_t *, const char *);
+const char *rtems_assoc_name_by_local(const rtems_assoc_t *, unsigned32);
+const char *rtems_assoc_name_by_remote(const rtems_assoc_t *, unsigned32);
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(const rtems_assoc_t *, unsigned32);
+char *rtems_assoc_name_by_local_bitfield(const rtems_assoc_t *, unsigned32, char *);
+char *rtems_assoc_name_by_remote_bitfield(const rtems_assoc_t *, unsigned32, char *);
+unsigned32 rtems_assoc_local_by_remote_bitfield(const rtems_assoc_t *, unsigned32);
+
+
+#endif /* ! _INCLUDE_ASSOC_H */
diff --git a/cpukit/libcsupport/include/rtems/error.h b/cpukit/libcsupport/include/rtems/error.h
new file mode 100644
index 0000000000..a0698afb5d
--- /dev/null
+++ b/cpukit/libcsupport/include/rtems/error.h
@@ -0,0 +1,38 @@
+/*
+ * Defines and externs for rtems error reporting
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ERROR_h
+#define __RTEMS_ERROR_h
+
+/*
+ * rtems_error() and rtems_panic() support
+ */
+
+#define RTEMS_ERROR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define RTEMS_ERROR_PANIC (RTEMS_ERROR_ERRNO / 2) /* err fatal; no return */
+#define RTEMS_ERROR_ABORT (RTEMS_ERROR_ERRNO / 4) /* err is fatal; panic */
+
+#define RTEMS_ERROR_MASK (RTEMS_ERROR_ERRNO | RTEMS_ERROR_ABORT | \
+ RTEMS_ERROR_PANIC) /* all */
+
+const char *rtems_status_text(rtems_status_code);
+int rtems_error(int error_code, const char *printf_format, ...);
+#ifdef __GNUC__
+void rtems_panic(const char *printf_format, ...);
+/*
+ * We should be able to use this attribute but gcc complains that
+ * rtems_panic does in fact return. :(
+ *
+ * __attribute__ ((__noreturn__));
+ */
+#else
+void rtems_panic(const char *printf_format, ...);
+#endif
+
+extern int rtems_panic_in_progress;
+
+#endif
+/* end of include file */
diff --git a/cpukit/libcsupport/include/rtems/libcsupport.h b/cpukit/libcsupport/include/rtems/libcsupport.h
new file mode 100644
index 0000000000..470a35b51a
--- /dev/null
+++ b/cpukit/libcsupport/include/rtems/libcsupport.h
@@ -0,0 +1,43 @@
+/* libcsupport.h
+ *
+ * This include file contains the information regarding the
+ * RTEMS specific support for the standard C library.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __LIBC_SUPPORT_h
+#define __LIBC_SUPPORT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/types.h>
+
+void RTEMS_Malloc_Initialize(
+ void *start,
+ size_t length,
+ size_t sbrk_amount
+);
+
+extern void malloc_dump(void);
+extern void malloc_walk(size_t source, size_t printf_enabled);
+extern void libc_init(int reentrant);
+extern int host_errno(void);
+extern void fix_syscall_errno(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h
new file mode 100644
index 0000000000..c79dfc2e33
--- /dev/null
+++ b/cpukit/libcsupport/include/rtems/libio.h
@@ -0,0 +1,124 @@
+/*
+ * General purpose communication channel for RTEMS to allow UNIX/POSIX
+ * system call behavior on top of RTEMS IO devices.
+ *
+ * TODO
+ * stat(2)
+ * unlink(2)
+ * rename(2)
+ *
+ * $Id$
+ */
+
+#ifndef _RTEMS_LIBIO_H
+#define _RTEMS_LIBIO_H
+
+#include <sys/stat.h>
+
+typedef unsigned32 rtems_libio_offset_t;
+
+/*
+ * An open file data structure, indexed by 'fd'
+ * TODO:
+ * should really have a separate per/file data structure that this
+ * points to (eg: size, offset, driver, pathname should be in that)
+ */
+
+typedef struct {
+ rtems_driver_name_t *driver;
+ rtems_libio_offset_t size; /* size of file */
+ rtems_libio_offset_t offset; /* current offset into the file */
+ unsigned32 flags;
+ char *pathname; /* opened pathname */
+ Objects_Id sem;
+ unsigned32 data0; /* private to "driver" */
+ unsigned32 data1; /* ... */
+} rtems_libio_t;
+
+
+/*
+ * param block for read/write
+ * Note: it must include 'offset' instead of using iop's offset since
+ * we can have multiple outstanding i/o's on a device.
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ rtems_libio_offset_t offset;
+ unsigned8 *buffer;
+ unsigned32 count;
+ unsigned32 flags;
+ unsigned32 bytes_moved;
+} rtems_libio_rw_args_t;
+
+/*
+ * param block for open/close
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 flags;
+ unsigned32 mode;
+} rtems_libio_open_close_args_t;
+
+/*
+ * param block for ioctl
+ */
+
+typedef struct {
+ rtems_libio_t *iop;
+ unsigned32 command;
+ void *buffer;
+ unsigned32 ioctl_return;
+} rtems_libio_ioctl_args_t;
+
+
+/*
+ * Values for 'flag'
+ */
+
+#define LIBIO_FLAGS_NO_DELAY 0x0001 /* return immediately if no data */
+#define LIBIO_FLAGS_READ 0x0002 /* reading */
+#define LIBIO_FLAGS_WRITE 0x0004 /* writing */
+#define LIBIO_FLAGS_LINE_BUFFERED 0x0008 /* line buffered io (^h, ^u, etc) */
+#define LIBIO_FLAGS_OPEN 0x0100 /* device is open */
+#define LIBIO_FLAGS_APPEND 0x0200 /* all writes append */
+#define LIBIO_FLAGS_CREATE 0x0400 /* create file */
+
+#define LIBIO_FLAGS_READ_WRITE (LIBIO_FLAGS_READ | LIBIO_FLAGS_WRITE)
+
+void rtems_libio_config(rtems_configuration_table *config, unsigned32 max_fds);
+void rtems_libio_init(void);
+
+int __rtems_open(const char *pathname, unsigned32 flag, unsigned32 mode);
+int __rtems_close(int fd);
+int __rtems_read(int fd, void *buffer, unsigned32 count);
+int __rtems_write(int fd, const void *buffer, unsigned32 count);
+int __rtems_ioctl(int fd, unsigned32 command, void *buffer);
+int __rtems_lseek(int fd, rtems_libio_offset_t offset, int whence);
+int __rtems_fstat(int _fd, struct stat* _sbuf);
+int __rtems_isatty(int _fd);
+
+/*
+ * External I/O handlers
+ */
+typedef struct {
+ int (*open)(const char *pathname, unsigned32 flag, unsigned32 mode);
+ int (*close)(int fd);
+ int (*read)(int fd, void *buffer, unsigned32 count);
+ int (*write)(int fd, const void *buffer, unsigned32 count);
+ int (*ioctl)(int fd, unsigned32 command, void *buffer);
+ int (*lseek)(int fd, rtems_libio_offset_t offset, int whence);
+} rtems_libio_handler_t;
+
+void rtems_register_libio_handler(int handler_flag,
+ const rtems_libio_handler_t *handler);
+
+#define RTEMS_FILE_DESCRIPTOR_TYPE_FILE 0x0000
+#define RTEMS_FILE_DESCRIPTOR_TYPE_SOCKET 0x1000
+#define rtems_make_file_descriptor(fd,flags) ((fd)|(flags))
+#define rtems_file_descriptor_base(fd) ((fd) & 0x0FFF)
+#define rtems_file_descriptor_type(fd) ((fd) & 0xF000)
+#define rtems_file_descriptor_type_index(fd) ((((fd) & 0xF000) >> 12) - 1)
+
+#endif /* _RTEMS_LIBIO_H */
diff --git a/cpukit/libcsupport/include/spurious.h b/cpukit/libcsupport/include/spurious.h
new file mode 100644
index 0000000000..1250b60d56
--- /dev/null
+++ b/cpukit/libcsupport/include/spurious.h
@@ -0,0 +1,38 @@
+/* spurious.h
+ *
+ * This file describes the Spurious Interrupt Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SPURIOUS_h
+#define __SPURIOUS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SPURIOUS_DRIVER_TABLE_ENTRY \
+ { Spurious_Initialize, NULL, NULL, NULL, NULL, NULL }
+
+rtems_device_driver Spurious_Initialize(
+ rtems_device_major_number,
+ rtems_device_minor_number,
+ void *,
+ rtems_id,
+ rtems_unsigned32 *
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/libcsupport/include/sys/utsname.h b/cpukit/libcsupport/include/sys/utsname.h
new file mode 100644
index 0000000000..ca15230d40
--- /dev/null
+++ b/cpukit/libcsupport/include/sys/utsname.h
@@ -0,0 +1,49 @@
+/* sys/utsname.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SYS_UTSNAME_h
+#define __POSIX_SYS_UTSNAME_h
+
+#include <sys/times.h>
+#include <sys/types.h>
+
+/*
+ * 4.4.1 Get System Name (Table 4-1), P1003.1b-1993, p. 90
+ *
+ * NOTE: The lengths of the strings in this structure are
+ * just long enough to reliably contain the RTEMS information.
+ * For example, the fields are not long enough to support
+ * Internet hostnames.
+ */
+
+struct utsname {
+ char sysname[ 32 ]; /* Name of this implementation of the operating system */
+ char nodename[ 32 ]; /* Name of this node within an implementation */
+ /* specified communication network */
+ char release[ 32 ]; /* Current release level of this implementation */
+ char version[ 32 ]; /* Current version level of this release */
+ char machine[ 32 ]; /* Name of the hardware type on which the system */
+ /* is running */
+};
+
+/*
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+);
+
+/*
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+);
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/libcsupport/include/timerdrv.h b/cpukit/libcsupport/include/timerdrv.h
new file mode 100644
index 0000000000..e7dd1c37a3
--- /dev/null
+++ b/cpukit/libcsupport/include/timerdrv.h
@@ -0,0 +1,40 @@
+/* timerdrv.h
+ *
+ * This file describes the Timer Driver for all boards.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_DRIVER_h
+#define __TIMER_DRIVER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* functions */
+
+void Timer_initialize( void );
+
+rtems_unsigned32 Read_timer( void );
+
+rtems_status_code Empty_function( void );
+
+void Set_find_average_overhead(
+ rtems_boolean find_flag
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/libcsupport/include/vmeintr.h b/cpukit/libcsupport/include/vmeintr.h
new file mode 100644
index 0000000000..2052acecbb
--- /dev/null
+++ b/cpukit/libcsupport/include/vmeintr.h
@@ -0,0 +1,58 @@
+/*
+ * vmeintr.h
+ *
+ * This file is the specification for the VMEbus interface library
+ * which should be provided by all BSPs for VMEbus Single Board
+ * Computers but currently only a few do so.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __VME_INTERRUPT_h
+#define __VME_INTERRUPT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This defines the mask which is used to determine which
+ * interrupt levels are affected by a call to this package.
+ * The LSB corresponds to VME interrupt 0 and the MSB
+ * to VME interrupt 7.
+ *
+ */
+
+typedef rtems_unsigned8 VME_interrupt_Mask;
+
+/*
+ * VME_interrupt_Disable
+ *
+ */
+
+void VME_interrupt_Disable (
+ VME_interrupt_Mask mask /* IN */
+);
+
+/*
+ * VME_interrupt_Disable
+ *
+ */
+
+void VME_interrupt_Enable (
+ VME_interrupt_Mask mask /* IN */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* end of include file */
diff --git a/cpukit/libcsupport/src/README b/cpukit/libcsupport/src/README
new file mode 100644
index 0000000000..ee7a90501e
--- /dev/null
+++ b/cpukit/libcsupport/src/README
@@ -0,0 +1,37 @@
+--
+-- $Id$
+--
+
+Overview of newlib support (newlib is from CYGNUS)
+ Each task can have its own libc state including:
+ open stdio files
+ strtok
+ multi precision arithmetic state
+ etc.
+
+ This is implemented by a reentrancy data structure for each task.
+
+ When a task is "started" (in RTEMS sense) the reentrancy structure
+ is allocated. Its address is stored in notepad[NOTEPAD_LAST].
+
+ When task is switched to, the value of global variable _impure_ptr
+ is changed to the value of the new tasks reentrancy structure.
+
+ When a task is deleted
+ atexit() processing (for that task) happens
+ task's stdio buffers are flushed
+
+ When exit(3) is called
+ calling task's atexit processing done
+ global libc state atexit processing done
+ (this will include any atexit routines installed by drivers)
+ executive is shutdown
+ causes a context switch back to bsp land
+
+
+NOTE:
+ libc extension are installed by bsp_libc_init()
+ iff we are using clock interrupts.
+ This hack is necessary to allow the tmtests to avoid
+ timing the extensions.
+
diff --git a/cpukit/libcsupport/src/__brk.c b/cpukit/libcsupport/src/__brk.c
new file mode 100644
index 0000000000..853ace5e02
--- /dev/null
+++ b/cpukit/libcsupport/src/__brk.c
@@ -0,0 +1,44 @@
+#if !defined(RTEMS_UNIX)
+
+/*
+ * RTEMS "Broken" __brk/__sbrk Implementation
+ *
+ * NOTE: sbrk is BSP provided.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#ifdef RTEMS_NEWLIB
+#include <reent.h>
+#endif
+#include <unistd.h>
+
+/* we use RTEMS for memory management. We don't need sbrk */
+
+void * __sbrk(int incr)
+{
+ errno = EINVAL;
+ return (void *)0;
+}
+
+int __brk( const void *endds )
+{
+ errno = EINVAL;
+ return -1;
+}
+
+#endif
diff --git a/cpukit/libcsupport/src/__gettod.c b/cpukit/libcsupport/src/__gettod.c
new file mode 100644
index 0000000000..1d80792446
--- /dev/null
+++ b/cpukit/libcsupport/src/__gettod.c
@@ -0,0 +1,103 @@
+#if !defined(RTEMS_UNIX)
+/*
+ * RTEMS gettimeofday Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#ifdef RTEMS_NEWLIB
+#include <sys/reent.h>
+#endif
+
+#include <time.h>
+#include <sys/time.h>
+
+#include <errno.h>
+#include <assert.h>
+
+/*
+ * NOTE: The solaris gettimeofday does not have a second parameter.
+ */
+
+int gettimeofday(
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ rtems_status_code status;
+ rtems_clock_time_value time;
+
+ if ( !tp ) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* "POSIX" does not seem to allow for not having a TOD */
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TIME_VALUE, &time );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ assert( 0 );
+ return -1;
+ }
+
+ tp->tv_sec = time.seconds;
+ tp->tv_usec = time.microseconds;
+
+ /*
+ * newlib does not have timezone and daylight savings time
+ * yet. When it does this needs to be fixed.
+ */
+
+#if 0
+ if ( tzp ) {
+ tzp->tz_minuteswest = 0; /* at UTC */
+ tzp->tz_dsttime = 0; /* no daylight savings */
+ tzp->minuteswest = timezone / 60; /* from seconds to minutes */
+ tzp->dsttime = daylight;
+ }
+#endif
+ return 0;
+}
+
+#if defined(RTEMS_NEWLIB)
+
+#if 0
+/*
+ * "Reentrant" version
+ */
+
+int _gettimeofday_r(
+ struct _reent *ignored_reentrancy_stuff,
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ return gettimeofday( tp, tzp );
+}
+#endif
+
+/*
+ * "System call" version
+ */
+
+int _gettimeofday(
+ struct timeval *tp,
+ struct timezone *tzp
+)
+{
+ return gettimeofday( tp, tzp );
+}
+
+#endif /* defined(RTEMS_NEWLIB) */
+
+#endif
diff --git a/cpukit/libcsupport/src/__times.c b/cpukit/libcsupport/src/__times.c
new file mode 100644
index 0000000000..fb46d0238d
--- /dev/null
+++ b/cpukit/libcsupport/src/__times.c
@@ -0,0 +1,65 @@
+/*
+ * RTEMS _times Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <sys/times.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <assert.h>
+
+clock_t _times(
+ struct tms *ptms
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks_since_boot;
+
+ if ( !ptms ) {
+ errno = EFAULT;
+ return -1;
+ }
+
+ /* "POSIX" does not seem to allow for not having a TOD */
+ status = rtems_clock_get(
+ RTEMS_CLOCK_GET_TICKS_SINCE_BOOT,
+ &ticks_since_boot
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ assert( 0 );
+ return -1;
+ }
+
+ /*
+ * RTEMS has no notion of system versus user time and does
+ * not (as of 3.2.0) keep track of CPU usage on a per task basis.
+ */
+
+ ptms->tms_utime = ticks_since_boot;
+ ptms->tms_stime = 0;
+ ptms->tms_cutime = 0;
+ ptms->tms_cstime = 0;
+
+ return 0;
+}
+
+clock_t times(
+ struct tms *ptms
+)
+{
+ return _times( ptms );
+}
+
diff --git a/cpukit/libcsupport/src/assoc.c b/cpukit/libcsupport/src/assoc.c
new file mode 100644
index 0000000000..74387a8c5b
--- /dev/null
+++ b/cpukit/libcsupport/src/assoc.c
@@ -0,0 +1,260 @@
+/*
+ * assoc.c
+ * rtems assoc routines
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "assoc.h"
+
+#include <stdio.h> /* sprintf */
+#include <string.h> /* strcat, strcmp */
+
+#define STREQ(a,b) (strcmp((a), (b)) == 0)
+#define rtems_assoc_is_default(ap) ((ap)->name && STREQ(ap->name, RTEMS_ASSOC_DEFAULT_NAME))
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (strcmp(ap->name, name) == 0)
+ return ap;
+
+ return default_ap;
+}
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->local_value == local_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+const rtems_assoc_t *
+rtems_assoc_ptr_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *default_ap = 0;
+
+ if (rtems_assoc_is_default(ap))
+ default_ap = ap++;
+
+ for ( ; ap->name; ap++)
+ if (ap->remote_value == remote_value)
+ return ap;
+
+ return default_ap;
+}
+
+
+/*
+ * Get values
+ */
+
+unsigned32
+rtems_assoc_remote_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_remote_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->remote_value;
+
+ return 0;
+}
+
+unsigned32
+rtems_assoc_local_by_name(
+ const rtems_assoc_t *ap,
+ const char *name
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_name(ap, name);
+ if (nap)
+ return nap->local_value;
+
+ return 0;
+}
+
+/*
+ * what to return if a value is not found
+ * this is not reentrant, but it really shouldn't be invoked anyway
+ */
+
+const char *
+rtems_assoc_name_bad(
+ unsigned32 bad_value
+)
+{
+#ifdef RTEMS_DEBUG
+ static char bad_buffer[32];
+
+ sprintf(bad_buffer, "< %d [0x%x] >", bad_value, bad_value);
+#else
+ static char bad_buffer[32] = "<assoc.c: BAD NAME>";
+#endif
+ return bad_buffer;
+}
+
+
+const char *
+rtems_assoc_name_by_local(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_local(ap, local_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(local_value);
+}
+
+const char *
+rtems_assoc_name_by_remote(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ const rtems_assoc_t *nap;
+ nap = rtems_assoc_ptr_by_remote(ap, remote_value);
+ if (nap)
+ return nap->name;
+
+ return rtems_assoc_name_bad(remote_value);
+}
+
+/*
+ * Bitfield functions assume just 1 bit set in each of remote and local
+ * entries; they do not check for this.
+ */
+
+unsigned32 rtems_assoc_remote_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 local_value
+ )
+{
+ unsigned32 b;
+ unsigned32 remote_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & local_value)
+ remote_value |= rtems_assoc_remote_by_local(ap, b);
+
+ return remote_value;
+}
+
+
+unsigned32 rtems_assoc_local_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 remote_value
+ )
+{
+ unsigned32 b;
+ unsigned32 local_value = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & remote_value)
+ local_value |= rtems_assoc_local_by_remote(ap, b);
+
+ return local_value;
+}
+
+char *
+rtems_assoc_name_by_remote_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_remote(ap, b));
+ }
+
+ return buffer;
+}
+
+char *
+rtems_assoc_name_by_local_bitfield(
+ const rtems_assoc_t *ap,
+ unsigned32 value,
+ char *buffer
+ )
+{
+ unsigned32 b;
+
+ *buffer = 0;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (*buffer)
+ strcat(buffer, " ");
+ strcat(buffer, rtems_assoc_name_by_local(ap, b));
+ }
+
+ return buffer;
+}
diff --git a/cpukit/libcsupport/src/error.c b/cpukit/libcsupport/src/error.c
new file mode 100644
index 0000000000..5bd481c3e6
--- /dev/null
+++ b/cpukit/libcsupport/src/error.c
@@ -0,0 +1,209 @@
+/*
+ * report errors and panics to RTEMS' stderr.
+ * Currently just used by RTEMS monitor.
+ *
+ * $Id$
+ */
+
+
+/*
+ * These routines provide general purpose error reporting.
+ * rtems_error reports an error to stderr and allows use of
+ * printf style formatting. A newline is appended to all messages.
+ *
+ * error_flag can be specified as any of the following:
+ *
+ * RTEMS_ERROR_ERRNO -- include errno text in output
+ * RTEMS_ERROR_PANIC -- halts local system after output
+ * RTEMS_ERROR_ABORT -- abort after output
+ *
+ * It can also include a rtems_status value which can be OR'd
+ * with the above flags. *
+ *
+ * EXAMPLE
+ * #include <rtems.h>
+ * #include <rtems/error.h>
+ * rtems_error(0, "stray interrupt %d", intr);
+ *
+ * EXAMPLE
+ * if ((status = rtems_task_create(...)) != RTEMS_SUCCCESSFUL)
+ * {
+ * rtems_error(status | RTEMS_ERROR_ABORT,
+ * "could not create task");
+ * }
+ *
+ * EXAMPLE
+ * if ((fd = open(pathname, O_RDNLY)) < 0)
+ * {
+ * rtems_error(RTEMS_ERROR_ERRNO, "open of '%s' failed", pathname);
+ * goto failed;
+ * }
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "error.h"
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h> /* _exit() */
+
+/* bug in hpux <errno.h>: no prototypes unless you are C++ */
+#ifdef hpux9
+char *strerror(int);
+#endif
+
+extern char *rtems_progname;
+int rtems_panic_in_progress;
+
+rtems_assoc_t rtems_status_assoc[] = {
+ { "successful completion", RTEMS_SUCCESSFUL, },
+ { "returned from a thread", RTEMS_TASK_EXITTED, },
+ { "multiprocessing not configured", RTEMS_MP_NOT_CONFIGURED, },
+ { "invalid object name", RTEMS_INVALID_NAME, },
+ { "invalid object id", RTEMS_INVALID_ID, },
+ { "too many", RTEMS_TOO_MANY, },
+ { "timed out waiting", RTEMS_TIMEOUT, },
+ { "object deleted while waiting", RTEMS_OBJECT_WAS_DELETED, },
+ { "specified size was invalid", RTEMS_INVALID_SIZE, },
+ { "address specified is invalid", RTEMS_INVALID_ADDRESS, },
+ { "number was invalid", RTEMS_INVALID_NUMBER, },
+ { "item has not been initialized", RTEMS_NOT_DEFINED, },
+ { "resources still outstanding", RTEMS_RESOURCE_IN_USE, },
+ { "request not satisfied", RTEMS_UNSATISFIED, },
+ { "thread is in wrong state", RTEMS_INCORRECT_STATE, },
+ { "thread already in state", RTEMS_ALREADY_SUSPENDED, },
+ { "illegal on calling thread", RTEMS_ILLEGAL_ON_SELF, },
+ { "illegal for remote object", RTEMS_ILLEGAL_ON_REMOTE_OBJECT, },
+ { "called from wrong environment", RTEMS_CALLED_FROM_ISR, },
+ { "invalid thread priority", RTEMS_INVALID_PRIORITY, },
+ { "invalid date/time", RTEMS_INVALID_CLOCK, },
+ { "invalid node id", RTEMS_INVALID_NODE, },
+ { "directive not configured", RTEMS_NOT_CONFIGURED, },
+ { "not owner of resource", RTEMS_NOT_OWNER_OF_RESOURCE , },
+ { "directive not implemented", RTEMS_NOT_IMPLEMENTED, },
+ { "RTEMS inconsistency detected", RTEMS_INTERNAL_ERROR, },
+ { "could not get enough memory", RTEMS_NO_MEMORY, },
+ { "internal multiprocessing only", THREAD_STATUS_PROXY_BLOCKING, },
+ { 0, 0, 0 },
+};
+
+
+const char *
+rtems_status_text(
+ rtems_status_code status
+)
+{
+ return rtems_assoc_name_by_local(rtems_status_assoc, status);
+}
+
+
+static int rtems_verror(
+ unsigned32 error_flag,
+ const char *printf_format,
+ va_list arglist
+)
+{
+ int local_errno = 0;
+ int chars_written = 0;
+ rtems_status_code status;
+
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_panic_in_progress++;
+
+ /* disable task switches */
+ _Thread_Disable_dispatch();
+
+ /* don't aggravate things */
+ if (rtems_panic_in_progress > 2)
+ return 0;
+ }
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ status = error_flag & ~RTEMS_ERROR_MASK;
+ if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */
+ local_errno = errno;
+
+ if (_System_state_Is_multiprocessing)
+ fprintf(stderr, "[%d] ", _Configuration_MP_table->node);
+
+ if (rtems_progname && *rtems_progname)
+ chars_written += fprintf(stderr, "%s: ", rtems_progname);
+ chars_written += vfprintf(stderr, printf_format, arglist);
+
+ if (status)
+ chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status));
+
+ if (local_errno)
+ if ((local_errno > 0) && *strerror(local_errno))
+ chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno));
+ else
+ chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno);
+
+ chars_written += fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT))
+ {
+ if (error_flag & RTEMS_ERROR_PANIC)
+ {
+ rtems_error(0, "fatal error, exiting");
+ _exit(local_errno);
+ }
+ else
+ {
+ rtems_error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+ return chars_written;
+}
+
+
+/*
+ * Report an error.
+ * error_flag is as above; printf_format is a normal
+ * printf(3) format string, with its concommitant arguments.
+ *
+ * Returns the number of characters written.
+ */
+
+int rtems_error(
+ int error_flag,
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+ int chars_written;
+
+ va_start(arglist, printf_format);
+ chars_written = rtems_verror(error_flag, printf_format, arglist);
+ va_end(arglist);
+
+ return chars_written;
+}
+
+/*
+ * rtems_panic is shorthand for rtems_error(RTEMS_ERROR_PANIC, ...)
+ */
+
+void rtems_panic(
+ const char *printf_format,
+ ...
+ )
+{
+ va_list arglist;
+
+ va_start(arglist, printf_format);
+ (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist);
+ va_end(arglist);
+}
diff --git a/cpukit/libcsupport/src/hosterr.c b/cpukit/libcsupport/src/hosterr.c
new file mode 100644
index 0000000000..7c0838a2e0
--- /dev/null
+++ b/cpukit/libcsupport/src/hosterr.c
@@ -0,0 +1,43 @@
+/*
+ * Routines to access a host errno
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <errno.h>
+
+int host_errno(void);
+
+/*
+ * copy host errno, if any to thread aware errno, if any
+ */
+
+void fix_syscall_errno(void)
+{
+ errno = host_errno();
+}
+
+/*
+ * Get the host system errno, if any
+ * When using newlib (or possibly other libc's) on top of UNIX
+ * the errno returned by system calls may be unavailable due
+ * to trickery of making errno thread aware.
+ * This provides a kludge of getting at it.
+ */
+
+#undef errno
+extern int errno;
+int host_errno(void)
+{
+ return errno;
+}
+
diff --git a/cpukit/libcsupport/src/libio.c b/cpukit/libcsupport/src/libio.c
new file mode 100644
index 0000000000..ec10184a10
--- /dev/null
+++ b/cpukit/libcsupport/src/libio.c
@@ -0,0 +1,532 @@
+/*
+ * Provide UNIX/POSIX-like io system calls for RTEMS using the
+ * RTEMS IO manager
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <rtems/assoc.h> /* assoc.h not included by rtems.h */
+
+#include <stdio.h> /* O_RDONLY, et.al. */
+#include <fcntl.h> /* O_RDONLY, et.al. */
+#include <assert.h>
+
+#if ! defined(O_NDELAY)
+# if defined(solaris2)
+# define O_NDELAY O_NONBLOCK
+# elif defined(RTEMS_NEWLIB)
+# define O_NDELAY _FNBIO
+# endif
+#endif
+
+
+#include <errno.h>
+#include <string.h> /* strcmp */
+#include <unistd.h>
+#include <stdlib.h> /* calloc() */
+
+#include "libio.h" /* libio.h not pulled in by rtems */
+
+/*
+ * Semaphore to protect the io table
+ */
+
+Objects_Id rtems_libio_semaphore;
+
+#define RTEMS_LIBIO_SEM rtems_build_name('L', 'B', 'I', 'O')
+#define RTEMS_LIBIO_IOP_SEM(n) rtems_build_name('L', 'B', 'I', n)
+
+unsigned32 rtems_libio_number_iops;
+rtems_libio_t *rtems_libio_iops;
+rtems_libio_t *rtems_libio_last_iop;
+
+#define rtems_libio_iop(fd) ((((unsigned32)(fd)) < rtems_libio_number_iops) ? \
+ &rtems_libio_iops[fd] : 0)
+
+#define rtems_libio_check_fd(fd) \
+ do { \
+ if ((unsigned32) (fd) >= rtems_libio_number_iops) \
+ { \
+ errno = EBADF; \
+ return -1; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_buffer(buffer) \
+ do { \
+ if ((buffer) == 0) \
+ { \
+ errno = EINVAL; \
+ return -1; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_count(count) \
+ do { \
+ if ((count) == 0) \
+ { \
+ return 0; \
+ } \
+ } while (0)
+
+#define rtems_libio_check_permissions(iop, flag) \
+ do { \
+ if (((iop)->flags & (flag)) == 0) \
+ { \
+ errno = EINVAL; \
+ return -1; \
+ } \
+ } while (0)
+
+/*
+ * External I/O handlers
+ *
+ * Space for all possible handlers is preallocated
+ * to speed up dispatch to external handlers.
+ */
+
+static rtems_libio_handler_t handlers[15];
+
+void
+rtems_register_libio_handler(
+ int handler_flag,
+ const rtems_libio_handler_t *handler
+)
+{
+ int handler_index = rtems_file_descriptor_type_index(handler_flag);
+
+ if ((handler_index < 0) || (handler_index >= 15))
+ rtems_fatal_error_occurred( RTEMS_INVALID_NUMBER );
+ handlers[handler_index] = *handler;
+}
+
+
+void
+rtems_libio_config(
+ rtems_configuration_table *config,
+ unsigned32 max_fds
+)
+{
+ rtems_libio_number_iops = max_fds;
+
+ /*
+ * tweak config to reflect # of semaphores we will need
+ */
+
+ /* one for iop table */
+ config->RTEMS_api_configuration->maximum_semaphores += 1;
+ config->RTEMS_api_configuration->maximum_semaphores += max_fds;
+}
+
+/*
+ * Called by bsp startup code to init the libio area.
+ */
+
+void
+rtems_libio_init(void)
+{
+ rtems_status_code rc;
+
+ if (rtems_libio_number_iops > 0)
+ {
+ rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops,
+ sizeof(rtems_libio_t));
+ if (rtems_libio_iops == NULL)
+ rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
+
+ rtems_libio_last_iop = rtems_libio_iops + (rtems_libio_number_iops - 1);
+ }
+
+ rc = rtems_semaphore_create(
+ RTEMS_LIBIO_SEM,
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &rtems_libio_semaphore
+ );
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+}
+
+/*
+ * Convert RTEMS status to a UNIX errno
+ */
+
+rtems_assoc_t errno_assoc[] = {
+ { "OK", RTEMS_SUCCESSFUL, 0 },
+ { "TIMEOUT", RTEMS_TIMEOUT, ETIME },
+ { "NO MEMORY", RTEMS_NO_MEMORY, ENOMEM },
+ { "NO DEVICE", RTEMS_UNSATISFIED, ENOSYS },
+ { 0, 0, 0 },
+};
+
+static unsigned32
+rtems_libio_errno(rtems_status_code code)
+{
+ int rc;
+
+ if ((rc = rtems_assoc_remote_by_local(errno_assoc, (unsigned32) code)))
+ {
+ errno = rc;
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * Convert UNIX fnctl(2) flags to ones that RTEMS drivers understand
+ */
+
+rtems_assoc_t access_modes_assoc[] = {
+ { "READ", LIBIO_FLAGS_READ, O_RDONLY },
+ { "WRITE", LIBIO_FLAGS_WRITE, O_WRONLY },
+ { "READ/WRITE", LIBIO_FLAGS_READ_WRITE, O_RDWR },
+ { 0, 0, 0 },
+};
+
+rtems_assoc_t status_flags_assoc[] = {
+ { "NO DELAY", LIBIO_FLAGS_NO_DELAY, O_NDELAY },
+ { "APPEND", LIBIO_FLAGS_APPEND, O_APPEND },
+ { "CREATE", LIBIO_FLAGS_CREATE, O_CREAT },
+ { 0, 0, 0 },
+};
+
+static unsigned32
+rtems_libio_fcntl_flags(unsigned32 fcntl_flags)
+{
+ unsigned32 flags = 0;
+ unsigned32 access_modes;
+
+ /*
+ * Access mode is a small integer
+ */
+
+ access_modes = fcntl_flags & O_ACCMODE;
+ fcntl_flags &= ~O_ACCMODE;
+ flags = rtems_assoc_local_by_remote(access_modes_assoc, access_modes);
+
+ /*
+ * Everything else is single bits
+ */
+
+ flags |= rtems_assoc_local_by_remote_bitfield(status_flags_assoc, fcntl_flags);
+ return flags;
+}
+
+
+static rtems_libio_t *
+rtems_libio_allocate(void)
+{
+ rtems_libio_t *iop;
+ rtems_status_code rc;
+
+ rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+
+ for (iop = rtems_libio_iops; iop <= rtems_libio_last_iop; iop++)
+ if ((iop->flags & LIBIO_FLAGS_OPEN) == 0)
+ {
+ /*
+ * Got one; create a semaphore for it
+ */
+
+ rc = rtems_semaphore_create(
+ RTEMS_LIBIO_IOP_SEM(iop - rtems_libio_iops),
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &iop->sem
+ );
+ if (rc != RTEMS_SUCCESSFUL)
+ goto failed;
+
+ iop->flags = LIBIO_FLAGS_OPEN;
+ goto done;
+ }
+
+failed:
+ iop = 0;
+
+done:
+ rtems_semaphore_release(rtems_libio_semaphore);
+ return iop;
+}
+
+static void
+rtems_libio_free(rtems_libio_t *iop)
+{
+ rtems_semaphore_obtain(rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+
+ if (iop->sem)
+ rtems_semaphore_delete(iop->sem);
+ (void) memset(iop, 0, sizeof(*iop));
+
+ rtems_semaphore_release(rtems_libio_semaphore);
+}
+
+int
+__rtems_open(
+ const char *pathname,
+ unsigned32 flag,
+ unsigned32 mode)
+{
+ rtems_status_code rc;
+ rtems_libio_t *iop = 0;
+ rtems_driver_name_t *np;
+ rtems_libio_open_close_args_t args;
+
+ /*
+ * Additional external I/O handlers would be supported by
+ * adding code to pick apart the pathname appropriately.
+ * The networking code does not require changes here since
+ * network file descriptors are obtained using socket(), not
+ * open().
+ */
+
+ if ((rc = rtems_io_lookup_name(pathname, &np)) != RTEMS_SUCCESSFUL)
+ goto done;
+
+ iop = rtems_libio_allocate();
+ if (iop == 0)
+ {
+ rc = RTEMS_TOO_MANY;
+ goto done;
+ }
+
+ iop->driver = np;
+ iop->pathname = (char *) pathname;
+ iop->flags |= rtems_libio_fcntl_flags(flag);
+
+ args.iop = iop;
+ args.flags = iop->flags;
+ args.mode = mode;
+
+ rc = rtems_io_open(np->major, np->minor, (void *) &args);
+
+done:
+
+ if (rc != RTEMS_SUCCESSFUL)
+ {
+ if (iop)
+ rtems_libio_free(iop);
+ return rtems_libio_errno(rc);
+ }
+
+ return iop - rtems_libio_iops;
+}
+
+int
+__rtems_close(
+ int fd
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_open_close_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].close;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.flags = 0;
+ args.mode = 0;
+
+ rc = rtems_io_close(np->major, np->minor, (void *) &args);
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+ return 0;
+}
+
+int
+__rtems_read(
+ int fd,
+ void * buffer,
+ unsigned32 count
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_rw_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, void *buffer, unsigned32 count);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].read;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, buffer, count);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+ rtems_libio_check_buffer(buffer);
+ rtems_libio_check_count(count);
+ rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ rc = rtems_io_read(np->major, np->minor, (void *) &args);
+
+ iop->offset += args.bytes_moved;
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.bytes_moved;
+}
+
+int
+__rtems_write(
+ int fd,
+ const void *buffer,
+ unsigned32 count
+ )
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_rw_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, const void *buffer, unsigned32 count);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].write;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, buffer, count);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+ rtems_libio_check_buffer(buffer);
+ rtems_libio_check_count(count);
+ rtems_libio_check_permissions(iop, LIBIO_FLAGS_WRITE);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.offset = iop->offset;
+ args.buffer = (void *) buffer;
+ args.count = count;
+ args.flags = iop->flags;
+ args.bytes_moved = 0;
+
+ rc = rtems_io_write(np->major, np->minor, (void *) &args);
+
+ iop->offset += args.bytes_moved;
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.bytes_moved;
+}
+
+int
+__rtems_ioctl(
+ int fd,
+ unsigned32 command,
+ void * buffer)
+{
+ rtems_status_code rc;
+ rtems_driver_name_t *np;
+ rtems_libio_t *iop;
+ rtems_libio_ioctl_args_t args;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, unsigned32 command, void *buffer);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].ioctl;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, command, buffer);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ np = iop->driver;
+
+ args.iop = iop;
+ args.command = command;
+ args.buffer = buffer;
+
+ rc = rtems_io_control(np->major, np->minor, (void *) &args);
+
+ if (rc != RTEMS_SUCCESSFUL)
+ return rtems_libio_errno(rc);
+
+ return args.ioctl_return;
+}
+
+/*
+ * internal only??
+ */
+
+
+int
+__rtems_lseek(
+ int fd,
+ rtems_libio_offset_t offset,
+ int whence
+ )
+{
+ rtems_libio_t *iop;
+
+ if (rtems_file_descriptor_type(fd)) {
+ int (*fp)(int fd, rtems_libio_offset_t offset, int whence);
+
+ fp = handlers[rtems_file_descriptor_type_index(fd)].lseek;
+ if (fp == NULL) {
+ errno = EBADF;
+ return -1;
+ }
+ return (*fp)(fd, offset, whence);
+ }
+ iop = rtems_libio_iop(fd);
+ rtems_libio_check_fd(fd);
+
+ switch (whence)
+ {
+ case SEEK_SET:
+ iop->offset = offset;
+ break;
+
+ case SEEK_CUR:
+ iop->offset += offset;
+ break;
+
+ case SEEK_END:
+ iop->offset = iop->size - offset;
+ break;
+
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+ return 0;
+}
diff --git a/cpukit/libcsupport/src/malloc.c b/cpukit/libcsupport/src/malloc.c
new file mode 100644
index 0000000000..580cb97da1
--- /dev/null
+++ b/cpukit/libcsupport/src/malloc.c
@@ -0,0 +1,400 @@
+/*
+ * RTEMS Malloc Family Implementation
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "libcsupport.h"
+#ifdef RTEMS_NEWLIB
+#include <sys/reent.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h> /* sbrk(2) */
+
+rtems_id RTEMS_Malloc_Heap;
+size_t RTEMS_Malloc_Sbrk_amount;
+
+#ifdef RTEMS_DEBUG
+#define MALLOC_STATS
+#define MALLOC_DIRTY
+#endif
+
+#ifdef MALLOC_STATS
+#define MSBUMP(f,n) rtems_malloc_stats.f += (n)
+
+struct {
+ unsigned32 space_available; /* current size of malloc area */
+ unsigned32 malloc_calls; /* # calls to malloc */
+ unsigned32 free_calls;
+ unsigned32 realloc_calls;
+ unsigned32 calloc_calls;
+ unsigned32 max_depth; /* most ever malloc'd at 1 time */
+ unsigned64 lifetime_allocated;
+ unsigned64 lifetime_freed;
+} rtems_malloc_stats;
+
+#else /* No rtems_malloc_stats */
+#define MSBUMP(f,n)
+#endif
+
+void RTEMS_Malloc_Initialize(
+ void *start,
+ size_t length,
+ size_t sbrk_amount
+)
+{
+ rtems_status_code status;
+ void *starting_address;
+ rtems_unsigned32 old_address;
+ rtems_unsigned32 u32_address;
+
+ /*
+ * If the starting address is 0 then we are to attempt to
+ * get length worth of memory using sbrk. Make sure we
+ * align the address that we get back.
+ */
+
+ starting_address = start;
+ RTEMS_Malloc_Sbrk_amount = sbrk_amount;
+
+ if (!starting_address) {
+ u32_address = (unsigned int)sbrk(length);
+
+ if (u32_address == -1) {
+ rtems_fatal_error_occurred( RTEMS_NO_MEMORY );
+ /* DOES NOT RETURN!!! */
+ }
+
+ if (u32_address & (CPU_ALIGNMENT-1)) {
+ old_address = u32_address;
+ u32_address = (u32_address + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1);
+
+ /*
+ * adjust the length by whatever we aligned by
+ */
+
+ length -= u32_address - old_address;
+ }
+
+ starting_address = (void *)u32_address;
+ }
+
+ /*
+ * Unfortunately we cannot use assert if this fails because if this
+ * has failed we do not have a heap and if we do not have a heap
+ * STDIO cannot work because there will be no buffers.
+ */
+
+ status = rtems_region_create(
+ rtems_build_name( 'H', 'E', 'A', 'P' ),
+ starting_address,
+ length,
+ CPU_ALIGNMENT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &RTEMS_Malloc_Heap
+ );
+ if ( status != RTEMS_SUCCESSFUL )
+ rtems_fatal_error_occurred( status );
+
+#ifdef MALLOC_STATS
+ /* zero all the stats */
+ (void) memset(&rtems_malloc_stats, 0, sizeof(rtems_malloc_stats));
+#endif
+
+ MSBUMP(space_available, length);
+}
+
+#ifdef RTEMS_NEWLIB
+void *malloc(
+ size_t size
+)
+{
+ void *return_this;
+ void *starting_address;
+ rtems_unsigned32 the_size;
+ rtems_unsigned32 sbrk_amount;
+ rtems_status_code status;
+
+ MSBUMP(malloc_calls, 1);
+
+ if ( !size )
+ return (void *) 0;
+
+ /*
+ * Try to give a segment in the current region if there is not
+ * enough space then try to grow the region using rtems_region_extend().
+ * If this fails then return a NULL pointer.
+ */
+
+ status = rtems_region_get_segment(
+ RTEMS_Malloc_Heap,
+ size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &return_this
+ );
+
+ if ( status != RTEMS_SUCCESSFUL ) {
+ /*
+ * Round to the "requested sbrk amount" so hopefully we won't have
+ * to grow again for a while. This effectively does sbrk() calls
+ * in "page" amounts.
+ */
+
+ sbrk_amount = RTEMS_Malloc_Sbrk_amount;
+
+ if ( sbrk_amount == 0 )
+ return (void *) 0;
+
+ the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount);
+
+ if (((rtems_unsigned32)starting_address = (void *)sbrk(the_size)) == -1)
+ return (void *) 0;
+
+ status = rtems_region_extend(
+ RTEMS_Malloc_Heap,
+ starting_address,
+ the_size
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ sbrk(-the_size);
+ errno = ENOMEM;
+ return (void *) 0;
+ }
+
+ MSBUMP(space_available, the_size);
+
+ status = rtems_region_get_segment(
+ RTEMS_Malloc_Heap,
+ size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &return_this
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = ENOMEM;
+ return (void *) 0;
+ }
+ }
+
+#ifdef MALLOC_STATS
+ if (return_this)
+ {
+ unsigned32 actual_size;
+ unsigned32 current_depth;
+ status = rtems_region_get_segment_size(RTEMS_Malloc_Heap, return_this, &actual_size);
+ MSBUMP(lifetime_allocated, actual_size);
+ current_depth = rtems_malloc_stats.lifetime_allocated - rtems_malloc_stats.lifetime_freed;
+ if (current_depth > rtems_malloc_stats.max_depth)
+ rtems_malloc_stats.max_depth = current_depth;
+ }
+#endif
+
+#ifdef MALLOC_DIRTY
+ (void) memset(return_this, 0xCF, size);
+#endif
+
+ return return_this;
+}
+
+void *calloc(
+ size_t nelem,
+ size_t elsize
+)
+{
+ register char *cptr;
+ int length;
+
+ MSBUMP(calloc_calls, 1);
+
+ length = nelem * elsize;
+ cptr = malloc( length );
+ if ( cptr )
+ memset( cptr, '\0', length );
+
+ MSBUMP(malloc_calls, -1); /* subtract off the malloc */
+
+ return cptr;
+}
+
+void *realloc(
+ void *ptr,
+ size_t size
+)
+{
+ rtems_unsigned32 old_size;
+ rtems_status_code status;
+ char *new_area;
+
+ MSBUMP(realloc_calls, 1);
+
+ if ( !ptr )
+ return malloc( size );
+
+ if ( !size ) {
+ free( ptr );
+ return (void *) 0;
+ }
+
+ new_area = malloc( size );
+
+ MSBUMP(malloc_calls, -1); /* subtract off the malloc */
+
+ if ( !new_area ) {
+ free( ptr );
+ return (void *) 0;
+ }
+
+ status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &old_size );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = EINVAL;
+ return (void *) 0;
+ }
+
+ memcpy( new_area, ptr, (size < old_size) ? size : old_size );
+ free( ptr );
+
+ return new_area;
+
+}
+
+void free(
+ void *ptr
+)
+{
+ rtems_status_code status;
+
+ MSBUMP(free_calls, 1);
+
+ if ( !ptr )
+ return;
+
+#ifdef MALLOC_STATS
+ {
+ unsigned32 size;
+ status = rtems_region_get_segment_size( RTEMS_Malloc_Heap, ptr, &size );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ MSBUMP(lifetime_freed, size);
+ }
+ }
+#endif
+
+ status = rtems_region_return_segment( RTEMS_Malloc_Heap, ptr );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ errno = EINVAL;
+ assert( 0 );
+ }
+}
+/* end if RTEMS_NEWLIB */
+#endif
+
+#ifdef MALLOC_STATS
+/*
+ * Dump the malloc statistics
+ * May be called via atexit() (installable by our bsp) or
+ * at any time by user
+ */
+
+void malloc_dump(void)
+{
+ unsigned32 allocated = rtems_malloc_stats.lifetime_allocated - rtems_malloc_stats.lifetime_freed;
+
+ printf("Malloc stats\n");
+ printf(" avail:%uk allocated:%uk (%d%%) max:%uk (%d%%) lifetime:%Luk freed:%Luk\n",
+ (unsigned int) rtems_malloc_stats.space_available / 1024,
+ (unsigned int) allocated / 1024,
+ /* avoid float! */
+ (allocated * 100) / rtems_malloc_stats.space_available,
+ (unsigned int) rtems_malloc_stats.max_depth / 1024,
+ (rtems_malloc_stats.max_depth * 100) / rtems_malloc_stats.space_available,
+ (unsigned64) rtems_malloc_stats.lifetime_allocated / 1024,
+ (unsigned64) rtems_malloc_stats.lifetime_freed / 1024);
+ printf(" Call counts: malloc:%d free:%d realloc:%d calloc:%d\n",
+ rtems_malloc_stats.malloc_calls,
+ rtems_malloc_stats.free_calls,
+ rtems_malloc_stats.realloc_calls,
+ rtems_malloc_stats.calloc_calls);
+}
+
+
+void malloc_walk(size_t source, size_t printf_enabled)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+
+ the_region = _Region_Get( RTEMS_Malloc_Heap, &location );
+ if ( location == OBJECTS_LOCAL )
+ {
+ _Heap_Walk( &the_region->Memory, source, printf_enabled );
+ _Thread_Enable_dispatch();
+ }
+}
+
+#else
+
+void malloc_dump(void)
+{
+ return;
+}
+
+void malloc_walk(size_t source, size_t printf_enabled)
+{
+ return;
+}
+
+#endif
+
+/*
+ * "Reentrant" versions of the above routines implemented above.
+ */
+
+#ifdef RTEMS_NEWLIB
+void *malloc_r(
+ struct _reent *ignored,
+ size_t size
+)
+{
+ return malloc( size );
+}
+
+void *calloc_r(
+ size_t nelem,
+ size_t elsize
+)
+{
+ return calloc( nelem, elsize );
+}
+
+void *realloc_r(
+ void *ptr,
+ size_t size
+)
+{
+ return realloc_r( ptr, size );
+}
+
+void free_r(
+ void *ptr
+)
+{
+ free( ptr );
+}
+#endif
+
diff --git a/cpukit/libcsupport/src/newlibc.c b/cpukit/libcsupport/src/newlibc.c
new file mode 100644
index 0000000000..ac8b146a48
--- /dev/null
+++ b/cpukit/libcsupport/src/newlibc.c
@@ -0,0 +1,430 @@
+
+/*
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Description:
+ * Implementation of hooks for the CYGNUS newlib libc
+ * These hooks set things up so that:
+ * '_REENT' is switched at task switch time.
+ *
+ *
+ * TODO:
+ *
+ * NOTE:
+ *
+ * $Id$
+ *
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#if defined(RTEMS_NEWLIB)
+#include <libcsupport.h>
+#include <stdlib.h> /* for free() */
+#include <string.h> /* for memset() */
+
+#include <sys/reent.h> /* for extern of _REENT (aka _impure_ptr) */
+#include <errno.h>
+
+/*
+ * NOTE: When using RTEMS fake stat, fstat, and isatty, all output
+ * is line buffered so this setvbuf is not necessary. This
+ * setvbuf insures that we can redirect the output of a test
+ * on the UNIX simulator and it is in the same order as for a
+ * real target.
+ * NOTE:
+ * There is some problem with doing this on the hpux version
+ * of the UNIX simulator (symptom is printf core dumps), so
+ * we just don't for now.
+ * Not sure if this is a problem with hpux, newlib, or something else.
+ */
+
+#if defined(RTEMS_UNIX) && !defined(hpux)
+#define NEED_SETVBUF
+#endif
+
+#ifdef NEED_SETVBUF
+#include <stdio.h>
+#endif
+
+#include "internal.h"
+
+#define LIBC_NOTEPAD RTEMS_NOTEPAD_LAST
+
+
+int libc_reentrant; /* do we think we are reentrant? */
+struct _reent libc_global_reent = _REENT_INIT(libc_global_reent);
+
+/*
+ * CYGNUS newlib routine that does atexit() processing and flushes
+ * stdio streams
+ * undocumented
+ */
+
+extern void _wrapup_reent(struct _reent *);
+extern void _reclaim_reent(struct _reent *);
+
+void
+libc_wrapup(void)
+{
+ /*
+ * In case RTEMS is already down, don't do this. It could be
+ * dangerous.
+ */
+
+ if (!_System_state_Is_up(_System_state_Get()))
+ return;
+
+ _wrapup_reent(0);
+ if (_REENT != &libc_global_reent)
+ {
+ _wrapup_reent(&libc_global_reent);
+#if 0
+ /* don't reclaim this one, just in case we do printfs */
+ /* on our way out to ROM */
+ _reclaim_reent(&libc_global_reent);
+#endif
+ _REENT = &libc_global_reent;
+ }
+}
+
+
+rtems_boolean
+libc_create_hook(rtems_tcb *current_task,
+ rtems_tcb *creating_task)
+{
+ MY_task_set_note(creating_task, LIBC_NOTEPAD, 0);
+ return TRUE;
+}
+
+/*
+ * Called for all user TASKS (system tasks are MPCI Receive Server and IDLE)
+ */
+
+rtems_extension
+libc_start_hook(rtems_tcb *current_task,
+ rtems_tcb *starting_task)
+{
+ struct _reent *ptr;
+
+ /* NOTE: our malloc is reentrant without a reent ptr since
+ * it is based on region manager
+ */
+
+ ptr = (struct _reent *) calloc(1, sizeof(struct _reent));
+
+ if (!ptr)
+ rtems_fatal_error_occurred(RTEMS_NO_MEMORY);
+
+#ifdef __GNUC__
+ /* GCC extension: structure constants */
+ *ptr = (struct _reent) _REENT_INIT((*ptr));
+#else
+ /*
+ * Warning: THIS IS VERY DEPENDENT ON NEWLIB!!! WRITTEN FOR 1.7.0
+ */
+ ptr->_errno=0;
+ ptr->_stdin=&ptr->__sf[0];
+ ptr->_stdout=&ptr->__sf[1];
+ ptr->_stderr=&ptr->__sf[2];
+ ptr->_scanpoint=0;
+ ptr->_asctime[0]=0;
+ ptr->_next=1;
+ ptr->__sdidinit=0;
+#endif
+
+ MY_task_set_note(starting_task, LIBC_NOTEPAD, (rtems_unsigned32) ptr);
+}
+
+/*
+ * Called for all user TASKS (system tasks are MPCI Receive Server and IDLE)
+ *
+ * NOTE: When using RTEMS fake stat, fstat, and isatty, all output
+ * is line buffered so this setvbuf is not necessary. This
+ * setvbuf insures that we can redirect the output of a test
+ * on the UNIX simulator and it is in the same order as for a
+ * real target.
+ */
+
+#ifdef NEED_SETVBUF
+rtems_extension
+libc_begin_hook(rtems_tcb *current_task)
+{
+ setvbuf( stdout, NULL, _IOLBF, BUFSIZ );
+}
+#endif
+
+rtems_extension
+libc_switch_hook(rtems_tcb *current_task,
+ rtems_tcb *heir_task)
+{
+ rtems_unsigned32 impure_value;
+
+ /* XXX We can't use rtems_task_set_note() here since SYSI task has a
+ * tid of 0, which is treated specially (optimized, actually)
+ * by rtems_task_set_note
+ *
+ * NOTE: The above comment is no longer true and we need to use
+ * the extension data areas added about the same time.
+ */
+
+ /*
+ * Don't touch the outgoing task if it has been deleted.
+ */
+
+ if ( !_States_Is_transient( current_task->current_state ) ) {
+ impure_value = (rtems_unsigned32) _REENT;
+ MY_task_set_note(current_task, LIBC_NOTEPAD, impure_value);
+ }
+
+ _REENT = (struct _reent *) MY_task_get_note(heir_task, LIBC_NOTEPAD);
+
+}
+
+/*
+ * Function: libc_delete_hook
+ * Created: 94/12/10
+ *
+ * Description:
+ * Called when a task is deleted.
+ * Must restore the new lib reentrancy state for the new current
+ * task.
+ *
+ * Parameters:
+ *
+ *
+ * Returns:
+ *
+ *
+ * Side Effects:
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+rtems_extension
+libc_delete_hook(rtems_tcb *current_task,
+ rtems_tcb *deleted_task)
+{
+ struct _reent *ptr;
+
+ /*
+ * The reentrancy structure was allocated by newlib using malloc()
+ */
+
+ if (current_task == deleted_task)
+ {
+ ptr = _REENT;
+ }
+ else
+ {
+ ptr = (struct _reent *) MY_task_get_note(deleted_task, LIBC_NOTEPAD);
+ }
+
+ /* if (ptr) */
+ if (ptr && ptr != &libc_global_reent)
+ {
+ _wrapup_reent(ptr);
+ _reclaim_reent(ptr);
+ free(ptr);
+ }
+
+ MY_task_set_note(deleted_task, LIBC_NOTEPAD, 0);
+
+ /*
+ * Require the switch back to another task to install its own
+ */
+
+ if (current_task == deleted_task)
+ {
+ _REENT = 0;
+ }
+}
+
+/*
+ * Function: libc_init
+ * Created: 94/12/10
+ *
+ * Description:
+ * Init libc for CYGNUS newlib
+ * Set up _REENT to use our global libc_global_reent.
+ * (newlib provides a global of its own, but we prefer our
+ * own name for it)
+ *
+ * If reentrancy is desired (which it should be), then
+ * we install the task extension hooks to maintain the
+ * newlib reentrancy global variable _REENT on task
+ * create, delete, switch, exit, etc.
+ *
+ * Parameters:
+ * reentrant non-zero if reentrant library desired.
+ *
+ * Returns:
+ *
+ * Side Effects:
+ * installs libc extensions if reentrant.
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ */
+
+void
+libc_init(int reentrant)
+{
+ rtems_extensions_table libc_extension;
+ rtems_id extension_id;
+ rtems_status_code rc;
+
+ _REENT = &libc_global_reent;
+
+ if (reentrant)
+ {
+ memset(&libc_extension, 0, sizeof(libc_extension));
+
+ libc_extension.thread_create = libc_create_hook;
+ libc_extension.thread_start = libc_start_hook;
+#ifdef NEED_SETVBUF
+ libc_extension.thread_begin = libc_begin_hook;
+#endif
+ 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);
+ if (rc != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(rc);
+
+ libc_reentrant = reentrant;
+ }
+}
+
+#if 0
+/*
+ * Routines required by the gnat runtime.
+ */
+
+int get_errno()
+{
+ return errno;
+}
+#endif
+
+/*
+ * Function: _exit
+ * Created: 94/12/10
+ *
+ * Description:
+ * Called from exit() after it does atexit() processing and stdio fflush's
+ *
+ * called from bottom of exit() to really delete the task.
+ * If we are using reentrant libc, then let the delete extension
+ * do all the work, otherwise if a shutdown is in progress,
+ * then just do it.
+ *
+ * Parameters:
+ * exit status
+ *
+ * Returns:
+ * does not return
+ *
+ * Side Effects:
+ *
+ * Notes:
+ *
+ *
+ * Deficiencies/ToDo:
+ *
+ *
+ */
+
+#include <stdio.h>
+
+/* #if !defined(RTEMS_UNIX) && !defined(__GO32__) && !defined(_AM29K) */
+#if !defined(RTEMS_UNIX) && !defined(_AM29K)
+void _exit(int status)
+{
+ rtems_shutdown_executive(status);
+}
+
+#else
+
+void exit(int status)
+{
+ libc_wrapup();
+ rtems_shutdown_executive(status);
+}
+#endif
+
+
+/*
+ * These are directly supported (and completely correct) in the posix api.
+ */
+
+#if !defined(RTEMS_POSIX_API)
+pid_t __getpid(void)
+{
+ return 0;
+}
+#endif
+
+/* #if !defined(RTEMS_POSIX_API) || defined(__GO32__) */
+#if !defined(RTEMS_POSIX_API)
+pid_t getpid(void)
+{
+ return __getpid();
+}
+#endif
+
+/* #if !defined(RTEMS_POSIX_API) || defined(__GO32__) */
+#if !defined(RTEMS_POSIX_API)
+int kill( pid_t pid, int sig )
+{
+ return 0;
+}
+#endif
+
+int __kill( pid_t pid, int sig )
+{
+ return 0;
+}
+
+#if !defined(RTEMS_POSIX_API)
+unsigned int sleep(
+ unsigned int seconds
+)
+{
+ rtems_status_code status;
+ rtems_interval ticks_per_second;
+ rtems_interval ticks;
+
+ status = rtems_clock_get(
+ RTEMS_CLOCK_GET_TICKS_PER_SECOND,
+ &ticks_per_second
+ );
+
+ ticks = seconds * ticks_per_second;
+
+ status = rtems_task_wake_after( ticks );
+
+ /*
+ * Returns the "unslept" amount of time. In RTEMS signals are not
+ * interruptable, so tasks really sleep all of the requested time.
+ */
+
+ return 0;
+}
+#endif
+
+
+#endif
diff --git a/cpukit/libcsupport/src/no_libc.c b/cpukit/libcsupport/src/no_libc.c
new file mode 100644
index 0000000000..19c9ac836d
--- /dev/null
+++ b/cpukit/libcsupport/src/no_libc.c
@@ -0,0 +1,55 @@
+
+/* no_libc.h
+ *
+ * This file contains stubs for the reentrancy hooks when
+ * an unknown C library is used.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems.h>
+#if !defined(RTEMS_NEWLIB) && !defined(RTEMS_UNIX)
+
+#include "libcsupport.h"
+#include "internal.h"
+
+#include <stdlib.h> /* for free() */
+
+void
+libc_init(int reentrant)
+{
+}
+
+void libc_suspend_main(void)
+{
+}
+
+
+void libc_global_exit(rtems_unsigned32 code)
+{
+}
+
+void _exit(int status)
+{
+}
+
+#else
+
+/* remove ANSI errors.
+ * A program must contain at least one external-declaration
+ * (X3.159-1989 p.82,L3).
+ */
+void no_libc_dummy_function( void )
+{
+}
+
+#endif
diff --git a/cpukit/libcsupport/src/unixlibc.c b/cpukit/libcsupport/src/unixlibc.c
new file mode 100644
index 0000000000..3e757e313d
--- /dev/null
+++ b/cpukit/libcsupport/src/unixlibc.c
@@ -0,0 +1,23 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#if defined(RTEMS_UNIXLIB)
+
+void libc_init(int reentrant)
+{
+}
+
+#else
+
+/* remove ANSI errors.
+ * A program must contain at least one external-declaration
+ * (X3.159-1989 p.82,L3).
+ */
+void unixlibc_dummy_function( void )
+{
+}
+
+#endif
diff --git a/cpukit/libcsupport/src/utsname.c b/cpukit/libcsupport/src/utsname.c
new file mode 100644
index 0000000000..7fba3d610f
--- /dev/null
+++ b/cpukit/libcsupport/src/utsname.c
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <sys/utsname.h>
+
+#include <rtems/system.h>
+#include <rtems/score/system.h>
+#include <rtems/score/object.h>
+
+/*PAGE
+ *
+ * 4.4.1 Get System Name, P1003.1b-1993, p. 90
+ */
+
+int uname(
+ struct utsname *name
+)
+{
+ /* XXX: Here is what Solaris returns...
+ sysname = SunOS
+ nodename = node_name
+ release = 5.3
+ version = Generic_101318-12
+ machine = sun4m
+ */
+
+ strcpy( name->sysname, "RTEMS" );
+
+ sprintf( name->nodename, "Node %d\n", _Objects_Local_node );
+
+ /* XXX release string is in BAD format for this routine!!! */
+ strcpy( name->release, "3.2.0" );
+
+ /* XXX does this have any meaning for RTEMS */
+
+ strcpy( name->release, "" );
+
+ sprintf( name->machine, "%s/%s", CPU_NAME, CPU_MODEL_NAME );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.5.2 Get Process Times, P1003.1b-1993, p. 92
+ */
+
+clock_t times(
+ struct tms *buffer
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/cpukit/libmisc/README b/cpukit/libmisc/README
new file mode 100644
index 0000000000..6825898121
--- /dev/null
+++ b/cpukit/libmisc/README
@@ -0,0 +1,16 @@
+#
+# $Id$
+#
+
+This directory contains for the "miscellaneous" library. Currently
+the only item in this library is a user extension set which checks
+for a task "blowing" it's stack.
+
+The following ideas have been mentioned for items which could go
+in this library, but this list is not all inclusive:
+
+ + Workspace Consistency Checker
+ + Task Execution Time Monitor
+
+The intent of this library is to provide a home for useful utility routines
+which are dependent upon RTEMS.
diff --git a/cpukit/libmisc/cpuuse/README b/cpukit/libmisc/cpuuse/README
new file mode 100644
index 0000000000..e8a30006a1
--- /dev/null
+++ b/cpukit/libmisc/cpuuse/README
@@ -0,0 +1,41 @@
+#
+# README,v 1.3 1995/12/19 20:13:47 joel Exp
+#
+
+This directory contains a stack bounds checker. It provides two
+primary features:
+
+ + check for stack overflow at each context switch
+ + provides an educated guess at each task's stack usage
+
+The stack overflow check at context switch works by looking for
+a 16 byte pattern at the logical end of the stack to be corrupted.
+The "guesser" assumes that the entire stack was prefilled with a known
+pattern and assumes that the pattern is still in place if the memory
+has not been used as a stack.
+
+Both of these can be fooled by pushing large holes onto the stack
+and not writing to them... or (much more unlikely) writing the
+magic patterns into memory.
+
+This code has not been extensively tested. It is provided as a tool
+for RTEMS users to catch the most common mistake in multitasking
+systems ... too little stack space. Suggestions and comments are appreciated.
+
+NOTES:
+
+1. Stack usage information is questionable on CPUs which push
+ large holes on stack.
+
+2. The stack checker has a tendency to generate a fault when
+ trying to print the helpful diagnostic message. If it comes
+ out, congratulations. If not, then the variable Stack_check_Blown_task
+ contains a pointer to the TCB of the offending task. This
+ is usually enough to go on.
+
+FUTURE:
+
+1. Determine how/if gcc will generate stack probe calls and support that.
+
+2. Get accurate stack usage numbers on i960.. it pushes very large
+ holes on the stack.
diff --git a/cpukit/libmisc/cpuuse/cpuuse.c b/cpukit/libmisc/cpuuse/cpuuse.c
new file mode 100644
index 0000000000..475765b4db
--- /dev/null
+++ b/cpukit/libmisc/cpuuse/cpuuse.c
@@ -0,0 +1,142 @@
+/*
+ * CPU Usage Reporter
+ *
+ * COPYRIGHT (c) 1989-1997. 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * check.c,v 1.13 1996/04/22 16:51:52 joel Exp
+ *
+ */
+
+#include <rtems.h>
+
+extern rtems_configuration_table BSP_Configuration;
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "cpuuse.h"
+
+unsigned32 CPU_usage_Ticks_at_last_reset;
+
+/*PAGE
+ *
+ * CPU_usage_Dump
+ */
+
+void CPU_usage_Dump( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+ unsigned32 u32_name;
+ char name[5];
+ unsigned32 total_units = 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 ];
+
+ if ( the_thread )
+ total_units += the_thread->ticks_executed;
+ }
+ }
+ }
+
+ printf("CPU Usage by thread\n");
+#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
+ printf( " ID NAME TICKS PERCENT\n" );
+#else
+ printf( " ID NAME TICKS\n" );
+#endif
+
+ 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 ];
+
+ if ( !the_thread )
+ continue;
+
+ u32_name = *(unsigned32 *)the_thread->Object.name;
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
+ printf( "0x%08x %4s %8d %5.3f\n",
+ the_thread->Object.id,
+ name,
+ the_thread->ticks_executed,
+ (total_units) ?
+ (double)the_thread->ticks_executed / (double)total_units :
+ (double)total_units
+ );
+#else
+ printf( "0x%08x %4s %8d\n",
+ the_thread->Object.id,
+ name,
+ the_thread->ticks_executed
+ );
+#endif
+ }
+ }
+ }
+
+ printf(
+ "\nTicks since last reset = %d\n",
+ _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset
+ );
+ printf( "\nTotal Units = %d\n", total_units );
+}
+
+/*PAGE
+ *
+ * CPU_usage_Reset
+ */
+
+void CPU_usage_Reset( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+
+ CPU_usage_Ticks_at_last_reset = _Watchdog_Ticks_since_boot;
+
+ 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 ];
+
+ if ( !the_thread )
+ continue;
+
+ the_thread->ticks_executed = 0;
+ }
+ }
+ }
+
+}
+
diff --git a/cpukit/libmisc/cpuuse/cpuuse.h b/cpukit/libmisc/cpuuse/cpuuse.h
new file mode 100644
index 0000000000..db5a258e7e
--- /dev/null
+++ b/cpukit/libmisc/cpuuse/cpuuse.h
@@ -0,0 +1,41 @@
+/* cpuuse.h
+ *
+ * This include file contains information necessary to utilize
+ * and install the cpu usage reporting mechanism.
+ *
+ * COPYRIGHT (c) 1989-1997. 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * stackchk.h,v 1.3 1995/12/19 20:13:52 joel Exp
+ */
+
+#ifndef __CPU_USE_h
+#define __CPU_USE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * CPU_usage_Dump
+ */
+
+void CPU_usage_Dump( void );
+
+/*
+ * CPU_usage_Reset
+ */
+
+void CPU_usage_Reset( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/libmisc/monitor/README b/cpukit/libmisc/monitor/README
new file mode 100644
index 0000000000..d5a73da140
--- /dev/null
+++ b/cpukit/libmisc/monitor/README
@@ -0,0 +1,97 @@
+#
+# $Id$
+#
+
+monitor task
+
+The monitor task is an optional task that knows about RTEMS
+data structures and can print out information about them.
+It is a work-in-progress and needs many more commands, but
+is useful now.
+
+The monitor works best when it is the highest priority task,
+so all your other tasks should ideally be at some priority
+greater than 1.
+
+To use the monitor:
+-------------------
+
+ #include <rtems/monitor.h>
+
+ ...
+
+ rtems_monitor_init(0);
+
+ The parameter to rtems_monitor_init() tells the monitor whether
+ to suspend itself on startup. A value of 0 causes the monitor
+ to immediately enter command mode; a non-zero value causes the
+ monitor to suspend itself after creation and wait for explicit
+ wakeup.
+
+
+ rtems_monitor_wakeup();
+
+ wakes up a suspended monitor and causes it to reenter command mode.
+
+Monitor commands
+----------------
+
+ The monitor prompt is 'rtems> '.
+ Can abbreviate commands to "uniquity"
+ There is a 'help' command. Here is the output from various
+ help commands:
+
+ Commands (may be abbreviated)
+
+ help -- get this message or command specific help
+ task -- show task information
+ queue -- show message queue information
+ symbol -- show entries from symbol table
+ pause -- pause monitor for a specified number of ticks
+ fatal -- invoke a fatal RTEMS error
+
+ task [id [id ...] ]
+ display information about the specified tasks.
+ Default is to display information about all tasks on this node
+
+ queue [id [id ... ] ]
+ display information about the specified message queues
+ Default is to display information about all queues on this node
+
+ symbol [ symbolname [symbolname ... ] ]
+ display value associated with specified symbol.
+ Defaults to displaying all known symbols.
+
+ pause [ticks]
+ monitor goes to "sleep" for specified ticks (default is 1)
+ monitor will resume at end of period or if explicitly awakened
+
+ fatal [status]
+ Invoke 'rtems_fatal_error_occurred' with 'status'
+ (default is RTEMS_INTERNAL_ERROR)
+
+ continue
+ put the monitor to sleep waiting for an explicit wakeup from the
+ program running.
+
+
+Sample output from 'task' command
+---------------------------------
+
+ rtems> task
+ ID NAME PRIO STAT MODES EVENTS WAITID WAITARG NOTES
+ ------------------------------------------------------------------------
+ 00010001 UI1 2 READY P:T:nA NONE15: 0x40606348
+ 00010002 RMON 1 READY nP NONE15: 0x40604110
+
+ 'RMON' is the monitor itself, so we have 1 "user" task.
+ Its modes are P:T:nA which translate to:
+
+ preemptable
+ timesliced
+ no ASRS
+
+ It has no events.
+ It has a notepad value for notepad 15 which is 0x40606348
+ (this is the libc thread state)
+
diff --git a/cpukit/libmisc/monitor/mon-command.c b/cpukit/libmisc/monitor/mon-command.c
new file mode 100644
index 0000000000..87d31dfa2a
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-command.c
@@ -0,0 +1,187 @@
+/*
+ * Command parsing routines for RTEMS monitor
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * make_argv(cp): token-count
+ * Break up the command line in 'cp' into global argv[] and argc (return
+ * value).
+ */
+
+int
+rtems_monitor_make_argv(
+ char *cp,
+ int *argc_p,
+ char **argv)
+{
+ int argc = 0;
+
+ while ((cp = strtok(cp, " \t\n\r")))
+ {
+ argv[argc++] = cp;
+ cp = (char *) NULL;
+ }
+ argv[argc] = (char *) NULL; /* end of argv */
+
+ return *argc_p = argc;
+}
+
+
+/*
+ * Read and break up a monitor command
+ *
+ * We have to loop on the gets call, since it will return NULL under UNIX
+ * RTEMS when we get a signal (eg: SIGALRM).
+ */
+
+int
+rtems_monitor_command_read(char *command,
+ int *argc,
+ char **argv)
+{
+ extern rtems_configuration_table BSP_Configuration;
+ static char monitor_prompt[32];
+
+ /*
+ * put node number in the prompt if we are multiprocessing
+ */
+
+ if (BSP_Configuration.User_multiprocessing_table == 0)
+ sprintf(monitor_prompt, "%s", MONITOR_PROMPT);
+ else if (rtems_monitor_default_node != rtems_monitor_node)
+ sprintf(monitor_prompt, "%d-%s-%d", rtems_monitor_node, MONITOR_PROMPT, rtems_monitor_default_node);
+ else
+ sprintf(monitor_prompt, "%d-%s", rtems_monitor_node, MONITOR_PROMPT);
+
+#ifdef RTEMS_UNIX
+ /* RTEMS on unix gets so many interrupt system calls this is hosed */
+ printf("%s> ", monitor_prompt);
+ fflush(stdout);
+ while (gets(command) == (char *) 0)
+ ;
+#else
+ do
+ {
+ printf("%s> ", monitor_prompt);
+ fflush(stdout);
+ } while (gets(command) == (char *) 0);
+#endif
+
+ return rtems_monitor_make_argv(command, argc, argv);
+}
+
+/*
+ * Look up a command in a command table
+ *
+ */
+
+rtems_monitor_command_entry_t *
+rtems_monitor_command_lookup(
+ rtems_monitor_command_entry_t *table,
+ int argc,
+ char **argv
+)
+{
+ rtems_monitor_command_entry_t *p;
+ rtems_monitor_command_entry_t *abbreviated_match = 0;
+ int abbreviated_matches = 0;
+ char *command;
+ int command_length;
+
+ command = argv[0];
+
+ if ((table == 0) || (command == 0))
+ goto failed;
+
+ command_length = strlen(command);
+
+ for (p = table; p->command; p++)
+ if (STREQ(command, p->command)) /* exact match */
+ goto done;
+ else if (STRNEQ(command, p->command, command_length))
+ {
+ abbreviated_matches++;
+ abbreviated_match = p;
+ }
+
+ /* no perfect match; is there a non-ambigous abbreviated match? */
+ if ( ! abbreviated_match)
+ {
+ printf("Unrecognized command '%s'; try 'help'\n", command);
+ goto failed;
+ }
+
+ if (abbreviated_matches > 1)
+ {
+ printf("Command '%s' is ambiguous; try 'help'\n", command);
+ goto failed;
+ }
+
+ p = abbreviated_match;
+
+done:
+ if (p->command_function == 0)
+ goto failed;
+ return p;
+
+failed:
+ return 0;
+}
+
+void
+rtems_monitor_command_usage(rtems_monitor_command_entry_t *table,
+ char *command_string)
+{
+ rtems_monitor_command_entry_t *help = 0;
+ char *help_command_argv[2];
+
+ /* if first entry in table is a usage, then print it out */
+ if (command_string == 0)
+ {
+ if (STREQ(table->command, "--usage--") && table->usage)
+ help = table;
+ }
+ else
+ {
+ help_command_argv[0] = command_string;
+ help_command_argv[1] = 0;
+ help = rtems_monitor_command_lookup(table, 1, help_command_argv);
+ }
+
+ if (help)
+ printf("%s\n", help->usage);
+}
+
+
+void
+rtems_monitor_help_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_monitor_command_entry_t *command;
+
+ command = (rtems_monitor_command_entry_t *) command_arg;
+
+ if (argc == 1)
+ rtems_monitor_command_usage(command, 0);
+ else
+ {
+ for (arg=1; argv[arg]; arg++)
+ rtems_monitor_command_usage(command, argv[arg]);
+ }
+}
diff --git a/cpukit/libmisc/monitor/mon-config.c b/cpukit/libmisc/monitor/mon-config.c
new file mode 100644
index 0000000000..d7593dc912
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-config.c
@@ -0,0 +1,131 @@
+/*
+ * RTEMS Config display support
+ *
+ * TODO
+ *
+ * $Id$
+ */
+
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+/*
+ * Fill in entire monitor config table
+ * for sending to a remote monitor or printing on the local system
+ */
+
+void
+rtems_monitor_config_canonical(
+ rtems_monitor_config_t *canonical_config,
+ void *config_void
+)
+{
+ rtems_configuration_table *c = (rtems_configuration_table *) config_void;
+ rtems_api_configuration_table *r = c->RTEMS_api_configuration;
+
+ canonical_config->work_space_start = c->work_space_start;
+ canonical_config->work_space_size = c->work_space_size;
+ canonical_config->maximum_tasks = r->maximum_tasks;
+ canonical_config->maximum_timers = r->maximum_timers;
+ canonical_config->maximum_semaphores = r->maximum_semaphores;
+ canonical_config->maximum_message_queues = r->maximum_message_queues;
+ canonical_config->maximum_partitions = r->maximum_partitions;
+ canonical_config->maximum_regions = r->maximum_regions;
+ canonical_config->maximum_ports = r->maximum_ports;
+ canonical_config->maximum_periods = r->maximum_periods;
+ canonical_config->maximum_extensions = c->maximum_extensions;
+ canonical_config->microseconds_per_tick = c->microseconds_per_tick;
+ canonical_config->ticks_per_timeslice = c->ticks_per_timeslice;
+ canonical_config->number_of_initialization_tasks = r->number_of_initialization_tasks;
+}
+
+/*
+ * This is easy, since there is only 1 (altho we could get them from
+ * other nodes...)
+ */
+
+void *
+rtems_monitor_config_next(
+ void *object_info,
+ rtems_monitor_config_t *canonical_config,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= 1)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) c;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_config_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+INITIAL (startup) Configuration Info\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+
+void
+rtems_monitor_config_dump(
+ rtems_monitor_config_t *monitor_config,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length = 0;
+ length += printf("WORKSPACE");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("start: 0x%x; size: 0x%x\n",
+ (unsigned32) monitor_config->work_space_start,
+ monitor_config->work_space_size);
+
+ length = 0;
+ length += printf("TIME");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("usec/tick: %d; tick/timeslice: %d; tick/sec: %d\n",
+ monitor_config->microseconds_per_tick,
+ monitor_config->ticks_per_timeslice,
+ 1000000 / monitor_config->microseconds_per_tick);
+
+ length = 0;
+ length += printf("MAXIMUMS");
+ length += rtems_monitor_pad(DATACOL, length);
+ length += printf("tasks: %d; timers: %d; sems: %d; que's: %d; ext's: %d\n",
+ monitor_config->maximum_tasks,
+ monitor_config->maximum_timers,
+ monitor_config->maximum_semaphores,
+ monitor_config->maximum_message_queues,
+ monitor_config->maximum_extensions);
+ length = 0;
+ length += rtems_monitor_pad(CONTCOL, length);
+ length += printf("partitions: %d; regions: %d; ports: %d; periods: %d\n",
+ monitor_config->maximum_partitions,
+ monitor_config->maximum_regions,
+ monitor_config->maximum_ports,
+ monitor_config->maximum_periods);
+}
diff --git a/cpukit/libmisc/monitor/mon-dname.c b/cpukit/libmisc/monitor/mon-dname.c
new file mode 100644
index 0000000000..e6993e18f7
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-dname.c
@@ -0,0 +1,112 @@
+/*
+ * RTEMS monitor driver names support.
+ *
+ * There are 2 "driver" things the monitor knows about.
+ *
+ * 1. Regular RTEMS drivers.
+ * This is a table indexed by major device number and
+ * containing driver entry points only.
+ *
+ * 2. Driver name table.
+ * A separate table of names for drivers.
+ * The table converts driver names to a major number
+ * as index into the driver table and a minor number
+ * for an argument to driver.
+ *
+ * Drivers are displayed with 'driver' command.
+ * Names are displayed with 'dname' command.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+#include <string.h> /* strncpy() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+void
+rtems_monitor_dname_canonical(
+ rtems_monitor_dname_t *canonical_dname,
+ void *dname_void
+)
+{
+ rtems_driver_name_t *np = (rtems_driver_name_t *) dname_void;
+
+ (void) strncpy(canonical_dname->name_string, np->device_name, sizeof(canonical_dname->name_string));
+ canonical_dname->major = np->major;
+ canonical_dname->minor = np->minor;
+}
+
+void *
+rtems_monitor_dname_next(
+ void *object_information,
+ rtems_monitor_dname_t *canonical_dname,
+ rtems_id *next_id
+)
+{
+ int n = rtems_get_index(*next_id);
+ rtems_driver_name_t *table = _IO_Driver_name_table;
+ rtems_driver_name_t *np = 0;
+
+/* 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;
+
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+
+done:
+ _Thread_Disable_dispatch();
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_dname->id = n;
+ canonical_dname->name = rtems_build_name('-', '-', '-', '-');
+
+ *next_id += 1;
+ return np;
+}
+
+void
+rtems_monitor_dname_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ Major:Minor Name\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+void
+rtems_monitor_dname_dump(
+ rtems_monitor_dname_t *monitor_dname,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_pad(6, length);
+ length += rtems_monitor_dump_hex(monitor_dname->major);
+ length += printf(":");
+ length += rtems_monitor_dump_hex(monitor_dname->minor);
+
+ length += rtems_monitor_pad(16, length);
+ length += printf("%.*s",
+ (int) sizeof(monitor_dname->name_string),
+ (char *) monitor_dname->name_string);
+
+ length += printf("\n");
+ length = 0;
+}
diff --git a/cpukit/libmisc/monitor/mon-driver.c b/cpukit/libmisc/monitor/mon-driver.c
new file mode 100644
index 0000000000..065172534c
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-driver.c
@@ -0,0 +1,136 @@
+/*
+ * RTEMS monitor IO (device drivers) support
+ *
+ * There are 2 "driver" things the monitor knows about.
+ *
+ * 1. Regular RTEMS drivers.
+ * This is a table indexed by major device number and
+ * containing driver entry points only.
+ *
+ * 2. Driver name table.
+ * A separate table of names for drivers.
+ * The table converts driver names to a major number
+ * as index into the driver table and a minor number
+ * for an argument to driver.
+ *
+ * Drivers are displayed with 'driver' command.
+ * Names are displayed with 'name' command.
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+#define CONTCOL DATACOL /* continued col */
+
+
+void
+rtems_monitor_driver_canonical(
+ rtems_monitor_driver_t *canonical_driver,
+ void *driver_void
+)
+{
+ rtems_driver_address_table *d = (rtems_driver_address_table *) driver_void;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->initialization,
+ (void *) d->initialization);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->open,
+ (void *) d->open);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->close,
+ (void *) d->close);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->read,
+ (void *) d->read);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->write,
+ (void *) d->write);
+ rtems_monitor_symbol_canonical_by_value(&canonical_driver->control,
+ (void *) d->control);
+}
+
+
+void *
+rtems_monitor_driver_next(
+ void *object_info,
+ rtems_monitor_driver_t *canonical_driver,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= c->number_of_device_drivers)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_driver->id = n;
+ canonical_driver->name = rtems_build_name('-', '-', '-', '-');
+
+ *next_id += 1;
+ return (void *) (c->Device_driver_table + n);
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_driver_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ Major Entry points\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+void
+rtems_monitor_driver_dump(
+ rtems_monitor_driver_t *monitor_driver,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += printf(" %d", monitor_driver->id);
+
+ length += rtems_monitor_pad(13, length);
+ length += printf("init: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->initialization, verbose);
+ length += printf("; control: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->control, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(13, length);
+
+ length += printf("open: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->open, verbose);
+ length += printf("; close: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->close, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(13, length);
+
+ length += printf("read: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->read, verbose);
+ length += printf("; write: ");
+ length += rtems_monitor_symbol_dump(&monitor_driver->write, verbose);
+ length += printf("\n");
+ length = 0;
+}
diff --git a/cpukit/libmisc/monitor/mon-extension.c b/cpukit/libmisc/monitor/mon-extension.c
new file mode 100644
index 0000000000..18f6cf2d47
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-extension.c
@@ -0,0 +1,98 @@
+/*
+ * RTEMS Monitor extension support
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+void
+rtems_monitor_extension_canonical(
+ rtems_monitor_extension_t *canonical_extension,
+ void *extension_void
+)
+{
+ Extension_Control *rtems_extension = (Extension_Control *) extension_void;
+ rtems_extensions_table *e = &rtems_extension->Extension.Callouts;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_create,
+ (void *) e->thread_create);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_start,
+ (void *) e->thread_start);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_restart,
+ (void *) e->thread_restart);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_delete,
+ (void *) e->thread_delete);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_tswitch,
+ (void *) e->thread_switch);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_begin,
+ (void *) e->thread_begin);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_exitted,
+ (void *) e->thread_exitted);
+ rtems_monitor_symbol_canonical_by_value(&canonical_extension->e_fatal,
+ (void *) e->fatal);
+}
+
+void
+rtems_monitor_extension_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+
+/*
+ * Dump out the canonical form
+ */
+
+void
+rtems_monitor_extension_dump(
+ rtems_monitor_extension_t *monitor_extension,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_dump_id(monitor_extension->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_extension->name);
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("create: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_create, verbose);
+ length += printf("; start: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_start, verbose);
+ length += printf("; restart: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_restart, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("delete: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_delete, verbose);
+ length += printf("; switch: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_tswitch, verbose);
+ length += printf("; begin: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_begin, verbose);
+ length += printf("\n");
+ length = 0;
+
+ length += rtems_monitor_pad(18, length);
+ length += printf("exitted: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_exitted, verbose);
+ length += printf("; fatal: ");
+ length += rtems_monitor_symbol_dump(&monitor_extension->e_fatal, verbose);
+ length += printf("\n");
+ length = 0;
+ printf("\n");
+}
diff --git a/cpukit/libmisc/monitor/mon-itask.c b/cpukit/libmisc/monitor/mon-itask.c
new file mode 100644
index 0000000000..0f7c2740ce
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-itask.c
@@ -0,0 +1,115 @@
+/*
+ * RTEMS Monitor init task support
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+/*
+ * As above, but just for init tasks
+ */
+void
+rtems_monitor_init_task_canonical(
+ rtems_monitor_init_task_t *canonical_itask,
+ void *itask_void
+)
+{
+ rtems_initialization_tasks_table *rtems_itask = itask_void;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_itask->entry,
+ (void *) rtems_itask->entry_point);
+
+ canonical_itask->argument = rtems_itask->argument;
+ canonical_itask->stack_size = rtems_itask->stack_size;
+ canonical_itask->priority = rtems_itask->initial_priority;
+ canonical_itask->modes = rtems_itask->mode_set;
+ canonical_itask->attributes = rtems_itask->attribute_set;
+}
+
+void *
+rtems_monitor_init_task_next(
+ void *object_info,
+ rtems_monitor_init_task_t *canonical_init_task,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ rtems_initialization_tasks_table *itask;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= c->RTEMS_api_configuration->number_of_initialization_tasks)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ itask = c->RTEMS_api_configuration->User_initialization_tasks_table + n;
+
+ /*
+ * dummy up a fake id and name for this item
+ */
+
+ canonical_init_task->id = n;
+ canonical_init_task->name = itask->name;
+
+ *next_id += 1;
+ return (void *) itask;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_init_task_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ # NAME ENTRY ARGUMENT PRIO MODES ATTRIBUTES STACK SIZE\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+/*
+ */
+
+void
+rtems_monitor_init_task_dump(
+ rtems_monitor_init_task_t *monitor_itask,
+ boolean verbose
+)
+{
+ int length = 0;
+
+ length += rtems_monitor_dump_decimal(monitor_itask->id);
+
+ length += rtems_monitor_pad(7, length);
+ length += rtems_monitor_dump_name(monitor_itask->name);
+
+ length += rtems_monitor_pad(14, length);
+ length += rtems_monitor_symbol_dump(&monitor_itask->entry, verbose);
+
+ length += rtems_monitor_pad(25, length);
+ length += printf("%d [0x%x]", monitor_itask->argument, monitor_itask->argument);
+
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_priority(monitor_itask->priority);
+
+ length += rtems_monitor_pad(46, length);
+ length += rtems_monitor_dump_modes(monitor_itask->modes);
+
+ length += rtems_monitor_pad(54, length);
+ length += rtems_monitor_dump_attributes(monitor_itask->attributes);
+
+ length += rtems_monitor_pad(66, length);
+ length += printf("%d [0x%x]", monitor_itask->stack_size, monitor_itask->stack_size);
+
+ printf("\n");
+}
diff --git a/cpukit/libmisc/monitor/mon-manager.c b/cpukit/libmisc/monitor/mon-manager.c
new file mode 100644
index 0000000000..523fa6aded
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-manager.c
@@ -0,0 +1,50 @@
+/*
+ * RTEMS Monitor "manager" support.
+ * Used to traverse object (chain) lists and print them out.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+#include <monitor.h>
+
+/*
+ * "next" routine for all objects that are RTEMS manager objects
+ */
+
+void *
+rtems_monitor_manager_next(
+ void *table_void,
+ void *canonical,
+ rtems_id *next_id
+)
+{
+ Objects_Information *table = table_void;
+ rtems_monitor_generic_t *copy;
+ Objects_Control *object = 0;
+ Objects_Locations location;
+
+ /*
+ * When we are called, it must be local
+ */
+
+ if ( ! _Objects_Is_local_id(*next_id))
+ goto done;
+
+ object = _Objects_Get_next(table, *next_id, &location, next_id);
+
+ if (object)
+ {
+ copy = (rtems_monitor_generic_t *) canonical;
+ copy->id = object->id;
+ _Objects_Copy_name_raw(object->name, &copy->name, sizeof(copy->name));
+ }
+
+done:
+ return object;
+}
+
diff --git a/cpukit/libmisc/monitor/mon-monitor.c b/cpukit/libmisc/monitor/mon-monitor.c
new file mode 100644
index 0000000000..0025266e03
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-monitor.c
@@ -0,0 +1,518 @@
+/*
+ * RTEMS monitor main body
+ *
+ * TODO:
+ * add stuff to RTEMS api
+ * rtems_get_name(id)
+ * rtems_get_type(id)
+ * rtems_build_id(node, type, num)
+ * Add a command to dump out info about an arbitrary id when
+ * types are added to id's
+ * rtems> id idnum
+ * idnum: node n, object: whatever, id: whatever
+ * allow id's to be specified as n:t:id, where 'n:t' is optional
+ * should have a separate monitor FILE stream (ala the debugger)
+ * remote request/response stuff should be cleaned up
+ * maybe we can use real rpc??
+ * 'info' command to print out:
+ * interrupt stack location, direction and size
+ * floating point config stuff
+ * interrupt config stuff
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "monitor.h"
+
+/* set by trap handler */
+extern rtems_tcb *debugger_interrupted_task;
+extern rtems_context *debugger_interrupted_task_context;
+extern rtems_unsigned32 debugger_trap;
+
+/*
+ * Various id's for the monitor
+ * They need to be public variables for access by other agencies
+ * such as debugger and remote servers'
+ */
+
+rtems_id rtems_monitor_task_id;
+
+unsigned32 rtems_monitor_node; /* our node number */
+unsigned32 rtems_monitor_default_node; /* current default for commands */
+
+/*
+ * The rtems symbol table
+ */
+
+rtems_symbol_table_t *rtems_monitor_symbols;
+
+/*
+ * The top-level commands
+ */
+
+rtems_monitor_command_entry_t rtems_monitor_commands[] = {
+ { "--usage--",
+ "\n"
+ "RTEMS monitor\n"
+ "\n"
+ "Commands (may be abbreviated)\n"
+ "\n"
+ " help -- get this message or command specific help\n"
+ " pause -- pause monitor for a specified number of ticks\n"
+ " exit -- invoke a fatal RTEMS error\n"
+ " symbol -- show entries from symbol table\n"
+ " continue -- put monitor to sleep waiting for explicit wakeup\n"
+ " config -- show system configuration\n"
+ " itask -- list init tasks\n"
+ " mpci -- list mpci config\n"
+ " task -- show task information\n"
+ " queue -- show message queue information\n"
+ " extension -- user extensions\n"
+ " driver -- show information about named drivers\n"
+ " dname -- show information about named drivers\n"
+ " object -- generic object information\n"
+ " node -- specify default node for commands that take id's\n"
+#ifdef CPU_INVOKE_DEBUGGER
+ " debugger -- invoke system debugger\n"
+#endif
+ ,
+ 0,
+ 0,
+ (unsigned32) rtems_monitor_commands,
+ },
+ { "config",
+ "config\n"
+ " Show the system configuration.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_CONFIG,
+ },
+ { "itask",
+ "itask\n"
+ " List init tasks for the system\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_INIT_TASK,
+ },
+ { "mpci",
+ "mpci\n"
+ " Show the MPCI system configuration, if configured.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_MPCI,
+ },
+ { "pause",
+ "pause [ticks]\n"
+ " monitor goes to \"sleep\" for specified ticks (default is 1)\n"
+ " monitor will resume at end of period or if explicitly awakened\n",
+ 0,
+ rtems_monitor_pause_cmd,
+ 0,
+ },
+ { "continue",
+ "continue\n"
+ " put the monitor to sleep waiting for an explicit wakeup from the\n"
+ " program running.\n",
+ 0,
+ rtems_monitor_continue_cmd,
+ 0,
+ },
+ { "go",
+ "go\n"
+ " Alias for 'continue'\n",
+ 0,
+ rtems_monitor_continue_cmd,
+ 0,
+ },
+ { "node",
+ "node [ node number ]\n"
+ " Specify default node number for commands that take id's\n",
+ 0,
+ rtems_monitor_node_cmd,
+ 0,
+ },
+ { "symbol",
+ "symbol [ symbolname [symbolname ... ] ]\n"
+ " display value associated with specified symbol.\n"
+ " Defaults to displaying all known symbols.\n",
+ 0,
+ rtems_monitor_symbol_cmd,
+ (unsigned32) &rtems_monitor_symbols,
+ },
+ { "extension",
+ "extension [id [id ...] ]\n"
+ " display information about specified extensions.\n"
+ " Default is to display information about all extensions on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_EXTENSION,
+ },
+ { "task",
+ "task [id [id ...] ]\n"
+ " display information about the specified tasks.\n"
+ " Default is to display information about all tasks on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_TASK,
+ },
+ { "queue",
+ "queue [id [id ... ] ]\n"
+ " display information about the specified message queues\n"
+ " Default is to display information about all queues on this node\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_QUEUE,
+ },
+ { "object",
+ "object [id [id ...] ]\n"
+ " display information about specified RTEMS objects.\n"
+ " Object id's must include 'type' information.\n"
+ " (which may normally be defaulted)\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_INVALID,
+ },
+ { "driver",
+ "driver [ major [ major ... ] ]\n"
+ " Display the RTEMS device driver table.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_DRIVER,
+ },
+ { "dname",
+ "dname\n"
+ " Displays information about named drivers.\n",
+ 0,
+ rtems_monitor_object_cmd,
+ RTEMS_MONITOR_OBJECT_DNAME,
+ },
+ { "exit",
+ "exit [status]\n"
+ " Invoke 'rtems_fatal_error_occurred' with 'status'\n"
+ " (default is RTEMS_SUCCESSFUL)\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_SUCCESSFUL,
+ },
+ { "fatal",
+ "fatal [status]\n"
+ " 'exit' with fatal error; default error is RTEMS_TASK_EXITTED\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_TASK_EXITTED, /* exit value */
+ },
+ { "quit",
+ "quit [status]\n"
+ " Alias for 'exit'\n",
+ 0,
+ rtems_monitor_fatal_cmd,
+ RTEMS_SUCCESSFUL, /* exit value */
+ },
+ { "help",
+ "help [ command [ command ] ]\n"
+ " provide information about commands\n"
+ " Default is show basic command summary.\n",
+ 0,
+ rtems_monitor_help_cmd,
+ (unsigned32) rtems_monitor_commands,
+ },
+#ifdef CPU_INVOKE_DEBUGGER
+ { "debugger",
+ "debugger\n"
+ " Enter the debugger, if possible.\n"
+ " A continue from the debugger will return to the monitor.\n",
+ 0,
+ rtems_monitor_debugger_cmd,
+ 0,
+ },
+#endif
+ { 0, 0, 0, 0, 0 },
+};
+
+
+rtems_status_code
+rtems_monitor_suspend(rtems_interval timeout)
+{
+ rtems_event_set event_set;
+ rtems_status_code status;
+
+ status = rtems_event_receive(MONITOR_WAKEUP_EVENT,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout,
+ &event_set);
+ return status;
+}
+
+void
+rtems_monitor_wakeup(void)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send(rtems_monitor_task_id, MONITOR_WAKEUP_EVENT);
+}
+
+void
+rtems_monitor_debugger_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+#ifdef CPU_INVOKE_DEBUGGER
+ CPU_INVOKE_DEBUGGER;
+#endif
+}
+
+void
+rtems_monitor_pause_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ if (argc == 1)
+ rtems_monitor_suspend(1);
+ else
+ rtems_monitor_suspend(strtoul(argv[1], 0, 0));
+}
+
+void
+rtems_monitor_fatal_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ if (argc == 1)
+ rtems_fatal_error_occurred(command_arg);
+ else
+ rtems_fatal_error_occurred(strtoul(argv[1], 0, 0));
+}
+
+void
+rtems_monitor_continue_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ rtems_monitor_suspend(RTEMS_NO_TIMEOUT);
+}
+
+void
+rtems_monitor_node_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ unsigned32 new_node = rtems_monitor_default_node;
+
+ switch (argc)
+ {
+ case 1: /* no node, just set back to ours */
+ new_node = rtems_monitor_node;
+ break;
+
+ case 2:
+ new_node = strtoul(argv[1], 0, 0);
+ break;
+
+ default:
+ printf("invalid syntax, try 'help node'\n");
+ break;
+ }
+
+ if ((new_node >= 1) &&
+ _Configuration_MP_table &&
+ (new_node <= _Configuration_MP_table->maximum_nodes))
+ rtems_monitor_default_node = new_node;
+}
+
+
+/*
+ * Function: rtems_monitor_symbols_loadup
+ *
+ * Description:
+ * Create and load the monitor's symbol table.
+ * We are reading the output format of 'gnm' which looks like this:
+ *
+ * 400a7068 ? _Rate_monotonic_Information
+ * 400a708c ? _Thread_Dispatch_disable_level
+ * 400a7090 ? _Configuration_Table
+ *
+ * We ignore the type field.
+ *
+ * Side Effects:
+ * Creates and fills in 'rtems_monitor_symbols' table
+ *
+ * TODO
+ * there should be a BSP #define or something like that
+ * to do this; Assuming stdio is crazy.
+ * Someday this should know BFD
+ * Maybe we could get objcopy to just copy the symbol areas
+ * and copy that down.
+ *
+ */
+
+void
+rtems_monitor_symbols_loadup(void)
+{
+ FILE *fp;
+ char buffer[128];
+
+ if (rtems_monitor_symbols)
+ rtems_symbol_table_destroy(rtems_monitor_symbols);
+
+ rtems_monitor_symbols = rtems_symbol_table_create(10);
+ if (rtems_monitor_symbols == 0)
+ return;
+
+ fp = fopen("symbols", "r");
+
+ if (fp == 0)
+ return;
+
+ while (fgets(buffer, sizeof(buffer) - 1, fp))
+ {
+ char *symbol;
+ char *value;
+ char *ignored_type;
+
+ value = strtok(buffer, " \t\n");
+ ignored_type = strtok(0, " \t\n");
+ symbol = strtok(0, " \t\n");
+
+ if (symbol && ignored_type && value)
+ {
+ rtems_symbol_t *sp;
+ sp = rtems_symbol_create(rtems_monitor_symbols,
+ symbol,
+ (rtems_unsigned32) strtoul(value, 0, 16));
+ if (sp == 0)
+ {
+ printf("could not define symbol '%s'\n", symbol);
+ goto done;
+ }
+ }
+ else
+ {
+ printf("parsing error on '%s'\n", buffer);
+ goto done;
+ }
+ }
+
+done:
+ return;
+}
+
+
+/*
+ * Main monitor command loop
+ */
+
+void
+rtems_monitor_task(
+ rtems_task_argument monitor_flags
+)
+{
+ rtems_tcb *debugee = 0;
+ rtems_context *rp;
+ rtems_context_fp *fp;
+ char command_buffer[513];
+ int argc;
+ char *argv[64];
+ boolean verbose = FALSE;
+
+ if (monitor_flags & RTEMS_MONITOR_SUSPEND)
+ (void) rtems_monitor_suspend(RTEMS_NO_TIMEOUT);
+
+ for (;;)
+ {
+ extern rtems_tcb * _Thread_Executing;
+ rtems_monitor_command_entry_t *command;
+
+ debugee = _Thread_Executing;
+ rp = &debugee->Registers;
+ fp = (rtems_context_fp *) debugee->fp_context; /* possibly 0 */
+
+ if (0 == rtems_monitor_command_read(command_buffer, &argc, argv))
+ continue;
+ if ((command = rtems_monitor_command_lookup(rtems_monitor_commands,
+ argc,
+ argv)) == 0)
+ continue;
+
+ command->command_function(argc, argv, command->command_arg, verbose);
+
+ fflush(stdout);
+ }
+}
+
+
+void
+rtems_monitor_kill(void)
+{
+ if (rtems_monitor_task_id)
+ rtems_task_delete(rtems_monitor_task_id);
+ rtems_monitor_task_id = 0;
+
+ rtems_monitor_server_kill();
+}
+
+void
+rtems_monitor_init(
+ unsigned32 monitor_flags
+)
+{
+ rtems_status_code status;
+
+ rtems_monitor_kill();
+
+ status = rtems_task_create(RTEMS_MONITOR_NAME,
+ 1,
+ 0 /* default stack */,
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &rtems_monitor_task_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor task");
+ goto done;
+ }
+
+ rtems_monitor_node = rtems_get_node(rtems_monitor_task_id);
+ rtems_monitor_default_node = rtems_monitor_node;
+
+ rtems_monitor_symbols_loadup();
+
+ if (monitor_flags & RTEMS_MONITOR_GLOBAL)
+ rtems_monitor_server_init(monitor_flags);
+
+ /*
+ * Start the monitor task itself
+ */
+
+ status = rtems_task_start(rtems_monitor_task_id,
+ rtems_monitor_task,
+ monitor_flags);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not start monitor");
+ goto done;
+ }
+
+done:
+}
diff --git a/cpukit/libmisc/monitor/mon-mpci.c b/cpukit/libmisc/monitor/mon-mpci.c
new file mode 100644
index 0000000000..cf88922b2b
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-mpci.c
@@ -0,0 +1,159 @@
+/*
+ * RTEMS MPCI Config display support
+ *
+ * TODO
+ *
+ * $Id$
+ */
+
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+
+#define DATACOL 15
+
+/*
+ * Fill in entire monitor config table
+ * for sending to a remote monitor or printing on the local system
+ */
+
+void
+rtems_monitor_mpci_canonical(
+ rtems_monitor_mpci_t *canonical_mpci,
+ void *config_void
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ rtems_multiprocessing_table *m;
+ rtems_mpci_table *mt;
+
+ m = c->User_multiprocessing_table;
+ if (m == 0)
+ return;
+ mt = m->User_mpci_table;
+
+ canonical_mpci->node = m->node;
+ canonical_mpci->maximum_nodes = m->maximum_nodes;
+ canonical_mpci->maximum_global_objects = m->maximum_global_objects;
+ canonical_mpci->maximum_proxies = m->maximum_proxies;
+
+ canonical_mpci->default_timeout = mt->default_timeout;
+ canonical_mpci->maximum_packet_size = mt->maximum_packet_size;
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->initialization,
+ (void *) mt->initialization);
+
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->get_packet,
+ (void *) mt->get_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->return_packet,
+ (void *) mt->return_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->send_packet,
+ (void *) mt->send_packet);
+ rtems_monitor_symbol_canonical_by_value(&canonical_mpci->receive_packet,
+ (void *) mt->receive_packet);
+}
+
+/*
+ * This is easy, since there is only 1 (altho we could get them from
+ * other nodes...)
+ */
+
+void *
+rtems_monitor_mpci_next(
+ void *object_info,
+ rtems_monitor_mpci_t *canonical_mpci,
+ rtems_id *next_id
+)
+{
+ rtems_configuration_table *c = _Configuration_Table;
+ int n = rtems_get_index(*next_id);
+
+ if (n >= 1)
+ goto failed;
+
+ if ( ! c->User_multiprocessing_table)
+ goto failed;
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) c;
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+
+void
+rtems_monitor_mpci_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ max max max default max\n\
+ node nodes globals proxies timeout pktsize\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+
+void
+rtems_monitor_mpci_dump(
+ rtems_monitor_mpci_t *monitor_mpci,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_pad(2, length);
+ length += printf(" %d", monitor_mpci->node);
+ length += rtems_monitor_pad(11, length);
+ length += printf("%d", monitor_mpci->maximum_nodes);
+
+ length += rtems_monitor_pad(18, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_global_objects);
+
+ length += rtems_monitor_pad(28, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_proxies);
+
+ length += rtems_monitor_pad(37, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->default_timeout);
+
+ length += rtems_monitor_pad(46, length);
+ length += rtems_monitor_dump_decimal(monitor_mpci->maximum_packet_size);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("init: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->initialization, verbose);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("get: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->get_packet, verbose);
+ length += printf("; return: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->return_packet, verbose);
+
+ printf("\n");
+ length = 0;
+ length += rtems_monitor_pad(DATACOL, length);
+
+ length += printf("send: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->send_packet, verbose);
+ length += printf("; receive: ");
+ length += rtems_monitor_symbol_dump(&monitor_mpci->receive_packet, verbose);
+
+ printf("\n");
+ length = 0;
+}
diff --git a/cpukit/libmisc/monitor/mon-object.c b/cpukit/libmisc/monitor/mon-object.c
new file mode 100644
index 0000000000..90de35ee7b
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-object.c
@@ -0,0 +1,376 @@
+/*
+ * RTEMS Monitor "object" support.
+ *
+ * Used to traverse object lists and print them out.
+ * An object can be an RTEMS object (chain based stuff) or
+ * a "misc" object such as a device driver.
+ *
+ * Each object has its own file in this directory (eg: extension.c)
+ * That file provides routines to convert a "native" structure
+ * to its canonical form, print a canonical structure, etc.
+ *
+ * TODO:
+ * should allow for non-numeric id's???
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <stdlib.h> /* strtoul() */
+#include <string.h> /* memcpy() */
+
+#include <monitor.h>
+
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * add:
+ * next
+ */
+
+rtems_monitor_object_info_t rtems_monitor_object_info[] =
+{
+ { RTEMS_MONITOR_OBJECT_CONFIG,
+ (void *) 0,
+ sizeof(rtems_monitor_config_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_config_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_config_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_config_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_config_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_MPCI,
+ (void *) 0,
+ sizeof(rtems_monitor_mpci_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_mpci_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_mpci_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_mpci_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_mpci_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_INIT_TASK,
+ (void *) 0,
+ sizeof(rtems_monitor_init_task_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_init_task_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_init_task_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_init_task_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_init_task_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_TASK,
+ (void *) &_RTEMS_tasks_Information,
+ sizeof(rtems_monitor_task_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_task_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_task_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_task_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_QUEUE,
+ (void *) &_Message_queue_Information,
+ sizeof(rtems_monitor_queue_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_queue_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_queue_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_queue_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_EXTENSION,
+ (void *) &_Extension_Information,
+ sizeof(rtems_monitor_extension_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_manager_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_extension_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_extension_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_extension_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_DRIVER,
+ (void *) 0,
+ sizeof(rtems_monitor_driver_t),
+ (rtems_monitor_object_next_fn) rtems_monitor_driver_next,
+ (rtems_monitor_object_canonical_fn) rtems_monitor_driver_canonical,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_driver_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_driver_dump,
+ },
+ { RTEMS_MONITOR_OBJECT_DNAME,
+ /* 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,
+ (rtems_monitor_object_dump_header_fn) rtems_monitor_dname_dump_header,
+ (rtems_monitor_object_dump_fn) rtems_monitor_dname_dump,
+ },
+};
+
+/*
+ * Allow id's to be specified without the node number or
+ * type for convenience.
+ */
+
+rtems_id
+rtems_monitor_id_fixup(
+ rtems_id id,
+ unsigned32 default_node,
+ rtems_monitor_object_type_t type
+)
+{
+ unsigned32 node;
+
+ node = rtems_get_node(id);
+ if (node == 0)
+ {
+ if (rtems_get_class(id) != OBJECTS_NO_CLASS)
+ type = rtems_get_class(id);
+
+ id = _Objects_Build_id(type, default_node, rtems_get_index(id));
+ }
+ return id;
+}
+
+
+rtems_monitor_object_info_t *
+rtems_monitor_object_lookup(
+ rtems_monitor_object_type_t type
+)
+{
+ rtems_monitor_object_info_t *p;
+ for (p = &rtems_monitor_object_info[0];
+ p < &rtems_monitor_object_info[NUMELEMS(rtems_monitor_object_info)];
+ p++)
+ {
+ if (p->type == type)
+ return p;
+ }
+ return 0;
+}
+
+rtems_id
+rtems_monitor_object_canonical_next_remote(
+ rtems_monitor_object_type_t type,
+ rtems_id id,
+ void *canonical
+)
+{
+ rtems_id next_id;
+ rtems_status_code status;
+ rtems_monitor_server_request_t request;
+ rtems_monitor_server_response_t response;
+
+ /*
+ * Send request
+ */
+
+ request.command = RTEMS_MONITOR_SERVER_CANONICAL;
+ request.argument0 = (unsigned32) type;
+ request.argument1 = (unsigned32) id;
+
+ status = rtems_monitor_server_request(rtems_get_node(id), &request, &response);
+ if (status != RTEMS_SUCCESSFUL)
+ goto failed;
+
+ /*
+ * process response
+ */
+
+ next_id = (rtems_id) response.result0;
+ if (next_id != RTEMS_OBJECT_ID_FINAL)
+ (void) memcpy(canonical, &response.payload, response.result1);
+
+ return next_id;
+
+failed:
+ return RTEMS_OBJECT_ID_FINAL;
+
+}
+
+
+rtems_id
+rtems_monitor_object_canonical_next(
+ rtems_monitor_object_info_t *info,
+ rtems_id id,
+ void *canonical
+)
+{
+ rtems_id next_id;
+ void *raw_item;
+
+ if ( ! _Objects_Is_local_id(id))
+ next_id = rtems_monitor_object_canonical_next_remote(info->type,
+ id,
+ canonical);
+ else
+ {
+ next_id = id;
+
+ raw_item = (void *) info->next(info->object_information,
+ canonical,
+ &next_id);
+
+ if (raw_item)
+ {
+ info->canonical(canonical, raw_item);
+ _Thread_Enable_dispatch();
+ }
+ }
+ return next_id;
+}
+
+
+/*
+ * this is routine server invokes locally to get the type
+ */
+
+rtems_id
+rtems_monitor_object_canonical_get(
+ rtems_monitor_object_type_t type,
+ rtems_id id,
+ void *canonical,
+ unsigned32 *size_p
+)
+{
+ rtems_monitor_object_info_t *info;
+ rtems_id next_id;
+
+ *size_p = 0;
+
+ info = rtems_monitor_object_lookup(type);
+
+ if (info == 0)
+ return RTEMS_OBJECT_ID_FINAL;
+
+ next_id = rtems_monitor_object_canonical_next(info, id, canonical);
+ *size_p = info->size;
+
+ return next_id;
+}
+
+
+void
+rtems_monitor_object_dump_1(
+ rtems_monitor_object_info_t *info,
+ rtems_id id,
+ boolean verbose
+)
+{
+ rtems_id next_id;
+ rtems_monitor_union_t canonical;
+
+ if ((next_id = rtems_monitor_object_canonical_next(
+ info,
+ id,
+ &canonical)) != RTEMS_OBJECT_ID_FINAL)
+ {
+ /*
+ * If the one we actually got is the one we wanted, then
+ * print it out.
+ * For ones that have an id field, this works fine,
+ * for all others, always dump it out.
+ *
+ * HACK: the way we determine whether there is an id is a hack.
+ *
+ * by the way: the reason we try to not have an id, is that some
+ * of the canonical structures are almost too big for shared
+ * memory driver (eg: mpci)
+ */
+
+ if ((info->next != rtems_monitor_manager_next) ||
+ (id == canonical.generic.id))
+ info->dump(&canonical, verbose);
+ }
+}
+
+void
+rtems_monitor_object_dump_all(
+ rtems_monitor_object_info_t *info,
+ boolean verbose
+)
+{
+ rtems_id next_id;
+ rtems_monitor_union_t canonical;
+
+ next_id = RTEMS_OBJECT_ID_INITIAL(info->type, rtems_monitor_default_node);
+
+ while ((next_id = rtems_monitor_object_canonical_next(
+ info,
+ next_id,
+ &canonical)) != RTEMS_OBJECT_ID_FINAL)
+ {
+ info->dump(&canonical, verbose);
+ }
+}
+
+void
+rtems_monitor_object_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_monitor_object_info_t *info = 0;
+ rtems_monitor_object_type_t type = (rtems_monitor_object_type_t) command_arg;
+
+ /* what is the default type? */
+ type = (rtems_monitor_object_type_t) command_arg;
+
+ if (argc == 1)
+ {
+ if (type == RTEMS_MONITOR_OBJECT_INVALID)
+ {
+ printf("A type must be specified to \"dump all\"\n");
+ goto done;
+ }
+
+ info = rtems_monitor_object_lookup(type);
+ if (info == 0)
+ goto not_found;
+
+ if (info->dump_header)
+ info->dump_header(verbose);
+ rtems_monitor_object_dump_all(info, verbose);
+ }
+ else
+ {
+ unsigned32 default_node = rtems_monitor_default_node;
+ rtems_monitor_object_type_t last_type = RTEMS_MONITOR_OBJECT_INVALID;
+ rtems_id id;
+
+ for (arg=1; argv[arg]; arg++)
+ {
+ id = (rtems_id) strtoul(argv[arg], 0, 16);
+ id = rtems_monitor_id_fixup(id, default_node, type);
+ type = (rtems_monitor_object_type_t) rtems_get_class(id);
+
+ /*
+ * Allow the item type to change in the middle
+ * of the command. If the type changes, then
+ * just dump out a new header and keep on going.
+ */
+ if (type != last_type)
+ {
+ info = rtems_monitor_object_lookup(type);
+ if (info == 0)
+ goto not_found;
+
+ if (info->dump_header)
+ info->dump_header(verbose);
+ }
+
+ if (info == 0)
+ {
+not_found: printf("Invalid or unsupported type %d\n", type);
+ goto done;
+ }
+
+ rtems_monitor_object_dump_1(info, id, verbose);
+
+ default_node = rtems_get_node(id);
+
+ last_type = type;
+ }
+ }
+done:
+ return;
+}
diff --git a/cpukit/libmisc/monitor/mon-prmisc.c b/cpukit/libmisc/monitor/mon-prmisc.c
new file mode 100644
index 0000000000..3c7dc62d9a
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-prmisc.c
@@ -0,0 +1,254 @@
+/*
+ * Print misc stuff for the monitor dump routines
+ * Each routine returns the number of characters it output.
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <rtems/assoc.h>
+
+#include <stdio.h>
+#include <ctype.h>
+
+void
+rtems_monitor_separator(void)
+{
+ printf("------------------------------------------------------------------------------\n");
+}
+
+unsigned32
+rtems_monitor_pad(
+ unsigned32 destination_column,
+ unsigned32 current_column
+)
+{
+ int pad_length;
+
+ if (destination_column <= current_column)
+ pad_length = 1;
+ else
+ pad_length = destination_column - current_column;
+
+ return printf("%*s", pad_length, "");
+}
+
+unsigned32
+rtems_monitor_dump_char(rtems_unsigned8 ch)
+{
+ if (isprint(ch))
+ return printf("%c", ch);
+ else
+ return printf("%02x", ch);
+}
+
+unsigned32
+rtems_monitor_dump_decimal(unsigned32 num)
+{
+ return printf("%4d", num);
+}
+
+unsigned32
+rtems_monitor_dump_hex(unsigned32 num)
+{
+ return printf("0x%x", num);
+}
+
+unsigned32
+rtems_monitor_dump_assoc_bitfield(
+ rtems_assoc_t *ap,
+ char *separator,
+ unsigned32 value
+ )
+{
+ unsigned32 b;
+ unsigned32 length = 0;
+ const char *name;
+
+ for (b = 1; b; b <<= 1)
+ if (b & value)
+ {
+ if (length)
+ length += printf("%s", separator);
+
+ name = rtems_assoc_name_by_local(ap, b);
+
+ if (name)
+ length += printf("%s", name);
+ else
+ length += printf("0x%x", b);
+ }
+
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_id(rtems_id id)
+{
+ return printf("%08x", id);
+}
+
+unsigned32
+rtems_monitor_dump_name(rtems_name name)
+{
+ unsigned32 i;
+ unsigned32 length = 0;
+ union {
+ unsigned32 ui;
+ char c[4];
+ } u;
+
+ u.ui = (rtems_unsigned32) name;
+
+ for (i=0; i<sizeof(u.c); i++)
+ length += rtems_monitor_dump_char(u.c[i]);
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_priority(rtems_task_priority priority)
+{
+ return printf("%3d", priority);
+}
+
+
+rtems_assoc_t rtems_monitor_state_assoc[] = {
+ { "DORM", STATES_DORMANT },
+ { "SUSP", STATES_SUSPENDED },
+ { "TRANS", STATES_TRANSIENT },
+ { "DELAY", STATES_DELAYING },
+ { "Wbuf", STATES_WAITING_FOR_BUFFER },
+ { "Wseg", STATES_WAITING_FOR_SEGMENT },
+ { "Wmsg" , STATES_WAITING_FOR_MESSAGE },
+ { "Wevnt", STATES_WAITING_FOR_EVENT },
+ { "Wsem", STATES_WAITING_FOR_SEMAPHORE },
+ { "Wtime", STATES_WAITING_FOR_TIME },
+ { "Wrpc", STATES_WAITING_FOR_RPC_REPLY },
+ { "WRATE", STATES_WAITING_FOR_PERIOD },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_state(States_Control state)
+{
+ unsigned32 length = 0;
+
+ if (state == STATES_READY) /* assoc doesn't deal with this as it is 0 */
+ length += printf("READY");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_state_assoc,
+ ":",
+ state);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_attribute_assoc[] = {
+ { "FL", RTEMS_FLOATING_POINT },
+ { "GL", RTEMS_GLOBAL },
+ { "PR", RTEMS_PRIORITY },
+ { "BI", RTEMS_BINARY_SEMAPHORE },
+ { "IN", RTEMS_INHERIT_PRIORITY },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_attributes(rtems_attribute attributes)
+{
+ unsigned32 length = 0;
+
+ if (attributes == RTEMS_DEFAULT_ATTRIBUTES) /* value is 0 */
+ length += printf("DEFAULT");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_attribute_assoc,
+ ":",
+ attributes);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_modes_assoc[] = {
+ { "nP", RTEMS_NO_PREEMPT },
+ { "T", RTEMS_TIMESLICE },
+ { "nA", RTEMS_NO_ASR },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_modes(rtems_mode modes)
+{
+ unsigned32 length = 0;
+
+ if (modes == RTEMS_DEFAULT_MODES) /* value is 0 */
+ length += printf("P:T:nA");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_modes_assoc,
+ ":",
+ modes);
+ return length;
+}
+
+rtems_assoc_t rtems_monitor_events_assoc[] = {
+ { "0", RTEMS_EVENT_0 },
+ { "1", RTEMS_EVENT_1 },
+ { "2", RTEMS_EVENT_2 },
+ { "3", RTEMS_EVENT_3 },
+ { "4", RTEMS_EVENT_4 },
+ { "5", RTEMS_EVENT_5 },
+ { "6", RTEMS_EVENT_6 },
+ { "7", RTEMS_EVENT_7 },
+ { "8", RTEMS_EVENT_8 },
+ { "9", RTEMS_EVENT_9 },
+ { "10", RTEMS_EVENT_10 },
+ { "11", RTEMS_EVENT_11 },
+ { "12", RTEMS_EVENT_12 },
+ { "13", RTEMS_EVENT_13 },
+ { "14", RTEMS_EVENT_14 },
+ { "15", RTEMS_EVENT_15 },
+ { "16", RTEMS_EVENT_16 },
+ { "17", RTEMS_EVENT_17 },
+ { "18", RTEMS_EVENT_18 },
+ { "19", RTEMS_EVENT_19 },
+ { "20", RTEMS_EVENT_20 },
+ { "21", RTEMS_EVENT_21 },
+ { "22", RTEMS_EVENT_22 },
+ { "23", RTEMS_EVENT_23 },
+ { "24", RTEMS_EVENT_24 },
+ { "25", RTEMS_EVENT_25 },
+ { "26", RTEMS_EVENT_26 },
+ { "27", RTEMS_EVENT_27 },
+ { "28", RTEMS_EVENT_28 },
+ { "29", RTEMS_EVENT_29 },
+ { "30", RTEMS_EVENT_30 },
+ { "31", RTEMS_EVENT_31 },
+ { 0, 0, 0 },
+};
+
+unsigned32
+rtems_monitor_dump_events(rtems_event_set events)
+{
+ unsigned32 length = 0;
+
+ if (events == EVENT_SETS_NONE_PENDING) /* value is 0 */
+ length += printf("NONE");
+
+ length += rtems_monitor_dump_assoc_bitfield(rtems_monitor_events_assoc,
+ ":",
+ events);
+ return length;
+}
+
+unsigned32
+rtems_monitor_dump_notepad(unsigned32 *notepad)
+{
+ unsigned32 length = 0;
+ int i;
+
+ for (i=0; i < RTEMS_NUMBER_NOTEPADS; i++)
+ if (notepad[i])
+ length += printf("%d: 0x%x ", i, notepad[i]);
+
+ return length;
+}
diff --git a/cpukit/libmisc/monitor/mon-queue.c b/cpukit/libmisc/monitor/mon-queue.c
new file mode 100644
index 0000000000..08c1d9474e
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-queue.c
@@ -0,0 +1,64 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+
+void
+rtems_monitor_queue_canonical(
+ rtems_monitor_queue_t *canonical_queue,
+ void *queue_void
+)
+{
+ Message_queue_Control *rtems_queue = (Message_queue_Control *) queue_void;
+
+ canonical_queue->attributes = rtems_queue->attribute_set;
+ canonical_queue->maximum_message_size = rtems_queue->message_queue.maximum_message_size;
+ canonical_queue->maximum_pending_messages = rtems_queue->message_queue.maximum_pending_messages;
+ canonical_queue->number_of_pending_messages = rtems_queue->message_queue.number_of_pending_messages;
+}
+
+void
+rtems_monitor_queue_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME ATTRIBUTES PEND MAXPEND MAXSIZE\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+ rtems_monitor_separator();
+}
+
+
+/*
+ * Dump out the "next" queue indicated by 'id'.
+ * Returns next one to check.
+ * Returns RTEMS_OBJECT_ID_FINAL when all done
+ */
+
+void
+rtems_monitor_queue_dump(
+ rtems_monitor_queue_t *monitor_queue,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ length += rtems_monitor_dump_id(monitor_queue->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_queue->name);
+ length += rtems_monitor_pad(19, length);
+ length += rtems_monitor_dump_attributes(monitor_queue->attributes);
+ length += rtems_monitor_pad(31, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->number_of_pending_messages);
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->maximum_pending_messages);
+ length += rtems_monitor_pad(48, length);
+ length += rtems_monitor_dump_decimal(monitor_queue->maximum_message_size);
+
+ printf("\n");
+}
diff --git a/cpukit/libmisc/monitor/mon-server.c b/cpukit/libmisc/monitor/mon-server.c
new file mode 100644
index 0000000000..af155684fb
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-server.c
@@ -0,0 +1,303 @@
+/*
+ * RTEMS monitor server (handles requests for info from RTEMS monitors
+ * running on other nodes)
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "monitor.h"
+
+/*
+ * Various id's for the server
+ */
+
+rtems_id rtems_monitor_server_task_id;
+rtems_id rtems_monitor_server_request_queue_id; /* our server */
+rtems_id *rtems_monitor_server_request_queue_ids; /* all servers */
+rtems_id rtems_monitor_server_response_queue_id; /* our server */
+
+
+/*
+ * Send a request to a server task
+ */
+
+rtems_status_code
+rtems_monitor_server_request(
+ unsigned32 server_node,
+ rtems_monitor_server_request_t *request,
+ rtems_monitor_server_response_t *response
+)
+{
+ rtems_id server_id;
+ rtems_status_code status;
+ unsigned32 size;
+
+ /*
+ * What is id of monitor on target node?
+ * Look it up if we don't know it yet.
+ */
+
+ server_id = rtems_monitor_server_request_queue_ids[server_node];
+ if (server_id == 0)
+ {
+ status = rtems_message_queue_ident(RTEMS_MONITOR_QUEUE_NAME,
+ server_node,
+ &server_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "ident of remote server failed");
+ goto done;
+ }
+
+ rtems_monitor_server_request_queue_ids[server_node] = server_id;
+ }
+
+ request->return_id = rtems_monitor_server_response_queue_id;
+
+ status = rtems_message_queue_send(server_id, request, sizeof(*request));
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "monitor server request send failed");
+ goto done;
+ }
+
+ /*
+ * Await response, if requested
+ */
+
+ if (response)
+ {
+ status = rtems_message_queue_receive(rtems_monitor_server_response_queue_id,
+ response,
+ &size,
+ RTEMS_WAIT,
+ 100);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "server did not respond");
+
+ /* maybe server task was restarted; look it up again next time */
+ rtems_monitor_server_request_queue_ids[server_node] = 0;
+
+ goto done;
+ }
+
+ if (response->command != RTEMS_MONITOR_SERVER_RESPONSE)
+ {
+ status = RTEMS_INCORRECT_STATE;
+ goto done;
+ }
+ }
+
+done:
+ return status;
+}
+
+
+
+/*
+ * monitor server task
+ */
+
+void
+rtems_monitor_server_task(
+ rtems_task_argument monitor_flags
+)
+{
+ rtems_monitor_server_request_t request;
+ rtems_monitor_server_response_t response;
+ rtems_status_code status;
+ unsigned32 size;
+
+ for (;;)
+ {
+ status = rtems_message_queue_receive(
+ rtems_monitor_server_request_queue_id,
+ &request,
+ &size,
+ RTEMS_WAIT,
+ (rtems_interval) 0);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "monitor server msg queue receive error");
+ goto failed;
+ }
+
+ if (size != sizeof(request))
+ {
+ rtems_error(0, "monitor server bad size on receive");
+ goto failed;
+ }
+
+ switch (request.command)
+ {
+ case RTEMS_MONITOR_SERVER_CANONICAL:
+ {
+ rtems_monitor_object_type_t object_type;
+ rtems_id id;
+ rtems_id next_id;
+
+ object_type = (rtems_monitor_object_type_t) request.argument0;
+ id = (rtems_id) request.argument1;
+ next_id = rtems_monitor_object_canonical_get(object_type,
+ id,
+ &response.payload,
+ &size);
+
+ response.command = RTEMS_MONITOR_SERVER_RESPONSE;
+ response.result0 = next_id;
+ response.result1 = size;
+
+#define SERVER_OVERHEAD (RTEMS_offsetof(rtems_monitor_server_response_t, \
+ payload))
+
+ status = rtems_message_queue_send(request.return_id,
+ &response,
+ size + SERVER_OVERHEAD);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "response send failed");
+ goto failed;
+ }
+ break;
+ }
+
+ default:
+ {
+ rtems_error(0, "invalid command to monitor server: %d", request.command);
+ goto failed;
+ }
+ }
+ }
+
+failed:
+ rtems_task_delete(RTEMS_SELF);
+}
+
+
+/*
+ * Kill off any old server
+ * Not sure if this is useful, but it doesn't help
+ */
+
+void
+rtems_monitor_server_kill(void)
+{
+ if (rtems_monitor_server_task_id)
+ rtems_task_delete(rtems_monitor_server_task_id);
+ rtems_monitor_task_id = 0;
+
+ if (rtems_monitor_server_request_queue_id)
+ rtems_message_queue_delete(rtems_monitor_server_request_queue_id);
+ rtems_monitor_server_response_queue_id = 0;
+
+ if (rtems_monitor_server_response_queue_id)
+ rtems_message_queue_delete(rtems_monitor_server_response_queue_id);
+ rtems_monitor_server_request_queue_ids = 0;
+
+ if (rtems_monitor_server_request_queue_ids)
+ free(rtems_monitor_server_request_queue_ids);
+ rtems_monitor_server_request_queue_ids = 0;
+}
+
+
+void
+rtems_monitor_server_init(
+ unsigned32 monitor_flags
+)
+{
+ rtems_status_code status;
+
+ if (_System_state_Is_multiprocessing &&
+ (_Configuration_MP_table->maximum_nodes > 1))
+ {
+ unsigned32 maximum_nodes = _Configuration_MP_table->maximum_nodes;
+
+ /*
+ * create the msg que our server will listen
+ * Since we only get msgs from other RTEMS monitors, we just
+ * need reserve space for 1 msg from each node.
+ */
+
+ status = rtems_message_queue_create(
+ RTEMS_MONITOR_QUEUE_NAME,
+ maximum_nodes,
+ sizeof(rtems_monitor_server_request_t),
+ RTEMS_GLOBAL,
+ &rtems_monitor_server_request_queue_id);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor server message queue");
+ goto done;
+ }
+
+ /*
+ * create the msg que our responses will come on
+ * Since monitor just does one thing at a time, we only need 1 item
+ * message queue.
+ */
+
+ status = rtems_message_queue_create(
+ RTEMS_MONITOR_RESPONSE_QUEUE_NAME,
+ 1, /* depth */
+ sizeof(rtems_monitor_server_response_t),
+ RTEMS_GLOBAL,
+ &rtems_monitor_server_response_queue_id);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor response message queue");
+ goto done;
+ }
+
+ /* need an id for queue of each other server we might talk to */
+ /* indexed by node, so add 1 to maximum_nodes */
+ rtems_monitor_server_request_queue_ids =
+ (rtems_id *) malloc((maximum_nodes + 1) * sizeof(rtems_id));
+ (void) memset(rtems_monitor_server_request_queue_ids,
+ 0,
+ (maximum_nodes + 1) * sizeof(rtems_id));
+
+ rtems_monitor_server_request_queue_ids[rtems_monitor_node] =
+ rtems_monitor_server_request_queue_id;
+
+ /*
+ * create the server task
+ */
+ status = rtems_task_create(RTEMS_MONITOR_SERVER_NAME,
+ 1,
+ 0 /* default stack */,
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &rtems_monitor_server_task_id);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not create monitor server task");
+ goto done;
+ }
+
+ /*
+ * Start the server task
+ */
+ status = rtems_task_start(rtems_monitor_server_task_id,
+ rtems_monitor_server_task,
+ monitor_flags);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ rtems_error(status, "could not start monitor server");
+ goto done;
+ }
+ }
+
+done:
+ return;
+}
diff --git a/cpukit/libmisc/monitor/mon-symbols.c b/cpukit/libmisc/monitor/mon-symbols.c
new file mode 100644
index 0000000000..6c6589d38f
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-symbols.c
@@ -0,0 +1,481 @@
+/*
+ * File: symbols.c
+ *
+ * Description:
+ * Symbol table manager for the RTEMS monitor.
+ * These routines may be used by other system resources also.
+ *
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "monitor.h"
+#include "symbols.h"
+
+
+rtems_symbol_table_t *
+rtems_symbol_table_create()
+{
+ rtems_symbol_table_t *table;
+
+ table = (rtems_symbol_table_t *) malloc(sizeof(rtems_symbol_table_t));
+ memset((void *) table, 0, sizeof(*table));
+
+ table->growth_factor = 30; /* 30 percent */
+
+ return table;
+}
+
+void
+rtems_symbol_table_destroy(rtems_symbol_table_t *table)
+{
+ rtems_symbol_string_block_t *p, *pnext;
+
+ if (table)
+ {
+ if (table->addresses)
+ (void) free(table->addresses);
+ table->addresses = 0;
+ p = table->string_buffer_head;
+ while (p)
+ {
+ pnext = p->next;
+ free(p);
+ p = pnext;
+ }
+ table->string_buffer_head = 0;
+ table->string_buffer_current = 0;
+
+ free(table);
+ }
+}
+
+rtems_symbol_t *
+rtems_symbol_create(
+ rtems_symbol_table_t *table,
+ char *name,
+ rtems_unsigned32 value
+ )
+{
+ int symbol_length;
+ size_t newsize;
+ rtems_symbol_t *sp;
+
+ symbol_length = strlen(name) + 1; /* include '\000' in length */
+
+ /* need to grow the table? */
+ if (table->next >= table->size)
+ {
+ if (table->size == 0)
+ newsize = 100;
+ else
+ newsize = table->size + (table->size / (100 / table->growth_factor));
+
+ table->addresses = (rtems_symbol_t *) realloc((void *) table->addresses, newsize * sizeof(rtems_symbol_t));
+ if (table->addresses == 0) /* blew it; lost orig */
+ goto failed;
+ table->size = newsize;
+ }
+
+ sp = &table->addresses[table->next];
+ sp->value = value;
+
+ /* Have to add it to string pool */
+ /* need to grow pool? */
+
+ if ((table->string_buffer_head == 0) ||
+ (table->strings_next + symbol_length) >= SYMBOL_STRING_BLOCK_SIZE)
+ {
+ rtems_symbol_string_block_t *p;
+
+ p = (rtems_symbol_string_block_t *) malloc(sizeof(rtems_symbol_string_block_t));
+ if (p == 0)
+ goto failed;
+ p->next = 0;
+ if (table->string_buffer_head == 0)
+ table->string_buffer_head = p;
+ else
+ table->string_buffer_current->next = p;
+ table->string_buffer_current = p;
+
+ table->strings_next = 0;
+ }
+
+ sp->name = table->string_buffer_current->buffer + table->strings_next;
+ (void) strcpy(sp->name, name);
+
+ table->strings_next += symbol_length;
+ table->sorted = 0;
+ table->next++;
+
+ return sp;
+
+/* XXX Not sure what to do here. We've possibly destroyed the initial
+ symbol table due to realloc failure */
+failed:
+ return 0;
+}
+
+/*
+ * Qsort entry point for compare by address
+ */
+
+static int
+rtems_symbol_compare(const void *e1,
+ const void *e2)
+{
+ rtems_symbol_t *s1, *s2;
+ s1 = (rtems_symbol_t *) e1;
+ s2 = (rtems_symbol_t *) e2;
+
+ if (s1->value < s2->value)
+ return -1;
+ if (s1->value > s2->value)
+ return 1;
+ return 0;
+}
+
+
+/*
+ * Sort the symbol table using qsort
+ */
+
+static void
+rtems_symbol_sort(rtems_symbol_table_t *table)
+{
+ qsort((void *) table->addresses, (size_t) table->next,
+ sizeof(rtems_symbol_t), rtems_symbol_compare);
+ table->sorted = 1;
+}
+
+
+/*
+ * Search the symbol table by address
+ * This code based on CYGNUS newlib bsearch, but changed
+ * to allow for finding closest symbol <= key
+ */
+
+rtems_symbol_t *
+rtems_symbol_value_lookup(
+ rtems_symbol_table_t *table,
+ rtems_unsigned32 value
+ )
+{
+ rtems_symbol_t *sp;
+ rtems_symbol_t *base;
+ rtems_symbol_t *best = 0;
+ rtems_unsigned32 distance;
+ rtems_unsigned32 best_distance = ~0;
+ rtems_unsigned32 elements;
+
+ if (table == 0)
+ table = rtems_monitor_symbols;
+
+ if ((table == 0) || (table->size == 0))
+ return 0;
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ base = table->addresses;
+ elements = table->next;
+
+ while (elements)
+ {
+ sp = base + (elements / 2);
+ if (value < sp->value)
+ elements /= 2;
+ else if (value > sp->value)
+ {
+ distance = value - sp->value;
+ if (distance < best_distance)
+ {
+ best_distance = distance;
+ best = sp;
+ }
+ base = sp + 1;
+ elements = (elements / 2) - (elements % 2 ? 0 : 1);
+ }
+ else
+ return sp;
+ }
+
+ if (value == base->value)
+ return base;
+
+ return best;
+}
+
+/*
+ * Search the symbol table for the exact matching address.
+ * If the symbol table has already been sorted, then
+ * call the regular symbol value lookup, however, it it
+ * has not yet been sorted, search it sequentially.
+ * This routine is primarily used for low level symbol
+ * lookups (eg. from exception handler and interrupt routines)
+ * where the penality of sorted is not wanted and where
+ * an exact match is needed such that symbol table order
+ * is not important.
+ */
+const rtems_symbol_t *
+rtems_symbol_value_lookup_exact(
+ rtems_symbol_table_t *table,
+ rtems_unsigned32 value
+ )
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return NULL;
+ }
+
+ if (table->sorted)
+ {
+ sp = rtems_symbol_value_lookup(table, value);
+ if ( rtems_symbol_value(sp) == value )
+ return sp;
+ else
+ return NULL; /* not an exact match */
+ }
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ if ( sp->value == value )
+ return sp;
+ }
+
+ return NULL;
+
+}
+
+
+/*
+ * Search the symbol table by string name (case independent)
+ */
+
+rtems_symbol_t *
+rtems_symbol_name_lookup(
+ rtems_symbol_table_t *table,
+ char *name
+ )
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return NULL;
+ }
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ if ( strcasecmp(sp->name, name) == 0 )
+ return sp;
+ }
+
+ return NULL;
+}
+
+void *
+rtems_monitor_symbol_next(
+ void *object_info,
+ rtems_monitor_symbol_t *canonical,
+ rtems_id *next_id
+)
+{
+ rtems_symbol_table_t *table;
+ int n = rtems_get_index(*next_id);
+
+ table = *(rtems_symbol_table_t **) object_info;
+ if (table == 0)
+ goto failed;
+
+ if (n >= table->next)
+ goto failed;
+
+ /* NOTE: symbols do not have id and name fields */
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ _Thread_Disable_dispatch();
+
+ *next_id += 1;
+ return (void *) (table->addresses + n);
+
+failed:
+ *next_id = RTEMS_OBJECT_ID_FINAL;
+ return 0;
+}
+
+void
+rtems_monitor_symbol_canonical(
+ rtems_monitor_symbol_t *canonical_symbol,
+ rtems_symbol_t *sp
+)
+{
+ canonical_symbol->value = sp->value;
+ canonical_symbol->offset = 0;
+ strncpy(canonical_symbol->name, sp->name, sizeof(canonical_symbol->name));
+}
+
+
+void
+rtems_monitor_symbol_canonical_by_name(
+ rtems_monitor_symbol_t *canonical_symbol,
+ char *name
+)
+{
+ rtems_symbol_t *sp;
+
+ sp = rtems_symbol_name_lookup(0, name);
+
+ canonical_symbol->value = sp ? sp->value : 0;
+
+ strncpy(canonical_symbol->name, name, sizeof(canonical_symbol->name));
+ canonical_symbol->offset = 0;
+}
+
+void
+rtems_monitor_symbol_canonical_by_value(
+ rtems_monitor_symbol_t *canonical_symbol,
+ void *value_void_p
+)
+{
+ unsigned32 value = (unsigned32) value_void_p;
+ rtems_symbol_t *sp;
+
+ sp = rtems_symbol_value_lookup(0, value);
+ if (sp)
+ {
+ canonical_symbol->value = sp->value;
+ canonical_symbol->offset = value - sp->value;
+ strncpy(canonical_symbol->name, sp->name, sizeof(canonical_symbol->name));
+ }
+ else
+ {
+ canonical_symbol->value = value;
+ canonical_symbol->offset = 0;
+ canonical_symbol->name[0] = '\0';
+ }
+}
+
+
+unsigned32
+rtems_monitor_symbol_dump(
+ rtems_monitor_symbol_t *canonical_symbol,
+ boolean verbose
+)
+{
+ unsigned32 length = 0;
+
+ /*
+ * print the name if it exists AND if value is non-zero
+ * Ie: don't print some garbage symbol for address 0
+ */
+
+ if (canonical_symbol->name[0] && (canonical_symbol->value != 0))
+ {
+ if (canonical_symbol->offset == 0)
+ length += printf("%.*s",
+ (int) sizeof(canonical_symbol->name),
+ canonical_symbol->name);
+ else
+ length += printf("<%.*s+0x%x>",
+ (int) sizeof(canonical_symbol->name),
+ canonical_symbol->name,
+ canonical_symbol->offset);
+ if (verbose)
+ length += printf(" [0x%x]", canonical_symbol->value);
+ }
+ else
+ length += printf("[0x%x]", canonical_symbol->value);
+
+ return length;
+}
+
+
+void
+rtems_monitor_symbol_dump_all(
+ rtems_symbol_table_t *table,
+ boolean verbose
+)
+{
+ int s;
+ rtems_symbol_t *sp;
+
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return;
+ }
+
+ if (table->sorted == 0)
+ rtems_symbol_sort(table);
+
+ for (s = 0, sp = table->addresses; s < table->next; s++, sp++)
+ {
+ rtems_monitor_symbol_t canonical_symbol;
+
+ rtems_monitor_symbol_canonical(&canonical_symbol, sp);
+ rtems_monitor_symbol_dump(&canonical_symbol, TRUE);
+ printf("\n");
+ }
+}
+
+
+/*
+ * 'symbol' command
+ */
+
+void
+rtems_monitor_symbol_cmd(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+)
+{
+ int arg;
+ rtems_symbol_table_t *table;
+
+ table = *(rtems_symbol_table_t **) command_arg;
+ if (table == 0)
+ {
+ table = rtems_monitor_symbols;
+ if (table == 0)
+ return;
+ }
+
+ /*
+ * Use object command to dump out whole symbol table
+ */
+ if (argc == 1)
+ rtems_monitor_symbol_dump_all(table, verbose);
+ else
+ {
+ rtems_monitor_symbol_t canonical_symbol;
+
+ for (arg=1; argv[arg]; arg++)
+ {
+ rtems_monitor_symbol_canonical_by_name(&canonical_symbol, argv[arg]);
+ rtems_monitor_symbol_dump(&canonical_symbol, verbose);
+ printf("\n");
+ }
+ }
+}
diff --git a/cpukit/libmisc/monitor/mon-task.c b/cpukit/libmisc/monitor/mon-task.c
new file mode 100644
index 0000000000..9592d9d99b
--- /dev/null
+++ b/cpukit/libmisc/monitor/mon-task.c
@@ -0,0 +1,93 @@
+/*
+ * RTEMS Monitor task support
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include "monitor.h"
+
+#include <stdio.h>
+#include <string.h> /* memcpy() */
+
+void
+rtems_monitor_task_canonical(
+ rtems_monitor_task_t *canonical_task,
+ void *thread_void
+)
+{
+ 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;
+ canonical_task->stack = rtems_thread->Start.Initial_stack.area;
+ canonical_task->stack_size = rtems_thread->Start.Initial_stack.size;
+ 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 = 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));
+*/
+}
+
+
+void
+rtems_monitor_task_dump_header(
+ boolean verbose
+)
+{
+ printf("\
+ ID NAME PRIO STAT MODES EVENTS WAITID WAITARG NOTES\n");
+/*23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+0 1 2 3 4 5 6 7 */
+
+ rtems_monitor_separator();
+}
+
+/*
+ */
+
+void
+rtems_monitor_task_dump(
+ rtems_monitor_task_t *monitor_task,
+ boolean verbose
+)
+{
+ int length = 0;
+
+ length += rtems_monitor_dump_id(monitor_task->id);
+ length += rtems_monitor_pad(11, length);
+ length += rtems_monitor_dump_name(monitor_task->name);
+ length += rtems_monitor_pad(18, length);
+ length += rtems_monitor_dump_priority(monitor_task->priority);
+ length += rtems_monitor_pad(24, length);
+ length += rtems_monitor_dump_state(monitor_task->state);
+ length += rtems_monitor_pad(31, length);
+ length += rtems_monitor_dump_modes(monitor_task->modes);
+ length += rtems_monitor_pad(39, length);
+ length += rtems_monitor_dump_events(monitor_task->events);
+ if (monitor_task->wait_id)
+ {
+ length += rtems_monitor_pad(47, length);
+ length += rtems_monitor_dump_id(monitor_task->wait_id);
+ length += rtems_monitor_pad(57, length);
+ length += rtems_monitor_dump_hex(monitor_task->wait_args);
+ }
+
+ length += rtems_monitor_pad(65, length);
+ length += rtems_monitor_dump_notepad(monitor_task->notepad);
+ printf("\n");
+}
+
diff --git a/cpukit/libmisc/monitor/monitor.h b/cpukit/libmisc/monitor/monitor.h
new file mode 100644
index 0000000000..1844add643
--- /dev/null
+++ b/cpukit/libmisc/monitor/monitor.h
@@ -0,0 +1,443 @@
+/*
+ * File: monitor.h
+ *
+ * Description:
+ * The RTEMS monitor task include file.
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#ifndef __MONITOR_H
+#define __MONITOR_H
+
+#include "symbols.h"
+#include <rtems/error.h> /* rtems_error() */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Monitor types are derived from rtems object classes
+ */
+
+typedef enum {
+ RTEMS_MONITOR_OBJECT_INVALID = OBJECTS_NO_CLASS,
+ RTEMS_MONITOR_OBJECT_TASK = OBJECTS_RTEMS_TASKS,
+ RTEMS_MONITOR_OBJECT_EXTENSION = OBJECTS_RTEMS_EXTENSIONS,
+ RTEMS_MONITOR_OBJECT_QUEUE = OBJECTS_RTEMS_MESSAGE_QUEUES,
+ RTEMS_MONITOR_OBJECT_SEMAPHORE = OBJECTS_RTEMS_SEMAPHORES,
+ RTEMS_MONITOR_OBJECT_PARTITION = OBJECTS_RTEMS_PARTITIONS,
+ RTEMS_MONITOR_OBJECT_REGION = OBJECTS_RTEMS_REGIONS,
+ RTEMS_MONITOR_OBJECT_PORT = OBJECTS_RTEMS_PORTS,
+
+ /* following monitor objects are not known to RTEMS, but
+ * we like to have "types" for them anyway */
+
+ RTEMS_MONITOR_OBJECT_DRIVER = OBJECTS_CLASSES_LAST+1,
+ RTEMS_MONITOR_OBJECT_DNAME,
+ RTEMS_MONITOR_OBJECT_CONFIG,
+ RTEMS_MONITOR_OBJECT_INIT_TASK,
+ RTEMS_MONITOR_OBJECT_MPCI,
+ RTEMS_MONITOR_OBJECT_SYMBOL
+} rtems_monitor_object_type_t;
+
+/*
+ * rtems_monitor_init() flags
+ */
+
+#define RTEMS_MONITOR_SUSPEND 0x0001 /* suspend monitor on startup */
+#define RTEMS_MONITOR_GLOBAL 0x0002 /* monitor should be global */
+
+
+/*
+ * Public interfaces for RTEMS data structures monitor is aware of.
+ * These are only used by the monitor.
+ *
+ * NOTE:
+ * All the canonical objects that correspond to RTEMS managed "objects"
+ * must have an identical first portion with 'id' and 'name' fields.
+ *
+ * Others do not have that restriction, even tho we would like them to.
+ * This is because some of the canonical structures are almost too big
+ * for shared memory driver (eg: mpci) and we are nickel and diming it.
+ */
+
+/*
+ * Type of a pointer that may be a symbol
+ */
+
+#define MONITOR_SYMBOL_LEN 20
+typedef struct {
+ char name[MONITOR_SYMBOL_LEN];
+ unsigned32 value;
+ unsigned32 offset;
+} rtems_monitor_symbol_t;
+
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+} rtems_monitor_generic_t;
+
+/*
+ * Task
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ Thread_Entry entry;
+ unsigned32 argument;
+ void *stack;
+ unsigned32 stack_size;
+ rtems_task_priority priority;
+ States_Control state;
+ rtems_event_set events;
+ rtems_mode modes;
+ rtems_attribute attributes;
+ unsigned32 notepad[RTEMS_NUMBER_NOTEPADS];
+ rtems_id wait_id;
+ unsigned32 wait_args;
+} rtems_monitor_task_t;
+
+/*
+ * Init task
+ */
+
+typedef struct {
+ rtems_id id; /* not really an id */
+ rtems_name name;
+ /* end of common portion */
+ rtems_monitor_symbol_t entry;
+ unsigned32 argument;
+ unsigned32 stack_size;
+ rtems_task_priority priority;
+ rtems_mode modes;
+ rtems_attribute attributes;
+} rtems_monitor_init_task_t;
+
+
+/*
+ * Message queue
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ rtems_attribute attributes;
+ unsigned32 number_of_pending_messages;
+ unsigned32 maximum_pending_messages;
+ unsigned32 maximum_message_size;
+} rtems_monitor_queue_t;
+
+/*
+ * Extension
+ */
+typedef struct {
+ rtems_id id;
+ rtems_name name;
+ /* end of common portion */
+ rtems_monitor_symbol_t e_create;
+ rtems_monitor_symbol_t e_start;
+ rtems_monitor_symbol_t e_restart;
+ rtems_monitor_symbol_t e_delete;
+ rtems_monitor_symbol_t e_tswitch;
+ rtems_monitor_symbol_t e_begin;
+ rtems_monitor_symbol_t e_exitted;
+ rtems_monitor_symbol_t e_fatal;
+} rtems_monitor_extension_t;
+
+/*
+ * Device driver
+ */
+
+typedef struct {
+ rtems_id id; /* not really an id (should be tho) */
+ rtems_name name; /* ditto */
+ /* end of common portion */
+ rtems_monitor_symbol_t initialization; /* initialization procedure */
+ rtems_monitor_symbol_t open; /* open request procedure */
+ rtems_monitor_symbol_t close; /* close request procedure */
+ rtems_monitor_symbol_t read; /* read request procedure */
+ rtems_monitor_symbol_t write; /* write request procedure */
+ rtems_monitor_symbol_t control; /* special functions procedure */
+} rtems_monitor_driver_t;
+
+typedef struct {
+ rtems_id id; /* not used for drivers (yet) */
+ rtems_name name; /* not used for drivers (yet) */
+ /* end of common portion */
+ unsigned32 major;
+ unsigned32 minor;
+ char name_string[64];
+} rtems_monitor_dname_t;
+
+/*
+ * System config
+ */
+
+typedef struct {
+ void *work_space_start;
+ unsigned32 work_space_size;
+ unsigned32 maximum_tasks;
+ unsigned32 maximum_timers;
+ unsigned32 maximum_semaphores;
+ unsigned32 maximum_message_queues;
+ unsigned32 maximum_partitions;
+ unsigned32 maximum_regions;
+ unsigned32 maximum_ports;
+ unsigned32 maximum_periods;
+ unsigned32 maximum_extensions;
+ unsigned32 microseconds_per_tick;
+ unsigned32 ticks_per_timeslice;
+ unsigned32 number_of_initialization_tasks;
+} rtems_monitor_config_t;
+
+/*
+ * MPCI config
+ */
+
+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 */
+
+ unsigned32 default_timeout; /* in ticks */
+ unsigned32 maximum_packet_size;
+ rtems_monitor_symbol_t initialization;
+ rtems_monitor_symbol_t get_packet;
+ rtems_monitor_symbol_t return_packet;
+ rtems_monitor_symbol_t send_packet;
+ rtems_monitor_symbol_t receive_packet;
+} rtems_monitor_mpci_t;
+
+/*
+ * The generic canonical information union
+ */
+
+typedef union {
+ rtems_monitor_generic_t generic;
+ rtems_monitor_task_t task;
+ rtems_monitor_queue_t queue;
+ rtems_monitor_extension_t extension;
+ rtems_monitor_driver_t driver;
+ rtems_monitor_dname_t dname;
+ rtems_monitor_config_t config;
+ rtems_monitor_mpci_t mpci;
+ rtems_monitor_init_task_t itask;
+} rtems_monitor_union_t;
+
+/*
+ * Support for talking to other monitors
+ */
+
+/*
+ * Names of other monitors
+ */
+
+#define RTEMS_MONITOR_NAME (rtems_build_name('R', 'M', 'O', 'N'))
+#define RTEMS_MONITOR_SERVER_NAME (rtems_build_name('R', 'M', 'S', 'V'))
+#define RTEMS_MONITOR_QUEUE_NAME (rtems_build_name('R', 'M', 'S', 'Q'))
+#define RTEMS_MONITOR_RESPONSE_QUEUE_NAME (rtems_build_name('R', 'M', 'R', 'Q'))
+
+#define RTEMS_MONITOR_SERVER_RESPONSE 0x0001
+#define RTEMS_MONITOR_SERVER_CANONICAL 0x0002
+
+typedef struct
+{
+ unsigned32 command;
+ rtems_id return_id;
+ unsigned32 argument0;
+ unsigned32 argument1;
+ unsigned32 argument2;
+ unsigned32 argument3;
+ unsigned32 argument4;
+ unsigned32 argument5;
+} rtems_monitor_server_request_t;
+
+typedef struct
+{
+ unsigned32 command;
+ unsigned32 result0;
+ unsigned32 result1;
+ rtems_monitor_union_t payload;
+} rtems_monitor_server_response_t;
+
+extern rtems_id rtems_monitor_task_id;
+
+extern unsigned32 rtems_monitor_node; /* our node number */
+extern unsigned32 rtems_monitor_default_node; /* current default for commands */
+
+/*
+ * Monitor command function and table entry
+ */
+
+typedef struct rtems_monitor_command_entry_s rtems_monitor_command_entry_t;
+
+typedef void ( *rtems_monitor_command_function_t )(
+ int argc,
+ char **argv,
+ unsigned32 command_arg,
+ boolean verbose
+ );
+
+struct rtems_monitor_command_entry_s {
+ char *command; /* command name */
+ char *usage; /* usage string for the command */
+ unsigned32 arguments_required; /* # of required args */
+ rtems_monitor_command_function_t command_function;
+
+ /* Some argument for the command */
+ unsigned32 command_arg;
+};
+
+typedef void *(*rtems_monitor_object_next_fn)(void *, void *, rtems_id *);
+typedef void (*rtems_monitor_object_canonical_fn)(void *, void *);
+typedef void (*rtems_monitor_object_dump_header_fn)(boolean);
+typedef void (*rtems_monitor_object_dump_fn)(void *, boolean);
+
+typedef struct {
+ rtems_monitor_object_type_t type;
+ void *object_information;
+ int size; /* of canonical object */
+ rtems_monitor_object_next_fn next;
+ rtems_monitor_object_canonical_fn canonical;
+ rtems_monitor_object_dump_header_fn dump_header;
+ rtems_monitor_object_dump_fn dump;
+} rtems_monitor_object_info_t;
+
+
+/* monitor.c */
+void rtems_monitor_kill(void);
+void rtems_monitor_init(rtems_boolean);
+void rtems_monitor_wakeup(void);
+void rtems_monitor_pause_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_fatal_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_continue_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_debugger_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_node_cmd(int, char **, unsigned32, boolean);
+void rtems_monitor_symbols_loadup(void);
+void rtems_monitor_task(rtems_task_argument);
+
+/* server.c */
+void rtems_monitor_server_kill(void);
+rtems_status_code rtems_monitor_server_request(unsigned32, rtems_monitor_server_request_t *, rtems_monitor_server_response_t *);
+void rtems_monitor_server_task(rtems_task_argument);
+void rtems_monitor_server_init(unsigned32);
+
+/* command.c */
+int rtems_monitor_make_argv(char *, int *, char **);
+int rtems_monitor_command_read(char *, int *, char **);
+rtems_monitor_command_entry_t *rtems_monitor_command_lookup(
+ rtems_monitor_command_entry_t * table, int argc, char **argv);
+void rtems_monitor_command_usage(rtems_monitor_command_entry_t *, char *);
+void rtems_monitor_help_cmd(int, char **, unsigned32, boolean);
+
+/* prmisc.c */
+void rtems_monitor_separator(void);
+unsigned32 rtems_monitor_pad(unsigned32 dest_col, unsigned32 curr_col);
+unsigned32 rtems_monitor_dump_char(unsigned8 ch);
+unsigned32 rtems_monitor_dump_decimal(unsigned32 num);
+unsigned32 rtems_monitor_dump_hex(unsigned32 num);
+unsigned32 rtems_monitor_dump_id(rtems_id id);
+unsigned32 rtems_monitor_dump_name(rtems_name name);
+unsigned32 rtems_monitor_dump_priority(rtems_task_priority priority);
+unsigned32 rtems_monitor_dump_state(States_Control state);
+unsigned32 rtems_monitor_dump_modes(rtems_mode modes);
+unsigned32 rtems_monitor_dump_attributes(rtems_attribute attributes);
+unsigned32 rtems_monitor_dump_events(rtems_event_set events);
+unsigned32 rtems_monitor_dump_notepad(unsigned32 *notepad);
+
+/* object.c */
+rtems_id rtems_monitor_id_fixup(rtems_id, unsigned32, rtems_monitor_object_type_t);
+rtems_id rtems_monitor_object_canonical_get(rtems_monitor_object_type_t, rtems_id, void *, unsigned32 *size_p);
+rtems_id rtems_monitor_object_canonical_next(rtems_monitor_object_info_t *, rtems_id, void *);
+void *rtems_monitor_object_next(void *, void *, rtems_id, rtems_id *);
+rtems_id rtems_monitor_object_canonical(rtems_id, void *);
+void rtems_monitor_object_cmd(int, char **, unsigned32, boolean);
+
+/* manager.c */
+void *rtems_monitor_manager_next(void *, void *, rtems_id *);
+
+/* config.c */
+void rtems_monitor_config_canonical(rtems_monitor_config_t *, void *);
+void *rtems_monitor_config_next(void *, rtems_monitor_config_t *, rtems_id *);
+void rtems_monitor_config_dump_header(boolean);
+void rtems_monitor_config_dump(rtems_monitor_config_t *, boolean verbose);
+
+/* mpci.c */
+void rtems_monitor_mpci_canonical(rtems_monitor_mpci_t *, void *);
+void *rtems_monitor_mpci_next(void *, rtems_monitor_mpci_t *, rtems_id *);
+void rtems_monitor_mpci_dump_header(boolean);
+void rtems_monitor_mpci_dump(rtems_monitor_mpci_t *, boolean verbose);
+
+/* itask.c */
+void rtems_monitor_init_task_canonical(rtems_monitor_init_task_t *, void *);
+void *rtems_monitor_init_task_next(void *, rtems_monitor_init_task_t *, rtems_id *);
+void rtems_monitor_init_task_dump_header(boolean);
+void rtems_monitor_init_task_dump(rtems_monitor_init_task_t *, boolean verbose);
+
+/* extension.c */
+void rtems_monitor_extension_canonical(rtems_monitor_extension_t *, void *);
+void rtems_monitor_extension_dump_header(boolean verbose);
+void rtems_monitor_extension_dump(rtems_monitor_extension_t *, boolean);
+
+/* task.c */
+void rtems_monitor_task_canonical(rtems_monitor_task_t *, void *);
+void rtems_monitor_task_dump_header(boolean verbose);
+void rtems_monitor_task_dump(rtems_monitor_task_t *, boolean);
+
+/* queue.c */
+void rtems_monitor_queue_canonical(rtems_monitor_queue_t *, void *);
+void rtems_monitor_queue_dump_header(boolean verbose);
+void rtems_monitor_queue_dump(rtems_monitor_queue_t *, boolean);
+
+/* driver.c */
+void *rtems_monitor_driver_next(void *, rtems_monitor_driver_t *, rtems_id *);
+void rtems_monitor_driver_canonical(rtems_monitor_driver_t *, void *);
+void rtems_monitor_driver_dump_header(boolean);
+void rtems_monitor_driver_dump(rtems_monitor_driver_t *, boolean);
+
+/* dname.c */
+void *rtems_monitor_dname_next(void *, rtems_monitor_dname_t *, rtems_id *);
+void rtems_monitor_dname_canonical(rtems_monitor_dname_t *, void *);
+void rtems_monitor_dname_dump_header(boolean);
+void rtems_monitor_dname_dump(rtems_monitor_dname_t *, boolean);
+
+/* symbols.c */
+rtems_symbol_table_t *rtems_symbol_table_create();
+void rtems_symbol_table_destroy(rtems_symbol_table_t *table);
+
+rtems_symbol_t *rtems_symbol_create(rtems_symbol_table_t *, char *, unsigned32);
+rtems_symbol_t *rtems_symbol_value_lookup(rtems_symbol_table_t *, unsigned32);
+const rtems_symbol_t *rtems_symbol_value_lookup_exact(rtems_symbol_table_t *, unsigned32);
+rtems_symbol_t *rtems_symbol_name_lookup(rtems_symbol_table_t *, char *);
+void *rtems_monitor_symbol_next(void *object_info, rtems_monitor_symbol_t *, rtems_id *);
+void rtems_monitor_symbol_canonical(rtems_monitor_symbol_t *, rtems_symbol_t *);
+void rtems_monitor_symbol_canonical_by_name(rtems_monitor_symbol_t *, char *);
+void rtems_monitor_symbol_canonical_by_value(rtems_monitor_symbol_t *, void *);
+unsigned32 rtems_monitor_symbol_dump(rtems_monitor_symbol_t *, boolean);
+void rtems_monitor_symbol_cmd(int, char **, unsigned32, boolean);
+
+
+extern rtems_symbol_table_t *rtems_monitor_symbols;
+
+#ifndef MONITOR_PROMPT
+#define MONITOR_PROMPT "rtems" /* will have '> ' appended */
+#endif
+
+#define MONITOR_WAKEUP_EVENT RTEMS_EVENT_0
+
+
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define STRNEQ(a,b,n) (strncmp(a,b,n) == 0)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! __MONITOR_H */
diff --git a/cpukit/libmisc/monitor/symbols.h b/cpukit/libmisc/monitor/symbols.h
new file mode 100644
index 0000000000..061ccdd952
--- /dev/null
+++ b/cpukit/libmisc/monitor/symbols.h
@@ -0,0 +1,64 @@
+/*
+ * RTEMS monitor symbol table functions
+ *
+ * Description:
+ * Entry points for symbol table routines.
+ *
+ *
+ *
+ * TODO:
+ *
+ * $Id$
+ */
+
+#ifndef _INCLUDE_SYMBOLS_H
+#define _INCLUDE_SYMBOLS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+ rtems_unsigned32 value;
+ char *name;
+} rtems_symbol_t;
+
+#define SYMBOL_STRING_BLOCK_SIZE 4080
+typedef struct rtems_symbol_string_block_s {
+ struct rtems_symbol_string_block_s *next;
+ char buffer[SYMBOL_STRING_BLOCK_SIZE];
+} rtems_symbol_string_block_t;
+
+typedef struct {
+
+ rtems_unsigned32 sorted; /* are symbols sorted right now? */
+
+ rtems_unsigned32 growth_factor; /* % to grow by when needed */
+
+ rtems_unsigned32 next; /* next symbol slot to use when adding */
+ rtems_unsigned32 size; /* max # of symbols */
+
+ /*
+ * Symbol list -- sorted by address (when we do a lookup)
+ */
+
+ rtems_symbol_t *addresses; /* symbol array by address */
+
+ /*
+ * String pool, unsorted, a list of blocks of string data
+ */
+
+ rtems_symbol_string_block_t *string_buffer_head;
+ rtems_symbol_string_block_t *string_buffer_current;
+ rtems_unsigned32 strings_next; /* next byte to use in this block */
+
+} rtems_symbol_table_t;
+
+#define rtems_symbol_name(sp) ((sp)->name)
+#define rtems_symbol_value(sp) ((sp)->value)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ! _INCLUDE_SYMBOLS_H */
diff --git a/cpukit/libmisc/rtmonuse/rtmonuse.c b/cpukit/libmisc/rtmonuse/rtmonuse.c
new file mode 100644
index 0000000000..272290176e
--- /dev/null
+++ b/cpukit/libmisc/rtmonuse/rtmonuse.c
@@ -0,0 +1,173 @@
+/*
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "rtmonuse.h"
+
+typedef struct {
+ rtems_id id;
+ unsigned32 count;
+ unsigned32 missed_count;
+ unsigned32 min_cpu_time;
+ unsigned32 max_cpu_time;
+ unsigned32 total_cpu_time;
+ unsigned32 min_wall_time;
+ unsigned32 max_wall_time;
+ unsigned32 total_wall_time;
+} Period_usage_t;
+
+Period_usage_t *Period_usage_Information;
+
+/*PAGE
+ *
+ * Period_usage_Initialize
+ */
+
+void Period_usage_Initialize( void )
+{
+ int maximum;
+
+ maximum = _Configuration_Table->RTEMS_api_configuration->maximum_periods;
+
+ Period_usage_Information = malloc( sizeof(Period_usage_t) * (maximum+1) );
+
+ Period_usage_Reset();
+}
+
+/*PAGE
+ *
+ * Period_usage_Reset
+ */
+
+void Period_usage_Reset( void )
+{
+ unsigned32 i;
+ Period_usage_t *the_usage;
+
+ for ( i=0 ;
+ i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
+ i++ ) {
+ the_usage = &Period_usage_Information[ i ];
+
+ the_usage->count = 0;
+ the_usage->missed_count = 0;
+ the_usage->min_cpu_time = 0xFFFFFFFF;
+ the_usage->max_cpu_time = 0;
+ the_usage->total_cpu_time = 0;
+ the_usage->min_wall_time = 0xFFFFFFFF;
+ the_usage->max_wall_time = 0;
+ the_usage->total_wall_time = 0;
+
+ }
+}
+
+/*PAGE
+ *
+ * Period_usage_Update
+ */
+
+void Period_usage_Update(
+ rtems_id id
+)
+{
+ rtems_rate_monotonic_period_status rm_status;
+ rtems_status_code status;
+ Period_usage_t *the_usage;
+
+ assert( Period_usage_Information );
+
+ status = rtems_rate_monotonic_get_status( id, &rm_status );
+ assert( status == RTEMS_SUCCESSFUL );
+
+ the_usage = &Period_usage_Information[ rtems_get_index( id ) ];
+
+ the_usage->id = id;
+ the_usage->count++;
+ if ( rm_status.state == RATE_MONOTONIC_EXPIRED )
+ the_usage->missed_count++;
+ the_usage->total_cpu_time += rm_status.ticks_executed_since_last_period;
+ the_usage->total_wall_time += rm_status.ticks_since_last_period;
+
+ /*
+ * Update CPU time
+ */
+
+ if ( rm_status.ticks_executed_since_last_period < the_usage->min_cpu_time )
+ the_usage->min_cpu_time = rm_status.ticks_executed_since_last_period;
+
+ if ( rm_status.ticks_executed_since_last_period > the_usage->max_cpu_time )
+ the_usage->max_cpu_time = rm_status.ticks_executed_since_last_period;
+
+ /*
+ * Update Wall time
+ */
+
+ if ( rm_status.ticks_since_last_period < the_usage->min_wall_time )
+ the_usage->min_wall_time = rm_status.ticks_since_last_period;
+
+ if ( rm_status.ticks_since_last_period > the_usage->max_wall_time )
+ the_usage->max_wall_time = rm_status.ticks_since_last_period;
+
+}
+
+/*PAGE
+ *
+ * Period_usage_Dump
+ */
+
+void Period_usage_Dump( void )
+{
+ unsigned32 i;
+ Period_usage_t *the_usage;
+ Rate_monotonic_Control *the_period;
+ unsigned32 u32_name;
+ char name[5];
+
+ printf( "Period information by period\n" );
+ printf( " ID OWNER PERIODS MISSED CPU TIME WALL TIME\n" );
+
+ /*
+ * RTEMS does not use an index of zero for object ids.
+ */
+
+ for ( i=1 ;
+ i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
+ i++ ) {
+ the_usage = &Period_usage_Information[ i ];
+ if ( the_usage->count == 0 )
+ continue;
+
+ the_period =
+ (Rate_monotonic_Control *)_Rate_monotonic_Information.local_table[ i ];
+
+ if ( the_period->owner )
+ u32_name = *(unsigned32 *)the_period->owner->Object.name;
+ else
+ u32_name = rtems_build_name(' ', ' ', ' ', ' ');
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+ printf(
+ "0x%08x %4s %6d %3d %d/%d/%5.2f %d/%d/%3.2f\n",
+ the_usage->id,
+ name,
+ the_usage->count,
+ the_usage->missed_count,
+ the_usage->min_cpu_time,
+ the_usage->max_cpu_time,
+ (double) the_usage->total_cpu_time / (double) the_usage->count,
+ the_usage->min_wall_time,
+ the_usage->max_wall_time,
+ (double) the_usage->total_wall_time / (double) the_usage->count
+ );
+ }
+}
diff --git a/cpukit/libmisc/rtmonuse/rtmonuse.h b/cpukit/libmisc/rtmonuse/rtmonuse.h
new file mode 100644
index 0000000000..f0580a4f0b
--- /dev/null
+++ b/cpukit/libmisc/rtmonuse/rtmonuse.h
@@ -0,0 +1,18 @@
+/*
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_USAGE_h
+#define __RATE_MONOTONIC_USAGE_h
+
+void Period_usage_Initialize( void );
+
+void Period_usage_Reset( void );
+
+void Period_usage_Update(
+ rtems_id id
+);
+
+void Period_usage_Dump( void );
+
+#endif
diff --git a/cpukit/libmisc/stackchk/README b/cpukit/libmisc/stackchk/README
new file mode 100644
index 0000000000..20e76f07bc
--- /dev/null
+++ b/cpukit/libmisc/stackchk/README
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+
+This directory contains a stack bounds checker. It provides two
+primary features:
+
+ + check for stack overflow at each context switch
+ + provides an educated guess at each task's stack usage
+
+The stack overflow check at context switch works by looking for
+a 16 byte pattern at the logical end of the stack to be corrupted.
+The "guesser" assumes that the entire stack was prefilled with a known
+pattern and assumes that the pattern is still in place if the memory
+has not been used as a stack.
+
+Both of these can be fooled by pushing large holes onto the stack
+and not writing to them... or (much more unlikely) writing the
+magic patterns into memory.
+
+This code has not been extensively tested. It is provided as a tool
+for RTEMS users to catch the most common mistake in multitasking
+systems ... too little stack space. Suggestions and comments are appreciated.
+
+NOTES:
+
+1. Stack usage information is questionable on CPUs which push
+ large holes on stack.
+
+2. The stack checker has a tendency to generate a fault when
+ trying to print the helpful diagnostic message. If it comes
+ out, congratulations. If not, then the variable Stack_check_Blown_task
+ contains a pointer to the TCB of the offending task. This
+ is usually enough to go on.
+
+FUTURE:
+
+1. Determine how/if gcc will generate stack probe calls and support that.
+
+2. Get accurate stack usage numbers on i960.. it pushes very large
+ holes on the stack.
diff --git a/cpukit/libmisc/stackchk/check.c b/cpukit/libmisc/stackchk/check.c
new file mode 100644
index 0000000000..45887c3929
--- /dev/null
+++ b/cpukit/libmisc/stackchk/check.c
@@ -0,0 +1,525 @@
+/*
+ * Stack Overflow Check User Extension Set
+ *
+ * NOTE: This extension set automatically determines at
+ * initialization time whether the stack for this
+ * CPU grows up or down and installs the correct
+ * extension routines for that direction.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+#include <rtems.h>
+
+/*
+ * HACK
+ * the stack dump information should be printed by a "fatal" extension.
+ * Fatal extensions only get called via rtems_fatal_error_occurred()
+ * and not when rtems_shutdown_executive() is called.
+ * I hope/think this is changing so that fatal extensions are renamed
+ * to "shutdown" extensions.
+ * When that happens, this #define should be deleted and all the code
+ * it marks.
+ */
+#define DONT_USE_FATAL_EXTENSION
+
+
+extern rtems_configuration_table BSP_Configuration;
+
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "stackchk.h"
+#include "internal.h"
+
+/*
+ * This variable contains the name of the task which "blew" the stack.
+ * It is NULL if the system is all right.
+ */
+
+Thread_Control *Stack_check_Blown_task;
+
+/*
+ * The extension table for the stack checker.
+ */
+
+rtems_extensions_table Stack_check_Extension_table = {
+ Stack_check_Create_extension, /* rtems_task_create */
+ 0, /* rtems_task_start */
+ 0, /* rtems_task_restart */
+ 0, /* rtems_task_delete */
+ Stack_check_Switch_extension, /* task_switch */
+ Stack_check_Begin_extension, /* task_begin */
+ 0, /* task_exitted */
+#ifdef DONT_USE_FATAL_EXTENSION
+ 0, /* fatal */
+#else
+ Stack_check_Fatal_extension, /* fatal */
+#endif
+};
+
+/*
+ * The "magic pattern" used to mark the end of the stack.
+ */
+
+Stack_check_Control Stack_check_Pattern;
+
+/*
+ * Where the pattern goes in the stack area is dependent upon
+ * whether the stack grow to the high or low area of the memory.
+ *
+ */
+
+#if ( CPU_STACK_GROWS_UP == TRUE )
+
+#define Stack_check_Get_pattern_area( _the_stack ) \
+ ((Stack_check_Control *) ((char *)(_the_stack)->area + \
+ (_the_stack)->size - sizeof( Stack_check_Control ) ))
+
+#define Stack_check_Calculate_used( _low, _size, _high_water ) \
+ ((char *)(_high_water) - (char *)(_low))
+
+#define Stack_check_usable_stack_start(_the_stack) \
+ ((_the_stack)->area)
+
+#else
+
+#define Stack_check_Get_pattern_area( _the_stack ) \
+ ((Stack_check_Control *) ((char *)(_the_stack)->area + HEAP_OVERHEAD))
+
+#define Stack_check_Calculate_used( _low, _size, _high_water) \
+ ( ((char *)(_low) + (_size)) - (char *)(_high_water) )
+
+#define Stack_check_usable_stack_start(_the_stack) \
+ ((char *)(_the_stack)->area + sizeof(Stack_check_Control))
+
+#endif
+
+#define Stack_check_usable_stack_size(_the_stack) \
+ ((_the_stack)->size - sizeof(Stack_check_Control))
+
+
+/*
+ * Do we have an interrupt stack?
+ * XXX it would sure be nice if the interrupt stack were also
+ * stored in a "stack" structure!
+ */
+
+
+Stack_Control stack_check_interrupt_stack;
+
+/*
+ * Prototypes necessary for forward references
+ */
+
+void Stack_check_Dump_usage( void );
+
+/*
+ * Fill an entire stack area with BYTE_PATTERN.
+ * This will be used by a Fatal extension to check for
+ * amount of actual stack used
+ */
+
+void
+stack_check_dope_stack(Stack_Control *stack)
+{
+ memset(stack->area, BYTE_PATTERN, stack->size);
+}
+
+
+/*PAGE
+ *
+ * Stack_check_Initialize
+ */
+
+unsigned32 stack_check_initialized = 0;
+
+void Stack_check_Initialize( void )
+{
+ rtems_status_code status;
+ Objects_Id id_ignored;
+ unsigned32 *p;
+#if 0
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+#endif
+
+ if (stack_check_initialized)
+ return;
+
+ /*
+ * Dope the pattern and fill areas
+ */
+
+ for ( p = Stack_check_Pattern.pattern;
+ p < &Stack_check_Pattern.pattern[PATTERN_SIZE_WORDS];
+ p += 4
+ )
+ {
+ p[0] = 0xFEEDF00D; /* FEED FOOD to BAD DOG */
+ p[1] = 0x0BAD0D06;
+ p[2] = 0xDEADF00D; /* DEAD FOOD GOOD DOG */
+ p[3] = 0x600D0D06;
+ };
+
+ status = rtems_extension_create(
+ rtems_build_name( 'S', 'T', 'C', 'K' ),
+ &Stack_check_Extension_table,
+ &id_ignored
+ );
+ assert ( status == RTEMS_SUCCESSFUL );
+
+ Stack_check_Blown_task = 0;
+
+ /*
+ * If installed by a task, that task will not get setup properly
+ * since it missed out on the create hook. This will cause a
+ * failure on first switch out of that task.
+ * 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
+ * also.
+ */
+ if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high)
+ {
+ stack_check_interrupt_stack.area = _CPU_Interrupt_stack_low;
+ stack_check_interrupt_stack.size = (char *) _CPU_Interrupt_stack_high -
+ (char *) _CPU_Interrupt_stack_low;
+
+ stack_check_dope_stack(&stack_check_interrupt_stack);
+ }
+
+#ifdef DONT_USE_FATAL_EXTENSION
+#ifdef RTEMS_DEBUG
+ /*
+ * this would normally be called by a fatal extension
+ * handler, but we don't run fatal extensions unless
+ * we fatal error.
+ */
+ atexit(Stack_check_Dump_usage);
+#endif
+#endif
+
+ stack_check_initialized = 1;
+}
+
+/*PAGE
+ *
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+)
+{
+ if (the_thread /* XXX && (the_thread != _Thread_Executing) */ )
+ stack_check_dope_stack(&the_thread->Start.Initial_stack);
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+)
+{
+ Stack_check_Control *the_pattern;
+
+ if ( the_thread->Object.id == 0 ) /* skip system tasks */
+ return;
+
+ the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack);
+
+ *the_pattern = Stack_check_Pattern;
+}
+
+/*PAGE
+ *
+ * Stack_check_report_blown_task
+ * Report a blown stack. Needs to be a separate routine
+ * so that interrupt handlers can use this too.
+ *
+ * Caller must have set the Stack_check_Blown_task.
+ *
+ * NOTE: The system is in a questionable state... we may not get
+ * the following message out.
+ */
+
+void Stack_check_report_blown_task(void)
+{
+ Stack_Control *stack;
+ Thread_Control *running;
+
+ running = Stack_check_Blown_task;
+ stack = &running->Start.Initial_stack;
+
+ fprintf(
+ stderr,
+ "BLOWN STACK!!! Offending task(%p): id=0x%08x; name=0x%08x",
+ running,
+ running->Object.id,
+ *(unsigned32 *)running->Object.name
+ );
+ fflush(stderr);
+
+ if (BSP_Configuration.User_multiprocessing_table)
+ fprintf(
+ stderr,
+ "; node=%d\n",
+ BSP_Configuration.User_multiprocessing_table->node
+ );
+ else
+ fprintf(stderr, "\n");
+ fflush(stderr);
+
+ fprintf(
+ stderr,
+ " stack covers range 0x%08x - 0x%08x (%d bytes)\n",
+ (unsigned32) stack->area,
+ (unsigned32) stack->area + stack->size - 1,
+ (unsigned32) stack->size);
+ fflush(stderr);
+
+ fprintf(
+ stderr,
+ " Damaged pattern begins at 0x%08x and is %d bytes long\n",
+ (unsigned32) Stack_check_Get_pattern_area(stack), PATTERN_SIZE_BYTES);
+ fflush(stderr);
+
+ rtems_fatal_error_occurred( (unsigned32) "STACK BLOWN" );
+}
+
+/*PAGE
+ *
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+)
+{
+ if ( running->Object.id == 0 ) /* skip system tasks */
+ return;
+
+ if (0 != memcmp( (void *) Stack_check_Get_pattern_area( &running->Start.Initial_stack)->pattern,
+ (void *) Stack_check_Pattern.pattern,
+ PATTERN_SIZE_BYTES))
+ {
+ Stack_check_Blown_task = running;
+ Stack_check_report_blown_task();
+ }
+}
+
+void *Stack_check_find_high_water_mark(
+ const void *s,
+ size_t n
+)
+{
+ const unsigned32 *base, *ebase;
+ unsigned32 length;
+
+ base = s;
+ length = n/4;
+
+#if ( CPU_STACK_GROWS_UP == TRUE )
+ /*
+ * start at higher memory and find first word that does not
+ * match pattern
+ */
+
+ base += length - 1;
+ for (ebase = s; base > ebase; base--)
+ if (*base != U32_PATTERN)
+ return (void *) base;
+#else
+ /*
+ * start at lower memory and find first word that does not
+ * match pattern
+ */
+
+ base += PATTERN_SIZE_WORDS;
+ for (ebase = base + length; base < ebase; base++)
+ if (*base != U32_PATTERN)
+ return (void *) base;
+#endif
+
+ return (void *)0;
+}
+
+/*PAGE
+ *
+ * Stack_check_Dump_threads_usage
+ * Try to print out how much stack was actually used by the task.
+ *
+ */
+
+void Stack_check_Dump_threads_usage(
+ Thread_Control *the_thread
+)
+{
+ unsigned32 size, used;
+ void *low;
+ void *high_water_mark;
+ Stack_Control *stack;
+ unsigned32 u32_name;
+ char name[5];
+
+
+ if ( !the_thread )
+ return;
+
+ /*
+ * XXX HACK to get to interrupt stack
+ */
+
+ if (the_thread == (Thread_Control *) -1)
+ {
+ if (stack_check_interrupt_stack.area)
+ {
+ stack = &stack_check_interrupt_stack;
+ the_thread = 0;
+ }
+ else
+ return;
+ }
+ else
+ stack = &the_thread->Start.Initial_stack;
+
+ low = Stack_check_usable_stack_start(stack);
+ size = Stack_check_usable_stack_size(stack);
+
+ high_water_mark = Stack_check_find_high_water_mark(low, size);
+
+ if ( high_water_mark )
+ used = Stack_check_Calculate_used( low, size, high_water_mark );
+ else
+ used = 0;
+
+ if ( the_thread )
+ u32_name = *(unsigned32 *)the_thread->Object.name;
+ else
+ u32_name = rtems_build_name('I', 'N', 'T', 'R');
+
+ name[ 0 ] = (u32_name >> 24) & 0xff;
+ name[ 1 ] = (u32_name >> 16) & 0xff;
+ name[ 2 ] = (u32_name >> 8) & 0xff;
+ name[ 3 ] = (u32_name >> 0) & 0xff;
+ name[ 4 ] = '\0';
+
+ printf( "0x%08x %4s 0x%08x 0x%08x %8d %8d\n",
+ the_thread ? the_thread->Object.id : ~0,
+ name,
+ (unsigned32) stack->area,
+ (unsigned32) stack->area + (unsigned32) stack->size - 1,
+ size,
+ used
+ );
+}
+
+/*PAGE
+ *
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+)
+{
+#ifndef DONT_USE_FATAL_EXTENSION
+ if (status == 0)
+ Stack_check_Dump_usage();
+#endif
+}
+
+
+/*PAGE
+ *
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void )
+{
+ unsigned32 i;
+ unsigned32 class_index;
+ Thread_Control *the_thread;
+ unsigned32 hit_running = 0;
+ Objects_Information *information;
+
+ if (stack_check_initialized == 0)
+ return;
+
+ printf("Stack usage by thread\n");
+ printf(
+ " ID NAME LOW HIGH AVAILABLE USED\n"
+ );
+
+ 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_Dump_threads_usage( the_thread );
+ if ( the_thread == _Thread_Executing )
+ hit_running = 1;
+ }
+ }
+ }
+
+ if ( !hit_running )
+ Stack_check_Dump_threads_usage( _Thread_Executing );
+
+ /* dump interrupt stack info if any */
+ Stack_check_Dump_threads_usage((Thread_Control *) -1);
+}
+
diff --git a/cpukit/libmisc/stackchk/internal.h b/cpukit/libmisc/stackchk/internal.h
new file mode 100644
index 0000000000..6d665a4594
--- /dev/null
+++ b/cpukit/libmisc/stackchk/internal.h
@@ -0,0 +1,96 @@
+/* internal.h
+ *
+ * This include file contains internal information
+ * for the RTEMS stack checker.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INTERNAL_STACK_CHECK_h
+#define __INTERNAL_STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This structure is used to fill in and compare the "end of stack"
+ * marker pattern.
+ * pattern area must be a multiple of 4 words.
+ */
+
+#ifdef CPU_STACK_CHECK_SIZE
+#define PATTERN_SIZE_WORDS (((CPU_STACK_CHECK_SIZE / 4) + 3) & ~0x3)
+#else
+#define PATTERN_SIZE_WORDS 4
+#endif
+
+#define PATTERN_SIZE_BYTES (PATTERN_SIZE_WORDS * 4)
+
+typedef struct {
+ unsigned32 pattern[ PATTERN_SIZE_WORDS ];
+} Stack_check_Control;
+
+/*
+ * The pattern used to fill the entire stack.
+ */
+
+#define BYTE_PATTERN 0xA5
+#define U32_PATTERN 0xA5A5A5A5
+
+/*
+ * Stack_check_Create_extension
+ */
+
+boolean Stack_check_Create_extension(
+ Thread_Control *running,
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Begin_extension
+ */
+
+void Stack_check_Begin_extension(
+ Thread_Control *the_thread
+);
+
+/*
+ * Stack_check_Switch_extension
+ */
+
+void Stack_check_Switch_extension(
+ Thread_Control *running,
+ Thread_Control *heir
+);
+
+/*
+ * Stack_check_Fatal_extension
+ */
+
+void Stack_check_Fatal_extension(
+ Internal_errors_Source source,
+ boolean is_internal,
+ unsigned32 status
+);
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/libmisc/stackchk/stackchk.h b/cpukit/libmisc/stackchk/stackchk.h
new file mode 100644
index 0000000000..006b6f3727
--- /dev/null
+++ b/cpukit/libmisc/stackchk/stackchk.h
@@ -0,0 +1,41 @@
+/* stackchk.h
+ *
+ * This include file contains information necessary to utilize
+ * and install the stack checker mechanism.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_CHECK_h
+#define __STACK_CHECK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Stack_check_Initialize
+ */
+
+void Stack_check_Initialize( void );
+
+/*
+ * Stack_check_Dump_usage
+ */
+
+void Stack_check_Dump_usage( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/aio.h b/cpukit/posix/include/aio.h
new file mode 100644
index 0000000000..504559c857
--- /dev/null
+++ b/cpukit/posix/include/aio.h
@@ -0,0 +1,137 @@
+/* aio.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_ASYNCHRONOUS_IO_h
+#define __POSIX_ASYNCHRONOUS_IO_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_ASYNCHRONOUS_IO)
+
+/*
+ * 6.7.1 Data Definitions for Asynchronous Input and Output,
+ * P1003.1b-1993, p. 151
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+#include <time.h>
+#include <fcntl.h>
+
+/*
+ * 6.7.1.2 Manifest Constants, P1003.1b-1993, p. 153
+ */
+
+#define AIO_CANCELED 0 /* all requested operations have been canceled */
+#define AIO_NOTCANCELED 0 /* some of the operations could not be canceled */
+ /* since they are in progress */
+#define AIO_ALLDONE 0 /* none of the requested operations could be */
+ /* canceled since they are already complete */
+
+/* lio_listio() options */
+
+#define LIO_WAIT 0 /* calling process is to suspend until the */
+ /* operation is complete */
+#define LIO_NOWAIT 0 /* calling process is to continue execution while */
+ /* the operation is performed and no notification */
+ /* shall be given when the operation is completed */
+#define LIO_READ 0 /* request a read() */
+#define LIO_WRITE 0 /* request a write() */
+#define LIO_NOP 0 /* no transfer is requested */
+
+/*
+ * 6.7.1.1 Asynchronous I/O Control Block, P1003.1b-1993, p. 151
+ */
+
+struct aiocb {
+ int aio_fildes; /* File descriptor */
+ off_t aio_offset; /* File offset */
+ volatile void *aio_buf; /* Location of buffer */
+ size_t aio_nbytes; /* Length of transfer */
+ int aio_reqprio; /* Request priority offset */
+ struct sigevent aio_sigevent; /* Signal number and value */
+ int aoi_lio_opcode; /* Operation to be performed */
+};
+
+/*
+ * 6.7.2 Asynchronous Read, P1003.1b-1993, p. 154
+ */
+
+int aio_read(
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.3 Asynchronous Write, P1003.1b-1993, p. 155
+ */
+
+int aio_write(
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.4 List Directed I/O, P1003.1b-1993, p. 158
+ */
+
+int lio_listio(
+ int mode,
+ struct aiocb * const list[],
+ int nent,
+ struct sigevent *sig
+);
+
+/*
+ * 6.7.5 Retrieve Error of Asynchronous I/O Operation, P1003.1b-1993, p. 161
+ */
+
+int aio_error(
+ const struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.6 Retrieve Return Status of Asynchronous I/O Operation,
+ * P1003.1b-1993, p. 162
+ */
+
+int aio_return(
+ const struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.7 Cancel Asynchronous I/O Operation, P1003.1b-1993, p. 163
+ */
+
+int aio_cancel(
+ int filedes,
+ struct aiocb *aiocbp
+);
+
+/*
+ * 6.7.7 Wait for Asynchronous I/O Request, P1003.1b-1993, p. 164
+ */
+
+int aio_suspend(
+ struct aiocb * const list[],
+ int nent,
+ const struct timespec *timeout
+);
+
+#if defined(_POSIX_SYNCHRONIZED_IO)
+
+/*
+ * 6.7.9 Asynchronous File Synchronization, P1003.1b-1993, p. 166
+ */
+
+int aio_fsync(
+ int op,
+ struct aiocb *aiocbp
+);
+
+#endif /* _POSIX_SYNCHRONIZED_IO */
+
+#endif /* _POSIX_ASYNCHRONOUS_IO */
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/devctl.h b/cpukit/posix/include/devctl.h
new file mode 100644
index 0000000000..5073b475ee
--- /dev/null
+++ b/cpukit/posix/include/devctl.h
@@ -0,0 +1,30 @@
+/* devctl.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_DEVICE_CONTROL_h
+#define __POSIX_DEVICE_CONTROL_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_DEVICE_CONTROL)
+
+#include <sys/types.h>
+#include <unistd.h>
+
+/*
+ * 21.2.1 Control a Device, P1003.4b/D8, p. 65
+ */
+
+int devctl(
+ int filedes,
+ void *dev_data_ptr,
+ size_t nbyte,
+ int *dev_info_ptr
+);
+
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/intr.h b/cpukit/posix/include/intr.h
new file mode 100644
index 0000000000..f07d1f9552
--- /dev/null
+++ b/cpukit/posix/include/intr.h
@@ -0,0 +1,72 @@
+/* intr.h
+ *
+ * XXX: It is unclear if the type "intr_t" should be defined when
+ * _POSIX_INTERRUPT_CONTROL is not.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_INTERRUPTS_h
+#define __POSIX_INTERRUPTS_h
+
+#include <rtems/posix/features.h>
+#include <sys/types.h>
+#include <sys/time.h>
+
+#if defined(_POSIX_INTERRUPT_CONTROL)
+
+/*
+ * 22.2 Concepts, P1003.4b/D8, p. 73
+ */
+
+typedef int intr_t;
+
+/*
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+/*
+ * Return codes from an interrupt handler
+ */
+
+#define INTR_HANDLED_NOTIFY 0 /* ISR handled this interrupt, notify */
+ /* the thread that registered the */
+ /* ISR that the interrupt occurred. */
+#define INTR_HANDLED_DO_NOT_NOTIFY 1 /* ISR handled this interrupt, but */
+ /* do NOT perform notification. */
+#define INTR_NOT_HANDLED 2 /* ISR did not handle this interrupt, */
+ /* let the next handler try. */
+
+int intr_capture(
+ intr_t intr,
+ int (*intr_handler)( void *area ),
+ volatile void *area,
+ size_t areasize
+);
+
+int intr_release(
+ intr_t intr,
+ int (*intr_handler)( void *area )
+);
+
+int intr_lock(
+ intr_t intr
+);
+
+int intr_unlock(
+ intr_t intr
+);
+
+/*
+ * 22.3.2 Await Interrupt Notification, P1003.4b/D8, p. 76
+ */
+
+int intr_timed_wait(
+ int flags,
+ const struct timespec *timeout
+);
+
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/mqueue.h b/cpukit/posix/include/mqueue.h
new file mode 100644
index 0000000000..f1b2250e5c
--- /dev/null
+++ b/cpukit/posix/include/mqueue.h
@@ -0,0 +1,145 @@
+/* mqueue.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_MESSAGE_QUEUE_h
+#define __POSIX_MESSAGE_QUEUE_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_MESSAGE_PASSING)
+
+#include <sys/types.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+
+/*
+ * 15.1.1 Data Structures, P1003.1b-1993, p. 271
+ */
+
+typedef Objects_Id mqd_t;
+
+struct mq_attr {
+ long mq_flags; /* Message queue flags */
+ long mq_maxmsg; /* Maximum number of messages */
+ long mq_msgsize; /* Maximum message size */
+ long mq_curmsgs; /* Number of messages currently queued */
+};
+
+/*
+ * 15.2.2 Open a Message Queue, P1003.1b-1993, p. 272
+ */
+
+mqd_t mq_open(
+ const char *name,
+ int oflag,
+ ...
+);
+
+/*
+ * 15.2.2 Close a Message Queue, P1003.1b-1993, p. 275
+ */
+
+int mq_close(
+ mqd_t mqdes
+);
+
+/*
+ * 15.2.2 Remove a Message Queue, P1003.1b-1993, p. 276
+ */
+
+int mq_unlink(
+ const char *name
+);
+
+/*
+ * 15.2.4 Send a Message to a Message Queue, P1003.1b-1993, p. 277
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedsend().
+ */
+
+int mq_send(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+#include <time.h>
+
+int mq_timedsend(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+/*
+ * 15.2.5 Receive a Message From a Message Queue, P1003.1b-1993, p. 279
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedreceive().
+ */
+
+ssize_t mq_receive(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio
+);
+
+#if defined(_POSIX_TIMEOUTS)
+
+int mq_timedreceive( /* XXX: should this be ssize_t */
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio,
+ const struct timespec *timeout
+);
+
+#endif /* _POSIX_TIMEOUTS */
+
+#if defined(_POSIX_REALTIME_SIGNALS)
+
+/*
+ * 15.2.6 Notify Process that a Message is Available on a Queue,
+ * P1003.1b-1993, p. 280
+ */
+
+int mq_notify(
+ mqd_t mqdes,
+ const struct sigevent *notification
+);
+
+#endif /* _POSIX_REALTIME_SIGNALS */
+
+/*
+ * 15.2.7 Set Message Queue Attributes, P1003.1b-1993, p. 281
+ */
+
+int mq_setattr(
+ mqd_t mqdes,
+ const struct mq_attr *mqstat,
+ struct mq_attr *omqstat
+);
+
+/*
+ * 15.2.8 Get Message Queue Attributes, P1003.1b-1993, p. 283
+ */
+
+int mq_getattr(
+ mqd_t mqdes,
+ struct mq_attr *mqstat
+);
+
+#endif /* _POSIX_MESSAGE_PASSING */
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/rtems/posix/cancel.h b/cpukit/posix/include/rtems/posix/cancel.h
new file mode 100644
index 0000000000..e6d80275f4
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/cancel.h
@@ -0,0 +1,16 @@
+/* rtems/posix/cancel.h
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CANCEL_h
+#define __RTEMS_POSIX_CANCEL_h
+
+typedef struct {
+ Chain_Node Node;
+ void (*routine)( void * );
+ void *arg;
+} POSIX_Cancel_Handler_control;
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/rtems/posix/cond.h b/cpukit/posix/include/rtems/posix/cond.h
new file mode 100644
index 0000000000..24dbcbfef6
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/cond.h
@@ -0,0 +1,130 @@
+/* rtems/posix/cond.h
+ *
+ * This include file contains all the private support information for
+ * POSIX condition variables.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_h
+#define __RTEMS_POSIX_CONDITION_VARIABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/threadq.h>
+
+/*
+ * Constant to indicate condition variable does not currently have
+ * a mutex assigned to it.
+ */
+
+#define POSIX_CONDITION_VARIABLES_NO_MUTEX 0
+
+/*
+ * Data Structure used to manage a POSIX condition variable
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ pthread_mutex_t Mutex;
+ Thread_queue_Control Wait_queue;
+} POSIX_Condition_variables_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Condition_variables_Information;
+
+/*
+ * _POSIX_Condition_variables_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Condition_variables_Manager_initialization(
+ unsigned32 maximum_condition_variables
+);
+
+/*
+ * _POSIX_Condition_variables_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a condition variable control block from
+ * the inactive chain of free condition variable control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *
+ _POSIX_Condition_variables_Allocate( void );
+
+/*
+ * _POSIX_Condition_variables_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a condition variable control block to the
+ * inactive chain of free condition variable control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
+ POSIX_Condition_variables_Control *the_condition_variable
+);
+
+/*
+ * _POSIX_Condition_variables_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps condition variable IDs to condition variable control
+ * blocks. If ID corresponds to a local condition variable, then it returns
+ * the_condition variable control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the condition variable ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_condition variable is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_condition variable is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Condition_variables_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_condition variable is NULL
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Condition_variables_Is_null (
+ POSIX_Condition_variables_Control *the_condition_variable
+);
+
+#include <rtems/posix/cond.inl>
+#include <rtems/posix/condmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/condmp.h b/cpukit/posix/include/rtems/posix/condmp.h
new file mode 100644
index 0000000000..75ab97a63b
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/condmp.h
@@ -0,0 +1,162 @@
+/* condmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Condition Variable Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_MP_h
+#define __RTEMS_POSIX_CONDITION_VARIABLES_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote condition variable operations.
+ */
+
+typedef enum {
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_CREATE = 0,
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_DELETE = 1,
+ POSIX_CONDITION_VARIABLES_MP_EXTRACT_PROXY = 2,
+ POSIX_CONDITION_VARIABLES_MP_OBTAIN_REQUEST = 3,
+ POSIX_CONDITION_VARIABLES_MP_OBTAIN_RESPONSE = 4,
+ POSIX_CONDITION_VARIABLES_MP_RELEASE_REQUEST = 5,
+ POSIX_CONDITION_VARIABLES_MP_RELEASE_RESPONSE = 6,
+} POSIX_Condition_variables_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote condition variable operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Condition_variables_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Condition_variables_MP_Packet;
+
+/*
+ * _POSIX_Condition_variables_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Condition_variables_MP_Send_process_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Condition_variables_MP_Send_request_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Condition_variables_MP_Send_response_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Condition_variables_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Condition_variables_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Condition_variables_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Condition_variables_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Condition_variables_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a condition variable mp packet.
+ */
+
+POSIX_Condition_variables_MP_Packet
+ *_POSIX_Condition_variables_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/posix/include/rtems/posix/config.h b/cpukit/posix/include/rtems/posix/config.h
new file mode 100644
index 0000000000..a0851ad77f
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/config.h
@@ -0,0 +1,59 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters specific for the POSIX API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONFIGURATION_h
+#define __RTEMS_POSIX_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * XXX
+ *
+ * The following records define the Configuration Table. The
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + required number of each object type
+ */
+
+/*
+ * For now, we are only allowing the user to specify the entry point
+ * for posix initialization threads.
+ */
+
+typedef struct {
+ void *(*entry)(void *);
+} posix_initialization_threads_table;
+
+typedef struct {
+ int maximum_threads;
+ int maximum_mutexes;
+ int maximum_condition_variables;
+ int maximum_keys;
+ int maximum_queued_signals;
+ int number_of_initialization_threads;
+ posix_initialization_threads_table *User_initialization_threads_table;
+} posix_api_configuration_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/rtems/posix/intr.h b/cpukit/posix/include/rtems/posix/intr.h
new file mode 100644
index 0000000000..85ae20de93
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/intr.h
@@ -0,0 +1,154 @@
+/* rtems/posix/intr.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Interrupt Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_h
+#define __RTEMS_POSIX_KEY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+
+/*
+ * Data Structure used to manage each POSIX Interrupt Vector
+ */
+
+typedef struct {
+ int number_installed;
+ int lock_count;
+ int deferred_count;
+ Chain_Control Handlers;
+} POSIX_Interrupt_Control;
+
+/*
+ * Data Structure used to manage a POSIX Interrupt Handler
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int is_active;
+ intr_t vector;
+ Thread_Control *server;
+ int (*handler)( void *area );
+ volatile void *user_data_area;
+} POSIX_Interrupt_Handler_control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Interrupt_Handlers_Information;
+
+/*
+ * The following is an array which is used to manage the set of
+ * interrupt handlers installed on each vector.
+ */
+
+POSIX_EXTERN POSIX_Interrupt_Control
+ _POSIX_Interrupt_Information[ ISR_NUMBER_OF_VECTORS ];
+
+/*
+ * _POSIX_Interrupt_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Interrupt_Manager_initialization(
+ unsigned32 maximum_interrupt_handlers
+);
+
+/*
+ * _POSIX_Interrupt_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a interrupt handler control block from
+ * the inactive chain of free interrupt handler control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Handler_control *
+ _POSIX_Interrupt_Allocate( void );
+
+/*
+ * _POSIX_Interrupt_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a interrupt handler control block to the
+ * inactive chain of free interrupt handler control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Interrupt_Free (
+ POSIX_Interrupt_Handler_control *the_intr
+);
+
+/*
+ * _POSIX_Interrupt_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps interrupt handler IDs to interrupt handler control
+ * blocks. If ID corresponds to a local interrupt handler, then it returns
+ * the_intr control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the interrupt handler ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_intr is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_intr is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Control *_POSIX_Interrupt_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Interrupt_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_intr is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Interrupt_Is_null (
+ POSIX_Interrupt_Handler_control *the_intr
+);
+
+/*
+ * _POSIX_Interrupt_Handler
+ *
+ * DESCRIPTION:
+ *
+ * This function XXX.
+ */
+
+void _POSIX_Interrupt_Handler(
+ ISR_Vector_number vector
+);
+
+#include <rtems/posix/intr.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/key.h b/cpukit/posix/include/rtems/posix/key.h
new file mode 100644
index 0000000000..11cb365905
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/key.h
@@ -0,0 +1,136 @@
+/* rtems/posix/key.h
+ *
+ * This include file contains all the private support information for
+ * POSIX key.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_h
+#define __RTEMS_POSIX_KEY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Data Structure used to manage a POSIX key
+ *
+ * NOTE: The Values is a table indexed by the index portion of the
+ * ID of the currently executing thread.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ boolean is_active;
+ void (*destructor)( void * );
+ void **Values[ OBJECTS_CLASSES_LAST_THREAD_CLASS + 1 ];
+} POSIX_Keys_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Keys_Information;
+
+/*
+ * _POSIX_Keys_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Key_Manager_initialization(
+ unsigned32 maximum_keys
+);
+
+/*
+ * _POSIX_Keys_Run_destructors
+ *
+ * DESCRIPTION:
+ *
+ * This function executes all the destructors associated with the thread's
+ * keys. This function will execute until all values have been set to NULL.
+ *
+ * NOTE: This is the routine executed when a thread exits to
+ * run through all the keys and do the destructor action.
+ */
+
+void _POSIX_Keys_Run_destructors(
+ Thread_Control *thread
+);
+
+/*
+ * _POSIX_Keys_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a keys control block from
+ * the inactive chain of free keys control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void );
+
+/*
+ * _POSIX_Keys_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a keys control block to the
+ * inactive chain of free keys control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
+ POSIX_Keys_Control *the_key
+);
+
+/*
+ * _POSIX_Keys_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps key IDs to key control blocks.
+ * If ID corresponds to a local keys, then it returns
+ * the_key control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the keys ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_key is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_key is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Keys_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_key is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Keys_Is_null (
+ POSIX_Keys_Control *the_key
+);
+
+#include <rtems/posix/key.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/mqueue.h b/cpukit/posix/include/rtems/posix/mqueue.h
new file mode 100644
index 0000000000..2301bcef4c
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/mqueue.h
@@ -0,0 +1,186 @@
+/* rtems/posix/mqueue.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Message Queues.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_h
+#define __RTEMS_POSIX_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coremsg.h>
+#include <rtems/score/object.h>
+
+/*
+ * Data Structure used to manage a POSIX message queue
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ int flags;
+ boolean named;
+ boolean linked;
+ boolean blocking;
+ unsigned32 open_count;
+ CORE_message_queue_Control Message_queue;
+ struct sigevent notification;
+} POSIX_Message_queue_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Message_queue_Information;
+
+/*
+ * _POSIX_Message_queue_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+);
+
+/*
+ *
+ * _POSIX_Message_queue_Create_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the creation of a message queue utilizing the
+ * core message queue.
+ */
+
+int _POSIX_Message_queue_Create_support(
+ const char *name,
+ int pshared,
+ unsigned int oflag,
+ struct mq_attr *attr,
+ POSIX_Message_queue_Control **message_queue
+);
+
+/*
+ *
+ * _POSIX_Message_queue_Send_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts a message to a specified message queue.
+ */
+
+int _POSIX_Message_queue_Send_support(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ unsigned32 msg_len,
+ Priority_Control msg_prio,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Message_queue_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message queue control block from
+ * the inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void );
+
+/*
+ * _POSIX_Message_queue_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a message queue control block to the
+ * inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
+ POSIX_Message_queue_Control *the_mq
+);
+
+/*
+ * _POSIX_Message_queue_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps message queue IDs to message queue control blocks.
+ * If ID corresponds to a local message queue, then it returns
+ * the_mq control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the message queue ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_message queue is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_mq is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_message_queue is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Message_queue_Is_null (
+ POSIX_Message_queue_Control *the_mq
+);
+
+/*
+ * _POSIX_Message_queue_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+int _POSIX_Message_queue_Name_to_id(
+ const char *name,
+ Objects_Id *id
+);
+
+/*
+ * _POSIX_Message_queue_Priority_to_core
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Message_queue_Priority_to_core(
+ unsigned int priority
+);
+
+#include <rtems/posix/mqueue.inl>
+#include <rtems/posix/mqueuemp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/mqueuemp.h b/cpukit/posix/include/rtems/posix/mqueuemp.h
new file mode 100644
index 0000000000..c5fb1232ec
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/mqueuemp.h
@@ -0,0 +1,161 @@
+/* mqueuemp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Message Queue Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_MP_h
+#define __RTEMS_POSIX_MESSAGE_QUEUE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote message queue operations.
+ */
+
+typedef enum {
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_CREATE = 0,
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_DELETE = 1,
+ POSIX_MESSAGE_QUEUE_MP_EXTRACT_PROXY = 2,
+ POSIX_MESSAGE_QUEUE_MP_OBTAIN_REQUEST = 3,
+ POSIX_MESSAGE_QUEUE_MP_OBTAIN_RESPONSE = 4,
+ POSIX_MESSAGE_QUEUE_MP_RELEASE_REQUEST = 5,
+ POSIX_MESSAGE_QUEUE_MP_RELEASE_RESPONSE = 6,
+} POSIX_Message_queue_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote message queue operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Message_queue_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Message_queue_MP_Packet;
+
+/*
+ * _POSIX_Message_queue_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Message_queue_MP_Send_process_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Message_queue_MP_Send_request_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Message_queue_MP_Send_response_packet (
+ POSIX_Message_queue_MP_Remote_operations operation,
+ Objects_Id mq_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Message_queue_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Message_queue_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Message_queue_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Message_queue_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a message queue mp packet.
+ */
+
+POSIX_Message_queue_MP_Packet *_POSIX_Message_queue_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/posix/include/rtems/posix/mutex.h b/cpukit/posix/include/rtems/posix/mutex.h
new file mode 100644
index 0000000000..9a3fedc444
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/mutex.h
@@ -0,0 +1,120 @@
+/* rtems/posix/mutex.h
+ *
+ * This include file contains all the private support information for
+ * POSIX mutex's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_h
+#define __RTEMS_POSIX_MUTEX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coremutex.h>
+#include <pthread.h>
+
+/*
+ * Data Structure used to manage a POSIX mutex
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ CORE_mutex_Control Mutex;
+} POSIX_Mutex_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Mutex_Information;
+
+/*
+ * _POSIX_Mutex_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Mutex_Manager_initialization(
+ unsigned32 maximum_mutexes
+);
+
+/*
+ * _POSIX_Mutex_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a mutexes control block from
+ * the inactive chain of free mutexes control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void );
+
+/*
+ * _POSIX_Mutex_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a mutexes control block to the
+ * inactive chain of free mutexes control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free (
+ POSIX_Mutex_Control *the_mutex
+);
+
+/*
+ * _POSIX_Mutex_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps mutexes IDs to mutexes control blocks.
+ * If ID corresponds to a local mutexes, then it returns
+ * the_mutex control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the mutexes ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_mutex is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_mutex is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Mutex_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_mutex is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Mutex_Is_null (
+ POSIX_Mutex_Control *the_mutex
+);
+
+#include <rtems/posix/mutex.inl>
+#include <rtems/posix/mutexmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/mutexmp.h b/cpukit/posix/include/rtems/posix/mutexmp.h
new file mode 100644
index 0000000000..d58f34925a
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/mutexmp.h
@@ -0,0 +1,161 @@
+/* mutexmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Mutex Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_MP_h
+#define __RTEMS_POSIX_MUTEX_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote mutex operations.
+ */
+
+typedef enum {
+ POSIX_MUTEX_MP_ANNOUNCE_CREATE = 0,
+ POSIX_MUTEX_MP_ANNOUNCE_DELETE = 1,
+ POSIX_MUTEX_MP_EXTRACT_PROXY = 2,
+ POSIX_MUTEX_MP_OBTAIN_REQUEST = 3,
+ POSIX_MUTEX_MP_OBTAIN_RESPONSE = 4,
+ POSIX_MUTEX_MP_RELEASE_REQUEST = 5,
+ POSIX_MUTEX_MP_RELEASE_RESPONSE = 6,
+} POSIX_Mutex_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote mutex operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Mutex_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Mutex_MP_Packet;
+
+/*
+ * _POSIX_Mutex_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Mutex_MP_Send_process_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Mutex_MP_Send_request_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Mutex_MP_Send_response_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Mutex_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Mutex_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Mutex_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Mutex_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Mutex_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Mutex_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a mutex mp packet.
+ */
+
+POSIX_Mutex_MP_Packet *_POSIX_Mutex_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/posix/include/rtems/posix/posixapi.h b/cpukit/posix/include/rtems/posix/posixapi.h
new file mode 100644
index 0000000000..5da4d6a1e2
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/posixapi.h
@@ -0,0 +1,34 @@
+/*
+ * POSIX API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_API_h
+#define __POSIX_API_h
+
+#include <rtems/config.h>
+
+/*PAGE
+ *
+ * _POSIX_API_Initialize
+ *
+ * XXX
+ */
+
+void _POSIX_API_Initialize(
+ rtems_configuration_table *configuration_table
+);
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/include/rtems/posix/priority.h b/cpukit/posix/include/rtems/posix/priority.h
new file mode 100644
index 0000000000..c0253f3bab
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/priority.h
@@ -0,0 +1,44 @@
+/*
+ *
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_PRIORITY_h
+#define __RTEMS_POSIX_PRIORITY_h
+
+#include <rtems/score/priority.h>
+
+/*
+ * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
+ *
+ * "Numericallly higher values represent higher priorities."
+ *
+ * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
+ *
+ * There are only 254 posix priority levels since a task at priority level
+ * 255 would never run because of the RTEMS idle task. This is necessary
+ * because GNAT maps the lowest Ada task priority to the lowest thread
+ * priority. The lowest priority Ada task should get to run, so there is
+ * a fundamental conflict with having 255 priorities.
+ */
+
+#define POSIX_SCHEDULER_MAXIMUM_PRIORITY (254)
+
+#define POSIX_SCHEDULER_MINIMUM_PRIORITY (1)
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Priority_Is_valid(
+ int priority
+);
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
+ int priority
+);
+
+RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
+ Priority_Control priority
+);
+
+#include <rtems/posix/priority.inl>
+
+#endif
diff --git a/cpukit/posix/include/rtems/posix/psignal.h b/cpukit/posix/include/rtems/posix/psignal.h
new file mode 100644
index 0000000000..9c66881076
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/psignal.h
@@ -0,0 +1,17 @@
+/*
+ * $Id$
+ */
+
+#ifndef __POSIX_SIGNALS_h
+#define __POSIX_SIGNALS_h
+
+void _POSIX_signals_Manager_Initialization(
+ int maximum_queued_signals
+);
+
+void _POSIX_signals_Post_switch_extension(
+ Thread_Control *the_thread
+);
+
+#endif
+/* end of file */
diff --git a/cpukit/posix/include/rtems/posix/pthread.h b/cpukit/posix/include/rtems/posix/pthread.h
new file mode 100644
index 0000000000..29d9a7eef9
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/pthread.h
@@ -0,0 +1,123 @@
+/* rtems/posix/pthread.h
+ *
+ * This include file contains all the private support information for
+ * POSIX threads.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_h
+#define __RTEMS_POSIX_THREADS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/posix/config.h>
+#include <rtems/posix/threadsup.h>
+
+#define PTHREAD_MINIMUM_STACK_SIZE (STACK_MINIMUM_SIZE * 2)
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Threads_Information;
+
+/*
+ * These are used to manage the user initialization threads.
+ */
+
+POSIX_EXTERN posix_initialization_threads_table
+ *_POSIX_Threads_User_initialization_threads;
+POSIX_EXTERN unsigned32 _POSIX_Threads_Number_of_initialization_threads;
+
+
+/*
+ * _POSIX_Threads_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Threads_Manager_initialization(
+ unsigned32 maximum_pthreads,
+ unsigned32 number_of_initialization_threads,
+ posix_initialization_threads_table *user_threads
+);
+
+/*
+ * _POSIX_Threads_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a pthread control block from
+ * the inactive chain of free pthread control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void );
+
+/*
+ * _POSIX_Threads_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a pthread control block to the
+ * inactive chain of free pthread control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free(
+ Thread_Control *the_pthread
+);
+
+/*
+ * _POSIX_Threads_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps pthread IDs to pthread control blocks.
+ * If ID corresponds to a local pthread, then it returns
+ * the_pthread control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the pthread ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_pthread is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_pthread is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get(
+ pthread_t id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Threads_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_pthread is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Threads_Is_null(
+ Thread_Control *the_pthread
+);
+
+#include <rtems/posix/pthread.inl>
+#include <rtems/posix/pthreadmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/pthreadmp.h b/cpukit/posix/include/rtems/posix/pthreadmp.h
new file mode 100644
index 0000000000..0165fe6d36
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/pthreadmp.h
@@ -0,0 +1,161 @@
+/* pthreadmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Threads Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_MP_h
+#define __RTEMS_POSIX_THREADS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote pthread operations.
+ */
+
+typedef enum {
+ POSIX_THREADS_MP_ANNOUNCE_CREATE = 0,
+ POSIX_THREADS_MP_ANNOUNCE_DELETE = 1,
+ POSIX_THREADS_MP_EXTRACT_PROXY = 2,
+ POSIX_THREADS_MP_OBTAIN_REQUEST = 3,
+ POSIX_THREADS_MP_OBTAIN_RESPONSE = 4,
+ POSIX_THREADS_MP_RELEASE_REQUEST = 5,
+ POSIX_THREADS_MP_RELEASE_RESPONSE = 6
+} POSIX_Threads_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote pthread operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Threads_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait;
+ Objects_Id proxy_id;
+} POSIX_Threads_MP_Packet;
+
+/*
+ * _POSIX_Threads_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Threads_MP_Send_process_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Threads_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Threads_MP_Send_request_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Threads_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Threads_MP_Send_response_packet (
+ POSIX_Threads_MP_Remote_operations operation,
+ Objects_Id pthread_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Threads_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Threads_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Threads_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Threads_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Threads_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Threads_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Threads_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a pthread mp packet.
+ */
+
+POSIX_Threads_MP_Packet *_POSIX_Threads_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/posix/include/rtems/posix/semaphore.h b/cpukit/posix/include/rtems/posix/semaphore.h
new file mode 100644
index 0000000000..5b38fadce0
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/semaphore.h
@@ -0,0 +1,135 @@
+/* rtems/posix/semaphore.h
+ *
+ * This include file contains all the private support information for
+ * POSIX Semaphores.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_h
+#define __RTEMS_POSIX_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/coresem.h>
+
+/*
+ * Data Structure used to manage a POSIX semaphore
+ */
+
+typedef struct {
+ Objects_Control Object;
+ int process_shared;
+ boolean named;
+ boolean linked;
+ unsigned32 open_count;
+ CORE_semaphore_Control Semaphore;
+} POSIX_Semaphore_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+POSIX_EXTERN Objects_Information _POSIX_Semaphore_Information;
+
+/*
+ * _POSIX_Semaphore_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphorees
+);
+
+/*
+ * _POSIX_Semaphore_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a semaphore control block from
+ * the inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void );
+
+/*
+ * _POSIX_Semaphore_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a semaphore control block to the
+ * inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
+ POSIX_Semaphore_Control *the_semaphore
+);
+
+/*
+ * _POSIX_Semaphore_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps semaphore IDs to semaphore control blocks.
+ * If ID corresponds to a local semaphore, then it returns
+ * the_semaphore control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the semaphore ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_semaphore is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_semaphore is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+);
+
+/*
+ * _POSIX_Semaphore_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_semaphore is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Semaphore_Is_null (
+ POSIX_Semaphore_Control *the_semaphore
+);
+
+/*
+ * _POSIX_Semaphore_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+int _POSIX_Semaphore_Name_to_id(
+ const char *name,
+ Objects_Id *id
+);
+
+#include <rtems/posix/semaphore.inl>
+#include <rtems/posix/semaphoremp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/semaphoremp.h b/cpukit/posix/include/rtems/posix/semaphoremp.h
new file mode 100644
index 0000000000..ff4cd16988
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/semaphoremp.h
@@ -0,0 +1,161 @@
+/* semaphoremp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the POSIX Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_MP_h
+#define __RTEMS_POSIX_SEMAPHORE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote semaphore operations.
+ */
+
+typedef enum {
+ POSIX_SEMAPHORE_MP_ANNOUNCE_CREATE = 0,
+ POSIX_SEMAPHORE_MP_ANNOUNCE_DELETE = 1,
+ POSIX_SEMAPHORE_MP_EXTRACT_PROXY = 2,
+ POSIX_SEMAPHORE_MP_OBTAIN_REQUEST = 3,
+ POSIX_SEMAPHORE_MP_OBTAIN_RESPONSE = 4,
+ POSIX_SEMAPHORE_MP_RELEASE_REQUEST = 5,
+ POSIX_SEMAPHORE_MP_RELEASE_RESPONSE = 6,
+} POSIX_Semaphore_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote semaphore operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ POSIX_Semaphore_MP_Remote_operations operation;
+ Objects_Name name;
+ boolean wait; /* XXX options */
+ Objects_Id proxy_id;
+} POSIX_Semaphore_MP_Packet;
+
+/*
+ * _POSIX_Semaphore_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _POSIX_Semaphore_MP_Send_process_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+int _POSIX_Semaphore_MP_Send_request_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _POSIX_Semaphore_MP_Send_response_packet (
+ POSIX_Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _POSIX_Semaphore_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _POSIX_Semaphore_MP_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _POSIX_Semaphore_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _POSIX_Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _POSIX_Semaphore_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a semaphore mp packet.
+ */
+
+POSIX_Semaphore_MP_Packet *_POSIX_Semaphore_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/posix/include/rtems/posix/threadsup.h b/cpukit/posix/include/rtems/posix/threadsup.h
new file mode 100644
index 0000000000..bb800a507f
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/threadsup.h
@@ -0,0 +1,46 @@
+/* threadsup.h
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREAD_SUPPORT_h
+#define __RTEMS_POSIX_THREAD_SUPPORT_h
+
+#include <rtems/score/coresem.h>
+#include <rtems/score/tqdata.h>
+
+typedef struct {
+ pthread_attr_t Attributes;
+ int detachstate;
+ Thread_queue_Control Join_List;
+ int schedpolicy;
+ struct sched_param schedparam;
+ int ss_high_priority;
+ Watchdog_Control Sporadic_timer;
+
+ sigset_t signals_blocked;
+ sigset_t signals_pending;
+
+#if 0
+ /*
+ * POSIX Interrupts
+ */
+ unsigned32 interrupts_installed;
+ CORE_semaphore_Control Interrupt_Semaphore;
+#endif
+
+#if 0
+ /*
+ * POSIX Cancelability
+ */
+ int cancelability_state;
+ int cancelability_type;
+ int cancelation_requested;
+ Chain_Control Cancellation_Handlers;
+#endif
+
+} POSIX_API_Control;
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/rtems/posix/time.h b/cpukit/posix/include/rtems/posix/time.h
new file mode 100644
index 0000000000..0e87db388e
--- /dev/null
+++ b/cpukit/posix/include/rtems/posix/time.h
@@ -0,0 +1,50 @@
+/*
+ *
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_TIME_h
+#define __RTEMS_POSIX_TIME_h
+
+#include <rtems/score/tod.h>
+
+/*
+ * Seconds from January 1, 1970 to January 1, 1988. Used to account for
+ * differences between POSIX API and RTEMS core.
+ */
+
+#define POSIX_TIME_SECONDS_1970_THROUGH_1988 \
+ (((1987 - 1970 + 1) * TOD_SECONDS_PER_NON_LEAP_YEAR) + \
+ (4 * TOD_SECONDS_PER_DAY))
+
+/*PAGE
+ *
+ * _POSIX_Timespec_subtract
+ */
+
+void _POSIX_Timespec_subtract(
+ const struct timespec *the_start,
+ const struct timespec *end,
+ struct timespec *result
+);
+
+/*
+ * _POSIX_Timespec_to_interval
+ */
+
+Watchdog_Interval _POSIX_Timespec_to_interval(
+ const struct timespec *time
+);
+
+/*PAGE
+ *
+ * _POSIX_Interval_to_timespec
+ */
+
+void _POSIX_Interval_to_timespec(
+ Watchdog_Interval ticks,
+ struct timespec *time
+);
+
+#endif
diff --git a/cpukit/posix/include/sched.h b/cpukit/posix/include/sched.h
new file mode 100644
index 0000000000..14a603c0c5
--- /dev/null
+++ b/cpukit/posix/include/sched.h
@@ -0,0 +1,88 @@
+/* sched.h
+ *
+ * $Id$
+ */
+
+
+#ifndef __POSIX_SCHEDULING_h
+#define __POSIX_SCHEDULING_h
+
+#include <sys/features.h>
+
+#if defined(_POSIX_PRIORITY_SCHEDULING)
+
+#include <sys/types.h>
+#include <time.h>
+#include <sys/sched.h>
+#include <pthread.h>
+
+/*
+ * 13.3.1 Set Scheduling Parameters, P1003.1b-1993, p. 252
+ *
+ */
+
+int sched_setparam(
+ pid_t pid,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.2 Set Scheduling Parameters, P1003.1b-1993, p. 253
+ */
+
+int sched_getparam(
+ pid_t pid,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.3 Set Scheduling Policy and Scheduling Parameters,
+ * P1003.1b-1993, p. 254
+ */
+
+int sched_setscheduler(
+ pid_t pid,
+ int policy,
+ const struct sched_param *param
+);
+
+/*
+ * 13.3.4 Get Scheduling Policy, P1003.1b-1993, p. 256
+ */
+
+int sched_getscheduler(
+ pid_t pid
+);
+
+/*
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_get_priority_max(
+ int policy
+);
+
+int sched_get_priority_min(
+ int policy
+);
+
+int sched_rr_get_interval(
+ pid_t pid,
+ struct timespec *interval
+);
+
+#endif /* _POSIX_PRIORITY_SCHEDULING */
+
+#if defined(_POSIX_THREADS) || defined(_POSIX_PRIORITY_SCHEDULING)
+
+/*
+ * 13.3.5 Yield Processor, P1003.1b-1993, p. 257
+ */
+
+int sched_yield( void );
+
+#endif /* _POSIX_THREADS or _POSIX_PRIORITY_SCHEDULING */
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/include/semaphore.h b/cpukit/posix/include/semaphore.h
new file mode 100644
index 0000000000..0388f91ad9
--- /dev/null
+++ b/cpukit/posix/include/semaphore.h
@@ -0,0 +1,108 @@
+/* semaphore.h
+ *
+ * $Id$
+ */
+
+#ifndef __POSIX_SEMAPHORE_h
+#define __POSIX_SEMAPHORE_h
+
+#include <rtems/posix/features.h>
+
+#if defined(_POSIX_SEMAPHORES)
+
+#include <sys/time.h>
+
+/*
+ * 11.1 Semaphore Characteristics, P1003.1b-1993, p.219
+ */
+
+typedef int sem_t;
+
+/*
+ * 11.2.1 Initialize an Unnamed Semaphore, P1003.1b-1993, p.219
+ */
+
+int sem_init(
+ sem_t *sem,
+ int pshared,
+ unsigned int value
+);
+
+/*
+ * 11.2.2 Destroy an Unnamed Semaphore, P1003.1b-1993, p.220
+ */
+
+int sem_destroy(
+ sem_t *sem
+);
+
+/*
+ * 11.2.3 Initialize/Open a Named Semaphore, P1003.1b-1993, p.221
+ *
+ * NOTE: Follows open() calling conventions.
+ */
+
+sem_t *sem_open(
+ const char *name,
+ int oflag,
+ ...
+);
+
+/*
+ * 11.2.4 Close a Named Semaphore, P1003.1b-1993, p.224
+ */
+
+int sem_close(
+ sem_t *sem
+);
+
+/*
+ * 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
+ */
+
+int sem_unlink(
+ const char *name
+);
+
+/*
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_wait(
+ sem_t *sem
+);
+
+int sem_trywait(
+ sem_t *sem
+);
+
+#if defined(_POSIX_TIMEOUTS)
+int sem_timedwait(
+ sem_t *sem,
+ const struct timespec *timeout
+);
+#endif
+
+/*
+ * 11.2.7 Unlock a Semaphore, P1003.1b-1993, p.227
+ */
+
+int sem_post(
+ sem_t *sem
+);
+
+/*
+ * 11.2.8 Get the Value of a Semaphore, P1003.1b-1993, p.229
+ */
+
+int sem_getvalue(
+ sem_t *sem,
+ int *sval
+);
+
+#endif /* _POSIX_SEMAPHORES */
+
+#endif
+/* end of include file */
diff --git a/cpukit/posix/inline/rtems/posix/cond.inl b/cpukit/posix/inline/rtems/posix/cond.inl
new file mode 100644
index 0000000000..c85546027f
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/cond.inl
@@ -0,0 +1,76 @@
+/* rtems/posix/cond.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX condition variables.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_CONDITION_VARIABLES_inl
+#define __RTEMS_POSIX_CONDITION_VARIABLES_inl
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control
+ *_POSIX_Condition_variables_Allocate( void )
+{
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Allocate( &_POSIX_Condition_variables_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free (
+ POSIX_Condition_variables_Control *the_condition_variable
+)
+{
+ _Objects_Free(
+ &_POSIX_Condition_variables_Information,
+ &the_condition_variable->Object
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+/* XXX really should validate pointer */
+ return (POSIX_Condition_variables_Control *)
+ _Objects_Get( &_POSIX_Condition_variables_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Condition_variables_Is_null (
+ POSIX_Condition_variables_Control *the_condition_variable
+)
+{
+ return !the_condition_variable;
+}
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/inline/rtems/posix/intr.inl b/cpukit/posix/inline/rtems/posix/intr.inl
new file mode 100644
index 0000000000..cf666cec4e
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/intr.inl
@@ -0,0 +1,72 @@
+/* rtems/posix/intr.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Interrupt Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_INTERRUPT_inl
+#define __RTEMS_POSIX_INTERRUPT_inl
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Handler_control *
+ _POSIX_Interrupt_Allocate( void )
+{
+ return (POSIX_Interrupt_Handler_control *)
+ _Objects_Allocate( &_POSIX_Interrupt_Handlers_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Interrupt_Free (
+ POSIX_Interrupt_Handler_control *the_intr
+)
+{
+ _Objects_Free( &_POSIX_Interrupt_Handlers_Information, &the_intr->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Interrupt_Control *_POSIX_Interrupt_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Interrupt_Control *)
+ _Objects_Get( &_POSIX_Interrupt_Handlers_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Interrupt_Is_null (
+ POSIX_Interrupt_Handler_control *the_intr
+)
+{
+ return !the_intr;
+}
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/inline/rtems/posix/key.inl b/cpukit/posix/inline/rtems/posix/key.inl
new file mode 100644
index 0000000000..3611960322
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/key.inl
@@ -0,0 +1,70 @@
+/* rtems/posix/key.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX key's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_KEY_inl
+#define __RTEMS_POSIX_KEY_inl
+
+/*PAGE
+ *
+ * _POSIX_Keys_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void )
+{
+ return (POSIX_Keys_Control *) _Objects_Allocate( &_POSIX_Keys_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free (
+ POSIX_Keys_Control *the_key
+)
+{
+ _Objects_Free( &_POSIX_Keys_Information, &the_key->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Keys_Control *)
+ _Objects_Get( &_POSIX_Keys_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Keys_Is_null (
+ POSIX_Keys_Control *the_key
+)
+{
+ return !the_key;
+}
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/inline/rtems/posix/mqueue.inl b/cpukit/posix/inline/rtems/posix/mqueue.inl
new file mode 100644
index 0000000000..56be2e346f
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/mqueue.inl
@@ -0,0 +1,83 @@
+/* rtems/posix/mqueue.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Message Queue.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MESSAGE_QUEUE_inl
+#define __RTEMS_POSIX_MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void )
+{
+ return (POSIX_Message_queue_Control *)
+ _Objects_Allocate( &_POSIX_Message_queue_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free (
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ _Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Message_queue_Control *)
+ _Objects_Get( &_POSIX_Message_queue_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Message_queue_Is_null (
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ return !the_mq;
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Priority_to_core
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Message_queue_Priority_to_core(
+ unsigned int priority
+)
+{
+ return priority;
+}
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/inline/rtems/posix/mutex.inl b/cpukit/posix/inline/rtems/posix/mutex.inl
new file mode 100644
index 0000000000..8dcdb4c24e
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/mutex.inl
@@ -0,0 +1,93 @@
+/* rtems/posix/mutex.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX mutex's.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_MUTEX_inl
+#define __RTEMS_POSIX_MUTEX_inl
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void )
+{
+ return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free (
+ POSIX_Mutex_Control *the_mutex
+)
+{
+ _Objects_Free( &_POSIX_Mutex_Information, &the_mutex->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+ int status;
+
+ if ( !id ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Mutex_Control *) 0;
+ }
+
+ if ( *id == PTHREAD_MUTEX_INITIALIZER ) {
+ /*
+ * Do an "auto-create" here.
+ */
+
+ status = pthread_mutex_init( id, 0 );
+ if ( status ) {
+ *location = OBJECTS_ERROR;
+ return (POSIX_Mutex_Control *) 0;
+ }
+ }
+
+ /*
+ * Now call Objects_Get()
+ */
+
+ return (POSIX_Mutex_Control *)
+ _Objects_Get( &_POSIX_Mutex_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Mutex_Is_null (
+ POSIX_Mutex_Control *the_mutex
+)
+{
+ return !the_mutex;
+}
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/inline/rtems/posix/priority.inl b/cpukit/posix/inline/rtems/posix/priority.inl
new file mode 100644
index 0000000000..dc8187d4ef
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/priority.inl
@@ -0,0 +1,37 @@
+/*
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_PRIORITY_inl
+#define __RTEMS_POSIX_PRIORITY_inl
+
+/*
+ * 1003.1b-1993,2.2.2.80 definition of priority, p. 19
+ *
+ * "Numericallly higher values represent higher priorities."
+ *
+ * Thus, RTEMS Core has priorities run in the opposite sense of the POSIX API.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Priority_Is_valid(
+ int priority
+)
+{
+ return (boolean) (priority >= 1 && priority <= 254);
+}
+
+RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core(
+ int priority
+)
+{
+ return (Priority_Control) (255 - priority);
+}
+
+RTEMS_INLINE_ROUTINE int _POSIX_Priority_From_core(
+ Priority_Control priority
+)
+{
+ return 255 - priority;
+}
+
+#endif
diff --git a/cpukit/posix/inline/rtems/posix/pthread.inl b/cpukit/posix/inline/rtems/posix/pthread.inl
new file mode 100644
index 0000000000..9a37cd1f55
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/pthread.inl
@@ -0,0 +1,70 @@
+/* rtems/posix/pthread.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX threads.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_THREADS_inl
+#define __RTEMS_POSIX_THREADS_inl
+
+/*PAGE
+ *
+ * _POSIX_Threads_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free (
+ Thread_Control *the_pthread
+)
+{
+ _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Get
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get (
+ pthread_t id,
+ Objects_Locations *location
+)
+{
+ return (Thread_Control *)
+ _Objects_Get( &_POSIX_Threads_Information, (Objects_Id)id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Threads_Is_null (
+ Thread_Control *the_pthread
+)
+{
+ return !the_pthread;
+}
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/inline/rtems/posix/semaphore.inl b/cpukit/posix/inline/rtems/posix/semaphore.inl
new file mode 100644
index 0000000000..83dcaf65ca
--- /dev/null
+++ b/cpukit/posix/inline/rtems/posix/semaphore.inl
@@ -0,0 +1,71 @@
+/* rtems/posix/semaphore.inl
+ *
+ * This include file contains the static inline implementation of the private
+ * inlined routines for POSIX Semaphores.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_POSIX_SEMAPHORE_inl
+#define __RTEMS_POSIX_SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Allocate
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void )
+{
+ return (POSIX_Semaphore_Control *)
+ _Objects_Allocate( &_POSIX_Semaphore_Information );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Free
+ */
+
+RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Free (
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ _Objects_Free( &_POSIX_Semaphore_Information, &the_semaphore->Object );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Get
+ */
+
+RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get (
+ Objects_Id *id,
+ Objects_Locations *location
+)
+{
+ return (POSIX_Semaphore_Control *)
+ _Objects_Get( &_POSIX_Semaphore_Information, *id, location );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Is_null
+ */
+
+RTEMS_INLINE_ROUTINE boolean _POSIX_Semaphore_Is_null (
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ return !the_semaphore;
+}
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/posix/src/adasupp.c b/cpukit/posix/src/adasupp.c
new file mode 100644
index 0000000000..234b0c2a40
--- /dev/null
+++ b/cpukit/posix/src/adasupp.c
@@ -0,0 +1,28 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include <rtems/system.h>
+#include <rtems/posix/pthread.h>
+
+/*PAGE
+ *
+ * _ada_pthread_minimum_stack_size
+ *
+ * This routine returns the minimum stack size so the GNAT RTS can
+ * allocate enough stack for Ada tasks.
+ */
+
+size_t _ada_pthread_minimum_stack_size( void )
+{
+ /*
+ * Eventually this may need to include a per cpu family calculation
+ * but for now, this will do.
+ */
+
+ return PTHREAD_MINIMUM_STACK_SIZE * 2;
+}
diff --git a/cpukit/posix/src/aio.c b/cpukit/posix/src/aio.c
new file mode 100644
index 0000000000..9fc072f820
--- /dev/null
+++ b/cpukit/posix/src/aio.c
@@ -0,0 +1,111 @@
+/*
+ * $Id$
+ */
+
+#include <aio.h>
+
+#include <rtems/system.h>
+
+/*PAGE
+ *
+ * 6.7.2 Asynchronous Read, P1003.1b-1993, p. 154
+ */
+
+int aio_read(
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.3 Asynchronous Write, P1003.1b-1993, p. 155
+ */
+
+int aio_write(
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.4 List Directed I/O, P1003.1b-1993, p. 158
+ */
+
+int lio_listio(
+ int mode,
+ struct aiocb * const list[],
+ int nent,
+ struct sigevent *sig
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.5 Retrieve Error of Asynchronous I/O Operation, P1003.1b-1993, p. 161
+ */
+
+int aio_error(
+ const struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.6 Retrieve Return Status of Asynchronous I/O Operation,
+ * P1003.1b-1993, p. 162
+ */
+
+int aio_return(
+ const struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.7 Cancel Asynchronous I/O Operation, P1003.1b-1993, p. 163
+ */
+
+int aio_cancel(
+ int filedes,
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.7 Wait for Asynchronous I/O Request, P1003.1b-1993, p. 164
+ */
+
+int aio_suspend(
+ struct aiocb * const list[],
+ int nent,
+ const struct timespec *timeout
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 6.7.9 Asynchronous File Synchronization, P1003.1b-1993, p. 166
+ */
+
+int aio_fsync(
+ int op,
+ struct aiocb *aiocbp
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/cpukit/posix/src/cancel.c b/cpukit/posix/src/cancel.c
new file mode 100644
index 0000000000..b6cc073456
--- /dev/null
+++ b/cpukit/posix/src/cancel.c
@@ -0,0 +1,228 @@
+/*
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/cancel.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/threadsup.h>
+
+/*PAGE
+ *
+ * POSIX_Thread_cancel_run
+ *
+ */
+
+void POSIX_Thread_cancel_run(
+ Thread_Control *the_thread
+)
+{
+ int old_cancel_state;
+ POSIX_Cancel_Handler_control *handler;
+ Chain_Control *handler_stack;
+ POSIX_API_Thread_Support_Control *thread_support;
+ ISR_Level level;
+
+ thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ handler_stack = &thread_support->Cancellation_Handlers;
+
+ old_cancel_state = thread_support->cancelability_state;
+
+ thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE;
+
+ while ( !_Chain_Is_empty( handler_stack ) ) {
+ _ISR_Disable( level );
+ handler = (POSIX_Cancel_Handler_control *) _Chain_Tail( handler_stack );
+ _Chain_Extract_unprotected( &handler->Node );
+ _ISR_Enable( level );
+
+ (*handler->routine)( handler->arg );
+
+ _Workspace_Free( handler );
+ }
+
+ thread_support->cancelation_requested = 0;
+
+ thread_support->cancelability_state = old_cancel_state;
+}
+
+/*PAGE
+ *
+ * 18.2.1 Canceling Execution of a Thread, P1003.1c/Draft 10, p. 181
+ */
+
+int pthread_cancel(
+ pthread_t thread
+)
+{
+ Thread_Control *the_thread;
+ POSIX_API_Thread_Support_Control *thread_support;
+ Objects_Locations location;
+
+ the_thread = _POSIX_Threads_Get( &thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return POSIX_MP_NOT_IMPLEMENTED();
+ case OBJECTS_LOCAL:
+ thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ thread_support->cancelation_requested = 1;
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+int pthread_setcancelstate(
+ int state,
+ int *oldstate
+)
+{
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ if ( !oldstate )
+ return EINVAL;
+
+ if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE )
+ return EINVAL;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ *oldstate = thread_support->cancelability_state;
+ thread_support->cancelability_state = state;
+
+ if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
+ thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
+ thread_support->cancelation_requested )
+ POSIX_Thread_cancel_run( _Thread_Executing );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+int pthread_setcanceltype(
+ int type,
+ int *oldtype
+)
+{
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ if ( !oldtype )
+ return EINVAL;
+
+ if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS )
+ return EINVAL;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ *oldtype = thread_support->cancelability_type;
+ thread_support->cancelability_type = type;
+
+ if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
+ thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS &&
+ thread_support->cancelation_requested )
+ POSIX_Thread_cancel_run( _Thread_Executing );
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183
+ */
+
+void pthread_testcancel( void )
+{
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE &&
+ thread_support->cancelation_requested )
+ POSIX_Thread_cancel_run( _Thread_Executing );
+}
+
+/*PAGE
+ *
+ * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184
+ */
+
+void pthread_cleanup_push(
+ void (*routine)( void * ),
+ void *arg
+)
+{
+ POSIX_Cancel_Handler_control *handler;
+ Chain_Control *handler_stack;
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ if ( !routine )
+ return; /* XXX what to do really? */
+
+ handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) );
+
+ if ( !handler )
+ return; /* XXX what to do really? */
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ handler_stack = &thread_support->Cancellation_Handlers;
+
+ handler->routine = routine;
+ handler->arg = arg;
+
+ _Chain_Append( handler_stack, &handler->Node );
+}
+
+/*PAGE
+ *
+ * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184
+ */
+
+void pthread_cleanup_pop(
+ int execute
+)
+{
+ POSIX_Cancel_Handler_control *handler;
+ Chain_Control *handler_stack;
+ POSIX_API_Thread_Support_Control *thread_support;
+ ISR_Level level;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ handler_stack = &thread_support->Cancellation_Handlers;
+
+ if ( _Chain_Is_empty( handler_stack ) )
+ return;
+
+ _ISR_Disable( level );
+ handler = (POSIX_Cancel_Handler_control *) _Chain_Tail( handler_stack );
+ _Chain_Extract_unprotected( &handler->Node );
+ _ISR_Enable( level );
+
+ if ( execute )
+ (*handler->routine)( handler->arg );
+
+ _Workspace_Free( handler );
+}
diff --git a/cpukit/posix/src/cond.c b/cpukit/posix/src/cond.c
new file mode 100644
index 0000000000..de2e252b95
--- /dev/null
+++ b/cpukit/posix/src/cond.c
@@ -0,0 +1,501 @@
+/*
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/posix/cond.h>
+#include <rtems/posix/time.h>
+#include <rtems/posix/mutex.h>
+
+/*
+ * TEMPORARY
+ */
+
+void _POSIX_Condition_variables_MP_Send_process_packet (
+ POSIX_Condition_variables_MP_Remote_operations operation,
+ Objects_Id condition_variables_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+void _POSIX_Condition_variables_MP_Send_extract_proxy(
+ Thread_Control *the_thread
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+/*
+ * END OF TEMPORARY
+ */
+
+/*PAGE
+ *
+ * The default condition variable attributes structure.
+ */
+
+const pthread_condattr_t _POSIX_Condition_variables_Default_attributes = {
+ TRUE, /* is_initialized */
+ PTHREAD_PROCESS_PRIVATE /* process_shared */
+};
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Manager_initialization
+ *
+ * This routine initializes all condition variable manager related data
+ * structures.
+ *
+ * Input parameters:
+ * maximum_condition_variables - maximum configured condition_variables
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Condition_variables_Manager_initialization(
+ unsigned32 maximum_condition_variables
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Condition_variables_Information,
+ OBJECTS_POSIX_CONDITION_VARIABLES,
+ TRUE,
+ maximum_condition_variables,
+ sizeof( POSIX_Condition_variables_Control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_init(
+ pthread_condattr_t *attr
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *attr = _POSIX_Condition_variables_Default_attributes;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_destroy(
+ pthread_condattr_t *attr
+)
+{
+ if ( !attr || attr->is_initialized == FALSE )
+ return EINVAL;
+
+ attr->is_initialized = FALSE;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_getpshared(
+ const pthread_condattr_t *attr,
+ int *pshared
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *pshared = attr->process_shared;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.1 Condition Variable Initialization Attributes,
+ * P1003.1c/Draft 10, p. 96
+ */
+
+int pthread_condattr_setpshared(
+ pthread_condattr_t *attr,
+ int pshared
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ switch ( pshared ) {
+ case PTHREAD_PROCESS_SHARED:
+ case PTHREAD_PROCESS_PRIVATE:
+ attr->process_shared = pshared;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 11.4.2 Initializing and Destroying a Condition Variable,
+ * P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_cond_init(
+ pthread_cond_t *cond,
+ const pthread_condattr_t *attr
+)
+{
+ POSIX_Condition_variables_Control *the_cond;
+ const pthread_condattr_t *the_attr;
+
+ if ( attr ) the_attr = attr;
+ else the_attr = &_POSIX_Condition_variables_Default_attributes;
+
+ /*
+ * XXX: Be careful about attributes when global!!!
+ */
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ return POSIX_MP_NOT_IMPLEMENTED();
+
+ if ( !the_attr->is_initialized )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ the_cond = _POSIX_Condition_variables_Allocate();
+
+ if ( !the_cond ) {
+ _Thread_Enable_dispatch();
+ return ENOMEM;
+ }
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Condition_variables_Information,
+ 0, the_cond->Object.id, FALSE ) ) ) {
+ _POSIX_Condition_variables_Free( the_cond );
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ the_cond->process_shared = the_attr->process_shared;
+
+ the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
+
+/* XXX some more initialization might need to go here */
+ _Thread_queue_Initialize(
+ &the_cond->Wait_queue,
+ OBJECTS_POSIX_CONDITION_VARIABLES,
+ THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_CONDITION_VARIABLE,
+ _POSIX_Condition_variables_MP_Send_extract_proxy,
+ ETIMEDOUT
+ );
+
+ _Objects_Open(
+ &_POSIX_Condition_variables_Information,
+ &the_cond->Object,
+ 0
+ );
+
+ *cond = the_cond->Object.id;
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Condition_variables_MP_Send_process_packet(
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_CREATE,
+ the_cond->Object.id,
+ 0, /* Name not used */
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.4.2 Initializing and Destroying a Condition Variable,
+ * P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_cond_destroy(
+ pthread_cond_t *cond
+)
+{
+ register POSIX_Condition_variables_Control *the_cond;
+ Objects_Locations location;
+
+ the_cond = _POSIX_Condition_variables_Get( cond, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+
+ if ( _Thread_queue_First( &the_cond->Wait_queue ) ) {
+ _Thread_Enable_dispatch();
+ return EBUSY;
+ }
+
+ _Objects_Close(
+ &_POSIX_Condition_variables_Information,
+ &the_cond->Object
+ );
+
+ _POSIX_Condition_variables_Free( the_cond );
+
+ if ( the_cond->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Condition_variables_Information,
+ the_cond->Object.id
+ );
+
+ _POSIX_Condition_variables_MP_Send_process_packet(
+ POSIX_CONDITION_VARIABLES_MP_ANNOUNCE_DELETE,
+ the_cond->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Signal_support
+ *
+ * A support routine which implements guts of the broadcast and single task
+ * wake up version of the "signal" operation.
+ */
+
+int _POSIX_Condition_variables_Signal_support(
+ pthread_cond_t *cond,
+ boolean is_broadcast
+)
+{
+ register POSIX_Condition_variables_Control *the_cond;
+ Objects_Locations location;
+ Thread_Control *the_thread;
+
+ the_cond = _POSIX_Condition_variables_Get( cond, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+
+ do {
+ the_thread = _Thread_queue_Dequeue( &the_cond->Wait_queue );
+ if ( !the_thread )
+ the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX;
+ } while ( is_broadcast && the_thread );
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.4.3 Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101
+ */
+
+int pthread_cond_signal(
+ pthread_cond_t *cond
+)
+{
+ return _POSIX_Condition_variables_Signal_support( cond, FALSE );
+}
+
+/*PAGE
+ *
+ * 11.4.3 Broadcasting and Signaling a Condition, P1003.1c/Draft 10, p. 101
+ */
+
+int pthread_cond_broadcast(
+ pthread_cond_t *cond
+)
+{
+ return _POSIX_Condition_variables_Signal_support( cond, TRUE );
+}
+
+/*PAGE
+ *
+ * _POSIX_Condition_variables_Wait_support
+ *
+ * A support routine which implements guts of the blocking, non-blocking, and
+ * timed wait version of condition variable wait routines.
+ */
+
+int _POSIX_Condition_variables_Wait_support(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ Watchdog_Interval timeout,
+ boolean already_timedout
+)
+{
+ register POSIX_Condition_variables_Control *the_cond;
+ Objects_Locations location;
+ int status;
+ int mutex_status;
+
+ if ( !_POSIX_Mutex_Get( mutex, &location ) ) {
+ return EINVAL;
+ }
+
+ _Thread_Unnest_dispatch();
+
+ the_cond = _POSIX_Condition_variables_Get( cond, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+
+ if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ (void) pthread_mutex_unlock( mutex );
+/* XXX ignore this for now since behavior is undefined
+ if ( mutex_status ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+*/
+
+ if ( !already_timedout ) {
+ the_cond->Mutex = *mutex;
+
+ _Thread_queue_Enter_critical_section( &the_cond->Wait_queue );
+ _Thread_Executing->Wait.return_code = 0;
+ _Thread_Executing->Wait.queue = &the_cond->Wait_queue;
+ _Thread_Executing->Wait.id = *cond;
+
+ _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout );
+
+ _Thread_Enable_dispatch();
+
+ /*
+ * Switch ourself out because we blocked as a result of the
+ * _Thread_queue_Enqueue.
+ */
+
+ status = _Thread_Executing->Wait.return_code;
+ if ( status && status != ETIMEDOUT )
+ return status;
+
+ }
+ else
+ status = ETIMEDOUT;
+
+ /*
+ * When we get here the dispatch disable level is 0.
+ */
+
+ mutex_status = pthread_mutex_lock( mutex );
+ if ( mutex_status )
+ return EINVAL;
+
+ return status;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.4.4 Waiting on a Condition, P1003.1c/Draft 10, p. 105
+ */
+
+int pthread_cond_wait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex
+)
+{
+ return _POSIX_Condition_variables_Wait_support(
+ cond,
+ mutex,
+ THREAD_QUEUE_WAIT_FOREVER,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 11.4.4 Waiting on a Condition, P1003.1c/Draft 10, p. 105
+ */
+
+int pthread_cond_timedwait(
+ pthread_cond_t *cond,
+ pthread_mutex_t *mutex,
+ const struct timespec *abstime
+)
+{
+ Watchdog_Interval timeout;
+ struct timespec current_time;
+ struct timespec difference;
+ boolean already_timedout = FALSE;
+
+ if ( !abstime )
+ return EINVAL;
+
+ /*
+ * The abstime is a walltime. We turn it into an interval.
+ */
+
+ (void) clock_gettime( CLOCK_REALTIME, &current_time );
+
+ /* XXX probably some error checking should go here */
+
+ _POSIX_Timespec_subtract( &current_time, abstime, &difference );
+
+ if ( ( difference.tv_sec < 0 ) || ( ( difference.tv_sec == 0 ) &&
+ ( difference.tv_nsec < 0 ) ) )
+ already_timedout = TRUE;
+
+ timeout = _POSIX_Timespec_to_interval( &difference );
+
+ return _POSIX_Condition_variables_Wait_support(
+ cond,
+ mutex,
+ timeout,
+ already_timedout
+ );
+}
diff --git a/cpukit/posix/src/devctl.c b/cpukit/posix/src/devctl.c
new file mode 100644
index 0000000000..699bc2d228
--- /dev/null
+++ b/cpukit/posix/src/devctl.c
@@ -0,0 +1,22 @@
+/*
+ * $Id$
+ */
+
+#include <devctl.h>
+
+#include <rtems/system.h>
+
+/*PAGE
+ *
+ * 21.2.1 Control a Device, P1003.4b/D8, p. 65
+ */
+
+int devctl(
+ int filedes,
+ void *dev_data_ptr,
+ size_t nbyte,
+ int *dev_info_ptr
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/cpukit/posix/src/getpid.c b/cpukit/posix/src/getpid.c
new file mode 100644
index 0000000000..b42981398a
--- /dev/null
+++ b/cpukit/posix/src/getpid.c
@@ -0,0 +1,22 @@
+/*
+ * $Id$
+ */
+
+#include <limits.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/seterr.h>
+
+/*PAGE
+ *
+ * 4.1.1 Get Process and Parent Process IDs, P1003.1b-1993, p. 83
+ */
+
+pid_t getpid( void )
+{
+ return _Objects_Local_node;
+}
diff --git a/cpukit/posix/src/intr.c b/cpukit/posix/src/intr.c
new file mode 100644
index 0000000000..5d41a5fe52
--- /dev/null
+++ b/cpukit/posix/src/intr.c
@@ -0,0 +1,340 @@
+/*
+ * NOTE: Each task has an interrupt semaphore associated with it.
+ * No matter which interrupt occurs that it has registered,
+ * the same semaphore is used.
+ *
+ * This whole interrupt scheme may have been eliminated in a later draft.
+ *
+ * $Id$
+ */
+
+#include <errno.h>
+#include <intr.h>
+#include <pthread.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/posix/intr.h>
+#include <rtems/posix/time.h>
+#include <rtems/posix/threadsup.h>
+
+/*
+ * _POSIX_Interrupt_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Interrupt_Manager_initialization(
+ unsigned32 maximum_interrupt_handlers
+)
+{
+ unsigned32 index;
+ POSIX_Interrupt_Control *the_vector;
+
+ _Objects_Initialize_information(
+ &_POSIX_Interrupt_Handlers_Information,
+ OBJECTS_POSIX_INTERRUPTS,
+ FALSE,
+ maximum_interrupt_handlers,
+ sizeof( POSIX_Interrupt_Handler_control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+
+ for ( index=0 ; index < CPU_INTERRUPT_NUMBER_OF_VECTORS ; index++ ) {
+ the_vector = &_POSIX_Interrupt_Information[ index ];
+
+ the_vector->number_installed = 0;
+ the_vector->lock_count = 0;
+ the_vector->deferred_count = 0;
+ _Chain_Initialize_empty( &the_vector->Handlers );
+ }
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_capture(
+ intr_t intr,
+ int (*intr_handler)( void *area ),
+ volatile void *area,
+ size_t areasize
+)
+{
+ POSIX_Interrupt_Handler_control *the_intr;
+ POSIX_Interrupt_Control *the_vector;
+ POSIX_API_Thread_Support_Control *thread_support;
+ proc_ptr old_handler;
+
+ if ( !_ISR_Is_vector_number_valid( intr ) ||
+ !_ISR_Is_valid_user_handler( intr_handler ) )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ the_intr = _POSIX_Interrupt_Allocate();
+
+ if ( !the_intr ) {
+ _Thread_Enable_dispatch();
+ return ENOMEM;
+ }
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ the_intr->vector = intr;
+ the_intr->handler = intr_handler;
+ the_intr->user_data_area = area;
+ the_intr->server = _Thread_Executing;
+ the_intr->is_active = TRUE;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ thread_support->interrupts_installed++;
+
+/* XXX should we malloc the semaphore on the fly??? if so we probably need to
+ release it when the thread has released all interrupts and keep
+ a count of how many it has installed. CURRENTLY NO.. ALLOCATED w/TCB
+*/
+
+ /*
+ * This is sufficient to have the handlers invoked in the opposite
+ * order of installation. The loop invoking them can then go from
+ * the front of the list to the end.
+ */
+
+ _Chain_Prepend( &the_vector->Handlers, &the_intr->Object.Node );
+
+ if ( !the_vector->number_installed++ )
+ _ISR_Install_vector(
+ intr,
+ (proc_ptr) _POSIX_Interrupt_Handler,
+ &old_handler
+ );
+
+ _Objects_Open( &_POSIX_Interrupt_Handlers_Information, &the_intr->Object, 0 );
+
+ /*
+ * Normally, an Id would be returned here.
+ */
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_release(
+ intr_t intr,
+ int (*intr_handler)( void *area )
+)
+{
+ boolean found;
+ POSIX_Interrupt_Handler_control *the_intr;
+ POSIX_Interrupt_Control *the_vector;
+ POSIX_API_Thread_Support_Control *thread_support;
+ Chain_Node *the_node;
+
+ if ( !_ISR_Is_valid_user_handler( intr_handler ) )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Since interrupt handlers do not have a user visible id, there is
+ * no choice but to search the entire set of active interrupt handlers
+ * to find this one.
+ */
+
+ found = FALSE;
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ the_node = _Chain_Head( &the_vector->Handlers );
+
+ for ( ; !_Chain_Is_tail( &the_vector->Handlers, the_node ) ; ) {
+ the_intr = (POSIX_Interrupt_Handler_control *) the_node;
+
+ if ( the_intr->handler == intr_handler ) {
+ found = TRUE;
+ break;
+ }
+ the_node = the_node->next;
+ }
+
+ if ( !found ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ if ( !_Thread_Is_executing( the_intr->server ) ) {
+ _Thread_Enable_dispatch();
+ return EINVAL; /* XXX should be ENOISR; */
+ }
+
+ /*
+ * OK now we have found the interrupt handler and can do some work.
+ */
+
+ _Chain_Extract( &the_intr->Object.Node );
+
+ the_intr->is_active = FALSE;
+
+ the_vector->number_installed -= 1;
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ thread_support->interrupts_installed--;
+
+ /*
+ * It is unnecessary to flush the semaphore since the handler can only
+ * be "removed" by the thread which installed it. Thus it cannot be
+ * blocked on the semaphore or it would not be executing this routine.
+ */
+
+ _Objects_Close( &_POSIX_Interrupt_Handlers_Information, &the_intr->Object );
+
+ _POSIX_Interrupt_Free( the_intr );
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_lock(
+ intr_t intr
+)
+{
+ POSIX_Interrupt_Control *the_vector;
+
+ _Thread_Disable_dispatch();
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ the_vector->lock_count++;
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 22.3.1 Associate a User-Written ISR with an Interrupt, P1003.4b/D8, p. 74
+ */
+
+int intr_unlock(
+ intr_t intr
+)
+{
+ POSIX_Interrupt_Control *the_vector;
+
+ _Thread_Disable_dispatch();
+
+ the_vector = &_POSIX_Interrupt_Information[ intr ];
+
+ if ( !--the_vector->lock_count ) {
+ while ( --the_vector->deferred_count ) {
+ _POSIX_Interrupt_Handler( intr );
+ }
+ }
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*
+ * 22.3.2 Await Interrupt Notification, P1003.4b/D8, p. 76
+ */
+
+int intr_timed_wait(
+ int flags,
+ const struct timespec *timeout
+)
+{
+ Watchdog_Interval ticks;
+ POSIX_API_Thread_Support_Control *thread_support;
+
+ ticks = _POSIX_Timespec_to_interval( timeout );
+
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ _Thread_Disable_dispatch();
+
+ _CORE_semaphore_Seize(
+ &thread_support->Interrupt_Semaphore,
+ 0, /* XXX does id=0 hurt in this case? */
+ TRUE,
+ ticks
+ );
+ _Thread_Enable_dispatch();
+
+ return _Thread_Executing->Wait.return_code; /* XXX should be POSIX */
+}
+
+/*PAGE
+ *
+ * _POSIX_Interrupt_Handler
+ *
+ */
+
+void _POSIX_Interrupt_Handler(
+ ISR_Vector_number vector
+)
+{
+ POSIX_Interrupt_Handler_control *the_intr;
+ POSIX_Interrupt_Control *the_vector;
+ POSIX_API_Thread_Support_Control *thread_support;
+ Chain_Node *the_node;
+ int status;
+
+ the_vector = &_POSIX_Interrupt_Information[ vector ];
+
+ the_node = _Chain_Head( &the_vector->Handlers );
+
+ for ( ; !_Chain_Is_tail( &the_vector->Handlers, the_node ) ; ) {
+ the_intr = (POSIX_Interrupt_Handler_control *) the_node;
+
+ status = (*the_intr->handler)( (void *) the_intr->user_data_area );
+
+ switch ( status ) {
+ case INTR_HANDLED_NOTIFY:
+ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ _CORE_semaphore_Surrender(
+ &thread_support->Interrupt_Semaphore,
+ 0, /* XXX is id=0 a problem */
+ 0 /* XXX is this a problem (mp support)*/
+ );
+ return;
+
+ case INTR_HANDLED_DO_NOT_NOTIFY:
+ return;
+
+ case INTR_NOT_HANDLED:
+ default: /* this should not happen */
+ break;
+ }
+ the_node = the_node->next;
+ }
+
+ /* XXX
+ *
+ * This is an unhandled interrupt!!!
+ */
+}
diff --git a/cpukit/posix/src/key.c b/cpukit/posix/src/key.c
new file mode 100644
index 0000000000..1203343f66
--- /dev/null
+++ b/cpukit/posix/src/key.c
@@ -0,0 +1,262 @@
+/*
+ * $Id$
+ */
+
+#include <errno.h>
+#include <limits.h>
+#include <pthread.h>
+#include <string.h>
+
+#include <rtems/system.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/key.h>
+
+/*
+ * _POSIX_Key_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _POSIX_Key_Manager_initialization(
+ unsigned32 maximum_keys
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Keys_Information,
+ OBJECTS_POSIX_KEYS,
+ FALSE,
+ maximum_keys,
+ sizeof( POSIX_Keys_Control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163
+ */
+
+int pthread_key_create(
+ pthread_key_t *key,
+ void (*destructor)( void * )
+)
+{
+ POSIX_Keys_Control *the_key;
+ void *table;
+ unsigned32 the_class;
+ unsigned32 bytes_to_allocate;
+
+
+ _Thread_Disable_dispatch();
+
+ the_key = _POSIX_Keys_Allocate();
+
+ if ( !the_key ) {
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ the_key->destructor = destructor;
+
+ for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;
+ the_class++ ) {
+
+ bytes_to_allocate =
+ (_Objects_Information_table[ the_class ]->maximum + 1) * sizeof( void * );
+
+ table = _Workspace_Allocate( bytes_to_allocate );
+
+ if ( !table ) {
+ for ( --the_class;
+ the_class >= OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class-- )
+ _Workspace_Free( the_key->Values[ the_class ] );
+
+ _POSIX_Keys_Free( the_key );
+ _Thread_Enable_dispatch();
+ return ENOMEM;
+ }
+
+ the_key->Values[ the_class ] = table;
+ memset( table, '\0', bytes_to_allocate );
+ }
+
+ the_key->is_active = TRUE;
+
+ _Objects_Open( &_POSIX_Keys_Information, &the_key->Object, 0 );
+
+ *key = the_key->Object.id;
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
+ */
+
+int pthread_setspecific(
+ pthread_key_t key,
+ const void *value
+)
+{
+ register POSIX_Keys_Control *the_key;
+ unsigned32 index;
+ unsigned32 class;
+ Objects_Locations location;
+
+ the_key = _POSIX_Keys_Get( key, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never happen */
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ index = _Objects_Get_index( _Thread_Executing->Object.id );
+ class = _Objects_Get_class( _Thread_Executing->Object.id );
+ the_key->Values[ class ][ index ] = (void *) value;
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165
+ */
+
+void *pthread_getspecific(
+ pthread_key_t key
+)
+{
+ register POSIX_Keys_Control *the_key;
+ unsigned32 index;
+ unsigned32 class;
+ Objects_Locations location;
+ void *key_data;
+
+ the_key = _POSIX_Keys_Get( key, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never happen */
+ return NULL;
+ case OBJECTS_LOCAL:
+ index = _Objects_Get_index( _Thread_Executing->Object.id );
+ class = _Objects_Get_class( _Thread_Executing->Object.id );
+ key_data = (void *) the_key->Values[ class ][ index ];
+ _Thread_Enable_dispatch();
+ return key_data;
+ }
+ return (void *) POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167
+ */
+
+int pthread_key_delete(
+ pthread_key_t key
+)
+{
+ register POSIX_Keys_Control *the_key;
+ Objects_Locations location;
+ unsigned32 the_class;
+
+ the_key = _POSIX_Keys_Get( key, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never happen */
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ _Objects_Close( &_POSIX_Keys_Information, &the_key->Object );
+
+ the_key->is_active = FALSE;
+
+ for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;
+ the_class++ )
+ _Workspace_Free( the_key->Values[ the_class ] );
+
+ /*
+ * NOTE: The destructor is not called and it is the responsibility
+ * of the application to free the memory.
+ */
+
+ _POSIX_Keys_Free( the_key );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Keys_Run_destructors
+ *
+ * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163
+ *
+ * NOTE: This is the routine executed when a thread exits to
+ * run through all the keys and do the destructor action.
+ */
+
+void _POSIX_Keys_Run_destructors(
+ Thread_Control *thread
+)
+{
+ unsigned32 index;
+ unsigned32 pthread_index;
+ unsigned32 pthread_class;
+ unsigned32 iterations;
+ boolean are_all_null;
+ POSIX_Keys_Control *the_key;
+ void *value;
+
+ pthread_index = _Objects_Get_index( thread->Object.id );
+ pthread_class = _Objects_Get_class( thread->Object.id );
+
+ iterations = 0;
+
+ for ( ; ; ) {
+
+ are_all_null = TRUE;
+
+ for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) {
+
+ the_key = (POSIX_Keys_Control *)
+ _POSIX_Keys_Information.local_table[ index ];
+
+ if ( the_key && the_key->is_active && the_key->destructor ) {
+ value = the_key->Values[ pthread_class ][ pthread_index ];
+ if ( value ) {
+ (*the_key->destructor)( value );
+ if ( the_key->Values[ pthread_class ][ pthread_index ] )
+ are_all_null = FALSE;
+ }
+ }
+ }
+
+ if ( are_all_null == TRUE )
+ return;
+
+ iterations++;
+
+ /*
+ * The standard allows one to not do this and thus go into an infinite
+ * loop. It seems rude to unnecessarily lock up a system.
+ *
+ * Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.
+ */
+
+ if ( iterations >= PTHREAD_DESTRUCTOR_ITERATIONS )
+ return;
+ }
+}
diff --git a/cpukit/posix/src/mqueue.c b/cpukit/posix/src/mqueue.c
new file mode 100644
index 0000000000..82da4ee706
--- /dev/null
+++ b/cpukit/posix/src/mqueue.c
@@ -0,0 +1,710 @@
+/*
+ * NOTE: The structure of the routines is identical to that of POSIX
+ * Message_queues to leave the option of having unnamed message
+ * queues at a future date. They are currently not part of the
+ * POSIX standard but unnamed message_queues are. This is also
+ * the reason for the apparently unnecessary tracking of
+ * the process_shared attribute. [In addition to the fact that
+ * it would be trivial to add pshared to the mq_attr structure
+ * and have process private message queues.]
+ *
+ * This code ignores the O_RDONLY/O_WRONLY/O_RDWR flag at open
+ * time.
+ *
+ * $Id$
+ */
+
+#include <stdarg.h>
+
+#include <pthread.h>
+#include <limits.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <mqueue.h>
+
+#include <rtems/system.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/mqueue.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Manager_initialization
+ *
+ * This routine initializes all message_queue manager related data structures.
+ *
+ * Input parameters:
+ * maximum_message_queues - maximum configured message_queues
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Message_queue_Information,
+ OBJECTS_POSIX_MESSAGE_QUEUES,
+ TRUE,
+ maximum_message_queues,
+ sizeof( POSIX_Message_queue_Control ),
+ TRUE,
+ _POSIX_PATH_MAX,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Create_support
+ */
+
+int _POSIX_Message_queue_Create_support(
+ const char *name,
+ int pshared,
+ unsigned int oflag,
+ struct mq_attr *attr,
+ POSIX_Message_queue_Control **message_queue
+)
+{
+ POSIX_Message_queue_Control *the_mq;
+
+ _Thread_Disable_dispatch();
+
+ the_mq = _POSIX_Message_queue_Allocate();
+
+ if ( !the_mq ) {
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENFILE );
+ }
+
+ if ( pshared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Message_queue_Information, 0,
+ the_mq->Object.id, FALSE ) ) ) {
+ _POSIX_Message_queue_Free( the_mq );
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENFILE );
+ }
+
+ the_mq->process_shared = pshared;
+
+ if ( name ) {
+ the_mq->named = TRUE;
+ the_mq->open_count = 1;
+ the_mq->linked = TRUE;
+ }
+ else
+ the_mq->named = FALSE;
+
+ if ( oflag & O_NONBLOCK )
+ the_mq->blocking = FALSE;
+ else
+ the_mq->blocking = TRUE;
+
+ /* XXX
+ *
+ * Note that this should be based on the current scheduling policy.
+ */
+
+ /* XXX
+ *
+ * Message and waiting disciplines are not distinguished.
+ */
+/*
+ the_mq_attr->message_discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+ the_mq_attr->waiting_discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+ */
+
+ the_mq->Message_queue.Attributes.discipline =
+ CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+
+ if ( ! _CORE_message_queue_Initialize(
+ &the_mq->Message_queue,
+ OBJECTS_POSIX_MESSAGE_QUEUES,
+ &the_mq->Message_queue.Attributes,
+ attr->mq_maxmsg,
+ attr->mq_msgsize,
+ _POSIX_Message_queue_MP_Send_extract_proxy ) ) {
+
+ if ( pshared == PTHREAD_PROCESS_SHARED )
+ _Objects_MP_Close( &_POSIX_Message_queue_Information, the_mq->Object.id );
+
+ _POSIX_Message_queue_Free( the_mq );
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENOSPC );
+ }
+
+
+ /* XXX - need Names to be a string!!! */
+ _Objects_Open(
+ &_POSIX_Message_queue_Information,
+ &the_mq->Object,
+ (char *) name
+ );
+
+ *message_queue = the_mq;
+
+ if ( pshared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Message_queue_MP_Send_process_packet(
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_CREATE,
+ the_mq->Object.id,
+ (char *) name,
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 15.2.2 Open a Message Queue, P1003.1b-1993, p. 272
+ */
+
+mqd_t mq_open(
+ const char *name,
+ int oflag,
+ ...
+ /* mode_t mode, */
+ /* struct mq_attr attr */
+)
+{
+ va_list arg;
+ mode_t mode;
+ struct mq_attr *attr;
+ int status;
+ Objects_Id the_mq_id;
+ POSIX_Message_queue_Control *the_mq;
+
+ if ( oflag & O_CREAT ) {
+ va_start(arg, oflag);
+ mode = (mode_t) va_arg( arg, mode_t * );
+ attr = (struct mq_attr *) va_arg( arg, struct mq_attr ** );
+ va_end(arg);
+ }
+
+ status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
+
+ /*
+ * If the name to id translation worked, then the message queue exists
+ * and we can just return a pointer to the id. Otherwise we may
+ * need to check to see if this is a "message queue does not exist"
+ * or some other miscellaneous error on the name.
+ */
+
+ if ( status ) {
+
+ if ( status == EINVAL ) { /* name -> ID translation failed */
+ if ( !(oflag & O_CREAT) ) { /* willing to create it? */
+ seterrno( ENOENT );
+ return (mqd_t) -1;
+ }
+ /* we are willing to create it */
+ }
+ seterrno( status ); /* some type of error */
+ return (mqd_t) -1;
+
+ } else { /* name -> ID translation succeeded */
+
+ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
+ seterrno( EEXIST );
+ return (mqd_t) -1;
+ }
+
+ /*
+ * XXX In this case we need to do an ID->pointer conversion to
+ * check the mode. This is probably a good place for a subroutine.
+ */
+
+ the_mq->open_count += 1;
+
+ return (mqd_t)&the_mq->Object.id;
+
+ }
+
+ /* XXX verify this comment...
+ *
+ * At this point, the message queue does not exist and everything has been
+ * checked. We should go ahead and create a message queue.
+ */
+
+ status = _POSIX_Message_queue_Create_support(
+ name,
+ TRUE, /* shared across processes */
+ oflag,
+ attr,
+ &the_mq
+ );
+
+ if ( status == -1 )
+ return (mqd_t) -1;
+
+ return (mqd_t) &the_mq->Object.id;
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Delete
+ */
+
+void _POSIX_Message_queue_Delete(
+ POSIX_Message_queue_Control *the_mq
+)
+{
+ if ( !the_mq->linked && !the_mq->open_count ) {
+ _POSIX_Message_queue_Free( the_mq );
+
+ if ( the_mq->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Message_queue_Information,
+ the_mq->Object.id
+ );
+
+ _POSIX_Message_queue_MP_Send_process_packet(
+ POSIX_MESSAGE_QUEUE_MP_ANNOUNCE_DELETE,
+ the_mq->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+
+ }
+}
+
+/*PAGE
+ *
+ * 15.2.2 Close a Message Queue, P1003.1b-1993, p. 275
+ */
+
+int mq_close(
+ mqd_t mqdes
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ the_mq->open_count -= 1;
+ _POSIX_Message_queue_Delete( the_mq );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.2 Remove a Message Queue, P1003.1b-1993, p. 276
+ */
+
+int mq_unlink(
+ const char *name
+)
+{
+ int status;
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Id the_mq_id;
+ Objects_Locations location;
+
+ status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id );
+
+ if ( !status )
+ set_errno_and_return_minus_one( status );
+
+ the_mq = _POSIX_Message_queue_Get( the_mq_id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+
+ _Objects_MP_Close(
+ &_POSIX_Message_queue_Information,
+ the_mq->Object.id
+ );
+
+ the_mq->linked = FALSE;
+
+ _POSIX_Message_queue_Delete( the_mq );
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Send_support
+ */
+
+int _POSIX_Message_queue_Send_support(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ unsigned32 msg_len,
+ Priority_Control msg_prio,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /* XXX must add support for timeout and priority */
+ _CORE_message_queue_Send(
+ &the_mq->Message_queue,
+ (void *) msg_ptr,
+ msg_len,
+ mqdes,
+ NULL /* XXX _POSIX_Message_queue_Core_message_queue_mp_support*/
+ );
+ _Thread_Enable_dispatch();
+ return _Thread_Executing->Wait.return_code;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.4 Send a Message to a Message Queue, P1003.1b-1993, p. 277
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedsend().
+ */
+
+int mq_send(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio
+)
+{
+ return _POSIX_Message_queue_Send_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ THREAD_QUEUE_WAIT_FOREVER
+ );
+}
+
+/*PAGE
+ *
+ * 15.2.4 Send a Message to a Message Queue, P1003.1b-1993, p. 277
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedsend().
+ */
+
+int mq_timedsend(
+ mqd_t mqdes,
+ const char *msg_ptr,
+ size_t msg_len,
+ unsigned int msg_prio,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Message_queue_Send_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Receive_support
+ */
+
+/* XXX be careful ... watch the size going through all the layers ... */
+
+ssize_t _POSIX_Message_queue_Receive_support(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+ unsigned32 status = 0;
+ unsigned32 length_out;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /* XXX need to define the options argument to this */
+ length_out = msg_len;
+ _CORE_message_queue_Seize(
+ &the_mq->Message_queue,
+ mqdes,
+ msg_ptr,
+ &length_out,
+ /* msg_prio, XXXX */
+ the_mq->blocking,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ if ( !status )
+ return length_out;
+ /* XXX --- the return codes gotta be looked at .. fix this */
+ return _Thread_Executing->Wait.return_code;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.5 Receive a Message From a Message Queue, P1003.1b-1993, p. 279
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedreceive().
+ */
+
+ssize_t mq_receive(
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio
+)
+{
+ return _POSIX_Message_queue_Receive_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ THREAD_QUEUE_WAIT_FOREVER
+ );
+}
+
+/*PAGE
+ *
+ * 15.2.5 Receive a Message From a Message Queue, P1003.1b-1993, p. 279
+ *
+ * NOTE: P1003.4b/D8, p. 45 adds mq_timedreceive().
+ */
+
+int mq_timedreceive( /* XXX: should this be ssize_t */
+ mqd_t mqdes,
+ char *msg_ptr,
+ size_t msg_len,
+ unsigned int *msg_prio,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Message_queue_Receive_support(
+ mqdes,
+ msg_ptr,
+ msg_len,
+ msg_prio,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Message_queue_Notify_handler
+ *
+ */
+
+void _POSIX_Message_queue_Notify_handler(
+ void *user_data
+)
+{
+ POSIX_Message_queue_Control *the_mq;
+
+ the_mq = user_data;
+
+ /* XXX do something with signals here!!!! */
+}
+
+/*PAGE
+ *
+ * 15.2.6 Notify Process that a Message is Available on a Queue,
+ * P1003.1b-1993, p. 280
+ */
+
+int mq_notify(
+ mqd_t mqdes,
+ const struct sigevent *notification
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EBADF );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ if ( notification ) {
+ if ( _CORE_message_queue_Is_notify_enabled( &the_mq->Message_queue ) ) {
+ _Thread_Enable_dispatch();
+ seterrno( EBUSY );
+ return( -1 );
+ }
+
+ _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL );
+
+ the_mq->notification = *notification;
+
+ _CORE_message_queue_Set_notify(
+ &the_mq->Message_queue,
+ _POSIX_Message_queue_Notify_handler,
+ the_mq
+ );
+ } else {
+
+ _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL );
+
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.7 Set Message Queue Attributes, P1003.1b-1993, p. 281
+ */
+
+int mq_setattr(
+ mqd_t mqdes,
+ const struct mq_attr *mqstat,
+ struct mq_attr *omqstat
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+ CORE_message_queue_Attributes *the_mq_attr;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /*
+ * Return the old values.
+ */
+
+ /* XXX this is the same stuff as is in mq_getattr... and probably */
+ /* XXX should be in an inlined private routine */
+
+ the_mq_attr = &the_mq->Message_queue.Attributes;
+
+ omqstat->mq_flags = the_mq->flags;
+ omqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
+ omqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
+ omqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
+
+ /*
+ * Ignore everything except the O_NONBLOCK bit.
+ */
+
+ if ( mqstat->mq_flags & O_NONBLOCK )
+ the_mq->blocking = FALSE;
+ else
+ the_mq->blocking = TRUE;
+
+ the_mq->flags = mqstat->mq_flags;
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 15.2.8 Get Message Queue Attributes, P1003.1b-1993, p. 283
+ */
+
+int mq_getattr(
+ mqd_t mqdes,
+ struct mq_attr *mqstat
+)
+{
+ register POSIX_Message_queue_Control *the_mq;
+ Objects_Locations location;
+ CORE_message_queue_Attributes *the_mq_attr;
+
+ the_mq = _POSIX_Message_queue_Get( mqdes, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /*
+ * Return the old values.
+ */
+
+ /* XXX this is the same stuff as is in mq_setattr... and probably */
+ /* XXX should be in an inlined private routine */
+
+ the_mq_attr = &the_mq->Message_queue.Attributes;
+
+ mqstat->mq_flags = the_mq->flags;
+ mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size;
+ mqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages;
+ mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages;
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
diff --git a/cpukit/posix/src/mutex.c b/cpukit/posix/src/mutex.c
new file mode 100644
index 0000000000..037791a252
--- /dev/null
+++ b/cpukit/posix/src/mutex.c
@@ -0,0 +1,683 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+
+#include <rtems/system.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/mpci.h>
+#include <rtems/posix/mutex.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/time.h>
+
+/*
+ * TEMPORARY
+ */
+
+void _POSIX_Mutex_MP_Send_process_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ Objects_Name name,
+ Objects_Id proxy_id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+void _POSIX_Mutex_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+int _POSIX_Mutex_MP_Send_request_packet (
+ POSIX_Mutex_MP_Remote_operations operation,
+ Objects_Id mutex_id,
+ boolean wait, /* XXX options */
+ Watchdog_Interval timeout
+)
+{
+ return POSIX_MP_NOT_IMPLEMENTED();
+}
+
+void POSIX_Threads_mutex_MP_support(
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED(); /* XXX: should never get here */
+}
+
+/*
+ * END OF TEMPORARY
+ */
+
+/*PAGE
+ *
+ * The default mutex attributes structure.
+ */
+
+const pthread_mutexattr_t _POSIX_Mutex_Default_attributes = {
+ TRUE, /* is_initialized */
+ PTHREAD_PROCESS_PRIVATE, /* process_shared */
+ POSIX_SCHEDULER_MAXIMUM_PRIORITY, /* prio_ceiling */
+ PTHREAD_PRIO_NONE, /* protocol */
+ FALSE /* recursive */
+};
+
+/*PAGE
+ *
+ * _POSIX_Mutex_From_core_mutex_status
+ */
+
+int _POSIX_Mutex_From_core_mutex_status(
+ CORE_mutex_Status status
+)
+{
+ switch ( status ) {
+ case CORE_MUTEX_STATUS_SUCCESSFUL:
+ return 0;
+ case CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT:
+ return EBUSY;
+ case CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED:
+ return EDEADLK;
+ case CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE:
+ return EPERM;
+ case CORE_MUTEX_WAS_DELETED:
+ return EINVAL;
+ case CORE_MUTEX_TIMEOUT:
+ return EAGAIN;
+ case CORE_MUTEX_STATUS_CEILING_VIOLATED:
+ return EINVAL;
+ default:
+ break;
+ }
+ assert( 0 );
+ return 0;
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Manager_initialization
+ *
+ * This routine initializes all mutex manager related data structures.
+ *
+ * Input parameters:
+ * maximum_mutexes - maximum configured mutexes
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Mutex_Manager_initialization(
+ unsigned32 maximum_mutexes
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Mutex_Information,
+ OBJECTS_POSIX_MUTEXES,
+ TRUE,
+ maximum_mutexes,
+ sizeof( POSIX_Mutex_Control ),
+ FALSE,
+ 0,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_init(
+ pthread_mutexattr_t *attr
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *attr = _POSIX_Mutex_Default_attributes;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_destroy(
+ pthread_mutexattr_t *attr
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ attr->is_initialized = FALSE;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_getpshared(
+ const pthread_mutexattr_t *attr,
+ int *pshared
+)
+{
+ if ( !attr || !attr->is_initialized || !pshared )
+ return EINVAL;
+
+ *pshared = attr->process_shared;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.1 Mutex Initialization Attributes, P1003.1c/Draft 10, p. 81
+ */
+
+int pthread_mutexattr_setpshared(
+ pthread_mutexattr_t *attr,
+ int pshared
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( pshared ) {
+ case PTHREAD_PROCESS_SHARED:
+ case PTHREAD_PROCESS_PRIVATE:
+ attr->process_shared = pshared;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
+ *
+ * NOTE: XXX Could be optimized so all the attribute error checking
+ * is not performed when attr is NULL.
+ */
+
+int pthread_mutex_init(
+ pthread_mutex_t *mutex,
+ const pthread_mutexattr_t *attr
+)
+{
+ POSIX_Mutex_Control *the_mutex;
+ CORE_mutex_Attributes *the_mutex_attr;
+ const pthread_mutexattr_t *the_attr;
+ CORE_mutex_Disciplines the_discipline;
+ register POSIX_Mutex_Control *mutex_in_use;
+ Objects_Locations location;
+
+ if ( attr ) the_attr = attr;
+ else the_attr = &_POSIX_Mutex_Default_attributes;
+
+ /* Check for NULL mutex */
+
+ if ( !mutex )
+ return EINVAL;
+
+ /* EBUSY if *mutex is a valid id */
+
+ mutex_in_use = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ break;
+ case OBJECTS_REMOTE:
+ case OBJECTS_LOCAL:
+ _Thread_Enable_dispatch();
+ return EBUSY;
+ };
+
+ if ( !the_attr->is_initialized )
+ return EINVAL;
+
+ /*
+ * XXX: Be careful about attributes when global!!!
+ */
+
+ assert( the_attr->process_shared == PTHREAD_PROCESS_PRIVATE );
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ return POSIX_MP_NOT_IMPLEMENTED();
+
+ /*
+ * Determine the discipline of the mutex
+ */
+
+ switch ( the_attr->protocol ) {
+ case PTHREAD_PRIO_NONE:
+ the_discipline = CORE_MUTEX_DISCIPLINES_FIFO;
+ break;
+ case PTHREAD_PRIO_INHERIT:
+ the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT;
+ break;
+ case PTHREAD_PRIO_PROTECT:
+ the_discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING;
+ break;
+ default:
+ return EINVAL;
+ }
+
+ if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ the_mutex = _POSIX_Mutex_Allocate();
+
+ if ( !the_mutex ) {
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Mutex_Information, 0,
+ the_mutex->Object.id, FALSE ) ) ) {
+ _POSIX_Mutex_Free( the_mutex );
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ the_mutex->process_shared = the_attr->process_shared;
+
+ the_mutex_attr = &the_mutex->Mutex.Attributes;
+
+ the_mutex_attr->allow_nesting = the_attr->recursive;
+ the_mutex_attr->priority_ceiling =
+ _POSIX_Priority_To_core( the_attr->prio_ceiling );
+ the_mutex_attr->discipline = the_discipline;
+
+ /*
+ * Must be initialized to unlocked.
+ */
+
+ _CORE_mutex_Initialize(
+ &the_mutex->Mutex,
+ OBJECTS_POSIX_MUTEXES,
+ the_mutex_attr,
+ CORE_MUTEX_UNLOCKED,
+ NULL /* proxy_extract_callout */
+ );
+
+ _Objects_Open( &_POSIX_Mutex_Information, &the_mutex->Object, 0 );
+
+ *mutex = the_mutex->Object.id;
+
+ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Mutex_MP_Send_process_packet(
+ POSIX_MUTEX_MP_ANNOUNCE_CREATE,
+ the_mutex->Object.id,
+ 0, /* Name not used */
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 11.3.2 Initializing and Destroying a Mutex, P1003.1c/Draft 10, p. 87
+ */
+
+int pthread_mutex_destroy(
+ pthread_mutex_t *mutex
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ /*
+ * XXX: There is an error for the mutex being locked
+ * or being in use by a condition variable.
+ */
+
+ if ( _CORE_mutex_Is_locked( &the_mutex->Mutex ) ) {
+ _Thread_Enable_dispatch();
+ return EBUSY;
+ }
+
+ _Objects_Close( &_POSIX_Mutex_Information, &the_mutex->Object );
+
+ _CORE_mutex_Flush(
+ &the_mutex->Mutex,
+ _POSIX_Mutex_MP_Send_object_was_deleted,
+ EINVAL
+ );
+
+ _POSIX_Mutex_Free( the_mutex );
+
+ if ( the_mutex->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close( &_POSIX_Mutex_Information, the_mutex->Object.id );
+
+ _POSIX_Mutex_MP_Send_process_packet(
+ POSIX_MUTEX_MP_ANNOUNCE_DELETE,
+ the_mutex->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Mutex_Lock_support
+ *
+ * A support routine which implements guts of the blocking, non-blocking, and
+ * timed wait version of mutex lock.
+ */
+
+int _POSIX_Mutex_Lock_support(
+ pthread_mutex_t *mutex,
+ boolean blocking,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return _POSIX_Mutex_MP_Send_request_packet(
+ POSIX_MUTEX_MP_OBTAIN_REQUEST,
+ *mutex,
+ 0, /* must define the option set */
+ WATCHDOG_NO_TIMEOUT
+ );
+ case OBJECTS_LOCAL:
+ _CORE_mutex_Seize(
+ &the_mutex->Mutex,
+ the_mutex->Object.id,
+ blocking,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return _POSIX_Mutex_From_core_mutex_status(
+ (CORE_mutex_Status) _Thread_Executing->Wait.return_code
+ );
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_lock(
+ pthread_mutex_t *mutex
+)
+{
+ return _POSIX_Mutex_Lock_support( mutex, TRUE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_trylock(
+ pthread_mutex_t *mutex
+)
+{
+ return _POSIX_Mutex_Lock_support( mutex, FALSE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_unlock(
+ pthread_mutex_t *mutex
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+ CORE_mutex_Status status;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return _POSIX_Mutex_MP_Send_request_packet(
+ POSIX_MUTEX_MP_RELEASE_REQUEST,
+ *mutex,
+ 0, /* Not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+ case OBJECTS_LOCAL:
+ status = _CORE_mutex_Surrender(
+ &the_mutex->Mutex,
+ the_mutex->Object.id,
+ POSIX_Threads_mutex_MP_support
+ );
+ _Thread_Enable_dispatch();
+ return _POSIX_Mutex_From_core_mutex_status( status );
+ break;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.3.3 Locking and Unlocking a Mutex, P1003.1c/Draft 10, p. 93
+ *
+ * NOTE: P1003.4b/D8 adds pthread_mutex_timedlock(), p. 29
+ */
+
+int pthread_mutex_timedlock(
+ pthread_mutex_t *mutex,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Mutex_Lock_support(
+ mutex,
+ TRUE,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_setprotocol(
+ pthread_mutexattr_t *attr,
+ int protocol
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( protocol ) {
+ case PTHREAD_PRIO_NONE:
+ case PTHREAD_PRIO_INHERIT:
+ case PTHREAD_PRIO_PROTECT:
+ attr->protocol = protocol;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_getprotocol(
+ const pthread_mutexattr_t *attr,
+ int *protocol
+)
+{
+ if ( !attr || !attr->is_initialized || !protocol )
+ return EINVAL;
+
+ *protocol = attr->protocol;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_setprioceiling(
+ pthread_mutexattr_t *attr,
+ int prioceiling
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( prioceiling ) )
+ return EINVAL;
+
+ attr->prio_ceiling = prioceiling;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.6.1 Mutex Initialization Scheduling Attributes, P1003.1c/Draft 10, p. 128
+ */
+
+int pthread_mutexattr_getprioceiling(
+ const pthread_mutexattr_t *attr,
+ int *prioceiling
+)
+{
+ if ( !attr || !attr->is_initialized || !prioceiling )
+ return EINVAL;
+
+ *prioceiling = attr->prio_ceiling;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.6.2 Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131
+ */
+
+int pthread_mutex_setprioceiling(
+ pthread_mutex_t *mutex,
+ int prioceiling,
+ int *old_ceiling
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+ Priority_Control the_priority;
+ int status;
+
+ if ( !old_ceiling )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( prioceiling ) )
+ return EINVAL;
+
+ the_priority = _POSIX_Priority_To_core( prioceiling );
+
+ /*
+ * Must acquire the mutex before we can change it's ceiling
+ */
+
+ status = pthread_mutex_lock( mutex );
+ if ( status )
+ return status;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL; /* impossible to get here */
+ case OBJECTS_REMOTE:
+ /* XXX It feels questionable to set the ceiling on a remote mutex. */
+ return EINVAL;
+ case OBJECTS_LOCAL:
+ *old_ceiling = _POSIX_Priority_From_core(
+ the_mutex->Mutex.Attributes.priority_ceiling
+ );
+ the_mutex->Mutex.Attributes.priority_ceiling = the_priority;
+ _CORE_mutex_Surrender(
+ &the_mutex->Mutex,
+ the_mutex->Object.id,
+ POSIX_Threads_mutex_MP_support
+ );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 13.6.2 Change the Priority Ceiling of a Mutex, P1003.1c/Draft 10, p. 131
+ */
+
+int pthread_mutex_getprioceiling(
+ pthread_mutex_t *mutex,
+ int *prioceiling
+)
+{
+ register POSIX_Mutex_Control *the_mutex;
+ Objects_Locations location;
+
+ if ( !prioceiling )
+ return EINVAL;
+
+ the_mutex = _POSIX_Mutex_Get( mutex, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return EINVAL;
+ case OBJECTS_REMOTE:
+ return POSIX_MP_NOT_IMPLEMENTED(); /* XXX feels questionable */
+ case OBJECTS_LOCAL:
+ *prioceiling = _POSIX_Priority_From_core(
+ the_mutex->Mutex.Attributes.priority_ceiling
+ );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
diff --git a/cpukit/posix/src/psignal.c b/cpukit/posix/src/psignal.c
new file mode 100644
index 0000000000..289c9f02d5
--- /dev/null
+++ b/cpukit/posix/src/psignal.c
@@ -0,0 +1,1347 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <signal.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/threadsup.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/time.h>
+
+/*
+ * Currently 32 signals numbered 1-32 are defined
+ */
+
+#define SIGNAL_EMPTY_MASK 0x00000000
+#define SIGNAL_ALL_MASK 0xffffffff
+
+#define signo_to_mask( _sig ) (1 << ((_sig) - 1))
+
+#define is_valid_signo( _sig ) \
+ ((_sig) >= 1 && (_sig) <= 32 )
+
+/*** PROCESS WIDE STUFF ****/
+
+sigset_t _POSIX_signals_Pending;
+
+void _POSIX_signals_Abormal_termination_handler( int signo )
+{
+ exit( 1 );
+}
+
+#define _POSIX_signals_Stop_handler NULL
+#define _POSIX_signals_Continue_handler NULL
+
+#define SIGACTION_TERMINATE \
+ { 0, SIGNAL_ALL_MASK, {_POSIX_signals_Abormal_termination_handler} }
+#define SIGACTION_IGNORE \
+ { 0, SIGNAL_ALL_MASK, {SIG_IGN} }
+#define SIGACTION_STOP \
+ { 0, SIGNAL_ALL_MASK, {_POSIX_signals_Stop_handler} }
+#define SIGACTION_CONTINUE \
+ { 0, SIGNAL_ALL_MASK, {_POSIX_signals_Continue_handler} }
+
+#define SIG_ARRAY_MAX (SIGRTMAX + 1)
+struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {
+ /* NO SIGNAL 0 */ SIGACTION_IGNORE,
+ /* SIGHUP 1 */ SIGACTION_TERMINATE,
+ /* SIGINT 2 */ SIGACTION_TERMINATE,
+ /* SIGQUIT 3 */ SIGACTION_TERMINATE,
+ /* SIGILL 4 */ SIGACTION_TERMINATE,
+ /* SIGTRAP 5 */ SIGACTION_TERMINATE,
+ /* SIGIOT 6 */ SIGACTION_TERMINATE,
+ /* SIGABRT 6 SIGACTION_TERMINATE, -- alias for SIGIOT */
+ /* SIGEMT 7 */ SIGACTION_TERMINATE,
+ /* SIGFPE 8 */ SIGACTION_TERMINATE,
+ /* SIGKILL 9 */ SIGACTION_TERMINATE,
+ /* SIGBUS 10 */ SIGACTION_TERMINATE,
+ /* SIGSEGV 11 */ SIGACTION_TERMINATE,
+ /* SIGSYS 12 */ SIGACTION_TERMINATE,
+ /* SIGPIPE 13 */ SIGACTION_TERMINATE,
+ /* SIGALRM 14 */ SIGACTION_TERMINATE,
+ /* SIGTERM 15 */ SIGACTION_TERMINATE,
+ /* SIGUSR1 16 */ SIGACTION_TERMINATE,
+ /* SIGUSR2 17 */ SIGACTION_TERMINATE,
+ /* SIGRTMIN 18 */ SIGACTION_IGNORE,
+ /* SIGRT 19 */ SIGACTION_IGNORE,
+ /* SIGRT 20 */ SIGACTION_IGNORE,
+ /* SIGRT 21 */ SIGACTION_IGNORE,
+ /* SIGRT 22 */ SIGACTION_IGNORE,
+ /* SIGRT 23 */ SIGACTION_IGNORE,
+ /* SIGRT 24 */ SIGACTION_IGNORE,
+ /* SIGRT 25 */ SIGACTION_IGNORE,
+ /* SIGRT 26 */ SIGACTION_IGNORE,
+ /* SIGRT 27 */ SIGACTION_IGNORE,
+ /* SIGRT 28 */ SIGACTION_IGNORE,
+ /* SIGRT 29 */ SIGACTION_IGNORE,
+ /* SIGRT 30 */ SIGACTION_IGNORE,
+ /* SIGRT 31 */ SIGACTION_IGNORE,
+ /* SIGRTMAX 32 */ SIGACTION_IGNORE
+};
+
+struct sigaction _POSIX_signals_Vectors[ SIG_ARRAY_MAX ];
+
+Watchdog_Control _POSIX_signals_Alarm_timer;
+
+Thread_queue_Control _POSIX_signals_Wait_queue;
+
+typedef struct {
+ Chain_Node Node;
+ siginfo_t Info;
+} POSIX_signals_Siginfo_node;
+
+Chain_Control _POSIX_signals_Inactive_siginfo;
+Chain_Control _POSIX_signals_Siginfo[ SIG_ARRAY_MAX ];
+
+/*PAGE
+ *
+ * XXX - move these
+ */
+
+#define _States_Is_interruptible_signal( _states ) \
+ ( ((_states) & \
+ (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL)) == \
+ (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL))
+
+/*PAGE
+ *
+ * _POSIX_signals_Unblock_thread
+ */
+
+/* XXX this routine could probably be cleaned up */
+boolean _POSIX_signals_Unblock_thread(
+ Thread_Control *the_thread,
+ int signo,
+ siginfo_t *info
+)
+{
+ POSIX_API_Control *api;
+ sigset_t mask;
+ siginfo_t *the_info = NULL;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ mask = signo_to_mask( signo );
+
+ /*
+ * Is the thread is specifically waiting for a signal?
+ */
+
+ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
+
+ if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
+ the_thread->Wait.return_code = EINTR;
+
+ the_info = (siginfo_t *) the_thread->Wait.return_argument;
+
+ if ( !info ) {
+ the_info->si_signo = signo;
+ the_info->si_code = SI_USER;
+ the_info->si_value.sival_int = 0;
+ } else {
+ *the_info = *info;
+ }
+
+ _Thread_queue_Extract_with_proxy( the_thread );
+ return TRUE;
+ }
+
+ /*
+ * This should only be reached via pthread_kill().
+ */
+
+ return FALSE;
+ }
+
+ if ( ~api->signals_blocked & mask ) {
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ if ( the_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) {
+ the_thread->Wait.return_code = EINTR;
+ if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) )
+ _Thread_queue_Extract_with_proxy( the_thread );
+ else if ( _States_Is_delaying(the_thread->current_state)){
+ if ( _Watchdog_Is_active( &the_thread->Timer ) )
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+ }
+ }
+ return FALSE;
+
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Set_process_signals
+ */
+
+void _POSIX_signals_Set_process_signals(
+ sigset_t mask
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ if ( !_POSIX_signals_Pending )
+ _Thread_Do_post_task_switch_extension++;
+ _POSIX_signals_Pending |= mask;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Clear_process_signals
+ */
+
+void _POSIX_signals_Clear_process_signals(
+ sigset_t mask
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _POSIX_signals_Pending &= ~mask;
+ if ( !_POSIX_signals_Pending )
+ _Thread_Do_post_task_switch_extension--;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Clear_signals
+ */
+
+boolean _POSIX_signals_Clear_signals(
+ POSIX_API_Control *api,
+ int signo,
+ siginfo_t *info,
+ boolean is_global,
+ boolean check_blocked
+)
+{
+ sigset_t mask;
+ sigset_t signals_blocked;
+ ISR_Level level;
+ boolean do_callout;
+ POSIX_signals_Siginfo_node *psiginfo;
+
+ mask = signo_to_mask( signo );
+
+ do_callout = FALSE;
+
+ /* set blocked signals based on if checking for them, SIGNAL_ALL_MASK
+ * insures that no signals are blocked and all are checked.
+ */
+
+ if ( check_blocked )
+ signals_blocked = ~api->signals_blocked;
+ else
+ signals_blocked = SIGNAL_ALL_MASK;
+
+ /* XXX this is not right for siginfo type signals yet */
+ /* XXX since they can't be cleared the same way */
+
+ _ISR_Disable( level );
+ if ( is_global ) {
+ if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
+ if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
+ psiginfo = (POSIX_signals_Siginfo_node *)
+ _Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
+ if ( _Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
+ _POSIX_signals_Clear_process_signals( mask );
+ if ( psiginfo ) {
+ *info = psiginfo->Info;
+ _Chain_Append_unprotected(
+ &_POSIX_signals_Inactive_siginfo,
+ &psiginfo->Node
+ );
+ } else
+ do_callout = FALSE;
+ } else
+ _POSIX_signals_Clear_process_signals( mask );
+ do_callout = TRUE;
+ }
+ } else {
+ if ( mask & (api->signals_pending & signals_blocked) ) {
+ api->signals_pending &= ~mask;
+ do_callout = TRUE;
+ }
+ }
+ _ISR_Enable( level );
+ return do_callout;
+}
+
+
+/*PAGE
+ *
+ * _POSIX_signals_Check_signal
+ */
+
+boolean _POSIX_signals_Check_signal(
+ POSIX_API_Control *api,
+ int signo,
+ boolean is_global
+)
+{
+ siginfo_t siginfo_struct;
+ sigset_t saved_signals_blocked;
+
+ if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
+ is_global, TRUE ) )
+ return FALSE;
+
+ /*
+ * Since we made a union of these, only one test is necessary but this is
+ * safer.
+ */
+
+ assert( _POSIX_signals_Vectors[ signo ].sa_handler ||
+ _POSIX_signals_Vectors[ signo ].sa_sigaction );
+
+ /*
+ * Just to prevent sending a signal which is currently being ignored.
+ */
+
+ if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN )
+ return FALSE;
+
+ /*
+ * Block the signals requested in sa_mask
+ */
+
+ saved_signals_blocked = api->signals_blocked;
+ api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
+
+ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
+ case SA_SIGINFO:
+ assert( is_global );
+
+ (*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
+ signo,
+ &siginfo_struct,
+ NULL /* context is undefined per 1003.1b-1993, p. 66 */
+ );
+ break;
+ default:
+ (*_POSIX_signals_Vectors[ signo ].sa_handler)( signo );
+ break;
+ }
+
+ /*
+ * Restore the previous set of blocked signals
+ */
+
+ api->signals_blocked = saved_signals_blocked;
+
+ return TRUE;
+}
+
+void _POSIX_signals_Post_switch_extension(
+ Thread_Control *the_thread
+)
+{
+ POSIX_API_Control *api;
+ int signo;
+ ISR_Level level;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ /*
+ * If we invoke any user code, there is the possibility that
+ * a new signal has been posted that we should process so we
+ * restart the loop if a signal handler was invoked.
+ *
+ * The first thing done is to check there are any signals to be
+ * processed at all. No point in doing this loop otherwise.
+ */
+
+restart:
+ _ISR_Disable( level );
+ if ( !(~api->signals_blocked &
+ (api->signals_pending | _POSIX_signals_Pending)) ) {
+ _ISR_Enable( level );
+ return;
+ }
+ _ISR_Enable( level );
+
+ for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
+
+ if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )
+ goto restart;
+
+ if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )
+ goto restart;
+
+ }
+
+/* XXX - add __SIGFIRSTNOTRT or something like that to newlib siginfo.h */
+
+ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
+
+ if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )
+ goto restart;
+
+ if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )
+ goto restart;
+
+ }
+
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Alarm_TSR
+ */
+
+void _POSIX_signals_Alarm_TSR(
+ Objects_Id id,
+ void *argument
+)
+{
+ int status;
+
+ status = kill( getpid(), SIGALRM );
+ /* XXX can't print from an ISR, should this be fatal? */
+ assert( !status );
+}
+
+/*PAGE
+ *
+ * _POSIX_signals_Manager_Initialization
+ */
+
+void _POSIX_signals_Manager_Initialization(
+ int maximum_queued_signals
+)
+{
+ unsigned32 signo;
+
+ /*
+ * Insure we have the same number of vectors and default vector entries
+ */
+
+ assert(
+ sizeof(_POSIX_signals_Vectors) == sizeof(_POSIX_signals_Default_vectors)
+ );
+
+ memcpy(
+ _POSIX_signals_Vectors,
+ _POSIX_signals_Default_vectors,
+ sizeof( _POSIX_signals_Vectors )
+ );
+
+ /*
+ * Initialize the set of pending signals for the entire process
+ */
+
+ sigemptyset( &_POSIX_signals_Pending );
+
+ /*
+ * Initialize the timer used to implement alarm().
+ */
+
+ _Watchdog_Initialize(
+ &_POSIX_signals_Alarm_timer,
+ _POSIX_signals_Alarm_TSR,
+ 0,
+ NULL
+ );
+
+ /*
+ * Initialize the queue we use to block for signals
+ */
+
+ _Thread_queue_Initialize(
+ &_POSIX_signals_Wait_queue,
+ OBJECTS_NO_CLASS,
+ THREAD_QUEUE_DISCIPLINE_PRIORITY,
+ STATES_WAITING_FOR_SIGNAL | STATES_INTERRUPTIBLE_BY_SIGNAL,
+ NULL,
+ EAGAIN
+ );
+
+ /* XXX status codes */
+
+ /*
+ * Allocate the siginfo pools.
+ */
+
+ for ( signo=1 ; signo<= SIGRTMAX ; signo++ )
+ _Chain_Initialize_empty( &_POSIX_signals_Siginfo[ signo ] );
+
+ _Chain_Initialize(
+ &_POSIX_signals_Inactive_siginfo,
+ _Workspace_Allocate_or_fatal_error(
+ maximum_queued_signals * sizeof( POSIX_signals_Siginfo_node )
+ ),
+ maximum_queued_signals,
+ sizeof( POSIX_signals_Siginfo_node )
+ );
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigemptyset(
+ sigset_t *set
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set = 0;
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigfillset(
+ sigset_t *set
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set = SIGNAL_ALL_MASK;
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigaddset(
+ sigset_t *set,
+ int signo
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( !signo )
+ return 0;
+
+ if ( !is_valid_signo(signo) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set |= signo_to_mask(signo);
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigdelset(
+ sigset_t *set,
+ int signo
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( !signo )
+ return 0;
+
+ if ( !is_valid_signo(signo) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ *set &= ~signo_to_mask(signo);
+ return 0;
+}
+
+/*
+ * 3.3.3 Manipulate Signal Sets, P1003.1b-1993, p. 69
+ */
+
+int sigismember(
+ const sigset_t *set,
+ int signo
+)
+{
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( !signo )
+ return 0;
+
+ if ( !is_valid_signo(signo) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( *set & signo_to_mask(signo) )
+ return 1;
+
+ return 0;
+}
+
+/*
+ * 3.3.4 Examine and Change Signal Action, P1003.1b-1993, p. 70
+ */
+
+int sigaction(
+ int sig,
+ const struct sigaction *act,
+ struct sigaction *oact
+)
+{
+ ISR_Level level;
+
+ if ( oact )
+ *oact = _POSIX_signals_Vectors[ sig ];
+
+ if ( !sig )
+ return 0;
+
+ if ( !is_valid_signo(sig) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * Some signals cannot be ignored (P1003.1b-1993, pp. 70-72 and references.
+ *
+ * NOTE: Solaris documentation claims to "silently enforce" this which
+ * contradicts the POSIX specification.
+ */
+
+ if ( sig == SIGKILL )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * Evaluate the new action structure and set the global signal vector
+ * appropriately.
+ */
+
+ if ( act ) {
+
+ /*
+ * Unless the user is installing the default signal actions, then
+ * we can just copy the provided sigaction structure into the vectors.
+ */
+
+ _ISR_Disable( level );
+ if ( act->sa_handler == SIG_DFL ) {
+ _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
+ } else {
+ _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
+ _POSIX_signals_Vectors[ sig ] = *act;
+ }
+ _ISR_Enable( level );
+ }
+
+ /*
+ * No need to evaluate or dispatch because:
+ *
+ * + If we were ignoring the signal before, none could be pending
+ * now (signals not posted when SIG_IGN).
+ * + If we are now ignoring a signal that was previously pending,
+ * we clear the pending signal indicator.
+ */
+
+ return 0;
+}
+
+/*
+ * 3.3.5 Examine and Change Blocked Signals, P1003.1b-1993, p. 73
+ *
+ * NOTE: P1003.1c/D10, p. 37 adds pthread_sigmask().
+ *
+ */
+
+int sigprocmask(
+ int how,
+ const sigset_t *set,
+ sigset_t *oset
+)
+{
+ /*
+ * P1003.1c/Draft 10, p. 38 maps sigprocmask to pthread_sigmask.
+ */
+
+ return pthread_sigmask( how, set, oset );
+}
+
+/*
+ * 3.3.5 Examine and Change Blocked Signals, P1003.1b-1993, p. 73
+ *
+ * NOTE: P1003.1c/D10, p. 37 adds pthread_sigmask().
+ */
+
+int pthread_sigmask(
+ int how,
+ const sigset_t *set,
+ sigset_t *oset
+)
+{
+ POSIX_API_Control *api;
+
+ if ( !set && !oset )
+ set_errno_and_return_minus_one( EINVAL );
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( oset )
+ *oset = api->signals_blocked;
+
+ if ( !set )
+ return 0;
+
+ switch ( how ) {
+ case SIG_BLOCK:
+ api->signals_blocked |= *set;
+ break;
+ case SIG_UNBLOCK:
+ api->signals_blocked &= ~*set;
+ break;
+ case SIG_SETMASK:
+ api->signals_blocked = *set;
+ break;
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+ }
+
+ /* XXX are there critical section problems here? */
+
+ /* XXX evaluate the new set */
+
+ if ( ~api->signals_blocked &
+ (api->signals_pending | _POSIX_signals_Pending) ) {
+ _Thread_Executing->do_post_task_switch_extension = TRUE;
+ _Thread_Dispatch();
+ }
+
+ return 0;
+}
+
+/*
+ * 3.3.6 Examine Pending Signals, P1003.1b-1993, p. 75
+ */
+
+int sigpending(
+ sigset_t *set
+)
+{
+ POSIX_API_Control *api;
+
+ if ( !set )
+ set_errno_and_return_minus_one( EINVAL );
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ *set = api->signals_pending | _POSIX_signals_Pending;
+
+ return 0;
+}
+
+/*
+ * 3.3.7 Wait for a Signal, P1003.1b-1993, p. 75
+ */
+
+int sigsuspend(
+ const sigset_t *sigmask
+)
+{
+ sigset_t saved_signals_blocked;
+ sigset_t all_signals;
+ int status;
+ POSIX_API_Control *api;
+
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+
+ status = sigprocmask( SIG_BLOCK, sigmask, &saved_signals_blocked );
+
+ (void) sigfillset( &all_signals );
+
+ status = sigtimedwait( &all_signals, NULL, NULL );
+
+ (void) sigprocmask( SIG_SETMASK, &saved_signals_blocked, NULL );
+
+ return status;
+}
+
+/*
+ * 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
+ *
+ * NOTE: P1003.1c/D10, p. 39 adds sigwait().
+ */
+
+int sigwaitinfo(
+ const sigset_t *set,
+ siginfo_t *info
+)
+{
+ return sigtimedwait( set, info, NULL );
+}
+
+/*
+ * 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
+ *
+ * NOTE: P1003.1c/D10, p. 39 adds sigwait().
+ */
+
+int _POSIX_signals_Get_highest(
+ sigset_t set
+)
+{
+ int signo;
+
+ for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
+ if ( set & signo_to_mask( signo ) )
+ return signo;
+ }
+
+/* XXX - add __SIGFIRSTNOTRT or something like that to newlib siginfo.h */
+
+ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
+ if ( set & signo_to_mask( signo ) )
+ return signo;
+ }
+
+ return 0;
+}
+
+int sigtimedwait(
+ const sigset_t *set,
+ siginfo_t *info,
+ const struct timespec *timeout
+)
+{
+ Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Watchdog_Interval interval;
+ siginfo_t signal_information;
+ siginfo_t *the_info;
+ int signo;
+
+ the_info = ( info ) ? info : &signal_information;
+
+ the_thread = _Thread_Executing;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ /*
+ * What if they are already pending?
+ */
+
+ /* API signals pending? */
+
+ if ( *set & api->signals_pending ) {
+ /* XXX real info later */
+ the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending );
+ _POSIX_signals_Clear_signals( api, the_info->si_signo, the_info,
+ FALSE, FALSE );
+ the_info->si_code = SI_USER;
+ the_info->si_value.sival_int = 0;
+ return the_info->si_signo;
+ }
+
+ /* Process pending signals? */
+
+ if ( *set & _POSIX_signals_Pending) {
+ signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending );
+ _POSIX_signals_Clear_signals( api, signo, the_info, TRUE, FALSE );
+
+ if ( !info ) {
+ the_info->si_signo = signo;
+ the_info->si_code = SI_USER;
+ the_info->si_value.sival_int = 0;
+ }
+ }
+
+ interval = 0;
+ if ( timeout ) {
+
+ if (timeout->tv_nsec < 0 || timeout->tv_nsec >= TOD_NANOSECONDS_PER_SECOND)
+ set_errno_and_return_minus_one( EINVAL );
+
+ interval = _POSIX_Timespec_to_interval( timeout );
+ }
+
+ the_info->si_signo = -1;
+
+ _Thread_Disable_dispatch();
+ the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
+ the_thread->Wait.return_code = EINTR;
+ the_thread->Wait.option = *set;
+ the_thread->Wait.return_argument = (void *) the_info;
+ _Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
+ _Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
+ _Thread_Enable_dispatch();
+
+ errno = _Thread_Executing->Wait.return_code;
+ return the_info->si_signo;
+}
+
+/*
+ * 3.3.8 Synchronously Accept a Signal, P1003.1b-1993, p. 76
+ *
+ * NOTE: P1003.1c/D10, p. 39 adds sigwait().
+ */
+
+int sigwait(
+ const sigset_t *set,
+ int *sig
+)
+{
+ int status;
+
+ status = sigtimedwait( set, NULL, NULL );
+
+ if ( status != -1 ) {
+ if ( sig )
+ *sig = status;
+ return 0;
+ }
+
+ return errno;
+}
+
+/*PAGE
+ *
+ * 3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
+ *
+ * NOTE: Behavior of kill() depends on _POSIX_SAVED_IDS.
+ */
+
+#define _POSIX_signals_Is_interested( _api, _mask ) \
+ ( ~(_api)->signals_blocked & (_mask) )
+
+int killinfo(
+ pid_t pid,
+ int sig,
+ const union sigval *value
+)
+{
+ sigset_t mask;
+ POSIX_API_Control *api;
+ unsigned32 the_class;
+ unsigned32 index;
+ unsigned32 maximum;
+ Objects_Information *the_info;
+ Objects_Control **object_table;
+ Thread_Control *the_thread;
+ Thread_Control *interested_thread;
+ Priority_Control interested_priority;
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ siginfo_t siginfo_struct;
+ siginfo_t *siginfo;
+ POSIX_signals_Siginfo_node *psiginfo;
+
+ /*
+ * Only supported for the "calling process" (i.e. this node).
+ */
+
+ if( pid != getpid() )
+ set_errno_and_return_minus_one( ESRCH );
+
+ /*
+ * Validate the signal passed if not 0.
+ */
+
+ if ( sig && !is_valid_signo(sig) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * If the signal is being ignored, then we are out of here.
+ */
+
+ if ( !sig || _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
+ return 0;
+
+ /*
+ * P1003.1c/Draft 10, p. 33 says that certain signals should always
+ * be directed to the executing thread such as those caused by hardware
+ * faults.
+ */
+
+ switch ( sig ) {
+ case SIGFPE:
+ case SIGILL:
+ case SIGSEGV:
+ return pthread_kill( pthread_self(), sig );
+ default:
+ break;
+ }
+
+ mask = signo_to_mask( sig );
+
+ /*
+ * Build up a siginfo structure
+ */
+
+ siginfo = &siginfo_struct;
+ siginfo->si_signo = sig;
+ siginfo->si_code = SI_USER;
+ if ( !value ) {
+ siginfo->si_value.sival_int = 0;
+ } else {
+ siginfo->si_value = *value;
+ }
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Is the currently executing thread interested? If so then it will
+ * get it an execute it as soon as the dispatcher executes.
+ */
+
+ the_thread = _Thread_Executing;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+ if ( _POSIX_signals_Is_interested( api, mask ) ) {
+ goto process_it;
+ }
+
+ /*
+ * Is an interested thread waiting for this signal (sigwait())?
+ */
+
+ /* XXX violation of visibility -- need to define thread queue support */
+
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++ ) {
+
+ the_chain = &_POSIX_signals_Wait_queue.Queues.Priority[ index ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_thread = (Thread_Control *)the_node;
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ((the_thread->Wait.option & mask) || (~api->signals_blocked & mask)) {
+ goto process_it;
+ }
+
+ }
+ }
+
+ /*
+ * Is any other thread interested? The highest priority interested
+ * thread is selected. In the event of a tie, then the following
+ * additional criteria is used:
+ *
+ * + ready thread over blocked
+ * + blocked on call interruptible by signal (can return EINTR)
+ * + blocked on call not interruptible by signal
+ *
+ * This looks at every thread in the system regardless of the creating API.
+ *
+ * NOTES:
+ *
+ * + rtems internal threads do not receive signals.
+ */
+
+ interested_thread = NULL;
+ interested_priority = PRIORITY_MAXIMUM + 1;
+
+ for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;
+ the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;
+ the_class++ ) {
+
+ if ( the_class == OBJECTS_INTERNAL_THREADS )
+ continue;
+
+ the_info = _Objects_Information_table[ the_class ];
+
+ if ( !the_info ) /* manager not installed */
+ continue;
+
+ maximum = the_info->maximum;
+ object_table = the_info->local_table;
+
+ assert( object_table ); /* always at least 1 entry */
+
+ for ( index = 1 ; index <= maximum ; index++ ) {
+ the_thread = (Thread_Control *) object_table[ index ];
+
+ if ( !the_thread )
+ continue;
+
+ /*
+ * If this thread is of lower priority than the interested thread,
+ * go on to the next thread.
+ */
+
+ if ( the_thread->current_priority > interested_priority )
+ continue;
+
+ /*
+ * If this thread is not interested, then go on to the next thread.
+ */
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( !api || !_POSIX_signals_Is_interested( api, mask ) )
+ continue;
+
+ /*
+ * Now we know the thread under connsideration is interested.
+ * If the thread under consideration is of higher priority, then
+ * it becomes the interested thread.
+ */
+
+ if ( the_thread->current_priority < interested_priority ) {
+ interested_thread = the_thread;
+ interested_priority = the_thread->current_priority;
+ continue;
+ }
+
+ /*
+ * Now the thread and the interested thread have the same priority.
+ * If the interested thread is ready, then we don't need to send it
+ * to a blocked thread.
+ */
+
+ if ( _States_Is_ready( interested_thread->current_state ) )
+ continue;
+
+ /*
+ * Now the interested thread is blocked.
+ * If the thread we are considering is not, the it becomes the
+ * interested thread.
+ */
+
+ if ( _States_Is_ready( the_thread->current_state ) ) {
+ interested_thread = the_thread;
+ interested_priority = the_thread->current_priority;
+ continue;
+ }
+
+ /*
+ * Now we know both threads are blocked.
+ * If the interested thread is interruptible, then just use it.
+ */
+
+ /* XXX need a new states macro */
+ if ( interested_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL )
+ continue;
+
+ /*
+ * Now both threads are blocked and the interested thread is not
+ * interruptible.
+ * If the thread under consideration is interruptible by a signal,
+ * then it becomes the interested thread.
+ */
+
+ /* XXX need a new states macro */
+ if ( the_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) {
+ interested_thread = the_thread;
+ interested_priority = the_thread->current_priority;
+ }
+ }
+ }
+
+ if ( interested_thread ) {
+ the_thread = interested_thread;
+ goto process_it;
+ }
+
+ /*
+ * OK so no threads were interested right now. It will be left on the
+ * global pending until a thread receives it. The global set of threads
+ * can change interest in this signal in one of the following ways:
+ *
+ * + a thread is created with the signal unblocked,
+ * + pthread_sigmask() unblocks the signal,
+ * + sigprocmask() unblocks the signal, OR
+ * + sigaction() which changes the handler to SIG_IGN.
+ */
+
+ the_thread = NULL;
+ goto post_process_signal;
+
+ /*
+ * We found a thread which was interested, so now we mark that this
+ * thread needs to do the post context switch extension so it can
+ * evaluate the signals pending.
+ */
+
+process_it:
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ /*
+ * Returns TRUE if the signal was synchronously given to a thread
+ * blocked waiting for the signal.
+ */
+
+ if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) {
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+post_process_signal:
+
+ /*
+ * We may have woken up a thread but we definitely need to post the
+ * signal to the process wide information set.
+ */
+
+ _POSIX_signals_Set_process_signals( mask );
+
+ if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
+
+ psiginfo = (POSIX_signals_Siginfo_node *)
+ _Chain_Get( &_POSIX_signals_Inactive_siginfo );
+ if ( !psiginfo )
+ set_errno_and_return_minus_one( EAGAIN );
+
+ psiginfo->Info = *siginfo;
+
+ _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
+ *
+ * NOTE: Behavior of kill() depends on _POSIX_SAVED_IDS.
+ */
+
+int kill(
+ pid_t pid,
+ int sig
+)
+{
+ return killinfo( pid, sig, NULL );
+}
+
+/*
+ * 3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78
+ */
+
+int sigqueue(
+ pid_t pid,
+ int signo,
+ const union sigval value
+)
+{
+ return killinfo( pid, signo, &value );
+}
+
+/*
+ * 3.3.10 Send a Signal to a Thread, P1003.1c/D10, p. 43
+ */
+
+int pthread_kill(
+ pthread_t thread,
+ int sig
+)
+{
+ POSIX_API_Control *api;
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ if ( sig && !is_valid_signo(sig) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO )
+ set_errno_and_return_minus_one( ENOSYS );
+
+ /*
+ * RTEMS does not support sending a siginfo signal to a specific thread.
+ */
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ set_errno_and_return_minus_one( ESRCH );
+ case OBJECTS_LOCAL:
+ /*
+ * If sig == 0 then just validate arguments
+ */
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( sig ) {
+
+ if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) {
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ /* XXX critical section */
+
+ api->signals_pending |= signo_to_mask( sig );
+
+ (void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) )
+ _ISR_Signals_to_thread_executing = TRUE;
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*
+ * 3.4.1 Schedule Alarm, P1003.1b-1993, p. 79
+ */
+
+Watchdog_Control _POSIX_signals_Alarm_timer;
+
+unsigned int alarm(
+ unsigned int seconds
+)
+{
+ unsigned int remaining = 0;
+ Watchdog_Control *the_timer;
+
+ the_timer = &_POSIX_signals_Alarm_timer;
+
+ switch ( _Watchdog_Remove( the_timer ) ) {
+ case WATCHDOG_INACTIVE:
+ case WATCHDOG_BEING_INSERTED:
+ break;
+
+ case WATCHDOG_ACTIVE:
+ case WATCHDOG_REMOVE_IT:
+ remaining = the_timer->initial -
+ (the_timer->stop_time - the_timer->start_time);
+ break;
+ }
+
+ _Watchdog_Insert_seconds( the_timer, seconds );
+
+ return remaining;
+}
+
+/*
+ * 3.4.2 Suspend Process Execution, P1003.1b-1993, p. 81
+ */
+
+int pause( void )
+{
+ sigset_t all_signals;
+ int status;
+
+ (void) sigfillset( &all_signals );
+
+ status = sigtimedwait( &all_signals, NULL, NULL );
+
+ return status;
+}
diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
new file mode 100644
index 0000000000..95213389cb
--- /dev/null
+++ b/cpukit/posix/src/pthread.c
@@ -0,0 +1,1309 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+#include <limits.h>
+
+#include <rtems/system.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/psignal.h>
+#include <rtems/posix/config.h>
+#include <rtems/posix/key.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * The default pthreads attributes structure.
+ *
+ * NOTE: Be careful .. if the default attribute set changes,
+ * _POSIX_Threads_Initialize_user_threads will need to be examined.
+ *
+ */
+
+const pthread_attr_t _POSIX_Threads_Default_attributes = {
+ TRUE, /* is_initialized */
+ NULL, /* stackaddr */
+ PTHREAD_MINIMUM_STACK_SIZE, /* stacksize */
+ PTHREAD_SCOPE_PROCESS, /* contentionscope */
+ PTHREAD_INHERIT_SCHED, /* inheritsched */
+ SCHED_FIFO, /* schedpolicy */
+ { /* schedparam */
+ 2, /* sched_priority */
+ 0, /* ss_low_priority */
+ { 0L, 0 }, /* ss_replenish_period */
+ { 0L, 0 } /* ss_initial_budget */
+ },
+ PTHREAD_CREATE_JOINABLE, /* detachstate */
+ 1 /* cputime_clock_allowed */
+};
+
+/*PAGE
+ *
+ * _POSIX_Threads_Sporadic_budget_TSR
+ */
+
+void _POSIX_Threads_Sporadic_budget_TSR(
+ Objects_Id id,
+ void *argument
+)
+{
+ unsigned32 ticks;
+ unsigned32 new_priority;
+ Thread_Control *the_thread;
+ POSIX_API_Control *api;
+
+ the_thread = argument;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ ticks = _POSIX_Timespec_to_interval( &api->schedparam.ss_initial_budget );
+
+ if ( !ticks )
+ ticks = 1;
+
+ the_thread->cpu_time_budget = ticks;
+
+ new_priority = _POSIX_Priority_To_core( api->ss_high_priority );
+ the_thread->real_priority = new_priority;
+
+ if ( the_thread->resource_count == 0 ||
+ the_thread->current_priority > new_priority )
+ _Thread_Change_priority( the_thread, new_priority, TRUE );
+
+ ticks = _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period );
+
+ if ( !ticks )
+ ticks = 1;
+
+ _Watchdog_Insert_ticks( &api->Sporadic_timer, ticks );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Sporadic_budget_callout
+ */
+
+void _POSIX_Threads_Sporadic_budget_callout(
+ Thread_Control *the_thread
+)
+{
+ POSIX_API_Control *api;
+ unsigned32 new_priority;
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ /*
+ * This will prevent the thread from consuming its entire "budget"
+ * while at low priority.
+ */
+
+
+ the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */
+
+ new_priority = _POSIX_Priority_To_core( api->schedparam.ss_low_priority );
+ the_thread->real_priority = new_priority;
+
+ if ( the_thread->resource_count == 0 ||
+ the_thread->current_priority > new_priority )
+ _Thread_Change_priority( the_thread, new_priority, TRUE );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Create_extension
+ *
+ * XXX
+ */
+
+boolean _POSIX_Threads_Create_extension(
+ Thread_Control *executing,
+ Thread_Control *created
+)
+{
+ POSIX_API_Control *api;
+ POSIX_API_Control *executing_api;
+
+ api = _Workspace_Allocate( sizeof( POSIX_API_Control ) );
+
+ if ( !api )
+ return FALSE;
+
+ created->API_Extensions[ THREAD_API_POSIX ] = api;
+
+ /* XXX check all fields are touched */
+ api->Attributes = _POSIX_Threads_Default_attributes;
+ api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
+ api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
+ api->schedparam = _POSIX_Threads_Default_attributes.schedparam;
+ api->schedparam.sched_priority =
+ _POSIX_Priority_From_core( created->current_priority );
+
+ /*
+ * If the thread is not a posix thread, then all posix signals are blocked
+ * by default.
+ */
+
+ /* XXX use signal constants */
+ api->signals_pending = 0;
+ if ( _Objects_Get_class( created->Object.id ) == OBJECTS_POSIX_THREADS ) {
+ executing_api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ api->signals_blocked = api->signals_blocked;
+ } else
+ api->signals_blocked = 0xffffffff;
+
+/* XXX set signal parameters -- block all signals for non-posix threads */
+
+ _Thread_queue_Initialize(
+ &api->Join_List,
+ OBJECTS_NO_CLASS, /* only used for proxy operations */
+ THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_JOIN_AT_EXIT,
+ NULL, /* no extract proxy handler */
+ 0
+ );
+
+ _Watchdog_Initialize(
+ &api->Sporadic_timer,
+ _POSIX_Threads_Sporadic_budget_TSR,
+ created->Object.id,
+ created
+ );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Delete_extension
+ */
+
+User_extensions_routine _POSIX_Threads_Delete_extension(
+ Thread_Control *executing,
+ Thread_Control *deleted
+)
+{
+ Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ void **value_ptr;
+
+ api = deleted->API_Extensions[ THREAD_API_POSIX ];
+
+ /* XXX run cancellation handlers */
+
+ _POSIX_Keys_Run_destructors( deleted );
+
+ /*
+ * Wakeup all the tasks which joined with this one
+ */
+
+ value_ptr = (void **) deleted->Wait.return_argument;
+
+ while ( (the_thread = _Thread_queue_Dequeue( &api->Join_List )) )
+ *(void **)the_thread->Wait.return_argument = value_ptr;
+
+ if ( api->schedpolicy == SCHED_SPORADIC )
+ (void) _Watchdog_Remove( &api->Sporadic_timer );
+
+ deleted->API_Extensions[ THREAD_API_POSIX ] = NULL;
+
+ (void) _Workspace_Free( api );
+}
+
+/*PAGE
+ *
+ * _POSIX_Threads_Initialize_user_threads
+ *
+ * This routine creates and starts all configured user
+ * initialzation threads.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Threads_Initialize_user_threads( void )
+{
+ int status;
+ unsigned32 index;
+ unsigned32 maximum;
+ posix_initialization_threads_table *user_threads;
+ pthread_t thread_id;
+ pthread_attr_t attr;
+
+ user_threads = _POSIX_Threads_User_initialization_threads;
+ maximum = _POSIX_Threads_Number_of_initialization_threads;
+
+ if ( !user_threads || maximum == 0 )
+ return;
+
+ /*
+ * Be careful .. if the default attribute set changes, this may need to.
+ *
+ * Setting the attributes explicitly is critical, since we don't want
+ * to inherit the idle tasks attributes.
+ */
+
+ for ( index=0 ; index < maximum ; index++ ) {
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
+ assert( !status );
+
+ status = pthread_attr_setstacksize( &attr, PTHREAD_MINIMUM_STACK_SIZE * 2 );
+ assert( !status );
+
+ status = pthread_create(
+ &thread_id,
+ &attr,
+ user_threads[ index ].entry,
+ NULL
+ );
+ assert( !status );
+ }
+}
+
+/*PAGE
+ *
+ * API Extension control structures
+ */
+
+API_extensions_Control _POSIX_Threads_API_extensions = {
+ { NULL, NULL },
+ NULL, /* predriver */
+ _POSIX_Threads_Initialize_user_threads, /* postdriver */
+ _POSIX_signals_Post_switch_extension, /* post switch */
+};
+
+User_extensions_Control _POSIX_Threads_User_extensions = {
+ { NULL, NULL },
+ { _POSIX_Threads_Create_extension, /* create */
+ NULL, /* start */
+ NULL, /* restart */
+ _POSIX_Threads_Delete_extension, /* delete */
+ NULL, /* switch */
+ NULL, /* begin */
+ NULL, /* exitted */
+ NULL /* fatal */
+ }
+};
+
+/*PAGE
+ *
+ * _POSIX_Threads_Manager_initialization
+ *
+ * This routine initializes all threads manager related data structures.
+ *
+ * Input parameters:
+ * maximum_pthreads - maximum configured pthreads
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Threads_Manager_initialization(
+ unsigned32 maximum_pthreads,
+ unsigned32 number_of_initialization_threads,
+ posix_initialization_threads_table *user_threads
+
+)
+{
+ _POSIX_Threads_Number_of_initialization_threads =
+ number_of_initialization_threads;
+ _POSIX_Threads_User_initialization_threads = user_threads;
+
+ /*
+ * There may not be any POSIX initialization threads configured.
+ */
+
+#if 0
+ if ( user_threads == NULL || number_of_initialization_threads == 0 )
+ _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, TRUE, EINVAL );
+#endif
+
+ _Objects_Initialize_information(
+ &_POSIX_Threads_Information,
+ OBJECTS_POSIX_THREADS,
+ FALSE, /* does not support global */
+ maximum_pthreads,
+ sizeof( Thread_Control ),
+ TRUE,
+ 5, /* length is arbitrary for now */
+ TRUE /* this class is threads */
+ );
+
+ /*
+ * Add all the extensions for this API
+ */
+
+ _User_extensions_Add_API_set( &_POSIX_Threads_User_extensions );
+
+ _API_extensions_Add( &_POSIX_Threads_API_extensions );
+
+ /*
+ * If we supported MP, then here we would ...
+ * Register the MP Process Packet routine.
+ */
+
+}
+
+/*PAGE
+ *
+ * 3.1.3 Register Fork Handlers, P1003.1c/Draft 10, P1003.1c/Draft 10, p. 27
+ *
+ * RTEMS does not support processes, so we fall under this and do not
+ * provide this routine:
+ *
+ * "Either the implementation shall support the pthread_atfork() function
+ * as described above or the pthread_atfork() funciton shall not be
+ * provided."
+ */
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setscope(
+ pthread_attr_t *attr,
+ int contentionscope
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( contentionscope ) {
+ case PTHREAD_SCOPE_PROCESS:
+ attr->contentionscope = contentionscope;
+ return 0;
+
+ case PTHREAD_SCOPE_SYSTEM:
+ return ENOTSUP;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getscope(
+ const pthread_attr_t *attr,
+ int *contentionscope
+)
+{
+ if ( !attr || !attr->is_initialized || !contentionscope )
+ return EINVAL;
+
+ *contentionscope = attr->contentionscope;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setinheritsched(
+ pthread_attr_t *attr,
+ int inheritsched
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( inheritsched ) {
+ case PTHREAD_INHERIT_SCHED:
+ case PTHREAD_EXPLICIT_SCHED:
+ attr->inheritsched = inheritsched;
+ return 0;
+
+ default:
+ return ENOTSUP;
+ }
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getinheritsched(
+ const pthread_attr_t *attr,
+ int *inheritsched
+)
+{
+ if ( !attr || !attr->is_initialized || !inheritsched )
+ return EINVAL;
+
+ *inheritsched = attr->inheritsched;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setschedpolicy(
+ pthread_attr_t *attr,
+ int policy
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( policy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ case SCHED_SPORADIC:
+ attr->schedpolicy = policy;
+ return 0;
+
+ default:
+ return ENOTSUP;
+ }
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getschedpolicy(
+ const pthread_attr_t *attr,
+ int *policy
+)
+{
+ if ( !attr || !attr->is_initialized || !policy )
+ return EINVAL;
+
+ *policy = attr->schedpolicy;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Parameters, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_setschedparam(
+ pthread_attr_t *attr,
+ const struct sched_param *param
+)
+{
+ if ( !attr || !attr->is_initialized || !param )
+ return EINVAL;
+
+ attr->schedparam = *param;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.1 Thread Creation Scheduling Attributes, P1003.1c/Draft 10, p. 120
+ */
+
+int pthread_attr_getschedparam(
+ const pthread_attr_t *attr,
+ struct sched_param *param
+)
+{
+ if ( !attr || !attr->is_initialized || !param )
+ return EINVAL;
+
+ *param = attr->schedparam;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.5.2 Dynamic Thread Scheduling Parameters Access,
+ * P1003.1c/Draft 10, p. 124
+ */
+
+int pthread_getschedparam(
+ pthread_t thread,
+ int *policy,
+ struct sched_param *param
+)
+{
+ Objects_Locations location;
+ POSIX_API_Control *api;
+ register Thread_Control *the_thread;
+
+ if ( !policy || !param )
+ return EINVAL;
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+ *policy = api->schedpolicy;
+ *param = api->schedparam;
+ param->sched_priority =
+ _POSIX_Priority_From_core( the_thread->current_priority );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+
+}
+
+/*PAGE
+ *
+ * 13.5.2 Dynamic Thread Scheduling Parameters Access,
+ * P1003.1c/Draft 10, p. 124
+ */
+
+int pthread_setschedparam(
+ pthread_t thread,
+ int policy,
+ struct sched_param *param
+)
+{
+ register Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ Objects_Locations location;
+
+ /*
+ * Check all the parameters
+ */
+
+ if ( !param )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( param->sched_priority ) )
+ return EINVAL;
+
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ budget_callout = NULL;
+
+ switch ( policy ) {
+ case SCHED_OTHER:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
+ break;
+
+ case SCHED_FIFO:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ break;
+
+ case SCHED_RR:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
+ break;
+
+ case SCHED_SPORADIC:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+ budget_callout = _POSIX_Threads_Sporadic_budget_callout;
+
+ if ( _POSIX_Timespec_to_interval( &param->ss_replenish_period ) <
+ _POSIX_Timespec_to_interval( &param->ss_initial_budget ) )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( param->ss_low_priority ) )
+ return EINVAL;
+
+ break;
+
+ default:
+ return EINVAL;
+ }
+
+ /*
+ * Actually change the scheduling policy and parameters
+ */
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( api->schedpolicy == SCHED_SPORADIC )
+ (void) _Watchdog_Remove( &api->Sporadic_timer );
+
+ api->schedpolicy = policy;
+ api->schedparam = *param;
+ the_thread->budget_algorithm = budget_algorithm;
+ the_thread->budget_callout = budget_callout;
+
+ switch ( api->schedpolicy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice;
+
+ the_thread->real_priority =
+ _POSIX_Priority_To_core( api->schedparam.sched_priority );
+
+ _Thread_Change_priority(
+ the_thread,
+ the_thread->real_priority,
+ TRUE
+ );
+ break;
+
+ case SCHED_SPORADIC:
+ api->ss_high_priority = api->schedparam.sched_priority;
+ _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread );
+ break;
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_init(
+ pthread_attr_t *attr
+)
+{
+ if ( !attr )
+ return EINVAL;
+
+ *attr = _POSIX_Threads_Default_attributes;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_destroy(
+ pthread_attr_t *attr
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ attr->is_initialized = FALSE;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_getstacksize(
+ const pthread_attr_t *attr,
+ size_t *stacksize
+)
+{
+ if ( !attr || !attr->is_initialized || !stacksize )
+ return EINVAL;
+
+ *stacksize = attr->stacksize;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_setstacksize(
+ pthread_attr_t *attr,
+ size_t stacksize
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ if (stacksize < PTHREAD_MINIMUM_STACK_SIZE)
+ attr->stacksize = PTHREAD_MINIMUM_STACK_SIZE;
+ else
+ attr->stacksize = stacksize;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_getstackaddr(
+ const pthread_attr_t *attr,
+ void **stackaddr
+)
+{
+ if ( !attr || !attr->is_initialized || !stackaddr )
+ return EINVAL;
+
+ *stackaddr = attr->stackaddr;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_setstackaddr(
+ pthread_attr_t *attr,
+ void *stackaddr
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ attr->stackaddr = stackaddr;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_getdetachstate(
+ const pthread_attr_t *attr,
+ int *detachstate
+)
+{
+ if ( !attr || !attr->is_initialized || !detachstate )
+ return EINVAL;
+
+ *detachstate = attr->detachstate;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.1 Thread Creation Attributes, P1003.1c/Draft 10, p, 140
+ */
+
+int pthread_attr_setdetachstate(
+ pthread_attr_t *attr,
+ int detachstate
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( detachstate ) {
+ case PTHREAD_CREATE_DETACHED:
+ case PTHREAD_CREATE_JOINABLE:
+ attr->detachstate = detachstate;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 16.1.2 Thread Creation, P1003.1c/Draft 10, p. 144
+ */
+
+int pthread_create(
+ pthread_t *thread,
+ const pthread_attr_t *attr,
+ void *(*start_routine)( void * ),
+ void *arg
+)
+{
+ const pthread_attr_t *the_attr;
+ Priority_Control core_priority;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ boolean is_fp;
+ boolean status;
+ Thread_Control *the_thread;
+ char *default_name = "psx";
+ POSIX_API_Control *api;
+ int schedpolicy = SCHED_RR;
+ struct sched_param schedparam;
+
+ the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes;
+
+ if ( !the_attr->is_initialized )
+ return EINVAL;
+
+ /*
+ * Core Thread Initialize insures we get the minimum amount of
+ * stack space if it is allowed to allocate it itself.
+ */
+
+ if ( the_attr->stackaddr && !_Stack_Is_enough( the_attr->stacksize ) )
+ return EINVAL;
+
+#if 0
+ int cputime_clock_allowed; /* see time.h */
+ POSIX_NOT_IMPLEMENTED();
+#endif
+
+ /*
+ * P1003.1c/Draft 10, p. 121.
+ *
+ * If inheritsched is set to PTHREAD_INHERIT_SCHED, then this thread
+ * inherits scheduling attributes from the creating thread. If it is
+ * PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the
+ * attributes structure.
+ */
+
+ switch ( the_attr->inheritsched ) {
+ case PTHREAD_INHERIT_SCHED:
+ api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
+ schedpolicy = api->schedpolicy;
+ schedparam = api->schedparam;
+ break;
+
+ case PTHREAD_EXPLICIT_SCHED:
+ schedpolicy = the_attr->schedpolicy;
+ schedparam = the_attr->schedparam;
+ break;
+
+ default:
+ return EINVAL;
+ }
+
+ /*
+ * Check the contentionscope since rtems only supports PROCESS wide
+ * contention (i.e. no system wide contention).
+ */
+
+ if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS )
+ return ENOTSUP;
+
+ /*
+ * Interpret the scheduling parameters.
+ */
+
+ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) )
+ return EINVAL;
+
+ core_priority = _POSIX_Priority_To_core( schedparam.sched_priority );
+
+ /*
+ * Set the core scheduling policy information.
+ */
+
+ budget_callout = NULL;
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+
+ switch ( schedpolicy ) {
+ case SCHED_OTHER:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
+ break;
+
+ case SCHED_FIFO:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ break;
+
+ case SCHED_RR:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE;
+ break;
+
+ case SCHED_SPORADIC:
+ budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT;
+ budget_callout = _POSIX_Threads_Sporadic_budget_callout;
+
+ if ( _POSIX_Timespec_to_interval( &schedparam.ss_replenish_period ) <
+ _POSIX_Timespec_to_interval( &schedparam.ss_initial_budget ) )
+ return EINVAL;
+
+ if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) )
+ return EINVAL;
+
+ break;
+
+ default:
+ return EINVAL;
+ }
+
+ /*
+ * Currently all POSIX threads are floating point if the hardware
+ * supports it.
+ */
+
+ is_fp = CPU_HARDWARE_FP;
+
+ /*
+ * Disable dispatch for protection
+ */
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Allocate the thread control block.
+ *
+ * NOTE: Global threads are not currently supported.
+ */
+
+ the_thread = _POSIX_Threads_Allocate();
+
+ if ( !the_thread ) {
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ /*
+ * Initialize the core thread for this task.
+ */
+
+ status = _Thread_Initialize(
+ &_POSIX_Threads_Information,
+ the_thread,
+ the_attr->stackaddr,
+ the_attr->stacksize,
+ is_fp,
+ core_priority,
+ TRUE, /* preemptible */
+ budget_algorithm,
+ budget_callout,
+ 0, /* isr level */
+ &default_name /* posix threads don't have a name */
+ );
+
+ if ( !status ) {
+ _POSIX_Threads_Free( the_thread );
+ _Thread_Enable_dispatch();
+ return EAGAIN;
+ }
+
+ /*
+ * finish initializing the per API structure
+ */
+
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ api->Attributes = *the_attr;
+ api->detachstate = the_attr->detachstate;
+ api->schedpolicy = schedpolicy;
+ api->schedparam = schedparam;
+
+ /*
+ * This insures we evaluate the process-wide signals pending when we
+ * first run.
+ *
+ * NOTE: Since the thread starts with all unblocked, this is necessary.
+ */
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ /*
+ * POSIX threads are allocated and started in one operation.
+ */
+
+ status = _Thread_Start(
+ the_thread,
+ THREAD_START_POINTER,
+ start_routine,
+ arg,
+ 0 /* unused */
+ );
+
+ if ( schedpolicy == SCHED_SPORADIC ) {
+ _Watchdog_Insert_ticks(
+ &api->Sporadic_timer,
+ _POSIX_Timespec_to_interval( &api->schedparam.ss_replenish_period )
+ );
+ }
+
+ /*
+ * _Thread_Start only fails if the thread was in the incorrect state
+ */
+
+ if ( !status ) {
+ _POSIX_Threads_Free( the_thread );
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ /*
+ * Return the id and indicate we successfully created the thread
+ */
+
+ *thread = the_thread->Object.id;
+
+ _Thread_Enable_dispatch();
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 16.1.3 Wait for Thread Termination, P1003.1c/Draft 10, p. 147
+ */
+
+int pthread_join(
+ pthread_t thread,
+ void **value_ptr
+)
+{
+ register Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Objects_Locations location;
+ void *return_pointer;
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+
+ if ( api->detachstate == PTHREAD_CREATE_DETACHED ) {
+ _Thread_Enable_dispatch();
+ return EINVAL;
+ }
+
+ if ( _Thread_Is_executing( the_thread ) ) {
+ _Thread_Enable_dispatch();
+ return EDEADLK;
+ }
+
+ /*
+ * Put ourself on the threads join list
+ */
+
+ _Thread_Executing->Wait.return_argument = (unsigned32 *) &return_pointer;
+
+ _Thread_queue_Enter_critical_section( &api->Join_List );
+
+ _Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT );
+
+ _Thread_Enable_dispatch();
+
+ if ( value_ptr )
+ *value_ptr = return_pointer;
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 16.1.4 Detaching a Thread, P1003.1c/Draft 10, p. 149
+ */
+
+int pthread_detach(
+ pthread_t thread
+)
+{
+ register Thread_Control *the_thread;
+ POSIX_API_Control *api;
+ Objects_Locations location;
+
+ the_thread = _POSIX_Threads_Get( thread, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ return ESRCH;
+ case OBJECTS_LOCAL:
+
+ api = the_thread->API_Extensions[ THREAD_API_POSIX ];
+ api->detachstate = PTHREAD_CREATE_DETACHED;
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 16.1.5.1 Thread Termination, p1003.1c/Draft 10, p. 150
+ *
+ * NOTE: Key destructors are executed in the POSIX api delete extension.
+ */
+
+void pthread_exit(
+ void *value_ptr
+)
+{
+ _Thread_Disable_dispatch();
+
+ _Thread_Executing->Wait.return_argument = (unsigned32 *)value_ptr;
+
+ _Thread_Close( &_POSIX_Threads_Information, _Thread_Executing );
+
+ _POSIX_Threads_Free( _Thread_Executing );
+
+ _Thread_Enable_dispatch();
+}
+
+/*PAGE
+ *
+ * 16.1.6 Get Calling Thread's ID, p1003.1c/Draft 10, p. 152
+ */
+
+pthread_t pthread_self( void )
+{
+ return _Thread_Executing->Object.id;
+}
+
+/*PAGE
+ *
+ * 16.1.7 Compare Thread IDs, p1003.1c/Draft 10, p. 153
+ *
+ * NOTE: POSIX does not define the behavior when either thread id is invalid.
+ */
+
+int pthread_equal(
+ pthread_t t1,
+ pthread_t t2
+)
+{
+ /*
+ * If the system is configured for debug, then we will do everything we
+ * can to insure that both ids are valid. Otherwise, we will do the
+ * cheapest possible thing to determine if they are equal.
+ */
+
+#ifndef RTEMS_DEBUG
+ return _Objects_Are_ids_equal( t1, t2 );
+#else
+ int status;
+ Objects_Locations location;
+
+ /*
+ * By default this is not a match.
+ */
+
+ status = 0;
+
+ /*
+ * Validate the first id and return 0 if it is not valid
+ */
+
+ (void) _POSIX_Threads_Get( t1, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ break;
+
+ case OBJECTS_LOCAL:
+
+ /*
+ * Validate the second id and return 0 if it is not valid
+ */
+
+ (void) _POSIX_Threads_Get( t2, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ break;
+ case OBJECTS_LOCAL:
+ status = _Objects_Are_ids_equal( t1, t2 );
+ break;
+ }
+ _Thread_Unnest_dispatch();
+ break;
+ }
+
+ _Thread_Enable_dispatch();
+ return status;
+#endif
+}
+
+/*PAGE
+ *
+ * 16.1.8 Dynamic Package Initialization, P1003.1c/Draft 10, p. 154
+ */
+
+int pthread_once(
+ pthread_once_t *once_control,
+ void (*init_routine)(void)
+)
+{
+ if ( !once_control || !init_routine )
+ return EINVAL;
+
+ _Thread_Disable_dispatch();
+
+ if ( !once_control->init_executed ) {
+ once_control->is_initialized = TRUE;
+ once_control->init_executed = TRUE;
+ (*init_routine)();
+ }
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+/*PAGE
+ *
+ * 20.1.6 Accessing a Thread CPU-time Clock, P1003.4b/Draft 8, p. 58
+ */
+
+int pthread_getcpuclockid(
+ pthread_t pid,
+ clockid_t *clock_id
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59
+ */
+
+int pthread_attr_setcputime(
+ pthread_attr_t *attr,
+ int clock_allowed
+)
+{
+ if ( !attr || !attr->is_initialized )
+ return EINVAL;
+
+ switch ( clock_allowed ) {
+ case CLOCK_ENABLED:
+ case CLOCK_DISABLED:
+ attr->cputime_clock_allowed = clock_allowed;
+ return 0;
+
+ default:
+ return EINVAL;
+ }
+}
+
+/*PAGE
+ *
+ * 20.1.7 CPU-time Clock Thread Creation Attribute, P1003.4b/Draft 8, p. 59
+ */
+
+int pthread_attr_getcputime(
+ pthread_attr_t *attr,
+ int *clock_allowed
+)
+{
+ if ( !attr || !attr->is_initialized || !clock_allowed )
+ return EINVAL;
+
+ *clock_allowed = attr->cputime_clock_allowed;
+ return 0;
+}
diff --git a/cpukit/posix/src/ptimer.c b/cpukit/posix/src/ptimer.c
new file mode 100644
index 0000000000..0446a7a683
--- /dev/null
+++ b/cpukit/posix/src/ptimer.c
@@ -0,0 +1,75 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <time.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+
+#include <rtems/posix/time.h>
+
+/*
+ * 14.2.2 Create a Per-Process Timer, P1003.1b-1993, p. 264
+ */
+
+int timer_create(
+ clockid_t clock_id,
+ struct sigevent *evp,
+ timer_t *timerid
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.3 Delete a Per_process Timer, P1003.1b-1993, p. 266
+ */
+
+int timer_delete(
+ timer_t timerid
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.4 Per-Process Timers, P1003.1b-1993, p. 267
+ */
+
+int timer_settime(
+ timer_t timerid,
+ int flags,
+ const struct itimerspec *value,
+ struct itimerspec *ovalue
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.4 Per-Process Timers, P1003.1b-1993, p. 267
+ */
+
+int timer_gettime(
+ timer_t timerid,
+ struct itimerspec *value
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*
+ * 14.2.4 Per-Process Timers, P1003.1b-1993, p. 267
+ */
+
+int timer_getoverrun(
+ timer_t timerid
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/cpukit/posix/src/sched.c b/cpukit/posix/src/sched.c
new file mode 100644
index 0000000000..e558126926
--- /dev/null
+++ b/cpukit/posix/src/sched.c
@@ -0,0 +1,153 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <sched.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/thread.h>
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * 13.3.1 Set Scheduling Parameters, P1003.1b-1993, p. 252
+ *
+ */
+
+int sched_setparam(
+ pid_t pid,
+ const struct sched_param *param
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.2 Set Scheduling Parameters, P1003.1b-1993, p. 253
+ */
+
+int sched_getparam(
+ pid_t pid,
+ const struct sched_param *param
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.3 Set Scheduling Policy and Scheduling Parameters,
+ * P1003.1b-1993, p. 254
+ */
+
+int sched_setscheduler(
+ pid_t pid,
+ int policy,
+ const struct sched_param *param
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.4 Get Scheduling Policy, P1003.1b-1993, p. 256
+ */
+
+int sched_getscheduler(
+ pid_t pid
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_get_priority_max(
+ int policy
+)
+{
+ switch ( policy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ case SCHED_SPORADIC:
+ break;
+
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+ }
+
+ return POSIX_SCHEDULER_MAXIMUM_PRIORITY;
+}
+
+/*PAGE
+ *
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_get_priority_min(
+ int policy
+)
+{
+ switch ( policy ) {
+ case SCHED_OTHER:
+ case SCHED_FIFO:
+ case SCHED_RR:
+ case SCHED_SPORADIC:
+ break;
+
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+ }
+
+ return POSIX_SCHEDULER_MINIMUM_PRIORITY;
+}
+
+/*PAGE
+ *
+ * 13.3.6 Get Scheduling Parameter Limits, P1003.1b-1993, p. 258
+ */
+
+int sched_rr_get_interval(
+ pid_t pid,
+ struct timespec *interval
+)
+{
+ /* XXX do we need to support different time quantums per thread */
+
+ /*
+ * Only supported for the "calling process" (i.e. this node).
+ */
+
+ if ( pid != getpid() )
+ set_errno_and_return_minus_one( ESRCH );
+
+ if ( !interval )
+ set_errno_and_return_minus_one( EINVAL );
+
+ _POSIX_Interval_to_timespec( _Thread_Ticks_per_timeslice, interval );
+ return 0;
+}
+
+/*PAGE
+ *
+ * 13.3.5 Yield Processor, P1003.1b-1993, p. 257
+ */
+
+int sched_yield( void )
+{
+ _Thread_Disable_dispatch();
+ _Thread_Yield_processor();
+ _Thread_Enable_dispatch();
+ return 0;
+}
diff --git a/cpukit/posix/src/semaphore.c b/cpukit/posix/src/semaphore.c
new file mode 100644
index 0000000000..a968abe43b
--- /dev/null
+++ b/cpukit/posix/src/semaphore.c
@@ -0,0 +1,571 @@
+/*
+ * $Id$
+ */
+
+#include <stdarg.h>
+
+#include <errno.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <limits.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/semaphore.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Manager_initialization
+ *
+ * This routine initializes all semaphore manager related data structures.
+ *
+ * Input parameters:
+ * maximum_semaphores - maximum configured semaphores
+ *
+ * Output parameters: NONE
+ */
+
+void _POSIX_Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+)
+{
+ _Objects_Initialize_information(
+ &_POSIX_Semaphore_Information,
+ OBJECTS_POSIX_SEMAPHORES,
+ TRUE,
+ maximum_semaphores,
+ sizeof( POSIX_Semaphore_Control ),
+ TRUE,
+ _POSIX_PATH_MAX,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Create_support
+ */
+
+int _POSIX_Semaphore_Create_support(
+ const char *name,
+ int pshared,
+ unsigned int value,
+ POSIX_Semaphore_Control **the_sem
+)
+{
+ POSIX_Semaphore_Control *the_semaphore;
+ CORE_semaphore_Attributes *the_sem_attr;
+
+ _Thread_Disable_dispatch();
+
+ the_semaphore = _POSIX_Semaphore_Allocate();
+
+ if ( !the_semaphore ) {
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( ENOMEM );
+ }
+
+ if ( pshared == PTHREAD_PROCESS_SHARED &&
+ !( _Objects_MP_Allocate_and_open( &_POSIX_Semaphore_Information, 0,
+ the_semaphore->Object.id, FALSE ) ) ) {
+ _POSIX_Semaphore_Free( the_semaphore );
+ _Thread_Enable_dispatch();
+ set_errno_and_return_minus_one( EAGAIN );
+ }
+
+ the_semaphore->process_shared = pshared;
+
+ if ( name ) {
+ the_semaphore->named = TRUE;
+ the_semaphore->open_count = 1;
+ the_semaphore->linked = TRUE;
+ }
+ else
+ the_semaphore->named = FALSE;
+
+ the_sem_attr = &the_semaphore->Semaphore.Attributes;
+
+ /* XXX
+ *
+ * Note should this be based on the current scheduling policy?
+ */
+
+ the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO;
+
+ _CORE_semaphore_Initialize(
+ &the_semaphore->Semaphore,
+ OBJECTS_POSIX_SEMAPHORES,
+ the_sem_attr,
+ value,
+ 0 /* XXX - proxy_extract_callout is unused */
+ );
+
+ /* XXX - need Names to be a string!!! */
+ _Objects_Open(
+ &_POSIX_Semaphore_Information,
+ &the_semaphore->Object,
+ (char *) name
+ );
+
+ *the_sem = the_semaphore;
+
+ if ( pshared == PTHREAD_PROCESS_SHARED )
+ _POSIX_Semaphore_MP_Send_process_packet(
+ POSIX_SEMAPHORE_MP_ANNOUNCE_CREATE,
+ the_semaphore->Object.id,
+ (char *) name,
+ 0 /* proxy id - Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return 0;
+}
+
+
+/*PAGE
+ *
+ * 11.2.1 Initialize an Unnamed Semaphore, P1003.1b-1993, p.219
+ */
+
+int sem_init(
+ sem_t *sem,
+ int pshared,
+ unsigned int value
+)
+{
+ int status;
+ POSIX_Semaphore_Control *the_semaphore;
+
+ status = _POSIX_Semaphore_Create_support(
+ NULL,
+ pshared,
+ value,
+ &the_semaphore
+ );
+
+ if ( status != -1 )
+ *sem = the_semaphore->Object.id;
+
+ return status;
+}
+
+/*PAGE
+ *
+ * 11.2.2 Destroy an Unnamed Semaphore, P1003.1b-1993, p.220
+ */
+
+int sem_destroy(
+ sem_t *sem
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ /*
+ * Undefined operation on a named semaphore.
+ */
+
+ if ( the_semaphore->named == TRUE ) {
+ seterrno( EINVAL );
+ return( -1 );
+ }
+
+ _Objects_Close( &_POSIX_Semaphore_Information, &the_semaphore->Object );
+
+ _CORE_semaphore_Flush(
+ &the_semaphore->Semaphore,
+ _POSIX_Semaphore_MP_Send_object_was_deleted,
+ -1 /* XXX should also seterrno -> EINVAL */
+ );
+
+ _POSIX_Semaphore_Free( the_semaphore );
+
+ if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Semaphore_Information,
+ the_semaphore->Object.id
+ );
+
+ _POSIX_Semaphore_MP_Send_process_packet(
+ POSIX_SEMAPHORE_MP_ANNOUNCE_DELETE,
+ the_semaphore->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.3 Initialize/Open a Named Semaphore, P1003.1b-1993, p.221
+ *
+ * NOTE: When oflag is O_CREAT, then optional third and fourth
+ * parameters must be present.
+ */
+
+sem_t *sem_open(
+ const char *name,
+ int oflag,
+ ...
+ /* mode_t mode, */
+ /* unsigned int value */
+)
+{
+ va_list arg;
+ mode_t mode;
+ unsigned int value;
+ int status;
+ Objects_Id the_semaphore_id;
+ POSIX_Semaphore_Control *the_semaphore;
+
+
+ if ( oflag & O_CREAT ) {
+ va_start(arg, oflag);
+ mode = (mode_t) va_arg( arg, mode_t * );
+ value = (unsigned int) va_arg( arg, unsigned int * );
+ va_end(arg);
+ }
+
+ status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
+
+ /*
+ * If the name to id translation worked, then the semaphore exists
+ * and we can just return a pointer to the id. Otherwise we may
+ * need to check to see if this is a "semaphore does not exist"
+ * or some other miscellaneous error on the name.
+ */
+
+ if ( status ) {
+
+ if ( status == EINVAL ) { /* name -> ID translation failed */
+ if ( !(oflag & O_CREAT) ) { /* willing to create it? */
+ seterrno( ENOENT );
+ return (sem_t *) -1;
+ }
+ /* we are willing to create it */
+ }
+ seterrno( status ); /* some type of error */
+ return (sem_t *) -1;
+
+ } else { /* name -> ID translation succeeded */
+
+ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) {
+ seterrno( EEXIST );
+ return (sem_t *) -1;
+ }
+
+ /*
+ * XXX In this case we need to do an ID->pointer conversion to
+ * check the mode. This is probably a good place for a subroutine.
+ */
+
+ the_semaphore->open_count += 1;
+
+ return (sem_t *)&the_semaphore->Object.id;
+
+ }
+
+ /* XXX verify this comment...
+ *
+ * At this point, the semaphore does not exist and everything has been
+ * checked. We should go ahead and create a semaphore.
+ */
+
+ status = _POSIX_Semaphore_Create_support(
+ name,
+ TRUE, /* shared across processes */
+ value,
+ &the_semaphore
+ );
+
+ if ( status == -1 )
+ return (sem_t *) -1;
+
+ return (sem_t *) &the_semaphore->Object.id;
+
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Delete
+ */
+
+void _POSIX_Semaphore_Delete(
+ POSIX_Semaphore_Control *the_semaphore
+)
+{
+ if ( !the_semaphore->linked && !the_semaphore->open_count ) {
+ _POSIX_Semaphore_Free( the_semaphore );
+
+ if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
+
+ _Objects_MP_Close(
+ &_POSIX_Semaphore_Information,
+ the_semaphore->Object.id
+ );
+
+ _POSIX_Semaphore_MP_Send_process_packet(
+ POSIX_SEMAPHORE_MP_ANNOUNCE_DELETE,
+ the_semaphore->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+
+ }
+}
+
+/*PAGE
+ *
+ * 11.2.4 Close a Named Semaphore, P1003.1b-1993, p.224
+ */
+
+int sem_close(
+ sem_t *sem
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ the_semaphore->open_count -= 1;
+ _POSIX_Semaphore_Delete( the_semaphore );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.5 Remove a Named Semaphore, P1003.1b-1993, p.225
+ */
+
+int sem_unlink(
+ const char *name
+)
+{
+ int status;
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Id the_semaphore_id;
+ Objects_Locations location;
+
+ status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id );
+
+ if ( !status )
+ set_errno_and_return_minus_one( status );
+
+ the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+
+ if ( the_semaphore->process_shared == PTHREAD_PROCESS_SHARED ) {
+ _Objects_MP_Close(
+ &_POSIX_Semaphore_Information,
+ the_semaphore->Object.id
+ );
+ }
+
+ the_semaphore->linked = FALSE;
+
+ _POSIX_Semaphore_Delete( the_semaphore );
+
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * _POSIX_Semaphore_Wait_support
+ */
+
+int _POSIX_Semaphore_Wait_support(
+ sem_t *sem,
+ boolean blocking,
+ Watchdog_Interval timeout
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ _CORE_semaphore_Seize(
+ &the_semaphore->Semaphore,
+ the_semaphore->Object.id,
+ blocking,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return _Thread_Executing->Wait.return_code;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_wait(
+ sem_t *sem
+)
+{
+ return _POSIX_Semaphore_Wait_support( sem, TRUE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_trywait(
+ sem_t *sem
+)
+{
+ return _POSIX_Semaphore_Wait_support( sem, FALSE, THREAD_QUEUE_WAIT_FOREVER );
+}
+
+/*PAGE
+ *
+ * 11.2.6 Lock a Semaphore, P1003.1b-1993, p.226
+ *
+ * NOTE: P1003.4b/D8 adds sem_timedwait(), p. 27
+ */
+
+int sem_timedwait(
+ sem_t *sem,
+ const struct timespec *timeout
+)
+{
+ return _POSIX_Semaphore_Wait_support(
+ sem,
+ TRUE,
+ _POSIX_Timespec_to_interval( timeout )
+ );
+}
+
+/*PAGE
+ *
+ * 11.2.7 Unlock a Semaphore, P1003.1b-1993, p.227
+ */
+
+void POSIX_Semaphore_MP_support(
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ (void) POSIX_MP_NOT_IMPLEMENTED();
+}
+
+
+int sem_post(
+ sem_t *sem
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ _CORE_semaphore_Surrender(
+ &the_semaphore->Semaphore,
+ the_semaphore->Object.id,
+ POSIX_Semaphore_MP_support
+ );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
+
+/*PAGE
+ *
+ * 11.2.8 Get the Value of a Semaphore, P1003.1b-1993, p.229
+ */
+
+int sem_getvalue(
+ sem_t *sem,
+ int *sval
+)
+{
+ register POSIX_Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _POSIX_Semaphore_Get( sem, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return POSIX_MP_NOT_IMPLEMENTED();
+ seterrno( EINVAL );
+ return( -1 );
+ case OBJECTS_LOCAL:
+ *sval = _CORE_semaphore_Get_count( &the_semaphore->Semaphore );
+ _Thread_Enable_dispatch();
+ return 0;
+ }
+ return POSIX_BOTTOM_REACHED();
+}
diff --git a/cpukit/posix/src/time.c b/cpukit/posix/src/time.c
new file mode 100644
index 0000000000..acb4b507b1
--- /dev/null
+++ b/cpukit/posix/src/time.c
@@ -0,0 +1,393 @@
+/*
+ * $Id$
+ */
+
+#include <assert.h>
+#include <time.h>
+#include <errno.h>
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+
+#include <rtems/posix/seterr.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_Timespec_subtract
+ */
+
+void _POSIX_Timespec_subtract(
+ const struct timespec *the_start,
+ const struct timespec *end,
+ struct timespec *result
+)
+{
+ struct timespec start_struct = *the_start;
+ struct timespec *start = &start_struct;
+ unsigned int nsecs_per_sec = TOD_NANOSECONDS_PER_SECOND;
+
+ if (end->tv_nsec < start->tv_nsec) {
+ int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec + 1;
+ start->tv_nsec -= nsecs_per_sec * seconds;
+ start->tv_sec += seconds;
+ }
+
+ if (end->tv_nsec - start->tv_nsec > nsecs_per_sec) {
+ int seconds = (start->tv_nsec - end->tv_nsec) / nsecs_per_sec;
+ start->tv_nsec += nsecs_per_sec * seconds;
+ start->tv_sec -= seconds;
+ }
+
+ result->tv_sec = end->tv_sec - start->tv_sec;
+ result->tv_nsec = end->tv_nsec - start->tv_nsec;
+}
+
+/*PAGE
+ *
+ * _POSIX_Timespec_to_interval
+ */
+
+Watchdog_Interval _POSIX_Timespec_to_interval(
+ const struct timespec *time
+)
+{
+ Watchdog_Interval ticks;
+
+ ticks = (time->tv_sec * TOD_MICROSECONDS_PER_SECOND) /
+ _TOD_Microseconds_per_tick;
+
+ ticks += (time->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
+ _TOD_Microseconds_per_tick;
+
+ return ticks;
+}
+
+/*PAGE
+ *
+ * _POSIX_Interval_to_timespec
+ */
+
+void _POSIX_Interval_to_timespec(
+ Watchdog_Interval ticks,
+ struct timespec *time
+)
+{
+ unsigned32 usecs;
+
+ usecs = ticks * _TOD_Microseconds_per_tick;
+
+ time->tv_sec = usecs / TOD_MICROSECONDS_PER_SECOND;
+ time->tv_nsec = (usecs % TOD_MICROSECONDS_PER_SECOND) *
+ TOD_NANOSECONDS_PER_MICROSECOND;
+}
+
+/*PAGE
+ *
+ * 4.5.1 Get System Time, P1003.1b-1993, p. 91
+ */
+
+/* Using the implementation in newlib */
+#if 0
+time_t time(
+ time_t *tloc
+)
+{
+ time_t seconds_since_epoch;
+
+ /*
+ * No error is the time of day is not set. For RTEMS the system time
+ * starts out at the rtems epoch.
+ */
+
+ /*
+ * Internally the RTEMS epoch is 1988. This must be taken into account.
+ */
+
+ seconds_since_epoch = _TOD_Seconds_since_epoch;
+
+ seconds_since_epoch += POSIX_TIME_SECONDS_1970_THROUGH_1988;
+
+ if ( tloc )
+ *tloc = seconds_since_epoch;
+
+ return seconds_since_epoch;
+}
+#endif
+
+/*PAGE
+ *
+ * 14.2.1 Clocks, P1003.1b-1993, p. 263
+ */
+
+int clock_settime(
+ clockid_t clock_id,
+ const struct timespec *tp
+)
+{
+ struct tm split_time;
+ TOD_Control tod;
+ Watchdog_Interval seconds;
+
+ assert( tp );
+
+ switch ( clock_id ) {
+
+ case CLOCK_REALTIME:
+ (void) gmtime_r( &tp->tv_sec, &split_time );
+
+ /*
+ * Convert the tm structure format to that used by the TOD Handler
+ *
+ * NOTE: TOD Handler does not honor leap seconds.
+ */
+
+ tod.year = split_time.tm_year + 1900; /* RHS is years since 1900 */
+ tod.month = split_time.tm_mon + 1; /* RHS uses 0-11 */
+ tod.day = split_time.tm_mday;
+ tod.hour = split_time.tm_hour;
+ tod.minute = split_time.tm_min;
+ tod.second = split_time.tm_sec; /* RHS allows 0-61 for leap seconds */
+
+ tod.ticks = (tp->tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND) /
+ _TOD_Microseconds_per_tick;
+
+ if ( !_TOD_Validate( &tod ) )
+ set_errno_and_return_minus_one( EINVAL );
+
+ /*
+ * We can't use the tp->tv_sec field because it is based on
+ * a different EPOCH.
+ */
+
+ seconds = _TOD_To_seconds( &tod );
+ _Thread_Disable_dispatch();
+ _TOD_Set( &tod, seconds );
+ _Thread_Enable_dispatch();
+ break;
+
+#ifdef _POSIX_CPUTIME
+ case CLOCK_PROCESS_CPUTIME:
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+
+#ifdef _POSIX_THREAD_CPUTIME
+ case CLOCK_THREAD_CPUTIME:
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+
+ }
+ return 0;
+}
+
+/*PAGE
+ *
+ * 14.2.1 Clocks, P1003.1b-1993, p. 263
+ */
+
+int clock_gettime(
+ clockid_t clock_id,
+ struct timespec *tp
+)
+{
+ ISR_Level level;
+ time_t seconds;
+ long ticks;
+
+ if ( !tp )
+ set_errno_and_return_minus_one( EINVAL );
+
+ switch ( clock_id ) {
+
+ case CLOCK_REALTIME:
+
+ _ISR_Disable( level );
+ seconds = _TOD_Seconds_since_epoch;
+ ticks = _TOD_Current.ticks;
+ _ISR_Enable( level );
+
+ tp->tv_sec = seconds + POSIX_TIME_SECONDS_1970_THROUGH_1988;
+ tp->tv_nsec = ticks * _TOD_Microseconds_per_tick *
+ TOD_NANOSECONDS_PER_MICROSECOND;
+ break;
+
+#ifdef _POSIX_CPUTIME
+ case CLOCK_PROCESS_CPUTIME:
+ /* don't base this on _Watchdog_Ticks_since_boot--duration is too short*/
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+
+#ifdef _POSIX_THREAD_CPUTIME
+ case CLOCK_THREAD_CPUTIME:
+ return POSIX_NOT_IMPLEMENTED();
+ break;
+#endif
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+
+ }
+ return 0;
+}
+
+/*PAGE
+ *
+ * 14.2.1 Clocks, P1003.1b-1993, p. 263
+ */
+
+int clock_getres(
+ clockid_t clock_id,
+ struct timespec *res
+)
+{
+ if ( !res )
+ set_errno_and_return_minus_one( EINVAL );
+
+ switch ( clock_id ) {
+
+ /*
+ * All time in rtems is based on the same clock tick.
+ */
+
+ case CLOCK_REALTIME:
+ case CLOCK_PROCESS_CPUTIME:
+ case CLOCK_THREAD_CPUTIME:
+ if ( res )
+ _POSIX_Interval_to_timespec( _TOD_Microseconds_per_tick, res );
+ break;
+
+ default:
+ set_errno_and_return_minus_one( EINVAL );
+
+ }
+ return 0;
+}
+
+/*PAGE
+ *
+ * 14.2.5 High Resolution Sleep, P1003.1b-1993, p. 269
+ */
+
+int nanosleep(
+ const struct timespec *rqtp,
+ struct timespec *rmtp
+)
+{
+ Watchdog_Interval ticks;
+ struct timespec *the_rqtp;
+
+ if ( !rqtp )
+ set_errno_and_return_minus_one( EINVAL );
+
+ the_rqtp = (struct timespec *)rqtp;
+
+ /*
+ * Return EAGAIN if the delay interval is negative.
+ *
+ * NOTE: This behavior is beyond the POSIX specification.
+ * FSU pthreads shares this behavior.
+ */
+
+ if ( the_rqtp->tv_sec < 0 )
+ the_rqtp->tv_sec = 0;
+
+ if ( /* the_rqtp->tv_sec < 0 || */ the_rqtp->tv_nsec < 0 )
+ set_errno_and_return_minus_one( EAGAIN );
+
+ if ( the_rqtp->tv_nsec >= TOD_NANOSECONDS_PER_SECOND )
+ set_errno_and_return_minus_one( EINVAL );
+
+ ticks = _POSIX_Timespec_to_interval( the_rqtp );
+
+ /*
+ * This behavior is also beyond the POSIX specification but is
+ * consistent with the RTEMS api and yields desirable behavior.
+ */
+
+ if ( !ticks ) {
+ _Thread_Yield_processor();
+ _Thread_Dispatch();
+ if ( rmtp ) {
+ rmtp->tv_sec = 0;
+ rmtp->tv_nsec = 0;
+ }
+ return 0;
+ }
+
+ _Thread_Disable_dispatch();
+ _Thread_Set_state(
+ _Thread_Executing,
+ STATES_DELAYING | STATES_INTERRUPTIBLE_BY_SIGNAL
+ );
+ _Watchdog_Initialize(
+ &_Thread_Executing->Timer,
+ _Thread_Delay_ended,
+ _Thread_Executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
+ _Thread_Enable_dispatch();
+
+ /* calculate time remaining */
+
+ if ( rmtp ) {
+ ticks -=
+ _Thread_Executing->Timer.stop_time - _Thread_Executing->Timer.start_time;
+
+ _POSIX_Interval_to_timespec( ticks, rmtp );
+
+ /*
+ * If there is time remaining, then we were interrupted by a signal.
+ */
+
+ if ( ticks )
+ set_errno_and_return_minus_one( EINTR );
+ }
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * 20.1.3 Accessing a Process CPU-time CLock, P1003.4b/D8, p. 55
+ */
+
+int clock_getcpuclockid(
+ pid_t pid,
+ clockid_t *clock_id
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 20.1.5 CPU-time Clock Attribute Access, P1003.4b/D8, p. 58
+ */
+
+int clock_setenable_attr(
+ clockid_t clock_id,
+ int attr
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
+
+/*PAGE
+ *
+ * 20.1.5 CPU-time Clock Attribute Access, P1003.4b/D8, p. 58
+ */
+
+int clock_getenable_attr(
+ clockid_t clock_id,
+ int *attr
+)
+{
+ return POSIX_NOT_IMPLEMENTED();
+}
diff --git a/cpukit/posix/src/types.c b/cpukit/posix/src/types.c
new file mode 100644
index 0000000000..4386ad5292
--- /dev/null
+++ b/cpukit/posix/src/types.c
@@ -0,0 +1,212 @@
+/*
+ * $Id$
+ */
+
+#include <limits.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/seterr.h>
+
+pid_t _POSIX_types_Ppid = 0;
+uid_t _POSIX_types_Uid = 0;
+uid_t _POSIX_types_Euid = 0;
+gid_t _POSIX_types_Gid = 0;
+gid_t _POSIX_types_Egid = 0;
+
+/*PAGE
+ *
+ * 4.1.1 Get Process and Parent Process IDs, P1003.1b-1993, p. 83
+ */
+
+pid_t getppid( void )
+{
+ return _POSIX_types_Ppid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+uid_t getuid( void )
+{
+ return _POSIX_types_Uid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+uid_t geteuid( void )
+{
+ return _POSIX_types_Euid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+gid_t getgid( void )
+{
+ return _POSIX_types_Gid;
+}
+
+/*PAGE
+ *
+ * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs,
+ * P1003.1b-1993, p. 84
+ */
+
+gid_t getegid( void )
+{
+ return _POSIX_types_Egid;
+}
+
+/*PAGE
+ *
+ * 4.2.2 Set User and Group IDs, P1003.1b-1993, p. 84
+ */
+
+int setuid(
+ uid_t uid
+)
+{
+ _POSIX_types_Uid = uid;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.2.2 Set User and Group IDs, P1003.1b-1993, p. 84
+ */
+
+int setgid(
+ gid_t gid
+)
+{
+ _POSIX_types_Gid = gid;
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.2.3 Get Supplementary IDs, P1003.1b-1993, p. 86
+ */
+
+int getgroups(
+ int gidsetsize,
+ gid_t grouplist[]
+)
+{
+ return 0; /* no supplemental group ids */
+}
+
+/*PAGE
+ *
+ * 4.2.4 Get User Name, P1003.1b-1993, p. 87
+ *
+ * NOTE: P1003.1c/D10, p. 49 adds getlogin_r().
+ */
+
+static char _POSIX_types_Getlogin_buffer[ LOGIN_NAME_MAX ];
+
+char *getlogin( void )
+{
+ (void) getlogin_r( _POSIX_types_Getlogin_buffer, LOGIN_NAME_MAX );
+ return _POSIX_types_Getlogin_buffer;
+}
+
+/*PAGE
+ *
+ * 4.2.4 Get User Name, P1003.1b-1993, p. 87
+ *
+ * NOTE: P1003.1c/D10, p. 49 adds getlogin_r().
+ */
+
+int getlogin_r(
+ char *name,
+ size_t namesize
+)
+{
+ if ( namesize < LOGIN_NAME_MAX )
+ return ERANGE;
+
+ strcpy( name, "posixapp" );
+ return 0;
+}
+
+/*PAGE
+ *
+ * 4.3.1 Get Process Group IDs, P1003.1b-1993, p. 89
+ */
+
+pid_t getpgrp( void )
+{
+ /*
+ * This always succeeds and returns the process group id. For rtems,
+ * this will always be the local node;
+ */
+
+ return _Objects_Local_node;
+}
+
+/*PAGE
+ *
+ * 4.3.2 Create Session and Set Process Group ID, P1003.1b-1993, p. 88
+ */
+
+pid_t setsid( void )
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*PAGE
+ *
+ * 4.3.3 Set Process Group ID for Job Control, P1003.1b-1993, p. 89
+ */
+
+int setpgid(
+ pid_t pid,
+ pid_t pgid
+)
+{
+ set_errno_and_return_minus_one( ENOSYS );
+}
+
+/*
+ * TEMPORARY
+ */
+
+#include <assert.h>
+
+int POSIX_MP_NOT_IMPLEMENTED()
+{
+ assert( 0 );
+ return 0;
+}
+
+int POSIX_BOTTOM_REACHED()
+{
+ assert( 0 );
+ return 0;
+}
+
+int POSIX_NOT_IMPLEMENTED()
+{
+ assert( 0 );
+ return 0;
+}
+
+/*
+ * END OF TEMPORARY
+ */
+
diff --git a/cpukit/rtems/include/rtems.h b/cpukit/rtems/include/rtems.h
new file mode 100644
index 0000000000..b78eec9b6b
--- /dev/null
+++ b/cpukit/rtems/include/rtems.h
@@ -0,0 +1,121 @@
+/* rtems.h
+ *
+ * This include file contains information about RTEMS executive that
+ * is required by the application and is CPU independent. It includes
+ * two (2) CPU dependent files to tailor its data structures for a
+ * particular processor.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_GENERIC_h
+#define __RTEMS_RTEMS_GENERIC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Unless told otherwise, the RTEMS include files will hide some stuff
+ * from normal application code. Defining this crosses a boundary which
+ * is undesirable since it means your application is using RTEMS features
+ * which are not included in the formally defined and supported API.
+ * Define this at your own risk.
+ */
+
+#ifndef __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#define __RTEMS_APPLICATION__
+#endif
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+
+#include <rtems/config.h>
+#include <rtems/init.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/extension.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/rtems/ratemon.h>
+#include <rtems/rtems/mp.h>
+
+#include <rtems/rtems/support.h>
+#include <rtems/score/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(class, node) OBJECTS_ID_INITIAL(class, 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
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/asr.h b/cpukit/rtems/include/rtems/rtems/asr.h
new file mode 100644
index 0000000000..9631f93d40
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/asr.h
@@ -0,0 +1,112 @@
+/* asr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Asynchronous Signal Handler. This Handler provides the low-level
+ * support required by the Signal Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ASR_h
+#define __RTEMS_ASR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/modes.h>
+
+/*
+ *
+ * The following type defines the control block used to manage
+ * each signal set.
+ */
+
+typedef unsigned32 rtems_signal_set;
+
+/*
+ * Return type for ASR Handler
+ */
+
+typedef void rtems_asr;
+
+/*
+ * The following type corresponds to the applications asynchronous
+ * signal processing routine.
+ */
+
+typedef rtems_asr ( *rtems_asr_entry )(
+ rtems_signal_set
+ );
+
+/*
+ *
+ * The following defines the control structure used to manage
+ * signals. Each thread has a copy of this record.
+ */
+
+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 */
+ rtems_signal_set signals_pending; /* pending signal set */
+ unsigned32 nest_level; /* nest level of RTEMS_ASR */
+} ASR_Information;
+
+/*
+ * The following constants define the individual signals which may
+ * be used to compose a signal set.
+ */
+
+#define RTEMS_SIGNAL_0 0x00000001
+#define RTEMS_SIGNAL_1 0x00000002
+#define RTEMS_SIGNAL_2 0x00000004
+#define RTEMS_SIGNAL_3 0x00000008
+#define RTEMS_SIGNAL_4 0x00000010
+#define RTEMS_SIGNAL_5 0x00000020
+#define RTEMS_SIGNAL_6 0x00000040
+#define RTEMS_SIGNAL_7 0x00000080
+#define RTEMS_SIGNAL_8 0x00000100
+#define RTEMS_SIGNAL_9 0x00000200
+#define RTEMS_SIGNAL_10 0x00000400
+#define RTEMS_SIGNAL_11 0x00000800
+#define RTEMS_SIGNAL_12 0x00001000
+#define RTEMS_SIGNAL_13 0x00002000
+#define RTEMS_SIGNAL_14 0x00004000
+#define RTEMS_SIGNAL_15 0x00008000
+#define RTEMS_SIGNAL_16 0x00010000
+#define RTEMS_SIGNAL_17 0x00020000
+#define RTEMS_SIGNAL_18 0x00040000
+#define RTEMS_SIGNAL_19 0x00080000
+#define RTEMS_SIGNAL_20 0x00100000
+#define RTEMS_SIGNAL_21 0x00200000
+#define RTEMS_SIGNAL_22 0x00400000
+#define RTEMS_SIGNAL_23 0x00800000
+#define RTEMS_SIGNAL_24 0x01000000
+#define RTEMS_SIGNAL_25 0x02000000
+#define RTEMS_SIGNAL_26 0x04000000
+#define RTEMS_SIGNAL_27 0x08000000
+#define RTEMS_SIGNAL_28 0x10000000
+#define RTEMS_SIGNAL_29 0x20000000
+#define RTEMS_SIGNAL_30 0x40000000
+#define RTEMS_SIGNAL_31 0x80000000
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/asr.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/attr.h b/cpukit/rtems/include/rtems/rtems/attr.h
new file mode 100644
index 0000000000..cada11dbad
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/attr.h
@@ -0,0 +1,84 @@
+/* attr.h
+ *
+ * This include file contains all information about the Object Attributes
+ * Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ATTRIBUTES_h
+#define __RTEMS_ATTRIBUTES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+typedef unsigned32 rtems_attribute;
+
+/* constants */
+
+#define RTEMS_DEFAULT_ATTRIBUTES 0x00000000
+
+#define RTEMS_NO_FLOATING_POINT 0x00000000 /* don't use FP HW */
+#define RTEMS_FLOATING_POINT 0x00000001 /* utilize coprocessor */
+
+#define RTEMS_LOCAL 0x00000000 /* local resource */
+#define RTEMS_GLOBAL 0x00000002 /* global resource */
+
+#define RTEMS_FIFO 0x00000000 /* process RTEMS_FIFO */
+#define RTEMS_PRIORITY 0x00000004 /* process by priority */
+
+#define RTEMS_COUNTING_SEMAPHORE 0x00000000
+#define RTEMS_BINARY_SEMAPHORE 0x00000010
+
+#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
+#define ATTRIBUTES_NOT_SUPPORTED RTEMS_FLOATING_POINT
+#endif
+
+#if ( CPU_ALL_TASKS_ARE_FP == TRUE )
+#define ATTRIBUTES_REQUIRED RTEMS_FLOATING_POINT
+#else
+#define ATTRIBUTES_REQUIRED 0
+#endif
+
+/*
+ * _Attributes_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs initialization for this handler.
+ *
+ * NOTE: There is no initialization required in C. Conditional compilation
+ * takes care of this in C.
+ */
+
+#define _Attributes_Handler_initialization()
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/attr.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/clock.h b/cpukit/rtems/include/rtems/rtems/clock.h
new file mode 100644
index 0000000000..6bdc06483d
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/clock.h
@@ -0,0 +1,103 @@
+/* clock.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Clock Manager. This manager provides facilities to set, obtain,
+ * and continually update the current date and time.
+ *
+ * This manager provides directives to:
+ *
+ * + set the current date and time
+ * + obtain the current date and time
+ * + announce a clock tick
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CLOCK_h
+#define __RTEMS_CLOCK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/tod.h>
+#include <rtems/rtems/types.h>
+
+/*
+ * List of things which can be returned by the rtems_clock_get directive.
+ */
+
+typedef enum {
+ RTEMS_CLOCK_GET_TOD,
+ RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH,
+ RTEMS_CLOCK_GET_TICKS_SINCE_BOOT,
+ RTEMS_CLOCK_GET_TICKS_PER_SECOND,
+ RTEMS_CLOCK_GET_TIME_VALUE
+} rtems_clock_get_options;
+
+/*
+ * Standard flavor style to return TOD in for a rtems_clock_get option.
+ */
+
+typedef struct {
+ unsigned32 seconds;
+ unsigned32 microseconds;
+} rtems_clock_time_value;
+
+/*
+ * rtems_clock_get
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_get directive. It returns
+ * one of the following:
+ * + current time of day
+ * + seconds since epoch
+ * + ticks since boot
+ * + ticks per second
+ */
+
+rtems_status_code rtems_clock_get(
+ rtems_clock_get_options option,
+ void *time_buffer
+);
+
+/*
+ * rtems_clock_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_set directive. It sets
+ * the current time of day to that in the time_buffer record.
+ */
+
+rtems_status_code rtems_clock_set(
+ rtems_time_of_day *time_buffer
+);
+
+/*
+ * rtems_clock_tick
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_clock_tick directive. It is invoked
+ * to inform RTEMS of the occurrence of a clock tick.
+ */
+
+rtems_status_code rtems_clock_tick( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/config.h b/cpukit/rtems/include/rtems/rtems/config.h
new file mode 100644
index 0000000000..0bdf3c974b
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/config.h
@@ -0,0 +1,54 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters specific for the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_CONFIGURATION_h
+#define __RTEMS_RTEMS_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/tasks.h>
+
+/*
+ * The following records define the Configuration Table. The
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + required number of each object type
+ */
+
+typedef struct {
+ unsigned32 maximum_tasks;
+ unsigned32 maximum_timers;
+ unsigned32 maximum_semaphores;
+ unsigned32 maximum_message_queues;
+ unsigned32 maximum_partitions;
+ unsigned32 maximum_regions;
+ unsigned32 maximum_ports;
+ unsigned32 maximum_periods;
+ unsigned32 number_of_initialization_tasks;
+ rtems_initialization_tasks_table *User_initialization_tasks_table;
+} rtems_api_configuration_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/dpmem.h b/cpukit/rtems/include/rtems/rtems/dpmem.h
new file mode 100644
index 0000000000..0405e800a8
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/dpmem.h
@@ -0,0 +1,157 @@
+/* dpmem.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Dual Ported Memory Manager. This manager provides a mechanism
+ * for converting addresses between internal and external representations
+ * for multiple dual-ported memory areas.
+ *
+ * Directives provided are:
+ *
+ * + create a port
+ * + get ID of a port
+ * + delete a port
+ * + convert external to internal address
+ * + convert internal to external address
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DUAL_PORTED_MEMORY_h
+#define __RTEMS_DUAL_PORTED_MEMORY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+
+/*
+ * The following structure defines the port control block. Each port
+ * has a control block associated with it. This control block contains
+ * all information required to support the port related operations.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ void *internal_base; /* base internal address */
+ void *external_base; /* base external address */
+ unsigned32 length; /* length of dual-ported area */
+} Dual_ported_memory_Control;
+
+/*
+ * The following define the internal Dual Ported Memory information.
+ */
+
+RTEMS_EXTERN Objects_Information _Dual_ported_memory_Information;
+
+/*
+ * _Dual_ported_memory_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Dual_ported_memory_Manager_initialization(
+ unsigned32 maximum_ports
+);
+
+/*
+ * rtems_port_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_create directive. The port
+ * will have the name name. The port maps onto an area of dual ported
+ * memory of length bytes which has internal_start and external_start
+ * as the internal and external starting addresses, respectively.
+ * It returns the id of the created port in ID.
+ */
+
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ unsigned32 length,
+ Objects_Id *id
+);
+
+/*
+ * rtems_port_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_ident directive. This directive
+ * returns the port ID associated with name. If more than one port is
+ * named name, then the port to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_port_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_delete directive. It deletes
+ * the port associated with ID.
+ */
+
+rtems_status_code rtems_port_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_port_external_to_internal
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_port_external_to_internal directive.
+ * It returns the internal port address which maps to the provided
+ * external port address for the specified port ID.
+ */
+
+rtems_status_code rtems_port_external_to_internal(
+ Objects_Id id,
+ void *external,
+ void **internal
+);
+
+/*
+ * rtems_port_internal_to_external
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the Port_internal_to_external directive.
+ * It returns the external port address which maps to the provided
+ * internal port address for the specified port ID.
+ */
+
+rtems_status_code rtems_port_internal_to_external(
+ Objects_Id id,
+ void *internal,
+ void **external
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/dpmem.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/event.h b/cpukit/rtems/include/rtems/rtems/event.h
new file mode 100644
index 0000000000..42f6b89e89
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/event.h
@@ -0,0 +1,174 @@
+/* event.h
+ *
+ * This include file contains the information pertaining to the Event
+ * Manager. This manager provides a high performance method of communication
+ * and synchronization.
+ *
+ * Directives provided are:
+ *
+ * + send an event set to a task
+ * + receive event condition
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_h
+#define __RTEMS_EVENT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/eventset.h>
+
+/*
+ * This constant is passed as the event_in to the
+ * rtems_event_receive directive to determine which events are pending.
+ */
+
+#define EVENT_CURRENT 0
+
+/*
+ * The following enumerated types indicate what happened while the event
+ * manager was in the synchronization window.
+ */
+
+typedef enum {
+ EVENT_SYNC_SYNCHRONIZED,
+ EVENT_SYNC_NOTHING_HAPPENED,
+ EVENT_SYNC_TIMEOUT,
+ EVENT_SYNC_SATISFIED
+} Event_Sync_states;
+
+/*
+ * Event_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Event_Manager_initialization( void );
+
+/*
+ * rtems_event_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_event_send directive. It sends
+ * event_in to the task specified by ID. If the task is blocked
+ * waiting to receive events and the posting of event_in satisfies
+ * the task's event condition, then it is unblocked.
+ */
+
+rtems_status_code rtems_event_send (
+ Objects_Id id,
+ rtems_event_set event_in
+);
+
+/*
+ * rtems_event_receive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_event_receive directive. This
+ * directive is invoked when the calling task wishes to receive
+ * the event_in event condition. One of the fields in the option_set
+ * parameter determines whether the receive request is satisfied if
+ * any or all of the events are pending. If the event condition
+ * is not satisfied immediately, then the task may block with an
+ * optional timeout of TICKS clock ticks or return immediately.
+ * This determination is based on another field in the option_set
+ * parameter. This directive returns the events received in the
+ * event_out parameter.
+ */
+
+rtems_status_code rtems_event_receive (
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+);
+
+/*
+ * _Event_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine determines if the event condition event_in is
+ * satisfied. If so or if the no_wait option is enabled in option_set,
+ * then the procedure returns immediately. If neither of these
+ * conditions is true, then the calling task is blocked with an
+ * optional timeout of ticks clock ticks.
+ */
+
+void _Event_Seize (
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+);
+
+/*
+ * _Event_Surrender
+ *
+ * DESCRIPTION:
+ *
+ * This routine determines if the event condition of the_thread
+ * has been satisfied. If so, it unblocks the_thread.
+ */
+
+void _Event_Surrender (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Event_Timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task's event receive request
+ * has not been satisfied after the specified timeout interval.
+ * The task represented by ID will be unblocked and its status
+ * code will be set in it's control block to indicate that a timeout
+ * has occurred.
+ */
+
+void _Event_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * The following defines the synchronization flag used by the
+ * Event Manager to insure that signals sent to the currently
+ * executing thread are received properly.
+ */
+
+RTEMS_EXTERN volatile Event_Sync_states _Event_Sync_state;
+
+#include <rtems/rtems/eventmp.h>
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/event.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/eventmp.h b/cpukit/rtems/include/rtems/rtems/eventmp.h
new file mode 100644
index 0000000000..f934f20a4e
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/eventmp.h
@@ -0,0 +1,147 @@
+/* eventmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_MP_h
+#define __RTEMS_EVENT_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/event.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote event operations.
+ */
+
+typedef enum {
+ EVENT_MP_SEND_REQUEST = 0,
+ EVENT_MP_SEND_RESPONSE = 1
+} Event_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote event operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Event_MP_Remote_operations operation;
+ rtems_event_set event_in;
+} Event_MP_Packet;
+
+/*
+ * _Event_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ *
+ * This routine is not needed since there are no process
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _Event_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Event_MP_Send_request_packet (
+ Event_MP_Remote_operations operation,
+ Objects_Id event_id,
+ rtems_event_set event_in
+);
+
+/*
+ * _Event_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Event_MP_Send_response_packet (
+ Event_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Event_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Event_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Event_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Event_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Event_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a event mp packet.
+ */
+
+Event_MP_Packet *_Event_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/rtems/include/rtems/rtems/eventset.h b/cpukit/rtems/include/rtems/rtems/eventset.h
new file mode 100644
index 0000000000..a85254b3de
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/eventset.h
@@ -0,0 +1,89 @@
+/* eventset.h
+ *
+ * This include file contains the information pertaining to the
+ * Event Sets Handler. This handler provides methods for the manipulation
+ * of event sets which will be sent and received by tasks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EVENT_SET_h
+#define __RTEMS_EVENT_SET_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following defines the type used to control event sets.
+ */
+
+typedef unsigned32 rtems_event_set;
+
+/*
+ * The following constants define the individual events which may
+ * be used to compose an event set.
+ */
+
+#define RTEMS_PENDING_EVENTS 0 /* receive pending events */
+#define RTEMS_ALL_EVENTS 0xFFFFFFFF
+
+#define RTEMS_EVENT_0 0x00000001
+#define RTEMS_EVENT_1 0x00000002
+#define RTEMS_EVENT_2 0x00000004
+#define RTEMS_EVENT_3 0x00000008
+#define RTEMS_EVENT_4 0x00000010
+#define RTEMS_EVENT_5 0x00000020
+#define RTEMS_EVENT_6 0x00000040
+#define RTEMS_EVENT_7 0x00000080
+#define RTEMS_EVENT_8 0x00000100
+#define RTEMS_EVENT_9 0x00000200
+#define RTEMS_EVENT_10 0x00000400
+#define RTEMS_EVENT_11 0x00000800
+#define RTEMS_EVENT_12 0x00001000
+#define RTEMS_EVENT_13 0x00002000
+#define RTEMS_EVENT_14 0x00004000
+#define RTEMS_EVENT_15 0x00008000
+#define RTEMS_EVENT_16 0x00010000
+#define RTEMS_EVENT_17 0x00020000
+#define RTEMS_EVENT_18 0x00040000
+#define RTEMS_EVENT_19 0x00080000
+#define RTEMS_EVENT_20 0x00100000
+#define RTEMS_EVENT_21 0x00200000
+#define RTEMS_EVENT_22 0x00400000
+#define RTEMS_EVENT_23 0x00800000
+#define RTEMS_EVENT_24 0x01000000
+#define RTEMS_EVENT_25 0x02000000
+#define RTEMS_EVENT_26 0x04000000
+#define RTEMS_EVENT_27 0x08000000
+#define RTEMS_EVENT_28 0x10000000
+#define RTEMS_EVENT_29 0x20000000
+#define RTEMS_EVENT_30 0x40000000
+#define RTEMS_EVENT_31 0x80000000
+
+
+/*
+ * The following constant is the value of an event set which
+ * has no events pending.
+ */
+
+#define EVENT_SETS_NONE_PENDING 0
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/eventset.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/intr.h b/cpukit/rtems/include/rtems/rtems/intr.h
new file mode 100644
index 0000000000..09697a93d6
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/intr.h
@@ -0,0 +1,160 @@
+/* intr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Interrupt Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_INTERRUPT_h
+#define __RTEMS_INTERRUPT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+
+/*
+ * Interrupt level type
+ */
+
+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:
+ *
+ * This routine initializes the interrupt manager.
+ *
+ */
+
+void _Interrupt_Manager_initialization( void );
+
+/*
+ * rtems_interrupt_catch
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_interrupt_catch directive. This
+ * directive installs new_isr_handler as the RTEMS interrupt service
+ * routine for vector. The previous RTEMS interrupt service
+ * routine is returned in old_isr_handler.
+ */
+
+rtems_status_code rtems_interrupt_catch(
+ rtems_isr_entry new_isr_handler,
+ rtems_vector_number vector,
+ rtems_isr_entry *old_isr_handler
+);
+
+/*
+ * rtems_interrupt_disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables all maskable interrupts and returns the
+ * previous level in _isr_cookie.
+ */
+
+#define rtems_interrupt_disable( _isr_cookie ) \
+ _ISR_Disable(_isr_cookie)
+
+/*
+ * rtems_interrupt_enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables maskable interrupts to the level indicated
+ * _isr_cookie.
+ */
+
+#define rtems_interrupt_enable( _isr_cookie ) \
+ _ISR_Enable(_isr_cookie)
+
+/*
+ * rtems_interrupt_flash
+ *
+ * DESCRIPTION:
+ *
+ * This routine temporarily enables maskable interrupts to the
+ * level in _isr_cookie before redisabling them.
+ */
+
+#define rtems_interrupt_flash( _isr_cookie ) \
+ _ISR_Flash(_isr_cookie)
+
+/*
+ * rtems_interrupt_is_in_progress
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the processor is currently servicing
+ * and interrupt and FALSE otherwise. A return value of TRUE indicates
+ * that the caller is an interrupt service routine, NOT a thread. The
+ * directives available to an interrupt service routine are restricted.
+ */
+
+#define rtems_interrupt_is_in_progress() \
+ _ISR_Is_in_progress()
+
+/*
+ * rtems_interrupt_cause
+ *
+ * DESCRIPTION:
+ *
+ * This routine generates an interrupt.
+ *
+ * NOTE: No implementation.
+ */
+
+#define rtems_interrupt_cause( _interrupt_to_cause )
+
+/*
+ * rtems_interrupt_cause
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the specified interrupt.
+ *
+ * NOTE: No implementation.
+ */
+
+#define rtems_interrupt_clear( _interrupt_to_clear )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/message.h b/cpukit/rtems/include/rtems/rtems/message.h
new file mode 100644
index 0000000000..f819b7cfa2
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/message.h
@@ -0,0 +1,317 @@
+/* message.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Message Queue Manager. This manager provides a mechanism for
+ * communication and synchronization between tasks using messages.
+ *
+ * Directives provided are:
+ *
+ * + create a queue
+ * + get ID of a queue
+ * + delete a queue
+ * + put a message at the rear of a queue
+ * + put a message at the front of a queue
+ * + broadcast N messages to a queue
+ * + receive message from a queue
+ * + flush all messages on a queue
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MESSAGE_QUEUE_h
+#define __RTEMS_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/coremsg.h>
+
+/*
+ * The following enumerated type details the modes in which a message
+ * may be submitted to a message queue. The message may be posted
+ * in a send or urgent fashion.
+ */
+
+typedef enum {
+ MESSAGE_QUEUE_SEND_REQUEST = 0,
+ MESSAGE_QUEUE_URGENT_REQUEST = 1
+} Message_queue_Submit_types;
+
+/*
+ * The following records define the control block used to manage
+ * each message queue.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ rtems_attribute attribute_set;
+ CORE_message_queue_Control message_queue;
+} Message_queue_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Message_queue_Information;
+
+/*
+ * _Message_queue_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+);
+
+/*
+ * rtems_message_queue_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_create directive. The
+ * message queue will have the name name. If the attribute_set indicates
+ * that the message queue is to be limited in the number of messages
+ * that can be outstanding, then count indicates the maximum number of
+ * messages that will be held. It returns the id of the created
+ * message queue in ID.
+ */
+
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ unsigned32 count,
+ unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_message_queue_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_ident directive.
+ * This directive returns the message queue ID associated with NAME.
+ * If more than one message queue is named name, then the message
+ * queue to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the message queue named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_message_queue_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_delete directive. The
+ * message queue indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_message_queue_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_message_queue_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_send(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+);
+
+/*
+ * rtems_message_queue_urgent
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_urgent(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+);
+
+/*
+ * rtems_message_queue_broadcast
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_send directive.
+ * This directive sends the message buffer to the message queue
+ * indicated by ID. If one or more tasks is blocked waiting
+ * to receive a message from this message queue, then one will
+ * receive the message. The task selected to receive the
+ * message is based on the task queue discipline algorithm in
+ * use by this particular message queue. If no tasks are waiting,
+ * then the message buffer will be placed at the rear of the
+ * chain of pending messages for this message queue.
+ */
+
+rtems_status_code rtems_message_queue_broadcast(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ unsigned32 *count
+);
+
+/*
+ * rtems_message_queue_receive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_receive directive.
+ * This directive is invoked when the calling task wishes to receive
+ * a message from the message queue indicated by ID. The received
+ * message is to be placed in buffer. If no messages are outstanding
+ * and the option_set indicates that the task is willing to block,
+ * then the task will be blocked until a message arrives or until,
+ * optionally, timeout clock ticks have passed.
+ */
+
+rtems_status_code rtems_message_queue_receive(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ unsigned32 option_set,
+ rtems_interval timeout
+);
+
+/*
+ * rtems_message_queue_flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_message_queue_flush directive.
+ * This directive takes all outstanding messages for the message
+ * queue indicated by ID and returns them to the inactive message
+ * chain. The number of messages flushed is returned in COUNT.
+ */
+
+rtems_status_code rtems_message_queue_flush(
+ Objects_Id id,
+ unsigned32 *count
+);
+
+/*
+ * _Message_queue_Submit
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the directives rtems_message_queue_send
+ * and rtems_message_queue_urgent. It processes a message that is
+ * to be submitted to the designated message queue. The message will
+ * either be processed as a send send message which it will be inserted
+ * at the rear of the queue or it will be processed as an urgent message
+ * which will be inserted at the front of the queue.
+ */
+
+rtems_status_code _Message_queue_Submit(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ Message_queue_Submit_types submit_type
+);
+
+/*
+ * _Message_queue_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message queue control block from
+ * the inactive chain of free message queue control blocks.
+ */
+
+Message_queue_Control *_Message_queue_Allocate (
+ unsigned32 count,
+ unsigned32 max_message_size
+);
+
+/*
+ * _Message_queue_Translate_core_message_queue_return_code
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a RTEMS status code based on the core message queue
+ * status code specified.
+ */
+
+rtems_status_code _Message_queue_Translate_core_message_queue_return_code (
+ unsigned32 the_message_queue_status
+);
+
+/*
+ *
+ * _Message_queue_Core_message_queue_mp_support
+ *
+ * Input parameters:
+ * the_thread - the remote thread the message was submitted to
+ * id - id of the message queue
+ *
+ * Output parameters: NONE
+ */
+
+void _Message_queue_Core_message_queue_mp_support (
+ Thread_Control *the_thread,
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/message.inl>
+#endif
+#include <rtems/rtems/msgmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/modes.h b/cpukit/rtems/include/rtems/rtems/modes.h
new file mode 100644
index 0000000000..90327636c1
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/modes.h
@@ -0,0 +1,89 @@
+/* modes.h
+ *
+ * This include file contains all constants and structures associated
+ * with the RTEMS thread and RTEMS_ASR modes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MODES_h
+#define __RTEMS_MODES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/isr.h>
+
+/*
+ * The following type defines the control block used to manage
+ * each a mode set.
+ */
+
+typedef unsigned32 Modes_Control;
+
+/*
+ * The following constants define the individual modes and masks
+ * which may be used to compose a mode set and to alter modes.
+ */
+
+#define RTEMS_ALL_MODE_MASKS 0x0000ffff
+
+#define RTEMS_DEFAULT_MODES 0x00000000
+#define RTEMS_CURRENT_MODE 0
+
+#define RTEMS_PREEMPT_MASK 0x00000100 /* preemption bit */
+#define RTEMS_TIMESLICE_MASK 0x00000200 /* timeslice bit */
+#define RTEMS_ASR_MASK 0x00000400 /* RTEMS_ASR enable bit */
+#define RTEMS_INTERRUPT_MASK CPU_MODES_INTERRUPT_MASK
+
+#define RTEMS_PREEMPT 0x00000000 /* enable preemption */
+#define RTEMS_NO_PREEMPT 0x00000100 /* disable preemption */
+
+#define RTEMS_NO_TIMESLICE 0x00000000 /* disable timeslicing */
+#define RTEMS_TIMESLICE 0x00000200 /* enable timeslicing */
+
+#define RTEMS_ASR 0x00000000 /* enable RTEMS_ASR */
+#define RTEMS_NO_ASR 0x00000400 /* disable RTEMS_ASR */
+
+/*
+ * The number of bits for interrupt levels is CPU dependent.
+ * RTEMS supports 0 to 256 levels in bits 0-7 of the mode.
+ */
+
+/*PAGE
+ *
+ * RTEMS_INTERRUPT_LEVEL
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the processor dependent interrupt
+ * level which corresponds to the requested interrupt level.
+ *
+ * NOTE: RTEMS supports 256 interrupt levels using the least
+ * significant eight bits of MODES.CONTROL. On any
+ * particular CPU, fewer than 256 levels may be supported.
+ */
+
+#define RTEMS_INTERRUPT_LEVEL( _mode_set ) \
+ ( (_mode_set) & RTEMS_INTERRUPT_MASK )
+
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/modes.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/mp.h b/cpukit/rtems/include/rtems/rtems/mp.h
new file mode 100644
index 0000000000..0fabd202aa
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/mp.h
@@ -0,0 +1,53 @@
+/* mp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MP_h
+#define __RTEMS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ *
+ * _Multiprocessing_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Multiprocessing_Manager_initialization ( void );
+
+/*
+ *
+ * rtems_multiprocessing_announce
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the MULTIPROCESSING_ANNOUNCE directive.
+ * It is invoked by the MPCI layer to indicate that an MPCI packet
+ * has been received.
+ */
+
+void rtems_multiprocessing_announce ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/msgmp.h b/cpukit/rtems/include/rtems/rtems/msgmp.h
new file mode 100644
index 0000000000..c640aad0cd
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/msgmp.h
@@ -0,0 +1,175 @@
+/* msgmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MESSAGE_QUEUE_MP_h
+#define __RTEMS_MESSAGE_QUEUE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/message.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote message queue operations.
+ */
+
+typedef enum {
+ MESSAGE_QUEUE_MP_ANNOUNCE_CREATE = 0,
+ MESSAGE_QUEUE_MP_ANNOUNCE_DELETE = 1,
+ MESSAGE_QUEUE_MP_EXTRACT_PROXY = 2,
+ MESSAGE_QUEUE_MP_RECEIVE_REQUEST = 3,
+ MESSAGE_QUEUE_MP_RECEIVE_RESPONSE = 4,
+ MESSAGE_QUEUE_MP_SEND_REQUEST = 5,
+ MESSAGE_QUEUE_MP_SEND_RESPONSE = 6,
+ MESSAGE_QUEUE_MP_URGENT_REQUEST = 7,
+ MESSAGE_QUEUE_MP_URGENT_RESPONSE = 8,
+ MESSAGE_QUEUE_MP_BROADCAST_REQUEST = 9,
+ MESSAGE_QUEUE_MP_BROADCAST_RESPONSE = 10,
+ MESSAGE_QUEUE_MP_FLUSH_REQUEST = 11,
+ MESSAGE_QUEUE_MP_FLUSH_RESPONSE = 12
+} Message_queue_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote message queue operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Message_queue_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ Objects_Id proxy_id;
+ unsigned32 count;
+ unsigned32 size;
+ unsigned32 pad0;
+ CORE_message_queue_Buffer Buffer;
+} Message_queue_MP_Packet;
+
+/*
+ * _Message_queue_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Message_queue_MP_Send_process_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Message_queue_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Message_queue_MP_Send_request_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ void *buffer,
+ unsigned32 *size_p,
+ rtems_option option_set,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Message_queue_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Message_queue_MP_Send_response_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Message_queue_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Message_queue_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Message_queue_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _Message_queue_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Message_queue_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a message queue mp packet.
+ */
+
+Message_queue_MP_Packet *_Message_queue_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/rtems/include/rtems/rtems/options.h b/cpukit/rtems/include/rtems/rtems/options.h
new file mode 100644
index 0000000000..79ebcf9fc2
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/options.h
@@ -0,0 +1,53 @@
+/* options.h
+ *
+ * This include file contains information which defines the
+ * options available on many directives.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_OPTIONS_h
+#define __RTEMS_OPTIONS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * option sets.
+ */
+
+typedef unsigned32 rtems_option;
+
+/*
+ * The following constants define the individual options which may
+ * be used to compose an option set.
+ */
+
+#define RTEMS_DEFAULT_OPTIONS 0x00000000
+
+#define RTEMS_WAIT 0x00000000 /* wait on resource */
+#define RTEMS_NO_WAIT 0x00000001 /* do not wait on resource */
+
+#define RTEMS_EVENT_ALL 0x00000000 /* wait for all events */
+#define RTEMS_EVENT_ANY 0x00000002 /* wait on any event */
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/options.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/part.h b/cpukit/rtems/include/rtems/rtems/part.h
new file mode 100644
index 0000000000..eda5649f70
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/part.h
@@ -0,0 +1,168 @@
+/* partition.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Partition Manager. This manager provides facilities to
+ * dynamically allocate memory in fixed-sized units which are returned
+ * as buffers.
+ *
+ * Directives provided are:
+ *
+ * + create a partition
+ * + get an ID of a partition
+ * + delete a partition
+ * + get a buffer from a partition
+ * + return a buffer to a partition
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_PARTITION_h
+#define __RTEMS_PARTITION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/types.h>
+
+/*
+ * The following defines the control block used to manage each partition.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ void *starting_address; /* physical address */
+ unsigned32 length; /* in bytes */
+ unsigned32 buffer_size; /* in bytes */
+ rtems_attribute attribute_set; /* attributes */
+ unsigned32 number_of_used_blocks; /* or allocated buffers */
+ Chain_Control Memory; /* buffer chain */
+} Partition_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Partition_Information;
+
+/*
+ * _Partition_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Partition_Manager_initialization(
+ unsigned32 maximum_partitions
+);
+
+/*
+ * rtems_partition_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_create directive. The
+ * partition will have the name name. The memory area managed by
+ * the partition is of length bytes and starts at starting_address.
+ * The memory area will be divided into as many buffers of
+ * buffer_size bytes as possible. The attribute_set determines if
+ * the partition is global or local. It returns the id of the
+ * created partition in ID.
+ */
+
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_partition_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_ident directive.
+ * This directive returns the partition ID associated with name.
+ * If more than one partition is named name, then the partition
+ * to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the partition named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_partition_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_delete directive. The
+ * partition indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_partition_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_partition_get_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_get_buffer directive. It
+ * attempts to allocate a buffer from the partition associated with ID.
+ * If a buffer is allocated, its address is returned in buffer.
+ */
+
+rtems_status_code rtems_partition_get_buffer(
+ Objects_Id id,
+ void **buffer
+);
+
+/*
+ * rtems_partition_return_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_partition_return_buffer directive. It
+ * frees the buffer to the partition associated with ID. The buffer must
+ * have been previously allocated from the same partition.
+ */
+
+rtems_status_code rtems_partition_return_buffer(
+ Objects_Id id,
+ void *buffer
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/part.inl>
+#endif
+#include <rtems/rtems/partmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/partmp.h b/cpukit/rtems/include/rtems/rtems/partmp.h
new file mode 100644
index 0000000000..19bc2c7d61
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/partmp.h
@@ -0,0 +1,161 @@
+/* partmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_PARTITION_MP_h
+#define __RTEMS_PARTITION_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+
+#include <rtems/rtems/part.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote partition operations.
+ */
+
+typedef enum {
+ PARTITION_MP_ANNOUNCE_CREATE = 0,
+ PARTITION_MP_ANNOUNCE_DELETE = 1,
+ PARTITION_MP_EXTRACT_PROXY = 2,
+ PARTITION_MP_GET_BUFFER_REQUEST = 3,
+ PARTITION_MP_GET_BUFFER_RESPONSE = 4,
+ PARTITION_MP_RETURN_BUFFER_REQUEST = 5,
+ PARTITION_MP_RETURN_BUFFER_RESPONSE = 6
+} Partition_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote partition operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Partition_MP_Remote_operations operation;
+ rtems_name name;
+ void *buffer;
+ Objects_Id proxy_id;
+} Partition_MP_Packet;
+
+/*
+ * _Partition_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Partition_MP_Send_process_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Partition_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Partition_MP_Send_request_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ void *buffer
+);
+
+/*
+ * _Partition_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Partition_MP_Send_response_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Partition_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Partition_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Partition_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by the Partition since a partition
+ * cannot be deleted when buffers are in use.
+ */
+
+/*
+ * _Partition_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Partition_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Partition_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a partition mp packet.
+ */
+
+Partition_MP_Packet *_Partition_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/rtems/include/rtems/rtems/ratemon.h b/cpukit/rtems/include/rtems/rtems/ratemon.h
new file mode 100644
index 0000000000..251bb88dac
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/ratemon.h
@@ -0,0 +1,213 @@
+/* ratemon.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the Rate Monotonic Manager. This manager
+ * provides facilities to implement tasks which execute in a periodic fashion.
+ *
+ * Directives provided are:
+ *
+ * + create a rate monotonic timer
+ * + cancel a period
+ * + delete a rate monotonic timer
+ * + conclude current and start the next period
+ * + obtain status information on a period
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RATE_MONOTONIC_h
+#define __RTEMS_RATE_MONOTONIC_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the states in which a
+ * period may be.
+ */
+
+typedef enum {
+ RATE_MONOTONIC_INACTIVE, /* off chain, never initialized */
+ RATE_MONOTONIC_OWNER_IS_BLOCKING, /* on chain, owner is blocking on it */
+ RATE_MONOTONIC_ACTIVE, /* on chain, running continuously */
+ RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING, /* on chain, expired while owner was */
+ /* was blocking on it */
+ RATE_MONOTONIC_EXPIRED /* off chain, will be reset by next */
+ /* rtems_rate_monotonic_period */
+} rtems_rate_monotonic_period_states;
+
+/*
+ * The following constant is the interval passed to the rate_monontonic_period
+ * directive to obtain status information.
+ */
+
+#define RTEMS_PERIOD_STATUS WATCHDOG_NO_TIMEOUT
+
+/*
+ * The following defines the period status structure.
+ */
+
+typedef struct {
+ rtems_rate_monotonic_period_states state;
+ unsigned32 ticks_since_last_period;
+ unsigned32 ticks_executed_since_last_period;
+} rtems_rate_monotonic_period_status;
+
+/*
+ * The following structure defines the control block used to manage
+ * each period.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Watchdog_Control Timer;
+ rtems_rate_monotonic_period_states state;
+ unsigned32 owner_ticks_executed_at_period;
+ unsigned32 time_at_period;
+ Thread_Control *owner;
+} Rate_monotonic_Control;
+
+RTEMS_EXTERN Objects_Information _Rate_monotonic_Information;
+
+/*
+ * _Rate_monotonic_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Rate_monotonic_Manager_initialization(
+ unsigned32 maximum_periods
+);
+
+/*
+ * rtems_rate_monotonic_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rate_monotonic_create directive. The
+ * period will have the name name. It returns the id of the
+ * created period in ID.
+ */
+
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_rate_monotonic_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_ident directive.
+ * This directive returns the period ID associated with name.
+ * If more than one period is named name, then the period
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_rate_monotonic_cancel
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_cancel directive. This
+ * directive stops the period associated with ID from continuing to
+ * run.
+ */
+
+rtems_status_code rtems_rate_monotonic_cancel(
+ Objects_Id id
+);
+
+/*
+ * rtems_rate_monotonic_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_delete directive. The
+ * period indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_rate_monotonic_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_rate_monotonic_get_status
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_get_status directive.
+ * Information about the period indicated by ID is returned.
+ *
+ */
+
+rtems_status_code rtems_rate_monotonic_get_status(
+ Objects_Id id,
+ rtems_rate_monotonic_period_status *status
+);
+
+/*
+ * rtems_rate_monotonic_period
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_rate_monotonic_period directive. When
+ * length is non-zero, this directive initiates the period associated with
+ * ID from continuing for a period of length. If length is zero, then
+ * result is set to indicate the current state of the period.
+ */
+
+rtems_status_code rtems_rate_monotonic_period(
+ Objects_Id id,
+ rtems_interval length
+);
+
+/*
+ * _Rate_monotonic_Timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when the period represented
+ * by ID expires. If the task which owns this period is blocked
+ * waiting for the period to expire, then it is readied and the
+ * period is restarted. If the owning task is not waiting for the
+ * period to expire, then the period is placed in the EXPIRED
+ * state and not restarted.
+ */
+
+void _Rate_monotonic_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/ratemon.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/region.h b/cpukit/rtems/include/rtems/rtems/region.h
new file mode 100644
index 0000000000..ae191f62e4
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/region.h
@@ -0,0 +1,234 @@
+/* region.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Region Manager. This manager provides facilities to dynamically
+ * allocate memory in variable sized units which are returned as segments.
+ *
+ * Directives provided are:
+ *
+ * + create a region
+ * + get an ID of a region
+ * + delete a region
+ * + get a segment from a region
+ * + return a segment to a region
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_REGION_h
+#define __RTEMS_REGION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/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
+ * each region.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Thread_queue_Control Wait_queue; /* waiting threads */
+ void *starting_address; /* physical start addr */
+ unsigned32 length; /* physical length(bytes) */
+ unsigned32 page_size; /* in bytes */
+ unsigned32 maximum_segment_size; /* in bytes */
+ rtems_attribute attribute_set;
+ unsigned32 number_of_used_blocks; /* blocks allocated */
+ Heap_Control Memory;
+} Region_Control;
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Region_Information;
+
+/*
+ * _Region_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Region_Manager_initialization(
+ unsigned32 maximum_regions
+);
+
+/*
+ * rtems_region_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_create directive. The
+ * region will have the name name. The memory area managed by
+ * the region is of length bytes and starts at starting_address.
+ * The memory area will be divided into as many allocatable units of
+ * page_size bytes as possible. The attribute_set determines which
+ * thread queue discipline is used by the region. It returns the
+ * id of the created region in ID.
+ */
+
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 page_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_region_extend
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_extend directive. The
+ * region will have the name name. The memory area managed by
+ * the region will be attempted to be grown by length bytes using
+ * the memory starting at starting_address.
+ */
+
+rtems_status_code rtems_region_extend(
+ Objects_Id id,
+ void *starting_address,
+ unsigned32 length
+);
+
+/*
+ * rtems_region_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_ident directive.
+ * This directive returns the region ID associated with name.
+ * If more than one region is named name, then the region
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_region_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_delete directive. The
+ * region indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_region_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_region_get_segment
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_get_segment directive. It
+ * attempts to allocate a segment from the region associated with ID.
+ * If a segment of the requested size can be allocated, its address
+ * is returned in segment. If no segment is available, then the task
+ * may return immediately or block waiting for a segment with an optional
+ * timeout of timeout clock ticks. Whether the task blocks or returns
+ * immediately is based on the no_wait option in the option_set.
+ */
+
+rtems_status_code rtems_region_get_segment(
+ Objects_Id id,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+);
+
+/*
+ * rtems_region_get_segment_size
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_get_segment_size directive. It
+ * returns the size in bytes of the specified user memory area.
+ */
+
+rtems_status_code rtems_region_get_segment_size(
+ Objects_Id id,
+ void *segment,
+ unsigned32 *size
+);
+
+/*
+ * rtems_region_return_segment
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_region_return_segment directive. It
+ * frees the segment to the region associated with ID. The segment must
+ * have been previously allocated from the same region. If freeing the
+ * segment results in enough memory being available to satisfy the
+ * rtems_region_get_segment of the first blocked task, then that task and as
+ * many subsequent tasks as possible will be unblocked with their requests
+ * satisfied.
+ */
+
+rtems_status_code rtems_region_return_segment(
+ Objects_Id id,
+ void *segment
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/region.inl>
+#endif
+#include <rtems/rtems/regionmp.h>
+
+/*
+ * _Region_Debug_Walk
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked to verify the integrity of a heap associated
+ * with the_region.
+ */
+
+#ifdef RTEMS_DEBUG
+
+#define _Region_Debug_Walk( _the_region, _source ) \
+ do { \
+ if ( _Debug_Is_enabled( RTEMS_DEBUG_REGION ) ) \
+ _Heap_Walk( &(_the_region)->Memory, _source, FALSE ); \
+ } while ( 0 )
+
+#else
+
+#define _Region_Debug_Walk( _the_region, _source )
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/regionmp.h b/cpukit/rtems/include/rtems/rtems/regionmp.h
new file mode 100644
index 0000000000..a0560a4558
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/regionmp.h
@@ -0,0 +1,166 @@
+/* regionmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_REGION_MP_h
+#define __RTEMS_REGION_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote region operations.
+ */
+
+typedef enum {
+ REGION_MP_ANNOUNCE_CREATE = 0,
+ REGION_MP_ANNOUNCE_DELETE = 1,
+ REGION_MP_EXTRACT_PROXY = 2,
+ REGION_MP_GET_SEGMENT_REQUEST = 3,
+ REGION_MP_GET_SEGMENT_RESPONSE = 4,
+ REGION_MP_RETURN_SEGMENT_REQUEST = 5,
+ REGION_MP_RETURN_SEGMENT_RESPONSE = 6
+} Region_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote region operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Region_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ unsigned32 size;
+ Objects_Id proxy_id;
+ void *segment;
+} Region_MP_Packet;
+
+/*
+ * _Region_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Region_MP_Send_process_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Region_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Region_MP_Send_request_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ void *segment,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout
+);
+
+/*
+ * _Region_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Region_MP_Send_response_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Region_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Region_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Region_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by the Region since a region
+ * cannot be deleted when segments are in use.
+ */
+
+/*
+ * _Region_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Region_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Region_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a region mp packet.
+ */
+
+Region_MP_Packet *_Region_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/rtems/include/rtems/rtems/rtemsapi.h b/cpukit/rtems/include/rtems/rtems/rtemsapi.h
new file mode 100644
index 0000000000..2ceb6ab577
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/rtemsapi.h
@@ -0,0 +1,34 @@
+/*
+ * RTEMS API Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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
new file mode 100644
index 0000000000..321724ed53
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/sem.h
@@ -0,0 +1,248 @@
+/* semaphore.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Semaphore Manager. This manager utilizes standard Dijkstra
+ * counting semaphores to provide synchronization and mutual exclusion
+ * capabilities.
+ *
+ * Directives provided are:
+ *
+ * + create a semaphore
+ * + get an ID of a semaphore
+ * + delete a semaphore
+ * + acquire a semaphore
+ * + release a semaphore
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SEMAPHORE_h
+#define __RTEMS_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/object.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/threadq.h>
+
+/*
+ * The following defines the control block used to manage each semaphore.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ rtems_attribute attribute_set;
+ union {
+ CORE_mutex_Control mutex;
+ CORE_semaphore_Control semaphore;
+ } Core_control;
+} Semaphore_Control;
+
+/*
+ * The following defines the information control block used to manage
+ * this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Semaphore_Information;
+
+/*
+ * _Semaphore_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+);
+
+/*
+ * rtems_semaphore_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_create directive. The
+ * semaphore will have the name name. The starting count for
+ * the semaphore is count. The attribute_set determines if
+ * the semaphore is global or local and the thread queue
+ * discipline. It returns the id of the created semaphore in ID.
+ */
+
+rtems_status_code rtems_semaphore_create(
+ rtems_name name,
+ unsigned32 count,
+ rtems_attribute attribute_set,
+ rtems_task_priority priority_ceiling,
+ rtems_id *id
+);
+
+/*
+ * rtems_semaphore_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_ident directive.
+ * This directive returns the semaphore ID associated with name.
+ * If more than one semaphore is named name, then the semaphore
+ * to which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the semaphore named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ unsigned32 node,
+ rtems_id *id
+);
+
+/*
+ * rtems_semaphore_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_delete directive. The
+ * semaphore indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_semaphore_delete(
+ rtems_id id
+);
+
+/*
+ * rtems_semaphore_obtain
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_obtain directive. It
+ * attempts to obtain a unit from the semaphore associated with ID.
+ * If a unit can be allocated, the calling task will return immediately.
+ * If no unit is available, then the task may return immediately or
+ * block waiting for a unit with an optional timeout of timeout
+ * clock ticks. Whether the task blocks or returns immediately
+ * is based on the RTEMS_NO_WAIT option in the option_set.
+ */
+
+rtems_status_code rtems_semaphore_obtain(
+ rtems_id id,
+ unsigned32 option_set,
+ rtems_interval timeout
+);
+
+/*
+ * rtems_semaphore_release
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_semaphore_release directive. It
+ * frees a unit to the semaphore associated with ID. 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.
+ */
+
+rtems_status_code rtems_semaphore_release(
+ rtems_id id
+);
+
+/*
+ * _Semaphore_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This routine attempts to receive a unit from the_semaphore.
+ * If a unit is available or if the RTEMS_NO_WAIT option is enabled in
+ * option_set, then the routine returns. Otherwise, the calling task
+ * is blocked until a unit becomes available.
+ */
+
+boolean _Semaphore_Seize(
+ Semaphore_Control *the_semaphore,
+ unsigned32 option_set
+);
+
+/*
+ * _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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/sem.inl>
+#endif
+#include <rtems/rtems/semmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/semmp.h b/cpukit/rtems/include/rtems/rtems/semmp.h
new file mode 100644
index 0000000000..e3b161512d
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/semmp.h
@@ -0,0 +1,163 @@
+/* semmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SEMAPHORE_MP_h
+#define __RTEMS_SEMAPHORE_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote semaphore operations.
+ */
+
+typedef enum {
+ SEMAPHORE_MP_ANNOUNCE_CREATE = 0,
+ SEMAPHORE_MP_ANNOUNCE_DELETE = 1,
+ SEMAPHORE_MP_EXTRACT_PROXY = 2,
+ SEMAPHORE_MP_OBTAIN_REQUEST = 3,
+ SEMAPHORE_MP_OBTAIN_RESPONSE = 4,
+ SEMAPHORE_MP_RELEASE_REQUEST = 5,
+ SEMAPHORE_MP_RELEASE_RESPONSE = 6
+} Semaphore_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote semaphore operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Semaphore_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_option option_set;
+ Objects_Id proxy_id;
+} Semaphore_MP_Packet;
+
+/*
+ * _Semaphore_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _Semaphore_MP_Send_process_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_name name,
+ Objects_Id proxy_id
+);
+
+/*
+ * _Semaphore_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Semaphore_MP_Send_request_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_option option_set,
+ rtems_interval timeout
+);
+
+/*
+ * _Semaphore_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Semaphore_MP_Send_response_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Semaphore_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Semaphore_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Semaphore_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+);
+
+/*
+ * _Semaphore_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ */
+
+void _Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+);
+
+/*
+ * _Semaphore_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a semaphore mp packet.
+ */
+
+Semaphore_MP_Packet *_Semaphore_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/rtems/include/rtems/rtems/signal.h b/cpukit/rtems/include/rtems/rtems/signal.h
new file mode 100644
index 0000000000..18fdeba88a
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/signal.h
@@ -0,0 +1,83 @@
+/* signal.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Signal Manager. This manager provides capabilities required
+ * for asynchronous communication between tasks via signal sets.
+ *
+ * Directives provided are:
+ *
+ * + establish an asynchronous signal routine
+ * + send a signal set to a task
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SIGNAL_h
+#define __RTEMS_SIGNAL_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/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
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_signal_catch directive. This directive
+ * is used to establish asr_handler as the Asynchronous Signal Routine
+ * (RTEMS_ASR) for the calling task. The asr_handler will execute with a
+ * mode of mode_set.
+ */
+
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry asr_handler,
+ rtems_mode mode_set
+);
+
+/*
+ * rtems_signal_send
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_signal_send directive. This directive
+ * sends the signal_set to the task specified by ID.
+ */
+
+rtems_status_code rtems_signal_send(
+ Objects_Id id,
+ rtems_signal_set signal_set
+);
+
+#include <rtems/rtems/signalmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/signalmp.h b/cpukit/rtems/include/rtems/rtems/signalmp.h
new file mode 100644
index 0000000000..fb9c0ea833
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/signalmp.h
@@ -0,0 +1,147 @@
+/* signalmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Multiprocessing Support in the Signal Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SIGNAL_MP_h
+#define __RTEMS_SIGNAL_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/asr.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote signal operations.
+ */
+
+typedef enum {
+ SIGNAL_MP_SEND_REQUEST = 0,
+ SIGNAL_MP_SEND_RESPONSE = 1
+} Signal_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote signal operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ Signal_MP_Remote_operations operation;
+ rtems_signal_set signal_in;
+} Signal_MP_Packet;
+
+/*
+ * _Signal_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ *
+ * This routine is not needed since there are no process
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _Signal_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _Signal_MP_Send_request_packet (
+ Signal_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_signal_set signal_in
+);
+
+/*
+ * _Signal_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _Signal_MP_Send_response_packet (
+ Signal_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _Signal_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _Signal_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _Signal_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Signal_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _Signal_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a signal mp packet.
+ */
+
+Signal_MP_Packet *_Signal_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/rtems/include/rtems/rtems/status.h b/cpukit/rtems/include/rtems/rtems/status.h
new file mode 100644
index 0000000000..cff32c0f83
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/status.h
@@ -0,0 +1,83 @@
+/* status.h
+ *
+ * This include file contains the status codes returned from the
+ * executive directives.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_STATUS_h
+#define __RTEMS_STATUS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+/* enumerated constants */
+
+typedef enum {
+ RTEMS_SUCCESSFUL = 0, /* successful completion */
+ RTEMS_TASK_EXITTED = 1, /* returned from a thread */
+ RTEMS_MP_NOT_CONFIGURED = 2, /* multiprocessing not configured */
+ RTEMS_INVALID_NAME = 3, /* invalid object name */
+ RTEMS_INVALID_ID = 4, /* invalid object id */
+ RTEMS_TOO_MANY = 5, /* too many */
+ RTEMS_TIMEOUT = 6, /* timed out waiting */
+ RTEMS_OBJECT_WAS_DELETED = 7, /* object deleted while waiting */
+ RTEMS_INVALID_SIZE = 8, /* specified size was invalid */
+ RTEMS_INVALID_ADDRESS = 9, /* address specified is invalid */
+ RTEMS_INVALID_NUMBER = 10, /* number was invalid */
+ RTEMS_NOT_DEFINED = 11, /* item has not been initialized */
+ RTEMS_RESOURCE_IN_USE = 12, /* resources still outstanding */
+ RTEMS_UNSATISFIED = 13, /* request not satisfied */
+ RTEMS_INCORRECT_STATE = 14, /* thread is in wrong state */
+ RTEMS_ALREADY_SUSPENDED = 15, /* thread already in state */
+ RTEMS_ILLEGAL_ON_SELF = 16, /* illegal on calling thread */
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT = 17, /* illegal for remote object */
+ RTEMS_CALLED_FROM_ISR = 18, /* called from wrong environment */
+ RTEMS_INVALID_PRIORITY = 19, /* invalid thread priority */
+ RTEMS_INVALID_CLOCK = 20, /* invalid date/time */
+ RTEMS_INVALID_NODE = 21, /* invalid node id */
+ RTEMS_NOT_CONFIGURED = 22, /* directive not configured */
+ 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_NO_MEMORY = 26, /* could not get enough memory */
+ RTEMS_PROXY_BLOCKING = 27 /* internal error only */
+} rtems_status_code;
+
+#define RTEMS_STATUS_CODES_FIRST RTEMS_SUCCESSFUL
+#define RTEMS_STATUS_CODES_LAST RTEMS_PROXY_BLOCKING
+
+extern rtems_status_code _Status_Object_name_errors_to_status[];
+
+#ifdef RTEMS_API_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
+
+/*
+ * Applications are allowed to use the macros to compare status codes.
+ */
+
+#include <rtems/rtems/status.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/support.h b/cpukit/rtems/include/rtems/rtems/support.h
new file mode 100644
index 0000000000..d5c9c494a0
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/support.h
@@ -0,0 +1,99 @@
+/* support.h
+ *
+ * This include file contains information about support functions for
+ * the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_SUPPORT_h
+#define __RTEMS_RTEMS_SUPPORT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+
+/*
+ * rtems_build_name
+ *
+ * DESCRIPTION:
+ *
+ * This function returns an object name composed of the four characters
+ * C1, C2, C3, and C4.
+ *
+ * NOTE:
+ *
+ * This must be implemented as a macro for use in Configuration Tables.
+ *
+ */
+
+#define rtems_build_name( _C1, _C2, _C3, _C4 ) \
+ ( (_C1) << 24 | (_C2) << 16 | (_C3) << 8 | (_C4) )
+
+/*
+ * 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)
+#define RTEMS_MICROSECONDS_TO_TICKS(_ms) \
+ TOD_MICROSECONDS_TO_TICKS(_ms)
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/support.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/taskmp.h b/cpukit/rtems/include/rtems/rtems/taskmp.h
new file mode 100644
index 0000000000..5d94e0c3c4
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/taskmp.h
@@ -0,0 +1,167 @@
+/* taskmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the multiprocessing support in the task manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TASKS_MP_h
+#define __RTEMS_RTEMS_TASKS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/thread.h>
+
+/*
+ * The following enumerated type defines the list of
+ * remote task operations.
+ */
+
+typedef enum {
+ RTEMS_TASKS_MP_ANNOUNCE_CREATE = 0,
+ RTEMS_TASKS_MP_ANNOUNCE_DELETE = 1,
+ RTEMS_TASKS_MP_SUSPEND_REQUEST = 2,
+ RTEMS_TASKS_MP_SUSPEND_RESPONSE = 3,
+ RTEMS_TASKS_MP_RESUME_REQUEST = 4,
+ RTEMS_TASKS_MP_RESUME_RESPONSE = 5,
+ RTEMS_TASKS_MP_SET_PRIORITY_REQUEST = 6,
+ RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE = 7,
+ RTEMS_TASKS_MP_GET_NOTE_REQUEST = 8,
+ RTEMS_TASKS_MP_GET_NOTE_RESPONSE = 9,
+ RTEMS_TASKS_MP_SET_NOTE_REQUEST = 10,
+ RTEMS_TASKS_MP_SET_NOTE_RESPONSE = 11
+} RTEMS_tasks_MP_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote task operations.
+ */
+
+typedef struct {
+ rtems_packet_prefix Prefix;
+ RTEMS_tasks_MP_Remote_operations operation;
+ rtems_name name;
+ rtems_task_priority the_priority;
+ unsigned32 notepad;
+ unsigned32 note;
+} RTEMS_tasks_MP_Packet;
+
+/*
+ * _RTEMS_tasks_MP_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _RTEMS_tasks_MP_Send_process_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_name name
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ */
+
+rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_task_priority the_priority,
+ unsigned32 notepad,
+ unsigned32 note
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ */
+
+void _RTEMS_tasks_MP_Send_response_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Thread_Control *the_thread
+);
+
+/*
+ *
+ * _RTEMS_tasks_MP_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _RTEMS_tasks_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+);
+
+/*
+ * _RTEMS_tasks_MP_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed by RTEMS_tasks since a task
+ * cannot be deleted when segments are in use.
+ */
+
+/*
+ * _RTEMS_tasks_MP_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*
+ * _RTEMS_tasks_MP_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to obtain a task mp packet.
+ */
+
+RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of file */
diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
new file mode 100644
index 0000000000..56813f4f9c
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -0,0 +1,421 @@
+/* tasks.h
+ *
+ * This include file contains all constants and structures associated
+ * with RTEMS tasks. This manager provides a comprehensive set of directives
+ * to create, delete, and administer tasks.
+ *
+ * Directives provided are:
+ *
+ * + create a task
+ * + get an ID of a task
+ * + start a task
+ * + restart a task
+ * + delete a task
+ * + suspend a task
+ * + resume a task
+ * + set a task's priority
+ * + change the current task's mode
+ * + get a task notepad entry
+ * + set a task notepad entry
+ * + wake up after interval
+ * + wake up when specified
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TASKS_h
+#define __RTEMS_RTEMS_TASKS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/eventset.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/status.h>
+
+/*
+ * Constant to be used as the ID of current task
+ */
+
+#define RTEMS_SELF OBJECTS_ID_OF_SELF
+
+/*
+ * This constant is passed to the rtems_task_wake_after directive as the
+ * interval when a task wishes to yield the CPU.
+ */
+
+#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
+ * manage this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _RTEMS_tasks_Information;
+
+/*
+ * These are used to manage the user initialization tasks.
+ */
+
+RTEMS_EXTERN rtems_initialization_tasks_table
+ *_RTEMS_tasks_User_initialization_tasks;
+RTEMS_EXTERN unsigned32 _RTEMS_tasks_Number_of_initialization_tasks;
+
+/*
+ * _RTEMS_tasks_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes all Task Manager related data structures.
+ */
+
+void _RTEMS_tasks_Manager_initialization(
+ unsigned32 maximum_tasks,
+ unsigned32 number_of_initialization_tasks,
+ rtems_initialization_tasks_table *user_tasks
+);
+
+/*
+ * rtems_task_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_create directive. The task
+ * will have the name name. The attribute_set can be used to indicate
+ * that the task will be globally accessible or utilize floating point.
+ * The task's stack will be stack_size bytes. The task will begin
+ * execution with initial_priority and initial_modes. It returns the
+ * id of the created task in ID.
+ */
+
+rtems_status_code rtems_task_create(
+ rtems_name name,
+ rtems_task_priority initial_priority,
+ unsigned32 stack_size,
+ rtems_mode initial_modes,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+);
+
+/*
+ * rtems_task_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_ident directive.
+ * This directive returns the task ID associated with name.
+ * If more than one task is named name, then the task to
+ * which the ID belongs is arbitrary. node indicates the
+ * extent of the search for the ID of the task named name.
+ * The search can be limited to a particular node or allowed to
+ * encompass all nodes.
+ */
+
+rtems_status_code rtems_task_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *id
+);
+
+/*
+ * rtems_task_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_delete directive. The
+ * task indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_task_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_get_note
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_get_note directive. The
+ * value of the indicated notepad for the task associated with ID
+ * is returned in note.
+ */
+
+rtems_status_code rtems_task_get_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 *note
+);
+
+/*
+ * rtems_task_set_note
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_set_note directive. The
+ * value of the indicated notepad for the task associated with ID
+ * is returned in note.
+ */
+
+rtems_status_code rtems_task_set_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 note
+);
+
+/*
+ * rtems_task_mode
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_mode directive. The current
+ * values of the modes indicated by mask of the calling task are changed
+ * to that indicated in mode_set. The former mode of the task is
+ * returned in mode_set.
+ */
+
+rtems_status_code rtems_task_mode(
+ rtems_mode mode_set,
+ rtems_mode mask,
+ rtems_mode *previous_mode_set
+);
+
+/*
+ * rtems_task_restart
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_restart directive. The
+ * task associated with ID is restarted at its initial entry
+ * point with the new argument.
+ */
+
+rtems_status_code rtems_task_restart(
+ Objects_Id id,
+ unsigned32 arg
+);
+
+/*
+ * rtems_task_suspend
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_suspend directive. The
+ * SUSPENDED state is set for task associated with ID.
+ */
+
+rtems_status_code rtems_task_suspend(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_resume
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_resume Directive. The
+ * SUSPENDED state is cleared for task associated with ID.
+ */
+
+rtems_status_code rtems_task_resume(
+ Objects_Id id
+);
+
+/*
+ * rtems_task_set_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_set_priority directive. The
+ * current priority of the task associated with ID is set to
+ * new_priority. The former priority of that task is returned
+ * in old_priority.
+ */
+
+rtems_status_code rtems_task_set_priority(
+ Objects_Id id,
+ rtems_task_priority new_priority,
+ rtems_task_priority *old_priority
+);
+
+/*
+ * rtems_task_start
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_start directive. The
+ * starting execution point of the task associated with ID is
+ * set to entry_point with the initial argument.
+ */
+
+rtems_status_code rtems_task_start(
+ Objects_Id id,
+ rtems_task_entry entry_point,
+ unsigned32 argument
+);
+
+/*
+ * rtems_task_wake_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_wake_when directive. The
+ * calling task is blocked until the current time of day is
+ * equal to that indicated by time_buffer.
+ */
+
+rtems_status_code rtems_task_wake_when(
+ rtems_time_of_day *time_buffer
+);
+
+/*
+ * rtems_task_wake_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_task_wake_after directive. The
+ * calling task is blocked until the indicated number of clock
+ * ticks have occurred.
+ */
+
+rtems_status_code rtems_task_wake_after(
+ rtems_interval ticks
+);
+
+/*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 );
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/tasks.inl>
+#endif
+#include <rtems/rtems/taskmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/timer.h b/cpukit/rtems/include/rtems/rtems/timer.h
new file mode 100644
index 0000000000..88e4f65f70
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/timer.h
@@ -0,0 +1,207 @@
+/* timer.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the Timer Manager. This manager provides
+ * facilities to configure, initiate, cancel, and delete timers which will
+ * fire at specified intervals of time.
+ *
+ * Directives provided are:
+ *
+ * + create a timer
+ * + get an ID of a timer
+ * + delete a timer
+ * + set a timer to fire after a number of ticks have passed
+ * + set a timer to fire when a specified date and time has been reached
+ * + reset a timer
+ * + cancel a time
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TIMER_h
+#define __RTEMS_TIMER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type details the classes to which a timer
+ * may belong.
+ */
+
+typedef enum {
+ TIMER_INTERVAL,
+ TIMER_TIME_OF_DAY,
+ TIMER_DORMANT
+} Timer_Classes;
+
+/*
+ * The following types define a pointer to a timer service routine.
+ */
+
+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
+ * this class of objects.
+ */
+
+RTEMS_EXTERN Objects_Information _Timer_Information;
+
+/*
+ * The following records define the control block used to manage
+ * each timer.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ Watchdog_Control Ticker;
+ Timer_Classes the_class;
+} Timer_Control;
+
+/*
+ * _Timer_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+);
+
+/*
+ * rtems_timer_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_create directive. The
+ * timer will have the name name. It returns the id of the
+ * created timer in ID.
+ */
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_timer_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_ident directive.
+ * This directive returns the timer ID associated with name.
+ * If more than one timer is named name, then the timer
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_timer_cancel
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_cancel directive. It is used
+ * to stop the timer associated with ID from firing.
+ */
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+);
+
+/*
+ * rtems_timer_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_delete directive. The
+ * timer indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+);
+
+/*
+ * rtems_timer_fire_after
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_fire_after directive. It
+ * initiates the timer associated with ID to fire in ticks clock
+ * ticks. When the timer fires, the routine will be invoked.
+ */
+
+rtems_status_code rtems_timer_fire_after(
+ Objects_Id id,
+ rtems_interval ticks,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
+ * rtems_timer_fire_when
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_fire_when directive. It
+ * initiates the timer associated with ID to fire at wall_time
+ * When the timer fires, the routine will be invoked.
+ */
+
+rtems_status_code rtems_timer_fire_when(
+ Objects_Id id,
+ rtems_time_of_day *wall_time,
+ rtems_timer_service_routine_entry routine,
+ void *user_data
+);
+
+/*
+ * rtems_timer_reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_timer_reset directive. It is used
+ * to reinitialize the interval timer associated with ID just as if
+ * rtems_timer_fire_after were re-invoked with the same arguments that
+ * were used to initiate this timer.
+ */
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/rtems/timer.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/include/rtems/rtems/types.h b/cpukit/rtems/include/rtems/rtems/types.h
new file mode 100644
index 0000000000..a0004fbb8a
--- /dev/null
+++ b/cpukit/rtems/include/rtems/rtems/types.h
@@ -0,0 +1,96 @@
+/* types.h
+ *
+ * This include file defines the types used by the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_RTEMS_TYPES_h
+#define __RTEMS_RTEMS_TYPES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+
+/*
+ * RTEMS basic type definitions
+ */
+
+typedef unsigned8 rtems_unsigned8; /* unsigned 8-bit value */
+typedef unsigned16 rtems_unsigned16; /* unsigned 16-bit value */
+typedef unsigned32 rtems_unsigned32; /* unsigned 32-bit value */
+
+typedef signed8 rtems_signed8; /* signed 8-bit value */
+typedef signed16 rtems_signed16; /* signed 16-bit value */
+typedef signed32 rtems_signed32; /* signed 32-bit value */
+
+/*
+ * some C++ compilers (eg: HP's) don't do 'long long'
+ */
+#if defined(__GNUC__)
+typedef unsigned64 rtems_unsigned64; /* unsigned 64-bit value */
+typedef signed64 rtems_signed64; /* signed 64-bit value */
+#endif
+
+typedef single_precision rtems_single; /* single precision float */
+typedef double_precision rtems_double; /* double precision float */
+
+typedef boolean rtems_boolean;
+
+typedef unsigned32 rtems_name;
+typedef Objects_Id rtems_id;
+
+typedef Context_Control rtems_context;
+typedef Context_Control_fp rtems_context_fp;
+typedef CPU_Interrupt_frame rtems_interrupt_frame;
+
+/*
+ * Time related
+ */
+
+typedef Watchdog_Interval rtems_interval;
+typedef TOD_Control rtems_time_of_day;
+
+/*
+ * 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
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/asr.inl b/cpukit/rtems/inline/rtems/rtems/asr.inl
new file mode 100644
index 0000000000..743c7ed5f7
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/asr.inl
@@ -0,0 +1,128 @@
+/* inline/asr.inl
+ *
+ * This include file contains the implemenation of all routines
+ * associated with the asynchronous signal handler which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ASR_inl
+#define __INLINE_ASR_inl
+
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _ASR_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the given RTEMS_ASR information record.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Initialize (
+ ASR_Information *information
+)
+{
+ information->is_enabled = TRUE;
+ information->handler = NULL;
+ information->mode_set = RTEMS_DEFAULT_MODES;
+ information->signals_posted = 0;
+ information->signals_pending = 0;
+ information->nest_level = 0;
+}
+
+/*PAGE
+ *
+ * _ASR_Swap_signals
+ *
+ * DESCRIPTION:
+ *
+ * This routine atomically swaps the pending and posted signal
+ * sets. This is done when the thread alters its mode in such a
+ * way that the RTEMS_ASR disable/enable flag changes.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Swap_signals (
+ ASR_Information *information
+)
+{
+ rtems_signal_set _signals;
+ ISR_Level _level;
+
+ _ISR_Disable( _level );
+ _signals = information->signals_pending;
+ information->signals_pending = information->signals_posted;
+ information->signals_posted = _signals;
+ _ISR_Enable( _level );
+}
+
+/*PAGE
+ *
+ * _ASR_Is_null_handler
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given asr_handler is NULL and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ASR_Is_null_handler (
+ rtems_asr_entry asr_handler
+)
+{
+ return asr_handler == NULL;
+}
+
+/*PAGE
+ *
+ * _ASR_Are_signals_pending
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there are signals pending in the
+ * given RTEMS_ASR information record and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ASR_Are_signals_pending (
+ ASR_Information *information
+)
+{
+ return information->signals_posted != 0;
+}
+
+/*PAGE
+ *
+ * _ASR_Post_signals
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts the given signals into the signal_set
+ * passed in. The result is returned to the user in signal_set.
+ *
+ * NOTE: This must be implemented as a macro.
+ */
+
+RTEMS_INLINE_ROUTINE void _ASR_Post_signals(
+ rtems_signal_set signals,
+ rtems_signal_set *signal_set
+)
+{
+ ISR_Level _level;
+
+ _ISR_Disable( _level );
+ *signal_set |= signals;
+ _ISR_Enable( _level );
+}
+
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/attr.inl b/cpukit/rtems/inline/rtems/rtems/attr.inl
new file mode 100644
index 0000000000..208dbcf1b4
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/attr.inl
@@ -0,0 +1,159 @@
+/* inline/attr.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with attributes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ATTRIBUTES_inl
+#define __INLINE_ATTRIBUTES_inl
+
+/*PAGE
+ *
+ * _Attributes_Set
+ *
+ * DESCRIPTION:
+ *
+ * This function sets the requested new_attributes in the attribute_set
+ * passed in. The result is returned to the user.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_attribute _Attributes_Set (
+ rtems_attribute new_attributes,
+ rtems_attribute attribute_set
+)
+{
+ return attribute_set | new_attributes;
+}
+
+/*PAGE
+ *
+ * _Attributes_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function clears the requested new_attributes in the attribute_set
+ * passed in. The result is returned to the user.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_attribute _Attributes_Clear (
+ rtems_attribute attribute_set,
+ rtems_attribute mask
+)
+{
+ return attribute_set & ~mask;
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_floating_point
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the floating point attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_floating_point(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_FLOATING_POINT );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_global
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the global object attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_global(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_GLOBAL );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_priority(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_binary_semaphore
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the binary semaphore attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_binary_semaphore(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_BINARY_SEMAPHORE );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_inherit_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority inheritance attribute
+ * is enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Attributes_Is_inherit_priority(
+ rtems_attribute attribute_set
+)
+{
+ return ( attribute_set & RTEMS_INHERIT_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _Attributes_Is_priority_ceiling
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority ceiling attribute
+ * is enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE 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/dpmem.inl b/cpukit/rtems/inline/rtems/rtems/dpmem.inl
new file mode 100644
index 0000000000..182a4c4094
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/dpmem.inl
@@ -0,0 +1,95 @@
+/* inline/dpmem.inl
+ *
+ * This include file contains the inline routine used in conjunction
+ * with the Dual Ported Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_DPMEM_inl
+#define __INLINE_DPMEM_inl
+
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a port control block from the inactive chain
+ * of free port control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Dual_ported_memory_Control
+ *_Dual_ported_memory_Allocate ( void )
+{
+ return (Dual_ported_memory_Control *)
+ _Objects_Allocate( &_Dual_ported_memory_Information );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a port control block to the inactive chain
+ * of free port control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Dual_ported_memory_Free (
+ Dual_ported_memory_Control *the_port
+)
+{
+ _Objects_Free( &_Dual_ported_memory_Information, &the_port->Object );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps port IDs to port control blocks. If ID
+ * corresponds to a local port, then it returns the_port control
+ * pointer which maps to ID and location is set to OBJECTS_LOCAL.
+ * Global ports are not supported, thus if ID does not map to a
+ * local port, location is set to OBJECTS_ERROR and the_port is
+ * undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Dual_ported_memory_Control *)
+ _Objects_Get( &_Dual_ported_memory_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_port is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Dual_ported_memory_Is_null(
+ Dual_ported_memory_Control *the_port
+)
+{
+ return ( the_port == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/event.inl b/cpukit/rtems/inline/rtems/rtems/event.inl
new file mode 100644
index 0000000000..9de27085d0
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/event.inl
@@ -0,0 +1,21 @@
+/* inline/event.inl
+ *
+ * This include file contains the static inline implementation of
+ * macros for the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_EVENT_inl
+#define __MACROS_EVENT_inl
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/eventset.inl b/cpukit/rtems/inline/rtems/rtems/eventset.inl
new file mode 100644
index 0000000000..a32190888b
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/eventset.inl
@@ -0,0 +1,91 @@
+/* inline/eventset.inl
+ *
+ * This include file contains the information pertaining to event sets.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_EVENT_SET_inl
+#define __INLINE_EVENT_SET_inl
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if on events are posted in the event_set,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Event_sets_Is_empty(
+ rtems_event_set the_event_set
+)
+{
+ return ( the_event_set == 0 );
+}
+
+/*PAGE
+ *
+ * _Event_sets_Post
+ *
+ * DESCRIPTION:
+ *
+ * This routine posts the given new_events into the event_set
+ * passed in. The result is returned to the user in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE void _Event_sets_Post(
+ rtems_event_set the_new_events,
+ rtems_event_set *the_event_set
+)
+{
+ *the_event_set |= the_new_events;
+}
+
+/*PAGE
+ *
+ * _Event_sets_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the events in event_condition which are
+ * set in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get(
+ rtems_event_set the_event_set,
+ rtems_event_set the_event_condition
+)
+{
+ return ( the_event_set & the_event_condition );
+}
+
+/*PAGE
+ *
+ * _Event_sets_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the events in mask from the event_set
+ * passed in. The result is returned to the user in event_set.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear(
+ rtems_event_set the_event_set,
+ rtems_event_set the_mask
+)
+{
+ return ( the_event_set & ~(the_mask) );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/message.inl b/cpukit/rtems/inline/rtems/rtems/message.inl
new file mode 100644
index 0000000000..d4895d0df5
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/message.inl
@@ -0,0 +1,83 @@
+/* message.inl
+ *
+ * This include file contains the static inline implementation of all
+ * inlined routines in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MESSAGE_QUEUE_inl
+#define __MESSAGE_QUEUE_inl
+
+#include <rtems/score/wkspace.h>
+
+/*PAGE
+ *
+ * _Message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function places the_message at the rear of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Message_queue_Is_null (
+ Message_queue_Control *the_message_queue
+)
+{
+ return ( the_message_queue == NULL );
+}
+
+
+/*PAGE
+ *
+ * _Message_queue_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine deallocates a message queue control block into
+ * the inactive chain of free message queue control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Message_queue_Free (
+ Message_queue_Control *the_message_queue
+)
+{
+ _Objects_Free( &_Message_queue_Information, &the_message_queue->Object );
+}
+
+/*PAGE
+ *
+ * _Message_queue_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps message queue IDs to message queue control
+ * blocks. If ID corresponds to a local message queue, then it
+ * returns the_message_queue control pointer which maps to ID
+ * and location is set to OBJECTS_LOCAL. If the message queue ID is
+ * global and resides on a remote node, then location is set
+ * to OBJECTS_REMOTE, and the_message_queue is undefined.
+ * Otherwise, location is set to OBJECTS_ERROR and
+ * the_message_queue is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Message_queue_Control *)
+ _Objects_Get( &_Message_queue_Information, id, location );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/modes.inl b/cpukit/rtems/inline/rtems/rtems/modes.inl
new file mode 100644
index 0000000000..8cc1c2273a
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/modes.inl
@@ -0,0 +1,152 @@
+/* modes.inl
+ *
+ * This include file contains the static inline implementation of the
+ * inlined routines in the Mode Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MODES_inl
+#define __MODES_inl
+
+/*PAGE
+ *
+ * _Modes_Mask_changed
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if any of the mode flags in mask
+ * are set in mode_set, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Mask_changed (
+ Modes_Control mode_set,
+ Modes_Control masks
+)
+{
+ return ( mode_set & masks );
+}
+
+/*PAGE
+ *
+ * _Modes_Is_asr_disabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that Asynchronous
+ * Signal Processing is disabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_asr_disabled (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR;
+}
+
+/*PAGE
+ *
+ * _Modes_Is_preempt
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that preemption
+ * is enabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_preempt (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT;
+}
+
+/*PAGE
+ *
+ * _Modes_Is_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if mode_set indicates that timeslicing
+ * is enabled, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Modes_Is_timeslice (
+ Modes_Control mode_set
+)
+{
+ return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE;
+}
+
+/*PAGE
+ *
+ * _Modes_Get_interrupt_level
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the interrupt level portion of the mode_set.
+ */
+
+RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level (
+ Modes_Control mode_set
+)
+{
+ return ( mode_set & RTEMS_INTERRUPT_MASK );
+}
+
+/*PAGE
+ *
+ * _Modes_Set_interrupt_level
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current interrupt level to that specified
+ * in the mode_set.
+ */
+
+RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level (
+ Modes_Control mode_set
+)
+{
+ _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) );
+}
+
+/*PAGE
+ *
+ * _Modes_Change
+ *
+ * DESCRIPTION:
+ *
+ * This routine changes the modes in old_mode_set indicated by
+ * mask to the requested values in new_mode_set. The resulting
+ * mode set is returned in out_mode_set and the modes that changed
+ * is returned in changed.
+ */
+
+RTEMS_INLINE_ROUTINE void _Modes_Change (
+ Modes_Control old_mode_set,
+ Modes_Control new_mode_set,
+ Modes_Control mask,
+ Modes_Control *out_mode_set,
+ Modes_Control *changed
+)
+{
+ Modes_Control _out_mode;
+
+ _out_mode = old_mode_set;
+ _out_mode &= ~mask;
+ _out_mode |= new_mode_set & mask;
+ *changed = _out_mode ^ old_mode_set;
+ *out_mode_set = _out_mode;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/options.inl b/cpukit/rtems/inline/rtems/rtems/options.inl
new file mode 100644
index 0000000000..9ed048ea7d
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/options.inl
@@ -0,0 +1,55 @@
+/* options.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the Options Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OPTIONS_inl
+#define __OPTIONS_inl
+
+/*PAGE
+ *
+ * _Options_Is_no_wait
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the RTEMS_NO_WAIT option is enabled in
+ * option_set, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Options_Is_no_wait (
+ rtems_option option_set
+)
+{
+ return (option_set & RTEMS_NO_WAIT);
+}
+
+/*PAGE
+ *
+ * _Options_Is_any
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the RTEMS_EVENT_ANY option is enabled in
+ * OPTION_SET, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Options_Is_any (
+ rtems_option option_set
+)
+{
+ return (option_set & RTEMS_EVENT_ANY);
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/part.inl b/cpukit/rtems/inline/rtems/rtems/part.inl
new file mode 100644
index 0000000000..b29b023eb1
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/part.inl
@@ -0,0 +1,199 @@
+/* part.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PARTITION_inl
+#define __PARTITION_inl
+
+/*PAGE
+ *
+ * _Partition_Allocate_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a buffer from the_partition.
+ * If successful, it returns the address of the allocated buffer.
+ * Otherwise, it returns NULL.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer (
+ Partition_Control *the_partition
+)
+{
+ return _Chain_Get( &the_partition->Memory );
+}
+
+/*PAGE
+ *
+ * _Partition_Free_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees the_buffer to the_partition.
+ */
+
+RTEMS_INLINE_ROUTINE void _Partition_Free_buffer (
+ Partition_Control *the_partition,
+ Chain_Node *the_buffer
+)
+{
+ _Chain_Append( &the_partition->Memory, the_buffer );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_on_boundary
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_buffer is on a valid buffer
+ * boundary for the_partition, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_on_boundary (
+ void *the_buffer,
+ Partition_Control *the_partition
+)
+{
+ unsigned32 offset;
+
+ offset = (unsigned32) _Addresses_Subtract(
+ the_buffer,
+ the_partition->starting_address
+ );
+
+ return ((offset % the_partition->buffer_size) == 0);
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_buffer is a valid buffer from
+ * the_partition, otherwise FALSE is returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_valid (
+ Chain_Node *the_buffer,
+ Partition_Control *the_partition
+)
+{
+ void *starting;
+ void *ending;
+
+ starting = the_partition->starting_address;
+ ending = _Addresses_Add_offset( starting, the_partition->length );
+
+ return (
+ _Addresses_Is_in_range( the_buffer, starting, ending ) &&
+ _Partition_Is_buffer_on_boundary( the_buffer, the_partition )
+ );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_size_aligned
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the use of the specified buffer_size
+ * will result in the allocation of buffers whose first byte is
+ * properly aligned, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_buffer_size_aligned (
+ unsigned32 buffer_size
+)
+{
+ return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0);
+}
+
+/*PAGE
+ *
+ * _Partition_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a partition control block from
+ * the inactive chain of free partition control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void )
+{
+ return (Partition_Control *) _Objects_Allocate( &_Partition_Information );
+}
+
+/*PAGE
+ *
+ * _Partition_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a partition control block to the
+ * inactive chain of free partition control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Partition_Free (
+ Partition_Control *the_partition
+)
+{
+ _Objects_Free( &_Partition_Information, &the_partition->Object );
+}
+
+/*PAGE
+ *
+ * _Partition_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps partition IDs to partition control blocks.
+ * If ID corresponds to a local partition, then it returns
+ * the_partition control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. If the partition ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_partition is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_partition is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Partition_Control *)
+ _Objects_Get( &_Partition_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Partition_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_partition is NULL
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Partition_Is_null (
+ Partition_Control *the_partition
+)
+{
+ return ( the_partition == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/ratemon.inl b/cpukit/rtems/inline/rtems/rtems/ratemon.inl
new file mode 100644
index 0000000000..b5a4e9698f
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/ratemon.inl
@@ -0,0 +1,143 @@
+/* ratemon.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines in the Rate Monotonic Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_inl
+#define __RATE_MONOTONIC_inl
+
+/*PAGE
+ *
+ * _Rate_monotonic_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a period control block from
+ * the inactive chain of free period control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void )
+{
+ return (Rate_monotonic_Control *)
+ _Objects_Allocate( &_Rate_monotonic_Information );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a period control block from
+ * the inactive chain of free period control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Rate_monotonic_Free (
+ Rate_monotonic_Control *the_period
+)
+{
+ _Objects_Free( &_Rate_monotonic_Information, &the_period->Object );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps period IDs to period control blocks.
+ * If ID corresponds to a local period, then it returns
+ * the_period control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the_period is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Rate_monotonic_Control *)
+ _Objects_Get( &_Rate_monotonic_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_active
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the ACTIVE state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_active (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_ACTIVE);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_inactive
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the ACTIVE state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_inactive (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_INACTIVE);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_expired
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is in the EXPIRED state,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_expired (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period->state == RATE_MONOTONIC_EXPIRED);
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_period is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Rate_monotonic_Is_null (
+ Rate_monotonic_Control *the_period
+)
+{
+ return (the_period == NULL);
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/region.inl b/cpukit/rtems/inline/rtems/rtems/region.inl
new file mode 100644
index 0000000000..c2d596c438
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/region.inl
@@ -0,0 +1,127 @@
+/* region.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __REGION_inl
+#define __REGION_inl
+
+/*PAGE
+ *
+ * _Region_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a region control block from
+ * the inactive chain of free region control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void )
+{
+ return (Region_Control *) _Objects_Allocate( &_Region_Information );
+}
+
+/*PAGE
+ *
+ * _Region_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a region control block to the
+ * inactive chain of free region control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Region_Free (
+ Region_Control *the_region
+)
+{
+ _Objects_Free( &_Region_Information, &the_region->Object );
+}
+
+/*PAGE
+ *
+ * _Region_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps region IDs to region control blocks.
+ * If ID corresponds to a local region, then it returns
+ * the_region control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the_region is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Region_Control *_Region_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Region_Control *)
+ _Objects_Get( &_Region_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Region_Allocate_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a segment from the_region.
+ * If successful, it returns the address of the allocated segment.
+ * Otherwise, it returns NULL.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment (
+ Region_Control *the_region,
+ unsigned32 size
+)
+{
+ return _Heap_Allocate( &the_region->Memory, size );
+}
+
+/*PAGE
+ *
+ * _Region_Free_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function frees the_segment to the_region.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Region_Free_segment (
+ Region_Control *the_region,
+ void *the_segment
+)
+{
+ return _Heap_Free( &the_region->Memory, the_segment );
+}
+
+/*PAGE
+ *
+ * _Region_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_region is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Region_Is_null (
+ Region_Control *the_region
+)
+{
+ return ( the_region == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/sem.inl b/cpukit/rtems/inline/rtems/rtems/sem.inl
new file mode 100644
index 0000000000..25d0eeafe5
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/sem.inl
@@ -0,0 +1,93 @@
+/* sem.inl
+ *
+ * This file contains the static inlin implementation of the inlined
+ * routines from the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SEMAPHORE_inl
+#define __SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _Semaphore_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a semaphore control block from
+ * the inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void )
+{
+ return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a semaphore control block to the
+ * inactive chain of free semaphore control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Semaphore_Free (
+ Semaphore_Control *the_semaphore
+)
+{
+ _Objects_Free( &_Semaphore_Information, &the_semaphore->Object );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps semaphore IDs to semaphore control blocks.
+ * If ID corresponds to a local semaphore, then it returns
+ * the_semaphore control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. if the semaphore ID is global and
+ * resides on a remote node, then location is set to OBJECTS_REMOTE,
+ * and the_semaphore is undefined. Otherwise, location is set
+ * to OBJECTS_ERROR and the_semaphore is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Semaphore_Control *)
+ _Objects_Get( &_Semaphore_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Semaphore_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_semaphore is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Semaphore_Is_null (
+ Semaphore_Control *the_semaphore
+)
+{
+ return ( the_semaphore == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/status.inl b/cpukit/rtems/inline/rtems/rtems/status.inl
new file mode 100644
index 0000000000..733e749176
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/status.inl
@@ -0,0 +1,56 @@
+/* inline/status.inl
+ *
+ * This include file contains the implementations of the inlined
+ * routines for the status package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_STATUS_inl
+#define __INLINE_STATUS_inl
+
+/*PAGE
+ *
+ * rtems_is_status_successful
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the status code is equal to RTEMS_SUCCESSFUL,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean rtems_is_status_successful(
+ rtems_status_code code
+)
+{
+ return (code == RTEMS_SUCCESSFUL);
+}
+
+/*PAGE
+ *
+ * rtems_are_statuses_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the status code1 is equal to code2,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean rtems_are_statuses_equal(
+ rtems_status_code code1,
+ rtems_status_code code2
+)
+{
+ return (code1 == code2);
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/support.inl b/cpukit/rtems/inline/rtems/rtems/support.inl
new file mode 100644
index 0000000000..75274846f2
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/support.inl
@@ -0,0 +1,61 @@
+/* support.inl
+ *
+ * This include file contains the static inline implementation of all
+ * of the inlined routines specific to the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SUPPORT_inl
+#define __RTEMS_SUPPORT_inl
+
+/*PAGE
+ *
+ * rtems_is_name_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the name is valid, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE rtems_boolean rtems_is_name_valid (
+ rtems_name name
+)
+{
+ return ( name != 0 );
+}
+
+/*PAGE
+ *
+ * rtems_name_to_characters
+ *
+ * DESCRIPTION:
+ *
+ * This function breaks the object name into the four component
+ * characters C1, C2, C3, and C4.
+ */
+
+RTEMS_INLINE_ROUTINE void rtems_name_to_characters(
+ rtems_name name,
+ char *c1,
+ char *c2,
+ char *c3,
+ char *c4
+)
+{
+ *c1 = (name >> 24) & 0xff;
+ *c2 = (name >> 16) & 0xff;
+ *c3 = (name >> 8) & 0xff;
+ *c4 = name & 0xff;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/tasks.inl b/cpukit/rtems/inline/rtems/rtems/tasks.inl
new file mode 100644
index 0000000000..b16ad40469
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/tasks.inl
@@ -0,0 +1,90 @@
+/* tasks.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the with RTEMS Tasks Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TASKS_inl
+#define __RTEMS_TASKS_inl
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a task control block from
+ * the inactive chain of free task control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_RTEMS_tasks_Allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information );
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a task control block to the
+ * inactive chain of free task control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _RTEMS_tasks_Free (
+ Thread_Control *the_task
+)
+{
+ _Objects_Free(
+ _Objects_Get_information( the_task->Object.id ),
+ &the_task->Object
+ );
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_to_Core
+ *
+ * DESCRIPTION:
+ *
+ * This function converts an RTEMS API priority into a core priority.
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _RTEMS_tasks_Priority_to_Core(
+ rtems_task_priority priority
+)
+{
+ return (Priority_Control) priority;
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_is_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority is a valid user task priority
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _RTEMS_tasks_Priority_is_valid (
+ rtems_task_priority the_priority
+)
+{
+ return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) &&
+ ( the_priority <= RTEMS_MAXIMUM_PRIORITY ) );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/inline/rtems/rtems/timer.inl b/cpukit/rtems/inline/rtems/rtems/timer.inl
new file mode 100644
index 0000000000..c773fc1ebc
--- /dev/null
+++ b/cpukit/rtems/inline/rtems/rtems/timer.inl
@@ -0,0 +1,142 @@
+/* timer.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Timer Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_inl
+#define __TIMER_inl
+
+/*PAGE
+ *
+ * _Timer_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a timer control block from
+ * the inactive chain of free timer control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Allocate( void )
+{
+ return (Timer_Control *) _Objects_Allocate( &_Timer_Information );
+}
+
+/*PAGE
+ *
+ * _Timer_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a timer control block to the
+ * inactive chain of free timer control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Timer_Free (
+ Timer_Control *the_timer
+)
+{
+ _Objects_Free( &_Timer_Information, &the_timer->Object );
+}
+
+/*PAGE
+ *
+ * _Timer_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps timer IDs to timer control blocks.
+ * If ID corresponds to a local timer, then it returns
+ * the timer control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the returned value is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Timer_Control *)
+ _Objects_Get( &_Timer_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_interval_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of an INTERVAL
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_interval_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_INTERVAL );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_time_of_day_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of an INTERVAL
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_timer_of_day_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_TIME_OF_DAY );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_dormant_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is that of a DORMANT
+ * timer, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_dormant_class (
+ Timer_Classes the_class
+)
+{
+ return ( the_class == TIMER_DORMANT );
+}
+
+/*PAGE
+ *
+ * _Timer_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_timer is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Timer_Is_null (
+ Timer_Control *the_timer
+)
+{
+ return ( the_timer == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/asr.inl b/cpukit/rtems/macros/rtems/rtems/asr.inl
new file mode 100644
index 0000000000..dc6dc414b8
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/asr.inl
@@ -0,0 +1,90 @@
+/* macros/asr.h
+ *
+ * This include file contains the implemenation of all routines
+ * associated with the asynchronous signal handler which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ASR_h
+#define __INLINE_ASR_h
+
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _ASR_Initialize
+ *
+ */
+
+#define _ASR_Initialize( _information ) \
+{ \
+ (_information)->is_enabled = TRUE; \
+ (_information)->handler = NULL; \
+ (_information)->mode_set = RTEMS_DEFAULT_MODES; \
+ (_information)->signals_posted = 0; \
+ (_information)->signals_pending = 0; \
+ (_information)->nest_level = 0; \
+}
+
+/*PAGE
+ *
+ * _ASR_Swap_signals
+ *
+ */
+
+#define _ASR_Swap_signals( _information ) \
+{ \
+ rtems_signal_set _signals; \
+ ISR_Level _level; \
+ \
+ _ISR_Disable( _level ); \
+ _signals = (_information)->signals_pending; \
+ (_information)->signals_pending = (_information)->signals_posted; \
+ (_information)->signals_posted = _signals; \
+ _ISR_Enable( _level ); \
+}
+
+/*PAGE
+ *
+ * _ASR_Is_null_handler
+ *
+ */
+
+#define _ASR_Is_null_handler( _asr_handler ) \
+ ( (_asr_handler) == NULL )
+
+/*PAGE
+ *
+ * _ASR_Are_signals_pending
+ *
+ */
+
+#define _ASR_Are_signals_pending( _information ) \
+ ( (_information)->signals_posted != 0 )
+
+/*PAGE
+ *
+ * _ASR_Post_signals
+ *
+ */
+
+#define _ASR_Post_signals( _signals, _signal_set ) \
+ do { \
+ ISR_Level _level; \
+ \
+ _ISR_Disable( _level ); \
+ *(_signal_set) |= (_signals); \
+ _ISR_Enable( _level ); \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/attr.inl b/cpukit/rtems/macros/rtems/rtems/attr.inl
new file mode 100644
index 0000000000..a538d2bdd3
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/attr.inl
@@ -0,0 +1,91 @@
+/* macros/attr.h
+ *
+ * This include file contains all of the inlined routines associated
+ * with attributes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_ATTRIBUTES_h
+#define __MACROS_ATTRIBUTES_h
+
+/*PAGE
+ *
+ * _Attributes_Set
+ */
+
+#define _Attributes_Set( _new_attributes, _attribute_set ) \
+ ( (_attribute_set) | (_new_attributes) )
+
+/*PAGE
+ *
+ * _Attributes_Clear
+ */
+
+#define _Attributes_Clear( _attribute_set, _mask ) \
+ ( (_attribute_set) & ~(_mask) )
+
+/*PAGE
+ *
+ * _Attributes_Is_floating_point
+ *
+ */
+
+#define _Attributes_Is_floating_point( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_FLOATING_POINT )
+
+/*PAGE
+ *
+ * _Attributes_Is_global
+ *
+ */
+
+#define _Attributes_Is_global( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_GLOBAL )
+
+/*PAGE
+ *
+ * _Attributes_Is_priority
+ *
+ */
+
+#define _Attributes_Is_priority( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_PRIORITY )
+
+/*PAGE
+ *
+ * _Attributes_Is_binary_semaphore
+ *
+ */
+
+#define _Attributes_Is_binary_semaphore( _attribute_set ) \
+ ( (_attribute_set) & RTEMS_BINARY_SEMAPHORE )
+
+/*PAGE
+ *
+ * _Attributes_Is_inherit_priority
+ *
+ */
+
+#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/dpmem.inl b/cpukit/rtems/macros/rtems/rtems/dpmem.inl
new file mode 100644
index 0000000000..9b12e66ab5
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/dpmem.inl
@@ -0,0 +1,59 @@
+/* macros/dpmem.h
+ *
+ * This include file contains the inline routine used in conjunction
+ * with the Dual Ported Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_DPMEM_h
+#define __MACROS_DPMEM_h
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Allocate
+ *
+ */
+
+#define _Dual_ported_memory_Allocate() \
+ (Dual_ported_memory_Control *) \
+ _Objects_Allocate( &_Dual_ported_memory_Information )
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Free
+ *
+ */
+
+#define _Dual_ported_memory_Free( _the_port ) \
+ _Objects_Free( &_Dual_ported_memory_Information, &(_the_port)->Object )
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Get
+ *
+ */
+
+#define _Dual_ported_memory_Get( _id, _location ) \
+ (Dual_ported_memory_Control *) \
+ _Objects_Get( &_Dual_ported_memory_Information, (_id), (_location) )
+
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Is_null
+ */
+
+#define _Dual_ported_memory_Is_null( _the_port ) \
+ ( (_the_port) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/event.inl b/cpukit/rtems/macros/rtems/rtems/event.inl
new file mode 100644
index 0000000000..5bc060ba69
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/event.inl
@@ -0,0 +1,21 @@
+/* macros/event.h
+ *
+ * This include file contains the implementation of macros for
+ * the Event Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_EVENT_h
+#define __MACROS_EVENT_h
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/eventset.inl b/cpukit/rtems/macros/rtems/rtems/eventset.inl
new file mode 100644
index 0000000000..d5e95e4db6
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/eventset.inl
@@ -0,0 +1,53 @@
+/* eventset.inl
+ *
+ * This include file contains the macro implementation of inlined
+ * routines in the event set object.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EVENT_SET_inl
+#define __EVENT_SET_inl
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Is_empty( _the_event_set ) \
+ ((_the_event_set) == 0 )
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Post( _the_new_events, _the_event_set ) \
+ *(_the_event_set) |= (_the_new_events)
+
+/*PAGE
+ *
+ * _Event_sets_Is_empty
+ */
+
+#define _Event_sets_Get( _the_event_set, _the_event_condition ) \
+ ((_the_event_set) & (_the_event_condition))
+
+/*PAGE
+ *
+ * _Event_sets_Clear
+ */
+
+#define _Event_sets_Clear( _the_event_set, _the_mask ) \
+ ((_the_event_set) & ~(_the_mask))
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/message.inl b/cpukit/rtems/macros/rtems/rtems/message.inl
new file mode 100644
index 0000000000..6a0fe8f942
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/message.inl
@@ -0,0 +1,49 @@
+/* message.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Message Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MESSAGE_QUEUE_inl
+#define __MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _Message_queue_Is_null
+ *
+ */
+
+#define _Message_queue_Is_null( _the_message_queue ) \
+ ( (_the_message_queue) == NULL )
+
+/*PAGE
+ *
+ * _Message_queue_Free
+ *
+ */
+
+#define _Message_queue_Free( _the_message_queue ) \
+ _Objects_Free( &_Message_queue_Information, &(_the_message_queue)->Object )
+
+/*PAGE
+ *
+ * _Message_queue_Get
+ *
+ */
+
+#define _Message_queue_Get( _id, _location ) \
+ (Message_queue_Control *) \
+ _Objects_Get( &_Message_queue_Information, (_id), (_location) )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/modes.inl b/cpukit/rtems/macros/rtems/rtems/modes.inl
new file mode 100644
index 0000000000..3c03b8c5f6
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/modes.inl
@@ -0,0 +1,92 @@
+/* modes.inl
+ *
+ * This include file contains the macro implementation of the
+ * inlined routines in the Mode Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MODES_inl
+#define __MODES_inl
+
+/*PAGE
+ *
+ * _Modes_Mask_changed
+ *
+ */
+
+#define _Modes_Mask_changed( _mode_set, _masks ) \
+ ( (_mode_set) & (_masks) )
+
+/*PAGE
+ *
+ * _Modes_Is_asr_disabled
+ *
+ */
+
+#define _Modes_Is_asr_disabled( _mode_set ) \
+ (((_mode_set) & RTEMS_ASR_MASK) == RTEMS_NO_ASR)
+
+/*PAGE
+ *
+ * _Modes_Is_preempt
+ *
+ */
+
+#define _Modes_Is_preempt( _mode_set ) \
+ ( ( (_mode_set) & RTEMS_PREEMPT_MASK ) == RTEMS_PREEMPT )
+
+/*PAGE
+ *
+ * _Modes_Is_timeslice
+ *
+ */
+
+#define _Modes_Is_timeslice( _mode_set ) \
+ (((_mode_set) & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE)
+
+/*PAGE
+ *
+ * _Modes_Get_interrupt_level
+ *
+ */
+
+#define _Modes_Get_interrupt_level( _mode_set ) \
+ ( (_mode_set) & RTEMS_INTERRUPT_MASK )
+
+/*PAGE
+ *
+ * _Modes_Set_interrupt_level
+ *
+ */
+
+#define _Modes_Set_interrupt_level( _mode_set ) \
+ _ISR_Set_level( _Modes_Get_interrupt_level( (_mode_set) ) )
+
+/*PAGE
+ *
+ * _Modes_Change
+ *
+ */
+
+#define _Modes_Change( _old_mode_set, _new_mode_set, \
+ _mask, _out_mode_set, _changed ) \
+ { Modes_Control _out_mode; \
+ \
+ _out_mode = (_old_mode_set); \
+ _out_mode &= ~(_mask); \
+ _out_mode |= (_new_mode_set) & (_mask); \
+ *(_changed) = _out_mode ^ (_old_mode_set); \
+ *(_out_mode_set) = _out_mode; \
+ }
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/options.inl b/cpukit/rtems/macros/rtems/rtems/options.inl
new file mode 100644
index 0000000000..41e4798d3c
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/options.inl
@@ -0,0 +1,39 @@
+/* options.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Options Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OPTIONS_inl
+#define __OPTIONS_inl
+
+/*PAGE
+ *
+ * _Options_Is_no_wait
+ *
+ */
+
+#define _Options_Is_no_wait( _option_set ) \
+ ( (_option_set) & RTEMS_NO_WAIT )
+
+/*PAGE
+ *
+ * _Options_Is_any
+ *
+ */
+
+#define _Options_Is_any( _option_set ) \
+ ( (_option_set) & RTEMS_EVENT_ANY )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/part.inl b/cpukit/rtems/macros/rtems/rtems/part.inl
new file mode 100644
index 0000000000..f593acc577
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/part.inl
@@ -0,0 +1,117 @@
+/* part.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Partition Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PARTITION_inl
+#define __PARTITION_inl
+
+/*PAGE
+ *
+ * _Partition_Allocate_buffer
+ *
+ */
+
+#define _Partition_Allocate_buffer( _the_partition ) \
+ _Chain_Get( &(_the_partition)->Memory )
+
+/*PAGE
+ *
+ * _Partition_Free_buffer
+ *
+ */
+
+#define _Partition_Free_buffer( _the_partition, _the_buffer ) \
+ _Chain_Append( &(_the_partition)->Memory, (_the_buffer) )
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_on_boundary
+ *
+ */
+
+#define _Partition_Is_buffer_on_boundary( _the_buffer, _the_partition ) \
+ ((((unsigned32) _Addresses_Subtract( \
+ (_the_buffer), \
+ (_the_partition)->starting_address ) \
+ ) % \
+ (_the_partition)->buffer_size) == 0)
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_valid
+ *
+ */
+
+#define _Partition_Is_buffer_valid( _the_buffer, _the_partition ) \
+ ( \
+ _Addresses_Is_in_range( \
+ (_the_buffer), \
+ (_the_partition)->starting_address, \
+ _Addresses_Add_offset( \
+ (_the_partition)->starting_address, \
+ (_the_partition)->length \
+ ) \
+ ) && \
+ _Partition_Is_buffer_on_boundary( (_the_buffer), (_the_partition) ) \
+ )
+
+/*PAGE
+ *
+ * _Partition_Is_buffer_size_aligned
+ *
+ */
+
+#define _Partition_Is_buffer_size_aligned( _buffer_size ) \
+ ((_buffer_size) % CPU_PARTITION_ALIGNMENT == 0)
+
+/*PAGE
+ *
+ * _Partition_Allocate
+ *
+ */
+
+#define _Partition_Allocate() \
+ (Partition_Control *) _Objects_Allocate( &_Partition_Information )
+
+/*PAGE
+ *
+ * _Partition_Free
+ *
+ */
+
+#define _Partition_Free( _the_partition ) \
+ _Objects_Free( &_Partition_Information, &(_the_partition)->Object )
+
+/*PAGE
+ *
+ * _Partition_Get
+ *
+ */
+
+#define _Partition_Get( _id, _location ) \
+ (Partition_Control *) \
+ _Objects_Get( &_Partition_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Partition_Is_null
+ *
+ */
+
+#define _Partition_Is_null( _the_partition ) \
+ ( (_the_partition) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/ratemon.inl b/cpukit/rtems/macros/rtems/rtems/ratemon.inl
new file mode 100644
index 0000000000..bdcaf25960
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/ratemon.inl
@@ -0,0 +1,85 @@
+/* ratemon.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines in the Rate Monotonic Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RATE_MONOTONIC_inl
+#define __RATE_MONOTONIC_inl
+
+/*PAGE
+ *
+ * _Rate_monotonic_Allocate
+ *
+ */
+
+#define _Rate_monotonic_Allocate() \
+ (Rate_monotonic_Control *) \
+ _Objects_Allocate( &_Rate_monotonic_Information )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Free
+ *
+ */
+
+#define _Rate_monotonic_Free( _the_period ) \
+ _Objects_Free( &_Rate_monotonic_Information, &(_the_period)->Object )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Get
+ *
+ */
+
+#define _Rate_monotonic_Get( _id, _location ) \
+ (Rate_monotonic_Control *) \
+ _Objects_Get( &_Rate_monotonic_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_active
+ *
+ */
+
+#define _Rate_monotonic_Is_active( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_ACTIVE)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_inactive
+ *
+ */
+
+#define _Rate_monotonic_Is_inactive( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_INACTIVE)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_expired
+ *
+ */
+
+#define _Rate_monotonic_Is_expired( _the_period ) \
+ ((_the_period)->state == RATE_MONOTONIC_EXPIRED)
+
+/*PAGE
+ *
+ * _Rate_monotonic_Is_null
+ *
+ */
+
+#define _Rate_monotonic_Is_null( _the_period ) ( (_the_period) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/region.inl b/cpukit/rtems/macros/rtems/rtems/region.inl
new file mode 100644
index 0000000000..98fca1031b
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/region.inl
@@ -0,0 +1,75 @@
+/* region.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Region Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __REGION_inl
+#define __REGION_inl
+
+/*PAGE
+ *
+ * _Region_Allocate
+ *
+ */
+
+#define _Region_Allocate() \
+ (Region_Control *) _Objects_Allocate( &_Region_Information )
+
+/*PAGE
+ *
+ * _Region_Free
+ *
+ */
+
+#define _Region_Free( _the_region ) \
+ _Objects_Free( &_Region_Information, &(_the_region)->Object )
+
+/*PAGE
+ *
+ * _Region_Get
+ *
+ */
+
+#define _Region_Get( _id, _location ) \
+ (Region_Control *) \
+ _Objects_Get( &_Region_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Region_Allocate_segment
+ *
+ */
+
+#define _Region_Allocate_segment( _the_region, _size ) \
+ _Heap_Allocate( &(_the_region)->Memory, (_size) )
+
+/*PAGE
+ *
+ * _Region_Free_segment
+ *
+ */
+
+#define _Region_Free_segment( _the_region, _the_segment ) \
+ _Heap_Free( &(_the_region)->Memory, (_the_segment) )
+
+/*PAGE
+ *
+ * _Region_Is_null
+ *
+ */
+
+#define _Region_Is_null( _the_region ) ( (_the_region) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/sem.inl b/cpukit/rtems/macros/rtems/rtems/sem.inl
new file mode 100644
index 0000000000..15d1404acf
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/sem.inl
@@ -0,0 +1,58 @@
+/* sem.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Semaphore Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SEMAPHORE_inl
+#define __SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _Semaphore_Allocate
+ *
+ */
+
+#define _Semaphore_Allocate() \
+ (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information )
+
+/*PAGE
+ *
+ * _Semaphore_Free
+ *
+ */
+
+#define _Semaphore_Free( _the_semaphore ) \
+ _Objects_Free( &_Semaphore_Information, &(_the_semaphore)->Object )
+
+/*PAGE
+ *
+ * _Semaphore_Get
+ *
+ */
+
+#define _Semaphore_Get( _id, _location ) \
+ (Semaphore_Control *) \
+ _Objects_Get( &_Semaphore_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Semaphore_Is_null
+ *
+ */
+
+#define _Semaphore_Is_null( _the_semaphore ) \
+ ( (_the_semaphore) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/status.inl b/cpukit/rtems/macros/rtems/rtems/status.inl
new file mode 100644
index 0000000000..d90ec79234
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/status.inl
@@ -0,0 +1,39 @@
+/* macros/status.h
+ *
+ * This include file contains the implementations of the inlined
+ * routines for the status package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_STATUS_h
+#define __MACROS_STATUS_h
+
+/*PAGE
+ *
+ * rtems_is_status_successful
+ *
+ */
+
+#define rtems_is_status_successful( _code ) \
+ ( (_code) == RTEMS_SUCCESSFUL )
+
+/*PAGE
+ *
+ * rtems_are_statuses_equal
+ *
+ */
+
+#define rtems_are_statuses_equal( _code1, _code2 ) \
+ ((_code1) == (_code2))
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/support.inl b/cpukit/rtems/macros/rtems/rtems/support.inl
new file mode 100644
index 0000000000..59d3bfec95
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/support.inl
@@ -0,0 +1,44 @@
+/* support.inl
+ *
+ * This include file contains the macros implementation of all
+ * of the inlined routines specific to the RTEMS API.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SUPPORT_inl
+#define __RTEMS_SUPPORT_inl
+
+/*PAGE
+ *
+ * rtems_is_name_valid
+ *
+ */
+
+#define rtems_is_name_valid( _name ) \
+ ( (_name) != 0 )
+
+/*PAGE
+ *
+ * rtems_name_to_characters
+ *
+ */
+
+#define rtems_name_to_characters( _name, _c1, _c2, _c3, _c4 ) \
+ { \
+ (*(_c1) = ((_name) >> 24) & 0xff; \
+ (*(_c2) = ((_name) >> 16) & 0xff; \
+ (*(_c3) = ((_name) >> 8) & 0xff; \
+ (*(_c4) = ((_name)) & 0xff; \
+ }
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/macros/rtems/rtems/tasks.inl b/cpukit/rtems/macros/rtems/rtems/tasks.inl
new file mode 100644
index 0000000000..12d8fc51cc
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/tasks.inl
@@ -0,0 +1,58 @@
+/* tasks.inl
+ *
+ * This file contains the macro implementation of all inlined
+ * routines in the with RTEMS Tasks Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_TASKS_inl
+#define __RTEMS_TASKS_inl
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Allocate
+ *
+ */
+
+#define _RTEMS_tasks_Allocate() \
+ (Thread_Control *) _Objects_Allocate( &_RTEMS_tasks_Information )
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Free
+ *
+ */
+
+#define _RTEMS_tasks_Free( _the_task ) \
+ _Objects_Free( &_RTEMS_tasks_Information, &(_the_task)->Object )
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_to_Core
+ */
+
+#define _RTEMS_tasks_Priority_to_Core( _priority ) \
+ ((Priority_Control) (_priority))
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Priority_is_valid
+ *
+ */
+
+#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/macros/rtems/rtems/timer.inl b/cpukit/rtems/macros/rtems/rtems/timer.inl
new file mode 100644
index 0000000000..0f9d9d56ef
--- /dev/null
+++ b/cpukit/rtems/macros/rtems/rtems/timer.inl
@@ -0,0 +1,85 @@
+/* timer.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Timer Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIMER_inl
+#define __TIMER_inl
+
+/*PAGE
+ *
+ * _Timer_Allocate
+ *
+ */
+
+#define _Timer_Allocate() \
+ (Timer_Control *) _Objects_Allocate( &_Timer_Information )
+
+/*PAGE
+ *
+ * _Timer_Free
+ *
+ */
+
+#define _Timer_Free( _the_timer ) \
+ _Objects_Free( &_Timer_Information, &(_the_timer)->Object )
+
+/*PAGE
+ *
+ * _Timer_Get
+ *
+ */
+
+#define _Timer_Get( _id, _location ) \
+ (Timer_Control *) \
+ _Objects_Get( &_Timer_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Timer_Is_interval_class
+ *
+ */
+
+#define _Timer_Is_interval_class( _the_class ) \
+ ( (_the_class) == TIMER_INTERVAL )
+
+/*PAGE
+ *
+ * _Timer_Is_time_of_day_class
+ *
+ */
+
+#define _Timer_Is_time_of_day_class( _the_class ) \
+ ( (_the_class) == TIMER_TIME_OF_DAY )
+
+/*PAGE
+ *
+ * _Timer_Is_dormant_class
+ *
+ */
+
+#define _Timer_Is_dormant_class( _the_class ) \
+ ( (_the_class) == TIMER_DORMANT )
+
+/*PAGE
+ *
+ * _Timer_Is_null
+ *
+ */
+
+#define _Timer_Is_null( _the_timer ) \
+ ( (_the_timer) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/rtems/src/dpmem.c b/cpukit/rtems/src/dpmem.c
new file mode 100644
index 0000000000..90026df3b3
--- /dev/null
+++ b/cpukit/rtems/src/dpmem.c
@@ -0,0 +1,281 @@
+/*
+ * Dual Port Memory Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/address.h>
+#include <rtems/rtems/dpmem.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/dpmem.h>
+
+/*PAGE
+ *
+ * _Dual_ported_memory_Manager_initialization
+ *
+ * This routine initializes all dual-ported memory manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_ports - number of ports to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Dual_ported_memory_Manager_initialization(
+ unsigned32 maximum_ports
+)
+{
+ _Objects_Initialize_information(
+ &_Dual_ported_memory_Information,
+ OBJECTS_RTEMS_PORTS,
+ FALSE,
+ maximum_ports,
+ sizeof( Dual_ported_memory_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_port_create
+ *
+ * This directive creates a port into a dual-ported memory area.
+ *
+ * Input parameters:
+ * name - user defined port name
+ * internal_start - internal start address of port
+ * external_start - external start address of port
+ * length - physical length in bytes
+ * id - address of port id to set
+ *
+ * Output parameters:
+ * id - port id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_port_create(
+ rtems_name name,
+ void *internal_start,
+ void *external_start,
+ unsigned32 length,
+ Objects_Id *id
+)
+{
+ register Dual_ported_memory_Control *the_port;
+
+ if ( !rtems_is_name_valid( name) )
+ return RTEMS_INVALID_NAME;
+
+ if ( !_Addresses_Is_aligned( internal_start ) ||
+ !_Addresses_Is_aligned( external_start ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_port = _Dual_ported_memory_Allocate();
+
+ if ( !the_port ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_port->internal_base = internal_start;
+ the_port->external_base = external_start;
+ the_port->length = length - 1;
+
+ _Objects_Open(
+ &_Dual_ported_memory_Information,
+ &the_port->Object,
+ &name
+ );
+
+ *id = the_port->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_port_ident
+ *
+ * This directive returns the system ID associated with
+ * the port name.
+ *
+ * Input parameters:
+ * name - user defined port name
+ * id - pointer to port id
+ *
+ * Output parameters:
+ * *id - port id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_port_ident(
+ rtems_name name,
+ Objects_Id *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
+ *
+ * rtems_port_delete
+ *
+ * This directive allows a thread to delete a dual-ported memory area
+ * specified by the dual-ported memory identifier.
+ *
+ * Input parameters:
+ * id - dual-ported memory area id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_port_delete(
+ Objects_Id id
+)
+{
+ register Dual_ported_memory_Control *the_port;
+ Objects_Locations location;
+
+ the_port = _Dual_ported_memory_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_port_internal_to_external
+ *
+ * This directive converts an internal dual-ported memory address to an
+ * external dual-ported memory address. If the given internal address
+ * is an invalid dual-ported address, then the external address is set
+ * to the given internal address.
+ *
+ * Input parameters:
+ * id - id of dual-ported memory object
+ * internal - internal address to set
+ * external - pointer to external address
+ *
+ * Output parameters:
+ * external - external address
+ * RTEMS_SUCCESSFUL - always succeeds
+ */
+
+rtems_status_code rtems_port_internal_to_external(
+ Objects_Id id,
+ void *internal,
+ void **external
+)
+{
+ register Dual_ported_memory_Control *the_port;
+ Objects_Locations location;
+ unsigned32 ending;
+
+ the_port = _Dual_ported_memory_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ ending = _Addresses_Subtract( internal, the_port->internal_base );
+ if ( ending > the_port->length )
+ *external = internal;
+ else
+ *external = _Addresses_Add_offset( the_port->external_base,
+ ending );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_port_external_to_internal
+ *
+ * This directive converts an external dual-ported memory address to an
+ * internal dual-ported memory address. If the given external address
+ * is an invalid dual-ported address, then the internal address is set
+ * to the given external address.
+ *
+ * Input parameters:
+ * id - id of dp memory object
+ * external - external address
+ * internal - pointer of internal address to set
+ *
+ * Output parameters:
+ * internal - internal address
+ * RTEMS_SUCCESSFUL - always succeeds
+ */
+
+rtems_status_code rtems_port_external_to_internal(
+ Objects_Id id,
+ void *external,
+ void **internal
+)
+{
+ register Dual_ported_memory_Control *the_port;
+ Objects_Locations location;
+ unsigned32 ending;
+
+ the_port = _Dual_ported_memory_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ ending = _Addresses_Subtract( external, the_port->external_base );
+ if ( ending > the_port->length )
+ *internal = external;
+ else
+ *internal = _Addresses_Add_offset( the_port->internal_base,
+ ending );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/cpukit/rtems/src/event.c b/cpukit/rtems/src/event.c
new file mode 100644
index 0000000000..8df3a4edf5
--- /dev/null
+++ b/cpukit/rtems/src/event.c
@@ -0,0 +1,383 @@
+/*
+ * Event Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/tasks.h>
+
+/*PAGE
+ *
+ * _Event_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Event_Manager_initialization( void )
+{
+ _Event_Sync_state = EVENT_SYNC_SYNCHRONIZED;
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor( MP_PACKET_EVENT, _Event_MP_Process_packet );
+}
+
+/*PAGE
+ *
+ * rtems_event_send
+ *
+ * This directive allows a thread send an event set to another thread.
+ *
+ * Input parameters:
+ * id - thread id
+ * event - event set
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_event_send(
+ Objects_Id id,
+ rtems_event_set event_in
+)
+{
+ 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;
+ case OBJECTS_REMOTE:
+ return(
+ _Event_MP_Send_request_packet(
+ EVENT_MP_SEND_REQUEST,
+ id,
+ event_in
+ )
+ );
+ case OBJECTS_LOCAL:
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_event_receive
+ *
+ * This directive allows a thread to receive a set of events.
+ *
+ * Input parameters:
+ * event_in - input event condition
+ * option_set - options
+ * ticks - number of ticks to wait (0 means wait forever)
+ * event_out - pointer to output event set
+ *
+ * Output parameters:
+ * event out - event set
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_event_receive(
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ 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 = api->pending_events;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ _Thread_Disable_dispatch();
+ _Event_Seize( event_in, option_set, ticks, event_out );
+ _Thread_Enable_dispatch();
+ return( _Thread_Executing->Wait.return_code );
+}
+
+
+/*PAGE
+ *
+ * _Event_Seize
+ *
+ * This routine attempts to satisfy the requested event condition
+ * for the running thread.
+ *
+ * Input parameters:
+ * event_in - the event condition to satisfy
+ * option_set - acquire event options
+ * ticks - interval to wait
+ * event_out - pointer to event set output area
+ *
+ * Output parameters: NONE
+ * *event_out - event set output area filled in
+ *
+ * INTERRUPT LATENCY:
+ * available
+ * wait
+ * check sync
+ */
+
+void _Event_Seize(
+ rtems_event_set event_in,
+ rtems_option option_set,
+ rtems_interval ticks,
+ rtems_event_set *event_out
+)
+{
+ Thread_Control *executing;
+ rtems_event_set seized_events;
+ rtems_event_set pending_events;
+ ISR_Level level;
+ RTEMS_API_Control *api;
+ Event_Sync_states sync_state;
+
+ executing = _Thread_Executing;
+ executing->Wait.return_code = RTEMS_SUCCESSFUL;
+
+ api = executing->API_Extensions[ THREAD_API_RTEMS ];
+
+ _ISR_Disable( level );
+ pending_events = api->pending_events;
+ seized_events = _Event_sets_Get( pending_events, event_in );
+
+ if ( !_Event_sets_Is_empty( seized_events ) &&
+ (seized_events == event_in || _Options_Is_any( option_set )) ) {
+ api->pending_events =
+ _Event_sets_Clear( pending_events, seized_events );
+ _ISR_Enable( level );
+ *event_out = seized_events;
+ return;
+ }
+
+ if ( _Options_Is_no_wait( option_set ) ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = RTEMS_UNSATISFIED;
+ *event_out = seized_events;
+ return;
+ }
+
+ _Event_Sync_state = EVENT_SYNC_NOTHING_HAPPENED;
+
+ executing->Wait.option = (unsigned32) option_set;
+ executing->Wait.count = (unsigned32) event_in;
+ executing->Wait.return_argument = event_out;
+
+ _ISR_Enable( level );
+
+ if ( ticks ) {
+ _Watchdog_Initialize(
+ &executing->Timer,
+ _Event_Timeout,
+ executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_ticks( &executing->Timer, ticks );
+ }
+
+ _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT );
+
+ _ISR_Disable( level );
+
+ sync_state = _Event_Sync_state;
+ _Event_Sync_state = EVENT_SYNC_SYNCHRONIZED;
+
+ switch ( sync_state ) {
+ case EVENT_SYNC_SYNCHRONIZED:
+ /*
+ * This cannot happen. It indicates that this routine did not
+ * enter the synchronization states above.
+ */
+ return;
+
+ case EVENT_SYNC_NOTHING_HAPPENED:
+ _ISR_Enable( level );
+ return;
+
+ case EVENT_SYNC_TIMEOUT:
+ executing->Wait.return_code = RTEMS_TIMEOUT;
+ _ISR_Enable( level );
+ _Thread_Unblock( executing );
+ return;
+
+ case EVENT_SYNC_SATISFIED:
+ if ( _Watchdog_Is_active( &executing->Timer ) ) {
+ _Watchdog_Deactivate( &executing->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &executing->Timer );
+ } else
+ _ISR_Enable( level );
+ _Thread_Unblock( executing );
+ return;
+ }
+}
+
+/*PAGE
+ *
+ * _Event_Surrender
+ *
+ * This routines remove a thread from the specified threadq.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread to be dequeued
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * before flash
+ * after flash
+ * check sync
+ */
+
+void _Event_Surrender(
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ rtems_event_set pending_events;
+ rtems_event_set event_condition;
+ rtems_event_set seized_events;
+ rtems_option option_set;
+ RTEMS_API_Control *api;
+
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+
+ option_set = (rtems_option) the_thread->Wait.option;
+
+ _ISR_Disable( level );
+ pending_events = api->pending_events;
+ event_condition = (rtems_event_set) the_thread->Wait.count;
+
+ seized_events = _Event_sets_Get( pending_events, event_condition );
+
+ if ( !_Event_sets_Is_empty( seized_events ) ) {
+ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) {
+ if ( seized_events == event_condition || _Options_Is_any( option_set ) ) {
+ api->pending_events =
+ _Event_sets_Clear( pending_events, seized_events );
+ *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
+
+ _ISR_Flash( level );
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ }
+ else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+ return;
+ }
+ }
+
+ switch ( _Event_Sync_state ) {
+ case EVENT_SYNC_SYNCHRONIZED:
+ case EVENT_SYNC_SATISFIED:
+ break;
+
+ case EVENT_SYNC_NOTHING_HAPPENED:
+ case EVENT_SYNC_TIMEOUT:
+ if ( !_Thread_Is_executing( the_thread ) )
+ break;
+
+ if ( seized_events == event_condition || _Options_Is_any(option_set) ) {
+ api->pending_events =
+ _Event_sets_Clear( pending_events,seized_events );
+ *(rtems_event_set *)the_thread->Wait.return_argument = seized_events;
+ _Event_Sync_state = EVENT_SYNC_SATISFIED;
+ }
+ break;
+ }
+ }
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Event_Timeout
+ *
+ * This routine processes a thread which timeouts while waiting to
+ * receive an event_set. It is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters: NONE
+ */
+
+void _Event_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+
+ /*
+ * If the event manager is not synchronized, then it is either
+ * "nothing happened", "timeout", or "satisfied". If the_thread
+ * is the executing thread, then it is in the process of blocking
+ * and it is the thread which is responsible for the synchronization
+ * process.
+ *
+ * If it is not satisfied, then it is "nothing happened" and
+ * this is the "timeout" transition. After a request is satisfied,
+ * a timeout is not allowed to occur.
+ */
+
+ if ( _Event_Sync_state != EVENT_SYNC_SYNCHRONIZED &&
+ _Thread_Is_executing( the_thread ) ) {
+ if ( _Event_Sync_state != EVENT_SYNC_SATISFIED )
+ _Event_Sync_state = EVENT_SYNC_TIMEOUT;
+ } else {
+ the_thread->Wait.return_code = RTEMS_TIMEOUT;
+ _Thread_Unblock( the_thread );
+ }
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
diff --git a/cpukit/rtems/src/eventmp.c b/cpukit/rtems/src/eventmp.c
new file mode 100644
index 0000000000..c123fae488
--- /dev/null
+++ b/cpukit/rtems/src/eventmp.c
@@ -0,0 +1,190 @@
+/*
+ * Multiprocessing Support for the Event Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/event.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Event_MP_Send_process_packet
+ *
+ * This subprogram is not needed since there are no process
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Event_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Event_MP_Send_request_packet (
+ Event_MP_Remote_operations operation,
+ Objects_Id event_id,
+ rtems_event_set event_in
+)
+{
+ Event_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case EVENT_MP_SEND_REQUEST:
+
+ the_packet = _Event_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = event_id;
+ the_packet->event_in = event_in;
+
+ return (rtems_status_code)
+ _MPCI_Send_request_packet(
+ rtems_get_node( event_id ),
+ &the_packet->Prefix,
+ STATES_READY
+ );
+
+ break;
+
+ case EVENT_MP_SEND_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Event_MP_Send_response_packet
+ *
+ */
+
+void _Event_MP_Send_response_packet (
+ Event_MP_Remote_operations operation,
+ Thread_Control *the_thread
+)
+{
+ Event_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case EVENT_MP_SEND_RESPONSE:
+
+ the_packet = ( Event_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case EVENT_MP_SEND_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Event_MP_Process_packet
+ *
+ */
+
+void _Event_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Event_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+
+ the_packet = (Event_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case EVENT_MP_SEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_event_send(
+ the_packet->Prefix.id,
+ the_packet->event_in
+ );
+
+ _Event_MP_Send_response_packet(
+ EVENT_MP_SEND_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case EVENT_MP_SEND_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Event_MP_Send_object_was_deleted
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Event_MP_Send_extract_proxy
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Event_MP_Get_packet
+ *
+ */
+
+Event_MP_Packet *_Event_MP_Get_packet ( void )
+{
+ return ( (Event_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/cpukit/rtems/src/intr.c b/cpukit/rtems/src/intr.c
new file mode 100644
index 0000000000..91eff38b06
--- /dev/null
+++ b/cpukit/rtems/src/intr.c
@@ -0,0 +1,65 @@
+/*
+ * Interrupt Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/intr.h>
+
+/* _Interrupt_Manager_initialization
+ *
+ * This routine initializes the interrupt manager.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Interrupt_Manager_initialization( void )
+{
+}
+
+/* rtems_interrupt_catch
+ *
+ * This directive allows a thread to specify what action to take when
+ * catching signals.
+ *
+ * Input parameters:
+ * new_isr_handler - address of interrupt service routine (isr)
+ * vector - interrupt vector number
+ * old_isr_handler - address at which to store previous ISR address
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always succeeds
+ * *old_isr_handler - previous ISR address
+ */
+
+rtems_status_code rtems_interrupt_catch(
+ rtems_isr_entry new_isr_handler,
+ rtems_vector_number vector,
+ rtems_isr_entry *old_isr_handler
+)
+{
+ if ( !_ISR_Is_vector_number_valid( vector ) )
+ return RTEMS_INVALID_NUMBER;
+
+ if ( !_ISR_Is_valid_user_handler( (void *) new_isr_handler ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ _ISR_Install_vector(
+ vector, (proc_ptr)new_isr_handler, (proc_ptr *)old_isr_handler );
+
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/cpukit/rtems/src/mp.c b/cpukit/rtems/src/mp.c
new file mode 100644
index 0000000000..a1fb6960a9
--- /dev/null
+++ b/cpukit/rtems/src/mp.c
@@ -0,0 +1,42 @@
+/*
+ * Multiprocessing Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/score/mpci.h>
+
+/*PAGE
+ *
+ * _Multiprocessing_Manager_initialization
+ *
+ */
+
+void _Multiprocessing_Manager_initialization ( void )
+{
+}
+
+/*PAGE
+ *
+ * rtems_multiprocessing_announce
+ *
+ */
+
+void rtems_multiprocessing_announce ( void )
+{
+ _MPCI_Announce();
+}
+
+/* end of file */
diff --git a/cpukit/rtems/src/msg.c b/cpukit/rtems/src/msg.c
new file mode 100644
index 0000000000..37258d4faa
--- /dev/null
+++ b/cpukit/rtems/src/msg.c
@@ -0,0 +1,714 @@
+/*
+ * Message Queue Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coremsg.h>
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/mpci.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/message.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Message_queue_Manager_initialization
+ *
+ * This routine initializes all message queue manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_message_queues - number of message queues to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Message_queue_Manager_initialization(
+ unsigned32 maximum_message_queues
+)
+{
+ _Objects_Initialize_information(
+ &_Message_queue_Information,
+ OBJECTS_RTEMS_MESSAGE_QUEUES,
+ TRUE,
+ maximum_message_queues,
+ sizeof( Message_queue_Control ),
+ FALSE,
+ 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
+ *
+ * _Message_queue_Allocate
+ *
+ * Allocate a message queue and the space for its messages
+ *
+ * Input parameters:
+ * the_message_queue - the message queue to allocate message buffers
+ * count - maximum message and reserved buffer count
+ * max_message_size - maximum size of each message
+ *
+ * Output parameters:
+ * the_message_queue - set if successful, NULL otherwise
+ */
+
+Message_queue_Control *_Message_queue_Allocate (
+ unsigned32 count,
+ unsigned32 max_message_size
+)
+{
+ return
+ (Message_queue_Control *)_Objects_Allocate(&_Message_queue_Information);
+
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_create
+ *
+ * This directive creates a message queue by allocating and initializing
+ * a message queue data structure.
+ *
+ * Input parameters:
+ * name - user defined queue name
+ * count - maximum message and reserved buffer count
+ * max_message_size - maximum size of each message
+ * attribute_set - process method
+ * id - pointer to queue
+ *
+ * Output parameters:
+ * id - queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_create(
+ rtems_name name,
+ unsigned32 count,
+ unsigned32 max_message_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ register Message_queue_Control *the_message_queue;
+ CORE_message_queue_Attributes the_message_queue_attributes;
+ boolean is_global;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ if ( (is_global = _Attributes_Is_global( attribute_set ) ) &&
+ !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ if (count == 0)
+ return RTEMS_INVALID_NUMBER;
+
+ if (max_message_size == 0)
+ return RTEMS_INVALID_SIZE;
+
+#if 1
+ /*
+ * I am not 100% sure this should be an error.
+ * It seems reasonable to create a que with a large max size,
+ * and then just send smaller msgs from remote (or all) nodes.
+ */
+
+ if ( is_global && (_MPCI_table->maximum_packet_size < max_message_size) )
+ return RTEMS_INVALID_SIZE;
+
+#endif
+
+ _Thread_Disable_dispatch(); /* protects object pointer */
+
+ the_message_queue = _Message_queue_Allocate( count, max_message_size );
+
+ if ( !the_message_queue ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( is_global &&
+ !( _Objects_MP_Allocate_and_open( &_Message_queue_Information,
+ name, the_message_queue->Object.id, FALSE ) ) ) {
+ _Message_queue_Free( the_message_queue );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_message_queue->attribute_set = attribute_set;
+
+ if (_Attributes_Is_priority( attribute_set ) )
+ the_message_queue_attributes.discipline =
+ CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY;
+ else
+ the_message_queue_attributes.discipline =
+ CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO;
+
+ if ( ! _CORE_message_queue_Initialize(
+ &the_message_queue->message_queue,
+ OBJECTS_RTEMS_MESSAGE_QUEUES,
+ &the_message_queue_attributes,
+ count,
+ max_message_size,
+ _Message_queue_MP_Send_extract_proxy ) ) {
+ if ( is_global )
+ _Objects_MP_Close(
+ &_Message_queue_Information, the_message_queue->Object.id);
+
+ _Message_queue_Free( the_message_queue );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ _Objects_Open(
+ &_Message_queue_Information,
+ &the_message_queue->Object,
+ &name
+ );
+
+ *id = the_message_queue->Object.id;
+
+ if ( is_global )
+ _Message_queue_MP_Send_process_packet(
+ MESSAGE_QUEUE_MP_ANNOUNCE_CREATE,
+ the_message_queue->Object.id,
+ name,
+ 0
+ );
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_ident
+ *
+ * This directive returns the system ID associated with
+ * the message queue name.
+ *
+ * Input parameters:
+ * name - user defined message queue name
+ * node - node(s) to be searched
+ * id - pointer to message queue id
+ *
+ * Output parameters:
+ * *id - message queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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
+ *
+ * rtems_message_queue_delete
+ *
+ * This directive allows a thread to delete the message queue specified
+ * by the given queue identifier.
+ *
+ * Input parameters:
+ * id - queue id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_delete(
+ Objects_Id id
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ _Objects_Close( &_Message_queue_Information,
+ &the_message_queue->Object );
+
+ _CORE_message_queue_Close(
+ &the_message_queue->message_queue,
+ _Message_queue_MP_Send_object_was_deleted,
+ CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED
+ );
+
+ _Message_queue_Free( the_message_queue );
+
+ if ( _Attributes_Is_global( the_message_queue->attribute_set ) ) {
+ _Objects_MP_Close(
+ &_Message_queue_Information,
+ the_message_queue->Object.id
+ );
+
+ _Message_queue_MP_Send_process_packet(
+ MESSAGE_QUEUE_MP_ANNOUNCE_DELETE,
+ the_message_queue->Object.id,
+ 0, /* Not used */
+ 0
+ );
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_send
+ *
+ * This routine implements the directives q_send. It sends a
+ * message to the specified message queue.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size of message to sent urgently
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_send(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ return( _Message_queue_Submit(id, buffer, size, MESSAGE_QUEUE_SEND_REQUEST) );
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_urgent
+ *
+ * This routine implements the directives q_urgent. It urgents a
+ * message to the specified message queue.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size of message to sent urgently
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_urgent(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size
+)
+{
+ return(_Message_queue_Submit(id, buffer, size, MESSAGE_QUEUE_URGENT_REQUEST));
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_broadcast
+ *
+ * This directive sends a message for every thread waiting on the queue
+ * designated by id.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size of message to broadcast
+ * count - pointer to area to store number of threads made ready
+ *
+ * Output parameters:
+ * count - number of threads made ready
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_broadcast(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ unsigned32 *count
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+ CORE_message_queue_Status core_status;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = count;
+
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_BROADCAST_REQUEST,
+ id,
+ buffer,
+ &size,
+ 0, /* option_set not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+
+ case OBJECTS_LOCAL:
+ core_status = _CORE_message_queue_Broadcast(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ id,
+ _Message_queue_Core_message_queue_mp_support,
+ count
+ );
+
+ _Thread_Enable_dispatch();
+ return
+ _Message_queue_Translate_core_message_queue_return_code( core_status );
+
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_receive
+ *
+ * This directive dequeues a message from the designated message queue
+ * and copies it into the requesting thread's buffer.
+ *
+ * Input parameters:
+ * id - queue id
+ * buffer - pointer to message buffer
+ * size - size of message receive
+ * option_set - options on receive
+ * timeout - number of ticks to wait
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_receive(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ unsigned32 option_set,
+ rtems_interval timeout
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+ boolean wait;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+
+ case OBJECTS_REMOTE:
+ return _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_RECEIVE_REQUEST,
+ id,
+ buffer,
+ size,
+ option_set,
+ timeout
+ );
+
+ case OBJECTS_LOCAL:
+ if ( _Options_Is_no_wait( option_set ) )
+ wait = FALSE;
+ else
+ wait = TRUE;
+
+ _CORE_message_queue_Seize(
+ &the_message_queue->message_queue,
+ the_message_queue->Object.id,
+ buffer,
+ size,
+ wait,
+ timeout
+ );
+ _Thread_Enable_dispatch();
+ return( _Message_queue_Translate_core_message_queue_return_code(
+ _Thread_Executing->Wait.return_code ) );
+
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_message_queue_flush
+ *
+ * This directive removes all pending messages from a queue and returns
+ * the number of messages removed. If no messages were present then
+ * a count of zero is returned.
+ *
+ * Input parameters:
+ * id - queue id
+ * count - return area for count
+ *
+ * Output parameters:
+ * count - number of messages removed ( 0 = empty queue )
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_message_queue_flush(
+ Objects_Id id,
+ unsigned32 *count
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = count;
+
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_FLUSH_REQUEST,
+ id,
+ 0, /* buffer not used */
+ 0, /* size */
+ 0, /* option_set not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+
+ case OBJECTS_LOCAL:
+ *count = _CORE_message_queue_Flush( &the_message_queue->message_queue );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Message_queue_Submit
+ *
+ * This routine implements the directives rtems_message_queue_send
+ * and rtems_message_queue_urgent. It processes a message that is
+ * to be submitted to the designated message queue. The message will
+ * either be processed as a send send message which it will be inserted
+ * at the rear of the queue or it will be processed as an urgent message
+ * which will be inserted at the front of the queue.
+ *
+ * Input parameters:
+ * id - pointer to message queue
+ * buffer - pointer to message buffer
+ * size - size in bytes of message to send
+ * submit_type - send or urgent message
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code _Message_queue_Submit(
+ Objects_Id id,
+ void *buffer,
+ unsigned32 size,
+ Message_queue_Submit_types submit_type
+)
+{
+ register Message_queue_Control *the_message_queue;
+ Objects_Locations location;
+ CORE_message_queue_Status core_status;
+
+ the_message_queue = _Message_queue_Get( id, &location );
+ switch ( location )
+ {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+
+ case OBJECTS_REMOTE:
+ switch ( submit_type ) {
+ case MESSAGE_QUEUE_SEND_REQUEST:
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_SEND_REQUEST,
+ id,
+ buffer,
+ &size,
+ 0, /* option_set */
+ MPCI_DEFAULT_TIMEOUT
+ );
+
+ case MESSAGE_QUEUE_URGENT_REQUEST:
+ return
+ _Message_queue_MP_Send_request_packet(
+ MESSAGE_QUEUE_MP_URGENT_REQUEST,
+ id,
+ buffer,
+ &size,
+ 0, /* option_set */
+ MPCI_DEFAULT_TIMEOUT
+ );
+ }
+
+ case OBJECTS_LOCAL:
+ switch ( submit_type ) {
+ case MESSAGE_QUEUE_SEND_REQUEST:
+ core_status = _CORE_message_queue_Send(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ id,
+ _Message_queue_Core_message_queue_mp_support
+ );
+ break;
+ case MESSAGE_QUEUE_URGENT_REQUEST:
+ core_status = _CORE_message_queue_Urgent(
+ &the_message_queue->message_queue,
+ buffer,
+ size,
+ id,
+ _Message_queue_Core_message_queue_mp_support
+ );
+ break;
+ default:
+ core_status = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+ return RTEMS_INTERNAL_ERROR; /* should never get here */
+ }
+
+ _Thread_Enable_dispatch();
+ return _Message_queue_Translate_core_message_queue_return_code(
+ core_status );
+
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Message_queue_Translate_core_message_queue_return_code
+ *
+ * Input parameters:
+ * the_message_queue_status - message_queue status code to translate
+ *
+ * Output parameters:
+ * rtems status code - translated RTEMS status code
+ *
+ */
+
+rtems_status_code _Message_queue_Translate_core_message_queue_return_code (
+ unsigned32 the_message_queue_status
+)
+{
+ switch ( the_message_queue_status ) {
+ case CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL:
+ return RTEMS_SUCCESSFUL;
+ case CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE:
+ return RTEMS_INVALID_SIZE;
+ case CORE_MESSAGE_QUEUE_STATUS_TOO_MANY:
+ return RTEMS_TOO_MANY;
+ case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED:
+ return RTEMS_UNSATISFIED;
+ case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT:
+ return RTEMS_UNSATISFIED;
+ case CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED:
+ return RTEMS_OBJECT_WAS_DELETED;
+ case CORE_MESSAGE_QUEUE_STATUS_TIMEOUT:
+ return RTEMS_TIMEOUT;
+ case THREAD_STATUS_PROXY_BLOCKING:
+ return RTEMS_PROXY_BLOCKING;
+ }
+ _Internal_error_Occurred( /* XXX */
+ INTERNAL_ERROR_RTEMS_API,
+ TRUE,
+ the_message_queue_status
+ );
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Message_queue_Core_message_queue_mp_support
+ *
+ * Input parameters:
+ * the_thread - the remote thread the message was submitted to
+ * id - id of the message queue
+ *
+ * Output parameters: NONE
+ */
+
+void _Message_queue_Core_message_queue_mp_support (
+ Thread_Control *the_thread,
+ Objects_Id id
+)
+{
+ the_thread->receive_packet->return_code = RTEMS_SUCCESSFUL;
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_RECEIVE_RESPONSE,
+ id,
+ the_thread
+ );
+}
diff --git a/cpukit/rtems/src/msgmp.c b/cpukit/rtems/src/msgmp.c
new file mode 100644
index 0000000000..2168b9db7d
--- /dev/null
+++ b/cpukit/rtems/src/msgmp.c
@@ -0,0 +1,458 @@
+/*
+ * Multiprocessing Support for the Message Queue Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/message.h>
+#include <rtems/score/mpci.h>
+#include <rtems/rtems/msgmp.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_process_packet
+ *
+ */
+
+void _Message_queue_MP_Send_process_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Message_queue_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+
+ the_packet = _Message_queue_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = message_queue_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == MESSAGE_QUEUE_MP_EXTRACT_PROXY )
+ node = rtems_get_node( message_queue_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Message_queue_MP_Send_request_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ void *buffer,
+ unsigned32 *size_p,
+ rtems_option option_set,
+ rtems_interval timeout
+)
+{
+ Message_queue_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+
+ the_packet = _Message_queue_MP_Get_packet();
+ 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.to_convert = sizeof(Message_queue_MP_Packet);
+
+ /*
+ * make sure message is not too big for our MPCI driver
+ * We have to check it here instead of waiting for MPCI because
+ * we are about to slam in the payload
+ */
+
+ if (the_packet->Prefix.length > _MPCI_table->maximum_packet_size) {
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_SIZE;
+ }
+
+ if ( ! _Options_Is_no_wait(option_set))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = operation;
+ the_packet->Prefix.id = message_queue_id;
+ the_packet->option_set = option_set;
+
+ /*
+ * Copy the data into place if needed
+ */
+
+ if (buffer) {
+ the_packet->Buffer.size = *size_p;
+ _CORE_message_queue_Copy_buffer(
+ buffer,
+ the_packet->Buffer.buffer,
+ *size_p
+ );
+ }
+
+ return (rtems_status_code) _MPCI_Send_request_packet(
+ rtems_get_node(message_queue_id),
+ &the_packet->Prefix,
+ STATES_WAITING_FOR_MESSAGE
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+
+ the_packet = _Message_queue_MP_Get_packet();
+ 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);
+
+ if ( ! _Options_Is_no_wait(option_set))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = MESSAGE_QUEUE_MP_RECEIVE_REQUEST;
+ the_packet->Prefix.id = message_queue_id;
+ 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.return_argument_1 = size_p;
+
+ return (rtems_status_code) _MPCI_Send_request_packet(
+ rtems_get_node(message_queue_id),
+ &the_packet->Prefix,
+ STATES_WAITING_FOR_MESSAGE
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+ break;
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_response_packet
+ *
+ */
+
+void _Message_queue_MP_Send_response_packet (
+ Message_queue_MP_Remote_operations operation,
+ Objects_Id message_queue_id,
+ Thread_Control *the_thread
+)
+{
+ Message_queue_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+
+ the_packet = ( Message_queue_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ *
+ * Exception: MESSAGE_QUEUE_MP_RECEIVE_RESPONSE needs payload length
+ * added to 'length'
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ if (operation == MESSAGE_QUEUE_MP_RECEIVE_RESPONSE)
+ the_packet->Prefix.length += the_packet->size;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Message_queue_MP_Process_packet
+ *
+ */
+
+void _Message_queue_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Message_queue_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Message_queue_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Message_queue_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Message_queue_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_receive(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ &the_packet->size,
+ the_packet->option_set,
+ the_packet->Prefix.timeout
+ );
+
+ 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,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_RECEIVE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ if (the_packet->Prefix.return_code == RTEMS_SUCCESSFUL) {
+ *(rtems_unsigned32 *)the_thread->Wait.return_argument_1 =
+ the_packet->size;
+
+ _CORE_message_queue_Copy_buffer(
+ the_packet->Buffer.buffer,
+ the_thread->Wait.return_argument,
+ the_packet->size
+ );
+ }
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_SEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_send(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ the_packet->Buffer.size
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_SEND_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_SEND_RESPONSE:
+ case MESSAGE_QUEUE_MP_URGENT_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_URGENT_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_urgent(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ the_packet->Buffer.size
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_URGENT_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_BROADCAST_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_broadcast(
+ the_packet->Prefix.id,
+ the_packet->Buffer.buffer,
+ the_packet->Buffer.size,
+ &the_packet->count
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_BROADCAST_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case MESSAGE_QUEUE_MP_BROADCAST_RESPONSE:
+ case MESSAGE_QUEUE_MP_FLUSH_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(unsigned32 *)the_thread->Wait.return_argument = the_packet->count;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case MESSAGE_QUEUE_MP_FLUSH_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_message_queue_flush(
+ the_packet->Prefix.id,
+ &the_packet->count
+ );
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_FLUSH_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_object_was_deleted
+ *
+ */
+
+void _Message_queue_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+)
+{
+ the_proxy->receive_packet->return_code = RTEMS_OBJECT_WAS_DELETED;
+
+ _Message_queue_MP_Send_response_packet(
+ MESSAGE_QUEUE_MP_RECEIVE_RESPONSE,
+ the_proxy->Wait.id,
+ the_proxy
+ );
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Send_extract_proxy
+ *
+ */
+
+void _Message_queue_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Message_queue_MP_Send_process_packet(
+ MESSAGE_QUEUE_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+}
+
+/*PAGE
+ *
+ * _Message_queue_MP_Get_packet
+ *
+ */
+
+Message_queue_MP_Packet *_Message_queue_MP_Get_packet ( void )
+{
+ return ( (Message_queue_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/cpukit/rtems/src/part.c b/cpukit/rtems/src/part.c
new file mode 100644
index 0000000000..bdf51f9c2a
--- /dev/null
+++ b/cpukit/rtems/src/part.c
@@ -0,0 +1,341 @@
+/*
+ * Partition Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/address.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/sysstate.h>
+
+/*PAGE
+ *
+ * _Partition_Manager_initialization
+ *
+ * This routine initializes all partition manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_partitions - number of partitions to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Partition_Manager_initialization(
+ unsigned32 maximum_partitions
+)
+{
+ _Objects_Initialize_information(
+ &_Partition_Information,
+ OBJECTS_RTEMS_PARTITIONS,
+ TRUE,
+ maximum_partitions,
+ sizeof( Partition_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_PARTITION,
+ _Partition_MP_Process_packet
+ );
+
+}
+
+/*PAGE
+ *
+ * rtems_partition_create
+ *
+ * This directive creates a partiton of fixed sized buffers from the
+ * given contiguous memory area.
+ *
+ * Input parameters:
+ * name - user defined partition name
+ * starting_address - physical start address of partition
+ * length - physical length in bytes
+ * buffer_size - size of buffers in bytes
+ * attribute_set - partition attributes
+ * id - pointer to partition id
+ *
+ * Output parameters:
+ * id - partition id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 buffer_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ register Partition_Control *the_partition;
+
+ if ( !rtems_is_name_valid( 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;
+
+ if ( !_Addresses_Is_aligned( starting_address ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ if ( _Attributes_Is_global( attribute_set ) &&
+ !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ _Thread_Disable_dispatch(); /* prevents deletion */
+
+ the_partition = _Partition_Allocate();
+
+ if ( !the_partition ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( _Attributes_Is_global( attribute_set ) &&
+ !( _Objects_MP_Allocate_and_open( &_Partition_Information, name,
+ the_partition->Object.id, FALSE ) ) ) {
+ _Partition_Free( the_partition );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+ the_partition->starting_address = starting_address;
+ the_partition->length = length;
+ the_partition->buffer_size = buffer_size;
+ the_partition->attribute_set = attribute_set;
+ the_partition->number_of_used_blocks = 0;
+
+ _Chain_Initialize( &the_partition->Memory, starting_address,
+ length / buffer_size, buffer_size );
+
+ _Objects_Open( &_Partition_Information, &the_partition->Object, &name );
+
+ *id = the_partition->Object.id;
+ if ( _Attributes_Is_global( attribute_set ) )
+ _Partition_MP_Send_process_packet(
+ PARTITION_MP_ANNOUNCE_CREATE,
+ the_partition->Object.id,
+ name,
+ 0 /* Not used */
+ );
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_partition_ident
+ *
+ * This directive returns the system ID associated with
+ * the partition name.
+ *
+ * Input parameters:
+ * name - user defined partition name
+ * node - node(s) to be searched
+ * id - pointer to partition id
+ *
+ * Output parameters:
+ * *id - partition id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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
+ *
+ * rtems_partition_delete
+ *
+ * This directive allows a thread to delete a partition specified by
+ * the partition identifier, provided that none of its buffers are
+ * still allocated.
+ *
+ * Input parameters:
+ * id - partition id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_delete(
+ Objects_Id id
+)
+{
+ register Partition_Control *the_partition;
+ Objects_Locations location;
+
+ the_partition = _Partition_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ if ( the_partition->number_of_used_blocks == 0 ) {
+ _Objects_Close( &_Partition_Information, &the_partition->Object );
+ _Partition_Free( the_partition );
+ if ( _Attributes_Is_global( the_partition->attribute_set ) ) {
+
+ _Objects_MP_Close(
+ &_Partition_Information,
+ the_partition->Object.id
+ );
+
+ _Partition_MP_Send_process_packet(
+ PARTITION_MP_ANNOUNCE_DELETE,
+ the_partition->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_RESOURCE_IN_USE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_partition_get_buffer
+ *
+ * This directive will obtain a buffer from a buffer partition.
+ *
+ * Input parameters:
+ * id - partition id
+ * buffer - pointer to buffer address
+ *
+ * Output parameters:
+ * buffer - pointer to buffer address filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_get_buffer(
+ Objects_Id id,
+ void **buffer
+)
+{
+ register Partition_Control *the_partition;
+ Objects_Locations location;
+ void *the_buffer;
+
+ the_partition = _Partition_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = buffer;
+ return(
+ _Partition_MP_Send_request_packet(
+ PARTITION_MP_GET_BUFFER_REQUEST,
+ id,
+ 0 /* Not used */
+ )
+ );
+ case OBJECTS_LOCAL:
+ the_buffer = _Partition_Allocate_buffer( the_partition );
+ if ( the_buffer ) {
+ the_partition->number_of_used_blocks += 1;
+ _Thread_Enable_dispatch();
+ *buffer = the_buffer;
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_UNSATISFIED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_partition_return_buffer
+ *
+ * This directive will return the given buffer to the specified
+ * buffer partition.
+ *
+ * Input parameters:
+ * id - partition id
+ * buffer - pointer to buffer address
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_partition_return_buffer(
+ Objects_Id id,
+ void *buffer
+)
+{
+ register Partition_Control *the_partition;
+ Objects_Locations location;
+
+ the_partition = _Partition_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return(
+ _Partition_MP_Send_request_packet(
+ PARTITION_MP_RETURN_BUFFER_REQUEST,
+ id,
+ buffer
+ )
+ );
+ case OBJECTS_LOCAL:
+ if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) {
+ _Partition_Free_buffer( the_partition, buffer );
+ the_partition->number_of_used_blocks -= 1;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_ADDRESS;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/cpukit/rtems/src/partmp.c b/cpukit/rtems/src/partmp.c
new file mode 100644
index 0000000000..35e0b74364
--- /dev/null
+++ b/cpukit/rtems/src/partmp.c
@@ -0,0 +1,302 @@
+/*
+ * Multiprocessing Support for the Partition Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Partition_MP_Send_process_packet
+ *
+ */
+
+void _Partition_MP_Send_process_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Partition_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+ case PARTITION_MP_ANNOUNCE_DELETE:
+ case PARTITION_MP_EXTRACT_PROXY:
+
+ the_packet = _Partition_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = partition_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == PARTITION_MP_EXTRACT_PROXY )
+ node = rtems_get_node( partition_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Partition_MP_Send_request_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ void *buffer
+)
+{
+ Partition_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+
+ the_packet = _Partition_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = partition_id;
+ the_packet->buffer = buffer;
+
+ return
+ _MPCI_Send_request_packet(
+ rtems_get_node( partition_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+
+ break;
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+ case PARTITION_MP_ANNOUNCE_DELETE:
+ case PARTITION_MP_EXTRACT_PROXY:
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Send_response_packet
+ *
+ */
+
+void _Partition_MP_Send_response_packet (
+ Partition_MP_Remote_operations operation,
+ Objects_Id partition_id,
+ Thread_Control *the_thread
+)
+{
+ Partition_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+
+ the_packet = ( Partition_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+ case PARTITION_MP_ANNOUNCE_DELETE:
+ case PARTITION_MP_EXTRACT_PROXY:
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Partition_MP_Process_packet
+ *
+ */
+
+void _Partition_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Partition_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Partition_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case PARTITION_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Partition_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Partition_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_GET_BUFFER_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_partition_get_buffer(
+ the_packet->Prefix.id,
+ &the_packet->buffer
+ );
+
+ _Partition_MP_Send_response_packet(
+ PARTITION_MP_GET_BUFFER_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case PARTITION_MP_GET_BUFFER_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(void **)the_thread->Wait.return_argument = the_packet->buffer;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case PARTITION_MP_RETURN_BUFFER_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_partition_return_buffer(
+ the_packet->Prefix.id,
+ the_packet->buffer
+ );
+
+ _Partition_MP_Send_response_packet(
+ PARTITION_MP_RETURN_BUFFER_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case PARTITION_MP_RETURN_BUFFER_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Send_object_was_deleted
+ *
+ * This routine is not needed by the Partition since a partition
+ * cannot be deleted when buffers are in use.
+ *
+ */
+
+/*PAGE
+ *
+ * _Partition_MP_Send_extract_proxy
+ *
+ */
+
+void _Partition_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Partition_MP_Send_process_packet(
+ PARTITION_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+
+}
+
+/*PAGE
+ *
+ * _Partition_MP_Get_packet
+ *
+ */
+
+Partition_MP_Packet *_Partition_MP_Get_packet ( void )
+{
+ return ( (Partition_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/cpukit/rtems/src/ratemon.c b/cpukit/rtems/src/ratemon.c
new file mode 100644
index 0000000000..2832e652e1
--- /dev/null
+++ b/cpukit/rtems/src/ratemon.c
@@ -0,0 +1,461 @@
+/*
+ * Rate Monotonic Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/ratemon.h>
+#include <rtems/score/thread.h>
+
+/*PAGE
+ *
+ * _Rate_monotonic_Manager_initialization
+ *
+ * This routine initializes all Rate Monotonic Manager related
+ * data structures.
+ *
+ * Input parameters:
+ * maximum_periods - number of periods timers to initialize
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: The Rate Monotonic Manager is built on top of the Watchdog
+ * Handler.
+ */
+
+void _Rate_monotonic_Manager_initialization(
+ unsigned32 maximum_periods
+)
+{
+ _Objects_Initialize_information(
+ &_Rate_monotonic_Information,
+ OBJECTS_RTEMS_PERIODS,
+ FALSE,
+ maximum_periods,
+ sizeof( Rate_monotonic_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_create
+ *
+ * This directive creates a rate monotonic timer and performs
+ * some initialization.
+ *
+ * Input parameters:
+ * name - name of period
+ * id - pointer to rate monotonic id
+ *
+ * Output parameters:
+ * id - rate monotonic id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Rate_monotonic_Control *the_period;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_period = _Rate_monotonic_Allocate();
+
+ if ( !the_period ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_period->owner = _Thread_Executing;
+ the_period->state = RATE_MONOTONIC_INACTIVE;
+
+ _Objects_Open( &_Rate_monotonic_Information, &the_period->Object, &name );
+
+ *id = the_period->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_ident
+ *
+ * This directive returns the system ID associated with
+ * the rate monotonic period name.
+ *
+ * Input parameters:
+ * name - user defined period name
+ * id - pointer to period id
+ *
+ * Output parameters:
+ * *id - region id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Rate_monotonic_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_cancel
+ *
+ * This directive allows a thread to cancel a rate monotonic timer.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful and caller is not the owning thread
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_cancel(
+ Objects_Id id
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+
+ the_period = _Rate_monotonic_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_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;
+ }
+ (void) _Watchdog_Remove( &the_period->Timer );
+ the_period->state = RATE_MONOTONIC_INACTIVE;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_delete
+ *
+ * This directive allows a thread to delete a rate monotonic timer.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_delete(
+ Objects_Id id
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+
+ 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;
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_get_status
+ *
+ * This directive allows a thread to obtain status information on a
+ * period.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ * status - pointer to status control block
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ *
+ */
+
+rtems_status_code rtems_rate_monotonic_get_status(
+ Objects_Id id,
+ rtems_rate_monotonic_period_status *status
+)
+{
+ Objects_Locations location;
+ Rate_monotonic_Control *the_period;
+
+ if ( status == NULL )
+ return RTEMS_INVALID_ADDRESS;
+
+ 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;
+ case OBJECTS_LOCAL:
+ status->state = the_period->state;
+
+ if ( status->state == RATE_MONOTONIC_INACTIVE ) {
+ status->ticks_since_last_period = 0;
+ status->ticks_executed_since_last_period = 0;
+ } else {
+ status->ticks_since_last_period =
+ _Watchdog_Ticks_since_boot - the_period->time_at_period;
+
+ status->ticks_executed_since_last_period =
+ the_period->owner->ticks_executed -
+ the_period->owner_ticks_executed_at_period;
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+
+/*PAGE
+ *
+ * rtems_rate_monotonic_period
+ *
+ * This directive allows a thread to manipulate a rate monotonic timer.
+ *
+ * Input parameters:
+ * id - rate monotonic id
+ * length - length of period (in ticks)
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_rate_monotonic_period(
+ Objects_Id id,
+ rtems_interval length
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+ rtems_status_code return_value;
+ rtems_rate_monotonic_period_states local_state;
+ ISR_Level level;
+
+ 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;
+ case OBJECTS_LOCAL:
+ if ( !_Thread_Is_executing( the_period->owner ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_OWNER_OF_RESOURCE;
+ }
+
+ if ( length == RTEMS_PERIOD_STATUS ) {
+ switch ( the_period->state ) {
+ case RATE_MONOTONIC_INACTIVE:
+ return_value = RTEMS_NOT_DEFINED;
+ break;
+ case RATE_MONOTONIC_ACTIVE:
+ return_value = RTEMS_SUCCESSFUL;
+ break;
+ case RATE_MONOTONIC_EXPIRED:
+ return_value = RTEMS_TIMEOUT;
+ break;
+ default: /* unreached -- only to remove warnings */
+ return_value = RTEMS_INTERNAL_ERROR;
+ break;
+ }
+ _Thread_Enable_dispatch();
+ return( return_value );
+ }
+
+ _ISR_Disable( level );
+ switch ( the_period->state ) {
+ case RATE_MONOTONIC_INACTIVE:
+ _ISR_Enable( level );
+ the_period->state = RATE_MONOTONIC_ACTIVE;
+ _Watchdog_Initialize(
+ &the_period->Timer,
+ _Rate_monotonic_Timeout,
+ id,
+ NULL
+ );
+
+ the_period->owner_ticks_executed_at_period =
+ _Thread_Executing->ticks_executed;
+
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+
+ _Watchdog_Insert_ticks( &the_period->Timer, length );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+
+ case RATE_MONOTONIC_ACTIVE:
+ /*
+ * This tells the _Rate_monotonic_Timeout that this task is
+ * in the process of blocking on the period.
+ */
+
+ the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING;
+ _ISR_Enable( level );
+
+ _Thread_Executing->Wait.id = the_period->Object.id;
+ _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
+
+ /*
+ * Did the watchdog timer expire while we were actually blocking
+ * on it?
+ */
+
+ _ISR_Disable( level );
+ local_state = the_period->state;
+ the_period->state = RATE_MONOTONIC_ACTIVE;
+ _ISR_Enable( level );
+
+ /*
+ * If it did, then we want to unblock ourself and continue as
+ * if nothing happen. The period was reset in the timeout routine.
+ */
+
+ if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING )
+ _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD );
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ break;
+
+ case RATE_MONOTONIC_EXPIRED:
+ _ISR_Enable( level );
+ the_period->state = RATE_MONOTONIC_ACTIVE;
+ the_period->owner_ticks_executed_at_period =
+ _Thread_Executing->ticks_executed;
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+
+ _Watchdog_Insert_ticks( &the_period->Timer, length );
+ _Thread_Enable_dispatch();
+ return RTEMS_TIMEOUT;
+
+ case RATE_MONOTONIC_OWNER_IS_BLOCKING:
+ case RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING:
+ /*
+ * These should never happen.
+ */
+ break;
+ }
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Rate_monotonic_Timeout
+ *
+ * This routine processes a period ending. If the owning thread
+ * is waiting for the period, that thread is unblocked and the
+ * period reinitiated. Otherwise, the period is expired.
+ * This routine is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - period id
+ *
+ * Output parameters: NONE
+ */
+
+void _Rate_monotonic_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Rate_monotonic_Control *the_period;
+ Objects_Locations location;
+ Thread_Control *the_thread;
+
+ the_period = _Rate_monotonic_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+ the_thread = the_period->owner;
+ if ( _States_Is_waiting_for_period( the_thread->current_state ) &&
+ the_thread->Wait.id == the_period->Object.id ) {
+ _Thread_Unblock( the_thread );
+ the_period->owner_ticks_executed_at_period =
+ the_thread->ticks_executed;
+
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+
+ _Watchdog_Reset( &the_period->Timer );
+ } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) {
+ the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING;
+ the_period->owner_ticks_executed_at_period =
+ the_thread->ticks_executed;
+
+ the_period->time_at_period = _Watchdog_Ticks_since_boot;
+ _Watchdog_Reset( &the_period->Timer );
+ } else
+ the_period->state = RATE_MONOTONIC_EXPIRED;
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
+
diff --git a/cpukit/rtems/src/region.c b/cpukit/rtems/src/region.c
new file mode 100644
index 0000000000..414c7d41af
--- /dev/null
+++ b/cpukit/rtems/src/region.c
@@ -0,0 +1,486 @@
+/*
+ * Region Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+
+/*PAGE
+ *
+ * _Region_Manager_initialization
+ *
+ * This routine initializes all region manager related data structures.
+ *
+ * Input parameters:
+ * maximum_regions - number of regions to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Region_Manager_initialization(
+ unsigned32 maximum_regions
+)
+{
+ _Objects_Initialize_information(
+ &_Region_Information,
+ OBJECTS_RTEMS_REGIONS,
+ FALSE,
+ maximum_regions,
+ sizeof( Region_Control ),
+ FALSE,
+ 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
+ *
+ * rtems_region_create
+ *
+ * This directive creates a region of physical contiguous memory area
+ * from which variable sized segments can be allocated.
+ *
+ * Input parameters:
+ * name - user defined region name
+ * starting_address - physical start address of region
+ * length - physical length in bytes
+ * page_size - page size in bytes
+ * attribute_set - region attributes
+ * id - address of region id to set
+ *
+ * Output parameters:
+ * id - region id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_create(
+ rtems_name name,
+ void *starting_address,
+ unsigned32 length,
+ unsigned32 page_size,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ Region_Control *the_region;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ if ( !_Addresses_Is_aligned( starting_address ) )
+ return RTEMS_INVALID_ADDRESS;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_region = _Region_Allocate();
+
+ if ( !the_region ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_region->maximum_segment_size =
+ _Heap_Initialize(&the_region->Memory, starting_address, length, page_size);
+
+ if ( !the_region->maximum_segment_size ) {
+ _Region_Free( the_region );
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_SIZE;
+ }
+
+ the_region->starting_address = starting_address;
+ the_region->length = length;
+ the_region->page_size = page_size;
+ the_region->attribute_set = attribute_set;
+ the_region->number_of_used_blocks = 0;
+
+ _Thread_queue_Initialize(
+ &the_region->Wait_queue,
+ OBJECTS_RTEMS_REGIONS,
+ _Attributes_Is_priority( attribute_set ) ?
+ THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_SEGMENT,
+ _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;
+}
+
+/*PAGE
+ *
+ * rtems_region_ident
+ *
+ * This directive returns the system ID associated with
+ * the region name.
+ *
+ * Input parameters:
+ * name - user defined region name
+ * id - pointer to region id
+ *
+ * Output parameters:
+ * *id - region id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_ident(
+ rtems_name name,
+ Objects_Id *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
+ *
+ * rtems_region_delete
+ *
+ * This directive allows a thread to delete a region specified by
+ * the region identifier, provided that none of its segments are
+ * still allocated.
+ *
+ * Input parameters:
+ * id - region id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_delete(
+ Objects_Id id
+)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_RESOURCE_IN_USE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_region_extend
+ *
+ * This directive attempts to grow a region of physical contiguous memory area
+ * from which variable sized segments can be allocated.
+ *
+ * Input parameters:
+ * id - id of region to grow
+ * start - starting address of memory area for extension
+ * length - physical length in bytes to grow the region
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_extend(
+ Objects_Id id,
+ void *starting_address,
+ unsigned32 length
+)
+{
+ Region_Control *the_region;
+ Objects_Locations location;
+ unsigned32 amount_extended;
+ Heap_Extend_status heap_status;
+ rtems_status_code status;
+
+ status = RTEMS_SUCCESSFUL;
+
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+
+ heap_status = _Heap_Extend(
+ &the_region->Memory,
+ starting_address,
+ length,
+ &amount_extended
+ );
+
+ switch ( heap_status ) {
+ case HEAP_EXTEND_SUCCESSFUL:
+ the_region->length += amount_extended;
+ the_region->maximum_segment_size += amount_extended;
+ break;
+ case HEAP_EXTEND_ERROR:
+ status = RTEMS_INVALID_ADDRESS;
+ break;
+ case HEAP_EXTEND_NOT_IMPLEMENTED:
+ status = RTEMS_NOT_IMPLEMENTED;
+ break;
+ }
+ _Thread_Enable_dispatch();
+ return( status );
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_region_get_segment
+ *
+ * This directive will obtain a segment from the given region.
+ *
+ * Input parameters:
+ * id - region id
+ * size - segment size in bytes
+ * option_set - wait option
+ * timeout - number of ticks to wait (0 means wait forever)
+ * segment - pointer to segment address
+ *
+ * Output parameters:
+ * segment - pointer to segment address filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_get_segment(
+ Objects_Id id,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout,
+ void **segment
+)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+ Thread_Control *executing;
+ void *the_segment;
+
+ *segment = NULL;
+
+ if ( size == 0 )
+ return RTEMS_INVALID_SIZE;
+
+ executing = _Thread_Executing;
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ if ( size > the_region->maximum_segment_size ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_SIZE;
+ }
+
+ _Region_Debug_Walk( the_region, 1 );
+
+ the_segment = _Region_Allocate_segment( the_region, size );
+
+ _Region_Debug_Walk( the_region, 2 );
+
+ if ( the_segment ) {
+ the_region->number_of_used_blocks += 1;
+ _Thread_Enable_dispatch();
+ *segment = the_segment;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ if ( _Options_Is_no_wait( option_set ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_UNSATISFIED;
+ }
+
+ executing->Wait.queue = &the_region->Wait_queue;
+ executing->Wait.id = id;
+ executing->Wait.count = size;
+ executing->Wait.return_argument = (unsigned32 *) segment;
+
+ _Thread_queue_Enter_critical_section( &the_region->Wait_queue );
+
+ _Thread_queue_Enqueue( &the_region->Wait_queue, timeout );
+
+ _Thread_Enable_dispatch();
+ return (rtems_status_code) executing->Wait.return_code;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+/*PAGE
+ *
+ * rtems_region_get_segment_size
+ *
+ * This directive will return the size of the segment indicated
+ *
+ * Input parameters:
+ * id - region id
+ * segment - segment address
+ * size - pointer to segment size in bytes
+ *
+ * Output parameters:
+ * size - segment size in bytes filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_get_segment_size(
+ Objects_Id id,
+ void *segment,
+ unsigned32 *size
+)
+{
+ register Region_Control *the_region;
+ Objects_Locations location;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+
+ if ( _Heap_Size_of_user_area( &the_region->Memory, segment, size ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_ADDRESS;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_region_return_segment
+ *
+ * This directive will return a segment to its region.
+ *
+ * Input parameters:
+ * id - region id
+ * segment - pointer to segment address
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_region_return_segment(
+ Objects_Id id,
+ void *segment
+)
+{
+ register Region_Control *the_region;
+ Thread_Control *the_thread;
+ Objects_Locations location;
+ void **the_segment;
+ int status;
+
+ the_region = _Region_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* this error cannot be returned */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+
+ _Region_Debug_Walk( the_region, 3 );
+
+ status = _Region_Free_segment( the_region, segment );
+
+ _Region_Debug_Walk( the_region, 4 );
+
+ if ( !status ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_INVALID_ADDRESS;
+ }
+
+ the_region->number_of_used_blocks -= 1;
+ for ( ; ; ) {
+ the_thread = _Thread_queue_First( &the_region->Wait_queue );
+
+ if ( the_thread == NULL )
+ break;
+
+ the_segment = (void **) _Region_Allocate_segment(
+ the_region,
+ the_thread->Wait.count
+ );
+
+ if ( the_segment == NULL )
+ break;
+
+ *(void **)the_thread->Wait.return_argument = the_segment;
+ the_region->number_of_used_blocks += 1;
+ _Thread_queue_Extract( &the_region->Wait_queue, the_thread );
+ the_thread->Wait.return_code = RTEMS_SUCCESSFUL;
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/cpukit/rtems/src/regionmp.c b/cpukit/rtems/src/regionmp.c
new file mode 100644
index 0000000000..5cc4a2127c
--- /dev/null
+++ b/cpukit/rtems/src/regionmp.c
@@ -0,0 +1,310 @@
+/*
+ * Multiprocessing Support for the Region Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/region.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Region_MP_Send_process_packet
+ *
+ */
+
+void _Region_MP_Send_process_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Region_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case REGION_MP_ANNOUNCE_CREATE:
+ case REGION_MP_ANNOUNCE_DELETE:
+ case REGION_MP_EXTRACT_PROXY:
+
+ the_packet = _Region_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = region_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == REGION_MP_EXTRACT_PROXY )
+ node = rtems_get_node( region_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case REGION_MP_GET_SEGMENT_REQUEST:
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Region_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Region_MP_Send_request_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ void *segment,
+ unsigned32 size,
+ rtems_option option_set,
+ rtems_interval timeout
+)
+{
+ Region_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case REGION_MP_GET_SEGMENT_REQUEST:
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+
+ the_packet = _Region_MP_Get_packet();
+ 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))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = operation;
+ the_packet->Prefix.id = region_id;
+ the_packet->segment = segment;
+ the_packet->size = size;
+ the_packet->option_set = option_set;
+
+ return (rtems_status_code) _MPCI_Send_request_packet(
+ rtems_get_node( region_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+ break;
+
+ case REGION_MP_ANNOUNCE_CREATE:
+ case REGION_MP_ANNOUNCE_DELETE:
+ case REGION_MP_EXTRACT_PROXY:
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_INTERNAL_ERROR;
+}
+
+/*PAGE
+ *
+ * _Region_MP_Send_response_packet
+ *
+ */
+
+void _Region_MP_Send_response_packet (
+ Region_MP_Remote_operations operation,
+ Objects_Id region_id,
+ Thread_Control *the_thread
+)
+{
+ Region_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+
+ the_packet = ( Region_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case REGION_MP_ANNOUNCE_CREATE:
+ case REGION_MP_ANNOUNCE_DELETE:
+ case REGION_MP_EXTRACT_PROXY:
+ case REGION_MP_GET_SEGMENT_REQUEST:
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Region_MP_Process_packet
+ *
+ */
+
+void _Region_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Region_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Region_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case REGION_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Region_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Region_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_GET_SEGMENT_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_region_get_segment(
+ the_packet->Prefix.id,
+ the_packet->size,
+ the_packet->option_set,
+ the_packet->Prefix.timeout,
+ &the_packet->segment
+ );
+
+ _Region_MP_Send_response_packet(
+ REGION_MP_GET_SEGMENT_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case REGION_MP_GET_SEGMENT_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(void **)the_thread->Wait.return_argument = the_packet->segment;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case REGION_MP_RETURN_SEGMENT_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_region_return_segment(
+ the_packet->Prefix.id,
+ the_packet->segment
+ );
+
+ _Region_MP_Send_response_packet(
+ REGION_MP_RETURN_SEGMENT_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case REGION_MP_RETURN_SEGMENT_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Region_MP_Send_object_was_deleted
+ *
+ * This routine is not needed by the Region since a region
+ * cannot be deleted when segments are in use.
+ *
+ */
+
+/*PAGE
+ *
+ * _Region_MP_Send_extract_proxy
+ *
+ */
+
+void _Region_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Region_MP_Send_process_packet(
+ REGION_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+}
+
+/*PAGE
+ *
+ * _Region_MP_Get_packet
+ *
+ */
+
+Region_MP_Packet *_Region_MP_Get_packet ( void )
+{
+ return ( (Region_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/cpukit/rtems/src/rtclock.c b/cpukit/rtems/src/rtclock.c
new file mode 100644
index 0000000000..388e6f091f
--- /dev/null
+++ b/cpukit/rtems/src/rtclock.c
@@ -0,0 +1,151 @@
+/*
+ * Clock Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * rtems_clock_get
+ *
+ * This directive returns the current date and time. If the time has
+ * not been set by a tm_set then an error is returned.
+ *
+ * Input parameters:
+ * option - which value to return
+ * time_buffer - pointer to output buffer (a time and date structure
+ * or an interval)
+ *
+ * Output parameters:
+ * time_buffer - output filled in
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_clock_get(
+ rtems_clock_get_options option,
+ void *time_buffer
+)
+{
+ ISR_Level level;
+ rtems_interval tmp;
+
+ switch ( option ) {
+ case RTEMS_CLOCK_GET_TOD:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ *(rtems_time_of_day *)time_buffer = _TOD_Current;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ *(rtems_interval *)time_buffer = _TOD_Seconds_since_epoch;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT:
+ *(rtems_interval *)time_buffer = _Watchdog_Ticks_since_boot;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TICKS_PER_SECOND:
+ *(rtems_interval *)time_buffer = _TOD_Ticks_per_second;
+ return RTEMS_SUCCESSFUL;
+
+ case RTEMS_CLOCK_GET_TIME_VALUE:
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ _ISR_Disable( level );
+ ((rtems_clock_time_value *)time_buffer)->seconds =
+ _TOD_Seconds_since_epoch;
+ tmp = _TOD_Current.ticks;
+ _ISR_Enable( level );
+
+ tmp *= _TOD_Microseconds_per_tick;
+ ((rtems_clock_time_value *)time_buffer)->microseconds = tmp;
+
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* should never get here */
+
+}
+
+/*PAGE
+ *
+ * rtems_clock_set
+ *
+ * This directive sets the date and time for this node.
+ *
+ * Input parameters:
+ * time_buffer - pointer to the time and date structure
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_clock_set(
+ rtems_time_of_day *time_buffer
+)
+{
+ rtems_interval seconds;
+
+ 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 RTEMS_INVALID_CLOCK;
+}
+
+/*PAGE
+ *
+ * rtems_clock_tick
+ *
+ * This directive notifies the executve that a tick has occurred.
+ * When the tick occurs the time manager updates and maintains
+ * the calendar time, timeslicing, and any timeout delays.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always succeeds
+ *
+ * NOTE: This routine only works for leap-years through 2099.
+ */
+
+rtems_status_code rtems_clock_tick( void )
+{
+ _TOD_Tickle_ticks();
+
+ _Watchdog_Tickle_ticks();
+
+ _Thread_Tickle_timeslice();
+
+ if ( _Thread_Is_context_switch_necessary() &&
+ _Thread_Is_dispatching_enabled() )
+ _Thread_Dispatch();
+
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/cpukit/rtems/src/rtemstimer.c b/cpukit/rtems/src/rtemstimer.c
new file mode 100644
index 0000000000..0feafb6708
--- /dev/null
+++ b/cpukit/rtems/src/rtemstimer.c
@@ -0,0 +1,349 @@
+/*
+ * Timer Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _Timer_Manager_initialization
+ *
+ * This routine initializes all timer manager related data structures.
+ *
+ * Input parameters:
+ * maximum_timers - number of timers to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Timer_Manager_initialization(
+ unsigned32 maximum_timers
+)
+{
+ _Objects_Initialize_information(
+ &_Timer_Information,
+ OBJECTS_RTEMS_TIMERS,
+ FALSE,
+ maximum_timers,
+ sizeof( Timer_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_timer_create
+ *
+ * This directive creates a timer and performs some initialization.
+ *
+ * Input parameters:
+ * name - timer name
+ * id - pointer to timer id
+ *
+ * Output parameters:
+ * id - timer id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_create(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Timer_Control *the_timer;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_timer = _Timer_Allocate();
+
+ if ( !the_timer ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_timer->the_class = TIMER_DORMANT;
+
+ _Objects_Open( &_Timer_Information, &the_timer->Object, &name );
+
+ *id = the_timer->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_timer_ident
+ *
+ * This directive returns the system ID associated with
+ * the timer name.
+ *
+ * Input parameters:
+ * name - user defined message queue name
+ * id - pointer to timer id
+ *
+ * Output parameters:
+ * *id - message queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Timer_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_timer_cancel
+ *
+ * This directive allows a thread to cancel a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_cancel(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_delete
+ *
+ * This directive allows a thread to delete a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_delete(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_fire_after
+ *
+ * This directive allows a thread to start a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ * ticks - interval until routine is fired
+ * routine - routine to schedule
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_fire_after(
+ 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;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ (void) _Watchdog_Remove( &the_timer->Ticker );
+ the_timer->the_class = TIMER_INTERVAL;
+ _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
+ _Watchdog_Insert_ticks( &the_timer->Ticker, ticks );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_fire_when
+ *
+ * This directive allows a thread to start a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ * wall_time - time of day to fire timer
+ * routine - routine to schedule
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_fire_when(
+ 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_interval seconds;
+
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ 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;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ return RTEMS_INTERNAL_ERROR;
+ case OBJECTS_LOCAL:
+ (void) _Watchdog_Remove( &the_timer->Ticker );
+ the_timer->the_class = TIMER_TIME_OF_DAY;
+ _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data );
+ _Watchdog_Insert_seconds(
+ &the_timer->Ticker,
+ seconds - _TOD_Seconds_since_epoch
+ );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_timer_reset
+ *
+ * This directive allows a thread to reset a timer.
+ *
+ * Input parameters:
+ * id - timer id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_timer_reset(
+ Objects_Id id
+)
+{
+ Timer_Control *the_timer;
+ Objects_Locations location;
+
+ the_timer = _Timer_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE: /* should never return this */
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_DEFINED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/cpukit/rtems/src/sem.c b/cpukit/rtems/src/sem.c
new file mode 100644
index 0000000000..553750a924
--- /dev/null
+++ b/cpukit/rtems/src/sem.c
@@ -0,0 +1,571 @@
+/*
+ * Semaphore Manager
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the Semaphore Manager.
+ * This manager utilizes standard Dijkstra counting semaphores to provide
+ * synchronization and mutual exclusion capabilities.
+ *
+ * Directives provided are:
+ *
+ * + create a semaphore
+ * + get an ID of a semaphore
+ * + delete a semaphore
+ * + acquire a semaphore
+ * + release a semaphore
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/sysstate.h>
+
+#include <rtems/score/interr.h>
+
+/*PAGE
+ *
+ * _Semaphore_Manager_initialization
+ *
+ * This routine initializes all semaphore manager related data structures.
+ *
+ * Input parameters:
+ * maximum_semaphores - maximum configured semaphores
+ *
+ * Output parameters: NONE
+ */
+
+void _Semaphore_Manager_initialization(
+ unsigned32 maximum_semaphores
+)
+{
+ _Objects_Initialize_information(
+ &_Semaphore_Information,
+ OBJECTS_RTEMS_SEMAPHORES,
+ TRUE,
+ maximum_semaphores,
+ sizeof( Semaphore_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_SEMAPHORE,
+ _Semaphore_MP_Process_packet
+ );
+
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_create
+ *
+ * This directive creates a semaphore and sets the initial value based
+ * 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
+ * priority_ceiling - semaphore's ceiling priority
+ * id - pointer to semaphore id
+ *
+ * Output parameters:
+ * id - semaphore id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_create(
+ 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 ( !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ if ( _Attributes_Is_inherit_priority( attribute_set ) )
+ return RTEMS_NOT_DEFINED;
+
+ } else if ( _Attributes_Is_inherit_priority( attribute_set ) ||
+ _Attributes_Is_priority_ceiling( attribute_set ) ) {
+
+ if ( ! ( _Attributes_Is_binary_semaphore( attribute_set ) &&
+ _Attributes_Is_priority( attribute_set ) ) )
+ return RTEMS_NOT_DEFINED;
+
+ }
+
+ if ( _Attributes_Is_binary_semaphore( attribute_set ) && ( count > 1 ) )
+ return RTEMS_INVALID_NUMBER;
+
+ _Thread_Disable_dispatch(); /* prevents deletion */
+
+ the_semaphore = _Semaphore_Allocate();
+
+ if ( !the_semaphore ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( _Attributes_Is_global( attribute_set ) &&
+ ! ( _Objects_MP_Allocate_and_open( &_Semaphore_Information, name,
+ the_semaphore->Object.id, FALSE ) ) ) {
+ _Semaphore_Free( the_semaphore );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ the_semaphore->attribute_set = attribute_set;
+
+ 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 ????? */
+
+ the_mutex_attributes.priority_ceiling = priority_ceiling;
+
+ 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;
+
+ /*
+ * The following are just to make Purify happy.
+ */
+
+ the_mutex_attributes.allow_nesting = TRUE;
+ the_mutex_attributes.priority_ceiling = PRIORITY_MINIMUM;
+
+ _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 );
+
+ *id = the_semaphore->Object.id;
+
+ if ( _Attributes_Is_global( attribute_set ) )
+ _Semaphore_MP_Send_process_packet(
+ SEMAPHORE_MP_ANNOUNCE_CREATE,
+ the_semaphore->Object.id,
+ name,
+ 0 /* Not used */
+ );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_ident
+ *
+ * This directive returns the system ID associated with
+ * the semaphore name.
+ *
+ * Input parameters:
+ * name - user defined semaphore name
+ * node - node(s) to be searched
+ * id - pointer to semaphore id
+ *
+ * Output parameters:
+ * *id - semaphore id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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
+ *
+ * rtems_semaphore_delete
+ *
+ * This directive allows a thread to delete a semaphore specified by
+ * the semaphore id. The semaphore is freed back to the inactive
+ * semaphore chain.
+ *
+ * Input parameters:
+ * id - semaphore id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_delete(
+ Objects_Id id
+)
+{
+ register Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+
+ the_semaphore = _Semaphore_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ 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 );
+
+ _Semaphore_Free( the_semaphore );
+
+ if ( _Attributes_Is_global( the_semaphore->attribute_set ) ) {
+
+ _Objects_MP_Close( &_Semaphore_Information, the_semaphore->Object.id );
+
+ _Semaphore_MP_Send_process_packet(
+ SEMAPHORE_MP_ANNOUNCE_DELETE,
+ the_semaphore->Object.id,
+ 0, /* Not used */
+ 0 /* Not used */
+ );
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_obtain
+ *
+ * This directive allows a thread to acquire a semaphore.
+ *
+ * Input parameters:
+ * id - semaphore id
+ * option_set - wait option
+ * timeout - number of ticks to wait (0 means wait forever)
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_obtain(
+ 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 ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return _Semaphore_MP_Send_request_packet(
+ SEMAPHORE_MP_OBTAIN_REQUEST,
+ id,
+ option_set,
+ timeout
+ );
+ case OBJECTS_LOCAL:
+ 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 );
+ }
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_semaphore_release
+ *
+ * This directive allows a thread to release a semaphore.
+ *
+ * Input parameters:
+ * id - semaphore id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_semaphore_release(
+ Objects_Id id
+)
+{
+ register Semaphore_Control *the_semaphore;
+ Objects_Locations location;
+ CORE_mutex_Status mutex_status;
+ CORE_semaphore_Status semaphore_status;
+
+ the_semaphore = _Semaphore_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return _Semaphore_MP_Send_request_packet(
+ SEMAPHORE_MP_RELEASE_REQUEST,
+ id,
+ 0, /* Not used */
+ MPCI_DEFAULT_TIMEOUT
+ );
+ case OBJECTS_LOCAL:
+ 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 );
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*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;
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * _Semaphore_Translate_core_semaphore_return_code
+ *
+ * Input parameters:
+ * the_semaphore_status - semaphore status code to translate
+ *
+ * Output parameters:
+ * rtems status code - translated RTEMS status code
+ *
+ */
+
+rtems_status_code _Semaphore_Translate_core_semaphore_return_code (
+ unsigned32 the_semaphore_status
+)
+{
+ 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;
+ }
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*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
+ );
+}
+
+
+/*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
new file mode 100644
index 0000000000..9267990ed5
--- /dev/null
+++ b/cpukit/rtems/src/semmp.c
@@ -0,0 +1,308 @@
+/*
+ * Multiprocessing Support for the Semaphore Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_process_packet
+ *
+ */
+
+void _Semaphore_MP_Send_process_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ rtems_name name,
+ Objects_Id proxy_id
+)
+{
+ Semaphore_MP_Packet *the_packet;
+ unsigned32 node;
+
+ switch ( operation ) {
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+
+ the_packet = _Semaphore_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = semaphore_id;
+ the_packet->name = name;
+ the_packet->proxy_id = proxy_id;
+
+ if ( operation == SEMAPHORE_MP_EXTRACT_PROXY )
+ node = rtems_get_node( semaphore_id );
+ else
+ node = MPCI_ALL_NODES;
+
+ _MPCI_Send_process_packet( node, &the_packet->Prefix );
+ break;
+
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_request_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
+)
+{
+ Semaphore_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+
+ the_packet = _Semaphore_MP_Get_packet();
+ 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))
+ the_packet->Prefix.timeout = timeout;
+
+ the_packet->operation = operation;
+ the_packet->Prefix.id = semaphore_id;
+ the_packet->option_set = option_set;
+
+ return _MPCI_Send_request_packet(
+ rtems_get_node( semaphore_id ),
+ &the_packet->Prefix,
+ STATES_WAITING_FOR_SEMAPHORE
+ );
+ break;
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_response_packet
+ *
+ */
+
+void _Semaphore_MP_Send_response_packet (
+ Semaphore_MP_Remote_operations operation,
+ Objects_Id semaphore_id,
+ Thread_Control *the_thread
+)
+{
+ Semaphore_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+
+ the_packet = ( Semaphore_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Semaphore_MP_Process_packet
+ *
+ */
+
+void _Semaphore_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Semaphore_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (Semaphore_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case SEMAPHORE_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_Semaphore_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_Semaphore_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_EXTRACT_PROXY:
+
+ the_thread = _Thread_MP_Find_proxy( the_packet->proxy_id );
+
+ if ( ! _Thread_Is_null( the_thread ) )
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_OBTAIN_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_semaphore_obtain(
+ the_packet->Prefix.id,
+ the_packet->option_set,
+ the_packet->Prefix.timeout
+ );
+
+ if ( ! _Thread_Is_proxy_blocking( the_packet->Prefix.return_code ) )
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_OBTAIN_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+
+ case SEMAPHORE_MP_OBTAIN_RESPONSE:
+ case SEMAPHORE_MP_RELEASE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case SEMAPHORE_MP_RELEASE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_semaphore_release(
+ the_packet->Prefix.id
+ );
+
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_RELEASE_RESPONSE,
+ the_packet->Prefix.id,
+ _Thread_Executing
+ );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_object_was_deleted
+ *
+ */
+
+void _Semaphore_MP_Send_object_was_deleted (
+ Thread_Control *the_proxy
+)
+{
+ the_proxy->receive_packet->return_code = RTEMS_OBJECT_WAS_DELETED;
+
+ _Semaphore_MP_Send_response_packet(
+ SEMAPHORE_MP_OBTAIN_RESPONSE,
+ the_proxy->Wait.id,
+ the_proxy
+ );
+
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Send_extract_proxy
+ *
+ */
+
+void _Semaphore_MP_Send_extract_proxy (
+ Thread_Control *the_thread
+)
+{
+ _Semaphore_MP_Send_process_packet(
+ SEMAPHORE_MP_EXTRACT_PROXY,
+ the_thread->Wait.id,
+ (rtems_name) 0,
+ the_thread->Object.id
+ );
+
+}
+
+/*PAGE
+ *
+ * _Semaphore_MP_Get_packet
+ *
+ */
+
+Semaphore_MP_Packet *_Semaphore_MP_Get_packet ( void )
+{
+ return ( (Semaphore_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/cpukit/rtems/src/signal.c b/cpukit/rtems/src/signal.c
new file mode 100644
index 0000000000..9f6d8df1a3
--- /dev/null
+++ b/cpukit/rtems/src/signal.c
@@ -0,0 +1,149 @@
+/*
+ * Signal Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/asr.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/score/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
+ * catching signals.
+ *
+ * Input parameters:
+ * handler - address of asynchronous signal routine (asr)
+ * ( NULL indicates asr is invalid )
+ * mode_set - mode value for asr
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always succeeds
+ */
+
+rtems_status_code rtems_signal_catch(
+ rtems_asr_entry asr_handler,
+ rtems_mode mode_set
+)
+{
+ 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 ) ) {
+ asr->mode_set = mode_set;
+ asr->handler = asr_handler;
+ }
+ else
+ _ASR_Initialize( asr );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_signal_send
+ *
+ * This directive allows a thread to send signals to a thread.
+ *
+ * Input parameters:
+ * id - thread id
+ * signal_set - signal set
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_signal_send(
+ Objects_Id id,
+ rtems_signal_set signal_set
+)
+{
+ 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;
+ case OBJECTS_REMOTE:
+ return _Signal_MP_Send_request_packet(
+ SIGNAL_MP_SEND_REQUEST,
+ id,
+ signal_set
+ );
+ case OBJECTS_LOCAL:
+ 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 );
+
+ the_thread->do_post_task_switch_extension = TRUE;
+
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_NOT_DEFINED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/cpukit/rtems/src/signalmp.c b/cpukit/rtems/src/signalmp.c
new file mode 100644
index 0000000000..4bc696b901
--- /dev/null
+++ b/cpukit/rtems/src/signalmp.c
@@ -0,0 +1,189 @@
+/*
+ * Multiprocessing Support for the Signal Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _Signal_MP_Send_process_packet
+ *
+ * This subprogram is not needed since there are no process
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Signal_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _Signal_MP_Send_request_packet (
+ Signal_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_signal_set signal_in
+)
+{
+ Signal_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SIGNAL_MP_SEND_REQUEST:
+
+ the_packet = _Signal_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = task_id;
+ the_packet->signal_in = signal_in;
+
+ return _MPCI_Send_request_packet(
+ rtems_get_node( task_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+ break;
+
+ case SIGNAL_MP_SEND_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_INTERNAL_ERROR;
+}
+
+/*PAGE
+ *
+ * _Signal_MP_Send_response_packet
+ *
+ */
+
+void _Signal_MP_Send_response_packet (
+ Signal_MP_Remote_operations operation,
+ Thread_Control *the_thread
+)
+{
+ Signal_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case SIGNAL_MP_SEND_RESPONSE:
+
+ the_packet = ( Signal_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case SIGNAL_MP_SEND_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _Signal_MP_Process_packet
+ *
+ */
+
+void _Signal_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ Signal_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+
+ the_packet = (Signal_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case SIGNAL_MP_SEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_signal_send(
+ the_packet->Prefix.id,
+ the_packet->signal_in
+ );
+
+ _Signal_MP_Send_response_packet(
+ SIGNAL_MP_SEND_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case SIGNAL_MP_SEND_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ * _Signal_MP_Send_object_was_deleted
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Signal_MP_Send_extract_proxy
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _Signal_MP_Get_packet
+ *
+ */
+
+Signal_MP_Packet *_Signal_MP_Get_packet ( void )
+{
+ return ( (Signal_MP_Packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/cpukit/rtems/src/taskmp.c b/cpukit/rtems/src/taskmp.c
new file mode 100644
index 0000000000..fc093fb83b
--- /dev/null
+++ b/cpukit/rtems/src/taskmp.c
@@ -0,0 +1,340 @@
+/*
+ * Multiprocessing Support for the RTEMS Task Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/rtems/support.h>
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_process_packet
+ *
+ */
+
+void _RTEMS_tasks_MP_Send_process_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_name name
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+
+ the_packet = _RTEMS_tasks_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = task_id;
+ the_packet->name = name;
+
+ _MPCI_Send_process_packet( MPCI_ALL_NODES, &the_packet->Prefix );
+ break;
+
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_request_packet
+ *
+ */
+
+rtems_status_code _RTEMS_tasks_MP_Send_request_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Objects_Id task_id,
+ rtems_task_priority new_priority,
+ unsigned32 notepad,
+ unsigned32 note
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+
+ the_packet = _RTEMS_tasks_MP_Get_packet();
+ 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;
+ the_packet->Prefix.id = task_id;
+ the_packet->the_priority = new_priority;
+ the_packet->notepad = notepad;
+ the_packet->note = note;
+
+ return _MPCI_Send_request_packet(
+ rtems_get_node( task_id ),
+ &the_packet->Prefix,
+ STATES_READY /* Not used */
+ );
+ break;
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+ break;
+
+ }
+ /*
+ * The following line is included to satisfy compilers which
+ * produce warnings when a function does not end with a return.
+ */
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_response_packet
+ *
+ */
+
+void _RTEMS_tasks_MP_Send_response_packet (
+ RTEMS_tasks_MP_Remote_operations operation,
+ Thread_Control *the_thread
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+
+ switch ( operation ) {
+
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+
+ the_packet = (RTEMS_tasks_MP_Packet *) the_thread->receive_packet;
+
+/*
+ * The packet being returned already contains the class, length, and
+ * to_convert fields, therefore they are not set in this routine.
+ */
+ the_packet->operation = operation;
+ the_packet->Prefix.id = the_packet->Prefix.source_tid;
+
+ _MPCI_Send_response_packet(
+ rtems_get_node( the_packet->Prefix.source_tid ),
+ &the_packet->Prefix
+ );
+ break;
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+ break;
+
+ }
+}
+
+/*PAGE
+ *
+ *
+ * _RTEMS_tasks_MP_Process_packet
+ *
+ */
+
+void _RTEMS_tasks_MP_Process_packet (
+ rtems_packet_prefix *the_packet_prefix
+)
+{
+ RTEMS_tasks_MP_Packet *the_packet;
+ Thread_Control *the_thread;
+ boolean ignored;
+
+ the_packet = (RTEMS_tasks_MP_Packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case RTEMS_TASKS_MP_ANNOUNCE_CREATE:
+
+ ignored = _Objects_MP_Allocate_and_open(
+ &_RTEMS_tasks_Information,
+ the_packet->name,
+ the_packet->Prefix.id,
+ TRUE
+ );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_ANNOUNCE_DELETE:
+
+ _Objects_MP_Close( &_RTEMS_tasks_Information, the_packet->Prefix.id );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_SUSPEND_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_suspend(
+ the_packet->Prefix.id
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_SUSPEND_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_SUSPEND_RESPONSE:
+ case RTEMS_TASKS_MP_RESUME_RESPONSE:
+ case RTEMS_TASKS_MP_SET_NOTE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_RESUME_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_resume(
+ the_packet->Prefix.id
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_RESUME_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_SET_PRIORITY_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_set_priority(
+ the_packet->Prefix.id,
+ the_packet->the_priority,
+ &the_packet->the_priority
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_SET_PRIORITY_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(rtems_task_priority *)the_thread->Wait.return_argument =
+ the_packet->the_priority;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_GET_NOTE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_get_note(
+ the_packet->Prefix.id,
+ the_packet->notepad,
+ &the_packet->note
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_GET_NOTE_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+
+ case RTEMS_TASKS_MP_GET_NOTE_RESPONSE:
+
+ the_thread = _MPCI_Process_response( the_packet_prefix );
+
+ *(unsigned32 *)the_thread->Wait.return_argument = the_packet->note;
+
+ _MPCI_Return_packet( the_packet_prefix );
+ break;
+
+ case RTEMS_TASKS_MP_SET_NOTE_REQUEST:
+
+ the_packet->Prefix.return_code = rtems_task_set_note(
+ the_packet->Prefix.id,
+ the_packet->notepad,
+ the_packet->note
+ );
+
+ _RTEMS_tasks_MP_Send_response_packet(
+ RTEMS_TASKS_MP_SET_NOTE_RESPONSE,
+ _Thread_Executing
+ );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_object_was_deleted
+ *
+ * This routine is not neededby the Tasks since a task
+ * cannot be globally deleted.
+ *
+ */
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Send_extract_proxy
+ *
+ * This routine is not neededby the Tasks since a task
+ * cannot be globally deleted.
+ *
+ */
+
+/*PAGE
+ *
+ * _RTEMS_tasks_MP_Get_packet
+ *
+ */
+
+RTEMS_tasks_MP_Packet *_RTEMS_tasks_MP_Get_packet ( void )
+{
+ 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
new file mode 100644
index 0000000000..09568d4568
--- /dev/null
+++ b/cpukit/rtems/src/tasks.c
@@ -0,0 +1,1119 @@
+/*
+ * RTEMS Task Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/support.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/score/object.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/states.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/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
+ */
+
+void _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;
+ asr->signals_posted = 0;
+ _ISR_Enable( level );
+
+
+ if ( !signal_set ) /* similar to _ASR_Are_signals_pending( asr ) */
+ return;
+
+ 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 );
+
+}
+
+API_extensions_Control _RTEMS_tasks_API_extensions = {
+ { NULL, NULL },
+ NULL, /* predriver */
+ _RTEMS_tasks_Initialize_user_tasks, /* postdriver */
+ _RTEMS_tasks_Switch_extension /* post switch */
+};
+
+User_extensions_Control _RTEMS_tasks_User_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 */
+ NULL, /* begin */
+ NULL, /* exitted */
+ NULL /* fatal */
+ }
+};
+
+/*PAGE
+ *
+ * _RTEMS_tasks_Manager_initialization
+ *
+ * This routine initializes all Task Manager related data structures.
+ *
+ * Input parameters:
+ * maximum_tasks - number of tasks to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _RTEMS_tasks_Manager_initialization(
+ 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;
+
+ /*
+ * There may not be any RTEMS initialization tasks configured.
+ */
+
+#if 0
+ if ( user_tasks == NULL || number_of_initialization_tasks == 0 )
+ _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, RTEMS_TOO_MANY );
+#endif
+
+ _Objects_Initialize_information(
+ &_RTEMS_tasks_Information,
+ OBJECTS_RTEMS_TASKS,
+ TRUE,
+ maximum_tasks,
+ sizeof( Thread_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ TRUE
+ );
+
+ /*
+ * Add all the extensions for this API
+ */
+
+ _User_extensions_Add_API_set( &_RTEMS_tasks_User_extensions );
+
+ _API_extensions_Add( &_RTEMS_tasks_API_extensions );
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_TASKS,
+ _RTEMS_tasks_MP_Process_packet
+ );
+
+}
+
+/*PAGE
+ *
+ * rtems_task_create
+ *
+ * This directive creates a thread by allocating and initializing a
+ * thread control block and a stack. The newly created thread is
+ * placed in the dormant state.
+ *
+ * Input parameters:
+ * name - user defined thread name
+ * initial_priority - thread priority
+ * stack_size - stack size in bytes
+ * initial_modes - initial thread mode
+ * attribute_set - thread attributes
+ * id - pointer to thread id
+ *
+ * Output parameters:
+ * id - thread id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_create(
+ rtems_name name,
+ rtems_task_priority initial_priority,
+ unsigned32 stack_size,
+ rtems_mode initial_modes,
+ rtems_attribute attribute_set,
+ Objects_Id *id
+)
+{
+ register Thread_Control *the_thread;
+ 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;
+
+ /*
+ * Core Thread Initialize insures we get the minimum amount of
+ * stack space.
+ */
+
+#if 0
+ if ( !_Stack_Is_enough( stack_size ) )
+ return RTEMS_INVALID_SIZE;
+#endif
+
+ /*
+ * Validate the RTEMS API priority and convert it to the core priority range.
+ */
+
+ if ( !_RTEMS_tasks_Priority_is_valid( initial_priority ) )
+ return RTEMS_INVALID_PRIORITY;
+
+ core_priority = _RTEMS_tasks_Priority_to_Core( initial_priority );
+
+ /*
+ * Fix the attribute set to match the attributes which
+ * this processor (1) requires and (2) is able to support.
+ * First add in the required flags for attribute_set
+ * Typically this might include FP if the platform
+ * or application required all tasks to be fp aware.
+ * Then turn off the requested bits which are not supported.
+ */
+
+ the_attribute_set = _Attributes_Set( attribute_set, ATTRIBUTES_REQUIRED );
+ the_attribute_set =
+ _Attributes_Clear( the_attribute_set, ATTRIBUTES_NOT_SUPPORTED );
+
+ if ( _Attributes_Is_floating_point( the_attribute_set ) )
+ is_fp = TRUE;
+ else
+ is_fp = FALSE;
+
+ if ( _Attributes_Is_global( the_attribute_set ) ) {
+
+ is_global = TRUE;
+
+ if ( !_System_state_Is_multiprocessing )
+ return RTEMS_MP_NOT_CONFIGURED;
+
+ } else
+ is_global = FALSE;
+
+ /*
+ * Make sure system is MP if this task is global
+ */
+
+ /*
+ * Disable dispatch for protection
+ */
+
+ _Thread_Disable_dispatch();
+
+ /*
+ * Allocate the thread control block and -- if the task is global --
+ * allocate a global object control block.
+ *
+ * NOTE: This routine does not use the combined allocate and open
+ * global object routine because this results in a lack of
+ * control over when memory is allocated and can be freed in
+ * the event of an error.
+ */
+
+ the_thread = _RTEMS_tasks_Allocate();
+
+ if ( !the_thread ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ if ( is_global ) {
+ the_global_object = _Objects_MP_Allocate_global_object();
+
+ if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
+ _RTEMS_tasks_Free( the_thread );
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+ }
+
+ /*
+ * Initialize the core thread for this task.
+ */
+
+ 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) ?
+ THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE :
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ NULL, /* no budget algorithm callout */
+ _Modes_Get_interrupt_level(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;
+ }
+
+ 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->is_global = TRUE;
+
+ _Objects_MP_Open(
+ &_RTEMS_tasks_Information,
+ the_global_object,
+ name,
+ the_thread->Object.id
+ );
+
+ _RTEMS_tasks_MP_Send_process_packet(
+ RTEMS_TASKS_MP_ANNOUNCE_CREATE,
+ the_thread->Object.id,
+ name
+ );
+
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_task_ident
+ *
+ * This directive returns the system ID associated with
+ * the thread name.
+ *
+ * Input parameters:
+ * name - user defined thread name
+ * node - node(s) to be searched
+ * id - pointer to thread id
+ *
+ * Output parameters:
+ * *id - thread id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_ident(
+ rtems_name name,
+ unsigned32 node,
+ Objects_Id *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 );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_task_start
+ *
+ * This directive readies the thread identified by the "id"
+ * based on its current priorty, to await execution. A thread
+ * can be started only from the dormant state.
+ *
+ * Input parameters:
+ * id - thread id
+ * entry_point - start execution address of thread
+ * argument - thread argument
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_start(
+ rtems_id id,
+ rtems_task_entry entry_point,
+ unsigned32 argument
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ if ( entry_point == NULL )
+ return RTEMS_INVALID_ADDRESS;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ 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;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INCORRECT_STATE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_restart
+ *
+ * This directive readies the specified thread. It restores
+ * the thread environment to the original values established
+ * at thread creation and start time. A thread can be restarted
+ * from any state except the dormant state.
+ *
+ * Input parameters:
+ * id - thread id
+ * argument - thread argument
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_restart(
+ Objects_Id id,
+ unsigned32 argument
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ if ( _Thread_Restart( the_thread, NULL, argument ) ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INCORRECT_STATE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_delete
+ *
+ * This directive allows a thread to delete itself or the thread
+ * identified in the id field. The executive halts execution
+ * of the thread and frees the thread control block.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters:
+ * nothing - if id is the requesting thread (always succeeds)
+ * RTEMS_SUCCESSFUL - if successful and id is
+ * not the requesting thread
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_delete(
+ Objects_Id id
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ _Thread_Dispatch();
+ return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
+ case OBJECTS_LOCAL:
+ _Thread_Close( &_RTEMS_tasks_Information, the_thread );
+
+ _RTEMS_tasks_Free( the_thread );
+
+ if ( the_thread->is_global ) {
+
+ _Objects_MP_Close( &_RTEMS_tasks_Information, the_thread->Object.id );
+
+ _RTEMS_tasks_MP_Send_process_packet(
+ RTEMS_TASKS_MP_ANNOUNCE_DELETE,
+ the_thread->Object.id,
+ 0 /* Not used */
+ );
+ }
+
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_suspend
+ *
+ * This directive will place the specified thread in the "suspended"
+ * state. Note that the suspended state can be in addition to
+ * other waiting states.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_suspend(
+ Objects_Id id
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ 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 */
+ );
+ case OBJECTS_LOCAL:
+ if ( !_States_Is_suspended( the_thread->current_state ) ) {
+ _Thread_Set_state( the_thread, STATES_SUSPENDED );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_ALREADY_SUSPENDED;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_resume
+ *
+ * This directive will remove the specified thread
+ * from the suspended state.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_resume(
+ Objects_Id id
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ return RTEMS_INVALID_ID;
+ case OBJECTS_REMOTE:
+ return(
+ _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_RESUME_REQUEST,
+ id,
+ 0, /* Not used */
+ 0, /* Not used */
+ 0 /* Not used */
+ )
+ );
+ case OBJECTS_LOCAL:
+ if ( _States_Is_suspended( the_thread->current_state ) ) {
+ _Thread_Resume( the_thread );
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_INCORRECT_STATE;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_set_priority
+ *
+ * This directive changes the priority of the specified thread.
+ * The specified thread can be any thread in the system including
+ * the requesting thread.
+ *
+ * Input parameters:
+ * id - thread id (0 indicates requesting thread)
+ * new_priority - thread priority (0 indicates current priority)
+ * old_priority - pointer to previous priority
+ *
+ * Output parameters:
+ * old_priority - previous priority
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_set_priority(
+ Objects_Id id,
+ rtems_task_priority new_priority,
+ rtems_task_priority *old_priority
+)
+{
+ register Thread_Control *the_thread;
+ Objects_Locations location;
+
+ if ( new_priority != RTEMS_CURRENT_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;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = old_priority;
+ return(
+ _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_SET_PRIORITY_REQUEST,
+ id,
+ new_priority,
+ 0, /* Not used */
+ 0 /* Not used */
+ )
+ );
+ case OBJECTS_LOCAL:
+ *old_priority = the_thread->current_priority;
+ if ( new_priority != RTEMS_CURRENT_PRIORITY ) {
+ the_thread->real_priority = new_priority;
+ if ( the_thread->resource_count == 0 ||
+ the_thread->current_priority > new_priority )
+ _Thread_Change_priority( the_thread, new_priority, FALSE );
+ }
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_mode
+ *
+ * This directive enables and disables several modes of
+ * execution for the requesting thread.
+ *
+ * Input parameters:
+ * mode_set - new mode
+ * mask - mask
+ * previous_mode_set - address of previous mode set
+ *
+ * Output:
+ * *previous_mode_set - previous mode set
+ * always return RTEMS_SUCCESSFUL;
+ */
+
+rtems_status_code rtems_task_mode(
+ rtems_mode mode_set,
+ rtems_mode mask,
+ rtems_mode *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;
+
+ if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE )
+ old_mode |= RTEMS_NO_TIMESLICE;
+ else
+ old_mode |= RTEMS_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 ) {
+ if ( _Modes_Is_timeslice(mode_set) )
+ executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE;
+ else
+ executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE;
+ }
+
+ /*
+ * 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;
+ executing->do_post_task_switch_extension = TRUE;
+ }
+ }
+ }
+
+ if ( _Thread_Evaluate_mode() || needs_asr_dispatching )
+ _Thread_Dispatch();
+
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_task_get_note
+ *
+ * This directive obtains the note from the specified notepad
+ * of the specified thread.
+ *
+ * Input parameters:
+ * id - thread id
+ * notepad - notepad number
+ * note - pointer to note
+ *
+ * Output parameters:
+ * note - filled in if successful
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_get_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 *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
+ * be checking an unsigned number for being negative.
+ */
+
+ if ( notepad > RTEMS_NOTEPAD_LAST )
+ return RTEMS_INVALID_NUMBER;
+
+ /*
+ * Optimize the most likely case to avoid the Thread_Dispatch.
+ */
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
+ _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
+ 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;
+ case OBJECTS_REMOTE:
+ _Thread_Executing->Wait.return_argument = note;
+
+ return _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_GET_NOTE_REQUEST,
+ id,
+ 0, /* Not used */
+ notepad,
+ 0 /* Not used */
+ );
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ *note = api->Notepads[ notepad ];
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_set_note
+ *
+ * This directive sets the specified notepad contents to the given
+ * note.
+ *
+ * Input parameters:
+ * id - thread id
+ * notepad - notepad number
+ * note - note value
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_set_note(
+ Objects_Id id,
+ unsigned32 notepad,
+ unsigned32 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
+ * be checking an unsigned number for being negative.
+ */
+
+ if ( notepad > RTEMS_NOTEPAD_LAST )
+ return RTEMS_INVALID_NUMBER;
+
+ /*
+ * Optimize the most likely case to avoid the Thread_Dispatch.
+ */
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ||
+ _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) {
+ 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;
+ case OBJECTS_REMOTE:
+ return _RTEMS_tasks_MP_Send_request_packet(
+ RTEMS_TASKS_MP_SET_NOTE_REQUEST,
+ id,
+ 0, /* Not used */
+ notepad,
+ note
+ );
+
+ case OBJECTS_LOCAL:
+ api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
+ api->Notepads[ notepad ] = note;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+ }
+
+ return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
+
+/*PAGE
+ *
+ * rtems_task_wake_after
+ *
+ * This directive suspends the requesting thread for the given amount
+ * of ticks.
+ *
+ * Input parameters:
+ * ticks - number of ticks to wait
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - always successful
+ */
+
+rtems_status_code rtems_task_wake_after(
+ rtems_interval ticks
+)
+{
+ if ( ticks == 0 ) {
+ _Thread_Yield_processor();
+ _Thread_Dispatch();
+ } else {
+ _Thread_Disable_dispatch();
+ _Thread_Set_state( _Thread_Executing, STATES_DELAYING );
+ _Watchdog_Initialize(
+ &_Thread_Executing->Timer,
+ _Thread_Delay_ended,
+ _Thread_Executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_ticks( &_Thread_Executing->Timer, ticks );
+ _Thread_Enable_dispatch();
+ }
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_task_wake_when
+ *
+ * This directive blocks the requesting thread until the given date and
+ * time is reached.
+ *
+ * Input parameters:
+ * time_buffer - pointer to the time and date structure
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_task_wake_when(
+rtems_time_of_day *time_buffer
+)
+{
+ Watchdog_Interval seconds;
+
+ if ( !_TOD_Is_set )
+ return RTEMS_NOT_DEFINED;
+
+ time_buffer->ticks = 0;
+
+ 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;
+
+ _Thread_Disable_dispatch();
+ _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_TIME );
+ _Watchdog_Initialize(
+ &_Thread_Executing->Timer,
+ _Thread_Delay_ended,
+ _Thread_Executing->Object.id,
+ NULL
+ );
+ _Watchdog_Insert_seconds(
+ &_Thread_Executing->Timer,
+ seconds - _TOD_Seconds_since_epoch
+ );
+ _Thread_Enable_dispatch();
+ 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;
+
+ if ( !user_tasks || maximum == 0 )
+ return;
+
+ 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/confdefs.h b/cpukit/sapi/include/confdefs.h
new file mode 100644
index 0000000000..ab08adb4b5
--- /dev/null
+++ b/cpukit/sapi/include/confdefs.h
@@ -0,0 +1,485 @@
+/* confdefs.h
+ *
+ * This include file contains the configuration table template that will
+ * be used by the single processor tests to define its default configuration
+ * parameters.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CONFIGURATION_TEMPLATE_h
+#define __CONFIGURATION_TEMPLATE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern rtems_initialization_tasks_table Initialization_tasks[];
+extern rtems_driver_address_table Device_drivers[];
+extern rtems_configuration_table Configuration;
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+#ifdef RTEMS_POSIX_API
+extern posix_api_configuration_table Configuration_POSIX_API;
+#endif
+
+/*
+ * Default User Initialization Task Table. This table guarantees that
+ * one user initialization table is defined.
+ */
+
+#ifdef CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#ifdef CONFIGURE_HAS_OWN_INIT_TASK_TABLE
+
+/*
+ * The user is defining their own table information and setting the
+ * appropriate variables.
+ */
+
+#else
+
+#ifndef CONFIGURE_INIT_TASK_NAME
+#define CONFIGURE_INIT_TASK_NAME rtems_build_name( 'U', 'I', '1', ' ' )
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_STACK_SIZE
+#define CONFIGURE_INIT_TASK_STACK_SIZE RTEMS_MINIMUM_STACK_SIZE
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_PRIORITY
+#define CONFIGURE_INIT_TASK_PRIORITY 1
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ATTRIBUTES
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ENTRY_POINT
+#define CONFIGURE_INIT_TASK_ENTRY_POINT Init
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_INITIAL_MODES
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_NO_PREEMPT
+#endif
+
+#ifndef CONFIGURE_INIT_TASK_ARGUMENTS
+#define CONFIGURE_INIT_TASK_ARGUMENTS 0
+#endif
+
+#ifdef CONFIGURE_INIT
+rtems_initialization_tasks_table Initialization_tasks[] = {
+ { CONFIGURE_INIT_TASK_NAME,
+ CONFIGURE_INIT_TASK_STACK_SIZE,
+ CONFIGURE_INIT_TASK_PRIORITY,
+ CONFIGURE_INIT_TASK_ATTRIBUTES,
+ CONFIGURE_INIT_TASK_ENTRY_POINT,
+ CONFIGURE_INIT_TASK_INITIAL_MODES,
+ CONFIGURE_INIT_TASK_ARGUMENTS
+ }
+};
+#endif
+
+#define CONFIGURE_INIT_TASK_TABLE Initialization_tasks
+
+#define CONFIGURE_INIT_TASK_TABLE_SIZE \
+ sizeof(CONFIGURE_INIT_TASK_TABLE) / sizeof(rtems_initialization_tasks_table)
+
+#endif /* CONFIGURE_HAS_OWN_INIT_TASK_TABLE */
+
+#else /* CONFIGURE_RTEMS_INIT_TASKS_TABLE */
+
+#define CONFIGURE_INIT_TASK_TABLE NULL
+#define CONFIGURE_INIT_TASK_TABLE_SIZE 0
+
+#endif
+
+/*
+ * Default Device Driver Table. Each driver needed by the test is explicitly
+ * choosen by that test. There is always a null driver entry.
+ */
+
+#define NULL_DRIVER_TABLE_ENTRY \
+ { NULL, NULL, NULL, NULL, NULL, NULL }
+
+#ifdef CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+#include <timerdrv.h>
+#endif
+
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+#include <stubdrv.h>
+#endif
+
+#ifndef CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
+
+#ifdef CONFIGURE_INIT
+rtems_driver_address_table Device_drivers[] = {
+#ifdef CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ CONSOLE_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+ CLOCK_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+ STUB_DRIVER_TABLE_ENTRY,
+#endif
+ NULL_DRIVER_TABLE_ENTRY
+};
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE */
+
+/*
+ * Default the number of devices per device driver. This value may be
+ * overridden by the user.
+ */
+
+#ifndef CONFIGURE_HAS_OWN_NUMBER_OF_DEVICES
+
+#ifndef CONFIGURE_MAXIMUM_DEVICES
+#define CONFIGURE_MAXIMUM_DEVICES 20
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_NUMBER_OF_DEVICES */
+
+/*
+ * Default Configuration Table. This table contains the most values set in
+ * the RTEMS Test Suite. Each value may be overridden within each test to
+ * customize the environment.
+ */
+
+#ifdef CONFIGURE_MPTEST
+#ifndef CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+
+#ifndef CONFIGURE_MP_NODE_NUMBER
+#define CONFIGURE_MP_NODE_NUMBER NODE_NUMBER
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_NODES
+#define CONFIGURE_MP_MAXIMUM_NODES 2
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS
+#define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 32
+#endif
+
+#ifndef CONFIGURE_MP_MAXIMUM_PROXIES
+#define CONFIGURE_MP_MAXIMUM_PROXIES 32
+#endif
+
+#ifndef CONFIGURE_MP_MPCI_TABLE_POINTER
+#include <mpci.h>
+#define CONFIGURE_MP_MPCI_TABLE_POINTER &MPCI_table
+#endif
+
+#ifdef CONFIGURE_INIT
+rtems_multiprocessing_table Multiprocessing_configuration = {
+ CONFIGURE_MP_NODE_NUMBER, /* local node number */
+ CONFIGURE_MP_MAXIMUM_NODES, /* maximum # nodes in system */
+ CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS, /* maximum # global objects */
+ CONFIGURE_MP_MAXIMUM_PROXIES, /* maximum # proxies */
+ CONFIGURE_MP_MPCI_TABLE_POINTER /* pointer to MPCI config table */
+};
+#endif
+
+#define CONFIGURE_MULTIPROCESSING_TABLE &Multiprocessing_configuration
+
+#endif /* CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE */
+
+#else
+
+#define CONFIGURE_MULTIPROCESSING_TABLE NULL
+
+#endif /* CONFIGURE_MPTEST */
+
+/*
+ * Default Configuration Table. This table contains the most values set in
+ * the RTEMS Test Suite. Each value may be overridden within each test to
+ * customize the environment.
+ */
+
+#ifndef CONFIGURE_HAS_OWN_CONFIGURATION_TABLE
+
+#ifndef CONFIGURE_EXECUTIVE_RAM_WORK_AREA
+#define CONFIGURE_EXECUTIVE_RAM_WORK_AREA NULL
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_TASKS
+#define CONFIGURE_MAXIMUM_TASKS 10
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_TIMERS
+#define CONFIGURE_MAXIMUM_TIMERS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_SEMAPHORES
+#define CONFIGURE_MAXIMUM_SEMAPHORES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_MESSAGE_QUEUES
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PARTITIONS
+#define CONFIGURE_MAXIMUM_PARTITIONS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_REGIONS
+#define CONFIGURE_MAXIMUM_REGIONS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PORTS
+#define CONFIGURE_MAXIMUM_PORTS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_PERIODS
+#define CONFIGURE_MAXIMUM_PERIODS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_USER_EXTENSIONS
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 0
+#endif
+
+#ifndef CONFIGURE_MICROSECONDS_PER_TICK
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(10)
+#endif
+
+#ifndef CONFIGURE_TICKS_PER_TIMESLICE
+#define CONFIGURE_TICKS_PER_TIMESLICE 50
+#endif
+
+#ifndef CONFIGURE_INITIAL_EXTENSIONS
+#define CONFIGURE_INITIAL_EXTENSIONS NULL
+#endif
+
+/*
+ * POSIX API Configuration Parameters
+ */
+
+#ifdef RTEMS_POSIX_API
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 10
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_MUTEXES
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES
+#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_KEYS
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 0
+#endif
+
+#ifndef CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS
+#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 0
+#endif
+
+#ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#ifdef CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE
+
+/*
+ * The user is defining their own table information and setting the
+ * appropriate variables.
+ */
+
+#else
+
+#ifndef CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT
+#define CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT POSIX_Init
+#endif
+
+#ifdef CONFIGURE_INIT
+posix_initialization_threads_table POSIX_Initialization_threads[] = {
+ { CONFIGURE_POSIX_INIT_THREAD_ENTRY_POINT }
+};
+#endif
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME POSIX_Initialization_threads
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE \
+ sizeof(CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME) / \
+ sizeof(posix_initialization_threads_table)
+
+#endif /* CONFIGURE_POSIX_HAS_OWN_INIT_TASK_TABLE */
+
+#else /* CONFIGURE_POSIX_INIT_THREAD_TABLE */
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME NULL
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE 0
+
+#endif
+
+#endif /* RTEMS_POSIX_API */
+
+/*
+ * Calculate the RAM size based on the maximum number of objects configured.
+ * The model is to estimate the memory required for each configured item,
+ * sum the memory requirements and insure that there is at least 32K greater
+ * than that for things not directly addressed such as:
+ *
+ * + stacks greater than minimum size
+ * + FP contexts
+ * + API areas (should be optional)
+ * + messages
+ * + object name and local pointer table overhead
+ * + per node memory requirements
+ * + executive fixed requirements (including at least internal threads
+ * and the Ready chains)
+ *
+ * NOTE: Eventually this should take into account some of the above.
+ * Basically, this is a "back of the envelope" estimate for
+ * memory requirements. It could be more accurate.
+ */
+
+#ifndef CONFIGURE_EXECUTIVE_RAM_SIZE
+
+#define CONFIGURE_OBJECT_TABLE_STUFF \
+ ( sizeof(Objects_Control *) + sizeof(rtems_name *) + sizeof(rtems_name) )
+
+#define CONFIGURE_MEMORY_FOR_TASKS(_tasks) \
+ ((_tasks) * \
+ ((sizeof(Thread_Control) + CONTEXT_FP_SIZE + \
+ STACK_MINIMUM_SIZE + sizeof( RTEMS_API_Control ) + \
+ CONFIGURE_OBJECT_TABLE_STUFF)) \
+ )
+
+#define CONFIGURE_MEMORY_FOR_TIMERS(_timers) \
+ ((_timers) * ( sizeof(Timer_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_SEMAPHORES(_semaphores) \
+ ((_semaphores) * \
+ ( sizeof(Semaphore_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(_queues) \
+ ( (_queues) * \
+ ( sizeof(Message_queue_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PARTITIONS(_partitions) \
+ ( (_partitions) * \
+ ( sizeof(Partition_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_REGIONS(_regions) \
+ ( (_regions) * \
+ ( sizeof(Region_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PORTS(_ports) \
+ ( (_ports) * \
+ ( sizeof(Dual_ported_memory_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_PERIODS(_periods) \
+ ( (_periods) * \
+ ( sizeof(Rate_monotonic_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(_extensions) \
+ ( (_extensions) * \
+ ( sizeof(Extension_Control) + CONFIGURE_OBJECT_TABLE_STUFF ) )
+
+#define CONFIGURE_MEMORY_FOR_DEVICES(_devices) \
+ (((_devices) + 1) * ( sizeof(rtems_driver_name_t) ) )
+
+#ifdef CONFIGURE_MPTEST
+
+#ifndef CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE
+
+#define CONFIGURE_MEMORY_FOR_PROXIES(_proxies) \
+ ( ((_proxies) + 1) * ( sizeof(Thread_Proxy_control) ) )
+
+#define CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(_global_objects) \
+ ((_global_objects) * ( sizeof(Objects_MP_Control) ) )
+
+#define CONFIGURE_MEMORY_FOR_MP \
+ ( CONFIGURE_MEMORY_FOR_PROXIES(CONFIGURE_MP_MAXIMUM_PROXIES) + \
+ CONFIGURE_MEMORY_FOR_GLOBAL_OBJECTS(CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS) \
+ )
+
+#endif /* CONFIGURE_HAS_OWN_MULTIPROCESING_TABLE */
+
+#else
+
+#define CONFIGURE_MEMORY_FOR_MP 0
+
+#endif
+#define CONFIGURE_EXECUTIVE_RAM_SIZE \
+(( CONFIGURE_MEMORY_FOR_TASKS(CONFIGURE_MAXIMUM_TASKS) + \
+ CONFIGURE_MEMORY_FOR_TIMERS(CONFIGURE_MAXIMUM_TIMERS) + \
+ CONFIGURE_MEMORY_FOR_SEMAPHORES(CONFIGURE_MAXIMUM_SEMAPHORES) + \
+ CONFIGURE_MEMORY_FOR_MESSAGE_QUEUES(CONFIGURE_MAXIMUM_MESSAGE_QUEUES) + \
+ CONFIGURE_MEMORY_FOR_PARTITIONS(CONFIGURE_MAXIMUM_PARTITIONS) + \
+ CONFIGURE_MEMORY_FOR_REGIONS(CONFIGURE_MAXIMUM_REGIONS) + \
+ CONFIGURE_MEMORY_FOR_PORTS(CONFIGURE_MAXIMUM_PORTS) + \
+ CONFIGURE_MEMORY_FOR_PERIODS(CONFIGURE_MAXIMUM_PERIODS) + \
+ CONFIGURE_MEMORY_FOR_USER_EXTENSIONS(CONFIGURE_MAXIMUM_USER_EXTENSIONS) + \
+ CONFIGURE_MEMORY_FOR_DEVICES(CONFIGURE_MAXIMUM_DEVICES) + \
+ CONFIGURE_MEMORY_FOR_MP + \
+ (96*1024) \
+) & 0xffff8000)
+#endif
+
+#ifdef CONFIGURE_INIT
+
+rtems_api_configuration_table Configuration_RTEMS_API = {
+ CONFIGURE_MAXIMUM_TASKS,
+ CONFIGURE_MAXIMUM_TIMERS,
+ CONFIGURE_MAXIMUM_SEMAPHORES,
+ CONFIGURE_MAXIMUM_MESSAGE_QUEUES,
+ CONFIGURE_MAXIMUM_PARTITIONS,
+ CONFIGURE_MAXIMUM_REGIONS,
+ CONFIGURE_MAXIMUM_PORTS,
+ CONFIGURE_MAXIMUM_PERIODS,
+ CONFIGURE_INIT_TASK_TABLE_SIZE,
+ CONFIGURE_INIT_TASK_TABLE
+};
+
+#ifdef RTEMS_POSIX_API
+posix_api_configuration_table Configuration_POSIX_API = {
+ CONFIGURE_MAXIMUM_POSIX_THREADS,
+ CONFIGURE_MAXIMUM_POSIX_MUTEXES,
+ CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES,
+ CONFIGURE_MAXIMUM_POSIX_KEYS,
+ CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS,
+ CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE,
+ CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME
+};
+#endif
+
+rtems_configuration_table Configuration = {
+ CONFIGURE_EXECUTIVE_RAM_WORK_AREA,
+ CONFIGURE_EXECUTIVE_RAM_SIZE,
+ CONFIGURE_MAXIMUM_USER_EXTENSIONS,
+ CONFIGURE_MICROSECONDS_PER_TICK,
+ CONFIGURE_TICKS_PER_TIMESLICE,
+ CONFIGURE_MAXIMUM_DEVICES,
+ sizeof (Device_drivers)/
+ sizeof(rtems_driver_address_table), /* number of device drivers */
+ Device_drivers, /* pointer to driver table */
+ CONFIGURE_INITIAL_EXTENSIONS, /* pointer to initial extensions */
+ CONFIGURE_MULTIPROCESSING_TABLE, /* pointer to MP config table */
+ &Configuration_RTEMS_API, /* pointer to RTEMS API config */
+#ifdef RTEMS_POSIX_API
+ &Configuration_POSIX_API /* pointer to POSIX API config */
+#else
+ NULL /* pointer to POSIX API config */
+#endif
+};
+#endif
+
+#endif /* CONFIGURE_HAS_OWN_CONFIGURATION_TABLE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/include/rtems/README b/cpukit/sapi/include/rtems/README
new file mode 100644
index 0000000000..5fcc0d14c7
--- /dev/null
+++ b/cpukit/sapi/include/rtems/README
@@ -0,0 +1,135 @@
+#
+# $Id$
+#
+
+Configuring a System Using the Template in confdefs.h
+=====================================================
+
+The file confdefs.h is a Configuration Template file which can be
+used to greatly simplify the creation and maintenance of RTEMS
+Configuration Tables. The basic concepts are:
+
+ + confdefs.h provides defaults for all configuration parameters
+
+ + applications specify only those values they wish to override
+
+ + confdefs.h can be the only file which knows the precise layout
+ of the RTEMS Configuration Tables.
+
+The Configuration Template setup is used by all RTEMS tests to
+simplify the maintenance of the tests.
+
+Here is the section from the system.h file from test tm21 from
+the Timing Test Suite:
+
+ /* configuration information */
+
+ #define CONFIGURE_TMTEST
+
+ #define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ #define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+ #define CONFIGURE_MAXIMUM_TASKS 102
+ #define CONFIGURE_MAXIMUM_TIMERS 100
+ #define CONFIGURE_MAXIMUM_SEMAPHORES 100
+ #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 100
+ #define CONFIGURE_MAXIMUM_PARTITIONS 100
+ #define CONFIGURE_MAXIMUM_REGIONS 100
+ #define CONFIGURE_MAXIMUM_PORTS 100
+ #define CONFIGURE_MAXIMUM_PERIODS 100
+
+ #define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+ #include <confdefs.h>
+
+
+The above example overrides a number of the configuration parameters.
+It informs the template that it is a member of the Timing Suite,
+requires a console and timer driver, and that it needs 102 tasks,
+100 timers, 100 semaphores, 100 message queues, 100 partitions,
+100 regions, 100 ports, and 100 periods. By default, the test
+would have gotten no drivers, 10 tasks, and no other RTEMS objects.
+
+The following shows the configuration tables generated by the
+template by default.
+
+
+#include <bsp.h>
+
+#define NULL_DRIVER_TABLE_ENTRY \
+ { NULL, NULL, NULL, NULL, NULL, NULL }
+
+rtems_driver_address_table Device_drivers[] = {
+#ifdef CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+ CONSOLE_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+ CLOCK_DRIVER_TABLE_ENTRY,
+#endif
+#ifdef CONFIGURE_TEST_NEEDS_STUB_DRIVER
+ STUB_DRIVER_TABLE_ENTRY,
+#endif
+ NULL_DRIVER_TABLE_ENTRY,
+};
+
+rtems_initialization_tasks_table Initialization_tasks[] = {
+ { rtems_build_name( 'U', 'I', '1', ' ' ), /* init task name */
+ RTEMS_MINIMUM_STACK_SIZE, /* init task stack size */
+ 1, /* init task priority */
+ RTEMS_DEFAULT_ATTRIBUTES, /* init task attributes */
+ Init, /* init task entry point */
+ RTEMS_NO_PREEMPT, /* init task initial mode */
+ 0 /* init task argument list */
+ }
+};
+
+#ifdef CONFIGURE_MPTEST
+/*
+ * NODE_NUMBER is assumed to be set on the compile line.
+ */
+
+rtems_multiprocessing_table Multiprocessing_configuration = {
+ NODE_NUMBER, /* local node number */
+ 2, /* maximum # nodes in system */
+ 32, /* maximum # global objects */
+ 32, /* maximum # proxies */
+ &MPCI_table /* pointer to MPCI config table */
+};
+#endif
+
+/*
+ * CONFIGURE_EXECUTIVE_RAM_SIZE is a rough guess based on the number of
+ * tasks in the system plus enough extra to get a whole 64K extra.
+ *
+ * The NULL address for the workspace area is assumed to be assigned
+ * at startup time by the BSP.
+ */
+
+rtems_configuration_table Configuration = {
+ NULL, /* executive RAM work area */
+ CONFIGURE_EXECUTIVE_RAM_SIZE, /* executive RAM size */
+ 10, /* maximum # tasks */
+ 0, /* maximum # timers */
+ 0, /* maximum # semaphores */
+ 0, /* maximum # message queues */
+ 0, /* maximum # messages */
+ 0, /* maximum # partitions */
+ 0, /* maximum # regions */
+ 0, /* maximum # dp memory areas */
+ 0, /* maximum # periods */
+ 0, /* maximum # user extensions */
+ RTEMS_MILLISECONDS_TO_MICROSECONDS(10), /* # us in a tick */
+ 50, /* # ticks in a timeslice */
+ sizeof (Initialization_tasks) / sizeof(rtems_initialization_tasks_table),
+ /* number of init tasks */
+ Initialization_tasks, /* init task(s) table */
+ sizeof (Device_drivers) / sizeof(rtems_driver_address_table),
+ /* number of device drivers */
+ Device_drivers, /* pointer to driver address table */
+ NULL, /* pointer to initial extensions */
+#ifdef CONFIGURE_MPTEST
+ &Multiprocessing_configuration
+#else
+ NULL /* ptr to MP config table */
+#endif
+};
diff --git a/cpukit/sapi/include/rtems/config.h b/cpukit/sapi/include/rtems/config.h
new file mode 100644
index 0000000000..dd297e9d83
--- /dev/null
+++ b/cpukit/sapi/include/rtems/config.h
@@ -0,0 +1,103 @@
+/* config.h
+ *
+ * This include file contains the table of user defined configuration
+ * parameters.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CONFIGURATION_h
+#define __RTEMS_CONFIGURATION_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This is kind of kludgy but it allows targets to totally ignore the
+ * POSIX API safely.
+ */
+
+#ifdef RTEMS_POSIX_API
+#include <rtems/posix/config.h>
+#else
+
+typedef void *posix_api_configuration_table;
+#endif
+
+#include <rtems/rtems/config.h>
+
+/* XXX <rtems/rtems/config.h> should cover these
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+#include <rtems/rtems/tasks.h>
+*/
+
+#include <rtems/extension.h>
+#include <rtems/io.h>
+#include <rtems/score/mpci.h>
+
+/*
+ * The following records define the Multiprocessor Configuration
+ * Table. This table defines the multiprocessor system
+ * characteristics which must be known by RTEMS in a multiprocessor
+ * system.
+ */
+
+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
+ * information contained in this table is required in all
+ * RTEMS systems, whether single or multiprocessor. This
+ * table primarily defines the following:
+ *
+ * + location and size of the RTEMS Workspace
+ * + microseconds per clock tick
+ * + clock ticks per task timeslice
+ * + required number of each object type for each API configured
+ */
+
+typedef struct {
+ void *work_space_start;
+ unsigned32 work_space_size;
+ unsigned32 maximum_extensions;
+ unsigned32 microseconds_per_tick;
+ unsigned32 ticks_per_timeslice;
+ unsigned32 maximum_devices;
+ unsigned32 number_of_device_drivers;
+ rtems_driver_address_table *Device_driver_table;
+ rtems_extensions_table *User_extension_table;
+ rtems_multiprocessing_table *User_multiprocessing_table;
+ rtems_api_configuration_table *RTEMS_api_configuration;
+ posix_api_configuration_table *POSIX_api_configuration;
+} rtems_configuration_table;
+
+/*
+ * The following are provided strictly for the convenience of
+ * the user. They are not used in RTEMS itself.
+ */
+
+SAPI_EXTERN rtems_configuration_table *_Configuration_Table;
+SAPI_EXTERN rtems_multiprocessing_table *_Configuration_MP_table;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/include/rtems/extension.h b/cpukit/sapi/include/rtems/extension.h
new file mode 100644
index 0000000000..c9559855ef
--- /dev/null
+++ b/cpukit/sapi/include/rtems/extension.h
@@ -0,0 +1,136 @@
+/* extension.h
+ *
+ * This include file contains all the constants, structures, and
+ * prototypes associated with the User Extension Manager. This manager
+ * provides a mechanism for manipulating sets of user-defined extensions.
+ *
+ * Directives provided are:
+ *
+ * + create user extension set
+ * + get ID of user extension set
+ * + delete user extension set
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_EXTENSION_MANAGER_h
+#define __RTEMS_EXTENSION_MANAGER_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/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_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
+ * this class of objects.
+ */
+
+SAPI_EXTERN Objects_Information _Extension_Information;
+
+/*
+ * The following records define the control block used to manage
+ * each extension.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ User_extensions_Control Extension;
+} Extension_Control;
+
+/*
+ * _Extension_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Extension_Manager_initialization(
+ unsigned32 maximum_extensions
+);
+
+/*
+ * rtems_extension_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_create directive. The
+ * extension will have the name name. The entry points of the
+ * routines which constitute this extension set are in EXTENSION_TABLE.
+ * It returns the id of the created extension in ID.
+ */
+
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *extension_table,
+ Objects_Id *id
+);
+
+/*
+ * rtems_extension_ident
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_ident directive.
+ * This directive returns the extension ID associated with name.
+ * If more than one extension is named name, then the extension
+ * to which the ID belongs is arbitrary.
+ */
+
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ Objects_Id *id
+);
+
+/*
+ * rtems_extension_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_extension_delete directive. The
+ * extension indicated by ID is deleted.
+ */
+
+rtems_status_code rtems_extension_delete(
+ Objects_Id id
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/extension.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/include/rtems/fatal.h b/cpukit/sapi/include/rtems/fatal.h
new file mode 100644
index 0000000000..5cb9a6460a
--- /dev/null
+++ b/cpukit/sapi/include/rtems/fatal.h
@@ -0,0 +1,49 @@
+/* fatal.h
+ *
+ * This include file contains constants and prototypes related
+ * to the Fatal Error Manager. This manager processes all fatal or
+ * irrecoverable errors.
+ *
+ * This manager provides directives to:
+ *
+ * + announce a fatal error has occurred
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_FATAL_h
+#define __RTEMS_FATAL_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * rtems_fatal_error_occurred
+ *
+ * DESCRIPTION:
+ *
+ * This is the routine which implements the rtems_fatal_error_occurred
+ * directive. It is invoked when the application or RTEMS
+ * determines that a fatal error has occurred.
+ */
+
+void volatile rtems_fatal_error_occurred(
+ unsigned32 the_error
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/include/rtems/init.h b/cpukit/sapi/include/rtems/init.h
new file mode 100644
index 0000000000..1a92f53e46
--- /dev/null
+++ b/cpukit/sapi/include/rtems/init.h
@@ -0,0 +1,110 @@
+/* init.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Initialization Manager. This manager is responsible for
+ * initializing RTEMS, creating and starting all configured initialization
+ * tasks, invoking the initialization routine for each user-supplied device
+ * driver, and initializing the optional multiprocessor layer.
+ *
+ * This manager provides directives to:
+ *
+ * + initialize the RTEMS executive
+ * + shutdown the RTEMS executive
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_INIT_h
+#define __RTEMS_INIT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/types.h>
+#include <rtems/config.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
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_initialize_executive directive. This
+ * directive is invoked at system startup to initialize the RTEMS
+ * multitasking environment.
+ */
+
+void rtems_initialize_executive(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+
+/*
+ * rtems_initialize_executive_early
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the early portion of rtems_initialize_executive
+ * directive up to the pretasking hook. This directive is invoked at system
+ * startup to initialize the RTEMS multitasking environment.
+ */
+
+rtems_interrupt_level rtems_initialize_executive_early(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+);
+
+/*
+ * rtems_initialize_executive_late
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the early portion of rtems_initialize_executive
+ * directive up to the pretasking hook. This directive is invoked at system
+ * startup to initialize the RTEMS multitasking environment.
+ */
+
+void rtems_initialize_executive_late(
+ rtems_interrupt_level bsp_level
+);
+
+/*
+ * rtems_shutdown_executive
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_shutdown_executive directive. The
+ * invocation of this directive results in the RTEMS environment being
+ * shutdown and multitasking halted. From the application's perspective,
+ * invocation of this directive results in the rtems_initialize_executive
+ * directive exitting to the startup code which invoked it.
+ */
+
+void rtems_shutdown_executive(
+ unsigned32 result
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/include/rtems/io.h b/cpukit/sapi/include/rtems/io.h
new file mode 100644
index 0000000000..a1eddcf637
--- /dev/null
+++ b/cpukit/sapi/include/rtems/io.h
@@ -0,0 +1,244 @@
+/* io.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Input/Output Manager. This manager provides a well defined
+ * mechanism for accessing device drivers and a structured methodology for
+ * organizing device drivers.
+ *
+ * Directives provided are:
+ *
+ * + initialize a device driver
+ * + open a device driver
+ * + close a device driver
+ * + read from a device driver
+ * + write to a device driver
+ * + special device services
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_IO_h
+#define __RTEMS_IO_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/rtems/status.h>
+
+/*
+ *
+ * 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;
+
+/*
+ * Table for the io device names
+ */
+
+typedef struct {
+ char *device_name;
+ unsigned32 device_name_length;
+ rtems_device_major_number major;
+ rtems_device_minor_number minor;
+} rtems_driver_name_t;
+
+/*
+ * This is the table of device names.
+ */
+
+/*
+ * The following declare the data required to manage the Driver
+ * Address Table and Device Name Table.
+ */
+
+SAPI_EXTERN unsigned32 _IO_Number_of_drivers;
+SAPI_EXTERN rtems_driver_address_table *_IO_Driver_address_table;
+SAPI_EXTERN unsigned32 _IO_Number_of_devices;
+SAPI_EXTERN rtems_driver_name_t *_IO_Driver_name_table;
+
+/*
+ * _IO_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+);
+
+/*
+ * rtems_io_register_name
+ *
+ * DESCRIPTION:
+ *
+ * Associate a name with a driver.
+ *
+ */
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+);
+
+
+/*
+ * rtems_io_lookup_name
+ *
+ * DESCRIPTION:
+ *
+ * Find what driver "owns" this name
+ */
+
+rtems_status_code rtems_io_lookup_name(
+ const char *name,
+ rtems_driver_name_t **device_info
+);
+
+
+/*
+ * rtems_io_initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_initialize directive. It is invoked
+ * to initialize a device driver or an individual device.
+ */
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_open
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_open directive. It is invoked
+ * to open a device.
+ */
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_close
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_close directive. It is invoked
+ * to close a device.
+ */
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_read
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_read directive. It is invoked
+ * to read from a device.
+ */
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_write
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_write directive. It is invoked
+ * to write to a device.
+ */
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * rtems_io_control
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the rtems_io_control directive. It is invoked
+ * to perform a device specific operation on a device.
+ */
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+);
+
+/*
+ * _IO_Initialize_all_drivers
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes all of the device drivers configured
+ * in the Device Driver Address Table.
+ */
+
+void _IO_Initialize_all_drivers( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/include/rtems/mptables.h b/cpukit/sapi/include/rtems/mptables.h
new file mode 100644
index 0000000000..7a00554c23
--- /dev/null
+++ b/cpukit/sapi/include/rtems/mptables.h
@@ -0,0 +1,29 @@
+/* mptables.h
+ *
+ * This include file contains the executive's pre-initialized tables
+ * used in a multiprocessor configuration.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_MPTABLES_h
+#define __RTEMS_MPTABLES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/inline/rtems/extension.inl b/cpukit/sapi/inline/rtems/extension.inl
new file mode 100644
index 0000000000..6a00bc6f58
--- /dev/null
+++ b/cpukit/sapi/inline/rtems/extension.inl
@@ -0,0 +1,91 @@
+/* extension.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Extension Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EXTENSION_MANAGER_inl
+#define __EXTENSION_MANAGER_inl
+
+/*PAGE
+ *
+ * _Extension_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a extension control block from
+ * the inactive chain of free extension control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void )
+{
+ return (Extension_Control *) _Objects_Allocate( &_Extension_Information );
+}
+
+/*PAGE
+ *
+ * _Extension_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a extension control block to the
+ * inactive chain of free extension control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Extension_Free (
+ Extension_Control *the_extension
+)
+{
+ _Objects_Free( &_Extension_Information, &the_extension->Object );
+}
+
+/*PAGE
+ *
+ * _Extension_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps extension IDs to extension control blocks.
+ * If ID corresponds to a local extension, then it returns
+ * the extension control pointer which maps to ID and location
+ * is set to OBJECTS_LOCAL. Otherwise, location is set
+ * to OBJECTS_ERROR and the returned value is undefined.
+ */
+
+RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ return (Extension_Control *)
+ _Objects_Get( &_Extension_Information, id, location );
+}
+
+/*PAGE
+ *
+ * _Extension_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_extension is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Extension_Is_null (
+ Extension_Control *the_extension
+)
+{
+ return ( the_extension == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/macros/rtems/extension.inl b/cpukit/sapi/macros/rtems/extension.inl
new file mode 100644
index 0000000000..113cdf3154
--- /dev/null
+++ b/cpukit/sapi/macros/rtems/extension.inl
@@ -0,0 +1,58 @@
+/* extension.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Extension Manager.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __EXTENSION_inl
+#define __EXTENSION_inl
+
+/*PAGE
+ *
+ * _Extension_Allocate
+ *
+ */
+
+#define _Extension_Allocate() \
+ (Extension_Control *) _Objects_Allocate( &_Extension_Information )
+
+/*PAGE
+ *
+ * _Extension_Free
+ *
+ */
+
+#define _Extension_Free( _the_extension ) \
+ _Objects_Free( &_Extension_Information, &(_the_extension)->Object )
+
+/*PAGE
+ *
+ * _Extension_Get
+ *
+ */
+
+#define _Extension_Get( _id, _location ) \
+ (Extension_Control *) \
+ _Objects_Get( &_Extension_Information, (_id), (_location) )
+
+/*PAGE
+ *
+ * _Extension_Is_null
+ *
+ */
+
+#define _Extension_Is_null( _the_extension ) \
+ ( (_the_extension) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/sapi/src/debug.c b/cpukit/sapi/src/debug.c
new file mode 100644
index 0000000000..fc27831685
--- /dev/null
+++ b/cpukit/sapi/src/debug.c
@@ -0,0 +1,62 @@
+/*
+ * Debug Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/debug.h>
+
+/*PAGE
+ *
+ * _Debug_Manager_initialization
+ */
+
+void _Debug_Manager_initialization( void )
+{
+ rtems_debug_disable( RTEMS_DEBUG_ALL_MASK );
+}
+
+/*PAGE
+ *
+ * rtems_debug_enable
+ */
+
+void rtems_debug_enable (
+ rtems_debug_control to_be_enabled
+)
+{
+ _Debug_Level |= to_be_enabled;
+}
+
+/*PAGE
+ *
+ * rtems_debug_disable
+ */
+
+void rtems_debug_disable (
+ rtems_debug_control to_be_disabled
+)
+{
+ _Debug_Level &= ~to_be_disabled;
+}
+
+/*PAGE
+ *
+ * _Debug_Is_enabled
+ */
+
+boolean _Debug_Is_enabled(
+ rtems_debug_control level
+)
+{
+ return (_Debug_Level & level);
+}
diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c
new file mode 100644
index 0000000000..96da35e825
--- /dev/null
+++ b/cpukit/sapi/src/exinit.c
@@ -0,0 +1,297 @@
+/*
+ * Initialization Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * SCORE_INIT and SAPI_INIT are defined so all of the super core and
+ * super API data will be included in this object file.
+ */
+
+#define SAPI_INIT
+#define SCORE_INIT
+
+#include <rtems/system.h>
+#include <rtems/config.h>
+#include <rtems/debug.h>
+#include <rtems/extension.h>
+#include <rtems/fatal.h>
+#include <rtems/init.h>
+#include <rtems/io.h>
+#include <rtems/score/sysstate.h>
+
+#include <rtems/score/apiext.h>
+#include <rtems/score/copyrt.h>
+#include <rtems/score/heap.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/wkspace.h>
+
+#include <rtems/directives.h>
+#include <rtems/sptables.h>
+
+
+#include <rtems/rtems/rtemsapi.h>
+#ifdef RTEMS_POSIX_API
+#include <rtems/posix/posixapi.h>
+#endif
+
+/*PAGE
+ *
+ * rtems_initialize_executive
+ *
+ * This directive initializes all the kernels data structures
+ * to the states necessary for the kernel to begin execution. All
+ * include files that contain global variable definitions should be
+ * included in this file. The system threads and initialization threads
+ * are created and started by this routine. This routine then
+ * initiates multithreading.
+ *
+ * Input parameters:
+ * configuration_table - pointer to the user's configuration table
+ * cpu_table - pointer to the user's CPU configuration table
+ *
+ * Output parameters: NONE
+ */
+
+void rtems_initialize_executive(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+)
+{
+ rtems_interrupt_level bsp_level;
+
+ bsp_level = rtems_initialize_executive_early(configuration_table, cpu_table);
+ rtems_initialize_executive_late( bsp_level );
+}
+
+rtems_interrupt_level rtems_initialize_executive_early(
+ rtems_configuration_table *configuration_table,
+ rtems_cpu_table *cpu_table
+)
+{
+ rtems_interrupt_level bsp_level;
+ rtems_multiprocessing_table *multiprocessing_table;
+
+ /*
+ * Dispatching and interrupts are disabled until the end of the
+ * initialization sequence. This prevents an inadvertent context
+ * switch before the executive is initialized.
+ */
+
+ _ISR_Disable( bsp_level );
+
+ if ( configuration_table == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_NO_CONFIGURATION_TABLE
+ );
+
+ /*
+ * 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
+ );
+
+ /*
+ * Provided just for user convenience.
+ */
+
+ _Configuration_Table = configuration_table;
+ _Configuration_MP_table = multiprocessing_table;
+
+ /*
+ * Internally we view single processor systems as a very restricted
+ * multiprocessor system.
+ */
+
+ if ( multiprocessing_table == NULL )
+ multiprocessing_table =
+ (void *)&_Initialization_Default_multiprocessing_table;
+
+ if ( cpu_table == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_NO_CPU_TABLE
+ );
+
+ _CPU_Initialize( cpu_table, _Thread_Dispatch );
+
+ /*
+ * Do this as early as possible to insure no debugging output
+ * is even attempted to be printed.
+ */
+
+ _Debug_Manager_initialization();
+
+ _API_extensions_Initialization();
+
+ _Thread_Dispatch_initialization();
+
+ _User_extensions_Handler_initialization(
+ configuration_table->User_extension_table
+ );
+
+ _Workspace_Handler_initialization(
+ (void *)configuration_table->work_space_start,
+ configuration_table->work_space_size
+ );
+
+ _ISR_Handler_initialization();
+
+ _Objects_Handler_initialization(
+ multiprocessing_table->node,
+ multiprocessing_table->maximum_nodes,
+ multiprocessing_table->maximum_global_objects
+ );
+
+ _Priority_Handler_initialization();
+
+ _Watchdog_Handler_initialization();
+
+ _TOD_Handler_initialization( configuration_table->microseconds_per_tick );
+
+ _Thread_Handler_initialization(
+ configuration_table->ticks_per_timeslice,
+ configuration_table->maximum_extensions,
+ multiprocessing_table->maximum_proxies
+ );
+
+ _MPCI_Handler_initialization(
+ multiprocessing_table->User_mpci_table,
+ RTEMS_TIMEOUT
+ );
+
+/* MANAGERS */
+
+ _Extension_Manager_initialization( configuration_table->maximum_extensions );
+
+ _IO_Manager_initialization(
+ configuration_table->Device_driver_table,
+ configuration_table->number_of_device_drivers,
+ configuration_table->maximum_devices
+ );
+
+ _RTEMS_API_Initialize( configuration_table );
+
+#ifdef RTEMS_POSIX_API
+ _POSIX_API_Initialize( configuration_table );
+#endif
+
+ _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING );
+
+ if ( cpu_table->pretasking_hook )
+ (*cpu_table->pretasking_hook)();
+
+ /*
+ * No threads should be created before this point!!!
+ *
+ * At this point all API extensions are in place. After the call to
+ * _Thread_Create_idle() _Thread_Executing will be set.
+ * and _Thread_Heir are not set yet.
+ */
+
+ _Thread_Create_idle();
+
+ _MPCI_Create_server();
+
+ /*
+ * Run the API and BSPs predriver hook.
+ */
+
+ _API_extensions_Run_predriver();
+
+ if ( _CPU_Table.predriver_hook )
+ (*_CPU_Table.predriver_hook)();
+
+ /*
+ * Initialize all the device drivers and initialize the MPCI layer.
+ *
+ * NOTE: The MPCI may be build upon a device driver.
+ */
+
+ _IO_Initialize_all_drivers();
+
+ if ( _System_state_Is_multiprocessing ) {
+ _MPCI_Initialization();
+ _MPCI_Internal_packets_Send_process_packet(
+ MPCI_PACKETS_SYSTEM_VERIFY
+ );
+ }
+
+ /*
+ * Run the APIs and BSPs postdriver hooks.
+ *
+ * The API extensions are supposed to create user initialization tasks.
+ */
+
+ _API_extensions_Run_postdriver();
+
+ if ( _CPU_Table.postdriver_hook )
+ (*_CPU_Table.postdriver_hook)();
+
+ return bsp_level;
+}
+
+void rtems_initialize_executive_late(
+ rtems_interrupt_level bsp_level
+)
+{
+
+ _System_state_Set( SYSTEM_STATE_BEGIN_MULTITASKING );
+
+ _Thread_Start_multitasking();
+
+ /*
+ * Restore the interrupt level to what the BSP had. Technically,
+ * this is unnecessary since the BSP should have all interrupts
+ * disabled when rtems_initialize_executive is invoked. But this keeps
+ * the ISR Disable/Enable calls paired.
+ */
+
+ _ISR_Enable( bsp_level );
+}
+
+/*PAGE
+ *
+ * rtems_shutdown_executive
+ *
+ * This kernel routine shutdowns the executive. It halts multitasking
+ * and returns control to the application execution "thread" which
+ * initialially invoked the rtems_initialize_executive directive.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void rtems_shutdown_executive(
+ unsigned32 result
+)
+{
+ if ( _System_state_Current != SYSTEM_STATE_SHUTDOWN ) {
+ _System_state_Set( SYSTEM_STATE_SHUTDOWN );
+ _Thread_Stop_multitasking();
+ }
+}
diff --git a/cpukit/sapi/src/extension.c b/cpukit/sapi/src/extension.c
new file mode 100644
index 0000000000..10a828213d
--- /dev/null
+++ b/cpukit/sapi/src/extension.c
@@ -0,0 +1,165 @@
+/*
+ * Extension Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/rtems/support.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/extension.h>
+
+/*PAGE
+ *
+ * _Extension_Manager_initialization
+ *
+ * This routine initializes all extension manager related data structures.
+ *
+ * Input parameters:
+ * maximum_extensions - number of extensions to initialize
+ *
+ * Output parameters: NONE
+ */
+
+void _Extension_Manager_initialization(
+ unsigned32 maximum_extensions
+)
+{
+ _Objects_Initialize_information(
+ &_Extension_Information,
+ OBJECTS_RTEMS_EXTENSIONS,
+ FALSE,
+ maximum_extensions,
+ sizeof( Extension_Control ),
+ FALSE,
+ RTEMS_MAXIMUM_NAME_LENGTH,
+ FALSE
+ );
+}
+
+/*PAGE
+ *
+ * rtems_extension_create
+ *
+ * This directive creates a extension and performs some initialization.
+ *
+ * Input parameters:
+ * name - extension name
+ * extension_table - pointer to extension set information
+ * id - pointer to extension id
+ *
+ * Output parameters:
+ * id - extension id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_extension_create(
+ rtems_name name,
+ rtems_extensions_table *extension_table,
+ Objects_Id *id
+)
+{
+ Extension_Control *the_extension;
+
+ if ( !rtems_is_name_valid( name ) )
+ return RTEMS_INVALID_NAME;
+
+ _Thread_Disable_dispatch(); /* to prevent deletion */
+
+ the_extension = _Extension_Allocate();
+
+ if ( !the_extension ) {
+ _Thread_Enable_dispatch();
+ return RTEMS_TOO_MANY;
+ }
+
+ _User_extensions_Add_set( &the_extension->Extension, extension_table );
+
+ _Objects_Open( &_Extension_Information, &the_extension->Object, &name );
+
+ *id = the_extension->Object.id;
+ _Thread_Enable_dispatch();
+ return RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_extension_ident
+ *
+ * This directive returns the system ID associated with
+ * the extension name.
+ *
+ * Input parameters:
+ * name - user defined message queue name
+ * id - pointer to extension id
+ *
+ * Output parameters:
+ * *id - message queue id
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_extension_ident(
+ rtems_name name,
+ Objects_Id *id
+)
+{
+ Objects_Name_to_id_errors status;
+
+ status = _Objects_Name_to_id(
+ &_Extension_Information,
+ &name,
+ OBJECTS_SEARCH_LOCAL_NODE,
+ id
+ );
+
+ return _Status_Object_name_errors_to_status[ status ];
+}
+
+/*PAGE
+ *
+ * rtems_extension_delete
+ *
+ * This directive allows a thread to delete a extension.
+ *
+ * Input parameters:
+ * id - extension id
+ *
+ * Output parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_extension_delete(
+ Objects_Id id
+)
+{
+ Extension_Control *the_extension;
+ Objects_Locations location;
+
+ the_extension = _Extension_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* should never return this */
+ 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_INTERNAL_ERROR; /* unreached - only to remove warnings */
+}
diff --git a/cpukit/sapi/src/fatal.c b/cpukit/sapi/src/fatal.c
new file mode 100644
index 0000000000..534be655e8
--- /dev/null
+++ b/cpukit/sapi/src/fatal.c
@@ -0,0 +1,38 @@
+/*
+ * Fatal Error Manager
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/fatal.h>
+#include <rtems/score/interr.h>
+
+/*PAGE
+ *
+ * rtems_fatal_error_occurred
+ *
+ * This directive will invoke the internal fatal error handler.
+ *
+ * Input parameters:
+ * the_error - fatal error status code
+ *
+ * Output parameters: NONE
+ */
+
+void volatile rtems_fatal_error_occurred(
+ unsigned32 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
new file mode 100644
index 0000000000..f4f1b83c64
--- /dev/null
+++ b/cpukit/sapi/src/io.c
@@ -0,0 +1,345 @@
+/*
+ * Input/Output Manager
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/io.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+
+#include <string.h>
+
+/*PAGE
+ *
+ * _IO_Manager_initialization
+ *
+ */
+
+void _IO_Manager_initialization(
+ rtems_driver_address_table *driver_table,
+ unsigned32 number_of_drivers,
+ unsigned32 number_of_devices
+)
+{
+ void *tmp;
+ unsigned32 index;
+ rtems_driver_name_t *np;
+
+ _IO_Driver_address_table = driver_table;
+ _IO_Number_of_drivers = number_of_drivers;
+ _IO_Number_of_devices = number_of_devices;
+
+ tmp = _Workspace_Allocate_or_fatal_error(
+ sizeof( rtems_driver_name_t ) * ( number_of_devices + 1 )
+ );
+
+ _IO_Driver_name_table = (rtems_driver_name_t *) tmp;
+
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ ) {
+ np->device_name = 0;
+ np->device_name_length = 0;
+ np->major = 0;
+ np->minor = 0;
+ }
+}
+
+/*PAGE
+ *
+ * _IO_Initialize_all_drivers
+ *
+ * This routine initializes all device drivers
+ *
+ * Input Paramters: NONE
+ *
+ * Output Parameters: NONE
+ */
+
+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, NULL);
+}
+
+/*PAGE
+ *
+ * rtems_io_register_name
+ *
+ * Associate a name with a driver
+ *
+ * Input Paramters:
+ * device_name - pointer to name string to associate with device
+ * major - device major number to receive name
+ * minor - device minor number to receive name
+ *
+ * Output Parameters:
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_io_register_name(
+ char *device_name,
+ rtems_device_major_number major,
+ rtems_device_minor_number minor
+ )
+{
+ rtems_driver_name_t *np;
+ unsigned32 level;
+ unsigned32 index;
+
+ /* find an empty slot */
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
+ {
+
+ _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;
+ _ISR_Enable(level);
+
+ return RTEMS_SUCCESSFUL;
+ }
+ _ISR_Enable(level);
+ }
+
+ return RTEMS_TOO_MANY;
+}
+
+/*PAGE
+ *
+ * rtems_io_lookup_name
+ *
+ * Find what driver "owns" this name
+ *
+ * Input Paramters:
+ * name - name to lookup the associated device
+ *
+ * Output Parameters:
+ * device_info - device associate with name
+ * RTEMS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+rtems_status_code rtems_io_lookup_name(
+ const char *name,
+ rtems_driver_name_t **device_info
+)
+{
+ rtems_driver_name_t *np;
+ unsigned32 index;
+
+ for( index=0, np = _IO_Driver_name_table ;
+ index < _IO_Number_of_devices ;
+ index++, np++ )
+ if (np->device_name)
+ if (strncmp(np->device_name, name, np->device_name_length) == 0)
+ {
+ *device_info = np;
+ return RTEMS_SUCCESSFUL;
+ }
+
+ *device_info = 0;
+ return RTEMS_UNSATISFIED;
+}
+
+
+/*PAGE
+ *
+ * rtems_io_initialize
+ *
+ * This routine is the initialization directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].initialization;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_open
+ *
+ * This routine is the open directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].open;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_close
+ *
+ * This routine is the close directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_close(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].close;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_read
+ *
+ * This routine is the read directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].read;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_write
+ *
+ * This routine is the write directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].write;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * rtems_io_control
+ *
+ * This routine is the control directive of the IO manager.
+ *
+ * Input Paramters:
+ * major - device driver number
+ * minor - device number
+ * argument - pointer to argument(s)
+ *
+ * Output Parameters:
+ * returns - return code
+ */
+
+rtems_status_code rtems_io_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *argument
+)
+{
+ rtems_device_driver_entry callout;
+
+ if ( major >= _IO_Number_of_drivers )
+ return RTEMS_INVALID_NUMBER;
+
+ callout = _IO_Driver_address_table[major].control;
+ return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
+}
+
diff --git a/cpukit/sapi/src/posixapi.c b/cpukit/sapi/src/posixapi.c
new file mode 100644
index 0000000000..687ebd2edd
--- /dev/null
+++ b/cpukit/sapi/src/posixapi.c
@@ -0,0 +1,96 @@
+/*
+ * RTEMS API Initialization Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <assert.h>
+
+/*
+ * POSIX_API_INIT is defined so all of the POSIX API
+ * data will be included in this object file.
+ */
+
+#define POSIX_API_INIT
+
+#include <rtems/system.h> /* include this before checking RTEMS_POSIX_API */
+#ifdef RTEMS_POSIX_API
+
+#include <sys/types.h>
+#include <rtems/config.h>
+#include <rtems/score/object.h>
+#include <rtems/posix/cond.h>
+#include <rtems/posix/config.h>
+#include <rtems/posix/key.h>
+#include <rtems/posix/mutex.h>
+#include <rtems/posix/priority.h>
+#include <rtems/posix/psignal.h>
+#include <rtems/posix/pthread.h>
+#include <rtems/posix/time.h>
+
+/*PAGE
+ *
+ * _POSIX_API_Initialize
+ *
+ * XXX
+ */
+
+posix_api_configuration_table _POSIX_Default_configuration = {
+ 0, /* maximum_threads */
+ 0, /* maximum_mutexes */
+ 0, /* maximum_condition_variables */
+ 0, /* maximum_keys */
+ 0, /* maximum_queued_signals */
+ 0, /* number_of_initialization_threads */
+ NULL /* User_initialization_threads_table */
+};
+
+
+void _POSIX_API_Initialize(
+ rtems_configuration_table *configuration_table
+)
+{
+ posix_api_configuration_table *api_configuration;
+
+ /* XXX need to assert here based on size assumptions */
+
+ assert( sizeof(pthread_t) == sizeof(Objects_Id) );
+
+ api_configuration = configuration_table->POSIX_api_configuration;
+ if ( !api_configuration )
+ api_configuration = &_POSIX_Default_configuration;
+
+ _POSIX_signals_Manager_Initialization(
+ api_configuration->maximum_queued_signals
+ );
+
+ _POSIX_Threads_Manager_initialization(
+ api_configuration->maximum_threads,
+ api_configuration->number_of_initialization_threads,
+ api_configuration->User_initialization_threads_table
+ );
+
+ _POSIX_Condition_variables_Manager_initialization(
+ api_configuration->maximum_condition_variables
+ );
+
+ _POSIX_Key_Manager_initialization( api_configuration->maximum_keys );
+
+ _POSIX_Mutex_Manager_initialization(
+ api_configuration->maximum_mutexes
+ );
+
+}
+
+#endif
+/* end of file */
diff --git a/cpukit/sapi/src/rtemsapi.c b/cpukit/sapi/src/rtemsapi.c
new file mode 100644
index 0000000000..7156598835
--- /dev/null
+++ b/cpukit/sapi/src/rtemsapi.c
@@ -0,0 +1,90 @@
+/*
+ * POSIX API Initialization Support
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * RTEMS_API_INIT is defined so all of the RTEMS API
+ * data will be included in this object file.
+ */
+
+#define RTEMS_API_INIT
+
+#include <rtems/system.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/rtemsapi.h>
+
+#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
+)
+{
+ rtems_api_configuration_table *api_configuration;
+
+ api_configuration = configuration_table->RTEMS_api_configuration;
+
+ _Attributes_Handler_initialization();
+
+ _Interrupt_Manager_initialization();
+
+ _Multiprocessing_Manager_initialization();
+
+ _RTEMS_tasks_Manager_initialization(
+ api_configuration->maximum_tasks,
+ api_configuration->number_of_initialization_tasks,
+ api_configuration->User_initialization_tasks_table
+ );
+
+ _Timer_Manager_initialization( api_configuration->maximum_timers );
+
+ _Signal_Manager_initialization();
+
+ _Event_Manager_initialization();
+
+ _Message_queue_Manager_initialization(
+ api_configuration->maximum_message_queues
+ );
+
+ _Semaphore_Manager_initialization( api_configuration->maximum_semaphores );
+
+ _Partition_Manager_initialization( api_configuration->maximum_partitions );
+
+ _Region_Manager_initialization( api_configuration->maximum_regions );
+
+ _Dual_ported_memory_Manager_initialization( api_configuration->maximum_ports);
+
+ _Rate_monotonic_Manager_initialization( api_configuration->maximum_periods );
+}
+
+/* end of file */
diff --git a/cpukit/score/cpu/a29k/amd.ah b/cpukit/score/cpu/a29k/amd.ah
new file mode 100644
index 0000000000..ceef89564a
--- /dev/null
+++ b/cpukit/score/cpu/a29k/amd.ah
@@ -0,0 +1,531 @@
+; /* @(#)amd.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Initialization values for registers after RESET
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+' /* $Id */
+;* File information and includes.
+
+ .file "amd.ah"
+ .ident "@(#)amd.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+
+;
+;* AMD PROCESSOR SPECIFIC VALUES...
+;
+
+;
+;* Processor revision levels...
+;
+
+; PRL values: 31-28 27-24
+; Am29000 0 x
+; Am29005 1 x
+; Am29050 2 x
+; Am29035 3 x
+; Am29030 4 x
+; Am29200 5 x
+; Am29205 5 1x
+; Am29240 6 0
+; Manx 7 0
+; Cougar 8 0
+
+
+ .equ AM29000_PRL, 0x00
+
+ .equ AM29005_PRL, 0x10
+
+ .equ AM29050_PRL, 0x20
+
+ .equ AM29035_PRL, 0x30
+
+ .equ AM29030_PRL, 0x40
+
+ .equ AM29200_PRL, 0x50
+
+ .equ AM29205_PRL, 0x58
+
+ .equ AM29240_PRL, 0x60
+
+ .equ AM29040_PRL, 0x70
+
+ .equ MANX_PRL, 0x70
+
+ .equ COUGAR_PRL, 0x80
+
+;
+;* data structures sizes.
+;
+ .equ CFGINFO_SIZE, 16*4
+
+ .equ PGMINFO_SIZE, 16*4
+
+ .equ VARARGS_SPACE, 16*4
+
+ .equ WINDOWSIZE, 0x80
+;
+;* Am29027 Mode registers
+;
+
+ .equ Am29027Mode1, 0x0fc00820
+
+ .equ Am29027Mode2, 0x00001375
+
+
+
+;* Processor Based Equates and Defines
+
+ .equ SIG_SYNC, -1
+
+ .equ ENABLE, (SM)
+
+ .equ DISABLE, (ENABLE | DI | DA)
+
+ .equ DISABLE_FZ, (FZ | ENABLE | DI | DA)
+
+ .equ CLR_TRAP, (FZ | DA)
+
+ .equ InitOPS, (TD | SM | (3<<IMShift) | DI | DA)
+
+ .equ InitCPS, (TD | SM | (0<<IMShift) | DI | DA)
+
+ .equ InitCPS1, (TD | SM | (0<<IMShift) | DI )
+
+ .equ CPS_TMR, (SM | (0<<IMShift) | DI)
+
+ .equ CPS_INT0, (TD | SM | (0<<IMShift))
+
+ .equ CPS_TMRINT0, (SM | (0<<IMShift))
+
+ .equ InitCFG, 0x0
+
+ .equ InitRBP, (B0|B1|B2|B3|B4|B5)
+
+ .equ TMC_VALUE, 0xFFFFFF
+
+ .equ TMR_VALUE, (IE | TMC_VALUE)
+
+
+
+
+
+
+;* 29205 specific (internal) peripheral initialization constants.
+
+; Current Processor Status (CPS) Register.
+; Old Processor Status Register (OPS).
+
+ .equ DA, 0x00001
+ .equ DI, 0x00002
+ .equ IMShift,0x2
+ .equ SM, 0x00010
+ .equ PI, 0x00020
+ .equ PD, 0x00040
+ .equ WM, 0x00080
+ .equ RE, 0x00100
+ .equ LK, 0x00200
+ .equ FZ, 0x00400
+ .equ TU, 0x00800
+ .equ TP, 0x01000
+ .equ TE, 0x02000
+ .equ IP, 0x04000
+ .equ CA, 0x08000
+ .equ MM, 0x10000
+ .equ TD, 0x20000
+
+; Configuration Register (CFG)
+
+ .equ CD, 0x01
+ .equ CP, 0x02
+ .equ BO, 0x04
+ .equ RV, 0x08
+ .equ VF, 0x10
+ .equ DW, 0x20
+ .equ CO, 0x40
+ .equ EE, 0x80
+ .equ IDShift, 8
+ .equ CFG_ID, 0x100
+ .equ ILShift, 9
+ .equ CFG_ILMask, 0x600
+ .equ DDShift, 11
+ .equ CFG_DD, 0x800
+ .equ DLShift, 12
+ .equ CFG_DLMask, 0x3000
+ .equ PCEShift, 14
+ .equ CFG_PCE, 0x4000
+ .equ PMBShift, 16
+ .equ D16, 0x8000
+ .equ TBOShift, 23
+ .equ PRLShift, 24
+
+; Channel Control Register (CHC)
+
+ .equ CV, 0x1
+ .equ NN, 0x2
+ .equ TRShift, 2
+ .equ TF, 0x400
+ .equ PER, 0x800
+ .equ LA, 0x1000
+ .equ ST, 0x2000
+ .equ ML, 0x4000
+ .equ LS, 0x8000
+ .equ CRShift, 16
+ .equ CNTLShift, 24
+ .equ CEShift, 31
+ .equ WBERShift, 31
+
+; Register Bank Protect (RBP)
+ .equ B0, 0x1
+ .equ B1, 0x2
+ .equ B2, 0x4
+ .equ B3, 0x8
+ .equ B4, 0x10
+ .equ B5, 0x20
+ .equ B6, 0x40
+ .equ B7, 0x80
+ .equ B8, 0x100
+ .equ B9, 0x200
+ .equ B10, 0x400
+ .equ B11, 0x800
+ .equ B12, 0x1000
+ .equ B13, 0x2000
+ .equ B14, 0x4000
+ .equ B15, 0x8000
+
+; Timer Counter
+
+ .equ TCVMask, 0xffffff
+
+; Timer Reload Register
+
+ .equ IE, 0x1000000
+ .equ IN, 0x2000000
+ .equ OV, 0x4000000
+ .equ TRVMAsk, 0xffffff
+
+; MMU Configuration
+
+ .equ PSShift, 8
+ .equ PS0Shift, 8
+ .equ PS1Shift, 12
+
+; LRU Recommendation (LRU)
+ .equ LRUMask, 0xff
+
+; Reason Vector (RSN)
+ .equ RSNMask, 0xff
+
+; Region Mapping Address (RMA0 | RMA1)
+ .equ PBAMask,0xffff
+ .equ VBAShift, 16
+
+; Region Mapping Control (RMC0 | RMC1)
+ .equ TIDMask, 0xff
+ .equ RMC_UE, 0x100
+ .equ RMC_UW, 0x200
+ .equ RMC_UR, 0x400
+ .equ RMC_SE, 0x800
+ .equ RMC_SW, 0x1000
+ .equ RMC_SR, 0x2000
+ .equ RMC_VE, 0x4000
+ .equ RMC_IO, 0x10000
+ .equ RGSShift, 17
+ .equ RMC_PGMShift, 22
+
+; Instruction breakpoint Control (IBC0 | IBC1)
+ .equ BPIDMask, 0xff
+ .equ BTE, 0x100
+ .equ BRM, 0x200
+ .equ IBC_BSY, 0x400
+ .equ BEN, 0x800
+ .equ BHO, 0x1000
+
+; Cache Data Register (CDR)
+ .equ CDR_US, 0x1
+ .equ P, 0x2
+ .equ CDR_V, 0x4
+ .equ IATAGShift, 20
+
+; Cache Interface Register (CIR)
+ .equ CPTRShift, 2
+ .equ CIR_RW, 0x1000000
+ .equ FSELShift, 28
+
+; Indirect Pointer A, B, C (IPA, IPB, IPC)
+ .equ IPShift, 2
+
+; ALU Status (ALU)
+ .equ FCMask, 0x1F
+ .equ BPShift, 5
+ .equ C, 0x80
+ .equ Z, 0x100
+ .equ N, 0x200
+ .equ ALU_V, 0x400
+ .equ DF, 0x800
+
+; Byte Pointer
+ .equ BPMask, 0x3
+
+; Load/Store Count Remaining (CR)
+ .equ CRMask, 0xff
+
+; Floating Point Environment (FPE)
+ .equ NM, 0x1
+ .equ RM, 0x2
+ .equ VM, 0x4
+ .equ UM, 0x8
+ .equ XM, 0x10
+ .equ DM, 0x20
+ .equ FRMShift, 6
+ .equ FF, 0x100
+ .equ ACFShift, 9
+
+; Integer Environment (INTE)
+ .equ MO, 0x1
+ .equ DO, 0x2
+
+; Floating Point Status (FPS)
+ .equ NS, 0x1
+ .equ RS, 0x2
+ .equ VS, 0x4
+ .equ FPS_US, 0x8
+ .equ XS, 0x10
+ .equ DS, 0x20
+ .equ NT, 0x100
+ .equ RT, 0x200
+ .equ VT, 0x400
+ .equ UT, 0x800
+ .equ XT, 0x1000
+ .equ DT, 0x2000
+
+; Exception Opcode (EXOP)
+ .equ IOPMask, 0xff
+
+; TLB Entry Word 0
+; .equ TIDMask, 0xff already defined above
+ .equ TLB_UE, 0x100
+ .equ TLB_UW, 0x200
+ .equ TLB_UR, 0x400
+ .equ TLB_SE, 0x800
+ .equ TLB_SW, 0x1000
+ .equ TLB_SR, 0x2000
+ .equ TLB_VE, 0x4000
+ .equ VTAGShift, 15
+
+; TLB Entry Word 1
+ .equ TLB_IO, 0x1
+ .equ U, 0x2
+ .equ TLB_PGMShift, 6
+ .equ RPNShift, 10
+
+; Am29200 ROM Control bits.
+ .equ RMCT_DW0Shift, 29
+ .equ RMCT_DW1Shift, 21
+ .equ RMCT_DW2Shift, 13
+ .equ RMCT_DW3Shift, 5
+
+; Am29200 DRAM Control bits.
+ .equ DW3, (1<<18)
+ .equ DW2, (1<<22)
+ .equ DW1, (1<<26)
+ .equ DW0, (1<<30)
+
+ ; Internal peripheral address assignments.
+ .equ RMCT, 0x80000000
+ .equ RMCF, 0x80000004
+ .equ DRCT, 0x80000008
+ .equ DRCF, 0x8000000C
+ .equ DRM0, 0x80000010
+ .equ DRM1, 0x80000014
+ .equ DRM2, 0x80000018
+ .equ DRM3, 0x8000001C
+ .equ PIACT0, 0x80000020
+ .equ PIACT1, 0x80000020
+ .equ ICT, 0x80000028
+ .equ DMCT0, 0x80000030
+ .equ DMAD0, 0x80000034
+ .ifdef revA
+ .equ TAD0, 0x80000036
+ .equ TCN0, 0x8000003A
+ .else
+ .equ TAD0, 0x80000070 ; default
+ .equ TCN0, 0x8000003C ; default
+ .endif
+ .equ DMCN0, 0x80000038
+ .equ DMCT1, 0x80000040
+ .equ DMAD1, 0x80000044
+ .equ DMCN1, 0x80000048
+ .equ SPCT, 0x80000080
+ .equ SPST, 0x80000084
+ .equ SPTH, 0x80000088
+ .equ SPRB, 0x8000008C
+ .equ BAUD, 0x80000090
+ .equ PPCT, 0x800000C0
+ .equ PPST, 0x800000C1
+ .equ PPDT, 0x800000C4
+ .equ POCT, 0x800000D0
+ .equ PIN, 0x800000D4
+ .equ POUT, 0x800000D8
+ .equ POEN, 0x800000DC
+ .equ VCT, 0x800000E0
+ .equ TOP, 0x800000E4
+ .equ SIDE, 0x800000E8
+ .equ VDT, 0x800000EC
+
+ ; Interrupt Controller Register bits.
+ .equ TXDI, (1<<5)
+ .equ RXDI, (1<<6)
+ .equ RXSI, (1<<7)
+ .equ PPI, (1<<11)
+ .equ DMA1I, (1<<13)
+ .equ DMA0I, (1<<14)
+ .equ IOPIMask, (0xFF<<16)
+ .equ VDI, (1<<27)
+ .equ ICT200_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+ .equ ICT205_I, (TXDI|RXDI|RXSI|PPI|DMA1I|DMA0I|IOPIMask|VDI)
+
+ ; Serial port Initialization bits
+ .equ NO_PARITY, 0
+
+
+ ; SPST bits
+ .equ THREShift, 22
+
+;* REGISTER Addresses
+
+ .equ ROMCntlRegAddr, 0x80000000
+
+ .equ ROMCfgRegAddr, 0x80000004
+
+ .equ DRAMCntlRegAddr, 0x80000008
+
+ .equ DRAMCfgRegAddr, 0x8000000C
+
+ .equ DRAMMap0RegAddr, 0x80000010
+
+ .equ DRAMMap1RegAddr, 0x80000014
+
+ .equ DRAMMap2RegAddr, 0x80000018
+
+ .equ DRAMMap3RegAddr, 0x8000001C
+
+ .equ PIACntl0RegAddr, 0x80000020
+
+ .equ PIACntl1RegAddr, 0x80000024
+
+ .equ INTRCntlRegAddr, 0x80000028
+
+ .equ DMACntl0RegAddr, 0x80000030
+
+ .equ DMACntl1RegAddr, 0x80000040
+
+ .equ SERPortCntlRegAddr, 0x80000080
+
+ .equ SERPortStatRegAddr, 0x80000084
+
+ .equ SERPortTHLDRegAddr, 0x80000088
+
+ .equ SERPortRbufRegAddr, 0x8000008C
+
+ .equ SERPortBaudRegAddr, 0x80000090
+
+ .equ PARPortCntlRegAddr, 0x800000C0
+
+ .equ PIOCntlRegAddr, 0x800000D0
+
+ .equ PIOInpRegAddr, 0x800000D4
+
+ .equ PIOOutRegAddr, 0x800000D8
+
+ .equ PIOOutEnaRegAddr, 0x800000DC
+
+ .equ VCTCntlRegAddr, 0x800000E0
+
+;
+;* Control constants
+;
+
+;* AM29030 Timer related constants.
+
+ .equ TMR_IE, 0x01000000
+
+ .equ TMR_IN, 0x02000000
+
+ .equ TMR_OV, 0x04000000
+
+ .equ TMC_INITCNT, 1613
+
+;
+;* System initialization values.
+;
+
+ .equ __os_version, 0x0001 ;
+
+ .equ STACKSize, 0x8000 ;
+
+ .equ PGMExecMode, 0x0000 ;
+
+ .equ TSTCK_OFST, 28 * 4
+
+ .equ CSTCK_OFST, 29 * 4
+
+ .equ TMSTCK_OFST, 30 * 4
+
+ .equ CMSTCK_OFST, 31 * 4
+
+ .equ CTXSW_OK, 0xA55A ; ctx switch ok
+
+ .set NV_STARTOFST, 0x20 ; 32 bytes
+
+ .set NV_BAUDOFST, 0x00 ; 00 bytes
+
+ .set reg_cir, 29
+
+ .set reg_cdr, 30
+
+ .equ MSG_BUFSIZE, 0x1000 ; serial buffer size
+
+ .equ ILLOPTRAP, 0
+
+ .equ UATRAP, 1
+
+ .equ PVTRAP, 5
+
+ .equ UITLBMISSTRAP, 8
+
+ .equ UDTLBMISSTRAP, 9
+
+ .equ TIMERTRAP, 14
+
+ .equ TRACETRAP, 15
+
+ .equ XLINXTRAP, 16
+
+ .equ SERIALTRAP, 17
+
+ .equ SLOWTMRTRAP, 18
+
+ .equ PORTTRAP, 19
+
+ .equ SVSCTRAP, 80
+
+ .equ SVSCTRAP1, 81
+
+ .equ V_CACHETRAP, 66 ;
+
+ .equ V_SETSERVICE, 67 ;
+
+ .equ INIT_TIMER, 100
+
+ .equ DISABLE_TIMER, 101
+
+ .equ GET_TIMER, 102
+
+ .equ CLEAR_TIMER, 103
+
+ .equ V_SPILL, 64
+
+ .equ V_FILL, 65
+
+ .equ SIGDFL, 105
diff --git a/cpukit/score/cpu/a29k/asm.h b/cpukit/score/cpu/a29k/asm.h
new file mode 100644
index 0000000000..5622b124ce
--- /dev/null
+++ b/cpukit/score/cpu/a29k/asm.h
@@ -0,0 +1,103 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * !!! THIS FILE DOES NOT APPEAR TO HAVE BEEN USED IN THE 29K PORT !!!
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1989-1997
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __A29K_ASM_h
+#define __A29K_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/asm.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/a29k/cpu.c b/cpukit/score/cpu/a29k/cpu.c
new file mode 100644
index 0000000000..df626a6371
--- /dev/null
+++ b/cpukit/score/cpu/a29k/cpu.c
@@ -0,0 +1,263 @@
+/*
+ * AMD 29K CPU Dependent Source
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+#ifndef lint
+static char _sccsid[] = "@(#)cpu.c 10/21/96 1.8\n";
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/thread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+void a29k_ISR_Handler(unsigned32 vector);
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch)() /* ignored on this CPU */
+)
+{
+ unsigned int i;
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+
+ for ( i = 0; i < ISR_NUMBER_OF_VECTORS; i++ )
+ {
+ _ISR_Vector_table[i] = (proc_ptr)NULL;
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 cps;
+
+ /*
+ * This routine returns the current interrupt level.
+ */
+ cps = a29k_getops();
+ if (cps & (TD|DI))
+ return 1;
+ else
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+extern void intr14( void );
+extern void intr18( void );
+extern void intr19( void );
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+ switch( vector )
+ {
+ case 14:
+ _settrap( vector, intr14 );
+ break;
+ case 18:
+ _settrap( vector, intr18 );
+ break;
+ case 19:
+ _settrap( vector, intr19 );
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, new_handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+void _CPU_Internal_threads_Idle_thread_body( void )
+{
+
+ for( ; ; )
+ {
+ }
+ /* insert your "halt" instruction here */ ;
+}
+
+void a29k_fatal_error( unsigned32 error )
+{
+ printf("\n\nfatal error %d, rebooting!!!\n",error );
+ exit(error);
+}
+
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ */
+
+void a29k_ISR_Handler(unsigned32 vector)
+{
+ _ISR_Nest_level++;
+ _Thread_Dispatch_disable_level++;
+ if ( _ISR_Vector_table[ vector ] )
+ (*_ISR_Vector_table[ vector ])( vector );
+ --_Thread_Dispatch_disable_level;
+ --_ISR_Nest_level;
+ if ( !_Thread_Dispatch_disable_level && !_ISR_Nest_level &&
+ (_Context_Switch_necessary || _ISR_Signals_to_thread_executing ))
+ _Thread_Dispatch();
+ return;
+}
diff --git a/cpukit/score/cpu/a29k/pswmacro.ah b/cpukit/score/cpu/a29k/pswmacro.ah
new file mode 100644
index 0000000000..c21eee4f35
--- /dev/null
+++ b/cpukit/score/cpu/a29k/pswmacro.ah
@@ -0,0 +1,442 @@
+; /* @(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; macros: Do_install and init_TLB
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; /* $Id$ */
+
+;* File information and includes.
+
+ .file "macro.ah"
+ .ident "@(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI"
+
+
+ .macro CONST32, RegName, RegValue
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endm
+
+ .macro CONSTX, RegName, RegValue
+ .if (RegValue) <= 0x0000ffff
+ const RegName, RegValue
+ .else
+ const RegName, RegValue
+ consth RegName, RegValue
+ .endif
+ .endm
+
+ .macro PRODEV, RegName
+ srl RegName, RegName, 24
+ .endm
+
+;
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+;
+
+;* Assumes vector table address in v0
+
+ .macro _setvec, trapnum, trapaddr
+ mfsr v0, vab ;
+ const v2, trapnum ;
+ sll v1, v2, 2 ;
+ add v1, v1, v0 ; v0 has location of vector tab
+
+ const v2, trapaddr ;
+ consth v2, trapaddr ;
+ store 0, 0, v2, v1 ;
+ nop ;
+ .endm
+
+ .macro syscall, name
+ const tav, HIF_@name ;
+ asneq V_SYSCALL, gr1, gr1 ;
+ nop ;
+ nop ;
+ .endm
+
+
+
+;* MACRO TO INSTALL VECTOR TABLE ENTRIES
+
+ .macro Do_Install, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_Install
+ nop
+ .endm
+
+ .macro Do_InstallX, V_Number, V_Address
+ const lr4, V_Address
+ consth lr4, V_Address
+ const lr3, V_Number * 4
+ consth lr3, V_Number * 4
+ call lr0, V_InstallX
+ nop
+ .endm
+
+
+
+; push a register onto the stack
+ .macro pushreg, reg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ store 0, 0, reg, sp ; push register
+ .endm
+
+ .macro push, sp, reg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop the register from stack
+ .macro popreg, reg, sp
+ load 0, 0, reg, sp ; pop register
+ add sp, sp, 4 ; adjust stack pointer
+ .endm
+ .macro pop, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ .endm
+
+; push a special register onto stack
+ .macro pushspcl, spcl, tmpreg, sp
+ sub sp, sp, 4 ; adjust stack pointer
+ mfsr tmpreg, spcl ; get spcl reg
+ store 0, 0, tmpreg, sp ; push onto stack
+ .endm
+
+ .macro pushsr, sp, reg, sreg
+ mfsr reg, sreg
+ sub sp, sp, 4
+ store 0, 0, reg, sp
+ .endm
+
+; pop a special register from stack
+ .macro popspcl, spcl, tmpreg, sp
+ load 0, 0, tmpreg, sp ; pop from stack
+ add sp, sp, 4 ; adjust stack pointer
+ mtsr spcl, tmpreg ; set spcl reg
+ .endm
+
+ .macro popsr, sreg, reg, sp
+ load 0, 0, reg, sp
+ add sp, sp, 4
+ mtsr sreg, reg
+ .endm
+
+;
+; save freeze mode registers on memory stack.
+;
+
+ .macro SaveFZState, tmp1, tmp2
+
+ ; save freeze mode registers.
+
+ pushspcl pc0, tmp1, msp
+ pushspcl pc1, tmp1, msp
+ pushspcl alu, tmp1, msp
+
+ pushspcl cha, tmp1, msp
+ pushspcl chd, tmp1, msp
+ pushspcl chc, tmp1, msp
+
+ pushspcl ops, tmp1, msp
+
+ ; turn freeze off
+
+ const tmp2, FZ
+ mfsr tmp1, cps
+ andn tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+ .endm
+
+; restore freeze mode registers from memory stack.
+
+ .macro RestoreFZState, tmp1, tmp2
+
+ ; turn freeze on
+
+ const tmp2, (FZ|DI|DA)
+ mfsr tmp1, cps
+ or tmp1, tmp1, tmp2
+ mtsr cps, tmp1
+
+ ; restore freeze mode registers.
+
+ popspcl ops, tmp1, msp
+ popspcl chc, tmp1, msp
+ popspcl chd, tmp1, msp
+ popspcl cha, tmp1, msp
+ popspcl alu, tmp1, msp
+ popspcl pc1, tmp1, msp
+ popspcl pc0, tmp1, msp
+ .endm
+
+;
+;*
+;
+ .equ WS, 512 ; window size
+ .equ RALLOC, 4 * 4 ; stack alloc for C
+ .equ SIGCTX_UM_SIZE, 40 * 4 ;
+ .equ SIGCTX_RFB, (38) * 4 ; user mode saved
+ .equ SIGCTX_SM_SIZE, 12 * 4 ;
+ .equ SIGCTX_SIG, (11)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_GR1, (10)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_RAB, (9)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC0, (8)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC1, (7)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_PC2, (6)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_CHC, (3)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_OPS, (1)*4 + SIGCTX_UM_SIZE ;
+ .equ SIGCTX_TAV, (0)*4 + SIGCTX_UM_SIZE ;
+
+ .macro sup_sv
+ add it2, trapreg, 0 ; transfer signal #
+ sub msp, msp, 4 ;
+ store 0, 0, it2, msp ; save signal number
+ sub msp, msp, 4 ; push gr1
+
+ store 0, 0, gr1, msp ;
+ sub msp, msp, 4 ; push rab
+ store 0, 0, rab, msp ;
+ const it0, WS ; Window size
+
+ sub rab, rfb, it0 ; set rab = rfb-512
+ pushsr msp, it0, PC0 ; save program counter0
+ pushsr msp, it0, PC1 ; save program counter1
+ pushsr msp, it0, PC2 ; save program counter2
+
+ pushsr msp, it0, CHA ; save channel address
+ pushsr msp, it0, CHD ; save channel data
+ pushsr msp, it0, CHC ; save channel control
+ pushsr msp, it0, ALU ; save alu
+
+ pushsr msp, it0, OPS ; save ops
+ sub msp, msp, 4 ;
+ store 0, 0, tav, msp ; push tav
+ mtsrim chc, 0 ; no loadm/storem
+
+ mfsr it0, ops ; get ops value
+ const it1, (TD | DI) ; disable interrupts
+ consth it1, (TD | DI) ; disable interrupts
+ or it0, it0, it1 ; set bits
+
+ mtsr ops, it0 ; set new ops
+ const it0, _sigcode ; signal handler
+ consth it0, _sigcode ; signal handler
+ mtsr pc1, it0 ; store pc1
+
+ add it1, it0, 4 ; next addr
+ mtsr pc0, it1 ; store pc1 location
+ iret ; return
+ nop ; ALIGN
+ .endm
+
+ .macro sig_return
+ mfsr it0, cps ; get processor status
+ const it1, FZ|DA ; Freeze + traps disable
+ or it0, it0, it1 ; to set FZ+DA
+ mtsr cps, it0 ; in freeze mode
+
+ load 0, 0, tav, msp ; restore tav
+ add msp, msp, 4 ;
+
+ popsr OPS,it0, msp ;
+ popsr ALU,it0, msp ;
+ popsr CHC,it0, msp ;
+ popsr CHD,it0, msp ;
+
+ popsr CHA,it0, msp ;
+ popsr PC2,it0, msp ;
+ popsr PC1,it0, msp ;
+ popsr PC0,it0, msp ;
+
+ load 0, 0, rab, msp ;
+ add msp, msp, 4 ;
+ load 0, 0, it0, msp ;
+ add gr1, it0, 0 ; pop rsp
+
+ add msp, msp, 8 ; discount signal #
+ iret
+ .endm
+
+ .macro repair_R_stack
+ add v0, msp, SIGCTX_GR1 ; interrupted gr1
+ load 0, 0, v2, v0 ;
+ add v0, msp, SIGCTX_RFB ;
+ load 0, 0, v3, v0 ; interupted rfb
+
+ const v1, WS ;
+ sub v1, v3, v1 ; rfb-512
+ cpltu v0, v2, v1 ; test gr1 < rfb-512
+ jmpf v0, $1 ;
+
+ add gr1, rab, 0 ;
+ add v2, v1, 0 ; set LB = rfb-512
+$1:
+;* if gr1 < rfb-512 yes LB = rfb-512 signalled during spill
+;* if no, LB=gr1 interrupted cache < 126 registers
+ cpleu v0, v2, rfb ; test LB<=rfb
+ jmpf v0, $2 ;
+ nop ;
+ add v2, rfb, 0 ;
+$2:
+ cpeq v0, v3, rfb ; fill rfb->'rfb
+ jmpt v0, $3 ; if rfb==rfb'
+ const tav, (0x80<<2) ; prepare for fill
+ or tav, tav, v2 ;
+
+ mtsr IPA, tav ; IPA=LA<<2
+ sub tav, v3, gr98 ; cache fill LA->rfb
+ srl tav, tav, 2 ; convert to words
+ sub tav, tav, 1 ;
+
+ mtsr cr, tav ;
+ loadm 0, 0, gr0, v2 ; fill from LA->rfb
+$3:
+ add rfb, v3, 0 ; move rfb upto 'rfb
+ sub rab, v1, 0 ; assign rab to rfb-512
+
+ add v0, msp, SIGCTX_GR1 ;
+ load 0, 0, v2, v0 ; v0 = interrupted gr1
+ add gr1, v2, 0 ; move gr1 upto 'gr1
+ nop ;
+ .endm
+
+ .macro repair_regs
+ mtsrim cr, 29 - 1 ; to restore locals
+ loadm 0, 0, v0, msp ;
+ add msp, msp, 29*4 ;
+ popsr Q, tav, msp ;
+
+ popsr IPC, tav, msp ;
+ popsr IPB, tav, msp ;
+ popsr IPA, tav, msp ;
+ pop FPStat3, msp ; floating point regs
+
+ pop FPStat2, msp ; floating point regs
+ pop FPStat1, msp ; floating point regs
+ pop FPStat0, msp ; floating point regs
+
+ add msp, msp, 3*4 ; R-stack repaired
+ .endm
+
+;
+;*HIF related...
+;
+
+
+
+
+; send the message in bufaddr to Montip.
+ .macro SendMessageToMontip, bufaddr
+ const lr2, bufaddr
+$1:
+ call lr0, _msg_send
+ consth lr2, bufaddr
+ cpeq gr96, gr96, 0
+ jmpf gr96, $1
+ const lr2, bufaddr
+ .endm
+
+; build a HIF_CALL message in bufaddr to send to montip.
+ .macro BuildHIFCALLMsg, bufaddr, tmp1, tmp2
+ const tmp1, bufaddr
+ consth tmp1, bufaddr
+ const tmp2, HIF_CALL_MSGCODE
+ store 0, 0, tmp2, tmp1 ; msg code
+ add tmp1, tmp1, 4
+ const tmp2, HIF_CALL_MSGLEN
+ store 0, 0, tmp2, tmp1 ; msg len
+ add tmp1, tmp1, 4
+ store 0, 0, gr121, tmp1 ; service number
+ add tmp1, tmp1, 4
+ store 0, 0, lr2, tmp1 ; lr2
+ add tmp1, tmp1, 4
+ store 0, 0, lr3, tmp1 ; lr3
+ add tmp1, tmp1, 4
+ store 0, 0, lr4, tmp1 ; lr4
+ .endm
+
+;
+;*
+;* All the funky AMD style macros go in here...simply for
+;* compatility
+;
+;
+ .macro IMPORT, symbol
+ .extern symbol
+ .endm
+
+ .macro GLOBAL, symbol
+ .global symbol
+ .endm
+
+ .macro USESECT, name, type
+ .sect name, type
+ .use name
+ .endm
+
+ .macro SECTION, name, type
+ .sect name, type
+ .endm
+
+ .macro FUNC, fname, lineno
+ .global fname
+fname:
+ .endm
+
+ .macro ENDFUNC, fname, lineno
+ .endm
+
+;*************************************LONG
+ .macro LONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************UNSIGNED LONG
+ .macro ULONG, varname
+varname:
+ .block 4
+ .endm
+
+;*************************************SHORT
+ .macro SHORT, varname
+varname:
+ .block 2
+ .endm
+
+;*************************************CHAR
+ .macro CHAR, varname
+varname:
+ .block 1
+ .endm
+
+;*************************************LONGARRAY
+ .macro LONGARRAY, name, count
+name:
+ .block count*4
+ .endm
+
+;*************************************SHORTARRAY
+
+ .macro SHORTARRAY, name, count
+name:
+ .block count*2
+ .endm
+
+;*************************************CHARARRAY
+
+ .macro CHARARRAY, name, count
+name:
+ .block count
+ .endm
+
+
+;*************************************VOID_FPTR
+
+ .macro VOID_FPTR, name
+name:
+ .block 4
+ .endm
diff --git a/cpukit/score/cpu/hppa1.1/cpu.c b/cpukit/score/cpu/hppa1.1/cpu.c
new file mode 100644
index 0000000000..49a7267ce6
--- /dev/null
+++ b/cpukit/score/cpu/hppa1.1/cpu.c
@@ -0,0 +1,184 @@
+/*
+ * HP PA-RISC Dependent Source
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+void hppa_cpu_halt(unsigned32 the_error);
+
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is unsupported. For HPPA this function is handled by BSP
+ */
+
+ _CPU_Fatal_halt( 0xdeaddead );
+}
+
+
+
+/*
+ * This is the default handler which is called if
+ * _CPU_ISR_install_vector() has not been called for the
+ * specified vector. It simply forwards onto the spurious
+ * handler defined in the cpu-table.
+ */
+
+static ISR_Handler
+hppa_interrupt_report_spurious(ISR_Vector_number vector,
+ void* rtems_isr_frame) /* HPPA extension */
+{
+
+ /*
+ * If the CPU table defines a spurious_handler, then
+ * call it. If the handler returns halt.
+ */
+ if ( _CPU_Table.spurious_handler )
+ _CPU_Table.spurious_handler(vector, rtems_isr_frame);
+
+ hppa_cpu_halt(vector);
+}
+
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level(void)
+{
+ int level;
+ HPPA_ASM_SSM(0, level); /* change no bits; just get copy */
+ if (level & HPPA_PSW_I)
+ return 0;
+ return 1;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector. The handler is a C callable routine.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[vector];
+
+ _ISR_Vector_table[vector] = new_handler;
+}
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ *
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ register unsigned8 *fp_context;
+ unsigned32 i;
+ proc_ptr old_handler;
+
+ /*
+ * This is the default fp context for all tasks
+ * Set it up so that denormalized results go to zero.
+ */
+
+ fp_context = (unsigned8*) &_CPU_Null_fp_context;
+ for (i=0 ; i<sizeof(Context_Control_fp); i++)
+ *fp_context++ = 0;
+ *((unsigned32 *) &_CPU_Null_fp_context) = HPPA_FPSTATUS_D;
+
+ /*
+ * Save r27 into _CPU_Default_gr27 so it will hopefully be the correct
+ * global data pointer for the entire system.
+ */
+
+ asm volatile( "stw %%r27,%0" : "=m" (_CPU_Default_gr27): );
+
+ /*
+ * Init the 2nd level interrupt handlers
+ */
+
+ for (i=0; i < CPU_INTERRUPT_NUMBER_OF_VECTORS; i++)
+ _CPU_ISR_install_vector(i,
+ hppa_interrupt_report_spurious,
+ &old_handler);
+
+ _CPU_Table = *cpu_table;
+
+}
+
+
+/*
+ * Halt the system.
+ * Called by the _CPU_Fatal_halt macro
+ *
+ * XXX
+ * Later on, this will allow us to return to the prom.
+ * For now, we just ignore 'type_of_halt'
+ *
+ * XXX
+ * NOTE: for gcc, this function must be at the bottom
+ * of the file, that is because if it is at the top
+ * of the file, gcc will inline it's calls. Since
+ * the function uses the HPPA_ASM_LABEL() macro, when
+ * gcc inlines it, you get two definitions of the same
+ * label name, which is an assembly error.
+ */
+
+
+void
+hppa_cpu_halt(unsigned32 the_error)
+{
+ unsigned32 isrlevel;
+
+ _CPU_ISR_Disable(isrlevel);
+
+ /*
+ * XXXXX NOTE: This label is only needed that that when
+ * the simulator stops, it shows the label name specified
+ */
+ HPPA_ASM_LABEL("_hppa_cpu_halt");
+ HPPA_ASM_BREAK(0, 0);
+}
+
diff --git a/cpukit/score/cpu/i386/asm.h b/cpukit/score/cpu/i386/asm.h
new file mode 100644
index 0000000000..aff04bded3
--- /dev/null
+++ b/cpukit/score/cpu/i386/asm.h
@@ -0,0 +1,143 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __i386_ASM_h
+#define __i386_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/i386.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+/*
+ * Go32 suffers the same bug as __REGISTER_PREFIX__
+ */
+
+#if __GO32__
+#undef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+/*
+ * Looks like there is a bug in gcc 2.6.2 where this is not
+ * defined correctly when configured as i386-coff and
+ * i386-aout.
+ */
+
+#undef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__ %
+
+/*
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+*/
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define eax REG (eax)
+#define ebx REG (ebx)
+#define ecx REG (ecx)
+#define edx REG (edx)
+#define esi REG (esi)
+#define edi REG (edi)
+#define esp REG (esp)
+#define ebp REG (ebp)
+
+#define ax REG (ax)
+#define bx REG (bx)
+#define cx REG (cx)
+#define dx REG (dx)
+#define si REG (si)
+#define di REG (di)
+#define sp REG (sp)
+#define bp REG (bp)
+
+#define ah REG (ah)
+#define al REG (al)
+
+#define cs REG (cs)
+#define ds REG (ds)
+#define es REG (es)
+#define fs REG (fs)
+#define gs REG (gs)
+#define ss REG (ss)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/i386/cpu.c b/cpukit/score/cpu/i386/cpu.c
new file mode 100644
index 0000000000..c7f8ff2477
--- /dev/null
+++ b/cpukit/score/cpu/i386/cpu.c
@@ -0,0 +1,177 @@
+/*
+ * Intel i386 Dependent Source
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ register unsigned16 fp_status asm ("ax");
+ register void *fp_context;
+
+ _CPU_Table = *cpu_table;
+
+ /*
+ * The following code saves a NULL i387 context which is given
+ * to each task at start and restart time. The following code
+ * is based upon that provided in the i386 Programmer's
+ * Manual and should work on any coprocessor greater than
+ * the i80287.
+ *
+ * NOTE: The NO RTEMS_WAIT form of the coprocessor instructions
+ * MUST be used in case there is not a coprocessor
+ * to wait for.
+ */
+
+ fp_status = 0xa5a5;
+ asm volatile( "fninit" );
+ asm volatile( "fnstsw %0" : "=a" (fp_status) : "0" (fp_status) );
+
+ if ( fp_status == 0 ) {
+
+ fp_context = &_CPU_Null_fp_context;
+
+ asm volatile( "fsave (%0)" : "=r" (fp_context)
+ : "0" (fp_context)
+ );
+ }
+}
+
+/*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
+ */
+
+#if __GO32__
+#include <go32.h>
+#include <dpmi.h>
+#endif /* __GO32__ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+#if __GO32__
+ _go32_dpmi_seginfo handler_info;
+
+ /* get the address of the old handler */
+ _go32_dpmi_get_protected_mode_interrupt_vector( vector, &handler_info);
+
+ /* Notice how we're failing to save the pm_segment portion of the */
+ /* structure here? That means we might crash the system if we */
+ /* try to restore the ISR. Can't fix this until i386_isr is */
+ /* redefined. XXX [BHC]. */
+ *old_handler = (proc_ptr *) handler_info.pm_offset;
+
+ handler_info.pm_offset = (u_long) new_handler;
+ handler_info.pm_selector = _go32_my_cs();
+
+ /* install the IDT entry */
+ _go32_dpmi_set_protected_mode_interrupt_vector( vector, &handler_info );
+#else
+ i386_IDT_slot idt;
+ unsigned32 handler;
+
+ *old_handler = 0; /* XXX not supported */
+
+ handler = (unsigned32) new_handler;
+
+ /* build the IDT entry */
+ idt.offset_0_15 = handler & 0xffff;
+ idt.segment_selector = i386_get_cs();
+ idt.reserved = 0x00;
+ idt.p_dpl = 0x8e; /* present, ISR */
+ idt.offset_16_31 = handler >> 16;
+
+ /* install the IDT entry */
+ i386_Install_idt(
+ (unsigned32) &idt,
+ _CPU_Table.interrupt_table_segment,
+ (unsigned32) _CPU_Table.interrupt_table_offset + (8 * vector)
+ );
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _ISR_Handler_0(), _ISR_Handler_1();
+
+#define PER_ISR_ENTRY \
+ (((unsigned32) _ISR_Handler_1 - (unsigned32) _ISR_Handler_0))
+
+#define _Interrupt_Handler_entry( _vector ) \
+ (((unsigned32)_ISR_Handler_0) + ((_vector) * PER_ISR_ENTRY))
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr ignored;
+ unsigned32 unique_handler;
+
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /* calculate the unique entry point for this vector */
+ unique_handler = _Interrupt_Handler_entry( vector );
+
+ _CPU_ISR_install_raw_handler( vector, (void *)unique_handler, &ignored );
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
diff --git a/cpukit/score/cpu/i386/rtems/asm.h b/cpukit/score/cpu/i386/rtems/asm.h
new file mode 100644
index 0000000000..aff04bded3
--- /dev/null
+++ b/cpukit/score/cpu/i386/rtems/asm.h
@@ -0,0 +1,143 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __i386_ASM_h
+#define __i386_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/i386.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+/*
+ * Go32 suffers the same bug as __REGISTER_PREFIX__
+ */
+
+#if __GO32__
+#undef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+/*
+ * Looks like there is a bug in gcc 2.6.2 where this is not
+ * defined correctly when configured as i386-coff and
+ * i386-aout.
+ */
+
+#undef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__ %
+
+/*
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+*/
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define eax REG (eax)
+#define ebx REG (ebx)
+#define ecx REG (ecx)
+#define edx REG (edx)
+#define esi REG (esi)
+#define edi REG (edi)
+#define esp REG (esp)
+#define ebp REG (ebp)
+
+#define ax REG (ax)
+#define bx REG (bx)
+#define cx REG (cx)
+#define dx REG (dx)
+#define si REG (si)
+#define di REG (di)
+#define sp REG (sp)
+#define bp REG (bp)
+
+#define ah REG (ah)
+#define al REG (al)
+
+#define cs REG (cs)
+#define ds REG (ds)
+#define es REG (es)
+#define fs REG (fs)
+#define gs REG (gs)
+#define ss REG (ss)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/i960/asm.h b/cpukit/score/cpu/i960/asm.h
new file mode 100644
index 0000000000..a9a0788925
--- /dev/null
+++ b/cpukit/score/cpu/i960/asm.h
@@ -0,0 +1,110 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __i960_ASM_h
+#define __i960_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/i960.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define g0 REG (g0)
+#define g1 REG (g1)
+#define g2 REG (g2)
+#define g3 REG (g3)
+#define g4 REG (g4)
+#define g5 REG (g5)
+#define g6 REG (g6)
+#define g7 REG (g7)
+#define g8 REG (g8)
+#define g9 REG (g9)
+#define g10 REG (g10)
+#define g11 REG (g11)
+#define g12 REG (g12)
+#define g13 REG (g13)
+#define g14 REG (g14)
+#define g15 REG (g15)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/cpu/i960/cpu.c b/cpukit/score/cpu/i960/cpu.c
new file mode 100644
index 0000000000..6a3cf6595c
--- /dev/null
+++ b/cpukit/score/cpu/i960/cpu.c
@@ -0,0 +1,155 @@
+/*
+ * Intel i960CA Dependent Source
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#if defined(__i960CA__) || defined(__i960_CA__) || defined(__i960CA)
+#else
+#warning "*** ENTIRE FILE IMPLEMENTED & TESTED FOR CA ONLY ***"
+#warning "*** THIS FILE WILL NOT COMPILE ON ANOTHER FAMILY MEMBER ***"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ *
+ * OUTPUT PARAMETERS: NONE
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+
+ _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
+ */
+
+#define _Is_vector_caching_enabled( _prcb ) \
+ ((_prcb)->control_tbl->icon & 0x2000)
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ i960ca_PRCB *prcb = _CPU_Table.Prcb;
+ proc_ptr *cached_intr_tbl = NULL;
+
+ /* The i80960CA does not support vectors 0-7. The first 9 entries
+ * in the Interrupt Table are used to manage pending interrupts.
+ * Thus vector 8, the first valid vector number, is actually in
+ * slot 9 in the table.
+ */
+
+ *old_handler = prcb->intr_tbl[ vector + 1 ];
+
+ prcb->intr_tbl[ vector + 1 ] = new_handler;
+
+ if ( _Is_vector_caching_enabled( prcb ) )
+ if ( (vector & 0xf) == 0x2 ) /* cacheable? */
+ cached_intr_tbl[ vector >> 4 ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU__ISR_install_vector
+ *
+ * Install the RTEMS vector wrapper in the CPU's interrupt table.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr ignored;
+
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored );
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+#define soft_reset( prcb ) \
+ { register i960ca_PRCB *_prcb = (prcb); \
+ register unsigned32 *_next=0; \
+ register unsigned32 _cmd = 0x30000; \
+ asm volatile( "lda next,%1; \
+ sysctl %0,%1,%2; \
+ next: mov g0,g0" \
+ : "=d" (_cmd), "=d" (_next), "=d" (_prcb) \
+ : "0" (_cmd), "1" (_next), "2" (_prcb) ); \
+ }
+
+void _CPU_Install_interrupt_stack( void )
+{
+ i960ca_PRCB *prcb = _CPU_Table.Prcb;
+ unsigned32 level;
+
+ /*
+ * Set the Interrupt Stack in the PRCB and force a reload of it.
+ * Interrupts are disabled for safety.
+ */
+
+ _CPU_ISR_Disable( level );
+
+ prcb->intr_stack = _CPU_Interrupt_stack_low;
+
+ soft_reset( prcb );
+
+ _CPU_ISR_Enable( level );
+}
diff --git a/cpukit/score/cpu/m68k/asm.h b/cpukit/score/cpu/m68k/asm.h
new file mode 100644
index 0000000000..2f63ddee53
--- /dev/null
+++ b/cpukit/score/cpu/m68k/asm.h
@@ -0,0 +1,132 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __M68k_ASM_h
+#define __M68k_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define d0 REG (d0)
+#define d1 REG (d1)
+#define d2 REG (d2)
+#define d3 REG (d3)
+#define d4 REG (d4)
+#define d5 REG (d5)
+#define d6 REG (d6)
+#define d7 REG (d7)
+#define a0 REG (a0)
+#define a1 REG (a1)
+#define a2 REG (a2)
+#define a3 REG (a3)
+#define a4 REG (a4)
+#define a5 REG (a5)
+#define a6 REG (a6)
+#define a7 REG (a7)
+
+#define msp REG (msp)
+#define usp REG (usp)
+#define isp REG (isp)
+#define sr REG (sr)
+#define vbr REG (vbr)
+#define dfc REG (dfc)
+
+#define fp0 REG (fp0)
+#define fp1 REG (fp1)
+#define fp2 REG (fp2)
+#define fp3 REG (fp3)
+#define fp4 REG (fp4)
+#define fp5 REG (fp5)
+#define fp6 REG (fp6)
+#define fp7 REG (fp7)
+
+#define fpc REG (fpc)
+#define fpi REG (fpi)
+#define fps REG (fps)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/m68k/cpu.c b/cpukit/score/cpu/m68k/cpu.c
new file mode 100644
index 0000000000..01fbabd957
--- /dev/null
+++ b/cpukit/score/cpu/m68k/cpu.c
@@ -0,0 +1,179 @@
+/*
+ * Motorola MC68xxx Dependent Source
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - entry pointer to thread dispatcher
+ *
+ * OUTPUT PARAMETERS: NONE
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+#if ( M68K_HAS_VBR == 0 )
+ /* fill the isr redirect table with the code to place the format/id
+ onto the stack */
+
+ unsigned32 slot;
+
+ for (slot = 0; slot < CPU_INTERRUPT_NUMBER_OF_VECTORS; slot++)
+ {
+ _CPU_ISR_jump_table[slot].move_a7 = M68K_MOVE_A7;
+ _CPU_ISR_jump_table[slot].format_id = slot << 2;
+ _CPU_ISR_jump_table[slot].jmp = M68K_JMP;
+ _CPU_ISR_jump_table[slot].isr_handler = (unsigned32) 0xDEADDEAD;
+ }
+#endif /* M68K_HAS_VBR */
+
+ _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
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr *interrupt_table = NULL;
+
+#if (M68K_HAS_FPSP_PACKAGE == 1)
+ /*
+ * If this vector being installed is one related to FP, then the
+ * FPSP will install the handler itself and handle it completely
+ * with no intervention from RTEMS.
+ */
+
+ if (*_FPSP_install_raw_handler &&
+ (*_FPSP_install_raw_handler)(vector, new_handler, *old_handler))
+ return;
+#endif
+
+
+ /*
+ * On CPU models without a VBR, it is necessary for there to be some
+ * header code for each ISR which saves a register, loads the vector
+ * number, and jumps to _ISR_Handler.
+ */
+
+ m68k_get_vbr( interrupt_table );
+ *old_handler = interrupt_table[ vector ];
+#if ( M68K_HAS_VBR == 1 )
+ interrupt_table[ vector ] = new_handler;
+#else
+ _CPU_ISR_jump_table[vector].isr_handler = (unsigned32) new_handler;
+ interrupt_table[ vector ] = (proc_ptr) &_CPU_ISR_jump_table[vector];
+#endif /* M68K_HAS_VBR */
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * new_handler - replacement ISR for this vector number
+ * old_handler - former ISR for this vector number
+ *
+ * Output parameters: NONE
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ proc_ptr ignored;
+
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored );
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+#if ( M68K_HAS_SEPARATE_STACKS == 1 )
+ void *isp = _CPU_Interrupt_stack_high;
+
+ asm volatile ( "movec %0,%%isp" : "=r" (isp) : "0" (isp) );
+#else
+#warning "PLEASE IMPLEMENT ME... There is NO dedicated interrupt stack"
+#warning "on CPUs without a dedicated hardware interrupt stack!!!"
+#warning "INTERRUPTS RUN ON A TASK STACK!!!"
+#endif
+}
+
+#if ( M68K_HAS_BFFFO != 1 )
+/*
+ * Returns table for duplication of the BFFFO instruction (16 bits only)
+ */
+const unsigned char __BFFFOtable[256] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif
diff --git a/cpukit/score/cpu/m68k/m68302.h b/cpukit/score/cpu/m68k/m68302.h
new file mode 100644
index 0000000000..da96478cf3
--- /dev/null
+++ b/cpukit/score/cpu/m68k/m68302.h
@@ -0,0 +1,608 @@
+/*
+ *------------------------------------------------------------------
+ *
+ * m68302.h - Definitions for Motorola MC68302 processor.
+ *
+ * Section references in this file refer to revision 2 of Motorola's
+ * "MC68302 Integrated Multiprotocol Processor User's Manual".
+ * (Motorola document MC68302UM/AD REV 2.)
+ *
+ * Based on Don Meyer's cpu68302.h that was posted in comp.sys.m68k
+ * on 17 February, 1993.
+ *
+ * Copyright 1995 David W. Glessner.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above copyright notice, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *
+ * $Id$
+ *
+ *------------------------------------------------------------------
+ */
+
+#ifndef __MOTOROLA_MC68302_DEFINITIONS_h
+#define __MOTOROLA_MC68302_DEFINITIONS_h
+
+/*
+ * BAR - Base Address Register
+ * Section 2.7
+ */
+#define M302_BAR (*((volatile rtems_unsigned16 *) 0xf2))
+
+/*
+ * SCR - System Control Register
+ * Section 3.8.1
+ */
+#define M302_SCR (*((volatile rtems_unsigned32 *) 0xf4))
+/*
+ * SCR bits
+ */
+#define RBIT_SCR_IPA 0x08000000
+#define RBIT_SCR_HWT 0x04000000
+#define RBIT_SCR_WPV 0x02000000
+#define RBIT_SCR_ADC 0x01000000
+
+#define RBIT_SCR_ERRE 0x00400000
+#define RBIT_SCR_VGE 0x00200000
+#define RBIT_SCR_WPVE 0x00100000
+#define RBIT_SCR_RMCST 0x00080000
+#define RBIT_SCR_EMWS 0x00040000
+#define RBIT_SCR_ADCE 0x00020000
+#define RBIT_SCR_BCLM 0x00010000
+
+#define RBIT_SCR_FRZW 0x00008000
+#define RBIT_SCR_FRZ2 0x00004000
+#define RBIT_SCR_FRZ1 0x00002000
+#define RBIT_SCR_SAM 0x00001000
+#define RBIT_SCR_HWDEN 0x00000800
+#define RBIT_SCR_HWDCN2 0x00000400
+#define RBIT_SCR_HWDCN1 0x00000200
+#define RBIT_SCR_HWDCN0 0x00000100
+
+#define RBIT_SCR_LPREC 0x00000080
+#define RBIT_SCR_LPP16 0x00000040
+#define RBIT_SCR_LPEN 0x00000020
+#define RBIT_SCR_LPCLKDIV 0x0000001f
+
+
+/*
+ * 68000 interrupt and trap vector numbers
+ */
+#define M68K_IVEC_BUS_ERROR 2
+#define M68K_IVEC_ADDRESS_ERROR 3
+#define M68K_IVEC_ILLEGAL_OPCODE 4
+#define M68K_IVEC_ZERO_DIVIDE 5
+#define M68K_IVEC_CHK 6
+#define M68K_IVEC_TRAPV 7
+#define M68K_IVEC_PRIVILEGE 8
+#define M68K_IVEC_TRACE 9
+#define M68K_IVEC_LINE_A 10
+#define M68K_IVEC_LINE_F 11
+/* Unassigned, Reserved 12-14 */
+#define M68K_IVEC_UNINITIALIZED_INT 15
+/* Unassigned, Reserved 16-23 */
+#define M68K_IVEC_SPURIOUS_INT 24
+
+#define M68K_IVEC_LEVEL1_AUTOVECTOR 25
+#define M68K_IVEC_LEVEL2_AUTOVECTOR 26
+#define M68K_IVEC_LEVEL3_AUTOVECTOR 27
+#define M68K_IVEC_LEVEL4_AUTOVECTOR 28
+#define M68K_IVEC_LEVEL5_AUTOVECTOR 29
+#define M68K_IVEC_LEVEL6_AUTOVECTOR 30
+#define M68K_IVEC_LEVEL7_AUTOVECTOR 31
+
+#define M68K_IVEC_TRAP0 32
+#define M68K_IVEC_TRAP1 33
+#define M68K_IVEC_TRAP2 34
+#define M68K_IVEC_TRAP3 35
+#define M68K_IVEC_TRAP4 36
+#define M68K_IVEC_TRAP5 37
+#define M68K_IVEC_TRAP6 38
+#define M68K_IVEC_TRAP7 39
+#define M68K_IVEC_TRAP8 40
+#define M68K_IVEC_TRAP9 41
+#define M68K_IVEC_TRAP10 42
+#define M68K_IVEC_TRAP11 43
+#define M68K_IVEC_TRAP12 44
+#define M68K_IVEC_TRAP13 45
+#define M68K_IVEC_TRAP14 46
+#define M68K_IVEC_TRAP15 47
+/*
+ * Unassigned, Reserved 48-59
+ *
+ * Note: Vectors 60-63 are used by the MC68302 (e.g. BAR, SCR).
+ */
+
+/*
+ * MC68302 Interrupt Vectors
+ * Section 3.2
+ */
+enum m68302_ivec_e {
+ M302_IVEC_ERR =0,
+ M302_IVEC_PB8 =1, /* General-Purpose Interrupt 0 */
+ M302_IVEC_SMC2 =2,
+ M302_IVEC_SMC1 =3,
+ M302_IVEC_TIMER3 =4,
+ M302_IVEC_SCP =5,
+ M302_IVEC_TIMER2 =6,
+ M302_IVEC_PB9 =7, /* General-Purpose Interrupt 1 */
+ M302_IVEC_SCC3 =8,
+ M302_IVEC_TIMER1 =9,
+ M302_IVEC_SCC2 =10,
+ M302_IVEC_IDMA =11,
+ M302_IVEC_SDMA =12, /* SDMA Channels Bus Error */
+ M302_IVEC_SCC1 =13,
+ M302_IVEC_PB10 =14, /* General-Purpose Interrupt 2 */
+ M302_IVEC_PB11 =15, /* General-Purpose Interrupt 3 */
+ M302_IVEC_IRQ1 =17, /* External Device */
+ M302_IVEC_IRQ6 =22, /* External Device */
+ M302_IVEC_IRQ7 =23 /* External Device */
+};
+
+
+/*
+ * GIMR - Global Interrupt Mode Register
+ * Section 3.2.5.1
+ */
+#define RBIT_GIMR_MOD (1<<15)
+#define RBIT_GIMR_IV7 (1<<14)
+#define RBIT_GIMR_IV6 (1<<13)
+#define RBIT_GIMR_IV1 (1<<12)
+#define RBIT_GIMR_ET7 (1<<10)
+#define RBIT_GIMR_ET6 (1<<9)
+#define RBIT_GIMR_ET1 (1<<8)
+#define RBIT_GIMR_VECTOR (7<<5)
+
+/*
+ * IPR - Interrupt Pending Register (Section 3.2.5.2)
+ * IMR - Interrupt Mask Register (Section 3.2.5.3)
+ * ISR - Interrupt In-Service Register (Section 3.2.5.4)
+ */
+#define RBIT_IPR_PB11 (1<<15)
+#define RBIT_IPR_PB10 (1<<14)
+#define RBIT_IPR_SCC1 (1<<13)
+#define RBIT_IPR_SDMA (1<<12)
+#define RBIT_IPR_IDMA (1<<11)
+#define RBIT_IPR_SCC2 (1<<10)
+#define RBIT_IPR_TIMER1 (1<<9)
+#define RBIT_IPR_SCC3 (1<<8)
+#define RBIT_IPR_PB9 (1<<7)
+#define RBIT_IPR_TIMER2 (1<<6)
+#define RBIT_IPR_SCP (1<<5)
+#define RBIT_IPR_TIMER3 (1<<4)
+#define RBIT_IPR_SMC1 (1<<3)
+#define RBIT_IPR_SMC2 (1<<2)
+#define RBIT_IPR_PB8 (1<<1)
+#define RBIT_IPR_ERR (1<<0)
+
+#define RBIT_ISR_PB11 (1<<15)
+#define RBIT_ISR_PB10 (1<<14)
+#define RBIT_ISR_SCC1 (1<<13)
+#define RBIT_ISR_SDMA (1<<12)
+#define RBIT_ISR_IDMA (1<<11)
+#define RBIT_ISR_SCC2 (1<<10)
+#define RBIT_ISR_TIMER1 (1<<9)
+#define RBIT_ISR_SCC3 (1<<8)
+#define RBIT_ISR_PB9 (1<<7)
+#define RBIT_ISR_TIMER2 (1<<6)
+#define RBIT_ISR_SCP (1<<5)
+#define RBIT_ISR_TIMER3 (1<<4)
+#define RBIT_ISR_SMC1 (1<<3)
+#define RBIT_ISR_SMC2 (1<<2)
+#define RBIT_ISR_PB8 (1<<1)
+
+#define RBIT_IMR_PB11 (1<<15) /* PB11 Interrupt Mask */
+#define RBIT_IMR_PB10 (1<<14) /* PB10 Interrupt Mask */
+#define RBIT_IMR_SCC1 (1<<13) /* SCC1 Interrupt Mask */
+#define RBIT_IMR_SDMA (1<<12) /* SDMA Interrupt Mask */
+#define RBIT_IMR_IDMA (1<<11) /* IDMA Interrupt Mask */
+#define RBIT_IMR_SCC2 (1<<10) /* SCC2 Interrupt Mask */
+#define RBIT_IMR_TIMER1 (1<<9) /* TIMER1 Interrupt Mask */
+#define RBIT_IMR_SCC3 (1<<8) /* SCC3 Interrupt Mask */
+#define RBIT_IMR_PB9 (1<<7) /* PB9 Interrupt Mask */
+#define RBIT_IMR_TIMER2 (1<<6) /* TIMER2 Interrupt Mask */
+#define RBIT_IMR_SCP (1<<5) /* SCP Interrupt Mask */
+#define RBIT_IMR_TIMER3 (1<<4) /* TIMER3 Interrupt Mask */
+#define RBIT_IMR_SMC1 (1<<3) /* SMC1 Interrupt Mask */
+#define RBIT_IMR_SMC2 (1<<2) /* SMC2 Interrupt Mask */
+#define RBIT_IMR_PB8 (1<<1) /* PB8 Interrupt Mask */
+
+
+/*
+ * DRAM Refresh
+ * Section 3.9
+ *
+ * The DRAM refresh memory map replaces the SCC2 Tx BD 6 and Tx BD 7
+ * structures in the parameter RAM.
+ *
+ * Access to the DRAM registers can be accomplished by
+ * the following approach:
+ *
+ * volatile m302_DRAM_refresh_t *dram;
+ * dram = (volatile m302_DRAM_refresh_t *) &m302.scc2.bd.tx[6];
+ *
+ * Then simply use pointer references (e.g. dram->count = 3).
+ */
+typedef struct {
+ rtems_unsigned16 dram_high; /* DRAM high address and FC */
+ rtems_unsigned16 dram_low; /* DRAM low address */
+ rtems_unsigned16 increment; /* increment step (bytes/row) */
+ rtems_unsigned16 count; /* RAM refresh cycle count (#rows) */
+ rtems_unsigned16 t_ptr_h; /* temporary refresh high addr & FC */
+ rtems_unsigned16 t_ptr_l; /* temporary refresh low address */
+ rtems_unsigned16 t_count; /* temporary refresh cycles count */
+ rtems_unsigned16 res; /* reserved */
+} m302_DRAM_refresh_t;
+
+
+/*
+ * TMR - Timer Mode Register (for timers 1 and 2)
+ * Section 3.5.2.1
+ */
+#define RBIT_TMR_ICLK_STOP (0<<1)
+#define RBIT_TMR_ICLK_MASTER (1<<1)
+#define RBIT_TMR_ICLK_MASTER16 (2<<1)
+#define RBIT_TMR_ICLK_TIN (3<<1)
+
+#define RBIT_TMR_OM (1<<5)
+#define RBIT_TMR_ORI (1<<4)
+#define RBIT_TMR_FRR (1<<3)
+#define RBIT_TMR_RST (1<<0)
+
+
+/*
+ * TER - Timer Event Register (for timers 1 and 2)
+ * Section 3.5.2.5
+ */
+#define RBIT_TER_REF (1<<1) /* Output Reference Event */
+#define RBIT_TER_CAP (1<<0) /* Capture Event */
+
+
+/*
+ * SCC Buffer Descriptors and Buffer Descriptors Table
+ * Section 4.5.5
+ */
+typedef struct m302_SCC_bd {
+ rtems_unsigned16 status; /* status and control */
+ rtems_unsigned16 length; /* data length */
+ rtems_unsigned8 *buffer; /* data buffer pointer */
+} m302_SCC_bd_t;
+
+typedef struct {
+ m302_SCC_bd_t rx[8]; /* receive buffer descriptors */
+ m302_SCC_bd_t tx[8]; /* transmit buffer descriptors */
+} m302_SCC_bd_table_t;
+
+
+/*
+ * SCC Parameter RAM (offset 0x080 from an SCC Base)
+ * Section 4.5.6
+ *
+ * Each SCC parameter RAM area begins at offset 0x80 from each SCC base
+ * area (0x400, 0x500, or 0x600 from the dual-port RAM base).
+ *
+ * Offsets 0x9c-0xbf from each SCC base area compose the protocol-specific
+ * portion of the SCC parameter RAM.
+ */
+typedef struct {
+ rtems_unsigned8 rfcr; /* Rx Function Code */
+ rtems_unsigned8 tfcr; /* Tx Function Code */
+ rtems_unsigned16 mrblr; /* Maximum Rx Buffer Length */
+ rtems_unsigned16 _rstate; /* Rx Internal State */
+ rtems_unsigned8 res2;
+ rtems_unsigned8 rbd; /* Rx Internal Buffer Number */
+ rtems_unsigned32 _rdptr; /* Rx Internal Data Pointer */
+ rtems_unsigned16 _rcount; /* Rx Internal Byte Count */
+ rtems_unsigned16 _rtmp; /* Rx Temp */
+ rtems_unsigned16 _tstate; /* Tx Internal State */
+ rtems_unsigned8 res7;
+ rtems_unsigned8 tbd; /* Tx Internal Buffer Number */
+ rtems_unsigned32 _tdptr; /* Tx Internal Data Pointer */
+ rtems_unsigned16 _tcount; /* Tx Internal Byte Count */
+ rtems_unsigned16 _ttmp; /* Tx Temp */
+} m302_SCC_parameters_t;
+
+/*
+ * UART-Specific SCC Parameter RAM
+ * Section 4.5.11.3
+ */
+typedef struct {
+ rtems_unsigned16 max_idl; /* Maximum IDLE Characters (rx) */
+ rtems_unsigned16 idlc; /* Temporary rx IDLE counter */
+ rtems_unsigned16 brkcr; /* Break Count Register (tx) */
+ rtems_unsigned16 parec; /* Receive Parity Error Counter */
+ rtems_unsigned16 frmec; /* Receive Framing Error Counter */
+ rtems_unsigned16 nosec; /* Receive Noise Counter */
+ rtems_unsigned16 brkec; /* Receive Break Condition Counter */
+ rtems_unsigned16 uaddr1; /* UART ADDRESS Character 1 */
+ rtems_unsigned16 uaddr2; /* UART ADDRESS Character 2 */
+ rtems_unsigned16 rccr; /* Receive Control Character Register */
+ rtems_unsigned16 character[8]; /* Control Characters 1 through 8*/
+} m302_SCC_UartSpecific_t;
+/*
+ * This definition allows for the checking of receive buffers
+ * for errors.
+ */
+
+#define RCV_ERR 0x003F
+
+/*
+ * UART receive buffer descriptor bit definitions.
+ * Section 4.5.11.14
+ */
+#define RBIT_UART_CTRL (1<<11) /* buffer contains a control char */
+#define RBIT_UART_ADDR (1<<10) /* first byte contains an address */
+#define RBIT_UART_MATCH (1<<9) /* indicates which addr char matched */
+#define RBIT_UART_IDLE (1<<8) /* buffer closed due to IDLE sequence */
+#define RBIT_UART_BR (1<<5) /* break sequence was received */
+#define RBIT_UART_FR (1<<4) /* framing error was received */
+#define RBIT_UART_PR (1<<3) /* parity error was received */
+#define RBIT_UART_OV (1<<1) /* receiver overrun occurred */
+#define RBIT_UART_CD (1<<0) /* carrier detect lost */
+#define RBIT_UART_STATUS 0x003B /* all status bits */
+
+/*
+ * UART transmit buffer descriptor bit definitions.
+ * Section 4.5.11.15
+ */
+#define RBIT_UART_CR (1<<11) /* clear-to-send report
+ * this results in two idle bits
+ * between back-to-back frames
+ */
+#define RBIT_UART_A (1<<10) /* buffer contains address characters
+ * only valid in multidrop mode (UM0=1)
+ */
+#define RBIT_UART_PREAMBLE (1<<9) /* send preamble before data */
+#define RBIT_UART_CTS_LOST (1<<0) /* CTS lost */
+
+/*
+ * UART event register
+ * Section 4.5.11.16
+ */
+#define M302_UART_EV_CTS (1<<7) /* CTS status changed */
+#define M302_UART_EV_CD (1<<6) /* carrier detect status changed */
+#define M302_UART_EV_IDL (1<<5) /* IDLE sequence status changed */
+#define M302_UART_EV_BRK (1<<4) /* break character was received */
+#define M302_UART_EV_CCR (1<<3) /* control character received */
+#define M302_UART_EV_TX (1<<1) /* buffer has been transmitted */
+#define M302_UART_EV_RX (1<<0) /* buffer has been received */
+
+
+/*
+ * HDLC-Specific SCC Parameter RAM
+ * Section 4.5.12.3
+ *
+ * c_mask_l should be 0xF0B8 for 16-bit CRC, 0xdebb for 32-bit CRC
+ * c_mask_h is a don't care for 16-bit CRC, 0x20E2 for 32-bit CRC
+ */
+typedef struct {
+ rtems_unsigned16 rcrc_l; /* Temp Receive CRC Low */
+ rtems_unsigned16 rcrc_h; /* Temp Receive CRC High */
+ rtems_unsigned16 c_mask_l; /* CRC Mask Low */
+ rtems_unsigned16 c_mask_h; /* CRC Mask High */
+ rtems_unsigned16 tcrc_l; /* Temp Transmit CRC Low */
+ rtems_unsigned16 tcrc_h; /* Temp Transmit CRC High */
+
+ rtems_unsigned16 disfc; /* Discard Frame Counter */
+ rtems_unsigned16 crcec; /* CRC Error Counter */
+ rtems_unsigned16 abtsc; /* Abort Sequence Counter */
+ rtems_unsigned16 nmarc; /* Nonmatching Address Received Cntr */
+ rtems_unsigned16 retrc; /* Frame Retransmission Counter */
+
+ rtems_unsigned16 mflr; /* Maximum Frame Length Register */
+ rtems_unsigned16 max_cnt; /* Maximum_Length Counter */
+
+ rtems_unsigned16 hmask; /* User Defined Frame Address Mask */
+ rtems_unsigned16 haddr1; /* User Defined Frame Address */
+ rtems_unsigned16 haddr2; /* " */
+ rtems_unsigned16 haddr3; /* " */
+ rtems_unsigned16 haddr4; /* " */
+} m302_SCC_HdlcSpecific_t;
+/*
+ * HDLC receiver buffer descriptor bit definitions
+ * Section 4.5.12.10
+ */
+#define RBIT_HDLC_EMPTY_BIT 0x8000 /* buffer associated with BD is empty */
+#define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in a frame */
+#define RBIT_HDLC_FIRST_BIT 0x0400 /* buffer is first in a frame */
+#define RBIT_HDLC_FRAME_LEN 0x0020 /* receiver frame length violation */
+#define RBIT_HDLC_NONOCT_Rx 0x0010 /* received non-octet aligned frame */
+#define RBIT_HDLC_ABORT_SEQ 0x0008 /* received abort sequence */
+#define RBIT_HDLC_CRC_ERROR 0x0004 /* frame contains a CRC error */
+#define RBIT_HDLC_OVERRUN 0x0002 /* receiver overrun occurred */
+#define RBIT_HDLC_CD_LOST 0x0001 /* carrier detect lost */
+
+/*
+ * HDLC transmit buffer descriptor bit definitions
+ * Section 4.5.12.11
+ */
+#define RBIT_HDLC_READY_BIT 0x8000 /* buffer is ready to transmit */
+#define RBIT_HDLC_EXT_BUFFER 0x4000 /* buffer is in external memory */
+#define RBIT_HDLC_WRAP_BIT 0x2000 /* last buffer in bd table, so wrap */
+#define RBIT_HDLC_WAKE_UP 0x1000 /* interrupt when buffer serviced */
+#define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in the frame */
+#define RBIT_HDLC_TxCRC_BIT 0x0400 /* transmit a CRC sequence */
+#define RBIT_HDLC_UNDERRUN 0x0002 /* transmitter underrun */
+#define RBIT_HDLC_CTS_LOST 0x0001 /* CTS lost */
+
+/*
+ * HDLC event register bit definitions
+ * Section 4.5.12.12
+ */
+#define RBIT_HDLC_CTS 0x80 /* CTS status changed */
+#define RBIT_HDLC_CD 0x40 /* carrier detect status changed */
+#define RBIT_HDLC_IDL 0x20 /* IDLE sequence status changed */
+#define RBIT_HDLC_TXE 0x10 /* transmit error */
+#define RBIT_HDLC_RXF 0x08 /* received frame */
+#define RBIT_HDLC_BSY 0x04 /* frame rcvd and discarded due to
+ * lack of buffers
+ */
+#define RBIT_HDLC_TXB 0x02 /* buffer has been transmitted */
+#define RBIT_HDLC_RXB 0x01 /* received buffer */
+
+
+
+typedef struct {
+ m302_SCC_bd_table_t bd; /* +000 Buffer Descriptor Table */
+ m302_SCC_parameters_t parm; /* +080 Common Parameter RAM */
+ union { /* +09C Protocol-Specific Parm RAM */
+ m302_SCC_UartSpecific_t uart;
+ m302_SCC_HdlcSpecific_t hdlc;
+ } prot;
+ rtems_unsigned8 res[0x040]; /* +0C0 reserved, (not implemented) */
+} m302_SCC_t;
+
+
+/*
+ * Common SCC Registers
+ */
+typedef struct {
+ rtems_unsigned16 res1;
+ rtems_unsigned16 scon; /* SCC Configuration Register 4.5.2 */
+ rtems_unsigned16 scm; /* SCC Mode Register 4.5.3 */
+ rtems_unsigned16 dsr; /* SCC Data Synchronization Register 4.5.4 */
+ rtems_unsigned8 scce; /* SCC Event Register 4.5.8.1 */
+ rtems_unsigned8 res2;
+ rtems_unsigned8 sccm; /* SCC Mask Register 4.5.8.2 */
+ rtems_unsigned8 res3;
+ rtems_unsigned8 sccs; /* SCC Status Register 4.5.8.3 */
+ rtems_unsigned8 res4;
+ rtems_unsigned16 res5;
+} m302_SCC_Registers_t;
+
+/*
+ * SCON - SCC Configuration Register
+ * Section 4.5.2
+ */
+#define RBIT_SCON_WOMS (1<<15) /* Wired-OR Mode Select (NMSI mode only)
+ * When set, the TXD driver is an
+ * open-drain output */
+#define RBIT_SCON_EXTC (1<<14) /* External Clock Source */
+#define RBIT_SCON_TCS (1<<13) /* Transmit Clock Source */
+#define RBIT_SCON_RCS (1<<12) /* Receive Clock Source */
+
+/*
+ * SCM - SCC Mode Register bit definitions
+ * Section 4.5.3
+ * The parameter-specific mode bits occupy bits 15 through 6.
+ */
+#define RBIT_SCM_ENR (1<<3) /* Enable receiver */
+#define RBIT_SCM_ENT (1<<2) /* Enable transmitter */
+
+
+/*
+ * Internal MC68302 Registers
+ * starts at offset 0x800 from dual-port RAM base
+ * Section 2.8
+ */
+typedef struct {
+ /* offset +800 */
+ rtems_unsigned16 res0;
+ rtems_unsigned16 cmr; /* IDMA Channel Mode Register */
+ rtems_unsigned32 sapr; /* IDMA Source Address Pointer */
+ rtems_unsigned32 dapr; /* IDMA Destination Address Pointer */
+ rtems_unsigned16 bcr; /* IDMA Byte Count Register */
+ rtems_unsigned8 csr; /* IDMA Channel Status Register */
+ rtems_unsigned8 res1;
+ rtems_unsigned8 fcr; /* IDMA Function Code Register */
+ rtems_unsigned8 res2;
+
+ /* offset +812 */
+ rtems_unsigned16 gimr; /* Global Interrupt Mode Register */
+ rtems_unsigned16 ipr; /* Interrupt Pending Register */
+ rtems_unsigned16 imr; /* Interrupt Mask Register */
+ rtems_unsigned16 isr; /* Interrupt In-Service Register */
+ rtems_unsigned16 res3;
+ rtems_unsigned16 res4;
+
+ /* offset +81e */
+ rtems_unsigned16 pacnt; /* Port A Control Register */
+ rtems_unsigned16 paddr; /* Port A Data Direction Register */
+ rtems_unsigned16 padat; /* Port A Data Register */
+ rtems_unsigned16 pbcnt; /* Port B Control Register */
+ rtems_unsigned16 pbddr; /* Port B Data Direction Register */
+ rtems_unsigned16 pbdat; /* Port B Data Register */
+ rtems_unsigned16 res5;
+
+ /* offset +82c */
+ rtems_unsigned16 res6;
+ rtems_unsigned16 res7;
+ rtems_unsigned16 br0; /* Base Register (CS0) */
+ rtems_unsigned16 or0; /* Option Register (CS0) */
+ rtems_unsigned16 br1; /* Base Register (CS1) */
+ rtems_unsigned16 or1; /* Option Register (CS1) */
+ rtems_unsigned16 br2; /* Base Register (CS2) */
+ rtems_unsigned16 or2; /* Option Register (CS2) */
+ rtems_unsigned16 br3; /* Base Register (CS3) */
+ rtems_unsigned16 or3; /* Option Register (CS3) */
+
+ /* offset +840 */
+ rtems_unsigned16 tmr1; /* Timer Unit 1 Mode Register */
+ rtems_unsigned16 trr1; /* Timer Unit 1 Reference Register */
+ rtems_unsigned16 tcr1; /* Timer Unit 1 Capture Register */
+ rtems_unsigned16 tcn1; /* Timer Unit 1 Counter */
+ rtems_unsigned8 res8;
+ rtems_unsigned8 ter1; /* Timer Unit 1 Event Register */
+ rtems_unsigned16 wrr; /* Watchdog Reference Register */
+ rtems_unsigned16 wcn; /* Watchdog Counter */
+ rtems_unsigned16 res9;
+ rtems_unsigned16 tmr2; /* Timer Unit 2 Mode Register */
+ rtems_unsigned16 trr2; /* Timer Unit 2 Reference Register */
+ rtems_unsigned16 tcr2; /* Timer Unit 2 Capture Register */
+ rtems_unsigned16 tcn2; /* Timer Unit 2 Counter */
+ rtems_unsigned8 resa;
+ rtems_unsigned8 ter2; /* Timer Unit 2 Event Register */
+ rtems_unsigned16 resb;
+ rtems_unsigned16 resc;
+ rtems_unsigned16 resd;
+
+ /* offset +860 */
+ rtems_unsigned8 cr; /* Command Register */
+ rtems_unsigned8 rese[0x1f];
+
+ /* offset +880, +890, +8a0 */
+ m302_SCC_Registers_t scc[3]; /* SCC1, SCC2, SCC3 Registers */
+
+ /* offset +8b0 */
+ rtems_unsigned16 spmode; /* SCP,SMC Mode and Clock Cntrl Reg */
+ rtems_unsigned16 simask; /* Serial Interface Mask Register */
+ rtems_unsigned16 simode; /* Serial Interface Mode Register */
+} m302_internalReg_t ;
+
+
+/*
+ * MC68302 dual-port RAM structure.
+ * (Includes System RAM, Parameter RAM, and Internal Registers).
+ * Section 2.8
+ */
+typedef struct {
+ rtems_unsigned8 mem[0x240]; /* +000 User Data Memory */
+ rtems_unsigned8 res1[0x1c0]; /* +240 reserved, (not implemented) */
+ m302_SCC_t scc1; /* +400 SCC1 */
+ m302_SCC_t scc2; /* +500 SCC2 */
+ m302_SCC_t scc3; /* +600 SCC3 */
+ rtems_unsigned8 res2[0x100]; /* +700 reserved, (not implemented) */
+ m302_internalReg_t reg; /* +800 68302 Internal Registers */
+} m302_dualPortRAM_t;
+
+
+/*
+ * Declare the variable that's used to reference the variables in
+ * the dual-port RAM.
+ */
+extern volatile m302_dualPortRAM_t m302;
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/cpu/m68k/m68360.h b/cpukit/score/cpu/m68k/m68360.h
new file mode 100644
index 0000000000..84687c49fa
--- /dev/null
+++ b/cpukit/score/cpu/m68k/m68360.h
@@ -0,0 +1,880 @@
+/*
+ **************************************************************************
+ **************************************************************************
+ ** **
+ ** MOTOROLA MC68360 QUAD INTEGRATED COMMUNICATIONS CONTROLLER (QUICC) **
+ ** **
+ ** HARDWARE DECLARATIONS **
+ ** **
+ ** **
+ ** Submitted By: **
+ ** **
+ ** W. Eric Norum **
+ ** Saskatchewan Accelerator Laboratory **
+ ** University of Saskatchewan **
+ ** 107 North Road **
+ ** Saskatoon, Saskatchewan, CANADA **
+ ** S7N 5C6 **
+ ** **
+ ** eric@skatter.usask.ca **
+ ** **
+ ** $Id$ **
+ ** **
+ **************************************************************************
+ **************************************************************************
+ */
+
+#ifndef __MC68360_h
+#define __MC68360_h
+
+/*
+ *************************************************************************
+ * REGISTER SUBBLOCKS *
+ *************************************************************************
+ */
+
+/*
+ * Memory controller registers
+ */
+typedef struct m360MEMCRegisters_ {
+ rtems_unsigned32 br;
+ rtems_unsigned32 or;
+ rtems_unsigned32 _pad[2];
+} m360MEMCRegisters_t;
+
+/*
+ * Serial Communications Controller registers
+ */
+typedef struct m360SCCRegisters_ {
+ rtems_unsigned32 gsmr_l;
+ rtems_unsigned32 gsmr_h;
+ rtems_unsigned16 psmr;
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 todr;
+ rtems_unsigned16 dsr;
+ rtems_unsigned16 scce;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned16 sccm;
+ rtems_unsigned8 _pad2;
+ rtems_unsigned8 sccs;
+ rtems_unsigned32 _pad3[2];
+} m360SCCRegisters_t;
+
+/*
+ * Serial Management Controller registers
+ */
+typedef struct m360SMCRegisters_ {
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 smcmr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned8 smce;
+ rtems_unsigned8 _pad2;
+ rtems_unsigned16 _pad3;
+ rtems_unsigned8 smcm;
+ rtems_unsigned8 _pad4;
+ rtems_unsigned32 _pad5;
+} m360SMCRegisters_t;
+
+
+/*
+ *************************************************************************
+ * Miscellaneous Parameters *
+ *************************************************************************
+ */
+typedef struct m360MiscParms_ {
+ rtems_unsigned16 rev_num;
+ rtems_unsigned16 _res1;
+ rtems_unsigned32 _res2;
+ rtems_unsigned32 _res3;
+} m360MiscParms_t;
+
+/*
+ *************************************************************************
+ * RISC Timers *
+ *************************************************************************
+ */
+typedef struct m360TimerParms_ {
+ rtems_unsigned16 tm_base;
+ rtems_unsigned16 _tm_ptr;
+ rtems_unsigned16 _r_tmr;
+ rtems_unsigned16 _r_tmv;
+ rtems_unsigned32 tm_cmd;
+ rtems_unsigned32 tm_cnt;
+} m360TimerParms_t;
+
+/*
+ * RISC Controller Configuration Register (RCCR)
+ * All other bits in this register are either reserved or
+ * used only with a Motorola-supplied RAM microcode packge.
+ */
+#define M360_RCCR_TIME (1<<15) /* Enable timer */
+#define M360_RCCR_TIMEP(x) ((x)<<8) /* Timer period */
+
+/*
+ * Command register
+ * Set up this register before issuing a M360_CR_OP_SET_TIMER command.
+ */
+#define M360_TM_CMD_V (1<<31) /* Set to enable timer */
+#define M360_TM_CMD_R (1<<30) /* Set for automatic restart */
+#define M360_TM_CMD_TIMER(x) ((x)<<16) /* Select timer */
+#define M360_TM_CMD_PERIOD(x) (x) /* Timer period (16 bits) */
+
+/*
+ *************************************************************************
+ * DMA Controllers *
+ *************************************************************************
+ */
+typedef struct m360IDMAparms_ {
+ rtems_unsigned16 ibase;
+ rtems_unsigned16 ibptr;
+ rtems_unsigned32 _istate;
+ rtems_unsigned32 _itemp;
+} m360IDMAparms_t;
+
+/*
+ *************************************************************************
+ * Serial Communication Controllers *
+ *************************************************************************
+ */
+typedef struct m360SCCparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ rtems_unsigned32 _rcrc;
+ rtems_unsigned32 _tcrc;
+ union {
+ struct {
+ rtems_unsigned32 _res0;
+ rtems_unsigned32 _res1;
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _idlc;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 parec;
+ rtems_unsigned16 frmec;
+ rtems_unsigned16 nosec;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 uaddr[2];
+ rtems_unsigned16 _rtemp;
+ rtems_unsigned16 toseq;
+ rtems_unsigned16 character[8];
+ rtems_unsigned16 rccm;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 rlbc;
+ } uart;
+ } un;
+} m360SCCparms_t;
+
+typedef struct m360SCCENparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ rtems_unsigned32 _rcrc;
+ rtems_unsigned32 _tcrc;
+ union {
+ struct {
+ rtems_unsigned32 _res0;
+ rtems_unsigned32 _res1;
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _idlc;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 parec;
+ rtems_unsigned16 frmec;
+ rtems_unsigned16 nosec;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 uaddr[2];
+ rtems_unsigned16 _rtemp;
+ rtems_unsigned16 toseq;
+ rtems_unsigned16 character[8];
+ rtems_unsigned16 rccm;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 rlbc;
+ } uart;
+ struct {
+ rtems_unsigned32 c_pres;
+ rtems_unsigned32 c_mask;
+ rtems_unsigned32 crcec;
+ rtems_unsigned32 alec;
+ rtems_unsigned32 disfc;
+ rtems_unsigned16 pads;
+ rtems_unsigned16 ret_lim;
+ rtems_unsigned16 _ret_cnt;
+ rtems_unsigned16 mflr;
+ rtems_unsigned16 minflr;
+ rtems_unsigned16 maxd1;
+ rtems_unsigned16 maxd2;
+ rtems_unsigned16 _maxd;
+ rtems_unsigned16 dma_cnt;
+ rtems_unsigned16 _max_b;
+ rtems_unsigned16 gaddr1;
+ rtems_unsigned16 gaddr2;
+ rtems_unsigned16 gaddr3;
+ rtems_unsigned16 gaddr4;
+ rtems_unsigned32 _tbuf0data0;
+ rtems_unsigned32 _tbuf0data1;
+ rtems_unsigned32 _tbuf0rba0;
+ rtems_unsigned32 _tbuf0crc;
+ rtems_unsigned16 _tbuf0bcnt;
+ rtems_unsigned16 paddr_h;
+ rtems_unsigned16 paddr_m;
+ rtems_unsigned16 paddr_l;
+ rtems_unsigned16 p_per;
+ rtems_unsigned16 _rfbd_ptr;
+ rtems_unsigned16 _tfbd_ptr;
+ rtems_unsigned16 _tlbd_ptr;
+ rtems_unsigned32 _tbuf1data0;
+ rtems_unsigned32 _tbuf1data1;
+ rtems_unsigned32 _tbuf1rba0;
+ rtems_unsigned32 _tbuf1crc;
+ rtems_unsigned16 _tbuf1bcnt;
+ rtems_unsigned16 _tx_len;
+ rtems_unsigned16 iaddr1;
+ rtems_unsigned16 iaddr2;
+ rtems_unsigned16 iaddr3;
+ rtems_unsigned16 iaddr4;
+ rtems_unsigned16 _boff_cnt;
+ rtems_unsigned16 taddr_l;
+ rtems_unsigned16 taddr_m;
+ rtems_unsigned16 taddr_h;
+ } ethernet;
+ } un;
+} m360SCCENparms_t;
+
+/*
+ * Receive and transmit function code register bits
+ * These apply to the function code registers of all devices, not just SCC.
+ */
+#define M360_RFCR_MOT (1<<4)
+#define M360_RFCR_DMA_SPACE 0x8
+#define M360_TFCR_MOT (1<<4)
+#define M360_TFCR_DMA_SPACE 0x8
+
+/*
+ *************************************************************************
+ * Serial Management Controllers *
+ *************************************************************************
+ */
+typedef struct m360SMCparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ union {
+ struct {
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 _r_mask;
+ } uart;
+ struct {
+ rtems_unsigned16 _pad0[5];
+ } transparent;
+ } un;
+} m360SMCparms_t;
+
+/*
+ * Mode register
+ */
+#define M360_SMCMR_CLEN(x) ((x)<<11) /* Character length */
+#define M360_SMCMR_2STOP (1<<10) /* 2 stop bits */
+#define M360_SMCMR_PARITY (1<<9) /* Enable parity */
+#define M360_SMCMR_EVEN (1<<8) /* Even parity */
+#define M360_SMCMR_SM_GCI (0<<4) /* GCI Mode */
+#define M360_SMCMR_SM_UART (2<<4) /* UART Mode */
+#define M360_SMCMR_SM_TRANSPARENT (3<<4) /* Transparent Mode */
+#define M360_SMCMR_DM_LOOPBACK (1<<2) /* Local loopback mode */
+#define M360_SMCMR_DM_ECHO (2<<2) /* Echo mode */
+#define M360_SMCMR_TEN (1<<1) /* Enable transmitter */
+#define M360_SMCMR_REN (1<<0) /* Enable receiver */
+
+/*
+ * Event and mask registers (SMCE, SMCM)
+ */
+#define M360_SMCE_BRK (1<<4)
+#define M360_SMCE_BSY (1<<2)
+#define M360_SMCE_TX (1<<1)
+#define M360_SMCE_RX (1<<0)
+
+/*
+ *************************************************************************
+ * Serial Peripheral Interface *
+ *************************************************************************
+ */
+typedef struct m360SPIparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+} m360SPIparms_t;
+
+/*
+ * Mode register (SPMODE)
+ */
+#define M360_SPMODE_LOOP (1<<14) /* Local loopback mode */
+#define M360_SPMODE_CI (1<<13) /* Clock invert */
+#define M360_SPMODE_CP (1<<12) /* Clock phase */
+#define M360_SPMODE_DIV16 (1<<11) /* Divide BRGCLK by 16 */
+#define M360_SPMODE_REV (1<<10) /* Reverse data */
+#define M360_SPMODE_MASTER (1<<9) /* SPI is master */
+#define M360_SPMODE_EN (1<<8) /* Enable SPI */
+#define M360_SPMODE_CLEN(x) ((x)<<4) /* Character length */
+#define M360_SPMODE_PM(x) (x) /* Prescaler modulus */
+
+/*
+ * Mode register (SPCOM)
+ */
+#define M360_SPCOM_STR (1<<7) /* Start transmit */
+
+/*
+ * Event and mask registers (SPIE, SPIM)
+ */
+#define M360_SPIE_MME (1<<5) /* Multi-master error */
+#define M360_SPIE_TXE (1<<4) /* Tx error */
+#define M360_SPIE_BSY (1<<2) /* Busy condition*/
+#define M360_SPIE_TXB (1<<1) /* Tx buffer */
+#define M360_SPIE_RXB (1<<0) /* Rx buffer */
+
+/*
+ *************************************************************************
+ * SDMA (SCC, SMC, SPI) Buffer Descriptors *
+ *************************************************************************
+ */
+typedef struct m360BufferDescriptor_ {
+ rtems_unsigned16 status;
+ rtems_unsigned16 length;
+ volatile void *buffer;
+} m360BufferDescriptor_t;
+
+/*
+ * Bits in receive buffer descriptor status word
+ */
+#define M360_BD_EMPTY (1<<15) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_WRAP (1<<13) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_INTERRUPT (1<<12) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_LAST (1<<11) /* Ethernet, SPI */
+#define M360_BD_CONTROL_CHAR (1<<11) /* SCC UART */
+#define M360_BD_FIRST_IN_FRAME (1<<10) /* Ethernet */
+#define M360_BD_ADDRESS (1<<10) /* SCC UART */
+#define M360_BD_CONTINUOUS (1<<9) /* SCC UART, SMC UART, SPI */
+#define M360_BD_MISS (1<<8) /* Ethernet */
+#define M360_BD_IDLE (1<<8) /* SCC UART, SMC UART */
+#define M360_BD_ADDRSS_MATCH (1<<7) /* SCC UART */
+#define M360_BD_LONG (1<<5) /* Ethernet */
+#define M360_BD_BREAK (1<<5) /* SCC UART, SMC UART */
+#define M360_BD_NONALIGNED (1<<4) /* Ethernet */
+#define M360_BD_FRAMING_ERROR (1<<4) /* SCC UART, SMC UART */
+#define M360_BD_SHORT (1<<3) /* Ethernet */
+#define M360_BD_PARITY_ERROR (1<<3) /* SCC UART, SMC UART */
+#define M360_BD_CRC_ERROR (1<<2) /* Ethernet */
+#define M360_BD_OVERRUN (1<<1) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_COLLISION (1<<0) /* Ethernet */
+#define M360_BD_CARRIER_LOST (1<<0) /* SCC UART */
+#define M360_BD_MASTER_ERROR (1<<0) /* SPI */
+
+/*
+ * Bits in transmit buffer descriptor status word
+ * Many bits have the same meaning as those in receiver buffer descriptors.
+ */
+#define M360_BD_READY (1<<15) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_PAD (1<<14) /* Ethernet */
+#define M360_BD_CTS_REPORT (1<<11) /* SCC UART */
+#define M360_BD_TX_CRC (1<<10) /* Ethernet */
+#define M360_BD_DEFER (1<<9) /* Ethernet */
+#define M360_BD_HEARTBEAT (1<<8) /* Ethernet */
+#define M360_BD_PREAMBLE (1<<8) /* SCC UART, SMC UART */
+#define M360_BD_LATE_COLLISION (1<<7) /* Ethernet */
+#define M360_BD_NO_STOP_BIT (1<<7) /* SCC UART */
+#define M360_BD_RETRY_LIMIT (1<<6) /* Ethernet */
+#define M360_BD_RETRY_COUNT(x) (((x)&0x3C)>>2) /* Ethernet */
+#define M360_BD_UNDERRUN (1<<1) /* Ethernet, SPI */
+#define M360_BD_CARRIER_LOST (1<<0) /* Ethernet */
+#define M360_BD_CTS_LOST (1<<0) /* SCC UART */
+
+/*
+ *************************************************************************
+ * IDMA Buffer Descriptors *
+ *************************************************************************
+ */
+typedef struct m360IDMABufferDescriptor_ {
+ rtems_unsigned16 status;
+ rtems_unsigned16 _pad;
+ rtems_unsigned32 length;
+ void *source;
+ void *destination;
+} m360IDMABufferDescriptor_t;
+
+/*
+ *************************************************************************
+ * RISC Communication Processor Module Command Register (CR) *
+ *************************************************************************
+ */
+#define M360_CR_RST (1<<15) /* Reset communication processor */
+#define M360_CR_OP_INIT_RX_TX (0<<8) /* SCC, SMC UART, SMC GCI, SPI */
+#define M360_CR_OP_INIT_RX (1<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_INIT_TX (2<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_INIT_HUNT (3<<8) /* SCC, SMC UART */
+#define M360_CR_OP_STOP_TX (4<<8) /* SCC, SMC UART */
+#define M360_CR_OP_GR_STOP_TX (5<<8) /* SCC */
+#define M360_CR_OP_INIT_IDMA (5<<8) /* IDMA */
+#define M360_CR_OP_RESTART_TX (6<<8) /* SCC, SMC UART */
+#define M360_CR_OP_CLOSE_RX_BD (7<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_SET_GRP_ADDR (8<<8) /* SCC */
+#define M360_CR_OP_SET_TIMER (8<<8) /* Timer */
+#define M360_CR_OP_GCI_TIMEOUT (9<<8) /* SMC GCI */
+#define M360_CR_OP_RESERT_BCS (10<<8) /* SCC */
+#define M360_CR_OP_GCI_ABORT (10<<8) /* SMC GCI */
+#define M360_CR_CHAN_SCC1 (0<<4) /* Channel selection */
+#define M360_CR_CHAN_SCC2 (4<<4)
+#define M360_CR_CHAN_SPI (5<<4)
+#define M360_CR_CHAN_TIMER (5<<4)
+#define M360_CR_CHAN_SCC3 (8<<4)
+#define M360_CR_CHAN_SMC1 (9<<4)
+#define M360_CR_CHAN_IDMA1 (9<<4)
+#define M360_CR_CHAN_SCC4 (12<<4)
+#define M360_CR_CHAN_SMC2 (13<<4)
+#define M360_CR_CHAN_IDMA2 (13<<4)
+#define M360_CR_FLG (1<<0) /* Command flag */
+
+/*
+ *************************************************************************
+ * System Protection Control Register (SYPCR) *
+ *************************************************************************
+ */
+#define M360_SYPCR_SWE (1<<7) /* Software watchdog enable */
+#define M360_SYPCR_SWRI (1<<6) /* Software watchdog reset select */
+#define M360_SYPCR_SWT1 (1<<5) /* Software watchdog timing bit 1 */
+#define M360_SYPCR_SWT0 (1<<4) /* Software watchdog timing bit 0 */
+#define M360_SYPCR_DBFE (1<<3) /* Double bus fault monitor enable */
+#define M360_SYPCR_BME (1<<2) /* Bus monitor external enable */
+#define M360_SYPCR_BMT1 (1<<1) /* Bus monitor timing bit 1 */
+#define M360_SYPCR_BMT0 (1<<0) /* Bus monitor timing bit 0 */
+
+/*
+ *************************************************************************
+ * Memory Control Registers *
+ *************************************************************************
+ */
+#define M360_GMR_RCNT(x) ((x)<<24) /* Refresh count */
+#define M360_GMR_RFEN (1<<23) /* Refresh enable */
+#define M360_GMR_RCYC(x) ((x)<<21) /* Refresh cycle length */
+#define M360_GMR_PGS(x) ((x)<<18) /* Page size */
+#define M360_GMR_DPS_32BIT (0<<16) /* DRAM port size */
+#define M360_GMR_DPS_16BIT (1<<16)
+#define M360_GMR_DPS_8BIT (2<<16)
+#define M360_GMR_DPS_DSACK (3<<16)
+#define M360_GMR_WBT40 (1<<15) /* Wait between 040 transfers */
+#define M360_GMR_WBTQ (1<<14) /* Wait between 360 transfers */
+#define M360_GMR_SYNC (1<<13) /* Synchronous external access */
+#define M360_GMR_EMWS (1<<12) /* External master wait state */
+#define M360_GMR_OPAR (1<<11) /* Odd parity */
+#define M360_GMR_PBEE (1<<10) /* Parity bus error enable */
+#define M360_GMR_TSS40 (1<<9) /* TS* sample for 040 */
+#define M360_GMR_NCS (1<<8) /* No CPU space */
+#define M360_GMR_DWQ (1<<7) /* Delay write for 360 */
+#define M360_GMR_DW40 (1<<6) /* Delay write for 040 */
+#define M360_GMR_GAMX (1<<5) /* Global address mux enable */
+
+#define M360_MEMC_BR_FC(x) ((x)<<7) /* Function code limit */
+#define M360_MEMC_BR_TRLXQ (1<<6) /* Relax timing requirements */
+#define M360_MEMC_BR_BACK40 (1<<5) /* Burst acknowledge to 040 */
+#define M360_MEMC_BR_CSNT40 (1<<4) /* CS* negate timing for 040 */
+#define M360_MEMC_BR_CSNTQ (1<<3) /* CS* negate timing for 360 */
+#define M360_MEMC_BR_PAREN (1<<2) /* Enable parity checking */
+#define M360_MEMC_BR_WP (1<<1) /* Write Protect */
+#define M360_MEMC_BR_V (1<<0) /* Base/Option register are valid */
+
+#define M360_MEMC_OR_TCYC(x) ((x)<<28) /* Cycle length (clocks) */
+#define M360_MEMC_OR_WAITS(x) M360_MEMC_OR_TCYC((x)+1)
+#define M360_MEMC_OR_2KB 0x0FFFF800 /* Address range */
+#define M360_MEMC_OR_4KB 0x0FFFF000
+#define M360_MEMC_OR_8KB 0x0FFFE000
+#define M360_MEMC_OR_16KB 0x0FFFC000
+#define M360_MEMC_OR_32KB 0x0FFF8000
+#define M360_MEMC_OR_64KB 0x0FFF0000
+#define M360_MEMC_OR_128KB 0x0FFE0000
+#define M360_MEMC_OR_256KB 0x0FFC0000
+#define M360_MEMC_OR_512KB 0x0FF80000
+#define M360_MEMC_OR_1MB 0x0FF00000
+#define M360_MEMC_OR_2MB 0x0FE00000
+#define M360_MEMC_OR_4MB 0x0FC00000
+#define M360_MEMC_OR_8MB 0x0F800000
+#define M360_MEMC_OR_16MB 0x0F000000
+#define M360_MEMC_OR_32MB 0x0E000000
+#define M360_MEMC_OR_64MB 0x0C000000
+#define M360_MEMC_OR_128MB 0x08000000
+#define M360_MEMC_OR_256MB 0x00000000
+#define M360_MEMC_OR_FCMC(x) ((x)<<7) /* Function code mask */
+#define M360_MEMC_OR_BCYC(x) ((x)<<5) /* Burst cycle length (clocks) */
+#define M360_MEMC_OR_PGME (1<<3) /* Page mode enable */
+#define M360_MEMC_OR_32BIT (0<<1) /* Port size */
+#define M360_MEMC_OR_16BIT (1<<1)
+#define M360_MEMC_OR_8BIT (2<<1)
+#define M360_MEMC_OR_DSACK (3<<1)
+#define M360_MEMC_OR_DRAM (1<<0) /* Dynamic RAM select */
+
+/*
+ *************************************************************************
+ * SI Mode Register (SIMODE) *
+ *************************************************************************
+ */
+#define M360_SI_SMC2_BITS 0xFFFF0000 /* All SMC2 bits */
+#define M360_SI_SMC2_TDM (1<<31) /* Multiplexed SMC2 */
+#define M360_SI_SMC2_BRG1 (0<<28) /* SMC2 clock souce */
+#define M360_SI_SMC2_BRG2 (1<<28)
+#define M360_SI_SMC2_BRG3 (2<<28)
+#define M360_SI_SMC2_BRG4 (3<<28)
+#define M360_SI_SMC2_CLK5 (0<<28)
+#define M360_SI_SMC2_CLK6 (1<<28)
+#define M360_SI_SMC2_CLK7 (2<<28)
+#define M360_SI_SMC2_CLK8 (3<<28)
+#define M360_SI_SMC1_BITS 0x0000FFFF /* All SMC1 bits */
+#define M360_SI_SMC1_TDM (1<<15) /* Multiplexed SMC1 */
+#define M360_SI_SMC1_BRG1 (0<<12) /* SMC1 clock souce */
+#define M360_SI_SMC1_BRG2 (1<<12)
+#define M360_SI_SMC1_BRG3 (2<<12)
+#define M360_SI_SMC1_BRG4 (3<<12)
+#define M360_SI_SMC1_CLK1 (0<<12)
+#define M360_SI_SMC1_CLK2 (1<<12)
+#define M360_SI_SMC1_CLK3 (2<<12)
+#define M360_SI_SMC1_CLK4 (3<<12)
+
+/*
+ *************************************************************************
+ * SDMA Configuration Register (SDMA) *
+ *************************************************************************
+ */
+#define M360_SDMA_FREEZE (2<<13) /* Freeze on next bus cycle */
+#define M360_SDMA_SISM_7 (7<<8) /* Normal interrupt service mask */
+#define M360_SDMA_SAID_4 (4<<4) /* Normal arbitration ID */
+#define M360_SDMA_INTE (1<<1) /* SBER interrupt enable */
+#define M360_SDMA_INTB (1<<0) /* SBKP interrupt enable */
+
+/*
+ *************************************************************************
+ * Baud (sic) Rate Generators *
+ *************************************************************************
+ */
+#define M360_BRG_RST (1<<17) /* Reset generator */
+#define M360_BRG_EN (1<<16) /* Enable generator */
+#define M360_BRG_EXTC_BRGCLK (0<<14) /* Source is BRGCLK */
+#define M360_BRG_EXTC_CLK2 (1<<14) /* Source is CLK2 pin */
+#define M360_BRG_EXTC_CLK6 (2<<14) /* Source is CLK6 pin */
+#define M360_BRG_ATB (1<<13) /* Autobaud */
+#define M360_BRG_115200 (13<<1) /* Assume 25 MHz clock */
+#define M360_BRG_57600 (26<<1)
+#define M360_BRG_38400 (40<<1)
+#define M360_BRG_19200 (80<<1)
+#define M360_BRG_9600 (162<<1)
+#define M360_BRG_4800 (324<<1)
+#define M360_BRG_2400 (650<<1)
+#define M360_BRG_1200 (1301<<1)
+#define M360_BRG_600 (2603<<1)
+#define M360_BRG_300 ((324<<1) | 1)
+#define M360_BRG_150 ((650<<1) | 1)
+#define M360_BRG_75 ((1301<<1) | 1)
+
+/*
+ *************************************************************************
+ * MC68360 DUAL-PORT RAM AND REGISTERS *
+ *************************************************************************
+ */
+typedef struct m360_ {
+ /*
+ * Dual-port RAM
+ */
+ rtems_unsigned8 dpram0[0x400]; /* Microcode program */
+ rtems_unsigned8 dpram1[0x200];
+ rtems_unsigned8 dpram2[0x100]; /* Microcode scratch */
+ rtems_unsigned8 dpram3[0x100]; /* Not on REV A or B masks */
+ rtems_unsigned8 _rsv0[0xC00-0x800];
+ m360SCCENparms_t scc1p;
+ rtems_unsigned8 _rsv1[0xCB0-0xC00-sizeof(m360SCCENparms_t)];
+ m360MiscParms_t miscp;
+ rtems_unsigned8 _rsv2[0xD00-0xCB0-sizeof(m360MiscParms_t)];
+ m360SCCparms_t scc2p;
+ rtems_unsigned8 _rsv3[0xD80-0xD00-sizeof(m360SCCparms_t)];
+ m360SPIparms_t spip;
+ rtems_unsigned8 _rsv4[0xDB0-0xD80-sizeof(m360SPIparms_t)];
+ m360TimerParms_t tmp;
+ rtems_unsigned8 _rsv5[0xE00-0xDB0-sizeof(m360TimerParms_t)];
+ m360SCCparms_t scc3p;
+ rtems_unsigned8 _rsv6[0xE70-0xE00-sizeof(m360SCCparms_t)];
+ m360IDMAparms_t idma1p;
+ rtems_unsigned8 _rsv7[0xE80-0xE70-sizeof(m360IDMAparms_t)];
+ m360SMCparms_t smc1p;
+ rtems_unsigned8 _rsv8[0xF00-0xE80-sizeof(m360SMCparms_t)];
+ m360SCCparms_t scc4p;
+ rtems_unsigned8 _rsv9[0xF70-0xF00-sizeof(m360SCCparms_t)];
+ m360IDMAparms_t idma2p;
+ rtems_unsigned8 _rsv10[0xF80-0xF70-sizeof(m360IDMAparms_t)];
+ m360SMCparms_t smc2p;
+ rtems_unsigned8 _rsv11[0x1000-0xF80-sizeof(m360SMCparms_t)];
+
+ /*
+ * SIM Block
+ */
+ rtems_unsigned32 mcr;
+ rtems_unsigned32 _pad00;
+ rtems_unsigned8 avr;
+ rtems_unsigned8 rsr;
+ rtems_unsigned16 _pad01;
+ rtems_unsigned8 clkocr;
+ rtems_unsigned8 _pad02;
+ rtems_unsigned16 _pad03;
+ rtems_unsigned16 pllcr;
+ rtems_unsigned16 _pad04;
+ rtems_unsigned16 cdvcr;
+ rtems_unsigned16 pepar;
+ rtems_unsigned32 _pad05[2];
+ rtems_unsigned16 _pad06;
+ rtems_unsigned8 sypcr;
+ rtems_unsigned8 swiv;
+ rtems_unsigned16 _pad07;
+ rtems_unsigned16 picr;
+ rtems_unsigned16 _pad08;
+ rtems_unsigned16 pitr;
+ rtems_unsigned16 _pad09;
+ rtems_unsigned8 _pad10;
+ rtems_unsigned8 swsr;
+ rtems_unsigned32 bkar;
+ rtems_unsigned32 bcar;
+ rtems_unsigned32 _pad11[2];
+
+ /*
+ * MEMC Block
+ */
+ rtems_unsigned32 gmr;
+ rtems_unsigned16 mstat;
+ rtems_unsigned16 _pad12;
+ rtems_unsigned32 _pad13[2];
+ m360MEMCRegisters_t memc[8];
+ rtems_unsigned8 _pad14[0xF0-0xD0];
+ rtems_unsigned8 _pad15[0x100-0xF0];
+ rtems_unsigned8 _pad16[0x500-0x100];
+
+ /*
+ * IDMA1 Block
+ */
+ rtems_unsigned16 iccr;
+ rtems_unsigned16 _pad17;
+ rtems_unsigned16 cmr1;
+ rtems_unsigned16 _pad18;
+ rtems_unsigned32 sapr1;
+ rtems_unsigned32 dapr1;
+ rtems_unsigned32 bcr1;
+ rtems_unsigned8 fcr1;
+ rtems_unsigned8 _pad19;
+ rtems_unsigned8 cmar1;
+ rtems_unsigned8 _pad20;
+ rtems_unsigned8 csr1;
+ rtems_unsigned8 _pad21;
+ rtems_unsigned16 _pad22;
+
+ /*
+ * SDMA Block
+ */
+ rtems_unsigned8 sdsr;
+ rtems_unsigned8 _pad23;
+ rtems_unsigned16 sdcr;
+ rtems_unsigned32 sdar;
+
+ /*
+ * IDMA2 Block
+ */
+ rtems_unsigned16 _pad24;
+ rtems_unsigned16 cmr2;
+ rtems_unsigned32 sapr2;
+ rtems_unsigned32 dapr2;
+ rtems_unsigned32 bcr2;
+ rtems_unsigned8 fcr2;
+ rtems_unsigned8 _pad26;
+ rtems_unsigned8 cmar2;
+ rtems_unsigned8 _pad27;
+ rtems_unsigned8 csr2;
+ rtems_unsigned8 _pad28;
+ rtems_unsigned16 _pad29;
+ rtems_unsigned32 _pad30;
+
+ /*
+ * CPIC Block
+ */
+ rtems_unsigned32 cicr;
+ rtems_unsigned32 cipr;
+ rtems_unsigned32 cimr;
+ rtems_unsigned32 cisr;
+
+ /*
+ * Parallel I/O Block
+ */
+ rtems_unsigned16 padir;
+ rtems_unsigned16 papar;
+ rtems_unsigned16 paodr;
+ rtems_unsigned16 padat;
+ rtems_unsigned32 _pad31[2];
+ rtems_unsigned16 pcdir;
+ rtems_unsigned16 pcpar;
+ rtems_unsigned16 pcso;
+ rtems_unsigned16 pcdat;
+ rtems_unsigned16 pcint;
+ rtems_unsigned16 _pad32;
+ rtems_unsigned32 _pad33[5];
+
+ /*
+ * TIMER Block
+ */
+ rtems_unsigned16 tgcr;
+ rtems_unsigned16 _pad34;
+ rtems_unsigned32 _pad35[3];
+ rtems_unsigned16 tmr1;
+ rtems_unsigned16 tmr2;
+ rtems_unsigned16 trr1;
+ rtems_unsigned16 trr2;
+ rtems_unsigned16 tcr1;
+ rtems_unsigned16 tcr2;
+ rtems_unsigned16 tcn1;
+ rtems_unsigned16 tcn2;
+ rtems_unsigned16 tmr3;
+ rtems_unsigned16 tmr4;
+ rtems_unsigned16 trr3;
+ rtems_unsigned16 trr4;
+ rtems_unsigned16 tcr3;
+ rtems_unsigned16 tcr4;
+ rtems_unsigned16 tcn3;
+ rtems_unsigned16 tcn4;
+ rtems_unsigned16 ter1;
+ rtems_unsigned16 ter2;
+ rtems_unsigned16 ter3;
+ rtems_unsigned16 ter4;
+ rtems_unsigned32 _pad36[2];
+
+ /*
+ * CP Block
+ */
+ rtems_unsigned16 cr;
+ rtems_unsigned16 _pad37;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 _pad38;
+ rtems_unsigned32 _pad39[3];
+ rtems_unsigned16 _pad40;
+ rtems_unsigned16 rter;
+ rtems_unsigned16 _pad41;
+ rtems_unsigned16 rtmr;
+ rtems_unsigned32 _pad42[5];
+
+ /*
+ * BRG Block
+ */
+ rtems_unsigned32 brgc1;
+ rtems_unsigned32 brgc2;
+ rtems_unsigned32 brgc3;
+ rtems_unsigned32 brgc4;
+
+ /*
+ * SCC Block
+ */
+ m360SCCRegisters_t scc1;
+ m360SCCRegisters_t scc2;
+ m360SCCRegisters_t scc3;
+ m360SCCRegisters_t scc4;
+
+ /*
+ * SMC Block
+ */
+ m360SMCRegisters_t smc1;
+ m360SMCRegisters_t smc2;
+
+ /*
+ * SPI Block
+ */
+ rtems_unsigned16 spmode;
+ rtems_unsigned16 _pad43[2];
+ rtems_unsigned8 spie;
+ rtems_unsigned8 _pad44;
+ rtems_unsigned16 _pad45;
+ rtems_unsigned8 spim;
+ rtems_unsigned8 _pad46[2];
+ rtems_unsigned8 spcom;
+ rtems_unsigned16 _pad47[2];
+
+ /*
+ * PIP Block
+ */
+ rtems_unsigned16 pipc;
+ rtems_unsigned16 _pad48;
+ rtems_unsigned16 ptpr;
+ rtems_unsigned32 pbdir;
+ rtems_unsigned32 pbpar;
+ rtems_unsigned16 _pad49;
+ rtems_unsigned16 pbodr;
+ rtems_unsigned32 pbdat;
+ rtems_unsigned32 _pad50[6];
+
+ /*
+ * SI Block
+ */
+ rtems_unsigned32 simode;
+ rtems_unsigned8 sigmr;
+ rtems_unsigned8 _pad51;
+ rtems_unsigned8 sistr;
+ rtems_unsigned8 sicmr;
+ rtems_unsigned32 _pad52;
+ rtems_unsigned32 sicr;
+ rtems_unsigned16 _pad53;
+ rtems_unsigned16 sirp[2];
+ rtems_unsigned16 _pad54;
+ rtems_unsigned32 _pad55[2];
+ rtems_unsigned8 siram[256];
+} m360_t;
+
+extern volatile m360_t m360;
+
+#endif /* __MC68360_h */
diff --git a/cpukit/score/cpu/m68k/qsm.h b/cpukit/score/cpu/m68k/qsm.h
new file mode 100644
index 0000000000..e1bf33bc12
--- /dev/null
+++ b/cpukit/score/cpu/m68k/qsm.h
@@ -0,0 +1,209 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * QSM -- Queued Serial Module
+ *
+ * The QSM contains two serial interfaces: (a) the queued serial
+ * peripheral interface (QSPI) and the serial communication interface
+ * (SCI). The QSPI provides peripheral expansion and/or interprocessor
+ * communication through a full-duplex, synchronous, three-wire bus. A
+ * self contained RAM queue permits serial data transfers without CPU
+ * intervention and automatic continuous sampling. The SCI provides a
+ * standard non-return to zero mark/space format with wakeup functions
+ * to allow the CPU to run uninterrupted until woken
+ *
+ * For more information, refer to Motorola's "Modular Microcontroller
+ * Family Queued Serial Module Reference Manual" (Motorola document
+ * QSMRM/AD).
+ *
+ * This file has been created by John S. Gwynne for support of
+ * Motorola's 68332 MCU in the efi332 project.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above authorship, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _QSM_H_
+#define _QSM_H_
+
+
+#include <efi332.h>
+
+
+/* SAM-- shift and mask */
+#undef SAM
+#define SAM(a,b,c) ((a << b) & c)
+
+
+/* QSM_CRB (QSM Control Register Block) base address of the QSM
+ control registers */
+#if SIM_MM == 0
+#define QSM_CRB 0x7ffc00
+#else
+#undef SIM_MM
+#define SIM_MM 1
+#define QSM_CRB 0xfffc00
+#endif
+
+
+#define QSMCR (volatile unsigned short int * const)(0x00 + QSM_CRB)
+ /* QSM Configuration Register */
+#define STOP 0x8000 /* Stop Enable */
+#define FRZ 0x6000 /* Freeze Control */
+#define SUPV 0x0080 /* Supervisor/Unrestricted */
+#define IARB 0x000f /* Inerrupt Arbitration */
+
+
+#define QTEST (volatile unsigned short int * const)(0x02 + QSM_CRB)
+ /* QSM Test Register */
+/* Used only for factor testing */
+
+
+#define QILR (volatile unsigned char * const)(0x04 + QSM_CRB)
+ /* QSM Interrupt Level Register */
+#define ILQSPI 0x38 /* Interrupt Level for QSPI */
+#define ILSCI 0x07 /* Interrupt Level for SCI */
+
+
+#define QIVR (volatile unsigned char * const)(0x05 + QSM_CRB)
+ /* QSM Interrupt Vector Register */
+#define INTV 0xff /* Interrupt Vector Number */
+
+
+#define SCCR0 (volatile unsigned short int * const)(0x08 + QSM_CRB)
+ /* SCI Control Register 0 */
+#define SCBR 0x1fff /* SCI Baud Rate */
+
+
+#define SCCR1 (volatile unsigned short int * const)(0x0a + QSM_CRB)
+ /* SCI Control Register 1 */
+#define LOOPS 0x4000 /* Loop Mode */
+#define WOMS 0x2000 /* Wired-OR Mode for SCI Pins */
+#define ILT 0x1000 /* Idle-Line Detect Type */
+#define PT 0x0800 /* Parity Type */
+#define PE 0x0400 /* Parity Enable */
+#define M 0x0200 /* Mode Select */
+#define WAKE 0x0100 /* Wakeup by Address Mark */
+#define TIE 0x0080 /* Transmit Complete Interrupt Enable */
+#define TCIE 0x0040 /* Transmit Complete Interrupt Enable */
+#define RIE 0x0020 /* Receiver Interrupt Enable */
+#define ILIE 0x0010 /* Idle-Line Interrupt Enable */
+#define TE 0x0008 /* Transmitter Enable */
+#define RE 0x0004 /* Receiver Enable */
+#define RWU 0x0002 /* Receiver Wakeup */
+#define SBK 0x0001 /* Send Break */
+
+
+#define SCSR (volatile unsigned short int * const)(0x0c + QSM_CRB)
+ /* SCI Status Register */
+#define TDRE 0x0100 /* Transmit Data Register Empty */
+#define TC 0x0080 /* Transmit Complete */
+#define RDRF 0x0040 /* Receive Data Register Full */
+#define RAF 0x0020 /* Receiver Active */
+#define IDLE 0x0010 /* Idle-Line Detected */
+#define OR 0x0008 /* Overrun Error */
+#define NF 0x0004 /* Noise Error Flag */
+#define FE 0x0002 /* Framing Error */
+#define PF 0x0001 /* Parity Error */
+
+
+#define SCDR (volatile unsigned short int * const)(0x0e + QSM_CRB)
+ /* SCI Data Register */
+
+
+#define PORTQS (volatile unsigned char * const)(0x15 + QSM_CRB)
+ /* Port QS Data Register */
+
+#define PQSPAR (volatile unsigned char * const)(0x16 + QSM_CRB)
+ /* PORT QS Pin Assignment Rgister */
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a QSPI
+ signal. */
+/* note: PQS2 is a digital I/O pin unless the SPI is enabled in which
+ case it becomes the SPI serial clock SCK. */
+/* note: PQS7 is a digital I/O pin unless the SCI transmitter is
+ enabled in which case it becomes the SCI serial output TxD. */
+#define QSMFun 0x0
+#define QSMDis 0x1
+/*
+ * PQSPAR Field | QSM Function | Discrete I/O pin
+ *------------------+--------------+------------------ */
+#define PQSPA0 0 /* MISO | PQS0 */
+#define PQSPA1 1 /* MOSI | PQS1 */
+#define PQSPA2 2 /* SCK | PQS2 (see note)*/
+#define PQSPA3 3 /* PCSO/!SS | PQS3 */
+#define PQSPA4 4 /* PCS1 | PQS4 */
+#define PQSPA5 5 /* PCS2 | PQS5 */
+#define PQSPA6 6 /* PCS3 | PQS6 */
+#define PQSPA7 7 /* TxD | PQS7 (see note)*/
+
+
+#define DDRQS (volatile unsigned char * const)(0x17 + QSM_CRB)
+ /* PORT QS Data Direction Register */
+/* Clearing a bit makes the corresponding pin an input; setting a bit
+ makes the pin an output. */
+
+
+#define SPCR0 (volatile unsigned short int * const)(0x18 + QSM_CRB)
+ /* QSPI Control Register 0 */
+#define MSTR 0x8000 /* Master/Slave Mode Select */
+#define WOMQ 0x4000 /* Wired-OR Mode for QSPI Pins */
+#define BITS 0x3c00 /* Bits Per Transfer */
+#define CPOL 0x0200 /* Clock Polarity */
+#define CPHA 0x0100 /* Clock Phase */
+#define SPBR 0x00ff /* Serial Clock Baud Rate */
+
+
+#define SPCR1 (volatile unsigned short int * const)(0x1a + QSM_CRB)
+ /* QSPI Control Register 1 */
+#define SPE 0x8000 /* QSPI Enable */
+#define DSCKL 0x7f00 /* Delay before SCK */
+#define DTL 0x00ff /* Length of Delay after Transfer */
+
+
+#define SPCR2 (volatile unsigned short int * const)(0x1c + QSM_CRB)
+ /* QSPI Control Register 2 */
+#define SPIFIE 0x8000 /* SPI Finished Interrupt Enable */
+#define WREN 0x4000 /* Wrap Enable */
+#define WRTO 0x2000 /* Wrap To */
+#define ENDQP 0x0f00 /* Ending Queue Pointer */
+#define NEWQP 0x000f /* New Queue Pointer Value */
+
+
+#define SPCR3 (volatile unsigned char * const)(0x1e + QSM_CRB)
+ /* QSPI Control Register 3 */
+#define LOOPQ 0x0400 /* QSPI Loop Mode */
+#define HMIE 0x0200 /* HALTA and MODF Interrupt Enable */
+#define HALT 0x0100 /* Halt */
+
+
+#define SPSR (volatile unsigned char * const)(0x1f + QSM_CRB)
+ /* QSPI Status Register */
+#define SPIF 0x0080 /* QSPI Finished Flag */
+#define MODF 0x0040 /* Mode Fault Flag */
+#define HALTA 0x0020 /* Halt Acknowlwdge Flag */
+#define CPTQP x0000f /* Completed Queue Pointer */
+
+#define QSPIRR (volatile unsigned char * const)(0x100 + QSM_CRB)
+ /* QSPI Receive Data RAM */
+#define QSPITR (volatile unsigned char * const)(0x120 + QSM_CRB)
+ /* QSPI Transmit Data RAM */
+#define QSPIcR (volatile unsigned char * const)(0x140 + QSM_CRB)
+ /* QSPI Command RAM */
+
+#endif /* _QSM_H_ */
diff --git a/cpukit/score/cpu/m68k/rtems/asm.h b/cpukit/score/cpu/m68k/rtems/asm.h
new file mode 100644
index 0000000000..2f63ddee53
--- /dev/null
+++ b/cpukit/score/cpu/m68k/rtems/asm.h
@@ -0,0 +1,132 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __M68k_ASM_h
+#define __M68k_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+#define d0 REG (d0)
+#define d1 REG (d1)
+#define d2 REG (d2)
+#define d3 REG (d3)
+#define d4 REG (d4)
+#define d5 REG (d5)
+#define d6 REG (d6)
+#define d7 REG (d7)
+#define a0 REG (a0)
+#define a1 REG (a1)
+#define a2 REG (a2)
+#define a3 REG (a3)
+#define a4 REG (a4)
+#define a5 REG (a5)
+#define a6 REG (a6)
+#define a7 REG (a7)
+
+#define msp REG (msp)
+#define usp REG (usp)
+#define isp REG (isp)
+#define sr REG (sr)
+#define vbr REG (vbr)
+#define dfc REG (dfc)
+
+#define fp0 REG (fp0)
+#define fp1 REG (fp1)
+#define fp2 REG (fp2)
+#define fp3 REG (fp3)
+#define fp4 REG (fp4)
+#define fp5 REG (fp5)
+#define fp6 REG (fp6)
+#define fp7 REG (fp7)
+
+#define fpc REG (fpc)
+#define fpi REG (fpi)
+#define fps REG (fps)
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/m68k/rtems/m68k/m68302.h b/cpukit/score/cpu/m68k/rtems/m68k/m68302.h
new file mode 100644
index 0000000000..da96478cf3
--- /dev/null
+++ b/cpukit/score/cpu/m68k/rtems/m68k/m68302.h
@@ -0,0 +1,608 @@
+/*
+ *------------------------------------------------------------------
+ *
+ * m68302.h - Definitions for Motorola MC68302 processor.
+ *
+ * Section references in this file refer to revision 2 of Motorola's
+ * "MC68302 Integrated Multiprotocol Processor User's Manual".
+ * (Motorola document MC68302UM/AD REV 2.)
+ *
+ * Based on Don Meyer's cpu68302.h that was posted in comp.sys.m68k
+ * on 17 February, 1993.
+ *
+ * Copyright 1995 David W. Glessner.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above copyright notice, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *
+ * $Id$
+ *
+ *------------------------------------------------------------------
+ */
+
+#ifndef __MOTOROLA_MC68302_DEFINITIONS_h
+#define __MOTOROLA_MC68302_DEFINITIONS_h
+
+/*
+ * BAR - Base Address Register
+ * Section 2.7
+ */
+#define M302_BAR (*((volatile rtems_unsigned16 *) 0xf2))
+
+/*
+ * SCR - System Control Register
+ * Section 3.8.1
+ */
+#define M302_SCR (*((volatile rtems_unsigned32 *) 0xf4))
+/*
+ * SCR bits
+ */
+#define RBIT_SCR_IPA 0x08000000
+#define RBIT_SCR_HWT 0x04000000
+#define RBIT_SCR_WPV 0x02000000
+#define RBIT_SCR_ADC 0x01000000
+
+#define RBIT_SCR_ERRE 0x00400000
+#define RBIT_SCR_VGE 0x00200000
+#define RBIT_SCR_WPVE 0x00100000
+#define RBIT_SCR_RMCST 0x00080000
+#define RBIT_SCR_EMWS 0x00040000
+#define RBIT_SCR_ADCE 0x00020000
+#define RBIT_SCR_BCLM 0x00010000
+
+#define RBIT_SCR_FRZW 0x00008000
+#define RBIT_SCR_FRZ2 0x00004000
+#define RBIT_SCR_FRZ1 0x00002000
+#define RBIT_SCR_SAM 0x00001000
+#define RBIT_SCR_HWDEN 0x00000800
+#define RBIT_SCR_HWDCN2 0x00000400
+#define RBIT_SCR_HWDCN1 0x00000200
+#define RBIT_SCR_HWDCN0 0x00000100
+
+#define RBIT_SCR_LPREC 0x00000080
+#define RBIT_SCR_LPP16 0x00000040
+#define RBIT_SCR_LPEN 0x00000020
+#define RBIT_SCR_LPCLKDIV 0x0000001f
+
+
+/*
+ * 68000 interrupt and trap vector numbers
+ */
+#define M68K_IVEC_BUS_ERROR 2
+#define M68K_IVEC_ADDRESS_ERROR 3
+#define M68K_IVEC_ILLEGAL_OPCODE 4
+#define M68K_IVEC_ZERO_DIVIDE 5
+#define M68K_IVEC_CHK 6
+#define M68K_IVEC_TRAPV 7
+#define M68K_IVEC_PRIVILEGE 8
+#define M68K_IVEC_TRACE 9
+#define M68K_IVEC_LINE_A 10
+#define M68K_IVEC_LINE_F 11
+/* Unassigned, Reserved 12-14 */
+#define M68K_IVEC_UNINITIALIZED_INT 15
+/* Unassigned, Reserved 16-23 */
+#define M68K_IVEC_SPURIOUS_INT 24
+
+#define M68K_IVEC_LEVEL1_AUTOVECTOR 25
+#define M68K_IVEC_LEVEL2_AUTOVECTOR 26
+#define M68K_IVEC_LEVEL3_AUTOVECTOR 27
+#define M68K_IVEC_LEVEL4_AUTOVECTOR 28
+#define M68K_IVEC_LEVEL5_AUTOVECTOR 29
+#define M68K_IVEC_LEVEL6_AUTOVECTOR 30
+#define M68K_IVEC_LEVEL7_AUTOVECTOR 31
+
+#define M68K_IVEC_TRAP0 32
+#define M68K_IVEC_TRAP1 33
+#define M68K_IVEC_TRAP2 34
+#define M68K_IVEC_TRAP3 35
+#define M68K_IVEC_TRAP4 36
+#define M68K_IVEC_TRAP5 37
+#define M68K_IVEC_TRAP6 38
+#define M68K_IVEC_TRAP7 39
+#define M68K_IVEC_TRAP8 40
+#define M68K_IVEC_TRAP9 41
+#define M68K_IVEC_TRAP10 42
+#define M68K_IVEC_TRAP11 43
+#define M68K_IVEC_TRAP12 44
+#define M68K_IVEC_TRAP13 45
+#define M68K_IVEC_TRAP14 46
+#define M68K_IVEC_TRAP15 47
+/*
+ * Unassigned, Reserved 48-59
+ *
+ * Note: Vectors 60-63 are used by the MC68302 (e.g. BAR, SCR).
+ */
+
+/*
+ * MC68302 Interrupt Vectors
+ * Section 3.2
+ */
+enum m68302_ivec_e {
+ M302_IVEC_ERR =0,
+ M302_IVEC_PB8 =1, /* General-Purpose Interrupt 0 */
+ M302_IVEC_SMC2 =2,
+ M302_IVEC_SMC1 =3,
+ M302_IVEC_TIMER3 =4,
+ M302_IVEC_SCP =5,
+ M302_IVEC_TIMER2 =6,
+ M302_IVEC_PB9 =7, /* General-Purpose Interrupt 1 */
+ M302_IVEC_SCC3 =8,
+ M302_IVEC_TIMER1 =9,
+ M302_IVEC_SCC2 =10,
+ M302_IVEC_IDMA =11,
+ M302_IVEC_SDMA =12, /* SDMA Channels Bus Error */
+ M302_IVEC_SCC1 =13,
+ M302_IVEC_PB10 =14, /* General-Purpose Interrupt 2 */
+ M302_IVEC_PB11 =15, /* General-Purpose Interrupt 3 */
+ M302_IVEC_IRQ1 =17, /* External Device */
+ M302_IVEC_IRQ6 =22, /* External Device */
+ M302_IVEC_IRQ7 =23 /* External Device */
+};
+
+
+/*
+ * GIMR - Global Interrupt Mode Register
+ * Section 3.2.5.1
+ */
+#define RBIT_GIMR_MOD (1<<15)
+#define RBIT_GIMR_IV7 (1<<14)
+#define RBIT_GIMR_IV6 (1<<13)
+#define RBIT_GIMR_IV1 (1<<12)
+#define RBIT_GIMR_ET7 (1<<10)
+#define RBIT_GIMR_ET6 (1<<9)
+#define RBIT_GIMR_ET1 (1<<8)
+#define RBIT_GIMR_VECTOR (7<<5)
+
+/*
+ * IPR - Interrupt Pending Register (Section 3.2.5.2)
+ * IMR - Interrupt Mask Register (Section 3.2.5.3)
+ * ISR - Interrupt In-Service Register (Section 3.2.5.4)
+ */
+#define RBIT_IPR_PB11 (1<<15)
+#define RBIT_IPR_PB10 (1<<14)
+#define RBIT_IPR_SCC1 (1<<13)
+#define RBIT_IPR_SDMA (1<<12)
+#define RBIT_IPR_IDMA (1<<11)
+#define RBIT_IPR_SCC2 (1<<10)
+#define RBIT_IPR_TIMER1 (1<<9)
+#define RBIT_IPR_SCC3 (1<<8)
+#define RBIT_IPR_PB9 (1<<7)
+#define RBIT_IPR_TIMER2 (1<<6)
+#define RBIT_IPR_SCP (1<<5)
+#define RBIT_IPR_TIMER3 (1<<4)
+#define RBIT_IPR_SMC1 (1<<3)
+#define RBIT_IPR_SMC2 (1<<2)
+#define RBIT_IPR_PB8 (1<<1)
+#define RBIT_IPR_ERR (1<<0)
+
+#define RBIT_ISR_PB11 (1<<15)
+#define RBIT_ISR_PB10 (1<<14)
+#define RBIT_ISR_SCC1 (1<<13)
+#define RBIT_ISR_SDMA (1<<12)
+#define RBIT_ISR_IDMA (1<<11)
+#define RBIT_ISR_SCC2 (1<<10)
+#define RBIT_ISR_TIMER1 (1<<9)
+#define RBIT_ISR_SCC3 (1<<8)
+#define RBIT_ISR_PB9 (1<<7)
+#define RBIT_ISR_TIMER2 (1<<6)
+#define RBIT_ISR_SCP (1<<5)
+#define RBIT_ISR_TIMER3 (1<<4)
+#define RBIT_ISR_SMC1 (1<<3)
+#define RBIT_ISR_SMC2 (1<<2)
+#define RBIT_ISR_PB8 (1<<1)
+
+#define RBIT_IMR_PB11 (1<<15) /* PB11 Interrupt Mask */
+#define RBIT_IMR_PB10 (1<<14) /* PB10 Interrupt Mask */
+#define RBIT_IMR_SCC1 (1<<13) /* SCC1 Interrupt Mask */
+#define RBIT_IMR_SDMA (1<<12) /* SDMA Interrupt Mask */
+#define RBIT_IMR_IDMA (1<<11) /* IDMA Interrupt Mask */
+#define RBIT_IMR_SCC2 (1<<10) /* SCC2 Interrupt Mask */
+#define RBIT_IMR_TIMER1 (1<<9) /* TIMER1 Interrupt Mask */
+#define RBIT_IMR_SCC3 (1<<8) /* SCC3 Interrupt Mask */
+#define RBIT_IMR_PB9 (1<<7) /* PB9 Interrupt Mask */
+#define RBIT_IMR_TIMER2 (1<<6) /* TIMER2 Interrupt Mask */
+#define RBIT_IMR_SCP (1<<5) /* SCP Interrupt Mask */
+#define RBIT_IMR_TIMER3 (1<<4) /* TIMER3 Interrupt Mask */
+#define RBIT_IMR_SMC1 (1<<3) /* SMC1 Interrupt Mask */
+#define RBIT_IMR_SMC2 (1<<2) /* SMC2 Interrupt Mask */
+#define RBIT_IMR_PB8 (1<<1) /* PB8 Interrupt Mask */
+
+
+/*
+ * DRAM Refresh
+ * Section 3.9
+ *
+ * The DRAM refresh memory map replaces the SCC2 Tx BD 6 and Tx BD 7
+ * structures in the parameter RAM.
+ *
+ * Access to the DRAM registers can be accomplished by
+ * the following approach:
+ *
+ * volatile m302_DRAM_refresh_t *dram;
+ * dram = (volatile m302_DRAM_refresh_t *) &m302.scc2.bd.tx[6];
+ *
+ * Then simply use pointer references (e.g. dram->count = 3).
+ */
+typedef struct {
+ rtems_unsigned16 dram_high; /* DRAM high address and FC */
+ rtems_unsigned16 dram_low; /* DRAM low address */
+ rtems_unsigned16 increment; /* increment step (bytes/row) */
+ rtems_unsigned16 count; /* RAM refresh cycle count (#rows) */
+ rtems_unsigned16 t_ptr_h; /* temporary refresh high addr & FC */
+ rtems_unsigned16 t_ptr_l; /* temporary refresh low address */
+ rtems_unsigned16 t_count; /* temporary refresh cycles count */
+ rtems_unsigned16 res; /* reserved */
+} m302_DRAM_refresh_t;
+
+
+/*
+ * TMR - Timer Mode Register (for timers 1 and 2)
+ * Section 3.5.2.1
+ */
+#define RBIT_TMR_ICLK_STOP (0<<1)
+#define RBIT_TMR_ICLK_MASTER (1<<1)
+#define RBIT_TMR_ICLK_MASTER16 (2<<1)
+#define RBIT_TMR_ICLK_TIN (3<<1)
+
+#define RBIT_TMR_OM (1<<5)
+#define RBIT_TMR_ORI (1<<4)
+#define RBIT_TMR_FRR (1<<3)
+#define RBIT_TMR_RST (1<<0)
+
+
+/*
+ * TER - Timer Event Register (for timers 1 and 2)
+ * Section 3.5.2.5
+ */
+#define RBIT_TER_REF (1<<1) /* Output Reference Event */
+#define RBIT_TER_CAP (1<<0) /* Capture Event */
+
+
+/*
+ * SCC Buffer Descriptors and Buffer Descriptors Table
+ * Section 4.5.5
+ */
+typedef struct m302_SCC_bd {
+ rtems_unsigned16 status; /* status and control */
+ rtems_unsigned16 length; /* data length */
+ rtems_unsigned8 *buffer; /* data buffer pointer */
+} m302_SCC_bd_t;
+
+typedef struct {
+ m302_SCC_bd_t rx[8]; /* receive buffer descriptors */
+ m302_SCC_bd_t tx[8]; /* transmit buffer descriptors */
+} m302_SCC_bd_table_t;
+
+
+/*
+ * SCC Parameter RAM (offset 0x080 from an SCC Base)
+ * Section 4.5.6
+ *
+ * Each SCC parameter RAM area begins at offset 0x80 from each SCC base
+ * area (0x400, 0x500, or 0x600 from the dual-port RAM base).
+ *
+ * Offsets 0x9c-0xbf from each SCC base area compose the protocol-specific
+ * portion of the SCC parameter RAM.
+ */
+typedef struct {
+ rtems_unsigned8 rfcr; /* Rx Function Code */
+ rtems_unsigned8 tfcr; /* Tx Function Code */
+ rtems_unsigned16 mrblr; /* Maximum Rx Buffer Length */
+ rtems_unsigned16 _rstate; /* Rx Internal State */
+ rtems_unsigned8 res2;
+ rtems_unsigned8 rbd; /* Rx Internal Buffer Number */
+ rtems_unsigned32 _rdptr; /* Rx Internal Data Pointer */
+ rtems_unsigned16 _rcount; /* Rx Internal Byte Count */
+ rtems_unsigned16 _rtmp; /* Rx Temp */
+ rtems_unsigned16 _tstate; /* Tx Internal State */
+ rtems_unsigned8 res7;
+ rtems_unsigned8 tbd; /* Tx Internal Buffer Number */
+ rtems_unsigned32 _tdptr; /* Tx Internal Data Pointer */
+ rtems_unsigned16 _tcount; /* Tx Internal Byte Count */
+ rtems_unsigned16 _ttmp; /* Tx Temp */
+} m302_SCC_parameters_t;
+
+/*
+ * UART-Specific SCC Parameter RAM
+ * Section 4.5.11.3
+ */
+typedef struct {
+ rtems_unsigned16 max_idl; /* Maximum IDLE Characters (rx) */
+ rtems_unsigned16 idlc; /* Temporary rx IDLE counter */
+ rtems_unsigned16 brkcr; /* Break Count Register (tx) */
+ rtems_unsigned16 parec; /* Receive Parity Error Counter */
+ rtems_unsigned16 frmec; /* Receive Framing Error Counter */
+ rtems_unsigned16 nosec; /* Receive Noise Counter */
+ rtems_unsigned16 brkec; /* Receive Break Condition Counter */
+ rtems_unsigned16 uaddr1; /* UART ADDRESS Character 1 */
+ rtems_unsigned16 uaddr2; /* UART ADDRESS Character 2 */
+ rtems_unsigned16 rccr; /* Receive Control Character Register */
+ rtems_unsigned16 character[8]; /* Control Characters 1 through 8*/
+} m302_SCC_UartSpecific_t;
+/*
+ * This definition allows for the checking of receive buffers
+ * for errors.
+ */
+
+#define RCV_ERR 0x003F
+
+/*
+ * UART receive buffer descriptor bit definitions.
+ * Section 4.5.11.14
+ */
+#define RBIT_UART_CTRL (1<<11) /* buffer contains a control char */
+#define RBIT_UART_ADDR (1<<10) /* first byte contains an address */
+#define RBIT_UART_MATCH (1<<9) /* indicates which addr char matched */
+#define RBIT_UART_IDLE (1<<8) /* buffer closed due to IDLE sequence */
+#define RBIT_UART_BR (1<<5) /* break sequence was received */
+#define RBIT_UART_FR (1<<4) /* framing error was received */
+#define RBIT_UART_PR (1<<3) /* parity error was received */
+#define RBIT_UART_OV (1<<1) /* receiver overrun occurred */
+#define RBIT_UART_CD (1<<0) /* carrier detect lost */
+#define RBIT_UART_STATUS 0x003B /* all status bits */
+
+/*
+ * UART transmit buffer descriptor bit definitions.
+ * Section 4.5.11.15
+ */
+#define RBIT_UART_CR (1<<11) /* clear-to-send report
+ * this results in two idle bits
+ * between back-to-back frames
+ */
+#define RBIT_UART_A (1<<10) /* buffer contains address characters
+ * only valid in multidrop mode (UM0=1)
+ */
+#define RBIT_UART_PREAMBLE (1<<9) /* send preamble before data */
+#define RBIT_UART_CTS_LOST (1<<0) /* CTS lost */
+
+/*
+ * UART event register
+ * Section 4.5.11.16
+ */
+#define M302_UART_EV_CTS (1<<7) /* CTS status changed */
+#define M302_UART_EV_CD (1<<6) /* carrier detect status changed */
+#define M302_UART_EV_IDL (1<<5) /* IDLE sequence status changed */
+#define M302_UART_EV_BRK (1<<4) /* break character was received */
+#define M302_UART_EV_CCR (1<<3) /* control character received */
+#define M302_UART_EV_TX (1<<1) /* buffer has been transmitted */
+#define M302_UART_EV_RX (1<<0) /* buffer has been received */
+
+
+/*
+ * HDLC-Specific SCC Parameter RAM
+ * Section 4.5.12.3
+ *
+ * c_mask_l should be 0xF0B8 for 16-bit CRC, 0xdebb for 32-bit CRC
+ * c_mask_h is a don't care for 16-bit CRC, 0x20E2 for 32-bit CRC
+ */
+typedef struct {
+ rtems_unsigned16 rcrc_l; /* Temp Receive CRC Low */
+ rtems_unsigned16 rcrc_h; /* Temp Receive CRC High */
+ rtems_unsigned16 c_mask_l; /* CRC Mask Low */
+ rtems_unsigned16 c_mask_h; /* CRC Mask High */
+ rtems_unsigned16 tcrc_l; /* Temp Transmit CRC Low */
+ rtems_unsigned16 tcrc_h; /* Temp Transmit CRC High */
+
+ rtems_unsigned16 disfc; /* Discard Frame Counter */
+ rtems_unsigned16 crcec; /* CRC Error Counter */
+ rtems_unsigned16 abtsc; /* Abort Sequence Counter */
+ rtems_unsigned16 nmarc; /* Nonmatching Address Received Cntr */
+ rtems_unsigned16 retrc; /* Frame Retransmission Counter */
+
+ rtems_unsigned16 mflr; /* Maximum Frame Length Register */
+ rtems_unsigned16 max_cnt; /* Maximum_Length Counter */
+
+ rtems_unsigned16 hmask; /* User Defined Frame Address Mask */
+ rtems_unsigned16 haddr1; /* User Defined Frame Address */
+ rtems_unsigned16 haddr2; /* " */
+ rtems_unsigned16 haddr3; /* " */
+ rtems_unsigned16 haddr4; /* " */
+} m302_SCC_HdlcSpecific_t;
+/*
+ * HDLC receiver buffer descriptor bit definitions
+ * Section 4.5.12.10
+ */
+#define RBIT_HDLC_EMPTY_BIT 0x8000 /* buffer associated with BD is empty */
+#define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in a frame */
+#define RBIT_HDLC_FIRST_BIT 0x0400 /* buffer is first in a frame */
+#define RBIT_HDLC_FRAME_LEN 0x0020 /* receiver frame length violation */
+#define RBIT_HDLC_NONOCT_Rx 0x0010 /* received non-octet aligned frame */
+#define RBIT_HDLC_ABORT_SEQ 0x0008 /* received abort sequence */
+#define RBIT_HDLC_CRC_ERROR 0x0004 /* frame contains a CRC error */
+#define RBIT_HDLC_OVERRUN 0x0002 /* receiver overrun occurred */
+#define RBIT_HDLC_CD_LOST 0x0001 /* carrier detect lost */
+
+/*
+ * HDLC transmit buffer descriptor bit definitions
+ * Section 4.5.12.11
+ */
+#define RBIT_HDLC_READY_BIT 0x8000 /* buffer is ready to transmit */
+#define RBIT_HDLC_EXT_BUFFER 0x4000 /* buffer is in external memory */
+#define RBIT_HDLC_WRAP_BIT 0x2000 /* last buffer in bd table, so wrap */
+#define RBIT_HDLC_WAKE_UP 0x1000 /* interrupt when buffer serviced */
+#define RBIT_HDLC_LAST_BIT 0x0800 /* buffer is last in the frame */
+#define RBIT_HDLC_TxCRC_BIT 0x0400 /* transmit a CRC sequence */
+#define RBIT_HDLC_UNDERRUN 0x0002 /* transmitter underrun */
+#define RBIT_HDLC_CTS_LOST 0x0001 /* CTS lost */
+
+/*
+ * HDLC event register bit definitions
+ * Section 4.5.12.12
+ */
+#define RBIT_HDLC_CTS 0x80 /* CTS status changed */
+#define RBIT_HDLC_CD 0x40 /* carrier detect status changed */
+#define RBIT_HDLC_IDL 0x20 /* IDLE sequence status changed */
+#define RBIT_HDLC_TXE 0x10 /* transmit error */
+#define RBIT_HDLC_RXF 0x08 /* received frame */
+#define RBIT_HDLC_BSY 0x04 /* frame rcvd and discarded due to
+ * lack of buffers
+ */
+#define RBIT_HDLC_TXB 0x02 /* buffer has been transmitted */
+#define RBIT_HDLC_RXB 0x01 /* received buffer */
+
+
+
+typedef struct {
+ m302_SCC_bd_table_t bd; /* +000 Buffer Descriptor Table */
+ m302_SCC_parameters_t parm; /* +080 Common Parameter RAM */
+ union { /* +09C Protocol-Specific Parm RAM */
+ m302_SCC_UartSpecific_t uart;
+ m302_SCC_HdlcSpecific_t hdlc;
+ } prot;
+ rtems_unsigned8 res[0x040]; /* +0C0 reserved, (not implemented) */
+} m302_SCC_t;
+
+
+/*
+ * Common SCC Registers
+ */
+typedef struct {
+ rtems_unsigned16 res1;
+ rtems_unsigned16 scon; /* SCC Configuration Register 4.5.2 */
+ rtems_unsigned16 scm; /* SCC Mode Register 4.5.3 */
+ rtems_unsigned16 dsr; /* SCC Data Synchronization Register 4.5.4 */
+ rtems_unsigned8 scce; /* SCC Event Register 4.5.8.1 */
+ rtems_unsigned8 res2;
+ rtems_unsigned8 sccm; /* SCC Mask Register 4.5.8.2 */
+ rtems_unsigned8 res3;
+ rtems_unsigned8 sccs; /* SCC Status Register 4.5.8.3 */
+ rtems_unsigned8 res4;
+ rtems_unsigned16 res5;
+} m302_SCC_Registers_t;
+
+/*
+ * SCON - SCC Configuration Register
+ * Section 4.5.2
+ */
+#define RBIT_SCON_WOMS (1<<15) /* Wired-OR Mode Select (NMSI mode only)
+ * When set, the TXD driver is an
+ * open-drain output */
+#define RBIT_SCON_EXTC (1<<14) /* External Clock Source */
+#define RBIT_SCON_TCS (1<<13) /* Transmit Clock Source */
+#define RBIT_SCON_RCS (1<<12) /* Receive Clock Source */
+
+/*
+ * SCM - SCC Mode Register bit definitions
+ * Section 4.5.3
+ * The parameter-specific mode bits occupy bits 15 through 6.
+ */
+#define RBIT_SCM_ENR (1<<3) /* Enable receiver */
+#define RBIT_SCM_ENT (1<<2) /* Enable transmitter */
+
+
+/*
+ * Internal MC68302 Registers
+ * starts at offset 0x800 from dual-port RAM base
+ * Section 2.8
+ */
+typedef struct {
+ /* offset +800 */
+ rtems_unsigned16 res0;
+ rtems_unsigned16 cmr; /* IDMA Channel Mode Register */
+ rtems_unsigned32 sapr; /* IDMA Source Address Pointer */
+ rtems_unsigned32 dapr; /* IDMA Destination Address Pointer */
+ rtems_unsigned16 bcr; /* IDMA Byte Count Register */
+ rtems_unsigned8 csr; /* IDMA Channel Status Register */
+ rtems_unsigned8 res1;
+ rtems_unsigned8 fcr; /* IDMA Function Code Register */
+ rtems_unsigned8 res2;
+
+ /* offset +812 */
+ rtems_unsigned16 gimr; /* Global Interrupt Mode Register */
+ rtems_unsigned16 ipr; /* Interrupt Pending Register */
+ rtems_unsigned16 imr; /* Interrupt Mask Register */
+ rtems_unsigned16 isr; /* Interrupt In-Service Register */
+ rtems_unsigned16 res3;
+ rtems_unsigned16 res4;
+
+ /* offset +81e */
+ rtems_unsigned16 pacnt; /* Port A Control Register */
+ rtems_unsigned16 paddr; /* Port A Data Direction Register */
+ rtems_unsigned16 padat; /* Port A Data Register */
+ rtems_unsigned16 pbcnt; /* Port B Control Register */
+ rtems_unsigned16 pbddr; /* Port B Data Direction Register */
+ rtems_unsigned16 pbdat; /* Port B Data Register */
+ rtems_unsigned16 res5;
+
+ /* offset +82c */
+ rtems_unsigned16 res6;
+ rtems_unsigned16 res7;
+ rtems_unsigned16 br0; /* Base Register (CS0) */
+ rtems_unsigned16 or0; /* Option Register (CS0) */
+ rtems_unsigned16 br1; /* Base Register (CS1) */
+ rtems_unsigned16 or1; /* Option Register (CS1) */
+ rtems_unsigned16 br2; /* Base Register (CS2) */
+ rtems_unsigned16 or2; /* Option Register (CS2) */
+ rtems_unsigned16 br3; /* Base Register (CS3) */
+ rtems_unsigned16 or3; /* Option Register (CS3) */
+
+ /* offset +840 */
+ rtems_unsigned16 tmr1; /* Timer Unit 1 Mode Register */
+ rtems_unsigned16 trr1; /* Timer Unit 1 Reference Register */
+ rtems_unsigned16 tcr1; /* Timer Unit 1 Capture Register */
+ rtems_unsigned16 tcn1; /* Timer Unit 1 Counter */
+ rtems_unsigned8 res8;
+ rtems_unsigned8 ter1; /* Timer Unit 1 Event Register */
+ rtems_unsigned16 wrr; /* Watchdog Reference Register */
+ rtems_unsigned16 wcn; /* Watchdog Counter */
+ rtems_unsigned16 res9;
+ rtems_unsigned16 tmr2; /* Timer Unit 2 Mode Register */
+ rtems_unsigned16 trr2; /* Timer Unit 2 Reference Register */
+ rtems_unsigned16 tcr2; /* Timer Unit 2 Capture Register */
+ rtems_unsigned16 tcn2; /* Timer Unit 2 Counter */
+ rtems_unsigned8 resa;
+ rtems_unsigned8 ter2; /* Timer Unit 2 Event Register */
+ rtems_unsigned16 resb;
+ rtems_unsigned16 resc;
+ rtems_unsigned16 resd;
+
+ /* offset +860 */
+ rtems_unsigned8 cr; /* Command Register */
+ rtems_unsigned8 rese[0x1f];
+
+ /* offset +880, +890, +8a0 */
+ m302_SCC_Registers_t scc[3]; /* SCC1, SCC2, SCC3 Registers */
+
+ /* offset +8b0 */
+ rtems_unsigned16 spmode; /* SCP,SMC Mode and Clock Cntrl Reg */
+ rtems_unsigned16 simask; /* Serial Interface Mask Register */
+ rtems_unsigned16 simode; /* Serial Interface Mode Register */
+} m302_internalReg_t ;
+
+
+/*
+ * MC68302 dual-port RAM structure.
+ * (Includes System RAM, Parameter RAM, and Internal Registers).
+ * Section 2.8
+ */
+typedef struct {
+ rtems_unsigned8 mem[0x240]; /* +000 User Data Memory */
+ rtems_unsigned8 res1[0x1c0]; /* +240 reserved, (not implemented) */
+ m302_SCC_t scc1; /* +400 SCC1 */
+ m302_SCC_t scc2; /* +500 SCC2 */
+ m302_SCC_t scc3; /* +600 SCC3 */
+ rtems_unsigned8 res2[0x100]; /* +700 reserved, (not implemented) */
+ m302_internalReg_t reg; /* +800 68302 Internal Registers */
+} m302_dualPortRAM_t;
+
+
+/*
+ * Declare the variable that's used to reference the variables in
+ * the dual-port RAM.
+ */
+extern volatile m302_dualPortRAM_t m302;
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/cpu/m68k/rtems/m68k/m68360.h b/cpukit/score/cpu/m68k/rtems/m68k/m68360.h
new file mode 100644
index 0000000000..84687c49fa
--- /dev/null
+++ b/cpukit/score/cpu/m68k/rtems/m68k/m68360.h
@@ -0,0 +1,880 @@
+/*
+ **************************************************************************
+ **************************************************************************
+ ** **
+ ** MOTOROLA MC68360 QUAD INTEGRATED COMMUNICATIONS CONTROLLER (QUICC) **
+ ** **
+ ** HARDWARE DECLARATIONS **
+ ** **
+ ** **
+ ** Submitted By: **
+ ** **
+ ** W. Eric Norum **
+ ** Saskatchewan Accelerator Laboratory **
+ ** University of Saskatchewan **
+ ** 107 North Road **
+ ** Saskatoon, Saskatchewan, CANADA **
+ ** S7N 5C6 **
+ ** **
+ ** eric@skatter.usask.ca **
+ ** **
+ ** $Id$ **
+ ** **
+ **************************************************************************
+ **************************************************************************
+ */
+
+#ifndef __MC68360_h
+#define __MC68360_h
+
+/*
+ *************************************************************************
+ * REGISTER SUBBLOCKS *
+ *************************************************************************
+ */
+
+/*
+ * Memory controller registers
+ */
+typedef struct m360MEMCRegisters_ {
+ rtems_unsigned32 br;
+ rtems_unsigned32 or;
+ rtems_unsigned32 _pad[2];
+} m360MEMCRegisters_t;
+
+/*
+ * Serial Communications Controller registers
+ */
+typedef struct m360SCCRegisters_ {
+ rtems_unsigned32 gsmr_l;
+ rtems_unsigned32 gsmr_h;
+ rtems_unsigned16 psmr;
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 todr;
+ rtems_unsigned16 dsr;
+ rtems_unsigned16 scce;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned16 sccm;
+ rtems_unsigned8 _pad2;
+ rtems_unsigned8 sccs;
+ rtems_unsigned32 _pad3[2];
+} m360SCCRegisters_t;
+
+/*
+ * Serial Management Controller registers
+ */
+typedef struct m360SMCRegisters_ {
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 smcmr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned8 smce;
+ rtems_unsigned8 _pad2;
+ rtems_unsigned16 _pad3;
+ rtems_unsigned8 smcm;
+ rtems_unsigned8 _pad4;
+ rtems_unsigned32 _pad5;
+} m360SMCRegisters_t;
+
+
+/*
+ *************************************************************************
+ * Miscellaneous Parameters *
+ *************************************************************************
+ */
+typedef struct m360MiscParms_ {
+ rtems_unsigned16 rev_num;
+ rtems_unsigned16 _res1;
+ rtems_unsigned32 _res2;
+ rtems_unsigned32 _res3;
+} m360MiscParms_t;
+
+/*
+ *************************************************************************
+ * RISC Timers *
+ *************************************************************************
+ */
+typedef struct m360TimerParms_ {
+ rtems_unsigned16 tm_base;
+ rtems_unsigned16 _tm_ptr;
+ rtems_unsigned16 _r_tmr;
+ rtems_unsigned16 _r_tmv;
+ rtems_unsigned32 tm_cmd;
+ rtems_unsigned32 tm_cnt;
+} m360TimerParms_t;
+
+/*
+ * RISC Controller Configuration Register (RCCR)
+ * All other bits in this register are either reserved or
+ * used only with a Motorola-supplied RAM microcode packge.
+ */
+#define M360_RCCR_TIME (1<<15) /* Enable timer */
+#define M360_RCCR_TIMEP(x) ((x)<<8) /* Timer period */
+
+/*
+ * Command register
+ * Set up this register before issuing a M360_CR_OP_SET_TIMER command.
+ */
+#define M360_TM_CMD_V (1<<31) /* Set to enable timer */
+#define M360_TM_CMD_R (1<<30) /* Set for automatic restart */
+#define M360_TM_CMD_TIMER(x) ((x)<<16) /* Select timer */
+#define M360_TM_CMD_PERIOD(x) (x) /* Timer period (16 bits) */
+
+/*
+ *************************************************************************
+ * DMA Controllers *
+ *************************************************************************
+ */
+typedef struct m360IDMAparms_ {
+ rtems_unsigned16 ibase;
+ rtems_unsigned16 ibptr;
+ rtems_unsigned32 _istate;
+ rtems_unsigned32 _itemp;
+} m360IDMAparms_t;
+
+/*
+ *************************************************************************
+ * Serial Communication Controllers *
+ *************************************************************************
+ */
+typedef struct m360SCCparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ rtems_unsigned32 _rcrc;
+ rtems_unsigned32 _tcrc;
+ union {
+ struct {
+ rtems_unsigned32 _res0;
+ rtems_unsigned32 _res1;
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _idlc;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 parec;
+ rtems_unsigned16 frmec;
+ rtems_unsigned16 nosec;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 uaddr[2];
+ rtems_unsigned16 _rtemp;
+ rtems_unsigned16 toseq;
+ rtems_unsigned16 character[8];
+ rtems_unsigned16 rccm;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 rlbc;
+ } uart;
+ } un;
+} m360SCCparms_t;
+
+typedef struct m360SCCENparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ rtems_unsigned32 _rcrc;
+ rtems_unsigned32 _tcrc;
+ union {
+ struct {
+ rtems_unsigned32 _res0;
+ rtems_unsigned32 _res1;
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _idlc;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 parec;
+ rtems_unsigned16 frmec;
+ rtems_unsigned16 nosec;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 uaddr[2];
+ rtems_unsigned16 _rtemp;
+ rtems_unsigned16 toseq;
+ rtems_unsigned16 character[8];
+ rtems_unsigned16 rccm;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 rlbc;
+ } uart;
+ struct {
+ rtems_unsigned32 c_pres;
+ rtems_unsigned32 c_mask;
+ rtems_unsigned32 crcec;
+ rtems_unsigned32 alec;
+ rtems_unsigned32 disfc;
+ rtems_unsigned16 pads;
+ rtems_unsigned16 ret_lim;
+ rtems_unsigned16 _ret_cnt;
+ rtems_unsigned16 mflr;
+ rtems_unsigned16 minflr;
+ rtems_unsigned16 maxd1;
+ rtems_unsigned16 maxd2;
+ rtems_unsigned16 _maxd;
+ rtems_unsigned16 dma_cnt;
+ rtems_unsigned16 _max_b;
+ rtems_unsigned16 gaddr1;
+ rtems_unsigned16 gaddr2;
+ rtems_unsigned16 gaddr3;
+ rtems_unsigned16 gaddr4;
+ rtems_unsigned32 _tbuf0data0;
+ rtems_unsigned32 _tbuf0data1;
+ rtems_unsigned32 _tbuf0rba0;
+ rtems_unsigned32 _tbuf0crc;
+ rtems_unsigned16 _tbuf0bcnt;
+ rtems_unsigned16 paddr_h;
+ rtems_unsigned16 paddr_m;
+ rtems_unsigned16 paddr_l;
+ rtems_unsigned16 p_per;
+ rtems_unsigned16 _rfbd_ptr;
+ rtems_unsigned16 _tfbd_ptr;
+ rtems_unsigned16 _tlbd_ptr;
+ rtems_unsigned32 _tbuf1data0;
+ rtems_unsigned32 _tbuf1data1;
+ rtems_unsigned32 _tbuf1rba0;
+ rtems_unsigned32 _tbuf1crc;
+ rtems_unsigned16 _tbuf1bcnt;
+ rtems_unsigned16 _tx_len;
+ rtems_unsigned16 iaddr1;
+ rtems_unsigned16 iaddr2;
+ rtems_unsigned16 iaddr3;
+ rtems_unsigned16 iaddr4;
+ rtems_unsigned16 _boff_cnt;
+ rtems_unsigned16 taddr_l;
+ rtems_unsigned16 taddr_m;
+ rtems_unsigned16 taddr_h;
+ } ethernet;
+ } un;
+} m360SCCENparms_t;
+
+/*
+ * Receive and transmit function code register bits
+ * These apply to the function code registers of all devices, not just SCC.
+ */
+#define M360_RFCR_MOT (1<<4)
+#define M360_RFCR_DMA_SPACE 0x8
+#define M360_TFCR_MOT (1<<4)
+#define M360_TFCR_DMA_SPACE 0x8
+
+/*
+ *************************************************************************
+ * Serial Management Controllers *
+ *************************************************************************
+ */
+typedef struct m360SMCparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+ union {
+ struct {
+ rtems_unsigned16 max_idl;
+ rtems_unsigned16 _pad0;
+ rtems_unsigned16 brklen;
+ rtems_unsigned16 brkec;
+ rtems_unsigned16 brkcr;
+ rtems_unsigned16 _r_mask;
+ } uart;
+ struct {
+ rtems_unsigned16 _pad0[5];
+ } transparent;
+ } un;
+} m360SMCparms_t;
+
+/*
+ * Mode register
+ */
+#define M360_SMCMR_CLEN(x) ((x)<<11) /* Character length */
+#define M360_SMCMR_2STOP (1<<10) /* 2 stop bits */
+#define M360_SMCMR_PARITY (1<<9) /* Enable parity */
+#define M360_SMCMR_EVEN (1<<8) /* Even parity */
+#define M360_SMCMR_SM_GCI (0<<4) /* GCI Mode */
+#define M360_SMCMR_SM_UART (2<<4) /* UART Mode */
+#define M360_SMCMR_SM_TRANSPARENT (3<<4) /* Transparent Mode */
+#define M360_SMCMR_DM_LOOPBACK (1<<2) /* Local loopback mode */
+#define M360_SMCMR_DM_ECHO (2<<2) /* Echo mode */
+#define M360_SMCMR_TEN (1<<1) /* Enable transmitter */
+#define M360_SMCMR_REN (1<<0) /* Enable receiver */
+
+/*
+ * Event and mask registers (SMCE, SMCM)
+ */
+#define M360_SMCE_BRK (1<<4)
+#define M360_SMCE_BSY (1<<2)
+#define M360_SMCE_TX (1<<1)
+#define M360_SMCE_RX (1<<0)
+
+/*
+ *************************************************************************
+ * Serial Peripheral Interface *
+ *************************************************************************
+ */
+typedef struct m360SPIparms_ {
+ rtems_unsigned16 rbase;
+ rtems_unsigned16 tbase;
+ rtems_unsigned8 rfcr;
+ rtems_unsigned8 tfcr;
+ rtems_unsigned16 mrblr;
+ rtems_unsigned32 _rstate;
+ rtems_unsigned32 _pad0;
+ rtems_unsigned16 _rbptr;
+ rtems_unsigned16 _pad1;
+ rtems_unsigned32 _pad2;
+ rtems_unsigned32 _tstate;
+ rtems_unsigned32 _pad3;
+ rtems_unsigned16 _tbptr;
+ rtems_unsigned16 _pad4;
+ rtems_unsigned32 _pad5;
+} m360SPIparms_t;
+
+/*
+ * Mode register (SPMODE)
+ */
+#define M360_SPMODE_LOOP (1<<14) /* Local loopback mode */
+#define M360_SPMODE_CI (1<<13) /* Clock invert */
+#define M360_SPMODE_CP (1<<12) /* Clock phase */
+#define M360_SPMODE_DIV16 (1<<11) /* Divide BRGCLK by 16 */
+#define M360_SPMODE_REV (1<<10) /* Reverse data */
+#define M360_SPMODE_MASTER (1<<9) /* SPI is master */
+#define M360_SPMODE_EN (1<<8) /* Enable SPI */
+#define M360_SPMODE_CLEN(x) ((x)<<4) /* Character length */
+#define M360_SPMODE_PM(x) (x) /* Prescaler modulus */
+
+/*
+ * Mode register (SPCOM)
+ */
+#define M360_SPCOM_STR (1<<7) /* Start transmit */
+
+/*
+ * Event and mask registers (SPIE, SPIM)
+ */
+#define M360_SPIE_MME (1<<5) /* Multi-master error */
+#define M360_SPIE_TXE (1<<4) /* Tx error */
+#define M360_SPIE_BSY (1<<2) /* Busy condition*/
+#define M360_SPIE_TXB (1<<1) /* Tx buffer */
+#define M360_SPIE_RXB (1<<0) /* Rx buffer */
+
+/*
+ *************************************************************************
+ * SDMA (SCC, SMC, SPI) Buffer Descriptors *
+ *************************************************************************
+ */
+typedef struct m360BufferDescriptor_ {
+ rtems_unsigned16 status;
+ rtems_unsigned16 length;
+ volatile void *buffer;
+} m360BufferDescriptor_t;
+
+/*
+ * Bits in receive buffer descriptor status word
+ */
+#define M360_BD_EMPTY (1<<15) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_WRAP (1<<13) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_INTERRUPT (1<<12) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_LAST (1<<11) /* Ethernet, SPI */
+#define M360_BD_CONTROL_CHAR (1<<11) /* SCC UART */
+#define M360_BD_FIRST_IN_FRAME (1<<10) /* Ethernet */
+#define M360_BD_ADDRESS (1<<10) /* SCC UART */
+#define M360_BD_CONTINUOUS (1<<9) /* SCC UART, SMC UART, SPI */
+#define M360_BD_MISS (1<<8) /* Ethernet */
+#define M360_BD_IDLE (1<<8) /* SCC UART, SMC UART */
+#define M360_BD_ADDRSS_MATCH (1<<7) /* SCC UART */
+#define M360_BD_LONG (1<<5) /* Ethernet */
+#define M360_BD_BREAK (1<<5) /* SCC UART, SMC UART */
+#define M360_BD_NONALIGNED (1<<4) /* Ethernet */
+#define M360_BD_FRAMING_ERROR (1<<4) /* SCC UART, SMC UART */
+#define M360_BD_SHORT (1<<3) /* Ethernet */
+#define M360_BD_PARITY_ERROR (1<<3) /* SCC UART, SMC UART */
+#define M360_BD_CRC_ERROR (1<<2) /* Ethernet */
+#define M360_BD_OVERRUN (1<<1) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_COLLISION (1<<0) /* Ethernet */
+#define M360_BD_CARRIER_LOST (1<<0) /* SCC UART */
+#define M360_BD_MASTER_ERROR (1<<0) /* SPI */
+
+/*
+ * Bits in transmit buffer descriptor status word
+ * Many bits have the same meaning as those in receiver buffer descriptors.
+ */
+#define M360_BD_READY (1<<15) /* Ethernet, SCC UART, SMC UART, SPI */
+#define M360_BD_PAD (1<<14) /* Ethernet */
+#define M360_BD_CTS_REPORT (1<<11) /* SCC UART */
+#define M360_BD_TX_CRC (1<<10) /* Ethernet */
+#define M360_BD_DEFER (1<<9) /* Ethernet */
+#define M360_BD_HEARTBEAT (1<<8) /* Ethernet */
+#define M360_BD_PREAMBLE (1<<8) /* SCC UART, SMC UART */
+#define M360_BD_LATE_COLLISION (1<<7) /* Ethernet */
+#define M360_BD_NO_STOP_BIT (1<<7) /* SCC UART */
+#define M360_BD_RETRY_LIMIT (1<<6) /* Ethernet */
+#define M360_BD_RETRY_COUNT(x) (((x)&0x3C)>>2) /* Ethernet */
+#define M360_BD_UNDERRUN (1<<1) /* Ethernet, SPI */
+#define M360_BD_CARRIER_LOST (1<<0) /* Ethernet */
+#define M360_BD_CTS_LOST (1<<0) /* SCC UART */
+
+/*
+ *************************************************************************
+ * IDMA Buffer Descriptors *
+ *************************************************************************
+ */
+typedef struct m360IDMABufferDescriptor_ {
+ rtems_unsigned16 status;
+ rtems_unsigned16 _pad;
+ rtems_unsigned32 length;
+ void *source;
+ void *destination;
+} m360IDMABufferDescriptor_t;
+
+/*
+ *************************************************************************
+ * RISC Communication Processor Module Command Register (CR) *
+ *************************************************************************
+ */
+#define M360_CR_RST (1<<15) /* Reset communication processor */
+#define M360_CR_OP_INIT_RX_TX (0<<8) /* SCC, SMC UART, SMC GCI, SPI */
+#define M360_CR_OP_INIT_RX (1<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_INIT_TX (2<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_INIT_HUNT (3<<8) /* SCC, SMC UART */
+#define M360_CR_OP_STOP_TX (4<<8) /* SCC, SMC UART */
+#define M360_CR_OP_GR_STOP_TX (5<<8) /* SCC */
+#define M360_CR_OP_INIT_IDMA (5<<8) /* IDMA */
+#define M360_CR_OP_RESTART_TX (6<<8) /* SCC, SMC UART */
+#define M360_CR_OP_CLOSE_RX_BD (7<<8) /* SCC, SMC UART, SPI */
+#define M360_CR_OP_SET_GRP_ADDR (8<<8) /* SCC */
+#define M360_CR_OP_SET_TIMER (8<<8) /* Timer */
+#define M360_CR_OP_GCI_TIMEOUT (9<<8) /* SMC GCI */
+#define M360_CR_OP_RESERT_BCS (10<<8) /* SCC */
+#define M360_CR_OP_GCI_ABORT (10<<8) /* SMC GCI */
+#define M360_CR_CHAN_SCC1 (0<<4) /* Channel selection */
+#define M360_CR_CHAN_SCC2 (4<<4)
+#define M360_CR_CHAN_SPI (5<<4)
+#define M360_CR_CHAN_TIMER (5<<4)
+#define M360_CR_CHAN_SCC3 (8<<4)
+#define M360_CR_CHAN_SMC1 (9<<4)
+#define M360_CR_CHAN_IDMA1 (9<<4)
+#define M360_CR_CHAN_SCC4 (12<<4)
+#define M360_CR_CHAN_SMC2 (13<<4)
+#define M360_CR_CHAN_IDMA2 (13<<4)
+#define M360_CR_FLG (1<<0) /* Command flag */
+
+/*
+ *************************************************************************
+ * System Protection Control Register (SYPCR) *
+ *************************************************************************
+ */
+#define M360_SYPCR_SWE (1<<7) /* Software watchdog enable */
+#define M360_SYPCR_SWRI (1<<6) /* Software watchdog reset select */
+#define M360_SYPCR_SWT1 (1<<5) /* Software watchdog timing bit 1 */
+#define M360_SYPCR_SWT0 (1<<4) /* Software watchdog timing bit 0 */
+#define M360_SYPCR_DBFE (1<<3) /* Double bus fault monitor enable */
+#define M360_SYPCR_BME (1<<2) /* Bus monitor external enable */
+#define M360_SYPCR_BMT1 (1<<1) /* Bus monitor timing bit 1 */
+#define M360_SYPCR_BMT0 (1<<0) /* Bus monitor timing bit 0 */
+
+/*
+ *************************************************************************
+ * Memory Control Registers *
+ *************************************************************************
+ */
+#define M360_GMR_RCNT(x) ((x)<<24) /* Refresh count */
+#define M360_GMR_RFEN (1<<23) /* Refresh enable */
+#define M360_GMR_RCYC(x) ((x)<<21) /* Refresh cycle length */
+#define M360_GMR_PGS(x) ((x)<<18) /* Page size */
+#define M360_GMR_DPS_32BIT (0<<16) /* DRAM port size */
+#define M360_GMR_DPS_16BIT (1<<16)
+#define M360_GMR_DPS_8BIT (2<<16)
+#define M360_GMR_DPS_DSACK (3<<16)
+#define M360_GMR_WBT40 (1<<15) /* Wait between 040 transfers */
+#define M360_GMR_WBTQ (1<<14) /* Wait between 360 transfers */
+#define M360_GMR_SYNC (1<<13) /* Synchronous external access */
+#define M360_GMR_EMWS (1<<12) /* External master wait state */
+#define M360_GMR_OPAR (1<<11) /* Odd parity */
+#define M360_GMR_PBEE (1<<10) /* Parity bus error enable */
+#define M360_GMR_TSS40 (1<<9) /* TS* sample for 040 */
+#define M360_GMR_NCS (1<<8) /* No CPU space */
+#define M360_GMR_DWQ (1<<7) /* Delay write for 360 */
+#define M360_GMR_DW40 (1<<6) /* Delay write for 040 */
+#define M360_GMR_GAMX (1<<5) /* Global address mux enable */
+
+#define M360_MEMC_BR_FC(x) ((x)<<7) /* Function code limit */
+#define M360_MEMC_BR_TRLXQ (1<<6) /* Relax timing requirements */
+#define M360_MEMC_BR_BACK40 (1<<5) /* Burst acknowledge to 040 */
+#define M360_MEMC_BR_CSNT40 (1<<4) /* CS* negate timing for 040 */
+#define M360_MEMC_BR_CSNTQ (1<<3) /* CS* negate timing for 360 */
+#define M360_MEMC_BR_PAREN (1<<2) /* Enable parity checking */
+#define M360_MEMC_BR_WP (1<<1) /* Write Protect */
+#define M360_MEMC_BR_V (1<<0) /* Base/Option register are valid */
+
+#define M360_MEMC_OR_TCYC(x) ((x)<<28) /* Cycle length (clocks) */
+#define M360_MEMC_OR_WAITS(x) M360_MEMC_OR_TCYC((x)+1)
+#define M360_MEMC_OR_2KB 0x0FFFF800 /* Address range */
+#define M360_MEMC_OR_4KB 0x0FFFF000
+#define M360_MEMC_OR_8KB 0x0FFFE000
+#define M360_MEMC_OR_16KB 0x0FFFC000
+#define M360_MEMC_OR_32KB 0x0FFF8000
+#define M360_MEMC_OR_64KB 0x0FFF0000
+#define M360_MEMC_OR_128KB 0x0FFE0000
+#define M360_MEMC_OR_256KB 0x0FFC0000
+#define M360_MEMC_OR_512KB 0x0FF80000
+#define M360_MEMC_OR_1MB 0x0FF00000
+#define M360_MEMC_OR_2MB 0x0FE00000
+#define M360_MEMC_OR_4MB 0x0FC00000
+#define M360_MEMC_OR_8MB 0x0F800000
+#define M360_MEMC_OR_16MB 0x0F000000
+#define M360_MEMC_OR_32MB 0x0E000000
+#define M360_MEMC_OR_64MB 0x0C000000
+#define M360_MEMC_OR_128MB 0x08000000
+#define M360_MEMC_OR_256MB 0x00000000
+#define M360_MEMC_OR_FCMC(x) ((x)<<7) /* Function code mask */
+#define M360_MEMC_OR_BCYC(x) ((x)<<5) /* Burst cycle length (clocks) */
+#define M360_MEMC_OR_PGME (1<<3) /* Page mode enable */
+#define M360_MEMC_OR_32BIT (0<<1) /* Port size */
+#define M360_MEMC_OR_16BIT (1<<1)
+#define M360_MEMC_OR_8BIT (2<<1)
+#define M360_MEMC_OR_DSACK (3<<1)
+#define M360_MEMC_OR_DRAM (1<<0) /* Dynamic RAM select */
+
+/*
+ *************************************************************************
+ * SI Mode Register (SIMODE) *
+ *************************************************************************
+ */
+#define M360_SI_SMC2_BITS 0xFFFF0000 /* All SMC2 bits */
+#define M360_SI_SMC2_TDM (1<<31) /* Multiplexed SMC2 */
+#define M360_SI_SMC2_BRG1 (0<<28) /* SMC2 clock souce */
+#define M360_SI_SMC2_BRG2 (1<<28)
+#define M360_SI_SMC2_BRG3 (2<<28)
+#define M360_SI_SMC2_BRG4 (3<<28)
+#define M360_SI_SMC2_CLK5 (0<<28)
+#define M360_SI_SMC2_CLK6 (1<<28)
+#define M360_SI_SMC2_CLK7 (2<<28)
+#define M360_SI_SMC2_CLK8 (3<<28)
+#define M360_SI_SMC1_BITS 0x0000FFFF /* All SMC1 bits */
+#define M360_SI_SMC1_TDM (1<<15) /* Multiplexed SMC1 */
+#define M360_SI_SMC1_BRG1 (0<<12) /* SMC1 clock souce */
+#define M360_SI_SMC1_BRG2 (1<<12)
+#define M360_SI_SMC1_BRG3 (2<<12)
+#define M360_SI_SMC1_BRG4 (3<<12)
+#define M360_SI_SMC1_CLK1 (0<<12)
+#define M360_SI_SMC1_CLK2 (1<<12)
+#define M360_SI_SMC1_CLK3 (2<<12)
+#define M360_SI_SMC1_CLK4 (3<<12)
+
+/*
+ *************************************************************************
+ * SDMA Configuration Register (SDMA) *
+ *************************************************************************
+ */
+#define M360_SDMA_FREEZE (2<<13) /* Freeze on next bus cycle */
+#define M360_SDMA_SISM_7 (7<<8) /* Normal interrupt service mask */
+#define M360_SDMA_SAID_4 (4<<4) /* Normal arbitration ID */
+#define M360_SDMA_INTE (1<<1) /* SBER interrupt enable */
+#define M360_SDMA_INTB (1<<0) /* SBKP interrupt enable */
+
+/*
+ *************************************************************************
+ * Baud (sic) Rate Generators *
+ *************************************************************************
+ */
+#define M360_BRG_RST (1<<17) /* Reset generator */
+#define M360_BRG_EN (1<<16) /* Enable generator */
+#define M360_BRG_EXTC_BRGCLK (0<<14) /* Source is BRGCLK */
+#define M360_BRG_EXTC_CLK2 (1<<14) /* Source is CLK2 pin */
+#define M360_BRG_EXTC_CLK6 (2<<14) /* Source is CLK6 pin */
+#define M360_BRG_ATB (1<<13) /* Autobaud */
+#define M360_BRG_115200 (13<<1) /* Assume 25 MHz clock */
+#define M360_BRG_57600 (26<<1)
+#define M360_BRG_38400 (40<<1)
+#define M360_BRG_19200 (80<<1)
+#define M360_BRG_9600 (162<<1)
+#define M360_BRG_4800 (324<<1)
+#define M360_BRG_2400 (650<<1)
+#define M360_BRG_1200 (1301<<1)
+#define M360_BRG_600 (2603<<1)
+#define M360_BRG_300 ((324<<1) | 1)
+#define M360_BRG_150 ((650<<1) | 1)
+#define M360_BRG_75 ((1301<<1) | 1)
+
+/*
+ *************************************************************************
+ * MC68360 DUAL-PORT RAM AND REGISTERS *
+ *************************************************************************
+ */
+typedef struct m360_ {
+ /*
+ * Dual-port RAM
+ */
+ rtems_unsigned8 dpram0[0x400]; /* Microcode program */
+ rtems_unsigned8 dpram1[0x200];
+ rtems_unsigned8 dpram2[0x100]; /* Microcode scratch */
+ rtems_unsigned8 dpram3[0x100]; /* Not on REV A or B masks */
+ rtems_unsigned8 _rsv0[0xC00-0x800];
+ m360SCCENparms_t scc1p;
+ rtems_unsigned8 _rsv1[0xCB0-0xC00-sizeof(m360SCCENparms_t)];
+ m360MiscParms_t miscp;
+ rtems_unsigned8 _rsv2[0xD00-0xCB0-sizeof(m360MiscParms_t)];
+ m360SCCparms_t scc2p;
+ rtems_unsigned8 _rsv3[0xD80-0xD00-sizeof(m360SCCparms_t)];
+ m360SPIparms_t spip;
+ rtems_unsigned8 _rsv4[0xDB0-0xD80-sizeof(m360SPIparms_t)];
+ m360TimerParms_t tmp;
+ rtems_unsigned8 _rsv5[0xE00-0xDB0-sizeof(m360TimerParms_t)];
+ m360SCCparms_t scc3p;
+ rtems_unsigned8 _rsv6[0xE70-0xE00-sizeof(m360SCCparms_t)];
+ m360IDMAparms_t idma1p;
+ rtems_unsigned8 _rsv7[0xE80-0xE70-sizeof(m360IDMAparms_t)];
+ m360SMCparms_t smc1p;
+ rtems_unsigned8 _rsv8[0xF00-0xE80-sizeof(m360SMCparms_t)];
+ m360SCCparms_t scc4p;
+ rtems_unsigned8 _rsv9[0xF70-0xF00-sizeof(m360SCCparms_t)];
+ m360IDMAparms_t idma2p;
+ rtems_unsigned8 _rsv10[0xF80-0xF70-sizeof(m360IDMAparms_t)];
+ m360SMCparms_t smc2p;
+ rtems_unsigned8 _rsv11[0x1000-0xF80-sizeof(m360SMCparms_t)];
+
+ /*
+ * SIM Block
+ */
+ rtems_unsigned32 mcr;
+ rtems_unsigned32 _pad00;
+ rtems_unsigned8 avr;
+ rtems_unsigned8 rsr;
+ rtems_unsigned16 _pad01;
+ rtems_unsigned8 clkocr;
+ rtems_unsigned8 _pad02;
+ rtems_unsigned16 _pad03;
+ rtems_unsigned16 pllcr;
+ rtems_unsigned16 _pad04;
+ rtems_unsigned16 cdvcr;
+ rtems_unsigned16 pepar;
+ rtems_unsigned32 _pad05[2];
+ rtems_unsigned16 _pad06;
+ rtems_unsigned8 sypcr;
+ rtems_unsigned8 swiv;
+ rtems_unsigned16 _pad07;
+ rtems_unsigned16 picr;
+ rtems_unsigned16 _pad08;
+ rtems_unsigned16 pitr;
+ rtems_unsigned16 _pad09;
+ rtems_unsigned8 _pad10;
+ rtems_unsigned8 swsr;
+ rtems_unsigned32 bkar;
+ rtems_unsigned32 bcar;
+ rtems_unsigned32 _pad11[2];
+
+ /*
+ * MEMC Block
+ */
+ rtems_unsigned32 gmr;
+ rtems_unsigned16 mstat;
+ rtems_unsigned16 _pad12;
+ rtems_unsigned32 _pad13[2];
+ m360MEMCRegisters_t memc[8];
+ rtems_unsigned8 _pad14[0xF0-0xD0];
+ rtems_unsigned8 _pad15[0x100-0xF0];
+ rtems_unsigned8 _pad16[0x500-0x100];
+
+ /*
+ * IDMA1 Block
+ */
+ rtems_unsigned16 iccr;
+ rtems_unsigned16 _pad17;
+ rtems_unsigned16 cmr1;
+ rtems_unsigned16 _pad18;
+ rtems_unsigned32 sapr1;
+ rtems_unsigned32 dapr1;
+ rtems_unsigned32 bcr1;
+ rtems_unsigned8 fcr1;
+ rtems_unsigned8 _pad19;
+ rtems_unsigned8 cmar1;
+ rtems_unsigned8 _pad20;
+ rtems_unsigned8 csr1;
+ rtems_unsigned8 _pad21;
+ rtems_unsigned16 _pad22;
+
+ /*
+ * SDMA Block
+ */
+ rtems_unsigned8 sdsr;
+ rtems_unsigned8 _pad23;
+ rtems_unsigned16 sdcr;
+ rtems_unsigned32 sdar;
+
+ /*
+ * IDMA2 Block
+ */
+ rtems_unsigned16 _pad24;
+ rtems_unsigned16 cmr2;
+ rtems_unsigned32 sapr2;
+ rtems_unsigned32 dapr2;
+ rtems_unsigned32 bcr2;
+ rtems_unsigned8 fcr2;
+ rtems_unsigned8 _pad26;
+ rtems_unsigned8 cmar2;
+ rtems_unsigned8 _pad27;
+ rtems_unsigned8 csr2;
+ rtems_unsigned8 _pad28;
+ rtems_unsigned16 _pad29;
+ rtems_unsigned32 _pad30;
+
+ /*
+ * CPIC Block
+ */
+ rtems_unsigned32 cicr;
+ rtems_unsigned32 cipr;
+ rtems_unsigned32 cimr;
+ rtems_unsigned32 cisr;
+
+ /*
+ * Parallel I/O Block
+ */
+ rtems_unsigned16 padir;
+ rtems_unsigned16 papar;
+ rtems_unsigned16 paodr;
+ rtems_unsigned16 padat;
+ rtems_unsigned32 _pad31[2];
+ rtems_unsigned16 pcdir;
+ rtems_unsigned16 pcpar;
+ rtems_unsigned16 pcso;
+ rtems_unsigned16 pcdat;
+ rtems_unsigned16 pcint;
+ rtems_unsigned16 _pad32;
+ rtems_unsigned32 _pad33[5];
+
+ /*
+ * TIMER Block
+ */
+ rtems_unsigned16 tgcr;
+ rtems_unsigned16 _pad34;
+ rtems_unsigned32 _pad35[3];
+ rtems_unsigned16 tmr1;
+ rtems_unsigned16 tmr2;
+ rtems_unsigned16 trr1;
+ rtems_unsigned16 trr2;
+ rtems_unsigned16 tcr1;
+ rtems_unsigned16 tcr2;
+ rtems_unsigned16 tcn1;
+ rtems_unsigned16 tcn2;
+ rtems_unsigned16 tmr3;
+ rtems_unsigned16 tmr4;
+ rtems_unsigned16 trr3;
+ rtems_unsigned16 trr4;
+ rtems_unsigned16 tcr3;
+ rtems_unsigned16 tcr4;
+ rtems_unsigned16 tcn3;
+ rtems_unsigned16 tcn4;
+ rtems_unsigned16 ter1;
+ rtems_unsigned16 ter2;
+ rtems_unsigned16 ter3;
+ rtems_unsigned16 ter4;
+ rtems_unsigned32 _pad36[2];
+
+ /*
+ * CP Block
+ */
+ rtems_unsigned16 cr;
+ rtems_unsigned16 _pad37;
+ rtems_unsigned16 rccr;
+ rtems_unsigned16 _pad38;
+ rtems_unsigned32 _pad39[3];
+ rtems_unsigned16 _pad40;
+ rtems_unsigned16 rter;
+ rtems_unsigned16 _pad41;
+ rtems_unsigned16 rtmr;
+ rtems_unsigned32 _pad42[5];
+
+ /*
+ * BRG Block
+ */
+ rtems_unsigned32 brgc1;
+ rtems_unsigned32 brgc2;
+ rtems_unsigned32 brgc3;
+ rtems_unsigned32 brgc4;
+
+ /*
+ * SCC Block
+ */
+ m360SCCRegisters_t scc1;
+ m360SCCRegisters_t scc2;
+ m360SCCRegisters_t scc3;
+ m360SCCRegisters_t scc4;
+
+ /*
+ * SMC Block
+ */
+ m360SMCRegisters_t smc1;
+ m360SMCRegisters_t smc2;
+
+ /*
+ * SPI Block
+ */
+ rtems_unsigned16 spmode;
+ rtems_unsigned16 _pad43[2];
+ rtems_unsigned8 spie;
+ rtems_unsigned8 _pad44;
+ rtems_unsigned16 _pad45;
+ rtems_unsigned8 spim;
+ rtems_unsigned8 _pad46[2];
+ rtems_unsigned8 spcom;
+ rtems_unsigned16 _pad47[2];
+
+ /*
+ * PIP Block
+ */
+ rtems_unsigned16 pipc;
+ rtems_unsigned16 _pad48;
+ rtems_unsigned16 ptpr;
+ rtems_unsigned32 pbdir;
+ rtems_unsigned32 pbpar;
+ rtems_unsigned16 _pad49;
+ rtems_unsigned16 pbodr;
+ rtems_unsigned32 pbdat;
+ rtems_unsigned32 _pad50[6];
+
+ /*
+ * SI Block
+ */
+ rtems_unsigned32 simode;
+ rtems_unsigned8 sigmr;
+ rtems_unsigned8 _pad51;
+ rtems_unsigned8 sistr;
+ rtems_unsigned8 sicmr;
+ rtems_unsigned32 _pad52;
+ rtems_unsigned32 sicr;
+ rtems_unsigned16 _pad53;
+ rtems_unsigned16 sirp[2];
+ rtems_unsigned16 _pad54;
+ rtems_unsigned32 _pad55[2];
+ rtems_unsigned8 siram[256];
+} m360_t;
+
+extern volatile m360_t m360;
+
+#endif /* __MC68360_h */
diff --git a/cpukit/score/cpu/m68k/rtems/m68k/qsm.h b/cpukit/score/cpu/m68k/rtems/m68k/qsm.h
new file mode 100644
index 0000000000..e1bf33bc12
--- /dev/null
+++ b/cpukit/score/cpu/m68k/rtems/m68k/qsm.h
@@ -0,0 +1,209 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * QSM -- Queued Serial Module
+ *
+ * The QSM contains two serial interfaces: (a) the queued serial
+ * peripheral interface (QSPI) and the serial communication interface
+ * (SCI). The QSPI provides peripheral expansion and/or interprocessor
+ * communication through a full-duplex, synchronous, three-wire bus. A
+ * self contained RAM queue permits serial data transfers without CPU
+ * intervention and automatic continuous sampling. The SCI provides a
+ * standard non-return to zero mark/space format with wakeup functions
+ * to allow the CPU to run uninterrupted until woken
+ *
+ * For more information, refer to Motorola's "Modular Microcontroller
+ * Family Queued Serial Module Reference Manual" (Motorola document
+ * QSMRM/AD).
+ *
+ * This file has been created by John S. Gwynne for support of
+ * Motorola's 68332 MCU in the efi332 project.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above authorship, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _QSM_H_
+#define _QSM_H_
+
+
+#include <efi332.h>
+
+
+/* SAM-- shift and mask */
+#undef SAM
+#define SAM(a,b,c) ((a << b) & c)
+
+
+/* QSM_CRB (QSM Control Register Block) base address of the QSM
+ control registers */
+#if SIM_MM == 0
+#define QSM_CRB 0x7ffc00
+#else
+#undef SIM_MM
+#define SIM_MM 1
+#define QSM_CRB 0xfffc00
+#endif
+
+
+#define QSMCR (volatile unsigned short int * const)(0x00 + QSM_CRB)
+ /* QSM Configuration Register */
+#define STOP 0x8000 /* Stop Enable */
+#define FRZ 0x6000 /* Freeze Control */
+#define SUPV 0x0080 /* Supervisor/Unrestricted */
+#define IARB 0x000f /* Inerrupt Arbitration */
+
+
+#define QTEST (volatile unsigned short int * const)(0x02 + QSM_CRB)
+ /* QSM Test Register */
+/* Used only for factor testing */
+
+
+#define QILR (volatile unsigned char * const)(0x04 + QSM_CRB)
+ /* QSM Interrupt Level Register */
+#define ILQSPI 0x38 /* Interrupt Level for QSPI */
+#define ILSCI 0x07 /* Interrupt Level for SCI */
+
+
+#define QIVR (volatile unsigned char * const)(0x05 + QSM_CRB)
+ /* QSM Interrupt Vector Register */
+#define INTV 0xff /* Interrupt Vector Number */
+
+
+#define SCCR0 (volatile unsigned short int * const)(0x08 + QSM_CRB)
+ /* SCI Control Register 0 */
+#define SCBR 0x1fff /* SCI Baud Rate */
+
+
+#define SCCR1 (volatile unsigned short int * const)(0x0a + QSM_CRB)
+ /* SCI Control Register 1 */
+#define LOOPS 0x4000 /* Loop Mode */
+#define WOMS 0x2000 /* Wired-OR Mode for SCI Pins */
+#define ILT 0x1000 /* Idle-Line Detect Type */
+#define PT 0x0800 /* Parity Type */
+#define PE 0x0400 /* Parity Enable */
+#define M 0x0200 /* Mode Select */
+#define WAKE 0x0100 /* Wakeup by Address Mark */
+#define TIE 0x0080 /* Transmit Complete Interrupt Enable */
+#define TCIE 0x0040 /* Transmit Complete Interrupt Enable */
+#define RIE 0x0020 /* Receiver Interrupt Enable */
+#define ILIE 0x0010 /* Idle-Line Interrupt Enable */
+#define TE 0x0008 /* Transmitter Enable */
+#define RE 0x0004 /* Receiver Enable */
+#define RWU 0x0002 /* Receiver Wakeup */
+#define SBK 0x0001 /* Send Break */
+
+
+#define SCSR (volatile unsigned short int * const)(0x0c + QSM_CRB)
+ /* SCI Status Register */
+#define TDRE 0x0100 /* Transmit Data Register Empty */
+#define TC 0x0080 /* Transmit Complete */
+#define RDRF 0x0040 /* Receive Data Register Full */
+#define RAF 0x0020 /* Receiver Active */
+#define IDLE 0x0010 /* Idle-Line Detected */
+#define OR 0x0008 /* Overrun Error */
+#define NF 0x0004 /* Noise Error Flag */
+#define FE 0x0002 /* Framing Error */
+#define PF 0x0001 /* Parity Error */
+
+
+#define SCDR (volatile unsigned short int * const)(0x0e + QSM_CRB)
+ /* SCI Data Register */
+
+
+#define PORTQS (volatile unsigned char * const)(0x15 + QSM_CRB)
+ /* Port QS Data Register */
+
+#define PQSPAR (volatile unsigned char * const)(0x16 + QSM_CRB)
+ /* PORT QS Pin Assignment Rgister */
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a QSPI
+ signal. */
+/* note: PQS2 is a digital I/O pin unless the SPI is enabled in which
+ case it becomes the SPI serial clock SCK. */
+/* note: PQS7 is a digital I/O pin unless the SCI transmitter is
+ enabled in which case it becomes the SCI serial output TxD. */
+#define QSMFun 0x0
+#define QSMDis 0x1
+/*
+ * PQSPAR Field | QSM Function | Discrete I/O pin
+ *------------------+--------------+------------------ */
+#define PQSPA0 0 /* MISO | PQS0 */
+#define PQSPA1 1 /* MOSI | PQS1 */
+#define PQSPA2 2 /* SCK | PQS2 (see note)*/
+#define PQSPA3 3 /* PCSO/!SS | PQS3 */
+#define PQSPA4 4 /* PCS1 | PQS4 */
+#define PQSPA5 5 /* PCS2 | PQS5 */
+#define PQSPA6 6 /* PCS3 | PQS6 */
+#define PQSPA7 7 /* TxD | PQS7 (see note)*/
+
+
+#define DDRQS (volatile unsigned char * const)(0x17 + QSM_CRB)
+ /* PORT QS Data Direction Register */
+/* Clearing a bit makes the corresponding pin an input; setting a bit
+ makes the pin an output. */
+
+
+#define SPCR0 (volatile unsigned short int * const)(0x18 + QSM_CRB)
+ /* QSPI Control Register 0 */
+#define MSTR 0x8000 /* Master/Slave Mode Select */
+#define WOMQ 0x4000 /* Wired-OR Mode for QSPI Pins */
+#define BITS 0x3c00 /* Bits Per Transfer */
+#define CPOL 0x0200 /* Clock Polarity */
+#define CPHA 0x0100 /* Clock Phase */
+#define SPBR 0x00ff /* Serial Clock Baud Rate */
+
+
+#define SPCR1 (volatile unsigned short int * const)(0x1a + QSM_CRB)
+ /* QSPI Control Register 1 */
+#define SPE 0x8000 /* QSPI Enable */
+#define DSCKL 0x7f00 /* Delay before SCK */
+#define DTL 0x00ff /* Length of Delay after Transfer */
+
+
+#define SPCR2 (volatile unsigned short int * const)(0x1c + QSM_CRB)
+ /* QSPI Control Register 2 */
+#define SPIFIE 0x8000 /* SPI Finished Interrupt Enable */
+#define WREN 0x4000 /* Wrap Enable */
+#define WRTO 0x2000 /* Wrap To */
+#define ENDQP 0x0f00 /* Ending Queue Pointer */
+#define NEWQP 0x000f /* New Queue Pointer Value */
+
+
+#define SPCR3 (volatile unsigned char * const)(0x1e + QSM_CRB)
+ /* QSPI Control Register 3 */
+#define LOOPQ 0x0400 /* QSPI Loop Mode */
+#define HMIE 0x0200 /* HALTA and MODF Interrupt Enable */
+#define HALT 0x0100 /* Halt */
+
+
+#define SPSR (volatile unsigned char * const)(0x1f + QSM_CRB)
+ /* QSPI Status Register */
+#define SPIF 0x0080 /* QSPI Finished Flag */
+#define MODF 0x0040 /* Mode Fault Flag */
+#define HALTA 0x0020 /* Halt Acknowlwdge Flag */
+#define CPTQP x0000f /* Completed Queue Pointer */
+
+#define QSPIRR (volatile unsigned char * const)(0x100 + QSM_CRB)
+ /* QSPI Receive Data RAM */
+#define QSPITR (volatile unsigned char * const)(0x120 + QSM_CRB)
+ /* QSPI Transmit Data RAM */
+#define QSPIcR (volatile unsigned char * const)(0x140 + QSM_CRB)
+ /* QSPI Command RAM */
+
+#endif /* _QSM_H_ */
diff --git a/cpukit/score/cpu/m68k/rtems/m68k/sim.h b/cpukit/score/cpu/m68k/rtems/m68k/sim.h
new file mode 100644
index 0000000000..d70f56d360
--- /dev/null
+++ b/cpukit/score/cpu/m68k/rtems/m68k/sim.h
@@ -0,0 +1,342 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * SIM -- System Integration Module
+ *
+ * The system integration module (SIM) is used on many Motorola 16-
+ * and 32-bit MCUs for the following functions:
+ *
+ * () System configuration and protection. Bus and software watchdog
+ * monitors are provided in addition to periodic interrupt generators.
+ *
+ * () Clock signal generation for other intermodule bus (IMB) members
+ * and external devices.
+ *
+ * () The generation of chip-select signals that simplify external
+ * circuitry interface.
+ *
+ * () Data ports that are available for general purpose input and
+ * output.
+ *
+ * () A system test block that is intended only for factory tests.
+ *
+ * For more information, refer to Motorola's "Modular Microcontroller
+ * Family System Integration Module Reference Manual" (Motorola document
+ * SIMRM/AD).
+ *
+ * This file has been created by John S. Gwynne for support of
+ * Motorola's 68332 MCU in the efi332 project.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above authorship, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _SIM_H_
+#define _SIM_H_
+
+
+/*
+ * XXX Why is a generic file like this including a bsp specific file?
+
+#include <efi332.h>
+ */
+
+
+/* SAM-- shift and mask */
+#undef SAM
+#define SAM(a,b,c) ((a << b) & c)
+
+/*
+ * These macros make this file usable from assembly.
+ */
+
+#ifdef ASM
+#define SIM_VOLATILE_USHORT_POINTER
+#define SIM_VOLATILE_UCHAR_POINTER
+#else
+#define SIM_VOLATILE_USHORT_POINTER (volatile unsigned short int * const)
+#define SIM_VOLATILE_UCHAR_POINTER (volatile unsigned char * const)
+#endif
+
+/* SIM_CRB (SIM Control Register Block) base address of the SIM
+ control registers */
+/* not included in ram_init.h */
+#if SIM_MM == 0
+#define SIM_CRB 0x7ffa00
+#else
+#undef SIM_MM
+#define SIM_MM 1
+#define SIM_CRB 0xfffa00
+#endif
+/* end not included in ram_init.h */
+
+
+
+#define SIMCR SIM_VOLATILE_USHORT_POINTER(0x00 + SIM_CRB)
+ /* Module Configuration Register */
+#define EXOFF 0x8000 /* External Clock Off */
+#define FRZSW 0x4000 /* Freeze Software Enable */
+#define FRZBM 0x2000 /* Freeze Bus Monitor Enable */
+#define SLVEN 0x0800 /* Factory Test Model Enabled (ro)*/
+#define SHEN 0x0300 /* Show Cycle Enable */
+#define SUPV 0x0080 /* Supervisor/Unrestricted Data Space */
+#define MM 0x0040 /* Module Mapping */
+#define IARB 0x000f /* Interrupt Arbitration Field */
+
+
+
+#define SIMTR SIM_VOLATILE_USHORT_POINTER(0x02 + SIM_CRB)
+ /* SIM Test Register */
+/* Used only for factor testing */
+
+
+
+#define SYNCR SIM_VOLATILE_USHORT_POINTER(0x04 + SIM_CRB)
+ /* Clock Synthesizer Control Register */
+#define W 0x8000 /* Frequency Control (VCO) */
+#define X 0x4000 /* Frequency Control Bit (Prescale) */
+#define Y 0x3f00 /* Frequency Control Counter */
+#define EDIV 0x0080 /* ECLK Divide Rate */
+#define SLIMP 0x0010 /* Limp Mode Status */
+#define SLOCK 0x0008 /* Synthesizer Lock */
+#define RSTEN 0x0004 /* Reset Enable */
+#define STSIM 0x0002 /* Stop Mode SIM Clock */
+#define STEXT 0x0001 /* Stop Mode External Clock */
+
+
+
+#define RSR SIM_VOLATILE_UCHAR_POINTER(0x07 + SIM_CRB)
+ /* Reset Status Register */
+#define EXT 0x0080 /* External Reset */
+#define POW 0x0040 /* Power-On Reset */
+#define SW 0x0020 /* Software Watchdog Reset */
+#define DBF 0x0010 /* Double Bus Fault Reset */
+#define LOC 0x0004 /* Loss of Clock Reset */
+#define SYS 0x0002 /* System Reset */
+#define TST 0x0001 /* Test Submodule Reset */
+
+
+
+#define SIMTRE SIM_VOLATILE_USHORT_POINTER(0x08 + SIM_CRB)
+ /* System Integration Test Register */
+/* Used only for factor testing */
+
+
+
+#define PORTE0 SIM_VOLATILE_UCHAR_POINTER(0x11 + SIM_CRB)
+#define PORTE1 SIM_VOLATILE_UCHAR_POINTER(0x13 + SIM_CRB)
+ /* Port E Data Register */
+#define DDRE SIM_VOLATILE_UCHAR_POINTER(0x15 + SIM_CRB)
+ /* Port E Data Direction Register */
+#define PEPAR SIM_VOLATILE_UCHAR_POINTER(0x17 + SIM_CRB)
+ /* Port E Pin Assignment Register */
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a bus control
+ signal. */
+
+
+
+#define PORTF0 SIM_VOLATILE_UCHAR_POINTER(0x19 + SIM_CRB)
+#define PORTF1 SIM_VOLATILE_UCHAR_POINTER(0x1b + SIM_CRB)
+ /* Port F Data Register */
+#define DDRF SIM_VOLATILE_UCHAR_POINTER(0x1d + SIM_CRB)
+ /* Port E Data Direction Register */
+#define PFPAR SIM_VOLATILE_UCHAR_POINTER(0x1f + SIM_CRB)
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a bus control
+ signal. */
+
+
+
+#define SYPCR SIM_VOLATILE_UCHAR_POINTER(0x21 + SIM_CRB)
+/* !!! can write to only once after reset !!! */
+ /* System Protection Control Register */
+#define SWE 0x80 /* Software Watch Enable */
+#define SWP 0x40 /* Software Watchdog Prescale */
+#define SWT 0x30 /* Software Watchdog Timing */
+#define HME 0x08 /* Halt Monitor Enable */
+#define BME 0x04 /* Bus Monitor External Enable */
+#define BMT 0x03 /* Bus Monitor Timing */
+
+
+
+#define PICR SIM_VOLATILE_USHORT_POINTER(0x22 + SIM_CRB)
+ /* Periodic Interrupt Control Reg. */
+#define PIRQL 0x0700 /* Periodic Interrupt Request Level */
+#define PIV 0x00ff /* Periodic Interrupt Level */
+
+
+
+#define PITR SIM_VOLATILE_USHORT_POINTER(0x24 + SIM_CRB)
+ /* Periodic Interrupt Timer Register */
+#define PTP 0x0100 /* Periodic Timer Prescaler Control */
+#define PITM 0x00ff /* Periodic Interrupt Timing Modulus */
+
+
+
+#define SWSR SIM_VOLATILE_UCHAR_POINTER(0x27 + SIM_CRB)
+ /* Software Service Register */
+/* write 0x55 then 0xaa to service the software watchdog */
+
+
+
+#define TSTMSRA SIM_VOLATILE_USHORT_POINTER(0x30 + SIM_CRB)
+ /* Test Module Master Shift A */
+#define TSTMSRB SIM_VOLATILE_USHORT_POINTER(0x32 + SIM_CRB)
+ /* Test Module Master Shift A */
+#define TSTSC SIM_VOLATILE_USHORT_POINTER(0x34 + SIM_CRB)
+ /* Test Module Shift Count */
+#define TSTRC SIM_VOLATILE_USHORT_POINTER(0x36 + SIM_CRB)
+ /* Test Module Repetition Counter */
+#define CREG SIM_VOLATILE_USHORT_POINTER(0x38 + SIM_CRB)
+ /* Test Module Control */
+#define DREG SIM_VOLATILE_USHORT_POINTER(0x3a + SIM_CRB)
+ /* Test Module Distributed */
+/* Used only for factor testing */
+
+
+
+#define PORTC SIM_VOLATILE_UCHAR_POINTER(0x41 + SIM_CRB)
+ /* Port C Data */
+
+
+
+#define CSPAR0 SIM_VOLATILE_USHORT_POINTER(0x44 + SIM_CRB)
+ /* Chip Select Pin Assignment
+ Resgister 0 */
+/* CSPAR0 contains seven two-bit fields that determine the functions
+ of corresponding chip-select pins. CSPAR0[15:14] are not
+ used. These bits always read zero; write have no effect. CSPAR0 bit
+ 1 always reads one; writes to CSPAR0 bit 1 have no effect. */
+#define CSPAR1 SIM_VOLATILE_USHORT_POINTER(0x46 + SIM_CRB)
+ /* Chip Select Pin Assignment
+ Register 1 */
+/* CSPAR1 contains five two-bit fields that determine the finctions of
+ corresponding chip-select pins. CSPAR1[15:10] are not used. These
+ bits always read zero; writes have no effect. */
+/*
+ *
+ * Bit Field | Description
+ * ------------+---------------
+ * 00 | Discrete Output
+ * 01 | Alternate Function
+ * 10 | Chip Select (8-bit port)
+ * 11 | Chip Select (16-bit port)
+ */
+#define DisOut 0x0
+#define AltFun 0x1
+#define CS8bit 0x2
+#define CS16bit 0x3
+/*
+ *
+ * CSPARx Field |Chip Select Signal | Alternate Signal | Discrete Output
+ *-----------------+--------------------+--------------------+---------------*/
+#define CS_5 12 /* !CS5 | FC2 | PC2 */
+#define CS_4 10 /* !CS4 | FC1 | PC1 */
+#define CS_3 8 /* !CS3 | FC0 | PC0 */
+#define CS_2 6 /* !CS2 | !BGACK | */
+#define CS_1 4 /* !CS1 | !BG | */
+#define CS_0 2 /* !CS0 | !BR | */
+#define CSBOOT 0 /* !CSBOOT | | */
+/* | | | */
+#define CS_10 8 /* !CS10 | ADDR23 | ECLK */
+#define CS_9 6 /* !CS9 | ADDR22 | PC6 */
+#define CS_8 4 /* !CS8 | ADDR21 | PC5 */
+#define CS_7 2 /* !CS7 | ADDR20 | PC4 */
+#define CS_6 0 /* !CS6 | ADDR19 | PC3 */
+
+#define BS_2K 0x0
+#define BS_8K 0x1
+#define BS_16K 0x2
+#define BS_64K 0x3
+#define BS_128K 0x4
+#define BS_256K 0x5
+#define BS_512K 0x6
+#define BS_1M 0x7
+
+#define CSBARBT SIM_VOLATILE_USHORT_POINTER(0x48 + SIM_CRB)
+#define CSBAR0 SIM_VOLATILE_USHORT_POINTER(0x4c + SIM_CRB)
+#define CSBAR1 SIM_VOLATILE_USHORT_POINTER(0x50 + SIM_CRB)
+#define CSBAR2 SIM_VOLATILE_USHORT_POINTER(0x54 + SIM_CRB)
+#define CSBAR3 SIM_VOLATILE_USHORT_POINTER(0x58 + SIM_CRB)
+#define CSBAR4 SIM_VOLATILE_USHORT_POINTER(0x5c + SIM_CRB)
+#define CSBAR5 SIM_VOLATILE_USHORT_POINTER(0x60 + SIM_CRB)
+#define CSBAR6 SIM_VOLATILE_USHORT_POINTER(0x64 + SIM_CRB)
+#define CSBAR7 SIM_VOLATILE_USHORT_POINTER(0x68 + SIM_CRB)
+#define CSBAR8 SIM_VOLATILE_USHORT_POINTER(0x6c + SIM_CRB)
+#define CSBAR9 SIM_VOLATILE_USHORT_POINTER(0x70 + SIM_CRB)
+#define CSBAR10 SIM_VOLATILE_USHORT_POINTER(0x74 + SIM_CRB)
+
+#define MODE 0x8000
+#define Disable 0
+#define LowerByte 0x2000
+#define UpperByte 0x4000
+#define BothBytes 0x6000
+#define ReadOnly 0x0800
+#define WriteOnly 0x1000
+#define ReadWrite 0x1800
+#define SyncAS 0x0
+#define SyncDS 0x0400
+
+#define WaitStates_0 (0x0 << 6)
+#define WaitStates_1 (0x1 << 6)
+#define WaitStates_2 (0x2 << 6)
+#define WaitStates_3 (0x3 << 6)
+#define WaitStates_4 (0x4 << 6)
+#define WaitStates_5 (0x5 << 6)
+#define WaitStates_6 (0x6 << 6)
+#define WaitStates_7 (0x7 << 6)
+#define WaitStates_8 (0x8 << 6)
+#define WaitStates_9 (0x9 << 6)
+#define WaitStates_10 (0xa << 6)
+#define WaitStates_11 (0xb << 6)
+#define WaitStates_12 (0xc << 6)
+#define WaitStates_13 (0xd << 6)
+#define FastTerm (0xe << 6)
+#define External (0xf << 6)
+
+#define CPUSpace (0x0 << 4)
+#define UserSpace (0x1 << 4)
+#define SupSpace (0x2 << 4)
+#define UserSupSpace (0x3 << 4)
+
+#define IPLevel_any 0x0
+#define IPLevel_1 0x2
+#define IPLevel_2 0x4
+#define IPLevel_3 0x6
+#define IPLevel_4 0x8
+#define IPLevel_5 0xa
+#define IPLevel_6 0xc
+#define IPLevel_7 0xe
+
+#define AVEC 1
+
+#define CSORBT SIM_VOLATILE_USHORT_POINTER(0x4a + SIM_CRB)
+#define CSOR0 SIM_VOLATILE_USHORT_POINTER(0x4e + SIM_CRB)
+#define CSOR1 SIM_VOLATILE_USHORT_POINTER(0x52 + SIM_CRB)
+#define CSOR2 SIM_VOLATILE_USHORT_POINTER(0x56 + SIM_CRB)
+#define CSOR3 SIM_VOLATILE_USHORT_POINTER(0x5a + SIM_CRB)
+#define CSOR4 SIM_VOLATILE_USHORT_POINTER(0x5e + SIM_CRB)
+#define CSOR5 SIM_VOLATILE_USHORT_POINTER(0x62 + SIM_CRB)
+#define CSOR6 SIM_VOLATILE_USHORT_POINTER(0x66 + SIM_CRB)
+#define CSOR7 SIM_VOLATILE_USHORT_POINTER(0x6a + SIM_CRB)
+#define CSOR8 SIM_VOLATILE_USHORT_POINTER(0x6e + SIM_CRB)
+#define CSOR9 SIM_VOLATILE_USHORT_POINTER(0x72 + SIM_CRB)
+#define CSOR10 SIM_VOLATILE_USHORT_POINTER(0x76 + SIM_CRB)
+
+#endif /* _SIM_h_ */
diff --git a/cpukit/score/cpu/m68k/sim.h b/cpukit/score/cpu/m68k/sim.h
new file mode 100644
index 0000000000..d70f56d360
--- /dev/null
+++ b/cpukit/score/cpu/m68k/sim.h
@@ -0,0 +1,342 @@
+/*
+ *-------------------------------------------------------------------
+ *
+ * SIM -- System Integration Module
+ *
+ * The system integration module (SIM) is used on many Motorola 16-
+ * and 32-bit MCUs for the following functions:
+ *
+ * () System configuration and protection. Bus and software watchdog
+ * monitors are provided in addition to periodic interrupt generators.
+ *
+ * () Clock signal generation for other intermodule bus (IMB) members
+ * and external devices.
+ *
+ * () The generation of chip-select signals that simplify external
+ * circuitry interface.
+ *
+ * () Data ports that are available for general purpose input and
+ * output.
+ *
+ * () A system test block that is intended only for factory tests.
+ *
+ * For more information, refer to Motorola's "Modular Microcontroller
+ * Family System Integration Module Reference Manual" (Motorola document
+ * SIMRM/AD).
+ *
+ * This file has been created by John S. Gwynne for support of
+ * Motorola's 68332 MCU in the efi332 project.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistribution of source code and documentation must retain
+ * the above authorship, this list of conditions and the
+ * following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote
+ * products derived from this software without specific prior
+ * written permission.
+ *
+ * This software is provided "AS IS" without warranty of any kind,
+ * either expressed or implied, including, but not limited to, the
+ * implied warranties of merchantability, title and fitness for a
+ * particular purpose.
+ *
+ *------------------------------------------------------------------
+ *
+ * $Id$
+ */
+
+#ifndef _SIM_H_
+#define _SIM_H_
+
+
+/*
+ * XXX Why is a generic file like this including a bsp specific file?
+
+#include <efi332.h>
+ */
+
+
+/* SAM-- shift and mask */
+#undef SAM
+#define SAM(a,b,c) ((a << b) & c)
+
+/*
+ * These macros make this file usable from assembly.
+ */
+
+#ifdef ASM
+#define SIM_VOLATILE_USHORT_POINTER
+#define SIM_VOLATILE_UCHAR_POINTER
+#else
+#define SIM_VOLATILE_USHORT_POINTER (volatile unsigned short int * const)
+#define SIM_VOLATILE_UCHAR_POINTER (volatile unsigned char * const)
+#endif
+
+/* SIM_CRB (SIM Control Register Block) base address of the SIM
+ control registers */
+/* not included in ram_init.h */
+#if SIM_MM == 0
+#define SIM_CRB 0x7ffa00
+#else
+#undef SIM_MM
+#define SIM_MM 1
+#define SIM_CRB 0xfffa00
+#endif
+/* end not included in ram_init.h */
+
+
+
+#define SIMCR SIM_VOLATILE_USHORT_POINTER(0x00 + SIM_CRB)
+ /* Module Configuration Register */
+#define EXOFF 0x8000 /* External Clock Off */
+#define FRZSW 0x4000 /* Freeze Software Enable */
+#define FRZBM 0x2000 /* Freeze Bus Monitor Enable */
+#define SLVEN 0x0800 /* Factory Test Model Enabled (ro)*/
+#define SHEN 0x0300 /* Show Cycle Enable */
+#define SUPV 0x0080 /* Supervisor/Unrestricted Data Space */
+#define MM 0x0040 /* Module Mapping */
+#define IARB 0x000f /* Interrupt Arbitration Field */
+
+
+
+#define SIMTR SIM_VOLATILE_USHORT_POINTER(0x02 + SIM_CRB)
+ /* SIM Test Register */
+/* Used only for factor testing */
+
+
+
+#define SYNCR SIM_VOLATILE_USHORT_POINTER(0x04 + SIM_CRB)
+ /* Clock Synthesizer Control Register */
+#define W 0x8000 /* Frequency Control (VCO) */
+#define X 0x4000 /* Frequency Control Bit (Prescale) */
+#define Y 0x3f00 /* Frequency Control Counter */
+#define EDIV 0x0080 /* ECLK Divide Rate */
+#define SLIMP 0x0010 /* Limp Mode Status */
+#define SLOCK 0x0008 /* Synthesizer Lock */
+#define RSTEN 0x0004 /* Reset Enable */
+#define STSIM 0x0002 /* Stop Mode SIM Clock */
+#define STEXT 0x0001 /* Stop Mode External Clock */
+
+
+
+#define RSR SIM_VOLATILE_UCHAR_POINTER(0x07 + SIM_CRB)
+ /* Reset Status Register */
+#define EXT 0x0080 /* External Reset */
+#define POW 0x0040 /* Power-On Reset */
+#define SW 0x0020 /* Software Watchdog Reset */
+#define DBF 0x0010 /* Double Bus Fault Reset */
+#define LOC 0x0004 /* Loss of Clock Reset */
+#define SYS 0x0002 /* System Reset */
+#define TST 0x0001 /* Test Submodule Reset */
+
+
+
+#define SIMTRE SIM_VOLATILE_USHORT_POINTER(0x08 + SIM_CRB)
+ /* System Integration Test Register */
+/* Used only for factor testing */
+
+
+
+#define PORTE0 SIM_VOLATILE_UCHAR_POINTER(0x11 + SIM_CRB)
+#define PORTE1 SIM_VOLATILE_UCHAR_POINTER(0x13 + SIM_CRB)
+ /* Port E Data Register */
+#define DDRE SIM_VOLATILE_UCHAR_POINTER(0x15 + SIM_CRB)
+ /* Port E Data Direction Register */
+#define PEPAR SIM_VOLATILE_UCHAR_POINTER(0x17 + SIM_CRB)
+ /* Port E Pin Assignment Register */
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a bus control
+ signal. */
+
+
+
+#define PORTF0 SIM_VOLATILE_UCHAR_POINTER(0x19 + SIM_CRB)
+#define PORTF1 SIM_VOLATILE_UCHAR_POINTER(0x1b + SIM_CRB)
+ /* Port F Data Register */
+#define DDRF SIM_VOLATILE_UCHAR_POINTER(0x1d + SIM_CRB)
+ /* Port E Data Direction Register */
+#define PFPAR SIM_VOLATILE_UCHAR_POINTER(0x1f + SIM_CRB)
+/* Any bit cleared (zero) defines the corresponding pin to be an I/O
+ pin. Any bit set defines the corresponding pin to be a bus control
+ signal. */
+
+
+
+#define SYPCR SIM_VOLATILE_UCHAR_POINTER(0x21 + SIM_CRB)
+/* !!! can write to only once after reset !!! */
+ /* System Protection Control Register */
+#define SWE 0x80 /* Software Watch Enable */
+#define SWP 0x40 /* Software Watchdog Prescale */
+#define SWT 0x30 /* Software Watchdog Timing */
+#define HME 0x08 /* Halt Monitor Enable */
+#define BME 0x04 /* Bus Monitor External Enable */
+#define BMT 0x03 /* Bus Monitor Timing */
+
+
+
+#define PICR SIM_VOLATILE_USHORT_POINTER(0x22 + SIM_CRB)
+ /* Periodic Interrupt Control Reg. */
+#define PIRQL 0x0700 /* Periodic Interrupt Request Level */
+#define PIV 0x00ff /* Periodic Interrupt Level */
+
+
+
+#define PITR SIM_VOLATILE_USHORT_POINTER(0x24 + SIM_CRB)
+ /* Periodic Interrupt Timer Register */
+#define PTP 0x0100 /* Periodic Timer Prescaler Control */
+#define PITM 0x00ff /* Periodic Interrupt Timing Modulus */
+
+
+
+#define SWSR SIM_VOLATILE_UCHAR_POINTER(0x27 + SIM_CRB)
+ /* Software Service Register */
+/* write 0x55 then 0xaa to service the software watchdog */
+
+
+
+#define TSTMSRA SIM_VOLATILE_USHORT_POINTER(0x30 + SIM_CRB)
+ /* Test Module Master Shift A */
+#define TSTMSRB SIM_VOLATILE_USHORT_POINTER(0x32 + SIM_CRB)
+ /* Test Module Master Shift A */
+#define TSTSC SIM_VOLATILE_USHORT_POINTER(0x34 + SIM_CRB)
+ /* Test Module Shift Count */
+#define TSTRC SIM_VOLATILE_USHORT_POINTER(0x36 + SIM_CRB)
+ /* Test Module Repetition Counter */
+#define CREG SIM_VOLATILE_USHORT_POINTER(0x38 + SIM_CRB)
+ /* Test Module Control */
+#define DREG SIM_VOLATILE_USHORT_POINTER(0x3a + SIM_CRB)
+ /* Test Module Distributed */
+/* Used only for factor testing */
+
+
+
+#define PORTC SIM_VOLATILE_UCHAR_POINTER(0x41 + SIM_CRB)
+ /* Port C Data */
+
+
+
+#define CSPAR0 SIM_VOLATILE_USHORT_POINTER(0x44 + SIM_CRB)
+ /* Chip Select Pin Assignment
+ Resgister 0 */
+/* CSPAR0 contains seven two-bit fields that determine the functions
+ of corresponding chip-select pins. CSPAR0[15:14] are not
+ used. These bits always read zero; write have no effect. CSPAR0 bit
+ 1 always reads one; writes to CSPAR0 bit 1 have no effect. */
+#define CSPAR1 SIM_VOLATILE_USHORT_POINTER(0x46 + SIM_CRB)
+ /* Chip Select Pin Assignment
+ Register 1 */
+/* CSPAR1 contains five two-bit fields that determine the finctions of
+ corresponding chip-select pins. CSPAR1[15:10] are not used. These
+ bits always read zero; writes have no effect. */
+/*
+ *
+ * Bit Field | Description
+ * ------------+---------------
+ * 00 | Discrete Output
+ * 01 | Alternate Function
+ * 10 | Chip Select (8-bit port)
+ * 11 | Chip Select (16-bit port)
+ */
+#define DisOut 0x0
+#define AltFun 0x1
+#define CS8bit 0x2
+#define CS16bit 0x3
+/*
+ *
+ * CSPARx Field |Chip Select Signal | Alternate Signal | Discrete Output
+ *-----------------+--------------------+--------------------+---------------*/
+#define CS_5 12 /* !CS5 | FC2 | PC2 */
+#define CS_4 10 /* !CS4 | FC1 | PC1 */
+#define CS_3 8 /* !CS3 | FC0 | PC0 */
+#define CS_2 6 /* !CS2 | !BGACK | */
+#define CS_1 4 /* !CS1 | !BG | */
+#define CS_0 2 /* !CS0 | !BR | */
+#define CSBOOT 0 /* !CSBOOT | | */
+/* | | | */
+#define CS_10 8 /* !CS10 | ADDR23 | ECLK */
+#define CS_9 6 /* !CS9 | ADDR22 | PC6 */
+#define CS_8 4 /* !CS8 | ADDR21 | PC5 */
+#define CS_7 2 /* !CS7 | ADDR20 | PC4 */
+#define CS_6 0 /* !CS6 | ADDR19 | PC3 */
+
+#define BS_2K 0x0
+#define BS_8K 0x1
+#define BS_16K 0x2
+#define BS_64K 0x3
+#define BS_128K 0x4
+#define BS_256K 0x5
+#define BS_512K 0x6
+#define BS_1M 0x7
+
+#define CSBARBT SIM_VOLATILE_USHORT_POINTER(0x48 + SIM_CRB)
+#define CSBAR0 SIM_VOLATILE_USHORT_POINTER(0x4c + SIM_CRB)
+#define CSBAR1 SIM_VOLATILE_USHORT_POINTER(0x50 + SIM_CRB)
+#define CSBAR2 SIM_VOLATILE_USHORT_POINTER(0x54 + SIM_CRB)
+#define CSBAR3 SIM_VOLATILE_USHORT_POINTER(0x58 + SIM_CRB)
+#define CSBAR4 SIM_VOLATILE_USHORT_POINTER(0x5c + SIM_CRB)
+#define CSBAR5 SIM_VOLATILE_USHORT_POINTER(0x60 + SIM_CRB)
+#define CSBAR6 SIM_VOLATILE_USHORT_POINTER(0x64 + SIM_CRB)
+#define CSBAR7 SIM_VOLATILE_USHORT_POINTER(0x68 + SIM_CRB)
+#define CSBAR8 SIM_VOLATILE_USHORT_POINTER(0x6c + SIM_CRB)
+#define CSBAR9 SIM_VOLATILE_USHORT_POINTER(0x70 + SIM_CRB)
+#define CSBAR10 SIM_VOLATILE_USHORT_POINTER(0x74 + SIM_CRB)
+
+#define MODE 0x8000
+#define Disable 0
+#define LowerByte 0x2000
+#define UpperByte 0x4000
+#define BothBytes 0x6000
+#define ReadOnly 0x0800
+#define WriteOnly 0x1000
+#define ReadWrite 0x1800
+#define SyncAS 0x0
+#define SyncDS 0x0400
+
+#define WaitStates_0 (0x0 << 6)
+#define WaitStates_1 (0x1 << 6)
+#define WaitStates_2 (0x2 << 6)
+#define WaitStates_3 (0x3 << 6)
+#define WaitStates_4 (0x4 << 6)
+#define WaitStates_5 (0x5 << 6)
+#define WaitStates_6 (0x6 << 6)
+#define WaitStates_7 (0x7 << 6)
+#define WaitStates_8 (0x8 << 6)
+#define WaitStates_9 (0x9 << 6)
+#define WaitStates_10 (0xa << 6)
+#define WaitStates_11 (0xb << 6)
+#define WaitStates_12 (0xc << 6)
+#define WaitStates_13 (0xd << 6)
+#define FastTerm (0xe << 6)
+#define External (0xf << 6)
+
+#define CPUSpace (0x0 << 4)
+#define UserSpace (0x1 << 4)
+#define SupSpace (0x2 << 4)
+#define UserSupSpace (0x3 << 4)
+
+#define IPLevel_any 0x0
+#define IPLevel_1 0x2
+#define IPLevel_2 0x4
+#define IPLevel_3 0x6
+#define IPLevel_4 0x8
+#define IPLevel_5 0xa
+#define IPLevel_6 0xc
+#define IPLevel_7 0xe
+
+#define AVEC 1
+
+#define CSORBT SIM_VOLATILE_USHORT_POINTER(0x4a + SIM_CRB)
+#define CSOR0 SIM_VOLATILE_USHORT_POINTER(0x4e + SIM_CRB)
+#define CSOR1 SIM_VOLATILE_USHORT_POINTER(0x52 + SIM_CRB)
+#define CSOR2 SIM_VOLATILE_USHORT_POINTER(0x56 + SIM_CRB)
+#define CSOR3 SIM_VOLATILE_USHORT_POINTER(0x5a + SIM_CRB)
+#define CSOR4 SIM_VOLATILE_USHORT_POINTER(0x5e + SIM_CRB)
+#define CSOR5 SIM_VOLATILE_USHORT_POINTER(0x62 + SIM_CRB)
+#define CSOR6 SIM_VOLATILE_USHORT_POINTER(0x66 + SIM_CRB)
+#define CSOR7 SIM_VOLATILE_USHORT_POINTER(0x6a + SIM_CRB)
+#define CSOR8 SIM_VOLATILE_USHORT_POINTER(0x6e + SIM_CRB)
+#define CSOR9 SIM_VOLATILE_USHORT_POINTER(0x72 + SIM_CRB)
+#define CSOR10 SIM_VOLATILE_USHORT_POINTER(0x76 + SIM_CRB)
+
+#endif /* _SIM_h_ */
diff --git a/cpukit/score/cpu/mips/asm.h b/cpukit/score/cpu/mips/asm.h
new file mode 100644
index 0000000000..fccd89069f
--- /dev/null
+++ b/cpukit/score/cpu/mips/asm.h
@@ -0,0 +1,102 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+/* @(#)asm.h 03/15/96 1.1 */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/mips/cpu.c b/cpukit/score/cpu/mips/cpu.c
new file mode 100644
index 0000000000..0b3d787bdf
--- /dev/null
+++ b/cpukit/score/cpu/mips/cpu.c
@@ -0,0 +1,219 @@
+/*
+ * Mips CPU Dependent Source
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)cpu.c 08/20/96 1.5\n";
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+
+
+ISR_Handler_entry _ISR_Vector_table[ ISR_NUMBER_OF_VECTORS ];
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void null_handler( void )
+{
+}
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ unsigned int i = ISR_NUMBER_OF_VECTORS;
+
+ while ( i-- )
+ {
+ _ISR_Vector_table[i] = (ISR_Handler_entry)null_handler;
+ }
+
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0 /* located in cpu_asm.S */
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+
+#if 0 /* not necessary */
+/* use IDT/Sim to set interrupt vector. Needed to co-exist with debugger. */
+ add_ext_int_func( vector, new_handler );
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+/* we don't support this yet */
+}
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+#if 0 /* located in cpu_asm.S */
+void _CPU_Thread_Idle_body( void )
+{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+}
+#endif
+
+extern void mips_break( int error );
+
+#include <stdio.h>
+
+void mips_fatal_error( int error )
+{
+ printf("fatal error 0x%x %d\n",error,error);
+ mips_break( error );
+}
diff --git a/cpukit/score/cpu/mips/cpu_asm.S b/cpukit/score/cpu/mips/cpu_asm.S
new file mode 100644
index 0000000000..1f23a9ca15
--- /dev/null
+++ b/cpukit/score/cpu/mips/cpu_asm.S
@@ -0,0 +1,972 @@
+/* cpu_asm.S
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.s:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)cpu_asm.S 08/20/96 1.15 */
+
+#include "cpu_asm.h"
+
+#include "iregdef.h"
+#include "idtcpu.h"
+
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+#define ENDFRAME(name) \
+ .end name
+
+
+#define EXCP_STACK_SIZE (NREGS*R_SZ)
+
+#if __ghs__
+#define sd sw
+#define ld lw
+#define dmtc0 mtc0
+#define dsll sll
+#define dmfc0 mfc0
+#endif
+
+#if 1 /* 32 bit unsigned32 types */
+#define sint sw
+#define lint lw
+#define stackadd addiu
+#define intadd addu
+#define SZ_INT 4
+#define SZ_INT_POW2 2
+#else /* 64 bit unsigned32 types */
+#define sint dw
+#define lint dw
+#define stackadd daddiu
+#define intadd daddu
+#define SZ_INT 8
+#define SZ_INT_POW2 3
+#endif
+
+#ifdef __GNUC__
+#define EXTERN(x,size) .extern x,size
+#else
+#define EXTERN(x,size)
+#endif
+
+/* NOTE: these constants must match the Context_Control structure in cpu.h */
+#define S0_OFFSET 0
+#define S1_OFFSET 1
+#define S2_OFFSET 2
+#define S3_OFFSET 3
+#define S4_OFFSET 4
+#define S5_OFFSET 5
+#define S6_OFFSET 6
+#define S7_OFFSET 7
+#define SP_OFFSET 8
+#define FP_OFFSET 9
+#define RA_OFFSET 10
+#define C0_SR_OFFSET 11
+#define C0_EPC_OFFSET 12
+
+/* NOTE: these constants must match the Context_Control_fp structure in cpu.h */
+#define FP0_OFFSET 0
+#define FP1_OFFSET 1
+#define FP2_OFFSET 2
+#define FP3_OFFSET 3
+#define FP4_OFFSET 4
+#define FP5_OFFSET 5
+#define FP6_OFFSET 6
+#define FP7_OFFSET 7
+#define FP8_OFFSET 8
+#define FP9_OFFSET 9
+#define FP10_OFFSET 10
+#define FP11_OFFSET 11
+#define FP12_OFFSET 12
+#define FP13_OFFSET 13
+#define FP14_OFFSET 14
+#define FP15_OFFSET 15
+#define FP16_OFFSET 16
+#define FP17_OFFSET 17
+#define FP18_OFFSET 18
+#define FP19_OFFSET 19
+#define FP20_OFFSET 20
+#define FP21_OFFSET 21
+#define FP22_OFFSET 22
+#define FP23_OFFSET 23
+#define FP24_OFFSET 24
+#define FP25_OFFSET 25
+#define FP26_OFFSET 26
+#define FP27_OFFSET 27
+#define FP28_OFFSET 28
+#define FP29_OFFSET 29
+#define FP30_OFFSET 30
+#define FP31_OFFSET 31
+
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+/* return the current exception level for the 4650 */
+FRAME(_CPU_ISR_Get_level,sp,0,ra)
+ mfc0 v0,C0_SR
+ nop
+ andi v0,SR_EXL
+ srl v0,1
+ j ra
+ENDFRAME(_CPU_ISR_Get_level)
+
+FRAME(_CPU_ISR_Set_level,sp,0,ra)
+ nop
+ mfc0 a0,C0_SR
+ nop
+ andi a0,SR_EXL
+ beqz a0,_CPU_ISR_Set_1 /* normalize a0 */
+ nop
+ li a0,1
+_CPU_ISR_Set_1:
+ beq v0,a0,_CPU_ISR_Set_exit /* if (current_level != new_level ) */
+ nop
+ bnez a0,_CPU_ISR_Set_2
+ nop
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_EXL
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* disable exception level */
+ nop
+ j ra
+ nop
+_CPU_ISR_Set_2:
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_IE
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ nop
+ ori t0,SR_EXL|SR_IE /* enable exception level */
+ nop
+ mtc0 t0,C0_SR
+ nop
+_CPU_ISR_Set_exit:
+ j ra
+ nop
+ENDFRAME(_CPU_ISR_Set_level)
+
+/*
+ * _CPU_Context_save_fp_context
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_save_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_save_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ swc1 $f0,FP0_OFFSET*4(a1)
+ swc1 $f1,FP1_OFFSET*4(a1)
+ swc1 $f2,FP2_OFFSET*4(a1)
+ swc1 $f3,FP3_OFFSET*4(a1)
+ swc1 $f4,FP4_OFFSET*4(a1)
+ swc1 $f5,FP5_OFFSET*4(a1)
+ swc1 $f6,FP6_OFFSET*4(a1)
+ swc1 $f7,FP7_OFFSET*4(a1)
+ swc1 $f8,FP8_OFFSET*4(a1)
+ swc1 $f9,FP9_OFFSET*4(a1)
+ swc1 $f10,FP10_OFFSET*4(a1)
+ swc1 $f11,FP11_OFFSET*4(a1)
+ swc1 $f12,FP12_OFFSET*4(a1)
+ swc1 $f13,FP13_OFFSET*4(a1)
+ swc1 $f14,FP14_OFFSET*4(a1)
+ swc1 $f15,FP15_OFFSET*4(a1)
+ swc1 $f16,FP16_OFFSET*4(a1)
+ swc1 $f17,FP17_OFFSET*4(a1)
+ swc1 $f18,FP18_OFFSET*4(a1)
+ swc1 $f19,FP19_OFFSET*4(a1)
+ swc1 $f20,FP20_OFFSET*4(a1)
+ swc1 $f21,FP21_OFFSET*4(a1)
+ swc1 $f22,FP22_OFFSET*4(a1)
+ swc1 $f23,FP23_OFFSET*4(a1)
+ swc1 $f24,FP24_OFFSET*4(a1)
+ swc1 $f25,FP25_OFFSET*4(a1)
+ swc1 $f26,FP26_OFFSET*4(a1)
+ swc1 $f27,FP27_OFFSET*4(a1)
+ swc1 $f28,FP28_OFFSET*4(a1)
+ swc1 $f29,FP29_OFFSET*4(a1)
+ swc1 $f30,FP30_OFFSET*4(a1)
+ swc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_save_fp)
+
+/*
+ * _CPU_Context_restore_fp_context
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_restore_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_restore_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ lwc1 $f0,FP0_OFFSET*4(a1)
+ lwc1 $f1,FP1_OFFSET*4(a1)
+ lwc1 $f2,FP2_OFFSET*4(a1)
+ lwc1 $f3,FP3_OFFSET*4(a1)
+ lwc1 $f4,FP4_OFFSET*4(a1)
+ lwc1 $f5,FP5_OFFSET*4(a1)
+ lwc1 $f6,FP6_OFFSET*4(a1)
+ lwc1 $f7,FP7_OFFSET*4(a1)
+ lwc1 $f8,FP8_OFFSET*4(a1)
+ lwc1 $f9,FP9_OFFSET*4(a1)
+ lwc1 $f10,FP10_OFFSET*4(a1)
+ lwc1 $f11,FP11_OFFSET*4(a1)
+ lwc1 $f12,FP12_OFFSET*4(a1)
+ lwc1 $f13,FP13_OFFSET*4(a1)
+ lwc1 $f14,FP14_OFFSET*4(a1)
+ lwc1 $f15,FP15_OFFSET*4(a1)
+ lwc1 $f16,FP16_OFFSET*4(a1)
+ lwc1 $f17,FP17_OFFSET*4(a1)
+ lwc1 $f18,FP18_OFFSET*4(a1)
+ lwc1 $f19,FP19_OFFSET*4(a1)
+ lwc1 $f20,FP20_OFFSET*4(a1)
+ lwc1 $f21,FP21_OFFSET*4(a1)
+ lwc1 $f22,FP22_OFFSET*4(a1)
+ lwc1 $f23,FP23_OFFSET*4(a1)
+ lwc1 $f24,FP24_OFFSET*4(a1)
+ lwc1 $f25,FP25_OFFSET*4(a1)
+ lwc1 $f26,FP26_OFFSET*4(a1)
+ lwc1 $f27,FP27_OFFSET*4(a1)
+ lwc1 $f28,FP28_OFFSET*4(a1)
+ lwc1 $f29,FP29_OFFSET*4(a1)
+ lwc1 $f30,FP30_OFFSET*4(a1)
+ lwc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_restore_fp)
+
+/* _CPU_Context_switch
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+/* void _CPU_Context_switch(
+ * Context_Control *run,
+ * Context_Control *heir
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_switch,sp,0,ra)
+
+ mfc0 t0,C0_SR
+ li t1,~SR_IE
+ sd t0,C0_SR_OFFSET*8(a0) /* save status register */
+ and t0,t1
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ ori t0,SR_EXL|SR_IE /* enable exception level to disable interrupts */
+ mtc0 t0,C0_SR
+
+ sd ra,RA_OFFSET*8(a0) /* save current context */
+ sd sp,SP_OFFSET*8(a0)
+ sd fp,FP_OFFSET*8(a0)
+ sd s0,S0_OFFSET*8(a0)
+ sd s1,S1_OFFSET*8(a0)
+ sd s2,S2_OFFSET*8(a0)
+ sd s3,S3_OFFSET*8(a0)
+ sd s4,S4_OFFSET*8(a0)
+ sd s5,S5_OFFSET*8(a0)
+ sd s6,S6_OFFSET*8(a0)
+ sd s7,S7_OFFSET*8(a0)
+ dmfc0 t0,C0_EPC
+ sd t0,C0_EPC_OFFSET*8(a0)
+
+_CPU_Context_switch_restore:
+ ld s0,S0_OFFSET*8(a1) /* restore context */
+ ld s1,S1_OFFSET*8(a1)
+ ld s2,S2_OFFSET*8(a1)
+ ld s3,S3_OFFSET*8(a1)
+ ld s4,S4_OFFSET*8(a1)
+ ld s5,S5_OFFSET*8(a1)
+ ld s6,S6_OFFSET*8(a1)
+ ld s7,S7_OFFSET*8(a1)
+ ld fp,FP_OFFSET*8(a1)
+ ld sp,SP_OFFSET*8(a1)
+ ld ra,RA_OFFSET*8(a1)
+ ld t0,C0_EPC_OFFSET*8(a1)
+ dmtc0 t0,C0_EPC
+ ld t0,C0_SR_OFFSET*8(a1)
+ andi t0,SR_EXL
+ bnez t0,_CPU_Context_1 /* set exception level from restore context */
+ li t0,~SR_EXL
+ mfc0 t1,C0_SR
+ nop
+ and t1,t0
+ mtc0 t1,C0_SR
+_CPU_Context_1:
+ j ra
+ nop
+ENDFRAME(_CPU_Context_switch)
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generally used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+#if 0
+void _CPU_Context_restore(
+ Context_Control *new_context
+)
+{
+}
+#endif
+
+FRAME(_CPU_Context_restore,sp,0,ra)
+ dadd a1,a0,zero
+ j _CPU_Context_switch_restore
+ nop
+ENDFRAME(_CPU_Context_restore)
+
+EXTERN(_ISR_Nest_level, SZ_INT)
+EXTERN(_Thread_Dispatch_disable_level,SZ_INT)
+EXTERN(_Context_Switch_necessary,SZ_INT)
+EXTERN(_ISR_Signals_to_thread_executing,SZ_INT)
+.extern _Thread_Dispatch
+.extern _ISR_Vector_table
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ */
+
+#if 0
+void _ISR_Handler()
+{
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ */
+#endif
+FRAME(_ISR_Handler,sp,0,ra)
+.set noreorder
+#if USE_IDTKIT
+/* IDT/Kit incorrectly adds 4 to EPC before returning. This compensates */
+ lreg k0, R_EPC*R_SZ(sp)
+ daddiu k0,k0,-4
+ sreg k0, R_EPC*R_SZ(sp)
+ lreg k0, R_CAUSE*R_SZ(sp)
+ li k1, ~CAUSE_BD
+ and k0, k1
+ sreg k0, R_CAUSE*R_SZ(sp)
+#endif
+
+/* save registers not already saved by IDT/sim */
+ stackadd sp,sp,-EXCP_STACK_SIZE /* store ra on the stack */
+
+ sreg ra, R_RA*R_SZ(sp)
+ sreg v0, R_V0*R_SZ(sp)
+ sreg v1, R_V1*R_SZ(sp)
+ sreg a0, R_A0*R_SZ(sp)
+ sreg a1, R_A1*R_SZ(sp)
+ sreg a2, R_A2*R_SZ(sp)
+ sreg a3, R_A3*R_SZ(sp)
+ sreg t0, R_T0*R_SZ(sp)
+ sreg t1, R_T1*R_SZ(sp)
+ sreg t2, R_T2*R_SZ(sp)
+ sreg t3, R_T3*R_SZ(sp)
+ sreg t4, R_T4*R_SZ(sp)
+ sreg t5, R_T5*R_SZ(sp)
+ sreg t6, R_T6*R_SZ(sp)
+ sreg t7, R_T7*R_SZ(sp)
+ mflo k0
+ sreg t8, R_T8*R_SZ(sp)
+ sreg k0, R_MDLO*R_SZ(sp)
+ sreg t9, R_T9*R_SZ(sp)
+ mfhi k0
+ sreg gp, R_GP*R_SZ(sp)
+ sreg fp, R_FP*R_SZ(sp)
+ sreg k0, R_MDHI*R_SZ(sp)
+ .set noat
+ sreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,-40 /* store ra on the stack */
+ sd ra,32(sp)
+
+/* determine if an interrupt generated this exception */
+ mfc0 k0,C0_CAUSE
+ and k1,k0,CAUSE_EXCMASK
+ bnez k1,_ISR_Handler_prom_exit /* not an external interrupt, pass exception to Monitor */
+ mfc0 k1,C0_SR
+ and k0,k1
+ and k0,CAUSE_IPMASK
+ beq k0,zero,_ISR_Handler_quick_exit /* external interrupt not enabled, ignore */
+ nop
+
+ /*
+ * save some or all context on stack
+ * may need to save some special interrupt information for exit
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ */
+#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ lint t0,_ISR_Nest_level
+ beq t0, zero, _ISR_Handler_1
+ nop
+ /* switch stacks */
+_ISR_Handler_1:
+#else
+ lint t0,_ISR_Nest_level
+#endif
+ /*
+ * _ISR_Nest_level++;
+ */
+ addi t0,t0,1
+ sint t0,_ISR_Nest_level
+ /*
+ * _Thread_Dispatch_disable_level++;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,1
+ sint t1,_Thread_Dispatch_disable_level
+#if 0
+ nop
+ j _ISR_Handler_4
+ nop
+ /*
+ * while ( interrupts_pending(cause_reg) ) {
+ * vector = BITFIELD_TO_INDEX(cause_reg);
+ * (*_ISR_Vector_table[ vector ])( vector );
+ * }
+ */
+_ISR_Handler_2:
+/* software interrupt priorities can be applied here */
+ li t1,-1
+/* convert bit field into interrupt index */
+_ISR_Handler_3:
+ andi t2,t0,1
+ addi t1,1
+ beql t2,zero,_ISR_Handler_3
+ dsrl t0,1
+ li t1,7
+ dsll t1,3 /* convert index to byte offset (*8) */
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+ j _ISR_Handler_5
+ nop
+_ISR_Handler_4:
+ mfc0 t0,C0_CAUSE
+ andi t0,CAUSE_IPMASK
+ bne t0,zero,_ISR_Handler_2
+ dsrl t0,t0,8
+_ISR_Handler_5:
+#else
+ nop
+ li t1,7
+ dsll t1,t1,SZ_INT_POW2
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+#endif
+ /*
+ * --_ISR_Nest_level;
+ */
+ lint t2,_ISR_Nest_level
+ addi t2,t2,-1
+ sint t2,_ISR_Nest_level
+ /*
+ * --_Thread_Dispatch_disable_level;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,-1
+ sint t1,_Thread_Dispatch_disable_level
+ /*
+ * if ( _Thread_Dispatch_disable_level || _ISR_Nest_level )
+ * goto the label "exit interrupt (simple case)"
+ */
+ or t0,t2,t1
+ bne t0,zero,_ISR_Handler_exit
+ nop
+ /*
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * restore stack
+ * #endif
+ *
+ * if ( !_Context_Switch_necessary && !_ISR_Signals_to_thread_executing )
+ * goto the label "exit interrupt (simple case)"
+ */
+ lint t0,_Context_Switch_necessary
+ lint t1,_ISR_Signals_to_thread_executing
+ or t0,t0,t1
+ beq t0,zero,_ISR_Handler_exit
+ nop
+
+ /*
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ */
+ jal _Thread_Dispatch
+ nop
+ /*
+ * prepare to get out of interrupt
+ * return from interrupt (maybe to _ISR_Dispatch)
+ *
+ * LABEL "exit interrupt (simple case):
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+_ISR_Handler_exit:
+ ld ra,32(sp)
+ stackadd sp,sp,40
+
+/* restore interrupt context from stack */
+ lreg k0, R_MDLO*R_SZ(sp)
+ mtlo k0
+ lreg k0, R_MDHI*R_SZ(sp)
+ lreg a2, R_A2*R_SZ(sp)
+ mthi k0
+ lreg a3, R_A3*R_SZ(sp)
+ lreg t0, R_T0*R_SZ(sp)
+ lreg t1, R_T1*R_SZ(sp)
+ lreg t2, R_T2*R_SZ(sp)
+ lreg t3, R_T3*R_SZ(sp)
+ lreg t4, R_T4*R_SZ(sp)
+ lreg t5, R_T5*R_SZ(sp)
+ lreg t6, R_T6*R_SZ(sp)
+ lreg t7, R_T7*R_SZ(sp)
+ lreg t8, R_T8*R_SZ(sp)
+ lreg t9, R_T9*R_SZ(sp)
+ lreg gp, R_GP*R_SZ(sp)
+ lreg fp, R_FP*R_SZ(sp)
+ lreg ra, R_RA*R_SZ(sp)
+ lreg a0, R_A0*R_SZ(sp)
+ lreg a1, R_A1*R_SZ(sp)
+ lreg v1, R_V1*R_SZ(sp)
+ lreg v0, R_V0*R_SZ(sp)
+ .set noat
+ lreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,EXCP_STACK_SIZE /* store ra on the stack */
+
+#if USE_IDTKIT
+/* we handled exception, so return non-zero value */
+ li v0,1
+#endif
+
+_ISR_Handler_quick_exit:
+#ifdef USE_IDTKIT
+ j ra
+#else
+ eret
+#endif
+ nop
+
+_ISR_Handler_prom_exit:
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ .set reorder
+
+ENDFRAME(_ISR_Handler)
+
+
+FRAME(mips_enable_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ or t0,t0,a0
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_interrupts)
+
+FRAME(mips_disable_interrupts,sp,0,ra)
+ mfc0 v0,C0_SR /* get status reg */
+ li t1,SR_IMASK /* t1 = load interrupt mask word */
+ not t0,t1 /* t0 = ~t1 */
+ and t0,v0 /* clear imask bits */
+ mtc0 t0,C0_SR /* save status reg */
+ and v0,t1 /* mask return value (only return imask bits) */
+ jr ra
+ nop
+ENDFRAME(mips_disable_interrupts)
+
+FRAME(mips_enable_global_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ ori t0,SR_IE
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_global_interrupts)
+
+FRAME(mips_disable_global_interrupts,sp,0,ra)
+ li t1,SR_IE
+ mfc0 t0,C0_SR /* get status reg */
+ not t1
+ and t0,t1
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_disable_global_interrupts)
+
+/* return the value of the status register in v0. Used for debugging */
+FRAME(mips_get_sr,sp,0,ra)
+ mfc0 v0,C0_SR
+ j ra
+ nop
+ENDFRAME(mips_get_sr)
+
+FRAME(mips_break,sp,0,ra)
+#if 1
+ break 0x0
+ j mips_break
+#else
+ j ra
+#endif
+ nop
+ENDFRAME(mips_break)
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+FRAME(_CPU_Thread_Idle_body,sp,0,ra)
+ wait /* enter low power mode */
+ j _CPU_Thread_Idle_body
+ nop
+ENDFRAME(_CPU_Thread_Idle_body)
+
+#define VEC_CODE_LENGTH 10*4
+
+/**************************************************************************
+**
+** init_exc_vecs() - moves the exception code into the addresses
+** reserved for exception vectors
+**
+** UTLB Miss exception vector at address 0x80000000
+**
+** General exception vector at address 0x80000080
+**
+** RESET exception vector is at address 0xbfc00000
+**
+***************************************************************************/
+
+#define INITEXCFRM ((2*4)+4) /* ra + 2 arguments */
+FRAME(init_exc_vecs,sp,0,ra)
+/* This code yanked from SIM */
+#if defined(CPU_R3000)
+ .set noreorder
+ la t1,exc_utlb_code
+ la t2,exc_norm_code
+ li t3,UT_VEC
+ li t4,E_VEC
+ li t5,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ lw t7,0(t2)
+ sw t6,0(t3)
+ sw t7,0(t4)
+ addiu t1,4
+ addiu t3,4
+ addiu t4,4
+ subu t5,4
+ bne t5,zero,1b
+ addiu t2,4
+ move t5,ra # assumes clear_cache doesnt use t5
+ li a0,UT_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ nop
+ li a0,E_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ move ra,t5 # restore ra
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ .set reorder
+ move t5,ra # assumes clear_cache doesnt use t5
+
+ /* TLB exception vector */
+ la t1,exc_tlb_code
+ li t2,T_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,T_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ la t1,exc_xtlb_code
+ li t2,X_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ /* extended TLB exception vector */
+ li a0,X_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* cache error exception vector */
+ la t1,exc_cache_code
+ li t2,C_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,C_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* normal exception vector */
+ la t1,exc_norm_code
+ li t2,E_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,E_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ move ra,t5 # restore ra
+ j ra
+#endif
+ENDFRAME(init_exc_vecs)
+
+
+#if defined(CPU_R4000)
+FRAME(exc_tlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_tlb_code)
+
+
+FRAME(exc_xtlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_xtlb_code)
+
+
+FRAME(exc_cache_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_cache_code)
+
+
+FRAME(exc_norm_code,sp,0,ra)
+ la k0, _ISR_Handler /* generic external int hndlr */
+ j k0
+ nop
+ subu sp, EXCP_STACK_SIZE /* set up local stack frame */
+ENDFRAME(exc_norm_code)
+#endif
+
+/**************************************************************************
+**
+** enable_int(mask) - enables interrupts - mask is positioned so it only
+** needs to be or'ed into the status reg. This
+** also does some other things !!!! caution should
+** be used if invoking this while in the middle
+** of a debugging session where the client may have
+** nested interrupts.
+**
+****************************************************************************/
+FRAME(enable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ or a0,1
+ or t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ .set reorder
+ENDFRAME(enable_int)
+
+
+/***************************************************************************
+**
+** disable_int(mask) - disable the interrupt - mask is the complement
+** of the bits to be cleared - i.e. to clear ext int
+** 5 the mask would be - 0xffff7fff
+**
+****************************************************************************/
+FRAME(disable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ nop
+ and t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ENDFRAME(disable_int)
+
+
diff --git a/cpukit/score/cpu/mips/idtcpu.h b/cpukit/score/cpu/mips/idtcpu.h
new file mode 100644
index 0000000000..f921e85ef6
--- /dev/null
+++ b/cpukit/score/cpu/mips/idtcpu.h
@@ -0,0 +1,440 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtcpu.h -- cpu related defines
+*/
+
+#ifndef _IDTCPU_H__
+#define _IDTCPU_H__
+
+/*
+ * 950313: Ketan added Register definition for XContext reg.
+ * added define for WAIT instruction.
+ * 950421: Ketan added Register definition for Config reg (R3081)
+ */
+
+/*
+** memory configuration and mapping
+*/
+#define K0BASE 0x80000000
+#define K0SIZE 0x20000000
+#define K1BASE 0xa0000000
+#define K1SIZE 0x20000000
+#define K2BASE 0xc0000000
+#define K2SIZE 0x20000000
+#if defined(CPU_R4000)
+#define KSBASE 0xe0000000
+#define KSSIZE 0x20000000
+#endif
+
+#define KUBASE 0
+#define KUSIZE 0x80000000
+
+/*
+** Exception Vectors
+*/
+#if defined(CPU_R3000)
+#define UT_VEC K0BASE /* utlbmiss vector */
+#define E_VEC (K0BASE+0x80) /* exception vevtor */
+#endif
+#if defined(CPU_R4000)
+#define T_VEC (K0BASE+0x000) /* tlbmiss vector */
+#define X_VEC (K0BASE+0x080) /* xtlbmiss vector */
+#define C_VEC (K0BASE+0x100) /* cache error vector */
+#define E_VEC (K0BASE+0x180) /* exception vector */
+#endif
+#define R_VEC (K1BASE+0x1fc00000) /* reset vector */
+
+/*
+** Address conversion macros
+*/
+#ifdef CLANGUAGE
+#define CAST(as) (as)
+#else
+#define CAST(as)
+#endif
+#define K0_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */
+#define K1_TO_K0(x) (CAST(unsigned)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */
+#define K0_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg0 to physical */
+#define K1_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg1 to physical */
+#define PHYS_TO_K0(x) (CAST(unsigned)(x)|0x80000000) /* physical to kseg0 */
+#define PHYS_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* physical to kseg1 */
+
+/*
+** Cache size constants
+*/
+#define MINCACHE 0x200 /* 512 For 3041. */
+#define MAXCACHE 0x40000 /* 256*1024 256k */
+
+#if defined(CPU_R4000)
+/* R4000 configuration register definitions */
+#define CFG_CM 0x80000000 /* Master-Checker mode */
+#define CFG_ECMASK 0x70000000 /* System Clock Ratio */
+#define CFG_ECBY2 0x00000000 /* divide by 2 */
+#define CFG_ECBY3 0x10000000 /* divide by 3 */
+#define CFG_ECBY4 0x20000000 /* divide by 4 */
+#define CFG_EPMASK 0x0f000000 /* Transmit data pattern */
+#define CFG_EPD 0x00000000 /* D */
+#define CFG_EPDDX 0x01000000 /* DDX */
+#define CFG_EPDDXX 0x02000000 /* DDXX */
+#define CFG_EPDXDX 0x03000000 /* DXDX */
+#define CFG_EPDDXXX 0x04000000 /* DDXXX */
+#define CFG_EPDDXXXX 0x05000000 /* DDXXXX */
+#define CFG_EPDXXDXX 0x06000000 /* DXXDXX */
+#define CFG_EPDDXXXXX 0x07000000 /* DDXXXXX */
+#define CFG_EPDXXXDXXX 0x08000000 /* DXXXDXXX */
+#define CFG_SBMASK 0x00c00000 /* Secondary cache block size */
+#define CFG_SBSHIFT 22
+#define CFG_SB4 0x00000000 /* 4 words */
+#define CFG_SB8 0x00400000 /* 8 words */
+#define CFG_SB16 0x00800000 /* 16 words */
+#define CFG_SB32 0x00c00000 /* 32 words */
+#define CFG_SS 0x00200000 /* Split secondary cache */
+#define CFG_SW 0x00100000 /* Secondary cache port width */
+#define CFG_EWMASK 0x000c0000 /* System port width */
+#define CFG_EWSHIFT 18
+#define CFG_EW64 0x00000000 /* 64 bit */
+#define CFG_EW32 0x00010000 /* 32 bit */
+#define CFG_SC 0x00020000 /* Secondary cache absent */
+#define CFG_SM 0x00010000 /* Dirty Shared mode disabled */
+#define CFG_BE 0x00008000 /* Big Endian */
+#define CFG_EM 0x00004000 /* ECC mode enable */
+#define CFG_EB 0x00002000 /* Block ordering */
+#define CFG_ICMASK 0x00000e00 /* Instruction cache size */
+#define CFG_ICSHIFT 9
+#define CFG_DCMASK 0x000001c0 /* Data cache size */
+#define CFG_DCSHIFT 6
+#define CFG_IB 0x00000020 /* Instruction cache block size */
+#define CFG_DB 0x00000010 /* Data cache block size */
+#define CFG_CU 0x00000008 /* Update on Store Conditional */
+#define CFG_K0MASK 0x00000007 /* KSEG0 coherency algorithm */
+
+/*
+ * R4000 primary cache mode
+ */
+#define CFG_C_UNCACHED 2
+#define CFG_C_NONCOHERENT 3
+#define CFG_C_COHERENTXCL 4
+#define CFG_C_COHERENTXCLW 5
+#define CFG_C_COHERENTUPD 6
+
+/*
+ * R4000 cache operations (should be in assembler...?)
+ */
+#define Index_Invalidate_I 0x0 /* 0 0 */
+#define Index_Writeback_Inv_D 0x1 /* 0 1 */
+#define Index_Invalidate_SI 0x2 /* 0 2 */
+#define Index_Writeback_Inv_SD 0x3 /* 0 3 */
+#define Index_Load_Tag_I 0x4 /* 1 0 */
+#define Index_Load_Tag_D 0x5 /* 1 1 */
+#define Index_Load_Tag_SI 0x6 /* 1 2 */
+#define Index_Load_Tag_SD 0x7 /* 1 3 */
+#define Index_Store_Tag_I 0x8 /* 2 0 */
+#define Index_Store_Tag_D 0x9 /* 2 1 */
+#define Index_Store_Tag_SI 0xA /* 2 2 */
+#define Index_Store_Tag_SD 0xB /* 2 3 */
+#define Create_Dirty_Exc_D 0xD /* 3 1 */
+#define Create_Dirty_Exc_SD 0xF /* 3 3 */
+#define Hit_Invalidate_I 0x10 /* 4 0 */
+#define Hit_Invalidate_D 0x11 /* 4 1 */
+#define Hit_Invalidate_SI 0x12 /* 4 2 */
+#define Hit_Invalidate_SD 0x13 /* 4 3 */
+#define Hit_Writeback_Inv_D 0x15 /* 5 1 */
+#define Hit_Writeback_Inv_SD 0x17 /* 5 3 */
+#define Fill_I 0x14 /* 5 0 */
+#define Hit_Writeback_D 0x19 /* 6 1 */
+#define Hit_Writeback_SD 0x1B /* 6 3 */
+#define Hit_Writeback_I 0x18 /* 6 0 */
+#define Hit_Set_Virtual_SI 0x1E /* 7 2 */
+#define Hit_Set_Virtual_SD 0x1F /* 7 3 */
+
+#ifndef WAIT
+#define WAIT .word 0x42000020
+#endif WAIT
+
+#ifndef wait
+#define wait .word 0x42000020
+#endif wait
+
+#endif
+
+/*
+** TLB resource defines
+*/
+#if defined(CPU_R3000)
+#define N_TLB_ENTRIES 64
+#define TLB_PGSIZE 0x1000
+#define RANDBASE 8
+#define TLBLO_PFNMASK 0xfffff000
+#define TLBLO_PFNSHIFT 12
+#define TLBLO_N 0x800 /* non-cacheable */
+#define TLBLO_D 0x400 /* writeable */
+#define TLBLO_V 0x200 /* valid bit */
+#define TLBLO_G 0x100 /* global access bit */
+
+#define TLBHI_VPNMASK 0xfffff000
+#define TLBHI_VPNSHIFT 12
+#define TLBHI_PIDMASK 0xfc0
+#define TLBHI_PIDSHIFT 6
+#define TLBHI_NPID 64
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x00003f00
+#define TLBINX_INXSHIFT 8
+
+#define TLBRAND_RANDMASK 0x00003f00
+#define TLBRAND_RANDSHIFT 8
+
+#define TLBCTXT_BASEMASK 0xffe00000
+#define TLBCTXT_BASESHIFT 21
+
+#define TLBCTXT_VPNMASK 0x001ffffc
+#define TLBCTXT_VPNSHIFT 2
+#endif
+#if defined(CPU_R4000)
+#define N_TLB_ENTRIES 48
+
+#define TLBHI_VPN2MASK 0xffffe000
+#define TLBHI_PIDMASK 0x000000ff
+#define TLBHI_NPID 256
+
+#define TLBLO_PFNMASK 0x3fffffc0
+#define TLBLO_PFNSHIFT 6
+#define TLBLO_D 0x00000004 /* writeable */
+#define TLBLO_V 0x00000002 /* valid bit */
+#define TLBLO_G 0x00000001 /* global access bit */
+#define TLBLO_CMASK 0x00000038 /* cache algorithm mask */
+#define TLBLO_CSHIFT 3
+
+#define TLBLO_UNCACHED (CFG_C_UNCACHED<<TLBLO_CSHIFT)
+#define TLBLO_NONCOHERENT (CFG_C_NONCOHERENT<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCL (CFG_C_COHERENTXCL<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCLW (CFG_C_COHERENTXCLW<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTUPD (CFG_C_COHERENTUPD<<TLBLO_CSHIFT)
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x0000003f
+
+#define TLBRAND_RANDMASK 0x0000003f
+
+#define TLBCTXT_BASEMASK 0xff800000
+#define TLBCTXT_BASESHIFT 23
+
+#define TLBCTXT_VPN2MASK 0x007ffff0
+#define TLBCTXT_VPN2SHIFT 4
+
+#define TLBPGMASK_MASK 0x01ffe000
+#endif
+
+#if defined(CPU_R3000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_BEV 0x00400000 /* use boot exception vectors */
+
+/* Cache control bits */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_PE 0x00100000 /* cache parity error */
+#define SR_CM 0x00080000 /* cache miss */
+#define SR_PZ 0x00040000 /* cache parity zero */
+#define SR_SWC 0x00020000 /* swap cache */
+#define SR_ISC 0x00010000 /* Isolate data cache */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */
+#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */
+#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */
+#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */
+#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */
+#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */
+#endif
+
+#if defined(CPU_R4000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_RP 0x08000000 /* Reduced power operation */
+#define SR_FR 0x04000000 /* Additional floating point registers */
+#define SR_RE 0x02000000 /* Reverse endian in user mode */
+
+#define SR_BEV 0x00400000 /* Use boot exception vectors */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_SR 0x00100000 /* Soft reset */
+#define SR_CH 0x00040000 /* Cache hit */
+#define SR_CE 0x00020000 /* Use cache ECC */
+#define SR_DE 0x00010000 /* Disable cache exceptions */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KSMASK 0x00000018 /* Kernel mode mask */
+#define SR_KSUSER 0x00000010 /* User mode */
+#define SR_KSSUPER 0x00000008 /* Supervisor mode */
+#define SR_KSKERNEL 0x00000000 /* Kernel mode */
+#define SR_ERL 0x00000004 /* Error level */
+#define SR_EXL 0x00000002 /* Exception level */
+#define SR_IE 0x00000001 /* Interrupts enabled */
+#endif
+
+
+
+/*
+ * Cause Register
+ */
+#define CAUSE_BD 0x80000000 /* Branch delay slot */
+#define CAUSE_CEMASK 0x30000000 /* coprocessor error */
+#define CAUSE_CESHIFT 28
+
+
+#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */
+#define CAUSE_IPSHIFT 8
+
+#define CAUSE_EXCMASK 0x0000003C /* Cause code bits */
+#define CAUSE_EXCSHIFT 2
+
+#ifndef XDS
+/*
+** Coprocessor 0 registers
+*/
+#define C0_INX $0 /* tlb index */
+#define C0_RAND $1 /* tlb random */
+#if defined(CPU_R3000)
+#define C0_TLBLO $2 /* tlb entry low */
+#endif
+#if defined(CPU_R4000)
+#define C0_TLBLO0 $2 /* tlb entry low 0 */
+#define C0_TLBLO1 $3 /* tlb entry low 1 */
+#endif
+
+#define C0_CTXT $4 /* tlb context */
+
+#if defined(CPU_R4000)
+#define C0_PAGEMASK $5 /* tlb page mask */
+#define C0_WIRED $6 /* number of wired tlb entries */
+#endif
+
+#define C0_BADVADDR $8 /* bad virtual address */
+
+#if defined(CPU_R4000)
+#define C0_COUNT $9 /* cycle count */
+#endif
+
+#define C0_TLBHI $10 /* tlb entry hi */
+
+#if defined(CPU_R4000)
+#define C0_COMPARE $11 /* cyccle count comparator */
+#endif
+
+#define C0_SR $12 /* status register */
+#define C0_CAUSE $13 /* exception cause */
+#define C0_EPC $14 /* exception pc */
+#define C0_PRID $15 /* revision identifier */
+
+#if defined(CPU_R3000)
+#define C0_CONFIG $3 /* configuration register R3081*/
+#endif
+
+#if defined(CPU_R4000)
+#define C0_CONFIG $16 /* configuration register */
+#define C0_LLADDR $17 /* linked load address */
+#define C0_WATCHLO $18 /* watchpoint trap register */
+#define C0_WATCHHI $19 /* watchpoint trap register */
+#define C0_XCTXT $20 /* extended tlb context */
+#define C0_ECC $26 /* secondary cache ECC control */
+#define C0_CACHEERR $27 /* cache error status */
+#define C0_TAGLO $28 /* cache tag lo */
+#define C0_TAGHI $29 /* cache tag hi */
+#define C0_ERRPC $30 /* cache error pc */
+#endif
+
+#endif XDS
+
+#ifdef R4650
+#define IWATCH $18
+#define DWATCH $19
+#define IBASE $0
+#define IBOUND $1
+#define DBASE $2
+#define DBOUND $3
+#define CALG $17
+#endif
+
+#endif /* _IDTCPU_H__ */
+
diff --git a/cpukit/score/cpu/mips/iregdef.h b/cpukit/score/cpu/mips/iregdef.h
new file mode 100644
index 0000000000..f0953da852
--- /dev/null
+++ b/cpukit/score/cpu/mips/iregdef.h
@@ -0,0 +1,325 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** iregdef.h - IDT R3000 register structure header file
+**
+** Copyright 1989 Integrated Device Technology, Inc
+** All Rights Reserved
+**
+*/
+#ifndef __IREGDEF_H__
+#define __IREGDEF_H__
+
+/*
+ * 950313: Ketan added sreg/lreg and R_SZ for 64-bit saves
+ * added Register definition for XContext reg.
+ * Look towards end of this file.
+ */
+/*
+** register names
+*/
+#define r0 $0
+#define r1 $1
+#define r2 $2
+#define r3 $3
+#define r4 $4
+#define r5 $5
+#define r6 $6
+#define r7 $7
+#define r8 $8
+#define r9 $9
+#define r10 $10
+#define r11 $11
+#define r12 $12
+#define r13 $13
+
+#define r14 $14
+#define r15 $15
+#define r16 $16
+#define r17 $17
+#define r18 $18
+#define r19 $19
+#define r20 $20
+#define r21 $21
+#define r22 $22
+#define r23 $23
+#define r24 $24
+#define r25 $25
+#define r26 $26
+#define r27 $27
+#define r28 $28
+#define r29 $29
+#define r30 $30
+#define r31 $31
+
+#define fp0 $f0
+#define fp1 $f1
+#define fp2 $f2
+#define fp3 $f3
+#define fp4 $f4
+#define fp5 $f5
+#define fp6 $f6
+#define fp7 $f7
+#define fp8 $f8
+#define fp9 $f9
+#define fp10 $f10
+#define fp11 $f11
+#define fp12 $f12
+#define fp13 $f13
+#define fp14 $f14
+#define fp15 $f15
+#define fp16 $f16
+#define fp17 $f17
+#define fp18 $f18
+#define fp19 $f19
+#define fp20 $f20
+#define fp21 $f21
+#define fp22 $f22
+#define fp23 $f23
+#define fp24 $f24
+#define fp25 $f25
+#define fp26 $f26
+#define fp27 $f27
+#define fp28 $f28
+#define fp29 $f29
+#define fp30 $f30
+#define fp31 $f31
+
+#define fcr0 $0
+#define fcr30 $30
+#define fcr31 $31
+
+#define zero $0 /* wired zero */
+#define AT $at /* assembler temp */
+#define v0 $2 /* return value */
+#define v1 $3
+#define a0 $4 /* argument registers a0-a3 */
+#define a1 $5
+#define a2 $6
+#define a3 $7
+#define t0 $8 /* caller saved t0-t9 */
+#define t1 $9
+#define t2 $10
+#define t3 $11
+#define t4 $12
+#define t5 $13
+#define t6 $14
+#define t7 $15
+#define s0 $16 /* callee saved s0-s8 */
+#define s1 $17
+#define s2 $18
+#define s3 $19
+#define s4 $20
+#define s5 $21
+#define s6 $22
+#define s7 $23
+#define t8 $24
+#define t9 $25
+#define k0 $26 /* kernel usage */
+#define k1 $27 /* kernel usage */
+#define gp $28 /* sdata pointer */
+#define sp $29 /* stack pointer */
+#define s8 $30 /* yet another saved reg for the callee */
+#define fp $30 /* frame pointer - this is being phased out by MIPS */
+#define ra $31 /* return address */
+
+
+/*
+** relative position of registers in save reg area
+*/
+#define R_R0 0
+#define R_R1 1
+#define R_R2 2
+#define R_R3 3
+#define R_R4 4
+#define R_R5 5
+#define R_R6 6
+#define R_R7 7
+#define R_R8 8
+#define R_R9 9
+#define R_R10 10
+#define R_R11 11
+#define R_R12 12
+#define R_R13 13
+#define R_R14 14
+#define R_R15 15
+#define R_R16 16
+#define R_R17 17
+#define R_R18 18
+#define R_R19 19
+#define R_R20 20
+#define R_R21 21
+#define R_R22 22
+#define R_R23 23
+#define R_R24 24
+#define R_R25 25
+#define R_R26 26
+#define R_R27 27
+#define R_R28 28
+#define R_R29 29
+#define R_R30 30
+#define R_R31 31
+#define R_F0 32
+#define R_F1 33
+#define R_F2 34
+#define R_F3 35
+#define R_F4 36
+#define R_F5 37
+#define R_F6 38
+#define R_F7 39
+#define R_F8 40
+#define R_F9 41
+#define R_F10 42
+#define R_F11 43
+#define R_F12 44
+#define R_F13 45
+#define R_F14 46
+#define R_F15 47
+#define R_F16 48
+#define R_F17 49
+#define R_F18 50
+#define R_F19 51
+#define R_F20 52
+#define R_F21 53
+#define R_F22 54
+#define R_F23 55
+#define R_F24 56
+#define R_F25 57
+#define R_F26 58
+#define R_F27 59
+#define R_F28 60
+#define R_F29 61
+#define R_F30 62
+#define R_F31 63
+#define NCLIENTREGS 64
+#define R_EPC 64
+#define R_MDHI 65
+#define R_MDLO 66
+#define R_SR 67
+#define R_CAUSE 68
+#define R_TLBHI 69
+#if defined(CPU_R3000)
+#define R_TLBLO 70
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO0 70
+#endif
+#define R_BADVADDR 71
+#define R_INX 72
+#define R_RAND 73
+#define R_CTXT 74
+#define R_EXCTYPE 75
+#define R_MODE 76
+#define R_PRID 77
+#define R_FCSR 78
+#define R_FEIR 79
+#if defined(CPU_R3000)
+#define NREGS 80
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO1 80
+#define R_PAGEMASK 81
+#define R_WIRED 82
+#define R_COUNT 83
+#define R_COMPARE 84
+#define R_CONFIG 85
+#define R_LLADDR 86
+#define R_WATCHLO 87
+#define R_WATCHHI 88
+#define R_ECC 89
+#define R_CACHEERR 90
+#define R_TAGLO 91
+#define R_TAGHI 92
+#define R_ERRPC 93
+#define R_XCTXT 94 /* Ketan added from SIM64bit */
+
+#define NREGS 95
+#endif
+
+/*
+** For those who like to think in terms of the compiler names for the regs
+*/
+#define R_ZERO R_R0
+#define R_AT R_R1
+#define R_V0 R_R2
+#define R_V1 R_R3
+#define R_A0 R_R4
+#define R_A1 R_R5
+#define R_A2 R_R6
+#define R_A3 R_R7
+#define R_T0 R_R8
+#define R_T1 R_R9
+#define R_T2 R_R10
+#define R_T3 R_R11
+#define R_T4 R_R12
+#define R_T5 R_R13
+#define R_T6 R_R14
+#define R_T7 R_R15
+#define R_S0 R_R16
+#define R_S1 R_R17
+#define R_S2 R_R18
+#define R_S3 R_R19
+#define R_S4 R_R20
+#define R_S5 R_R21
+#define R_S6 R_R22
+#define R_S7 R_R23
+#define R_T8 R_R24
+#define R_T9 R_R25
+#define R_K0 R_R26
+#define R_K1 R_R27
+#define R_GP R_R28
+#define R_SP R_R29
+#define R_FP R_R30
+#define R_RA R_R31
+
+/* Ketan added the following */
+#ifdef CPU_R3000
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#endif CPU_R3000
+
+#ifdef CPU_R4000
+#if __mips < 3
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#else
+#define sreg sd
+#define lreg ld
+#define rmfc0 dmfc0
+#define rmtc0 dmtc0
+#define R_SZ 8
+#endif
+#endif CPU_R4000
+/* Ketan till here */
+
+#endif /* __IREGDEF_H__ */
+
diff --git a/cpukit/score/cpu/mips/rtems/asm.h b/cpukit/score/cpu/mips/rtems/asm.h
new file mode 100644
index 0000000000..fccd89069f
--- /dev/null
+++ b/cpukit/score/cpu/mips/rtems/asm.h
@@ -0,0 +1,102 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+/* @(#)asm.h 03/15/96 1.1 */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/mips/rtems/mips/idtcpu.h b/cpukit/score/cpu/mips/rtems/mips/idtcpu.h
new file mode 100644
index 0000000000..f921e85ef6
--- /dev/null
+++ b/cpukit/score/cpu/mips/rtems/mips/idtcpu.h
@@ -0,0 +1,440 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtcpu.h -- cpu related defines
+*/
+
+#ifndef _IDTCPU_H__
+#define _IDTCPU_H__
+
+/*
+ * 950313: Ketan added Register definition for XContext reg.
+ * added define for WAIT instruction.
+ * 950421: Ketan added Register definition for Config reg (R3081)
+ */
+
+/*
+** memory configuration and mapping
+*/
+#define K0BASE 0x80000000
+#define K0SIZE 0x20000000
+#define K1BASE 0xa0000000
+#define K1SIZE 0x20000000
+#define K2BASE 0xc0000000
+#define K2SIZE 0x20000000
+#if defined(CPU_R4000)
+#define KSBASE 0xe0000000
+#define KSSIZE 0x20000000
+#endif
+
+#define KUBASE 0
+#define KUSIZE 0x80000000
+
+/*
+** Exception Vectors
+*/
+#if defined(CPU_R3000)
+#define UT_VEC K0BASE /* utlbmiss vector */
+#define E_VEC (K0BASE+0x80) /* exception vevtor */
+#endif
+#if defined(CPU_R4000)
+#define T_VEC (K0BASE+0x000) /* tlbmiss vector */
+#define X_VEC (K0BASE+0x080) /* xtlbmiss vector */
+#define C_VEC (K0BASE+0x100) /* cache error vector */
+#define E_VEC (K0BASE+0x180) /* exception vector */
+#endif
+#define R_VEC (K1BASE+0x1fc00000) /* reset vector */
+
+/*
+** Address conversion macros
+*/
+#ifdef CLANGUAGE
+#define CAST(as) (as)
+#else
+#define CAST(as)
+#endif
+#define K0_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */
+#define K1_TO_K0(x) (CAST(unsigned)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */
+#define K0_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg0 to physical */
+#define K1_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg1 to physical */
+#define PHYS_TO_K0(x) (CAST(unsigned)(x)|0x80000000) /* physical to kseg0 */
+#define PHYS_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* physical to kseg1 */
+
+/*
+** Cache size constants
+*/
+#define MINCACHE 0x200 /* 512 For 3041. */
+#define MAXCACHE 0x40000 /* 256*1024 256k */
+
+#if defined(CPU_R4000)
+/* R4000 configuration register definitions */
+#define CFG_CM 0x80000000 /* Master-Checker mode */
+#define CFG_ECMASK 0x70000000 /* System Clock Ratio */
+#define CFG_ECBY2 0x00000000 /* divide by 2 */
+#define CFG_ECBY3 0x10000000 /* divide by 3 */
+#define CFG_ECBY4 0x20000000 /* divide by 4 */
+#define CFG_EPMASK 0x0f000000 /* Transmit data pattern */
+#define CFG_EPD 0x00000000 /* D */
+#define CFG_EPDDX 0x01000000 /* DDX */
+#define CFG_EPDDXX 0x02000000 /* DDXX */
+#define CFG_EPDXDX 0x03000000 /* DXDX */
+#define CFG_EPDDXXX 0x04000000 /* DDXXX */
+#define CFG_EPDDXXXX 0x05000000 /* DDXXXX */
+#define CFG_EPDXXDXX 0x06000000 /* DXXDXX */
+#define CFG_EPDDXXXXX 0x07000000 /* DDXXXXX */
+#define CFG_EPDXXXDXXX 0x08000000 /* DXXXDXXX */
+#define CFG_SBMASK 0x00c00000 /* Secondary cache block size */
+#define CFG_SBSHIFT 22
+#define CFG_SB4 0x00000000 /* 4 words */
+#define CFG_SB8 0x00400000 /* 8 words */
+#define CFG_SB16 0x00800000 /* 16 words */
+#define CFG_SB32 0x00c00000 /* 32 words */
+#define CFG_SS 0x00200000 /* Split secondary cache */
+#define CFG_SW 0x00100000 /* Secondary cache port width */
+#define CFG_EWMASK 0x000c0000 /* System port width */
+#define CFG_EWSHIFT 18
+#define CFG_EW64 0x00000000 /* 64 bit */
+#define CFG_EW32 0x00010000 /* 32 bit */
+#define CFG_SC 0x00020000 /* Secondary cache absent */
+#define CFG_SM 0x00010000 /* Dirty Shared mode disabled */
+#define CFG_BE 0x00008000 /* Big Endian */
+#define CFG_EM 0x00004000 /* ECC mode enable */
+#define CFG_EB 0x00002000 /* Block ordering */
+#define CFG_ICMASK 0x00000e00 /* Instruction cache size */
+#define CFG_ICSHIFT 9
+#define CFG_DCMASK 0x000001c0 /* Data cache size */
+#define CFG_DCSHIFT 6
+#define CFG_IB 0x00000020 /* Instruction cache block size */
+#define CFG_DB 0x00000010 /* Data cache block size */
+#define CFG_CU 0x00000008 /* Update on Store Conditional */
+#define CFG_K0MASK 0x00000007 /* KSEG0 coherency algorithm */
+
+/*
+ * R4000 primary cache mode
+ */
+#define CFG_C_UNCACHED 2
+#define CFG_C_NONCOHERENT 3
+#define CFG_C_COHERENTXCL 4
+#define CFG_C_COHERENTXCLW 5
+#define CFG_C_COHERENTUPD 6
+
+/*
+ * R4000 cache operations (should be in assembler...?)
+ */
+#define Index_Invalidate_I 0x0 /* 0 0 */
+#define Index_Writeback_Inv_D 0x1 /* 0 1 */
+#define Index_Invalidate_SI 0x2 /* 0 2 */
+#define Index_Writeback_Inv_SD 0x3 /* 0 3 */
+#define Index_Load_Tag_I 0x4 /* 1 0 */
+#define Index_Load_Tag_D 0x5 /* 1 1 */
+#define Index_Load_Tag_SI 0x6 /* 1 2 */
+#define Index_Load_Tag_SD 0x7 /* 1 3 */
+#define Index_Store_Tag_I 0x8 /* 2 0 */
+#define Index_Store_Tag_D 0x9 /* 2 1 */
+#define Index_Store_Tag_SI 0xA /* 2 2 */
+#define Index_Store_Tag_SD 0xB /* 2 3 */
+#define Create_Dirty_Exc_D 0xD /* 3 1 */
+#define Create_Dirty_Exc_SD 0xF /* 3 3 */
+#define Hit_Invalidate_I 0x10 /* 4 0 */
+#define Hit_Invalidate_D 0x11 /* 4 1 */
+#define Hit_Invalidate_SI 0x12 /* 4 2 */
+#define Hit_Invalidate_SD 0x13 /* 4 3 */
+#define Hit_Writeback_Inv_D 0x15 /* 5 1 */
+#define Hit_Writeback_Inv_SD 0x17 /* 5 3 */
+#define Fill_I 0x14 /* 5 0 */
+#define Hit_Writeback_D 0x19 /* 6 1 */
+#define Hit_Writeback_SD 0x1B /* 6 3 */
+#define Hit_Writeback_I 0x18 /* 6 0 */
+#define Hit_Set_Virtual_SI 0x1E /* 7 2 */
+#define Hit_Set_Virtual_SD 0x1F /* 7 3 */
+
+#ifndef WAIT
+#define WAIT .word 0x42000020
+#endif WAIT
+
+#ifndef wait
+#define wait .word 0x42000020
+#endif wait
+
+#endif
+
+/*
+** TLB resource defines
+*/
+#if defined(CPU_R3000)
+#define N_TLB_ENTRIES 64
+#define TLB_PGSIZE 0x1000
+#define RANDBASE 8
+#define TLBLO_PFNMASK 0xfffff000
+#define TLBLO_PFNSHIFT 12
+#define TLBLO_N 0x800 /* non-cacheable */
+#define TLBLO_D 0x400 /* writeable */
+#define TLBLO_V 0x200 /* valid bit */
+#define TLBLO_G 0x100 /* global access bit */
+
+#define TLBHI_VPNMASK 0xfffff000
+#define TLBHI_VPNSHIFT 12
+#define TLBHI_PIDMASK 0xfc0
+#define TLBHI_PIDSHIFT 6
+#define TLBHI_NPID 64
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x00003f00
+#define TLBINX_INXSHIFT 8
+
+#define TLBRAND_RANDMASK 0x00003f00
+#define TLBRAND_RANDSHIFT 8
+
+#define TLBCTXT_BASEMASK 0xffe00000
+#define TLBCTXT_BASESHIFT 21
+
+#define TLBCTXT_VPNMASK 0x001ffffc
+#define TLBCTXT_VPNSHIFT 2
+#endif
+#if defined(CPU_R4000)
+#define N_TLB_ENTRIES 48
+
+#define TLBHI_VPN2MASK 0xffffe000
+#define TLBHI_PIDMASK 0x000000ff
+#define TLBHI_NPID 256
+
+#define TLBLO_PFNMASK 0x3fffffc0
+#define TLBLO_PFNSHIFT 6
+#define TLBLO_D 0x00000004 /* writeable */
+#define TLBLO_V 0x00000002 /* valid bit */
+#define TLBLO_G 0x00000001 /* global access bit */
+#define TLBLO_CMASK 0x00000038 /* cache algorithm mask */
+#define TLBLO_CSHIFT 3
+
+#define TLBLO_UNCACHED (CFG_C_UNCACHED<<TLBLO_CSHIFT)
+#define TLBLO_NONCOHERENT (CFG_C_NONCOHERENT<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCL (CFG_C_COHERENTXCL<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCLW (CFG_C_COHERENTXCLW<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTUPD (CFG_C_COHERENTUPD<<TLBLO_CSHIFT)
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x0000003f
+
+#define TLBRAND_RANDMASK 0x0000003f
+
+#define TLBCTXT_BASEMASK 0xff800000
+#define TLBCTXT_BASESHIFT 23
+
+#define TLBCTXT_VPN2MASK 0x007ffff0
+#define TLBCTXT_VPN2SHIFT 4
+
+#define TLBPGMASK_MASK 0x01ffe000
+#endif
+
+#if defined(CPU_R3000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_BEV 0x00400000 /* use boot exception vectors */
+
+/* Cache control bits */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_PE 0x00100000 /* cache parity error */
+#define SR_CM 0x00080000 /* cache miss */
+#define SR_PZ 0x00040000 /* cache parity zero */
+#define SR_SWC 0x00020000 /* swap cache */
+#define SR_ISC 0x00010000 /* Isolate data cache */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */
+#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */
+#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */
+#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */
+#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */
+#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */
+#endif
+
+#if defined(CPU_R4000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_RP 0x08000000 /* Reduced power operation */
+#define SR_FR 0x04000000 /* Additional floating point registers */
+#define SR_RE 0x02000000 /* Reverse endian in user mode */
+
+#define SR_BEV 0x00400000 /* Use boot exception vectors */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_SR 0x00100000 /* Soft reset */
+#define SR_CH 0x00040000 /* Cache hit */
+#define SR_CE 0x00020000 /* Use cache ECC */
+#define SR_DE 0x00010000 /* Disable cache exceptions */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KSMASK 0x00000018 /* Kernel mode mask */
+#define SR_KSUSER 0x00000010 /* User mode */
+#define SR_KSSUPER 0x00000008 /* Supervisor mode */
+#define SR_KSKERNEL 0x00000000 /* Kernel mode */
+#define SR_ERL 0x00000004 /* Error level */
+#define SR_EXL 0x00000002 /* Exception level */
+#define SR_IE 0x00000001 /* Interrupts enabled */
+#endif
+
+
+
+/*
+ * Cause Register
+ */
+#define CAUSE_BD 0x80000000 /* Branch delay slot */
+#define CAUSE_CEMASK 0x30000000 /* coprocessor error */
+#define CAUSE_CESHIFT 28
+
+
+#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */
+#define CAUSE_IPSHIFT 8
+
+#define CAUSE_EXCMASK 0x0000003C /* Cause code bits */
+#define CAUSE_EXCSHIFT 2
+
+#ifndef XDS
+/*
+** Coprocessor 0 registers
+*/
+#define C0_INX $0 /* tlb index */
+#define C0_RAND $1 /* tlb random */
+#if defined(CPU_R3000)
+#define C0_TLBLO $2 /* tlb entry low */
+#endif
+#if defined(CPU_R4000)
+#define C0_TLBLO0 $2 /* tlb entry low 0 */
+#define C0_TLBLO1 $3 /* tlb entry low 1 */
+#endif
+
+#define C0_CTXT $4 /* tlb context */
+
+#if defined(CPU_R4000)
+#define C0_PAGEMASK $5 /* tlb page mask */
+#define C0_WIRED $6 /* number of wired tlb entries */
+#endif
+
+#define C0_BADVADDR $8 /* bad virtual address */
+
+#if defined(CPU_R4000)
+#define C0_COUNT $9 /* cycle count */
+#endif
+
+#define C0_TLBHI $10 /* tlb entry hi */
+
+#if defined(CPU_R4000)
+#define C0_COMPARE $11 /* cyccle count comparator */
+#endif
+
+#define C0_SR $12 /* status register */
+#define C0_CAUSE $13 /* exception cause */
+#define C0_EPC $14 /* exception pc */
+#define C0_PRID $15 /* revision identifier */
+
+#if defined(CPU_R3000)
+#define C0_CONFIG $3 /* configuration register R3081*/
+#endif
+
+#if defined(CPU_R4000)
+#define C0_CONFIG $16 /* configuration register */
+#define C0_LLADDR $17 /* linked load address */
+#define C0_WATCHLO $18 /* watchpoint trap register */
+#define C0_WATCHHI $19 /* watchpoint trap register */
+#define C0_XCTXT $20 /* extended tlb context */
+#define C0_ECC $26 /* secondary cache ECC control */
+#define C0_CACHEERR $27 /* cache error status */
+#define C0_TAGLO $28 /* cache tag lo */
+#define C0_TAGHI $29 /* cache tag hi */
+#define C0_ERRPC $30 /* cache error pc */
+#endif
+
+#endif XDS
+
+#ifdef R4650
+#define IWATCH $18
+#define DWATCH $19
+#define IBASE $0
+#define IBOUND $1
+#define DBASE $2
+#define DBOUND $3
+#define CALG $17
+#endif
+
+#endif /* _IDTCPU_H__ */
+
diff --git a/cpukit/score/cpu/mips/rtems/mips/iregdef.h b/cpukit/score/cpu/mips/rtems/mips/iregdef.h
new file mode 100644
index 0000000000..f0953da852
--- /dev/null
+++ b/cpukit/score/cpu/mips/rtems/mips/iregdef.h
@@ -0,0 +1,325 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** iregdef.h - IDT R3000 register structure header file
+**
+** Copyright 1989 Integrated Device Technology, Inc
+** All Rights Reserved
+**
+*/
+#ifndef __IREGDEF_H__
+#define __IREGDEF_H__
+
+/*
+ * 950313: Ketan added sreg/lreg and R_SZ for 64-bit saves
+ * added Register definition for XContext reg.
+ * Look towards end of this file.
+ */
+/*
+** register names
+*/
+#define r0 $0
+#define r1 $1
+#define r2 $2
+#define r3 $3
+#define r4 $4
+#define r5 $5
+#define r6 $6
+#define r7 $7
+#define r8 $8
+#define r9 $9
+#define r10 $10
+#define r11 $11
+#define r12 $12
+#define r13 $13
+
+#define r14 $14
+#define r15 $15
+#define r16 $16
+#define r17 $17
+#define r18 $18
+#define r19 $19
+#define r20 $20
+#define r21 $21
+#define r22 $22
+#define r23 $23
+#define r24 $24
+#define r25 $25
+#define r26 $26
+#define r27 $27
+#define r28 $28
+#define r29 $29
+#define r30 $30
+#define r31 $31
+
+#define fp0 $f0
+#define fp1 $f1
+#define fp2 $f2
+#define fp3 $f3
+#define fp4 $f4
+#define fp5 $f5
+#define fp6 $f6
+#define fp7 $f7
+#define fp8 $f8
+#define fp9 $f9
+#define fp10 $f10
+#define fp11 $f11
+#define fp12 $f12
+#define fp13 $f13
+#define fp14 $f14
+#define fp15 $f15
+#define fp16 $f16
+#define fp17 $f17
+#define fp18 $f18
+#define fp19 $f19
+#define fp20 $f20
+#define fp21 $f21
+#define fp22 $f22
+#define fp23 $f23
+#define fp24 $f24
+#define fp25 $f25
+#define fp26 $f26
+#define fp27 $f27
+#define fp28 $f28
+#define fp29 $f29
+#define fp30 $f30
+#define fp31 $f31
+
+#define fcr0 $0
+#define fcr30 $30
+#define fcr31 $31
+
+#define zero $0 /* wired zero */
+#define AT $at /* assembler temp */
+#define v0 $2 /* return value */
+#define v1 $3
+#define a0 $4 /* argument registers a0-a3 */
+#define a1 $5
+#define a2 $6
+#define a3 $7
+#define t0 $8 /* caller saved t0-t9 */
+#define t1 $9
+#define t2 $10
+#define t3 $11
+#define t4 $12
+#define t5 $13
+#define t6 $14
+#define t7 $15
+#define s0 $16 /* callee saved s0-s8 */
+#define s1 $17
+#define s2 $18
+#define s3 $19
+#define s4 $20
+#define s5 $21
+#define s6 $22
+#define s7 $23
+#define t8 $24
+#define t9 $25
+#define k0 $26 /* kernel usage */
+#define k1 $27 /* kernel usage */
+#define gp $28 /* sdata pointer */
+#define sp $29 /* stack pointer */
+#define s8 $30 /* yet another saved reg for the callee */
+#define fp $30 /* frame pointer - this is being phased out by MIPS */
+#define ra $31 /* return address */
+
+
+/*
+** relative position of registers in save reg area
+*/
+#define R_R0 0
+#define R_R1 1
+#define R_R2 2
+#define R_R3 3
+#define R_R4 4
+#define R_R5 5
+#define R_R6 6
+#define R_R7 7
+#define R_R8 8
+#define R_R9 9
+#define R_R10 10
+#define R_R11 11
+#define R_R12 12
+#define R_R13 13
+#define R_R14 14
+#define R_R15 15
+#define R_R16 16
+#define R_R17 17
+#define R_R18 18
+#define R_R19 19
+#define R_R20 20
+#define R_R21 21
+#define R_R22 22
+#define R_R23 23
+#define R_R24 24
+#define R_R25 25
+#define R_R26 26
+#define R_R27 27
+#define R_R28 28
+#define R_R29 29
+#define R_R30 30
+#define R_R31 31
+#define R_F0 32
+#define R_F1 33
+#define R_F2 34
+#define R_F3 35
+#define R_F4 36
+#define R_F5 37
+#define R_F6 38
+#define R_F7 39
+#define R_F8 40
+#define R_F9 41
+#define R_F10 42
+#define R_F11 43
+#define R_F12 44
+#define R_F13 45
+#define R_F14 46
+#define R_F15 47
+#define R_F16 48
+#define R_F17 49
+#define R_F18 50
+#define R_F19 51
+#define R_F20 52
+#define R_F21 53
+#define R_F22 54
+#define R_F23 55
+#define R_F24 56
+#define R_F25 57
+#define R_F26 58
+#define R_F27 59
+#define R_F28 60
+#define R_F29 61
+#define R_F30 62
+#define R_F31 63
+#define NCLIENTREGS 64
+#define R_EPC 64
+#define R_MDHI 65
+#define R_MDLO 66
+#define R_SR 67
+#define R_CAUSE 68
+#define R_TLBHI 69
+#if defined(CPU_R3000)
+#define R_TLBLO 70
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO0 70
+#endif
+#define R_BADVADDR 71
+#define R_INX 72
+#define R_RAND 73
+#define R_CTXT 74
+#define R_EXCTYPE 75
+#define R_MODE 76
+#define R_PRID 77
+#define R_FCSR 78
+#define R_FEIR 79
+#if defined(CPU_R3000)
+#define NREGS 80
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO1 80
+#define R_PAGEMASK 81
+#define R_WIRED 82
+#define R_COUNT 83
+#define R_COMPARE 84
+#define R_CONFIG 85
+#define R_LLADDR 86
+#define R_WATCHLO 87
+#define R_WATCHHI 88
+#define R_ECC 89
+#define R_CACHEERR 90
+#define R_TAGLO 91
+#define R_TAGHI 92
+#define R_ERRPC 93
+#define R_XCTXT 94 /* Ketan added from SIM64bit */
+
+#define NREGS 95
+#endif
+
+/*
+** For those who like to think in terms of the compiler names for the regs
+*/
+#define R_ZERO R_R0
+#define R_AT R_R1
+#define R_V0 R_R2
+#define R_V1 R_R3
+#define R_A0 R_R4
+#define R_A1 R_R5
+#define R_A2 R_R6
+#define R_A3 R_R7
+#define R_T0 R_R8
+#define R_T1 R_R9
+#define R_T2 R_R10
+#define R_T3 R_R11
+#define R_T4 R_R12
+#define R_T5 R_R13
+#define R_T6 R_R14
+#define R_T7 R_R15
+#define R_S0 R_R16
+#define R_S1 R_R17
+#define R_S2 R_R18
+#define R_S3 R_R19
+#define R_S4 R_R20
+#define R_S5 R_R21
+#define R_S6 R_R22
+#define R_S7 R_R23
+#define R_T8 R_R24
+#define R_T9 R_R25
+#define R_K0 R_R26
+#define R_K1 R_R27
+#define R_GP R_R28
+#define R_SP R_R29
+#define R_FP R_R30
+#define R_RA R_R31
+
+/* Ketan added the following */
+#ifdef CPU_R3000
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#endif CPU_R3000
+
+#ifdef CPU_R4000
+#if __mips < 3
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#else
+#define sreg sd
+#define lreg ld
+#define rmfc0 dmfc0
+#define rmtc0 dmtc0
+#define R_SZ 8
+#endif
+#endif CPU_R4000
+/* Ketan till here */
+
+#endif /* __IREGDEF_H__ */
+
diff --git a/cpukit/score/cpu/mips64orion/asm.h b/cpukit/score/cpu/mips64orion/asm.h
new file mode 100644
index 0000000000..fccd89069f
--- /dev/null
+++ b/cpukit/score/cpu/mips64orion/asm.h
@@ -0,0 +1,102 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+/* @(#)asm.h 03/15/96 1.1 */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/mips64orion/cpu.c b/cpukit/score/cpu/mips64orion/cpu.c
new file mode 100644
index 0000000000..0b3d787bdf
--- /dev/null
+++ b/cpukit/score/cpu/mips64orion/cpu.c
@@ -0,0 +1,219 @@
+/*
+ * Mips CPU Dependent Source
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu.c:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * Rather than deleting this, it is commented out to (hopefully) help
+ * the submitter send updates.
+ *
+ * static char _sccsid[] = "@(#)cpu.c 08/20/96 1.5\n";
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+
+
+ISR_Handler_entry _ISR_Vector_table[ ISR_NUMBER_OF_VECTORS ];
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void null_handler( void )
+{
+}
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ unsigned int i = ISR_NUMBER_OF_VECTORS;
+
+ while ( i-- )
+ {
+ _ISR_Vector_table[i] = (ISR_Handler_entry)null_handler;
+ }
+
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0 /* located in cpu_asm.S */
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+
+#if 0 /* not necessary */
+/* use IDT/Sim to set interrupt vector. Needed to co-exist with debugger. */
+ add_ext_int_func( vector, new_handler );
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+/* we don't support this yet */
+}
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+#if 0 /* located in cpu_asm.S */
+void _CPU_Thread_Idle_body( void )
+{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+}
+#endif
+
+extern void mips_break( int error );
+
+#include <stdio.h>
+
+void mips_fatal_error( int error )
+{
+ printf("fatal error 0x%x %d\n",error,error);
+ mips_break( error );
+}
diff --git a/cpukit/score/cpu/mips64orion/cpu_asm.S b/cpukit/score/cpu/mips64orion/cpu_asm.S
new file mode 100644
index 0000000000..1f23a9ca15
--- /dev/null
+++ b/cpukit/score/cpu/mips64orion/cpu_asm.S
@@ -0,0 +1,972 @@
+/* cpu_asm.S
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.s:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+/* @(#)cpu_asm.S 08/20/96 1.15 */
+
+#include "cpu_asm.h"
+
+#include "iregdef.h"
+#include "idtcpu.h"
+
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+#define ENDFRAME(name) \
+ .end name
+
+
+#define EXCP_STACK_SIZE (NREGS*R_SZ)
+
+#if __ghs__
+#define sd sw
+#define ld lw
+#define dmtc0 mtc0
+#define dsll sll
+#define dmfc0 mfc0
+#endif
+
+#if 1 /* 32 bit unsigned32 types */
+#define sint sw
+#define lint lw
+#define stackadd addiu
+#define intadd addu
+#define SZ_INT 4
+#define SZ_INT_POW2 2
+#else /* 64 bit unsigned32 types */
+#define sint dw
+#define lint dw
+#define stackadd daddiu
+#define intadd daddu
+#define SZ_INT 8
+#define SZ_INT_POW2 3
+#endif
+
+#ifdef __GNUC__
+#define EXTERN(x,size) .extern x,size
+#else
+#define EXTERN(x,size)
+#endif
+
+/* NOTE: these constants must match the Context_Control structure in cpu.h */
+#define S0_OFFSET 0
+#define S1_OFFSET 1
+#define S2_OFFSET 2
+#define S3_OFFSET 3
+#define S4_OFFSET 4
+#define S5_OFFSET 5
+#define S6_OFFSET 6
+#define S7_OFFSET 7
+#define SP_OFFSET 8
+#define FP_OFFSET 9
+#define RA_OFFSET 10
+#define C0_SR_OFFSET 11
+#define C0_EPC_OFFSET 12
+
+/* NOTE: these constants must match the Context_Control_fp structure in cpu.h */
+#define FP0_OFFSET 0
+#define FP1_OFFSET 1
+#define FP2_OFFSET 2
+#define FP3_OFFSET 3
+#define FP4_OFFSET 4
+#define FP5_OFFSET 5
+#define FP6_OFFSET 6
+#define FP7_OFFSET 7
+#define FP8_OFFSET 8
+#define FP9_OFFSET 9
+#define FP10_OFFSET 10
+#define FP11_OFFSET 11
+#define FP12_OFFSET 12
+#define FP13_OFFSET 13
+#define FP14_OFFSET 14
+#define FP15_OFFSET 15
+#define FP16_OFFSET 16
+#define FP17_OFFSET 17
+#define FP18_OFFSET 18
+#define FP19_OFFSET 19
+#define FP20_OFFSET 20
+#define FP21_OFFSET 21
+#define FP22_OFFSET 22
+#define FP23_OFFSET 23
+#define FP24_OFFSET 24
+#define FP25_OFFSET 25
+#define FP26_OFFSET 26
+#define FP27_OFFSET 27
+#define FP28_OFFSET 28
+#define FP29_OFFSET 29
+#define FP30_OFFSET 30
+#define FP31_OFFSET 31
+
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+#if 0
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+}
+#endif
+/* return the current exception level for the 4650 */
+FRAME(_CPU_ISR_Get_level,sp,0,ra)
+ mfc0 v0,C0_SR
+ nop
+ andi v0,SR_EXL
+ srl v0,1
+ j ra
+ENDFRAME(_CPU_ISR_Get_level)
+
+FRAME(_CPU_ISR_Set_level,sp,0,ra)
+ nop
+ mfc0 a0,C0_SR
+ nop
+ andi a0,SR_EXL
+ beqz a0,_CPU_ISR_Set_1 /* normalize a0 */
+ nop
+ li a0,1
+_CPU_ISR_Set_1:
+ beq v0,a0,_CPU_ISR_Set_exit /* if (current_level != new_level ) */
+ nop
+ bnez a0,_CPU_ISR_Set_2
+ nop
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_EXL
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* disable exception level */
+ nop
+ j ra
+ nop
+_CPU_ISR_Set_2:
+ nop
+ mfc0 t0,C0_SR
+ nop
+ li t1,~SR_IE
+ and t0,t1
+ nop
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ nop
+ ori t0,SR_EXL|SR_IE /* enable exception level */
+ nop
+ mtc0 t0,C0_SR
+ nop
+_CPU_ISR_Set_exit:
+ j ra
+ nop
+ENDFRAME(_CPU_ISR_Set_level)
+
+/*
+ * _CPU_Context_save_fp_context
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_save_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_save_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ swc1 $f0,FP0_OFFSET*4(a1)
+ swc1 $f1,FP1_OFFSET*4(a1)
+ swc1 $f2,FP2_OFFSET*4(a1)
+ swc1 $f3,FP3_OFFSET*4(a1)
+ swc1 $f4,FP4_OFFSET*4(a1)
+ swc1 $f5,FP5_OFFSET*4(a1)
+ swc1 $f6,FP6_OFFSET*4(a1)
+ swc1 $f7,FP7_OFFSET*4(a1)
+ swc1 $f8,FP8_OFFSET*4(a1)
+ swc1 $f9,FP9_OFFSET*4(a1)
+ swc1 $f10,FP10_OFFSET*4(a1)
+ swc1 $f11,FP11_OFFSET*4(a1)
+ swc1 $f12,FP12_OFFSET*4(a1)
+ swc1 $f13,FP13_OFFSET*4(a1)
+ swc1 $f14,FP14_OFFSET*4(a1)
+ swc1 $f15,FP15_OFFSET*4(a1)
+ swc1 $f16,FP16_OFFSET*4(a1)
+ swc1 $f17,FP17_OFFSET*4(a1)
+ swc1 $f18,FP18_OFFSET*4(a1)
+ swc1 $f19,FP19_OFFSET*4(a1)
+ swc1 $f20,FP20_OFFSET*4(a1)
+ swc1 $f21,FP21_OFFSET*4(a1)
+ swc1 $f22,FP22_OFFSET*4(a1)
+ swc1 $f23,FP23_OFFSET*4(a1)
+ swc1 $f24,FP24_OFFSET*4(a1)
+ swc1 $f25,FP25_OFFSET*4(a1)
+ swc1 $f26,FP26_OFFSET*4(a1)
+ swc1 $f27,FP27_OFFSET*4(a1)
+ swc1 $f28,FP28_OFFSET*4(a1)
+ swc1 $f29,FP29_OFFSET*4(a1)
+ swc1 $f30,FP30_OFFSET*4(a1)
+ swc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_save_fp)
+
+/*
+ * _CPU_Context_restore_fp_context
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+/* void _CPU_Context_restore_fp(
+ * void **fp_context_ptr
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_restore_fp,sp,0,ra)
+ .set noat
+ ld a1,(a0)
+ lwc1 $f0,FP0_OFFSET*4(a1)
+ lwc1 $f1,FP1_OFFSET*4(a1)
+ lwc1 $f2,FP2_OFFSET*4(a1)
+ lwc1 $f3,FP3_OFFSET*4(a1)
+ lwc1 $f4,FP4_OFFSET*4(a1)
+ lwc1 $f5,FP5_OFFSET*4(a1)
+ lwc1 $f6,FP6_OFFSET*4(a1)
+ lwc1 $f7,FP7_OFFSET*4(a1)
+ lwc1 $f8,FP8_OFFSET*4(a1)
+ lwc1 $f9,FP9_OFFSET*4(a1)
+ lwc1 $f10,FP10_OFFSET*4(a1)
+ lwc1 $f11,FP11_OFFSET*4(a1)
+ lwc1 $f12,FP12_OFFSET*4(a1)
+ lwc1 $f13,FP13_OFFSET*4(a1)
+ lwc1 $f14,FP14_OFFSET*4(a1)
+ lwc1 $f15,FP15_OFFSET*4(a1)
+ lwc1 $f16,FP16_OFFSET*4(a1)
+ lwc1 $f17,FP17_OFFSET*4(a1)
+ lwc1 $f18,FP18_OFFSET*4(a1)
+ lwc1 $f19,FP19_OFFSET*4(a1)
+ lwc1 $f20,FP20_OFFSET*4(a1)
+ lwc1 $f21,FP21_OFFSET*4(a1)
+ lwc1 $f22,FP22_OFFSET*4(a1)
+ lwc1 $f23,FP23_OFFSET*4(a1)
+ lwc1 $f24,FP24_OFFSET*4(a1)
+ lwc1 $f25,FP25_OFFSET*4(a1)
+ lwc1 $f26,FP26_OFFSET*4(a1)
+ lwc1 $f27,FP27_OFFSET*4(a1)
+ lwc1 $f28,FP28_OFFSET*4(a1)
+ lwc1 $f29,FP29_OFFSET*4(a1)
+ lwc1 $f30,FP30_OFFSET*4(a1)
+ lwc1 $f31,FP31_OFFSET*4(a1)
+ j ra
+ nop
+ .set at
+ENDFRAME(_CPU_Context_restore_fp)
+
+/* _CPU_Context_switch
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+/* void _CPU_Context_switch(
+ * Context_Control *run,
+ * Context_Control *heir
+ * )
+ * {
+ * }
+ */
+
+FRAME(_CPU_Context_switch,sp,0,ra)
+
+ mfc0 t0,C0_SR
+ li t1,~SR_IE
+ sd t0,C0_SR_OFFSET*8(a0) /* save status register */
+ and t0,t1
+ mtc0 t0,C0_SR /* first disable ie bit (recommended) */
+ ori t0,SR_EXL|SR_IE /* enable exception level to disable interrupts */
+ mtc0 t0,C0_SR
+
+ sd ra,RA_OFFSET*8(a0) /* save current context */
+ sd sp,SP_OFFSET*8(a0)
+ sd fp,FP_OFFSET*8(a0)
+ sd s0,S0_OFFSET*8(a0)
+ sd s1,S1_OFFSET*8(a0)
+ sd s2,S2_OFFSET*8(a0)
+ sd s3,S3_OFFSET*8(a0)
+ sd s4,S4_OFFSET*8(a0)
+ sd s5,S5_OFFSET*8(a0)
+ sd s6,S6_OFFSET*8(a0)
+ sd s7,S7_OFFSET*8(a0)
+ dmfc0 t0,C0_EPC
+ sd t0,C0_EPC_OFFSET*8(a0)
+
+_CPU_Context_switch_restore:
+ ld s0,S0_OFFSET*8(a1) /* restore context */
+ ld s1,S1_OFFSET*8(a1)
+ ld s2,S2_OFFSET*8(a1)
+ ld s3,S3_OFFSET*8(a1)
+ ld s4,S4_OFFSET*8(a1)
+ ld s5,S5_OFFSET*8(a1)
+ ld s6,S6_OFFSET*8(a1)
+ ld s7,S7_OFFSET*8(a1)
+ ld fp,FP_OFFSET*8(a1)
+ ld sp,SP_OFFSET*8(a1)
+ ld ra,RA_OFFSET*8(a1)
+ ld t0,C0_EPC_OFFSET*8(a1)
+ dmtc0 t0,C0_EPC
+ ld t0,C0_SR_OFFSET*8(a1)
+ andi t0,SR_EXL
+ bnez t0,_CPU_Context_1 /* set exception level from restore context */
+ li t0,~SR_EXL
+ mfc0 t1,C0_SR
+ nop
+ and t1,t0
+ mtc0 t1,C0_SR
+_CPU_Context_1:
+ j ra
+ nop
+ENDFRAME(_CPU_Context_switch)
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generally used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+#if 0
+void _CPU_Context_restore(
+ Context_Control *new_context
+)
+{
+}
+#endif
+
+FRAME(_CPU_Context_restore,sp,0,ra)
+ dadd a1,a0,zero
+ j _CPU_Context_switch_restore
+ nop
+ENDFRAME(_CPU_Context_restore)
+
+EXTERN(_ISR_Nest_level, SZ_INT)
+EXTERN(_Thread_Dispatch_disable_level,SZ_INT)
+EXTERN(_Context_Switch_necessary,SZ_INT)
+EXTERN(_ISR_Signals_to_thread_executing,SZ_INT)
+.extern _Thread_Dispatch
+.extern _ISR_Vector_table
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ */
+
+#if 0
+void _ISR_Handler()
+{
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ */
+#endif
+FRAME(_ISR_Handler,sp,0,ra)
+.set noreorder
+#if USE_IDTKIT
+/* IDT/Kit incorrectly adds 4 to EPC before returning. This compensates */
+ lreg k0, R_EPC*R_SZ(sp)
+ daddiu k0,k0,-4
+ sreg k0, R_EPC*R_SZ(sp)
+ lreg k0, R_CAUSE*R_SZ(sp)
+ li k1, ~CAUSE_BD
+ and k0, k1
+ sreg k0, R_CAUSE*R_SZ(sp)
+#endif
+
+/* save registers not already saved by IDT/sim */
+ stackadd sp,sp,-EXCP_STACK_SIZE /* store ra on the stack */
+
+ sreg ra, R_RA*R_SZ(sp)
+ sreg v0, R_V0*R_SZ(sp)
+ sreg v1, R_V1*R_SZ(sp)
+ sreg a0, R_A0*R_SZ(sp)
+ sreg a1, R_A1*R_SZ(sp)
+ sreg a2, R_A2*R_SZ(sp)
+ sreg a3, R_A3*R_SZ(sp)
+ sreg t0, R_T0*R_SZ(sp)
+ sreg t1, R_T1*R_SZ(sp)
+ sreg t2, R_T2*R_SZ(sp)
+ sreg t3, R_T3*R_SZ(sp)
+ sreg t4, R_T4*R_SZ(sp)
+ sreg t5, R_T5*R_SZ(sp)
+ sreg t6, R_T6*R_SZ(sp)
+ sreg t7, R_T7*R_SZ(sp)
+ mflo k0
+ sreg t8, R_T8*R_SZ(sp)
+ sreg k0, R_MDLO*R_SZ(sp)
+ sreg t9, R_T9*R_SZ(sp)
+ mfhi k0
+ sreg gp, R_GP*R_SZ(sp)
+ sreg fp, R_FP*R_SZ(sp)
+ sreg k0, R_MDHI*R_SZ(sp)
+ .set noat
+ sreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,-40 /* store ra on the stack */
+ sd ra,32(sp)
+
+/* determine if an interrupt generated this exception */
+ mfc0 k0,C0_CAUSE
+ and k1,k0,CAUSE_EXCMASK
+ bnez k1,_ISR_Handler_prom_exit /* not an external interrupt, pass exception to Monitor */
+ mfc0 k1,C0_SR
+ and k0,k1
+ and k0,CAUSE_IPMASK
+ beq k0,zero,_ISR_Handler_quick_exit /* external interrupt not enabled, ignore */
+ nop
+
+ /*
+ * save some or all context on stack
+ * may need to save some special interrupt information for exit
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ */
+#if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ lint t0,_ISR_Nest_level
+ beq t0, zero, _ISR_Handler_1
+ nop
+ /* switch stacks */
+_ISR_Handler_1:
+#else
+ lint t0,_ISR_Nest_level
+#endif
+ /*
+ * _ISR_Nest_level++;
+ */
+ addi t0,t0,1
+ sint t0,_ISR_Nest_level
+ /*
+ * _Thread_Dispatch_disable_level++;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,1
+ sint t1,_Thread_Dispatch_disable_level
+#if 0
+ nop
+ j _ISR_Handler_4
+ nop
+ /*
+ * while ( interrupts_pending(cause_reg) ) {
+ * vector = BITFIELD_TO_INDEX(cause_reg);
+ * (*_ISR_Vector_table[ vector ])( vector );
+ * }
+ */
+_ISR_Handler_2:
+/* software interrupt priorities can be applied here */
+ li t1,-1
+/* convert bit field into interrupt index */
+_ISR_Handler_3:
+ andi t2,t0,1
+ addi t1,1
+ beql t2,zero,_ISR_Handler_3
+ dsrl t0,1
+ li t1,7
+ dsll t1,3 /* convert index to byte offset (*8) */
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+ j _ISR_Handler_5
+ nop
+_ISR_Handler_4:
+ mfc0 t0,C0_CAUSE
+ andi t0,CAUSE_IPMASK
+ bne t0,zero,_ISR_Handler_2
+ dsrl t0,t0,8
+_ISR_Handler_5:
+#else
+ nop
+ li t1,7
+ dsll t1,t1,SZ_INT_POW2
+ la t3,_ISR_Vector_table
+ intadd t1,t3
+ lint t1,(t1)
+ jalr t1
+ nop
+#endif
+ /*
+ * --_ISR_Nest_level;
+ */
+ lint t2,_ISR_Nest_level
+ addi t2,t2,-1
+ sint t2,_ISR_Nest_level
+ /*
+ * --_Thread_Dispatch_disable_level;
+ */
+ lint t1,_Thread_Dispatch_disable_level
+ addi t1,t1,-1
+ sint t1,_Thread_Dispatch_disable_level
+ /*
+ * if ( _Thread_Dispatch_disable_level || _ISR_Nest_level )
+ * goto the label "exit interrupt (simple case)"
+ */
+ or t0,t2,t1
+ bne t0,zero,_ISR_Handler_exit
+ nop
+ /*
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * restore stack
+ * #endif
+ *
+ * if ( !_Context_Switch_necessary && !_ISR_Signals_to_thread_executing )
+ * goto the label "exit interrupt (simple case)"
+ */
+ lint t0,_Context_Switch_necessary
+ lint t1,_ISR_Signals_to_thread_executing
+ or t0,t0,t1
+ beq t0,zero,_ISR_Handler_exit
+ nop
+
+ /*
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ */
+ jal _Thread_Dispatch
+ nop
+ /*
+ * prepare to get out of interrupt
+ * return from interrupt (maybe to _ISR_Dispatch)
+ *
+ * LABEL "exit interrupt (simple case):
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+_ISR_Handler_exit:
+ ld ra,32(sp)
+ stackadd sp,sp,40
+
+/* restore interrupt context from stack */
+ lreg k0, R_MDLO*R_SZ(sp)
+ mtlo k0
+ lreg k0, R_MDHI*R_SZ(sp)
+ lreg a2, R_A2*R_SZ(sp)
+ mthi k0
+ lreg a3, R_A3*R_SZ(sp)
+ lreg t0, R_T0*R_SZ(sp)
+ lreg t1, R_T1*R_SZ(sp)
+ lreg t2, R_T2*R_SZ(sp)
+ lreg t3, R_T3*R_SZ(sp)
+ lreg t4, R_T4*R_SZ(sp)
+ lreg t5, R_T5*R_SZ(sp)
+ lreg t6, R_T6*R_SZ(sp)
+ lreg t7, R_T7*R_SZ(sp)
+ lreg t8, R_T8*R_SZ(sp)
+ lreg t9, R_T9*R_SZ(sp)
+ lreg gp, R_GP*R_SZ(sp)
+ lreg fp, R_FP*R_SZ(sp)
+ lreg ra, R_RA*R_SZ(sp)
+ lreg a0, R_A0*R_SZ(sp)
+ lreg a1, R_A1*R_SZ(sp)
+ lreg v1, R_V1*R_SZ(sp)
+ lreg v0, R_V0*R_SZ(sp)
+ .set noat
+ lreg AT, R_AT*R_SZ(sp)
+ .set at
+
+ stackadd sp,sp,EXCP_STACK_SIZE /* store ra on the stack */
+
+#if USE_IDTKIT
+/* we handled exception, so return non-zero value */
+ li v0,1
+#endif
+
+_ISR_Handler_quick_exit:
+#ifdef USE_IDTKIT
+ j ra
+#else
+ eret
+#endif
+ nop
+
+_ISR_Handler_prom_exit:
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ .set reorder
+
+ENDFRAME(_ISR_Handler)
+
+
+FRAME(mips_enable_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ or t0,t0,a0
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_interrupts)
+
+FRAME(mips_disable_interrupts,sp,0,ra)
+ mfc0 v0,C0_SR /* get status reg */
+ li t1,SR_IMASK /* t1 = load interrupt mask word */
+ not t0,t1 /* t0 = ~t1 */
+ and t0,v0 /* clear imask bits */
+ mtc0 t0,C0_SR /* save status reg */
+ and v0,t1 /* mask return value (only return imask bits) */
+ jr ra
+ nop
+ENDFRAME(mips_disable_interrupts)
+
+FRAME(mips_enable_global_interrupts,sp,0,ra)
+ mfc0 t0,C0_SR /* get status reg */
+ nop
+ ori t0,SR_IE
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_enable_global_interrupts)
+
+FRAME(mips_disable_global_interrupts,sp,0,ra)
+ li t1,SR_IE
+ mfc0 t0,C0_SR /* get status reg */
+ not t1
+ and t0,t1
+ mtc0 t0,C0_SR /* save updated status reg */
+ j ra
+ nop
+ENDFRAME(mips_disable_global_interrupts)
+
+/* return the value of the status register in v0. Used for debugging */
+FRAME(mips_get_sr,sp,0,ra)
+ mfc0 v0,C0_SR
+ j ra
+ nop
+ENDFRAME(mips_get_sr)
+
+FRAME(mips_break,sp,0,ra)
+#if 1
+ break 0x0
+ j mips_break
+#else
+ j ra
+#endif
+ nop
+ENDFRAME(mips_break)
+
+/*PAGE
+ *
+ * _CPU_Internal_threads_Idle_thread_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+FRAME(_CPU_Thread_Idle_body,sp,0,ra)
+ wait /* enter low power mode */
+ j _CPU_Thread_Idle_body
+ nop
+ENDFRAME(_CPU_Thread_Idle_body)
+
+#define VEC_CODE_LENGTH 10*4
+
+/**************************************************************************
+**
+** init_exc_vecs() - moves the exception code into the addresses
+** reserved for exception vectors
+**
+** UTLB Miss exception vector at address 0x80000000
+**
+** General exception vector at address 0x80000080
+**
+** RESET exception vector is at address 0xbfc00000
+**
+***************************************************************************/
+
+#define INITEXCFRM ((2*4)+4) /* ra + 2 arguments */
+FRAME(init_exc_vecs,sp,0,ra)
+/* This code yanked from SIM */
+#if defined(CPU_R3000)
+ .set noreorder
+ la t1,exc_utlb_code
+ la t2,exc_norm_code
+ li t3,UT_VEC
+ li t4,E_VEC
+ li t5,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ lw t7,0(t2)
+ sw t6,0(t3)
+ sw t7,0(t4)
+ addiu t1,4
+ addiu t3,4
+ addiu t4,4
+ subu t5,4
+ bne t5,zero,1b
+ addiu t2,4
+ move t5,ra # assumes clear_cache doesnt use t5
+ li a0,UT_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ nop
+ li a0,E_VEC
+ jal clear_cache
+ li a1,VEC_CODE_LENGTH
+ move ra,t5 # restore ra
+ j ra
+ nop
+ .set reorder
+#endif
+#if defined(CPU_R4000)
+ .set reorder
+ move t5,ra # assumes clear_cache doesnt use t5
+
+ /* TLB exception vector */
+ la t1,exc_tlb_code
+ li t2,T_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,T_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ la t1,exc_xtlb_code
+ li t2,X_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ /* extended TLB exception vector */
+ li a0,X_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* cache error exception vector */
+ la t1,exc_cache_code
+ li t2,C_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,C_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ /* normal exception vector */
+ la t1,exc_norm_code
+ li t2,E_VEC |K1BASE
+ li t3,VEC_CODE_LENGTH
+1:
+ lw t6,0(t1)
+ addiu t1,4
+ subu t3,4
+ sw t6,0(t2)
+ addiu t2,4
+ bne t3,zero,1b
+
+ li a0,E_VEC
+ li a1,VEC_CODE_LENGTH
+ jal clear_cache
+
+ move ra,t5 # restore ra
+ j ra
+#endif
+ENDFRAME(init_exc_vecs)
+
+
+#if defined(CPU_R4000)
+FRAME(exc_tlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_tlb_code)
+
+
+FRAME(exc_xtlb_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_xtlb_code)
+
+
+FRAME(exc_cache_code,sp,0,ra)
+#ifdef CPU_R3000
+ la k0, (R_VEC+((48)*8))
+#endif
+
+#ifdef CPU_R4000
+ la k0, (R_VEC+((112)*8)) /* R4000 Sim's location is different */
+#endif
+ j k0
+ nop
+
+ENDFRAME(exc_cache_code)
+
+
+FRAME(exc_norm_code,sp,0,ra)
+ la k0, _ISR_Handler /* generic external int hndlr */
+ j k0
+ nop
+ subu sp, EXCP_STACK_SIZE /* set up local stack frame */
+ENDFRAME(exc_norm_code)
+#endif
+
+/**************************************************************************
+**
+** enable_int(mask) - enables interrupts - mask is positioned so it only
+** needs to be or'ed into the status reg. This
+** also does some other things !!!! caution should
+** be used if invoking this while in the middle
+** of a debugging session where the client may have
+** nested interrupts.
+**
+****************************************************************************/
+FRAME(enable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ or a0,1
+ or t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ .set reorder
+ENDFRAME(enable_int)
+
+
+/***************************************************************************
+**
+** disable_int(mask) - disable the interrupt - mask is the complement
+** of the bits to be cleared - i.e. to clear ext int
+** 5 the mask would be - 0xffff7fff
+**
+****************************************************************************/
+FRAME(disable_int,sp,0,ra)
+ .set noreorder
+ mfc0 t0,C0_SR
+ nop
+ and t0,a0
+ mtc0 t0,C0_SR
+ j ra
+ nop
+ENDFRAME(disable_int)
+
+
diff --git a/cpukit/score/cpu/mips64orion/cpu_asm.h b/cpukit/score/cpu/mips64orion/cpu_asm.h
new file mode 100644
index 0000000000..f443c55b00
--- /dev/null
+++ b/cpukit/score/cpu/mips64orion/cpu_asm.h
@@ -0,0 +1,115 @@
+/*
+ * cpu_asm.h
+ *
+ * Author: Craig Lebakken <craigl@transition.com>
+ *
+ * COPYRIGHT (c) 1996 by Transition Networks Inc.
+ *
+ * To anyone who acknowledges that this file is provided "AS IS"
+ * without any express or implied warranty:
+ * permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies, and that the name of Transition Networks not be used in
+ * advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.
+ * Transition Networks makes no representations about the suitability
+ * of this software for any purpose.
+ *
+ * Derived from c/src/exec/score/cpu/no_cpu/cpu_asm.h:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+/* @(#)cpu_asm.h 08/20/96 1.2 */
+
+#ifndef __CPU_ASM_h
+#define __CPU_ASM_h
+
+/* pull in the generated offsets */
+
+/* #include <rtems/score/offsets.h> */
+
+/*
+ * Hardware General Registers
+ */
+
+/* put something here */
+
+/*
+ * Hardware Floating Point Registers
+ */
+
+#define R_FP0 0
+#define R_FP1 1
+#define R_FP2 2
+#define R_FP3 3
+#define R_FP4 4
+#define R_FP5 5
+#define R_FP6 6
+#define R_FP7 7
+#define R_FP8 8
+#define R_FP9 9
+#define R_FP10 10
+#define R_FP11 11
+#define R_FP12 12
+#define R_FP13 13
+#define R_FP14 14
+#define R_FP15 15
+#define R_FP16 16
+#define R_FP17 17
+#define R_FP18 18
+#define R_FP19 19
+#define R_FP20 20
+#define R_FP21 21
+#define R_FP22 22
+#define R_FP23 23
+#define R_FP24 24
+#define R_FP25 25
+#define R_FP26 26
+#define R_FP27 27
+#define R_FP28 28
+#define R_FP29 29
+#define R_FP30 30
+#define R_FP31 31
+
+/*
+ * Hardware Control Registers
+ */
+
+/* put something here */
+
+/*
+ * Calling Convention
+ */
+
+/* put something here */
+
+/*
+ * Temporary registers
+ */
+
+/* put something here */
+
+/*
+ * Floating Point Registers - SW Conventions
+ */
+
+/* put something here */
+
+/*
+ * Temporary floating point registers
+ */
+
+/* put something here */
+
+#endif
+
+/* end of file */
diff --git a/cpukit/score/cpu/mips64orion/idtcpu.h b/cpukit/score/cpu/mips64orion/idtcpu.h
new file mode 100644
index 0000000000..f921e85ef6
--- /dev/null
+++ b/cpukit/score/cpu/mips64orion/idtcpu.h
@@ -0,0 +1,440 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtcpu.h -- cpu related defines
+*/
+
+#ifndef _IDTCPU_H__
+#define _IDTCPU_H__
+
+/*
+ * 950313: Ketan added Register definition for XContext reg.
+ * added define for WAIT instruction.
+ * 950421: Ketan added Register definition for Config reg (R3081)
+ */
+
+/*
+** memory configuration and mapping
+*/
+#define K0BASE 0x80000000
+#define K0SIZE 0x20000000
+#define K1BASE 0xa0000000
+#define K1SIZE 0x20000000
+#define K2BASE 0xc0000000
+#define K2SIZE 0x20000000
+#if defined(CPU_R4000)
+#define KSBASE 0xe0000000
+#define KSSIZE 0x20000000
+#endif
+
+#define KUBASE 0
+#define KUSIZE 0x80000000
+
+/*
+** Exception Vectors
+*/
+#if defined(CPU_R3000)
+#define UT_VEC K0BASE /* utlbmiss vector */
+#define E_VEC (K0BASE+0x80) /* exception vevtor */
+#endif
+#if defined(CPU_R4000)
+#define T_VEC (K0BASE+0x000) /* tlbmiss vector */
+#define X_VEC (K0BASE+0x080) /* xtlbmiss vector */
+#define C_VEC (K0BASE+0x100) /* cache error vector */
+#define E_VEC (K0BASE+0x180) /* exception vector */
+#endif
+#define R_VEC (K1BASE+0x1fc00000) /* reset vector */
+
+/*
+** Address conversion macros
+*/
+#ifdef CLANGUAGE
+#define CAST(as) (as)
+#else
+#define CAST(as)
+#endif
+#define K0_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* kseg0 to kseg1 */
+#define K1_TO_K0(x) (CAST(unsigned)(x)&0x9FFFFFFF) /* kseg1 to kseg0 */
+#define K0_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg0 to physical */
+#define K1_TO_PHYS(x) (CAST(unsigned)(x)&0x1FFFFFFF) /* kseg1 to physical */
+#define PHYS_TO_K0(x) (CAST(unsigned)(x)|0x80000000) /* physical to kseg0 */
+#define PHYS_TO_K1(x) (CAST(unsigned)(x)|0xA0000000) /* physical to kseg1 */
+
+/*
+** Cache size constants
+*/
+#define MINCACHE 0x200 /* 512 For 3041. */
+#define MAXCACHE 0x40000 /* 256*1024 256k */
+
+#if defined(CPU_R4000)
+/* R4000 configuration register definitions */
+#define CFG_CM 0x80000000 /* Master-Checker mode */
+#define CFG_ECMASK 0x70000000 /* System Clock Ratio */
+#define CFG_ECBY2 0x00000000 /* divide by 2 */
+#define CFG_ECBY3 0x10000000 /* divide by 3 */
+#define CFG_ECBY4 0x20000000 /* divide by 4 */
+#define CFG_EPMASK 0x0f000000 /* Transmit data pattern */
+#define CFG_EPD 0x00000000 /* D */
+#define CFG_EPDDX 0x01000000 /* DDX */
+#define CFG_EPDDXX 0x02000000 /* DDXX */
+#define CFG_EPDXDX 0x03000000 /* DXDX */
+#define CFG_EPDDXXX 0x04000000 /* DDXXX */
+#define CFG_EPDDXXXX 0x05000000 /* DDXXXX */
+#define CFG_EPDXXDXX 0x06000000 /* DXXDXX */
+#define CFG_EPDDXXXXX 0x07000000 /* DDXXXXX */
+#define CFG_EPDXXXDXXX 0x08000000 /* DXXXDXXX */
+#define CFG_SBMASK 0x00c00000 /* Secondary cache block size */
+#define CFG_SBSHIFT 22
+#define CFG_SB4 0x00000000 /* 4 words */
+#define CFG_SB8 0x00400000 /* 8 words */
+#define CFG_SB16 0x00800000 /* 16 words */
+#define CFG_SB32 0x00c00000 /* 32 words */
+#define CFG_SS 0x00200000 /* Split secondary cache */
+#define CFG_SW 0x00100000 /* Secondary cache port width */
+#define CFG_EWMASK 0x000c0000 /* System port width */
+#define CFG_EWSHIFT 18
+#define CFG_EW64 0x00000000 /* 64 bit */
+#define CFG_EW32 0x00010000 /* 32 bit */
+#define CFG_SC 0x00020000 /* Secondary cache absent */
+#define CFG_SM 0x00010000 /* Dirty Shared mode disabled */
+#define CFG_BE 0x00008000 /* Big Endian */
+#define CFG_EM 0x00004000 /* ECC mode enable */
+#define CFG_EB 0x00002000 /* Block ordering */
+#define CFG_ICMASK 0x00000e00 /* Instruction cache size */
+#define CFG_ICSHIFT 9
+#define CFG_DCMASK 0x000001c0 /* Data cache size */
+#define CFG_DCSHIFT 6
+#define CFG_IB 0x00000020 /* Instruction cache block size */
+#define CFG_DB 0x00000010 /* Data cache block size */
+#define CFG_CU 0x00000008 /* Update on Store Conditional */
+#define CFG_K0MASK 0x00000007 /* KSEG0 coherency algorithm */
+
+/*
+ * R4000 primary cache mode
+ */
+#define CFG_C_UNCACHED 2
+#define CFG_C_NONCOHERENT 3
+#define CFG_C_COHERENTXCL 4
+#define CFG_C_COHERENTXCLW 5
+#define CFG_C_COHERENTUPD 6
+
+/*
+ * R4000 cache operations (should be in assembler...?)
+ */
+#define Index_Invalidate_I 0x0 /* 0 0 */
+#define Index_Writeback_Inv_D 0x1 /* 0 1 */
+#define Index_Invalidate_SI 0x2 /* 0 2 */
+#define Index_Writeback_Inv_SD 0x3 /* 0 3 */
+#define Index_Load_Tag_I 0x4 /* 1 0 */
+#define Index_Load_Tag_D 0x5 /* 1 1 */
+#define Index_Load_Tag_SI 0x6 /* 1 2 */
+#define Index_Load_Tag_SD 0x7 /* 1 3 */
+#define Index_Store_Tag_I 0x8 /* 2 0 */
+#define Index_Store_Tag_D 0x9 /* 2 1 */
+#define Index_Store_Tag_SI 0xA /* 2 2 */
+#define Index_Store_Tag_SD 0xB /* 2 3 */
+#define Create_Dirty_Exc_D 0xD /* 3 1 */
+#define Create_Dirty_Exc_SD 0xF /* 3 3 */
+#define Hit_Invalidate_I 0x10 /* 4 0 */
+#define Hit_Invalidate_D 0x11 /* 4 1 */
+#define Hit_Invalidate_SI 0x12 /* 4 2 */
+#define Hit_Invalidate_SD 0x13 /* 4 3 */
+#define Hit_Writeback_Inv_D 0x15 /* 5 1 */
+#define Hit_Writeback_Inv_SD 0x17 /* 5 3 */
+#define Fill_I 0x14 /* 5 0 */
+#define Hit_Writeback_D 0x19 /* 6 1 */
+#define Hit_Writeback_SD 0x1B /* 6 3 */
+#define Hit_Writeback_I 0x18 /* 6 0 */
+#define Hit_Set_Virtual_SI 0x1E /* 7 2 */
+#define Hit_Set_Virtual_SD 0x1F /* 7 3 */
+
+#ifndef WAIT
+#define WAIT .word 0x42000020
+#endif WAIT
+
+#ifndef wait
+#define wait .word 0x42000020
+#endif wait
+
+#endif
+
+/*
+** TLB resource defines
+*/
+#if defined(CPU_R3000)
+#define N_TLB_ENTRIES 64
+#define TLB_PGSIZE 0x1000
+#define RANDBASE 8
+#define TLBLO_PFNMASK 0xfffff000
+#define TLBLO_PFNSHIFT 12
+#define TLBLO_N 0x800 /* non-cacheable */
+#define TLBLO_D 0x400 /* writeable */
+#define TLBLO_V 0x200 /* valid bit */
+#define TLBLO_G 0x100 /* global access bit */
+
+#define TLBHI_VPNMASK 0xfffff000
+#define TLBHI_VPNSHIFT 12
+#define TLBHI_PIDMASK 0xfc0
+#define TLBHI_PIDSHIFT 6
+#define TLBHI_NPID 64
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x00003f00
+#define TLBINX_INXSHIFT 8
+
+#define TLBRAND_RANDMASK 0x00003f00
+#define TLBRAND_RANDSHIFT 8
+
+#define TLBCTXT_BASEMASK 0xffe00000
+#define TLBCTXT_BASESHIFT 21
+
+#define TLBCTXT_VPNMASK 0x001ffffc
+#define TLBCTXT_VPNSHIFT 2
+#endif
+#if defined(CPU_R4000)
+#define N_TLB_ENTRIES 48
+
+#define TLBHI_VPN2MASK 0xffffe000
+#define TLBHI_PIDMASK 0x000000ff
+#define TLBHI_NPID 256
+
+#define TLBLO_PFNMASK 0x3fffffc0
+#define TLBLO_PFNSHIFT 6
+#define TLBLO_D 0x00000004 /* writeable */
+#define TLBLO_V 0x00000002 /* valid bit */
+#define TLBLO_G 0x00000001 /* global access bit */
+#define TLBLO_CMASK 0x00000038 /* cache algorithm mask */
+#define TLBLO_CSHIFT 3
+
+#define TLBLO_UNCACHED (CFG_C_UNCACHED<<TLBLO_CSHIFT)
+#define TLBLO_NONCOHERENT (CFG_C_NONCOHERENT<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCL (CFG_C_COHERENTXCL<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTXCLW (CFG_C_COHERENTXCLW<<TLBLO_CSHIFT)
+#define TLBLO_COHERENTUPD (CFG_C_COHERENTUPD<<TLBLO_CSHIFT)
+
+#define TLBINX_PROBE 0x80000000
+#define TLBINX_INXMASK 0x0000003f
+
+#define TLBRAND_RANDMASK 0x0000003f
+
+#define TLBCTXT_BASEMASK 0xff800000
+#define TLBCTXT_BASESHIFT 23
+
+#define TLBCTXT_VPN2MASK 0x007ffff0
+#define TLBCTXT_VPN2SHIFT 4
+
+#define TLBPGMASK_MASK 0x01ffe000
+#endif
+
+#if defined(CPU_R3000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_BEV 0x00400000 /* use boot exception vectors */
+
+/* Cache control bits */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_PE 0x00100000 /* cache parity error */
+#define SR_CM 0x00080000 /* cache miss */
+#define SR_PZ 0x00040000 /* cache parity zero */
+#define SR_SWC 0x00020000 /* swap cache */
+#define SR_ISC 0x00010000 /* Isolate data cache */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KUO 0x00000020 /* old kernel/user, 0 => k, 1 => u */
+#define SR_IEO 0x00000010 /* old interrupt enable, 1 => enable */
+#define SR_KUP 0x00000008 /* prev kernel/user, 0 => k, 1 => u */
+#define SR_IEP 0x00000004 /* prev interrupt enable, 1 => enable */
+#define SR_KUC 0x00000002 /* cur kernel/user, 0 => k, 1 => u */
+#define SR_IEC 0x00000001 /* cur interrupt enable, 1 => enable */
+#endif
+
+#if defined(CPU_R4000)
+#define SR_CUMASK 0xf0000000 /* coproc usable bits */
+#define SR_CU3 0x80000000 /* Coprocessor 3 usable */
+#define SR_CU2 0x40000000 /* Coprocessor 2 usable */
+#define SR_CU1 0x20000000 /* Coprocessor 1 usable */
+#define SR_CU0 0x10000000 /* Coprocessor 0 usable */
+
+#define SR_RP 0x08000000 /* Reduced power operation */
+#define SR_FR 0x04000000 /* Additional floating point registers */
+#define SR_RE 0x02000000 /* Reverse endian in user mode */
+
+#define SR_BEV 0x00400000 /* Use boot exception vectors */
+#define SR_TS 0x00200000 /* TLB shutdown */
+#define SR_SR 0x00100000 /* Soft reset */
+#define SR_CH 0x00040000 /* Cache hit */
+#define SR_CE 0x00020000 /* Use cache ECC */
+#define SR_DE 0x00010000 /* Disable cache exceptions */
+
+/*
+** status register interrupt masks and bits
+*/
+
+#define SR_IMASK 0x0000ff00 /* Interrupt mask */
+#define SR_IMASK8 0x00000000 /* mask level 8 */
+#define SR_IMASK7 0x00008000 /* mask level 7 */
+#define SR_IMASK6 0x0000c000 /* mask level 6 */
+#define SR_IMASK5 0x0000e000 /* mask level 5 */
+#define SR_IMASK4 0x0000f000 /* mask level 4 */
+#define SR_IMASK3 0x0000f800 /* mask level 3 */
+#define SR_IMASK2 0x0000fc00 /* mask level 2 */
+#define SR_IMASK1 0x0000fe00 /* mask level 1 */
+#define SR_IMASK0 0x0000ff00 /* mask level 0 */
+
+#define SR_IMASKSHIFT 8
+
+#define SR_IBIT8 0x00008000 /* bit level 8 */
+#define SR_IBIT7 0x00004000 /* bit level 7 */
+#define SR_IBIT6 0x00002000 /* bit level 6 */
+#define SR_IBIT5 0x00001000 /* bit level 5 */
+#define SR_IBIT4 0x00000800 /* bit level 4 */
+#define SR_IBIT3 0x00000400 /* bit level 3 */
+#define SR_IBIT2 0x00000200 /* bit level 2 */
+#define SR_IBIT1 0x00000100 /* bit level 1 */
+
+#define SR_KSMASK 0x00000018 /* Kernel mode mask */
+#define SR_KSUSER 0x00000010 /* User mode */
+#define SR_KSSUPER 0x00000008 /* Supervisor mode */
+#define SR_KSKERNEL 0x00000000 /* Kernel mode */
+#define SR_ERL 0x00000004 /* Error level */
+#define SR_EXL 0x00000002 /* Exception level */
+#define SR_IE 0x00000001 /* Interrupts enabled */
+#endif
+
+
+
+/*
+ * Cause Register
+ */
+#define CAUSE_BD 0x80000000 /* Branch delay slot */
+#define CAUSE_CEMASK 0x30000000 /* coprocessor error */
+#define CAUSE_CESHIFT 28
+
+
+#define CAUSE_IPMASK 0x0000FF00 /* Pending interrupt mask */
+#define CAUSE_IPSHIFT 8
+
+#define CAUSE_EXCMASK 0x0000003C /* Cause code bits */
+#define CAUSE_EXCSHIFT 2
+
+#ifndef XDS
+/*
+** Coprocessor 0 registers
+*/
+#define C0_INX $0 /* tlb index */
+#define C0_RAND $1 /* tlb random */
+#if defined(CPU_R3000)
+#define C0_TLBLO $2 /* tlb entry low */
+#endif
+#if defined(CPU_R4000)
+#define C0_TLBLO0 $2 /* tlb entry low 0 */
+#define C0_TLBLO1 $3 /* tlb entry low 1 */
+#endif
+
+#define C0_CTXT $4 /* tlb context */
+
+#if defined(CPU_R4000)
+#define C0_PAGEMASK $5 /* tlb page mask */
+#define C0_WIRED $6 /* number of wired tlb entries */
+#endif
+
+#define C0_BADVADDR $8 /* bad virtual address */
+
+#if defined(CPU_R4000)
+#define C0_COUNT $9 /* cycle count */
+#endif
+
+#define C0_TLBHI $10 /* tlb entry hi */
+
+#if defined(CPU_R4000)
+#define C0_COMPARE $11 /* cyccle count comparator */
+#endif
+
+#define C0_SR $12 /* status register */
+#define C0_CAUSE $13 /* exception cause */
+#define C0_EPC $14 /* exception pc */
+#define C0_PRID $15 /* revision identifier */
+
+#if defined(CPU_R3000)
+#define C0_CONFIG $3 /* configuration register R3081*/
+#endif
+
+#if defined(CPU_R4000)
+#define C0_CONFIG $16 /* configuration register */
+#define C0_LLADDR $17 /* linked load address */
+#define C0_WATCHLO $18 /* watchpoint trap register */
+#define C0_WATCHHI $19 /* watchpoint trap register */
+#define C0_XCTXT $20 /* extended tlb context */
+#define C0_ECC $26 /* secondary cache ECC control */
+#define C0_CACHEERR $27 /* cache error status */
+#define C0_TAGLO $28 /* cache tag lo */
+#define C0_TAGHI $29 /* cache tag hi */
+#define C0_ERRPC $30 /* cache error pc */
+#endif
+
+#endif XDS
+
+#ifdef R4650
+#define IWATCH $18
+#define DWATCH $19
+#define IBASE $0
+#define IBOUND $1
+#define DBASE $2
+#define DBOUND $3
+#define CALG $17
+#endif
+
+#endif /* _IDTCPU_H__ */
+
diff --git a/cpukit/score/cpu/mips64orion/idtmon.h b/cpukit/score/cpu/mips64orion/idtmon.h
new file mode 100644
index 0000000000..b42211ed5c
--- /dev/null
+++ b/cpukit/score/cpu/mips64orion/idtmon.h
@@ -0,0 +1,171 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** idtmon.h - General header file for the IDT Prom Monitor
+**
+** Copyright 1989 Integrated Device Technology, Inc.
+** All Rights Reserved.
+**
+** June 1989 - D.Cahoon
+*/
+#ifndef __IDTMON_H__
+#define __IDTMON_H__
+
+/*
+** P_STACKSIZE is the size of the Prom Stack.
+** the prom stack grows downward
+*/
+#define P_STACKSIZE 0x2000 /* sets stack size to 8k */
+
+/*
+** M_BUSWIDTH
+** Memory bus width (including bank interleaving) in bytes
+** used when doing memory sizing to prevent bus capacitance
+** reporting ghost memory locations
+*/
+#if defined(CPU_R3000)
+#define M_BUSWIDTH 8 /* 32bit memory bank interleaved */
+#endif
+#if defined(CPU_R4000)
+#define M_BUSWIDTH 16 /* 64 bit memory bank interleaved */
+#endif
+
+/*
+** this is the default value for the number of bytes to add in calculating
+** the checksums in the checksum command
+*/
+#define CHK_SUM_CNT 0x20000 /* number of bytes to calc chksum for */
+
+/*
+** Monitor modes
+*/
+#define MODE_MONITOR 5 /* IDT Prom Monitor is executing */
+#define MODE_USER 0xa /* USER is executing */
+
+/*
+** memory reference widths
+*/
+#define SW_BYTE 1
+#define SW_HALFWORD 2
+#define SW_WORD 4
+#define SW_TRIBYTEL 12
+#define SW_TRIBYTER 20
+
+#ifdef CPU_R4000
+/*
+** definitions for select_cache call
+*/
+#define DCACHE 0
+#define ICACHE 1
+#define SCACHE 2
+
+#endif
+
+#if defined (CLANGUAGE) || defined(_LANGUAGE_C)
+typedef struct {
+ unsigned int mem_size;
+ unsigned int icache_size;
+ unsigned int dcache_size;
+#ifdef CPU_R4000
+ unsigned int scache_size;
+#endif
+
+ } mem_config;
+
+#endif CLANGUAGE || defined(_LANGUAGE_C)
+
+/*
+** general equates for diagnostics and boolean functions
+*/
+#define PASS 0
+#define FAIL 1
+
+#ifndef TRUE
+#define TRUE 1
+#endif TRUE
+#ifndef NULL
+#define NULL 0
+#endif NULL
+
+#ifndef FALSE
+#define FALSE 0
+#endif FALSE
+
+
+/*
+** portablility equates
+*/
+
+#ifndef BOOL
+#define BOOL unsigned int
+#endif BOOL
+
+#ifndef GLOBAL
+#define GLOBAL /**/
+#endif GLOBAL
+
+#ifndef MLOCAL
+#define MLOCAL static
+#endif MLOCAL
+
+
+#ifdef XDS
+#define CONST const
+#else
+#define CONST
+#endif XDS
+
+#define u_char unsigned char
+#define u_short unsigned short
+#define u_int unsigned int
+/*
+** assembly instructions for compatability between xds and mips
+*/
+#ifndef XDS
+#define sllv sll
+#define srlv srl
+#endif XDS
+/*
+** debugger macros for assembly language routines. Allows the
+** programmer to set up the necessary stack frame info
+** required by debuggers to do stack traces.
+*/
+
+#ifndef XDS
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl name; \
+ .ent name; \
+name:; \
+ .frame frm_reg,offset,ret_reg
+#define ENDFRAME(name) \
+ .end name
+#else
+#define FRAME(name,frm_reg,offset,ret_reg) \
+ .globl _##name;\
+_##name:
+#define ENDFRAME(name)
+#endif XDS
+#endif /* __IDTMON_H__ */
diff --git a/cpukit/score/cpu/mips64orion/iregdef.h b/cpukit/score/cpu/mips64orion/iregdef.h
new file mode 100644
index 0000000000..f0953da852
--- /dev/null
+++ b/cpukit/score/cpu/mips64orion/iregdef.h
@@ -0,0 +1,325 @@
+/*
+
+Based upon IDT provided code with the following release:
+
+This source code has been made available to you by IDT on an AS-IS
+basis. Anyone receiving this source is licensed under IDT copyrights
+to use it in any way he or she deems fit, including copying it,
+modifying it, compiling it, and redistributing it either with or
+without modifications. No license under IDT patents or patent
+applications is to be implied by the copyright license.
+
+Any user of this software should understand that IDT cannot provide
+technical support for this software and will not be responsible for
+any consequences resulting from the use of this software.
+
+Any person who transfers this source code or any derivative work must
+include the IDT copyright notice, this paragraph, and the preceeding
+two paragraphs in the transferred software.
+
+COPYRIGHT IDT CORPORATION 1996
+LICENSED MATERIAL - PROGRAM PROPERTY OF IDT
+
+ $Id$
+*/
+
+/*
+** iregdef.h - IDT R3000 register structure header file
+**
+** Copyright 1989 Integrated Device Technology, Inc
+** All Rights Reserved
+**
+*/
+#ifndef __IREGDEF_H__
+#define __IREGDEF_H__
+
+/*
+ * 950313: Ketan added sreg/lreg and R_SZ for 64-bit saves
+ * added Register definition for XContext reg.
+ * Look towards end of this file.
+ */
+/*
+** register names
+*/
+#define r0 $0
+#define r1 $1
+#define r2 $2
+#define r3 $3
+#define r4 $4
+#define r5 $5
+#define r6 $6
+#define r7 $7
+#define r8 $8
+#define r9 $9
+#define r10 $10
+#define r11 $11
+#define r12 $12
+#define r13 $13
+
+#define r14 $14
+#define r15 $15
+#define r16 $16
+#define r17 $17
+#define r18 $18
+#define r19 $19
+#define r20 $20
+#define r21 $21
+#define r22 $22
+#define r23 $23
+#define r24 $24
+#define r25 $25
+#define r26 $26
+#define r27 $27
+#define r28 $28
+#define r29 $29
+#define r30 $30
+#define r31 $31
+
+#define fp0 $f0
+#define fp1 $f1
+#define fp2 $f2
+#define fp3 $f3
+#define fp4 $f4
+#define fp5 $f5
+#define fp6 $f6
+#define fp7 $f7
+#define fp8 $f8
+#define fp9 $f9
+#define fp10 $f10
+#define fp11 $f11
+#define fp12 $f12
+#define fp13 $f13
+#define fp14 $f14
+#define fp15 $f15
+#define fp16 $f16
+#define fp17 $f17
+#define fp18 $f18
+#define fp19 $f19
+#define fp20 $f20
+#define fp21 $f21
+#define fp22 $f22
+#define fp23 $f23
+#define fp24 $f24
+#define fp25 $f25
+#define fp26 $f26
+#define fp27 $f27
+#define fp28 $f28
+#define fp29 $f29
+#define fp30 $f30
+#define fp31 $f31
+
+#define fcr0 $0
+#define fcr30 $30
+#define fcr31 $31
+
+#define zero $0 /* wired zero */
+#define AT $at /* assembler temp */
+#define v0 $2 /* return value */
+#define v1 $3
+#define a0 $4 /* argument registers a0-a3 */
+#define a1 $5
+#define a2 $6
+#define a3 $7
+#define t0 $8 /* caller saved t0-t9 */
+#define t1 $9
+#define t2 $10
+#define t3 $11
+#define t4 $12
+#define t5 $13
+#define t6 $14
+#define t7 $15
+#define s0 $16 /* callee saved s0-s8 */
+#define s1 $17
+#define s2 $18
+#define s3 $19
+#define s4 $20
+#define s5 $21
+#define s6 $22
+#define s7 $23
+#define t8 $24
+#define t9 $25
+#define k0 $26 /* kernel usage */
+#define k1 $27 /* kernel usage */
+#define gp $28 /* sdata pointer */
+#define sp $29 /* stack pointer */
+#define s8 $30 /* yet another saved reg for the callee */
+#define fp $30 /* frame pointer - this is being phased out by MIPS */
+#define ra $31 /* return address */
+
+
+/*
+** relative position of registers in save reg area
+*/
+#define R_R0 0
+#define R_R1 1
+#define R_R2 2
+#define R_R3 3
+#define R_R4 4
+#define R_R5 5
+#define R_R6 6
+#define R_R7 7
+#define R_R8 8
+#define R_R9 9
+#define R_R10 10
+#define R_R11 11
+#define R_R12 12
+#define R_R13 13
+#define R_R14 14
+#define R_R15 15
+#define R_R16 16
+#define R_R17 17
+#define R_R18 18
+#define R_R19 19
+#define R_R20 20
+#define R_R21 21
+#define R_R22 22
+#define R_R23 23
+#define R_R24 24
+#define R_R25 25
+#define R_R26 26
+#define R_R27 27
+#define R_R28 28
+#define R_R29 29
+#define R_R30 30
+#define R_R31 31
+#define R_F0 32
+#define R_F1 33
+#define R_F2 34
+#define R_F3 35
+#define R_F4 36
+#define R_F5 37
+#define R_F6 38
+#define R_F7 39
+#define R_F8 40
+#define R_F9 41
+#define R_F10 42
+#define R_F11 43
+#define R_F12 44
+#define R_F13 45
+#define R_F14 46
+#define R_F15 47
+#define R_F16 48
+#define R_F17 49
+#define R_F18 50
+#define R_F19 51
+#define R_F20 52
+#define R_F21 53
+#define R_F22 54
+#define R_F23 55
+#define R_F24 56
+#define R_F25 57
+#define R_F26 58
+#define R_F27 59
+#define R_F28 60
+#define R_F29 61
+#define R_F30 62
+#define R_F31 63
+#define NCLIENTREGS 64
+#define R_EPC 64
+#define R_MDHI 65
+#define R_MDLO 66
+#define R_SR 67
+#define R_CAUSE 68
+#define R_TLBHI 69
+#if defined(CPU_R3000)
+#define R_TLBLO 70
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO0 70
+#endif
+#define R_BADVADDR 71
+#define R_INX 72
+#define R_RAND 73
+#define R_CTXT 74
+#define R_EXCTYPE 75
+#define R_MODE 76
+#define R_PRID 77
+#define R_FCSR 78
+#define R_FEIR 79
+#if defined(CPU_R3000)
+#define NREGS 80
+#endif
+#if defined(CPU_R4000)
+#define R_TLBLO1 80
+#define R_PAGEMASK 81
+#define R_WIRED 82
+#define R_COUNT 83
+#define R_COMPARE 84
+#define R_CONFIG 85
+#define R_LLADDR 86
+#define R_WATCHLO 87
+#define R_WATCHHI 88
+#define R_ECC 89
+#define R_CACHEERR 90
+#define R_TAGLO 91
+#define R_TAGHI 92
+#define R_ERRPC 93
+#define R_XCTXT 94 /* Ketan added from SIM64bit */
+
+#define NREGS 95
+#endif
+
+/*
+** For those who like to think in terms of the compiler names for the regs
+*/
+#define R_ZERO R_R0
+#define R_AT R_R1
+#define R_V0 R_R2
+#define R_V1 R_R3
+#define R_A0 R_R4
+#define R_A1 R_R5
+#define R_A2 R_R6
+#define R_A3 R_R7
+#define R_T0 R_R8
+#define R_T1 R_R9
+#define R_T2 R_R10
+#define R_T3 R_R11
+#define R_T4 R_R12
+#define R_T5 R_R13
+#define R_T6 R_R14
+#define R_T7 R_R15
+#define R_S0 R_R16
+#define R_S1 R_R17
+#define R_S2 R_R18
+#define R_S3 R_R19
+#define R_S4 R_R20
+#define R_S5 R_R21
+#define R_S6 R_R22
+#define R_S7 R_R23
+#define R_T8 R_R24
+#define R_T9 R_R25
+#define R_K0 R_R26
+#define R_K1 R_R27
+#define R_GP R_R28
+#define R_SP R_R29
+#define R_FP R_R30
+#define R_RA R_R31
+
+/* Ketan added the following */
+#ifdef CPU_R3000
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#endif CPU_R3000
+
+#ifdef CPU_R4000
+#if __mips < 3
+#define sreg sw
+#define lreg lw
+#define rmfc0 mfc0
+#define rmtc0 mtc0
+#define R_SZ 4
+#else
+#define sreg sd
+#define lreg ld
+#define rmfc0 dmfc0
+#define rmtc0 dmtc0
+#define R_SZ 8
+#endif
+#endif CPU_R4000
+/* Ketan till here */
+
+#endif /* __IREGDEF_H__ */
+
diff --git a/cpukit/score/cpu/no_cpu/asm.h b/cpukit/score/cpu/no_cpu/asm.h
new file mode 100644
index 0000000000..1ca7fd435b
--- /dev/null
+++ b/cpukit/score/cpu/no_cpu/asm.h
@@ -0,0 +1,101 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/no_cpu/cpu.c b/cpukit/score/cpu/no_cpu/cpu.c
new file mode 100644
index 0000000000..b546ba2158
--- /dev/null
+++ b/cpukit/score/cpu/no_cpu/cpu.c
@@ -0,0 +1,162 @@
+/*
+ * XXX CPU Dependent Source
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/wkspace.h>
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* FP context initialization support goes here */
+
+ _CPU_Table = *cpu_table;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ /*
+ * This routine returns the current interrupt level.
+ */
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is where we install the interrupt handler into the "raw" interrupt
+ * table used by the CPU to dispatch interrupt handlers.
+ */
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, new_handler, old_handler );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Thread_Idle_body
+ *
+ * NOTES:
+ *
+ * 1. This is the same as the regular CPU independent algorithm.
+ *
+ * 2. If you implement this using a "halt", "idle", or "shutdown"
+ * instruction, then don't forget to put it in an infinite loop.
+ *
+ * 3. Be warned. Some processors with onboard DMA have been known
+ * to stop the DMA if the CPU were put in IDLE mode. This might
+ * also be a problem with other on-chip peripherals. So use this
+ * hook with caution.
+ */
+
+void _CPU_Thread_Idle_body( void )
+{
+
+ for( ; ; )
+ /* insert your "halt" instruction here */ ;
+}
diff --git a/cpukit/score/cpu/no_cpu/cpu_asm.c b/cpukit/score/cpu/no_cpu/cpu_asm.c
new file mode 100644
index 0000000000..4b788b014c
--- /dev/null
+++ b/cpukit/score/cpu/no_cpu/cpu_asm.c
@@ -0,0 +1,165 @@
+/* cpu_asm.c ===> cpu_asm.S or cpu_asm.s
+ *
+ * This file contains the basic algorithms for all assembly code used
+ * in an specific CPU port of RTEMS. These algorithms must be implemented
+ * in assembly language
+ *
+ * NOTE: This is supposed to be a .S or .s file NOT a C file.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * This is supposed to be an assembly file. This means that system.h
+ * and cpu.h should not be included in a "real" cpu_asm file. An
+ * implementation in assembly should include "cpu_asm.h>
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+/* #include "cpu_asm.h> */
+
+/*
+ * _CPU_Context_save_fp_context
+ *
+ * This routine is responsible for saving the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+void _CPU_Context_save_fp(
+ void **fp_context_ptr
+)
+{
+}
+
+/*
+ * _CPU_Context_restore_fp_context
+ *
+ * This routine is responsible for restoring the FP context
+ * at *fp_context_ptr. If the point to load the FP context
+ * from is changed then the pointer is modified by this routine.
+ *
+ * Sometimes a macro implementation of this is in cpu.h which dereferences
+ * the ** and a similarly named routine in this file is passed something
+ * like a (Context_Control_fp *). The general rule on making this decision
+ * is to avoid writing assembly language.
+ */
+
+void _CPU_Context_restore_fp(
+ void **fp_context_ptr
+)
+{
+}
+
+/* _CPU_Context_switch
+ *
+ * This routine performs a normal non-FP context switch.
+ */
+
+void _CPU_Context_switch(
+ Context_Control *run,
+ Context_Control *heir
+)
+{
+}
+
+/*
+ * _CPU_Context_restore
+ *
+ * This routine is generallu used only to restart self in an
+ * efficient manner. It may simply be a label in _CPU_Context_switch.
+ *
+ * NOTE: May be unnecessary to reload some registers.
+ */
+
+void _CPU_Context_restore(
+ Context_Control *new_context
+)
+{
+}
+
+/* void __ISR_Handler()
+ *
+ * This routine provides the RTEMS interrupt management.
+ *
+ */
+
+void _ISR_Handler()
+{
+ /*
+ * This discussion ignores a lot of the ugly details in a real
+ * implementation such as saving enough registers/state to be
+ * able to do something real. Keep in mind that the goal is
+ * to invoke a user's ISR handler which is written in C and
+ * uses a certain set of registers.
+ *
+ * Also note that the exact order is to a large extent flexible.
+ * Hardware will dictate a sequence for a certain subset of
+ * _ISR_Handler while requirements for setting
+ */
+
+ /*
+ * At entry to "common" _ISR_Handler, the vector number must be
+ * available. On some CPUs the hardware puts either the vector
+ * number or the offset into the vector table for this ISR in a
+ * known place. If the hardware does not give us this information,
+ * then the assembly portion of RTEMS for this port will contain
+ * a set of distinct interrupt entry points which somehow place
+ * the vector number in a known place (which is safe if another
+ * interrupt nests this one) and branches to _ISR_Handler.
+ *
+ * save some or all context on stack
+ * may need to save some special interrupt information for exit
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * if ( _ISR_Nest_level == 0 )
+ * switch to software interrupt stack
+ * #endif
+ *
+ * _ISR_Nest_level++;
+ *
+ * _Thread_Dispatch_disable_level++;
+ *
+ * (*_ISR_Vector_table[ vector ])( vector );
+ *
+ * --_ISR_Nest_level;
+ *
+ * if ( _ISR_Nest_level )
+ * goto the label "exit interrupt (simple case)"
+ *
+ * #if ( CPU_HAS_SOFTWARE_INTERRUPT_STACK == TRUE )
+ * restore stack
+ * #endif
+ *
+ * if ( !_Context_Switch_necessary )
+ * goto the label "exit interrupt (simple case)"
+ *
+ * if ( !_ISR_Signals_to_thread_executing )
+ * _ISR_Signals_to_thread_executing = FALSE;
+ * goto the label "exit interrupt (simple case)"
+ *
+ * call _Thread_Dispatch() or prepare to return to _ISR_Dispatch
+ *
+ * prepare to get out of interrupt
+ * return from interrupt (maybe to _ISR_Dispatch)
+ *
+ * LABEL "exit interrupt (simple case):
+ * prepare to get out of interrupt
+ * return from interrupt
+ */
+}
+
diff --git a/cpukit/score/cpu/no_cpu/rtems/asm.h b/cpukit/score/cpu/no_cpu/rtems/asm.h
new file mode 100644
index 0000000000..1ca7fd435b
--- /dev/null
+++ b/cpukit/score/cpu/no_cpu/rtems/asm.h
@@ -0,0 +1,101 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted. This file is:
+ *
+ * COPYRIGHT (c) 1994-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * $Id$
+ */
+
+#ifndef __NO_CPU_ASM_h
+#define __NO_CPU_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+#include <rtems/score/targopts.h>
+#include <rtems/score/no_cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/sparc/README b/cpukit/score/cpu/sparc/README
new file mode 100644
index 0000000000..c4c2200075
--- /dev/null
+++ b/cpukit/score/cpu/sparc/README
@@ -0,0 +1,110 @@
+#
+# $Id$
+#
+
+This file discusses SPARC specific issues which are important to
+this port. The primary topics in this file are:
+
+ + Global Register Usage
+ + Stack Frame
+ + EF bit in the PSR
+
+
+Global Register Usage
+=====================
+
+This information on register usage is based heavily on a comment in the
+file gcc-2.7.0/config/sparc/sparc.h in the the gcc 2.7.0 source.
+
+ + g0 is hardwired to 0
+ + On non-v9 systems:
+ - g1 is free to use as temporary.
+ - g2-g4 are reserved for applications. Gcc normally uses them as
+ temporaries, but this can be disabled via the -mno-app-regs option.
+ - g5 through g7 are reserved for the operating system.
+ + On v9 systems:
+ - g1 and g5 are free to use as temporaries.
+ - g2-g4 are reserved for applications (the compiler will not normally use
+ them, but they can be used as temporaries with -mapp-regs).
+ - g6-g7 are reserved for the operating system.
+
+ NOTE: As of gcc 2.7.0 register g1 was used in the following scenarios:
+
+ + as a temporary by the 64 bit sethi pattern
+ + when restoring call-preserved registers in large stack frames
+
+RTEMS places no constraints on the usage of the global registers. Although
+gcc assumes that either g5-g7 (non-V9) or g6-g7 (V9) are reserved for the
+operating system, RTEMS does not assume any special use for them.
+
+
+
+Stack Frame
+===========
+
+The stack grows downward (i.e. to lower addresses) on the SPARC architecture.
+
+The following is the organization of the stack frame:
+
+
+
+ | ............... |
+ fp | |
+ +-------------------------------+
+ | |
+ | Local registers, temporaries, |
+ | and saved floats | x bytes
+ | |
+ sp + x +-------------------------------+
+ | |
+ | outgoing parameters past |
+ | the sixth one | x bytes
+ | |
+ sp + 92 +-------------------------------+ *
+ | | *
+ | area for callee to save | *
+ | register arguments | * 24 bytes
+ | | *
+ sp + 68 +-------------------------------+ *
+ | | *
+ | structure return pointer | * 4 bytes
+ | | *
+ sp + 64 +-------------------------------+ *
+ | | *
+ | local register set | * 32 bytes
+ | | *
+ sp + 32 +-------------------------------+ *
+ | | *
+ | input register set | * 32 bytes
+ | | *
+ sp +-------------------------------+ *
+
+
+* = minimal stack frame
+
+x = optional components
+
+EF bit in the PSR
+=================
+
+The EF (enable floating point unit) in the PSR is utilized in this port to
+prevent non-floating point tasks from performing floating point
+operations. This bit is maintained as part of the integer context.
+However, the floating point context is switched BEFORE the integer
+context. Thus the EF bit in place at the time of the FP switch may
+indicate that FP operations are disabled. This occurs on certain task
+switches, when the EF bit will be 0 for the outgoing task and thus a fault
+will be generated on the first FP operation of the FP context save.
+
+The remedy for this is to enable FP access as the first step in both the
+save and restore of the FP context area. This bit will be subsequently
+reloaded by the integer context switch.
+
+Two of the scenarios which demonstrate this problem are outlined below:
+
+1. When the first FP task is switched to. The system tasks are not FP and
+thus would be unable to restore the FP context of the incoming task.
+
+2. On a deferred FP context switch. In this case, the system might switch
+from FP Task A to non-FP Task B and then to FP Task C. In this scenario,
+the floating point state must technically be saved by a non-FP task.
diff --git a/cpukit/score/cpu/sparc/asm.h b/cpukit/score/cpu/sparc/asm.h
new file mode 100644
index 0000000000..b9a3aabeea
--- /dev/null
+++ b/cpukit/score/cpu/sparc/asm.h
@@ -0,0 +1,123 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted.
+ *
+ * $Id$
+ */
+
+#ifndef __SPARC_ASM_h
+#define __SPARC_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+
+#include <rtems/score/targopts.h>
+#include <rtems/score/cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+/* XXX __USER_LABEL_PREFIX__ and __REGISTER_PREFIX__ do not work on gcc 2.7.0 */
+/* XXX The following ifdef magic fixes the problem but results in a warning */
+/* XXX when compiling assembly code. */
+#undef __USER_LABEL_PREFIX__
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+/*
+ * Entry for traps which jump to a programmer-specified trap handler.
+ */
+
+#define TRAP(_vector, _handler) \
+ mov %psr, %l0 ; \
+ sethi %hi(_handler), %l4 ; \
+ jmp %l4+%lo(_handler); \
+ mov _vector, %l3
+
+/*
+ * Used for the reset trap for ERC32 to avoid a supervisor instruction
+ */
+
+#define RTRAP(_vector, _handler) \
+ mov %g0, %l0 ; \
+ sethi %hi(_handler), %l4 ; \
+ jmp %l4+%lo(_handler); \
+ mov _vector, %l3
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/sparc/cpu.c b/cpukit/score/cpu/sparc/cpu.c
new file mode 100644
index 0000000000..1cf96a4bb7
--- /dev/null
+++ b/cpukit/score/cpu/sparc/cpu.c
@@ -0,0 +1,409 @@
+/*
+ * SPARC Dependent Source
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Ported to ERC32 implementation of the SPARC by On-Line Applications
+ * Research Corporation (OAR) under contract to the European Space
+ * Agency (ESA).
+ *
+ * ERC32 modifications of respective RTEMS file: COPYRIGHT (c) 1995.
+ * European Space Agency.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+
+#if defined(erc32)
+#include <erc32.h>
+#endif
+
+/*
+ * This initializes the set of opcodes placed in each trap
+ * table entry. The routine which installs a handler is responsible
+ * for filling in the fields for the _handler address and the _vector
+ * trap type.
+ *
+ * The constants following this structure are masks for the fields which
+ * must be filled in when the handler is installed.
+ */
+
+const CPU_Trap_table_entry _CPU_Trap_slot_template = {
+ 0xa1480000, /* mov %psr, %l0 */
+ 0x29000000, /* sethi %hi(_handler), %l4 */
+ 0x81c52000, /* jmp %l4 + %lo(_handler) */
+ 0xa6102000 /* mov _vector, %l3 */
+};
+
+/*PAGE
+ *
+ * _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * Input Parameters:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ *
+ * Output Parameters: NONE
+ *
+ * NOTE: There is no need to save the pointer to the thread dispatch routine.
+ * The SPARC's assembly code can reference it directly with no problems.
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ void *pointer;
+
+#ifndef NO_TABLE_MOVE
+ unsigned32 trap_table_start;
+ unsigned32 tbr_value;
+ CPU_Trap_table_entry *old_tbr;
+ CPU_Trap_table_entry *trap_table;
+
+ /*
+ * Install the executive's trap table. All entries from the original
+ * trap table are copied into the executive's trap table. This is essential
+ * since this preserves critical trap handlers such as the window underflow
+ * and overflow handlers. It is the responsibility of the BSP to provide
+ * install these in the initial trap table.
+ */
+
+
+ trap_table_start = (unsigned32) &_CPU_Trap_Table_area;
+ if (trap_table_start & (SPARC_TRAP_TABLE_ALIGNMENT-1))
+ trap_table_start = (trap_table_start + SPARC_TRAP_TABLE_ALIGNMENT) &
+ ~(SPARC_TRAP_TABLE_ALIGNMENT-1);
+
+ trap_table = (CPU_Trap_table_entry *) trap_table_start;
+
+ sparc_get_tbr( tbr_value );
+
+ old_tbr = (CPU_Trap_table_entry *) (tbr_value & 0xfffff000);
+
+ memcpy( trap_table, (void *) old_tbr, 256 * sizeof( CPU_Trap_table_entry ) );
+
+ sparc_set_tbr( trap_table_start );
+
+#endif
+
+ /*
+ * This seems to be the most appropriate way to obtain an initial
+ * FP context on the SPARC. The NULL fp context is copied it to
+ * the task's FP context during Context_Initialize.
+ */
+
+ pointer = &_CPU_Null_fp_context;
+ _CPU_Context_save_fp( &pointer );
+
+ /*
+ * Grab our own copy of the user's CPU table.
+ */
+
+ _CPU_Table = *cpu_table;
+
+#if defined(erc32)
+
+ /*
+ * ERC32 specific initialization
+ */
+
+ _ERC32_MEC_Timer_Control_Mirror = 0;
+ ERC32_MEC.Timer_Control = 0;
+
+ ERC32_MEC.Control |= ERC32_CONFIGURATION_POWER_DOWN_ALLOWED;
+
+#endif
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ *
+ * Input Parameters: NONE
+ *
+ * Output Parameters:
+ * returns the current interrupt level (PIL field of the PSR)
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ unsigned32 level;
+
+ sparc_get_interrupt_level( level );
+
+ return level;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ *
+ * This routine installs the specified handler as a "raw" non-executive
+ * supported trap handler (a.k.a. interrupt service routine).
+ *
+ * Input Parameters:
+ * vector - trap table entry number plus synchronous
+ * vs. asynchronous information
+ * new_handler - address of the handler to be installed
+ * old_handler - pointer to an address of the handler previously installed
+ *
+ * Output Parameters: NONE
+ * *new_handler - address of the handler previously installed
+ *
+ * NOTE:
+ *
+ * On the SPARC, there are really only 256 vectors. However, the executive
+ * has no easy, fast, reliable way to determine which traps are synchronous
+ * and which are asynchronous. By default, synchronous traps return to the
+ * instruction which caused the interrupt. So if you install a software
+ * trap handler as an executive interrupt handler (which is desirable since
+ * RTEMS takes care of window and register issues), then the executive needs
+ * to know that the return address is to the trap rather than the instruction
+ * following the trap.
+ *
+ * So vectors 0 through 255 are treated as regular asynchronous traps which
+ * provide the "correct" return address. Vectors 256 through 512 are assumed
+ * by the executive to be synchronous and to require that the return address
+ * be fudged.
+ *
+ * If you use this mechanism to install a trap handler which must reexecute
+ * the instruction which caused the trap, then it should be installed as
+ * an asynchronous trap. This will avoid the executive changing the return
+ * address.
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ unsigned32 real_vector;
+ CPU_Trap_table_entry *tbr;
+ CPU_Trap_table_entry *slot;
+ unsigned32 u32_tbr;
+ unsigned32 u32_handler;
+
+ /*
+ * Get the "real" trap number for this vector ignoring the synchronous
+ * versus asynchronous indicator included with our vector numbers.
+ */
+
+ real_vector = SPARC_REAL_TRAP_NUMBER( vector );
+
+ /*
+ * Get the current base address of the trap table and calculate a pointer
+ * to the slot we are interested in.
+ */
+
+ sparc_get_tbr( u32_tbr );
+
+ u32_tbr &= 0xfffff000;
+
+ tbr = (CPU_Trap_table_entry *) u32_tbr;
+
+ slot = &tbr[ real_vector ];
+
+ /*
+ * Get the address of the old_handler from the trap table.
+ *
+ * NOTE: The old_handler returned will be bogus if it does not follow
+ * the RTEMS model.
+ */
+
+#define HIGH_BITS_MASK 0xFFFFFC00
+#define HIGH_BITS_SHIFT 10
+#define LOW_BITS_MASK 0x000003FF
+
+ if ( slot->mov_psr_l0 == _CPU_Trap_slot_template.mov_psr_l0 ) {
+ u32_handler =
+ ((slot->sethi_of_handler_to_l4 & HIGH_BITS_MASK) << HIGH_BITS_SHIFT) |
+ (slot->jmp_to_low_of_handler_plus_l4 & LOW_BITS_MASK);
+ *old_handler = (proc_ptr) u32_handler;
+ } else
+ *old_handler = 0;
+
+ /*
+ * Copy the template to the slot and then fix it.
+ */
+
+ *slot = _CPU_Trap_slot_template;
+
+ u32_handler = (unsigned32) new_handler;
+
+ slot->mov_vector_l3 |= vector;
+ slot->sethi_of_handler_to_l4 |=
+ (u32_handler & HIGH_BITS_MASK) >> HIGH_BITS_SHIFT;
+ slot->jmp_to_low_of_handler_plus_l4 |= (u32_handler & LOW_BITS_MASK);
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * new_handler - replacement ISR for this vector number
+ * old_handler - pointer to former ISR for this vector number
+ *
+ * Output parameters:
+ * *old_handler - former ISR for this vector number
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ unsigned32 real_vector;
+ proc_ptr ignored;
+
+ /*
+ * Get the "real" trap number for this vector ignoring the synchronous
+ * versus asynchronous indicator included with our vector numbers.
+ */
+
+ real_vector = SPARC_REAL_TRAP_NUMBER( vector );
+
+ /*
+ * Return the previous ISR handler.
+ */
+
+ *old_handler = _ISR_Vector_table[ real_vector ];
+
+ /*
+ * Install the wrapper so this ISR can be invoked properly.
+ */
+
+ _CPU_ISR_install_raw_handler( vector, _ISR_Handler, &ignored );
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ real_vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Context_Initialize
+ *
+ * This kernel routine initializes the basic non-FP context area associated
+ * with each thread.
+ *
+ * Input parameters:
+ * the_context - pointer to the context area
+ * stack_base - address of memory for the SPARC
+ * size - size in bytes of the stack area
+ * new_level - interrupt level for this context area
+ * entry_point - the starting execution point for this this context
+ * is_fp - TRUE if this context is associated with an FP thread
+ *
+ * Output parameters: NONE
+ */
+
+void _CPU_Context_Initialize(
+ Context_Control *the_context,
+ unsigned32 *stack_base,
+ unsigned32 size,
+ unsigned32 new_level,
+ void *entry_point,
+ boolean is_fp
+)
+{
+ unsigned32 stack_high; /* highest "stack aligned" address */
+ unsigned32 the_size;
+ unsigned32 tmp_psr;
+
+ /*
+ * On CPUs with stacks which grow down (i.e. SPARC), we build the stack
+ * based on the stack_high address.
+ */
+
+ stack_high = ((unsigned32)(stack_base) + size);
+ stack_high &= ~(CPU_STACK_ALIGNMENT - 1);
+
+ the_size = size & ~(CPU_STACK_ALIGNMENT - 1);
+
+ /*
+ * See the README in this directory for a diagram of the stack.
+ */
+
+ the_context->o7 = ((unsigned32) entry_point) - 8;
+ the_context->o6_sp = stack_high - CPU_MINIMUM_STACK_FRAME_SIZE;
+ the_context->i6_fp = stack_high;
+
+ /*
+ * Build the PSR for the task. Most everything can be 0 and the
+ * CWP is corrected during the context switch.
+ *
+ * The EF bit determines if the floating point unit is available.
+ * The FPU is ONLY enabled if the context is associated with an FP task
+ * and this SPARC model has an FPU.
+ */
+
+ sparc_get_psr( tmp_psr );
+ tmp_psr &= ~SPARC_PSR_PIL_MASK;
+ tmp_psr |= (new_level << 8) & SPARC_PSR_PIL_MASK;
+ tmp_psr &= ~SPARC_PSR_EF_MASK; /* disabled by default */
+
+#if (SPARC_HAS_FPU == 1)
+ /*
+ * If this bit is not set, then a task gets a fault when it accesses
+ * a floating point register. This is a nice way to detect floating
+ * point tasks which are not currently declared as such.
+ */
+
+ if ( is_fp )
+ tmp_psr |= SPARC_PSR_EF_MASK;
+#endif
+ the_context->psr = tmp_psr;
+}
+
+/*PAGE
+ *
+ * _CPU_Thread_Idle_body
+ *
+ * Some SPARC implementations have low power, sleep, or idle modes. This
+ * tries to take advantage of those models.
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == TRUE)
+
+/*
+ * This is the implementation for the erc32.
+ *
+ * NOTE: Low power mode was enabled at initialization time.
+ */
+
+#if defined(erc32)
+
+void _CPU_Thread_Idle_body( void )
+{
+ while (1) {
+ ERC32_MEC.Power_Down = 0; /* value is irrelevant */
+ }
+}
+
+#endif
+
+#endif /* CPU_PROVIDES_IDLE_THREAD_BODY */
diff --git a/cpukit/score/cpu/sparc/rtems/asm.h b/cpukit/score/cpu/sparc/rtems/asm.h
new file mode 100644
index 0000000000..b9a3aabeea
--- /dev/null
+++ b/cpukit/score/cpu/sparc/rtems/asm.h
@@ -0,0 +1,123 @@
+/* asm.h
+ *
+ * This include file attempts to address the problems
+ * caused by incompatible flavors of assemblers and
+ * toolsets. It primarily addresses variations in the
+ * use of leading underscores on symbols and the requirement
+ * that register names be preceded by a %.
+ *
+ *
+ * NOTE: The spacing in the use of these macros
+ * is critical to them working as advertised.
+ *
+ * COPYRIGHT:
+ *
+ * This file is based on similar code found in newlib available
+ * from ftp.cygnus.com. The file which was used had no copyright
+ * notice. This file is freely distributable as long as the source
+ * of the file is noted.
+ *
+ * $Id$
+ */
+
+#ifndef __SPARC_ASM_h
+#define __SPARC_ASM_h
+
+/*
+ * Indicate we are in an assembly file and get the basic CPU definitions.
+ */
+
+#ifndef ASM
+#define ASM
+#endif
+
+#include <rtems/score/targopts.h>
+#include <rtems/score/cpu.h>
+
+/*
+ * Recent versions of GNU cpp define variables which indicate the
+ * need for underscores and percents. If not using GNU cpp or
+ * the version does not support this, then you will obviously
+ * have to define these as appropriate.
+ */
+
+/* XXX __USER_LABEL_PREFIX__ and __REGISTER_PREFIX__ do not work on gcc 2.7.0 */
+/* XXX The following ifdef magic fixes the problem but results in a warning */
+/* XXX when compiling assembly code. */
+#undef __USER_LABEL_PREFIX__
+#ifndef __USER_LABEL_PREFIX__
+#define __USER_LABEL_PREFIX__ _
+#endif
+
+#ifndef __REGISTER_PREFIX__
+#define __REGISTER_PREFIX__
+#endif
+
+/* ANSI concatenation macros. */
+
+#define CONCAT1(a, b) CONCAT2(a, b)
+#define CONCAT2(a, b) a ## b
+
+/* Use the right prefix for global labels. */
+
+#define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
+
+/* Use the right prefix for registers. */
+
+#define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)
+
+/*
+ * define macros for all of the registers on this CPU
+ *
+ * EXAMPLE: #define d0 REG (d0)
+ */
+
+/*
+ * Define macros to handle section beginning and ends.
+ */
+
+
+#define BEGIN_CODE_DCL .text
+#define END_CODE_DCL
+#define BEGIN_DATA_DCL .data
+#define END_DATA_DCL
+#define BEGIN_CODE .text
+#define END_CODE
+#define BEGIN_DATA
+#define END_DATA
+#define BEGIN_BSS
+#define END_BSS
+#define END
+
+/*
+ * Following must be tailor for a particular flavor of the C compiler.
+ * They may need to put underscores in front of the symbols.
+ */
+
+#define PUBLIC(sym) .globl SYM (sym)
+#define EXTERN(sym) .globl SYM (sym)
+
+/*
+ * Entry for traps which jump to a programmer-specified trap handler.
+ */
+
+#define TRAP(_vector, _handler) \
+ mov %psr, %l0 ; \
+ sethi %hi(_handler), %l4 ; \
+ jmp %l4+%lo(_handler); \
+ mov _vector, %l3
+
+/*
+ * Used for the reset trap for ERC32 to avoid a supervisor instruction
+ */
+
+#define RTRAP(_vector, _handler) \
+ mov %g0, %l0 ; \
+ sethi %hi(_handler), %l4 ; \
+ jmp %l4+%lo(_handler); \
+ mov _vector, %l3
+
+#endif
+/* end of include file */
+
+
diff --git a/cpukit/score/cpu/unix/cpu.c b/cpukit/score/cpu/unix/cpu.c
new file mode 100644
index 0000000000..1efd9df54b
--- /dev/null
+++ b/cpukit/score/cpu/unix/cpu.c
@@ -0,0 +1,1105 @@
+/*
+ * UNIX Simulator Dependent Source
+ *
+ * COPYRIGHT (c) 1994,95 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/interr.h>
+
+#if defined(solaris2)
+/*
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 3
+#undef __STRICT_ANSI__
+#define __STRICT_ANSI__
+*/
+#define __EXTENSIONS__
+#endif
+
+#if defined(__linux__)
+#define MALLOC_0_RETURNS_NULL
+#endif
+
+#include <sys/types.h>
+#include <sys/times.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/sem.h>
+#include <string.h> /* memset */
+
+#ifndef SA_RESTART
+#define SA_RESTART 0
+#endif
+
+typedef struct {
+ jmp_buf regs;
+ unsigned32 isr_level;
+} Context_Control_overlay;
+
+void _CPU_Signal_initialize(void);
+void _CPU_Stray_signal(int);
+void _CPU_ISR_Handler(int);
+
+static sigset_t _CPU_Signal_mask;
+static Context_Control_overlay
+ _CPU_Context_Default_with_ISRs_enabled CPU_STRUCTURE_ALIGNMENT;
+static Context_Control_overlay
+ _CPU_Context_Default_with_ISRs_disabled CPU_STRUCTURE_ALIGNMENT;
+
+/*
+ * Sync IO support, an entry for each fd that can be set
+ */
+
+void _CPU_Sync_io_Init();
+
+static rtems_sync_io_handler _CPU_Sync_io_handlers[FD_SETSIZE];
+static int sync_io_nfds;
+static fd_set sync_io_readfds;
+static fd_set sync_io_writefds;
+static fd_set sync_io_exceptfds;
+
+/*
+ * Which cpu are we? Used by libcpu and libbsp.
+ */
+
+int cpu_number;
+
+/*PAGE
+ *
+ * _CPU_ISR_From_CPU_Init
+ */
+
+sigset_t posix_empty_mask;
+
+void _CPU_ISR_From_CPU_Init()
+{
+ unsigned32 i;
+ proc_ptr old_handler;
+
+ /*
+ * Generate an empty mask to be used by disable_support
+ */
+
+ sigemptyset(&posix_empty_mask);
+
+ /*
+ * Block all the signals except SIGTRAP for the debugger
+ * and fatal error signals.
+ */
+
+ (void) sigfillset(&_CPU_Signal_mask);
+ (void) sigdelset(&_CPU_Signal_mask, SIGTRAP);
+ (void) sigdelset(&_CPU_Signal_mask, SIGABRT);
+ (void) sigdelset(&_CPU_Signal_mask, SIGIOT);
+ (void) sigdelset(&_CPU_Signal_mask, SIGCONT);
+ (void) sigdelset(&_CPU_Signal_mask, SIGSEGV);
+ (void) sigdelset(&_CPU_Signal_mask, SIGBUS);
+ (void) sigdelset(&_CPU_Signal_mask, SIGFPE);
+
+ _CPU_ISR_Enable(1);
+
+ /*
+ * Set the handler for all signals to be signal_handler
+ * which will then vector out to the correct handler
+ * for whichever signal actually happened. Initially
+ * set the vectors to the stray signal handler.
+ */
+
+ for (i = 0; i < CPU_INTERRUPT_NUMBER_OF_VECTORS; i++)
+ (void)_CPU_ISR_install_vector(i, _CPU_Stray_signal, &old_handler);
+
+ _CPU_Signal_initialize();
+}
+
+void _CPU_Signal_initialize( void )
+{
+ struct sigaction act;
+ sigset_t mask;
+
+ /* mark them all active except for TraceTrap and Abort */
+
+ mask = _CPU_Signal_mask;
+ sigprocmask(SIG_UNBLOCK, &mask, 0);
+
+ act.sa_handler = _CPU_ISR_Handler;
+ act.sa_mask = mask;
+ act.sa_flags = SA_RESTART;
+
+ sigaction(SIGHUP, &act, 0);
+ sigaction(SIGINT, &act, 0);
+ sigaction(SIGQUIT, &act, 0);
+ sigaction(SIGILL, &act, 0);
+#ifdef SIGEMT
+ sigaction(SIGEMT, &act, 0);
+#endif
+ sigaction(SIGFPE, &act, 0);
+ sigaction(SIGKILL, &act, 0);
+ sigaction(SIGBUS, &act, 0);
+ sigaction(SIGSEGV, &act, 0);
+#ifdef SIGSYS
+ sigaction(SIGSYS, &act, 0);
+#endif
+ sigaction(SIGPIPE, &act, 0);
+ sigaction(SIGALRM, &act, 0);
+ sigaction(SIGTERM, &act, 0);
+ sigaction(SIGUSR1, &act, 0);
+ sigaction(SIGUSR2, &act, 0);
+ sigaction(SIGCHLD, &act, 0);
+ sigaction(SIGCLD, &act, 0);
+ sigaction(SIGPWR, &act, 0);
+ sigaction(SIGVTALRM, &act, 0);
+ sigaction(SIGPROF, &act, 0);
+ sigaction(SIGIO, &act, 0);
+ sigaction(SIGWINCH, &act, 0);
+ sigaction(SIGSTOP, &act, 0);
+ sigaction(SIGTTIN, &act, 0);
+ sigaction(SIGTTOU, &act, 0);
+ sigaction(SIGURG, &act, 0);
+#ifdef SIGLOST
+ sigaction(SIGLOST, &act, 0);
+#endif
+}
+
+/*PAGE
+ *
+ * _CPU_Context_From_CPU_Init
+ */
+
+void _CPU_Context_From_CPU_Init()
+{
+
+#if defined(hppa1_1) && defined(RTEMS_UNIXLIB_SETJMP)
+ /*
+ * HACK - set the _SYSTEM_ID to 0x20c so that setjmp/longjmp
+ * will handle the full 32 floating point registers.
+ */
+
+ {
+ extern unsigned32 _SYSTEM_ID;
+
+ _SYSTEM_ID = 0x20c;
+ }
+#endif
+
+ /*
+ * get default values to use in _CPU_Context_Initialize()
+ */
+
+
+ (void) memset(
+ &_CPU_Context_Default_with_ISRs_enabled,
+ 0,
+ sizeof(Context_Control)
+ );
+ (void) memset(
+ &_CPU_Context_Default_with_ISRs_disabled,
+ 0,
+ sizeof(Context_Control)
+ );
+
+ _CPU_ISR_Set_level( 0 );
+ _CPU_Context_switch(
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_enabled,
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_enabled
+ );
+
+ _CPU_ISR_Set_level( 1 );
+ _CPU_Context_switch(
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_disabled,
+ (Context_Control *) &_CPU_Context_Default_with_ISRs_disabled
+ );
+}
+
+/*PAGE
+ *
+ * _CPU_Sync_io_Init
+ */
+
+void _CPU_Sync_io_Init()
+{
+ int fd;
+
+ for (fd = 0; fd < FD_SETSIZE; fd++)
+ _CPU_Sync_io_handlers[fd] = NULL;
+
+ sync_io_nfds = 0;
+ FD_ZERO(&sync_io_readfds);
+ FD_ZERO(&sync_io_writefds);
+ FD_ZERO(&sync_io_exceptfds);
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level( void )
+{
+ sigset_t old_mask;
+
+ sigprocmask(SIG_BLOCK, 0, &old_mask);
+
+ if (memcmp((void *)&posix_empty_mask, (void *)&old_mask, sizeof(sigset_t)))
+ return 1;
+
+ return 0;
+}
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ */
+
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ /*
+ * 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
+ * decided a context switch is necessary. On some compilation
+ * systems it is difficult to call a high-level language routine
+ * from assembly. This allows us to trick these systems.
+ *
+ * If you encounter this problem save the entry point in a CPU
+ * dependent variable.
+ */
+
+ _CPU_Thread_dispatch_pointer = thread_dispatch;
+
+ /*
+ * XXX; If there is not an easy way to initialize the FP context
+ * during Context_Initialize, then it is usually easier to
+ * save an "uninitialized" FP context here and copy it to
+ * the task's during Context_Initialize.
+ */
+
+ /* XXX: FP context initialization support */
+
+ _CPU_Table = *cpu_table;
+
+ _CPU_ISR_From_CPU_Init();
+
+ _CPU_Sync_io_Init();
+
+ _CPU_Context_From_CPU_Init();
+
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ _CPU_Fatal_halt( 0xdeaddead );
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[ vector ];
+
+ /*
+ * If the interrupt vector table is a table of pointer to isr entry
+ * points, then we need to install the appropriate RTEMS interrupt
+ * handler for this vector number.
+ */
+
+ /*
+ * We put the actual user ISR address in '_ISR_vector_table'. This will
+ * be used by the _CPU_ISR_Handler so the user gets control.
+ */
+
+ _ISR_Vector_table[ vector ] = new_handler;
+}
+
+/*PAGE
+ *
+ * _CPU_Install_interrupt_stack
+ */
+
+void _CPU_Install_interrupt_stack( void )
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Thread_Idle_body
+ *
+ * Stop until we get a signal which is the logically the same thing
+ * entering low-power or sleep mode on a real processor and waiting for
+ * an interrupt. This significantly reduces the consumption of host
+ * CPU cycles which is again similar to low power mode.
+ */
+
+void _CPU_Thread_Idle_body( void )
+{
+#if CPU_SYNC_IO
+ extern void _Thread_Dispatch(void);
+ int fd;
+#endif
+
+ while (1) {
+#ifdef RTEMS_DEBUG
+ /* interrupts had better be enabled at this point! */
+ if (_CPU_ISR_Get_level() != 0)
+ abort();
+#endif
+
+ /*
+ * Block on a select statement, the CPU interface added allow the
+ * user to add new descriptors which are to be blocked on
+ */
+
+#if CPU_SYNC_IO
+ if (sync_io_nfds) {
+ int result;
+
+ result = select(sync_io_nfds,
+ &sync_io_readfds,
+ &sync_io_writefds,
+ &sync_io_exceptfds,
+ NULL);
+
+ if ((result < 0) && (errno != EINTR))
+ _CPU_Fatal_error(0x200); /* FIXME : what number should go here !! */
+
+ for (fd = 0; fd < sync_io_nfds; fd++) {
+ boolean read = FD_ISSET(fd, &sync_io_readfds);
+ boolean write = FD_ISSET(fd, &sync_io_writefds);
+ boolean except = FD_ISSET(fd, &sync_io_exceptfds);
+
+ if (_CPU_Sync_io_handlers[fd] && (read || write || except))
+ _CPU_Sync_io_handlers[fd](fd, read, write, except);
+
+ _Thread_Dispatch();
+ }
+ } else
+ pause();
+#else
+ pause();
+#endif
+
+ }
+
+}
+
+/*PAGE
+ *
+ * _CPU_Context_Initialize
+ */
+
+void _CPU_Context_Initialize(
+ Context_Control *_the_context,
+ unsigned32 *_stack_base,
+ unsigned32 _size,
+ unsigned32 _new_level,
+ void *_entry_point,
+ boolean _is_fp
+)
+{
+ unsigned32 *addr;
+ unsigned32 jmp_addr;
+ unsigned32 _stack_low; /* lowest "stack aligned" address */
+ unsigned32 _stack_high; /* highest "stack aligned" address */
+ unsigned32 _the_size;
+
+ jmp_addr = (unsigned32) _entry_point;
+
+ /*
+ * On CPUs with stacks which grow down, we build the stack
+ * based on the _stack_high address. On CPUs with stacks which
+ * grow up, we build the stack based on the _stack_low address.
+ */
+
+ _stack_low = (unsigned32)(_stack_base) + CPU_STACK_ALIGNMENT - 1;
+ _stack_low &= ~(CPU_STACK_ALIGNMENT - 1);
+
+ _stack_high = (unsigned32)(_stack_base) + _size;
+ _stack_high &= ~(CPU_STACK_ALIGNMENT - 1);
+
+ if (_stack_high > _stack_low)
+ _the_size = _stack_high - _stack_low;
+ else
+ _the_size = _stack_low - _stack_high;
+
+ /*
+ * Slam our jmp_buf template into the context we are creating
+ */
+
+ if ( _new_level == 0 )
+ *_the_context = *(Context_Control *)
+ &_CPU_Context_Default_with_ISRs_enabled;
+ else
+ *_the_context = *(Context_Control *)
+ &_CPU_Context_Default_with_ISRs_disabled;
+
+ addr = (unsigned32 *)_the_context;
+
+#if defined(hppa1_1)
+ *(addr + RP_OFF) = jmp_addr;
+ *(addr + SP_OFF) = (unsigned32)(_stack_low + CPU_FRAME_SIZE);
+
+ /*
+ * See if we are using shared libraries by checking
+ * bit 30 in 24 off of newp. If bit 30 is set then
+ * we are using shared libraries and the jump address
+ * points to the pointer, so we put that into rp instead.
+ */
+
+ if (jmp_addr & 0x40000000) {
+ jmp_addr &= 0xfffffffc;
+ *(addr + RP_OFF) = *(unsigned32 *)jmp_addr;
+ }
+#elif defined(sparc)
+
+ /*
+ * See /usr/include/sys/stack.h in Solaris 2.3 for a nice
+ * diagram of the stack.
+ */
+
+ asm ("ta 0x03"); /* flush registers */
+
+ *(addr + RP_OFF) = jmp_addr + ADDR_ADJ_OFFSET;
+ *(addr + SP_OFF) = (unsigned32)(_stack_high - CPU_FRAME_SIZE);
+ *(addr + FP_OFF) = (unsigned32)(_stack_high);
+
+#elif defined(i386) || defined(__i386__)
+
+ /*
+ * This information was gathered by disassembling setjmp().
+ */
+
+ {
+ unsigned32 stack_ptr;
+
+ stack_ptr = _stack_high - CPU_FRAME_SIZE;
+
+ *(addr + EBX_OFF) = 0xFEEDFEED;
+ *(addr + ESI_OFF) = 0xDEADDEAD;
+ *(addr + EDI_OFF) = 0xDEAFDEAF;
+ *(addr + EBP_OFF) = stack_ptr;
+ *(addr + ESP_OFF) = stack_ptr;
+ *(addr + RET_OFF) = jmp_addr;
+
+ addr = (unsigned32 *) stack_ptr;
+
+ addr[ 0 ] = jmp_addr;
+ addr[ 1 ] = (unsigned32) stack_ptr;
+ addr[ 2 ] = (unsigned32) stack_ptr;
+ }
+
+#else
+#error "UNKNOWN CPU!!!"
+#endif
+
+}
+
+/*PAGE
+ *
+ * _CPU_Context_restore
+ */
+
+void _CPU_Context_restore(
+ Context_Control *next
+)
+{
+ Context_Control_overlay *nextp = (Context_Control_overlay *)next;
+
+ _CPU_ISR_Enable(nextp->isr_level);
+ longjmp( nextp->regs, 0 );
+}
+
+/*PAGE
+ *
+ * _CPU_Context_switch
+ */
+
+static void do_jump(
+ Context_Control_overlay *currentp,
+ Context_Control_overlay *nextp
+);
+
+void _CPU_Context_switch(
+ Context_Control *current,
+ Context_Control *next
+)
+{
+ Context_Control_overlay *currentp = (Context_Control_overlay *)current;
+ Context_Control_overlay *nextp = (Context_Control_overlay *)next;
+#if 0
+ int status;
+#endif
+
+ currentp->isr_level = _CPU_ISR_Disable_support();
+
+ do_jump( currentp, nextp );
+
+#if 0
+ if (sigsetjmp(currentp->regs, 1) == 0) { /* Save the current context */
+ siglongjmp(nextp->regs, 0); /* Switch to the new context */
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+ }
+#endif
+
+#ifdef RTEMS_DEBUG
+ if (_CPU_ISR_Get_level() == 0)
+ abort();
+#endif
+
+ _CPU_ISR_Enable(currentp->isr_level);
+}
+
+static void do_jump(
+ Context_Control_overlay *currentp,
+ Context_Control_overlay *nextp
+)
+{
+ int status;
+
+ if (setjmp(currentp->regs) == 0) { /* Save the current context */
+ longjmp(nextp->regs, 0); /* Switch to the new context */
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_Save_float_context
+ */
+
+void _CPU_Save_float_context(
+ Context_Control_fp *fp_context
+)
+{
+}
+
+/*PAGE
+ *
+ * _CPU_Restore_float_context
+ */
+
+void _CPU_Restore_float_context(
+ Context_Control_fp *fp_context
+)
+{
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Disable_support
+ */
+
+unsigned32 _CPU_ISR_Disable_support(void)
+{
+ int status;
+ sigset_t old_mask;
+
+ status = sigprocmask(SIG_BLOCK, &_CPU_Signal_mask, &old_mask);
+ if ( status )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+
+ if (memcmp((void *)&posix_empty_mask, (void *)&old_mask, sizeof(sigset_t)))
+ return 1;
+
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Enable
+ */
+
+void _CPU_ISR_Enable(
+ unsigned32 level
+)
+{
+ int status;
+
+ if (level == 0)
+ status = sigprocmask(SIG_UNBLOCK, &_CPU_Signal_mask, 0);
+ else
+ status = sigprocmask(SIG_BLOCK, &_CPU_Signal_mask, 0);
+
+ if ( status )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ status
+ );
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_Handler
+ *
+ * External interrupt handler.
+ * This is installed as a UNIX signal handler.
+ * It vectors out to specific user interrupt handlers.
+ */
+
+void _CPU_ISR_Handler(int vector)
+{
+ extern void _Thread_Dispatch(void);
+ extern unsigned32 _Thread_Dispatch_disable_level;
+ extern boolean _Context_Switch_necessary;
+
+ if (_ISR_Nest_level++ == 0) {
+ /* switch to interrupt stack */
+ }
+
+ _Thread_Dispatch_disable_level++;
+
+ if (_ISR_Vector_table[vector]) {
+ _ISR_Vector_table[vector](vector);
+ } else {
+ _CPU_Stray_signal(vector);
+ }
+
+ if (_ISR_Nest_level-- == 0) {
+ /* switch back to original stack */
+ }
+
+ _Thread_Dispatch_disable_level--;
+
+ if (_Thread_Dispatch_disable_level == 0 &&
+ (_Context_Switch_necessary || _ISR_Signals_to_thread_executing)) {
+ _ISR_Signals_to_thread_executing = FALSE;
+ _CPU_ISR_Enable(0);
+ _Thread_Dispatch();
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_Stray_signal
+ */
+
+void _CPU_Stray_signal(int sig_num)
+{
+ char buffer[ 4 ];
+
+ /*
+ * print "stray" msg about ones which that might mean something
+ * Avoid using the stdio section of the library.
+ * The following is generally safe.
+ */
+
+ switch (sig_num)
+ {
+ case SIGCLD:
+ break;
+
+ default:
+ {
+ /*
+ * We avoid using the stdio section of the library.
+ * The following is generally safe
+ */
+
+ int digit;
+ int number = sig_num;
+ int len = 0;
+
+ digit = number / 100;
+ number %= 100;
+ if (digit) buffer[len++] = '0' + digit;
+
+ digit = number / 10;
+ number %= 10;
+ if (digit || len) buffer[len++] = '0' + digit;
+
+ digit = number;
+ buffer[len++] = '0' + digit;
+
+ buffer[ len++ ] = '\n';
+
+ write( 2, "Stray signal ", 13 );
+ write( 2, buffer, len );
+
+ }
+ }
+
+ /*
+ * If it was a "fatal" signal, then exit here
+ * If app code has installed a hander for one of these, then
+ * we won't call _CPU_Stray_signal, so this is ok.
+ */
+
+ switch (sig_num) {
+ case SIGINT:
+ case SIGHUP:
+ case SIGQUIT:
+ case SIGILL:
+#ifdef SIGEMT
+ case SIGEMT:
+#endif
+ case SIGKILL:
+ case SIGBUS:
+ case SIGSEGV:
+ case SIGTERM:
+ case SIGIOT:
+ _CPU_Fatal_error(0x100 + sig_num);
+ }
+}
+
+/*PAGE
+ *
+ * _CPU_Fatal_error
+ */
+
+void _CPU_Fatal_error(unsigned32 error)
+{
+ setitimer(ITIMER_REAL, 0, 0);
+
+ if ( error ) {
+#ifdef RTEMS_DEBUG
+ abort();
+#endif
+ if (getenv("RTEMS_DEBUG"))
+ abort();
+ }
+
+ _exit(error);
+}
+
+/*
+ * Special Purpose Routines to hide the use of UNIX system calls.
+ */
+
+int _CPU_Set_sync_io_handler(
+ int fd,
+ boolean read,
+ boolean write,
+ boolean except,
+ rtems_sync_io_handler handler
+)
+{
+ if ((fd < FD_SETSIZE) && (_CPU_Sync_io_handlers[fd] == NULL)) {
+ if (read)
+ FD_SET(fd, &sync_io_readfds);
+ else
+ FD_CLR(fd, &sync_io_readfds);
+ if (write)
+ FD_SET(fd, &sync_io_writefds);
+ else
+ FD_CLR(fd, &sync_io_writefds);
+ if (except)
+ FD_SET(fd, &sync_io_exceptfds);
+ else
+ FD_CLR(fd, &sync_io_exceptfds);
+ _CPU_Sync_io_handlers[fd] = handler;
+ if ((fd + 1) > sync_io_nfds)
+ sync_io_nfds = fd + 1;
+ return 0;
+ }
+ return -1;
+}
+
+int _CPU_Clear_sync_io_handler(
+ int fd
+)
+{
+ if ((fd < FD_SETSIZE) && _CPU_Sync_io_handlers[fd]) {
+ FD_CLR(fd, &sync_io_readfds);
+ FD_CLR(fd, &sync_io_writefds);
+ FD_CLR(fd, &sync_io_exceptfds);
+ _CPU_Sync_io_handlers[fd] = NULL;
+ sync_io_nfds = 0;
+ for (fd = 0; fd < FD_SETSIZE; fd++)
+ if (FD_ISSET(fd, &sync_io_readfds) ||
+ FD_ISSET(fd, &sync_io_writefds) ||
+ FD_ISSET(fd, &sync_io_exceptfds))
+ sync_io_nfds = fd;
+ return 0;
+ }
+ return -1;
+}
+
+int _CPU_Get_clock_vector( void )
+{
+ return SIGALRM;
+}
+
+void _CPU_Start_clock(
+ int microseconds
+)
+{
+ struct itimerval new;
+
+ new.it_value.tv_sec = 0;
+ new.it_value.tv_usec = microseconds;
+ new.it_interval.tv_sec = 0;
+ new.it_interval.tv_usec = microseconds;
+
+ setitimer(ITIMER_REAL, &new, 0);
+}
+
+void _CPU_Stop_clock( void )
+{
+ struct itimerval new;
+ struct sigaction act;
+
+ /*
+ * Set the SIGALRM signal to ignore any last
+ * signals that might come in while we are
+ * disarming the timer and removing the interrupt
+ * vector.
+ */
+
+ (void) memset(&act, 0, sizeof(act));
+ act.sa_handler = SIG_IGN;
+
+ sigaction(SIGALRM, &act, 0);
+
+ (void) memset(&new, 0, sizeof(new));
+ setitimer(ITIMER_REAL, &new, 0);
+}
+
+int _CPU_SHM_Semid;
+extern void fix_syscall_errno( void );
+
+void _CPU_SHM_Init(
+ unsigned32 maximum_nodes,
+ boolean is_master_node,
+ void **shm_address,
+ unsigned32 *shm_length
+)
+{
+ int i;
+ int shmid;
+ char *shm_addr;
+ key_t shm_key;
+ key_t sem_key;
+ int status = 0; /* to avoid unitialized warnings */
+ int shm_size;
+
+ if (getenv("RTEMS_SHM_KEY"))
+ shm_key = strtol(getenv("RTEMS_SHM_KEY"), 0, 0);
+ else
+#ifdef RTEMS_SHM_KEY
+ shm_key = RTEMS_SHM_KEY;
+#else
+ shm_key = 0xa000;
+#endif
+
+ if (getenv("RTEMS_SHM_SIZE"))
+ shm_size = strtol(getenv("RTEMS_SHM_SIZE"), 0, 0);
+ else
+#ifdef RTEMS_SHM_SIZE
+ shm_size = RTEMS_SHM_SIZE;
+#else
+ shm_size = 64 * 1024;
+#endif
+
+ if (getenv("RTEMS_SHM_SEMAPHORE_KEY"))
+ sem_key = strtol(getenv("RTEMS_SHM_SEMAPHORE_KEY"), 0, 0);
+ else
+#ifdef RTEMS_SHM_SEMAPHORE_KEY
+ sem_key = RTEMS_SHM_SEMAPHORE_KEY;
+#else
+ sem_key = 0xa001;
+#endif
+
+ shmid = shmget(shm_key, shm_size, IPC_CREAT | 0660);
+ if ( shmid == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ perror( "shmget" );
+ _CPU_Fatal_halt( 0xdead0001 );
+ }
+
+ shm_addr = shmat(shmid, (char *)0, SHM_RND);
+ if ( shm_addr == (void *)-1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ perror( "shmat" );
+ _CPU_Fatal_halt( 0xdead0002 );
+ }
+
+ _CPU_SHM_Semid = semget(sem_key, maximum_nodes + 1, IPC_CREAT | 0660);
+ if ( _CPU_SHM_Semid == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ perror( "semget" );
+ _CPU_Fatal_halt( 0xdead0003 );
+ }
+
+ if ( is_master_node ) {
+ for ( i=0 ; i <= maximum_nodes ; i++ ) {
+#if defined(solaris2)
+ union semun {
+ int val;
+ struct semid_ds *buf;
+ ushort *array;
+ } help;
+
+ help.val = 1;
+ status = semctl( _CPU_SHM_Semid, i, SETVAL, help );
+#elif defined(hpux) || defined(__linux__)
+ status = semctl( _CPU_SHM_Semid, i, SETVAL, 1 );
+#else
+#error "Not a supported unix variant"
+#endif
+
+ fix_syscall_errno(); /* in case of newlib */
+ if ( status == -1 ) {
+ _CPU_Fatal_halt( 0xdead0004 );
+ }
+ }
+ }
+
+ *shm_address = shm_addr;
+ *shm_length = shm_size;
+
+}
+
+int _CPU_Get_pid( void )
+{
+ return getpid();
+}
+
+/*
+ * Define this to use signals for MPCI shared memory driver.
+ * If undefined, the shared memory driver will poll from the
+ * clock interrupt.
+ * Ref: ../shmsupp/getcfg.c
+ *
+ * BEWARE:: many UN*X kernels and debuggers become severely confused when
+ * debugging programs which use signals. The problem is *much*
+ * worse when using multiple signals, since ptrace(2) tends to
+ * drop all signals except 1 in the case of multiples.
+ * On hpux9, this problem was so bad, we couldn't use interrupts
+ * with the shared memory driver if we ever hoped to debug
+ * RTEMS programs.
+ * Maybe systems that use /proc don't have this problem...
+ */
+
+
+int _CPU_SHM_Get_vector( void )
+{
+#ifdef CPU_USE_SHM_INTERRUPTS
+ return SIGUSR1;
+#else
+ return 0;
+#endif
+}
+
+void _CPU_SHM_Send_interrupt(
+ int pid,
+ int vector
+)
+{
+ kill((pid_t) pid, vector);
+}
+
+void _CPU_SHM_Lock(
+ int semaphore
+)
+{
+ struct sembuf sb;
+
+ sb.sem_num = semaphore;
+ sb.sem_op = -1;
+ sb.sem_flg = 0;
+
+ while (1) {
+ int status = -1;
+
+ status = semop(_CPU_SHM_Semid, &sb, 1);
+ if ( status >= 0 )
+ break;
+ if ( status == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ if (errno == EINTR)
+ continue;
+ perror("shm lock");
+ _CPU_Fatal_halt( 0xdead0005 );
+ }
+ }
+
+}
+
+void _CPU_SHM_Unlock(
+ int semaphore
+)
+{
+ struct sembuf sb;
+ int status;
+
+ sb.sem_num = semaphore;
+ sb.sem_op = 1;
+ sb.sem_flg = 0;
+
+ while (1) {
+ status = semop(_CPU_SHM_Semid, &sb, 1);
+ if ( status >= 0 )
+ break;
+
+ if ( status == -1 ) {
+ fix_syscall_errno(); /* in case of newlib */
+ if (errno == EINTR)
+ continue;
+ perror("shm unlock");
+ _CPU_Fatal_halt( 0xdead0006 );
+ }
+ }
+
+}
diff --git a/cpukit/score/include/rtems/debug.h b/cpukit/score/include/rtems/debug.h
new file mode 100644
index 0000000000..37b3a053a5
--- /dev/null
+++ b/cpukit/score/include/rtems/debug.h
@@ -0,0 +1,98 @@
+/* debug.h
+ *
+ * This include file contains the information pertaining to the debug
+ * support within RTEMS. It is currently cast in the form of a
+ * Manager since it is externally accessible.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_DEBUG_h
+#define __RTEMS_DEBUG_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type is used to manage the debug mask.
+ */
+
+typedef unsigned32 rtems_debug_control;
+
+/*
+ * These constants represent various classes of debugging.
+ */
+
+#define RTEMS_DEBUG_ALL_MASK 0xffffffff
+#define RTEMS_DEBUG_REGION 0x00000001
+
+/*
+ * This variable contains the current debug level.
+ */
+
+SCORE_EXTERN rtems_debug_control _Debug_Level;
+
+/*
+ * _Debug_Manager_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this manager.
+ */
+
+void _Debug_Manager_initialization( void );
+
+/*
+ * rtems_debug_enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables the specified types of debug checks.
+ */
+
+void rtems_debug_enable (
+ rtems_debug_control to_be_enabled
+);
+
+/*
+ * rtems_debug_disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables the specified types of debug checks.
+ */
+
+void rtems_debug_disable (
+ rtems_debug_control to_be_disabled
+);
+
+/*
+ *
+ * _Debug_Is_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the requested debug level is
+ * enabled, and FALSE otherwise.
+ */
+
+boolean _Debug_Is_enabled(
+ rtems_debug_control level
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/address.h b/cpukit/score/include/rtems/score/address.h
new file mode 100644
index 0000000000..b94483df34
--- /dev/null
+++ b/cpukit/score/include/rtems/score/address.h
@@ -0,0 +1,31 @@
+/* address.h
+ *
+ * This include file contains the information required to manipulate
+ * physical addresses.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_ADDRESSES_h
+#define __RTEMS_ADDRESSES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/apiext.h b/cpukit/score/include/rtems/score/apiext.h
new file mode 100644
index 0000000000..ae45348303
--- /dev/null
+++ b/cpukit/score/include/rtems/score/apiext.h
@@ -0,0 +1,102 @@
+/* apiext.h
+ *
+ * XXX
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __API_EXTENSIONS_h
+#define __API_EXTENSIONS_h
+
+#include <rtems/score/chain.h>
+#include <rtems/score/thread.h>
+
+/*
+ * The control structure which defines the points at which an API
+ * can add an extension to the system initialization thread.
+ */
+
+typedef void (*API_extensions_Predriver_hook)(void);
+typedef void (*API_extensions_Postdriver_hook)(void);
+typedef void (*API_extensions_Postswitch_hook)(
+ Thread_Control *
+ );
+
+
+typedef struct {
+ Chain_Node Node;
+ API_extensions_Predriver_hook predriver_hook;
+ API_extensions_Postdriver_hook postdriver_hook;
+ API_extensions_Postswitch_hook postswitch_hook;
+} API_extensions_Control;
+
+/*
+ * This is the list of API extensions to the system initialization.
+ */
+
+SCORE_EXTERN Chain_Control _API_extensions_List;
+
+/*
+ * _API_extensions_Initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the API extension handler.
+ *
+ */
+
+void _API_extensions_Initialization( void );
+
+/*
+ * _API_extensions_Add
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Add(
+ API_extensions_Control *the_extension
+);
+
+/*
+ * _API_extensions_Run_predriver
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_predriver( void );
+
+/*
+ * _API_extensions_Run_postdriver
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_postdriver( void );
+
+/*
+ * _API_extensions_Run_postswitch
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _API_extensions_Run_postswitch( void );
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/bitfield.h b/cpukit/score/include/rtems/score/bitfield.h
new file mode 100644
index 0000000000..da84344af8
--- /dev/null
+++ b/cpukit/score/include/rtems/score/bitfield.h
@@ -0,0 +1,98 @@
+/* bitfield.h
+ *
+ * This include file contains all bit field manipulation routines.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_BITFIELD_h
+#define __RTEMS_BITFIELD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * _Bitfield_Find_first_bit
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the bit_number of the first bit set
+ * in the specified value. The correspondence between bit_number
+ * and actual bit position is processor dependent. The search for
+ * the first bit set may run from most to least significant bit
+ * or vice-versa.
+ *
+ * NOTE:
+ *
+ * This routine is used when the executing thread is removed
+ * from the ready state and, as a result, its performance has a
+ * significant impact on the performance of the executive as a whole.
+ */
+
+#if ( CPU_USE_GENERIC_BITFIELD_DATA == TRUE )
+
+#ifndef SCORE_INIT
+extern const unsigned char __log2table[256];
+#else
+const unsigned char __log2table[256] = {
+ 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+#endif
+
+#endif
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == FALSE )
+
+#define _Bitfield_Find_first_bit( _value, _bit_number ) \
+ _CPU_Bitfield_Find_first_bit( _value, _bit_number )
+
+#else
+
+/*
+ * The following must be a macro because if a CPU specific version
+ * is used it will most likely use inline assembly.
+ */
+
+#define _Bitfield_Find_first_bit( _value, _bit_number ) \
+ { \
+ register unsigned32 __value = (unsigned32) (_value); \
+ register const unsigned char *__p = __log2table; \
+ \
+ if ( __value < 0x100 ) \
+ (_bit_number) = __p[ __value ] + 8; \
+ else \
+ (_bit_number) = __p[ __value >> 8 ]; \
+ }
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/chain.h b/cpukit/score/include/rtems/score/chain.h
new file mode 100644
index 0000000000..a1c8675fae
--- /dev/null
+++ b/cpukit/score/include/rtems/score/chain.h
@@ -0,0 +1,168 @@
+/* chain.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Doubly Linked Chain Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CHAIN_h
+#define __RTEMS_CHAIN_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/address.h>
+
+/*
+ * This is used to manage each element (node) which is placed
+ * on a chain.
+ *
+ * NOTE: Typically, a more complicated structure will use the
+ * chain package. The more complicated structure will
+ * include a chain node as the first element in its
+ * control structure. It will then call the chain package
+ * with a pointer to that node element. The node pointer
+ * and the higher level structure start at the same address
+ * so the user can cast the pointers back and forth.
+ *
+ */
+
+typedef struct Chain_Node_struct Chain_Node;
+
+struct Chain_Node_struct {
+ Chain_Node *next;
+ Chain_Node *previous;
+};
+
+/*
+ * This is used to manage a chain. A chain consists of a doubly
+ * linked list of zero or more nodes.
+ *
+ * NOTE: This implementation does not require special checks for
+ * manipulating the first and last elements on the chain.
+ * To accomplish this the chain control structure is
+ * treated as two overlapping chain nodes. The permanent
+ * head of the chain overlays a node structure on the
+ * first and permanent_null fields. The permanent tail
+ * of the chain overlays a node structure on the
+ * permanent_null and last elements of the structure.
+ *
+ */
+
+typedef struct {
+ Chain_Node *first;
+ Chain_Node *permanent_null;
+ Chain_Node *last;
+} Chain_Control;
+
+/*
+ * _Chain_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_chain structure to manage the
+ * contiguous array of number_nodes nodes which starts at
+ * starting_address. Each node is of node_size bytes.
+ *
+ */
+
+void _Chain_Initialize(
+ Chain_Control *the_chain,
+ void *starting_address,
+ unsigned32 number_nodes,
+ unsigned32 node_size
+);
+
+/*
+ * _Chain_Get_first_unprotected
+ */
+
+#ifndef USE_INLINES
+Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+);
+#endif
+
+/*
+ * _Chain_Extract
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It disables interrupts to insure the atomicity of the
+ * extract operation.
+ *
+ */
+
+void _Chain_Extract(
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It disables interrupts to insure the atomicity of the
+ * get operation.
+ *
+ */
+
+Chain_Node *_Chain_Get(
+ Chain_Control *the_chain
+);
+
+/*
+ * _Chain_Insert
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It disables interrupts to insure the atomicity
+ * of the extract operation.
+ *
+ */
+
+void _Chain_Insert(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+);
+
+/*
+ * _Chain_Append
+ *
+ * DESCRIPTION:
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * append operation.
+ *
+ */
+
+void _Chain_Append(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/chain.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/context.h b/cpukit/score/include/rtems/score/context.h
new file mode 100644
index 0000000000..4b4ac5960c
--- /dev/null
+++ b/cpukit/score/include/rtems/score/context.h
@@ -0,0 +1,134 @@
+/* context.h
+ *
+ * This include file contains all information about a context.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CONTEXT_h
+#define __RTEMS_CONTEXT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/cpu.h>
+
+/*
+ * The following constant defines the number of bytes required
+ * to store a full floating point context.
+ */
+
+#define CONTEXT_FP_SIZE CPU_CONTEXT_FP_SIZE
+
+/*
+ * The following variable is set to TRUE when a reschedule operation
+ * has determined that the processor should be taken away from the
+ * currently executing thread and given to the heir thread.
+ */
+
+SCORE_EXTERN volatile boolean _Context_Switch_necessary;
+
+/*
+ * _Context_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes THE_CONTEXT such that the stack
+ * pointer, interrupt level, and entry point are correct for the
+ * thread's initial state.
+ */
+
+#define \
+ _Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp ) \
+ _CPU_Context_Initialize( _the_context, _stack, _size, _isr, _entry, _is_fp )
+
+/*
+ * _Context_Switch
+ *
+ * DESCRIPTION:
+ *
+ * This routine saves the current context into the EXECUTING
+ * context record and restores the context specified by HEIR.
+ */
+
+#define _Context_Switch( _executing, _heir ) \
+ _CPU_Context_switch( _executing, _heir )
+
+/*
+ * _Context_Restart_self
+ *
+ * DESCRIPTION:
+ *
+ * This routine restarts the calling thread by restoring its initial
+ * stack pointer and returning to the thread's entry point.
+ */
+
+#define _Context_Restart_self( _the_context ) \
+ _CPU_Context_Restart_self( _the_context )
+
+/*
+ * _Context_Fp_start
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the starting address of the floating
+ * point context save area. It is assumed that the are reserved
+ * for the floating point save area is large enough.
+ */
+
+#define _Context_Fp_start( _base, _offset ) \
+ _CPU_Context_Fp_start( (_base), (_offset) )
+
+/*
+ * _Context_Initialize_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the floating point context save
+ * area to contain an initial known state.
+ */
+
+#define _Context_Initialize_fp( _fp_area ) \
+ _CPU_Context_Initialize_fp( _fp_area )
+
+/*
+ * _Context_Restore_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine restores the floating point context contained
+ * in the FP_CONTEXT area. It is assumed that the current
+ * floating point context has been saved by a previous invocation
+ * of SAVE_FP.
+ */
+
+#define _Context_Restore_fp( _fp ) \
+ _CPU_Context_restore_fp( _fp )
+
+/*
+ * _Context_Save_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine saves the current floating point context
+ * in the FP_CONTEXT area.
+ */
+
+#define _Context_Save_fp( _fp ) \
+ _CPU_Context_save_fp( _fp )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/copyrt.h b/cpukit/score/include/rtems/score/copyrt.h
new file mode 100644
index 0000000000..659f328661
--- /dev/null
+++ b/cpukit/score/include/rtems/score/copyrt.h
@@ -0,0 +1,42 @@
+/* copyrt.h
+ *
+ * This include file contains the copyright notice for RTEMS
+ * which is included in every binary copy of the executive.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_COPYRIGHT_h
+#define __RTEMS_COPYRIGHT_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef SCORE_INIT
+
+const char _Copyright_Notice[] =
+"COPYRIGHT (c) 1989-1997.\n\
+On-Line Applications Research Corporation (OAR).\n\
+Copyright assigned to U.S. Government, 1994.\n";
+
+#else
+
+extern const char _Copyright_Notice[];
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/coremsg.h b/cpukit/score/include/rtems/score/coremsg.h
new file mode 100644
index 0000000000..a5052a7ffd
--- /dev/null
+++ b/cpukit/score/include/rtems/score/coremsg.h
@@ -0,0 +1,267 @@
+/* coremsg.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Message queue Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_MESSAGE_QUEUE_h
+#define __RTEMS_CORE_MESSAGE_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following type defines the callout which the API provides
+ * to support global/multiprocessor operations on message_queues.
+ */
+
+typedef void ( *CORE_message_queue_API_mp_support_callout )(
+ Thread_Control *,
+ Objects_Id
+ );
+
+/*
+ * The following defines the data types needed to manipulate
+ * the contents of message buffers.
+ *
+ * NOTE: The buffer field is normally longer than a single unsigned32.
+ * but since messages are variable length we just make a ptr to 1.
+ */
+
+typedef struct {
+ unsigned32 size;
+ unsigned32 buffer[1];
+} CORE_message_queue_Buffer;
+
+/*
+ * The following records define the organization of a message
+ * buffer.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ CORE_message_queue_Buffer Contents;
+} CORE_message_queue_Buffer_control;
+
+/*
+ * Blocking disciplines for a message_queue.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO,
+ CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY
+} CORE_message_queue_Disciplines;
+
+/*
+ * The following enumerated type details the modes in which a message
+ * may be submitted to a message queue. The message may be posted
+ * in a send or urgent fashion.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_SEND_REQUEST = 0,
+ CORE_MESSAGE_QUEUE_URGENT_REQUEST = 1
+} CORE_message_queue_Submit_types;
+
+/*
+ * Core Message queue handler return statuses.
+ */
+
+typedef enum {
+ CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL,
+ CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE,
+ CORE_MESSAGE_QUEUE_STATUS_TOO_MANY,
+ CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED,
+ CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT,
+ CORE_MESSAGE_QUEUE_STATUS_WAS_DELETED,
+ CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
+} CORE_message_queue_Status;
+
+/*
+ * The following defines the control block used to manage the
+ * attributes of each message queue.
+ */
+
+typedef struct {
+ CORE_message_queue_Disciplines discipline;
+} CORE_message_queue_Attributes;
+
+/*
+ * The following defines the type for a Notification handler. A notification
+ * handler is invoked when the message queue makes a 0->1 transition on
+ * pending messages.
+ */
+
+typedef void (*CORE_message_queue_Notify_Handler)( void * );
+
+/*
+ * The following defines the control block used to manage each
+ * counting message_queue.
+ */
+
+typedef struct {
+ Thread_queue_Control Wait_queue;
+ CORE_message_queue_Attributes Attributes;
+ unsigned32 maximum_pending_messages;
+ unsigned32 number_of_pending_messages;
+ unsigned32 maximum_message_size;
+ Chain_Control Pending_messages;
+ CORE_message_queue_Buffer *message_buffers;
+ CORE_message_queue_Notify_Handler notify_handler;
+ void *notify_argument;
+ Chain_Control Inactive_messages;
+} CORE_message_queue_Control;
+
+/*
+ * _CORE_message_queue_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the message_queue based on the parameters passed.
+ */
+
+boolean _CORE_message_queue_Initialize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Classes the_class,
+ CORE_message_queue_Attributes *the_message_queue_attributes,
+ unsigned32 maximum_pending_messages,
+ unsigned32 maximum_message_size,
+ Thread_queue_Extract_callout proxy_extract_callout
+);
+
+/*
+ * _CORE_message_queue_Close
+ *
+ * DESCRIPTION:
+ *
+ * This function closes a message by returning all allocated space and
+ * flushing the message_queue's task wait queue.
+ */
+
+void _CORE_message_queue_Close(
+ CORE_message_queue_Control *the_message_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ *
+ * _CORE_message_queue_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This function flushes the message_queue's task wait queue. The number
+ * messages flushed from the queue is returned.
+ *
+ */
+
+unsigned32 _CORE_message_queue_Flush(
+ CORE_message_queue_Control *the_message_queue
+);
+
+/*
+ * _CORE_message_queue_Flush_support
+ *
+ * DESCRIPTION:
+ *
+ * This routine flushes all outstanding messages and returns
+ * them to the inactive message chain.
+ */
+
+unsigned32 _CORE_message_queue_Flush_support(
+ CORE_message_queue_Control *the_message_queue
+);
+
+/*
+ *
+ * _CORE_message_queue_Broadcast
+ *
+ * DESCRIPTION:
+ *
+ * This function sends a message for every thread waiting on the queue and
+ * returns the number of threads made ready by the message.
+ *
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Broadcast(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ unsigned32 *count
+);
+
+/*
+ *
+ * _CORE_message_queue_Submit
+ *
+ * DESCRIPTION:
+ *
+ * This routine implements the send and urgent message functions. It
+ * processes a message that is to be submitted to the designated
+ * message queue. The message will either be processed as a
+ * send message which it will be inserted at the rear of the queue
+ * or it will be processed as an urgent message which will be inserted
+ * at the front of the queue.
+ *
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Submit(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ CORE_message_queue_Submit_types submit_type
+);
+
+/*
+ *
+ * _CORE_message_queue_Seize
+ *
+ * DESCRIPTION:
+ *
+ * This kernel routine dequeues a message, copies the message buffer to
+ * a given destination buffer, and frees the message buffer to the
+ * inactive message pool. The thread will be blocked if wait is TRUE,
+ * otherwise an error will be given to the thread if no messages are available.
+ *
+ */
+
+void _CORE_message_queue_Seize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ boolean wait,
+ Watchdog_Interval timeout
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coremsg.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
+
diff --git a/cpukit/score/include/rtems/score/coremutex.h b/cpukit/score/include/rtems/score/coremutex.h
new file mode 100644
index 0000000000..9f3ad2b46d
--- /dev/null
+++ b/cpukit/score/include/rtems/score/coremutex.h
@@ -0,0 +1,172 @@
+/* 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_MUTEX_h
+#define __RTEMS_CORE_MUTEX_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/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_CEILING_VIOLATED
+} 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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coremutex.inl>
+#endif
+
+#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..f98673d514
--- /dev/null
+++ b/cpukit/score/include/rtems/score/coresem.h
@@ -0,0 +1,156 @@
+/* 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_CORE_COUNTING_SEMAPHORE_h
+#define __RTEMS_CORE_COUNTING_SEMAPHORE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/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
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/coresem.inl>
+#endif
+
+#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
new file mode 100644
index 0000000000..a5a8d3f0c2
--- /dev/null
+++ b/cpukit/score/include/rtems/score/heap.h
@@ -0,0 +1,226 @@
+/* heap.h
+ *
+ * This include file contains the information pertaining to the Heap
+ * Handler. A heap is a doubly linked list of variable size
+ * blocks which are allocated using the first fit method. Garbage
+ * collection is performed each time a block is returned to the heap by
+ * coalescing neighbor blocks. Control information for both allocated
+ * and unallocated blocks is contained in the heap space. A heap header
+ * contains control information for the heap.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_HEAP_h
+#define __RTEMS_HEAP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Status codes for heap_extend
+ */
+
+typedef enum {
+ HEAP_EXTEND_SUCCESSFUL,
+ HEAP_EXTEND_ERROR,
+ HEAP_EXTEND_NOT_IMPLEMENTED
+} Heap_Extend_status;
+
+/*
+ * Constants used in the size/used field of each heap block to
+ * indicate when a block is free or in use.
+ */
+
+#define HEAP_BLOCK_USED 1 /* indicates block is in use */
+#define HEAP_BLOCK_FREE 0 /* indicates block is free */
+
+/*
+ * The size/used field value for the dummy front and back flags.
+ */
+
+#define HEAP_DUMMY_FLAG (0 + HEAP_BLOCK_USED)
+
+/*
+ * The following constants reflect various requirements of the
+ * heap data structures which impact the management of a heap.
+ *
+ * NOTE: Because free block overhead is greater than used block
+ * overhead AND a portion of the allocated space is from
+ * the extra free block overhead, the absolute lower bound
+ * of the minimum fragment size is equal to the size of
+ * the free block overhead.
+ */
+
+#define HEAP_OVERHEAD \
+ (sizeof( unsigned32 ) * 2) /* size dummy first and last blocks */
+#define HEAP_BLOCK_USED_OVERHEAD \
+ (sizeof( void * ) * 2) /* num bytes overhead in used block */
+#define HEAP_MINIMUM_SIZE \
+ (HEAP_OVERHEAD + sizeof (Heap_Block))
+ /* min number of bytes the user may */
+ /* specify for the heap size */
+
+/*
+ * The following defines the data structure used to manage
+ * individual blocks in a heap. When the block is allocated, the
+ * next and previous fields are not used by the Heap Handler
+ * and thus the address returned for the block starts at
+ * the address of the next field.
+ *
+ * NOTE: The next and previous pointers are only valid when the
+ * block is free. Caution must be exercised to insure that
+ * allocated blocks are large enough to contain them and
+ * that they are not accidentally overwritten when the
+ * block is actually allocated.
+ */
+
+typedef struct Heap_Block_struct Heap_Block;
+
+struct Heap_Block_struct {
+ unsigned32 back_flag; /* size and status of prev block */
+ unsigned32 front_flag; /* size and status of block */
+ Heap_Block *next; /* pointer to next block */
+ Heap_Block *previous; /* pointer to previous block */
+};
+
+/*
+ * The following defines the control block used to manage each heap.
+ *
+ * NOTE:
+ *
+ * This structure is layed out such that it can be used a a dummy
+ * first and last block on the free block chain. The extra padding
+ * insures the dummy last block is the correct size.
+ *
+ * The first Heap_Block starts at first while the second starts at
+ * final. This is effectively the same trick as is used in the Chain
+ * Handler.
+ */
+
+typedef struct {
+ Heap_Block *start; /* first valid block address in heap */
+ Heap_Block *final; /* last valid block address in heap */
+
+ Heap_Block *first; /* pointer to first block in heap */
+ Heap_Block *permanent_null; /* always NULL pointer */
+ Heap_Block *last; /* pointer to last block in heap */
+ unsigned32 page_size; /* allocation unit */
+ unsigned32 reserved;
+} Heap_Control;
+
+/*
+ * _Heap_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_heap record to manage the
+ * contiguous heap of size bytes which starts at starting_address.
+ * Blocks of memory are allocated from the heap in multiples of
+ * page_size byte units.
+ */
+
+unsigned32 _Heap_Initialize(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 page_size
+);
+
+/*
+ * _Heap_Extend
+ *
+ * DESCRIPTION:
+ *
+ * This routine grows the_heap memory area using the size bytes which
+ * begin at starting_address.
+ */
+
+Heap_Extend_status _Heap_Extend(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 *amount_extended
+);
+
+/*
+ * _Heap_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * DESCRIPTION:
+ *
+ * This function attempts to allocate a block of size bytes from
+ * the_heap. If insufficient memory is free in the_heap to allocate
+ * a block of the requested size, then NULL is returned.
+ */
+
+void *_Heap_Allocate(
+ Heap_Control *the_heap,
+ unsigned32 size
+);
+
+/*
+ * _Heap_Size_of_user_area
+ *
+ * DESCRIPTION:
+ *
+ * This kernel routine sets size to the size of the given heap block.
+ * It returns TRUE if the starting_address is in the heap, and FALSE
+ * otherwise.
+ */
+
+boolean _Heap_Size_of_user_area(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 *size
+);
+
+/*
+ * _Heap_Free
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the block of memory which begins
+ * at starting_address to the_heap. Any coalescing which is
+ * possible with the freeing of this routine is performed.
+ */
+
+boolean _Heap_Free(
+ Heap_Control *the_heap,
+ void *start_address
+);
+
+/*
+ * _Heap_Walk
+ *
+ * DESCRIPTION:
+ *
+ * This routine walks the heap to verify its integrity.
+ */
+
+void _Heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/heap.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/interr.h b/cpukit/score/include/rtems/score/interr.h
new file mode 100644
index 0000000000..b322aefe73
--- /dev/null
+++ b/cpukit/score/include/rtems/score/interr.h
@@ -0,0 +1,95 @@
+/* interr.h
+ *
+ * This include file contains constants and prototypes related
+ * to the Internal Error Handler.
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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_ERROR_POSIX_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_ERROR_BAD_STACK_HOOK
+} 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.
+ */
+
+SCORE_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
new file mode 100644
index 0000000000..4e6c5c6f94
--- /dev/null
+++ b/cpukit/score/include/rtems/score/isr.h
@@ -0,0 +1,224 @@
+/* isr.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the management of processor interrupt levels. This handler
+ * supports interrupt critical sections, vectoring of user interrupt
+ * handlers, nesting of interrupts, and manipulating interrupt levels.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_h
+#define __ISR_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * the interrupt level portion of the status register.
+ */
+
+typedef unsigned32 ISR_Level;
+
+/*
+ * The following type defines the type used to manage the vectors.
+ */
+
+typedef unsigned32 ISR_Vector_number;
+
+/*
+ * Return type for ISR Handler
+ */
+
+typedef void ISR_Handler;
+
+/*
+ * Pointer to an ISR Handler
+ */
+
+typedef ISR_Handler ( *ISR_Handler_entry )(
+ ISR_Vector_number
+ );
+/*
+ * This constant promotes out the number of vectors truly supported by
+ * the current CPU being used. This is usually the number of distinct vectors
+ * the cpu can vector.
+ */
+
+#define ISR_NUMBER_OF_VECTORS CPU_INTERRUPT_NUMBER_OF_VECTORS
+
+/*
+ * This constant promotes out the highest valid interrupt vector number.
+ */
+
+#define ISR_INTERRUPT_MAXIMUM_VECTOR_NUMBER CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER
+
+/*
+ * The following is TRUE if signals have been sent to the currently
+ * executing thread by an ISR handler.
+ */
+
+SCORE_EXTERN boolean _ISR_Signals_to_thread_executing;
+
+/*
+ * The following contains the interrupt service routine nest level.
+ * When this variable is zero, a thread is executing.
+ */
+
+SCORE_EXTERN unsigned32 _ISR_Nest_level;
+
+/*
+ * The following declares the Vector Table. Application
+ * interrupt service routines are vectored by the ISR Handler via this table.
+ */
+
+SCORE_EXTERN ISR_Handler_entry _ISR_Vector_table[ ISR_NUMBER_OF_VECTORS ];
+
+/*
+ * _ISR_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _ISR_Handler_initialization ( void );
+
+/*
+ * _ISR_Disable
+ *
+ * DESCRIPTION:
+ *
+ * This routine disables all interrupts so that a critical section
+ * of code can be executing without being interrupted. Upon return,
+ * the argument _level will contain the previous interrupt mask level.
+ */
+
+#define _ISR_Disable( _level ) \
+ _CPU_ISR_Disable( _level )
+
+/*
+ * _ISR_Enable
+ *
+ * DESCRIPTION:
+ *
+ * This routine enables interrupts to the previous interrupt mask
+ * LEVEL. It is used at the end of a critical section of code to
+ * enable interrupts so they can be processed again.
+ */
+
+#define _ISR_Enable( _level ) \
+ _CPU_ISR_Enable( _level )
+
+/*
+ * _ISR_Flash
+ *
+ * DESCRIPTION:
+ *
+ * This routine temporarily enables interrupts to the previous
+ * interrupt mask level and then disables all interrupts so that
+ * the caller can continue into the second part of a critical
+ * section. This routine is used to temporarily enable interrupts
+ * during a long critical section. It is used in long sections of
+ * critical code when a point is reached at which interrupts can
+ * be temporarily enabled. Deciding where to flash interrupts
+ * in a long critical section is often difficult and the point
+ * must be selected with care to insure that the critical section
+ * properly protects itself.
+ */
+
+#define _ISR_Flash( _level ) \
+ _CPU_ISR_Flash( _level )
+
+/*
+ * _ISR_Install_vector
+ *
+ * DESCRIPTION:
+ *
+ * This routine installs new_handler as the interrupt service routine
+ * for the specified vector. The previous interrupt service routine is
+ * returned as old_handler.
+ */
+
+#define _ISR_Install_vector( _vector, _new_handler, _old_handler ) \
+ _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:
+ *
+ * This routine sets the current interrupt level to that specified
+ * by new_level. The new interrupt level is effective when the
+ * routine exits.
+ */
+
+#define _ISR_Set_level( _new_level ) \
+ _CPU_ISR_Set_level( _new_level )
+
+/*
+ * _ISR_Handler
+ *
+ * DESCRIPTION:
+ *
+ * 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
+ * interrupt service routine returns control to this routine, it
+ * will determine if a thread dispatch is necessary. If so, it will
+ * insure that the necessary thread scheduling operations are
+ * performed when the outermost interrupt service routine exits.
+ *
+ * NOTE: Implemented in assembly language.
+ */
+
+void _ISR_Handler( void );
+
+/*
+ * _ISR_Dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine provides a wrapper so that the routine
+ * _Thread_Dispatch can be invoked when a reschedule is necessary
+ * at the end of the outermost interrupt service routine. This
+ * wrapper is necessary to establish the processor context needed
+ * by _Thread_Dispatch and to save the processor context which is
+ * corrupted by _Thread_Dispatch. This context typically consists
+ * of registers which are not preserved across routine invocations.
+ *
+ * NOTE: Implemented in assembly language.
+ */
+
+void _ISR_Dispatch( void );
+
+#include <rtems/score/isr.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/mpci.h b/cpukit/score/include/rtems/score/mpci.h
new file mode 100644
index 0000000000..1d5578b21e
--- /dev/null
+++ b/cpukit/score/include/rtems/score/mpci.h
@@ -0,0 +1,412 @@
+/* mpci.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the MPCI layer. It provides mechanisms to utilize packets.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MPCI_h
+#define __MPCI_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/mppkt.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/coresem.h>
+
+/*
+ * The following constants define the stack size requirements for
+ * the system threads.
+ */
+
+#define MPCI_RECEIVE_SERVER_STACK_SIZE \
+ ( STACK_MINIMUM_SIZE + \
+ CPU_MPCI_RECEIVE_SERVER_EXTRA_STACK + \
+ _CPU_Table.extra_mpci_receive_server_stack \
+ )
+
+/*
+ * The following defines the node number used when a broadcast is desired.
+ */
+
+#define MPCI_ALL_NODES 0
+
+/*
+ * For packets associated with requests that don't already have a timeout,
+ * use the one specified by this MPCI driver. The value specified by
+ * the MPCI driver sets an upper limit on how long a remote request
+ * should take to complete.
+ */
+
+#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 * );
+
+/*
+ * The following enumerated type defines the list of
+ * internal MP operations.
+ */
+
+typedef enum {
+ MPCI_PACKETS_SYSTEM_VERIFY = 0
+} MPCI_Internal_Remote_operations;
+
+/*
+ * The following data structure defines the packet used to perform
+ * remote event operations.
+ */
+
+typedef struct {
+ MP_packet_Prefix Prefix;
+ MPCI_Internal_Remote_operations operation;
+ unsigned32 maximum_nodes;
+ unsigned32 maximum_global_objects;
+} MPCI_Internal_packet;
+
+/*
+ * This is the core semaphore which the MPCI Receive Server blocks on.
+ */
+
+SCORE_EXTERN CORE_semaphore_Control _MPCI_Semaphore;
+/*
+ * The following thread queue is used to maintain a list of tasks
+ * which currently have outstanding remote requests.
+ */
+
+SCORE_EXTERN Thread_queue_Control _MPCI_Remote_blocked_threads;
+
+/*
+ * The following define the internal pointers to the user's
+ * configuration information.
+ */
+
+SCORE_EXTERN MPCI_Control *_MPCI_table;
+
+/*
+ * The following points to the MPCI Receive Server.
+ */
+
+SCORE_EXTERN Thread_Control *_MPCI_Receive_server_tcb;
+
+/*
+ * The following table contains the process packet routines provided
+ * by each object that supports MP operations.
+ */
+
+SCORE_EXTERN MPCI_Packet_processor
+ _MPCI_Packet_processors[MP_PACKET_CLASSES_LAST+1];
+
+/*
+ * _MPCI_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table,
+ unsigned32 timeout_status
+);
+
+/*
+ * _MPCI_Create_server
+ *
+ * DESCRIPTION:
+ *
+ * This routine creates the packet receive server used in MP systems.
+ */
+
+void _MPCI_Create_server( void );
+
+/*
+ * _MPCI_Initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the MPCI driver by
+ * invoking the user provided MPCI initialization callout.
+ */
+
+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_class,
+ MPCI_Packet_processor the_packet_processor
+
+);
+
+/*
+ * _MPCI_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This function obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+MP_packet_Prefix *_MPCI_Get_packet ( void );
+
+/*
+ * _MPCI_Return_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a packet by invoking the user provided
+ * MPCI return packet callout.
+ */
+
+void _MPCI_Return_packet (
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a process packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_process_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a request packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+unsigned32 _MPCI_Send_request_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet,
+ States_Control extra_state
+);
+
+/*
+ * _MPCI_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a response packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_response_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+);
+
+/*
+ * _MPCI_Receive_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine receives a packet by invoking the user provided
+ * MPCI receive callout.
+ */
+
+MP_packet_Prefix *_MPCI_Receive_packet ( void );
+
+/*
+ * _MPCI_Process_response
+ *
+ * DESCRIPTION:
+ *
+ * This routine obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+Thread_Control *_MPCI_Process_response (
+ MP_packet_Prefix *the_packet
+);
+
+/*PAGE
+ *
+ * _MPCI_Receive_server
+ *
+ */
+
+Thread _MPCI_Receive_server(
+ unsigned32 ignored
+);
+
+/*PAGE
+ *
+ * _MPCI_Announce
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _MPCI_Announce ( void );
+
+/*
+ * _MPCI_Internal_packets_Send_process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * process operation can be performed on another node.
+ */
+
+void _MPCI_Internal_packets_Send_process_packet (
+ MPCI_Internal_Remote_operations operation
+);
+
+/*
+ * _MPCI_Internal_packets_Send_request_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive operation can be initiated on another node.
+ *
+ * This routine is not needed since there are no request
+ * packets to be sent by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Send_response_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs a remote procedure call so that a
+ * directive can be performed on another node.
+ *
+ * This routine is not needed since there are no response
+ * packets to be sent by this manager.
+ */
+
+/*
+ *
+ * _MPCI_Internal_packets_Process_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the actions specific to this package for
+ * the request from another node.
+ */
+
+void _MPCI_Internal_packets_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+);
+
+/*
+ * _MPCI_Internal_packets_Send_object_was_deleted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked indirectly by the thread queue
+ * when a proxy has been removed from the thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Send_extract_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task is deleted and it
+ * has a proxy which must be removed from a thread queue and
+ * the remote node must be informed of this.
+ *
+ * This routine is not needed since there are no objects
+ * deleted by this manager.
+ */
+
+/*
+ * _MPCI_Internal_packets_Get_packet
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to obtain a internal threads mp packet.
+ */
+
+ MPCI_Internal_packet *_MPCI_Internal_packets_Get_packet ( void );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/mppkt.h b/cpukit/score/include/rtems/score/mppkt.h
new file mode 100644
index 0000000000..2e98357afe
--- /dev/null
+++ b/cpukit/score/include/rtems/score/mppkt.h
@@ -0,0 +1,101 @@
+/* mppkt.h
+ *
+ * This package is the specification for the Packet Handler.
+ * 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MP_PACKET_h
+#define __MP_PACKET_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following enumerated type defines the packet classes.
+ *
+ * NOTE: In general, each class corresponds to a manager
+ * which supports global operations. Each manager
+ * defines the set of supported operations.
+ */
+
+typedef enum {
+ MP_PACKET_MPCI_INTERNAL = 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_MPCI_INTERNAL
+#define MP_PACKET_CLASSES_LAST MP_PACKET_SIGNAL
+
+/*
+ * The following record contains the prefix for every packet
+ * 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
+ * encountered yet (i960CA).
+ */
+
+typedef struct {
+ MP_packet_Classes the_class;
+ Objects_Id id;
+ Objects_Id source_tid;
+ Priority_Control source_priority;
+ unsigned32 return_code;
+ unsigned32 length;
+ unsigned32 to_convert;
+ Watchdog_Interval timeout;
+} MP_packet_Prefix;
+
+/*
+ * An MPCI must support packets of at least this size.
+ */
+
+#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
+ * MP_PACKET_MINIMUN_HETERO_CONVERSION unsigned32's, some of the "extra" data
+ * may a user message buffer which is not automatically endian swapped.
+ */
+
+#define MP_PACKET_MINIMUN_HETERO_CONVERSION \
+ ( sizeof( MP_packet_Prefix ) / sizeof( unsigned32 ) )
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/mppkt.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/object.h b/cpukit/score/include/rtems/score/object.h
new file mode 100644
index 0000000000..7364639391
--- /dev/null
+++ b/cpukit/score/include/rtems/score/object.h
@@ -0,0 +1,397 @@
+/* object.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Object Handler. This Handler provides mechanisms which
+ * can be used to initialize and manipulate all objects which have
+ * ids.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_h
+#define __OBJECTS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/chain.h>
+
+/*
+ * The following type defines the control block used to manage
+ * object names.
+ */
+
+typedef void * Objects_Name;
+
+/*
+ * Space for object names is allocated in multiples of this.
+ *
+ * NOTE: Must be a power of 2. Matches the name manipulation routines.
+ */
+
+#define OBJECTS_NAME_ALIGNMENT sizeof( unsigned32 )
+
+/*
+ * Functions which compare names are prototyped like this.
+ */
+
+typedef boolean (*Objects_Name_comparators)(
+ void * /* name_1 */,
+ void * /* name_2 */,
+ unsigned32 /* length */
+);
+
+/*
+ * The following type defines the control block used to manage
+ * object IDs. The format is as follows (0=LSB):
+ *
+ * Bits 0 .. 15 = index
+ * Bits 16 .. 25 = node
+ * Bits 26 .. 31 = class
+ */
+
+typedef unsigned32 Objects_Id;
+
+#define OBJECTS_INDEX_START_BIT 0
+#define OBJECTS_NODE_START_BIT 16
+#define OBJECTS_CLASS_START_BIT 26
+
+#define OBJECTS_INDEX_MASK 0x0000ffff
+#define OBJECTS_NODE_MASK 0x03ff0000
+#define OBJECTS_CLASS_MASK 0xfc000000
+
+#define OBJECTS_INDEX_VALID_BITS 0x0000ffff
+#define OBJECTS_NODE_VALID_BITS 0x000003ff
+#define OBJECTS_CLASS_VALID_BITS 0x000000cf
+
+/*
+ * This enumerated type is used in the class field of the object ID.
+ */
+
+typedef enum {
+ OBJECTS_NO_CLASS = 0,
+ OBJECTS_INTERNAL_THREADS = 1,
+ OBJECTS_RTEMS_TASKS = 2,
+ OBJECTS_POSIX_THREADS = 3,
+ OBJECTS_RTEMS_TIMERS = 4,
+ OBJECTS_RTEMS_SEMAPHORES = 5,
+ OBJECTS_RTEMS_MESSAGE_QUEUES = 6,
+ OBJECTS_RTEMS_PARTITIONS = 7,
+ OBJECTS_RTEMS_REGIONS = 8,
+ OBJECTS_RTEMS_PORTS = 9,
+ OBJECTS_RTEMS_PERIODS = 10,
+ OBJECTS_RTEMS_EXTENSIONS = 11,
+ OBJECTS_POSIX_KEYS = 12,
+ OBJECTS_POSIX_INTERRUPTS = 13,
+ OBJECTS_POSIX_MESSAGE_QUEUES = 14,
+ OBJECTS_POSIX_MUTEXES = 15,
+ OBJECTS_POSIX_SEMAPHORES = 16,
+ OBJECTS_POSIX_CONDITION_VARIABLES = 17
+} Objects_Classes;
+
+#define OBJECTS_CLASSES_FIRST OBJECTS_NO_CLASS
+#define OBJECTS_CLASSES_LAST OBJECTS_POSIX_CONDITION_VARIABLES
+#define OBJECTS_CLASSES_FIRST_THREAD_CLASS OBJECTS_INTERNAL_THREADS
+#define OBJECTS_CLASSES_LAST_THREAD_CLASS OBJECTS_POSIX_THREADS
+
+/*
+ * This enumerated type lists the locations which may be returned
+ * by _Objects_Get. These codes indicate the success of locating
+ * an object with the specified ID.
+ */
+
+typedef enum {
+ OBJECTS_LOCAL = 0, /* object is local */
+ OBJECTS_REMOTE = 1, /* object is remote */
+ OBJECTS_ERROR = 2 /* id was invalid */
+} Objects_Locations;
+
+/*
+ * The following defines the Object Control Block used to manage
+ * each object local to this node.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ Objects_Id id;
+ Objects_Name name;
+} Objects_Control;
+
+/*
+ * The following defines the structure for the information used to
+ * manage each class of objects.
+ */
+
+typedef struct {
+ Objects_Classes the_class; /* Class of this object */
+ Objects_Id minimum_id; /* minimum valid id of this type */
+ Objects_Id maximum_id; /* maximum valid id of this type */
+ unsigned32 maximum; /* maximum number of objects */
+ Objects_Control **local_table; /* table of local object pointers */
+ Objects_Name *name_table; /* table of local object names */
+ Chain_Control *global_table; /* pointer to global table */
+ Chain_Control Inactive; /* chain of inactive ctl blocks */
+ boolean is_string; /* TRUE if names are strings */
+ unsigned32 name_length; /* maximum length of names */
+ boolean is_thread; /* TRUE if these are threads */
+ /* irregardless of API */
+} Objects_Information;
+
+/*
+ * The following defines the data storage which contains the
+ * node number of the local node.
+ */
+
+SCORE_EXTERN unsigned32 _Objects_Local_node;
+SCORE_EXTERN unsigned32 _Objects_Maximum_nodes;
+
+/*
+ * The following is the list of information blocks for each object
+ * class. From the ID, we can go to one of these information blocks,
+ * and obtain a pointer to the appropriate object control block.
+ */
+
+SCORE_EXTERN Objects_Information
+ *_Objects_Information_table[OBJECTS_CLASSES_LAST + 1];
+
+/*
+ * The following defines the constant which may be used
+ * with _Objects_Get to manipulate the calling task.
+ *
+ */
+
+#define OBJECTS_ID_OF_SELF ((Objects_Id) 0)
+
+/*
+ * The following define the constants which may be used in name searches.
+ */
+
+#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 OBJECTS_ID_INITIAL_INDEX (0)
+#define OBJECTS_ID_FINAL_INDEX (0xffff)
+
+#define OBJECTS_ID_INITIAL(_class, _node) \
+ _Objects_Build_id( (_class), (_node), OBJECTS_ID_INITIAL_INDEX )
+
+#define OBJECTS_ID_FINAL ((Objects_Id)~0)
+
+/*
+ * _Objects_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This function performs the initialization necessary for this handler.
+ *
+ */
+
+void _Objects_Handler_initialization(
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+);
+
+/*
+ * _Objects_Initialize_information
+ *
+ * DESCRIPTION:
+ *
+ * This function initializes an object class information record.
+ * SUPPORTS_GLOBAL is TRUE if the object class supports global
+ * objects, and FALSE otherwise. Maximum indicates the number
+ * of objects required in this class and size indicates the size
+ * in bytes of each control block for this object class. The
+ * name length and string designator are also set. In addition,
+ * the class may be a task, therefore this information is also included.
+ */
+
+void _Objects_Initialize_information (
+ Objects_Information *information,
+ Objects_Classes the_class,
+ boolean supports_global,
+ unsigned32 maximum,
+ unsigned32 size,
+ boolean is_string,
+ unsigned32 maximum_name_length,
+ boolean is_task
+);
+
+/*
+ * _Objects_Clear_name
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Clear_name(
+ void *name,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Copy_name_string
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_string(
+ void *source,
+ void *destination
+);
+
+/*
+ * _Objects_Copy_name_raw
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_raw(
+ void *source,
+ void *destination,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Compare_name_string
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_string(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+);
+
+/*
+ * _Objects_Compare_name_raw
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_raw(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+);
+/*
+ * _Objects_Name_to_id
+ *
+ * DESCRIPTION:
+ *
+ * This function implements the common portion of the object
+ * identification directives. This directive returns the object
+ * id associated with name. If more than one object of this class
+ * is named name, then the object to which the id belongs is
+ * arbitrary. Node indicates the extent of the search for the
+ * id of the object named name. If the object class supports global
+ * objects, then the search can be limited to a particular node
+ * or allowed to encompass all nodes.
+ *
+ */
+
+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,
+ Objects_Id *id
+);
+
+/*
+ * _Objects_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps object ids to object control blocks.
+ * If id corresponds to a local object, then it returns
+ * the_object control pointer which maps to id and location
+ * is set to OBJECTS_LOCAL. If the object class supports global
+ * objects and the object id is global and resides on a remote
+ * node, then location is set to OBJECTS_REMOTE, and the_object
+ * is undefined. Otherwise, location is set to OBJECTS_ERROR
+ * and the_object is undefined.
+ *
+ */
+
+Objects_Control *_Objects_Get (
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location
+);
+
+/*
+ * _Objects_Get_next
+ *
+ * DESCRIPTION:
+ *
+ * Like _Objects_Get, but is used to find "next" open object.
+ *
+ */
+
+Objects_Control *_Objects_Get_next(
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location_p,
+ Objects_Id *next_id_p
+);
+
+/*
+ * _Objects_Get_information
+ *
+ * DESCRIPTION:
+ *
+ * Returns the information control block for the class of objects
+ * corresponding to this id.
+ */
+
+Objects_Information *_Objects_Get_information(
+ Objects_Id id
+);
+
+/*
+ * Pieces of object.inl are promoted out to the user
+ */
+
+#include <rtems/score/object.inl>
+#include <rtems/score/objectmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/objectmp.h b/cpukit/score/include/rtems/score/objectmp.h
new file mode 100644
index 0000000000..d84f4c3caa
--- /dev/null
+++ b/cpukit/score/include/rtems/score/objectmp.h
@@ -0,0 +1,152 @@
+/* objectmp.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the manipulation of Global RTEMS Objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_OBJECTS_MP_h
+#define __RTEMS_OBJECTS_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This defines the Global Object Control Block used to manage
+ * objects resident on other nodes.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ unsigned32 name; /* XXX broken but works */
+ /* XXX If any API is MP with variable length names .. BOOM!!!! */
+} Objects_MP_Control;
+
+/*
+ * _Objects_MP_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine intializes the inactive global object chain
+ * based on the maximum number of global objects configured.
+ */
+
+void _Objects_MP_Handler_initialization (
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+);
+
+/*PAGE
+ *
+ * _Objects_MP_Open
+ *
+ * DESCRIPTION:
+ *
+ * This routine place the specified global object in the
+ * specified information table.
+ */
+
+void _Objects_MP_Open (
+ Objects_Information *information,
+ Objects_MP_Control *the_global_object,
+ unsigned32 the_name, /* XXX -- wrong for variable */
+ Objects_Id the_id
+);
+
+/*
+ * _Objects_MP_Allocate_and_open
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates a global object control block
+ * and places it in the specified information table. If the
+ * allocation fails, then is_fatal_error determines the
+ * error processing actions taken.
+ */
+
+boolean _Objects_MP_Allocate_and_open (
+ Objects_Information *information,
+ unsigned32 the_name, /* XXX -- wrong for variable length */
+ Objects_Id the_id,
+ boolean is_fatal_error
+);
+
+/*
+ * _Objects_MP_Close
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes a global object from the specified
+ * information table and deallocates the global object control block.
+ */
+
+void _Objects_MP_Close (
+ Objects_Information *information,
+ Objects_Id the_id
+);
+
+/*
+ * _Objects_MP_Global_name_search
+ *
+ * DESCRIPTION:
+ *
+ * This routine looks for the object with the_name in the global
+ * object tables indicated by information. It returns the ID of the
+ * object with that name if one is found.
+ */
+
+Objects_Name_to_id_errors _Objects_MP_Global_name_search (
+ Objects_Information *information,
+ Objects_Name the_name,
+ unsigned32 nodes_to_search,
+ Objects_Id *the_id
+);
+
+/*
+ * _Objects_MP_Is_remote
+ *
+ * DESCRIPTION:
+ *
+ * This function searches the Global Object Table managed
+ * by information for the object indicated by ID. If the object
+ * is found, then location is set to objects_remote, otherwise
+ * location is set to objects_error. In both cases, the_object
+ * is undefined.
+ */
+
+void _Objects_MP_Is_remote (
+ Objects_Information *information,
+ Objects_Id the_id,
+ Objects_Locations *location,
+ Objects_Control **the_object
+);
+
+/*
+ * The following chain header is used to manage the set of
+ * inactive global object control blocks.
+ */
+
+SCORE_EXTERN unsigned32 _Objects_MP_Maximum_global_objects;
+SCORE_EXTERN Chain_Control _Objects_MP_Inactive_global_objects;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/objectmp.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/priority.h b/cpukit/score/include/rtems/score/priority.h
new file mode 100644
index 0000000000..f1fb7b5f01
--- /dev/null
+++ b/cpukit/score/include/rtems/score/priority.h
@@ -0,0 +1,97 @@
+/* priority.h
+ *
+ * This include file contains all thread priority manipulation routines.
+ * This Handler provides mechanisms which can be used to
+ * initialize and manipulate thread priorities.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_h
+#define __PRIORITY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage
+ * thread priorities.
+ *
+ * NOTE: Priority 0 is reserved for internal threads only.
+ */
+
+typedef unsigned32 Priority_Control;
+
+#define PRIORITY_MINIMUM 0 /* highest thread priority */
+#define PRIORITY_MAXIMUM 255 /* lowest thread priority */
+
+/*
+ * The following record defines the information associated with
+ * each thread to manage its interaction with the priority bit maps.
+ */
+
+typedef struct {
+ Priority_Bit_map_control *minor; /* addr of minor bit map slot */
+ Priority_Bit_map_control ready_major; /* priority bit map ready mask */
+ Priority_Bit_map_control ready_minor; /* priority bit map ready mask */
+ Priority_Bit_map_control block_major; /* priority bit map block mask */
+ Priority_Bit_map_control block_minor; /* priority bit map block mask */
+} Priority_Information;
+
+/*
+ * The following data items are the priority bit map.
+ * Each of the sixteen bits used in the _Priority_Major_bit_map is
+ * associated with one of the sixteen entries in the _Priority_Bit_map.
+ * Each bit in the _Priority_Bit_map indicates whether or not there are
+ * threads ready at a particular priority. The mapping of
+ * individual priority levels to particular bits is processor
+ * dependent as is the value of each bit used to indicate that
+ * threads are ready at that priority.
+ */
+
+SCORE_EXTERN volatile Priority_Bit_map_control _Priority_Major_bit_map;
+SCORE_EXTERN Priority_Bit_map_control
+ _Priority_Bit_map[16] CPU_STRUCTURE_ALIGNMENT;
+
+/*
+ * The definition of the Priority_Bit_map_control type is CPU dependent.
+ *
+ */
+
+/*
+ * Priority Bitfield Manipulation Routines
+ *
+ * NOTE:
+ *
+ * These may simply be pass throughs to CPU dependent routines.
+ */
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == FALSE )
+
+#define _Priority_Mask( _bit_number ) \
+ _CPU_Priority_Mask( _bit_number )
+
+#define _Priority_Bits_index( _priority ) \
+ _CPU_Priority_bits_index( _priority )
+
+#endif
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/priority.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/stack.h b/cpukit/score/include/rtems/score/stack.h
new file mode 100644
index 0000000000..eb9a68fe8c
--- /dev/null
+++ b/cpukit/score/include/rtems/score/stack.h
@@ -0,0 +1,50 @@
+/* stack.h
+ *
+ * This include file contains all information about the thread
+ * Stack Handler. This Handler provides mechanisms which can be used to
+ * initialize and utilize stacks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_h
+#define __STACK_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following constant defines the minimum stack size which every
+ * thread must exceed.
+ */
+
+#define STACK_MINIMUM_SIZE CPU_STACK_MINIMUM_SIZE
+
+/*
+ * The following defines the control block used to manage each stack.
+ */
+
+typedef struct {
+ unsigned32 size; /* stack size */
+ void *area; /* low memory addr of stack */
+} Stack_Control;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/stack.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/states.h b/cpukit/score/include/rtems/score/states.h
new file mode 100644
index 0000000000..02c0f0c590
--- /dev/null
+++ b/cpukit/score/include/rtems/score/states.h
@@ -0,0 +1,84 @@
+/* states.h
+ *
+ * This include file contains thread execution state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_STATES_h
+#define __RTEMS_STATES_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following type defines the control block used to manage a
+ * thread's state.
+ */
+
+typedef unsigned32 States_Control;
+
+/*
+ * The following constants define the individual states which may be
+ * be used to compose and manipulate a thread's state.
+ */
+
+#define STATES_ALL_SET 0xfffff /* all states */
+#define STATES_READY 0x00000 /* ready to run */
+#define STATES_DORMANT 0x00001 /* created not started */
+#define STATES_SUSPENDED 0x00002 /* waiting for resume */
+#define STATES_TRANSIENT 0x00004 /* in transition */
+#define STATES_DELAYING 0x00008 /* wait for timeout */
+#define STATES_WAITING_FOR_TIME 0x00010 /* wait for TOD */
+#define STATES_WAITING_FOR_BUFFER 0x00020
+#define STATES_WAITING_FOR_SEGMENT 0x00040
+#define STATES_WAITING_FOR_MESSAGE 0x00080
+#define STATES_WAITING_FOR_EVENT 0x00100
+#define STATES_WAITING_FOR_SEMAPHORE 0x00200
+#define STATES_WAITING_FOR_MUTEX 0x00400
+#define STATES_WAITING_FOR_CONDITION_VARIABLE 0x00800
+#define STATES_WAITING_FOR_JOIN_AT_EXIT 0x01000
+#define STATES_WAITING_FOR_RPC_REPLY 0x02000
+#define STATES_WAITING_FOR_PERIOD 0x04000
+#define STATES_WAITING_FOR_SIGNAL 0x08000
+#define STATES_INTERRUPTIBLE_BY_SIGNAL 0x10000
+
+#define STATES_LOCALLY_BLOCKED ( STATES_WAITING_FOR_BUFFER | \
+ STATES_WAITING_FOR_SEGMENT | \
+ STATES_WAITING_FOR_MESSAGE | \
+ STATES_WAITING_FOR_SEMAPHORE | \
+ STATES_WAITING_FOR_MUTEX | \
+ STATES_WAITING_FOR_CONDITION_VARIABLE | \
+ STATES_WAITING_FOR_JOIN_AT_EXIT | \
+ STATES_WAITING_FOR_SIGNAL )
+
+#define STATES_WAITING_ON_THREAD_QUEUE \
+ ( STATES_LOCALLY_BLOCKED | \
+ STATES_WAITING_FOR_RPC_REPLY )
+
+#define STATES_BLOCKED ( STATES_DELAYING | \
+ STATES_WAITING_FOR_TIME | \
+ STATES_WAITING_FOR_PERIOD | \
+ STATES_WAITING_FOR_EVENT | \
+ STATES_WAITING_ON_THREAD_QUEUE | \
+ STATES_INTERRUPTIBLE_BY_SIGNAL )
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/states.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/sysstate.h b/cpukit/score/include/rtems/score/sysstate.h
new file mode 100644
index 0000000000..38e6ce36f1
--- /dev/null
+++ b/cpukit/score/include/rtems/score/sysstate.h
@@ -0,0 +1,67 @@
+/* sysstates.h
+ *
+ * This include file contains information regarding the system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SYSTEM_STATE_h
+#define __RTEMS_SYSTEM_STATE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* types */
+
+/* enumerated constants */
+
+/*
+ * The following type defines the possible system states.
+ */
+
+typedef enum {
+ SYSTEM_STATE_BEFORE_INITIALIZATION, /* start -> end of 1st init part */
+ SYSTEM_STATE_BEFORE_MULTITASKING, /* end of 1st -> beginning of 2nd */
+ SYSTEM_STATE_BEGIN_MULTITASKING, /* just before multitasking starts */
+ SYSTEM_STATE_UP, /* normal operation */
+ SYSTEM_STATE_SHUTDOWN, /* shutdown */
+ SYSTEM_STATE_FAILED /* fatal error occurred */
+} System_state_Codes;
+
+#define SYSTEM_STATE_CODES_FIRST SYSTEM_STATE_BEFORE_INITIALIZATION
+#define SYSTEM_STATE_CODES_LAST SYSTEM_STATE_FAILED
+
+/*
+ * The following variable indicates whether or not this is
+ * an multiprocessing system.
+ */
+
+SCORE_EXTERN boolean _System_state_Is_multiprocessing;
+
+/*
+ * The following variable contains the current system state.
+ */
+
+SCORE_EXTERN System_state_Codes _System_state_Current;
+
+/*
+ * Make it possible for the application to get the system state information.
+ */
+
+#include <rtems/score/sysstate.inl>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h
new file mode 100644
index 0000000000..23b1242c0d
--- /dev/null
+++ b/cpukit/score/include/rtems/score/thread.h
@@ -0,0 +1,630 @@
+/* thread.h
+ *
+ * This include file contains all constants and structures associated
+ * with the thread control block.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_h
+#define __THREAD_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/context.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/states.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following defines the "return type" of a thread.
+ */
+
+typedef void 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 enum {
+ THREAD_START_NUMERIC,
+ THREAD_START_POINTER,
+ THREAD_START_BOTH_POINTER_FIRST,
+ THREAD_START_BOTH_NUMERIC_FIRST
+} Thread_Start_types;
+
+typedef Thread ( *Thread_Entry )(); /* basic type */
+
+typedef Thread ( *Thread_Entry_numeric )( unsigned32 );
+typedef Thread ( *Thread_Entry_pointer )( void * );
+typedef Thread ( *Thread_Entry_both_pointer_first )( void *, unsigned32 );
+typedef Thread ( *Thread_Entry_both_numeric_first )( unsigned32, void * );
+
+/*
+ * The following lists the algorithms used to manage the thread cpu budget.
+ *
+ * Reset Timeslice: At each context switch, reset the time quantum.
+ * Exhaust Timeslice: Only reset the quantum once it is consumed.
+ * Callout: Execute routine when budget is consumed.
+ */
+
+typedef enum {
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE,
+ THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE,
+ THREAD_CPU_BUDGET_ALGORITHM_CALLOUT
+} Thread_CPU_budget_algorithms;
+
+typedef struct Thread_Control_struct Thread_Control;
+
+typedef void (*Thread_CPU_budget_algorithm_callout )( Thread_Control * );
+
+/*
+ * The following structure contains the information which defines
+ * the starting state of a thread.
+ */
+
+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 */
+ /* initial execution modes */
+ boolean is_preemptible;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+ unsigned32 isr_level;
+ Priority_Control initial_priority; /* initial priority */
+ boolean core_allocated_stack;
+ Stack_Control Initial_stack; /* stack information */
+ void *fp_context; /* initial FP context area address */
+ void *stack; /* initial FP context area address */
+} Thread_Start_information;
+
+/*
+ * The following structure contains the information necessary to manage
+ * a thread which it is waiting for a resource.
+ */
+
+#define THREAD_STATUS_PROXY_BLOCKING 0x1111111
+
+typedef struct {
+ Objects_Id id; /* waiting on this object */
+ 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;
+
+/*
+ * The following defines the control block used to manage
+ * each thread proxy.
+ *
+ * NOTE: It is critical that proxies and threads have identical
+ * memory images for the shared part.
+ */
+
+typedef struct {
+ Objects_Control Object;
+ States_Control current_state;
+ Priority_Control current_priority;
+ Priority_Control real_priority;
+ unsigned32 resource_count;
+ Thread_Wait_information Wait;
+ Watchdog_Control Timer;
+ MP_packet_Prefix *receive_packet;
+ /****************** end of common block ********************/
+ Chain_Node Active;
+} Thread_Proxy_control;
+
+
+/*
+ * The following record defines the control block used
+ * to manage each thread.
+ *
+ * NOTE: It is critical that proxies and threads have identical
+ * memory images for the shared part.
+ */
+
+typedef enum {
+ THREAD_API_RTEMS,
+ THREAD_API_POSIX
+} Thread_APIs;
+
+#define THREAD_API_FIRST THREAD_API_RTEMS
+#define THREAD_API_LAST THREAD_API_POSIX
+
+struct Thread_Control_struct {
+ Objects_Control Object;
+ States_Control current_state;
+ Priority_Control current_priority;
+ Priority_Control real_priority;
+ unsigned32 resource_count;
+ Thread_Wait_information Wait;
+ Watchdog_Control Timer;
+ MP_packet_Prefix *receive_packet;
+ /****************** end of common block ********************/
+ boolean is_global;
+ boolean do_post_task_switch_extension;
+
+ boolean is_preemptible;
+ unsigned32 cpu_time_budget;
+ Thread_CPU_budget_algorithms budget_algorithm;
+ Thread_CPU_budget_algorithm_callout budget_callout;
+
+ unsigned32 ticks_executed;
+ Chain_Control *ready;
+ Priority_Information Priority_map;
+ Thread_Start_information Start;
+ Context_Control Registers;
+ void *fp_context;
+ void *API_Extensions[ THREAD_API_LAST + 1 ];
+ void **extensions;
+};
+
+/*
+ * The following constants define the stack size requirements for
+ * the idle thread.
+ */
+
+
+#define THREAD_IDLE_STACK_SIZE STACK_MINIMUM_SIZE
+
+/*
+ * The following defines the information control block used to
+ * manage this class of objects.
+ */
+
+SCORE_EXTERN Objects_Information _Thread_Internal_information;
+
+/*
+ * The following define the thread control pointers used to access
+ * and manipulate the idle thread.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Idle;
+
+/*
+ * 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.
+ */
+
+SCORE_EXTERN Context_Control _Thread_BSP_context;
+
+/*
+ * The following declares the dispatch critical section nesting
+ * counter which is used to prevent context switches at inopportune
+ * moments.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Dispatch_disable_level;
+
+/*
+ * If this is non-zero, then the post-task switch extension
+ * is run regardless of the state of the per thread flag.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Do_post_task_switch_extension;
+
+/*
+ * 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.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Maximum_extensions;
+
+/*
+ * The following is used to manage the length of a timeslice quantum.
+ */
+
+SCORE_EXTERN unsigned32 _Thread_Ticks_per_timeslice;
+
+/*
+ * The following points to the array of FIFOs used to manage the
+ * set of ready threads.
+ */
+
+SCORE_EXTERN Chain_Control *_Thread_Ready_chain;
+
+/*
+ * The following points to the thread which is currently executing.
+ * This thread is implicitly manipulated by numerous directives.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Executing;
+
+/*
+ * The following points to the highest priority ready thread
+ * in the system. Unless the current thread is not preemptibl,
+ * then this thread will be context switched to when the next
+ * dispatch occurs.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Heir;
+
+/*
+ * The following points to the thread whose floating point
+ * context is currently loaded.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_Allocated_fp;
+
+/*
+ * _Thread_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _Thread_Handler_initialization (
+ unsigned32 ticks_per_timeslice,
+ unsigned32 maximum_extensions,
+ unsigned32 maximum_proxies
+);
+
+/*
+ * _Thread_Create_idle
+ *
+ * DESCRIPTION:
+ *
+ * This routine creates the idle thread.
+ *
+ * WARNING!! No thread should be created before this one.
+ */
+
+void _Thread_Create_idle( void );
+
+/*
+ * _Thread_Start_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This routine initiates multitasking. It is invoked only as
+ * part of initialization and its invocation is the last act of
+ * the non-multitasking part of the system initialization.
+ */
+
+void _Thread_Start_multitasking( void );
+
+/*
+ * _Thread_Dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine is responsible for transferring control of the
+ * processor from the executing thread to the heir thread. As part
+ * of this process, it is responsible for the following actions:
+ *
+ * + saving the context of the executing thread
+ * + restoring the context of the heir thread
+ * + dispatching any signals for the resulting executing thread
+ */
+
+void _Thread_Dispatch( void );
+
+/*
+ * _Thread_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ *
+ * NOTES:
+ *
+ * If stack_area is NULL, it is allocated from the workspace.
+ *
+ * If the stack is allocated from the workspace, then it is guaranteed to be
+ * of at least minimum size.
+ */
+
+boolean _Thread_Initialize(
+ Objects_Information *information,
+ Thread_Control *the_thread,
+ void *stack_area,
+ unsigned32 stack_size,
+ boolean is_fp,
+ Priority_Control priority,
+ boolean is_preemptible,
+ Thread_CPU_budget_algorithms budget_algorithm,
+ Thread_CPU_budget_algorithm_callout budget_callout,
+ unsigned32 isr_level,
+ Objects_Name name
+);
+
+/*
+ * _Thread_Start
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Thread_Start(
+ Thread_Control *the_thread,
+ Thread_Start_types the_prototype,
+ void *entry_point,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+);
+
+/*
+ * _Thread_Restart
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+/* XXX multiple task arg profiles */
+
+boolean _Thread_Restart(
+ Thread_Control *the_thread,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+);
+
+/*
+ * _Thread_Close
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Thread_Close(
+ Objects_Information *information,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Ready
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes any set states for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Ready(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Clear_state
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the indicated STATES for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Clear_state(
+ Thread_Control *the_thread,
+ States_Control state
+);
+
+/*
+ * _Thread_Set_state
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the indicated states for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ *
+ */
+
+void _Thread_Set_state(
+ Thread_Control *the_thread,
+ States_Control state
+);
+
+/*
+ * _Thread_Set_transient
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the TRANSIENT state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+void _Thread_Set_transient(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Reset_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked upon expiration of the currently
+ * executing thread's timeslice. If no other thread's are ready
+ * 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
+ * FIFO for this priority and a new heir is selected.
+ */
+
+void _Thread_Reset_timeslice( void );
+
+/*
+ * _Thread_Tickle_timeslice
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked as part of processing each clock tick.
+ * It is responsible for determining if the current thread allows
+ * timeslicing and, if so, when its timeslice expires.
+ */
+
+void _Thread_Tickle_timeslice( void );
+
+/*
+ * _Thread_Yield_processor
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a thread wishes to voluntarily
+ * transfer control of the processor to another thread of equal
+ * or greater priority.
+ */
+
+void _Thread_Yield_processor( void );
+
+/*
+ * _Thread_Load_environment
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the context of the_thread to its
+ * appropriate starting state.
+ */
+
+void _Thread_Load_environment(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_Handler
+ *
+ * DESCRIPTION:
+ *
+ * This routine is the wrapper function for all threads. It is
+ * the starting point for all threads. The user provided thread
+ * entry point is invoked by this routine. Operations
+ * which must be performed immediately before and after the user's
+ * thread executes are found here.
+ */
+
+void _Thread_Handler( void );
+
+/*
+ * _Thread_Delay_ended
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a thread must be unblocked at the
+ * end of a time based delay (i.e. wake after or wake when).
+ */
+
+void _Thread_Delay_ended(
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * _Thread_Change_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine changes the current priority of the_thread to
+ * new_priority. It performs any necessary scheduling operations
+ * including the selection of a new heir thread.
+ */
+
+void _Thread_Change_priority (
+ Thread_Control *the_thread,
+ Priority_Control new_priority,
+ boolean prepend_it
+);
+
+/*
+ * _Thread_Set_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine updates the priority related fields in the_thread
+ * control block to indicate the current priority is now new_priority.
+ */
+
+void _Thread_Set_priority(
+ Thread_Control *the_thread,
+ Priority_Control new_priority
+);
+
+/*
+ * _Thread_Evaluate_mode
+ *
+ * DESCRIPTION:
+ *
+ * This routine XXX
+ */
+
+boolean _Thread_Evaluate_mode( void );
+
+/*
+ * _Thread_Get
+ *
+ * NOTE: If we are not using static inlines, this must be a real
+ * subroutine call.
+ */
+
+#ifndef USE_INLINES
+Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+);
+#endif
+
+/*
+ * _Thread_Idle_body
+ *
+ * DESCRIPTION:
+ *
+ * This routine is the body of the system idle thread.
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE)
+Thread _Thread_Idle_body(
+ unsigned32 ignored
+);
+#endif
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/thread.inl>
+#endif
+#include <rtems/score/threadmp.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/threadmp.h b/cpukit/score/include/rtems/score/threadmp.h
new file mode 100644
index 0000000000..bcaa423d70
--- /dev/null
+++ b/cpukit/score/include/rtems/score/threadmp.h
@@ -0,0 +1,89 @@
+/* threadmp.h
+ *
+ * This include file contains the specification for all routines
+ * and data specific to the multiprocessing portion of the thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_THREAD_MP_h
+#define __RTEMS_THREAD_MP_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * _Thread_MP_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the multiprocessing portion of the Thread Handler.
+ */
+
+void _Thread_MP_Handler_initialization (
+ unsigned32 maximum_proxies
+);
+
+/*
+ * _Thread_MP_Allocate_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This allocates a proxy control block from
+ * the inactive chain of free proxy control blocks.
+ *
+ * NOTE: This function returns a thread control pointer
+ * because proxies are substitutes for remote threads.
+ */
+
+Thread_Control *_Thread_MP_Allocate_proxy (
+ States_Control the_state
+);
+
+/*
+ * _Thread_MP_Find_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the proxy control block for the specified
+ * id from the active chain of proxy control blocks.
+ */
+
+Thread_Control *_Thread_MP_Find_proxy (
+ Objects_Id the_id
+);
+
+/*
+ * The following is used to determine when the multiprocessing receive
+ * thread is executing so that a proxy can be allocated instead of
+ * blocking the multiprocessing receive thread.
+ */
+
+SCORE_EXTERN Thread_Control *_Thread_MP_Receive;
+
+/*
+ * The following chains are used to manage proxies.
+ */
+
+SCORE_EXTERN Chain_Control _Thread_MP_Active_proxies;
+SCORE_EXTERN Chain_Control _Thread_MP_Inactive_proxies;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/threadmp.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/threadq.h b/cpukit/score/include/rtems/score/threadq.h
new file mode 100644
index 0000000000..943eaf10f8
--- /dev/null
+++ b/cpukit/score/include/rtems/score/threadq.h
@@ -0,0 +1,301 @@
+/* threadq.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the manipulation of objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_h
+#define __THREAD_QUEUE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/tqdata.h>
+
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * Constant for indefinite wait.
+ */
+
+#define THREAD_QUEUE_WAIT_FOREVER WATCHDOG_NO_TIMEOUT
+
+/*
+ * The following type defines the callout used when a remote task
+ * is extracted from a local thread queue.
+ */
+
+typedef void ( *Thread_queue_Flush_callout )(
+ Thread_Control *
+ );
+
+/*
+ * The following type defines the callout used when a local task
+ * is extracted from a remote thread queue (i.e. it's proxy must
+ * extracted from the remote queue).
+ */
+
+typedef void ( *Thread_queue_Extract_callout )(
+ Thread_Control *
+ );
+
+SCORE_EXTERN Thread_queue_Extract_callout
+ _Thread_queue_Extract_table[ OBJECTS_CLASSES_LAST + 1 ];
+
+/*
+ * _Thread_queue_Dequeue
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to a thread waiting on
+ * the_thread_queue. The selection of this thread is based on
+ * the discipline of the_thread_queue. If no threads are waiting
+ * on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout.
+ */
+
+void _Thread_queue_Enqueue(
+ Thread_queue_Control *the_thread_queue,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_Extract_with_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_thread from the_thread_queue
+ * and insures that if there is a proxy for this task on
+ * another node, it is also dealt with.
+ */
+
+boolean _Thread_queue_Extract_with_proxy(
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The "first" thread is selected
+ * based on the discipline of the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Flush
+ *
+ * DESCRIPTION:
+ *
+ * This routine unblocks all threads blocked on the_thread_queue
+ * and cancels any associated timeouts.
+ */
+
+void _Thread_queue_Flush(
+ Thread_queue_Control *the_thread_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+);
+
+/*
+ * _Thread_queue_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_thread_queue based on the
+ * discipline indicated in attribute_set. The state set on
+ * threads which block on the_thread_queue is state.
+ */
+
+void _Thread_queue_Initialize(
+ Thread_queue_Control *the_thread_queue,
+ Objects_Classes the_class,
+ Thread_queue_Disciplines the_discipline,
+ States_Control state,
+ Thread_queue_Extract_callout proxy_extract_callout,
+ unsigned32 timeout_status
+);
+
+/*
+ * _Thread_queue_Dequeue_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the highest priority
+ * thread waiting on the_thread_queue. If no threads are waiting
+ * on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue_priority(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout using the
+ * priority discipline.
+ */
+
+void _Thread_queue_Enqueue_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The "first" thread is the highest
+ * priority thread waiting on the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First_priority(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Dequeue_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the thread which has
+ * been waiting the longest on the_thread_queue. If no
+ * threads are waiting on the_thread_queue, then NULL is returned.
+ */
+
+Thread_Control *_Thread_queue_Dequeue_fifo(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_Enqueue_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This routine enqueues the currently executing thread on
+ * the_thread_queue with an optional timeout using the
+ * FIFO discipline.
+ */
+
+void _Thread_queue_Enqueue_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+);
+
+/*
+ * _Thread_queue_Extract_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes the_thread from the_thread_queue
+ * and cancels any timeouts associated with this blocking.
+ */
+
+void _Thread_queue_Extract_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+);
+
+/*
+ * _Thread_queue_First_FIFO
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the "first" thread
+ * on the_thread_queue. The first thread is the thread
+ * which has been waiting longest on the_thread_queue.
+ */
+
+Thread_Control *_Thread_queue_First_fifo(
+ Thread_queue_Control *the_thread_queue
+);
+
+/*
+ * _Thread_queue_timeout
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when a task's request has not
+ * been satisfied after the timeout interval specified to
+ * enqueue. The task represented by ID will be unblocked and
+ * its status code will be set in it's control block to indicate
+ * that a timeout has occurred.
+ */
+
+void _Thread_queue_Timeout (
+ Objects_Id id,
+ void *ignored
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/tod.h b/cpukit/score/include/rtems/score/tod.h
new file mode 100644
index 0000000000..36d0097669
--- /dev/null
+++ b/cpukit/score/include/rtems/score/tod.h
@@ -0,0 +1,277 @@
+/* tod.h
+ *
+ * This include file contains all the constants and structures associated
+ * with the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_h
+#define __TIME_OF_DAY_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+#include <rtems/score/watchdog.h>
+
+/*
+ * The following constants are related to the time of day.
+ */
+
+#define TOD_SECONDS_PER_MINUTE 60
+#define TOD_MINUTES_PER_HOUR 60
+#define TOD_MONTHS_PER_YEAR 12
+#define TOD_DAYS_PER_YEAR 365
+#define TOD_HOURS_PER_DAY 24
+#define TOD_SECONDS_PER_DAY (TOD_SECONDS_PER_MINUTE * \
+ TOD_MINUTES_PER_HOUR * \
+ TOD_HOURS_PER_DAY)
+
+#define TOD_SECONDS_PER_NON_LEAP_YEAR (365 * TOD_SECONDS_PER_DAY)
+
+#define TOD_MILLISECONDS_PER_SECOND 1000
+#define TOD_MICROSECONDS_PER_SECOND 1000000
+#define TOD_NANOSECONDS_PER_SECOND 1000000000
+#define TOD_NANOSECONDS_PER_MICROSECOND 1000
+
+/*
+ * The following constant define the earliest year to which an
+ * time of day can be initialized. This is considered the
+ * epoch.
+ */
+
+#define TOD_BASE_YEAR 1988
+
+/*
+ * The following record defines the time of control block. This
+ * control block is used to maintain the current time of day.
+ */
+
+typedef struct { /* RTEID style time/date */
+ unsigned32 year; /* year, A.D. */
+ unsigned32 month; /* month, 1 -> 12 */
+ unsigned32 day; /* day, 1 -> 31 */
+ unsigned32 hour; /* hour, 0 -> 23 */
+ unsigned32 minute; /* minute, 0 -> 59 */
+ unsigned32 second; /* second, 0 -> 59 */
+ unsigned32 ticks; /* elapsed ticks between secs */
+} TOD_Control;
+
+/*
+ * The following is TRUE if the application has set the current
+ * time of day, and FALSE otherwise.
+ */
+
+SCORE_EXTERN boolean _TOD_Is_set;
+
+/*
+ * The following contains the current time of day.
+ */
+
+SCORE_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.
+ */
+
+SCORE_EXTERN Watchdog_Interval _TOD_Seconds_since_epoch;
+
+/*
+ * The following contains the number of microseconds per tick.
+ */
+
+SCORE_EXTERN unsigned32 _TOD_Microseconds_per_tick;
+
+/*
+ * The following contains the number of clock ticks per second.
+ *
+ * NOTE:
+ *
+ * If one second is NOT evenly divisible by the number of microseconds
+ * per clock tick, this value will contain only the integer portion
+ * of the division. This means that the interval between clock ticks
+ * can be a source of error in the current time of day.
+ */
+
+SCORE_EXTERN unsigned32 _TOD_Ticks_per_second;
+
+/*
+ * This is the control structure for the watchdog timer which
+ * fires to service the seconds chain.
+ */
+
+SCORE_EXTERN Watchdog_Control _TOD_Seconds_watchdog;
+
+#ifdef SCORE_INIT
+
+/*
+ * The following array contains the number of days in all months.
+ * The first dimension should be 1 for leap years, and 0 otherwise.
+ * The second dimension should range from 1 to 12 for January to
+ * February, respectively.
+ */
+
+const unsigned32 _TOD_Days_per_month[ 2 ][ 13 ] = {
+ { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+ { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+/*
+ * The following array contains the number of days in all months
+ * up to the month indicated by the index of the second dimension.
+ * The first dimension should be 1 for leap years, and 0 otherwise.
+ */
+
+const unsigned16 _TOD_Days_to_date[2][13] = {
+ { 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 },
+ { 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }
+};
+
+/*
+ * The following array contains the number of days in the years
+ * since the last leap year. The index should be 0 for leap
+ * years, and the number of years since the beginning of a leap
+ * year otherwise.
+ */
+
+const unsigned16 _TOD_Days_since_last_leap_year[4] = { 0, 366, 761, 1126 };
+
+#else
+
+extern const unsigned16 _TOD_Days_to_date[2][13]; /* Julian days */
+extern const unsigned16 _TOD_Days_since_last_leap_year[4];
+extern const unsigned32 _TOD_Days_per_month[2][13];
+
+#endif
+
+/*
+ * _TOD_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _TOD_Handler_initialization(
+ unsigned32 microseconds_per_tick
+);
+
+/*
+ * _TOD_Set
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current time of day to THE_TOD and
+ * the equivalent SECONDS_SINCE_EPOCH.
+ */
+
+void _TOD_Set(
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
+);
+
+/*
+ * _TOD_Validate
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if THE_TOD contains
+ * a valid time of day, and FALSE otherwise.
+ */
+
+boolean _TOD_Validate(
+ TOD_Control *the_tod
+);
+
+/*
+ * _TOD_To_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the number seconds between the epoch and THE_TOD.
+ */
+
+Watchdog_Interval _TOD_To_seconds(
+ TOD_Control *the_tod
+);
+
+/*
+ * _TOD_Tickle
+ *
+ * DESCRIPTION:
+ *
+ * This routine is scheduled as a watchdog function and is invoked at
+ * each second boundary. It updates the current time of day to indicate
+ * that a second has passed and processes the seconds watchdog chain.
+ */
+
+void _TOD_Tickle(
+ Objects_Id id,
+ void *ignored
+);
+
+/*
+ * TOD_MILLISECONDS_TO_MICROSECONDS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in milliseconds to microseconds.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MILLISECONDS_TO_MICROSECONDS(_ms) ((_ms) * 1000)
+
+/*
+ * TOD_MICROSECONDS_TO_TICKS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in microseconds to ticks.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MICROSECONDS_TO_TICKS(_us) \
+ ((_us) / _TOD_Microseconds_per_tick)
+
+/*
+ * TOD_MILLISECONDS_TO_TICKS
+ *
+ * DESCRIPTION:
+ *
+ * This routine converts an interval expressed in milliseconds to ticks.
+ *
+ * NOTE:
+ *
+ * This must be a macro so it can be used in "static" tables.
+ */
+
+#define TOD_MILLISECONDS_TO_TICKS(_ms) \
+ (TOD_MILLISECONDS_TO_MICROSECONDS(_ms) / _TOD_Microseconds_per_tick)
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/tod.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/tqdata.h b/cpukit/score/include/rtems/score/tqdata.h
new file mode 100644
index 0000000000..0011b62766
--- /dev/null
+++ b/cpukit/score/include/rtems/score/tqdata.h
@@ -0,0 +1,90 @@
+/* tqdata.h
+ *
+ * This include file contains all the constants and structures
+ * needed to declare a thread queue.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_h
+#define __THREAD_QUEUE_DATA_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/chain.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/states.h>
+
+/*
+ * The following enumerated type details all of the disciplines
+ * supported by the Thread Queue Handler.
+ */
+
+typedef enum {
+ THREAD_QUEUE_DISCIPLINE_FIFO, /* FIFO queue discipline */
+ THREAD_QUEUE_DISCIPLINE_PRIORITY /* PRIORITY queue discipline */
+} Thread_queue_Disciplines;
+
+/*
+ * The following enumerated types indicate what happened while the thread
+ * queue was in the synchronization window.
+ */
+
+typedef enum {
+ THREAD_QUEUE_SYNCHRONIZED,
+ THREAD_QUEUE_NOTHING_HAPPENED,
+ THREAD_QUEUE_TIMEOUT,
+ THREAD_QUEUE_SATISFIED
+} Thread_queue_States;
+
+/*
+ * The following constants are used to manage the priority queues.
+ *
+ * There are four chains used to maintain a priority -- each chain
+ * manages a distinct set of task priorities. The number of chains
+ * is determined by TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS.
+ * The following set must be consistent.
+ *
+ * The set below configures 4 headers -- each contains 64 priorities.
+ * Header x manages priority range (x*64) through ((x*64)+63). If
+ * the priority is more than half way through the priority range it
+ * is in, then the search is performed from the rear of the chain.
+ * This halves the search time to find the insertion point.
+ */
+
+#define TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS 4
+#define TASK_QUEUE_DATA_PRIORITIES_PER_HEADER 64
+#define TASK_QUEUE_DATA_REVERSE_SEARCH_MASK 0x20
+
+typedef struct {
+ union {
+ Chain_Control Fifo; /* FIFO discipline list */
+ Chain_Control Priority[TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS];
+ /* priority discipline list */
+ } Queues;
+ Thread_queue_States sync_state; /* 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;
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/tqdata.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/userext.h b/cpukit/score/include/rtems/score/userext.h
new file mode 100644
index 0000000000..4b4290ab4d
--- /dev/null
+++ b/cpukit/score/include/rtems/score/userext.h
@@ -0,0 +1,213 @@
+/* userext.h
+ *
+ * This include file contains all information about user extensions. This
+ * Handler provides mechanisms which can be used to initialize and manipulate
+ * all user extensions.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_h
+#define __USER_EXTENSIONS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/interr.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/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_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_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;
+ User_extensions_Table Callouts;
+} User_extensions_Control;
+
+/*
+ * The following contains the static extension set which may be
+ * configured by the application.
+ */
+
+SCORE_EXTERN User_extensions_Control _User_extensions_Initial;
+
+/*
+ * The following is used to manage the list of active extensions.
+ */
+
+SCORE_EXTERN Chain_Control _User_extensions_List;
+
+/*
+ * _User_extensions_Thread_create
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread creation operate.
+ */
+
+boolean _User_extensions_Thread_create (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_delete
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread deletion operation.
+ */
+
+void _User_extensions_Thread_delete (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_start
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread start operation.
+ */
+
+void _User_extensions_Thread_start (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_restart
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension for
+ * the thread restart operation.
+ */
+
+void _User_extensions_Thread_restart (
+ Thread_Control *the_thread
+);
+
+/*
+ * _User_extensions_Thread_begin
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a thread begins.
+ */
+
+void _User_extensions_Thread_begin (
+ Thread_Control *executing
+);
+
+/*
+ * _User_extensions_Thread_exitted
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a thread exits.
+ */
+
+void _User_extensions_Thread_exitted (
+ Thread_Control *executing
+);
+
+/*
+ * _User_extensions_Fatal
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension invoked
+ * when a fatal error occurs.
+ */
+
+void _User_extensions_Fatal (
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ unsigned32 the_error
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/userext.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/watchdog.h b/cpukit/score/include/rtems/score/watchdog.h
new file mode 100644
index 0000000000..697ae9bcc0
--- /dev/null
+++ b/cpukit/score/include/rtems/score/watchdog.h
@@ -0,0 +1,194 @@
+/* watchdog.h
+ *
+ * This include file contains all the constants and structures associated
+ * with watchdog timers. This Handler provides mechanisms which can be
+ * used to initialize and manipulate watchdog timers.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_h
+#define __WATCHDOG_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/object.h>
+
+/*
+ * The following type defines the control block used to manage
+ * intervals.
+ */
+
+typedef unsigned32 Watchdog_Interval;
+
+/*
+ * The following types define a pointer to a watchdog service routine.
+ */
+
+typedef void Watchdog_Service_routine;
+
+typedef Watchdog_Service_routine ( *Watchdog_Service_routine_entry )(
+ Objects_Id,
+ void *
+ );
+
+/*
+ * Constant for indefinite wait. (actually an illegal interval)
+ */
+
+#define WATCHDOG_NO_TIMEOUT 0
+
+/*
+ * The following enumerated type lists the states in which a
+ * watchdog timer may be at any given time.
+ */
+
+typedef enum {
+ WATCHDOG_INACTIVE, /* off all chains */
+ WATCHDOG_BEING_INSERTED, /* off all chains, searching for insertion point */
+ WATCHDOG_ACTIVE, /* on chain, allowed to fire */
+ WATCHDOG_REMOVE_IT /* on chain, remove without firing if expires */
+} Watchdog_States;
+
+/*
+ * The following enumerated type details the manner in which
+ * a watchdog chain may be adjusted by the Watchdog_Adjust
+ * routine. The direction indicates a movement FORWARD
+ * or BACKWARD in time.
+ */
+
+typedef enum {
+ WATCHDOG_FORWARD, /* adjust delta value forward */
+ WATCHDOG_BACKWARD /* adjust delta value backward */
+} Watchdog_Adjust_directions;
+
+/*
+ * The following record defines the control block used
+ * to manage each watchdog timer.
+ */
+
+typedef struct {
+ Chain_Node Node;
+ Watchdog_States state;
+ Watchdog_Interval initial;
+ Watchdog_Interval delta_interval;
+ Watchdog_Interval start_time;
+ Watchdog_Interval stop_time;
+ Watchdog_Service_routine_entry routine;
+ Objects_Id id;
+ void *user_data;
+} Watchdog_Control;
+
+/*
+ * The following are used for synchronization purposes
+ * during an insert on a watchdog delta chain.
+ */
+
+SCORE_EXTERN volatile unsigned32 _Watchdog_Sync_level;
+SCORE_EXTERN volatile unsigned32 _Watchdog_Sync_count;
+
+/*
+ * The following contains the number of ticks since the
+ * system was booted.
+ */
+
+SCORE_EXTERN Watchdog_Interval _Watchdog_Ticks_since_boot;
+
+/*
+ * The following defines the watchdog chains which are managed
+ * on ticks and second boundaries.
+ */
+
+SCORE_EXTERN Chain_Control _Watchdog_Ticks_chain;
+SCORE_EXTERN Chain_Control _Watchdog_Seconds_chain;
+
+/*
+ * _Watchdog_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the watchdog handler. The watchdog
+ * synchronization flag is initialized and the watchdog chains are
+ * initialized and emptied.
+ */
+
+void _Watchdog_Handler_initialization( void );
+
+/*
+ * _Watchdog_Remove
+ *
+ * DESCRIPTION:
+ *
+ * This routine removes THE_WATCHDOG from the watchdog chain on which
+ * it resides and returns the state THE_WATCHDOG timer was in.
+ */
+
+Watchdog_States _Watchdog_Remove (
+ Watchdog_Control *the_watchdog
+);
+
+/*
+ * _Watchdog_Adjust
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the HEADER watchdog chain in the forward
+ * or backward DIRECTION for UNITS ticks.
+ */
+
+void _Watchdog_Adjust (
+ Chain_Control *header,
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+);
+
+/*
+ * _Watchdog_Insert
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the HEADER watchdog chain
+ * for a time of UNITS. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ *
+ */
+
+void _Watchdog_Insert (
+ Chain_Control *header,
+ Watchdog_Control *the_watchdog
+);
+
+/*
+ * _Watchdog_Tickle
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at appropriate intervals to update
+ * the HEADER watchdog chain.
+ */
+
+void _Watchdog_Tickle (
+ Chain_Control *header
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/watchdog.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/score/wkspace.h b/cpukit/score/include/rtems/score/wkspace.h
new file mode 100644
index 0000000000..8de23a6c61
--- /dev/null
+++ b/cpukit/score/include/rtems/score/wkspace.h
@@ -0,0 +1,71 @@
+/* wkspace.h
+ *
+ * This include file contains information related to the
+ * RAM Workspace. This Handler provides mechanisms which can be used to
+ * define, initialize and manipulate the workspace.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_h
+#define __WORKSPACE_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <rtems/score/heap.h>
+#include <rtems/score/interr.h>
+
+/*
+ * The following is used to manage the Workspace.
+ *
+ */
+
+SCORE_EXTERN Heap_Control _Workspace_Area; /* executive heap header */
+
+/*
+ * _Workspace_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+void _Workspace_Handler_initialization(
+ void *starting_address,
+ unsigned32 size
+);
+
+/*
+ * _Workspace_Allocate_or_fatal_error
+ *
+ * DESCRIPTION:
+ *
+ * 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 internal error handler is invoked.
+ */
+
+void *_Workspace_Allocate_or_fatal_error(
+ unsigned32 size
+);
+
+#ifndef __RTEMS_APPLICATION__
+#include <rtems/score/wkspace.inl>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/include/rtems/system.h b/cpukit/score/include/rtems/system.h
new file mode 100644
index 0000000000..b9255d45d5
--- /dev/null
+++ b/cpukit/score/include/rtems/system.h
@@ -0,0 +1,153 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the executive. This must be the first include file
+ * included in all internal RTEMS files.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __RTEMS_SYSTEM_h
+#define __RTEMS_SYSTEM_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The target options include file defines all target dependent
+ * parameters for this build of RTEMS. It must be included
+ * first so the basic macro definitions are in place.
+ */
+
+#include <rtems/score/targopts.h>
+
+/*
+ * The following insures that all data is declared in the space
+ * of the initialization routine for either the Initialization Manager
+ * or the initialization file for the appropriate API. It is
+ * referenced as "external" in every other file.
+ */
+
+#ifdef SCORE_INIT
+#undef SCORE_EXTERN
+#define SCORE_EXTERN
+#else
+#undef SCORE_EXTERN
+#define SCORE_EXTERN extern
+#endif
+
+#ifdef SAPI_INIT
+#undef SAPI_EXTERN
+#define SAPI_EXTERN
+#else
+#undef SAPI_EXTERN
+#define SAPI_EXTERN extern
+#endif
+
+#ifdef RTEMS_API_INIT
+#undef RTEMS_EXTERN
+#define RTEMS_EXTERN
+#else
+#undef RTEMS_EXTERN
+#define RTEMS_EXTERN extern
+#endif
+
+#ifdef POSIX_API_INIT
+#undef POSIX_EXTERN
+#define POSIX_EXTERN
+#else
+#undef POSIX_EXTERN
+#define POSIX_EXTERN extern
+#endif
+
+/*
+ * The following (in conjunction with compiler arguments) are used
+ * to choose between the use of static inline functions and macro
+ * functions. The static inline implementation allows better
+ * type checking with no cost in code size or execution speed.
+ */
+
+#ifdef USE_INLINES
+# ifdef __GNUC__
+# define RTEMS_INLINE_ROUTINE static __inline__
+# else
+# define RTEMS_INLINE_ROUTINE static inline
+# endif
+#else
+# define RTEMS_INLINE_ROUTINE
+#endif
+
+/*
+ * Include a base set of files.
+ */
+
+/*
+ * XXX: Eventually proc_ptr needs to disappear!!!
+ */
+
+typedef void * proc_ptr;
+
+#include <rtems/score/cpu.h> /* processor specific information */
+
+/*
+ * Define NULL
+ */
+
+#ifndef NULL
+#define NULL 0 /* NULL value */
+#endif
+
+/*
+ * Boolean constants
+ */
+
+#if !defined( TRUE ) || (TRUE != 1)
+#undef TRUE
+#define TRUE (1)
+#endif
+
+#if !defined( FALSE ) || (FALSE != 0)
+#undef FALSE
+#define FALSE (0)
+#endif
+
+#define stringify( _x ) # _x
+
+#define RTEMS_offsetof(type, field) \
+ ((unsigned32) &(((type *) 0)->field))
+
+/*
+ * The following is the extern for the RTEMS version string.
+ * The contents of this string are CPU specific.
+ */
+
+extern const char _RTEMS_version[]; /* RTEMS version string */
+extern const char _Copyright_Notice[]; /* RTEMS copyright string */
+
+/*
+ * The following defines the CPU dependent information table.
+ */
+
+SCORE_EXTERN rtems_cpu_table _CPU_Table; /* CPU dependent info */
+
+/*
+ * XXX weird RTEMS stuff
+ */
+
+#define RTEMS_MAXIMUM_NAME_LENGTH 4
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/address.inl b/cpukit/score/inline/rtems/score/address.inl
new file mode 100644
index 0000000000..e30ca616fa
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/address.inl
@@ -0,0 +1,120 @@
+/* inline/address.inl
+ *
+ * This include file contains the bodies of the routines
+ * about addresses which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_ADDRESSES_inl
+#define __INLINE_ADDRESSES_inl
+
+/*PAGE
+ *
+ * _Addresses_Add_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to add an offset to a base address.
+ * It returns the resulting address. This address is typically
+ * converted to an access type before being used further.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (void *)((char *)base + offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract_offset
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract an offset from a base
+ * address. It returns the resulting address. This address is
+ * typically converted to an access type before being used further.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Addresses_Subtract_offset (
+ void *base,
+ unsigned32 offset
+)
+{
+ return (void *)((char *)base - offset);
+}
+
+/*PAGE
+ *
+ * _Addresses_Subtract
+ *
+ * DESCRIPTION:
+ *
+ * This function is used to subtract two addresses. It returns the
+ * resulting offset.
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Addresses_Subtract (
+ void *left,
+ void *right
+)
+{
+ return ((char *) left - (char *) right);
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is correctly
+ * aligned for this processor and FALSE otherwise. Proper alignment
+ * is based on correctness and efficiency.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Addresses_Is_aligned (
+ void *address
+)
+{
+ return ( ( (unsigned32)address % CPU_ALIGNMENT ) == 0 );
+}
+
+/*PAGE
+ *
+ * _Addresses_Is_in_range
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the given address is within the
+ * memory range specified and FALSE otherwise. base is the address
+ * of the first byte in the memory range and limit is the address
+ * of the last byte in the memory range. The base address is
+ * assumed to be lower than the limit address.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Addresses_Is_in_range (
+ void *address,
+ void *base,
+ void *limit
+)
+{
+ return ( address >= base && address <= limit );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/chain.inl b/cpukit/score/inline/rtems/score/chain.inl
new file mode 100644
index 0000000000..732010099f
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/chain.inl
@@ -0,0 +1,390 @@
+/* inline/chain.inl
+ *
+ * This include file contains the bodies of the routines which are
+ * associated with doubly linked chains and inlined.
+ *
+ * NOTE: The routines in this file are ordered from simple
+ * to complex. No other Chain Handler routine is referenced
+ * unless it has already been defined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CHAIN_inl
+#define __INLINE_CHAIN_inl
+
+/*PAGE
+ *
+ * _Chain_Are_nodes_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if LEFT and RIGHT are equal,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Are_nodes_equal(
+ Chain_Node *left,
+ Chain_Node *right
+)
+{
+ return left == right;
+}
+
+/*PAGE
+ *
+ * _Chain_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_chain is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_null(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_null_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_null_node(
+ Chain_Node *the_node
+)
+{
+ return ( the_node == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the first node on the chain.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Head(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) the_chain;
+}
+
+/*PAGE
+ *
+ * _Chain_Tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the last node on the chain.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail(
+ Chain_Control *the_chain
+)
+{
+ return (Chain_Node *) &the_chain->permanent_null;
+}
+
+/*PAGE
+ *
+ * _Chain_Is_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there a no nodes on the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_first
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the first node on a chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_first(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->previous == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_last
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the last node on a chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_last(
+ Chain_Node *the_node
+)
+{
+ return ( the_node->next == NULL );
+}
+
+/*PAGE
+ *
+ * _Chain_Has_only_one_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if there is only one node on the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Has_only_one_node(
+ Chain_Control *the_chain
+)
+{
+ return ( the_chain->first == the_chain->last );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the head of the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_head(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Head( the_chain ) );
+}
+
+/*PAGE
+ *
+ * _Chain_Is_tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_node is the tail of the_chain and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Chain_Is_tail(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ return ( the_node == _Chain_Tail( the_chain ) );
+}
+
+/*PAGE
+ *
+ * Chain_Initialize_empty
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the specified chain to contain zero nodes.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty(
+ Chain_Control *the_chain
+)
+{
+ the_chain->first = _Chain_Tail( the_chain );
+ the_chain->permanent_null = NULL;
+ the_chain->last = _Chain_Head( the_chain );
+}
+
+/*PAGE
+ *
+ * _Chain_Extract_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine extracts the_node from the chain on which it resides.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * extract operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Extract_unprotected(
+ Chain_Node *the_node
+)
+{
+ Chain_Node *next;
+ Chain_Node *previous;
+
+ next = the_node->next;
+ previous = the_node->previous;
+ next->previous = previous;
+ previous->next = next;
+}
+
+/*PAGE
+ *
+ * _Chain_Get_first_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. It does NOT disable interrupts to insure
+ * the atomicity of the get operation.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+)
+{
+ Chain_Node *return_node;
+ Chain_Node *new_first;
+
+ return_node = the_chain->first;
+ new_first = return_node->next;
+ the_chain->first = new_first;
+ new_first->previous = _Chain_Head( the_chain );
+
+ return return_node;
+}
+
+/*PAGE
+ *
+ * Chain_Get_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first node from the_chain and returns
+ * a pointer to that node. If the_chain is empty, then NULL is returned.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * get operation.
+ */
+
+RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected(
+ Chain_Control *the_chain
+)
+{
+ if ( !_Chain_Is_empty( the_chain ) )
+ return _Chain_Get_first_unprotected( the_chain );
+ else
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Chain_Insert_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts the_node on a chain immediately following
+ * after_node. It does NOT disable interrupts to insure the atomicity
+ * of the extract operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Insert_unprotected(
+ Chain_Node *after_node,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *before_node;
+
+ the_node->previous = after_node;
+ before_node = after_node->next;
+ after_node->next = the_node;
+ the_node->next = before_node;
+ before_node->previous = the_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Append_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine appends the_node onto the end of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * append operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ Chain_Node *old_last_node;
+
+ the_node->next = _Chain_Tail( the_chain );
+ old_last_node = the_chain->last;
+ the_chain->last = the_node;
+ old_last_node->next = the_node;
+ the_node->previous = old_last_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend_unprotected
+ *
+ * DESCRIPTION:
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It does NOT disable interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Prepend_unprotected(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert_unprotected( _Chain_Head( the_chain ), the_node );
+
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend
+ *
+ * DESCRIPTION:
+ *
+ * This routine prepends the_node onto the front of the_chain.
+ * It disables interrupts to insure the atomicity of the
+ * prepend operation.
+ */
+
+RTEMS_INLINE_ROUTINE void _Chain_Prepend(
+ Chain_Control *the_chain,
+ Chain_Node *the_node
+)
+{
+ _Chain_Insert( _Chain_Head( the_chain ), the_node );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/coremsg.inl b/cpukit/score/inline/rtems/score/coremsg.inl
new file mode 100644
index 0000000000..9037e38d8c
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/coremsg.inl
@@ -0,0 +1,260 @@
+/* coremsg.inl
+ *
+ * This include file contains the static inline implementation of all
+ * inlined routines in the Core Message Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CORE_MESSAGE_QUEUE_inl
+#define __CORE_MESSAGE_QUEUE_inl
+
+#include <string.h> /* needed for memcpy */
+
+/*PAGE
+ *
+ * _CORE_message_queue_Send
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a message to the end of the specified message queue.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Status _CORE_message_queue_Send(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support
+)
+{
+ return _CORE_message_queue_Submit(
+ the_message_queue,
+ buffer,
+ size,
+ id,
+ api_message_queue_mp_support,
+ CORE_MESSAGE_QUEUE_SEND_REQUEST
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Urgent
+ *
+ * DESCRIPTION:
+ *
+ * This routine sends a message to the front of the specified message queue.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Status _CORE_message_queue_Urgent(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support
+)
+{
+ return _CORE_message_queue_Submit(
+ the_message_queue,
+ buffer,
+ size,
+ id,
+ api_message_queue_mp_support,
+ CORE_MESSAGE_QUEUE_URGENT_REQUEST
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Copy_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine copies the contents of the source message buffer
+ * to the destination message buffer.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Copy_buffer (
+ void *source,
+ void *destination,
+ unsigned32 size
+)
+{
+ memcpy(destination, source, size);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Allocate_message_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a message buffer from the inactive
+ * message buffer chain.
+ */
+
+RTEMS_INLINE_ROUTINE CORE_message_queue_Buffer_control *
+_CORE_message_queue_Allocate_message_buffer (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (CORE_message_queue_Buffer_control *)
+ _Chain_Get( &the_message_queue->Inactive_messages );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Free_message_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a message buffer to the inactive
+ * message buffer chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Get_pending_message
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the first message from the_message_queue
+ * and returns a pointer to it.
+ */
+
+RTEMS_INLINE_ROUTINE
+ CORE_message_queue_Buffer_control *_CORE_message_queue_Get_pending_message (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (CORE_message_queue_Buffer_control *)
+ _Chain_Get_unprotected( &the_message_queue->Pending_messages );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_priority(
+ CORE_message_queue_Attributes *the_attribute
+)
+{
+ return (the_attribute->discipline == CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Append
+ *
+ * DESCRIPTION:
+ *
+ * This routine places the_message at the rear of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Append (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Append( &the_message_queue->Pending_messages, &the_message->Node );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Prepend
+ *
+ * DESCRIPTION:
+ *
+ * This routine places the_message at the front of the outstanding
+ * messages on the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Prepend (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Buffer_control *the_message
+)
+{
+ _Chain_Prepend(
+ &the_message_queue->Pending_messages,
+ &the_message->Node
+ );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_message_queue is TRUE and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_null (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return ( the_message_queue == NULL );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_notify_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if notification is enabled on this message
+ * queue and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_message_queue_Is_notify_enabled (
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ return (the_message_queue->notify_handler != NULL);
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Set_notify
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the notification information for the_message_queue.
+ */
+
+RTEMS_INLINE_ROUTINE void _CORE_message_queue_Set_notify (
+ CORE_message_queue_Control *the_message_queue,
+ CORE_message_queue_Notify_Handler the_handler,
+ void *the_argument
+)
+{
+ the_message_queue->notify_handler = the_handler;
+ the_message_queue->notify_argument = the_argument;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/coremutex.inl b/cpukit/score/inline/rtems/score/coremutex.inl
new file mode 100644
index 0000000000..411c1d3a22
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/coremutex.inl
@@ -0,0 +1,124 @@
+/* inline/coremutex.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE mutexes.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CORE_MUTEX_inl
+#define __INLINE_CORE_MUTEX_inl
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_locked
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex specified is locked and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_locked(
+ CORE_mutex_Control *the_mutex
+)
+{
+ return the_mutex->lock == CORE_MUTEX_LOCKED;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_fifo
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is FIFO and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_fifo(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_FIFO;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is PRIORITY and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_priority(
+ CORE_mutex_Attributes *the_attribute
+)
+{
+ return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY;
+}
+
+/*PAGE
+ *
+ * _CORE_mutex_Is_inherit_priority
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * INHERIT_PRIORITY and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE 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
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the mutex's wait discipline is
+ * PRIORITY_CEILING and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE 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.
+ */
+
+RTEMS_INLINE_ROUTINE 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..dcca1761f1
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/coresem.inl
@@ -0,0 +1,54 @@
+/* inline/coresem.inl
+ *
+ * This include file contains all of the inlined routines associated
+ * with the CORE semaphore.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_CORE_SEMAPHORE_inl
+#define __INLINE_CORE_SEMAPHORE_inl
+
+/*PAGE
+ *
+ * _CORE_semaphore_Is_priority
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority attribute is
+ * enabled in the attribute_set and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _CORE_semaphore_Is_priority(
+ CORE_semaphore_Attributes *the_attribute
+)
+{
+ return ( the_attribute->discipline == CORE_SEMAPHORE_DISCIPLINES_PRIORITY );
+}
+
+/*PAGE
+ *
+ * _CORE_semaphore_Get_count
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns the current count associated with the semaphore.
+ */
+
+RTEMS_INLINE_ROUTINE 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
new file mode 100644
index 0000000000..bca2e3ee92
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/heap.inl
@@ -0,0 +1,274 @@
+/* heap.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the heap handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __HEAP_inl
+#define __HEAP_inl
+
+#include <rtems/score/address.h>
+
+/*PAGE
+ *
+ * _Heap_Head
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the head of the specified heap.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Head (
+ Heap_Control *the_heap
+)
+{
+ return (Heap_Block *)&the_heap->start;
+}
+
+/*PAGE
+ *
+ * _Heap_Tail
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the tail of the specified heap.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Tail (
+ Heap_Control *the_heap
+)
+{
+ return (Heap_Block *)&the_heap->final;
+}
+
+/*PAGE
+ *
+ * _Heap_Previous_block
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the address of the block which physically
+ * precedes the_block in memory.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Previous_block (
+ Heap_Block *the_block
+)
+{
+ return (Heap_Block *) _Addresses_Subtract_offset(
+ (void *)the_block,
+ the_block->back_flag & ~ HEAP_BLOCK_USED
+ );
+}
+
+/*PAGE
+ *
+ * _Heap_Next_block
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the address of the block which physically
+ * follows the_block in memory.
+ *
+ * NOTE: Next_block assumes that the block is free.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Next_block (
+ Heap_Block *the_block
+)
+{
+ return (Heap_Block *) _Addresses_Add_offset(
+ (void *)the_block,
+ the_block->front_flag & ~ HEAP_BLOCK_USED
+ );
+}
+
+/*PAGE
+ *
+ * _Heap_Block_at
+ *
+ * DESCRIPTION:
+ *
+ * This function calculates and returns a block's location (address)
+ * in the heap based upad a base address and an offset.
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at(
+ void *base,
+ unsigned32 offset
+)
+{
+ return (Heap_Block *) _Addresses_Add_offset( (void *)base, offset );
+}
+
+/*PAGE
+ *
+ * _Heap_User_block_at
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+RTEMS_INLINE_ROUTINE Heap_Block *_Heap_User_block_at(
+ void *base
+)
+{
+ unsigned32 offset;
+
+ offset = *(((unsigned32 *) base) - 1);
+ return _Heap_Block_at( base, -offset + -HEAP_BLOCK_USED_OVERHEAD);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_previous_block_free
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the previous block of the_block
+ * is free, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_previous_block_free (
+ Heap_Block *the_block
+)
+{
+ return !(the_block->back_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_free
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the block is free, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_free (
+ Heap_Block *the_block
+)
+{
+ return !(the_block->front_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_used
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the block is currently allocated,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_used (
+ Heap_Block *the_block
+)
+{
+ return (the_block->front_flag & HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Block_size
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the size of the_block in bytes.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Heap_Block_size (
+ Heap_Block *the_block
+)
+{
+ return (the_block->front_flag & ~HEAP_BLOCK_USED);
+}
+
+/*PAGE
+ *
+ * _Heap_Start_of_user_area
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the starting address of the portion of the block
+ * which the user may access.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Heap_Start_of_user_area (
+ Heap_Block *the_block
+)
+{
+ return (void *) &the_block->next;
+}
+
+/*PAGE
+ *
+ * _Heap_Is_block_in
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_block is within the memory area
+ * managed by the_heap, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_in (
+ Heap_Control *the_heap,
+ Heap_Block *the_block
+)
+{
+ return _Addresses_Is_in_range( the_block, the_heap->start, the_heap->final );
+}
+
+/*PAGE
+ *
+ * _Heap_Is_page_size_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function validates a specified heap page size. If the page size
+ * is 0 or if lies outside a page size alignment boundary it is invalid
+ * and FALSE is returned. Otherwise, the page size is valid and TRUE is
+ * returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Heap_Is_page_size_valid(
+ unsigned32 page_size
+)
+{
+ return ((page_size != 0) &&
+ ((page_size % CPU_HEAP_ALIGNMENT) == 0));
+}
+
+/*PAGE
+ *
+ * _Heap_Build_flag
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the block flag composed of size and in_use_flag.
+ * The flag returned is suitable for use as a back or front flag in a
+ * heap block.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Heap_Build_flag (
+ unsigned32 size,
+ unsigned32 in_use_flag
+)
+{
+ return size | in_use_flag;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/isr.inl b/cpukit/score/inline/rtems/score/isr.inl
new file mode 100644
index 0000000000..2cfbe6e1b9
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/isr.inl
@@ -0,0 +1,73 @@
+/* isr.inl
+ *
+ * This include file contains the static implementation of all
+ * inlined routines in the Interrupt Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_inl
+#define __ISR_inl
+
+/*PAGE
+ *
+ * _ISR_Is_in_progress
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the processor is currently servicing
+ * and interrupt and FALSE otherwise. A return value of TRUE indicates
+ * that the caller is an interrupt service routine, NOT a thread. The
+ * directives available to an interrupt service routine are restricted.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_in_progress( void )
+{
+ return (_ISR_Nest_level != 0);
+}
+
+/*PAGE
+ *
+ * _ISR_Is_vector_number_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the vector is a valid vector number
+ * for this processor and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_vector_number_valid (
+ unsigned32 vector
+)
+{
+ return ( vector <= CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER );
+}
+
+/*PAGE
+ *
+ * _ISR_Is_valid_user_handler
+ *
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if handler is the entry point of a valid
+ * use interrupt service routine and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _ISR_Is_valid_user_handler (
+ void *handler
+)
+{
+ return ( handler != NULL);
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/mppkt.inl b/cpukit/score/inline/rtems/score/mppkt.inl
new file mode 100644
index 0000000000..a805e24ac7
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/mppkt.inl
@@ -0,0 +1,58 @@
+/* inline/mppkt.inl
+ *
+ * This package is the implementation of the Packet Handler
+ * routines which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_PACKET_inl
+#define __INLINE_MP_PACKET_inl
+
+/*PAGE
+ *
+ * _Mp_packet_Is_valid_packet_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the the_packet_class is valid,
+ * and FALSE otherwise.
+ *
+ * NOTE: Check for lower bounds (MP_PACKET_CLASSES_FIRST ) is unnecessary
+ * because this enum starts at lower bound of zero.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Mp_packet_Is_valid_packet_class (
+ MP_packet_Classes the_packet_class
+)
+{
+ return ( the_packet_class <= MP_PACKET_CLASSES_LAST );
+}
+
+/*PAGE
+ *
+ * _Mp_packet_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the the_packet_class is null,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Mp_packet_Is_null (
+ MP_packet_Prefix *the_packet
+)
+{
+ return the_packet == NULL;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/object.inl b/cpukit/score/inline/rtems/score/object.inl
new file mode 100644
index 0000000000..9e71164068
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/object.inl
@@ -0,0 +1,244 @@
+/* object.inl
+ *
+ * This include file contains the static inline implementation of all
+ * of the inlined routines in the Object Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_inl
+#define __OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_Build_id
+ *
+ * DESCRIPTION:
+ *
+ * This function builds an object's id from the processor node and index
+ * values specified.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Id _Objects_Build_id(
+ Objects_Classes the_class,
+ unsigned32 node,
+ unsigned32 index
+)
+{
+ return ( (the_class << OBJECTS_CLASS_START_BIT) |
+ (node << OBJECTS_NODE_START_BIT) |
+ (index << OBJECTS_INDEX_START_BIT) );
+}
+
+/*PAGE
+ *
+ * _Objects_Get_class
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the class portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Classes _Objects_Get_class(
+ Objects_Id id
+)
+{
+ return (Objects_Classes)
+ ((id >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS);
+}
+
+
+/*PAGE
+ *
+ * _Objects_Get_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the node portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Objects_Get_node(
+ Objects_Id id
+)
+{
+ return (id >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS;
+}
+
+/*PAGE
+ *
+ * _Objects_Get_index
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the index portion of the ID.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Objects_Get_index(
+ Objects_Id id
+)
+{
+ return (id >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS;
+}
+
+/*PAGE
+ *
+ * _Objects_Is_class_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the class is valid.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_class_valid(
+ Objects_Classes the_class
+)
+{
+ return the_class <= OBJECTS_CLASSES_LAST;
+}
+
+/*PAGE
+ *
+ * _Objects_Is_local_node
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the node is of the local object, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_local_node(
+ unsigned32 node
+)
+{
+ return ( node == _Objects_Local_node );
+}
+
+/*PAGE
+ *
+ * _Objects_Is_local_id
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the id is of a local object, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Is_local_id(
+ Objects_Id id
+)
+{
+ return _Objects_Is_local_node( _Objects_Get_node(id) );
+}
+
+/*PAGE
+ *
+ * _Objects_Are_ids_equal
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if left and right are equal,
+ * and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_Are_ids_equal(
+ Objects_Id left,
+ Objects_Id right
+)
+{
+ return ( left == right );
+}
+
+/*PAGE
+ *
+ * _Objects_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a object control block from
+ * the inactive chain of free object control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_Control *_Objects_Allocate(
+ Objects_Information *information
+)
+{
+ return (Objects_Control *) _Chain_Get( &information->Inactive );
+}
+
+/*PAGE
+ *
+ * _Objects_Free
+ *
+ * DESCRIPTION:
+ *
+ * This function frees a object control block to the
+ * inactive chain of free object control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Free(
+ Objects_Information *information,
+ Objects_Control *the_object
+)
+{
+ _Chain_Append( &information->Inactive, &the_object->Node );
+}
+
+/*PAGE
+ *
+ * _Objects_Open
+ *
+ * DESCRIPTION:
+ *
+ * This function places the_object control pointer and object name
+ * in the Local Pointer and Local Name Tables, respectively.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Open(
+ Objects_Information *information,
+ Objects_Control *the_object,
+ Objects_Name name
+)
+{
+ unsigned32 index;
+
+ index = _Objects_Get_index( the_object->id );
+ information->local_table[ index ] = the_object;
+
+ if ( information->is_string )
+ _Objects_Copy_name_string( name, the_object->name );
+ else
+ _Objects_Copy_name_raw( name, the_object->name, information->name_length );
+}
+
+/*PAGE
+ *
+ * _Objects_Close
+ *
+ * DESCRIPTION:
+ *
+ * This function removes the_object control pointer and object name
+ * in the Local Pointer and Local Name Tables.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_Close(
+ Objects_Information *information,
+ Objects_Control *the_object
+)
+{
+ unsigned32 index;
+
+ index = _Objects_Get_index( the_object->id );
+ information->local_table[ index ] = NULL;
+ _Objects_Clear_name( the_object->name, information->name_length );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/objectmp.inl b/cpukit/score/inline/rtems/score/objectmp.inl
new file mode 100644
index 0000000000..12b0df642a
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/objectmp.inl
@@ -0,0 +1,73 @@
+/* inline/objectmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * which deal with global objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_OBJECTS_inl
+#define __INLINE_MP_OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This function allocates a Global Object control block.
+ */
+
+RTEMS_INLINE_ROUTINE Objects_MP_Control *_Objects_MP_Allocate_global_object (
+ void
+)
+{
+ return (Objects_MP_Control *)
+ _Chain_Get( &_Objects_MP_Inactive_global_objects );
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Free_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This routine deallocates a Global Object control block.
+ */
+
+RTEMS_INLINE_ROUTINE void _Objects_MP_Free_global_object (
+ Objects_MP_Control *the_object
+)
+{
+ _Chain_Append(
+ &_Objects_MP_Inactive_global_objects,
+ &the_object->Object.Node
+ );
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Is_null_global_object
+ *
+ * DESCRIPTION:
+ *
+ * This function returns whether the global object is NULL or not.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Objects_MP_Is_null_global_object (
+ Objects_MP_Control *the_object
+)
+{
+ return( the_object == NULL );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/priority.inl b/cpukit/score/inline/rtems/score/priority.inl
new file mode 100644
index 0000000000..1dfa53057e
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/priority.inl
@@ -0,0 +1,247 @@
+/* priority.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the Priority Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_inl
+#define __PRIORITY_inl
+
+#include <rtems/score/bitfield.h>
+
+/*PAGE
+ *
+ * _Priority_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Handler_initialization( void )
+{
+ unsigned32 index;
+
+ _Priority_Major_bit_map = 0;
+ for ( index=0 ; index <16 ; index++ )
+ _Priority_Bit_map[ index ] = 0;
+}
+
+/*PAGE
+ *
+ * _Priority_Is_valid
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority if valid for a
+ * user task, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Priority_Is_valid (
+ Priority_Control the_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
+ *
+ * _Priority_Major
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the major portion of the_priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Major (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority / 16 );
+}
+
+/*PAGE
+ *
+ * _Priority_Minor
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the minor portion of the_priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Minor (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority % 16 );
+}
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
+
+/*PAGE
+ *
+ * _Priority_Mask
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the mask associated with the major or minor
+ * number passed to it.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Mask (
+ unsigned32 bit_number
+)
+{
+ return (0x8000 >> bit_number);
+}
+
+
+/*PAGE
+ *
+ * _Priority_Bits_index
+ *
+ * DESCRIPTION:
+ *
+ * This function translates the bit numbers returned by the bit scan
+ * of a priority bit field into something suitable for use as
+ * a major or minor component of a priority.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Priority_Bits_index (
+ unsigned32 bit_number
+)
+{
+ return bit_number;
+}
+
+#endif
+
+/*PAGE
+ *
+ * _Priority_Add_to_bit_map
+ *
+ * DESCRIPTION:
+ *
+ * This routine uses the_priority_map to update the priority
+ * bit maps to indicate that a thread has been readied.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map (
+ Priority_Information *the_priority_map
+)
+{
+ *the_priority_map->minor |= the_priority_map->ready_minor;
+ _Priority_Major_bit_map |= the_priority_map->ready_major;
+}
+
+/*PAGE
+ *
+ * _Priority_Remove_from_bit_map
+ *
+ * DESCRIPTION:
+ *
+ * This routine uses the_priority_map to update the priority
+ * bit maps to indicate that a thread has been removed from the
+ * ready state.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Remove_from_bit_map (
+ Priority_Information *the_priority_map
+)
+{
+ *the_priority_map->minor &= the_priority_map->block_minor;
+ if ( *the_priority_map->minor == 0 )
+ _Priority_Major_bit_map &= the_priority_map->block_major;
+}
+
+/*PAGE
+ *
+ * _Priority_Get_highest
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the priority of the highest priority
+ * ready thread.
+ */
+
+RTEMS_INLINE_ROUTINE Priority_Control _Priority_Get_highest( void )
+{
+ Priority_Bit_map_control minor;
+ Priority_Bit_map_control major;
+
+ _Bitfield_Find_first_bit( _Priority_Major_bit_map, major );
+ _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor );
+
+ return (_Priority_Bits_index( major ) << 4) +
+ _Priority_Bits_index( minor );
+}
+
+/*PAGE
+ *
+ * _Priority_Initialize_information
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_priority_map so that it
+ * contains the information necessary to manage a thread
+ * at new_priority.
+ */
+
+RTEMS_INLINE_ROUTINE void _Priority_Initialize_information(
+ Priority_Information *the_priority_map,
+ Priority_Control new_priority
+)
+{
+ Priority_Bit_map_control major;
+ Priority_Bit_map_control minor;
+ Priority_Bit_map_control mask;
+
+ major = _Priority_Major( new_priority );
+ minor = _Priority_Minor( new_priority );
+
+ the_priority_map->minor =
+ &_Priority_Bit_map[ _Priority_Bits_index(major) ];
+
+ mask = _Priority_Mask( major );
+ the_priority_map->ready_major = mask;
+ the_priority_map->block_major = ~mask;
+
+ mask = _Priority_Mask( minor );
+ the_priority_map->ready_minor = mask;
+ the_priority_map->block_minor = ~mask;
+}
+
+/*PAGE
+ *
+ * _Priority_Is_group_empty
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the priority GROUP is empty, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Priority_Is_group_empty (
+ Priority_Control the_priority
+)
+{
+ return the_priority == 0;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/stack.inl b/cpukit/score/inline/rtems/score/stack.inl
new file mode 100644
index 0000000000..03eb35b554
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/stack.inl
@@ -0,0 +1,81 @@
+/* stack.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines from the Stack Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_inl
+#define __STACK_inl
+
+/*PAGE
+ *
+ * _Stack_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the_stack record to indicate that
+ * size bytes of memory starting at starting_address have been
+ * reserved for a stack.
+ */
+
+RTEMS_INLINE_ROUTINE void _Stack_Initialize (
+ Stack_Control *the_stack,
+ void *starting_address,
+ unsigned32 size
+)
+{
+ the_stack->area = starting_address;
+ the_stack->size = size;
+}
+
+/*PAGE
+ *
+ * _Stack_Is_enough
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if size bytes is enough memory for
+ * a valid stack area on this processor, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Stack_Is_enough (
+ unsigned32 size
+)
+{
+ return ( size >= STACK_MINIMUM_SIZE );
+}
+
+/*PAGE
+ *
+ * _Stack_Adjust_size
+ *
+ * DESCRIPTION:
+ *
+ * This function increases the stack size to insure that the thread
+ * has the desired amount of stack space after the initial stack
+ * pointer is determined based on alignment restrictions.
+ *
+ * NOTE:
+ *
+ * The amount of adjustment for alignment is CPU dependent.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Stack_Adjust_size (
+ unsigned32 size
+)
+{
+ return size + CPU_STACK_ALIGNMENT;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/states.inl b/cpukit/score/inline/rtems/score/states.inl
new file mode 100644
index 0000000000..c65e9f90c8
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/states.inl
@@ -0,0 +1,384 @@
+/* states.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines associated with thread state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STATES_inl
+#define __STATES_inl
+
+/*PAGE
+ *
+ * _States_Set
+ *
+ * DESCRIPTION:
+ *
+ * This function sets the given states_to_set into the current_state
+ * passed in. The result is returned to the user in current_state.
+ */
+
+RTEMS_INLINE_ROUTINE States_Control _States_Set (
+ States_Control states_to_set,
+ States_Control current_state
+)
+{
+ return (current_state | states_to_set);
+}
+
+/*PAGE
+ *
+ * _States_Clear
+ *
+ * DESCRIPTION:
+ *
+ * This function clears the given states_to_clear into the current_state
+ * passed in. The result is returned to the user in current_state.
+ */
+
+RTEMS_INLINE_ROUTINE States_Control _States_Clear (
+ States_Control states_to_clear,
+ States_Control current_state
+)
+{
+ return (current_state & ~states_to_clear);
+}
+
+/*PAGE
+ *
+ * _States_Is_ready
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_states indicates that the
+ * state is READY, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_ready (
+ States_Control the_states
+)
+{
+ return (the_states == STATES_READY);
+}
+
+/*PAGE
+ *
+ * _States_Is_only_dormant
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DORMANT state is the ONLY state
+ * set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_only_dormant (
+ States_Control the_states
+)
+{
+ return (the_states == STATES_DORMANT);
+}
+
+/*PAGE
+ *
+ * _States_Is_dormant
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DORMANT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_dormant (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_DORMANT);
+}
+
+/*PAGE
+ *
+ * _States_Is_suspended
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the SUSPENDED state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_suspended (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_SUSPENDED);
+}
+
+/*PAGE
+ *
+ * _States_Is_Transient
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the TRANSIENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_transient (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_TRANSIENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_delaying
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the DELAYING state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_delaying (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_DELAYING);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_buffer
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_BUFFER state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_buffer (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_BUFFER);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_segment
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_SEGMENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_segment (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_SEGMENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_message
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_MESSAGE state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_message (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_MESSAGE);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_event
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_EVENT state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_event (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_EVENT);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_mutex
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_MUTEX state
+ * is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_mutex (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_MUTEX);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_semaphore
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_SEMAPHORE state
+ * is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_semaphore (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_SEMAPHORE);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_time
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_TIME state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_time (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_TIME);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_rpc_reply
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_TIME state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_rpc_reply (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_RPC_REPLY);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_period
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the WAITING_FOR_PERIOD state is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_for_period (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_FOR_PERIOD);
+}
+
+/*PAGE
+ *
+ * _States_Is_locally_blocked
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked waiting for a local resource is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_locally_blocked (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_LOCALLY_BLOCKED);
+}
+
+/*PAGE
+ *
+ * _States_Is_waiting_on_thread_queue
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked waiting for a local resource is set in
+ * the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_waiting_on_thread_queue (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_WAITING_ON_THREAD_QUEUE);
+}
+
+/*PAGE
+ *
+ * _States_Is_blocked
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if one of the states which indicates
+ * that a task is blocked is set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Is_blocked (
+ States_Control the_states
+)
+{
+ return (the_states & STATES_BLOCKED);
+}
+
+/*PAGE
+ *
+ *
+ * _States_Are_set
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if any of the states in the mask
+ * are set in the_states, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _States_Are_set (
+ States_Control the_states,
+ States_Control mask
+)
+{
+ return ( (the_states & mask) != STATES_READY);
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/sysstate.inl b/cpukit/score/inline/rtems/score/sysstate.inl
new file mode 100644
index 0000000000..bef8a6d8cd
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/sysstate.inl
@@ -0,0 +1,154 @@
+/* sysstates.inl
+ *
+ * This file contains the inline implementation of routines regarding the
+ * system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SYSTEM_STATE_inl
+#define __SYSTEM_STATE_inl
+
+/*PAGE
+ *
+ * _System_state_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the system state handler.
+ */
+
+RTEMS_INLINE_ROUTINE 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
+ *
+ * DESCRIPTION:
+ *
+ * This routine sets the current system state to that specified by
+ * the called.
+ */
+
+RTEMS_INLINE_ROUTINE void _System_state_Set (
+ System_state_Codes state
+)
+{
+ _System_state_Current = state;
+}
+
+/*PAGE
+ *
+ * _System_state_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the current system state.
+ */
+
+RTEMS_INLINE_ROUTINE System_state_Codes _System_state_Get ( void )
+{
+ return _System_state_Current;
+}
+
+/*PAGE
+ *
+ * _System_state_Is_before_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "before initialization" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_before_initialization (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEFORE_INITIALIZATION);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_before_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "before multitasking" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_before_multitasking (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEFORE_MULTITASKING);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_begin_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "begin multitasking" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_begin_multitasking (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_BEGIN_MULTITASKING);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_up
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "up" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_up (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_UP);
+}
+
+/*PAGE
+ *
+ * _System_state_Is_failed
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the state is equal to the
+ * "failed" state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _System_state_Is_failed (
+ System_state_Codes state
+)
+{
+ return (state == SYSTEM_STATE_FAILED);
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/thread.inl b/cpukit/score/inline/rtems/score/thread.inl
new file mode 100644
index 0000000000..8f969358dd
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/thread.inl
@@ -0,0 +1,404 @@
+/* thread.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Thread handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_inl
+#define __THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_Stop_multitasking
+ *
+ * DESCRIPTION:
+ *
+ * This routine halts multitasking and returns control to
+ * the "thread" (i.e. the BSP) which initially invoked the
+ * routine which initialized the system.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Stop_multitasking( void )
+{
+ _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_executing
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is the currently executing
+ * thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Executing );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is the heir
+ * thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_heir (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Heir );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_executing_also_the_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the currently executing thread
+ * is also the heir thread, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing_also_the_heir( void )
+{
+ return ( _Thread_Executing == _Thread_Heir );
+}
+
+/*PAGE
+ *
+ * _Thread_Resume
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears the SUSPENDED state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Resume (
+ Thread_Control *the_thread
+)
+{
+ _Thread_Clear_state( the_thread, STATES_SUSPENDED );
+}
+
+/*PAGE
+ *
+ * _Thread_Unblock
+ *
+ * DESCRIPTION:
+ *
+ * This routine clears any blocking state for the_thread. It performs
+ * any necessary scheduling operations including the selection of
+ * a new heir thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Unblock (
+ Thread_Control *the_thread
+)
+{
+ _Thread_Clear_state( the_thread, STATES_BLOCKED );
+}
+
+/*PAGE
+ *
+ * _Thread_Restart_self
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets the current context of the calling thread
+ * to that of its initial state.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void )
+{
+ if ( _Thread_Executing->fp_context != NULL )
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+
+ _CPU_Context_Restart_self( &_Thread_Executing->Registers );
+}
+
+/*PAGE
+ *
+ * _Thread_Calculate_heir
+ *
+ * DESCRIPTION:
+ *
+ * This function returns a pointer to the highest priority
+ * ready thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Calculate_heir( void )
+{
+ _Thread_Heir = (Thread_Control *)
+ _Thread_Ready_chain[ _Priority_Get_highest() ].first;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_allocated_fp
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the floating point context of
+ * the_thread is currently loaded in the floating point unit, and
+ * FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_allocated_fp (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == _Thread_Allocated_fp );
+}
+
+/*PAGE
+ *
+ * _Thread_Deallocate_fp
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked when the currently loaded floating
+ * point context is now longer associated with an active thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Deallocate_fp( void )
+{
+ _Thread_Allocated_fp = NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_Disable_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine prevents dispatching.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Disable_dispatch( void )
+{
+ _Thread_Dispatch_disable_level += 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Enable_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine allows dispatching to occur again. If this is
+ * the outer most dispatching critical section, then a dispatching
+ * operation will be performed and, if necessary, control of the
+ * processor will be transferred to the heir thread.
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == TRUE )
+RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch()
+{
+ if ( (--_Thread_Dispatch_disable_level) == 0 )
+ _Thread_Dispatch();
+}
+#endif
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void );
+#endif
+
+/*PAGE
+ *
+ * _Thread_Unnest_dispatch
+ *
+ * DESCRIPTION:
+ *
+ * This routine allows dispatching to occur again. However,
+ * no dispatching operation is performed even if this is the outer
+ * most dispatching critical section.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void )
+{
+ _Thread_Dispatch_disable_level -= 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_dispatching_enabled
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if dispatching is disabled, and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_dispatching_enabled( void )
+{
+ return ( _Thread_Dispatch_disable_level == 0 );
+}
+
+/*PAGE
+ *
+ * _Thread_Is_context_switch_necessary
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if dispatching is disabled, and FALSE
+ * otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_context_switch_necessary( void )
+{
+ return ( _Context_Switch_necessary );
+}
+
+/*PAGE
+ *
+ * _Thread_Dispatch_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the thread dispatching subsystem.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Dispatch_initialization( void )
+{
+ _Thread_Dispatch_disable_level = 1;
+}
+
+/*PAGE
+ *
+ * _Thread_Is_null
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_thread is NULL and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_null (
+ Thread_Control *the_thread
+)
+{
+ return ( the_thread == NULL );
+}
+
+/*PAGE
+ *
+ * _Thread_Get
+ *
+ * DESCRIPTION:
+ *
+ * This function maps thread IDs to thread control
+ * blocks. If ID corresponds to a local thread, then it
+ * returns the_thread control pointer which maps to ID
+ * and location is set to OBJECTS_LOCAL. If the thread ID is
+ * global and resides on a remote node, then location is set
+ * to OBJECTS_REMOTE, and the_thread is undefined.
+ * Otherwise, location is set to OBJECTS_ERROR and
+ * the_thread is undefined.
+ *
+ * NOTE: XXX... This routine may be able to be optimized.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ Objects_Classes the_class;
+ Objects_Information *information;
+ Thread_Control *tp = (Thread_Control *) 0;
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
+ _Thread_Disable_dispatch();
+ *location = OBJECTS_LOCAL;
+ tp = _Thread_Executing;
+ goto done;
+ }
+
+ the_class = _Objects_Get_class( id );
+
+ if ( the_class > OBJECTS_CLASSES_LAST ) {
+ *location = OBJECTS_ERROR;
+ goto done;
+ }
+
+ information = _Objects_Information_table[ the_class ];
+
+ if ( !information || !information->is_thread ) {
+ *location = OBJECTS_ERROR;
+ goto done;
+ }
+
+ tp = (Thread_Control *) _Objects_Get( information, id, location );
+
+done:
+ return tp;
+}
+
+
+/*
+ * _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.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_Is_proxy_blocking (
+ unsigned32 code
+)
+{
+ return (code == THREAD_STATUS_PROXY_BLOCKING);
+}
+
+/*PAGE
+ *
+ * _Thread_Internal_allocate
+ *
+ * DESCRIPTION:
+ *
+ * This routine allocates an internal thread.
+ */
+
+RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void )
+{
+ return (Thread_Control *) _Objects_Allocate( &_Thread_Internal_information );
+}
+
+/*PAGE
+ *
+ * _Thread_Internal_free
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees an internal thread.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_Internal_free (
+ Thread_Control *the_task
+)
+{
+ _Objects_Free( &_Thread_Internal_information, &the_task->Object );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/threadmp.inl b/cpukit/score/inline/rtems/score/threadmp.inl
new file mode 100644
index 0000000000..0da7dbad7e
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/threadmp.inl
@@ -0,0 +1,61 @@
+/* inline/threadmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * for the multiprocessing part of thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __INLINE_MP_THREAD_inl
+#define __INLINE_MP_THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_MP_Is_receive
+ *
+ * DESCRIPTION:
+ *
+ * This function returns true if the thread in question is the
+ * multiprocessing receive thread.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_MP_Is_receive (
+ Thread_Control *the_thread
+)
+{
+ return the_thread == _Thread_MP_Receive;
+}
+
+/*PAGE
+ *
+ * _Thread_MP_Free_proxy
+ *
+ * DESCRIPTION:
+ *
+ * This routine frees a proxy control block to the
+ * inactive chain of free proxy control blocks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_MP_Free_proxy (
+ Thread_Control *the_thread
+)
+{
+ Thread_Proxy_control *the_proxy;
+
+ the_proxy = (Thread_Proxy_control *) the_thread;
+
+ _Chain_Extract( &the_proxy->Active );
+
+ _Chain_Append( &_Thread_MP_Inactive_proxies, &the_thread->Object.Node );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/tod.inl b/cpukit/score/inline/rtems/score/tod.inl
new file mode 100644
index 0000000000..3072393224
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/tod.inl
@@ -0,0 +1,67 @@
+/* tod.inl
+ *
+ * This file contains the static inline implementation of the inlined routines
+ * from the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_inl
+#define __TIME_OF_DAY_inl
+
+/*PAGE
+ *
+ * _TOD_Tickle_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine increments the ticks field of the current time of
+ * day at each clock tick.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Tickle_ticks( void )
+{
+ _TOD_Current.ticks += 1;
+ _Watchdog_Ticks_since_boot += 1;
+}
+
+/*PAGE
+ *
+ * _TOD_Deactivate
+ *
+ * DESCRIPTION:
+ *
+ * This routine deactivates updating of the current time of day.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Deactivate( void )
+{
+ _Watchdog_Remove( &_TOD_Seconds_watchdog );
+}
+
+/*PAGE
+ *
+ * _TOD_Activate
+ *
+ * DESCRIPTION:
+ *
+ * This routine activates updating of the current time of day.
+ */
+
+RTEMS_INLINE_ROUTINE void _TOD_Activate(
+ Watchdog_Interval ticks
+)
+{
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, ticks );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/tqdata.inl b/cpukit/score/inline/rtems/score/tqdata.inl
new file mode 100644
index 0000000000..4da6629b27
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/tqdata.inl
@@ -0,0 +1,73 @@
+/* tqdata.inl
+ *
+ * This file contains the static inline implementation of the inlined
+ * routines needed to support the Thread Queue Data.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_inl
+#define __THREAD_QUEUE_DATA_inl
+
+/*PAGE
+ *
+ * _Thread_queue_Header_number
+ *
+ * DESCRIPTION:
+ *
+ * This function returns the index of the priority chain on which
+ * a thread of the_priority should be placed.
+ */
+
+RTEMS_INLINE_ROUTINE unsigned32 _Thread_queue_Header_number (
+ Priority_Control the_priority
+)
+{
+ return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER);
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Is_reverse_search
+ *
+ * DESCRIPTION:
+ *
+ * This function returns TRUE if the_priority indicates that the
+ * enqueue search should start at the front of this priority
+ * group chain, and FALSE if the search should start at the rear.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Thread_queue_Is_reverse_search (
+ Priority_Control the_priority
+)
+{
+ return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enter_critical_section
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked to indicate that the specified thread queue is
+ * entering a critical section.
+ */
+
+RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section (
+ Thread_queue_Control *the_thread_queue
+)
+{
+ the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED;
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/userext.inl b/cpukit/score/inline/rtems/score/userext.inl
new file mode 100644
index 0000000000..4f3e0fd42a
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/userext.inl
@@ -0,0 +1,121 @@
+/* userext.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the User Extension Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_inl
+#define __USER_EXTENSIONS_inl
+
+/*PAGE
+ *
+ * _User_extensions_Handler_initialization
+ *
+ * DESCRIPTION:
+ *
+ * This routine performs the initialization necessary for this handler.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Handler_initialization (
+ User_extensions_Table *initial_extensions
+)
+{
+ _Chain_Initialize_empty( &_User_extensions_List );
+
+ if ( initial_extensions ) {
+ _User_extensions_Initial.Callouts = *initial_extensions;
+ _Chain_Append( &_User_extensions_List, &_User_extensions_Initial.Node );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Add_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to add a user extension set to the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Add_set (
+ User_extensions_Control *the_extension,
+ User_extensions_Table *extension_table
+)
+{
+ the_extension->Callouts = *extension_table;
+
+ _Chain_Append( &_User_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Add_API_set
+ * DESCRIPTION:
+ *
+ * This routine is used to add an API extension set to the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Add_API_set (
+ User_extensions_Control *the_extension
+)
+{
+ _Chain_Prepend( &_User_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Remove_set
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to remove a user extension set from the active list.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Remove_set (
+ User_extensions_Control *the_extension
+)
+{
+ _Chain_Extract( &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_switch
+ *
+ * DESCRIPTION:
+ *
+ * This routine is used to invoke the user extension which
+ * is invoked when a context switch occurs.
+ */
+
+RTEMS_INLINE_ROUTINE void _User_extensions_Thread_switch (
+ Thread_Control *executing,
+ Thread_Control *heir
+)
+{
+ 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.thread_switch != NULL )
+ (*the_extension->Callouts.thread_switch)( executing, heir );
+ }
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/watchdog.inl b/cpukit/score/inline/rtems/score/watchdog.inl
new file mode 100644
index 0000000000..a9f5087f8a
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/watchdog.inl
@@ -0,0 +1,324 @@
+/* watchdog.inl
+ *
+ * This file contains the static inline implementation of all inlined
+ * routines in the Watchdog Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_inl
+#define __WATCHDOG_inl
+
+/*PAGE
+ *
+ * _Watchdog_Initialize
+ *
+ * DESCRIPTION:
+ *
+ * This routine initializes the specified watchdog. The watchdog is
+ * made inactive, the watchdog id and handler routine are set to the
+ * specified values.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Initialize(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Service_routine_entry routine,
+ Objects_Id id,
+ void *user_data
+)
+{
+ the_watchdog->state = WATCHDOG_INACTIVE;
+ the_watchdog->routine = routine;
+ the_watchdog->id = id;
+ the_watchdog->user_data = user_data;
+}
+
+/*PAGE
+ *
+ * _Watchdog_Is_active
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns TRUE if the watchdog timer is in the ACTIVE
+ * state, and FALSE otherwise.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Watchdog_Is_active(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( the_watchdog->state == WATCHDOG_ACTIVE );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Activate
+ *
+ * DESCRIPTION:
+ *
+ * This routine activates THE_WATCHDOG timer which is already
+ * on a watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Activate(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ the_watchdog->state = WATCHDOG_ACTIVE;
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Deactivate
+ *
+ * DESCRIPTION:
+ *
+ * This routine deactivates THE_WATCHDOG timer which will remain
+ * on a watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ the_watchdog->state = WATCHDOG_REMOVE_IT;
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at each clock tick to update the ticks
+ * watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void )
+{
+
+ _Watchdog_Tickle( &_Watchdog_Ticks_chain );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine is invoked at each clock tick to update the seconds
+ * watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void )
+{
+
+ _Watchdog_Tickle( &_Watchdog_Seconds_chain );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the ticks watchdog chain
+ * for a time of UNITS ticks. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Insert_ticks(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Interval units
+)
+{
+
+ the_watchdog->initial = units;
+
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine inserts THE_WATCHDOG into the seconds watchdog chain
+ * for a time of UNITS seconds. The INSERT_MODE indicates whether
+ * THE_WATCHDOG is to be activated automatically or later, explicitly
+ * by the caller.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Insert_seconds(
+ Watchdog_Control *the_watchdog,
+ Watchdog_Interval units
+)
+{
+
+ the_watchdog->initial = units;
+
+ _Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_seconds
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the seconds watchdog chain in the forward
+ * or backward DIRECTION for UNITS seconds. This is invoked when the
+ * current time of day is changed.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_seconds(
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+
+ _Watchdog_Adjust( &_Watchdog_Seconds_chain, direction, units );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_ticks
+ *
+ * DESCRIPTION:
+ *
+ * This routine adjusts the ticks watchdog chain in the forward
+ * or backward DIRECTION for UNITS ticks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Adjust_ticks(
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+
+ _Watchdog_Adjust( &_Watchdog_Ticks_chain, direction, units );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Reset
+ *
+ * DESCRIPTION:
+ *
+ * This routine resets THE_WATCHDOG timer to its state at INSERT
+ * time. This routine is valid only on interval watchdog timers
+ * and is used to make an interval watchdog timer fire "every" so
+ * many ticks.
+ */
+
+RTEMS_INLINE_ROUTINE void _Watchdog_Reset(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ (void) _Watchdog_Remove( the_watchdog );
+
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Next
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the watchdog timer following
+ * THE_WATCHDOG on the watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Next(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( (Watchdog_Control *) the_watchdog->Node.next );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Previous
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the watchdog timer preceding
+ * THE_WATCHDOG on the watchdog chain.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Previous(
+ Watchdog_Control *the_watchdog
+)
+{
+
+ return ( (Watchdog_Control *) the_watchdog->Node.previous );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_First
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the first watchdog timer
+ * on the watchdog chain HEADER.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First(
+ Chain_Control *header
+)
+{
+
+ return ( (Watchdog_Control *) header->first );
+
+}
+
+/*PAGE
+ *
+ * _Watchdog_Last
+ *
+ * DESCRIPTION:
+ *
+ * This routine returns a pointer to the last watchdog timer
+ * on the watchdog chain HEADER.
+ */
+
+RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Last(
+ Chain_Control *header
+)
+{
+
+ return ( (Watchdog_Control *) header->last );
+
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/inline/rtems/score/wkspace.inl b/cpukit/score/inline/rtems/score/wkspace.inl
new file mode 100644
index 0000000000..b71c648aae
--- /dev/null
+++ b/cpukit/score/inline/rtems/score/wkspace.inl
@@ -0,0 +1,57 @@
+/* wkspace.inl
+ *
+ * This include file contains the bodies of the routines which contains
+ * information related to the RAM Workspace.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_inl
+#define __WORKSPACE_inl
+
+/*PAGE
+ *
+ * _Workspace_Allocate
+ *
+ * DESCRIPTION:
+ *
+ * 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 NULL is returned.
+ */
+
+RTEMS_INLINE_ROUTINE void *_Workspace_Allocate(
+ unsigned32 size
+)
+{
+ return _Heap_Allocate( &_Workspace_Area, size );
+}
+
+/*PAGE
+ *
+ * _Workspace_Free
+ *
+ * DESCRIPTION:
+ *
+ * This function frees the specified block of memory. If the block
+ * belongs to the Workspace and can be successfully freed, then
+ * TRUE is returned. Otherwise FALSE is returned.
+ */
+
+RTEMS_INLINE_ROUTINE boolean _Workspace_Free(
+ void *block
+)
+{
+ return _Heap_Free( &_Workspace_Area, block );
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/README b/cpukit/score/macros/README
new file mode 100644
index 0000000000..b2f0c4d481
--- /dev/null
+++ b/cpukit/score/macros/README
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+
+The files in this directory are not considered the "primary" source
+of inlined routines for RTEMS. The "inline" directory contains
+the implementations of the inlined basis which are regularly
+tested. In general, an effort is made to keep the contents of
+this directory up to date but testing is only performed irregularly
+and even then it is usually with a single target processor and BSP.
+
+The primary purpose of the code in this directory is to insure
+that RTEMS can be compiled using a C compiler which does not support
+static inline routines.
+
+These were last successfully tested on 2/1/95 on a prerelease version
+of 3.2.0. The testing was done only on the Force CPU386 i386 target board.
+No testing was done on version of the code in the final release.
diff --git a/cpukit/score/macros/rtems/score/README b/cpukit/score/macros/rtems/score/README
new file mode 100644
index 0000000000..b2f0c4d481
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/README
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+
+The files in this directory are not considered the "primary" source
+of inlined routines for RTEMS. The "inline" directory contains
+the implementations of the inlined basis which are regularly
+tested. In general, an effort is made to keep the contents of
+this directory up to date but testing is only performed irregularly
+and even then it is usually with a single target processor and BSP.
+
+The primary purpose of the code in this directory is to insure
+that RTEMS can be compiled using a C compiler which does not support
+static inline routines.
+
+These were last successfully tested on 2/1/95 on a prerelease version
+of 3.2.0. The testing was done only on the Force CPU386 i386 target board.
+No testing was done on version of the code in the final release.
diff --git a/cpukit/score/macros/rtems/score/address.inl b/cpukit/score/macros/rtems/score/address.inl
new file mode 100644
index 0000000000..ec748b7534
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/address.inl
@@ -0,0 +1,68 @@
+/* macros/address.h
+ *
+ * This include file contains the bodies of the routines
+ * about addresses which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_ADDRESSES_h
+#define __MACROS_ADDRESSES_h
+
+/*PAGE
+ *
+ * _Addresses_Add_offset
+ *
+ */
+
+#define _Addresses_Add_offset( _base, _offset ) \
+ ((void *)((char *)(_base) + (_offset)))
+
+/*PAGE
+ *
+ * _Addresses_Subtract_offset
+ *
+ */
+
+#define _Addresses_Subtract_offset( _base, _offset ) \
+ ((void *)((char *)(_base) - (_offset)))
+
+/*PAGE
+ *
+ * _Addresses_Subtract
+ *
+ * NOTE: The cast of an address to an unsigned32 makes this code
+ * dependent on an addresses being thirty two bits.
+ */
+
+#define _Addresses_Subtract( _left, _right ) \
+ ((void *)(_left) - (void *)(_right))
+
+/*PAGE
+ *
+ * _Addresses_Is_aligned
+ *
+ */
+
+#define _Addresses_Is_aligned( _address ) \
+ ( ( (unsigned32)(_address) % 4 ) == 0 )
+
+/*PAGE
+ *
+ * _Addresses_Is_in_range
+ *
+ */
+
+#define _Addresses_Is_in_range( _address, _base, _limit ) \
+ ( (_address) >= (_base) && (_address) <= (_limit) )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/chain.inl b/cpukit/score/macros/rtems/score/chain.inl
new file mode 100644
index 0000000000..bfd3f0ac96
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/chain.inl
@@ -0,0 +1,200 @@
+/* macros/chain.h
+ *
+ * This include file contains the bodies of the routines which are
+ * associated with doubly linked chains and inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_CHAIN_h
+#define __MACROS_CHAIN_h
+
+/*PAGE
+ *
+ * _Chain_Are_nodes_equal
+ */
+
+#define _Chain_Are_nodes_equal( _left, _right ) \
+ ( (_left) == (_right) )
+
+/*PAGE
+ *
+ * _Chain_Is_null
+ */
+
+#define _Chain_Is_null( _the_chain ) \
+ ( (_the_chain) == NULL )
+
+/*PAGE
+ *
+ * _Chain_Is_null_node
+ */
+
+#define _Chain_Is_null_node( _the_node ) \
+ ( (_the_node) == NULL )
+
+/*PAGE
+ *
+ * _Chain_Head
+ */
+
+#define _Chain_Head( _the_chain ) \
+ ((Chain_Node *) (_the_chain))
+
+/*PAGE
+ *
+ * _Chain_Tail
+ */
+
+#define _Chain_Tail( _the_chain ) \
+ ((Chain_Node *) &(_the_chain)->permanent_null)
+
+/*PAGE
+ *
+ * _Chain_Is_empty
+ */
+
+#define _Chain_Is_empty( _the_chain ) \
+ ( (_the_chain)->first == _Chain_Tail( (_the_chain) ) )
+
+/*PAGE
+ *
+ * _Chain_Is_first
+ */
+
+#define _Chain_Is_first( _the_node ) \
+ ( (the_node)->previous == NULL )
+
+/*PAGE
+ *
+ * _Chain_Is_last
+ */
+
+#define _Chain_Is_last( _the_node ) \
+ ( (_the_node)->next == NULL )
+
+/*PAGE
+ *
+ * _Chain_Has_only_one_node
+ */
+
+#define _Chain_Has_only_one_node( _the_chain ) \
+ ( (_the_chain)->first == (_the_chain)->last )
+
+/*PAGE
+ *
+ * _Chain_Is_head
+ */
+
+#define _Chain_Is_head( _the_chain, _the_node ) \
+ ( (_the_node) == _Chain_Head( (_the_chain) ) )
+
+/*PAGE
+ *
+ * _Chain_Is_tail
+ */
+
+#define _Chain_Is_tail( _the_chain, _the_node ) \
+ ( (_the_node) == _Chain_Tail( (_the_chain) ) )
+
+/*PAGE
+ *
+ * Chain_Initialize_empty
+ */
+
+#define _Chain_Initialize_empty( _the_chain ) \
+{ \
+ (_the_chain)->first = _Chain_Tail( (_the_chain) ); \
+ (_the_chain)->permanent_null = NULL; \
+ (_the_chain)->last = _Chain_Head( (_the_chain) ); \
+}
+
+/*PAGE
+ *
+ * _Chain_Extract_unprotected
+ */
+
+#define _Chain_Extract_unprotected( _the_node ) \
+{ \
+ Chain_Node *_next; \
+ Chain_Node *_previous; \
+ \
+ _next = (_the_node)->next; \
+ _previous = (_the_node)->previous; \
+ _next->previous = _previous; \
+ _previous->next = _next; \
+}
+
+/*PAGE
+ *
+ * _Chain_Get_unprotected
+ */
+
+/*PAGE
+ *
+ * Chain_Get_unprotected
+ */
+
+#define _Chain_Get_unprotected( _the_chain ) \
+ (( !_Chain_Is_empty( (_the_chain) ) ) \
+ ? _Chain_Get_first_unprotected( (_the_chain) ) \
+ : NULL)
+
+/*PAGE
+ *
+ * _Chain_Insert_unprotected
+ */
+
+#define _Chain_Insert_unprotected( _after_node, _the_node ) \
+do { \
+ Chain_Node *_before_node; \
+ \
+ (_the_node)->previous = (_after_node); \
+ _before_node = (_after_node)->next; \
+ (_after_node)->next = (_the_node); \
+ (_the_node)->next = _before_node; \
+ _before_node->previous = (_the_node); \
+} while (0)
+
+/*PAGE
+ *
+ * _Chain_Append_unprotected
+ */
+
+#define _Chain_Append_unprotected( _the_chain, _the_node ) \
+{ \
+ Chain_Node *_old_last_node; \
+ \
+ (_the_node)->next = _Chain_Tail( (_the_chain) ); \
+ _old_last_node = (_the_chain)->last; \
+ (_the_chain)->last = (_the_node); \
+ _old_last_node->next = (_the_node); \
+ (_the_node)->previous = _old_last_node; \
+}
+
+/*PAGE
+ *
+ * _Chain_Prepend_unprotected
+ */
+
+#define _Chain_Prepend_unprotected( _the_chain, _the_node ) \
+ _Chain_Insert_unprotected( _Chain_Head( (_the_chain) ), (_the_node) )
+
+/*PAGE
+ *
+ * _Chain_Prepend
+ */
+
+#define _Chain_Prepend( _the_chain, _the_node ) \
+ _Chain_Insert( _Chain_Head( (_the_chain) ), (_the_node) )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/coremsg.inl b/cpukit/score/macros/rtems/score/coremsg.inl
new file mode 100644
index 0000000000..9f7135aa91
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/coremsg.inl
@@ -0,0 +1,143 @@
+/* coremsg.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Core Message Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __CORE_MESSAGE_QUEUE_inl
+#define __CORE_MESSAGE_QUEUE_inl
+
+/*PAGE
+ *
+ * _CORE_message_queue_Send
+ *
+ */
+
+#define _CORE_message_queue_Send( _the_message_queue, _buffer, _size, \
+_id, _api_message_queue_mp_support ) \
+ _CORE_message_queue_Submit( (_the_message_queue), (_buffer), (_size), \
+ (_id), (_api_message_queue_mp_support), CORE_MESSAGE_QUEUE_SEND_REQUEST )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Urgent
+ *
+ */
+
+#define _CORE_message_queue_Urgent( _the_message_queue, _buffer, _size, \
+_id, _api_message_queue_mp_support ) \
+ _CORE_message_queue_Submit( (_the_message_queue), (_buffer), (_size), \
+ (_id), (_api_message_queue_mp_support), CORE_MESSAGE_QUEUE_URGENT_REQUEST )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Copy_buffer
+ */
+
+#define _CORE_message_queue_Copy_buffer( _source, _destination, _size ) \
+ memcpy( _destination, _source, _size)
+
+/*PAGE
+ *
+ * _CORE_message_queue_Allocate_message_buffer
+ *
+ */
+
+#define _CORE_message_queue_Allocate_message_buffer( _the_message_queue ) \
+ (CORE_message_queue_Buffer_control *) \
+ _Chain_Get( &(_the_message_queue)->Inactive_messages )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Free_message_buffer
+ *
+ */
+
+#define _CORE_message_queue_Free_message_buffer( _the_message_queue, _the_message ) \
+ _Chain_Append( \
+ &(_the_message_queue)->Inactive_messages, \
+ &(_the_message)->Node \
+ )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_priority
+ *
+ */
+
+#define _CORE_message_queue_Is_priority( _the_attribute ) \
+ ((_the_attribute)->discipline == CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY)
+
+/*PAGE
+ *
+ * _CORE_message_queue_Get_pending_message
+ *
+ */
+
+#define _CORE_message_queue_Get_pending_message( _the_message_queue ) \
+ (CORE_message_queue_Buffer_control *) \
+ _Chain_Get_unprotected( &(_the_message_queue)->Pending_messages )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Append
+ *
+ */
+
+#define _CORE_message_queue_Append( _the_message_queue, _the_message ) \
+ _Chain_Append( &(_the_message_queue)->Pending_messages, \
+ &(_the_message)->Node )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Prepend
+ *
+ */
+
+#define _CORE_message_queue_Prepend( _the_message_queue, _the_message ) \
+ _Chain_Prepend( &(_the_message_queue)->Pending_messages, \
+ &(_the_message)->Node )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_null
+ *
+ */
+
+#define _CORE_message_queue_Is_null( _the_message_queue ) \
+ ( (_the_message_queue) == NULL )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Is_notify_enabled
+ *
+ */
+
+#define _CORE_message_queue_Is_notify_enabled( _the_message_queue ) \
+ ( (_the_message_queue)->notify_handler != NULL )
+
+/*PAGE
+ *
+ * _CORE_message_queue_Set_notify
+ *
+ */
+
+#define _CORE_message_queue_Set_notify( \
+ _the_message_queue, _the_handler, _the_argument ) \
+ do { \
+ (_the_message_queue)->notify_handler = (_the_handler); \
+ (_the_message_queue)->notify_argument = (_the_argument); \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/coremutex.inl b/cpukit/score/macros/rtems/score/coremutex.inl
new file mode 100644
index 0000000000..91126301f8
--- /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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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..a053fcd5f5
--- /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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $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
new file mode 100644
index 0000000000..26f8145245
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/heap.inl
@@ -0,0 +1,150 @@
+/* heap.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the heap handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __HEAP_inl
+#define __HEAP_inl
+
+#include <rtems/score/address.h>
+
+/*PAGE
+ *
+ * _Heap_Head
+ */
+
+#define _Heap_Head( _the_heap ) \
+ ((Heap_Block *)&(_the_heap)->start)
+
+/*PAGE
+ *
+ * _Heap_Tail
+ */
+
+#define _Heap_Tail( _the_heap ) \
+ ((Heap_Block *)&(_the_heap)->final)
+
+/*PAGE
+ *
+ * _Heap_Previous_block
+ */
+
+#define _Heap_Previous_block( _the_block ) \
+ ( (Heap_Block *) _Addresses_Subtract_offset( \
+ (void *)(_the_block), \
+ (_the_block)->back_flag & ~ HEAP_BLOCK_USED \
+ ) \
+ )
+
+/*PAGE
+ *
+ * _Heap_Next_block
+ */
+
+#define _Heap_Next_block( _the_block ) \
+ ( (Heap_Block *) _Addresses_Add_offset( \
+ (void *)(_the_block), \
+ (_the_block)->front_flag & ~ HEAP_BLOCK_USED \
+ ) \
+ )
+
+/*PAGE
+ *
+ * _Heap_Block_at
+ */
+
+#define _Heap_Block_at( _base, _offset ) \
+ ( (Heap_Block *) \
+ _Addresses_Add_offset( (void *)(_base), (_offset) ) )
+
+/*PAGE
+ *
+ * _Heap_User_block_at
+ *
+ */
+
+#define _Heap_User_block_at( _base ) \
+ _Heap_Block_at( \
+ (_base), \
+ -*(((unsigned32 *) (_base)) - 1) + -HEAP_BLOCK_USED_OVERHEAD \
+ )
+
+/*PAGE
+ *
+ * _Heap_Is_previous_block_free
+ */
+
+#define _Heap_Is_previous_block_free( _the_block ) \
+ ( !((_the_block)->back_flag & HEAP_BLOCK_USED) )
+
+/*PAGE
+ *
+ * _Heap_Is_block_free
+ */
+
+#define _Heap_Is_block_free( _the_block ) \
+ ( !((_the_block)->front_flag & HEAP_BLOCK_USED) )
+
+/*PAGE
+ *
+ * _Heap_Is_block_used
+ */
+
+#define _Heap_Is_block_used( _the_block ) \
+ ((_the_block)->front_flag & HEAP_BLOCK_USED)
+
+/*PAGE
+ *
+ * _Heap_Block_size
+ */
+
+#define _Heap_Block_size( _the_block ) \
+ ((_the_block)->front_flag & ~HEAP_BLOCK_USED)
+
+/*PAGE
+ *
+ * _Heap_Start_of_user_area
+ */
+
+#define _Heap_Start_of_user_area( _the_block ) \
+ ((void *) &(_the_block)->next)
+
+/*PAGE
+ *
+ * _Heap_Is_block_in
+ */
+
+#define _Heap_Is_block_in( _the_heap, _the_block ) \
+ ( ((_the_block) >= (_the_heap)->start) && \
+ ((_the_block) <= (_the_heap)->final) )
+
+/*PAGE
+ *
+ * _Heap_Is_page_size_valid
+ */
+
+#define _Heap_Is_page_size_valid( _page_size ) \
+ ( ((_page_size) != 0) && \
+ (((_page_size) % CPU_HEAP_ALIGNMENT) == 0) )
+
+/*PAGE
+ *
+ * _Heap_Build_flag
+ */
+
+#define _Heap_Build_flag( _size, _in_use_flag ) \
+ ( (_size) | (_in_use_flag))
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/isr.inl b/cpukit/score/macros/rtems/score/isr.inl
new file mode 100644
index 0000000000..69ae8fe690
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/isr.inl
@@ -0,0 +1,48 @@
+/* isr.inl
+ *
+ * This include file contains the macro implementation of all
+ * inlined routines in the Interrupt Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __ISR_inl
+#define __ISR_inl
+
+/*PAGE
+ *
+ * _ISR_Is_in_progress
+ *
+ */
+
+#define _ISR_Is_in_progress() \
+ (_ISR_Nest_level != 0)
+
+/*PAGE
+ *
+ * _ISR_Is_vector_number_valid
+ *
+ */
+
+#define _ISR_Is_vector_number_valid( _vector ) \
+ ( (_vector) <= CPU_INTERRUPT_MAXIMUM_VECTOR_NUMBER )
+
+/*PAGE
+ *
+ * _ISR_Is_valid_user_handler
+ *
+ */
+
+#define _ISR_Is_valid_user_handler( _handler ) \
+ ((_handler) != NULL)
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/mppkt.inl b/cpukit/score/macros/rtems/score/mppkt.inl
new file mode 100644
index 0000000000..22832c6748
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/mppkt.inl
@@ -0,0 +1,41 @@
+/* macros/mppkt.h
+ *
+ * This package is the implementation of the Packet Handler
+ * routines which are inlined.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_PACKET_h
+#define __MACROS_MP_PACKET_h
+
+/*PAGE
+ *
+ * _Mp_packet_Is_valid_packet_class
+ *
+ * NOTE: Check for lower bounds (MP_PACKET_CLASSES_FIRST ) is unnecessary
+ * because this enum starts at lower bound of zero.
+ */
+
+#define _Mp_packet_Is_valid_packet_class( _the_packet_class ) \
+ ( (_the_packet_class) <= MP_PACKET_CLASSES_LAST )
+
+/*PAGE
+ *
+ * _Mp_packet_Is_null
+ *
+ */
+
+#define _Mp_packet_Is_null ( _the_packet ) \
+ ( (_the_packet) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/object.inl b/cpukit/score/macros/rtems/score/object.inl
new file mode 100644
index 0000000000..de1c9f256c
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/object.inl
@@ -0,0 +1,148 @@
+/* object.inl
+ *
+ * This include file contains the macro implementation of all
+ * of the inlined routines in the Object Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __OBJECTS_inl
+#define __OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_Build_id
+ *
+ */
+
+#define _Objects_Build_id( _the_class, _node, _index ) \
+ ( ((_the_class) << OBJECTS_CLASS_START_BIT) | \
+ ((_node) << OBJECTS_NODE_START_BIT) | \
+ ((_index) << OBJECTS_INDEX_START_BIT) )
+
+/*PAGE
+ *
+ * _Objects_Get_class
+ */
+
+#define _Objects_Get_class( _id ) \
+ (Objects_Classes) \
+ (((_id) >> OBJECTS_CLASS_START_BIT) & OBJECTS_CLASS_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Get_node
+ *
+ */
+
+#define _Objects_Get_node( _id ) \
+ (((_id) >> OBJECTS_NODE_START_BIT) & OBJECTS_NODE_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Get_index
+ *
+ */
+
+#define _Objects_Get_index( _id ) \
+ (((_id) >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS)
+
+/*PAGE
+ *
+ * _Objects_Is_class_valid
+ *
+ */
+
+#define _Objects_Is_class_valid( _the_class ) \
+ ( (_the_class) <= OBJECTS_CLASSES_LAST )
+
+/*PAGE
+ *
+ * _Objects_Is_local_node
+ *
+ */
+
+#define _Objects_Is_local_node( _node ) \
+ ( (_node) == _Objects_Local_node )
+
+/*PAGE
+ *
+ * _Objects_Is_local_id
+ *
+ */
+
+#define _Objects_Is_local_id( _id ) \
+ _Objects_Is_local_node( _Objects_Get_node(_id) )
+
+/*PAGE
+ *
+ * _Objects_Are_ids_equal
+ *
+ */
+
+#define _Objects_Are_ids_equal( _left, _right ) \
+ ( (_left) == (_right) )
+
+/*PAGE
+ *
+ * _Objects_Allocate
+ *
+ */
+
+#define _Objects_Allocate( _information ) \
+ (Objects_Control *) _Chain_Get( &(_information)->Inactive )
+
+/*PAGE
+ *
+ * _Objects_Free
+ *
+ */
+
+#define _Objects_Free( _information, _the_object ) \
+ _Chain_Append( &(_information)->Inactive, &(_the_object)->Node )
+
+/*PAGE
+ *
+ * _Objects_Open
+ *
+ */
+
+#define _Objects_Open( _information, _the_object, _name ) \
+ { \
+ unsigned32 _index; \
+ \
+ _index = _Objects_Get_index( (_the_object)->id ); \
+ (_information)->local_table[ _index ] = (_the_object); \
+ \
+ if ( (_information)->is_string ) \
+ _Objects_Copy_name_string( (_name), (_the_object)->name ); \
+ else \
+ _Objects_Copy_name_raw( \
+ (_name), (_the_object)->name, (_information)->name_length ); \
+ }
+
+/*PAGE
+ *
+ * _Objects_Close
+ *
+ */
+
+#define _Objects_Close( _information, _the_object ) \
+ { \
+ unsigned32 _index; \
+ \
+ _index = _Objects_Get_index( (_the_object)->id ); \
+ (_information)->local_table[ _index ] = NULL; \
+ _Objects_Clear_name( (_the_object)->name, (_information)->name_length ); \
+ }
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/objectmp.inl b/cpukit/score/macros/rtems/score/objectmp.inl
new file mode 100644
index 0000000000..2b499e70e5
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/objectmp.inl
@@ -0,0 +1,50 @@
+/* macros/objectmp.inl
+ *
+ * This include file contains the bodies of all inlined routines
+ * which deal with global objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_OBJECTS_inl
+#define __MACROS_MP_OBJECTS_inl
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_global_object
+ *
+ */
+
+#define _Objects_MP_Allocate_global_object() \
+ (Objects_MP_Control *) \
+ _Chain_Get( &_Objects_MP_Inactive_global_objects )
+
+/*PAGE
+ * _Objects_MP_Free_global_object
+ *
+ */
+
+#define _Objects_MP_Free_global_object( _the_object ) \
+ _Chain_Append( \
+ &_Objects_MP_Inactive_global_objects, \
+ &(_the_object)->Object.Node \
+ )
+
+/*PAGE
+ * _Objects_MP_Is_null_global_object
+ *
+ */
+
+#define _Objects_MP_Is_null_global_object( _the_object ) \
+ ( (_the_object) == NULL )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/priority.inl b/cpukit/score/macros/rtems/score/priority.inl
new file mode 100644
index 0000000000..e18567ba8c
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/priority.inl
@@ -0,0 +1,170 @@
+/* priority.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Priority Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __PRIORITY_inl
+#define __PRIORITY_inl
+
+#include <rtems/score/bitfield.h>
+
+/*PAGE
+ *
+ * _Priority_Handler_initialization
+ *
+ */
+
+#define _Priority_Handler_initialization() \
+ { \
+ unsigned32 index; \
+ \
+ _Priority_Major_bit_map = 0; \
+ for ( index=0 ; index <16 ; index++ ) \
+ _Priority_Bit_map[ index ] = 0; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Is_valid
+ *
+ */
+
+ /*
+ * 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) <= PRIORITY_MAXIMUM )
+
+/*PAGE
+ *
+ * _Priority_Major
+ *
+ */
+
+#define _Priority_Major( _the_priority ) ( (_the_priority) / 16 )
+
+/*PAGE
+ *
+ * _Priority_Minor
+ *
+ */
+
+#define _Priority_Minor( _the_priority ) ( (_the_priority) % 16 )
+
+#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
+
+/*PAGE
+ *
+ * _Priority_Mask
+ *
+ */
+
+#define _Priority_Mask( _bit_number ) \
+ (0x8000 >> _bit_number)
+
+/*PAGE
+ *
+ * _Priority_Bits_index
+ *
+ */
+
+#define _Priority_Bits_index( _bit_number ) \
+ (_bit_number)
+
+#endif
+
+/*PAGE
+ *
+ * _Priority_Add_to_bit_map
+ *
+ */
+
+#define _Priority_Add_to_bit_map( _the_priority_map ) \
+ { \
+ *(_the_priority_map)->minor |= (_the_priority_map)->ready_minor; \
+ _Priority_Major_bit_map |= (_the_priority_map)->ready_major; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Remove_from_bit_map
+ *
+ */
+
+#define _Priority_Remove_from_bit_map( _the_priority_map ) \
+ { \
+ *(_the_priority_map)->minor &= (_the_priority_map)->block_minor; \
+ if ( *(_the_priority_map)->minor == 0 ) \
+ _Priority_Major_bit_map &= (_the_priority_map)->block_major; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Get_highest
+ *
+ */
+
+#define _Priority_Get_highest( _high_priority ) \
+ { \
+ Priority_Bit_map_control minor; \
+ Priority_Bit_map_control major; \
+ \
+ _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); \
+ _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); \
+ \
+ (_high_priority) = (_Priority_Bits_index( major ) * 16) + \
+ _Priority_Bits_index( minor ); \
+ }
+
+/*PAGE
+ *
+ * _Priority_Initialize_information
+ *
+ */
+
+#define _Priority_Initialize_information( \
+ _the_priority_map, _new_priority ) \
+ { \
+ Priority_Bit_map_control _major; \
+ Priority_Bit_map_control _minor; \
+ Priority_Bit_map_control _mask; \
+ \
+ _major = _Priority_Major( (_new_priority) ); \
+ _minor = _Priority_Minor( (_new_priority) ); \
+ \
+ (_the_priority_map)->minor = \
+ &_Priority_Bit_map[ _Priority_Bits_index(_major) ]; \
+ \
+ _mask = _Priority_Mask( _major ); \
+ (_the_priority_map)->ready_major = _mask; \
+ (_the_priority_map)->block_major = ~_mask; \
+ \
+ _mask = _Priority_Mask( _minor ); \
+ (_the_priority_map)->ready_minor = _mask; \
+ (_the_priority_map)->block_minor = ~_mask; \
+ }
+
+/*PAGE
+ *
+ * _Priority_Is_group_empty
+ *
+ */
+
+#define _Priority_Is_group_empty ( _the_priority ) \
+ ( (_the_priority) == 0 )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/stack.inl b/cpukit/score/macros/rtems/score/stack.inl
new file mode 100644
index 0000000000..31ad922bd3
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/stack.inl
@@ -0,0 +1,50 @@
+/* stack.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Stack Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STACK_inl
+#define __STACK_inl
+
+/*PAGE
+ *
+ * _Stack_Initialize
+ *
+ */
+
+#define _Stack_Initialize( _the_stack, _starting_address, _size ) \
+ { \
+ (_the_stack)->area = (_starting_address); \
+ (_the_stack)->size = (_size); \
+ }
+
+/*PAGE
+ *
+ * _Stack_Is_enough
+ *
+ */
+
+#define _Stack_Is_enough( _size ) \
+ ( (_size) >= STACK_MINIMUM_SIZE )
+
+/*PAGE
+ *
+ * _Stack_Adjust_size
+ */
+
+#define _Stack_Adjust_size( _size ) \
+ ((_size) + CPU_STACK_ALIGNMENT)
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/states.inl b/cpukit/score/macros/rtems/score/states.inl
new file mode 100644
index 0000000000..993f6841ea
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/states.inl
@@ -0,0 +1,210 @@
+/* states.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines associated with thread state information.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __STATES_inl
+#define __STATES_inl
+
+/*PAGE
+ *
+ * _States_Set
+ *
+ */
+
+#define _States_Set( _states_to_set, _current_state ) \
+ ((_current_state) | (_states_to_set))
+
+/*PAGE
+ *
+ * _States_Clear
+ *
+ */
+
+#define _States_Clear( _states_to_clear, _current_state ) \
+ ((_current_state) & ~(_states_to_clear))
+
+/*PAGE
+ *
+ * _States_Is_ready
+ *
+ */
+
+#define _States_Is_ready( _the_states ) \
+ ( (_the_states) == STATES_READY )
+
+/*PAGE
+ *
+ * _States_Is_only_dormant
+ *
+ */
+
+#define _States_Is_only_dormant( _the_states ) \
+ ( (_the_states) == STATES_DORMANT )
+
+/*PAGE
+ *
+ * _States_Is_dormant
+ *
+ */
+
+#define _States_Is_dormant( _the_states ) \
+ ( (_the_states) & STATES_DORMANT )
+
+/*PAGE
+ *
+ * _States_Is_suspended
+ *
+ */
+
+#define _States_Is_suspended( _the_states ) \
+ ( (_the_states) & STATES_SUSPENDED )
+
+/*PAGE
+ *
+ * _States_Is_Transient
+ *
+ */
+
+#define _States_Is_transient( _the_states ) \
+ ( (_the_states) & STATES_TRANSIENT )
+
+/*PAGE
+ *
+ * _States_Is_delaying
+ *
+ */
+
+#define _States_Is_delaying( _the_states ) \
+ ( (_the_states) & STATES_DELAYING )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_buffer
+ *
+ */
+
+#define _States_Is_waiting_for_buffer( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_BUFFER )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_segment
+ *
+ */
+
+#define _States_Is_waiting_for_segment( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_SEGMENT )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_message
+ *
+ */
+
+#define _States_Is_waiting_for_message( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_MESSAGE )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_event
+ *
+ */
+
+#define _States_Is_waiting_for_event( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_EVENT )
+
+/*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
+ *
+ */
+
+#define _States_Is_waiting_for_semaphore( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_SEMAPHORE )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_time
+ *
+ */
+
+#define _States_Is_waiting_for_time( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_TIME )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_rpc_reply
+ *
+ */
+
+#define _States_Is_waiting_for_rpc_reply( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_RPC_REPLY )
+
+/*PAGE
+ *
+ * _States_Is_waiting_for_period
+ *
+ */
+
+#define _States_Is_waiting_for_period( _the_states ) \
+ ( (_the_states) & STATES_WAITING_FOR_PERIOD )
+
+/*PAGE
+ *
+ * _States_Is_locally_blocked
+ *
+ */
+
+#define _States_Is_locally_blocked( _the_states ) \
+ ( (_the_states) & STATES_LOCALLY_BLOCKED )
+
+/*PAGE
+ *
+ * _States_Is_waiting_on_thread_queue
+ *
+ */
+
+#define _States_Is_waiting_on_thread_queue( _the_states ) \
+ ( (_the_states) & STATES_WAITING_ON_THREAD_QUEUE )
+
+/*PAGE
+ *
+ * _States_Is_blocked
+ *
+ */
+
+#define _States_Is_blocked( _the_states ) \
+ ( (_the_states) & STATES_BLOCKED )
+
+/*PAGE
+ *
+ * _States_Are_set
+ *
+ */
+
+#define _States_Are_set( _the_states, _mask ) \
+ ( ((_the_states) & (_mask)) != STATES_READY )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/sysstate.inl b/cpukit/score/macros/rtems/score/sysstate.inl
new file mode 100644
index 0000000000..8d5e02a1e3
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/sysstate.inl
@@ -0,0 +1,90 @@
+/* sysstates.inl
+ *
+ * This file contains the macro implementation of routines regarding the
+ * system state.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __SYSTEM_STATE_inl
+#define __SYSTEM_STATE_inl
+
+/*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 ) \
+ do { \
+ _System_state_Current = (_state); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _System_state_Get
+ */
+
+#define _System_state_Get() \
+ (_System_state_Current)
+
+/*PAGE
+ *
+ * _System_state_Is_before_initialization
+ */
+
+#define _System_state_Is_before_initialization( _state ) \
+ ((_state) == SYSTEM_STATE_BEFORE_INITIALIZATION)
+
+/*PAGE
+ *
+ * _System_state_Is_before_multitasking
+ */
+
+#define _System_state_Is_before_multitasking( _state ) \
+ ((_state) == SYSTEM_STATE_BEFORE_MULTITASKING)
+
+/*PAGE
+ *
+ * _System_state_Is_begin_multitasking
+ */
+
+#define _System_state_Is_begin_multitasking( _state ) \
+ ((_state) == SYSTEM_STATE_BEGIN_MULTITASKING)
+
+/*PAGE
+ *
+ * _System_state_Is_up
+ */
+
+#define _System_state_Is_up( _state ) \
+ ((_state) == SYSTEM_STATE_UP)
+
+/*PAGE
+ *
+ * _System_state_Is_failed
+ */
+
+#define _System_state_Is_failed( _state ) \
+ ((_state) == SYSTEM_STATE_FAILED)
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/thread.inl b/cpukit/score/macros/rtems/score/thread.inl
new file mode 100644
index 0000000000..c792941026
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/thread.inl
@@ -0,0 +1,217 @@
+/* thread.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines from the Thread handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_inl
+#define __THREAD_inl
+
+/*PAGE
+ *
+ * _Thread_Stop_multitasking
+ *
+ */
+
+#define _Thread_Stop_multitasking() \
+ _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context );
+
+/*PAGE
+ *
+ * _Thread_Is_executing
+ *
+ */
+
+#define _Thread_Is_executing( _the_thread ) \
+ ( (_the_thread) == _Thread_Executing )
+
+/*PAGE
+ *
+ * _Thread_Is_heir
+ *
+ */
+
+#define _Thread_Is_heir( _the_thread ) \
+ ( (_the_thread) == _Thread_Heir )
+
+/*PAGE
+ *
+ * _Thread_Is_executing_also_the_heir
+ *
+ */
+
+#define _Thread_Is_executing_also_the_heir() \
+ ( _Thread_Executing == _Thread_Heir )
+
+/*PAGE
+ *
+ * _Thread_Resume
+ *
+ */
+
+#define _Thread_Resume( _the_thread ) \
+ _Thread_Clear_state( (_the_thread), STATES_SUSPENDED )
+
+/*PAGE
+ *
+ * _Thread_Unblock
+ *
+ */
+
+#define _Thread_Unblock( _the_thread ) \
+ _Thread_Clear_state( (_the_thread), STATES_BLOCKED );
+
+/*PAGE
+ *
+ * _Thread_Restart_self
+ *
+ */
+
+#define _Thread_Restart_self() \
+ { \
+ if ( _Thread_Executing->fp_context != NULL ) \
+ _Context_Restore_fp( &_Thread_Executing->fp_context ); \
+ \
+ _CPU_Context_Restart_self( &_Thread_Executing->Registers ); \
+ }
+
+/*PAGE
+ *
+ * _Thread_Calculate_heir
+ *
+ */
+
+#define _Thread_Calculate_heir() \
+ { \
+ Priority_Control highest; \
+ \
+ _Priority_Get_highest( highest ); \
+ \
+ _Thread_Heir = (Thread_Control *) _Thread_Ready_chain[ highest ].first; \
+ }
+
+/*PAGE
+ *
+ * _Thread_Is_allocated_fp
+ *
+ */
+
+#define _Thread_Is_allocated_fp( _the_thread ) \
+ ( (_the_thread) == _Thread_Allocated_fp )
+
+/*PAGE
+ *
+ * _Thread_Deallocate_fp
+ *
+ */
+
+#define _Thread_Deallocate_fp() \
+ _Thread_Allocated_fp = NULL
+
+/*PAGE
+ *
+ * _Thread_Disable_dispatch
+ *
+ */
+
+#define _Thread_Disable_dispatch() \
+ _Thread_Dispatch_disable_level += 1
+
+/*PAGE
+ *
+ * _Thread_Enable_dispatch
+ *
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == TRUE )
+#define _Thread_Enable_dispatch() \
+ { if ( (--_Thread_Dispatch_disable_level) == 0 ) \
+ _Thread_Dispatch(); \
+ }
+#endif
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void );
+#endif
+
+/*PAGE
+ *
+ * _Thread_Unnest_dispatch
+ *
+ */
+
+#define _Thread_Unnest_dispatch() \
+ _Thread_Dispatch_disable_level -= 1
+
+/*PAGE
+ *
+ * _Thread_Is_dispatching_enabled
+ *
+ */
+
+#define _Thread_Is_dispatching_enabled() \
+ ( _Thread_Dispatch_disable_level == 0 )
+
+/*PAGE
+ *
+ * _Thread_Is_context_switch_necessary
+ *
+ */
+
+#define _Thread_Is_context_switch_necessary() \
+ ( _Context_Switch_necessary == TRUE )
+
+/*PAGE
+ *
+ * _Thread_Dispatch_initialization
+ *
+ */
+
+#define _Thread_Dispatch_initialization() \
+ _Thread_Dispatch_disable_level = 1
+
+/*PAGE
+ *
+ * _Thread_Is_null
+ *
+ */
+
+#define _Thread_Is_null( _the_thread ) \
+ ( (_the_thread) == NULL )
+
+/*
+ * _Thread_Is_proxy_blocking
+ *
+ */
+
+#define _Thread_Is_proxy_blocking( _code ) \
+ ( (_code) == THREAD_STATUS_PROXY_BLOCKING )
+
+/*
+ * _Thread_Internal_allocate
+ *
+ */
+
+#define _Thread_Internal_allocate() \
+ ((Thread_Control *) _Objects_Allocate( &_Thread_Internal_information ))
+
+/*
+ * _Thread_Internal_free
+ *
+ */
+
+#define _Thread_Internal_free( _the_task ) \
+ _Objects_Free( &_Thread_Internal_information, &(_the_task)->Object )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/threadmp.inl b/cpukit/score/macros/rtems/score/threadmp.inl
new file mode 100644
index 0000000000..89f5deeaba
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/threadmp.inl
@@ -0,0 +1,50 @@
+/* macros/threadmp.h
+ *
+ * This include file contains the bodies of all inlined routines
+ * for the multiprocessing part of thread package.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __MACROS_MP_THREAD_h
+#define __MACROS_MP_THREAD_h
+
+/*PAGE
+ *
+ * _Thread_MP_Is_receive
+ *
+ */
+
+#define _Thread_MP_Is_receive( _the_thread ) \
+ ( (_the_thread) == _Thread_MP_Receive)
+
+/*PAGE
+ *
+ * _Thread_MP_Free_proxy
+ *
+ */
+
+#define _Thread_MP_Free_proxy( _the_thread ) \
+{ \
+ Thread_Proxy_control *_the_proxy; \
+ \
+ _the_proxy = (Thread_Proxy_control *) (_the_thread); \
+ \
+ _Chain_Extract( &_the_proxy->Active ); \
+ \
+ _Chain_Append( \
+ &_Thread_MP_Inactive_proxies, \
+ &(_the_thread)->Object.Node \
+ ); \
+}
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/tod.inl b/cpukit/score/macros/rtems/score/tod.inl
new file mode 100644
index 0000000000..65a4de5017
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/tod.inl
@@ -0,0 +1,49 @@
+/* tod.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the Time of Day Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TIME_OF_DAY_inl
+#define __TIME_OF_DAY_inl
+
+/*PAGE
+ *
+ * _TOD_Tickle_ticks
+ *
+ */
+
+#define _TOD_Tickle_ticks() \
+ _TOD_Current.ticks++; \
+ _Watchdog_Ticks_since_boot++
+
+/*PAGE
+ *
+ * _TOD_Deactivate
+ *
+ */
+
+#define _TOD_Deactivate() \
+ _Watchdog_Remove( &_TOD_Seconds_watchdog )
+
+/*PAGE
+ *
+ * _TOD_Activate
+ *
+ */
+
+#define _TOD_Activate( _ticks ) \
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, (_ticks) )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/tqdata.inl b/cpukit/score/macros/rtems/score/tqdata.inl
new file mode 100644
index 0000000000..0431840846
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/tqdata.inl
@@ -0,0 +1,50 @@
+/* tqdata.inl
+ *
+ * This file contains the macro implementation of the inlined
+ * routines needed to support the Thread Queue Data.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __THREAD_QUEUE_DATA_inl
+#define __THREAD_QUEUE_DATA_inl
+
+/*PAGE
+ *
+ * _Thread_queue_Header_number
+ *
+ */
+
+#define _Thread_queue_Header_number( _the_priority ) \
+ ((_the_priority) / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER)
+
+/*PAGE
+ *
+ * _Thread_queue_Is_reverse_search
+ *
+ */
+
+#define _Thread_queue_Is_reverse_search( _the_priority ) \
+ ( (_the_priority) & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK )
+
+/*PAGE
+ *
+ * _Thread_queue_Enter_critical_section
+ *
+ */
+
+#define _Thread_queue_Enter_critical_section( _the_thread_queue ) \
+ do { \
+ (_the_thread_queue)->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; \
+ } while ( 0 )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/userext.inl b/cpukit/score/macros/rtems/score/userext.inl
new file mode 100644
index 0000000000..6d69edb096
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/userext.inl
@@ -0,0 +1,126 @@
+/* userext.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the User Extension Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __USER_EXTENSIONS_inl
+#define __USER_EXTENSIONS_inl
+
+/*PAGE
+ *
+ * _User_extensions_Handler_initialization
+ *
+ */
+
+#define _User_extensions_Handler_initialization( _initial_extensions ) \
+ { \
+ _Chain_Initialize_empty( &_User_extensions_List ); \
+ \
+ if ( (_initial_extensions) ) { \
+ _User_extensions_Initial.Callouts = *(_initial_extensions); \
+ _Chain_Append( \
+ &_User_extensions_List, &_User_extensions_Initial.Node ); \
+ } \
+ }
+
+/*PAGE
+ *
+ * _User_extensions_Add_set
+ */
+
+#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
+ *
+ * _User_extensions_Remove_set
+ */
+
+#define _User_extensions_Remove_set( _the_extension ) \
+ _Chain_Extract( &(_the_extension)->Node )
+
+/*PAGE
+ *
+ * _User_extensions_Run_list_forward
+ *
+ * NOTE: No parentheses around macro names here to avoid
+ * messing up the name and function call expansion.
+ */
+
+#define _User_extensions_Run_list_forward( _name, _arguments ) \
+ do { \
+ 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.## _name != NULL ) \
+ (*the_extension->Callouts.## _name) _arguments; \
+ \
+ } \
+ \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _User_extensions_Run_list_backward
+ *
+ * NOTE: No parentheses around macro names here to avoid
+ * messing up the name and function call expansion.
+ */
+
+#define _User_extensions_Run_list_backward( _name, _arguments ) \
+ do { \
+ 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.## _name != NULL ) \
+ (*the_extension->Callouts.## _name) _arguments; \
+ \
+ } \
+ \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _User_extensions_Thread_switch
+ *
+ */
+
+#define _User_extensions_Thread_switch( _executing, _heir ) \
+ _User_extensions_Run_list_forward(thread_switch, (_executing, _heir) )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/watchdog.inl b/cpukit/score/macros/rtems/score/watchdog.inl
new file mode 100644
index 0000000000..5c75565080
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/watchdog.inl
@@ -0,0 +1,172 @@
+/* watchdog.inl
+ *
+ * This file contains the macro implementation of all inlined routines
+ * in the Watchdog Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WATCHDOG_inl
+#define __WATCHDOG_inl
+
+#include <rtems/score/object.h>
+
+/*PAGE
+ *
+ * _Watchdog_Initialize
+ *
+ */
+
+#define _Watchdog_Initialize( _the_watchdog, _routine, _id, _user_data ) \
+ { \
+ (_the_watchdog)->state = WATCHDOG_INACTIVE; \
+ (_the_watchdog)->routine = (_routine); \
+ (_the_watchdog)->id = (_id); \
+ (_the_watchdog)->user_data = (_user_data); \
+ }
+
+/*PAGE
+ *
+ * _Watchdog_Is_active
+ *
+ */
+
+#define _Watchdog_Is_active( _the_watchdog ) \
+ ( (_the_watchdog)->state == WATCHDOG_ACTIVE )
+
+/*PAGE
+ *
+ * _Watchdog_Activate
+ *
+ */
+
+#define _Watchdog_Activate( _the_watchdog ) \
+ (_the_watchdog)->state = WATCHDOG_ACTIVE
+
+/*PAGE
+ *
+ * _Watchdog_Deactivate
+ *
+ */
+
+#define _Watchdog_Deactivate( _the_watchdog ) \
+ (_the_watchdog)->state = WATCHDOG_REMOVE_IT
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_ticks
+ *
+ */
+
+#define _Watchdog_Tickle_ticks() \
+ _Watchdog_Tickle( &_Watchdog_Ticks_chain )
+
+/*PAGE
+ *
+ * _Watchdog_Tickle_seconds
+ *
+ */
+
+#define _Watchdog_Tickle_seconds() \
+ _Watchdog_Tickle( &_Watchdog_Seconds_chain )
+
+/*PAGE
+ *
+ * _Watchdog_Insert_ticks
+ *
+ */
+
+#define _Watchdog_Insert_ticks( _the_watchdog, _units ) \
+ do { \
+ (_the_watchdog)->initial = (_units); \
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, (_the_watchdog) ); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _Watchdog_Insert_seconds
+ *
+ */
+
+#define _Watchdog_Insert_seconds( _the_watchdog, _units ) \
+ do { \
+ (_the_watchdog)->initial = (_units); \
+ _Watchdog_Insert( &_Watchdog_Seconds_chain, (_the_watchdog) ); \
+ } while ( 0 )
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_seconds
+ *
+ */
+
+#define _Watchdog_Adjust_seconds( _direction, _units ) \
+ _Watchdog_Adjust( &_Watchdog_Seconds_chain, (_direction), (_units) )
+
+/*PAGE
+ *
+ * _Watchdog_Adjust_ticks
+ *
+ */
+
+#define _Watchdog_Adjust_ticks( _direction, _units ) \
+ _Watchdog_Adjust( &_Watchdog_Ticks_chain, (_direction), (_units) )
+
+/*PAGE
+ *
+ * _Watchdog_Reset
+ *
+ */
+
+#define _Watchdog_Reset( _the_watchdog ) \
+ { \
+ (void) _Watchdog_Remove( (_the_watchdog) ); \
+ _Watchdog_Insert( &_Watchdog_Ticks_chain, (_the_watchdog) ); \
+ }
+
+/*PAGE
+ *
+ * _Watchdog_Next
+ *
+ */
+
+#define _Watchdog_Next( _watchdog ) \
+ ((Watchdog_Control *) (_watchdog)->Node.next)
+
+/*PAGE
+ *
+ * _Watchdog_Previous
+ *
+ */
+
+#define _Watchdog_Previous( _watchdog ) \
+ ((Watchdog_Control *) (_watchdog)->Node.previous)
+
+/*PAGE
+ *
+ * _Watchdog_First
+ *
+ */
+
+#define _Watchdog_First( _header ) \
+ ((Watchdog_Control *) (_header)->first)
+
+/*PAGE
+ *
+ * _Watchdog_Last
+ *
+ */
+
+#define _Watchdog_Last( _header ) \
+ ((Watchdog_Control *) (_header)->last)
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/macros/rtems/score/wkspace.inl b/cpukit/score/macros/rtems/score/wkspace.inl
new file mode 100644
index 0000000000..c47993f752
--- /dev/null
+++ b/cpukit/score/macros/rtems/score/wkspace.inl
@@ -0,0 +1,39 @@
+/* wkspace.inl
+ *
+ * This file contains the macro implementation of the inlined routines
+ * from the RAM Workspace Handler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __WORKSPACE_inl
+#define __WORKSPACE_inl
+
+/*PAGE
+ *
+ * _Workspace_Allocate
+ *
+ */
+
+#define _Workspace_Allocate( _size ) \
+ _Heap_Allocate( &_Workspace_Area, (_size) )
+
+/*PAGE
+ *
+ * _Workspace_Free
+ *
+ */
+
+#define _Workspace_Free( _block ) \
+ _Heap_Free( &_Workspace_Area, (_block) )
+
+#endif
+/* end of include file */
diff --git a/cpukit/score/src/apiext.c b/cpukit/score/src/apiext.c
new file mode 100644
index 0000000000..8c7c956ff9
--- /dev/null
+++ b/cpukit/score/src/apiext.c
@@ -0,0 +1,105 @@
+/* apiext.c
+ *
+ * XXX
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems/system.h>
+#include <rtems/score/apiext.h>
+
+/*PAGE
+ *
+ * _API_extensions_Initialization
+ */
+
+void _API_extensions_Initialization( void )
+{
+ _Chain_Initialize_empty( &_API_extensions_List );
+}
+
+/*PAGE
+ *
+ * _API_extensions_Add
+ */
+
+void _API_extensions_Add(
+ API_extensions_Control *the_extension
+)
+{
+ _Chain_Append( &_API_extensions_List, &the_extension->Node );
+}
+
+/*PAGE
+ *
+ * _API_extensions_Run_predriver
+ */
+
+void _API_extensions_Run_predriver( void )
+{
+ Chain_Node *the_node;
+ API_extensions_Control *the_extension;
+
+ for ( the_node = _API_extensions_List.first ;
+ !_Chain_Is_tail( &_API_extensions_List, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_extension = (API_extensions_Control *) the_node;
+
+ if ( the_extension->predriver_hook )
+ (*the_extension->predriver_hook)();
+ }
+}
+
+/*PAGE
+ *
+ * _API_extensions_Run_postdriver
+ */
+
+void _API_extensions_Run_postdriver( void )
+{
+ Chain_Node *the_node;
+ API_extensions_Control *the_extension;
+
+ for ( the_node = _API_extensions_List.first ;
+ !_Chain_Is_tail( &_API_extensions_List, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_extension = (API_extensions_Control *) the_node;
+
+ if ( the_extension->postdriver_hook )
+ (*the_extension->postdriver_hook)();
+ }
+}
+
+/*PAGE
+ *
+ * _API_extensions_Run_postswitch
+ */
+
+void _API_extensions_Run_postswitch( void )
+{
+ Chain_Node *the_node;
+ API_extensions_Control *the_extension;
+
+ for ( the_node = _API_extensions_List.first ;
+ !_Chain_Is_tail( &_API_extensions_List, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_extension = (API_extensions_Control *) the_node;
+
+ if ( the_extension->postswitch_hook )
+ (*the_extension->postswitch_hook)( _Thread_Executing );
+ }
+}
+
+/* end of file */
diff --git a/cpukit/score/src/chain.c b/cpukit/score/src/chain.c
new file mode 100644
index 0000000000..747728b64d
--- /dev/null
+++ b/cpukit/score/src/chain.c
@@ -0,0 +1,202 @@
+/*
+ * Chain Handler
+ *
+ * NOTE:
+ *
+ * The order of this file is to allow proper compilation due to the
+ * order of inlining required by the compiler.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/address.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _Chain_Initialize
+ *
+ * This kernel routine initializes a doubly linked chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ * starting_address - starting address of first node
+ * number_nodes - number of nodes in chain
+ * node_size - size of node in bytes
+ *
+ * Output parameters: NONE
+ */
+
+void _Chain_Initialize(
+ Chain_Control *the_chain,
+ void *starting_address,
+ unsigned32 number_nodes,
+ unsigned32 node_size
+)
+{
+ unsigned32 count;
+ Chain_Node *current;
+ Chain_Node *next;
+
+ count = number_nodes;
+ current = _Chain_Head( the_chain );
+ the_chain->permanent_null = NULL;
+ next = (Chain_Node *)starting_address;
+ while ( count-- ) {
+ current->next = next;
+ next->previous = current;
+ current = next;
+ next = (Chain_Node *)
+ _Addresses_Add_offset( (void *) next, node_size );
+ }
+ current->next = _Chain_Tail( the_chain );
+ the_chain->last = current;
+}
+
+/*PAGE
+ *
+ * _Chain_Get_first_unprotected
+ */
+
+#ifndef USE_INLINES
+Chain_Node *_Chain_Get_first_unprotected(
+ Chain_Control *the_chain
+)
+{
+ Chain_Node *return_node;
+ Chain_Node *new_first;
+
+ return_node = the_chain->first;
+ new_first = return_node->next;
+ the_chain->first = new_first;
+ new_first->previous = _Chain_Head( the_chain );
+
+ return return_node;
+}
+#endif /* USE_INLINES */
+
+/*PAGE
+ *
+ * _Chain_Get
+ *
+ * This kernel routine returns a pointer to a node taken from the
+ * given chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ *
+ * Output parameters:
+ * return_node - pointer to node in chain allocated
+ * CHAIN_END - if no nodes available
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+Chain_Node *_Chain_Get(
+ Chain_Control *the_chain
+)
+{
+ ISR_Level level;
+ Chain_Node *return_node;
+
+ return_node = NULL;
+ _ISR_Disable( level );
+ if ( !_Chain_Is_empty( the_chain ) )
+ return_node = _Chain_Get_first_unprotected( the_chain );
+ _ISR_Enable( level );
+ return return_node;
+}
+
+/*PAGE
+ *
+ * _Chain_Append
+ *
+ * This kernel routine puts a node on the end of the specified chain.
+ *
+ * Input parameters:
+ * the_chain - pointer to chain header
+ * node - address of node to put at rear of chain
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Append(
+ Chain_Control *the_chain,
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Append_unprotected( the_chain, node );
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Chain_Extract
+ *
+ * This kernel routine deletes the given node from a chain.
+ *
+ * Input parameters:
+ * node - pointer to node in chain to be deleted
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Extract(
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Extract_unprotected( node );
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Chain_Insert
+ *
+ * This kernel routine inserts a given node after a specified node
+ * a requested chain.
+ *
+ * Input parameters:
+ * after_node - pointer to node in chain to be inserted after
+ * node - pointer to node to be inserted
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Chain_Insert(
+ Chain_Node *after_node,
+ Chain_Node *node
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+ _Chain_Insert_unprotected( after_node, node );
+ _ISR_Enable( level );
+}
diff --git a/cpukit/score/src/coremsg.c b/cpukit/score/src/coremsg.c
new file mode 100644
index 0000000000..b40e6a0e7c
--- /dev/null
+++ b/cpukit/score/src/coremsg.c
@@ -0,0 +1,432 @@
+/*
+ * CORE Message Queue Handler
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the CORE Message Queue Handler.
+ * This core object provides task synchronization and communication functions
+ * via messages passed to queue objects.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/coremsg.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/mpci.h>
+
+/*PAGE
+ *
+ * _CORE_message_queue_Initialize
+ *
+ * This routine initializes a newly created message queue based on the
+ * specified data.
+ *
+ * Input parameters:
+ * the_message_queue - the message queue to initialize
+ * the_class - the API specific object class
+ * the_message_queue_attributes - the message queue's attributes
+ * maximum_pending_messages - maximum message and reserved buffer count
+ * maximum_message_size - maximum size of each message
+ * proxy_extract_callout - remote extract support
+ *
+ * Output parameters:
+ * TRUE - if the message queue is initialized
+ * FALSE - if the message queue is NOT initialized
+ */
+
+boolean _CORE_message_queue_Initialize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Classes the_class,
+ CORE_message_queue_Attributes *the_message_queue_attributes,
+ unsigned32 maximum_pending_messages,
+ unsigned32 maximum_message_size,
+ Thread_queue_Extract_callout proxy_extract_callout
+)
+{
+ unsigned32 message_buffering_required;
+ unsigned32 allocated_message_size;
+
+ the_message_queue->maximum_pending_messages = maximum_pending_messages;
+ the_message_queue->number_of_pending_messages = 0;
+ the_message_queue->maximum_message_size = maximum_message_size;
+ _CORE_message_queue_Set_notify( the_message_queue, NULL, NULL );
+
+ /*
+ * round size up to multiple of a ptr for chain init
+ */
+
+ allocated_message_size = maximum_message_size;
+ if (allocated_message_size & (sizeof(unsigned32) - 1)) {
+ allocated_message_size += sizeof(unsigned32);
+ allocated_message_size &= ~(sizeof(unsigned32) - 1);
+ }
+
+ message_buffering_required = maximum_pending_messages *
+ (allocated_message_size + sizeof(CORE_message_queue_Buffer_control));
+
+ the_message_queue->message_buffers = (CORE_message_queue_Buffer *)
+ _Workspace_Allocate( message_buffering_required );
+
+ if (the_message_queue->message_buffers == 0)
+ return FALSE;
+
+ _Chain_Initialize (
+ &the_message_queue->Inactive_messages,
+ the_message_queue->message_buffers,
+ maximum_pending_messages,
+ allocated_message_size + sizeof( CORE_message_queue_Buffer_control )
+ );
+
+ _Chain_Initialize_empty( &the_message_queue->Pending_messages );
+
+ _Thread_queue_Initialize(
+ &the_message_queue->Wait_queue,
+ the_class,
+ _CORE_message_queue_Is_priority( the_message_queue_attributes ) ?
+ THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO,
+ STATES_WAITING_FOR_MESSAGE,
+ proxy_extract_callout,
+ CORE_MESSAGE_QUEUE_STATUS_TIMEOUT
+ );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Close
+ *
+ * This function closes a message by returning all allocated space and
+ * flushing the message_queue's task wait queue.
+ *
+ * Input parameters:
+ * the_message_queue - the message_queue to be flushed
+ * remote_extract_callout - function to invoke remotely
+ * status - status to pass to thread
+ *
+ * Output parameters: NONE
+ */
+
+void _CORE_message_queue_Close(
+ CORE_message_queue_Control *the_message_queue,
+ Thread_queue_Flush_callout remote_extract_callout,
+ unsigned32 status
+)
+{
+
+ if ( the_message_queue->number_of_pending_messages != 0 )
+ (void) _CORE_message_queue_Flush_support( the_message_queue );
+ else
+ _Thread_queue_Flush(
+ &the_message_queue->Wait_queue,
+ remote_extract_callout,
+ status
+ );
+
+ (void) _Workspace_Free( the_message_queue->message_buffers );
+
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Flush
+ *
+ * This function flushes the message_queue's task wait queue. The number
+ * of messages flushed from the queue is returned.
+ *
+ * Input parameters:
+ * the_message_queue - the message_queue to be flushed
+ *
+ * Output parameters:
+ * returns - the number of messages flushed from the queue
+ */
+
+unsigned32 _CORE_message_queue_Flush(
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ if ( the_message_queue->number_of_pending_messages != 0 )
+ return _CORE_message_queue_Flush_support( the_message_queue );
+ else
+ return 0;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Broadcast
+ *
+ * This function sends a message for every thread waiting on the queue and
+ * returns the number of threads made ready by the message.
+ *
+ * Input parameters:
+ * the_message_queue - message is submitted to this message queue
+ * buffer - pointer to message buffer
+ * size - size in bytes of message to send
+ * id - id of message queue
+ * api_message_queue_mp_support - api specific mp support callout
+ * count - area to store number of threads made ready
+ *
+ * Output parameters:
+ * count - number of threads made ready
+ * CORE_MESSAGE_QUEUE_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Broadcast(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ unsigned32 *count
+)
+{
+ Thread_Control *the_thread;
+ unsigned32 number_broadcasted;
+ Thread_Wait_information *waitp;
+ unsigned32 constrained_size;
+
+ number_broadcasted = 0;
+ while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) {
+ waitp = &the_thread->Wait;
+ number_broadcasted += 1;
+
+ constrained_size = size;
+ if ( size > the_message_queue->maximum_message_size )
+ constrained_size = the_message_queue->maximum_message_size;
+
+ _CORE_message_queue_Copy_buffer(
+ buffer,
+ waitp->return_argument,
+ constrained_size
+ );
+
+ *(unsigned32 *)the_thread->Wait.return_argument_1 = size;
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ (*api_message_queue_mp_support) ( the_thread, id );
+
+ }
+ *count = number_broadcasted;
+ return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Seize
+ *
+ * This kernel routine dequeues a message, copies the message buffer to
+ * a given destination buffer, and frees the message buffer to the
+ * inactive message pool. The thread will be blocked if wait is TRUE,
+ * otherwise an error will be given to the thread if no messages are available.
+ *
+ * Input parameters:
+ * the_message_queue - pointer to message queue
+ * id - id of object we are waitig on
+ * buffer - pointer to message buffer to be filled
+ * size - pointer to the size of buffer to be filled
+ * wait - TRUE if wait is allowed, FALSE otherwise
+ * timeout - time to wait for a message
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: Dependent on BUFFER_LENGTH
+ *
+ * INTERRUPT LATENCY:
+ * available
+ * wait
+ */
+
+void _CORE_message_queue_Seize(
+ CORE_message_queue_Control *the_message_queue,
+ Objects_Id id,
+ void *buffer,
+ unsigned32 *size,
+ boolean wait,
+ Watchdog_Interval timeout
+)
+{
+ ISR_Level level;
+ CORE_message_queue_Buffer_control *the_message;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+ executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+ _ISR_Disable( level );
+ if ( the_message_queue->number_of_pending_messages != 0 ) {
+ the_message_queue->number_of_pending_messages -= 1;
+
+ the_message = _CORE_message_queue_Get_pending_message( the_message_queue );
+ _ISR_Enable( level );
+ *size = the_message->Contents.size;
+ _CORE_message_queue_Copy_buffer(the_message->Contents.buffer,buffer,*size );
+ _CORE_message_queue_Free_message_buffer(the_message_queue, the_message );
+ return;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue );
+ executing->Wait.queue = &the_message_queue->Wait_queue;
+ executing->Wait.id = id;
+ executing->Wait.return_argument = (void *)buffer;
+ executing->Wait.return_argument_1 = (void *)size;
+ _ISR_Enable( level );
+
+ _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout );
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Flush_support
+ *
+ * This message handler routine removes all messages from a message queue
+ * and returns them to the inactive message pool. The number of messages
+ * flushed from the queue is returned
+ *
+ * Input parameters:
+ * the_message_queue - pointer to message queue
+ *
+ * Output parameters:
+ * returns - number of messages placed on inactive chain
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+unsigned32 _CORE_message_queue_Flush_support(
+ CORE_message_queue_Control *the_message_queue
+)
+{
+ ISR_Level level;
+ Chain_Node *inactive_first;
+ Chain_Node *message_queue_first;
+ Chain_Node *message_queue_last;
+ unsigned32 count;
+
+ _ISR_Disable( level );
+ inactive_first = the_message_queue->Inactive_messages.first;
+ message_queue_first = the_message_queue->Pending_messages.first;
+ message_queue_last = the_message_queue->Pending_messages.last;
+
+ the_message_queue->Inactive_messages.first = message_queue_first;
+ message_queue_last->next = inactive_first;
+ inactive_first->previous = message_queue_last;
+ message_queue_first->previous =
+ _Chain_Head( &the_message_queue->Inactive_messages );
+
+ _Chain_Initialize_empty( &the_message_queue->Pending_messages );
+
+ count = the_message_queue->number_of_pending_messages;
+ the_message_queue->number_of_pending_messages = 0;
+ _ISR_Enable( level );
+ return count;
+}
+
+/*PAGE
+ *
+ * _CORE_message_queue_Submit
+ *
+ * This routine implements the send and urgent message functions. It
+ * processes a message that is to be submitted to the designated
+ * message queue. The message will either be processed as a
+ * send message which it will be inserted at the rear of the queue
+ * or it will be processed as an urgent message which will be inserted
+ * at the front of the queue.
+ *
+ * Input parameters:
+ * the_message_queue - message is submitted to this message queue
+ * buffer - pointer to message buffer
+ * size - size in bytes of message to send
+ * id - id of message queue
+ * api_message_queue_mp_support - api specific mp support callout
+ * submit_type - send or urgent message
+ *
+ * Output parameters:
+ * CORE_MESSAGE_QUEUE_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+CORE_message_queue_Status _CORE_message_queue_Submit(
+ CORE_message_queue_Control *the_message_queue,
+ void *buffer,
+ unsigned32 size,
+ Objects_Id id,
+ CORE_message_queue_API_mp_support_callout api_message_queue_mp_support,
+ CORE_message_queue_Submit_types submit_type
+)
+{
+ CORE_message_queue_Buffer_control *the_message;
+ Thread_Control *the_thread;
+
+ if ( size > the_message_queue->maximum_message_size )
+ return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE;
+
+ /*
+ * Is there a thread currently waiting on this message queue?
+ */
+
+ the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue );
+ if ( the_thread )
+ {
+ _CORE_message_queue_Copy_buffer(
+ buffer,
+ the_thread->Wait.return_argument,
+ size
+ );
+ *(unsigned32 *)the_thread->Wait.return_argument_1 = size;
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ (*api_message_queue_mp_support) ( the_thread, id );
+
+ return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+ }
+
+ /*
+ * No one waiting on this one currently.
+ * Allocate a message buffer and store it away
+ */
+
+ if ( the_message_queue->number_of_pending_messages ==
+ the_message_queue->maximum_pending_messages ) {
+ return CORE_MESSAGE_QUEUE_STATUS_TOO_MANY;
+ }
+
+ the_message = _CORE_message_queue_Allocate_message_buffer(the_message_queue);
+ if ( the_message == 0)
+ return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED;
+
+ _CORE_message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size );
+ the_message->Contents.size = size;
+
+ the_message_queue->number_of_pending_messages += 1;
+
+ switch ( submit_type ) {
+ case CORE_MESSAGE_QUEUE_SEND_REQUEST:
+ _CORE_message_queue_Append( the_message_queue, the_message );
+ break;
+ case CORE_MESSAGE_QUEUE_URGENT_REQUEST:
+ _CORE_message_queue_Prepend( the_message_queue, the_message );
+ break;
+ }
+
+ return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL;
+}
diff --git a/cpukit/score/src/coremutex.c b/cpukit/score/src/coremutex.c
new file mode 100644
index 0000000000..a056a35d5c
--- /dev/null
+++ b/cpukit/score/src/coremutex.c
@@ -0,0 +1,330 @@
+/*
+ * Mutex Handler
+ *
+ * DESCRIPTION:
+ *
+ * This package is the implementation of the Mutex Handler.
+ * This handler provides synchronization and mutual exclusion capabilities.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coremutex.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/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_fifo( the_mutex_attributes ) ?
+ THREAD_QUEUE_DISCIPLINE_FIFO : THREAD_QUEUE_DISCIPLINE_PRIORITY,
+ 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;
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ if ( executing->current_priority <
+ the_mutex->Attributes.priority_ceiling) {
+ executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED;
+ return;
+ }
+ }
+ 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 );
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ /* already the highest priority */
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ if ( the_mutex->Attributes.priority_ceiling <
+ executing->current_priority ) {
+ _Thread_Change_priority(
+ the_mutex->holder,
+ the_mutex->Attributes.priority_ceiling,
+ FALSE
+ );
+ }
+ }
+ 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;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ _Thread_queue_Enter_critical_section( &the_mutex->Wait_queue );
+ executing->Wait.queue = &the_mutex->Wait_queue;
+ executing->Wait.id = id;
+ _ISR_Enable( level );
+
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ if ( the_mutex->holder->current_priority > executing->current_priority ) {
+ _Thread_Change_priority(
+ the_mutex->holder,
+ executing->current_priority,
+ FALSE
+ );
+ }
+ break;
+ }
+
+ _Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout );
+
+ if ( _Thread_Executing->Wait.return_code == CORE_MUTEX_STATUS_SUCCESSFUL ) {
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ if ( the_mutex->Attributes.priority_ceiling <
+ executing->current_priority ) {
+ _Thread_Change_priority(
+ executing,
+ the_mutex->Attributes.priority_ceiling,
+ FALSE
+ );
+ };
+ break;
+ }
+ }
+}
+
+/*
+ * _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;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ 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.
+ */
+
+ switch ( the_mutex->Attributes.discipline ) {
+ case CORE_MUTEX_DISCIPLINES_FIFO:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY:
+ break;
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING:
+ case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT:
+ if ( executing->resource_count == 0 &&
+ executing->real_priority != executing->current_priority ) {
+ _Thread_Change_priority( executing, executing->real_priority, TRUE );
+ }
+ break;
+ }
+
+
+ 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 or priority ceiling
+ * 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..ac7d82f21b
--- /dev/null
+++ b/cpukit/score/src/coresem.c
@@ -0,0 +1,184 @@
+/*
+ * 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-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/coresem.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/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;
+ _ISR_Enable( level );
+ return;
+ }
+
+ if ( !wait ) {
+ _ISR_Enable( level );
+ executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT;
+ return;
+ }
+
+ _Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue );
+ 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
new file mode 100644
index 0000000000..5cc9031024
--- /dev/null
+++ b/cpukit/score/src/coretod.c
@@ -0,0 +1,238 @@
+/*
+ * Time of Day (TOD) Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/object.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _TOD_Handler_initialization
+ *
+ * This routine initializes the time of day handler.
+ *
+ * Input parameters:
+ * microseconds_per_tick - microseconds between clock ticks
+ *
+ * Output parameters: NONE
+ */
+
+void _TOD_Handler_initialization(
+ unsigned32 microseconds_per_tick
+)
+{
+ _TOD_Microseconds_per_tick = microseconds_per_tick;
+
+ _TOD_Seconds_since_epoch = 0;
+
+ _TOD_Current.year = TOD_BASE_YEAR;
+ _TOD_Current.month = 1;
+ _TOD_Current.day = 1;
+ _TOD_Current.hour = 0;
+ _TOD_Current.minute = 0;
+ _TOD_Current.second = 0;
+ _TOD_Current.ticks = 0;
+
+ if ( microseconds_per_tick == 0 )
+ _TOD_Ticks_per_second = 0;
+ else
+ _TOD_Ticks_per_second =
+ TOD_MICROSECONDS_PER_SECOND / microseconds_per_tick;
+
+ _Watchdog_Initialize( &_TOD_Seconds_watchdog, _TOD_Tickle, 0, NULL );
+
+ _TOD_Is_set = FALSE;
+ _TOD_Activate( _TOD_Ticks_per_second );
+}
+
+/*PAGE
+ *
+ * _TOD_Set
+ *
+ * This rountine sets the current date and time with the specified
+ * new date and time structure.
+ *
+ * Input parameters:
+ * the_tod - pointer to the time and date structure
+ * seconds_since_epoch - seconds since system epoch
+ *
+ * Output parameters: NONE
+ */
+
+void _TOD_Set(
+ TOD_Control *the_tod,
+ Watchdog_Interval seconds_since_epoch
+)
+{
+ Watchdog_Interval ticks_until_next_second;
+
+ _Thread_Disable_dispatch();
+ _TOD_Deactivate();
+
+ if ( seconds_since_epoch < _TOD_Seconds_since_epoch )
+ _Watchdog_Adjust_seconds( WATCHDOG_BACKWARD,
+ _TOD_Seconds_since_epoch - seconds_since_epoch );
+ else
+ _Watchdog_Adjust_seconds( WATCHDOG_FORWARD,
+ seconds_since_epoch - _TOD_Seconds_since_epoch );
+
+ ticks_until_next_second = _TOD_Ticks_per_second;
+ if ( ticks_until_next_second > _TOD_Current.ticks )
+ ticks_until_next_second -= _TOD_Current.ticks;
+
+ _TOD_Current = *the_tod;
+ _TOD_Seconds_since_epoch = seconds_since_epoch;
+ _TOD_Is_set = TRUE;
+ _TOD_Activate( ticks_until_next_second );
+
+ _Thread_Enable_dispatch();
+}
+
+/*PAGE
+ *
+ * _TOD_Validate
+ *
+ * This kernel routine checks the validity of a date and time structure.
+ *
+ * Input parameters:
+ * the_tod - pointer to a time and date structure
+ *
+ * Output parameters:
+ * 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.
+ */
+
+boolean _TOD_Validate(
+ TOD_Control *the_tod
+)
+{
+ unsigned32 days_in_month;
+
+ if ((the_tod->ticks >= _TOD_Ticks_per_second) ||
+ (the_tod->second >= TOD_SECONDS_PER_MINUTE) ||
+ (the_tod->minute >= TOD_MINUTES_PER_HOUR) ||
+ (the_tod->hour >= TOD_HOURS_PER_DAY) ||
+ (the_tod->month == 0) ||
+ (the_tod->month > TOD_MONTHS_PER_YEAR) ||
+ (the_tod->year < TOD_BASE_YEAR) ||
+ (the_tod->day == 0) )
+ return FALSE;
+
+ if ( (the_tod->year % 4) == 0 )
+ days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ];
+ else
+ days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ];
+
+ if ( the_tod->day > days_in_month )
+ return FALSE;
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _TOD_To_seconds
+ *
+ * This routine returns the seconds from the epoch until the
+ * current date and time.
+ *
+ * Input parameters:
+ * the_tod - pointer to the time and date structure
+ *
+ * Output parameters:
+ * returns - seconds since epoch until the_tod
+ */
+
+unsigned32 _TOD_To_seconds(
+ TOD_Control *the_tod
+)
+{
+ unsigned32 time;
+ unsigned32 year_mod_4;
+
+ time = the_tod->day - 1;
+ year_mod_4 = the_tod->year & 3;
+
+ if ( year_mod_4 == 0 )
+ time += _TOD_Days_to_date[ 1 ][ the_tod->month ];
+ else
+ time += _TOD_Days_to_date[ 0 ][ the_tod->month ];
+
+ time += ( (the_tod->year - TOD_BASE_YEAR) / 4 ) *
+ ( (TOD_DAYS_PER_YEAR * 4) + 1);
+
+ time += _TOD_Days_since_last_leap_year[ year_mod_4 ];
+
+ time *= TOD_SECONDS_PER_DAY;
+
+ time += ((the_tod->hour * TOD_MINUTES_PER_HOUR) + the_tod->minute)
+ * TOD_SECONDS_PER_MINUTE;
+
+ time += the_tod->second;
+
+ return( time );
+}
+
+/*PAGE
+ *
+ * _TOD_Tickle
+ *
+ * This routine updates the calendar time and tickles the
+ * per second watchdog timer chain.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine only works for leap-years through 2099.
+ */
+
+void _TOD_Tickle(
+ Objects_Id id,
+ void *ignored
+)
+{
+ unsigned32 leap;
+
+ _TOD_Current.ticks = 0;
+ ++_TOD_Seconds_since_epoch;
+ if ( ++_TOD_Current.second >= TOD_SECONDS_PER_MINUTE ) {
+ _TOD_Current.second = 0;
+ if ( ++_TOD_Current.minute >= TOD_MINUTES_PER_HOUR ) {
+ _TOD_Current.minute = 0;
+ if ( ++_TOD_Current.hour >= TOD_HOURS_PER_DAY ) {
+ _TOD_Current.hour = 0;
+ if ( _TOD_Current.year & 0x3 ) leap = 0;
+ else leap = 1;
+ if ( ++_TOD_Current.day >
+ _TOD_Days_per_month[ leap ][ _TOD_Current.month ]) {
+ _TOD_Current.day = 1;
+ if ( ++_TOD_Current.month > TOD_MONTHS_PER_YEAR ) {
+ _TOD_Current.month = 1;
+ _TOD_Current.year++;
+ }
+ }
+ }
+ }
+ }
+
+ _Watchdog_Tickle_seconds();
+ _Watchdog_Insert_ticks( &_TOD_Seconds_watchdog, _TOD_Ticks_per_second );
+}
diff --git a/cpukit/score/src/heap.c b/cpukit/score/src/heap.c
new file mode 100644
index 0000000000..284991f0ef
--- /dev/null
+++ b/cpukit/score/src/heap.c
@@ -0,0 +1,538 @@
+/*
+ * Heap Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <rtems/system.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/heap.h>
+
+/*PAGE
+ *
+ * _Heap_Initialize
+ *
+ * This kernel routine initializes a heap.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * starting_address - starting address of heap
+ * size - size of heap
+ * page_size - allocatable unit of memory
+ *
+ * Output parameters:
+ * returns - maximum memory available if RTEMS_SUCCESSFUL
+ * 0 - otherwise
+ *
+ * This is what a heap looks like in memory immediately
+ * after initialization:
+ *
+ * +--------------------------------+
+ * 0 | size = 0 | status = used | a.k.a. dummy back flag
+ * +--------------------------------+
+ * 4 | size = size-8 | status = free | a.k.a. front flag
+ * +--------------------------------+
+ * 8 | next = PERM HEAP_TAIL |
+ * +--------------------------------+
+ * 12 | previous = PERM HEAP_HEAD |
+ * +--------------------------------+
+ * | |
+ * | memory available |
+ * | for allocation |
+ * | |
+ * +--------------------------------+
+ * size - 8 | size = size-8 | status = free | a.k.a. back flag
+ * +--------------------------------+
+ * size - 4 | size = 0 | status = used | a.k.a. dummy front flag
+ * +--------------------------------+
+ */
+
+unsigned32 _Heap_Initialize(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 page_size
+)
+{
+ Heap_Block *the_block;
+ unsigned32 the_size;
+
+ if ( !_Heap_Is_page_size_valid( page_size ) ||
+ (size < HEAP_MINIMUM_SIZE) )
+ return 0;
+
+ the_heap->page_size = page_size;
+ the_size = size - HEAP_OVERHEAD;
+
+ the_block = (Heap_Block *) starting_address;
+ the_block->back_flag = HEAP_DUMMY_FLAG;
+ the_block->front_flag = the_size;
+ the_block->next = _Heap_Tail( the_heap );
+ the_block->previous = _Heap_Head( the_heap );
+
+ the_heap->start = the_block;
+ the_heap->first = the_block;
+ the_heap->permanent_null = NULL;
+ the_heap->last = the_block;
+
+ the_block = _Heap_Next_block( the_block );
+ the_block->back_flag = the_size;
+ the_block->front_flag = HEAP_DUMMY_FLAG;
+ the_heap->final = the_block;
+
+ return ( the_size - HEAP_BLOCK_USED_OVERHEAD );
+}
+
+/*PAGE
+ *
+ * _Heap_Extend
+ *
+ * This routine grows the_heap memory area using the size bytes which
+ * begin at starting_address.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header.
+ * starting_address - pointer to the memory area.
+ * size - size in bytes of the memory block to allocate.
+ *
+ * Output parameters:
+ * *amount_extended - amount of memory added to the_heap
+ */
+
+Heap_Extend_status _Heap_Extend(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 size,
+ unsigned32 *amount_extended
+)
+{
+ Heap_Block *the_block;
+ unsigned32 *p;
+
+ /*
+ * The overhead was taken from the original heap memory.
+ */
+
+ Heap_Block *old_final;
+ Heap_Block *new_final;
+
+ /*
+ * There are five possibilities for the location of starting
+ * address:
+ *
+ * 1. non-contiguous lower address (NOT SUPPORTED)
+ * 2. contiguous lower address (NOT SUPPORTED)
+ * 3. in the heap (ERROR)
+ * 4. contiguous higher address (SUPPORTED)
+ * 5. non-contiguous higher address (NOT SUPPORTED)
+ *
+ * As noted, this code only supports (4).
+ */
+
+ if ( starting_address >= (void *) the_heap->start && /* case 3 */
+ starting_address <= (void *) the_heap->final
+ )
+ return HEAP_EXTEND_ERROR;
+
+ if ( starting_address < (void *) the_heap->start ) { /* cases 1 and 2 */
+
+ return HEAP_EXTEND_NOT_IMPLEMENTED; /* cases 1 and 2 */
+
+ } else { /* cases 4 and 5 */
+
+ the_block = (Heap_Block *)
+ _Addresses_Subtract_offset( starting_address, HEAP_OVERHEAD );
+ if ( the_block != the_heap->final )
+ return HEAP_EXTEND_NOT_IMPLEMENTED; /* case 5 */
+ }
+
+ /*
+ * Currently only case 4 should make it to this point.
+ * The basic trick is to make the extend area look like a used
+ * block and free it.
+ */
+
+ *amount_extended = size;
+
+ old_final = the_heap->final;
+ new_final = _Addresses_Add_offset( old_final, size );
+ /* SAME AS: _Addresses_Add_offset( starting_address, size-HEAP_OVERHEAD ); */
+
+ the_heap->final = new_final;
+
+ old_final->front_flag =
+ new_final->back_flag = _Heap_Build_flag( size, HEAP_BLOCK_USED );
+ new_final->front_flag = HEAP_DUMMY_FLAG;
+
+ /*
+ * Must pass in address of "user" area
+ * So add in the offset field.
+ */
+
+ p = (unsigned32 *) &old_final->next;
+ *p = sizeof(unsigned32);
+ p++;
+ _Heap_Free( the_heap, p );
+
+ return HEAP_EXTEND_SUCCESSFUL;
+}
+
+/*PAGE
+ *
+ * _Heap_Allocate
+ *
+ * This kernel routine allocates the requested size of memory
+ * from the specified heap.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header.
+ * size - size in bytes of the memory block to allocate.
+ *
+ * Output parameters:
+ * returns - starting address of memory block allocated
+ */
+
+void *_Heap_Allocate(
+ Heap_Control *the_heap,
+ unsigned32 size
+)
+{
+ unsigned32 excess;
+ unsigned32 the_size;
+ Heap_Block *the_block;
+ Heap_Block *next_block;
+ Heap_Block *temporary_block;
+ void *ptr;
+ unsigned32 offset;
+
+ excess = size % the_heap->page_size;
+ the_size = size + the_heap->page_size + HEAP_BLOCK_USED_OVERHEAD;
+
+ if ( excess )
+ the_size += the_heap->page_size - excess;
+
+ if ( the_size < sizeof( Heap_Block ) )
+ the_size = sizeof( Heap_Block );
+
+ for ( the_block = the_heap->first;
+ ;
+ the_block = the_block->next ) {
+ if ( the_block == _Heap_Tail( the_heap ) )
+ return( NULL );
+ if ( the_block->front_flag >= the_size )
+ break;
+ }
+
+ if ( (the_block->front_flag - the_size) >
+ (the_heap->page_size + HEAP_BLOCK_USED_OVERHEAD) ) {
+ the_block->front_flag -= the_size;
+ next_block = _Heap_Next_block( the_block );
+ next_block->back_flag = the_block->front_flag;
+
+ temporary_block = _Heap_Block_at( next_block, the_size );
+ temporary_block->back_flag =
+ next_block->front_flag = _Heap_Build_flag( the_size,
+ HEAP_BLOCK_USED );
+ ptr = _Heap_Start_of_user_area( next_block );
+ } else {
+ next_block = _Heap_Next_block( the_block );
+ next_block->back_flag = _Heap_Build_flag( the_block->front_flag,
+ HEAP_BLOCK_USED );
+ the_block->front_flag = next_block->back_flag;
+ the_block->next->previous = the_block->previous;
+ the_block->previous->next = the_block->next;
+ ptr = _Heap_Start_of_user_area( the_block );
+ }
+
+ /*
+ * round ptr up to a multiple of page size
+ * Have to save the bump amount in the buffer so that free can figure it out
+ */
+
+ offset = the_heap->page_size - (((unsigned32) ptr) & (the_heap->page_size - 1));
+ ptr = _Addresses_Add_offset( ptr, offset );
+ *(((unsigned32 *) ptr) - 1) = offset;
+
+#ifdef RTEMS_DEBUG
+ {
+ unsigned32 ptr_u32;
+ ptr_u32 = (unsigned32) ptr;
+ if (ptr_u32 & (the_heap->page_size - 1))
+ abort();
+ }
+#endif
+
+ return ptr;
+}
+
+/*PAGE
+ *
+ * _Heap_Size_of_user_area
+ *
+ * This kernel routine returns the size of the memory area
+ * given heap block.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * starting_address - starting address of the memory block to free.
+ * size - pointer to size of area
+ *
+ * Output parameters:
+ * size - size of area filled in
+ * TRUE - if starting_address is valid heap address
+ * FALSE - if starting_address is invalid heap address
+ */
+
+boolean _Heap_Size_of_user_area(
+ Heap_Control *the_heap,
+ void *starting_address,
+ unsigned32 *size
+)
+{
+ Heap_Block *the_block;
+ Heap_Block *next_block;
+ unsigned32 the_size;
+
+ the_block = _Heap_User_block_at( starting_address );
+
+ if ( !_Heap_Is_block_in( the_heap, the_block ) ||
+ _Heap_Is_block_free( the_block ) )
+ return( FALSE );
+
+ the_size = _Heap_Block_size( the_block );
+ next_block = _Heap_Block_at( the_block, the_size );
+
+ if ( !_Heap_Is_block_in( the_heap, next_block ) ||
+ (the_block->front_flag != next_block->back_flag) )
+ return( FALSE );
+
+ *size = the_size;
+ return( TRUE );
+}
+
+/*PAGE
+ *
+ * _Heap_Free
+ *
+ * This kernel routine returns the memory designated by the
+ * given heap and given starting address to the memory pool.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * starting_address - starting address of the memory block to free.
+ *
+ * Output parameters:
+ * TRUE - if starting_address is valid heap address
+ * FALSE - if starting_address is invalid heap address
+ */
+
+boolean _Heap_Free(
+ Heap_Control *the_heap,
+ void *starting_address
+)
+{
+ Heap_Block *the_block;
+ Heap_Block *next_block;
+ Heap_Block *new_next_block;
+ Heap_Block *previous_block;
+ Heap_Block *temporary_block;
+ unsigned32 the_size;
+
+ the_block = _Heap_User_block_at( starting_address );
+
+ if ( !_Heap_Is_block_in( the_heap, the_block ) ||
+ _Heap_Is_block_free( the_block ) ) {
+ return( FALSE );
+ }
+
+ the_size = _Heap_Block_size( the_block );
+ next_block = _Heap_Block_at( the_block, the_size );
+
+ if ( !_Heap_Is_block_in( the_heap, next_block ) ||
+ (the_block->front_flag != next_block->back_flag) ) {
+ return( FALSE );
+ }
+
+ if ( _Heap_Is_previous_block_free( the_block ) ) {
+ previous_block = _Heap_Previous_block( the_block );
+
+ if ( !_Heap_Is_block_in( the_heap, previous_block ) ) {
+ return( FALSE );
+ }
+
+ if ( _Heap_Is_block_free( next_block ) ) { /* coalesce both */
+ previous_block->front_flag += next_block->front_flag + the_size;
+ temporary_block = _Heap_Next_block( previous_block );
+ temporary_block->back_flag = previous_block->front_flag;
+ next_block->next->previous = next_block->previous;
+ next_block->previous->next = next_block->next;
+ }
+ else { /* coalesce prev */
+ previous_block->front_flag =
+ next_block->back_flag = previous_block->front_flag + the_size;
+ }
+ }
+ else if ( _Heap_Is_block_free( next_block ) ) { /* coalesce next */
+ the_block->front_flag = the_size + next_block->front_flag;
+ new_next_block = _Heap_Next_block( the_block );
+ new_next_block->back_flag = the_block->front_flag;
+ the_block->next = next_block->next;
+ the_block->previous = next_block->previous;
+ next_block->previous->next = the_block;
+ next_block->next->previous = the_block;
+
+ if (the_heap->first == next_block)
+ the_heap->first = the_block;
+ }
+ else { /* no coalesce */
+ next_block->back_flag =
+ the_block->front_flag = the_size;
+ the_block->previous = _Heap_Head( the_heap );
+ the_block->next = the_heap->first;
+ the_heap->first = the_block;
+ the_block->next->previous = the_block;
+ }
+
+ return( TRUE );
+}
+
+/*PAGE
+ *
+ * _Heap_Walk
+ *
+ * This kernel routine walks the heap and verifies its correctness.
+ *
+ * Input parameters:
+ * the_heap - pointer to heap header
+ * source - a numeric indicator of the invoker of this routine
+ * do_dump - when TRUE print the information
+ *
+ * Output parameters: NONE
+ */
+
+#ifndef RTEMS_DEBUG
+
+void _Heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+)
+{
+}
+
+#else
+
+#include <stdio.h>
+#include <unistd.h>
+
+void _Heap_Walk(
+ Heap_Control *the_heap,
+ int source,
+ boolean do_dump
+)
+{
+ Heap_Block *the_block = 0; /* avoid warnings */
+ Heap_Block *next_block = 0; /* avoid warnings */
+ int notdone = 1;
+ int error = 0;
+ int passes = 0;
+
+ /*
+ * We don't want to allow walking the heap until we have
+ * transferred control to the user task so we watch the
+ * system state.
+ */
+
+ if ( !_System_state_Is_up( _System_state_Get() ) )
+ return;
+
+ the_block = the_heap->start;
+
+ if (do_dump == TRUE) {
+ printf("\nPASS: %d start @ 0x%p final 0x%p, first 0x%p last 0x%p\n",
+ source, the_heap->start, the_heap->final,
+ the_heap->first, the_heap->last
+ );
+ }
+
+ /*
+ * Handle the 1st block
+ */
+
+ if (the_block->back_flag != HEAP_DUMMY_FLAG) {
+ printf("PASS: %d Back flag of 1st block isn't HEAP_DUMMY_FLAG\n", source);
+ error = 1;
+ }
+
+ while (notdone) {
+ passes++;
+ if (error && (passes > 10))
+ abort();
+
+ if (do_dump == TRUE) {
+ printf("PASS: %d Block @ 0x%p Back %d, Front %d",
+ source, the_block,
+ the_block->back_flag, the_block->front_flag);
+ if ( _Heap_Is_block_free(the_block) ) {
+ printf( " Prev 0x%p, Next 0x%p\n",
+ the_block->previous, the_block->next);
+ } else {
+ printf("\n");
+ }
+ }
+
+ /*
+ * Handle the last block
+ */
+
+ if ( the_block->front_flag != HEAP_DUMMY_FLAG ) {
+ next_block = _Heap_Next_block(the_block);
+ if ( the_block->front_flag != next_block->back_flag ) {
+ error = 1;
+ printf("PASS: %d Front and back flags don't match\n", source);
+ printf(" Current Block (%p): Back - %d, Front - %d",
+ the_block, the_block->back_flag, the_block->front_flag);
+ if (do_dump == TRUE) {
+ if (_Heap_Is_block_free(the_block)) {
+ printf(" Prev 0x%p, Next 0x%p\n",
+ the_block->previous, the_block->next);
+ } else {
+ printf("\n");
+ }
+ } else {
+ printf("\n");
+ }
+ printf(" Next Block (%p): Back - %d, Front - %d",
+ next_block, next_block->back_flag, next_block->front_flag);
+ if (do_dump == TRUE) {
+ if (_Heap_Is_block_free(next_block)) {
+ printf(" Prev 0x%p, Next 0x%p\n",
+ the_block->previous, the_block->next);
+ } else {
+ printf("\n");
+ }
+ } else {
+ printf("\n");
+ }
+ }
+ }
+
+ if (the_block->front_flag == HEAP_DUMMY_FLAG)
+ notdone = 0;
+ else
+ the_block = next_block;
+ }
+
+ if (error)
+ abort();
+}
+#endif
diff --git a/cpukit/score/src/interr.c b/cpukit/score/src/interr.c
new file mode 100644
index 0000000000..2011e653af
--- /dev/null
+++ b/cpukit/score/src/interr.c
@@ -0,0 +1,61 @@
+/*
+ * Internal Error Handler
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/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..712696b97c
--- /dev/null
+++ b/cpukit/score/src/isr.c
@@ -0,0 +1,60 @@
+/*
+ * ISR Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/stack.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/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
new file mode 100644
index 0000000000..5730e93353
--- /dev/null
+++ b/cpukit/score/src/mpci.c
@@ -0,0 +1,525 @@
+/*
+ * Multiprocessing Communications Interface (MPCI) Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/mpci.h>
+#include <rtems/score/mppkt.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+#include <rtems/score/watchdog.h>
+#include <rtems/score/sysstate.h>
+
+#include <rtems/score/coresem.h>
+
+/*PAGE
+ *
+ * _MPCI_Handler_initialization
+ *
+ * This subprogram performs the initialization necessary for this handler.
+ */
+
+void _MPCI_Handler_initialization(
+ MPCI_Control *users_mpci_table,
+ unsigned32 timeout_status
+)
+{
+ 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;
+
+ if ( !_System_state_Is_multiprocessing )
+ return;
+
+ /*
+ * Register the MP Process Packet routine.
+ */
+
+ _MPCI_Register_packet_processor(
+ MP_PACKET_MPCI_INTERNAL,
+ _MPCI_Internal_packets_Process_packet
+ );
+
+ /*
+ * Create the counting semaphore used by the MPCI Receive Server.
+ */
+
+ 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,
+ timeout_status
+ );
+}
+
+/*PAGE
+ *
+ * _MPCI_Create_server
+ *
+ * This subprogram creates the MPCI receive server.
+ */
+
+char *_MPCI_Internal_name = "MPCI";
+
+void _MPCI_Create_server( void )
+{
+
+ if ( !_System_state_Is_multiprocessing )
+ return;
+
+ /*
+ * Initialize the MPCI Receive Server
+ */
+
+ _MPCI_Receive_server_tcb = _Thread_Internal_allocate();
+
+ _Thread_Initialize(
+ &_Thread_Internal_information,
+ _MPCI_Receive_server_tcb,
+ NULL, /* allocate the stack */
+ MPCI_RECEIVE_SERVER_STACK_SIZE,
+ CPU_ALL_TASKS_ARE_FP,
+ PRIORITY_MINIMUM,
+ FALSE, /* no preempt */
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ NULL, /* no budget algorithm callout */
+ 0, /* all interrupts enabled */
+ _MPCI_Internal_name
+ );
+
+ _Thread_Start(
+ _MPCI_Receive_server_tcb,
+ THREAD_START_NUMERIC,
+ (void *) _MPCI_Receive_server,
+ NULL,
+ 0
+ );
+}
+
+/*PAGE
+ *
+ * _MPCI_Initialization
+ *
+ * This subprogram initializes the MPCI driver by
+ * invoking the user provided MPCI initialization callout.
+ */
+
+void _MPCI_Initialization ( void )
+{
+ (*_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(
+ MP_packet_Classes the_class,
+ MPCI_Packet_processor the_packet_processor
+
+)
+{
+ _MPCI_Packet_processors[ the_class ] = the_packet_processor;
+}
+
+/*PAGE
+ *
+ * _MPCI_Get_packet
+ *
+ * This subprogram obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+MP_packet_Prefix *_MPCI_Get_packet ( void )
+{
+ MP_packet_Prefix *the_packet;
+
+ (*_MPCI_table->get_packet)( &the_packet );
+
+ if ( the_packet == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_PACKETS
+ );
+
+ /*
+ * Put in a default timeout that will be used for
+ * all packets that do not otherwise have a timeout.
+ */
+
+ the_packet->timeout = MPCI_DEFAULT_TIMEOUT;
+
+ return the_packet;
+}
+
+/*PAGE
+ *
+ * _MPCI_Return_packet
+ *
+ * This subprogram returns a packet by invoking the user provided
+ * MPCI return packet callout.
+ */
+
+void _MPCI_Return_packet (
+ MP_packet_Prefix *the_packet
+)
+{
+ (*_MPCI_table->return_packet)( the_packet );
+}
+
+/*PAGE
+ *
+ * _MPCI_Send_process_packet
+ *
+ * This subprogram sends a process packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_process_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ the_packet->source_tid = _Thread_Executing->Object.id;
+ the_packet->to_convert =
+ ( the_packet->to_convert - sizeof(MP_packet_Prefix) ) /
+ sizeof(unsigned32);
+
+ (*_MPCI_table->send_packet)( destination, the_packet );
+}
+
+/*PAGE
+ *
+ * _MPCI_Send_request_packet
+ *
+ * This subprogram sends a request packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+unsigned32 _MPCI_Send_request_packet (
+ unsigned32 destination,
+ 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(MP_packet_Prefix) ) /
+ sizeof(unsigned32);
+
+ _Thread_Executing->Wait.id = the_packet->id;
+
+ _Thread_Executing->Wait.queue = &_MPCI_Remote_blocked_threads;
+
+ _Thread_Disable_dispatch();
+
+ (*_MPCI_table->send_packet)( destination, the_packet );
+
+ _Thread_queue_Enter_critical_section( &_MPCI_Remote_blocked_threads );
+
+ /*
+ * See if we need a default timeout
+ */
+
+ if (the_packet->timeout == MPCI_DEFAULT_TIMEOUT)
+ the_packet->timeout = _MPCI_table->default_timeout;
+
+ _Thread_queue_Enqueue( &_MPCI_Remote_blocked_threads, the_packet->timeout );
+
+ _Thread_Executing->current_state =
+ _States_Set( extra_state, _Thread_Executing->current_state );
+
+ _Thread_Enable_dispatch();
+
+ return _Thread_Executing->Wait.return_code;
+}
+
+/*PAGE
+ *
+ * _MPCI_Send_response_packet
+ *
+ * This subprogram sends a response packet by invoking the user provided
+ * MPCI send callout.
+ */
+
+void _MPCI_Send_response_packet (
+ unsigned32 destination,
+ MP_packet_Prefix *the_packet
+)
+{
+ the_packet->source_tid = _Thread_Executing->Object.id;
+
+ (*_MPCI_table->send_packet)( destination, the_packet );
+}
+
+/*PAGE
+ *
+ * _MPCI_Receive_packet
+ *
+ * This subprogram receives a packet by invoking the user provided
+ * MPCI receive callout.
+ */
+
+MP_packet_Prefix *_MPCI_Receive_packet ( void )
+{
+ MP_packet_Prefix *the_packet;
+
+ (*_MPCI_table->receive_packet)( &the_packet );
+
+ return the_packet;
+}
+
+/*PAGE
+ *
+ * _MPCI_Process_response
+ *
+ * This subprogram obtains a packet by invoking the user provided
+ * MPCI get packet callout.
+ */
+
+Thread_Control *_MPCI_Process_response (
+ MP_packet_Prefix *the_packet
+)
+{
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( the_packet->id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE:
+ the_thread = NULL; /* IMPOSSIBLE */
+ break;
+ case OBJECTS_LOCAL:
+ _Thread_queue_Extract( &_MPCI_Remote_blocked_threads, the_thread );
+ the_thread->Wait.return_code = the_packet->return_code;
+ _Thread_Unnest_dispatch();
+ break;
+ }
+
+ return the_thread;
+}
+
+/*PAGE
+ *
+ * _MPCI_Receive_server
+ *
+ */
+
+Thread _MPCI_Receive_server(
+ unsigned32 ignored
+)
+{
+
+ MP_packet_Prefix *the_packet;
+ MPCI_Packet_processor the_function;
+ Thread_Control *executing;
+
+ executing = _Thread_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();
+}
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_process_packet
+ *
+ */
+
+void _MPCI_Internal_packets_Send_process_packet (
+ MPCI_Internal_Remote_operations operation
+)
+{
+ MPCI_Internal_packet *the_packet;
+
+ switch ( operation ) {
+
+ case MPCI_PACKETS_SYSTEM_VERIFY:
+
+ the_packet = _MPCI_Internal_packets_Get_packet();
+ the_packet->Prefix.the_class = MP_PACKET_MPCI_INTERNAL;
+ the_packet->Prefix.length = sizeof ( MPCI_Internal_packet );
+ the_packet->Prefix.to_convert = sizeof ( MPCI_Internal_packet );
+ the_packet->operation = operation;
+
+ the_packet->maximum_nodes = _Objects_Maximum_nodes;
+
+ the_packet->maximum_global_objects = _Objects_MP_Maximum_global_objects;
+
+ _MPCI_Send_process_packet( MPCI_ALL_NODES, &the_packet->Prefix );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_request_packet
+ *
+ * This subprogram is not needed since there are no request
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_response_packet
+ *
+ * This subprogram is not needed since there are no response
+ * packets to be sent by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ *
+ * _MPCI_Internal_packets_Process_packet
+ *
+ */
+
+void _MPCI_Internal_packets_Process_packet (
+ MP_packet_Prefix *the_packet_prefix
+)
+{
+ MPCI_Internal_packet *the_packet;
+ unsigned32 maximum_nodes;
+ unsigned32 maximum_global_objects;
+
+ the_packet = (MPCI_Internal_packet *) the_packet_prefix;
+
+ switch ( the_packet->operation ) {
+
+ case MPCI_PACKETS_SYSTEM_VERIFY:
+
+ maximum_nodes = the_packet->maximum_nodes;
+ maximum_global_objects = the_packet->maximum_global_objects;
+ if ( maximum_nodes != _Objects_Maximum_nodes ||
+ maximum_global_objects != _Objects_MP_Maximum_global_objects ) {
+
+ _MPCI_Return_packet( the_packet_prefix );
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INCONSISTENT_MP_INFORMATION
+ );
+ }
+
+ _MPCI_Return_packet( the_packet_prefix );
+
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_object_was_deleted
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Send_extract_proxy
+ *
+ * This subprogram is not needed since there are no objects
+ * deleted by this manager.
+ *
+ */
+
+/*PAGE
+ *
+ * _MPCI_Internal_packets_Get_packet
+ *
+ */
+
+MPCI_Internal_packet *_MPCI_Internal_packets_Get_packet ( void )
+{
+ return ( (MPCI_Internal_packet *) _MPCI_Get_packet() );
+}
+
+/* end of file */
diff --git a/cpukit/score/src/object.c b/cpukit/score/src/object.c
new file mode 100644
index 0000000000..05339f3d13
--- /dev/null
+++ b/cpukit/score/src/object.c
@@ -0,0 +1,516 @@
+/*
+ * Object Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/object.h>
+#include <rtems/score/objectmp.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/sysstate.h>
+
+/*PAGE
+ *
+ * _Objects_Handler_initialization
+ *
+ * This routine initializes the object handler.
+ *
+ * Input parameters:
+ * node - local node
+ * maximum_nodes - number of nodes in the system
+ * maximum_global_objects - number of configured global objects
+ *
+ * Output parameters: NONE
+ */
+
+void _Objects_Handler_initialization(
+ unsigned32 node,
+ unsigned32 maximum_nodes,
+ unsigned32 maximum_global_objects
+)
+{
+ 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(
+ node,
+ maximum_nodes,
+ maximum_global_objects
+ );
+}
+
+/*PAGE
+ *
+ * _Objects_Initialize_information
+ *
+ * This routine initializes all object information related data structures.
+ *
+ * Input parameters:
+ * information - object information table
+ * the_class - object class
+ * supports_global - TRUE if this is a global object class
+ * maximum - maximum objects of this class
+ * is_string - TRUE if names for this object are strings
+ * size - size of this object's control block
+ * is_thread - TRUE if this class is threads
+ *
+ * Output parameters: NONE
+ */
+
+void _Objects_Initialize_information(
+ Objects_Information *information,
+ Objects_Classes the_class,
+ boolean supports_global,
+ unsigned32 maximum,
+ unsigned32 size,
+ boolean is_string,
+ unsigned32 maximum_name_length,
+ boolean is_thread
+)
+{
+ unsigned32 minimum_index;
+ unsigned32 index;
+ Objects_Control *the_object;
+ unsigned32 name_length;
+ void *name_area;
+
+ information->maximum = maximum;
+ information->the_class = the_class;
+ information->is_string = is_string;
+ information->is_thread = is_thread;
+
+ /*
+ * Set the entry in the object information table.
+ */
+
+ _Objects_Information_table[ the_class ] = information;
+
+ /*
+ * Calculate minimum and maximum Id's
+ */
+
+ if ( maximum == 0 ) minimum_index = 0;
+ else minimum_index = 1;
+
+ information->minimum_id =
+ _Objects_Build_id( the_class, _Objects_Local_node, minimum_index );
+
+ information->maximum_id =
+ _Objects_Build_id( the_class, _Objects_Local_node, maximum );
+
+ /*
+ * Allocate local pointer table
+ */
+
+ information->local_table =
+ (Objects_Control **) _Workspace_Allocate_or_fatal_error(
+ (maximum + 1) * sizeof(Objects_Control *)
+ );
+
+ /*
+ * Allocate name table
+ */
+
+ name_length = maximum_name_length;
+
+ if (name_length & (OBJECTS_NAME_ALIGNMENT-1))
+ name_length = (name_length + OBJECTS_NAME_ALIGNMENT) &
+ ~(OBJECTS_NAME_ALIGNMENT-1);
+
+ information->name_length = name_length;
+
+ name_area = (Objects_Name *)
+ _Workspace_Allocate_or_fatal_error( (maximum + 1) * name_length );
+ information->name_table = name_area;
+
+ /*
+ * Initialize local pointer table
+ */
+
+ for ( index=0 ; index <= maximum ; index++ ) {
+ information->local_table[ index ] = NULL;
+ }
+
+ /*
+ * Initialize objects .. if there are any
+ */
+
+ if ( maximum == 0 ) {
+ _Chain_Initialize_empty( &information->Inactive );
+ } else {
+
+ _Chain_Initialize(
+ &information->Inactive,
+ _Workspace_Allocate_or_fatal_error( maximum * size ),
+ maximum,
+ size
+ );
+
+ the_object = (Objects_Control *) information->Inactive.first;
+ for ( index=1; index <= maximum ; index++ ) {
+ the_object->id =
+ _Objects_Build_id( the_class, _Objects_Local_node, index );
+
+ the_object->name = (void *) name_area;
+
+ name_area = _Addresses_Add_offset( name_area, name_length );
+
+ the_object = (Objects_Control *) the_object->Node.next;
+ }
+
+ }
+
+ /*
+ * Take care of multiprocessing
+ */
+
+ if ( supports_global == TRUE && _System_state_Is_multiprocessing ) {
+
+ information->global_table =
+ (Chain_Control *) _Workspace_Allocate_or_fatal_error(
+ (_Objects_Maximum_nodes + 1) * sizeof(Chain_Control)
+ );
+
+ for ( index=1; index <= _Objects_Maximum_nodes ; index++ )
+ _Chain_Initialize_empty( &information->global_table[ index ] );
+ }
+ else
+ information->global_table = NULL;
+}
+
+/*PAGE
+ *
+ * _Objects_Clear_name
+ *
+ * XXX
+ */
+
+void _Objects_Clear_name(
+ void *name,
+ unsigned32 length
+)
+{
+ unsigned32 index;
+ unsigned32 maximum = length / OBJECTS_NAME_ALIGNMENT;
+ unsigned32 *name_ptr = (unsigned32 *) name;
+
+ for ( index=0 ; index < maximum ; index++ )
+ *name_ptr++ = 0;
+}
+
+/*PAGE
+ *
+ * _Objects_Copy_name_string
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_string(
+ void *source,
+ void *destination
+)
+{
+ unsigned8 *source_p = (unsigned8 *) source;
+ unsigned8 *destination_p = (unsigned8 *) destination;
+
+ do {
+ *destination_p++ = *source_p;
+ } while ( *source_p++ );
+}
+
+/*PAGE
+ *
+ * _Objects_Copy_name_raw
+ *
+ * XXX
+ */
+
+void _Objects_Copy_name_raw(
+ void *source,
+ void *destination,
+ unsigned32 length
+)
+{
+ unsigned32 *source_p = (unsigned32 *) source;
+ unsigned32 *destination_p = (unsigned32 *) destination;
+ unsigned32 tmp_length = length / OBJECTS_NAME_ALIGNMENT;
+
+ while ( tmp_length-- )
+ *destination_p++ = *source_p++;
+}
+
+/*PAGE
+ *
+ * _Objects_Compare_name_string
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_string(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+)
+{
+ unsigned8 *name_1_p = (unsigned8 *) name_1;
+ unsigned8 *name_2_p = (unsigned8 *) name_2;
+ unsigned32 tmp_length = length;
+
+ do {
+ if ( *name_1_p++ != *name_2_p++ )
+ return FALSE;
+ if ( !tmp_length-- )
+ return FALSE;
+ } while ( *name_1_p );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _Objects_Compare_name_raw
+ *
+ * XXX
+ */
+
+boolean _Objects_Compare_name_raw(
+ void *name_1,
+ void *name_2,
+ unsigned32 length
+)
+{
+ unsigned32 *name_1_p = (unsigned32 *) name_1;
+ unsigned32 *name_2_p = (unsigned32 *) name_2;
+ unsigned32 tmp_length = length / OBJECTS_NAME_ALIGNMENT;
+
+ while ( tmp_length-- )
+ if ( *name_1_p++ != *name_2_p++ )
+ return FALSE;
+
+ return TRUE;
+}
+
+
+/*PAGE
+ *
+ * _Objects_Name_to_id
+ *
+ * These kernel routines search the object table(s) for the given
+ * object name and returns the associated object id.
+ *
+ * Input parameters:
+ * information - object information
+ * name - user defined object name
+ * node - node indentifier (0 indicates any node)
+ * id - address of return ID
+ *
+ * Output parameters:
+ * id - object id
+ * OBJECTS_SUCCESSFUL - if successful
+ * error code - if unsuccessful
+ */
+
+Objects_Name_to_id_errors _Objects_Name_to_id(
+ Objects_Information *information,
+ Objects_Name name,
+ unsigned32 node,
+ Objects_Id *id
+)
+{
+ boolean search_local_node;
+ Objects_Control **objects;
+ Objects_Control *the_object;
+ unsigned32 index;
+ unsigned32 name_length;
+ Objects_Name_comparators compare_them;
+
+ if ( name == 0 )
+ return OBJECTS_INVALID_NAME;
+
+ search_local_node = FALSE;
+
+ if ( information->maximum != 0 &&
+ (node == OBJECTS_SEARCH_ALL_NODES || node == OBJECTS_SEARCH_LOCAL_NODE ||
+ _Objects_Is_local_node( node ) ) )
+ search_local_node = TRUE;
+
+ if ( search_local_node ) {
+ objects = information->local_table;
+
+ name_length = information->name_length;
+
+ if ( information->is_string ) compare_them = _Objects_Compare_name_string;
+ else compare_them = _Objects_Compare_name_raw;
+
+ for ( index = 1; index <= information->maximum; index++ ) {
+
+ the_object = objects[ index ];
+
+ if ( !the_object || !the_object->name )
+ continue;
+
+ if ( (*compare_them)( name, the_object->name, name_length ) ) {
+ *id = the_object->id;
+ return OBJECTS_SUCCESSFUL;
+ }
+ }
+ }
+
+ 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 ) );
+}
+
+/*PAGE
+ *
+ * _Objects_Get
+ *
+ * This routine sets the object pointer for the given
+ * object id based on the given object information structure.
+ *
+ * Input parameters:
+ * information - pointer to entry in table for this class
+ * id - object id to search for
+ * location - address of where to store the location
+ *
+ * Output parameters:
+ * returns - address of object if local
+ * location - one of the following:
+ * OBJECTS_ERROR - invalid object ID
+ * OBJECTS_REMOTE - remote object
+ * OBJECTS_LOCAL - local object
+ */
+
+Objects_Control *_Objects_Get(
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ Objects_Control *the_object;
+ unsigned32 index;
+
+ index = id - information->minimum_id;
+
+ if ( information->maximum >= index ) {
+ _Thread_Disable_dispatch();
+ if ( (the_object = information->local_table[index+1]) != NULL ) {
+ *location = OBJECTS_LOCAL;
+ return( the_object );
+ }
+ _Thread_Enable_dispatch();
+ *location = OBJECTS_ERROR;
+ return( NULL );
+ }
+ *location = OBJECTS_ERROR;
+ _Objects_MP_Is_remote( information, id, location, &the_object );
+ return the_object;
+}
+
+
+/*PAGE
+ *
+ * _Objects_Get_next
+ *
+ * Like _Objects_Get, but considers the 'id' as a "hint" and
+ * finds next valid one after that point.
+ * Mostly used for monitor and debug traversal of an object.
+ *
+ * Input parameters:
+ * information - pointer to entry in table for this class
+ * id - object id to search for
+ * location - address of where to store the location
+ * next_id - address to store next id to try
+ *
+ * Output parameters:
+ * returns - address of object if local
+ * location - one of the following:
+ * OBJECTS_ERROR - invalid object ID
+ * OBJECTS_REMOTE - remote object
+ * OBJECTS_LOCAL - local object
+ * next_id - will contain a reasonable "next" id to continue traversal
+ *
+ * NOTE:
+ * assumes can add '1' to an id to get to next index.
+ */
+
+Objects_Control *
+_Objects_Get_next(
+ Objects_Information *information,
+ Objects_Id id,
+ Objects_Locations *location_p,
+ Objects_Id *next_id_p
+)
+{
+ Objects_Control *object;
+ Objects_Id next_id;
+
+ 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 (_Objects_Get_index(next_id) > information->maximum)
+ {
+ *location_p = OBJECTS_ERROR;
+ goto final;
+ }
+
+ /* try to grab one */
+ object = _Objects_Get(information, next_id, location_p);
+
+ next_id++;
+
+ } while (*location_p != OBJECTS_LOCAL);
+
+ *next_id_p = next_id;
+ return object;
+
+final:
+ *next_id_p = OBJECTS_ID_FINAL;
+ return 0;
+}
+
+/*PAGE
+ *
+ * _Objects_Get_information
+ *
+ * XXX
+ */
+
+Objects_Information *_Objects_Get_information(
+ Objects_Id id
+)
+{
+ Objects_Classes the_class;
+
+ the_class = _Objects_Get_class( id );
+
+ if ( !_Objects_Is_class_valid( the_class ) )
+ return NULL;
+
+ return _Objects_Information_table[ the_class ];
+}
+
diff --git a/cpukit/score/src/objectmp.c b/cpukit/score/src/objectmp.c
new file mode 100644
index 0000000000..db784abfa4
--- /dev/null
+++ b/cpukit/score/src/objectmp.c
@@ -0,0 +1,275 @@
+/*
+ * Multiprocessing Support for the Object Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/thread.h>
+
+/*PAGE
+ *
+ * _Objects_MP_Handler_initialization
+ *
+ */
+
+void _Objects_MP_Handler_initialization (
+ 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 );
+ return;
+ }
+
+ _Chain_Initialize(
+ &_Objects_MP_Inactive_global_objects,
+ _Workspace_Allocate_or_fatal_error(
+ maximum_global_objects * sizeof( Objects_MP_Control )
+ ),
+ maximum_global_objects,
+ sizeof( Objects_MP_Control )
+ );
+
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Open
+ *
+ */
+
+void _Objects_MP_Open (
+ Objects_Information *information,
+ Objects_MP_Control *the_global_object,
+ unsigned32 the_name, /* XXX -- wrong for variable */
+ Objects_Id the_id
+)
+{
+ the_global_object->Object.id = the_id;
+ the_global_object->name = the_name;
+
+ _Chain_Prepend(
+ &information->global_table[ _Objects_Get_node( the_id ) ],
+ &the_global_object->Object.Node
+ );
+
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Allocate_and_open
+ *
+ */
+
+boolean _Objects_MP_Allocate_and_open (
+ Objects_Information *information,
+ unsigned32 the_name, /* XXX -- wrong for variable */
+ Objects_Id the_id,
+ boolean is_fatal_error
+)
+{
+ Objects_MP_Control *the_global_object;
+
+ the_global_object = _Objects_MP_Allocate_global_object();
+ if ( _Objects_MP_Is_null_global_object( the_global_object ) ) {
+
+ if ( is_fatal_error == FALSE )
+ return FALSE;
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_GLOBAL_OBJECTS
+ );
+
+ }
+
+ _Objects_MP_Open( information, the_global_object, the_name, the_id );
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Close
+ *
+ */
+
+void _Objects_MP_Close (
+ Objects_Information *information,
+ Objects_Id the_id
+)
+{
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ Objects_MP_Control *the_object;
+
+ the_chain = &information->global_table[ _Objects_Get_node( the_id ) ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_object = (Objects_MP_Control *) the_node;
+
+ if ( _Objects_Are_ids_equal( the_object->Object.id, the_id ) ) {
+
+ _Chain_Extract( the_node );
+ _Objects_MP_Free_global_object( the_object );
+ return;
+ }
+
+ }
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_INVALID_GLOBAL_ID
+ );
+}
+
+/*PAGE
+ *
+ * _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,
+ Objects_Id *the_id
+)
+{
+ unsigned32 low_node;
+ unsigned32 high_node;
+ unsigned32 node_index;
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ Objects_MP_Control *the_object;
+ unsigned32 name_to_use = *(unsigned32 *)the_name; /* XXX variable */
+
+ if ( nodes_to_search > _Objects_Maximum_nodes )
+ return OBJECTS_INVALID_NODE;
+
+ if ( information->global_table == NULL )
+ return OBJECTS_INVALID_NAME;
+
+ if ( nodes_to_search == OBJECTS_SEARCH_ALL_NODES ||
+ nodes_to_search == OBJECTS_SEARCH_OTHER_NODES ) {
+ low_node = 1;
+ high_node = _Objects_Maximum_nodes;
+ } else {
+ low_node =
+ high_node = nodes_to_search;
+ }
+
+ _Thread_Disable_dispatch();
+
+ for ( node_index = low_node ; node_index <= high_node ; node_index++ ) {
+
+ /*
+ * NOTE: The local node was search (if necessary) by
+ * _Objects_Name_to_id before this was invoked.
+ */
+
+ if ( !_Objects_Is_local_node( node_index ) ) {
+ the_chain = &information->global_table[ node_index ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_object = (Objects_MP_Control *) the_node;
+
+ if ( the_object->name == name_to_use ) {
+ *the_id = the_object->Object.id;
+ _Thread_Enable_dispatch();
+ return OBJECTS_SUCCESSFUL;
+ }
+ }
+ }
+ }
+
+ _Thread_Enable_dispatch();
+ return OBJECTS_INVALID_NAME;
+}
+
+/*PAGE
+ *
+ * _Objects_MP_Is_remote
+ *
+ */
+
+void _Objects_MP_Is_remote (
+ Objects_Information *information,
+ Objects_Id the_id,
+ Objects_Locations *location,
+ Objects_Control **the_object
+)
+{
+ unsigned32 node;
+ Chain_Control *the_chain;
+ Chain_Node *the_node;
+ Objects_MP_Control *the_global_object;
+
+ node = _Objects_Get_node( the_id );
+
+ /*
+ * NOTE: The local node was search (if necessary) by
+ * _Objects_Name_to_id before this was invoked.
+ *
+ * The NODE field of an object id cannot be 0
+ * because 0 is an invalid node number.
+ */
+
+ if ( node == 0 ||
+ _Objects_Is_local_node( node ) ||
+ node > _Objects_Maximum_nodes ||
+ information->global_table == NULL ) {
+
+ *location = OBJECTS_ERROR;
+ *the_object = NULL;
+ return;
+ }
+
+ _Thread_Disable_dispatch();
+
+ the_chain = &information->global_table[ node ];
+
+ for ( the_node = the_chain->first ;
+ !_Chain_Is_tail( the_chain, the_node ) ;
+ the_node = the_node->next ) {
+
+ the_global_object = (Objects_MP_Control *) the_node;
+
+ if ( _Objects_Are_ids_equal( the_global_object->Object.id, the_id ) ) {
+ _Thread_Unnest_dispatch();
+ *location = OBJECTS_REMOTE;
+ *the_object = (Objects_Control *) the_global_object;
+ return;
+ }
+ }
+
+ _Thread_Enable_dispatch();
+ *location = OBJECTS_ERROR;
+ *the_object = NULL;
+
+}
diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c
new file mode 100644
index 0000000000..e4a3614a53
--- /dev/null
+++ b/cpukit/score/src/thread.c
@@ -0,0 +1,1395 @@
+/*
+ * Thread Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/context.h>
+#include <rtems/score/interr.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/states.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+
+/*PAGE
+ *
+ * _Thread_Handler_initialization
+ *
+ * This routine initializes all thread manager related data structures.
+ *
+ * Input parameters:
+ * ticks_per_timeslice - clock ticks per quantum
+ * maximum_proxies - number of proxies to initialize
+ *
+ * Output parameters: NONE
+ */
+
+char *_Thread_Idle_name = "IDLE";
+
+void _Thread_Handler_initialization(
+ unsigned32 ticks_per_timeslice,
+ unsigned32 maximum_extensions,
+ unsigned32 maximum_proxies
+)
+{
+ unsigned32 index;
+
+ /*
+ * BOTH stacks hooks must be set or both must be NULL.
+ * Do not allow mixture.
+ */
+
+ if ( !( ( _CPU_Table.stack_allocate_hook == 0 )
+ == ( _CPU_Table.stack_free_hook == 0 ) ) )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_BAD_STACK_HOOK
+ );
+
+ _Context_Switch_necessary = FALSE;
+ _Thread_Executing = NULL;
+ _Thread_Heir = NULL;
+ _Thread_Allocated_fp = NULL;
+
+ _Thread_Do_post_task_switch_extension = 0;
+
+ _Thread_Maximum_extensions = maximum_extensions;
+
+ _Thread_Ticks_per_timeslice = ticks_per_timeslice;
+
+ _Thread_Ready_chain = (Chain_Control *) _Workspace_Allocate_or_fatal_error(
+ (PRIORITY_MAXIMUM + 1) * sizeof(Chain_Control)
+ );
+
+ for ( index=0; index <= PRIORITY_MAXIMUM ; index++ )
+ _Chain_Initialize_empty( &_Thread_Ready_chain[ index ] );
+
+ _Thread_MP_Handler_initialization( maximum_proxies );
+
+ /*
+ * Initialize this class of objects.
+ */
+
+ _Objects_Initialize_information(
+ &_Thread_Internal_information,
+ OBJECTS_INTERNAL_THREADS,
+ FALSE,
+ ( _System_state_Is_multiprocessing ) ? 2 : 1,
+ sizeof( Thread_Control ),
+ TRUE,
+ 8,
+ TRUE
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Create_idle
+ */
+
+void _Thread_Create_idle( void )
+{
+ void *idle;
+
+ /*
+ * The entire workspace is zeroed during its initialization. Thus, all
+ * fields not explicitly assigned were explicitly zeroed by
+ * _Workspace_Initialization.
+ */
+
+ _Thread_Idle = _Thread_Internal_allocate();
+
+ /*
+ * Initialize the IDLE task.
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == TRUE)
+ idle = (void *) _CPU_Thread_Idle_body;
+#else
+ idle = (void *) _Thread_Idle_body;
+#endif
+
+ if ( _CPU_Table.idle_task )
+ idle = _CPU_Table.idle_task;
+
+ _Thread_Initialize(
+ &_Thread_Internal_information,
+ _Thread_Idle,
+ NULL, /* allocate the stack */
+ THREAD_IDLE_STACK_SIZE,
+ CPU_IDLE_TASK_IS_FP,
+ PRIORITY_MAXIMUM,
+ TRUE, /* preemptable */
+ THREAD_CPU_BUDGET_ALGORITHM_NONE,
+ NULL, /* no budget algorithm callout */
+ 0, /* all interrupts enabled */
+ _Thread_Idle_name
+ );
+
+ /*
+ * WARNING!!! This is necessary to "kick" start the system and
+ * MUST be done before _Thread_Start is invoked.
+ */
+
+ _Thread_Heir =
+ _Thread_Executing = _Thread_Idle;
+
+ _Thread_Start(
+ _Thread_Idle,
+ THREAD_START_NUMERIC,
+ idle,
+ NULL,
+ 0
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Start_multitasking
+ *
+ * This kernel routine readies the requested thread, the thread chain
+ * is adjusted. A new heir thread may be selected.
+ *
+ * Input parameters:
+ * system_thread - pointer to system initialization thread control block
+ * idle_thread - pointer to idle thread control block
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine uses the "blocking" heir selection mechanism.
+ * This insures the correct heir after a thread restart.
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Start_multitasking( void )
+{
+ /*
+ * The system is now multitasking and completely initialized.
+ * This system thread now either "goes away" in a single processor
+ * system or "turns into" the server thread in an MP system.
+ */
+
+ _System_state_Set( SYSTEM_STATE_UP );
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Executing = _Thread_Heir;
+
+ /*
+ * Get the init task(s) running.
+ *
+ * Note: Thread_Dispatch() is normally used to dispatch threads. As
+ * part of its work, Thread_Dispatch() restores floating point
+ * state for the heir task.
+ *
+ * This code avoids Thread_Dispatch(), and so we have to restore
+ * (actually initialize) the floating point state "by hand".
+ *
+ * Ignore the CPU_USE_DEFERRED_FP_SWITCH because we must always
+ * switch in the first thread if it is FP.
+ */
+
+
+#if ( CPU_HARDWARE_FP == TRUE )
+ /*
+ * don't need to worry about saving BSP's floating point state
+ */
+
+ if ( _Thread_Heir->fp_context != NULL )
+ _Context_Restore_fp( &_Thread_Heir->fp_context );
+#endif
+
+ _Context_Switch( &_Thread_BSP_context, &_Thread_Heir->Registers );
+}
+
+/*PAGE
+ *
+ * _Thread_Dispatch
+ *
+ * This kernel routine determines if a dispatch is needed, and if so
+ * dispatches to the heir thread. Once the heir is running an attempt
+ * is made to dispatch any ASRs.
+ *
+ * ALTERNATE ENTRY POINTS:
+ * void _Thread_Enable_dispatch();
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * dispatch thread
+ * no dispatch thread
+ */
+
+#if ( CPU_INLINE_ENABLE_DISPATCH == FALSE )
+void _Thread_Enable_dispatch( void )
+{
+ if ( --_Thread_Dispatch_disable_level )
+ return;
+ _Thread_Dispatch();
+}
+#endif
+
+void _Thread_Dispatch( void )
+{
+ Thread_Control *executing;
+ Thread_Control *heir;
+ ISR_Level level;
+
+ executing = _Thread_Executing;
+ _ISR_Disable( level );
+ while ( _Context_Switch_necessary == TRUE ) {
+ heir = _Thread_Heir;
+ _Thread_Dispatch_disable_level = 1;
+ _Context_Switch_necessary = FALSE;
+ _Thread_Executing = heir;
+ _ISR_Enable( level );
+
+ heir->ticks_executed++;
+
+ _User_extensions_Thread_switch( executing, heir );
+
+ if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE )
+ heir->cpu_time_budget = _Thread_Ticks_per_timeslice;
+
+ /*
+ * If the CPU has hardware floating point, then we must address saving
+ * and restoring it as part of the context switch.
+ *
+ * The second conditional compilation section selects the algorithm used
+ * to context switch between floating point tasks. The deferred algorithm
+ * can be significantly better in a system with few floating point tasks
+ * because it reduces the total number of save and restore FP context
+ * operations. However, this algorithm can not be used on all CPUs due
+ * to unpredictable use of FP registers by some compilers for integer
+ * operations.
+ */
+
+#if ( CPU_HARDWARE_FP == TRUE )
+#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
+ if ( (heir->fp_context != NULL) && !_Thread_Is_allocated_fp( heir ) ) {
+ if ( _Thread_Allocated_fp != NULL )
+ _Context_Save_fp( &_Thread_Allocated_fp->fp_context );
+ _Context_Restore_fp( &heir->fp_context );
+ _Thread_Allocated_fp = heir;
+ }
+#else
+ if ( executing->fp_context != NULL )
+ _Context_Save_fp( &executing->fp_context );
+
+ if ( heir->fp_context != NULL )
+ _Context_Restore_fp( &heir->fp_context );
+#endif
+#endif
+
+ _Context_Switch( &executing->Registers, &heir->Registers );
+
+ executing = _Thread_Executing;
+
+ _ISR_Disable( level );
+ }
+
+ _Thread_Dispatch_disable_level = 0;
+
+ _ISR_Enable( level );
+
+ if ( _Thread_Do_post_task_switch_extension ||
+ executing->do_post_task_switch_extension ) {
+ executing->do_post_task_switch_extension = FALSE;
+ _API_extensions_Run_postswitch();
+ }
+
+}
+
+/*PAGE
+ *
+ * _Thread_Stack_Allocate
+ *
+ * Allocate the requested stack space for the thread.
+ * return the actual size allocated after any adjustment
+ * or return zero if the allocation failed.
+ * Set the Start.stack field to the address of the stack
+ */
+
+static unsigned32 _Thread_Stack_Allocate(
+ Thread_Control *the_thread,
+ unsigned32 stack_size)
+{
+ void *stack_addr = 0;
+
+ if ( !_Stack_Is_enough( stack_size ) )
+ stack_size = STACK_MINIMUM_SIZE;
+
+ /*
+ * Call ONLY the CPU table stack allocate hook, _or_ the
+ * the RTEMS workspace allocate. This is so the stack free
+ * routine can call the correct deallocation routine.
+ */
+
+ if ( _CPU_Table.stack_allocate_hook )
+ {
+ stack_addr = (*_CPU_Table.stack_allocate_hook)( stack_size );
+ } else {
+
+ /*
+ * First pad the requested size so we allocate enough memory
+ * so the context initialization can align it properly. The address
+ * returned the workspace allocate must be directly stored in the
+ * stack control block because it is later used in the free sequence.
+ *
+ * Thus it is the responsibility of the CPU dependent code to
+ * get and keep the stack adjust factor, the stack alignment, and
+ * the context initialization sequence in sync.
+ */
+
+ stack_size = _Stack_Adjust_size( stack_size );
+ stack_addr = _Workspace_Allocate( stack_size );
+ }
+
+ if ( !stack_addr )
+ stack_size = 0;
+
+ the_thread->Start.stack = stack_addr;
+
+ return stack_size;
+}
+
+/*
+ * _Thread_Stack_Free
+ *
+ * Deallocate the Thread's stack.
+ */
+
+static void _Thread_Stack_Free(
+ Thread_Control *the_thread
+)
+{
+ /*
+ * If the API provided the stack space, then don't free it.
+ */
+
+ if ( !the_thread->Start.core_allocated_stack )
+ return;
+
+ /*
+ * Call ONLY the CPU table stack free hook, or the
+ * the RTEMS workspace free. This is so the free
+ * routine properly matches the allocation of the stack.
+ */
+
+ if ( _CPU_Table.stack_free_hook )
+ (*_CPU_Table.stack_free_hook)( the_thread->Start.Initial_stack.area );
+ else
+ _Workspace_Free( the_thread->Start.Initial_stack.area );
+}
+
+/*PAGE
+ *
+ * _Thread_Initialize
+ *
+ * XXX
+ */
+
+boolean _Thread_Initialize(
+ Objects_Information *information,
+ Thread_Control *the_thread,
+ void *stack_area,
+ unsigned32 stack_size,
+ boolean is_fp,
+ Priority_Control priority,
+ boolean is_preemptible,
+ Thread_CPU_budget_algorithms budget_algorithm,
+ Thread_CPU_budget_algorithm_callout budget_callout,
+ unsigned32 isr_level,
+ Objects_Name name
+)
+{
+ unsigned32 actual_stack_size = 0;
+ void *stack = NULL;
+ void *fp_area;
+ void *extensions_area;
+
+ /*
+ * Allocate and Initialize the stack for this thread.
+ */
+
+
+ if ( !stack ) {
+ if ( !_Stack_Is_enough( stack_size ) )
+ actual_stack_size = STACK_MINIMUM_SIZE;
+ else
+ actual_stack_size = stack_size;
+
+ actual_stack_size = _Stack_Adjust_size( actual_stack_size );
+ stack = stack_area;
+
+ actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
+
+ if ( !actual_stack_size )
+ return FALSE; /* stack allocation failed */
+
+ stack = the_thread->Start.stack;
+
+ the_thread->Start.core_allocated_stack = TRUE;
+ } else {
+ stack = stack_area;
+ actual_stack_size = stack_size;
+ the_thread->Start.core_allocated_stack = FALSE;
+ }
+
+ _Stack_Initialize(
+ &the_thread->Start.Initial_stack,
+ stack,
+ actual_stack_size
+ );
+
+ /*
+ * Allocate the floating point area for this thread
+ */
+
+ if ( is_fp ) {
+
+ fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE );
+ if ( !fp_area ) {
+ _Thread_Stack_Free( the_thread );
+ return FALSE;
+ }
+ fp_area = _Context_Fp_start( fp_area, 0 );
+
+ } else
+ fp_area = NULL;
+
+ the_thread->fp_context = fp_area;
+ the_thread->Start.fp_context = fp_area;
+
+ /*
+ * Allocate the extensions area for this thread
+ */
+
+ 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 );
+
+ _Thread_Stack_Free( the_thread );
+
+ return FALSE;
+ }
+ } else
+ extensions_area = NULL;
+
+ the_thread->extensions = (void **) extensions_area;
+
+ /*
+ * General initialization
+ */
+
+ the_thread->Start.is_preemptible = is_preemptible;
+ the_thread->Start.budget_algorithm = budget_algorithm;
+ the_thread->Start.budget_callout = budget_callout;
+ the_thread->Start.isr_level = isr_level;
+
+ the_thread->current_state = STATES_DORMANT;
+ the_thread->resource_count = 0;
+ the_thread->real_priority = priority;
+ the_thread->Start.initial_priority = priority;
+ the_thread->ticks_executed = 0;
+
+ _Thread_Set_priority( the_thread, priority );
+
+ /*
+ * Open the object
+ */
+
+ _Objects_Open( information, &the_thread->Object, name );
+
+ /*
+ * Invoke create extensions
+ */
+
+ if ( !_User_extensions_Thread_create( the_thread ) ) {
+
+ if ( extensions_area )
+ (void) _Workspace_Free( extensions_area );
+
+ if ( fp_area )
+ (void) _Workspace_Free( fp_area );
+
+ _Thread_Stack_Free( the_thread );
+
+ return FALSE;
+ }
+
+ return TRUE;
+
+}
+
+/*
+ * _Thread_Start
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Thread_Start(
+ Thread_Control *the_thread,
+ Thread_Start_types the_prototype,
+ void *entry_point,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+)
+{
+ if ( _States_Is_dormant( the_thread->current_state ) ) {
+
+ the_thread->Start.entry_point = (Thread_Entry) entry_point;
+
+ the_thread->Start.prototype = the_prototype;
+ the_thread->Start.pointer_argument = pointer_argument;
+ the_thread->Start.numeric_argument = numeric_argument;
+
+ _Thread_Load_environment( the_thread );
+
+ _Thread_Ready( the_thread );
+
+ _User_extensions_Thread_start( the_thread );
+
+ return TRUE;
+ }
+
+ return FALSE;
+
+}
+
+/*
+ * _Thread_Restart
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+boolean _Thread_Restart(
+ Thread_Control *the_thread,
+ void *pointer_argument,
+ unsigned32 numeric_argument
+)
+{
+ if ( !_States_Is_dormant( the_thread->current_state ) ) {
+
+ _Thread_Set_transient( the_thread );
+ the_thread->resource_count = 0;
+ the_thread->is_preemptible = the_thread->Start.is_preemptible;
+ the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
+ the_thread->budget_callout = the_thread->Start.budget_callout;
+
+ the_thread->Start.pointer_argument = pointer_argument;
+ the_thread->Start.numeric_argument = numeric_argument;
+
+ if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
+
+ if ( _Watchdog_Is_active( &the_thread->Timer ) )
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ }
+
+ if ( the_thread->current_priority != the_thread->Start.initial_priority ) {
+ the_thread->real_priority = the_thread->Start.initial_priority;
+ _Thread_Set_priority( the_thread, the_thread->Start.initial_priority );
+ }
+
+ _Thread_Load_environment( the_thread );
+
+ _Thread_Ready( the_thread );
+
+ _User_extensions_Thread_restart( the_thread );
+
+ if ( _Thread_Is_executing ( the_thread ) )
+ _Thread_Restart_self();
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*
+ * _Thread_Close
+ *
+ * DESCRIPTION:
+ *
+ * XXX
+ */
+
+void _Thread_Close(
+ Objects_Information *information,
+ Thread_Control *the_thread
+)
+{
+ _Objects_Close( information, &the_thread->Object );
+
+ _Thread_Set_state( the_thread, STATES_TRANSIENT );
+
+ if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) {
+
+ if ( _Watchdog_Is_active( &the_thread->Timer ) )
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ }
+
+ _User_extensions_Thread_delete( the_thread );
+
+#if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE )
+ if ( _Thread_Is_allocated_fp( the_thread ) )
+ _Thread_Deallocate_fp();
+#endif
+ the_thread->fp_context = NULL;
+
+ if ( the_thread->Start.fp_context )
+ (void) _Workspace_Free( the_thread->Start.fp_context );
+
+ _Thread_Stack_Free( the_thread );
+
+ if ( the_thread->extensions )
+ (void) _Workspace_Free( the_thread->extensions );
+
+ the_thread->Start.stack = NULL;
+ the_thread->extensions = NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_Ready
+ *
+ * This kernel routine readies the requested thread, the thread chain
+ * is adjusted. A new heir thread may be selected.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: This routine uses the "blocking" heir selection mechanism.
+ * This insures the correct heir after a thread restart.
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Ready(
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ Thread_Control *heir;
+
+ _ISR_Disable( level );
+
+ the_thread->current_state = STATES_READY;
+
+ _Priority_Add_to_bit_map( &the_thread->Priority_map );
+
+ _Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
+
+ _ISR_Flash( level );
+
+ _Thread_Calculate_heir();
+
+ heir = _Thread_Heir;
+
+ if ( !_Thread_Is_executing( heir ) && _Thread_Executing->is_preemptible )
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Clear_state
+ *
+ * This kernel routine clears the appropriate states in the
+ * requested thread. The thread ready chain is adjusted if
+ * necessary and the Heir thread is set accordingly.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ * state - state set to clear
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * priority map
+ * select heir
+ */
+
+
+void _Thread_Clear_state(
+ Thread_Control *the_thread,
+ States_Control state
+)
+{
+ ISR_Level level;
+ States_Control current_state;
+
+ _ISR_Disable( level );
+ current_state = the_thread->current_state;
+
+ if ( current_state & state ) {
+ current_state =
+ the_thread->current_state = _States_Clear( state, current_state );
+
+ if ( _States_Is_ready( current_state ) ) {
+
+ _Priority_Add_to_bit_map( &the_thread->Priority_map );
+
+ _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node);
+
+ _ISR_Flash( level );
+
+ if ( the_thread->current_priority < _Thread_Heir->current_priority ) {
+ _Thread_Heir = the_thread;
+ if ( _Thread_Executing->is_preemptible ||
+ the_thread->current_priority == 0 )
+ _Context_Switch_necessary = TRUE;
+ }
+ }
+ }
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Set_state
+ *
+ * This kernel routine sets the requested state in the THREAD. The
+ * THREAD chain is adjusted if necessary.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ * state - state to be set
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select map
+ */
+
+void _Thread_Set_state(
+ Thread_Control *the_thread,
+ States_Control state
+)
+{
+ ISR_Level level;
+ Chain_Control *ready;
+
+ ready = the_thread->ready;
+ _ISR_Disable( level );
+ if ( !_States_Is_ready( the_thread->current_state ) ) {
+ the_thread->current_state =
+ _States_Set( state, the_thread->current_state );
+ _ISR_Enable( level );
+ return;
+ }
+
+ the_thread->current_state = state;
+
+ if ( _Chain_Has_only_one_node( ready ) ) {
+
+ _Chain_Initialize_empty( ready );
+ _Priority_Remove_from_bit_map( &the_thread->Priority_map );
+
+ } else
+ _Chain_Extract_unprotected( &the_thread->Object.Node );
+
+ _ISR_Flash( level );
+
+ if ( _Thread_Is_heir( the_thread ) )
+ _Thread_Calculate_heir();
+
+ if ( _Thread_Is_executing( the_thread ) )
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Set_transient
+ *
+ * This kernel routine places the requested thread in the transient state
+ * which will remove it from the ready queue, if necessary. No
+ * rescheduling is necessary because it is assumed that the transient
+ * state will be cleared before dispatching is enabled.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Thread_Set_transient(
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ unsigned32 old_state;
+ Chain_Control *ready;
+
+ ready = the_thread->ready;
+ _ISR_Disable( level );
+
+ old_state = the_thread->current_state;
+ the_thread->current_state = _States_Set( STATES_TRANSIENT, old_state );
+
+ if ( _States_Is_ready( old_state ) ) {
+ if ( _Chain_Has_only_one_node( ready ) ) {
+
+ _Chain_Initialize_empty( ready );
+ _Priority_Remove_from_bit_map( &the_thread->Priority_map );
+
+ } else
+ _Chain_Extract_unprotected( &the_thread->Object.Node );
+ }
+
+ _ISR_Enable( level );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Reset_timeslice
+ *
+ * This routine will remove the running thread from the ready chain
+ * and place it immediately at the rear of this chain and then the
+ * timeslice counter is reset. The heir THREAD will be updated if
+ * the running is also the currently the heir.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Reset_timeslice( void )
+{
+ ISR_Level level;
+ Thread_Control *executing;
+ Chain_Control *ready;
+
+ executing = _Thread_Executing;
+ ready = executing->ready;
+ _ISR_Disable( level );
+ if ( _Chain_Has_only_one_node( ready ) ) {
+ _ISR_Enable( level );
+ return;
+ }
+ _Chain_Extract_unprotected( &executing->Object.Node );
+ _Chain_Append_unprotected( ready, &executing->Object.Node );
+
+ _ISR_Flash( level );
+
+ if ( _Thread_Is_heir( executing ) )
+ _Thread_Heir = (Thread_Control *) ready->first;
+
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Tickle_timeslice
+ *
+ * This scheduler routine determines if timeslicing is enabled
+ * for the currently executing thread and, if so, updates the
+ * timeslice count and checks for timeslice expiration.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Tickle_timeslice( void )
+{
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ /*
+ * Increment the number of ticks this thread has been executing
+ */
+
+ executing->ticks_executed++;
+
+ /*
+ * If the thread is not preemptible or is not ready, then
+ * just return.
+ */
+
+ if ( !executing->is_preemptible )
+ return;
+
+ if ( !_States_Is_ready( executing->current_state ) )
+ return;
+
+ /*
+ * The cpu budget algorithm determines what happens next.
+ */
+
+ switch ( executing->budget_algorithm ) {
+ case THREAD_CPU_BUDGET_ALGORITHM_NONE:
+ break;
+
+ case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE:
+ case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE:
+ if ( --executing->cpu_time_budget == 0 ) {
+ _Thread_Reset_timeslice();
+ executing->cpu_time_budget = _Thread_Ticks_per_timeslice;
+ }
+ break;
+
+ case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT:
+ if ( --executing->cpu_time_budget == 0 )
+ (*executing->budget_callout)( executing );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_Yield_processor
+ *
+ * This kernel routine will remove the running THREAD from the ready chain
+ * and place it immediatly at the rear of this chain. Reset timeslice
+ * and yield the processor functions both use this routine, therefore if
+ * reset is TRUE and this is the only thread on the chain then the
+ * timeslice counter is reset. The heir THREAD will be updated if the
+ * running is also the currently the heir.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Yield_processor( void )
+{
+ ISR_Level level;
+ Thread_Control *executing;
+ Chain_Control *ready;
+
+ executing = _Thread_Executing;
+ ready = executing->ready;
+ _ISR_Disable( level );
+ if ( !_Chain_Has_only_one_node( ready ) ) {
+ _Chain_Extract_unprotected( &executing->Object.Node );
+ _Chain_Append_unprotected( ready, &executing->Object.Node );
+
+ _ISR_Flash( level );
+
+ if ( _Thread_Is_heir( executing ) )
+ _Thread_Heir = (Thread_Control *) ready->first;
+ _Context_Switch_necessary = TRUE;
+ }
+ else if ( !_Thread_Is_heir( executing ) )
+ _Context_Switch_necessary = TRUE;
+
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Load_environment
+ *
+ * Load starting environment for another thread from its start area in the
+ * thread. Only called from t_restart and t_start.
+ *
+ * Input parameters:
+ * the_thread - thread control block pointer
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Load_environment(
+ Thread_Control *the_thread
+)
+{
+ boolean is_fp = FALSE;
+
+ if ( the_thread->Start.fp_context ) {
+ the_thread->fp_context = the_thread->Start.fp_context;
+ _Context_Initialize_fp( &the_thread->fp_context );
+ is_fp = TRUE;
+ }
+
+ the_thread->do_post_task_switch_extension = FALSE;
+ the_thread->is_preemptible = the_thread->Start.is_preemptible;
+ the_thread->budget_algorithm = the_thread->Start.budget_algorithm;
+ the_thread->budget_callout = the_thread->Start.budget_callout;
+
+ _Context_Initialize(
+ &the_thread->Registers,
+ the_thread->Start.Initial_stack.area,
+ the_thread->Start.Initial_stack.size,
+ the_thread->Start.isr_level,
+ _Thread_Handler,
+ is_fp
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_Handler
+ *
+ * This routine is the "primal" entry point for all threads.
+ * _Context_Initialize() dummies up the thread's initial context
+ * to cause the first Context_Switch() to jump to _Thread_Handler().
+ *
+ * This routine is the default thread exitted error handler. It is
+ * returned to when a thread exits. The configured fatal error handler
+ * is invoked to process the exit.
+ *
+ * NOTE:
+ *
+ * On entry, it is assumed all interrupts are blocked and that this
+ * routine needs to set the initial isr level. This may or may not
+ * actually be needed by the context switch routine and as a result
+ * interrupts may already be at there proper level. Either way,
+ * setting the initial isr level properly here is safe.
+ *
+ * Currently this is only really needed for the posix port,
+ * ref: _Context_Switch in unix/cpu.c
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Handler( void )
+{
+ ISR_Level level;
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ /*
+ * have to put level into a register for those cpu's that use
+ * inline asm here
+ */
+
+ level = executing->Start.isr_level;
+ _ISR_Set_level(level);
+
+ /*
+ * Take care that 'begin' extensions get to complete before
+ * 'switch' extensions can run. This means must keep dispatch
+ * disabled until all 'begin' extensions complete.
+ */
+
+ _User_extensions_Thread_begin( executing );
+
+ /*
+ * At this point, the dispatch disable level BETTER be 1.
+ */
+
+ _Thread_Enable_dispatch();
+
+ switch ( executing->Start.prototype ) {
+ case THREAD_START_NUMERIC:
+ (*(Thread_Entry_numeric) executing->Start.entry_point)(
+ executing->Start.numeric_argument
+ );
+ break;
+ case THREAD_START_POINTER:
+ (*(Thread_Entry_pointer) executing->Start.entry_point)(
+ executing->Start.pointer_argument
+ );
+ break;
+ case THREAD_START_BOTH_POINTER_FIRST:
+ (*(Thread_Entry_both_pointer_first) executing->Start.entry_point)(
+ executing->Start.pointer_argument,
+ executing->Start.numeric_argument
+ );
+ break;
+ case THREAD_START_BOTH_NUMERIC_FIRST:
+ (*(Thread_Entry_both_numeric_first) executing->Start.entry_point)(
+ executing->Start.numeric_argument,
+ executing->Start.pointer_argument
+ );
+ break;
+ }
+
+ _User_extensions_Thread_exitted( executing );
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_THREAD_EXITTED
+ );
+}
+
+/*PAGE
+ *
+ * _Thread_Delay_ended
+ *
+ * This routine processes a thread whose delay period has ended.
+ * It is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_Delay_ended(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Thread_Control *the_thread;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+ _Thread_Unblock( the_thread );
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_Change_priority
+ *
+ * This kernel routine changes the priority of the thread. The
+ * thread chain is adjusted if necessary.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread control block
+ * new_priority - ultimate priority
+ * prepend_it - TRUE if the thread should be prepended to the chain
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * ready chain
+ * select heir
+ */
+
+void _Thread_Change_priority(
+ Thread_Control *the_thread,
+ Priority_Control new_priority,
+ boolean prepend_it
+)
+{
+ ISR_Level level;
+ /* boolean do_prepend = FALSE; */
+
+ /*
+ * If this is a case where prepending the task to its priority is
+ * potentially desired, then we need to consider whether to do it.
+ * This usually occurs when a task lowers its priority implcitly as
+ * the result of losing inherited priority. Normal explicit priority
+ * change calls (e.g. rtems_task_set_priority) should always do an
+ * append not a prepend.
+ */
+
+ /*
+ * Techically, the prepend should conditional on the thread lowering
+ * its priority but that does allow cxd2004 of the acvc 2.0.1 to
+ * pass with rtems 4.0.0. This should change when gnat redoes its
+ * priority scheme.
+ */
+/*
+ if ( prepend_it &&
+ _Thread_Is_executing( the_thread ) &&
+ new_priority >= the_thread->current_priority )
+ prepend_it = TRUE;
+*/
+
+ _Thread_Set_transient( the_thread );
+
+ if ( the_thread->current_priority != new_priority )
+ _Thread_Set_priority( the_thread, new_priority );
+
+ _ISR_Disable( level );
+
+ the_thread->current_state =
+ _States_Clear( STATES_TRANSIENT, the_thread->current_state );
+
+ if ( ! _States_Is_ready( the_thread->current_state ) ) {
+ _ISR_Enable( level );
+ return;
+ }
+
+ _Priority_Add_to_bit_map( &the_thread->Priority_map );
+ if ( prepend_it )
+ _Chain_Prepend_unprotected( the_thread->ready, &the_thread->Object.Node );
+ else
+ _Chain_Append_unprotected( the_thread->ready, &the_thread->Object.Node );
+
+ _ISR_Flash( level );
+
+ _Thread_Calculate_heir();
+
+ if ( !_Thread_Is_executing_also_the_heir() &&
+ _Thread_Executing->is_preemptible )
+ _Context_Switch_necessary = TRUE;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_Set_priority
+ *
+ * This directive enables and disables several modes of
+ * execution for the requesting thread.
+ *
+ * Input parameters:
+ * the_thread - pointer to thread priority
+ * new_priority - new priority
+ *
+ * Output: NONE
+ */
+
+void _Thread_Set_priority(
+ Thread_Control *the_thread,
+ Priority_Control new_priority
+)
+{
+ the_thread->current_priority = new_priority;
+ the_thread->ready = &_Thread_Ready_chain[ new_priority ];
+
+ _Priority_Initialize_information( &the_thread->Priority_map, new_priority );
+}
+
+/*PAGE
+ *
+ * _Thread_Evaluate_mode
+ *
+ * XXX
+ */
+
+boolean _Thread_Evaluate_mode( void )
+{
+ Thread_Control *executing;
+
+ executing = _Thread_Executing;
+
+ if ( !_States_Is_ready( executing->current_state ) ||
+ ( !_Thread_Is_heir( executing ) && executing->is_preemptible ) ) {
+ _Context_Switch_necessary = TRUE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*PAGE
+ *
+ * _Thread_Get
+ *
+ * NOTE: If we are not using static inlines, this must be a real
+ * subroutine call.
+ *
+ * NOTE: XXX... This routine may be able to be optimized.
+ */
+
+#ifndef USE_INLINES
+
+Thread_Control *_Thread_Get (
+ Objects_Id id,
+ Objects_Locations *location
+)
+{
+ Objects_Classes the_class;
+ Objects_Information *information;
+
+ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) {
+ _Thread_Disable_dispatch();
+ *location = OBJECTS_LOCAL;
+ return( _Thread_Executing );
+ }
+
+ the_class = _Objects_Get_class( id );
+
+ if ( the_class > OBJECTS_CLASSES_LAST ) {
+ *location = OBJECTS_ERROR;
+ return (Thread_Control *) 0;
+ }
+
+ information = _Objects_Information_table[ the_class ];
+
+ if ( !information || !information->is_thread ) {
+ *location = OBJECTS_ERROR;
+ return (Thread_Control *) 0;
+ }
+
+ return (Thread_Control *) _Objects_Get( information, id, location );
+}
+
+#endif
+
+/*PAGE
+ *
+ * _Thread_Idle_body
+ *
+ * This kernel routine is the idle thread. The idle thread runs any time
+ * no other thread is ready to run. This thread loops forever with
+ * interrupts enabled.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ */
+
+#if (CPU_PROVIDES_IDLE_THREAD_BODY == FALSE)
+Thread _Thread_Idle_body(
+ unsigned32 ignored
+)
+{
+ for( ; ; ) ;
+}
+#endif
diff --git a/cpukit/score/src/threadmp.c b/cpukit/score/src/threadmp.c
new file mode 100644
index 0000000000..c34d89d7bc
--- /dev/null
+++ b/cpukit/score/src/threadmp.c
@@ -0,0 +1,164 @@
+/*
+ * Multiprocessing Support for the Thread Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/priority.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/isr.h>
+
+/*PAGE
+ *
+ * _Thread_MP_Handler_initialization
+ *
+ */
+
+void _Thread_MP_Handler_initialization (
+ unsigned32 maximum_proxies
+)
+{
+
+ _Chain_Initialize_empty( &_Thread_MP_Active_proxies );
+
+ if ( maximum_proxies == 0 ) {
+ _Chain_Initialize_empty( &_Thread_MP_Inactive_proxies );
+ return;
+ }
+
+
+ _Chain_Initialize(
+ &_Thread_MP_Inactive_proxies,
+ _Workspace_Allocate_or_fatal_error(
+ maximum_proxies * sizeof( Thread_Proxy_control )
+ ),
+ maximum_proxies,
+ sizeof( Thread_Proxy_control )
+ );
+
+}
+
+/*PAGE
+ *
+ * _Thread_MP_Allocate_proxy
+ *
+ */
+
+Thread_Control *_Thread_MP_Allocate_proxy (
+ States_Control the_state
+)
+{
+ Thread_Control *the_thread;
+ Thread_Proxy_control *the_proxy;
+
+ the_thread = (Thread_Control *)_Chain_Get( &_Thread_MP_Inactive_proxies );
+
+ if ( !_Thread_Is_null( the_thread ) ) {
+
+ the_proxy = (Thread_Proxy_control *) the_thread;
+
+ _Thread_Executing->Wait.return_code = THREAD_STATUS_PROXY_BLOCKING;
+
+ the_proxy->receive_packet = _Thread_MP_Receive->receive_packet;
+
+ the_proxy->Object.id = _Thread_MP_Receive->receive_packet->source_tid;
+
+ the_proxy->current_priority =
+ _Thread_MP_Receive->receive_packet->source_priority;
+
+ the_proxy->current_state = _States_Set( STATES_DORMANT, the_state );
+
+ the_proxy->Wait = _Thread_Executing->Wait;
+
+ _Chain_Append( &_Thread_MP_Active_proxies, &the_proxy->Active );
+
+ return the_thread;
+ }
+
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_OUT_OF_PROXIES
+ );
+
+ /*
+ * NOTE: The following return insures that the compiler will
+ * think that all paths return a value.
+ */
+
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_MP_Find_proxy
+ *
+ */
+
+/*
+ * The following macro provides the offset of the Active element
+ * in the Thread_Proxy_control structure. This is the logical
+ * equivalent of the POSITION attribute in Ada.
+ */
+
+#define _Thread_MP_Proxy_Active_offset \
+ ((unsigned32)&(((Thread_Proxy_control *)0))->Active)
+
+Thread_Control *_Thread_MP_Find_proxy (
+ Objects_Id the_id
+)
+{
+
+ Chain_Node *proxy_node;
+ Thread_Control *the_thread;
+ ISR_Level level;
+
+restart:
+
+ _ISR_Disable( level );
+
+ for ( proxy_node = _Thread_MP_Active_proxies.first;
+ !_Chain_Is_tail( &_Thread_MP_Active_proxies, proxy_node ) ;
+ ) {
+
+ the_thread = (Thread_Control *) _Addresses_Subtract_offset(
+ proxy_node,
+ _Thread_MP_Proxy_Active_offset
+ );
+
+ if ( _Objects_Are_ids_equal( the_thread->Object.id, the_id ) ) {
+ _ISR_Enable( level );
+ return the_thread;
+ }
+
+ _ISR_Flash( level );
+
+ proxy_node = proxy_node->next;
+
+ /*
+ * A proxy which is only dormant is not in a blocking state.
+ * Therefore, we are looking at proxy which has been moved from
+ * active to inactive chain (by an ISR) and need to restart
+ * the search.
+ */
+
+ if ( _States_Is_only_dormant( the_thread->current_state ) ) {
+ _ISR_Enable( level );
+ goto restart;
+ }
+ }
+
+ _ISR_Enable( level );
+ return NULL;
+}
diff --git a/cpukit/score/src/threadq.c b/cpukit/score/src/threadq.c
new file mode 100644
index 0000000000..b5039d719b
--- /dev/null
+++ b/cpukit/score/src/threadq.c
@@ -0,0 +1,967 @@
+/*
+ * Thread Queue Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/chain.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/object.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#include <rtems/score/tqdata.h>
+
+/*PAGE
+ *
+ * _Thread_queue_Initialize
+ *
+ * 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
+ * proxy_extract_callout - MP specific callout
+ * timeout_status - return on a timeout
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_queue_Initialize(
+ Thread_queue_Control *the_thread_queue,
+ Objects_Classes the_class,
+ Thread_queue_Disciplines the_discipline,
+ States_Control state,
+ 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->timeout_status = timeout_status;
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ switch ( the_discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ _Chain_Initialize_empty( &the_thread_queue->Queues.Fifo );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++)
+ _Chain_Initialize_empty( &the_thread_queue->Queues.Priority[index] );
+ break;
+ }
+
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enqueue
+ *
+ * This routine blocks a thread, places it on a thread, and optionally
+ * starts a timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ * timeout - interval to wait
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Thread_queue_Enqueue(
+ Thread_queue_Control *the_thread_queue,
+ Watchdog_Interval timeout
+)
+{
+ Thread_Control *the_thread;
+
+ the_thread = _Thread_Executing;
+
+ 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 );
+
+ if ( timeout ) {
+ _Watchdog_Initialize(
+ &the_thread->Timer,
+ _Thread_queue_Timeout,
+ the_thread->Object.id,
+ NULL
+ );
+
+ _Watchdog_Insert_ticks( &the_thread->Timer, timeout );
+ }
+
+ switch( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ _Thread_queue_Enqueue_fifo( the_thread_queue, the_thread, timeout );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ _Thread_queue_Enqueue_priority( the_thread_queue, the_thread, timeout );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Dequeue
+ *
+ * This routine removes a thread from the specified threadq. If the
+ * threadq discipline is FIFO, it unblocks a thread, and cancels its
+ * timeout timer. Priority discipline is processed elsewhere.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ *
+ * Output parameters:
+ * returns - thread dequeued or NULL
+ *
+ * INTERRUPT LATENCY:
+ * check sync
+ */
+
+Thread_Control *_Thread_queue_Dequeue(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ Thread_Control *the_thread;
+
+ switch ( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ the_thread = _Thread_queue_Dequeue_fifo( the_thread_queue );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ the_thread = _Thread_queue_Dequeue_priority( the_thread_queue );
+ break;
+ default: /* this is only to prevent warnings */
+ the_thread = NULL;
+ break;
+ }
+
+ return( the_thread );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract_with_proxy
+ *
+ * This routine extracts the_thread from the_thread_queue
+ * and insures that if there is a proxy for this task on
+ * another node, it is also dealt with.
+ *
+ * XXX
+ */
+
+boolean _Thread_queue_Extract_with_proxy(
+ Thread_Control *the_thread
+)
+{
+ States_Control state;
+ Objects_Classes the_class;
+ Thread_queue_Extract_callout proxy_extract_callout;
+
+ 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 ) ) {
+
+ the_class = _Objects_Get_class( the_thread->Wait.id );
+
+ proxy_extract_callout = _Thread_queue_Extract_table[ the_class ];
+
+ if ( proxy_extract_callout )
+ (*proxy_extract_callout)( the_thread );
+ }
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract
+ *
+ * This routine removes a specific thread from the specified threadq,
+ * deletes any timeout, and unblocks the thread.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to a threadq header
+ * the_thread - pointer to a thread control block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY: NONE
+ */
+
+void _Thread_queue_Extract(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+)
+{
+ switch ( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ _Thread_queue_Extract_fifo( the_thread_queue, the_thread );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ _Thread_queue_Extract_priority( the_thread_queue, the_thread );
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Flush
+ *
+ * This kernel routine flushes the given thread queue.
+ *
+ * Input parameters:
+ * 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,
+ 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 = status;
+ else
+ ( *remote_extract_callout )( the_thread );
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_First
+ *
+ * This routines returns a pointer to the first thread on the
+ * specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to thread queue
+ *
+ * Output parameters:
+ * returns - first thread or NULL
+ */
+
+Thread_Control *_Thread_queue_First(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ Thread_Control *the_thread;
+
+ switch ( the_thread_queue->discipline ) {
+ case THREAD_QUEUE_DISCIPLINE_FIFO:
+ the_thread = _Thread_queue_First_fifo( the_thread_queue );
+ break;
+ case THREAD_QUEUE_DISCIPLINE_PRIORITY:
+ the_thread = _Thread_queue_First_priority( the_thread_queue );
+ break;
+ default: /* this is only to prevent warnings */
+ the_thread = NULL;
+ break;
+ }
+
+ return the_thread;
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Timeout
+ *
+ * This routine processes a thread which timeouts while waiting on
+ * a thread queue. It is called by the watchdog handler.
+ *
+ * Input parameters:
+ * id - thread id
+ *
+ * Output parameters: NONE
+ */
+
+void _Thread_queue_Timeout(
+ Objects_Id id,
+ void *ignored
+)
+{
+ Thread_Control *the_thread;
+ Thread_queue_Control *the_thread_queue;
+ Objects_Locations location;
+
+ the_thread = _Thread_Get( id, &location );
+ switch ( location ) {
+ case OBJECTS_ERROR:
+ case OBJECTS_REMOTE: /* impossible */
+ break;
+ case OBJECTS_LOCAL:
+ the_thread_queue = the_thread->Wait.queue;
+
+ /*
+ * If the_thread_queue is not synchronized, then it is either
+ * "nothing happened", "timeout", or "satisfied". If the_thread
+ * is the executing thread, then it is in the process of blocking
+ * and it is the thread which is responsible for the synchronization
+ * process.
+ *
+ * If it is not satisfied, then it is "nothing happened" and
+ * this is the "timeout" transition. After a request is satisfied,
+ * a timeout is not allowed to occur.
+ */
+
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_SYNCHRONIZED &&
+ _Thread_Is_executing( the_thread ) ) {
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_SATISFIED )
+ the_thread_queue->sync_state = THREAD_QUEUE_TIMEOUT;
+ } else {
+ the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
+ _Thread_queue_Extract( the_thread->Wait.queue, the_thread );
+ }
+ _Thread_Unnest_dispatch();
+ break;
+ }
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enqueue_fifo
+ *
+ * This routine blocks a thread, places it on a thread, and optionally
+ * starts a timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ * the_thread - pointer to the thread to block
+ * timeout - interval to wait
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+void _Thread_queue_Enqueue_fifo (
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+)
+{
+ ISR_Level level;
+ Thread_queue_States sync_state;
+
+ _ISR_Disable( level );
+
+ sync_state = the_thread_queue->sync_state;
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ switch ( sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ /*
+ * This should never happen. It indicates that someone did not
+ * enter a thread queue critical section.
+ */
+ break;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ _Chain_Append_unprotected(
+ &the_thread_queue->Queues.Fifo,
+ &the_thread->Object.Node
+ );
+ _ISR_Enable( level );
+ return;
+
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
+ _ISR_Enable( level );
+ break;
+
+ case THREAD_QUEUE_SATISFIED:
+ if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ } else
+ _ISR_Enable( level );
+ break;
+ }
+
+ /*
+ * Global objects with thread queue's should not be operated on from an
+ * ISR. But the sync code still must allow short timeouts to be processed
+ * correctly.
+ */
+
+ _Thread_Unblock( the_thread );
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Dequeue_fifo
+ *
+ * This routine removes a thread from the specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ *
+ * Output parameters:
+ * returns - thread dequeued or NULL
+ *
+ * INTERRUPT LATENCY:
+ * check sync
+ * FIFO
+ */
+
+Thread_Control *_Thread_queue_Dequeue_fifo(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ ISR_Level level;
+ Thread_Control *the_thread;
+
+ _ISR_Disable( level );
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) {
+
+ the_thread = (Thread_Control *)
+ _Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo );
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+
+ return the_thread;
+ }
+
+ switch ( the_thread_queue->sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ case THREAD_QUEUE_SATISFIED:
+ _ISR_Enable( level );
+ return NULL;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread_queue->sync_state = THREAD_QUEUE_SATISFIED;
+ _ISR_Enable( level );
+ return _Thread_Executing;
+ }
+ return NULL; /* this is only to prevent warnings */
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract_fifo
+ *
+ * This routine removes a specific thread from the specified threadq,
+ * deletes any timeout, and unblocks the thread.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to a threadq header
+ * the_thread - pointer to the thread to block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * EXTRACT_FIFO
+ */
+
+void _Thread_queue_Extract_fifo(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+
+ _ISR_Disable( level );
+
+ if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
+ _ISR_Enable( level );
+ return;
+ }
+
+ _Chain_Extract_unprotected( &the_thread->Object.Node );
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ }
+
+ _Thread_Unblock( the_thread );
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+
+}
+
+/*PAGE
+ *
+ * _Thread_queue_First_fifo
+ *
+ * This routines returns a pointer to the first thread on the
+ * specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ *
+ * Output parameters:
+ * returns - first thread or NULL
+ */
+
+Thread_Control *_Thread_queue_First_fifo(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) )
+ return (Thread_Control *) the_thread_queue->Queues.Fifo.first;
+
+ return NULL;
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Enqueue_priority
+ *
+ * This routine blocks a thread, places it on a thread, and optionally
+ * starts a timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to threadq
+ * thread - thread to insert
+ * timeout - timeout interval in ticks
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * forward less than
+ * forward equal
+ */
+
+void _Thread_queue_Enqueue_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread,
+ Watchdog_Interval timeout
+)
+{
+ Priority_Control search_priority;
+ Thread_Control *search_thread;
+ ISR_Level level;
+ Chain_Control *header;
+ unsigned32 header_index;
+ Chain_Node *the_node;
+ Chain_Node *next_node;
+ Chain_Node *previous_node;
+ Chain_Node *search_node;
+ Priority_Control priority;
+ States_Control block_state;
+ Thread_queue_States sync_state;
+
+ _Chain_Initialize_empty( &the_thread->Wait.Block2n );
+
+ priority = the_thread->current_priority;
+ header_index = _Thread_queue_Header_number( priority );
+ header = &the_thread_queue->Queues.Priority[ header_index ];
+ block_state = the_thread_queue->state;
+
+ if ( _Thread_queue_Is_reverse_search( priority ) )
+ goto restart_reverse_search;
+
+restart_forward_search:
+ search_priority = PRIORITY_MINIMUM - 1;
+ _ISR_Disable( level );
+ search_thread = (Thread_Control *) header->first;
+ while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) {
+ search_priority = search_thread->current_priority;
+ if ( priority <= search_priority )
+ break;
+
+#if ( CPU_UNROLL_ENQUEUE_PRIORITY == TRUE )
+ search_thread = (Thread_Control *) search_thread->Object.Node.next;
+ if ( _Chain_Is_tail( header, (Chain_Node *)search_thread ) )
+ break;
+ search_priority = search_thread->current_priority;
+ if ( priority <= search_priority )
+ break;
+#endif
+ _ISR_Flash( level );
+ if ( !_States_Are_set( search_thread->current_state, block_state) ) {
+ _ISR_Enable( level );
+ goto restart_forward_search;
+ }
+ search_thread =
+ (Thread_Control *)search_thread->Object.Node.next;
+ }
+
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_NOTHING_HAPPENED )
+ goto synchronize;
+
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ if ( priority == search_priority )
+ goto equal_priority;
+
+ search_node = (Chain_Node *) search_thread;
+ previous_node = search_node->previous;
+ the_node = (Chain_Node *) the_thread;
+
+ the_node->next = search_node;
+ the_node->previous = previous_node;
+ previous_node->next = the_node;
+ search_node->previous = the_node;
+ _ISR_Enable( level );
+ return;
+
+restart_reverse_search:
+ search_priority = PRIORITY_MAXIMUM + 1;
+
+ _ISR_Disable( level );
+ search_thread = (Thread_Control *) header->last;
+ while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) {
+ search_priority = search_thread->current_priority;
+ if ( priority >= search_priority )
+ break;
+#if ( CPU_UNROLL_ENQUEUE_PRIORITY == TRUE )
+ search_thread = (Thread_Control *) search_thread->Object.Node.previous;
+ if ( _Chain_Is_head( header, (Chain_Node *)search_thread ) )
+ break;
+ search_priority = search_thread->current_priority;
+ if ( priority >= search_priority )
+ break;
+#endif
+ _ISR_Flash( level );
+ if ( !_States_Are_set( search_thread->current_state, block_state) ) {
+ _ISR_Enable( level );
+ goto restart_reverse_search;
+ }
+ search_thread = (Thread_Control *)
+ search_thread->Object.Node.previous;
+ }
+
+ if ( the_thread_queue->sync_state != THREAD_QUEUE_NOTHING_HAPPENED )
+ goto synchronize;
+
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ if ( priority == search_priority )
+ goto equal_priority;
+
+ search_node = (Chain_Node *) search_thread;
+ next_node = search_node->next;
+ the_node = (Chain_Node *) the_thread;
+
+ the_node->next = next_node;
+ the_node->previous = search_node;
+ search_node->next = the_node;
+ next_node->previous = the_node;
+ _ISR_Enable( level );
+ return;
+
+equal_priority: /* add at end of priority group */
+ search_node = _Chain_Tail( &search_thread->Wait.Block2n );
+ previous_node = search_node->previous;
+ the_node = (Chain_Node *) the_thread;
+
+ the_node->next = search_node;
+ the_node->previous = previous_node;
+ previous_node->next = the_node;
+ search_node->previous = the_node;
+ _ISR_Enable( level );
+ return;
+
+synchronize:
+
+ sync_state = the_thread_queue->sync_state;
+ the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
+
+ switch ( sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ /*
+ * This should never happen. It indicates that someone did not
+ * enter a thread queue critical section.
+ */
+ break;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ /*
+ * This should never happen. All of this was dealt with above.
+ */
+ break;
+
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
+ _ISR_Enable( level );
+ break;
+
+ case THREAD_QUEUE_SATISFIED:
+ if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ } else
+ _ISR_Enable( level );
+ break;
+ }
+
+ /*
+ * Global objects with thread queue's should not be operated on from an
+ * ISR. But the sync code still must allow short timeouts to be processed
+ * correctly.
+ */
+
+ _Thread_Unblock( the_thread );
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Dequeue_priority
+ *
+ * This routine removes a thread from the specified PRIORITY based
+ * threadq, unblocks it, and cancels its timeout timer.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to thread queue
+ *
+ * Output parameters:
+ * returns - thread dequeued or NULL
+ *
+ * INTERRUPT LATENCY:
+ * only case
+ */
+
+Thread_Control *_Thread_queue_Dequeue_priority(
+ Thread_queue_Control *the_thread_queue
+)
+{
+ unsigned32 index;
+ ISR_Level level;
+ Thread_Control *the_thread = NULL; /* just to remove warnings */
+ Thread_Control *new_first_thread;
+ Chain_Node *new_first_node;
+ Chain_Node *new_second_node;
+ Chain_Node *last_node;
+ Chain_Node *next_node;
+ Chain_Node *previous_node;
+
+ _ISR_Disable( level );
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++ ) {
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) {
+ the_thread = (Thread_Control *)
+ the_thread_queue->Queues.Priority[ index ].first;
+ goto dequeue;
+ }
+ }
+
+ switch ( the_thread_queue->sync_state ) {
+ case THREAD_QUEUE_SYNCHRONIZED:
+ case THREAD_QUEUE_SATISFIED:
+ _ISR_Enable( level );
+ return NULL;
+
+ case THREAD_QUEUE_NOTHING_HAPPENED:
+ case THREAD_QUEUE_TIMEOUT:
+ the_thread_queue->sync_state = THREAD_QUEUE_SATISFIED;
+ _ISR_Enable( level );
+ return _Thread_Executing;
+ }
+
+dequeue:
+ new_first_node = the_thread->Wait.Block2n.first;
+ new_first_thread = (Thread_Control *) new_first_node;
+ next_node = the_thread->Object.Node.next;
+ previous_node = the_thread->Object.Node.previous;
+
+ if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
+ last_node = the_thread->Wait.Block2n.last;
+ new_second_node = new_first_node->next;
+
+ previous_node->next = new_first_node;
+ next_node->previous = new_first_node;
+ new_first_node->next = next_node;
+ new_first_node->previous = previous_node;
+
+ if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
+ /* > two threads on 2-n */
+ new_second_node->previous =
+ _Chain_Head( &new_first_thread->Wait.Block2n );
+
+ new_first_thread->Wait.Block2n.first = new_second_node;
+ new_first_thread->Wait.Block2n.last = last_node;
+
+ last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n );
+ }
+ } else {
+ previous_node->next = next_node;
+ next_node->previous = previous_node;
+ }
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+ return( the_thread );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_Extract_priority
+ *
+ * This routine removes a specific thread from the specified threadq,
+ * deletes any timeout, and unblocks the thread.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to a threadq header
+ * the_thread - pointer to a thread control block
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * EXTRACT_PRIORITY
+ */
+
+void _Thread_queue_Extract_priority(
+ Thread_queue_Control *the_thread_queue,
+ Thread_Control *the_thread
+)
+{
+ ISR_Level level;
+ Chain_Node *the_node;
+ Chain_Node *next_node;
+ Chain_Node *previous_node;
+ Thread_Control *new_first_thread;
+ Chain_Node *new_first_node;
+ Chain_Node *new_second_node;
+ Chain_Node *last_node;
+
+ the_node = (Chain_Node *) the_thread;
+ _ISR_Disable( level );
+ if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) {
+ next_node = the_node->next;
+ previous_node = the_node->previous;
+
+ if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) {
+ new_first_node = the_thread->Wait.Block2n.first;
+ new_first_thread = (Thread_Control *) new_first_node;
+ last_node = the_thread->Wait.Block2n.last;
+ new_second_node = new_first_node->next;
+
+ previous_node->next = new_first_node;
+ next_node->previous = new_first_node;
+ new_first_node->next = next_node;
+ new_first_node->previous = previous_node;
+
+ if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) {
+ /* > two threads on 2-n */
+ new_second_node->previous =
+ _Chain_Head( &new_first_thread->Wait.Block2n );
+ new_first_thread->Wait.Block2n.first = new_second_node;
+
+ new_first_thread->Wait.Block2n.last = last_node;
+ last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n );
+ }
+ } else {
+ previous_node->next = next_node;
+ next_node->previous = previous_node;
+ }
+
+ if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
+ _ISR_Enable( level );
+ _Thread_Unblock( the_thread );
+ } else {
+ _Watchdog_Deactivate( &the_thread->Timer );
+ _ISR_Enable( level );
+ (void) _Watchdog_Remove( &the_thread->Timer );
+ _Thread_Unblock( the_thread );
+ }
+
+ if ( !_Objects_Is_local_id( the_thread->Object.id ) )
+ _Thread_MP_Free_proxy( the_thread );
+ }
+ else
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Thread_queue_First_priority
+ *
+ * This routines returns a pointer to the first thread on the
+ * specified threadq.
+ *
+ * Input parameters:
+ * the_thread_queue - pointer to thread queue
+ *
+ * Output parameters:
+ * returns - first thread or NULL
+ */
+
+Thread_Control *_Thread_queue_First_priority (
+ Thread_queue_Control *the_thread_queue
+)
+{
+ unsigned32 index;
+
+ for( index=0 ;
+ index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ;
+ index++ ) {
+ if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) )
+ return (Thread_Control *)
+ the_thread_queue->Queues.Priority[ index ].first;
+ }
+ return NULL;
+}
diff --git a/cpukit/score/src/userext.c b/cpukit/score/src/userext.c
new file mode 100644
index 0000000000..868be5578f
--- /dev/null
+++ b/cpukit/score/src/userext.c
@@ -0,0 +1,204 @@
+/*
+ * User Extension Handler
+ *
+ * NOTE: XXX
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/userext.h>
+
+/*PAGE
+ *
+ * _User_extensions_Thread_create
+ */
+
+boolean _User_extensions_Thread_create (
+ Thread_Control *the_thread
+)
+{
+ Chain_Node *the_node;
+ User_extensions_Control *the_extension;
+ boolean status;
+
+ 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.thread_create != NULL ) {
+ status = (*the_extension->Callouts.thread_create)(
+ _Thread_Executing,
+ the_thread
+ );
+ if ( !status )
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_delete
+ */
+
+void _User_extensions_Thread_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.thread_delete != NULL )
+ (*the_extension->Callouts.thread_delete)(
+ _Thread_Executing,
+ the_thread
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_start
+ *
+ */
+
+void _User_extensions_Thread_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.thread_start != NULL )
+ (*the_extension->Callouts.thread_start)(
+ _Thread_Executing,
+ the_thread
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_restart
+ *
+ */
+
+void _User_extensions_Thread_restart (
+ 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.thread_restart != NULL )
+ (*the_extension->Callouts.thread_restart)(
+ _Thread_Executing,
+ the_thread
+ );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_begin
+ *
+ */
+
+void _User_extensions_Thread_begin (
+ 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.thread_begin != NULL )
+ (*the_extension->Callouts.thread_begin)( executing );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Thread_exitted
+ */
+
+void _User_extensions_Thread_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.thread_exitted != NULL )
+ (*the_extension->Callouts.thread_exitted)( executing );
+ }
+}
+
+/*PAGE
+ *
+ * _User_extensions_Fatal
+ */
+
+void _User_extensions_Fatal (
+ Internal_errors_Source the_source,
+ boolean is_internal,
+ 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_source, is_internal, the_error );
+ }
+}
+
+
diff --git a/cpukit/score/src/watchdog.c b/cpukit/score/src/watchdog.c
new file mode 100644
index 0000000000..67aaf267e9
--- /dev/null
+++ b/cpukit/score/src/watchdog.c
@@ -0,0 +1,273 @@
+/*
+ * Watchdog Handler
+ *
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/watchdog.h>
+
+/*PAGE
+ *
+ * _Watchdog_Handler_initialization
+ *
+ * This routine initializes the watchdog handler.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ */
+
+void _Watchdog_Handler_initialization( void )
+{
+ _Watchdog_Sync_count = 0;
+ _Watchdog_Sync_level = 0;
+ _Watchdog_Ticks_since_boot = 0;
+
+ _Chain_Initialize_empty( &_Watchdog_Ticks_chain );
+ _Chain_Initialize_empty( &_Watchdog_Seconds_chain );
+}
+
+/*PAGE
+ *
+ * _Watchdog_Remove
+ *
+ * The routine removes a watchdog from a delta chain and updates
+ * the delta counters of the remaining watchdogs.
+ */
+
+Watchdog_States _Watchdog_Remove(
+ Watchdog_Control *the_watchdog
+)
+{
+ ISR_Level level;
+ Watchdog_States previous_state;
+ Watchdog_Control *next_watchdog;
+
+ _ISR_Disable( level );
+ previous_state = the_watchdog->state;
+ switch ( previous_state ) {
+ case WATCHDOG_INACTIVE:
+ break;
+
+ case WATCHDOG_BEING_INSERTED:
+
+ /*
+ * It is not actually on the chain so just change the state and
+ * the Insert operation we interrupted will be aborted.
+ */
+ the_watchdog->state = WATCHDOG_INACTIVE;
+ break;
+
+ case WATCHDOG_ACTIVE:
+ case WATCHDOG_REMOVE_IT:
+
+ the_watchdog->state = WATCHDOG_INACTIVE;
+ next_watchdog = _Watchdog_Next( the_watchdog );
+
+ if ( _Watchdog_Next(next_watchdog) )
+ next_watchdog->delta_interval += the_watchdog->delta_interval;
+
+ if ( _Watchdog_Sync_count )
+ _Watchdog_Sync_level = _ISR_Nest_level;
+
+ _Chain_Extract_unprotected( &the_watchdog->Node );
+ break;
+ }
+ the_watchdog->stop_time = _Watchdog_Ticks_since_boot;
+
+ _ISR_Enable( level );
+ return( previous_state );
+}
+
+/*PAGE
+ *
+ * _Watchdog_Adjust
+ *
+ * This routine adjusts the delta chain backward or forward in response
+ * to a time change.
+ *
+ * Input parameters:
+ * header - pointer to the delta chain to be adjusted
+ * direction - forward or backward adjustment to delta chain
+ * units - units to adjust
+ *
+ * Output parameters:
+ */
+
+void _Watchdog_Adjust(
+ Chain_Control *header,
+ Watchdog_Adjust_directions direction,
+ Watchdog_Interval units
+)
+{
+ if ( !_Chain_Is_empty( header ) ) {
+ switch ( direction ) {
+ case WATCHDOG_BACKWARD:
+ _Watchdog_First( header )->delta_interval += units;
+ break;
+ case WATCHDOG_FORWARD:
+ while ( units ) {
+ if ( units < _Watchdog_First( header )->delta_interval ) {
+ _Watchdog_First( header )->delta_interval -= units;
+ break;
+ } else {
+ units -= _Watchdog_First( header )->delta_interval;
+ _Watchdog_First( header )->delta_interval = 1;
+ _Watchdog_Tickle( header );
+ if ( _Chain_Is_empty( header ) )
+ break;
+ }
+ }
+ break;
+ }
+ }
+}
+
+/*PAGE
+ *
+ * _Watchdog_Insert
+ *
+ * This routine inserts a watchdog timer on to the appropriate delta
+ * chain while updating the delta interval counters.
+ */
+
+void _Watchdog_Insert(
+ Chain_Control *header,
+ Watchdog_Control *the_watchdog
+)
+{
+ ISR_Level level;
+ Watchdog_Control *after;
+ unsigned32 insert_isr_nest_level;
+ Watchdog_Interval delta_interval;
+
+
+ insert_isr_nest_level = _ISR_Nest_level;
+ the_watchdog->state = WATCHDOG_BEING_INSERTED;
+
+ _Watchdog_Sync_count++;
+restart:
+ delta_interval = the_watchdog->initial;
+
+ _ISR_Disable( level );
+
+ for ( after = _Watchdog_First( header ) ;
+ ;
+ after = _Watchdog_Next( after ) ) {
+
+ if ( delta_interval == 0 || !_Watchdog_Next( after ) )
+ break;
+
+ if ( delta_interval < after->delta_interval ) {
+ after->delta_interval -= delta_interval;
+ break;
+ }
+
+ delta_interval -= after->delta_interval;
+
+ /*
+ * If you experience problems comment out the _ISR_Flash line.
+ * 3.2.0 was the first release with this critical section redesigned.
+ * Under certain circumstances, the PREVIOUS critical section algorithm
+ * used around this flash point allowed interrupts to execute
+ * which violated the design assumptions. The critical section
+ * mechanism used here WAS redesigned to address this.
+ */
+
+ _ISR_Flash( level );
+
+ if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) {
+ goto exit_insert;
+ }
+
+ if ( _Watchdog_Sync_level > insert_isr_nest_level ) {
+ _Watchdog_Sync_level = insert_isr_nest_level;
+ _ISR_Enable( level );
+ goto restart;
+ }
+ }
+
+ _Watchdog_Activate( the_watchdog );
+
+ the_watchdog->delta_interval = delta_interval;
+
+ _Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node );
+
+ the_watchdog->start_time = _Watchdog_Ticks_since_boot;
+
+exit_insert:
+ _Watchdog_Sync_level = insert_isr_nest_level;
+ _Watchdog_Sync_count--;
+ _ISR_Enable( level );
+}
+
+/*PAGE
+ *
+ * _Watchdog_Tickle
+ *
+ * This routine decrements the delta counter in response to a tick. The
+ * delta chain is updated accordingly.
+ *
+ * Input parameters:
+ * header - pointer to the delta chain to be tickled
+ *
+ * Output parameters: NONE
+ */
+
+void _Watchdog_Tickle(
+ Chain_Control *header
+)
+{
+ Watchdog_Control *the_watchdog;
+
+ if ( _Chain_Is_empty( header ) )
+ return;
+
+ the_watchdog = _Watchdog_First( header );
+ the_watchdog->delta_interval--;
+ if ( the_watchdog->delta_interval != 0 )
+ return;
+
+ do {
+ switch( _Watchdog_Remove( the_watchdog ) ) {
+ case WATCHDOG_ACTIVE:
+ (*the_watchdog->routine)(
+ the_watchdog->id,
+ the_watchdog->user_data
+ );
+ break;
+
+ case WATCHDOG_INACTIVE:
+ /*
+ * This state indicates that the watchdog is not on any chain.
+ * Thus, it is NOT on a chain being tickled. This case should
+ * never occur.
+ */
+ break;
+
+ case WATCHDOG_BEING_INSERTED:
+ /*
+ * This state indicates that the watchdog is in the process of
+ * BEING inserted on the chain. Thus, it can NOT be on a chain
+ * being tickled. This case should never occur.
+ */
+ break;
+
+ case WATCHDOG_REMOVE_IT:
+ break;
+ }
+ the_watchdog = _Watchdog_First( header );
+ } while ( !_Chain_Is_empty( header ) &&
+ (the_watchdog->delta_interval == 0) );
+}
diff --git a/cpukit/score/src/wkspace.c b/cpukit/score/src/wkspace.c
new file mode 100644
index 0000000000..b5c760c8b2
--- /dev/null
+++ b/cpukit/score/src/wkspace.c
@@ -0,0 +1,88 @@
+/*
+ * Workspace Handler
+ *
+ * XXX
+ *
+ * NOTE:
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/wkspace.h>
+#include <rtems/score/interr.h>
+
+/*PAGE
+ *
+ * _Workspace_Handler_initialization
+ */
+
+void _Workspace_Handler_initialization(
+ void *starting_address,
+ unsigned32 size
+)
+{
+ unsigned32 *zero_out_array;
+ unsigned32 index;
+ unsigned32 memory_available;
+
+ 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 ;
+ index < size / sizeof( unsigned32 ) ;
+ index++ )
+ zero_out_array[ index ] = 0;
+ }
+
+ memory_available = _Heap_Initialize(
+ &_Workspace_Area,
+ starting_address,
+ size,
+ CPU_HEAP_ALIGNMENT
+ );
+
+ if ( memory_available == 0 )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_TOO_LITTLE_WORKSPACE
+ );
+}
+
+/*PAGE
+ *
+ * _Workspace_Allocate_or_fatal_error
+ *
+ */
+
+void *_Workspace_Allocate_or_fatal_error(
+ unsigned32 size
+)
+{
+ void *memory;
+
+ memory = _Workspace_Allocate( size );
+
+ if ( memory == NULL )
+ _Internal_error_Occurred(
+ INTERNAL_ERROR_CORE,
+ TRUE,
+ INTERNAL_ERROR_WORKSPACE_ALLOCATION
+ );
+
+ return memory;
+}
diff --git a/cpukit/zlib/doc/rfc1950.txt b/cpukit/zlib/doc/rfc1950.txt
new file mode 100644
index 0000000000..ce6428a0f2
--- /dev/null
+++ b/cpukit/zlib/doc/rfc1950.txt
@@ -0,0 +1,619 @@
+
+
+
+
+
+
+Network Working Group P. Deutsch
+Request for Comments: 1950 Aladdin Enterprises
+Category: Informational J-L. Gailly
+ Info-ZIP
+ May 1996
+
+
+ ZLIB Compressed Data Format Specification version 3.3
+
+Status of This Memo
+
+ This memo provides information for the Internet community. This memo
+ does not specify an Internet standard of any kind. Distribution of
+ this memo is unlimited.
+
+IESG Note:
+
+ The IESG takes no position on the validity of any Intellectual
+ Property Rights statements contained in this document.
+
+Notices
+
+ Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly
+
+ Permission is granted to copy and distribute this document for any
+ purpose and without charge, including translations into other
+ languages and incorporation into compilations, provided that the
+ copyright notice and this notice are preserved, and that any
+ substantive changes or deletions from the original are clearly
+ marked.
+
+ A pointer to the latest version of this and related documentation in
+ HTML format can be found at the URL
+ <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>.
+
+Abstract
+
+ This specification defines a lossless compressed data format. The
+ data can be produced or consumed, even for an arbitrarily long
+ sequentially presented input data stream, using only an a priori
+ bounded amount of intermediate storage. The format presently uses
+ the DEFLATE compression method but can be easily extended to use
+ other compression methods. It can be implemented readily in a manner
+ not covered by patents. This specification also defines the ADLER-32
+ checksum (an extension and improvement of the Fletcher checksum),
+ used for detection of data corruption, and provides an algorithm for
+ computing it.
+
+
+
+
+Deutsch & Gailly Informational [Page 1]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+Table of Contents
+
+ 1. Introduction ................................................... 2
+ 1.1. Purpose ................................................... 2
+ 1.2. Intended audience ......................................... 3
+ 1.3. Scope ..................................................... 3
+ 1.4. Compliance ................................................ 3
+ 1.5. Definitions of terms and conventions used ................ 3
+ 1.6. Changes from previous versions ............................ 3
+ 2. Detailed specification ......................................... 3
+ 2.1. Overall conventions ....................................... 3
+ 2.2. Data format ............................................... 4
+ 2.3. Compliance ................................................ 7
+ 3. References ..................................................... 7
+ 4. Source code .................................................... 8
+ 5. Security Considerations ........................................ 8
+ 6. Acknowledgements ............................................... 8
+ 7. Authors' Addresses ............................................. 8
+ 8. Appendix: Rationale ............................................ 9
+ 9. Appendix: Sample code ..........................................10
+
+1. Introduction
+
+ 1.1. Purpose
+
+ The purpose of this specification is to define a lossless
+ compressed data format that:
+
+ * Is independent of CPU type, operating system, file system,
+ and character set, and hence can be used for interchange;
+
+ * Can be produced or consumed, even for an arbitrarily long
+ sequentially presented input data stream, using only an a
+ priori bounded amount of intermediate storage, and hence can
+ be used in data communications or similar structures such as
+ Unix filters;
+
+ * Can use a number of different compression methods;
+
+ * Can be implemented readily in a manner not covered by
+ patents, and hence can be practiced freely.
+
+ The data format defined by this specification does not attempt to
+ allow random access to compressed data.
+
+
+
+
+
+
+
+Deutsch & Gailly Informational [Page 2]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+ 1.2. Intended audience
+
+ This specification is intended for use by implementors of software
+ to compress data into zlib format and/or decompress data from zlib
+ format.
+
+ The text of the specification assumes a basic background in
+ programming at the level of bits and other primitive data
+ representations.
+
+ 1.3. Scope
+
+ The specification specifies a compressed data format that can be
+ used for in-memory compression of a sequence of arbitrary bytes.
+
+ 1.4. Compliance
+
+ Unless otherwise indicated below, a compliant decompressor must be
+ able to accept and decompress any data set that conforms to all
+ the specifications presented here; a compliant compressor must
+ produce data sets that conform to all the specifications presented
+ here.
+
+ 1.5. Definitions of terms and conventions used
+
+ byte: 8 bits stored or transmitted as a unit (same as an octet).
+ (For this specification, a byte is exactly 8 bits, even on
+ machines which store a character on a number of bits different
+ from 8.) See below, for the numbering of bits within a byte.
+
+ 1.6. Changes from previous versions
+
+ Version 3.1 was the first public release of this specification.
+ In version 3.2, some terminology was changed and the Adler-32
+ sample code was rewritten for clarity. In version 3.3, the
+ support for a preset dictionary was introduced, and the
+ specification was converted to RFC style.
+
+2. Detailed specification
+
+ 2.1. Overall conventions
+
+ In the diagrams below, a box like this:
+
+ +---+
+ | | <-- the vertical bars might be missing
+ +---+
+
+
+
+
+Deutsch & Gailly Informational [Page 3]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+ represents one byte; a box like this:
+
+ +==============+
+ | |
+ +==============+
+
+ represents a variable number of bytes.
+
+ Bytes stored within a computer do not have a "bit order", since
+ they are always treated as a unit. However, a byte considered as
+ an integer between 0 and 255 does have a most- and least-
+ significant bit, and since we write numbers with the most-
+ significant digit on the left, we also write bytes with the most-
+ significant bit on the left. In the diagrams below, we number the
+ bits of a byte so that bit 0 is the least-significant bit, i.e.,
+ the bits are numbered:
+
+ +--------+
+ |76543210|
+ +--------+
+
+ Within a computer, a number may occupy multiple bytes. All
+ multi-byte numbers in the format described here are stored with
+ the MOST-significant byte first (at the lower memory address).
+ For example, the decimal number 520 is stored as:
+
+ 0 1
+ +--------+--------+
+ |00000010|00001000|
+ +--------+--------+
+ ^ ^
+ | |
+ | + less significant byte = 8
+ + more significant byte = 2 x 256
+
+ 2.2. Data format
+
+ A zlib stream has the following structure:
+
+ 0 1
+ +---+---+
+ |CMF|FLG| (more-->)
+ +---+---+
+
+
+
+
+
+
+
+
+Deutsch & Gailly Informational [Page 4]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+ (if FLG.FDICT set)
+
+ 0 1 2 3
+ +---+---+---+---+
+ | DICTID | (more-->)
+ +---+---+---+---+
+
+ +=====================+---+---+---+---+
+ |...compressed data...| ADLER32 |
+ +=====================+---+---+---+---+
+
+ Any data which may appear after ADLER32 are not part of the zlib
+ stream.
+
+ CMF (Compression Method and flags)
+ This byte is divided into a 4-bit compression method and a 4-
+ bit information field depending on the compression method.
+
+ bits 0 to 3 CM Compression method
+ bits 4 to 7 CINFO Compression info
+
+ CM (Compression method)
+ This identifies the compression method used in the file. CM = 8
+ denotes the "deflate" compression method with a window size up
+ to 32K. This is the method used by gzip and PNG (see
+ references [1] and [2] in Chapter 3, below, for the reference
+ documents). CM = 15 is reserved. It might be used in a future
+ version of this specification to indicate the presence of an
+ extra field before the compressed data.
+
+ CINFO (Compression info)
+ For CM = 8, CINFO is the base-2 logarithm of the LZ77 window
+ size, minus eight (CINFO=7 indicates a 32K window size). Values
+ of CINFO above 7 are not allowed in this version of the
+ specification. CINFO is not defined in this specification for
+ CM not equal to 8.
+
+ FLG (FLaGs)
+ This flag byte is divided as follows:
+
+ bits 0 to 4 FCHECK (check bits for CMF and FLG)
+ bit 5 FDICT (preset dictionary)
+ bits 6 to 7 FLEVEL (compression level)
+
+ The FCHECK value must be such that CMF and FLG, when viewed as
+ a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG),
+ is a multiple of 31.
+
+
+
+
+Deutsch & Gailly Informational [Page 5]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+ FDICT (Preset dictionary)
+ If FDICT is set, a DICT dictionary identifier is present
+ immediately after the FLG byte. The dictionary is a sequence of
+ bytes which are initially fed to the compressor without
+ producing any compressed output. DICT is the Adler-32 checksum
+ of this sequence of bytes (see the definition of ADLER32
+ below). The decompressor can use this identifier to determine
+ which dictionary has been used by the compressor.
+
+ FLEVEL (Compression level)
+ These flags are available for use by specific compression
+ methods. The "deflate" method (CM = 8) sets these flags as
+ follows:
+
+ 0 - compressor used fastest algorithm
+ 1 - compressor used fast algorithm
+ 2 - compressor used default algorithm
+ 3 - compressor used maximum compression, slowest algorithm
+
+ The information in FLEVEL is not needed for decompression; it
+ is there to indicate if recompression might be worthwhile.
+
+ compressed data
+ For compression method 8, the compressed data is stored in the
+ deflate compressed data format as described in the document
+ "DEFLATE Compressed Data Format Specification" by L. Peter
+ Deutsch. (See reference [3] in Chapter 3, below)
+
+ Other compressed data formats are not specified in this version
+ of the zlib specification.
+
+ ADLER32 (Adler-32 checksum)
+ This contains a checksum value of the uncompressed data
+ (excluding any dictionary data) computed according to Adler-32
+ algorithm. This algorithm is a 32-bit extension and improvement
+ of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073
+ standard. See references [4] and [5] in Chapter 3, below)
+
+ Adler-32 is composed of two sums accumulated per byte: s1 is
+ the sum of all bytes, s2 is the sum of all s1 values. Both sums
+ are done modulo 65521. s1 is initialized to 1, s2 to zero. The
+ Adler-32 checksum is stored as s2*65536 + s1 in most-
+ significant-byte first (network) order.
+
+
+
+
+
+
+
+
+Deutsch & Gailly Informational [Page 6]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+ 2.3. Compliance
+
+ A compliant compressor must produce streams with correct CMF, FLG
+ and ADLER32, but need not support preset dictionaries. When the
+ zlib data format is used as part of another standard data format,
+ the compressor may use only preset dictionaries that are specified
+ by this other data format. If this other format does not use the
+ preset dictionary feature, the compressor must not set the FDICT
+ flag.
+
+ A compliant decompressor must check CMF, FLG, and ADLER32, and
+ provide an error indication if any of these have incorrect values.
+ A compliant decompressor must give an error indication if CM is
+ not one of the values defined in this specification (only the
+ value 8 is permitted in this version), since another value could
+ indicate the presence of new features that would cause subsequent
+ data to be interpreted incorrectly. A compliant decompressor must
+ give an error indication if FDICT is set and DICTID is not the
+ identifier of a known preset dictionary. A decompressor may
+ ignore FLEVEL and still be compliant. When the zlib data format
+ is being used as a part of another standard format, a compliant
+ decompressor must support all the preset dictionaries specified by
+ the other format. When the other format does not use the preset
+ dictionary feature, a compliant decompressor must reject any
+ stream in which the FDICT flag is set.
+
+3. References
+
+ [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification",
+ available in ftp://ftp.uu.net/pub/archiving/zip/doc/
+
+ [2] Thomas Boutell, "PNG (Portable Network Graphics) specification",
+ available in ftp://ftp.uu.net/graphics/png/documents/
+
+ [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification",
+ available in ftp://ftp.uu.net/pub/archiving/zip/doc/
+
+ [4] Fletcher, J. G., "An Arithmetic Checksum for Serial
+ Transmissions," IEEE Transactions on Communications, Vol. COM-30,
+ No. 1, January 1982, pp. 247-252.
+
+ [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms,"
+ November, 1993, pp. 144, 145. (Available from
+ gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073.
+
+
+
+
+
+
+
+Deutsch & Gailly Informational [Page 7]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+4. Source code
+
+ Source code for a C language implementation of a "zlib" compliant
+ library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/.
+
+5. Security Considerations
+
+ A decoder that fails to check the ADLER32 checksum value may be
+ subject to undetected data corruption.
+
+6. Acknowledgements
+
+ Trademarks cited in this document are the property of their
+ respective owners.
+
+ Jean-Loup Gailly and Mark Adler designed the zlib format and wrote
+ the related software described in this specification. Glenn
+ Randers-Pehrson converted this document to RFC and HTML format.
+
+7. Authors' Addresses
+
+ L. Peter Deutsch
+ Aladdin Enterprises
+ 203 Santa Margarita Ave.
+ Menlo Park, CA 94025
+
+ Phone: (415) 322-0103 (AM only)
+ FAX: (415) 322-1734
+ EMail: <ghost@aladdin.com>
+
+
+ Jean-Loup Gailly
+
+ EMail: <gzip@prep.ai.mit.edu>
+
+ Questions about the technical content of this specification can be
+ sent by email to
+
+ Jean-Loup Gailly <gzip@prep.ai.mit.edu> and
+ Mark Adler <madler@alumni.caltech.edu>
+
+ Editorial comments on this specification can be sent by email to
+
+ L. Peter Deutsch <ghost@aladdin.com> and
+ Glenn Randers-Pehrson <randeg@alumni.rpi.edu>
+
+
+
+
+
+
+Deutsch & Gailly Informational [Page 8]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+8. Appendix: Rationale
+
+ 8.1. Preset dictionaries
+
+ A preset dictionary is specially useful to compress short input
+ sequences. The compressor can take advantage of the dictionary
+ context to encode the input in a more compact manner. The
+ decompressor can be initialized with the appropriate context by
+ virtually decompressing a compressed version of the dictionary
+ without producing any output. However for certain compression
+ algorithms such as the deflate algorithm this operation can be
+ achieved without actually performing any decompression.
+
+ The compressor and the decompressor must use exactly the same
+ dictionary. The dictionary may be fixed or may be chosen among a
+ certain number of predefined dictionaries, according to the kind
+ of input data. The decompressor can determine which dictionary has
+ been chosen by the compressor by checking the dictionary
+ identifier. This document does not specify the contents of
+ predefined dictionaries, since the optimal dictionaries are
+ application specific. Standard data formats using this feature of
+ the zlib specification must precisely define the allowed
+ dictionaries.
+
+ 8.2. The Adler-32 algorithm
+
+ The Adler-32 algorithm is much faster than the CRC32 algorithm yet
+ still provides an extremely low probability of undetected errors.
+
+ The modulo on unsigned long accumulators can be delayed for 5552
+ bytes, so the modulo operation time is negligible. If the bytes
+ are a, b, c, the second sum is 3a + 2b + c + 3, and so is position
+ and order sensitive, unlike the first sum, which is just a
+ checksum. That 65521 is prime is important to avoid a possible
+ large class of two-byte errors that leave the check unchanged.
+ (The Fletcher checksum uses 255, which is not prime and which also
+ makes the Fletcher check insensitive to single byte changes 0 <->
+ 255.)
+
+ The sum s1 is initialized to 1 instead of zero to make the length
+ of the sequence part of s2, so that the length does not have to be
+ checked separately. (Any sequence of zeroes has a Fletcher
+ checksum of zero.)
+
+
+
+
+
+
+
+
+Deutsch & Gailly Informational [Page 9]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+9. Appendix: Sample code
+
+ The following C code computes the Adler-32 checksum of a data buffer.
+ It is written for clarity, not for speed. The sample code is in the
+ ANSI C programming language. Non C users may find it easier to read
+ with these hints:
+
+ & Bitwise AND operator.
+ >> Bitwise right shift operator. When applied to an
+ unsigned quantity, as here, right shift inserts zero bit(s)
+ at the left.
+ << Bitwise left shift operator. Left shift inserts zero
+ bit(s) at the right.
+ ++ "n++" increments the variable n.
+ % modulo operator: a % b is the remainder of a divided by b.
+
+ #define BASE 65521 /* largest prime smaller than 65536 */
+
+ /*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1]
+ and return the updated checksum. The Adler-32 checksum should be
+ initialized to 1.
+
+ Usage example:
+
+ unsigned long adler = 1L;
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = update_adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+ */
+ unsigned long update_adler32(unsigned long adler,
+ unsigned char *buf, int len)
+ {
+ unsigned long s1 = adler & 0xffff;
+ unsigned long s2 = (adler >> 16) & 0xffff;
+ int n;
+
+ for (n = 0; n < len; n++) {
+ s1 = (s1 + buf[n]) % BASE;
+ s2 = (s2 + s1) % BASE;
+ }
+ return (s2 << 16) + s1;
+ }
+
+ /* Return the adler32 of the bytes buf[0..len-1] */
+
+
+
+
+Deutsch & Gailly Informational [Page 10]
+
+RFC 1950 ZLIB Compressed Data Format Specification May 1996
+
+
+ unsigned long adler32(unsigned char *buf, int len)
+ {
+ return update_adler32(1L, buf, len);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Deutsch & Gailly Informational [Page 11]
+
diff --git a/cpukit/zlib/doc/rfc1951.txt b/cpukit/zlib/doc/rfc1951.txt
new file mode 100644
index 0000000000..403c8c722f
--- /dev/null
+++ b/cpukit/zlib/doc/rfc1951.txt
@@ -0,0 +1,955 @@
+
+
+
+
+
+
+Network Working Group P. Deutsch
+Request for Comments: 1951 Aladdin Enterprises
+Category: Informational May 1996
+
+
+ DEFLATE Compressed Data Format Specification version 1.3
+
+Status of This Memo
+
+ This memo provides information for the Internet community. This memo
+ does not specify an Internet standard of any kind. Distribution of
+ this memo is unlimited.
+
+IESG Note:
+
+ The IESG takes no position on the validity of any Intellectual
+ Property Rights statements contained in this document.
+
+Notices
+
+ Copyright (c) 1996 L. Peter Deutsch
+
+ Permission is granted to copy and distribute this document for any
+ purpose and without charge, including translations into other
+ languages and incorporation into compilations, provided that the
+ copyright notice and this notice are preserved, and that any
+ substantive changes or deletions from the original are clearly
+ marked.
+
+ A pointer to the latest version of this and related documentation in
+ HTML format can be found at the URL
+ <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>.
+
+Abstract
+
+ This specification defines a lossless compressed data format that
+ compresses data using a combination of the LZ77 algorithm and Huffman
+ coding, with efficiency comparable to the best currently available
+ general-purpose compression methods. The data can be produced or
+ consumed, even for an arbitrarily long sequentially presented input
+ data stream, using only an a priori bounded amount of intermediate
+ storage. The format can be implemented readily in a manner not
+ covered by patents.
+
+
+
+
+
+
+
+
+Deutsch Informational [Page 1]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+Table of Contents
+
+ 1. Introduction ................................................... 2
+ 1.1. Purpose ................................................... 2
+ 1.2. Intended audience ......................................... 3
+ 1.3. Scope ..................................................... 3
+ 1.4. Compliance ................................................ 3
+ 1.5. Definitions of terms and conventions used ................ 3
+ 1.6. Changes from previous versions ............................ 4
+ 2. Compressed representation overview ............................. 4
+ 3. Detailed specification ......................................... 5
+ 3.1. Overall conventions ....................................... 5
+ 3.1.1. Packing into bytes .................................. 5
+ 3.2. Compressed block format ................................... 6
+ 3.2.1. Synopsis of prefix and Huffman coding ............... 6
+ 3.2.2. Use of Huffman coding in the "deflate" format ....... 7
+ 3.2.3. Details of block format ............................. 9
+ 3.2.4. Non-compressed blocks (BTYPE=00) ................... 11
+ 3.2.5. Compressed blocks (length and distance codes) ...... 11
+ 3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12
+ 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13
+ 3.3. Compliance ............................................... 14
+ 4. Compression algorithm details ................................. 14
+ 5. References .................................................... 16
+ 6. Security Considerations ....................................... 16
+ 7. Source code ................................................... 16
+ 8. Acknowledgements .............................................. 16
+ 9. Author's Address .............................................. 17
+
+1. Introduction
+
+ 1.1. Purpose
+
+ The purpose of this specification is to define a lossless
+ compressed data format that:
+ * Is independent of CPU type, operating system, file system,
+ and character set, and hence can be used for interchange;
+ * Can be produced or consumed, even for an arbitrarily long
+ sequentially presented input data stream, using only an a
+ priori bounded amount of intermediate storage, and hence
+ can be used in data communications or similar structures
+ such as Unix filters;
+ * Compresses data with efficiency comparable to the best
+ currently available general-purpose compression methods,
+ and in particular considerably better than the "compress"
+ program;
+ * Can be implemented readily in a manner not covered by
+ patents, and hence can be practiced freely;
+
+
+
+Deutsch Informational [Page 2]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ * Is compatible with the file format produced by the current
+ widely used gzip utility, in that conforming decompressors
+ will be able to read data produced by the existing gzip
+ compressor.
+
+ The data format defined by this specification does not attempt to:
+
+ * Allow random access to compressed data;
+ * Compress specialized data (e.g., raster graphics) as well
+ as the best currently available specialized algorithms.
+
+ A simple counting argument shows that no lossless compression
+ algorithm can compress every possible input data set. For the
+ format defined here, the worst case expansion is 5 bytes per 32K-
+ byte block, i.e., a size increase of 0.015% for large data sets.
+ English text usually compresses by a factor of 2.5 to 3;
+ executable files usually compress somewhat less; graphical data
+ such as raster images may compress much more.
+
+ 1.2. Intended audience
+
+ This specification is intended for use by implementors of software
+ to compress data into "deflate" format and/or decompress data from
+ "deflate" format.
+
+ The text of the specification assumes a basic background in
+ programming at the level of bits and other primitive data
+ representations. Familiarity with the technique of Huffman coding
+ is helpful but not required.
+
+ 1.3. Scope
+
+ The specification specifies a method for representing a sequence
+ of bytes as a (usually shorter) sequence of bits, and a method for
+ packing the latter bit sequence into bytes.
+
+ 1.4. Compliance
+
+ Unless otherwise indicated below, a compliant decompressor must be
+ able to accept and decompress any data set that conforms to all
+ the specifications presented here; a compliant compressor must
+ produce data sets that conform to all the specifications presented
+ here.
+
+ 1.5. Definitions of terms and conventions used
+
+ Byte: 8 bits stored or transmitted as a unit (same as an octet).
+ For this specification, a byte is exactly 8 bits, even on machines
+
+
+
+Deutsch Informational [Page 3]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ which store a character on a number of bits different from eight.
+ See below, for the numbering of bits within a byte.
+
+ String: a sequence of arbitrary bytes.
+
+ 1.6. Changes from previous versions
+
+ There have been no technical changes to the deflate format since
+ version 1.1 of this specification. In version 1.2, some
+ terminology was changed. Version 1.3 is a conversion of the
+ specification to RFC style.
+
+2. Compressed representation overview
+
+ A compressed data set consists of a series of blocks, corresponding
+ to successive blocks of input data. The block sizes are arbitrary,
+ except that non-compressible blocks are limited to 65,535 bytes.
+
+ Each block is compressed using a combination of the LZ77 algorithm
+ and Huffman coding. The Huffman trees for each block are independent
+ of those for previous or subsequent blocks; the LZ77 algorithm may
+ use a reference to a duplicated string occurring in a previous block,
+ up to 32K input bytes before.
+
+ Each block consists of two parts: a pair of Huffman code trees that
+ describe the representation of the compressed data part, and a
+ compressed data part. (The Huffman trees themselves are compressed
+ using Huffman encoding.) The compressed data consists of a series of
+ elements of two types: literal bytes (of strings that have not been
+ detected as duplicated within the previous 32K input bytes), and
+ pointers to duplicated strings, where a pointer is represented as a
+ pair <length, backward distance>. The representation used in the
+ "deflate" format limits distances to 32K bytes and lengths to 258
+ bytes, but does not limit the size of a block, except for
+ uncompressible blocks, which are limited as noted above.
+
+ Each type of value (literals, distances, and lengths) in the
+ compressed data is represented using a Huffman code, using one code
+ tree for literals and lengths and a separate code tree for distances.
+ The code trees for each block appear in a compact form just before
+ the compressed data for that block.
+
+
+
+
+
+
+
+
+
+
+Deutsch Informational [Page 4]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+3. Detailed specification
+
+ 3.1. Overall conventions In the diagrams below, a box like this:
+
+ +---+
+ | | <-- the vertical bars might be missing
+ +---+
+
+ represents one byte; a box like this:
+
+ +==============+
+ | |
+ +==============+
+
+ represents a variable number of bytes.
+
+ Bytes stored within a computer do not have a "bit order", since
+ they are always treated as a unit. However, a byte considered as
+ an integer between 0 and 255 does have a most- and least-
+ significant bit, and since we write numbers with the most-
+ significant digit on the left, we also write bytes with the most-
+ significant bit on the left. In the diagrams below, we number the
+ bits of a byte so that bit 0 is the least-significant bit, i.e.,
+ the bits are numbered:
+
+ +--------+
+ |76543210|
+ +--------+
+
+ Within a computer, a number may occupy multiple bytes. All
+ multi-byte numbers in the format described here are stored with
+ the least-significant byte first (at the lower memory address).
+ For example, the decimal number 520 is stored as:
+
+ 0 1
+ +--------+--------+
+ |00001000|00000010|
+ +--------+--------+
+ ^ ^
+ | |
+ | + more significant byte = 2 x 256
+ + less significant byte = 8
+
+ 3.1.1. Packing into bytes
+
+ This document does not address the issue of the order in which
+ bits of a byte are transmitted on a bit-sequential medium,
+ since the final data format described here is byte- rather than
+
+
+
+Deutsch Informational [Page 5]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ bit-oriented. However, we describe the compressed block format
+ in below, as a sequence of data elements of various bit
+ lengths, not a sequence of bytes. We must therefore specify
+ how to pack these data elements into bytes to form the final
+ compressed byte sequence:
+
+ * Data elements are packed into bytes in order of
+ increasing bit number within the byte, i.e., starting
+ with the least-significant bit of the byte.
+ * Data elements other than Huffman codes are packed
+ starting with the least-significant bit of the data
+ element.
+ * Huffman codes are packed starting with the most-
+ significant bit of the code.
+
+ In other words, if one were to print out the compressed data as
+ a sequence of bytes, starting with the first byte at the
+ *right* margin and proceeding to the *left*, with the most-
+ significant bit of each byte on the left as usual, one would be
+ able to parse the result from right to left, with fixed-width
+ elements in the correct MSB-to-LSB order and Huffman codes in
+ bit-reversed order (i.e., with the first bit of the code in the
+ relative LSB position).
+
+ 3.2. Compressed block format
+
+ 3.2.1. Synopsis of prefix and Huffman coding
+
+ Prefix coding represents symbols from an a priori known
+ alphabet by bit sequences (codes), one code for each symbol, in
+ a manner such that different symbols may be represented by bit
+ sequences of different lengths, but a parser can always parse
+ an encoded string unambiguously symbol-by-symbol.
+
+ We define a prefix code in terms of a binary tree in which the
+ two edges descending from each non-leaf node are labeled 0 and
+ 1 and in which the leaf nodes correspond one-for-one with (are
+ labeled with) the symbols of the alphabet; then the code for a
+ symbol is the sequence of 0's and 1's on the edges leading from
+ the root to the leaf labeled with that symbol. For example:
+
+
+
+
+
+
+
+
+
+
+
+Deutsch Informational [Page 6]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ /\ Symbol Code
+ 0 1 ------ ----
+ / \ A 00
+ /\ B B 1
+ 0 1 C 011
+ / \ D 010
+ A /\
+ 0 1
+ / \
+ D C
+
+ A parser can decode the next symbol from an encoded input
+ stream by walking down the tree from the root, at each step
+ choosing the edge corresponding to the next input bit.
+
+ Given an alphabet with known symbol frequencies, the Huffman
+ algorithm allows the construction of an optimal prefix code
+ (one which represents strings with those symbol frequencies
+ using the fewest bits of any possible prefix codes for that
+ alphabet). Such a code is called a Huffman code. (See
+ reference [1] in Chapter 5, references for additional
+ information on Huffman codes.)
+
+ Note that in the "deflate" format, the Huffman codes for the
+ various alphabets must not exceed certain maximum code lengths.
+ This constraint complicates the algorithm for computing code
+ lengths from symbol frequencies. Again, see Chapter 5,
+ references for details.
+
+ 3.2.2. Use of Huffman coding in the "deflate" format
+
+ The Huffman codes used for each alphabet in the "deflate"
+ format have two additional rules:
+
+ * All codes of a given bit length have lexicographically
+ consecutive values, in the same order as the symbols
+ they represent;
+
+ * Shorter codes lexicographically precede longer codes.
+
+
+
+
+
+
+
+
+
+
+
+
+Deutsch Informational [Page 7]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ We could recode the example above to follow this rule as
+ follows, assuming that the order of the alphabet is ABCD:
+
+ Symbol Code
+ ------ ----
+ A 10
+ B 0
+ C 110
+ D 111
+
+ I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are
+ lexicographically consecutive.
+
+ Given this rule, we can define the Huffman code for an alphabet
+ just by giving the bit lengths of the codes for each symbol of
+ the alphabet in order; this is sufficient to determine the
+ actual codes. In our example, the code is completely defined
+ by the sequence of bit lengths (2, 1, 3, 3). The following
+ algorithm generates the codes as integers, intended to be read
+ from most- to least-significant bit. The code lengths are
+ initially in tree[I].Len; the codes are produced in
+ tree[I].Code.
+
+ 1) Count the number of codes for each code length. Let
+ bl_count[N] be the number of codes of length N, N >= 1.
+
+ 2) Find the numerical value of the smallest code for each
+ code length:
+
+ code = 0;
+ bl_count[0] = 0;
+ for (bits = 1; bits <= MAX_BITS; bits++) {
+ code = (code + bl_count[bits-1]) << 1;
+ next_code[bits] = code;
+ }
+
+ 3) Assign numerical values to all codes, using consecutive
+ values for all codes of the same length with the base
+ values determined at step 2. Codes that are never used
+ (which have a bit length of zero) must not be assigned a
+ value.
+
+ for (n = 0; n <= max_code; n++) {
+ len = tree[n].Len;
+ if (len != 0) {
+ tree[n].Code = next_code[len];
+ next_code[len]++;
+ }
+
+
+
+Deutsch Informational [Page 8]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ }
+
+ Example:
+
+ Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3,
+ 3, 2, 4, 4). After step 1, we have:
+
+ N bl_count[N]
+ - -----------
+ 2 1
+ 3 5
+ 4 2
+
+ Step 2 computes the following next_code values:
+
+ N next_code[N]
+ - ------------
+ 1 0
+ 2 0
+ 3 2
+ 4 14
+
+ Step 3 produces the following code values:
+
+ Symbol Length Code
+ ------ ------ ----
+ A 3 010
+ B 3 011
+ C 3 100
+ D 3 101
+ E 3 110
+ F 2 00
+ G 4 1110
+ H 4 1111
+
+ 3.2.3. Details of block format
+
+ Each block of compressed data begins with 3 header bits
+ containing the following data:
+
+ first bit BFINAL
+ next 2 bits BTYPE
+
+ Note that the header bits do not necessarily begin on a byte
+ boundary, since a block does not necessarily occupy an integral
+ number of bytes.
+
+
+
+
+
+Deutsch Informational [Page 9]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ BFINAL is set if and only if this is the last block of the data
+ set.
+
+ BTYPE specifies how the data are compressed, as follows:
+
+ 00 - no compression
+ 01 - compressed with fixed Huffman codes
+ 10 - compressed with dynamic Huffman codes
+ 11 - reserved (error)
+
+ The only difference between the two compressed cases is how the
+ Huffman codes for the literal/length and distance alphabets are
+ defined.
+
+ In all cases, the decoding algorithm for the actual data is as
+ follows:
+
+ do
+ read block header from input stream.
+ if stored with no compression
+ skip any remaining bits in current partially
+ processed byte
+ read LEN and NLEN (see next section)
+ copy LEN bytes of data to output
+ otherwise
+ if compressed with dynamic Huffman codes
+ read representation of code trees (see
+ subsection below)
+ loop (until end of block code recognized)
+ decode literal/length value from input stream
+ if value < 256
+ copy value (literal byte) to output stream
+ otherwise
+ if value = end of block (256)
+ break from loop
+ otherwise (value = 257..285)
+ decode distance from input stream
+
+ move backwards distance bytes in the output
+ stream, and copy length bytes from this
+ position to the output stream.
+ end loop
+ while not last block
+
+ Note that a duplicated string reference may refer to a string
+ in a previous block; i.e., the backward distance may cross one
+ or more block boundaries. However a distance cannot refer past
+ the beginning of the output stream. (An application using a
+
+
+
+Deutsch Informational [Page 10]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ preset dictionary might discard part of the output stream; a
+ distance can refer to that part of the output stream anyway)
+ Note also that the referenced string may overlap the current
+ position; for example, if the last 2 bytes decoded have values
+ X and Y, a string reference with <length = 5, distance = 2>
+ adds X,Y,X,Y,X to the output stream.
+
+ We now specify each compression method in turn.
+
+ 3.2.4. Non-compressed blocks (BTYPE=00)
+
+ Any bits of input up to the next byte boundary are ignored.
+ The rest of the block consists of the following information:
+
+ 0 1 2 3 4...
+ +---+---+---+---+================================+
+ | LEN | NLEN |... LEN bytes of literal data...|
+ +---+---+---+---+================================+
+
+ LEN is the number of data bytes in the block. NLEN is the
+ one's complement of LEN.
+
+ 3.2.5. Compressed blocks (length and distance codes)
+
+ As noted above, encoded data blocks in the "deflate" format
+ consist of sequences of symbols drawn from three conceptually
+ distinct alphabets: either literal bytes, from the alphabet of
+ byte values (0..255), or <length, backward distance> pairs,
+ where the length is drawn from (3..258) and the distance is
+ drawn from (1..32,768). In fact, the literal and length
+ alphabets are merged into a single alphabet (0..285), where
+ values 0..255 represent literal bytes, the value 256 indicates
+ end-of-block, and values 257..285 represent length codes
+ (possibly in conjunction with extra bits following the symbol
+ code) as follows:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Deutsch Informational [Page 11]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ Extra Extra Extra
+ Code Bits Length(s) Code Bits Lengths Code Bits Length(s)
+ ---- ---- ------ ---- ---- ------- ---- ---- -------
+ 257 0 3 267 1 15,16 277 4 67-82
+ 258 0 4 268 1 17,18 278 4 83-98
+ 259 0 5 269 2 19-22 279 4 99-114
+ 260 0 6 270 2 23-26 280 4 115-130
+ 261 0 7 271 2 27-30 281 5 131-162
+ 262 0 8 272 2 31-34 282 5 163-194
+ 263 0 9 273 3 35-42 283 5 195-226
+ 264 0 10 274 3 43-50 284 5 227-257
+ 265 1 11,12 275 3 51-58 285 0 258
+ 266 1 13,14 276 3 59-66
+
+ The extra bits should be interpreted as a machine integer
+ stored with the most-significant bit first, e.g., bits 1110
+ represent the value 14.
+
+ Extra Extra Extra
+ Code Bits Dist Code Bits Dist Code Bits Distance
+ ---- ---- ---- ---- ---- ------ ---- ---- --------
+ 0 0 1 10 4 33-48 20 9 1025-1536
+ 1 0 2 11 4 49-64 21 9 1537-2048
+ 2 0 3 12 5 65-96 22 10 2049-3072
+ 3 0 4 13 5 97-128 23 10 3073-4096
+ 4 1 5,6 14 6 129-192 24 11 4097-6144
+ 5 1 7,8 15 6 193-256 25 11 6145-8192
+ 6 2 9-12 16 7 257-384 26 12 8193-12288
+ 7 2 13-16 17 7 385-512 27 12 12289-16384
+ 8 3 17-24 18 8 513-768 28 13 16385-24576
+ 9 3 25-32 19 8 769-1024 29 13 24577-32768
+
+ 3.2.6. Compression with fixed Huffman codes (BTYPE=01)
+
+ The Huffman codes for the two alphabets are fixed, and are not
+ represented explicitly in the data. The Huffman code lengths
+ for the literal/length alphabet are:
+
+ Lit Value Bits Codes
+ --------- ---- -----
+ 0 - 143 8 00110000 through
+ 10111111
+ 144 - 255 9 110010000 through
+ 111111111
+ 256 - 279 7 0000000 through
+ 0010111
+ 280 - 287 8 11000000 through
+ 11000111
+
+
+
+Deutsch Informational [Page 12]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ The code lengths are sufficient to generate the actual codes,
+ as described above; we show the codes in the table for added
+ clarity. Literal/length values 286-287 will never actually
+ occur in the compressed data, but participate in the code
+ construction.
+
+ Distance codes 0-31 are represented by (fixed-length) 5-bit
+ codes, with possible additional bits as shown in the table
+ shown in Paragraph 3.2.5, above. Note that distance codes 30-
+ 31 will never actually occur in the compressed data.
+
+ 3.2.7. Compression with dynamic Huffman codes (BTYPE=10)
+
+ The Huffman codes for the two alphabets appear in the block
+ immediately after the header bits and before the actual
+ compressed data, first the literal/length code and then the
+ distance code. Each code is defined by a sequence of code
+ lengths, as discussed in Paragraph 3.2.2, above. For even
+ greater compactness, the code length sequences themselves are
+ compressed using a Huffman code. The alphabet for code lengths
+ is as follows:
+
+ 0 - 15: Represent code lengths of 0 - 15
+ 16: Copy the previous code length 3 - 6 times.
+ The next 2 bits indicate repeat length
+ (0 = 3, ... , 3 = 6)
+ Example: Codes 8, 16 (+2 bits 11),
+ 16 (+2 bits 10) will expand to
+ 12 code lengths of 8 (1 + 6 + 5)
+ 17: Repeat a code length of 0 for 3 - 10 times.
+ (3 bits of length)
+ 18: Repeat a code length of 0 for 11 - 138 times
+ (7 bits of length)
+
+ A code length of 0 indicates that the corresponding symbol in
+ the literal/length or distance alphabet will not occur in the
+ block, and should not participate in the Huffman code
+ construction algorithm given earlier. If only one distance
+ code is used, it is encoded using one bit, not zero bits; in
+ this case there is a single code length of one, with one unused
+ code. One distance code of zero bits means that there are no
+ distance codes used at all (the data is all literals).
+
+ We can now define the format of the block:
+
+ 5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286)
+ 5 Bits: HDIST, # of Distance codes - 1 (1 - 32)
+ 4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19)
+
+
+
+Deutsch Informational [Page 13]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ (HCLEN + 4) x 3 bits: code lengths for the code length
+ alphabet given just above, in the order: 16, 17, 18,
+ 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+
+ These code lengths are interpreted as 3-bit integers
+ (0-7); as above, a code length of 0 means the
+ corresponding symbol (literal/length or distance code
+ length) is not used.
+
+ HLIT + 257 code lengths for the literal/length alphabet,
+ encoded using the code length Huffman code
+
+ HDIST + 1 code lengths for the distance alphabet,
+ encoded using the code length Huffman code
+
+ The actual compressed data of the block,
+ encoded using the literal/length and distance Huffman
+ codes
+
+ The literal/length symbol 256 (end of data),
+ encoded using the literal/length Huffman code
+
+ The code length repeat codes can cross from HLIT + 257 to the
+ HDIST + 1 code lengths. In other words, all code lengths form
+ a single sequence of HLIT + HDIST + 258 values.
+
+ 3.3. Compliance
+
+ A compressor may limit further the ranges of values specified in
+ the previous section and still be compliant; for example, it may
+ limit the range of backward pointers to some value smaller than
+ 32K. Similarly, a compressor may limit the size of blocks so that
+ a compressible block fits in memory.
+
+ A compliant decompressor must accept the full range of possible
+ values defined in the previous section, and must accept blocks of
+ arbitrary size.
+
+4. Compression algorithm details
+
+ While it is the intent of this document to define the "deflate"
+ compressed data format without reference to any particular
+ compression algorithm, the format is related to the compressed
+ formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below);
+ since many variations of LZ77 are patented, it is strongly
+ recommended that the implementor of a compressor follow the general
+ algorithm presented here, which is known not to be patented per se.
+ The material in this section is not part of the definition of the
+
+
+
+Deutsch Informational [Page 14]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+ specification per se, and a compressor need not follow it in order to
+ be compliant.
+
+ The compressor terminates a block when it determines that starting a
+ new block with fresh trees would be useful, or when the block size
+ fills up the compressor's block buffer.
+
+ The compressor uses a chained hash table to find duplicated strings,
+ using a hash function that operates on 3-byte sequences. At any
+ given point during compression, let XYZ be the next 3 input bytes to
+ be examined (not necessarily all different, of course). First, the
+ compressor examines the hash chain for XYZ. If the chain is empty,
+ the compressor simply writes out X as a literal byte and advances one
+ byte in the input. If the hash chain is not empty, indicating that
+ the sequence XYZ (or, if we are unlucky, some other 3 bytes with the
+ same hash function value) has occurred recently, the compressor
+ compares all strings on the XYZ hash chain with the actual input data
+ sequence starting at the current point, and selects the longest
+ match.
+
+ The compressor searches the hash chains starting with the most recent
+ strings, to favor small distances and thus take advantage of the
+ Huffman encoding. The hash chains are singly linked. There are no
+ deletions from the hash chains; the algorithm simply discards matches
+ that are too old. To avoid a worst-case situation, very long hash
+ chains are arbitrarily truncated at a certain length, determined by a
+ run-time parameter.
+
+ To improve overall compression, the compressor optionally defers the
+ selection of matches ("lazy matching"): after a match of length N has
+ been found, the compressor searches for a longer match starting at
+ the next input byte. If it finds a longer match, it truncates the
+ previous match to a length of one (thus producing a single literal
+ byte) and then emits the longer match. Otherwise, it emits the
+ original match, and, as described above, advances N bytes before
+ continuing.
+
+ Run-time parameters also control this "lazy match" procedure. If
+ compression ratio is most important, the compressor attempts a
+ complete second search regardless of the length of the first match.
+ In the normal case, if the current match is "long enough", the
+ compressor reduces the search for a longer match, thus speeding up
+ the process. If speed is most important, the compressor inserts new
+ strings in the hash table only when no match was found, or when the
+ match is not "too long". This degrades the compression ratio but
+ saves time since there are both fewer insertions and fewer searches.
+
+
+
+
+
+Deutsch Informational [Page 15]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+5. References
+
+ [1] Huffman, D. A., "A Method for the Construction of Minimum
+ Redundancy Codes", Proceedings of the Institute of Radio
+ Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101.
+
+ [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data
+ Compression", IEEE Transactions on Information Theory, Vol. 23,
+ No. 3, pp. 337-343.
+
+ [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources,
+ available in ftp://ftp.uu.net/pub/archiving/zip/doc/
+
+ [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources,
+ available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/
+
+ [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix
+ encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169.
+
+ [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes,"
+ Comm. ACM, 33,4, April 1990, pp. 449-459.
+
+6. Security Considerations
+
+ Any data compression method involves the reduction of redundancy in
+ the data. Consequently, any corruption of the data is likely to have
+ severe effects and be difficult to correct. Uncompressed text, on
+ the other hand, will probably still be readable despite the presence
+ of some corrupted bytes.
+
+ It is recommended that systems using this data format provide some
+ means of validating the integrity of the compressed data. See
+ reference [3], for example.
+
+7. Source code
+
+ Source code for a C language implementation of a "deflate" compliant
+ compressor and decompressor is available within the zlib package at
+ ftp://ftp.uu.net/pub/archiving/zip/zlib/.
+
+8. Acknowledgements
+
+ Trademarks cited in this document are the property of their
+ respective owners.
+
+ Phil Katz designed the deflate format. Jean-Loup Gailly and Mark
+ Adler wrote the related software described in this specification.
+ Glenn Randers-Pehrson converted this document to RFC and HTML format.
+
+
+
+Deutsch Informational [Page 16]
+
+RFC 1951 DEFLATE Compressed Data Format Specification May 1996
+
+
+9. Author's Address
+
+ L. Peter Deutsch
+ Aladdin Enterprises
+ 203 Santa Margarita Ave.
+ Menlo Park, CA 94025
+
+ Phone: (415) 322-0103 (AM only)
+ FAX: (415) 322-1734
+ EMail: <ghost@aladdin.com>
+
+ Questions about the technical content of this specification can be
+ sent by email to:
+
+ Jean-Loup Gailly <gzip@prep.ai.mit.edu> and
+ Mark Adler <madler@alumni.caltech.edu>
+
+ Editorial comments on this specification can be sent by email to:
+
+ L. Peter Deutsch <ghost@aladdin.com> and
+ Glenn Randers-Pehrson <randeg@alumni.rpi.edu>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Deutsch Informational [Page 17]
+
diff --git a/cpukit/zlib/doc/rfc1952.txt b/cpukit/zlib/doc/rfc1952.txt
new file mode 100644
index 0000000000..a8e51b4567
--- /dev/null
+++ b/cpukit/zlib/doc/rfc1952.txt
@@ -0,0 +1,675 @@
+
+
+
+
+
+
+Network Working Group P. Deutsch
+Request for Comments: 1952 Aladdin Enterprises
+Category: Informational May 1996
+
+
+ GZIP file format specification version 4.3
+
+Status of This Memo
+
+ This memo provides information for the Internet community. This memo
+ does not specify an Internet standard of any kind. Distribution of
+ this memo is unlimited.
+
+IESG Note:
+
+ The IESG takes no position on the validity of any Intellectual
+ Property Rights statements contained in this document.
+
+Notices
+
+ Copyright (c) 1996 L. Peter Deutsch
+
+ Permission is granted to copy and distribute this document for any
+ purpose and without charge, including translations into other
+ languages and incorporation into compilations, provided that the
+ copyright notice and this notice are preserved, and that any
+ substantive changes or deletions from the original are clearly
+ marked.
+
+ A pointer to the latest version of this and related documentation in
+ HTML format can be found at the URL
+ <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>.
+
+Abstract
+
+ This specification defines a lossless compressed data format that is
+ compatible with the widely used GZIP utility. The format includes a
+ cyclic redundancy check value for detecting data corruption. The
+ format presently uses the DEFLATE method of compression but can be
+ easily extended to use other compression methods. The format can be
+ implemented readily in a manner not covered by patents.
+
+
+
+
+
+
+
+
+
+
+Deutsch Informational [Page 1]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+Table of Contents
+
+ 1. Introduction ................................................... 2
+ 1.1. Purpose ................................................... 2
+ 1.2. Intended audience ......................................... 3
+ 1.3. Scope ..................................................... 3
+ 1.4. Compliance ................................................ 3
+ 1.5. Definitions of terms and conventions used ................. 3
+ 1.6. Changes from previous versions ............................ 3
+ 2. Detailed specification ......................................... 4
+ 2.1. Overall conventions ....................................... 4
+ 2.2. File format ............................................... 5
+ 2.3. Member format ............................................. 5
+ 2.3.1. Member header and trailer ........................... 6
+ 2.3.1.1. Extra field ................................... 8
+ 2.3.1.2. Compliance .................................... 9
+ 3. References .................................................. 9
+ 4. Security Considerations .................................... 10
+ 5. Acknowledgements ........................................... 10
+ 6. Author's Address ........................................... 10
+ 7. Appendix: Jean-Loup Gailly's gzip utility .................. 11
+ 8. Appendix: Sample CRC Code .................................. 11
+
+1. Introduction
+
+ 1.1. Purpose
+
+ The purpose of this specification is to define a lossless
+ compressed data format that:
+
+ * Is independent of CPU type, operating system, file system,
+ and character set, and hence can be used for interchange;
+ * Can compress or decompress a data stream (as opposed to a
+ randomly accessible file) to produce another data stream,
+ using only an a priori bounded amount of intermediate
+ storage, and hence can be used in data communications or
+ similar structures such as Unix filters;
+ * Compresses data with efficiency comparable to the best
+ currently available general-purpose compression methods,
+ and in particular considerably better than the "compress"
+ program;
+ * Can be implemented readily in a manner not covered by
+ patents, and hence can be practiced freely;
+ * Is compatible with the file format produced by the current
+ widely used gzip utility, in that conforming decompressors
+ will be able to read data produced by the existing gzip
+ compressor.
+
+
+
+
+Deutsch Informational [Page 2]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ The data format defined by this specification does not attempt to:
+
+ * Provide random access to compressed data;
+ * Compress specialized data (e.g., raster graphics) as well as
+ the best currently available specialized algorithms.
+
+ 1.2. Intended audience
+
+ This specification is intended for use by implementors of software
+ to compress data into gzip format and/or decompress data from gzip
+ format.
+
+ The text of the specification assumes a basic background in
+ programming at the level of bits and other primitive data
+ representations.
+
+ 1.3. Scope
+
+ The specification specifies a compression method and a file format
+ (the latter assuming only that a file can store a sequence of
+ arbitrary bytes). It does not specify any particular interface to
+ a file system or anything about character sets or encodings
+ (except for file names and comments, which are optional).
+
+ 1.4. Compliance
+
+ Unless otherwise indicated below, a compliant decompressor must be
+ able to accept and decompress any file that conforms to all the
+ specifications presented here; a compliant compressor must produce
+ files that conform to all the specifications presented here. The
+ material in the appendices is not part of the specification per se
+ and is not relevant to compliance.
+
+ 1.5. Definitions of terms and conventions used
+
+ byte: 8 bits stored or transmitted as a unit (same as an octet).
+ (For this specification, a byte is exactly 8 bits, even on
+ machines which store a character on a number of bits different
+ from 8.) See below for the numbering of bits within a byte.
+
+ 1.6. Changes from previous versions
+
+ There have been no technical changes to the gzip format since
+ version 4.1 of this specification. In version 4.2, some
+ terminology was changed, and the sample CRC code was rewritten for
+ clarity and to eliminate the requirement for the caller to do pre-
+ and post-conditioning. Version 4.3 is a conversion of the
+ specification to RFC style.
+
+
+
+Deutsch Informational [Page 3]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+2. Detailed specification
+
+ 2.1. Overall conventions
+
+ In the diagrams below, a box like this:
+
+ +---+
+ | | <-- the vertical bars might be missing
+ +---+
+
+ represents one byte; a box like this:
+
+ +==============+
+ | |
+ +==============+
+
+ represents a variable number of bytes.
+
+ Bytes stored within a computer do not have a "bit order", since
+ they are always treated as a unit. However, a byte considered as
+ an integer between 0 and 255 does have a most- and least-
+ significant bit, and since we write numbers with the most-
+ significant digit on the left, we also write bytes with the most-
+ significant bit on the left. In the diagrams below, we number the
+ bits of a byte so that bit 0 is the least-significant bit, i.e.,
+ the bits are numbered:
+
+ +--------+
+ |76543210|
+ +--------+
+
+ This document does not address the issue of the order in which
+ bits of a byte are transmitted on a bit-sequential medium, since
+ the data format described here is byte- rather than bit-oriented.
+
+ Within a computer, a number may occupy multiple bytes. All
+ multi-byte numbers in the format described here are stored with
+ the least-significant byte first (at the lower memory address).
+ For example, the decimal number 520 is stored as:
+
+ 0 1
+ +--------+--------+
+ |00001000|00000010|
+ +--------+--------+
+ ^ ^
+ | |
+ | + more significant byte = 2 x 256
+ + less significant byte = 8
+
+
+
+Deutsch Informational [Page 4]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ 2.2. File format
+
+ A gzip file consists of a series of "members" (compressed data
+ sets). The format of each member is specified in the following
+ section. The members simply appear one after another in the file,
+ with no additional information before, between, or after them.
+
+ 2.3. Member format
+
+ Each member has the following structure:
+
+ +---+---+---+---+---+---+---+---+---+---+
+ |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->)
+ +---+---+---+---+---+---+---+---+---+---+
+
+ (if FLG.FEXTRA set)
+
+ +---+---+=================================+
+ | XLEN |...XLEN bytes of "extra field"...| (more-->)
+ +---+---+=================================+
+
+ (if FLG.FNAME set)
+
+ +=========================================+
+ |...original file name, zero-terminated...| (more-->)
+ +=========================================+
+
+ (if FLG.FCOMMENT set)
+
+ +===================================+
+ |...file comment, zero-terminated...| (more-->)
+ +===================================+
+
+ (if FLG.FHCRC set)
+
+ +---+---+
+ | CRC16 |
+ +---+---+
+
+ +=======================+
+ |...compressed blocks...| (more-->)
+ +=======================+
+
+ 0 1 2 3 4 5 6 7
+ +---+---+---+---+---+---+---+---+
+ | CRC32 | ISIZE |
+ +---+---+---+---+---+---+---+---+
+
+
+
+
+Deutsch Informational [Page 5]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ 2.3.1. Member header and trailer
+
+ ID1 (IDentification 1)
+ ID2 (IDentification 2)
+ These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139
+ (0x8b, \213), to identify the file as being in gzip format.
+
+ CM (Compression Method)
+ This identifies the compression method used in the file. CM
+ = 0-7 are reserved. CM = 8 denotes the "deflate"
+ compression method, which is the one customarily used by
+ gzip and which is documented elsewhere.
+
+ FLG (FLaGs)
+ This flag byte is divided into individual bits as follows:
+
+ bit 0 FTEXT
+ bit 1 FHCRC
+ bit 2 FEXTRA
+ bit 3 FNAME
+ bit 4 FCOMMENT
+ bit 5 reserved
+ bit 6 reserved
+ bit 7 reserved
+
+ If FTEXT is set, the file is probably ASCII text. This is
+ an optional indication, which the compressor may set by
+ checking a small amount of the input data to see whether any
+ non-ASCII characters are present. In case of doubt, FTEXT
+ is cleared, indicating binary data. For systems which have
+ different file formats for ascii text and binary data, the
+ decompressor can use FTEXT to choose the appropriate format.
+ We deliberately do not specify the algorithm used to set
+ this bit, since a compressor always has the option of
+ leaving it cleared and a decompressor always has the option
+ of ignoring it and letting some other program handle issues
+ of data conversion.
+
+ If FHCRC is set, a CRC16 for the gzip header is present,
+ immediately before the compressed data. The CRC16 consists
+ of the two least significant bytes of the CRC32 for all
+ bytes of the gzip header up to and not including the CRC16.
+ [The FHCRC bit was never set by versions of gzip up to
+ 1.2.4, even though it was documented with a different
+ meaning in gzip 1.2.4.]
+
+ If FEXTRA is set, optional extra fields are present, as
+ described in a following section.
+
+
+
+Deutsch Informational [Page 6]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ If FNAME is set, an original file name is present,
+ terminated by a zero byte. The name must consist of ISO
+ 8859-1 (LATIN-1) characters; on operating systems using
+ EBCDIC or any other character set for file names, the name
+ must be translated to the ISO LATIN-1 character set. This
+ is the original name of the file being compressed, with any
+ directory components removed, and, if the file being
+ compressed is on a file system with case insensitive names,
+ forced to lower case. There is no original file name if the
+ data was compressed from a source other than a named file;
+ for example, if the source was stdin on a Unix system, there
+ is no file name.
+
+ If FCOMMENT is set, a zero-terminated file comment is
+ present. This comment is not interpreted; it is only
+ intended for human consumption. The comment must consist of
+ ISO 8859-1 (LATIN-1) characters. Line breaks should be
+ denoted by a single line feed character (10 decimal).
+
+ Reserved FLG bits must be zero.
+
+ MTIME (Modification TIME)
+ This gives the most recent modification time of the original
+ file being compressed. The time is in Unix format, i.e.,
+ seconds since 00:00:00 GMT, Jan. 1, 1970. (Note that this
+ may cause problems for MS-DOS and other systems that use
+ local rather than Universal time.) If the compressed data
+ did not come from a file, MTIME is set to the time at which
+ compression started. MTIME = 0 means no time stamp is
+ available.
+
+ XFL (eXtra FLags)
+ These flags are available for use by specific compression
+ methods. The "deflate" method (CM = 8) sets these flags as
+ follows:
+
+ XFL = 2 - compressor used maximum compression,
+ slowest algorithm
+ XFL = 4 - compressor used fastest algorithm
+
+ OS (Operating System)
+ This identifies the type of file system on which compression
+ took place. This may be useful in determining end-of-line
+ convention for text files. The currently defined values are
+ as follows:
+
+
+
+
+
+
+Deutsch Informational [Page 7]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ 0 - FAT filesystem (MS-DOS, OS/2, NT/Win32)
+ 1 - Amiga
+ 2 - VMS (or OpenVMS)
+ 3 - Unix
+ 4 - VM/CMS
+ 5 - Atari TOS
+ 6 - HPFS filesystem (OS/2, NT)
+ 7 - Macintosh
+ 8 - Z-System
+ 9 - CP/M
+ 10 - TOPS-20
+ 11 - NTFS filesystem (NT)
+ 12 - QDOS
+ 13 - Acorn RISCOS
+ 255 - unknown
+
+ XLEN (eXtra LENgth)
+ If FLG.FEXTRA is set, this gives the length of the optional
+ extra field. See below for details.
+
+ CRC32 (CRC-32)
+ This contains a Cyclic Redundancy Check value of the
+ uncompressed data computed according to CRC-32 algorithm
+ used in the ISO 3309 standard and in section 8.1.1.6.2 of
+ ITU-T recommendation V.42. (See http://www.iso.ch for
+ ordering ISO documents. See gopher://info.itu.ch for an
+ online version of ITU-T V.42.)
+
+ ISIZE (Input SIZE)
+ This contains the size of the original (uncompressed) input
+ data modulo 2^32.
+
+ 2.3.1.1. Extra field
+
+ If the FLG.FEXTRA bit is set, an "extra field" is present in
+ the header, with total length XLEN bytes. It consists of a
+ series of subfields, each of the form:
+
+ +---+---+---+---+==================================+
+ |SI1|SI2| LEN |... LEN bytes of subfield data ...|
+ +---+---+---+---+==================================+
+
+ SI1 and SI2 provide a subfield ID, typically two ASCII letters
+ with some mnemonic value. Jean-Loup Gailly
+ <gzip@prep.ai.mit.edu> is maintaining a registry of subfield
+ IDs; please send him any subfield ID you wish to use. Subfield
+ IDs with SI2 = 0 are reserved for future use. The following
+ IDs are currently defined:
+
+
+
+Deutsch Informational [Page 8]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ SI1 SI2 Data
+ ---------- ---------- ----
+ 0x41 ('A') 0x70 ('P') Apollo file type information
+
+ LEN gives the length of the subfield data, excluding the 4
+ initial bytes.
+
+ 2.3.1.2. Compliance
+
+ A compliant compressor must produce files with correct ID1,
+ ID2, CM, CRC32, and ISIZE, but may set all the other fields in
+ the fixed-length part of the header to default values (255 for
+ OS, 0 for all others). The compressor must set all reserved
+ bits to zero.
+
+ A compliant decompressor must check ID1, ID2, and CM, and
+ provide an error indication if any of these have incorrect
+ values. It must examine FEXTRA/XLEN, FNAME, FCOMMENT and FHCRC
+ at least so it can skip over the optional fields if they are
+ present. It need not examine any other part of the header or
+ trailer; in particular, a decompressor may ignore FTEXT and OS
+ and always produce binary output, and still be compliant. A
+ compliant decompressor must give an error indication if any
+ reserved bit is non-zero, since such a bit could indicate the
+ presence of a new field that would cause subsequent data to be
+ interpreted incorrectly.
+
+3. References
+
+ [1] "Information Processing - 8-bit single-byte coded graphic
+ character sets - Part 1: Latin alphabet No.1" (ISO 8859-1:1987).
+ The ISO 8859-1 (Latin-1) character set is a superset of 7-bit
+ ASCII. Files defining this character set are available as
+ iso_8859-1.* in ftp://ftp.uu.net/graphics/png/documents/
+
+ [2] ISO 3309
+
+ [3] ITU-T recommendation V.42
+
+ [4] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification",
+ available in ftp://ftp.uu.net/pub/archiving/zip/doc/
+
+ [5] Gailly, J.-L., GZIP documentation, available as gzip-*.tar in
+ ftp://prep.ai.mit.edu/pub/gnu/
+
+ [6] Sarwate, D.V., "Computation of Cyclic Redundancy Checks via Table
+ Look-Up", Communications of the ACM, 31(8), pp.1008-1013.
+
+
+
+
+Deutsch Informational [Page 9]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ [7] Schwaderer, W.D., "CRC Calculation", April 85 PC Tech Journal,
+ pp.118-133.
+
+ [8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3.txt,
+ describing the CRC concept.
+
+4. Security Considerations
+
+ Any data compression method involves the reduction of redundancy in
+ the data. Consequently, any corruption of the data is likely to have
+ severe effects and be difficult to correct. Uncompressed text, on
+ the other hand, will probably still be readable despite the presence
+ of some corrupted bytes.
+
+ It is recommended that systems using this data format provide some
+ means of validating the integrity of the compressed data, such as by
+ setting and checking the CRC-32 check value.
+
+5. Acknowledgements
+
+ Trademarks cited in this document are the property of their
+ respective owners.
+
+ Jean-Loup Gailly designed the gzip format and wrote, with Mark Adler,
+ the related software described in this specification. Glenn
+ Randers-Pehrson converted this document to RFC and HTML format.
+
+6. Author's Address
+
+ L. Peter Deutsch
+ Aladdin Enterprises
+ 203 Santa Margarita Ave.
+ Menlo Park, CA 94025
+
+ Phone: (415) 322-0103 (AM only)
+ FAX: (415) 322-1734
+ EMail: <ghost@aladdin.com>
+
+ Questions about the technical content of this specification can be
+ sent by email to:
+
+ Jean-Loup Gailly <gzip@prep.ai.mit.edu> and
+ Mark Adler <madler@alumni.caltech.edu>
+
+ Editorial comments on this specification can be sent by email to:
+
+ L. Peter Deutsch <ghost@aladdin.com> and
+ Glenn Randers-Pehrson <randeg@alumni.rpi.edu>
+
+
+
+Deutsch Informational [Page 10]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+7. Appendix: Jean-Loup Gailly's gzip utility
+
+ The most widely used implementation of gzip compression, and the
+ original documentation on which this specification is based, were
+ created by Jean-Loup Gailly <gzip@prep.ai.mit.edu>. Since this
+ implementation is a de facto standard, we mention some more of its
+ features here. Again, the material in this section is not part of
+ the specification per se, and implementations need not follow it to
+ be compliant.
+
+ When compressing or decompressing a file, gzip preserves the
+ protection, ownership, and modification time attributes on the local
+ file system, since there is no provision for representing protection
+ attributes in the gzip file format itself. Since the file format
+ includes a modification time, the gzip decompressor provides a
+ command line switch that assigns the modification time from the file,
+ rather than the local modification time of the compressed input, to
+ the decompressed output.
+
+8. Appendix: Sample CRC Code
+
+ The following sample code represents a practical implementation of
+ the CRC (Cyclic Redundancy Check). (See also ISO 3309 and ITU-T V.42
+ for a formal specification.)
+
+ The sample code is in the ANSI C programming language. Non C users
+ may find it easier to read with these hints:
+
+ & Bitwise AND operator.
+ ^ Bitwise exclusive-OR operator.
+ >> Bitwise right shift operator. When applied to an
+ unsigned quantity, as here, right shift inserts zero
+ bit(s) at the left.
+ ! Logical NOT operator.
+ ++ "n++" increments the variable n.
+ 0xNNN 0x introduces a hexadecimal (base 16) constant.
+ Suffix L indicates a long value (at least 32 bits).
+
+ /* Table of CRCs of all 8-bit messages. */
+ unsigned long crc_table[256];
+
+ /* Flag: has the table been computed? Initially false. */
+ int crc_table_computed = 0;
+
+ /* Make the table for a fast CRC. */
+ void make_crc_table(void)
+ {
+ unsigned long c;
+
+
+
+Deutsch Informational [Page 11]
+
+RFC 1952 GZIP File Format Specification May 1996
+
+
+ int n, k;
+ for (n = 0; n < 256; n++) {
+ c = (unsigned long) n;
+ for (k = 0; k < 8; k++) {
+ if (c & 1) {
+ c = 0xedb88320L ^ (c >> 1);
+ } else {
+ c = c >> 1;
+ }
+ }
+ crc_table[n] = c;
+ }
+ crc_table_computed = 1;
+ }
+
+ /*
+ Update a running crc with the bytes buf[0..len-1] and return
+ the updated crc. The crc should be initialized to zero. Pre- and
+ post-conditioning (one's complement) is performed within this
+ function so it shouldn't be done by the caller. Usage example:
+
+ unsigned long crc = 0L;
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = update_crc(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+ */
+ unsigned long update_crc(unsigned long crc,
+ unsigned char *buf, int len)
+ {
+ unsigned long c = crc ^ 0xffffffffL;
+ int n;
+
+ if (!crc_table_computed)
+ make_crc_table();
+ for (n = 0; n < len; n++) {
+ c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
+ }
+ return c ^ 0xffffffffL;
+ }
+
+ /* Return the CRC of the bytes buf[0..len-1]. */
+ unsigned long crc(unsigned char *buf, int len)
+ {
+ return update_crc(0L, buf, len);
+ }
+
+
+
+
+Deutsch Informational [Page 12]
+
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000000..7618377347
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,29 @@
+#
+# $Id$
+#
+# NOTE: This is just a stub.
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+target = @target@
+manext = 1
+mandir = @mandir@/man$(manext)
+program_prefix = @program_prefix@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+CLEAN_ADDITIONS += xxx-your-debris-goes-here
+CLOBBER_ADDITIONS +=
+
+all:
+
+install: all
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000000..ebc66913e9
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,250 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000000..0e29377310
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,35 @@
+#!/bin/sh
+# Make directory hierarchy.
+# Written by Noah Friedman <friedman@prep.ai.mit.edu>
+# Public domain.
+
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+errstatus=0
+
+for file in ${1+"$@"} ; do
+ oIFS="${IFS}"
+ # Some sh's can't handle IFS=/ for some reason.
+ IFS='%'
+ set - `echo ${file} | sed -e 's@/@%@g' -e 's@^%@/@'`
+ IFS="${oIFS}"
+
+ pathcomp=''
+
+ for d in ${1+"$@"} ; do
+ pathcomp="${pathcomp}${d}"
+
+ if test ! -d "${pathcomp}"; then
+ echo "mkdir $pathcomp" 1>&2
+ mkdir "${pathcomp}" || errstatus=$?
+ fi
+
+ pathcomp="${pathcomp}/"
+ done
+done
+
+exit $errstatus
+
+# eof
diff --git a/testsuites/README b/testsuites/README
new file mode 100644
index 0000000000..f799370569
--- /dev/null
+++ b/testsuites/README
@@ -0,0 +1,44 @@
+#
+# $Id$
+#
+
+This is the directory under which the RTEMS
+test programs provided with the release are located. The
+following is a description of the contents of each file and
+subdirectory directly in this directory:
+
+NOTE: Other than the 'samples' directory these tests are intended
+ only to exercise RTEMS features and are *not* good examples
+ of programming for RTEMS.
+
+ samples
+
+ This directory contains a set of simple sample applications
+ which can be used either to test a board support package
+ or as the starting point for a custom application.
+
+ mptests
+
+ This directory contains the RTEMS Multiprocessor Test Suite.
+ The tests in this directory provide near complete (98%+) test
+ coverage of the multiprocessor specific code in RTEMS.
+
+ psxtests
+
+ This directory contains the RTEMS POSIX API Test Suite.
+ The tests in this directory test the POSIX API support in RTEMS.
+
+ sptests
+
+ This directory contains the RTEMS Single Processor Test Suite.
+ The tests in this directory provide near complete (98%+) test
+ coverage of the non-multiprocessor code in RTEMS.
+
+ tmtests
+
+ This directory contains the RTEMS Timing Test Suite.
+ The tests in this directory are used to measure the execution
+ time of RTEMS directive and some critical internal functions.
+ The results of these test are reported in the Fact Sheets
+ and Supplental Manuals.
+
diff --git a/testsuites/libtests/README b/testsuites/libtests/README
new file mode 100644
index 0000000000..bc4b217832
--- /dev/null
+++ b/testsuites/libtests/README
@@ -0,0 +1,10 @@
+#
+# $Id$
+#
+
+This directory contains tests for some of the items in
+the lib directories. The intent is to be able to
+verify the basic functionality of a library. For example,
+it is important to know that the stack checker successfully
+detects tasks which both stay within and exceed their
+stack limits.
diff --git a/testsuites/libtests/cpuuse/cpuuse.scn b/testsuites/libtests/cpuuse/cpuuse.scn
new file mode 100644
index 0000000000..f104c0c482
--- /dev/null
+++ b/testsuites/libtests/cpuuse/cpuuse.scn
@@ -0,0 +1,24 @@
+*** TEST 4 ***
+TA1 - 09:15:00 12/31/1988
+TA1 - rtems_task_suspend - on Task 2
+TA1 - rtems_task_suspend - on Task 3
+TA1 - killing time
+TA1 - rtems_task_resume - on Task 2
+TA1 - rtems_task_resume - on Task 3
+TA2 - 09:15:03 12/31/1988
+TA3 - 09:15:04 12/31/1988
+TA1 - 09:15:05 12/31/1988
+TA2 - 09:15:06 12/31/1988
+TA3 - 09:15:07 12/31/1988
+TA1 - 09:15:08 12/31/1988
+TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT
+TA1 - 09:15:09 12/31/1988
+TA1 - 09:15:10 12/31/1988
+TA1 - 09:15:11 12/31/1988
+TA1 - 09:15:12 12/31/1988
+TA1 - 09:15:13 12/31/1988
+TA1 - 09:15:14 12/31/1988
+TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT
+TA2 - 09:15:15 12/31/1988
+TA3 - 09:15:16 12/31/1988
+*** END OF TEST 4 ***
diff --git a/testsuites/libtests/cpuuse/init.c b/testsuites/libtests/cpuuse/init.c
new file mode 100644
index 0000000000..743e32ccf9
--- /dev/null
+++ b/testsuites/libtests/cpuuse/init.c
@@ -0,0 +1,106 @@
+/*
+ * This is a clone of sp04 which has been modified to use the cpu monitoring
+ * library.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997. 1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * init.c,v 1.6 1996/02/13 22:16:22 joel Exp
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_extensions_table Extensions = {
+ NULL, /* task create user extension */
+ NULL, /* task start user extension */
+ NULL, /* task restart user extension */
+ NULL, /* task delete user extension */
+ Task_switch, /* task switch user extension */
+ NULL, /* task begin user extension */
+ NULL, /* task exitted user extension */
+ NULL /* fatal error user extension */
+};
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ puts( "\n\n*** CPU USAGE LIBRARY TEST ***" );
+ build_time( &time, 12, 31, 1988, 9, 15, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Extension_name[ 1 ] = rtems_build_name( 'E', 'X', 'T', ' ' );
+
+ status = rtems_extension_create(
+ Extension_name[ 1 ],
+ &Extensions,
+ &Extension_id[ 1 ]
+ );
+ directive_failed( status, "rtems_extension_create" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Run_count[ 1 ] = 0;
+ Run_count[ 2 ] = 0;
+ Run_count[ 3 ] = 0;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/libtests/cpuuse/system.h b/testsuites/libtests/cpuuse/system.h
new file mode 100644
index 0000000000..0f427edcda
--- /dev/null
+++ b/testsuites/libtests/cpuuse/system.h
@@ -0,0 +1,67 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * system.h,v 1.6 1995/12/19 20:18:39 joel Exp
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+void Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Extension_id[ 4 ];
+TEST_EXTERN rtems_name Extension_name[ 4 ]; /* array of task names */
+
+/* array of task run counts */
+TEST_EXTERN volatile rtems_unsigned32 Run_count[ 4 ];
+
+/* end of include file */
diff --git a/testsuites/libtests/cpuuse/task1.c b/testsuites/libtests/cpuuse/task1.c
new file mode 100644
index 0000000000..0c86e6bddf
--- /dev/null
+++ b/testsuites/libtests/cpuuse/task1.c
@@ -0,0 +1,103 @@
+/* Task_1
+ *
+ * This test serves as a test task. It verifies timeslicing activities
+ * and tswitch extension processing.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task1.c,v 1.6 1995/12/19 20:18:40 joel Exp
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 seconds;
+ rtems_unsigned32 old_seconds;
+ rtems_mode previous_mode;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ rtems_unsigned32 start_time;
+ rtems_unsigned32 end_time;
+
+ puts( "TA1 - rtems_task_suspend - on Task 2" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_suspend - on Task 3" );
+ status = rtems_task_suspend( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_suspend of TA3" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &start_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ puts( "TA1 - killing time" );
+
+ for ( ; ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &end_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( end_time > (start_time + 2) )
+ break;
+ }
+
+ puts( "TA1 - rtems_task_resume - on Task 2" );
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_resume of TA2" );
+
+ puts( "TA1 - rtems_task_resume - on Task 3" );
+ status = rtems_task_resume( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_resume of TA3" );
+
+ while ( FOREVER ) {
+ if ( Run_count[ 1 ] == 3 ) {
+ puts( "TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT" );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ old_seconds = time.second;
+
+ for ( seconds = 0 ; seconds < 6 ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second != old_seconds ) {
+ old_seconds = time.second;
+ seconds++;
+ print_time( "TA1 - ", &time, "\n" );
+ }
+ }
+
+ puts( "TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT" );
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ while ( FOREVER );
+ }
+ }
+}
diff --git a/testsuites/libtests/cpuuse/task2.c b/testsuites/libtests/cpuuse/task2.c
new file mode 100644
index 0000000000..4133eae42c
--- /dev/null
+++ b/testsuites/libtests/cpuuse/task2.c
@@ -0,0 +1,29 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task2.c,v 1.3 1995/12/19 20:18:42 joel Exp
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/testsuites/libtests/cpuuse/task3.c b/testsuites/libtests/cpuuse/task3.c
new file mode 100644
index 0000000000..cbf7e9a242
--- /dev/null
+++ b/testsuites/libtests/cpuuse/task3.c
@@ -0,0 +1,29 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task3.c,v 1.3 1995/12/19 20:18:43 joel Exp
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/testsuites/libtests/cpuuse/tswitch.c b/testsuites/libtests/cpuuse/tswitch.c
new file mode 100644
index 0000000000..4c208a35dd
--- /dev/null
+++ b/testsuites/libtests/cpuuse/tswitch.c
@@ -0,0 +1,62 @@
+/* Task_switch
+ *
+ * This routine is the tswitch user extension. It determines which
+ * task is being switched to and displays a message indicating the
+ * time and date that it gained control.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * heir - pointer to heir TCB
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * tswitch.c,v 1.4 1995/12/19 20:18:44 joel Exp
+ */
+
+#include "system.h"
+
+#include "cpuuse.h"
+
+rtems_extension Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+)
+{
+ rtems_unsigned32 index;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ index = task_number( heir->Object.id );
+
+ switch( index ) {
+ case 1:
+ case 2:
+ case 3:
+ Run_count[ index ] += 1;
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ index ], FALSE );
+ print_time( "- ", &time, "\n" );
+
+ if ( time.second >= 16 ) {
+ CPU_usage_Dump();
+ puts( "*** END OF CPU USAGE LIBRARY TEST ***" );
+ exit( 0 );
+ }
+ break;
+
+ case 0:
+ default:
+ break;
+ }
+}
diff --git a/testsuites/libtests/malloctest/init.c b/testsuites/libtests/malloctest/init.c
new file mode 100644
index 0000000000..a43766d3c6
--- /dev/null
+++ b/testsuites/libtests/malloctest/init.c
@@ -0,0 +1,114 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** MALLOC TEST ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], Task_1_through_5, 0 );
+ directive_failed( status, "rtems_task_start of TA5" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/libtests/malloctest/system.h b/testsuites/libtests/malloctest/system.h
new file mode 100644
index 0000000000..7b81f2adb9
--- /dev/null
+++ b/testsuites/libtests/malloctest/system.h
@@ -0,0 +1,49 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* macros */
+
+#define TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE*3)
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+);
+
+void blow_stack( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/libtests/malloctest/task1.c b/testsuites/libtests/malloctest/task1.c
new file mode 100644
index 0000000000..d18a748c25
--- /dev/null
+++ b/testsuites/libtests/malloctest/task1.c
@@ -0,0 +1,67 @@
+/* task1.c
+ *
+ * This set of three tasks do some simple task switching for about
+ * 15 seconds and then call a routine to "blow the stack".
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <libcsupport.h> /* for malloc_dump, malloc_walk */
+#include <string.h> /* for memset */
+
+#define NUM_PASSES 100
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+)
+{
+ int i;
+ unsigned int passes = 0;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ unsigned char *mem_ptr;
+ int mem_amt;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ while (TRUE)
+ {
+ if ( passes++ > NUM_PASSES )
+ exit(0);
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ mem_amt = rand() * task_number( tid );
+ printf("mallocing %d bytes\n",mem_amt);
+ mem_ptr = malloc ( mem_amt);
+ memset( mem_ptr, mem_amt, mem_amt );
+ malloc_dump();
+ malloc_walk(1,FALSE);
+ status = rtems_task_wake_after( task_number( tid ) * 1 * TICKS_PER_SECOND/4 );
+ for (i=0; i < mem_amt; i++)
+ {
+ if ( mem_ptr[i] != (mem_amt & 0xff))
+ {
+ printf("failed %d, %d, 0x%x, 0x%x\n",i,mem_amt,mem_ptr[i],mem_amt&0xff);
+ exit(1);
+ }
+ }
+ directive_failed( status, "rtems_task_wake_after" );
+ free( mem_ptr );
+ }
+}
diff --git a/testsuites/libtests/rtmonuse/getall.c b/testsuites/libtests/rtmonuse/getall.c
new file mode 100644
index 0000000000..a6081a70ca
--- /dev/null
+++ b/testsuites/libtests/rtmonuse/getall.c
@@ -0,0 +1,43 @@
+/* Get_all_counters
+ *
+ * This routine allows TA5 to atomically obtain the iteration counters.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * getall.c,v 1.3 1995/12/19 20:21:07 joel Exp
+ */
+
+#include "system.h"
+
+void Get_all_counters()
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode to RTEMS_NO_PREEMPT" );
+
+ Temporary_count = Count;
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_mode( RTEMS_PREEMPT, RTEMS_PREEMPT_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode to RTEMS_PREEMPT" );
+}
diff --git a/testsuites/libtests/rtmonuse/init.c b/testsuites/libtests/rtmonuse/init.c
new file mode 100644
index 0000000000..16527c2812
--- /dev/null
+++ b/testsuites/libtests/rtmonuse/init.c
@@ -0,0 +1,71 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * init.c,v 1.6 1995/12/19 20:21:09 joel Exp
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+#include "rtmonuse.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ puts( "\n\n*** RATE MONOTONIC PERIOD STATISTICS TEST ***" );
+ Period_usage_Initialize();
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_create(
+ Task_name[ index ],
+ Priorities[ index ],
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ (index == 5) ? RTEMS_FLOATING_POINT : RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+ }
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_start( Task_id[ index ], Task_1_through_5, index );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/libtests/rtmonuse/rtmonuse.scn b/testsuites/libtests/rtmonuse/rtmonuse.scn
new file mode 100644
index 0000000000..bb4e8814da
--- /dev/null
+++ b/testsuites/libtests/rtmonuse/rtmonuse.scn
@@ -0,0 +1,27 @@
+*** TEST 20 ***
+TA1 - rtems_rate_monotonic_create id = 0x28010001
+TA1 - rtems_rate_monotonic_ident id = 0x28010001
+TA1 - (0x28010001) period 2
+TA2 - rtems_rate_monotonic_create id = 0x28010002
+TA2 - rtems_rate_monotonic_ident id = 0x28010002
+TA2 - (0x28010002) period 2
+TA3 - rtems_rate_monotonic_create id = 0x28010003
+TA3 - rtems_rate_monotonic_ident id = 0x28010003
+TA3 - (0x28010003) period 2
+TA4 - rtems_rate_monotonic_create id = 0x28010004
+TA4 - rtems_rate_monotonic_ident id = 0x28010004
+TA4 - (0x28010004) period 2
+TA5 - rtems_rate_monotonic_create id = 0x28010005
+TA5 - rtems_rate_monotonic_ident id = 0x28010005
+TA5 - (0x28010005) period 100
+TA5 - PERIODS CHECK OK (1)
+TA5 - PERIODS CHECK OK (2)
+TA5 - PERIODS CHECK OK (3)
+TA5 - PERIODS CHECK OK (4)
+TA5 - PERIODS CHECK OK (5)
+TA5 - PERIODS CHECK OK (6)
+TA5 - PERIODS CHECK OK (7)
+TA5 - PERIODS CHECK OK (8)
+TA5 - PERIODS CHECK OK (9)
+TA5 - PERIODS CHECK OK (10)
+*** END OF TEST 20 ***
diff --git a/testsuites/libtests/rtmonuse/system.h b/testsuites/libtests/rtmonuse/system.h
new file mode 100644
index 0000000000..4563730893
--- /dev/null
+++ b/testsuites/libtests/rtmonuse/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* types */
+
+struct counters {
+ rtems_unsigned32 count[6];
+};
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+);
+
+void Get_all_counters( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INIT_TASK_PRIORITY 10
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+#define CONFIGURE_MAXIMUM_PERIODS 10
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN struct counters Count; /* iteration counters */
+TEST_EXTERN struct counters Temporary_count;
+extern rtems_task_priority Priorities[ 6 ];
+
+/* end of include file */
diff --git a/testsuites/libtests/rtmonuse/task1.c b/testsuites/libtests/rtmonuse/task1.c
new file mode 100644
index 0000000000..89ec308fce
--- /dev/null
+++ b/testsuites/libtests/rtmonuse/task1.c
@@ -0,0 +1,124 @@
+/* Task_1_through_5
+ *
+ * This routine serves as a test task for the period capabilities of the
+ * Rate Monotonic Manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * task1.c,v 1.3 1995/12/19 20:21:14 joel Exp
+ */
+
+#include "system.h"
+
+#include <cpuuse.h>
+#include "rtmonuse.h"
+
+rtems_unsigned32 Periods[6] = { 0, 2, 2, 2, 2, 100 };
+rtems_unsigned32 Iterations[6] = { 0, 50, 50, 50, 50, 1 };
+rtems_task_priority Priorities[6] = { 0, 1, 1, 3, 4, 5 };
+
+rtems_task Task_1_through_5(
+ rtems_unsigned32 argument
+)
+{
+ rtems_id rmid;
+ rtems_id test_rmid;
+ rtems_unsigned32 index;
+ rtems_unsigned32 pass;
+ rtems_unsigned32 failed;
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( argument, &rmid );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_create id = 0x%08x\n", rmid );
+
+ status = rtems_rate_monotonic_ident( argument, &test_rmid );
+ directive_failed( status, "rtems_rate_monotonic_ident" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_ident id = 0x%08x\n", test_rmid );
+
+ if ( rmid != test_rmid ) {
+ printf( "RMID's DO NOT MATCH (0x%x and 0x%x)\n", rmid, test_rmid );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- (0x%08x) period %d\n", rmid, Periods[ argument ] );
+
+ status = rtems_task_wake_after( 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ switch ( argument ) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ while ( FOREVER ) {
+ Period_usage_Update( rmid );
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+ Count.count[ argument ]++;
+ }
+ break;
+ case 5:
+ pass = 0;
+ failed = 0;
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 1 of TA5" );
+
+ Get_all_counters();
+
+ while ( FOREVER ) {
+ Period_usage_Update( rmid );
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 2 of TA5" );
+
+ Get_all_counters();
+
+ for( index = 1 ; index <= 4 ; index++ ) {
+ if ( Temporary_count.count[ index ] != Iterations[ index ] ) {
+ puts_nocr( "FAIL -- " );
+ put_name ( Task_name[ index ], FALSE );
+ printf ( " Actual=%d, Expected=%d\n",
+ Temporary_count.count[ index ],
+ Iterations[ index ]
+ );
+ failed += 1;
+ }
+ }
+
+ if ( failed == 5 )
+ exit( 0 );
+
+ pass += 1;
+
+ printf( "TA5 - PERIODS CHECK OK (%d)\n", pass );
+
+ fflush( stdout );
+
+ if ( pass == 10 ) {
+ puts( "*** END OF RATE MONOTONIC PERIOD STATISTICS TEST ***" );
+ CPU_usage_Dump();
+ Period_usage_Dump();
+ exit( 0 );
+ }
+
+ }
+ break;
+ }
+}
diff --git a/testsuites/libtests/stackchk/blow.c b/testsuites/libtests/stackchk/blow.c
new file mode 100644
index 0000000000..53bcc5b6e5
--- /dev/null
+++ b/testsuites/libtests/stackchk/blow.c
@@ -0,0 +1,49 @@
+/* task1.c
+ *
+ * This set of three tasks do some simple task switching for about
+ * 15 seconds and then call a routine to "blow the stack".
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+
+void b() {}
+
+void blow_stack( void )
+{
+ volatile unsigned32 *low, *high;
+ unsigned char *area;
+
+b();
+ /*
+ * Destroy the first and last 16 bytes of our stack... Hope it
+ * does not cause problems :)
+ */
+
+ area = (unsigned char *)_Thread_Executing->Start.Initial_stack.area;
+
+ low = (volatile unsigned32 *) (area + HEAP_OVERHEAD);
+ high = (volatile unsigned32 *)
+ (area + _Thread_Executing->Start.Initial_stack.size - 16);
+
+
+ low[0] = 0x11111111;
+ low[1] = 0x22222222;
+ low[2] = 0x33333333;
+ low[3] = 0x44444444;
+
+ high[0] = 0x55555555;
+ high[1] = 0x66666666;
+ high[2] = 0x77777777;
+ high[3] = 0x88888888;
+
+}
diff --git a/testsuites/libtests/stackchk/init.c b/testsuites/libtests/stackchk/init.c
new file mode 100644
index 0000000000..40fb30d124
--- /dev/null
+++ b/testsuites/libtests/stackchk/init.c
@@ -0,0 +1,86 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST STACK CHECKER ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ TASK_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/libtests/stackchk/stackchk.scn b/testsuites/libtests/stackchk/stackchk.scn
new file mode 100644
index 0000000000..84a5c5e342
--- /dev/null
+++ b/testsuites/libtests/stackchk/stackchk.scn
@@ -0,0 +1,9 @@
+*** TEST STACK CHECKER ***
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+---> error indictation
diff --git a/testsuites/libtests/stackchk/system.h b/testsuites/libtests/stackchk/system.h
new file mode 100644
index 0000000000..9afe054ec0
--- /dev/null
+++ b/testsuites/libtests/stackchk/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* macros */
+
+#define TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE*3)
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+);
+
+void blow_stack( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/libtests/stackchk/task1.c b/testsuites/libtests/stackchk/task1.c
new file mode 100644
index 0000000000..69fe9aa98d
--- /dev/null
+++ b/testsuites/libtests/stackchk/task1.c
@@ -0,0 +1,44 @@
+/* task1.c
+ *
+ * This set of three tasks do some simple task switching for about
+ * 15 seconds and then call a routine to "blow the stack".
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 15 && tid == Task_id[ 1 ] ) {
+ blow_stack();
+ }
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_wake_after( task_number( tid ) * 5 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/testsuites/mptests/README b/testsuites/mptests/README
new file mode 100644
index 0000000000..68cb459b55
--- /dev/null
+++ b/testsuites/mptests/README
@@ -0,0 +1,10 @@
+#
+# $Id$
+#
+
+This directory contains the RTEMS Multiprocessor Test Suite.
+The tests in this directory provide near complete (98%+) test
+coverage of the multiprocessor specific code in RTEMS.
+
+These tests are designed to test RTEMS in a two node configuration.
+
diff --git a/testsuites/mptests/mp01/init.c b/testsuites/mptests/mp01/init.c
new file mode 100644
index 0000000000..bedb37bb97
--- /dev/null
+++ b/testsuites/mptests/mp01/init.c
@@ -0,0 +1,96 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+ char c;
+
+ printf(
+ "\n\n*** TEST 1 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ if ( Multiprocessing_configuration.node != 1 ) c = 'S';
+ else c = 'M';
+
+ Task_name[ 1 ] = rtems_build_name( c, 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( c, 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( c, 'A', '3', ' ' );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ puts( "Creating task 1 (Global)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of Task 1" );
+
+ puts( "Creating task 2 (Global)" );
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of Task 2" );
+
+ puts( "Creating task 3 (Local)" );
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of Task 3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of Task 1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of Task 2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of Task 3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp01/node1/mp01.doc b/testsuites/mptests/mp01/node1/mp01.doc
new file mode 100644
index 0000000000..d339393655
--- /dev/null
+++ b/testsuites/mptests/mp01/node1/mp01.doc
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test50
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter, t_delete
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of a global task on the local processor.
+
+ i. Verifies that a task can delete itself or a global task on
+ the local processor.
+
+ j. Verifies Shared Memory Locked Queue driver for initialization,
+ getting a packet, broadcasting a packet, and returning a packet.
+
+ k. Can be used to verify that global packet type P_SYSVERIFY,
+ P_OBJCREATE (task), and P_OBJDELETE (task) are sent and
+ correctly processed by a remote node.
diff --git a/testsuites/mptests/mp01/node1/mp01.scn b/testsuites/mptests/mp01/node1/mp01.scn
new file mode 100644
index 0000000000..d399f79b2a
--- /dev/null
+++ b/testsuites/mptests/mp01/node1/mp01.scn
@@ -0,0 +1,15 @@
+*** TEST 1 -- NODE 1 ***
+Creating task 1 (Global)
+Creating task 2 (Global)
+Creating task 3 (Local)
+MA1 - rtems_clock_get - 09:00:00 12/31/1988
+MA2 - rtems_clock_get - 09:00:00 12/31/1988
+MA3 - rtems_clock_get - 09:00:00 12/31/1988
+MA1 - rtems_clock_get - 09:00:05 12/31/1988
+MA1 - deleting self
+MA2 - rtems_clock_get - 09:00:10 12/31/1988
+MA2 - waiting to be deleted by MA3
+MA3 - rtems_clock_get - 09:00:15 12/31/1988
+MA3 - getting TID of MA2
+MA3 - deleting MA2
+*** END OF TEST 1 ***
diff --git a/testsuites/mptests/mp01/node2/mp01.doc b/testsuites/mptests/mp01/node2/mp01.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp01/node2/mp01.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp01/node2/mp01.scn b/testsuites/mptests/mp01/node2/mp01.scn
new file mode 100644
index 0000000000..c9831ff9db
--- /dev/null
+++ b/testsuites/mptests/mp01/node2/mp01.scn
@@ -0,0 +1,15 @@
+*** TEST 1 -- NODE 2 ***
+Creating task 1 (Global)
+Creating task 2 (Global)
+Creating task 3 (Local)
+SA1 - rtems_clock_get - 09:00:00 12/31/1988
+SA2 - rtems_clock_get - 09:00:00 12/31/1988
+SA3 - rtems_clock_get - 09:00:00 12/31/1988
+SA1 - rtems_clock_get - 09:00:05 12/31/1988
+SA1 - deleting self
+SA2 - rtems_clock_get - 09:00:10 12/31/1988
+SA2 - waiting to be deleted by SA3
+SA3 - rtems_clock_get - 09:00:15 12/31/1988
+SA3 - getting TID of SA2
+SA3 - deleting SA2
+*** END OF TEST 1 ***
diff --git a/testsuites/mptests/mp01/system.h b/testsuites/mptests/mp01/system.h
new file mode 100644
index 0000000000..b62ffe5c20
--- /dev/null
+++ b/testsuites/mptests/mp01/system.h
@@ -0,0 +1,46 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_GLOBAL
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp01/task1.c b/testsuites/mptests/mp01/task1.c
new file mode 100644
index 0000000000..7b767637f6
--- /dev/null
+++ b/testsuites/mptests/mp01/task1.c
@@ -0,0 +1,84 @@
+/* Test_task
+ *
+ * This task is used for three test tasks. It obtains its task id and
+ * based upon that id, performs certain actions.
+ *
+ * Task_1 delays 5 seconds and deletes itself.
+ * Task_2 delays 10 seconds and then loops until
+ * deleted by the third task.
+ * Task 3 delays 15 seconds, then deletes task 2 and itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_wake_after( task_number( tid ) * 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ if ( task_number(tid) == 1 ) { /* TASK 1 */
+ put_name( Task_name[ 1 ], FALSE );
+ printf( " - deleting self\n" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+ }
+ else if ( task_number(tid) == 2 ) { /* TASK 2 */
+ put_name( Task_name[ 2 ], FALSE );
+ printf( " - waiting to be deleted by " );
+ put_name( Task_name[ 3 ], TRUE );
+ while ( FOREVER );
+ }
+ else { /* TASK 3 */
+ put_name( Task_name[ 3 ], FALSE );
+ printf( " - getting TID of " );
+ put_name( Task_name[ 2 ], TRUE );
+ do {
+ status = rtems_task_ident( Task_name[ 2 ], RTEMS_SEARCH_ALL_NODES, &tid );
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_task_ident" );
+
+ put_name( Task_name[ 3 ], FALSE );
+ printf( " - deleting " );
+ put_name( Task_name[ 2 ], TRUE );
+ status = rtems_task_delete( tid );
+ directive_failed( status, "rtems_task_delete of Task 2" );
+
+ puts( "*** END OF TEST 1 ***" );
+ exit(0);
+ }
+}
diff --git a/testsuites/mptests/mp02/init.c b/testsuites/mptests/mp02/init.c
new file mode 100644
index 0000000000..6342835ae5
--- /dev/null
+++ b/testsuites/mptests/mp02/init.c
@@ -0,0 +1,60 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 2 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp02/node1/mp02.doc b/testsuites/mptests/mp02/node1/mp02.doc
new file mode 100644
index 0000000000..a7096e474a
--- /dev/null
+++ b/testsuites/mptests/mp02/node1/mp02.doc
@@ -0,0 +1,47 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test51
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter, t_delete, t_restart, t_getreg, t_setreg
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ c. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ d. Verifies executive initialization performed correctly.
+
+ e. Verifies that a task can get the task identification number of itself.
+
+ f. Verifies that a task can get the task identification number
+ of another task.
+
+ g. Verifies that a task can delete itself or another task.
+
+ h. Verifies that errors are returned in the following situations:
+ 1) when attempting to delete a remote task.
+ 2) when attempting to start a remote task.
+ 3) when attempting to restart a remote task.
+
+ i. Verifies that a remote task's registers can be set and read.
diff --git a/testsuites/mptests/mp02/node1/mp02.scn b/testsuites/mptests/mp02/node1/mp02.scn
new file mode 100644
index 0000000000..72fdefe69d
--- /dev/null
+++ b/testsuites/mptests/mp02/node1/mp02.scn
@@ -0,0 +1,14 @@
+*** TEST 2 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 222
+Getting TID of remote task (all nodes)
+Getting TID of remote task (1 node)
+rtems_task_delete of remote task returned the correct error
+rtems_task_start of remote task returned the correct error
+rtems_task_restart of remote task returned the correct error
+Setting notepad 1 of the remote task to 1
+Getting a notepad of the remote task
+Remote notepad set and read correctly
+*** END OF TEST 2 ***
diff --git a/testsuites/mptests/mp02/node2/mp02.doc b/testsuites/mptests/mp02/node2/mp02.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp02/node2/mp02.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp02/node2/mp02.scn b/testsuites/mptests/mp02/node2/mp02.scn
new file mode 100644
index 0000000000..233a910999
--- /dev/null
+++ b/testsuites/mptests/mp02/node2/mp02.scn
@@ -0,0 +1,14 @@
+*** TEST 2 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 111
+Getting TID of remote task (all nodes)
+Getting TID of remote task (1 node)
+rtems_task_delete of remote task returned the correct error
+rtems_task_start of remote task returned the correct error
+rtems_task_restart of remote task returned the correct error
+Setting notepad 2 of the remote task to 2
+Getting a notepad of the remote task
+Remote notepad set and read correctly
+*** END OF TEST 2 ***
diff --git a/testsuites/mptests/mp02/system.h b/testsuites/mptests/mp02/system.h
new file mode 100644
index 0000000000..e5759bc158
--- /dev/null
+++ b/testsuites/mptests/mp02/system.h
@@ -0,0 +1,45 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp02/task1.c b/testsuites/mptests/mp02/task1.c
new file mode 100644
index 0000000000..7b9caab328
--- /dev/null
+++ b/testsuites/mptests/mp02/task1.c
@@ -0,0 +1,118 @@
+/* Test_task
+ *
+ * This task tests the rtems_task_set_note directive on a remote task and that
+ * errors are returned when attempting to delete, start, or restart
+ * a remote task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_id test_tid;
+ rtems_unsigned32 note;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ printf( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task (all nodes)" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+
+ directive_failed( status, "rtems_task_ident" );
+
+ puts( "Getting TID of remote task (1 node)" );
+ status = rtems_task_ident( Task_name[ remote_node ], remote_node, &test_tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ if ( test_tid != remote_tid ) {
+ puts( "rtems_task_ident tid's do not match!!" );
+ rtems_fatal_error_occurred( status );
+ }
+
+ status = rtems_task_delete( remote_tid );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_task_delete of remote task"
+ );
+ puts( "rtems_task_delete of remote task returned the correct error" );
+
+ status = rtems_task_start( remote_tid, Test_task, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_task_start of remote task"
+ );
+ puts( "rtems_task_start of remote task returned the correct error" );
+
+ status = rtems_task_restart( remote_tid, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_task_restart of remote task"
+ );
+ puts( "rtems_task_restart of remote task returned the correct error" );
+
+ printf(
+ "Setting notepad %d of the remote task to %d\n",
+ rtems_get_node(tid),
+ rtems_get_node(tid)
+ );
+ status = rtems_task_set_note(
+ remote_tid,
+ rtems_get_node(tid),
+ rtems_get_node(tid)
+ );
+ directive_failed( status, "rtems_task_set_note" );
+
+ puts( "Getting a notepad of the remote task" );
+ status = rtems_task_get_note( remote_tid, rtems_get_node(tid), &note );
+ directive_failed( status, "rtems_task_get_note" );
+
+ if ( note == rtems_get_node(tid) )
+ puts( "Remote notepad set and read correctly" );
+ else
+ printf(
+ "FAILURE!! Remote notepad was not set and read correctly (%d, %d)\n",
+ note,
+ rtems_get_node( tid )
+ );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 2 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp03/delay.c b/testsuites/mptests/mp03/delay.c
new file mode 100644
index 0000000000..aa52d05c8e
--- /dev/null
+++ b/testsuites/mptests/mp03/delay.c
@@ -0,0 +1,31 @@
+/* Delayed_send_event
+ *
+ * This routine is a timer service routine which sends an event to task 1.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+}
diff --git a/testsuites/mptests/mp03/init.c b/testsuites/mptests/mp03/init.c
new file mode 100644
index 0000000000..ea3077ac97
--- /dev/null
+++ b/testsuites/mptests/mp03/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 3 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp03/node1/mp03.doc b/testsuites/mptests/mp03/node1/mp03.doc
new file mode 100644
index 0000000000..1afc836704
--- /dev/null
+++ b/testsuites/mptests/mp03/node1/mp03.doc
@@ -0,0 +1,45 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test52
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_wkafter, t_suspend, t_resume
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task (on another node).
+
+ i. Verifies that a task can suspend and resume a remote task.
diff --git a/testsuites/mptests/mp03/node1/mp03.scn b/testsuites/mptests/mp03/node1/mp03.scn
new file mode 100644
index 0000000000..129e5bccba
--- /dev/null
+++ b/testsuites/mptests/mp03/node1/mp03.scn
@@ -0,0 +1,24 @@
+*** TEST 3 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 222
+111 - Suspending remote task
+111 - Resuming remote task
+111 - Suspending remote task
+111 - Resuming remote task
+111 - Suspending remote task
+111 - Resuming remote task
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+
+ ........
+
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+111 - Have I been suspended?????
+*** END OF TEST 3 ***
diff --git a/testsuites/mptests/mp03/node2/mp03.doc b/testsuites/mptests/mp03/node2/mp03.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp03/node2/mp03.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp03/node2/mp03.scn b/testsuites/mptests/mp03/node2/mp03.scn
new file mode 100644
index 0000000000..d77c09e9f7
--- /dev/null
+++ b/testsuites/mptests/mp03/node2/mp03.scn
@@ -0,0 +1,24 @@
+*** TEST 3 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 111
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+
+ ........
+
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Have I been suspended?????
+222 - Suspending remote task
+222 - Resuming remote task
+222 - Suspending remote task
+222 - Resuming remote task
+222 - Suspending remote task
+222 - Resuming remote task
+*** END OF TEST 3 ***
diff --git a/testsuites/mptests/mp03/system.h b/testsuites/mptests/mp03/system.h
new file mode 100644
index 0000000000..4ddc6029d0
--- /dev/null
+++ b/testsuites/mptests/mp03/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+
+TEST_EXTERN rtems_unsigned32 remote_node;
+TEST_EXTERN rtems_id remote_tid;
+
+/* end of include file */
diff --git a/testsuites/mptests/mp03/task1.c b/testsuites/mptests/mp03/task1.c
new file mode 100644
index 0000000000..11ccab539b
--- /dev/null
+++ b/testsuites/mptests/mp03/task1.c
@@ -0,0 +1,155 @@
+/* Test_task
+ *
+ * This task suspends and resumes a remote task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+/*PAGE
+ *
+ * Test_Task_Support
+ *
+ */
+
+void Test_Task_Support(
+ rtems_unsigned32 node
+)
+{
+ rtems_event_set events;
+ rtems_status_code status;
+
+ if ( Multiprocessing_configuration.node == node ) {
+
+ for ( ; ; ) {
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &events
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+
+ fatal_directive_status(status, RTEMS_UNSATISFIED, "rtems_event_receive");
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ put_name( Task_name[ node ], FALSE );
+ puts( " - Suspending remote task" );
+
+ status = rtems_task_suspend( remote_tid );
+ directive_failed( status, "rtems_task_suspend" );
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ put_name( Task_name[ node ], FALSE );
+ puts( " - Resuming remote task" );
+
+ status = rtems_task_resume( remote_tid ) ;
+ directive_failed( status, "rtems_task_resume" );
+
+ }
+
+ } else {
+
+ for ( ; ; ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &events
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+
+ fatal_directive_status(status, RTEMS_UNSATISFIED, "rtems_event_receive");
+
+ put_name( Task_name[ remote_node ], FALSE );
+ puts( " - have I been suspended???" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ }
+
+}
+
+/*PAGE
+ *
+ * Test_task
+ */
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ puts( "Getting TID of remote task" );
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ printf( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Delayed_send_event,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ Test_Task_Support( 1 );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Delayed_send_event,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ Test_Task_Support( 2 );
+
+ puts( "*** END OF TEST 3 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp04/init.c b/testsuites/mptests/mp04/init.c
new file mode 100644
index 0000000000..5c4f5e1608
--- /dev/null
+++ b/testsuites/mptests/mp04/init.c
@@ -0,0 +1,60 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 4 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ Multiprocessing_configuration.node,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp04/node1/mp04.doc b/testsuites/mptests/mp04/node1/mp04.doc
new file mode 100644
index 0000000000..075c2d90f8
--- /dev/null
+++ b/testsuites/mptests/mp04/node1/mp04.doc
@@ -0,0 +1,41 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test53
+
+directives:
+ ex_init, ex_start, t_create, t_start, i_return, t_ident, tm_get,
+ tm_wkafter, tm_setpri
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies that the system can get the id of a remote task.
+
+ c. Verifies that the system can change the priority of a remote
+ task.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can delete itself or another task.
diff --git a/testsuites/mptests/mp04/node1/mp04.scn b/testsuites/mptests/mp04/node1/mp04.scn
new file mode 100644
index 0000000000..e9518f3ac2
--- /dev/null
+++ b/testsuites/mptests/mp04/node1/mp04.scn
@@ -0,0 +1,8 @@
+*** TEST 4 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 222
+Local task priority has been set
+*** END OF TEST 4 ***
diff --git a/testsuites/mptests/mp04/node2/mp04.doc b/testsuites/mptests/mp04/node2/mp04.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp04/node2/mp04.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp04/node2/mp04.scn b/testsuites/mptests/mp04/node2/mp04.scn
new file mode 100644
index 0000000000..8ccfcfef79
--- /dev/null
+++ b/testsuites/mptests/mp04/node2/mp04.scn
@@ -0,0 +1,8 @@
+*** TEST 4 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting TID of remote task
+Remote task's name is : 111
+Local task priority has been set
+*** END OF TEST 4 ***
diff --git a/testsuites/mptests/mp04/system.h b/testsuites/mptests/mp04/system.h
new file mode 100644
index 0000000000..687a25d169
--- /dev/null
+++ b/testsuites/mptests/mp04/system.h
@@ -0,0 +1,47 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp04/task1.c b/testsuites/mptests/mp04/task1.c
new file mode 100644
index 0000000000..4710d7c7b8
--- /dev/null
+++ b/testsuites/mptests/mp04/task1.c
@@ -0,0 +1,83 @@
+/* Test_task
+ *
+ * This task tests the rtems_task_set_priority directive on a remote task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_task_priority previous_priority;
+ rtems_task_priority previous_priority_1;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ puts( "Getting TID of remote task" );
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_task_set_priority(
+ remote_tid,
+ Multiprocessing_configuration.node,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ if ( previous_priority != remote_node ) {
+ printf(
+ "Remote priority (0x%x) does not match remote node (0x%x)!!!\n",
+ previous_priority,
+ remote_node
+ );
+ exit( 0xf0000 );
+ }
+
+ do {
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ RTEMS_CURRENT_PRIORITY,
+ &previous_priority_1
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ } while ( previous_priority_1 != remote_node );
+
+ puts( "Local task priority has been set" );
+
+ puts( "*** END OF TEST 4 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp05/asr.c b/testsuites/mptests/mp05/asr.c
new file mode 100644
index 0000000000..7ce01d6606
--- /dev/null
+++ b/testsuites/mptests/mp05/asr.c
@@ -0,0 +1,37 @@
+/* Process_asr
+ *
+ * This routine performs the processing for task 1's RTEMS_ASR. It is called
+ * by an assembly routine which saves the necessary registers.
+ *
+ * Input parameters:
+ * signal - signal set
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_asr Process_asr(
+ rtems_signal_set signal
+)
+{
+ if ( signal != expected_signal ) {
+ printf(
+ "ERROR: I was expecting signal 0x%.8x got 0x%.8x\n",
+ expected_signal,
+ signal
+ );
+ rtems_fatal_error_occurred( 0xf0000 );
+ }
+ signal_caught = 1;
+}
diff --git a/testsuites/mptests/mp05/init.c b/testsuites/mptests/mp05/init.c
new file mode 100644
index 0000000000..b066be530f
--- /dev/null
+++ b/testsuites/mptests/mp05/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 5 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp05/node1/mp05.doc b/testsuites/mptests/mp05/node1/mp05.doc
new file mode 100644
index 0000000000..d252619bec
--- /dev/null
+++ b/testsuites/mptests/mp05/node1/mp05.doc
@@ -0,0 +1,45 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test54
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_wkafter, as_catch, as_return
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that a signal can be sent to a remote task.
diff --git a/testsuites/mptests/mp05/node1/mp05.scn b/testsuites/mptests/mp05/node1/mp05.scn
new file mode 100644
index 0000000000..472740ba18
--- /dev/null
+++ b/testsuites/mptests/mp05/node1/mp05.scn
@@ -0,0 +1,11 @@
+*** TEST 5 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+rtems_signal_catch: initializing signal catcher
+Remote task's name is : 222
+Getting TID of remote task
+Sending signal to remote task
+....................................................
+....................................................
+*** END OF TEST 5 ***
diff --git a/testsuites/mptests/mp05/node2/mp05.doc b/testsuites/mptests/mp05/node2/mp05.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp05/node2/mp05.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp05/node2/mp05.scn b/testsuites/mptests/mp05/node2/mp05.scn
new file mode 100644
index 0000000000..0c4b412f65
--- /dev/null
+++ b/testsuites/mptests/mp05/node2/mp05.scn
@@ -0,0 +1,10 @@
+*** TEST 5 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+rtems_signal_catch: initializing signal catcher
+Remote task's name is : 111
+Getting TID of remote task
+....................................................
+....................................................
+*** END OF TEST 5 ***
diff --git a/testsuites/mptests/mp05/system.h b/testsuites/mptests/mp05/system.h
new file mode 100644
index 0000000000..1ba4a78f87
--- /dev/null
+++ b/testsuites/mptests/mp05/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_asr Process_asr( rtems_signal_set );
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+
+TEST_EXTERN rtems_unsigned32 remote_node;
+TEST_EXTERN rtems_id remote_tid;
+TEST_EXTERN rtems_signal_set remote_signal;
+TEST_EXTERN rtems_signal_set expected_signal;
+TEST_EXTERN volatile rtems_unsigned32 signal_count;
+TEST_EXTERN volatile rtems_unsigned32 signal_caught;
+
+/* end of include file */
diff --git a/testsuites/mptests/mp05/task1.c b/testsuites/mptests/mp05/task1.c
new file mode 100644
index 0000000000..21f984847d
--- /dev/null
+++ b/testsuites/mptests/mp05/task1.c
@@ -0,0 +1,106 @@
+/* Test_task
+ *
+ * This task initializes the signal catcher, sends the first signal
+ * if running on the first node, and loops while waiting for signals.
+ *
+ * NOTE: The signal catcher is not reentrant and hence RTEMS_NO_ASR must
+ * be a part of its execution mode.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define SIGNALS_PER_DOT 15
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Stop_Test = FALSE;
+
+ signal_caught = 0;
+ signal_count = 0;
+
+ puts( "rtems_signal_catch: initializing signal catcher" );
+ status = rtems_signal_catch( Process_asr, RTEMS_NO_ASR|RTEMS_NO_PREEMPT );
+ directive_failed( status, "rtems_signal_catch" );
+
+ if (Multiprocessing_configuration.node == 1) {
+ remote_node = 2;
+ remote_signal = RTEMS_SIGNAL_18;
+ expected_signal = RTEMS_SIGNAL_17;
+ }
+ else {
+ remote_node = 1;
+ remote_signal = RTEMS_SIGNAL_17;
+ expected_signal = RTEMS_SIGNAL_18;
+ }
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_task_ident" );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 3 * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Sending signal to remote task" );
+ do {
+ status = rtems_signal_send( remote_tid, remote_signal );
+ if ( status == RTEMS_NOT_DEFINED )
+ continue;
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_signal_send" );
+ }
+
+ while ( Stop_Test == FALSE ) {
+ if ( signal_caught ) {
+ signal_caught = 0;
+ if ( ++signal_count >= SIGNALS_PER_DOT ) {
+ signal_count = 0;
+ put_dot( '.' );
+ }
+ status = rtems_signal_send( remote_tid, remote_signal );
+ directive_failed( status, "rtems_signal_send" );
+ }
+ }
+ puts( "\n*** END OF TEST 5 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp06/init.c b/testsuites/mptests/mp06/init.c
new file mode 100644
index 0000000000..a595dd75bd
--- /dev/null
+++ b/testsuites/mptests/mp06/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 6 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp06/node1/mp06.doc b/testsuites/mptests/mp06/node1/mp06.doc
new file mode 100644
index 0000000000..501cabbe24
--- /dev/null
+++ b/testsuites/mptests/mp06/node1/mp06.doc
@@ -0,0 +1,45 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test55
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ ev_send, ev_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that events can be sent to a remote task.
diff --git a/testsuites/mptests/mp06/node1/mp06.scn b/testsuites/mptests/mp06/node1/mp06.scn
new file mode 100644
index 0000000000..592777e5d7
--- /dev/null
+++ b/testsuites/mptests/mp06/node1/mp06.scn
@@ -0,0 +1,11 @@
+*** TEST 6 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 222
+Getting TID of remote task
+Sending events to remote task
+....................................................
+....................................................
+*** END OF TEST 6 ***
+
diff --git a/testsuites/mptests/mp06/node2/mp06.doc b/testsuites/mptests/mp06/node2/mp06.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp06/node2/mp06.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp06/node2/mp06.scn b/testsuites/mptests/mp06/node2/mp06.scn
new file mode 100644
index 0000000000..9cb653c2f3
--- /dev/null
+++ b/testsuites/mptests/mp06/node2/mp06.scn
@@ -0,0 +1,12 @@
+*** TEST 6 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 111
+Getting TID of remote task
+Receiving events from remote task
+....................................................
+....................................................
+rtems_event_receive - correctly returned RTEMS_TIMEOUT
+*** END OF TEST 6 ***
+
diff --git a/testsuites/mptests/mp06/system.h b/testsuites/mptests/mp06/system.h
new file mode 100644
index 0000000000..ee57a64147
--- /dev/null
+++ b/testsuites/mptests/mp06/system.h
@@ -0,0 +1,52 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+
+/* end of include file */
diff --git a/testsuites/mptests/mp06/task1.c b/testsuites/mptests/mp06/task1.c
new file mode 100644
index 0000000000..473f566e2e
--- /dev/null
+++ b/testsuites/mptests/mp06/task1.c
@@ -0,0 +1,176 @@
+/* Test_task
+ *
+ * This task tests global event operations. If running on node one, it
+ * continuously sends events. If running on node two, it continuously
+ * receives events.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define DOT_COUNT 25
+
+/*PAGE
+ *
+ * Stop_Test_TSR
+ */
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+/*PAGE
+ *
+ * Event_set_table
+ */
+
+rtems_event_set Event_set_table[] = {
+ RTEMS_EVENT_0,
+ RTEMS_EVENT_1,
+ RTEMS_EVENT_2,
+ RTEMS_EVENT_3,
+ RTEMS_EVENT_4,
+ RTEMS_EVENT_5,
+ RTEMS_EVENT_6,
+ RTEMS_EVENT_7,
+ RTEMS_EVENT_8,
+ RTEMS_EVENT_9,
+ RTEMS_EVENT_10,
+ RTEMS_EVENT_11,
+ RTEMS_EVENT_12,
+ RTEMS_EVENT_13,
+ RTEMS_EVENT_14,
+ RTEMS_EVENT_15,
+ RTEMS_EVENT_16,
+ RTEMS_EVENT_17,
+ RTEMS_EVENT_18,
+ RTEMS_EVENT_19,
+ RTEMS_EVENT_20,
+ RTEMS_EVENT_21,
+ RTEMS_EVENT_22,
+ RTEMS_EVENT_23,
+ RTEMS_EVENT_24,
+ RTEMS_EVENT_25,
+ RTEMS_EVENT_26,
+ RTEMS_EVENT_27,
+ RTEMS_EVENT_28,
+ RTEMS_EVENT_29,
+ RTEMS_EVENT_30,
+ RTEMS_EVENT_31
+};
+
+/*PAGE
+ *
+ * Test_task
+ */
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_event_set event_out;
+ rtems_event_set event_for_this_iteration;
+
+ Stop_Test = FALSE;
+
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( status != RTEMS_SUCCESSFUL );
+ directive_failed( status, "rtems_task_ident FAILED!!" );
+
+ if ( Multiprocessing_configuration.node == 1 )
+ puts( "Sending events to remote task" );
+ else
+ puts( "Receiving events from remote task" );
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ count = 0;
+
+ for ( ; ; ) {
+ if ( Stop_Test == TRUE )
+ break;
+
+ event_for_this_iteration = Event_set_table[ count % 32 ];
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_event_send( remote_tid, event_for_this_iteration );
+ directive_failed( status, "rtems_event_send" );
+
+ status = rtems_task_wake_after( 1 );
+ directive_failed( status, "rtems_task_wake_after" );
+ } else {
+ status = rtems_event_receive(
+ event_for_this_iteration,
+ RTEMS_DEFAULT_OPTIONS,
+ 1 * TICKS_PER_SECOND,
+ &event_out
+ );
+ if ( rtems_are_statuses_equal( status, RTEMS_TIMEOUT ) ) {
+ if ( Multiprocessing_configuration.node == 2 )
+ puts( "\nCorrect behavior if the other node exitted." );
+ else
+ puts( "\nERROR... node 1 died" );
+ break;
+ } else
+ directive_failed( status, "rtems_event_receive" );
+ }
+
+ if ( (count % DOT_COUNT) == 0 )
+ put_dot('.');
+
+ count++;
+ }
+
+ putchar( '\n' );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ 1 * TICKS_PER_SECOND,
+ &event_out
+ );
+ fatal_directive_status( status, RTEMS_TIMEOUT, "rtems_event_receive" );
+ puts( "rtems_event_receive - correctly returned RTEMS_TIMEOUT" );
+ }
+ puts( "*** END OF TEST 6 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp07/init.c b/testsuites/mptests/mp07/init.c
new file mode 100644
index 0000000000..ce607eb555
--- /dev/null
+++ b/testsuites/mptests/mp07/init.c
@@ -0,0 +1,65 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 7 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp07/node1/mp07.doc b/testsuites/mptests/mp07/node1/mp07.doc
new file mode 100644
index 0000000000..fcabab9e06
--- /dev/null
+++ b/testsuites/mptests/mp07/node1/mp07.doc
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test56
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ ev_send, ev_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that two tasks on different processors can alternate
+ sending each other events.
diff --git a/testsuites/mptests/mp07/node1/mp07.scn b/testsuites/mptests/mp07/node1/mp07.scn
new file mode 100644
index 0000000000..d348f48612
--- /dev/null
+++ b/testsuites/mptests/mp07/node1/mp07.scn
@@ -0,0 +1,10 @@
+*** TEST 7 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 222
+Getting TID of remote task
+Sending first event to remote task
+....................................................
+....................................................
+*** END OF TEST 7 ***
diff --git a/testsuites/mptests/mp07/node2/mp07.doc b/testsuites/mptests/mp07/node2/mp07.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp07/node2/mp07.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp07/node2/mp07.scn b/testsuites/mptests/mp07/node2/mp07.scn
new file mode 100644
index 0000000000..9e361d713c
--- /dev/null
+++ b/testsuites/mptests/mp07/node2/mp07.scn
@@ -0,0 +1,9 @@
+*** TEST 7 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Remote task's name is : 111
+Getting TID of remote task
+....................................................
+....................................................
+*** END OF TEST 7 ***
diff --git a/testsuites/mptests/mp07/system.h b/testsuites/mptests/mp07/system.h
new file mode 100644
index 0000000000..ee57a64147
--- /dev/null
+++ b/testsuites/mptests/mp07/system.h
@@ -0,0 +1,52 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+
+/* end of include file */
diff --git a/testsuites/mptests/mp07/task1.c b/testsuites/mptests/mp07/task1.c
new file mode 100644
index 0000000000..44986f8bf5
--- /dev/null
+++ b/testsuites/mptests/mp07/task1.c
@@ -0,0 +1,103 @@
+/* Test_task
+ *
+ * This task continuously sends an event to its counterpart on the
+ * other node, and then waits for it to send an event. The copy
+ * running on node one send the first event.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define DOT_COUNT 100
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_event_set event_out;
+
+ Stop_Test = FALSE;
+
+ remote_node = (Multiprocessing_configuration.node == 1) ? 2 : 1;
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ do {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Sending first event to remote task" );
+ status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+ }
+
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ while ( Stop_Test == FALSE ) {
+ for ( count=DOT_COUNT ; count && (Stop_Test == FALSE) ; count-- ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ if ( status == RTEMS_TIMEOUT ) {
+ puts( "\nTA1 - RTEMS_TIMEOUT .. probably OK if the other node exits" );
+ break;
+ } else
+ directive_failed( status, "rtems_event_receive" );
+
+ status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+ }
+ put_dot('.');
+ }
+
+ /*
+ * Wait a bit before shutting down so we don't screw up the other node
+ * when our MPCI shuts down
+ */
+
+ rtems_task_wake_after(10);
+
+ puts( "\n*** END OF TEST 7 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp08/init.c b/testsuites/mptests/mp08/init.c
new file mode 100644
index 0000000000..ea4002cade
--- /dev/null
+++ b/testsuites/mptests/mp08/init.c
@@ -0,0 +1,74 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 8 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', '\0' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Sempahore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+ }
+
+ puts( "Creating Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (Global)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp08/node1/mp08.doc b/testsuites/mptests/mp08/node1/mp08.doc
new file mode 100644
index 0000000000..174188dc63
--- /dev/null
+++ b/testsuites/mptests/mp08/node1/mp08.doc
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test57
+
+GLOBAL SEMAPHORE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ sm_create, sm_ident, sm_p, sm_v, sm_delete
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the identification number of
+ a global sempahore.
+
+ h. Verifies that two tasks on different processors can
+ alternate accessing a semaphore.
+
+ i. Verifies operation of sm_delete on global semaphores
+ for both normal and error case.
+
+ j. Verifies Rpc and Process_pkt for packet types Q_SMP, Q_SMV,
+ P_OBJCREATE (semaphore), P_OBJDELETE (semaphore), P_SMDEL_TQ.
+
diff --git a/testsuites/mptests/mp08/node1/mp08.scn b/testsuites/mptests/mp08/node1/mp08.scn
new file mode 100644
index 0000000000..cde263420c
--- /dev/null
+++ b/testsuites/mptests/mp08/node1/mp08.scn
@@ -0,0 +1,11 @@
+*** TEST 8 -- NODE 1 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting SMID of semaphore
+pvpvpvpvpvp.......
+(continued) pvp
+
+Deleting global semaphore
+*** END OF TEST 8 ***
+
diff --git a/testsuites/mptests/mp08/node2/mp08.doc b/testsuites/mptests/mp08/node2/mp08.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp08/node2/mp08.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp08/node2/mp08.scn b/testsuites/mptests/mp08/node2/mp08.scn
new file mode 100644
index 0000000000..5a613f45e5
--- /dev/null
+++ b/testsuites/mptests/mp08/node2/mp08.scn
@@ -0,0 +1,12 @@
+*** TEST 8 -- NODE 2 ***
+Creating Test_task (Global)
+Starting Test_task (Global)
+Deleting initialization task
+Getting SMID of semaphore
+rtems_semaphore_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+pvpvpvpvpvp.......
+(continued) pvp
+
+Global semaphore deleted
+*** END OF TEST 8 ***
+
diff --git a/testsuites/mptests/mp08/system.h b/testsuites/mptests/mp08/system.h
new file mode 100644
index 0000000000..6a769bf062
--- /dev/null
+++ b/testsuites/mptests/mp08/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp08/task1.c b/testsuites/mptests/mp08/task1.c
new file mode 100644
index 0000000000..411b83aed2
--- /dev/null
+++ b/testsuites/mptests/mp08/task1.c
@@ -0,0 +1,89 @@
+/* Test_task
+ *
+ * This task tests global semaphore operations. It verifies that
+ * global semaphore errors are correctly returned.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ puts( "Getting SMID of semaphore" );
+
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_semaphore_delete did not return RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+ puts(
+ "rtems_semaphore_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+ }
+
+ count = 0; /* number of times node 1 releases semaphore */
+ while ( FOREVER ) {
+ put_dot( 'p' );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ if ( status != RTEMS_SUCCESSFUL ) {
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_semaphore_obtain"
+ );
+ puts( "\nGlobal semaphore deleted" );
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+ }
+
+ if ( Multiprocessing_configuration.node == 1 && ++count == 1000 ) {
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "\nDeleting global semaphore" );
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_delete" );
+
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+ }
+ else {
+ put_dot( 'v' );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release FAILED!!" );
+ }
+ }
+}
diff --git a/testsuites/mptests/mp09/init.c b/testsuites/mptests/mp09/init.c
new file mode 100644
index 0000000000..74a34fceba
--- /dev/null
+++ b/testsuites/mptests/mp09/init.c
@@ -0,0 +1,74 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 9 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+ }
+
+ puts( "Creating Test_task (local)" );
+ status = rtems_task_create(
+ Task_name[Multiprocessing_configuration.node],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task (local)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp09/node1/mp09.doc b/testsuites/mptests/mp09/node1/mp09.doc
new file mode 100644
index 0000000000..a517608fb2
--- /dev/null
+++ b/testsuites/mptests/mp09/node1/mp09.doc
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test58
+
+GLOBAL MESSAGE QUEUE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ tm_wkafter, q_create, q_send, q_broadcast, q_urgent, q_receive,
+ q_delete
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can delete itself.
+
+ i. Verifies Rpc and Process_pkt for message queue related packets.
+
+ j. Verifies normal and error paths for global message queue handling.
+
+NOTE: The SLAVE must be started first for this test to successfully run.
diff --git a/testsuites/mptests/mp09/node1/mp09.scn b/testsuites/mptests/mp09/node1/mp09.scn
new file mode 100644
index 0000000000..74cf06904d
--- /dev/null
+++ b/testsuites/mptests/mp09/node1/mp09.scn
@@ -0,0 +1,22 @@
+*** TEST 9 -- NODE 1 ***
+Creating Message Queue (Global)
+Creating Test_task (local)
+Starting Test_task (local)
+Deleting initialization task
+Getting QID of message queue
+Receiving message ...
+Received : 123456789012345
+Receiving message ...
+Received : abcdefghijklmno
+Receiving message ...
+Received : ABCDEFGHIJKLMNO
+Receiver delaying for a second
+rtems_message_queue_send: 123456789012345
+Delaying for a second
+rtems_message_queue_urgent: abcdefghijklmno
+Delaying for a second
+rtems_message_queue_broadcast: ABCDEFGHIJKLMNO
+Delaying for a second
+Delaying for 5 seconds
+Deleting Message queue
+*** END OF TEST 9 ***
diff --git a/testsuites/mptests/mp09/node2/mp09.doc b/testsuites/mptests/mp09/node2/mp09.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp09/node2/mp09.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp09/node2/mp09.scn b/testsuites/mptests/mp09/node2/mp09.scn
new file mode 100644
index 0000000000..1bd17cecd9
--- /dev/null
+++ b/testsuites/mptests/mp09/node2/mp09.scn
@@ -0,0 +1,27 @@
+*** TEST 9 -- NODE 2 ***
+Creating Test_task (local)
+Starting Test_task (local)
+Deleting initialization task
+Getting QID of message queue
+rtems_message_queue_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+rtems_message_queue_send: 123456789012345
+Delaying for a second
+rtems_message_queue_urgent: abcdefghijklmno
+Delaying for a second
+rtems_message_queue_broadcast: ABCDEFGHIJKLMNO
+Delaying for a second
+Receiving message ...
+Received : 123456789012345
+Receiving message ...
+Received : abcdefghijklmno
+Receiving message ...
+Received : ABCDEFGHIJKLMNO
+Receiver delaying for a second
+Flushing remote empty queue
+0 messages were flushed on the remote queue
+Send messages to be flushed from remote queue
+Flushing remote queue
+1 messages were flushed on the remote queue
+Waiting for message queue to be deleted
+Global message queue deleted
+*** END OF TEST 9 ***
diff --git a/testsuites/mptests/mp09/recvmsg.c b/testsuites/mptests/mp09/recvmsg.c
new file mode 100644
index 0000000000..5bac302d83
--- /dev/null
+++ b/testsuites/mptests/mp09/recvmsg.c
@@ -0,0 +1,47 @@
+/* Receive_messages
+ *
+ * This routine receives and prints three messages.
+ * an error condition.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Receive_messages()
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_unsigned32 size;
+ char receive_buffer[16];
+
+ for ( index=1 ; index <=3 ; index++ ) {
+ puts( "Receiving message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "Received : ");
+ puts( receive_buffer );
+ }
+
+ puts( "Receiver delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+}
diff --git a/testsuites/mptests/mp09/sendmsg.c b/testsuites/mptests/mp09/sendmsg.c
new file mode 100644
index 0000000000..0d72d27c07
--- /dev/null
+++ b/testsuites/mptests/mp09/sendmsg.c
@@ -0,0 +1,60 @@
+/* Send_messages
+ *
+ * This routine sends a series of three messages.
+ * an error condition.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Send_messages()
+{
+ rtems_status_code status;
+ rtems_unsigned32 broadcast_count;
+
+ puts_nocr( "rtems_message_queue_send: " );
+ puts( buffer1 );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer1, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "Delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr( "rtems_message_queue_urgent: " );
+ puts( buffer2 );
+ status = rtems_message_queue_urgent( Queue_id[ 1 ], (long (*)[4])buffer2, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ puts( "Delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr( "rtems_message_queue_broadcast: " );
+ puts( buffer3 );
+ status = rtems_message_queue_broadcast(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer3,
+ 16,
+ &broadcast_count
+ );
+ directive_failed( status, "rtems_message_queue_broadcast" );
+
+ puts( "Delaying for a second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+}
diff --git a/testsuites/mptests/mp09/system.h b/testsuites/mptests/mp09/system.h
new file mode 100644
index 0000000000..3c5f710ad9
--- /dev/null
+++ b/testsuites/mptests/mp09/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+void Receive_messages( void );
+
+void Send_messages( void );
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+extern char buffer1[16];
+extern char buffer2[16];
+extern char buffer3[16];
+extern char buffer4[16];
+
+/* end of include file */
diff --git a/testsuites/mptests/mp09/task1.c b/testsuites/mptests/mp09/task1.c
new file mode 100644
index 0000000000..bc0c75e404
--- /dev/null
+++ b/testsuites/mptests/mp09/task1.c
@@ -0,0 +1,109 @@
+/* Test_task
+ *
+ * This task tests global message queue operations. It also generates
+ * an error condition.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+char buffer1[16] = "123456789012345";
+char buffer2[16] = "abcdefghijklmno";
+char buffer3[16] = "ABCDEFGHIJKLMNO";
+char buffer4[16] = "PQRSTUVWXYZ(){}";
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 size;
+ char receive_buffer[16];
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting QID of message queue" );
+
+ do {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_message_queue_delete"
+ );
+ puts(
+ "rtems_message_queue_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+
+ Send_messages();
+ Receive_messages();
+
+ puts( "Flushing remote empty queue" );
+ status = rtems_message_queue_flush( Queue_id[ 1 ], &count );
+ directive_failed( status, "rtems_message_queue_flush" );
+ printf( "%d messages were flushed on the remote queue\n", count );
+
+ puts( "Send messages to be flushed from remote queue" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer1, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "Flushing remote queue" );
+ status = rtems_message_queue_flush( Queue_id[ 1 ], &count );
+ directive_failed( status, "rtems_message_queue_flush" );
+ printf( "%d messages were flushed on the remote queue\n", count );
+
+ puts( "Waiting for message queue to be deleted" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_message_queue_receive"
+ );
+ puts( "\nGlobal message queue deleted" );
+ }
+ else { /* node == 1 */
+ Receive_messages();
+ Send_messages();
+
+ puts( "Delaying for 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Deleting Message queue" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+ }
+
+ puts( "*** END OF TEST 9 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp10/init.c b/testsuites/mptests/mp10/init.c
new file mode 100644
index 0000000000..45400525a5
--- /dev/null
+++ b/testsuites/mptests/mp10/init.c
@@ -0,0 +1,143 @@
+/* Init
+ *
+ * This routine is the initialization routine for this test program.
+ * Other than creating all objects needed by this test, if this routine
+ * is running on node one, it acquires a global semaphore to
+ * force all other tasks to pend. If running on node two, this task
+ * sleeps for a while, and then deletes two local tasks which are
+ * waiting on a remote message queue or a semaphore.
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 10 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'S', 'A', '3', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ puts( "Creating Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 0,
+ RTEMS_GLOBAL | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ status = rtems_task_wake_after( 10 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ } else {
+
+ puts( "Creating Test_task 1 (local)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 1 (local)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task1, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Test_task 2 (local)" );
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 2 (local)" );
+ status = rtems_task_start( Task_id[ 2 ], Test_task2, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Test_task 3 (local)" );
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 3 (local)" );
+ status = rtems_task_start( Task_id[ 3 ], Test_task2, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Sleeping for 1 seconds ..." );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Deleting Test_task2" );
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of Task 2" );
+
+ puts( "Deleting Test_task1" );
+ status = rtems_task_delete( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_delete of Task 1" );
+
+ puts( "Restarting Test_task3" );
+ status = rtems_task_restart( Task_id[ 3 ], 1 );
+ directive_failed( status, "rtems_task_restart of Task 3" );
+
+ }
+ puts( "*** END OF TEST 10 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp10/node1/mp10.doc b/testsuites/mptests/mp10/node1/mp10.doc
new file mode 100644
index 0000000000..412c6c7b46
--- /dev/null
+++ b/testsuites/mptests/mp10/node1/mp10.doc
@@ -0,0 +1,46 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test59
+
+GLOBAL SEMAPHORE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+ h. Verifies that a task can get the task identification number
+ of another task.
+
+ i. Verifies that a task can delete itself or another task.
diff --git a/testsuites/mptests/mp10/node1/mp10.scn b/testsuites/mptests/mp10/node1/mp10.scn
new file mode 100644
index 0000000000..deeafc0a9a
--- /dev/null
+++ b/testsuites/mptests/mp10/node1/mp10.scn
@@ -0,0 +1,4 @@
+*** TEST 10 -- NODE 1 ***
+Creating Message Queue (Global)
+Creating Semaphore (Global)
+*** END OF TEST 10 ***
diff --git a/testsuites/mptests/mp10/node2/mp10.doc b/testsuites/mptests/mp10/node2/mp10.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp10/node2/mp10.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp10/node2/mp10.scn b/testsuites/mptests/mp10/node2/mp10.scn
new file mode 100644
index 0000000000..25c07e6202
--- /dev/null
+++ b/testsuites/mptests/mp10/node2/mp10.scn
@@ -0,0 +1,19 @@
+*** TEST 10 -- NODE 2 ***
+Creating Test_task 1 (local)
+Starting Test_task 1 (local)
+Creating Test_task 2 (local)
+Starting Test_task 2 (local)
+Creating Test_task 3 (local)
+Starting Test_task 3 (local)
+Sleeping for 1 seconds ...
+Getting QID of message queue
+Attempting to receive message ...
+Getting SMID of semaphore
+Attempting to acquire semaphore ...
+Getting SMID of semaphore
+Attempting to acquire semaphore ...
+Deleting Test_task2
+Deleting Test_task1
+Restarting Test_task3
+*** END OF TEST 10 ***
+
diff --git a/testsuites/mptests/mp10/system.h b/testsuites/mptests/mp10/system.h
new file mode 100644
index 0000000000..128a62363c
--- /dev/null
+++ b/testsuites/mptests/mp10/system.h
@@ -0,0 +1,64 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task3(
+ rtems_task_argument restart
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp10/task1.c b/testsuites/mptests/mp10/task1.c
new file mode 100644
index 0000000000..b9ce51bcc3
--- /dev/null
+++ b/testsuites/mptests/mp10/task1.c
@@ -0,0 +1,52 @@
+/* Test_task1
+ *
+ * This task attempts to receive a message from a global message queue.
+ * It should never actually receive the message.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+)
+{
+ char receive_buffer[16];
+ rtems_unsigned32 size;
+ rtems_status_code status;
+
+ puts( "Getting QID of message queue" );
+
+ do {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to receive message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+
+}
diff --git a/testsuites/mptests/mp10/task2.c b/testsuites/mptests/mp10/task2.c
new file mode 100644
index 0000000000..0627f795b3
--- /dev/null
+++ b/testsuites/mptests/mp10/task2.c
@@ -0,0 +1,47 @@
+/* Test_task2
+ *
+ * This task attempts to receive control of a global semaphore.
+ * It should never receive control of the semaphore.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "Getting SMID of semaphore" );
+
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to acquire semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+}
diff --git a/testsuites/mptests/mp10/task3.c b/testsuites/mptests/mp10/task3.c
new file mode 100644
index 0000000000..2c3cd2b297
--- /dev/null
+++ b/testsuites/mptests/mp10/task3.c
@@ -0,0 +1,50 @@
+/* Test_task3
+ *
+ * This task attempts to receive control of a global semaphore.
+ * It should never receive control of the semaphore.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task3( restart )
+rtems_task_argument restart;
+{
+ rtems_status_code status;
+
+ if ( restart == 1 ) {
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete" );
+ }
+
+ puts( "Getting SMID of semaphore" );
+
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to acquire semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+}
diff --git a/testsuites/mptests/mp11/init.c b/testsuites/mptests/mp11/init.c
new file mode 100644
index 0000000000..85cb06f2ee
--- /dev/null
+++ b/testsuites/mptests/mp11/init.c
@@ -0,0 +1,105 @@
+/* Init
+ *
+ * This routine is the initialization and test routine for
+ * this test program. It attempts to create more global
+ * objects than are configured (zero should be configured).
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 my_partition[0x30000] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id junk_id;
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 11 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Attempting to create Test_task (Global)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &junk_id
+ );
+ fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_task_create" );
+ puts( "rtems_task_create correctly returned RTEMS_TOO_MANY" );
+
+ puts( "Attempting to create Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_create"
+ );
+ puts( "rtems_message_queue_create correctly returned RTEMS_TOO_MANY" );
+
+ puts( "Attempting to create Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &junk_id
+ );
+ fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_semaphore_create" );
+ puts( "rtems_semaphore_create correctly returned RTEMS_TOO_MANY" );
+
+ puts( "Attempting to create Partition (Global)" );
+ status = rtems_partition_create(
+ 1,
+ (rtems_unsigned8 *) my_partition,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &junk_id
+ );
+ fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_partition_create" );
+ puts( "rtems_partition_create correctly returned RTEMS_TOO_MANY" );
+ }
+ puts( "*** END OF TEST 11 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp11/node1/mp11.doc b/testsuites/mptests/mp11/node1/mp11.doc
new file mode 100644
index 0000000000..613a4bfe67
--- /dev/null
+++ b/testsuites/mptests/mp11/node1/mp11.doc
@@ -0,0 +1,42 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test60
+
+TOO MANY GLOBAL OBJECTS ERROR TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ t_create, q_create, sm_create, pt_create
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that all object create directives correctly return
+ E_TOOMANYGOBJECTS.
diff --git a/testsuites/mptests/mp11/node1/mp11.scn b/testsuites/mptests/mp11/node1/mp11.scn
new file mode 100644
index 0000000000..fb26583852
--- /dev/null
+++ b/testsuites/mptests/mp11/node1/mp11.scn
@@ -0,0 +1,10 @@
+*** TEST 11 -- NODE 1 ***
+Attempting to create Test_task (Global)
+rtems_task_create correctly returned RTEMS_TOO_MANY
+Attempting to create Message Queue (Global)
+rtems_message_queue_create correctly returned RTEMS_TOO_MANY
+Attempting to create Semaphore (Global)
+rtems_semaphore_create correctly returned RTEMS_TOO_MANY
+Attempting to create Partition (Global)
+rtems_partition_create correctly returned RTEMS_TOO_MANY
+*** END OF TEST 11 ***
diff --git a/testsuites/mptests/mp11/node2/mp11.doc b/testsuites/mptests/mp11/node2/mp11.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp11/node2/mp11.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp11/node2/mp11.scn b/testsuites/mptests/mp11/node2/mp11.scn
new file mode 100644
index 0000000000..49bd8a3219
--- /dev/null
+++ b/testsuites/mptests/mp11/node2/mp11.scn
@@ -0,0 +1,2 @@
+*** TEST 11 -- NODE 2 ***
+*** END OF TEST 11 ***
diff --git a/testsuites/mptests/mp11/system.h b/testsuites/mptests/mp11/system.h
new file mode 100644
index 0000000000..afd105e708
--- /dev/null
+++ b/testsuites/mptests/mp11/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 0
+#define CONFIGURE_MP_MAXIMUM_PROXIES 0
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp12/init.c b/testsuites/mptests/mp12/init.c
new file mode 100644
index 0000000000..1aac821240
--- /dev/null
+++ b/testsuites/mptests/mp12/init.c
@@ -0,0 +1,113 @@
+/* Init
+ *
+ * This routine is the initialization routine and test code for
+ * global partitions. It creates a global partition, obtains and
+ * releases a buffer, and deletes the partition. The partition
+ * is created on node one, and an attempt is made to delete it
+ * by node two.
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 Partition_area[ 1024 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ void *bufaddr;
+
+ printf(
+ "\n\n*** TEST 12 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'A', 'R', ' ' );
+
+ puts( "Got to initialization task" );
+
+ if ( Multiprocessing_configuration.node == 2 ) {
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting ID of remote Partition (Global)" );
+
+ do {
+ status = rtems_partition_ident(
+ Partition_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Partition_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ puts( "Attempting to delete remote Partition (Global)" );
+ status = rtems_partition_delete( Partition_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ILLEGAL_ON_REMOTE_OBJECT,
+ "rtems_partition_delete"
+ );
+ puts(
+ "rtems_partition_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT"
+ );
+
+ puts( "Obtaining a buffer from the global partition" );
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &bufaddr );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ printf( "Address returned was : 0x%p\n", bufaddr );
+
+ puts( "Releasing a buffer to the global partition" );
+ status = rtems_partition_return_buffer( Partition_id[ 1 ], bufaddr );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+ else {
+ puts( "Creating Partition (Global)" );
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_area,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create" );
+
+ puts( "Sleeping for two seconds" );
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Deleting Partition (Global)" );
+ status = rtems_partition_delete( Partition_id[ 1 ] );
+ directive_failed( status, "rtems_partition_delete" );
+ }
+ puts( "*** END OF TEST 12 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp12/node1/mp12.doc b/testsuites/mptests/mp12/node1/mp12.doc
new file mode 100644
index 0000000000..6c670b7da8
--- /dev/null
+++ b/testsuites/mptests/mp12/node1/mp12.doc
@@ -0,0 +1,52 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test61
+
+GLOBAL PARTITION TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, tm_wkafter,
+ pt_create, pt_delete, pt_getbuf, pt_retbuf
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies the Shared Memory Locked Queue Driver.
+
+ h. Verifies _Rpc() and _Process_pkt() for the following packet types:
+ P_OBJCREATE (partitions),
+ P_OBJDELETE (partitions),
+ P_PTGETBUF, and
+ P_PTRETBUF.
+
+ i. Verifies normal and error paths (other than E_TOOMANYGOBJECTS)
+ for global partitions.
+
+ j. Verifies that a task can delete itself.
diff --git a/testsuites/mptests/mp12/node1/mp12.scn b/testsuites/mptests/mp12/node1/mp12.scn
new file mode 100644
index 0000000000..605a2c11db
--- /dev/null
+++ b/testsuites/mptests/mp12/node1/mp12.scn
@@ -0,0 +1,6 @@
+*** TEST 12 -- NODE 1 ***
+Got to initialization task
+Creating Partition (Global)
+Sleeping for two seconds
+Deleting Partition (Global)
+*** END OF TEST 12 ***
diff --git a/testsuites/mptests/mp12/node2/mp12.doc b/testsuites/mptests/mp12/node2/mp12.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp12/node2/mp12.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp12/node2/mp12.scn b/testsuites/mptests/mp12/node2/mp12.scn
new file mode 100644
index 0000000000..ad65e9cb32
--- /dev/null
+++ b/testsuites/mptests/mp12/node2/mp12.scn
@@ -0,0 +1,10 @@
+*** TEST 12 -- NODE 2 ***
+Got to initialization task
+Getting ID of remote Partition (Global)
+Attempting to delete remote Partition (Global)
+rtems_partition_delete correctly returned RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+Obtaining a buffer from the global partition
+>>>>>>> address returned will differ
+Address returned was : 0x200f0000
+Releasing a buffer to the global partition
+*** END OF TEST 12 ***
diff --git a/testsuites/mptests/mp12/system.h b/testsuites/mptests/mp12/system.h
new file mode 100644
index 0000000000..af91912676
--- /dev/null
+++ b/testsuites/mptests/mp12/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+#define PT_NAME rtems_build_name( 'P', 'A', 'R', '\0' )
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MP_MAXIMUM_GLOBAL_OBJECTS 1
+#define CONFIGURE_MP_MAXIMUM_PROXIES 0
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#elif ( NODE_NUMBER == 2 )
+#define CONFIGURE_MAXIMUM_PARTITIONS 2
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Partition_id[ 2 ]; /* array of partition ids */
+TEST_EXTERN rtems_name Partition_name[ 2 ]; /* array of partition names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp13/init.c b/testsuites/mptests/mp13/init.c
new file mode 100644
index 0000000000..92ff0b396a
--- /dev/null
+++ b/testsuites/mptests/mp13/init.c
@@ -0,0 +1,115 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ printf(
+ "\n\n*** TEST 13 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ puts( "Creating Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+ }
+
+ puts( "Creating Test_task 1 (local)" );
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 1 (local)" );
+ status = rtems_task_start( Task_id[ 1 ], Test_task1, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Test_task 2 (local)" );
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Test_task 2 (local)" );
+ status = rtems_task_start( Task_id[ 2 ], Test_task2, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_task_wake_after( 5 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+ }
+ puts( "Deleting initialization task" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp13/node1/mp13.doc b/testsuites/mptests/mp13/node1/mp13.doc
new file mode 100644
index 0000000000..999ec29615
--- /dev/null
+++ b/testsuites/mptests/mp13/node1/mp13.doc
@@ -0,0 +1,48 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test62
+
+GLOBAL SEMAPHORE TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, tm_wkafter,
+ sm_create, q_create, sm_p, q_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies the Shared Memory Locked Queue Driver.
+
+ h. Verifies that E_MESSAGETIMEOUT is when waiting on a
+ remote message queue.
+
+ i. Verifies that E_SEMTIMEOUT is when waiting on a remote semaphore.
+
+ j. Verifies that a task can delete itself.
diff --git a/testsuites/mptests/mp13/node1/mp13.scn b/testsuites/mptests/mp13/node1/mp13.scn
new file mode 100644
index 0000000000..d3bd11f65e
--- /dev/null
+++ b/testsuites/mptests/mp13/node1/mp13.scn
@@ -0,0 +1,14 @@
+*** TEST 13 -- NODE 1 ***
+Creating Message Queue (Global)
+Creating Semaphore (Global)
+Creating Test_task 1 (local)
+Starting Test_task 1 (local)
+Creating Test_task 2 (local)
+Starting Test_task 2 (local)
+Getting QID of message queue
+Receiving message ...
+Getting SMID of semaphore
+Releasing semaphore ...
+Getting semaphore ...
+Getting semaphore ...
+*** END OF TEST 13 ***
diff --git a/testsuites/mptests/mp13/node2/mp13.doc b/testsuites/mptests/mp13/node2/mp13.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp13/node2/mp13.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp13/node2/mp13.scn b/testsuites/mptests/mp13/node2/mp13.scn
new file mode 100644
index 0000000000..e9df202a94
--- /dev/null
+++ b/testsuites/mptests/mp13/node2/mp13.scn
@@ -0,0 +1,16 @@
+*** TEST 13 -- NODE 2 ***
+Creating Test_task 1 (local)
+Starting Test_task 1 (local)
+Creating Test_task 2 (local)
+Starting Test_task 2 (local)
+Deleting initialization task
+Getting QID of message queue
+Getting SMID of semaphore
+Getting semaphore ...
+Receiving message ...
+Releasing semaphore ...
+Getting semaphore ...
+rtems_message_queue_receive correctly returned RTEMS_TIMEOUT
+Deleting self
+rtems_semaphore_obtain correctly returned RTEMS_TIMEOUT
+*** END OF TEST 13 ***
diff --git a/testsuites/mptests/mp13/system.h b/testsuites/mptests/mp13/system.h
new file mode 100644
index 0000000000..cae888d912
--- /dev/null
+++ b/testsuites/mptests/mp13/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 2 ]; /* array of message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 2 ]; /* array of message queue names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 2 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 2 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/testsuites/mptests/mp13/task1.c b/testsuites/mptests/mp13/task1.c
new file mode 100644
index 0000000000..a82104573e
--- /dev/null
+++ b/testsuites/mptests/mp13/task1.c
@@ -0,0 +1,73 @@
+/* Test_task1
+ *
+ * This task attempts to receive a message from a global message queue.
+ * If running on the node on which the queue resides, the wait is
+ * forever, otherwise it times out on a remote message queue.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task1(
+ rtems_task_argument argument
+)
+{
+ char receive_buffer[16];
+ rtems_unsigned32 size;
+ rtems_status_code status;
+
+ puts( "Getting QID of message queue" );
+
+ do {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Receiving message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "How did I get back from here????" );
+ directive_failed( status, "rtems_message_queue_receive" );
+ }
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Receiving message ..." );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 2 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(status, RTEMS_TIMEOUT, "rtems_message_queue_receive");
+ puts( "rtems_message_queue_receive correctly returned RTEMS_TIMEOUT" );
+
+ puts( "Deleting self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/mptests/mp13/task2.c b/testsuites/mptests/mp13/task2.c
new file mode 100644
index 0000000000..51ce76e95e
--- /dev/null
+++ b/testsuites/mptests/mp13/task2.c
@@ -0,0 +1,106 @@
+/* Test_task2
+ *
+ * This task attempts to receive control of a global semaphore.
+ * If running on the node on which the semaphore resides, the wait is
+ * forever, otherwise it times out on a remote semaphore.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "Getting SMID of semaphore" );
+ do {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ } while ( !rtems_is_status_successful( status ) );
+
+ directive_failed( status, "rtems_semaphore_ident" );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Releasing semaphore ..." );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "How did I get back from here????" );
+ directive_failed( status, "rtems_semaphore_obtain" );
+ }
+
+/*
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+*/
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+
+ puts( "Releasing semaphore ..." );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "Getting semaphore ..." );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ 2 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_semaphore_obtain"
+ );
+ puts( "rtems_semaphore_obtain correctly returned RTEMS_TIMEOUT" );
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/mptests/mp14/delay.c b/testsuites/mptests/mp14/delay.c
new file mode 100644
index 0000000000..81e79d99ea
--- /dev/null
+++ b/testsuites/mptests/mp14/delay.c
@@ -0,0 +1,34 @@
+/* Delayed_send_event
+ *
+ * This routine is a timer service routine which sends an event to a task.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id timer_id,
+ void *ignored
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send(
+ Task_id[ rtems_get_index( timer_id ) ],
+ RTEMS_EVENT_16
+ );
+ directive_failed( status, "rtems_event_send" );
+}
diff --git a/testsuites/mptests/mp14/evtask1.c b/testsuites/mptests/mp14/evtask1.c
new file mode 100644
index 0000000000..7242d08b77
--- /dev/null
+++ b/testsuites/mptests/mp14/evtask1.c
@@ -0,0 +1,87 @@
+/* Test_task
+ *
+ * This task either continuously sends events to a remote task, or
+ * continuously receives events sent by a remote task. This decision
+ * is based upon the local node number.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 remote_node;
+ rtems_id remote_tid;
+ rtems_event_set event_out;
+
+ remote_node = ((Multiprocessing_configuration.node == 1) ? 2 : 1);
+
+ puts( "About to go to sleep!" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ puts( "Waking up!" );
+
+ puts_nocr( "Remote task's name is : " );
+ put_name( Task_name[ remote_node ], TRUE );
+
+ puts( "Getting TID of remote task" );
+ while ( FOREVER ) {
+ status = rtems_task_ident(
+ Task_name[ remote_node ],
+ RTEMS_SEARCH_ALL_NODES,
+ &remote_tid
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+ puts( "rtems_task_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Sending events to remote task" );
+ while ( Stop_Test == FALSE ) {
+ for ( count=EVENT_TASK_DOT_COUNT; Stop_Test == FALSE && count; count-- ) {
+ status = rtems_event_send( remote_tid, RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+ }
+ put_dot( 'e' );
+ }
+ }
+
+ puts( "Receiving events from remote task" );
+ while ( Stop_Test == FALSE ) {
+ for ( count=EVENT_TASK_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ directive_failed( status, "rtems_event_receive" );
+ }
+ put_dot( 'e' );
+ }
+
+ Exit_test();
+}
diff --git a/testsuites/mptests/mp14/evtmtask.c b/testsuites/mptests/mp14/evtmtask.c
new file mode 100644
index 0000000000..8a724b9f54
--- /dev/null
+++ b/testsuites/mptests/mp14/evtmtask.c
@@ -0,0 +1,65 @@
+/* Delayed_events_task
+ *
+ * This task continuously sends itself events at one tick
+ * intervals.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Delayed_events_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_unsigned32 previous_mode;
+ rtems_status_code status;
+ rtems_event_set events;
+
+ status = rtems_task_mode(
+ RTEMS_PREEMPT | RTEMS_TIMESLICE,
+ RTEMS_PREEMPT_MASK | RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ while ( Stop_Test == FALSE ) {
+ for ( count=DELAYED_EVENT_DOT_COUNT; Stop_Test == FALSE && count; count-- ){
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 1,
+ Delayed_send_event,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_reset" );
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &events
+ );
+ directive_failed( status, "rtems_event_receive" );
+ }
+ put_dot('.');
+ }
+
+ Exit_test();
+}
diff --git a/testsuites/mptests/mp14/exit.c b/testsuites/mptests/mp14/exit.c
new file mode 100644
index 0000000000..8825a4bf13
--- /dev/null
+++ b/testsuites/mptests/mp14/exit.c
@@ -0,0 +1,40 @@
+/* Exit_test
+ *
+ * This routine safely stops the test and prints some information
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Exit_test( void )
+{
+ rtems_status_code status;
+ rtems_mode old_mode;
+
+ /*
+ * Wait a bit before shutting down so we don't screw up the other node
+ * when our MPCI shuts down
+ */
+
+ rtems_task_wake_after(20);
+
+ status = rtems_task_mode( RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &old_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ MPCI_Print_statistics();
+
+ rtems_shutdown_executive( 0 );
+}
diff --git a/testsuites/mptests/mp14/init.c b/testsuites/mptests/mp14/init.c
new file mode 100644
index 0000000000..61eca70a6e
--- /dev/null
+++ b/testsuites/mptests/mp14/init.c
@@ -0,0 +1,191 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 my_partition[0x30000] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_timer_service_routine Stop_Test_TSR(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ Stop_Test = TRUE;
+}
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+
+ printf(
+ "\n\n*** TEST 14 -- NODE %d ***\n",
+ Multiprocessing_configuration.node
+ );
+
+ Stop_Test = FALSE;
+
+ status = rtems_timer_create(
+ rtems_build_name('S', 'T', 'O', 'P'),
+ &timer_id
+ );
+ directive_failed( status, "rtems_timer_create" );
+
+ status = rtems_timer_fire_after(
+ timer_id,
+ MAX_LONG_TEST_DURATION * TICKS_PER_SECOND,
+ Stop_Test_TSR,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ Task_name[ 1 ] = rtems_build_name( '1', '1', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( '2', '2', '2', ' ' );
+
+ Queue_task_name[ 1 ] = rtems_build_name( 'M', 'T', '1', ' ' );
+ Queue_task_name[ 2 ] = rtems_build_name( 'M', 'T', '2', ' ' );
+
+ Partition_task_name[ 1 ] = rtems_build_name( 'P', 'T', '1', ' ' );
+ Partition_task_name[ 2 ] = rtems_build_name( 'P', 'T', '2', ' ' );
+
+ Semaphore_task_name[ 1 ] = rtems_build_name( 'S', 'M', '1', ' ' );
+ Semaphore_task_name[ 2 ] = rtems_build_name( 'S', 'M', '2', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'E', 'M', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'S', 'G', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'A', 'R', ' ' );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', 'R', ' ' );
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ puts( "Creating Semaphore (Global)" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ puts( "Creating Message Queue (Global)" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 1,
+ 16,
+ RTEMS_GLOBAL,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ puts( "Creating Partition (Global)" );
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ (void *)my_partition,
+ 0x8000,
+ 0x3800,
+ RTEMS_GLOBAL,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create" );
+ }
+
+ puts( "Creating Event task (Global)" );
+ status = rtems_task_create(
+ Task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Event_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Event task (Global)" );
+ status = rtems_task_start( Event_task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Semaphore task (Global)" );
+ status = rtems_task_create(
+ Semaphore_task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Semaphore_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Semaphore task (Global)" );
+ status = rtems_task_start( Semaphore_task_id[ 1 ], Semaphore_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Message Queue task (Global)" );
+ status = rtems_task_create(
+ Queue_task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Queue_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ /* argument is index into Buffers */
+ puts( "Starting Message Queue task (Global)" );
+ status = rtems_task_start( Queue_task_id[ 1 ], Message_queue_task, 1 );
+ directive_failed( status, "rtems_task_start" );
+
+ puts( "Creating Partition task (Global)" );
+ status = rtems_task_create(
+ Partition_task_name[ Multiprocessing_configuration.node ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_GLOBAL,
+ &Partition_task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ puts( "Starting Partition task (Global)" );
+ status = rtems_task_start( Partition_task_id[ 1 ], Partition_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_set_priority( RTEMS_SELF, 2, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_task_ident(
+ RTEMS_SELF,
+ RTEMS_SEARCH_ALL_NODES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_ident" );
+
+ Delayed_events_task( 1 );
+}
diff --git a/testsuites/mptests/mp14/msgtask1.c b/testsuites/mptests/mp14/msgtask1.c
new file mode 100644
index 0000000000..6f9033cf17
--- /dev/null
+++ b/testsuites/mptests/mp14/msgtask1.c
@@ -0,0 +1,107 @@
+/* Message_queue_task
+ *
+ * This task continuously sends messages to and receives messages from
+ * a global message queue. The message buffer is viewed as an array
+ * of two sixty-four bit counts which are incremented when a message is
+ * received.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Message_queue_task(
+ rtems_task_argument index
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 count;
+ rtems_unsigned32 yield_count;
+ rtems_unsigned32 *buffer_count;
+ rtems_unsigned32 *overflow_count;
+ rtems_unsigned32 size;
+
+ Msg_buffer[ index ][0] = 0;
+ Msg_buffer[ index ][1] = 0;
+ Msg_buffer[ index ][2] = 0;
+ Msg_buffer[ index ][3] = 0;
+
+ puts( "Getting ID of msg queue" );
+ while ( FOREVER ) {
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Queue_id[ 1 ]
+ );
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+ puts( "rtems_message_queue_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ if ( Multiprocessing_configuration.node == 1 ) {
+ status = rtems_message_queue_send(
+ Queue_id[ 1 ],
+ (long (*)[4])Msg_buffer[ index ],
+ 16
+ );
+ directive_failed( status, "rtems_message_queue_send" );
+ overflow_count = &Msg_buffer[ index ][0];
+ buffer_count = &Msg_buffer[ index ][1];
+ } else {
+ overflow_count = &Msg_buffer[ index ][2];
+ buffer_count = &Msg_buffer[ index ][3];
+ }
+
+ while ( Stop_Test == FALSE ) {
+ yield_count = 100;
+
+ for ( count=MESSAGE_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])Msg_buffer[ index ],
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+
+ if ( *buffer_count == (rtems_unsigned32)0xffffffff ) {
+ *buffer_count = 0;
+ *overflow_count += 1;
+ } else
+ *buffer_count += 1;
+
+ status = rtems_message_queue_send(
+ Queue_id[ 1 ],
+ (long (*)[4])Msg_buffer[ index ],
+ 16
+ );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ if (Stop_Test == FALSE)
+ if ( Multiprocessing_configuration.node == 1 && --yield_count == 0 ) {
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ yield_count = 100;
+ }
+ }
+ put_dot( 'm' );
+ }
+
+ Exit_test();
+}
diff --git a/testsuites/mptests/mp14/node1/mp14.doc b/testsuites/mptests/mp14/node1/mp14.doc
new file mode 100644
index 0000000000..4e7dde6c38
--- /dev/null
+++ b/testsuites/mptests/mp14/node1/mp14.doc
@@ -0,0 +1,50 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test63
+
+INTERRUPT SATURATION TEST
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_ident, tm_tick,
+ tm_evwhen, tm_wkafter, i_return, ev_send, ev_receive
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies printing of strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies printing of strings to the CRT on port 2 of the mvme136 board
+ using Write and Writeln and the TTY driver.
+
+ e. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ f. Verifies executive initialization performed correctly.
+
+ g. Verifies the executive trap handler except for the halt function.
+
+ h. Verifies that a task can get the task identification number of itself.
+
+ i. Verifies that a task can get the task identification number
+ of another task.
+
+ j. Verifies that events can be sent to a remote task.
diff --git a/testsuites/mptests/mp14/node1/mp14.scn b/testsuites/mptests/mp14/node1/mp14.scn
new file mode 100644
index 0000000000..f57c4f47b3
--- /dev/null
+++ b/testsuites/mptests/mp14/node1/mp14.scn
@@ -0,0 +1,41 @@
+*** TEST 14 -- NODE 1 ***
+Creating Semaphore (Global)
+Creating Message Queue (Global)
+Creating Partition (Global)
+Creating Event task (Global)
+Starting Event task (Global)
+Creating Semaphore task (Global)
+About to go to sleep!
+Starting Semaphore task (Global)
+Creating Message Queue task (Global)
+Getting SMID of semaphore
+Starting Message Queue task (Global)
+Creating Partition task (Global)
+Getting ID of msg queue
+Starting Partition task (Global)
+Getting ID of partition
+Waking up!
+Remote task's name is : 222
+Getting TID of remote task
+Sending events to remote task
+<stream of following characters>
+
+. - indicates 100 iterations of
+ tm_evafter of 1 tick and rtems_event_receive.
+
+e - indicates that 100
+ events have been sent to the remote task.
+
+m - indicates 100 iterations of
+ rtems_message_queue_send and rtems_message_queue_receive.
+
+p - indicates 100 iterations of
+ rtems_partition_get_buffer and rtems_partition_return_buffer.
+
+s - indicates 100 iterations of
+ rtems_semaphore_obtain and rtems_semaphore_release.
+
+NOTES: 1. The messages could be interspersed.
+ 2. If one of the nodes exits first, the other may report
+ timeout errors on blocking directives.
+
diff --git a/testsuites/mptests/mp14/node2/mp14.doc b/testsuites/mptests/mp14/node2/mp14.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/mptests/mp14/node2/mp14.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/mptests/mp14/node2/mp14.scn b/testsuites/mptests/mp14/node2/mp14.scn
new file mode 100644
index 0000000000..d128c870e9
--- /dev/null
+++ b/testsuites/mptests/mp14/node2/mp14.scn
@@ -0,0 +1,38 @@
+*** TEST 14 -- NODE 2 ***
+Creating Event task (Global)
+Starting Event task (Global)
+Creating Semaphore task (Global)
+About to go to sleep!
+Starting Semaphore task (Global)
+Creating Message Queue task (Global)
+Getting SMID of semaphore
+Starting Message Queue task (Global)
+Creating Partition task (Global)
+Getting ID of msg queue
+Starting Partition task (Global)
+Getting ID of partition
+Waking up!
+Remote task's name is : 111
+Getting TID of remote task
+Receiving events from remote task
+<stream of following characters>
+
+. - indicates 100 iterations of
+ tm_evafter of 1 tick and rtems_event_receive.
+
+e - indicates that 100
+ events have been sent to the remote task.
+
+m - indicates 100 iterations of
+ rtems_message_queue_send and rtems_message_queue_receive.
+
+p - indicates 100 iterations of
+ rtems_partition_get_buffer and rtems_partition_return_buffer.
+
+s - indicates 100 iterations of
+ rtems_semaphore_obtain and rtems_semaphore_release.
+
+NOTES: 1. The messages could be interspersed.
+ 2. If one of the nodes exits first, the other may report
+ timeout errors on blocking directives.
+
diff --git a/testsuites/mptests/mp14/pttask1.c b/testsuites/mptests/mp14/pttask1.c
new file mode 100644
index 0000000000..f2ab42f0cd
--- /dev/null
+++ b/testsuites/mptests/mp14/pttask1.c
@@ -0,0 +1,71 @@
+/* Partition_task
+ *
+ * This task continuously gets a buffer from and returns that buffer
+ * to a global partition.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Partition_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+ rtems_unsigned32 yield_count;
+ void *buffer;
+
+ puts( "Getting ID of partition" );
+ while ( FOREVER ) {
+ status = rtems_partition_ident(
+ Partition_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Partition_id[ 1 ]
+ );
+
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+
+ puts( "rtems_partition_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ yield_count = 100;
+
+ while ( Stop_Test == FALSE ) {
+ for ( count=PARTITION_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer );
+ directive_failed( status, "rtems_partition_get_buffer" );
+
+ status = rtems_partition_return_buffer( Partition_id[ 1 ], buffer );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ if (Stop_Test == FALSE)
+ if ( Multiprocessing_configuration.node == 1 && --yield_count == 0 ) {
+ status = rtems_task_wake_after( 1 );
+ directive_failed( status, "rtems_task_wake_after" );
+ yield_count = 100;
+ }
+ }
+ put_dot( 'p' );
+ }
+
+ Exit_test();
+}
diff --git a/testsuites/mptests/mp14/smtask1.c b/testsuites/mptests/mp14/smtask1.c
new file mode 100644
index 0000000000..fbba4d8280
--- /dev/null
+++ b/testsuites/mptests/mp14/smtask1.c
@@ -0,0 +1,73 @@
+/* Sm_test_task
+ *
+ * This task continuously obtains and releases a global semaphore.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+rtems_task Semaphore_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+ rtems_unsigned32 yield_count;
+
+ puts( "Getting SMID of semaphore" );
+ while ( FOREVER ) {
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &Semaphore_id[ 1 ]
+ );
+ if ( status == RTEMS_SUCCESSFUL )
+ break;
+ puts( "rtems_semaphore_ident FAILED!!" );
+ rtems_task_wake_after(2);
+ }
+
+ yield_count = 100;
+
+ while ( Stop_Test == FALSE ) {
+
+ for ( count=SEMAPHORE_DOT_COUNT ; Stop_Test == FALSE && count ; count-- ) {
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain" );
+
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ if ( Stop_Test == FALSE )
+ if ( Multiprocessing_configuration.node == 1 && --yield_count == 0 ) {
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ yield_count = 100;
+ }
+ }
+ put_dot( 's' );
+ }
+
+ Exit_test();
+}
diff --git a/testsuites/mptests/mp14/system.h b/testsuites/mptests/mp14/system.h
new file mode 100644
index 0000000000..689614676f
--- /dev/null
+++ b/testsuites/mptests/mp14/system.h
@@ -0,0 +1,117 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_timer_service_routine Delayed_send_event(
+ rtems_id timer_id,
+ void *ignored_address
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_task Delayed_events_task(
+ rtems_task_argument argument
+);
+
+rtems_task Message_queue_task(
+ rtems_task_argument index
+);
+
+rtems_task Partition_task(
+ rtems_task_argument argument
+);
+
+rtems_task Semaphore_task(
+ rtems_task_argument argument
+);
+
+void Exit_test( void );
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 1
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(1)
+
+#if ( NODE_NUMBER == 1 )
+#define CONFIGURE_MAXIMUM_TIMERS 12
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#elif ( NODE_NUMBER == 2 )
+#define CONFIGURE_MAXIMUM_TIMERS 2
+#endif
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Event_task_id[ 2 ]; /* event task ids */
+
+TEST_EXTERN rtems_id Semaphore_task_id[ 2 ]; /* semaphore task ids */
+TEST_EXTERN rtems_name Semaphore_task_name[ 2 ]; /* semaphore task names */
+
+TEST_EXTERN rtems_id Queue_task_id[ 3 ]; /* message queue task ids */
+TEST_EXTERN rtems_name Queue_task_name[ 3 ]; /* message queue task names */
+
+TEST_EXTERN rtems_id Partition_task_id[ 4 ]; /* partition task ids */
+TEST_EXTERN rtems_name Partition_task_name[ 4 ]; /* partition task names */
+
+TEST_EXTERN rtems_id Partition_id[ 3 ]; /* partition ids */
+TEST_EXTERN rtems_name Partition_name[ 3 ]; /* partition names */
+
+TEST_EXTERN rtems_id Semaphore_id[ 3 ]; /* semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 3 ]; /* semaphore names */
+
+TEST_EXTERN rtems_id Queue_id[ 3 ]; /* message queue ids */
+TEST_EXTERN rtems_name Queue_name[ 3 ]; /* message queue names */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* remote event task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* remote event task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* event timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* event timer names */
+
+TEST_EXTERN rtems_unsigned32 Msg_buffer[ 4 ][ 4 ];
+
+extern rtems_multiprocessing_table Multiprocessing_configuration;
+
+TEST_EXTERN volatile rtems_boolean Stop_Test;
+TEST_EXTERN rtems_id timer_id;
+
+#define EVENT_TASK_DOT_COUNT 100
+#define EVENT_SEND_DOT_COUNT 100
+#define DELAYED_EVENT_DOT_COUNT 1000
+#define MESSAGE_DOT_COUNT 200
+#define PARTITION_DOT_COUNT 200
+#define SEMAPHORE_DOT_COUNT 200
+
+/* end of include file */
diff --git a/testsuites/psxtests/include/pmacros.h b/testsuites/psxtests/include/pmacros.h
new file mode 100644
index 0000000000..1f15dac9c0
--- /dev/null
+++ b/testsuites/psxtests/include/pmacros.h
@@ -0,0 +1,85 @@
+/*
+ * $Id$
+ */
+
+#ifndef __POSIX_TEST_MACROS_h
+#define __POSIX_TEST_MACROS_h
+
+#include <bsp.h>
+#include <pthread.h>
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+/*
+ * These help manipulate the "struct tm" form of time
+ */
+
+#define TM_SUNDAY 0
+#define TM_MONDAY 1
+#define TM_TUESDAY 2
+#define TM_WEDNESDAY 3
+#define TM_THURSDAY 4
+#define TM_FRIDAY 5
+#define TM_SATURDAY 6
+
+#define TM_JANUARY 0
+#define TM_FEBRUARY 1
+#define TM_MARCH 2
+#define TM_APRIL 3
+#define TM_MAY 4
+#define TM_JUNE 5
+#define TM_JULY 6
+#define TM_AUGUST 7
+#define TM_SEPTEMBER 8
+#define TM_OCTOBER 10
+#define TM_NOVEMBER 12
+#define TM_DECEMBER 12
+
+#define build_time( TM, WEEKDAY, MON, DAY, YR, HR, MIN, SEC ) \
+ { (TM)->tm_year = YR; \
+ (TM)->tm_mon = MON; \
+ (TM)->tm_mday = DAY; \
+ (TM)->tm_wday = WEEKDAY; \
+ (TM)->tm_hour = HR; \
+ (TM)->tm_min = MIN; \
+ (TM)->tm_sec = SEC; }
+
+#define set_time( WEEKDAY, MON, DAY, YR, HR, MIN, SEC ) \
+ do { \
+ struct tm tm; \
+ struct timespec tv; \
+ int status; \
+ \
+ build_time( &tm, WEEKDAY, MON, DAY, YR, HR, MIN, SEC ); \
+ \
+ tv.tv_sec = mktime( &tm ); \
+ tv.tv_nsec = 0; \
+ assert( tv.tv_sec != -1 ); \
+ \
+ status = clock_settime( CLOCK_REALTIME, &tv ); \
+ assert( !status ); \
+ } while ( 0 )
+
+#define print_current_time(s1, s2) \
+ do { \
+ char _buffer[32]; \
+ int _status; \
+ struct timespec _tv; \
+ \
+ _status = clock_gettime( CLOCK_REALTIME, &_tv ); \
+ assert( !_status ); \
+ \
+ (void) ctime_r( &_tv.tv_sec, _buffer ); \
+ _buffer[ strlen( _buffer ) - 1 ] = 0; \
+ printf( "%s%s%s\n", s1, _buffer, s2 ); \
+ fflush(stdout); \
+ } while ( 0 )
+
+#define empty_line() puts( "" )
+
+#endif
+
+/* end of file */
diff --git a/testsuites/psxtests/psx01/init.c b/testsuites/psxtests/psx01/init.c
new file mode 100644
index 0000000000..848d130fb2
--- /dev/null
+++ b/testsuites/psxtests/psx01/init.c
@@ -0,0 +1,225 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <sched.h>
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ struct timespec tv;
+ struct timespec tr;
+ int status;
+ int priority;
+ pthread_t thread_id;
+ time_t seconds;
+ time_t seconds1;
+ time_t remaining;
+ struct tm tm;
+
+ puts( "\n\n*** POSIX TEST 1 ***" );
+
+ build_time( &tm, TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* error cases in clock_gettime and clock_settime */
+
+ puts( "Init: clock_gettime - EINVAL (invalid clockid)" );
+ status = clock_settime( -1, &tv );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ puts( "Init: clock_settime - EINVAL (invalid clockid)" );
+ status = clock_settime( -1, &tv );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ /* exercise clock_getres */
+
+ puts( "Init: clock_getres - EINVAL (invalid clockid)" );
+ status = clock_getres( -1, &tv );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ puts( "Init: clock_getres - EINVAL (NULL resolution)" );
+ status = clock_getres( CLOCK_REALTIME, NULL );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ puts( "Init: clock_getres - SUCCESSFUL" );
+ status = clock_getres( CLOCK_REALTIME, &tv );
+ printf( "Init: resolution = sec (%ld), nsec (%ld)\n", tv.tv_sec, tv.tv_nsec );
+ assert( !status );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ tv.tv_sec = mktime( &tm );
+ assert( tv.tv_sec != -1 );
+
+ tv.tv_nsec = 0;
+
+ /* now set the time of day */
+
+ empty_line();
+
+ printf( asctime( &tm ) );
+ puts( "Init: clock_settime - SUCCESSFUL" );
+ status = clock_settime( CLOCK_REALTIME, &tv );
+ assert( !status );
+
+ printf( asctime( &tm ) );
+ printf( ctime( &tv.tv_sec ) );
+
+ /* use sleep to delay */
+
+ remaining = sleep( 3 );
+ assert( !remaining );
+
+ /* print new times to make sure it has changed and we can get the realtime */
+
+ status = clock_gettime( CLOCK_REALTIME, &tv );
+ assert( !status );
+
+ printf( ctime( &tv.tv_sec ) );
+
+ seconds = time( NULL );
+ printf( ctime( &seconds ) );
+
+ /* just to have the value copied out through the parameter */
+
+ seconds = time( &seconds1 );
+ assert( seconds == seconds1 );
+
+ /* check the time remaining */
+
+ printf( "Init: seconds remaining (%d)\n", (int)remaining );
+ assert( !remaining );
+
+ /* error cases in nanosleep */
+
+ empty_line();
+ puts( "Init: nanosleep - EINVAL (NULL time)" );
+ status = nanosleep ( NULL, &tr );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ tv.tv_sec = 0;
+ tv.tv_nsec = TOD_NANOSECONDS_PER_SECOND * 2;
+ puts( "Init: nanosleep - EINVAL (too many nanoseconds)" );
+ status = nanosleep ( &tv, &tr );
+ assert( status == -1 );
+ assert( errno == EINVAL );
+
+ /* this is actually a small delay or yield */
+ tv.tv_sec = -1;
+ tv.tv_nsec = 0;
+ puts( "Init: nanosleep - negative seconds small delay " );
+ status = nanosleep ( &tv, &tr );
+ assert( !status );
+
+ /* use nanosleep to yield */
+
+ tv.tv_sec = 0;
+ tv.tv_nsec = 0;
+
+ puts( "Init: nanosleep - yield" );
+ status = nanosleep ( &tv, &tr );
+ assert( !status );
+ assert( !tr.tv_sec );
+ assert( !tr.tv_nsec );
+
+ /* use nanosleep to delay */
+
+ tv.tv_sec = 3;
+ tv.tv_nsec = 500000;
+
+ puts( "Init: nanosleep - 3.05 seconds" );
+ status = nanosleep ( &tv, &tr );
+ assert( !status );
+
+ /* print the current real time again */
+
+ status = clock_gettime( CLOCK_REALTIME, &tv );
+ assert( !status );
+
+ printf( ctime( &tv.tv_sec ) );
+
+ /* check the time remaining */
+
+ printf( "Init: sec (%ld), nsec (%ld) remaining\n", tr.tv_sec, tr.tv_nsec );
+ assert( !tr.tv_sec && !tr.tv_nsec );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init: ID is 0x%08x\n", Init_id );
+
+ /* exercise get minimum priority */
+
+ priority = sched_get_priority_min( SCHED_FIFO );
+ printf( "Init: sched_get_priority_min (SCHED_FIFO) -- %d\n", priority );
+ assert( priority != -1 );
+
+ puts( "Init: sched_get_priority_min -- EINVAL (invalid policy)" );
+ priority = sched_get_priority_min( -1 );
+ assert( priority == -1 );
+ assert( errno == EINVAL );
+
+ /* exercise get maximum priority */
+
+ priority = sched_get_priority_max( SCHED_FIFO );
+ printf( "Init: sched_get_priority_max (SCHED_FIFO) -- %d\n", priority );
+ assert( priority != -1 );
+
+ puts( "Init: sched_get_priority_min -- EINVAL (invalid policy)" );
+ priority = sched_get_priority_min( -1 );
+ assert( priority == -1 );
+ assert( errno == EINVAL );
+
+ /* print the round robin time quantum */
+
+ status = sched_rr_get_interval( getpid(), &tr );
+ printf(
+ "Init: Round Robin quantum is %ld seconds, %ld nanoseconds\n",
+ tr.tv_sec,
+ tr.tv_nsec
+ );
+ assert( !status );
+
+ /* create a thread */
+
+ puts( "Init: pthread_create - SUCCESSFUL" );
+ status = pthread_create( &thread_id, NULL, Task_1_through_3, NULL );
+ assert( !status );
+
+ /* too may threads error */
+
+ puts( "Init: pthread_create - EAGAIN (too many threads)" );
+ status = pthread_create( &thread_id, NULL, Task_1_through_3, NULL );
+ assert( status == EAGAIN );
+
+ puts( "Init: sched_yield to Task_1" );
+ status = sched_yield();
+ assert( !status );
+
+ /* switch to Task_1 */
+
+ /* exit this thread */
+
+ puts( "Init: pthread_exit" );
+ pthread_exit( NULL );
+
+ /* switch to Task_1 */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx01/psx01.scn b/testsuites/psxtests/psx01/psx01.scn
new file mode 100644
index 0000000000..8f563dd26c
--- /dev/null
+++ b/testsuites/psxtests/psx01/psx01.scn
@@ -0,0 +1,46 @@
+*** POSIX TEST 1 ***
+Init: clock_gettime - EINVAL (invalid clockid)
+Init: clock_settime - EINVAL (invalid clockid)
+Init: clock_getres - EINVAL (invalid clockid)
+Init: clock_getres - EINVAL (NULL resolution)
+Init: clock_getres - SUCCESSFUL
+Init: resolution = sec (100), nsec (0)
+
+Fri May 24 11:05:00 1996
+Init: clock_settime - SUCCESSFUL
+Fri May 24 11:05:00 1996
+Fri May 24 11:05:00 1996
+Fri May 24 11:05:03 1996
+Fri May 24 11:05:03 1996
+Init: seconds remaining (0)
+
+Init: nanosleep - EINVAL (NULL time)
+Init: nanosleep - EAGAIN (negative seconds)
+Init: nanosleep - EINVAL (too many nanoseconds)
+Init: nanosleep - yield
+Init: nanosleep - 3.05 seconds
+Fri May 24 11:05:06 1996
+Init: sec (0), nsec (0) remaining
+Init: ID is 0x0c010001
+Init: sched_get_priority_min (SCHED_FIFO) -- 1
+Init: sched_get_priority_min -- EINVAL (invalid policy)
+Init: sched_get_priority_max (SCHED_FIFO) -- 254
+Init: sched_get_priority_min -- EINVAL (invalid policy)
+Init: Round Robin quantum is 0 seconds, 500000000 nanoseconds
+Init: pthread_create - SUCCESSFUL
+Init: pthread_create - EAGAIN (too many threads)
+Init: sched_yield to Task_1
+Task_1: sched_yield to Init
+Init: pthread_exit
+
+Task_1: ID is 0x0c010002
+Task_1: pthread_equal - match case passed
+Task_1: pthread_equal - different case passed
+Task_1: pthread_equal - first id bad
+Task_1: pthread_equal - second id bad
+Task_1: pthread_once - EINVAL (NULL once_control)
+Task_1: pthread_once - EINVAL (NULL init_routine)
+Task_1: pthread_once - SUCCESSFUL (init_routine executes)
+Test_init_routine: invoked
+Task_1: pthread_once - SUCCESSFUL (init_routine does not execute)
+*** END OF POSIX TEST 1 ***
diff --git a/testsuites/psxtests/psx01/system.h b/testsuites/psxtests/psx01/system.h
new file mode 100644
index 0000000000..08be4fecd5
--- /dev/null
+++ b/testsuites/psxtests/psx01/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sched.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1_through_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx01/task.c b/testsuites/psxtests/psx01/task.c
new file mode 100644
index 0000000000..13ce3bb67a
--- /dev/null
+++ b/testsuites/psxtests/psx01/task.c
@@ -0,0 +1,94 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Test_init_routine( void )
+{
+ puts( "Test_init_routine: invoked" );
+}
+
+
+void *Task_1_through_3(
+ void *argument
+)
+{
+ int status;
+ pthread_once_t once = PTHREAD_ONCE_INIT;
+
+ puts( "Task_1: sched_yield to Init" );
+ status = sched_yield();
+ assert( !status );
+
+ /* switch to Task_1 */
+
+ /* now do some real testing */
+
+ empty_line();
+
+ /* get id of this thread */
+
+ Task_id = pthread_self();
+ printf( "Task_1: ID is 0x%08x\n", Task_id );
+
+ /* exercise pthread_equal */
+
+ status = pthread_equal( Task_id, Task_id );
+ if ( status )
+ puts( "Task_1: pthread_equal - match case passed" );
+ assert( status );
+
+ status = pthread_equal( Init_id, Task_id );
+ if ( !status )
+ puts( "Task_1: pthread_equal - different case passed" );
+ assert( !status );
+
+ puts( "Task_1: pthread_equal - first id bad" );
+ status = pthread_equal( -1, Task_id );
+ assert( !status );
+
+ puts( "Task_1: pthread_equal - second id bad" );
+ status = pthread_equal( Init_id, -1 );
+ assert( !status );
+
+ /* exercise pthread_once */
+
+ puts( "Task_1: pthread_once - EINVAL (NULL once_control)" );
+ status = pthread_once( NULL, Test_init_routine );
+ assert( status == EINVAL );
+
+ puts( "Task_1: pthread_once - EINVAL (NULL init_routine)" );
+ status = pthread_once( &once, NULL );
+ assert( status == EINVAL );
+
+ puts( "Task_1: pthread_once - SUCCESSFUL (init_routine executes)" );
+ status = pthread_once( &once, Test_init_routine );
+ assert( !status );
+
+ puts( "Task_1: pthread_once - SUCCESSFUL (init_routine does not execute)" );
+ status = pthread_once( &once, Test_init_routine );
+ assert( !status );
+
+ puts( "*** END OF POSIX TEST 1 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx02/init.c b/testsuites/psxtests/psx02/init.c
new file mode 100644
index 0000000000..14a850fca4
--- /dev/null
+++ b/testsuites/psxtests/psx02/init.c
@@ -0,0 +1,146 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <signal.h>
+
+volatile int Signal_occurred;
+volatile int Signal_count;
+
+void Signal_handler(
+ int signo
+)
+{
+ Signal_count++;
+ printf(
+ "Signal: %d caught by 0x%x (%d)\n",
+ signo,
+ pthread_self(),
+ Signal_count
+ );
+ Signal_occurred = 1;
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct timespec tv;
+ struct timespec tr;
+ struct sigaction act;
+ sigset_t mask;
+ sigset_t pending_set;
+
+ puts( "\n\n*** POSIX TEST 2 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* install a signal handler */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* simple signal to self */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ Signal_occurred = 0;
+
+ /* now block the signal, send it, see if it is pending, and unblock it */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Init: Block SIGUSR1\n" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+
+ printf( "Init: send SIGUSR1 to self\n" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ printf( "Init: Unblock SIGUSR1\n" );
+ status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
+ assert( !status );
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_1_through_3, NULL );
+ assert( !status );
+
+ /*
+ * Loop for 5 seconds seeing how many signals we catch
+ */
+
+ tr.tv_sec = 5;
+ tr.tv_nsec = 0;
+
+ do {
+ tv = tr;
+
+ Signal_occurred = 0;
+
+ status = nanosleep ( &tv, &tr );
+
+ if ( status == -1 ) {
+ assert( errno == EINTR );
+ assert( tr.tv_nsec || tr.tv_sec );
+ } else if ( !status ) {
+ assert( !tr.tv_nsec && !tr.tv_sec );
+ }
+
+ printf(
+ "Init: signal was %sprocessed with %d:%d time remaining\n",
+ (Signal_occurred) ? "" : "not ",
+ (int) tr.tv_sec,
+ (int) tr.tv_nsec
+ );
+
+ } while ( tr.tv_sec || tr.tv_nsec );
+
+ /* exit this thread */
+
+ puts( "*** END OF POSIX TEST 2 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx02/psx02.scn b/testsuites/psxtests/psx02/psx02.scn
new file mode 100644
index 0000000000..3b0d373b16
--- /dev/null
+++ b/testsuites/psxtests/psx02/psx02.scn
@@ -0,0 +1,26 @@
+*** POSIX TEST 2 ***
+Init's ID is 0x0c010001
+Signal: 16 caught by 0xc010001 (1)
+Init: Block SIGUSR1
+Init: Signals pending 0x00000000
+Init: send SIGUSR1 to self
+Init: Signals pending 0x00008000
+Init: Unblock SIGUSR1
+Signal: 16 caught by 0xc010001 (2)
+Task1: Fri May 24 11:05:00 1996
+Signal: 16 caught by 0xc010001 (3)
+Init: signal was processed with 5:0 time remaining
+Task1: Fri May 24 11:05:01 1996
+Signal: 16 caught by 0xc010001 (4)
+Init: signal was processed with 3:990000000 time remaining
+Task1: Fri May 24 11:05:02 1996
+Signal: 16 caught by 0xc010001 (5)
+Init: signal was processed with 2:980000000 time remaining
+Task1: Fri May 24 11:05:03 1996
+Signal: 16 caught by 0xc010001 (6)
+Init: signal was processed with 1:970000000 time remaining
+Task1: Fri May 24 11:05:04 1996
+Signal: 16 caught by 0xc010001 (7)
+Init: signal was processed with 0:960000000 time remaining
+Init: signal was not processed with 0:0 time remaining
+*** END OF POSIX TEST 2 ***
diff --git a/testsuites/psxtests/psx02/system.h b/testsuites/psxtests/psx02/system.h
new file mode 100644
index 0000000000..2f9aaac4c7
--- /dev/null
+++ b/testsuites/psxtests/psx02/system.h
@@ -0,0 +1,52 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1_through_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx02/task.c b/testsuites/psxtests/psx02/task.c
new file mode 100644
index 0000000000..1b86d61f84
--- /dev/null
+++ b/testsuites/psxtests/psx02/task.c
@@ -0,0 +1,45 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_1_through_3(
+ void *argument
+)
+{
+ int seconds;
+ int i;
+ int status;
+
+ for ( i=0 ; i<5 ; i++ ) {
+ print_current_time( "Task1: ", "" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ seconds = sleep( 1 );
+ assert( !seconds );
+ }
+ puts( "*** END OF POSIX TEST 2 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx03/init.c b/testsuites/psxtests/psx03/init.c
new file mode 100644
index 0000000000..1dab1c7558
--- /dev/null
+++ b/testsuites/psxtests/psx03/init.c
@@ -0,0 +1,176 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <signal.h>
+#include <errno.h>
+
+volatile int Signal_occurred;
+volatile int Signal_count;
+
+void Signal_handler(
+ int signo
+)
+{
+ Signal_count++;
+ printf(
+ "Signal: %d caught by 0x%x (%d)\n",
+ signo,
+ pthread_self(),
+ Signal_count
+ );
+ Signal_occurred = 1;
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct timespec timeout;
+ struct sigaction act;
+ sigset_t mask;
+ sigset_t waitset;
+ int signo;
+ siginfo_t siginfo;
+
+ puts( "\n\n*** POSIX TEST 3 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* install a signal handler */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* initialize signal handler variables */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ /*
+ * wait on SIGUSR1 for 3 seconds, will timeout
+ */
+
+ /* initialize the signal set we will wait for to SIGUSR1 */
+
+ status = sigemptyset( &waitset );
+ assert( !status );
+
+ status = sigaddset( &waitset, SIGUSR1 );
+ assert( !status );
+
+ timeout.tv_sec = 3;
+ timeout.tv_nsec = 0;
+
+ puts( "Init: waiting on any signal for 3 seconds." );
+ signo = sigtimedwait( &waitset, &siginfo, &timeout );
+ assert( signo == -1 );
+
+ if ( errno == EAGAIN )
+ puts( "Init: correctly timed out waiting for SIGUSR1." );
+ else
+ printf( "sigtimedwait returned wrong errno - %d\n", errno );
+
+ Signal_occurred = 0;
+
+ /*
+ * wait on SIGUSR1 for 3 seconds, will timeout because Task_1 sends SIGUSR2
+ */
+
+ empty_line();
+
+ /* initialize a mask to block SIGUSR2 */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR2 );
+ assert( !status );
+
+ printf( "Init: Block SIGUSR2\n" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ /* signal handler is still installed, waitset is still set for SIGUSR1 */
+
+ timeout.tv_sec = 3;
+ timeout.tv_nsec = 0;
+
+ puts( "Init: waiting on any signal for 3 seconds." );
+ signo = sigtimedwait( &waitset, &siginfo, &timeout );
+
+ /* switch to Task 1 */
+
+ if ( errno == EAGAIN )
+ puts( "Init: correctly timed out waiting for SIGUSR1." );
+ else
+ printf( "sigtimedwait returned wrong errno - %d\n", errno );
+ assert( signo == -1 );
+
+ /*
+ * wait on SIGUSR1 for 3 seconds, Task_2 will send it to us
+ */
+
+ empty_line();
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ /* signal handler is still installed, waitset is still set for SIGUSR1 */
+
+ /* wait on SIGUSR1 for 3 seconds, will receive SIGUSR1 from Task_2 */
+
+ timeout.tv_sec = 3;
+ timeout.tv_nsec = 0;
+
+ /* just so we can check that these were altered */
+
+ siginfo.si_code = -1;
+ siginfo.si_signo = -1;
+ siginfo.si_value.sival_int = -1;
+
+ puts( "Init: waiting on any signal for 3 seconds." );
+ signo = sigtimedwait( &waitset, &siginfo, &timeout );
+ printf( "Init: received (%d) SIGUSR1=%d\n", siginfo.si_signo, SIGUSR1 );
+ assert( signo == SIGUSR1 );
+ assert( siginfo.si_signo == SIGUSR1 );
+ assert( siginfo.si_code == SI_USER );
+ assert( siginfo.si_value.sival_int != -1 ); /* rtems does always set this */
+
+ /* exit this thread */
+
+ puts( "*** END OF POSIX TEST 3 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx03/psx03.scn b/testsuites/psxtests/psx03/psx03.scn
new file mode 100644
index 0000000000..61ba36592a
--- /dev/null
+++ b/testsuites/psxtests/psx03/psx03.scn
@@ -0,0 +1,17 @@
+*** POSIX TEST 3 ***
+Init's ID is 0x0c010001
+Init: waiting on any signal for 3 seconds.
+Init: correctly timed out waiting for SIGUSR1.
+
+Init: Block SIGUSR2
+Init: waiting on any signal for 3 seconds.
+Task_1: Fri May 24 11:05:03 1996
+Task_1: pthread_kill - SIGUSR2 to Init
+Init: correctly timed out waiting for SIGUSR1.
+
+Init: waiting on any signal for 3 seconds.
+Task_2: Fri May 24 11:05:06 1996
+Task_1: pthread_kill - SIGUSR1 to Init
+Signal: 16 caught by 0xc010001 (1)
+Init: received (16) SIGUSR1=16
+*** END OF POSIX TEST 3 ***
diff --git a/testsuites/psxtests/psx03/system.h b/testsuites/psxtests/psx03/system.h
new file mode 100644
index 0000000000..b5f82b7817
--- /dev/null
+++ b/testsuites/psxtests/psx03/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx03/task.c b/testsuites/psxtests/psx03/task.c
new file mode 100644
index 0000000000..c35f958315
--- /dev/null
+++ b/testsuites/psxtests/psx03/task.c
@@ -0,0 +1,65 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+
+ /* send SIGUSR2 to Init which is waiting on SIGUSR1 */
+
+ print_current_time( "Task_1: ", "" );
+
+ puts( "Task_1: pthread_kill - SIGUSR2 to Init" );
+ status = pthread_kill( Init_id, SIGUSR2 );
+ assert( !status );
+
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ /* send SIGUSR1 to Init which is waiting on SIGUSR1 */
+
+ print_current_time( "Task_2: ", "" );
+
+ puts( "Task_1: pthread_kill - SIGUSR1 to Init" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx04/init.c b/testsuites/psxtests/psx04/init.c
new file mode 100644
index 0000000000..6d87afad55
--- /dev/null
+++ b/testsuites/psxtests/psx04/init.c
@@ -0,0 +1,564 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <signal.h>
+#include <errno.h>
+
+volatile int Signal_occurred;
+volatile int Signal_count;
+
+void Signal_handler(
+ int signo
+)
+{
+ Signal_count++;
+ printf(
+ "Signal: %d caught by 0x%x (%d)\n",
+ signo,
+ pthread_self(),
+ Signal_count
+ );
+ Signal_occurred = 1;
+}
+
+void Signal_info_handler(
+ int signo,
+ siginfo_t *info,
+ void *context
+)
+{
+ Signal_count++;
+ printf(
+ "Signal_info: %d caught by 0x%x (%d) si_signo= %d si_code= %d value= %d\n",
+ signo,
+ pthread_self(),
+ Signal_count,
+ info->si_signo,
+ info->si_code,
+ info->si_value.sival_int
+ );
+ Signal_occurred = 1;
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct sigaction act;
+ sigset_t mask;
+ sigset_t pending_set;
+ sigset_t oset;
+ struct timespec timeout;
+ siginfo_t info;
+
+ puts( "\n\n*** POSIX TEST 4 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+/* install a signal handler for SIGUSR1 */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+ printf( "Init: sigemptyset - set= 0x%08x\n", act.sa_mask );
+
+ /* test sigfillset following the above sigemptyset */
+
+ status = sigfillset( &act.sa_mask );
+ assert( !status );
+ printf( "Init: sigfillset - set= 0x%08x\n", act.sa_mask );
+
+ /* test sigdelset */
+
+ status = sigdelset( &act.sa_mask, SIGUSR1 );
+ assert( !status );
+ printf( "Init: sigdelset - delete SIGUSR1 set= 0x%08x\n", act.sa_mask );
+
+ /* test sigismember - FALSE */
+
+ status = sigismember( &act.sa_mask, SIGUSR1 );
+ assert( !status );
+ puts( "Init: sigismember - FALSE since SIGUSR1 is not a member" );
+
+ /* test sigismember - TRUE */
+
+ status = sigismember( &act.sa_mask, SIGUSR2 );
+ assert( status );
+ puts( "Init: sigismember - TRUE since SIGUSR2 is a member" );
+
+ /* return the set to empty */
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* simple signal to process */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+/* end of install a signal handler for SIGUSR1 */
+
+ Signal_occurred = 0;
+
+ /* now block the signal, send it, see if it is pending, and unblock it */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ /* simple signal to process */
+
+ Signal_count = 0;
+ Signal_occurred = 0;
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ Signal_occurred = 0;
+
+ /* now block the signal, send it, see if it is pending, and unblock it */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: Unblock SIGUSR1" );
+ status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
+ assert( !status );
+
+ /* now let another task get interrupted by a signal */
+
+ empty_line();
+
+ puts( "Init: create a thread interested in SIGUSR1" );
+ status = pthread_create( &Task1_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: sleep so the other task can block" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ status = sigpending( &pending_set );
+ assert( !status );
+ printf( "Init: Signals pending 0x%08x\n", pending_set );
+
+ puts( "Init: sleep so the other task can catch signal" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ /* test alarm */
+
+ empty_line();
+
+ /* install a signal handler for SIGALRM and unblock it */
+
+ status = sigemptyset( &act.sa_mask );
+ assert( !status );
+
+ act.sa_handler = Signal_handler;
+ act.sa_flags = 0;
+
+ sigaction( SIGALRM, &act, NULL );
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGALRM );
+ assert( !status );
+
+ puts( "Init: Unblock SIGALRM" );
+ status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
+ assert( !status );
+
+ /* schedule the alarm */
+
+ puts( "Init: Firing alarm in 5 seconds" );
+ status = alarm( 5 );
+ printf( "Init: %d seconds left on previous alarm\n", status );
+ assert( !status );
+
+ puts( "Init: Firing alarm in 2 seconds" );
+ status = alarm( 2 );
+ printf( "Init: %d seconds left on previous alarm\n", status );
+ assert( status );
+
+ puts( "Init: Wait 4 seconds for alarm" );
+ status = sleep( 4 );
+ printf( "Init: %d seconds left in sleep\n", status );
+ assert( status );
+
+ /* test SIG_SETMASK case and returning oset of pthread_sigmask */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR2 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1 and SIGUSR2 only" );
+ status = pthread_sigmask( SIG_SETMASK, &mask, &oset );
+ printf( "Init: Previous blocked set was 0x%08x\n", oset );
+ assert( !status );
+
+ /* test inquiry about current blocked set with pthread_sigmask */
+
+ status = pthread_sigmask( 0, NULL, &oset );
+ printf( "Init: Current blocked set is 0x%08x\n", oset );
+ assert( !status );
+
+ /* return blocked mask to no signals blocked */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ puts( "Init: Unblock all signals" );
+ status = pthread_sigmask( SIG_SETMASK, &mask, &oset );
+ printf( "Init: Previous blocked set was 0x%08x\n", oset );
+ assert( !status );
+
+ /* test sigsuspend */
+
+ empty_line();
+
+ puts( "Init: create a thread to send Init SIGUSR1" );
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ puts( "Init: sigsuspend for any signal" );
+ status = sigsuspend( &mask );
+ assert( status );
+ printf( "Init: awakended from sigsuspend status=%08d \n", status );
+
+ /* test a SIGINFO case, these are signals sent to a process only */
+
+ empty_line();
+
+ puts( "Init: create a thread to sent Process SIGUSR1 with SA_SIGINFO" );
+ status = pthread_create( &Task3_id, NULL, Task_3, NULL );
+ assert( !status );
+
+ /* set action on SIGUSR1 to an info case */
+ act.sa_handler = Signal_handler;
+ act.sa_flags = SA_SIGINFO;
+ act.sa_sigaction = Signal_info_handler;
+
+ sigaction( SIGUSR1, &act, NULL );
+
+ puts( "Init: sleep so the Task_3 can sigqueue SIGUSR1" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ puts( "Init: sigqueue occurred" );
+
+ /* Send SIGUSR1, Task_3 has issued a sigwaitinfo */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: sleep so the Task_3 can receive SIGUSR1" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* Send SIGUSR1, Task_3 has issued a sigwait */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR1" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ puts( "Init: send SIGUSR1 to process" );
+ status = kill( getpid(), SIGUSR1 );
+ assert( !status );
+
+ puts( "Init: sleep so the Task_3 can receive SIGUSR1" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* Send SIGUSR1, Task_3 has issued a sigwaitinfo */
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR2 );
+ assert( !status );
+
+ puts( "Init: Block SIGUSR2" );
+ status = sigprocmask( SIG_BLOCK, &mask, NULL );
+ assert( !status );
+
+ puts( "Init: send SIGUSR2 to process" );
+ status = kill( getpid(), SIGUSR2 );
+ assert( !status );
+
+ puts( "Init: sleep so the Task_3 can receive SIGUSR2" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* Suspend for signal that has already be sent */
+
+ puts( "Init: sigsuspend for any signal" );
+ status = sigsuspend( &mask );
+ assert( status );
+ printf( "Init: awakended from sigsuspend status=%d \n", status );
+
+ /* generate error cases for psignal */
+
+ empty_line();
+
+ status = sigemptyset( NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigemptyset - EINVAL (set invalid)" );
+
+ status = sigfillset( NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigfillset - EINVAL (set invalid)" );
+
+ status = sigaddset( NULL, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaddset - EINVAL (set invalid)" );
+
+ status = sigaddset( &mask, 0 );
+ assert( !status );
+ puts( "Init: sigaddset - SUCCESSFUL (signal = 0)" );
+
+ status = sigaddset( &mask, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaddset - EINVAL (set invalid)" );
+
+ status = sigdelset( NULL, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigdelset - EINVAL (set invalid)" );
+
+ status = sigdelset( &mask, 0 );
+ assert( !status );
+ puts( "Init: sigdelset - SUCCESSFUL (signal = 0)" );
+
+ status = sigdelset( &mask, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigdelset - EINVAL (set invalid)" );
+
+ status = sigismember( NULL, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigismember - EINVAL (set invalid)" );
+
+ status = sigismember( &mask, 0 );
+ assert( !status );
+ puts( "Init: sigismember - SUCCESSFUL (signal = 0)" );
+
+ status = sigismember( &mask, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigismember - EINVAL (signal invalid)" );
+
+ status = sigaction( 0, &act, 0 );
+ assert( !status );
+ puts( "Init: sigaction - SUCCESSFUL (signal = 0)" );
+
+ status = sigaction( 999, &act, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaction - EINVAL (signal invalid)" );
+
+ status = sigaction( SIGKILL, &act, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigaction - EINVAL (SIGKILL)" );
+
+ status = pthread_sigmask( SIG_BLOCK, NULL, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (set and oset invalid)" );
+
+ status = pthread_sigmask( 999, &pending_set, NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (how invalid)" );
+
+ status = sigpending( NULL );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: sigpending - EINVAL (set invalid)" );
+
+ timeout.tv_nsec = -1;
+ status = sigtimedwait( &mask, &info, &timeout );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (timout->nsec invalid < 0)" );
+
+ timeout.tv_nsec = 0x7fffffff;
+ status = sigtimedwait( &mask, &info, &timeout );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_sigmask - EINVAL (timout->nsec invalid to large)" );
+
+ status = pthread_kill( Init_id, 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: pthread_kill - EINVAL (sig invalid)" );
+
+ status = pthread_kill( 0, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == ENOSYS );
+ puts( "Init: pthread_kill - ENOSYS (signal SA_SIGINFO)" );
+
+ status = pthread_kill( 0, SIGUSR2 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == ESRCH );
+ puts( "Init: pthread_kill - ESRCH (signal SA_SIGINFO)" );
+
+ status = pthread_kill( Init_id, 0 );
+ assert( !status );
+ puts( "Init: pthread_kill - SUCCESSFUL (signal = 0)" );
+
+ act.sa_handler = SIG_IGN;
+ act.sa_flags = 0;
+ sigaction( SIGUSR2, &act, NULL );
+ status = pthread_kill( Init_id, SIGUSR2 );
+ assert( !status );
+ puts( "Init: pthread_kill - SUCCESSFUL (signal = SIG_IGN)" );
+
+ status = kill( 0x7fffffff, SIGUSR1 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == ESRCH );
+ puts( "Init: kill - ESRCH (pid invalid)" );
+
+ status = kill( getpid(), 0 );
+ assert( !status );
+ puts( "Init: kill - SUCCESSFUL (signal = 0)" );
+
+ status = kill( getpid(), 999 );
+ if ( status != -1 )
+ printf( "status = %d\n", status );
+ assert( errno == EINVAL );
+ puts( "Init: kill - EINVAL (sig invalid)" );
+
+ /* exit this thread */
+
+ puts( "*** END OF POSIX TEST 4 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx04/psx04.scn b/testsuites/psxtests/psx04/psx04.scn
new file mode 100644
index 0000000000..83237ec768
--- /dev/null
+++ b/testsuites/psxtests/psx04/psx04.scn
@@ -0,0 +1,112 @@
+*** POSIX TEST 4 ***
+Init's ID is 0x0c010001
+Init: sigemptyset - set= 0x00000000
+Init: sigfillset - set= 0xffffffff
+Init: sigdelset - delete SIGUSR1 set= 0xffff7fff
+Init: sigismember - FALSE since SIGUSR1 is not a member
+Init: sigismember - TRUE since SIGUSR2 is a member
+Init: send SIGUSR1 to process
+Signal: 16 caught by 0xc010001 (1)
+
+Init: Block SIGUSR1
+Init: send SIGUSR1 to process
+Signal: 16 caught by 0xc010001 (1)
+
+Init: Block SIGUSR1
+Init: Signals pending 0x00000000
+Init: send SIGUSR1 to process
+Init: Signals pending 0x00008000
+Init: Unblock SIGUSR1
+Signal: 16 caught by 0xc010001 (2)
+
+Init: create a thread interested in SIGUSR1
+Init: Block SIGUSR1
+Init: Signals pending 0x00000000
+Init: sleep so the other task can block
+Task_1: sleeping for 5 seconds
+Init: send SIGUSR1 to process
+Init: Signals pending 0x00008000
+Init: sleep so the other task can catch signal
+Signal: 16 caught by 0xc010002 (3)
+Task_1: 4 seconds left
+Task_1: exit
+
+Init: Unblock SIGALRM
+Init: Firing alarm in 5 seconds
+Init: 0 seconds left on previous alarm
+Init: Firing alarm in 2 seconds
+Init: 4 seconds left on previous alarm
+Init: Wait 4 seconds for alarm
+Signal: 14 caught by 0xc010001 (4)
+Init: 2 seconds left in sleep
+
+Init: Block SIGUSR1 and SIGUSR2 only
+Init: Previous blocked set was 0x00008000
+Init: Current blocked set is 0x00018000
+Init: Unblock all signals
+Init: Previous blocked set was 0x00018000
+
+Init: create a thread to send Init SIGUSR1
+Init: sigsuspend for any signal
+Task_2: sending SIGUSR1
+Task_2: exit
+Signal: 16 caught by 0xc010001 (5)
+Init: awakended from sigsuspend status=00000016
+
+Init: create a thread to sent Process SIGUSR1 with SA_SIGINFO
+Init: sleep so the Task_3 can sigqueue SIGUSR1
+Task_3: sigqueue SIGUSR1 with value= 16
+Signal_info: 16 caught by 0xc010004 (6) si_signo= 16 si_code= 1 value= 16
+
+Task_3: sigwaitinfo SIGUSR1 with value= 16
+Init: sigqueue occurred
+Init: Block SIGUSR1
+Init: send SIGUSR1 to process
+Init: sleep so the Task_3 can receive SIGUSR1
+Task_3: si_signo= 16 si_code= 1 value= 0
+
+Task_3: sigwait SIGUSR1
+Init: Block SIGUSR1
+Init: send SIGUSR1 to process
+Init: sleep so the Task_3 can receive SIGUSR1
+Task_3: signo= 16
+
+Task_3: pause
+Init: Block SIGUSR2
+Init: send SIGUSR2 to process
+Init: sleep so the Task_3 can receive SIGUSR2
+Task_3: pause= 17
+
+Task_3: sending SIGUSR2
+Task_3: sleep so the Init task can reguest a signal
+Init: sigsuspend for any signal
+Init: awakended from sigsuspend status=17
+
+Init: sigemptyset - EINVAL (set invalid)
+Init: sigfillset - EINVAL (set invalid)
+Init: sigaddset - EINVAL (set invalid)
+Init: sigaddset - SUCCESSFUL (signal = 0)
+Init: sigaddset - EINVAL (set invalid)
+Init: sigdelset - EINVAL (set invalid)
+Init: sigdelset - SUCCESSFUL (signal = 0)
+Init: sigdelset - EINVAL (set invalid)
+Init: sigismember - EINVAL (set invalid)
+Init: sigismember - SUCCESSFUL (signal = 0)
+Init: sigismember - EINVAL (signal invalid)
+Init: sigaction - SUCCESSFUL (signal = 0)
+Init: sigaction - EINVAL (signal invalid)
+Init: sigaction - EINVAL (SIGKILL)
+Init: pthread_sigmask - EINVAL (set and oset invalid)
+Init: pthread_sigmask - EINVAL (how invalid)
+Init: sigpending - EINVAL (set invalid)
+Init: pthread_sigmask - EINVAL (timout->nsec invalid < 0)
+Init: pthread_sigmask - EINVAL (timout->nsec invalid to large)
+Init: pthread_kill - EINVAL (sig invalid)
+Init: pthread_kill - ENOSYS (signal SA_SIGINFO)
+Init: pthread_kill - ESRCH (signal SA_SIGINFO)
+Init: pthread_kill - SUCCESSFUL (signal = 0)
+Init: pthread_kill - SUCCESSFUL (signal = SIG_IGN)
+Init: kill - ESRCH (pid invalid)
+Init: kill - SUCCESSFUL (signal = 0)
+Init: kill - EINVAL (sig invalid)
+*** END OF POSIX TEST 4 ***
diff --git a/testsuites/psxtests/psx04/system.h b/testsuites/psxtests/psx04/system.h
new file mode 100644
index 0000000000..5d996f8601
--- /dev/null
+++ b/testsuites/psxtests/psx04/system.h
@@ -0,0 +1,63 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+void *Task_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_POSIX_QUEUED_SIGNALS 5
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task1_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_t Task3_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx04/task1.c b/testsuites/psxtests/psx04/task1.c
new file mode 100644
index 0000000000..8e2fe957c3
--- /dev/null
+++ b/testsuites/psxtests/psx04/task1.c
@@ -0,0 +1,44 @@
+/* Task_1
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int seconds;
+
+ printf( "Task_1: sleeping for 5 seconds\n" );
+
+ seconds = sleep( 5 );
+ printf( "Task_1: %d seconds left\n", seconds );
+ assert( seconds );
+
+ /* switch to Init */
+
+ printf( "Task_1: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx04/task2.c b/testsuites/psxtests/psx04/task2.c
new file mode 100644
index 0000000000..fbdd2011c7
--- /dev/null
+++ b/testsuites/psxtests/psx04/task2.c
@@ -0,0 +1,42 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ printf( "Task_2: sending SIGUSR1\n" );
+ status = pthread_kill( Init_id, SIGUSR1 );
+ assert( !status );
+
+ /* switch to Init */
+
+ printf( "Task_2: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx04/task3.c b/testsuites/psxtests/psx04/task3.c
new file mode 100644
index 0000000000..e32a0a341c
--- /dev/null
+++ b/testsuites/psxtests/psx04/task3.c
@@ -0,0 +1,119 @@
+/* Task_3
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <signal.h>
+
+void *Task_3(
+ void *argument
+)
+{
+ int status;
+ int sig;
+ union sigval value;
+ sigset_t mask;
+ siginfo_t info;
+
+ value.sival_int = SIGUSR1;
+
+ printf( "Task_3: sigqueue SIGUSR1 with value= %d\n", value.sival_int );
+ status = sigqueue( getpid(), SIGUSR1, value );
+ assert( !status );
+
+ /* catch signal with sigwaitinfo */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Task_3: sigwaitinfo SIGUSR1 with value= %d\n", value.sival_int );
+ status = sigwaitinfo( &mask, &info );
+
+ /* switch to Init */
+
+ assert( !(status==-1) );
+ printf(
+ "Task_3: si_signo= %d si_code= %d value= %d\n",
+ info.si_signo,
+ info.si_code,
+ info.si_value.sival_int
+ );
+
+ /* catch signal with sigwait */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Task_3: sigwait SIGUSR1\n" );
+ status = sigwait( &mask, &sig );
+
+ /* switch to Init */
+
+ assert( !status );
+ printf( "Task_3: signo= %d\n", sig );
+
+ /* catch signal with pause */
+
+ empty_line();
+
+ status = sigemptyset( &mask );
+ assert( !status );
+
+ status = sigaddset( &mask, SIGUSR1 );
+ assert( !status );
+
+ printf( "Task_3: pause\n" );
+ status = pause( );
+
+ /* switch to Init */
+
+ assert( !(status==-1) );
+ printf( "Task_3: pause= %d\n", status );
+
+
+ /* send signal to Init task before it has pended for a signal */
+
+ empty_line();
+
+ printf( "Task_3: sending SIGUSR2\n" );
+ status = pthread_kill( Init_id, SIGUSR2 );
+ assert( !status );
+
+ printf( "Task_3: sleep so the Init task can reguest a signal\n" );
+ status = sleep( 1 );
+ assert( !status );
+
+ /* end of task 3 */
+ printf( "Task_3: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx05/init.c b/testsuites/psxtests/psx05/init.c
new file mode 100644
index 0000000000..1593cc65a7
--- /dev/null
+++ b/testsuites/psxtests/psx05/init.c
@@ -0,0 +1,569 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+#define MUTEX_BAD_ID 0xfffffffe
+
+void Print_mutexattr(
+ char *msg,
+ pthread_mutexattr_t *attr
+)
+{
+ int status;
+ int protocol;
+ int prioceiling;
+ int pshared;
+
+ /* protocol */
+
+ status = pthread_mutexattr_getprotocol( attr, &protocol );
+ assert( !status );
+
+ printf( "%smutex protocol is (%d) -- ", msg, protocol );
+ switch ( protocol ) {
+ case PTHREAD_PRIO_NONE:
+ puts( "PTHREAD_PRIO_NONE" );
+ break;
+ case PTHREAD_PRIO_INHERIT:
+ puts( "PTHREAD_PRIO_INHERIT" );
+ break;
+ case PTHREAD_PRIO_PROTECT:
+ puts( "PTHREAD_PRIO_PROTECT" );
+ break;
+ default:
+ puts( "UNKNOWN" );
+ assert( 0 );
+ break;
+ }
+
+ /* priority ceiling */
+
+ status = pthread_mutexattr_getprioceiling( attr, &prioceiling );
+ assert( !status );
+ printf( "%smutex priority ceiling is %d\n", msg, prioceiling );
+
+ /* process shared */
+
+ status = pthread_mutexattr_getpshared( attr, &pshared );
+ assert( !status );
+ printf( "%smutex process shared is (%d) -- ", msg, pshared );
+ switch ( pshared ) {
+ case PTHREAD_PROCESS_PRIVATE:
+ puts( "PTHREAD_PROCESS_PRIVATE" );
+ break;
+ case PTHREAD_PROCESS_SHARED:
+ puts( "PTHREAD_PROCESS_SHARED" );
+ break;
+ default:
+ puts( "UNKNOWN" );
+ assert( 0 );
+ break;
+ }
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_t destroyed_attr;
+ struct timespec times;
+ struct sched_param param;
+ int pshared;
+ int policy;
+ int protocol;
+ int ceiling;
+ int old_ceiling;
+
+ assert( MUTEX_BAD_ID != PTHREAD_MUTEX_INITIALIZER );
+ Mutex_bad_id = MUTEX_BAD_ID;
+
+ puts( "\n\n*** POSIX TEST 5 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* tes pthread_mutex_attr_init */
+
+ puts( "Init: pthread_mutexattr_init - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_init( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ Print_mutexattr( "Init: ", &attr );
+
+ /* create an "uninitialized" attribute structure */
+
+ status = pthread_mutexattr_init( &destroyed_attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
+ status = pthread_mutexattr_destroy( &destroyed_attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutexattr_destroy - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_destroy( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_destroy - EINVAL (not initialized)" );
+ status = pthread_mutexattr_destroy( &destroyed_attr );
+ assert( status == EINVAL );
+
+ /* error cases for set and get pshared attribute */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_getpshared - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_getpshared( NULL, &pshared );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getpshared - EINVAL (NULL pshared)" );
+ status = pthread_mutexattr_getpshared( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getpshared - EINVAL (not initialized)" );
+ status = pthread_mutexattr_getpshared( &destroyed_attr, &pshared );
+ assert( status == EINVAL );
+
+ pshared = PTHREAD_PROCESS_PRIVATE;
+ puts( "Init: pthread_mutexattr_setpshared - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_setpshared( NULL, pshared );
+ assert( status == EINVAL );
+
+ pshared = PTHREAD_PROCESS_PRIVATE;
+ puts( "Init: pthread_mutexattr_setpshared - EINVAL (not initialized)" );
+ status = pthread_mutexattr_setpshared( &destroyed_attr, pshared );
+ assert( status == EINVAL );
+
+ /* error cases for set and get protocol attribute */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_getprotocol - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_getprotocol( NULL, &protocol );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprotocol - EINVAL (NULL protocol)" );
+ status = pthread_mutexattr_getprotocol( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprotocol - EINVAL (not initialized)" );
+ status = pthread_mutexattr_getprotocol( &destroyed_attr, &protocol );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprotocol - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_setprotocol( NULL, PTHREAD_PRIO_NONE );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprotocol - EINVAL (invalid protocol)" );
+ status = pthread_mutexattr_setprotocol( &attr, -1 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprotocol - EINVAL (not initialized)" );
+ status = pthread_mutexattr_setprotocol( &destroyed_attr, -1 );
+ assert( status == EINVAL );
+
+ /* error cases for set and get prioceiling attribute */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_getprioceiling - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_getprioceiling( NULL, &ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprioceiling - EINVAL (NULL prioceiling)" );
+ status = pthread_mutexattr_getprioceiling( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_getprioceiling - EINVAL (not initialized)" );
+ status = pthread_mutexattr_getprioceiling( &destroyed_attr, &ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (NULL attr)" );
+ status = pthread_mutexattr_setprioceiling( NULL, 128 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (invalid priority)" );
+ status = pthread_mutexattr_setprioceiling( &attr, 512 );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutexattr_setprioceiling - EINVAL (not initialized)" );
+ status = pthread_mutexattr_setprioceiling( &destroyed_attr, -1 );
+ assert( status == EINVAL );
+
+ /* create a thread */
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ /* now try some basic mutex operations */
+
+ empty_line();
+
+ puts( "Init: pthread_mutex_init - EINVAL (NULL mutex_id)" );
+ status = pthread_mutex_init( NULL, &attr );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_init - EINVAL (not initialized attr)" );
+ status = pthread_mutex_init( &Mutex_id, &destroyed_attr );
+ assert( status == EINVAL );
+
+ /* must get around error checks in attribute set routines */
+ attr.protocol = -1;
+
+ puts( "Init: pthread_mutex_init - EINVAL (bad protocol)" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ assert( status == EINVAL );
+
+ /* must get around error checks in attribute set routines */
+ attr.protocol = PTHREAD_PRIO_INHERIT;
+ attr.prio_ceiling = -1;
+
+ puts( "Init: pthread_mutex_init - EINVAL (bad priority ceiling)" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ assert( status == EINVAL );
+
+ /* now set up for a success pthread_mutex_init */
+
+ puts( "Init: Resetting mutex attributes" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: Changing mutex attributes" );
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_INHERIT );
+ assert( !status );
+
+ status = pthread_mutexattr_setprioceiling( &attr, 128 );
+ assert( !status );
+
+ status = pthread_mutexattr_setpshared( &attr, PTHREAD_PROCESS_SHARED );
+ assert( !status );
+
+ Print_mutexattr( "Init: ", &attr );
+
+ puts( "Init: Resetting mutex attributes" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - EBUSY (attempt to initialize an existing mutex)" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ if ( !status )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+
+ puts( "Init: pthread_mutex_trylock - EINVAL (illegal ID)" );
+ status = pthread_mutex_trylock( &Mutex_bad_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_trylock - EDEADLK (already locked)" );
+ status = pthread_mutex_trylock( &Mutex_id );
+ if ( status != EDEADLK )
+ printf( "status = %d\n", status );
+ assert( status == EDEADLK );
+
+ puts( "Init: pthread_mutex_lock - EDEADLK (already locked)" );
+ status = pthread_mutex_lock( &Mutex_id );
+ if ( status != EDEADLK )
+ printf( "status = %d\n", status );
+ assert( status == EDEADLK );
+
+ puts( "Init: Sleep 1 second" );
+
+ sleep( 1 );
+
+ /* switch to task 1 */
+
+ puts( "Init: pthread_mutex_unlock - EINVAL (invalid id)" );
+ status = pthread_mutex_unlock( &Mutex_bad_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_unlock - EPERM (not owner)" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ if ( status != EPERM )
+ printf( "status = %d\n", status );
+ assert( status == EPERM );
+
+ times.tv_sec = 0;
+ times.tv_nsec = 500000000;
+ puts( "Init: pthread_mutex_timedlock - time out in 1/2 second" );
+ status = pthread_mutex_timedlock( &Mutex_id, &times );
+ if ( status != EAGAIN )
+ printf( "status = %d\n", status );
+ assert( status == EAGAIN );
+
+ /* switch to idle */
+
+ puts( "Init: pthread_mutex_timedlock - EAGAIN (timeout)" );
+
+ /* destroy a mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - EAGAIN (too many)" );
+ status = pthread_mutex_init( &Mutex3_id, &attr );
+ assert( status == EAGAIN );
+
+ puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
+ status = pthread_mutexattr_destroy( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - EINVAL (invalid id)" );
+ status = pthread_mutex_destroy( &Mutex_bad_id );
+ assert( status == EINVAL );
+
+ /* destroy a busy mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex2_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - EBUSY (already locked)" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ if ( status != EBUSY )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ assert( !status );
+
+ /* priority inherit mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts(
+ "Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_INHERIT)"
+ );
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_INHERIT );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex2_id );
+ assert( !status );
+
+ /* create a thread at a lower priority */
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ /* set priority of Task2 to highest priority */
+
+ param.sched_priority = 254;
+
+ puts( "Init: pthread_setschedparam - Setting Task2 priority to highest" );
+ status = pthread_setschedparam( Task2_id, SCHED_FIFO, &param );
+ assert( !status );
+
+ /* switching to Task2 */
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf( "Init: pthread_getschedparam - priority = %d\n", param.sched_priority);
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ puts( "Init: pthread_mutexattr_destroy - SUCCESSFUL" );
+ status = pthread_mutexattr_destroy( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_destroy - SUCCESSFUL" );
+ status = pthread_mutex_destroy( &Mutex2_id );
+ assert( !status );
+
+ /* priority ceiling mutex */
+
+ empty_line();
+
+ puts( "Init: pthread_mutexattr_init - SUCCESSFUL" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ puts(
+ "Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_PROTECT)"
+ );
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_init - SUCCESSFUL" );
+ status = pthread_mutex_init( &Mutex2_id, &attr );
+ assert( !status );
+
+ puts( "Init: pthread_mutex_getprioceiling - EINVAL (invalid id)" );
+ status = pthread_mutex_getprioceiling( &Mutex_bad_id, &ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_getprioceiling - EINVAL (NULL ceiling)" );
+ status = pthread_mutex_getprioceiling( &Mutex2_id, NULL );
+ assert( status == EINVAL );
+
+ status = pthread_mutex_getprioceiling( &Mutex2_id, &ceiling );
+ assert( !status );
+ printf( "Init: pthread_mutex_getprioceiling - %d\n", ceiling );
+
+ puts( "Init: pthread_mutex_setprioceiling - EINVAL (invalid id)" );
+ status = pthread_mutex_setprioceiling( &Mutex_bad_id, 200, &old_ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_setprioceiling - EINVAL (illegal priority)" );
+ status = pthread_mutex_setprioceiling( &Mutex2_id, 512, &old_ceiling );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_mutex_setprioceiling - EINVAL (NULL ceiling)" );
+ status = pthread_mutex_setprioceiling( &Mutex2_id, 128, NULL );
+ assert( status == EINVAL );
+
+ /* normal cases of set priority ceiling */
+
+ puts( "Init: pthread_mutex_setprioceiling - new ceiling = 200" );
+ status = pthread_mutex_setprioceiling( &Mutex2_id, 200, &old_ceiling );
+ assert( !status );
+ printf(
+ "Init: pthread_mutex_setprioceiling - old ceiling = %d\n",old_ceiling
+ );
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf(
+ "Init: pthread_getschedparam - priority = %d\n", param.sched_priority
+ );
+
+ puts( "Init: pthread_mutex_trylock - SUCCESSFUL" );
+ status = pthread_mutex_trylock( &Mutex2_id );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf(
+ "Init: pthread_getschedparam - priority = %d\n", param.sched_priority
+ );
+
+ /* create a thread at a higher priority */
+
+ status = pthread_create( &Task3_id, NULL, Task_3, NULL );
+ assert( !status );
+
+ /* set priority of Task3 to highest priority */
+
+ param.sched_priority = 199;
+
+ status = pthread_setschedparam( Task3_id, SCHED_FIFO, &param );
+ assert( !status );
+ puts( "Init: pthread_setschedparam - set Task3 priority to highest" );
+
+ /* DOES NOT SWITCH to Task3 */
+
+ puts( "Init: Sleep 1 second" );
+ assert( !status );
+ sleep( 1 );
+
+ /* switch to task 3 */
+
+ puts( "Init: pthread_mutex_unlock - SUCCESSFUL" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ status = pthread_mutex_getprioceiling( &Mutex2_id, &ceiling );
+ assert( !status );
+ printf( "Init: pthread_mutex_getprioceiling- ceiling = %d\n", ceiling );
+
+ /* set priority of Init to highest priority */
+
+ param.sched_priority = 254;
+
+ status = pthread_setschedparam( Init_id, SCHED_FIFO, &param );
+ assert( !status );
+ puts( "Init: pthread_setschedparam - set Init priority to highest" );
+
+ puts( "Init: pthread_mutex_lock - EINVAL (priority ceiling violation)" );
+ status = pthread_mutex_lock( &Mutex2_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "*** END OF POSIX TEST 5 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx05/psx05.scn b/testsuites/psxtests/psx05/psx05.scn
new file mode 100644
index 0000000000..6e4bc7320d
--- /dev/null
+++ b/testsuites/psxtests/psx05/psx05.scn
@@ -0,0 +1,111 @@
+*** POSIX TEST 5 ***
+Init's ID is 0x0c010001
+Init: pthread_mutexattr_init - EINVAL (NULL attr)
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: mutex protocol is (0) -- PTHREAD_PRIO_NONE
+Init: mutex priority ceiling is 254
+Init: mutex process shared is (0) -- PTHREAD_PROCESS_PRIVATE
+Init: pthread_mutexattr_destroy - SUCCESSFUL
+Init: pthread_mutexattr_destroy - EINVAL (NULL attr)
+Init: pthread_mutexattr_destroy - EINVAL (not initialized)
+
+Init: pthread_mutexattr_getpshared - EINVAL (NULL attr)
+Init: pthread_mutexattr_getpshared - EINVAL (NULL pshared)
+Init: pthread_mutexattr_getpshared - EINVAL (not initialized)
+Init: pthread_mutexattr_setpshared - EINVAL (NULL attr)
+Init: pthread_mutexattr_setpshared - EINVAL (not initialized)
+
+Init: pthread_mutexattr_getprotocol - EINVAL (NULL attr)
+Init: pthread_mutexattr_getprotocol - EINVAL (NULL protocol)
+Init: pthread_mutexattr_getprotocol - EINVAL (not initialized)
+Init: pthread_mutexattr_setprotocol - EINVAL (NULL attr)
+Init: pthread_mutexattr_setprotocol - EINVAL (invalid protocol)
+Init: pthread_mutexattr_setprotocol - EINVAL (not initialized)
+
+Init: pthread_mutexattr_getprioceiling - EINVAL (NULL attr)
+Init: pthread_mutexattr_getprioceiling - EINVAL (NULL prioceiling)
+Init: pthread_mutexattr_getprioceiling - EINVAL (not initialized)
+Init: pthread_mutexattr_setprioceiling - EINVAL (NULL attr)
+Init: pthread_mutexattr_setprioceiling - EINVAL (invalid priority)
+Init: pthread_mutexattr_setprioceiling - EINVAL (not initialized)
+
+Init: pthread_mutex_init - EINVAL (NULL mutex_id)
+Init: pthread_mutex_init - EINVAL (not initialized attr)
+Init: pthread_mutex_init - EINVAL (bad protocol)
+Init: pthread_mutex_init - EINVAL (bad priority ceiling)
+Init: Resetting mutex attributes
+Init: Changing mutex attributes
+Init: mutex protocol is (1) -- PTHREAD_PRIO_INHERIT
+Init: mutex priority ceiling is 128
+Init: mutex process shared is (1) -- PTHREAD_PROCESS_SHARED
+Init: Resetting mutex attributes
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_init - EBUSY (attempt to initialize an existing mutex)
+Init: pthread_mutex_trylock - EINVAL (illegal ID)
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_mutex_trylock - EDEADLK (already locked)
+Init: pthread_mutex_lock - EDEADLK (already locked)
+Init: Sleep 1 second
+Task: pthread_mutex_trylock already locked
+Task: pthread_mutex_lock unavailable
+Init: pthread_mutex_unlock - EINVAL (invalid id)
+Init: pthread_mutex_unlock - SUCCESSFUL
+Init: pthread_mutex_unlock - EPERM (not owner)
+Init: pthread_mutex_timedlock - time out in 1/2 second
+Task: mutex acquired
+Task: sleep for 2 seconds
+Init: pthread_mutex_timedlock - EAGAIN (timeout)
+
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_init - EAGAIN (too many)
+Init: pthread_mutexattr_destroy - SUCCESSFUL
+Init: pthread_mutex_destroy - SUCCESSFUL
+Init: pthread_mutex_destroy - EINVAL (invalid id)
+
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_mutex_destroy - EBUSY (already locked)
+Init: pthread_mutex_unlock - SUCCESSFUL
+Init: pthread_mutex_destroy - SUCCESSFUL
+
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_INHERIT)
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_setschedparam - Setting Task2 priority to highest
+Task 2: pthread_mutex_lock unavailable (inherit case)
+Init: pthread_getschedparam - priority = 254
+Init: pthread_mutex_unlock - SUCCESSFUL
+Task 2: mutex acquired
+Task 2: unlock Mutex 2
+Task 2: exit
+Init: pthread_mutexattr_destroy - SUCCESSFUL
+Init: pthread_mutex_destroy - SUCCESSFUL
+
+Init: pthread_mutexattr_init - SUCCESSFUL
+Init: pthread_mutexattr_setprotocol - SUCCESSFUL (PTHREAD_PRIO_PROTECT)
+Init: pthread_mutex_init - SUCCESSFUL
+Init: pthread_mutex_getprioceiling - EINVAL (invalid id)
+Init: pthread_mutex_getprioceiling - EINVAL (NULL ceiling)
+Init: pthread_mutex_getprioceiling - 254
+Init: pthread_mutex_setprioceiling - EINVAL (invalid id)
+Init: pthread_mutex_setprioceiling - EINVAL (illegal priority)
+Init: pthread_mutex_setprioceiling - EINVAL (NULL ceiling)
+Init: pthread_mutex_setprioceiling - new ceiling = 200
+Init: pthread_mutex_setprioceiling - old ceiling = 1
+Init: pthread_getschedparam - priority = 2
+Init: pthread_mutex_trylock - SUCCESSFUL
+Init: pthread_getschedparam - priority = 200
+Init: pthread_setschedparam - set Task3 priority to highest
+Init: Sleep 1 second
+Task 3: pthread_mutex_lock unavailable (inherit case)
+Init: pthread_mutex_unlock - SUCCESSFUL
+Task 3: mutex acquired
+Task 3: unlock Mutex 2
+Task 3: pthread_getschedparam priority = 199
+Task 3: exit
+Init: pthread_mutex_getprioceiling- ceiling = 200
+Init: pthread_setschedparam - set Init priority to highest
+Init: pthread_mutex_lock - EINVAL (priority ceiling violation)
+*** END OF POSIX TEST 5 ***
diff --git a/testsuites/psxtests/psx05/system.h b/testsuites/psxtests/psx05/system.h
new file mode 100644
index 0000000000..7dff6eef2f
--- /dev/null
+++ b/testsuites/psxtests/psx05/system.h
@@ -0,0 +1,67 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+void *Task_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_t Task3_id;
+TEST_EXTERN pthread_mutex_t Mutex_id;
+TEST_EXTERN pthread_mutex_t Mutex2_id;
+TEST_EXTERN pthread_mutex_t Mutex3_id;
+TEST_EXTERN pthread_mutex_t Mutex_bad_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx05/task.c b/testsuites/psxtests/psx05/task.c
new file mode 100644
index 0000000000..44c6d04c13
--- /dev/null
+++ b/testsuites/psxtests/psx05/task.c
@@ -0,0 +1,58 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+
+ printf( "Task: pthread_mutex_trylock already locked\n" );
+ status = pthread_mutex_trylock( &Mutex_id );
+ if ( status != EBUSY )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+
+ printf( "Task: pthread_mutex_lock unavailable\n" );
+ status = pthread_mutex_lock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ /* switch to init */
+
+ printf( "Task: mutex acquired\n" );
+
+ printf( "Task: sleep for 2 seconds\n" );
+ sleep( 2 );
+
+ /* switch to init */
+
+ printf( "Task: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx05/task2.c b/testsuites/psxtests/psx05/task2.c
new file mode 100644
index 0000000000..13164518d5
--- /dev/null
+++ b/testsuites/psxtests/psx05/task2.c
@@ -0,0 +1,49 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ printf( "Task 2: pthread_mutex_lock unavailable (inherit case)\n" );
+ status = pthread_mutex_lock( &Mutex2_id );
+ if ( status )
+ printf( "status =%d\n", status );
+ assert( !status );
+ printf( "Task 2: mutex acquired\n" );
+
+ /* switch to init */
+
+ printf( "Task 2: unlock Mutex 2\n" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ printf( "Task 2: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx05/task3.c b/testsuites/psxtests/psx05/task3.c
new file mode 100644
index 0000000000..f3adb243d1
--- /dev/null
+++ b/testsuites/psxtests/psx05/task3.c
@@ -0,0 +1,51 @@
+/* Task_3
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_3(
+ void *argument
+)
+{
+ int status;
+ struct sched_param param;
+ int policy;
+
+ printf( "Task 3: pthread_mutex_lock unavailable (inherit case)\n" );
+ status = pthread_mutex_lock( &Mutex2_id );
+ printf( "Task 3: mutex acquired\n" );
+ assert( !status );
+
+ printf( "Task 3: unlock Mutex 2\n" );
+ status = pthread_mutex_unlock( &Mutex2_id );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &policy, &param );
+ assert( !status );
+ printf( "Task 3: pthread_getschedparam priority = %d\n", param.sched_priority );
+
+ printf( "Task 3: exit\n" );
+ pthread_exit( NULL );
+
+ /* switch to Init */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx06/init.c b/testsuites/psxtests/psx06/init.c
new file mode 100644
index 0000000000..e8bd1f5f0e
--- /dev/null
+++ b/testsuites/psxtests/psx06/init.c
@@ -0,0 +1,121 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void Key_destructor(
+ void *key_data
+)
+{
+ Destructor_invoked++;
+
+ /*
+ * This checks out that we only run the destructor multiple times
+ * when the key data is non null.
+ */
+
+ if ( Destructor_invoked == 5 )
+ (void) pthread_setspecific( Key_id, NULL );
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ unsigned int remaining;
+ rtems_unsigned32 *key_data;
+
+ puts( "\n\n*** POSIX TEST 6 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* create a couple of threads */
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ /* create a key */
+
+ empty_line();
+
+ Destructor_invoked = 0;
+ puts( "Init: pthread_key_create - SUCCESSFUL" );
+ status = pthread_key_create( &Key_id, Key_destructor );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ printf( "Destructor invoked %d times\n", Destructor_invoked );
+
+ puts( "Init: pthread_key_create - EAGAIN (too many keys)" );
+ status = pthread_key_create( &Key_id, Key_destructor );
+ assert( status == EAGAIN );
+
+ puts( "Init: pthread_setspecific - EINVAL (invalid key)" );
+ status = pthread_setspecific( -1, &Data_array[ 0 ] );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_getspecific - EINVAL (invalid key)" );
+ key_data = pthread_getspecific( -1 );
+ assert( !key_data );
+
+ puts( "Init: pthread_key_delete - EINVAL (invalid key)" );
+ status = pthread_key_delete( -1 );
+ assert( status == EINVAL );
+
+ printf( "Init: Setting the key to %d\n", 0 );
+ status = pthread_setspecific( Key_id, &Data_array[ 0 ] );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ /* switch to task 1 */
+
+ key_data = pthread_getspecific( Key_id );
+ printf( "Init: Got the key value of %ld\n",
+ (unsigned long) ((rtems_unsigned32 *)key_data - Data_array) );
+
+ remaining = sleep( 3 );
+ if ( remaining )
+ printf( "seconds remaining = %d\n", remaining );
+ assert( !remaining );
+
+ /* switch to task 1 */
+
+ /* delete the key */
+
+ puts( "Init: pthread_key_delete - SUCCESSFUL" );
+ status = pthread_key_delete( Key_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ printf( "Destructor invoked %d times\n", Destructor_invoked );
+
+ puts( "*** END OF POSIX TEST 6 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx06/psx06.scn b/testsuites/psxtests/psx06/psx06.scn
new file mode 100644
index 0000000000..a17fa043ee
--- /dev/null
+++ b/testsuites/psxtests/psx06/psx06.scn
@@ -0,0 +1,21 @@
+*** POSIX TEST 6 ***
+Init's ID is 0x0c010001
+
+Init: pthread_key_create - SUCCESSFUL
+Destructor invoked 0 times
+Init: pthread_key_create - EAGAIN (too many keys)
+Init: pthread_setspecific - EINVAL (invalid key)
+Init: pthread_getspecific - EINVAL (invalid key)
+Init: pthread_key_delete - EINVAL (invalid key)
+Init: Setting the key to 0
+Init: Got the key value of 0
+Task_1: Setting the key to 1
+Task_1: Got the key value of 1
+Task_1: exitting
+Destructor invoked 4 times
+Task_2: Setting the key to 2
+Task_2: Got the key value of 2
+Task2: exitting
+Init: pthread_key_delete - SUCCESSFUL
+Destructor invoked 5 times
+*** END OF POSIX TEST 6 ***
diff --git a/testsuites/psxtests/psx06/system.h b/testsuites/psxtests/psx06/system.h
new file mode 100644
index 0000000000..6a856e8bf6
--- /dev/null
+++ b/testsuites/psxtests/psx06/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 1
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_key_t Key_id;
+TEST_EXTERN rtems_unsigned32 Data_array[ CONFIGURE_MAXIMUM_POSIX_THREADS ];
+TEST_EXTERN rtems_unsigned32 Destructor_invoked;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx06/task.c b/testsuites/psxtests/psx06/task.c
new file mode 100644
index 0000000000..c64efb7190
--- /dev/null
+++ b/testsuites/psxtests/psx06/task.c
@@ -0,0 +1,51 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+ rtems_unsigned32 *key_data;
+
+ printf( "Task_1: Setting the key to %d\n", 1 );
+ status = pthread_setspecific( Key_id, &Data_array[ 1 ] );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ key_data = pthread_getspecific( Key_id );
+ printf( "Task_1: Got the key value of %ld\n",
+ (unsigned long) ((rtems_unsigned32 *)key_data - Data_array) );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ /* switch to task 2 */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx06/task2.c b/testsuites/psxtests/psx06/task2.c
new file mode 100644
index 0000000000..48418d4a46
--- /dev/null
+++ b/testsuites/psxtests/psx06/task2.c
@@ -0,0 +1,52 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+ rtems_unsigned32 *key_data;
+
+ printf( "Destructor invoked %d times\n", Destructor_invoked );
+
+ printf( "Task_2: Setting the key to %d\n", 2 );
+ status = pthread_setspecific( Key_id, &Data_array[ 2 ] );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ key_data = pthread_getspecific( Key_id );
+ printf( "Task_2: Got the key value of %ld\n",
+ (unsigned long) ((rtems_unsigned32 *)key_data - Data_array) );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ puts( "Task2: exitting" );
+ pthread_exit( NULL );
+
+ /* switch to init task */
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx07/init.c b/testsuites/psxtests/psx07/init.c
new file mode 100644
index 0000000000..9e31b1605b
--- /dev/null
+++ b/testsuites/psxtests/psx07/init.c
@@ -0,0 +1,491 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void print_schedparam(
+ char *prefix,
+ struct sched_param *schedparam
+)
+{
+ printf( "%ssched priority = %d\n", prefix, schedparam->sched_priority );
+#if defined(_POSIX_SPORADIC_SERVER)
+ printf( "%sss_low_priority = %d\n", prefix, schedparam->ss_low_priority );
+ printf( "%sss_replenish_period = (%ld, %ld)\n", prefix,
+ schedparam->ss_replenish_period.tv_sec,
+ schedparam->ss_replenish_period.tv_nsec );
+ printf( "%sss_initial_budget = (%ld, %ld)\n", prefix,
+ schedparam->ss_initial_budget.tv_sec,
+ schedparam->ss_initial_budget.tv_nsec );
+#else
+ printf( "%s_POSIX_SPORADIC_SERVER is not defined\n" );
+#endif
+}
+
+extern rtems_configuration_table BSP_Configuration;
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ int scope;
+ int inheritsched;
+ int schedpolicy;
+ size_t stacksize;
+ void *stackaddr;
+ int detachstate;
+ struct sched_param schedparam;
+ pthread_attr_t attr;
+ pthread_attr_t destroyed_attr;
+
+ puts( "\n\n*** POSIX TEST 7 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* exercise init and destroy */
+
+ puts( "Init: pthread_attr_init - EINVAL (NULL attr)" );
+ status = pthread_attr_init( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_init - SUCCESSFUL" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ puts( "Init: initialize and destroy an attribute - SUCCESSFUL" );
+ status = pthread_attr_init( &destroyed_attr );
+ assert( !status );
+
+ status = pthread_attr_destroy( &destroyed_attr );
+ assert( !status );
+
+ puts( "Init: pthread_attr_destroy - EINVAL (NULL attr)" );
+ status = pthread_attr_destroy( NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_destroy - EINVAL (not initialized)" );
+ status = pthread_attr_destroy( &destroyed_attr );
+ assert( status == EINVAL );
+
+ /* check some errors in pthread_create */
+
+ puts( "Init: pthread_create - EINVAL (attr not initialized)" );
+ status = pthread_create( &Task_id, &destroyed_attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* junk stack address */
+ status = pthread_attr_setstackaddr( &attr, (void *)&schedparam );
+ assert( !status );
+
+ /* must go around pthread_attr_setstacksize to set a bad stack size */
+ attr.stacksize = 0;
+
+ puts( "Init: pthread_create - EINVAL (stacksize too small)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ attr.stacksize = BSP_Configuration.work_space_size;
+ puts( "Init: pthread_create - EAGAIN (stacksize too large)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EAGAIN );
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ /* must go around pthread_attr_set routines to set a bad value */
+ attr.inheritsched = -1;
+
+ puts( "Init: pthread_create - EINVAL (invalid inherit scheduler)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* check out the error case for system scope not supported */
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ /* must go around pthread_attr_set routines to set a bad value */
+ attr.contentionscope = PTHREAD_SCOPE_SYSTEM;
+
+ puts( "Init: pthread_create - ENOTSUP (unsupported system contention scope)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == ENOTSUP );
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ /* now check out pthread_create for inherit scheduler */
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_INHERIT_SCHED );
+ assert( !status );
+
+ puts( "Init: pthread_create - SUCCESSFUL (inherit scheduler)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ /* switch to Task_1 */
+
+ /* exercise get and set scope */
+
+ empty_line();
+
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_attr_setscope - EINVAL (NULL attr)" );
+ status = pthread_attr_setscope( NULL, PTHREAD_SCOPE_PROCESS );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setscope - ENOTSUP" );
+ status = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );
+ assert( status == ENOTSUP );
+
+ puts( "Init: pthread_attr_setscope - EINVAL (not initialized attr)" );
+ status = pthread_attr_setscope( &destroyed_attr, PTHREAD_SCOPE_PROCESS );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setscope - EINVAL (invalid scope)" );
+ status = pthread_attr_setscope( &attr, -1 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setscope - SUCCESSFUL" );
+ status = pthread_attr_setscope( &attr, PTHREAD_SCOPE_PROCESS );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getscope - EINVAL (NULL attr)" );
+ status = pthread_attr_getscope( NULL, &scope );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getscope - EINVAL (NULL scope)" );
+ status = pthread_attr_getscope( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getscope - EINVAL (not initialized attr)" );
+ status = pthread_attr_getscope( &destroyed_attr, &scope );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getscope - SUCCESSFUL" );
+ status = pthread_attr_getscope( &attr, &scope );
+ assert( !status );
+ printf( "Init: current scope attribute = %d\n", scope );
+
+ /* exercise get and set inherit scheduler */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setinheritsched - EINVAL (NULL attr)" );
+ status = pthread_attr_setinheritsched( NULL, PTHREAD_INHERIT_SCHED );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setinheritsched - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setinheritsched( &destroyed_attr, PTHREAD_INHERIT_SCHED );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setinheritsched - ENOTSUP (invalid inheritsched)" );
+ status = pthread_attr_setinheritsched( &attr, -1 );
+ assert( status == ENOTSUP );
+
+ puts( "Init: pthread_attr_setinheritsched - SUCCESSFUL" );
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_INHERIT_SCHED );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getinheritsched - EINVAL (NULL attr)" );
+ status = pthread_attr_getinheritsched( NULL, &inheritsched );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getinheritsched - EINVAL (NULL inheritsched)" );
+ status = pthread_attr_getinheritsched( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getinheritsched - EINVAL (not initialized attr)" );
+ status = pthread_attr_getinheritsched( &destroyed_attr, &inheritsched );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getinheritsched - SUCCESSFUL" );
+ status = pthread_attr_getinheritsched( &attr, &inheritsched );
+ assert( !status );
+ printf( "Init: current inherit scheduler attribute = %d\n", inheritsched );
+
+ /* exercise get and set inherit scheduler */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setschedpolicy - EINVAL (NULL attr)" );
+ status = pthread_attr_setschedpolicy( NULL, SCHED_FIFO );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedpolicy - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setschedpolicy( &destroyed_attr, SCHED_OTHER );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedpolicy - ENOTSUP (invalid schedpolicy)" );
+ status = pthread_attr_setschedpolicy( &attr, -1 );
+ assert( status == ENOTSUP );
+
+ puts( "Init: pthread_attr_setschedpolicy - SUCCESSFUL" );
+ status = pthread_attr_setschedpolicy( &attr, SCHED_RR );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getschedpolicy - EINVAL (NULL attr)" );
+ status = pthread_attr_getschedpolicy( NULL, &schedpolicy );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedpolicy - EINVAL (NULL schedpolicy)" );
+ status = pthread_attr_getschedpolicy( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedpolicy - EINVAL (not initialized attr)" );
+ status = pthread_attr_getschedpolicy( &destroyed_attr, &schedpolicy );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedpolicy - SUCCESSFUL" );
+ status = pthread_attr_getschedpolicy( &attr, &schedpolicy );
+ assert( !status );
+ printf( "Init: current scheduler policy attribute = %d\n", schedpolicy );
+
+ /* exercise get and set stack size */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setstacksize - EINVAL (NULL attr)" );
+ status = pthread_attr_setstacksize( NULL, 0 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstacksize - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setstacksize( &destroyed_attr, 0 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstacksize - SUCCESSFUL (low stacksize)" );
+ status = pthread_attr_setstacksize( &attr, 0 );
+ assert( !status );
+
+ puts( "Init: pthread_attr_setstacksize - SUCCESSFUL (high stacksize)" );
+ status = pthread_attr_setstacksize( &attr, STACK_MINIMUM_SIZE * 2 );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getstacksize - EINVAL (NULL attr)" );
+ status = pthread_attr_getstacksize( NULL, &stacksize );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstacksize - EINVAL (NULL stacksize)" );
+ status = pthread_attr_getstacksize( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstacksize - EINVAL (not initialized attr)" );
+ status = pthread_attr_getstacksize( &destroyed_attr, &stacksize );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstacksize - SUCCESSFUL" );
+ status = pthread_attr_getstacksize( &attr, &stacksize );
+ assert( !status );
+ printf( "Init: current stack size attribute = %ld\n", (long) stacksize );
+
+ /* exercise get and set stack address */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setstackaddr - EINVAL (NULL attr)" );
+ status = pthread_attr_setstackaddr( NULL, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstackaddr - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setstackaddr( &destroyed_attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setstackaddr - SUCCESSFUL" );
+ status = pthread_attr_setstackaddr( &attr, 0 );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getstackaddr - EINVAL (NULL attr)" );
+ status = pthread_attr_getstackaddr( NULL, &stackaddr );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstackaddr - EINVAL (NULL stackaddr)" );
+ status = pthread_attr_getstackaddr( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstackaddr - EINVAL (not initialized attr)" );
+ status = pthread_attr_getstackaddr( &destroyed_attr, &stackaddr );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getstackaddr - SUCCESSFUL" );
+ status = pthread_attr_getstackaddr( &attr, &stackaddr );
+ assert( !status );
+ printf( "Init: current stack address attribute = %p\n", stackaddr );
+
+ /* exercise get and set detach state */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_setdetachstate - EINVAL (NULL attr)" );
+ status = pthread_attr_setdetachstate( NULL, PTHREAD_CREATE_DETACHED );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setdetachstate - EINVAL (not initialized attr)" );
+ status =
+ pthread_attr_setdetachstate( &destroyed_attr, PTHREAD_CREATE_JOINABLE );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setdetachstate - EINVAL (invalid detachstate)" );
+ status = pthread_attr_setdetachstate( &attr, -1 );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setdetachstate - SUCCESSFUL" );
+ status = pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_JOINABLE );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getdetachstate - EINVAL (NULL attr)" );
+ status = pthread_attr_getdetachstate( NULL, &detachstate );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getdetachstate - EINVAL (NULL detatchstate)" );
+ status = pthread_attr_getdetachstate( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getdetachstate - EINVAL (not initialized attr)" );
+ status = pthread_attr_getdetachstate( &destroyed_attr, &detachstate );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getdetachstate - SUCCESSFUL" );
+ status = pthread_attr_getdetachstate( &attr, &detachstate );
+ assert( !status );
+ printf( "Init: current detach state attribute = %d\n", detachstate );
+
+ /* exercise get and set scheduling parameters */
+
+ empty_line();
+
+ puts( "Init: pthread_attr_getschedparam - SUCCESSFUL" );
+ status = pthread_attr_getschedparam( &attr, &schedparam );
+ assert( !status );
+
+ print_schedparam( "Init: ", &schedparam );
+
+ puts( "Init: pthread_attr_setschedparam - EINVAL (NULL attr)" );
+ status = pthread_attr_setschedparam( NULL, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedparam - EINVAL (not initialized attr)" );
+ status = pthread_attr_setschedparam( &destroyed_attr, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_attr_setschedparam( &attr, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_setschedparam - SUCCESSFUL" );
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ puts( "Init: pthread_attr_getschedparam - EINVAL (NULL attr)" );
+ status = pthread_attr_getschedparam( NULL, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedparam - EINVAL (not initialized attr)" );
+ status = pthread_attr_getschedparam( &destroyed_attr, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_attr_getschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_attr_getschedparam( &attr, NULL );
+ assert( status == EINVAL );
+
+ /* exercise pthread_getschedparam */
+
+ empty_line();
+
+ puts( "Init: pthread_getschedparam - EINVAL (NULL policy)" );
+ status = pthread_getschedparam( pthread_self(), NULL, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_getschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, NULL );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_getschedparam - ESRCH (bad thread)" );
+ status = pthread_getschedparam( -1, &schedpolicy, &schedparam );
+ assert( status == ESRCH );
+
+ puts( "Init: pthread_getschedparam - SUCCESSFUL" );
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ printf( "Init: policy = %d\n", schedpolicy );
+
+ print_schedparam( "Init: ", &schedparam );
+
+ /* exercise pthread_setschedparam */
+
+ empty_line();
+
+ puts( "Init: pthread_setschedparam - EINVAL (NULL schedparam)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_OTHER, NULL );
+ assert( status == EINVAL );
+
+ schedparam.sched_priority = -1;
+
+ puts( "Init: pthread_setschedparam - EINVAL (invalid priority)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_OTHER, NULL );
+ assert( status == EINVAL );
+
+ schedparam.sched_priority = 128;
+
+ puts( "Init: pthread_setschedparam - EINVAL (invalid policy)" );
+ status = pthread_setschedparam( pthread_self(), -1, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_setschedparam - ESRCH (invalid thread)" );
+ status = pthread_setschedparam( -1, SCHED_OTHER, &schedparam );
+ assert( status == ESRCH );
+
+ /* now get sporadic server errors */
+
+ schedparam.ss_replenish_period.tv_sec = 1;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 1;
+
+ puts( "Init: pthread_setschedparam - EINVAL (replenish < budget)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( status == EINVAL );
+
+ schedparam.ss_replenish_period.tv_sec = 2;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+ schedparam.ss_low_priority = -1;
+
+ puts( "Init: pthread_setschedparam - EINVAL (invalid priority)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( status == EINVAL );
+
+ puts( "*** END OF POSIX TEST 7 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx07/psx07.scn b/testsuites/psxtests/psx07/psx07.scn
new file mode 100644
index 0000000000..33f5c68f6a
--- /dev/null
+++ b/testsuites/psxtests/psx07/psx07.scn
@@ -0,0 +1,105 @@
+*** POSIX TEST 7 ***
+Init's ID is 0x0c010001
+Init: pthread_attr_init - EINVAL (NULL attr)
+Init: pthread_attr_init - SUCCESSFUL
+Init: initialize and destroy an attribute - SUCCESSFUL
+Init: pthread_attr_destroy - EINVAL (NULL attr)
+Init: pthread_attr_destroy - EINVAL (not initialized)
+Init: pthread_create - EINVAL (attr not initialized)
+Init: pthread_create - EINVAL (stacksize too small)
+Init: pthread_create - EAGAIN (stacksize too large)
+Init: pthread_create - EINVAL (invalid inherit scheduler)
+Init: pthread_create - ENOTSUP (unsupported system contention scope)
+Init: pthread_create - SUCCESSFUL (inherit scheduler)
+Task_1: exitting
+
+Init: pthread_attr_setscope - EINVAL (NULL attr)
+Init: pthread_attr_setscope - ENOTSUP
+Init: pthread_attr_setscope - EINVAL (not initialized attr)
+Init: pthread_attr_setscope - EINVAL (invalid scope)
+Init: pthread_attr_setscope - SUCCESSFUL
+Init: pthread_attr_getscope - EINVAL (NULL attr)
+Init: pthread_attr_getscope - EINVAL (NULL scope)
+Init: pthread_attr_getscope - EINVAL (not initialized attr)
+Init: pthread_attr_getscope - SUCCESSFUL
+Init: current scope attribute = 0
+
+Init: pthread_attr_setinheritsched - EINVAL (NULL attr)
+Init: pthread_attr_setinheritsched - EINVAL (not initialized attr)
+Init: pthread_attr_setinheritsched - ENOTSUP (invalid inheritsched)
+Init: pthread_attr_setinheritsched - SUCCESSFUL
+Init: pthread_attr_getinheritsched - EINVAL (NULL attr)
+Init: pthread_attr_getinheritsched - EINVAL (NULL inheritsched)
+Init: pthread_attr_getinheritsched - EINVAL (not initialized attr)
+Init: pthread_attr_getinheritsched - SUCCESSFUL
+Init: current inherit scheduler attribute = 1
+
+Init: pthread_attr_setschedpolicy - EINVAL (NULL attr)
+Init: pthread_attr_setschedpolicy - EINVAL (not initialized attr)
+Init: pthread_attr_setschedpolicy - ENOTSUP (invalid schedpolicy)
+Init: pthread_attr_setschedpolicy - SUCCESSFUL
+Init: pthread_attr_getschedpolicy - EINVAL (NULL attr)
+Init: pthread_attr_getschedpolicy - EINVAL (NULL schedpolicy)
+Init: pthread_attr_getschedpolicy - EINVAL (not initialized attr)
+Init: pthread_attr_getschedpolicy - SUCCESSFUL
+Init: current scheduler policy attribute = 2
+
+Init: pthread_attr_setstacksize - EINVAL (NULL attr)
+Init: pthread_attr_setstacksize - EINVAL (not initialized attr)
+Init: pthread_attr_setstacksize - SUCCESSFUL (low stacksize)
+Init: pthread_attr_setstacksize - SUCCESSFUL (high stacksize)
+Init: pthread_attr_getstacksize - EINVAL (NULL attr)
+Init: pthread_attr_getstacksize - EINVAL (NULL stacksize)
+Init: pthread_attr_getstacksize - EINVAL (not initialized attr)
+Init: pthread_attr_getstacksize - SUCCESSFUL
+Init: current stack size attribute = 5120
+
+Init: pthread_attr_setstackaddr - EINVAL (NULL attr)
+Init: pthread_attr_setstackaddr - EINVAL (not initialized attr)
+Init: pthread_attr_setstackaddr - SUCCESSFUL
+Init: pthread_attr_getstackaddr - EINVAL (NULL attr)
+Init: pthread_attr_getstackaddr - EINVAL (NULL stackaddr)
+Init: pthread_attr_getstackaddr - EINVAL (not initialized attr)
+Init: pthread_attr_getstackaddr - SUCCESSFUL
+Init: current stack address attribute = 0x0
+
+Init: pthread_attr_setdetachstate - EINVAL (NULL attr)
+Init: pthread_attr_setdetachstate - EINVAL (not initialized attr)
+Init: pthread_attr_setdetachstate - EINVAL (invalid detachstate)
+Init: pthread_attr_setdetachstate - SUCCESSFUL
+Init: pthread_attr_getdetachstate - EINVAL (NULL attr)
+Init: pthread_attr_getdetachstate - EINVAL (NULL detatchstate)
+Init: pthread_attr_getdetachstate - EINVAL (not initialized attr)
+Init: pthread_attr_getdetachstate - SUCCESSFUL
+Init: current detach state attribute = 1
+
+Init: pthread_attr_getschedparam - SUCCESSFUL
+Init: sched priority = 2
+Init: ss_low_priority = 0
+Init: ss_replenish_period = (0, 0)
+Init: ss_initial_budget = (0, 0)
+Init: pthread_attr_setschedparam - EINVAL (NULL attr)
+Init: pthread_attr_setschedparam - EINVAL (not initialized attr)
+Init: pthread_attr_setschedparam - EINVAL (NULL schedparam)
+Init: pthread_attr_setschedparam - SUCCESSFUL
+Init: pthread_attr_getschedparam - EINVAL (NULL attr)
+Init: pthread_attr_getschedparam - EINVAL (not initialized attr)
+Init: pthread_attr_getschedparam - EINVAL (NULL schedparam)
+
+Init: pthread_getschedparam - EINVAL (NULL policy)
+Init: pthread_getschedparam - EINVAL (NULL schedparam)
+Init: pthread_getschedparam - ESRCH (bad thread)
+Init: pthread_getschedparam - SUCCESSFUL
+Init: policy = 1
+Init: sched priority = 2
+Init: ss_low_priority = 0
+Init: ss_replenish_period = (0, 0)
+Init: ss_initial_budget = (0, 0)
+
+Init: pthread_setschedparam - EINVAL (NULL schedparam)
+Init: pthread_setschedparam - EINVAL (invalid priority)
+Init: pthread_setschedparam - EINVAL (invalid policy)
+Init: pthread_setschedparam - ESRCH (invalid thread)
+Init: pthread_setschedparam - EINVAL (replenish < budget)
+Init: pthread_setschedparam - EINVAL (invalid priority)
+*** END OF POSIX TEST 7 ***
diff --git a/testsuites/psxtests/psx07/system.h b/testsuites/psxtests/psx07/system.h
new file mode 100644
index 0000000000..cda511751e
--- /dev/null
+++ b/testsuites/psxtests/psx07/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx07/task.c b/testsuites/psxtests/psx07/task.c
new file mode 100644
index 0000000000..d4dc39d840
--- /dev/null
+++ b/testsuites/psxtests/psx07/task.c
@@ -0,0 +1,34 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <time.h>
+#include <sched.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx08/init.c b/testsuites/psxtests/psx08/init.c
new file mode 100644
index 0000000000..bd6ad8c2b1
--- /dev/null
+++ b/testsuites/psxtests/psx08/init.c
@@ -0,0 +1,82 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ void *return_pointer;
+
+ puts( "\n\n*** POSIX TEST 8 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ puts( "Init: pthread_detach - ESRCH (invalid id)" );
+ status = pthread_detach( -1 );
+ assert( status == ESRCH );
+
+ /* detach this thread */
+
+ puts( "Init: pthread_detach self" );
+ status = pthread_detach( pthread_self() );
+ assert( !status );
+
+ /* create thread */
+
+ puts( "Init: creating two tasks" );
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+ puts( "Init: pthread_join - ESRCH (invalid id)" );
+ status = pthread_join( -1, &return_pointer );
+ assert( status == ESRCH );
+
+ puts( "Init: pthread_join - SUCCESSFUL" );
+ status = pthread_join( Task_id, &return_pointer );
+ /* assert is below comment */
+
+ /* switch to Task 1 */
+
+ puts( "Init: returned from pthread_join" );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ if ( return_pointer == &Task_id )
+ puts( "Init: pthread_join returned correct pointer" );
+ else
+ printf(
+ "Init: pthread_join returned incorrect pointer (%p != %p)\n",
+ return_pointer,
+ &Task_id
+ );
+
+ puts( "Init: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx08/psx08.scn b/testsuites/psxtests/psx08/psx08.scn
new file mode 100644
index 0000000000..34c1934f59
--- /dev/null
+++ b/testsuites/psxtests/psx08/psx08.scn
@@ -0,0 +1,18 @@
+*** POSIX TEST 8 ***
+Init's ID is 0x0c010001
+Init: pthread_detach - ESRCH (invalid id)
+Init: pthread_detach self
+Init: creating two tasks
+Init: pthread_join - ESRCH (invalid id)
+Init: pthread_join - SUCCESSFUL
+Task_1: sleep 1 second
+Task_2: join to Task_1
+Task_1: join to detached task (Init) -- EINVAL
+Task_1: join to self task (Init) -- EDEADLK
+Task_1: exitting
+Init: returned from pthread_join
+Init: pthread_join returned correct pointer
+Init: exitting
+Task_2: returned from pthread_join
+Task_2: pthread_join returned correct pointer
+*** END OF POSIX TEST 8 ***
diff --git a/testsuites/psxtests/psx08/system.h b/testsuites/psxtests/psx08/system.h
new file mode 100644
index 0000000000..84622608e0
--- /dev/null
+++ b/testsuites/psxtests/psx08/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx08/task2.c b/testsuites/psxtests/psx08/task2.c
new file mode 100644
index 0000000000..eceefe5553
--- /dev/null
+++ b/testsuites/psxtests/psx08/task2.c
@@ -0,0 +1,52 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <errno.h>
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+ void *return_pointer;
+
+ puts( "Task_2: join to Task_1" );
+ status = pthread_join( Task_id, &return_pointer );
+ puts( "Task_2: returned from pthread_join" );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ if ( return_pointer == &Task_id )
+ puts( "Task_2: pthread_join returned correct pointer" );
+ else
+ printf(
+ "Task_2: pthread_join returned incorrect pointer (%p != %p)\n",
+ return_pointer,
+ &Task_id
+ );
+
+ puts( "*** END OF POSIX TEST 8 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx09/init.c b/testsuites/psxtests/psx09/init.c
new file mode 100644
index 0000000000..50119c3bc9
--- /dev/null
+++ b/testsuites/psxtests/psx09/init.c
@@ -0,0 +1,226 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void print_schedparam(
+ char *prefix,
+ struct sched_param *schedparam
+)
+{
+ printf( "%ssched priority = %d\n", prefix, schedparam->sched_priority );
+#if defined(_POSIX_SPORADIC_SERVER)
+ printf( "%sss_low_priority = %d\n", prefix, schedparam->ss_low_priority );
+ printf( "%sss_replenish_period = (%ld, %ld)\n", prefix,
+ schedparam->ss_replenish_period.tv_sec,
+ schedparam->ss_replenish_period.tv_nsec );
+ printf( "%sss_initial_budget = (%ld, %ld)\n", prefix,
+ schedparam->ss_initial_budget.tv_sec,
+ schedparam->ss_initial_budget.tv_nsec );
+#else
+ printf( "%s_POSIX_SPORADIC_SERVER is not defined\n" );
+#endif
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ int passes;
+ int schedpolicy;
+ int priority;
+ struct sched_param schedparam;
+ char buffer[ 80 ];
+ pthread_mutexattr_t attr;
+
+ puts( "\n\n*** POSIX TEST 9 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* try to use this thread as a sporadic server */
+
+ puts( "Init: pthread_getschedparam - SUCCESSFUL" );
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - current priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ schedparam.ss_replenish_period.tv_sec = 0;
+ schedparam.ss_replenish_period.tv_nsec = 500000000; /* 1/2 second */
+ schedparam.ss_initial_budget.tv_sec = 0;
+ schedparam.ss_initial_budget.tv_nsec = 250000000; /* 1/4 second */
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = 100;
+
+ puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ /* go into a loop consuming CPU time to watch our priority change */
+
+ for ( passes=0 ; passes <= 3 ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( priority != schedparam.sched_priority ) {
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+ passes++;
+ }
+ }
+
+ /* now see if this works if we are holding a priority ceiling mutex */
+
+ empty_line();
+
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ schedparam.ss_replenish_period.tv_sec = 0;
+ schedparam.ss_replenish_period.tv_nsec = 500000000; /* 1/2 second */
+ schedparam.ss_initial_budget.tv_sec = 0;
+ schedparam.ss_initial_budget.tv_nsec = 250000000; /* 1/4 second */
+
+#define HIGH_PRIORITY 150
+#define MEDIUM_PRIORITY 131
+#define LOW_PRIORITY 100
+
+ schedparam.sched_priority = HIGH_PRIORITY;
+ schedparam.ss_low_priority = LOW_PRIORITY;
+
+ puts( "Init: pthread_setschedparam - SUCCESSFUL (sporadic server)" );
+ status = pthread_setschedparam( pthread_self(), SCHED_SPORADIC, &schedparam );
+ assert( !status );
+
+ puts( "Init: Initializing mutex attributes for priority ceiling" );
+ status = pthread_mutexattr_init( &attr );
+ assert( !status );
+
+ status = pthread_mutexattr_setprotocol( &attr, PTHREAD_PRIO_PROTECT );
+ assert( !status );
+
+ status = pthread_mutexattr_setprioceiling( &attr, MEDIUM_PRIORITY );
+ assert( !status );
+
+ puts( "Init: Creating a mutex" );
+ status = pthread_mutex_init( &Mutex_id, &attr );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ /* go into a loop consuming CPU time to watch our priority lower */
+
+ for ( ; ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( schedparam.sched_priority != LOW_PRIORITY )
+ continue;
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ puts( "Init: pthread_mutex_lock acquire the lock" );
+ status = pthread_mutex_lock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ break;
+ }
+
+ /* now spin waiting for our budget to be replenished */
+
+ for ( ; ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( schedparam.sched_priority == HIGH_PRIORITY )
+ break;
+ }
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ /* with this unlock we should be able to go to low priority */
+
+ puts( "Init: unlock mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ if ( status )
+ printf( "status = %d\n", status );
+ assert( !status );
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ for ( ; ; ) {
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ if ( schedparam.sched_priority == LOW_PRIORITY )
+ break;
+ }
+
+ status = pthread_getschedparam( pthread_self(), &schedpolicy, &schedparam );
+ assert( !status );
+
+ priority = schedparam.sched_priority;
+ sprintf( buffer, " - new priority = %d", priority );
+ print_current_time( "Init: ", buffer );
+
+ puts( "*** END OF POSIX TEST 9 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx09/psx09.scn b/testsuites/psxtests/psx09/psx09.scn
new file mode 100644
index 0000000000..afc609c456
--- /dev/null
+++ b/testsuites/psxtests/psx09/psx09.scn
@@ -0,0 +1,23 @@
+*** POSIX TEST 9 ***
+Init's ID is 0x0c010001
+Init: pthread_getschedparam - SUCCESSFUL
+Init: Fri May 24 11:05:00 1996 - current priority = 2
+Init: pthread_setschedparam - SUCCESSFUL (sporadic server)
+Init: Fri May 24 11:05:00 1996 - new priority = 200
+Init: Fri May 24 11:05:00 1996 - new priority = 100
+Init: Fri May 24 11:05:00 1996 - new priority = 200
+Init: Fri May 24 11:05:00 1996 - new priority = 100
+Init: Fri May 24 11:05:01 1996 - new priority = 200
+
+Init: pthread_setschedparam - SUCCESSFUL (sporadic server)
+Init: Initializing mutex attributes for priority ceiling
+Init: Creating a mutex
+Init: Fri May 24 11:05:01 1996 - new priority = 150
+Init: Fri May 24 11:05:01 1996 - new priority = 100
+Init: pthread_mutex_lock acquire the lock
+Init: Fri May 24 11:05:01 1996 - new priority = 131
+Init: Fri May 24 11:05:01 1996 - new priority = 150
+Init: unlock mutex
+Init: Fri May 24 11:05:01 1996 - new priority = 150
+Init: Fri May 24 11:05:01 1996 - new priority = 100
+*** END OF POSIX TEST 9 ***
diff --git a/testsuites/psxtests/psx09/system.h b/testsuites/psxtests/psx09/system.h
new file mode 100644
index 0000000000..32518e58b6
--- /dev/null
+++ b/testsuites/psxtests/psx09/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 10
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_mutex_t Mutex_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx10/init.c b/testsuites/psxtests/psx10/init.c
new file mode 100644
index 0000000000..17105591a6
--- /dev/null
+++ b/testsuites/psxtests/psx10/init.c
@@ -0,0 +1,312 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <sched.h>
+
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ pthread_condattr_t attr;
+ pthread_condattr_t attr_error;
+ int pshared;
+ pthread_cond_t cond;
+ struct timespec timeout;
+
+ puts( "\n\n*** POSIX TEST 10 ***" );
+
+ puts( "Init: pthread_condattr_init" );
+ status = pthread_condattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_init - EINVAL (attribute invalid)" );
+ status = pthread_condattr_init( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_condattr_destroy" );
+ status = pthread_condattr_destroy( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_destroy - EINVAL (attribute invalid)" );
+ status = pthread_condattr_destroy( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+
+ puts( "Init: pthread_condattr_init" );
+ status = pthread_condattr_init( &attr );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_setpshared - PTHREAD_PROCESS_SHARED" );
+ status = pthread_condattr_setpshared( &attr, PTHREAD_PROCESS_SHARED );
+ assert( !status );
+
+ puts( "Init: pthread_condattr_setpshared - PTHREAD_PROCESS_PRIVATE" );
+ status = pthread_condattr_setpshared( &attr, PTHREAD_PROCESS_PRIVATE );
+ assert( !status );
+
+ status = pthread_condattr_setpshared( NULL, PTHREAD_PROCESS_PRIVATE );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_condattr_setpshared - EINVAL (attribute invalid)" );
+
+ status = pthread_condattr_setpshared( &attr, 0xFFFFFF );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_condattr_setpshared - EINVAL (pshared invalid)" );
+
+ status = pthread_condattr_getpshared( &attr, &pshared );
+ assert( !status );
+ printf( "Init: pthread_condattr_getpshared - %d\n", pshared );
+
+ status = pthread_condattr_getpshared( NULL, &pshared );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_condattr_getpshared - EINVAL (attribute invalid)" );
+
+ puts( "Init: pthread_cond_init - NULL attr" );
+ status = pthread_cond_init( &cond, NULL );
+ assert( !status );
+
+/* error for attribute not initialized */
+
+ attr_error.is_initialized = FALSE;
+ status = pthread_cond_init( &cond, &attr_error );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_init - EINVAL (attr not initialized)" );
+
+ status = pthread_cond_init( &cond, NULL );
+ if ( status != ENOMEM )
+ printf( "status = %d\n", status );
+ assert( status == ENOMEM );
+ puts( "Init: pthread_cond_init - ENOMEM (too many conds)" );
+
+ puts( "Init: pthread_cond_destroy" );
+ status = pthread_cond_destroy( &cond );
+ assert( !status );
+
+/* error for bad condition variable passed */
+
+ status = pthread_cond_destroy( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_destroy - EINVAL (cond invalid)" );
+
+/* initiailize the attribute for the rest of the test */
+
+ puts( "Init: pthread_cond_init - attr" );
+ status = pthread_cond_init( &Cond1_id, &attr );
+ assert( !status );
+
+/* signal task1 with a condition variable */
+
+ empty_line();
+
+ status = pthread_create( &Task_id, NULL, Task_1, NULL );
+ assert( !status );
+
+/* switch to task1 to allow it to wait for a condition variable */
+
+ puts( "Init: sleep to switch to Task_1" );
+ sleep( 1 );
+
+ status = pthread_cond_destroy( &Cond1_id );
+ if ( status != EBUSY )
+ printf( "status = %d\n", status );
+ assert( status == EBUSY );
+ puts( "Init: pthread_cond_destroy - EBUSY (task1 waiting)" );
+
+ puts( "Init: pthread_cond_signal" );
+ status = pthread_cond_signal( &Cond1_id );
+ assert( !status );
+
+ empty_line();
+
+ status = pthread_create( &Task2_id, NULL, Task_2, NULL );
+ assert( !status );
+
+/* switch to task1 and task2 to allow them to wait for broadcast signal */
+
+ puts( "Init: sleep - switch to Task_1 and Task_2" );
+ sleep( 1 );
+
+/* broadcast a condition variable to task1 and task2 */
+
+ puts( "Init: pthread_cond_broadcast" );
+ status = pthread_cond_broadcast( &Cond1_id );
+ assert( !status );
+
+ puts( "Init: sleep - switch to Task_1" );
+ sleep( 0 );
+
+/* timedwait case - timeout */
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+/* set timeout to 3 seconds */
+
+ status = clock_gettime( CLOCK_REALTIME, &timeout );
+ assert( !status );
+ timeout.tv_sec += 3;
+ timeout.tv_nsec = 0;
+
+ puts( "Init: pthread_cond_timedwait for 3 seconds" );
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ if ( status != ETIMEDOUT )
+ printf( "status = %d\n", status );
+ assert( status == ETIMEDOUT );
+ puts( "Init: pthread_cond_timedwait - ETIMEDOUT - (mutex not acquired)" );
+
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+/* remaining error messages */
+
+ empty_line();
+
+/* errors for bad variable passed */
+
+ status = pthread_cond_signal( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_signal - EINVAL (cond invalid)" );
+
+ status = pthread_cond_broadcast( NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_broadcast - EINVAL (cond invalid)" );
+
+/* acquire mutex so errors will occur */
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ status = pthread_cond_wait( NULL, &Mutex_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_wait - EINVAL (cond invalid)" );
+
+ status = pthread_cond_timedwait( NULL, &Mutex_id, &timeout );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_timedwait - EINVAL (cond invalid)" );
+
+ status = pthread_cond_wait( &Cond1_id, NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_wait - EINVAL (mutex invalid)" );
+
+ status = pthread_cond_timedwait( &Cond1_id, NULL, &timeout );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_timedwait - EINVAL (mutex invalid)" );
+
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, NULL );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Init: pthread_cond_timedwait - EINVAL (abstime NULL)" );
+
+ status = clock_gettime( CLOCK_REALTIME, &timeout );
+ assert( !status );
+ timeout.tv_sec -= 1;
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ if ( status != ETIMEDOUT )
+ printf( "status = %d\n", status );
+ assert( status == ETIMEDOUT );
+ puts( "Init: pthread_cond_timedwait - ETIMEDOUT (abstime->tv_sec < current time)" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+ status = clock_gettime( CLOCK_REALTIME, &timeout );
+ assert( !status );
+ timeout.tv_nsec -= 1;
+ status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ if ( status != ETIMEDOUT )
+ printf( "status = %d\n", status );
+ assert( status == ETIMEDOUT );
+ puts( "Init: pthread_cond_timedwait - ETIMEDOUT (abstime->tv_nsec < current time)" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+/* wait and timedwait without mutex */
+
+/* XXX - this case is commented out in the code pending review
+ *
+ * status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ * if ( status != EINVAL )
+ * printf( "status = %d\n", status );
+ * assert( status == EINVAL );
+ */
+ puts( "Init: pthread_cond_wait - EINVAL (mutex not locked before call)" );
+
+/* XXX - this case is commented out in the code pending review
+ *
+ * status = clock_gettime( CLOCK_REALTIME, &timeout );
+ * assert( !status );
+ * timeout.tv_sec += 1;
+ * status = pthread_cond_timedwait( &Cond1_id, &Mutex_id, &timeout );
+ * if ( status != EINVAL )
+ * printf( "status = %d\n", status );
+ * assert( status == EINVAL );
+ */
+ puts( "Init: pthread_cond_timedwait - EINVAL (mutex not locked before call)");
+
+ empty_line();
+
+ status = pthread_create( &Task3_id, NULL, Task_3, NULL );
+ assert( !status );
+
+/* switch to task3 to allow it to wait for broadcast signal */
+
+ puts( "Init: sleep - switch to Task_3" );
+ sleep( 1 );
+
+/* destroy the mutex so Task3 can not acguire at the end of Wait_support */
+
+ status = pthread_mutex_destroy( &Mutex_id );
+ assert( !status );
+
+/* signal a condition variable to task3 */
+
+ puts( "Init: pthread_cond_signal" );
+ status = pthread_cond_signal( &Cond1_id );
+
+ puts( "Init: sleep - switch to Task_3" );
+ sleep( 1 );
+
+ puts( "*** END OF POSIX TEST 10 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx10/psx10.scn b/testsuites/psxtests/psx10/psx10.scn
new file mode 100644
index 0000000000..a19b9d8c49
--- /dev/null
+++ b/testsuites/psxtests/psx10/psx10.scn
@@ -0,0 +1,60 @@
+*** POSIX TEST 10 ***
+Init: pthread_condattr_init
+Init: pthread_condattr_init - EINVAL (attribute invalid)
+Init: pthread_condattr_destroy
+Init: pthread_condattr_destroy - EINVAL (attribute invalid)
+Init: pthread_condattr_init
+Init: pthread_condattr_setpshared - PTHREAD_PROCESS_SHARED
+Init: pthread_condattr_setpshared - PTHREAD_PROCESS_PRIVATE
+Init: pthread_condattr_setpshared - EINVAL (attribute invalid)
+Init: pthread_condattr_setpshared - EINVAL (pshared invalid)
+Init: pthread_condattr_getpshared - 0
+Init: pthread_condattr_getpshared - EINVAL (attribute invalid)
+Init: pthread_cond_init - NULL attr
+Init: pthread_cond_init - EINVAL (attr not initialized)
+Init: pthread_cond_init - ENOMEM (too many conds)
+Init: pthread_cond_destroy
+Init: pthread_cond_destroy - EINVAL (cond invalid)
+Init: pthread_cond_init - attr
+
+Init: sleep to switch to Task_1
+Task_1: ID is 0x0c010002
+Task_1: pthread_cond_wait
+Init: pthread_cond_destroy - EBUSY (task1 waiting)
+Init: pthread_cond_signal
+
+Init: sleep - switch to Task_1 and Task_2
+Task_1: back from pthread_cond_wait release mutex
+Task_1: pthread_cond_wait
+Task_2: ID is 0x0c010003
+Task_2: pthread_cond_wait
+Init: pthread_cond_broadcast
+Init: sleep - switch to Task_1
+Task_1: back from pthread_cond_wait release mutex
+Task_1: task exit
+Task_2: back from pthread_cond_wait release mutex
+Task_2: task exit
+Init: pthread_cond_timedwait for 3 seconds
+Init: pthread_cond_timedwait - ETIMEDOUT - (mutex not acquired)
+
+Init: pthread_cond_signal - EINVAL (cond invalid)
+Init: pthread_cond_broadcast - EINVAL (cond invalid)
+Init: pthread_cond_wait - EINVAL (cond invalid)
+Init: pthread_cond_timedwait - EINVAL (cond invalid)
+Init: pthread_cond_wait - EINVAL (mutex invalid)
+Init: pthread_cond_timedwait - EINVAL (mutex invalid)
+Init: pthread_cond_timedwait - EINVAL (abstime NULL)
+Init: pthread_cond_timedwait - EINVAL (abstime->tv_sec invalid)
+Init: pthread_cond_timedwait - EINVAL (abstime->tv_nsec invalid)
+Init: pthread_cond_timedwait - EINVAL (abstime->tv_nsec to large)
+Init: pthread_cond_wait - EINVAL (mutex not locked before call)
+Init: pthread_cond_timedwait - EINVAL (mutex not locked before call)
+
+Init: sleep - switch to Task_3
+Task_3: ID is 0x0c010004
+Task_3: pthread_cond_wait
+Init: pthread_cond_signal
+Init: sleep - switch to Task_3
+Task_3: pthread_cond_wait - EINVAL (mutex not locked after signal)
+Task_3: task exit
+*** END OF POSIX TEST 10 ***
diff --git a/testsuites/psxtests/psx10/system.h b/testsuites/psxtests/psx10/system.h
new file mode 100644
index 0000000000..a3dfc0766d
--- /dev/null
+++ b/testsuites/psxtests/psx10/system.h
@@ -0,0 +1,69 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+#include <unistd.h>
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+void *Task_2(
+ void *argument
+);
+
+void *Task_3(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_CONDITION_VARIABLES 1
+
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 2
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+TEST_EXTERN pthread_t Task2_id;
+TEST_EXTERN pthread_t Task3_id;
+TEST_EXTERN pthread_cond_t Cond1_id;
+TEST_EXTERN pthread_mutex_t Mutex_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx10/task.c b/testsuites/psxtests/psx10/task.c
new file mode 100644
index 0000000000..017d44e80d
--- /dev/null
+++ b/testsuites/psxtests/psx10/task.c
@@ -0,0 +1,65 @@
+/* Task_1
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+
+/* wait for a condition variable signal from Init */
+
+ Task_id = pthread_self();
+ printf( "Task_1: ID is 0x%08x\n", Task_id );
+
+ status = pthread_mutex_init( &Mutex_id, NULL );
+ assert( !status );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: back from pthread_cond_wait release mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+/* wait for a condition variable broadcast from Init */
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: back from pthread_cond_wait release mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_1: task exit" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx10/task2.c b/testsuites/psxtests/psx10/task2.c
new file mode 100644
index 0000000000..9190082bc8
--- /dev/null
+++ b/testsuites/psxtests/psx10/task2.c
@@ -0,0 +1,47 @@
+/* Task_2
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void *Task_2(
+ void *argument
+)
+{
+ int status;
+
+ Task_id = pthread_self();
+ printf( "Task_2: ID is 0x%08x\n", Task_id );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_2: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ assert( !status );
+
+ puts( "Task_2: back from pthread_cond_wait release mutex" );
+ status = pthread_mutex_unlock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_2: task exit" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx10/task3.c b/testsuites/psxtests/psx10/task3.c
new file mode 100644
index 0000000000..3d73290440
--- /dev/null
+++ b/testsuites/psxtests/psx10/task3.c
@@ -0,0 +1,46 @@
+/* Task_3
+ *
+ * This routine serves as a test task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void *Task_3(
+ void *argument
+)
+{
+ int status;
+
+ Task_id = pthread_self();
+ printf( "Task_3: ID is 0x%08x\n", Task_id );
+
+ status = pthread_mutex_lock( &Mutex_id );
+ assert( !status );
+
+ puts( "Task_3: pthread_cond_wait" );
+ status = pthread_cond_wait( &Cond1_id, &Mutex_id );
+ if ( status != EINVAL )
+ printf( "status = %d\n", status );
+ assert( status == EINVAL );
+ puts( "Task_3: pthread_cond_wait - EINVAL (mutex not locked after signal)");
+
+ puts( "Task_3: task exit" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx11/init.c b/testsuites/psxtests/psx11/init.c
new file mode 100644
index 0000000000..8eeca0f618
--- /dev/null
+++ b/testsuites/psxtests/psx11/init.c
@@ -0,0 +1,108 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ struct sched_param param;
+ pthread_attr_t attr;
+
+ puts( "\n\n*** POSIX TEST 11 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* exercise pthread_setschedparam */
+
+ param.sched_priority = 127;
+
+ puts( "Init: Setting scheduling parameters to FIFO with priority 127" );
+ status = pthread_setschedparam( Init_id, SCHED_FIFO, &param );
+ assert( !status );
+
+ param.sched_priority = 125;
+
+ puts( "Init: Setting scheduling parameters to RR with priority 125" );
+ status = pthread_setschedparam( Init_id, SCHED_RR, &param );
+ assert( !status );
+
+ param.sched_priority = 121;
+
+ puts( "Init: Setting scheduling parameters to OTHER with priority 121" );
+ status = pthread_setschedparam( Init_id, SCHED_OTHER, &param );
+ assert( !status );
+
+ /* create a thread as SCHED_FIFO */
+
+ puts( "Init: create a thread of SCHED_FIFO with priority 120" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ attr.schedpolicy = SCHED_FIFO;
+ attr.schedparam.sched_priority = 120;
+
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: join with the other thread" );
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ /* create a thread as SCHED_RR */
+
+ puts( "Init: create a thread of SCHED_RR with priority 120" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ attr.schedpolicy = SCHED_RR;
+ attr.schedparam.sched_priority = 120;
+
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: join with the other thread" );
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ /* create a thread as SCHED_OTHER */
+
+ puts( "Init: create a thread of SCHED_OTHER with priority 120" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ attr.schedpolicy = SCHED_OTHER;
+ attr.schedparam.sched_priority = 120;
+
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ puts( "Init: join with the other thread" );
+ status = pthread_join( Task_id, NULL );
+ assert( !status );
+
+ puts( "*** END OF POSIX TEST 11 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx11/psx11.scn b/testsuites/psxtests/psx11/psx11.scn
new file mode 100644
index 0000000000..69df5ec1b9
--- /dev/null
+++ b/testsuites/psxtests/psx11/psx11.scn
@@ -0,0 +1,18 @@
+*** POSIX TEST 11 ***
+Init's ID is 0x0c010001
+Init: Setting scheduling parameters to FIFO with priority 127
+Init: Setting scheduling parameters to RR with priority 125
+Init: Setting scheduling parameters to OTHER with priority 121
+Init: create a thread of SCHED_FIFO with priority 120
+Init: join with the other thread
+Task_1: killing time
+Task_1: exitting
+Init: create a thread of SCHED_RR with priority 120
+Init: join with the other thread
+Task_1: killing time
+Task_1: exitting
+Init: create a thread of SCHED_OTHER with priority 120
+Init: join with the other thread
+Task_1: killing time
+Task_1: exitting
+*** END OF POSIX TEST 11 ***
diff --git a/testsuites/psxtests/psx11/system.h b/testsuites/psxtests/psx11/system.h
new file mode 100644
index 0000000000..cda511751e
--- /dev/null
+++ b/testsuites/psxtests/psx11/system.h
@@ -0,0 +1,51 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx11/task.c b/testsuites/psxtests/psx11/task.c
new file mode 100644
index 0000000000..5c0a3751b0
--- /dev/null
+++ b/testsuites/psxtests/psx11/task.c
@@ -0,0 +1,92 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <time.h>
+#include <sched.h>
+
+void diff_timespec(
+ struct timespec *start,
+ struct timespec *stop,
+ struct timespec *result
+)
+{
+ int nsecs_per_sec = 1000000000;
+
+ result->tv_sec = stop->tv_sec - start->tv_sec;
+ if ( stop->tv_nsec < start->tv_nsec ) {
+ result->tv_nsec = nsecs_per_sec - start->tv_nsec + stop->tv_nsec;
+ result->tv_sec--;
+ } else
+ result->tv_nsec = stop->tv_nsec - start->tv_nsec;
+
+}
+
+void *Task_1(
+ void *argument
+)
+{
+ int status;
+ struct timespec start;
+ struct timespec current;
+ struct timespec difference;
+ struct timespec delay;
+
+ status = clock_gettime( CLOCK_REALTIME, &start );
+ assert( !status );
+
+ status = sched_rr_get_interval( getpid(), &delay );
+ assert( !status );
+
+ /* double the rr interval for confidence */
+
+ delay.tv_sec *= 2;
+ delay.tv_nsec *= 2;
+ if ( delay.tv_nsec >= 1000000000 ) { /* handle overflow/carry */
+ delay.tv_nsec -= 1000000000;
+ delay.tv_sec++;
+ }
+
+
+ puts( "Task_1: killing time" );
+ for ( ; ; ) {
+
+ status = clock_gettime( CLOCK_REALTIME, &current );
+ assert( !status );
+
+ diff_timespec( &start, &current, &difference );
+
+ if ( difference.tv_sec < delay.tv_sec )
+ continue;
+
+ if ( difference.tv_sec > delay.tv_sec )
+ break;
+
+ if ( difference.tv_nsec > delay.tv_nsec )
+ break;
+
+ }
+
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx12/init.c b/testsuites/psxtests/psx12/init.c
new file mode 100644
index 0000000000..aa223f1b91
--- /dev/null
+++ b/testsuites/psxtests/psx12/init.c
@@ -0,0 +1,140 @@
+/*
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define CONFIGURE_INIT
+#include "system.h"
+#include <errno.h>
+
+void print_schedparam(
+ char *prefix,
+ struct sched_param *schedparam
+)
+{
+ printf( "%ssched priority = %d\n", prefix, schedparam->sched_priority );
+#if defined(_POSIX_SPORADIC_SERVER)
+ printf( "%sss_low_priority = %d\n", prefix, schedparam->ss_low_priority );
+ printf( "%sss_replenish_period = (%ld, %ld)\n", prefix,
+ schedparam->ss_replenish_period.tv_sec,
+ schedparam->ss_replenish_period.tv_nsec );
+ printf( "%sss_initial_budget = (%ld, %ld)\n", prefix,
+ schedparam->ss_initial_budget.tv_sec,
+ schedparam->ss_initial_budget.tv_nsec );
+#else
+ printf( "%s_POSIX_SPORADIC_SERVER is not defined\n" );
+#endif
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ pthread_attr_t attr;
+ struct sched_param schedparam;
+
+ puts( "\n\n*** POSIX TEST 12 ***" );
+
+ /* set the time of day, and print our buffer in multiple ways */
+
+ set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
+
+ /* get id of this thread */
+
+ Init_id = pthread_self();
+ printf( "Init's ID is 0x%08x\n", Init_id );
+
+ /* invalid scheduling policy error */
+
+ puts( "Init: pthread_attr_init - SUCCESSFUL" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
+ assert( !status );
+ attr.schedpolicy = -1;
+
+ puts( "Init: pthread_create - EINVAL (invalid scheduling policy)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* replenish period < budget error */
+
+ puts( "Init: pthread_attr_init - SUCCESSFUL" );
+ status = pthread_attr_init( &attr );
+ assert( !status );
+
+ puts( "Init: set scheduling parameter attributes for sporadic server" );
+ status = pthread_attr_setschedpolicy( &attr, SCHED_SPORADIC );
+ assert( !status );
+
+ schedparam.ss_replenish_period.tv_sec = 1;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 2;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = 100;
+
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
+ assert( !status );
+
+ puts( "Init: pthread_create - EINVAL (replenish < budget)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* invalid ss_low_priority error */
+
+ schedparam.ss_replenish_period.tv_sec = 2;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = -1;
+
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ puts( "Init: pthread_create - EINVAL (invalid ss_low_priority)" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( status == EINVAL );
+
+ /* create a thread as a sporadic server */
+
+ schedparam.ss_replenish_period.tv_sec = 2;
+ schedparam.ss_replenish_period.tv_nsec = 0;
+ schedparam.ss_initial_budget.tv_sec = 1;
+ schedparam.ss_initial_budget.tv_nsec = 0;
+
+ schedparam.sched_priority = 200;
+ schedparam.ss_low_priority = 100;
+
+ status = pthread_attr_setschedparam( &attr, &schedparam );
+ assert( !status );
+
+ puts( "Init: pthread_create - SUCCESSFUL" );
+ status = pthread_create( &Task_id, &attr, Task_1, NULL );
+ assert( !status );
+
+ status = pthread_join( Task_id, NULL );
+ assert( status );
+
+ /* switch to Task_1 */
+
+ puts( "*** END OF POSIX TEST 12 ***" );
+ exit( 0 );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psx12/psx12.scn b/testsuites/psxtests/psx12/psx12.scn
new file mode 100644
index 0000000000..fd969cb122
--- /dev/null
+++ b/testsuites/psxtests/psx12/psx12.scn
@@ -0,0 +1,11 @@
+*** POSIX TEST 12 ***
+Init's ID is 0x0c010001
+Init: pthread_attr_init - SUCCESSFUL
+Init: pthread_create - EINVAL (invalid scheduling policy)
+Init: pthread_attr_init - SUCCESSFUL
+Init: set scheduling parameter attributes for sporadic server
+Init: pthread_create - EINVAL (replenish < budget)
+Init: pthread_create - EINVAL (invalid ss_low_priority)
+Init: pthread_create - SUCCESSFUL
+Task_1: exitting
+*** END OF POSIX TEST 12 ***
diff --git a/testsuites/psxtests/psx12/system.h b/testsuites/psxtests/psx12/system.h
new file mode 100644
index 0000000000..87e8f92f94
--- /dev/null
+++ b/testsuites/psxtests/psx12/system.h
@@ -0,0 +1,54 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/* functions */
+
+#include <pmacros.h>
+
+void *POSIX_Init(
+ void *argument
+);
+
+void *Task_1(
+ void *argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+
+#define CONFIGURE_MAXIMUM_POSIX_KEYS 10
+#define CONFIGURE_MAXIMUM_POSIX_MUTEXES 10
+
+#include <confdefs.h>
+
+/* global variables */
+
+#ifdef CONFIGURE_INIT
+#define TEST_EXTERN
+#else
+#define TEST_EXTERN extern
+#endif
+
+TEST_EXTERN pthread_t Init_id;
+TEST_EXTERN pthread_t Task_id;
+
+/* end of include file */
diff --git a/testsuites/psxtests/psx12/task.c b/testsuites/psxtests/psx12/task.c
new file mode 100644
index 0000000000..d4dc39d840
--- /dev/null
+++ b/testsuites/psxtests/psx12/task.c
@@ -0,0 +1,34 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <time.h>
+#include <sched.h>
+
+void *Task_1(
+ void *argument
+)
+{
+ puts( "Task_1: exitting" );
+ pthread_exit( NULL );
+
+ return NULL; /* just so the compiler thinks we returned something */
+}
diff --git a/testsuites/psxtests/psxhdrs/clock01.c b/testsuites/psxtests/psxhdrs/clock01.c
new file mode 100644
index 0000000000..db6c7a1113
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/clock01.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have clock_gettime"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ struct timespec tp;
+ int result;
+
+ result = clock_gettime( clock_id, &tp );
+}
diff --git a/testsuites/psxtests/psxhdrs/clock02.c b/testsuites/psxtests/psxhdrs/clock02.c
new file mode 100644
index 0000000000..f18c8f8f12
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/clock02.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have clock_settime"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ struct timespec tp;
+ int result;
+
+ result = clock_settime( clock_id, &tp );
+}
diff --git a/testsuites/psxtests/psxhdrs/clock03.c b/testsuites/psxtests/psxhdrs/clock03.c
new file mode 100644
index 0000000000..5a8d51b501
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/clock03.c
@@ -0,0 +1,30 @@
+
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have clock_getres"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ struct timespec res;
+ int result;
+
+ result = clock_getres( clock_id, &res );
+}
diff --git a/testsuites/psxtests/psxhdrs/clock04.c b/testsuites/psxtests/psxhdrs/clock04.c
new file mode 100644
index 0000000000..3bdd0fe65c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/clock04.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_CPUTIME
+#error "rtems is supposed to have clock_getcpuclockid"
+#endif
+
+void test( void )
+{
+ pid_t pid = 0;
+ clockid_t clock_id;
+ int result;
+
+ result = clock_getcpuclockid( pid, &clock_id );
+}
diff --git a/testsuites/psxtests/psxhdrs/clock05.c b/testsuites/psxtests/psxhdrs/clock05.c
new file mode 100644
index 0000000000..58d886f2d1
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/clock05.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_CPUTIME
+#error "rtems is supposed to have clock_setenable_attr"
+#endif
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have clock_setenable_attr"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ int attr;
+ int result;
+
+ attr = CLOCK_ENABLED;
+ attr = CLOCK_DISABLED;
+
+ result = clock_setenable_attr( clock_id, attr );
+}
diff --git a/testsuites/psxtests/psxhdrs/clock06.c b/testsuites/psxtests/psxhdrs/clock06.c
new file mode 100644
index 0000000000..8f38f4d217
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/clock06.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_CPUTIME
+#error "rtems is supposed to have clock_getenable_attr"
+#endif
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have clock_getenable_attr"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ int attr;
+ int result;
+
+ result = clock_getenable_attr( clock_id, &attr );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond01.c b/testsuites/psxtests/psxhdrs/cond01.c
new file mode 100644
index 0000000000..9d77394ffc
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond01.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_init"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int result;
+
+ result = pthread_condattr_init( &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond02.c b/testsuites/psxtests/psxhdrs/cond02.c
new file mode 100644
index 0000000000..75575fe97b
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_destroy"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int result;
+
+ result = pthread_condattr_destroy( &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond03.c b/testsuites/psxtests/psxhdrs/cond03.c
new file mode 100644
index 0000000000..0a3b58852b
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond03.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_init"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ pthread_condattr_t attribute;
+ int result;
+
+ result = pthread_cond_init( &cond, &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond04.c b/testsuites/psxtests/psxhdrs/cond04.c
new file mode 100644
index 0000000000..d06183e21f
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond04.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_destroy"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ int result;
+
+ result = pthread_cond_destroy( &cond );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond05.c b/testsuites/psxtests/psxhdrs/cond05.c
new file mode 100644
index 0000000000..4775866dcc
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_signal"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ int result;
+
+ result = pthread_cond_signal( &cond );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond06.c b/testsuites/psxtests/psxhdrs/cond06.c
new file mode 100644
index 0000000000..39280757bc
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond06.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_wait"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_cond_wait( &cond, &mutex );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond07.c b/testsuites/psxtests/psxhdrs/cond07.c
new file mode 100644
index 0000000000..66524c1beb
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond07.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_timedwait"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ struct timespec abstime;
+ int result;
+
+ result = pthread_cond_timedwait( &cond, &mutex, &abstime );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond08.c b/testsuites/psxtests/psxhdrs/cond08.c
new file mode 100644
index 0000000000..65e90f5830
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond08.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_getpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_condattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int pshared;
+ int result;
+
+ result = pthread_condattr_getpshared( &attribute, &pshared );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond09.c b/testsuites/psxtests/psxhdrs/cond09.c
new file mode 100644
index 0000000000..76b8f3c46e
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond09.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_condattr_setpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_condattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_condattr_t attribute;
+ int pshared;
+ int result;
+
+ pshared = PTHREAD_PROCESS_SHARED;
+ pshared = PTHREAD_PROCESS_PRIVATE;
+
+ result = pthread_condattr_setpshared( &attribute, pshared );
+}
diff --git a/testsuites/psxtests/psxhdrs/cond10.c b/testsuites/psxtests/psxhdrs/cond10.c
new file mode 100644
index 0000000000..19acf9bb0b
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/cond10.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cond_broadcast"
+#endif
+
+void test( void )
+{
+ pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+ int result;
+
+ result = pthread_cond_broadcast( &cond );
+}
diff --git a/testsuites/psxtests/psxhdrs/key01.c b/testsuites/psxtests/psxhdrs/key01.c
new file mode 100644
index 0000000000..c85c09772a
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/key01.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_key_create"
+#endif
+
+void key_destructor(
+ void *argument
+)
+{
+}
+
+void test( void )
+{
+ pthread_key_t key;
+ int result;
+
+ result = pthread_key_create( &key, key_destructor );
+}
diff --git a/testsuites/psxtests/psxhdrs/key02.c b/testsuites/psxtests/psxhdrs/key02.c
new file mode 100644
index 0000000000..89bac33ca9
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/key02.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setspecific"
+#endif
+
+void test( void )
+{
+ pthread_key_t key;
+ int value;
+ int result;
+
+ key = 0;
+ value = 0;
+
+ result = pthread_setspecific( key, &value );
+}
diff --git a/testsuites/psxtests/psxhdrs/key03.c b/testsuites/psxtests/psxhdrs/key03.c
new file mode 100644
index 0000000000..c139dfbb34
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/key03.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_getspecific"
+#endif
+
+void test( void )
+{
+ pthread_key_t key;
+ void *value;
+
+ key = 0;
+
+ value = pthread_getspecific( key );
+}
diff --git a/testsuites/psxtests/psxhdrs/key04.c b/testsuites/psxtests/psxhdrs/key04.c
new file mode 100644
index 0000000000..258748ff99
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/key04.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_key_delete"
+#endif
+
+void test( void )
+{
+ pthread_key_t key = 0;
+ int result;
+
+ result = pthread_key_delete( key );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex01.c b/testsuites/psxtests/psxhdrs/mutex01.c
new file mode 100644
index 0000000000..afaab3a6f8
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex01.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_init"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int result;
+
+ result = pthread_mutexattr_init( &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex02.c b/testsuites/psxtests/psxhdrs/mutex02.c
new file mode 100644
index 0000000000..e707656aaa
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_destroy"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int result;
+
+ result = pthread_mutexattr_destroy( &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex03.c b/testsuites/psxtests/psxhdrs/mutex03.c
new file mode 100644
index 0000000000..30c6226c28
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex03.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_init"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ pthread_mutexattr_t attribute;
+ int result;
+
+ result = pthread_mutex_init( &mutex, &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex04.c b/testsuites/psxtests/psxhdrs/mutex04.c
new file mode 100644
index 0000000000..860f293621
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex04.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_destroy"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_destroy( &mutex );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex05.c b/testsuites/psxtests/psxhdrs/mutex05.c
new file mode 100644
index 0000000000..1ea0d1140e
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_lock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_lock( &mutex );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex06.c b/testsuites/psxtests/psxhdrs/mutex06.c
new file mode 100644
index 0000000000..1d89311a62
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex06.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_unlock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_unlock( &mutex );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex07.c b/testsuites/psxtests/psxhdrs/mutex07.c
new file mode 100644
index 0000000000..01edc72da7
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex07.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_setprotocol"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_setprotocol"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int protocol;
+ int result;
+
+ protocol = PTHREAD_PRIO_NONE;
+ protocol = PTHREAD_PRIO_INHERIT;
+ protocol = PTHREAD_PRIO_PROTECT;
+
+ result = pthread_mutexattr_setprotocol( &attribute, protocol );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex08.c b/testsuites/psxtests/psxhdrs/mutex08.c
new file mode 100644
index 0000000000..56e31ca630
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex08.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_getprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_getprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int prioceiling = 0;
+ int result;
+
+ result = pthread_mutexattr_getprioceiling( &attribute, &prioceiling );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex09.c b/testsuites/psxtests/psxhdrs/mutex09.c
new file mode 100644
index 0000000000..af326a2611
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex09.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_setprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_setprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int prioceiling = 0;
+ int result;
+
+ result = pthread_mutexattr_setprioceiling( &attribute, prioceiling );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex10.c b/testsuites/psxtests/psxhdrs/mutex10.c
new file mode 100644
index 0000000000..ea5eeb0faa
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex10.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_getpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_mutexattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int pshared;
+ int result;
+
+ result = pthread_mutexattr_getpshared( &attribute, &pshared );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex11.c b/testsuites/psxtests/psxhdrs/mutex11.c
new file mode 100644
index 0000000000..d9421ff6f6
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex11.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutexattr_setpshared"
+#endif
+#ifndef _POSIX_THREAD_PROCESS_SHARED
+#error "rtems is supposed to have pthread_mutexattr_setpshared"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int pshared;
+ int result;
+
+ pshared = PTHREAD_PROCESS_SHARED;
+ pshared = PTHREAD_PROCESS_PRIVATE;
+
+ result = pthread_mutexattr_setpshared( &attribute, pshared );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex12.c b/testsuites/psxtests/psxhdrs/mutex12.c
new file mode 100644
index 0000000000..8167e27cd8
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex12.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_trylock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ int result;
+
+ result = pthread_mutex_trylock( &mutex );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex13.c b/testsuites/psxtests/psxhdrs/mutex13.c
new file mode 100644
index 0000000000..09ee561ad9
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex13.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_mutex_timedlock"
+#endif
+#ifndef _POSIX_TIMEOUTS
+#error "rtems is supposed to have pthread_mutex_timedlock"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ struct timespec timeout;
+ int result;
+
+ result = pthread_mutex_timedlock( &mutex, &timeout );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex14.c b/testsuites/psxtests/psxhdrs/mutex14.c
new file mode 100644
index 0000000000..9cba669732
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex14.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutexattr_getprotocol"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutexattr_getprotocol"
+#endif
+
+void test( void )
+{
+ pthread_mutexattr_t attribute;
+ int protocol;
+ int result;
+
+ result = pthread_mutexattr_getprotocol( &attribute, &protocol );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex15.c b/testsuites/psxtests/psxhdrs/mutex15.c
new file mode 100644
index 0000000000..e57abc68e5
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex15.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutex_getprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutex_getprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex;
+ int prioceiling;
+ int result;
+
+ result = pthread_mutex_getprioceiling( &mutex, &prioceiling );
+}
diff --git a/testsuites/psxtests/psxhdrs/mutex16.c b/testsuites/psxtests/psxhdrs/mutex16.c
new file mode 100644
index 0000000000..1ffdad38ca
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/mutex16.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIO_INHERIT
+#error "rtems is supposed to have pthread_mutex_setprioceiling"
+#endif
+#ifndef _POSIX_THREAD_PRIO_PROTECT
+#error "rtems is supposed to have pthread_mutex_setprioceiling"
+#endif
+
+void test( void )
+{
+ pthread_mutex_t mutex;
+ int prioceiling;
+ int oldceiling;
+ int result;
+
+ prioceiling = 0;
+
+ result = pthread_mutex_setprioceiling( &mutex, prioceiling, &oldceiling );
+}
diff --git a/testsuites/psxtests/psxhdrs/proc01.c b/testsuites/psxtests/psxhdrs/proc01.c
new file mode 100644
index 0000000000..024caf436b
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc01.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid;
+
+ pid = getpid();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc02.c b/testsuites/psxtests/psxhdrs/proc02.c
new file mode 100644
index 0000000000..3c578bf29d
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc02.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid;
+
+ pid = getppid();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc03.c b/testsuites/psxtests/psxhdrs/proc03.c
new file mode 100644
index 0000000000..1e5014b3b4
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc03.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ uid_t uid;
+
+ uid = getuid();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc04.c b/testsuites/psxtests/psxhdrs/proc04.c
new file mode 100644
index 0000000000..f569b6ffcc
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc04.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ uid_t uid;
+
+ uid = geteuid();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc05.c b/testsuites/psxtests/psxhdrs/proc05.c
new file mode 100644
index 0000000000..5881dd83a0
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc05.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t gid;
+
+ gid = getgid();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc06.c b/testsuites/psxtests/psxhdrs/proc06.c
new file mode 100644
index 0000000000..882bf09eec
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc06.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t gid;
+
+ gid = getegid();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc07.c b/testsuites/psxtests/psxhdrs/proc07.c
new file mode 100644
index 0000000000..e0e4e42cd4
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc07.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ uid_t uid;
+ int result;
+
+ uid = 0;
+
+ result = setuid( uid );
+}
diff --git a/testsuites/psxtests/psxhdrs/proc08.c b/testsuites/psxtests/psxhdrs/proc08.c
new file mode 100644
index 0000000000..720e6a4641
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc08.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t gid;
+ int result;
+
+ gid = 0;
+
+ result = setgid( gid );
+}
diff --git a/testsuites/psxtests/psxhdrs/proc09.c b/testsuites/psxtests/psxhdrs/proc09.c
new file mode 100644
index 0000000000..f83e2e31b0
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc09.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ gid_t grouplist[ 20 ];
+ int gidsetsize;
+ int result;
+
+ gidsetsize = 20;
+
+ result = getgroups( gidsetsize, grouplist );
+}
diff --git a/testsuites/psxtests/psxhdrs/proc10.c b/testsuites/psxtests/psxhdrs/proc10.c
new file mode 100644
index 0000000000..4d491f2c76
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc10.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ char *loginname;
+
+ loginname = getlogin();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc11.c b/testsuites/psxtests/psxhdrs/proc11.c
new file mode 100644
index 0000000000..fb7adc5b89
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc11.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+#include <limits.h> /* for LOGIN_NAME_MAX */
+
+void test( void )
+{
+ char loginnamebuffer[ LOGIN_NAME_MAX ];
+ int result;
+
+ result = getlogin_r( loginnamebuffer, LOGIN_NAME_MAX );
+}
diff --git a/testsuites/psxtests/psxhdrs/proc12.c b/testsuites/psxtests/psxhdrs/proc12.c
new file mode 100644
index 0000000000..67d35ce40c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc12.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pgrp;
+
+ pgrp = getpgrp();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc13.c b/testsuites/psxtests/psxhdrs/proc13.c
new file mode 100644
index 0000000000..326777d254
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc13.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid;
+
+ pid = setsid();
+}
diff --git a/testsuites/psxtests/psxhdrs/proc14.c b/testsuites/psxtests/psxhdrs/proc14.c
new file mode 100644
index 0000000000..c07b0a8846
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/proc14.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+void test( void )
+{
+ pid_t pid = 0;
+ pid_t pgid = 0;
+ int result;
+
+ result = setpgid( pid, pgid );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread01.c b/testsuites/psxtests/psxhdrs/pthread01.c
new file mode 100644
index 0000000000..83656a33b5
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread01.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_init"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int result;
+
+ result = pthread_attr_init( &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread02.c b/testsuites/psxtests/psxhdrs/pthread02.c
new file mode 100644
index 0000000000..a232be1a4c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_destroy"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int result;
+
+ result = pthread_attr_destroy( &attribute );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread03.c b/testsuites/psxtests/psxhdrs/pthread03.c
new file mode 100644
index 0000000000..1c3e476e27
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread03.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_setdetachstate"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int state;
+ int result;
+
+ state = PTHREAD_CREATE_DETACHED;
+ state = PTHREAD_CREATE_JOINABLE;
+
+ result = pthread_attr_setdetachstate( &attribute, state );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread04.c b/testsuites/psxtests/psxhdrs/pthread04.c
new file mode 100644
index 0000000000..3b3f355f33
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread04.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_attr_getdetachstate"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ int state;
+ int result;
+
+ result = pthread_attr_getdetachstate( &attribute, &state );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread05.c b/testsuites/psxtests/psxhdrs/pthread05.c
new file mode 100644
index 0000000000..8abc331f6b
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread05.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <limits.h> /* only for PTHREAD_STACK_MIN */
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setstacksize"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKSIZE
+#error "rtems is supposed to have pthread_setstacksize"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ size_t size;
+ int result;
+
+ size = PTHREAD_STACK_MIN;
+
+ result = pthread_attr_setstacksize( &attribute, size );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread06.c b/testsuites/psxtests/psxhdrs/pthread06.c
new file mode 100644
index 0000000000..5bdbd0502a
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread06.c
@@ -0,0 +1,33 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_getstacksize"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKSIZE
+#error "rtems is supposed to have pthread_getstacksize"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ size_t size;
+ int result;
+
+ result = pthread_attr_getstacksize( &attribute, &size );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread07.c b/testsuites/psxtests/psxhdrs/pthread07.c
new file mode 100644
index 0000000000..24db17e912
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread07.c
@@ -0,0 +1,38 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_create"
+#endif
+
+void *test_task(
+ void * arg
+)
+{
+ for ( ; ; )
+ ;
+}
+
+void test( void )
+{
+ pthread_t thread;
+ pthread_attr_t attribute;
+ void *arg = NULL;
+ int result;
+
+ result = pthread_create( &thread, &attribute, test_task, arg );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread08.c b/testsuites/psxtests/psxhdrs/pthread08.c
new file mode 100644
index 0000000000..5a77557c4e
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread08.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_exit"
+#endif
+
+void test( void )
+{
+ void *status = NULL;
+
+ pthread_exit( status );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread09.c b/testsuites/psxtests/psxhdrs/pthread09.c
new file mode 100644
index 0000000000..5c2399bedc
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread09.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_self"
+#endif
+
+void test( void )
+{
+ pthread_t self;
+
+ self = pthread_self();
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread10.c b/testsuites/psxtests/psxhdrs/pthread10.c
new file mode 100644
index 0000000000..ab7c39f4af
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread10.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_equal"
+#endif
+
+void test( void )
+{
+ pthread_t id_1 = 0;
+ pthread_t id_2 = 0;
+ int result;
+
+ result = pthread_equal( id_1, id_2 );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread11.c b/testsuites/psxtests/psxhdrs/pthread11.c
new file mode 100644
index 0000000000..48d09ea6d2
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread11.c
@@ -0,0 +1,52 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_setschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ thread = 0;
+
+ policy = SCHED_OTHER;
+ policy = SCHED_FIFO;
+ policy = SCHED_RR;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = pthread_setschedparam( thread, policy, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread12.c b/testsuites/psxtests/psxhdrs/pthread12.c
new file mode 100644
index 0000000000..aa1aa7cef1
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread12.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_getschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ thread = 0;
+
+ result = pthread_getschedparam( thread, &policy, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread13.c b/testsuites/psxtests/psxhdrs/pthread13.c
new file mode 100644
index 0000000000..a116cadedb
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread13.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setscope"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int contentionscope;
+ int result;
+
+ contentionscope = PTHREAD_SCOPE_SYSTEM;
+ contentionscope = PTHREAD_SCOPE_PROCESS;
+
+ result = pthread_attr_setscope( &attr, contentionscope );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread14.c b/testsuites/psxtests/psxhdrs/pthread14.c
new file mode 100644
index 0000000000..c0e5d62f5c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread14.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getscope"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int contentionscope;
+ int result;
+
+ result = pthread_attr_getscope( &attr, &contentionscope );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread15.c b/testsuites/psxtests/psxhdrs/pthread15.c
new file mode 100644
index 0000000000..560e4b3998
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread15.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setinheritsched"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int inheritsched;
+ int result;
+
+ inheritsched = PTHREAD_INHERIT_SCHED;
+ inheritsched = PTHREAD_EXPLICIT_SCHED;
+
+ result = pthread_attr_setinheritsched( &attr, inheritsched );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread16.c b/testsuites/psxtests/psxhdrs/pthread16.c
new file mode 100644
index 0000000000..006022ac8f
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread16.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getinheritsched"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int inheritsched;
+ int result;
+
+ result = pthread_attr_getinheritsched( &attr, &inheritsched );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread17.c b/testsuites/psxtests/psxhdrs/pthread17.c
new file mode 100644
index 0000000000..b234bde16e
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread17.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setschedpolicy"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int policy;
+ int result;
+
+ policy = SCHED_FIFO;
+ policy = SCHED_RR;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ result = pthread_attr_setschedpolicy( &attr, policy );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread18.c b/testsuites/psxtests/psxhdrs/pthread18.c
new file mode 100644
index 0000000000..95ebdb88a0
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread18.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getschedpolicy"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int policy;
+ int result;
+
+ result = pthread_attr_getschedpolicy( &attr, &policy );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread19.c b/testsuites/psxtests/psxhdrs/pthread19.c
new file mode 100644
index 0000000000..9dec23a7c7
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread19.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_setschedparam"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ struct sched_param param;
+ int result;
+
+ result = pthread_attr_setschedparam( &attr, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread20.c b/testsuites/psxtests/psxhdrs/pthread20.c
new file mode 100644
index 0000000000..066dffc549
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread20.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_attr_getschedparam"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ struct sched_param param;
+ int result;
+
+ result = pthread_attr_getschedparam( &attr, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread21.c b/testsuites/psxtests/psxhdrs/pthread21.c
new file mode 100644
index 0000000000..2afe366675
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread21.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_detach"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int result;
+
+ thread = 0;
+ result = pthread_detach( thread );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread22.c b/testsuites/psxtests/psxhdrs/pthread22.c
new file mode 100644
index 0000000000..2f864248c0
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread22.c
@@ -0,0 +1,50 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_setschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread = 0;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ policy = SCHED_OTHER;
+ policy = SCHED_FIFO;
+ policy = SCHED_RR;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = pthread_setschedparam( thread, policy, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread23.c b/testsuites/psxtests/psxhdrs/pthread23.c
new file mode 100644
index 0000000000..cea26984c4
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread23.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_PRIORITY_SCHEDULING
+#error "RTEMS is supposed to have pthread_getschedparam"
+#endif
+
+void test( void )
+{
+ pthread_t thread = 0;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ result = pthread_getschedparam( thread, &policy, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread24.c b/testsuites/psxtests/psxhdrs/pthread24.c
new file mode 100644
index 0000000000..85be962d15
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread24.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <limits.h> /* only for PTHREAD_STACK_MIN */
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setstackaddr"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKADDR
+#error "rtems is supposed to have pthread_setstackaddr"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ void *stackaddr;
+ int result;
+
+ stackaddr = NULL;
+
+ result = pthread_attr_setstackaddr( &attribute, stackaddr );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread25.c b/testsuites/psxtests/psxhdrs/pthread25.c
new file mode 100644
index 0000000000..bc25003db8
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread25.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+#include <limits.h> /* only for PTHREAD_STACK_MIN */
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_getstackaddr"
+#endif
+
+#ifndef _POSIX_THREAD_ATTR_STACKADDR
+#error "rtems is supposed to have pthread_getstackaddr"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attribute;
+ void *stackaddr;
+ int result;
+
+ result = pthread_attr_getstackaddr( &attribute, &stackaddr );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread26.c b/testsuites/psxtests/psxhdrs/pthread26.c
new file mode 100644
index 0000000000..c32d313028
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread26.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_join"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ void *value_ptr;
+ int result;
+
+ thread = 0;
+
+ result = pthread_join( thread, &value_ptr );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread27.c b/testsuites/psxtests/psxhdrs/pthread27.c
new file mode 100644
index 0000000000..f91e4d777c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread27.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_once"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ pthread_once_t once_control = PTHREAD_ONCE_INIT;
+ int result;
+
+ result = pthread_once( &once_control, init_routine );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread28.c b/testsuites/psxtests/psxhdrs/pthread28.c
new file mode 100644
index 0000000000..2cd78427e4
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread28.c
@@ -0,0 +1,33 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cancel"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ pthread_t thread;
+ int result;
+
+ thread = 0;
+ result = pthread_cancel( thread );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread29.c b/testsuites/psxtests/psxhdrs/pthread29.c
new file mode 100644
index 0000000000..0c0e3589cf
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread29.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setcancelstate"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ int state;
+ int oldstate;
+ int result;
+
+ state = PTHREAD_CANCEL_ENABLE;
+ state = PTHREAD_CANCEL_DISABLE;
+
+ result = pthread_setcancelstate( state, &oldstate );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread30.c b/testsuites/psxtests/psxhdrs/pthread30.c
new file mode 100644
index 0000000000..092ffeeed2
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread30.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_setcanceltype"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ int type;
+ int oldtype;
+ int result;
+
+ type = PTHREAD_CANCEL_DEFERRED;
+ type = PTHREAD_CANCEL_ASYNCHRONOUS;
+
+ result = pthread_setcanceltype( type, &oldtype );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread31.c b/testsuites/psxtests/psxhdrs/pthread31.c
new file mode 100644
index 0000000000..fc40bc0b5a
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread31.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_testcancel"
+#endif
+
+void init_routine( void )
+{
+}
+
+void test( void )
+{
+ pthread_testcancel();
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread32.c b/testsuites/psxtests/psxhdrs/pthread32.c
new file mode 100644
index 0000000000..9de9781b80
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread32.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cleanup_push"
+#endif
+
+void cleanup_routine(
+ void *argument
+)
+{
+}
+
+void test( void )
+{
+ int argument;
+
+ argument = 0;
+
+ pthread_cleanup_push( cleanup_routine, &argument );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread33.c b/testsuites/psxtests/psxhdrs/pthread33.c
new file mode 100644
index 0000000000..ea650919d9
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread33.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_cleanup_pop"
+#endif
+
+void test( void )
+{
+ pthread_cleanup_pop( 1 );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread34.c b/testsuites/psxtests/psxhdrs/pthread34.c
new file mode 100644
index 0000000000..2e162dd8a1
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread34.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have pthread_getcpuclockid"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ clockid_t clock_id;
+ int result;
+
+ thread = 0;
+
+ result = pthread_getcpuclockid( thread, &clock_id );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread35.c b/testsuites/psxtests/psxhdrs/pthread35.c
new file mode 100644
index 0000000000..d868eda810
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread35.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have pthread_attr_setcputime"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int clock_allowed;
+ int result;
+
+ clock_allowed = CLOCK_ALLOWED;
+ clock_allowed = CLOCK_DISALLOWED;
+
+ result = pthread_attr_setcputime( &attr, clock_allowed );
+}
diff --git a/testsuites/psxtests/psxhdrs/pthread36.c b/testsuites/psxtests/psxhdrs/pthread36.c
new file mode 100644
index 0000000000..ebe54464e6
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/pthread36.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <pthread.h>
+
+#ifndef _POSIX_THREAD_CPUTIME
+#error "rtems is supposed to have pthread_attr_getcputime"
+#endif
+
+void test( void )
+{
+ pthread_attr_t attr;
+ int clock_allowed;
+ int result;
+
+ result = pthread_attr_getcputime( &attr, &clock_allowed );
+}
diff --git a/testsuites/psxtests/psxhdrs/sched01.c b/testsuites/psxtests/psxhdrs/sched01.c
new file mode 100644
index 0000000000..224bd08be1
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched01.c
@@ -0,0 +1,44 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_setparam"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ struct sched_param param;
+ int result;
+
+ pid = 0;
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = sched_setparam( pid, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/sched02.c b/testsuites/psxtests/psxhdrs/sched02.c
new file mode 100644
index 0000000000..34bd1f2468
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched02.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_getparam"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ struct sched_param param;
+ int result;
+
+ pid = 0;
+
+ result = sched_getparam( pid, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/sched03.c b/testsuites/psxtests/psxhdrs/sched03.c
new file mode 100644
index 0000000000..def9ca05cf
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched03.c
@@ -0,0 +1,52 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_setscheduler"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ int policy;
+ struct sched_param param;
+ int result;
+
+ pid = 0;
+
+ policy = SCHED_RR;
+ policy = SCHED_FIFO;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ /*
+ * really should use sched_get_priority_min() and sched_get_priority_max()
+ */
+
+ param.sched_priority = 0;
+#ifdef _POSIX_SPORADIC_SERVER
+ param.ss_low_priority = 0;
+ param.ss_replenish_period.tv_sec = 0;
+ param.ss_replenish_period.tv_nsec = 0;
+ param.ss_initial_budget.tv_sec = 0;
+ param.ss_initial_budget.tv_nsec = 0;
+#endif
+
+ result = sched_setscheduler( pid, policy, &param );
+}
diff --git a/testsuites/psxtests/psxhdrs/sched04.c b/testsuites/psxtests/psxhdrs/sched04.c
new file mode 100644
index 0000000000..1473562c4c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched04.c
@@ -0,0 +1,30 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_getscheduler"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ int result;
+
+ pid = 0;
+
+ result = sched_getscheduler( pid );
+}
diff --git a/testsuites/psxtests/psxhdrs/sched05.c b/testsuites/psxtests/psxhdrs/sched05.c
new file mode 100644
index 0000000000..812bde66ef
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched05.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_yield"
+#endif
+
+void test( void )
+{
+ int result;
+
+ result = sched_yield();
+}
diff --git a/testsuites/psxtests/psxhdrs/sched06.c b/testsuites/psxtests/psxhdrs/sched06.c
new file mode 100644
index 0000000000..1539dae3bb
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched06.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_get_priority_max"
+#endif
+
+void test( void )
+{
+ int policy;
+ int result;
+
+ policy = SCHED_RR;
+ policy = SCHED_FIFO;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ result = sched_get_priority_max( policy );
+}
diff --git a/testsuites/psxtests/psxhdrs/sched07.c b/testsuites/psxtests/psxhdrs/sched07.c
new file mode 100644
index 0000000000..beeb9fd6ef
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched07.c
@@ -0,0 +1,35 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_get_priority_min"
+#endif
+
+void test( void )
+{
+ int policy;
+ int result;
+
+ policy = SCHED_RR;
+ policy = SCHED_FIFO;
+ policy = SCHED_OTHER;
+#ifdef _POSIX_SPORADIC_SERVER
+ policy = SCHED_SPORADIC;
+#endif
+
+ result = sched_get_priority_min( policy );
+}
diff --git a/testsuites/psxtests/psxhdrs/sched08.c b/testsuites/psxtests/psxhdrs/sched08.c
new file mode 100644
index 0000000000..787c4c305c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/sched08.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sched.h>
+
+#ifndef _POSIX_PRIORITY_SCHEDULING
+#error "rtems is supposed to have sched_rr_get_interval"
+#endif
+
+void test( void )
+{
+ pid_t pid;
+ struct timespec interval;
+ int result;
+
+ pid = 0;
+
+ result = sched_rr_get_interval( pid, &interval );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal01.c b/testsuites/psxtests/psxhdrs/signal01.c
new file mode 100644
index 0000000000..7c12e3d55b
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal01.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = sigaddset( &signal_set, signal_number );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal02.c b/testsuites/psxtests/psxhdrs/signal02.c
new file mode 100644
index 0000000000..7aa18d7364
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal02.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = sigdelset( &signal_set, signal_number );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal03.c b/testsuites/psxtests/psxhdrs/signal03.c
new file mode 100644
index 0000000000..75eedad35c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal03.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int result;
+
+ result = sigfillset( &signal_set );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal04.c b/testsuites/psxtests/psxhdrs/signal04.c
new file mode 100644
index 0000000000..807d13d2eb
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal04.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = sigismember( &signal_set, signal_number );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal05.c b/testsuites/psxtests/psxhdrs/signal05.c
new file mode 100644
index 0000000000..dcd94620b3
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal05.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t signal_set;
+ int result;
+
+ result = sigemptyset( &signal_set );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal06.c b/testsuites/psxtests/psxhdrs/signal06.c
new file mode 100644
index 0000000000..2a7b6ddd42
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal06.c
@@ -0,0 +1,39 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int signal_number;
+ struct sigaction act;
+ struct sigaction oact;
+ int result;
+
+ signal_number = SIGALRM;
+
+ /*
+ * Really should not reference sa_handler and sa_signction simultaneously.
+ */
+
+ act.sa_handler = SIG_DFL;
+ act.sa_handler = SIG_IGN;
+ act.sa_mask = 0;
+ act.sa_flags = SA_NOCLDSTOP;
+ act.sa_flags = SA_SIGINFO;
+ act.sa_sigaction = NULL;
+
+ result = sigaction( signal_number, &act, &oact );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal07.c b/testsuites/psxtests/psxhdrs/signal07.c
new file mode 100644
index 0000000000..bf0c4343ff
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal07.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_kill"
+#endif
+
+void test( void )
+{
+ pthread_t thread;
+ int signal_number;
+ int result;
+
+ thread = 0;
+ signal_number = SIGALRM;
+
+ result = pthread_kill( thread, signal_number );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal08.c b/testsuites/psxtests/psxhdrs/signal08.c
new file mode 100644
index 0000000000..62356abf6c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal08.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+#ifndef _POSIX_THREADS
+#error "rtems is supposed to have pthread_sigmask"
+#endif
+
+void test( void )
+{
+ int how;
+ sigset_t set;
+ sigset_t oset;
+ int result;
+
+ how = SIG_BLOCK;
+ how = SIG_UNBLOCK;
+ how = SIG_SETMASK;
+
+ result = pthread_sigmask( how, &set, &oset );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal09.c b/testsuites/psxtests/psxhdrs/signal09.c
new file mode 100644
index 0000000000..8c618ed1a3
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal09.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <sys/types.h>
+#include <signal.h>
+
+void test( void )
+{
+ pid_t pid;
+ int signal_number;
+ int result;
+
+ pid = 0;
+ signal_number = SIGALRM;
+
+ result = kill( pid, signal_number );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal10.c b/testsuites/psxtests/psxhdrs/signal10.c
new file mode 100644
index 0000000000..b0fd6e4c01
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal10.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ int sig;
+ int result;
+
+ result = sigwait( &set, &sig );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal11.c b/testsuites/psxtests/psxhdrs/signal11.c
new file mode 100644
index 0000000000..bf9e552c31
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal11.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int signal_number;
+ int result;
+
+ signal_number = SIGALRM;
+
+ result = raise( signal_number );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal12.c b/testsuites/psxtests/psxhdrs/signal12.c
new file mode 100644
index 0000000000..cfe2deecae
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal12.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ void (*signal_function_pointer)();
+ int signal_number;
+
+ signal_number = SIGALRM;
+
+ signal_function_pointer = signal( signal_number, SIG_IGN );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal13.c b/testsuites/psxtests/psxhdrs/signal13.c
new file mode 100644
index 0000000000..0d8c23184e
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal13.c
@@ -0,0 +1,32 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int how;
+ sigset_t set;
+ sigset_t oset;
+ int result;
+
+ how = SIG_BLOCK;
+ how = SIG_UNBLOCK;
+ how = SIG_SETMASK;
+
+ (void) sigemptyset( &set );
+
+ result = sigprocmask( how, &set, &oset );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal14.c b/testsuites/psxtests/psxhdrs/signal14.c
new file mode 100644
index 0000000000..460cfeb00c
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal14.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigpending( &set );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal15.c b/testsuites/psxtests/psxhdrs/signal15.c
new file mode 100644
index 0000000000..e9a6b29826
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal15.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t sigmask;
+ int result;
+
+ (void) sigemptyset( &sigmask );
+
+ result = sigsuspend( &sigmask );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal16.c b/testsuites/psxtests/psxhdrs/signal16.c
new file mode 100644
index 0000000000..9a53d6ba39
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal16.c
@@ -0,0 +1,36 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+#ifndef _POSIX_THREADS
+#define "rtems is supposed to have pthread_sigmask"
+#endif
+
+void test( void )
+{
+ int how;
+ sigset_t set;
+ sigset_t oset;
+ int result;
+
+ how = SIG_BLOCK;
+ how = SIG_UNBLOCK;
+ how = SIG_SETMASK;
+
+ (void) sigemptyset( &set );
+
+ result = pthread_sigmask( how, &set, &oset );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal17.c b/testsuites/psxtests/psxhdrs/signal17.c
new file mode 100644
index 0000000000..e71d600f41
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal17.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ siginfo_t info;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigwaitinfo( &set, &info );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal18.c b/testsuites/psxtests/psxhdrs/signal18.c
new file mode 100644
index 0000000000..eae94ed30a
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal18.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ siginfo_t info;
+ struct timespec timeout;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigtimedwait( &set, &info, &timeout );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal19.c b/testsuites/psxtests/psxhdrs/signal19.c
new file mode 100644
index 0000000000..e84b5df8af
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal19.c
@@ -0,0 +1,27 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ sigset_t set;
+ int sig;
+ int result;
+
+ (void) sigemptyset( &set );
+
+ result = sigwait( &set, &sig );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal20.c b/testsuites/psxtests/psxhdrs/signal20.c
new file mode 100644
index 0000000000..ae6755b53a
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal20.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ unsigned int seconds;
+ unsigned int result;
+
+ seconds = 10;
+
+ result = alarm( seconds );
+}
diff --git a/testsuites/psxtests/psxhdrs/signal21.c b/testsuites/psxtests/psxhdrs/signal21.c
new file mode 100644
index 0000000000..1655a837ba
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal21.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <signal.h>
+
+void test( void )
+{
+ int result;
+
+ result = pause();
+}
diff --git a/testsuites/psxtests/psxhdrs/signal22.c b/testsuites/psxtests/psxhdrs/signal22.c
new file mode 100644
index 0000000000..6105899637
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/signal22.c
@@ -0,0 +1,26 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <unistd.h>
+
+void test( void )
+{
+ unsigned int seconds;
+ unsigned int result;
+
+ seconds = 10;
+
+ result = sleep( seconds );
+}
diff --git a/testsuites/psxtests/psxhdrs/time01.c b/testsuites/psxtests/psxhdrs/time01.c
new file mode 100644
index 0000000000..2528c0ee81
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time01.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ clock_t clock_ticks;
+
+ clock_ticks = clock();
+}
diff --git a/testsuites/psxtests/psxhdrs/time02.c b/testsuites/psxtests/psxhdrs/time02.c
new file mode 100644
index 0000000000..20a1183dd3
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time1;
+ time_t time2;
+ double difference;
+
+ time1 = 0;
+ time2 = 0;
+
+ difference = difftime( time1, time2 );
+}
diff --git a/testsuites/psxtests/psxhdrs/time03.c b/testsuites/psxtests/psxhdrs/time03.c
new file mode 100644
index 0000000000..b470864da2
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time03.c
@@ -0,0 +1,34 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ struct tm timestruct;
+ time_t time_encoded;
+
+ timestruct.tm_sec = 0;
+ timestruct.tm_min = 0;
+ timestruct.tm_hour = 0;
+ timestruct.tm_mday = 1;
+ timestruct.tm_mon = 0;
+ timestruct.tm_year = 0;
+ timestruct.tm_wday = 0;
+ timestruct.tm_yday = 0;
+ timestruct.tm_isdst = 0;
+
+ time_encoded = mktime( &timestruct );
+}
diff --git a/testsuites/psxtests/psxhdrs/time04.c b/testsuites/psxtests/psxhdrs/time04.c
new file mode 100644
index 0000000000..02e18451d5
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time04.c
@@ -0,0 +1,23 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t new_time;
+
+ new_time = time( &new_time );
+}
diff --git a/testsuites/psxtests/psxhdrs/time05.c b/testsuites/psxtests/psxhdrs/time05.c
new file mode 100644
index 0000000000..ad12f12e3b
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ size_t length;
+ size_t max_length;
+ char buffer[ 80 ];
+ struct tm timestruct;
+
+ max_length = sizeof( buffer );
+
+ length = strftime( buffer, max_length, "%A", &timestruct );
+}
diff --git a/testsuites/psxtests/psxhdrs/time06.c b/testsuites/psxtests/psxhdrs/time06.c
new file mode 100644
index 0000000000..f44fcaeceb
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time06.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer;
+ struct tm timestruct;
+
+ buffer = asctime( &timestruct );
+}
diff --git a/testsuites/psxtests/psxhdrs/time07.c b/testsuites/psxtests/psxhdrs/time07.c
new file mode 100644
index 0000000000..cc6b947c4a
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time07.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer;
+ time_t time;
+
+ buffer = ctime( &time );
+}
diff --git a/testsuites/psxtests/psxhdrs/time08.c b/testsuites/psxtests/psxhdrs/time08.c
new file mode 100644
index 0000000000..c66378e741
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time08.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct;
+
+ timestruct = gmtime( &time );
+}
diff --git a/testsuites/psxtests/psxhdrs/time09.c b/testsuites/psxtests/psxhdrs/time09.c
new file mode 100644
index 0000000000..d85ece0b27
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time09.c
@@ -0,0 +1,24 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct;
+
+ timestruct = localtime( &time );
+}
diff --git a/testsuites/psxtests/psxhdrs/time10.c b/testsuites/psxtests/psxhdrs/time10.c
new file mode 100644
index 0000000000..6e7bd4dd45
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time10.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer_pointer;
+ struct tm timestruct;
+ char buffer[ 80 ];
+
+ buffer_pointer = asctime_r( &timestruct, buffer );
+}
diff --git a/testsuites/psxtests/psxhdrs/time11.c b/testsuites/psxtests/psxhdrs/time11.c
new file mode 100644
index 0000000000..588ea174be
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time11.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ char *buffer_pointer;
+ char buffer[ 80 ];
+ time_t time;
+
+ buffer_pointer = ctime_r( &time, buffer );
+}
diff --git a/testsuites/psxtests/psxhdrs/time12.c b/testsuites/psxtests/psxhdrs/time12.c
new file mode 100644
index 0000000000..3568bad319
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time12.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct_pointer;
+ struct tm timestruct;
+
+ timestruct_pointer = gmtime_r( &time, &timestruct );
+}
diff --git a/testsuites/psxtests/psxhdrs/time13.c b/testsuites/psxtests/psxhdrs/time13.c
new file mode 100644
index 0000000000..a0d2e4e4bc
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/time13.c
@@ -0,0 +1,25 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+void test( void )
+{
+ time_t time;
+ struct tm *timestruct_pointer;
+ struct tm timestruct;
+
+ timestruct_pointer = localtime_r( &time, &timestruct );
+}
diff --git a/testsuites/psxtests/psxhdrs/timer01.c b/testsuites/psxtests/psxhdrs/timer01.c
new file mode 100644
index 0000000000..9ca32a2bc6
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/timer01.c
@@ -0,0 +1,37 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_create"
+#endif
+
+void test( void )
+{
+ clockid_t clock_id = 0;
+ timer_t timerid = 0;
+ struct sigevent evp;
+ int result;
+
+ evp.sigev_notify = SIGEV_NONE;
+ evp.sigev_notify = SIGEV_SIGNAL;
+ evp.sigev_notify = SIGEV_THREAD;
+ evp.sigev_signo = SIGALRM;
+ evp.sigev_value.sival_int = 0;
+ evp.sigev_value.sival_ptr = NULL;
+
+ result = timer_create( clock_id, &evp, &timerid );
+}
diff --git a/testsuites/psxtests/psxhdrs/timer02.c b/testsuites/psxtests/psxhdrs/timer02.c
new file mode 100644
index 0000000000..ff6b7ab1f6
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/timer02.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_delete"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ int result;
+
+ result = timer_delete( timerid );
+}
diff --git a/testsuites/psxtests/psxhdrs/timer03.c b/testsuites/psxtests/psxhdrs/timer03.c
new file mode 100644
index 0000000000..abbf3399f9
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/timer03.c
@@ -0,0 +1,39 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_settime"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ int flags;
+ struct itimerspec value;
+ struct itimerspec ovalue;
+ int result;
+
+ value.it_interval.tv_sec = 0;
+ value.it_interval.tv_nsec = 0;
+ value.it_value.tv_sec = 0;
+ value.it_value.tv_nsec = 0;
+
+ flags = TIMER_ABSTIME;
+ flags = CLOCK_REALTIME;
+
+ result = timer_settime( timerid, flags, &value, &ovalue );
+}
diff --git a/testsuites/psxtests/psxhdrs/timer04.c b/testsuites/psxtests/psxhdrs/timer04.c
new file mode 100644
index 0000000000..ae70418d00
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/timer04.c
@@ -0,0 +1,29 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_gettime"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ struct itimerspec value;
+ int result;
+
+ result = timer_gettime( timerid, &value );
+}
diff --git a/testsuites/psxtests/psxhdrs/timer05.c b/testsuites/psxtests/psxhdrs/timer05.c
new file mode 100644
index 0000000000..f420b9c9ee
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/timer05.c
@@ -0,0 +1,28 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have timer_getoverrun"
+#endif
+
+void test( void )
+{
+ timer_t timerid = 0;
+ int result;
+
+ result = timer_getoverrun( timerid );
+}
diff --git a/testsuites/psxtests/psxhdrs/timer06.c b/testsuites/psxtests/psxhdrs/timer06.c
new file mode 100644
index 0000000000..9989c87da7
--- /dev/null
+++ b/testsuites/psxtests/psxhdrs/timer06.c
@@ -0,0 +1,31 @@
+/*
+ * This test file is used to verify that the header files associated with
+ * the callout are correct.
+ *
+ * COPYRIGHT (c) 1989-1997. 1995, 1996.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <time.h>
+
+#ifndef _POSIX_TIMERS
+#error "rtems is supposed to have nanosleep"
+#endif
+
+void test( void )
+{
+ struct timespec rqtp;
+ struct timespec rmtp;
+ int result;
+
+ rqtp.tv_sec = 0;
+ rqtp.tv_nsec = 0;
+ result = nanosleep( &rqtp, &rmtp );
+}
diff --git a/testsuites/samples/README b/testsuites/samples/README
new file mode 100644
index 0000000000..d4ed109e3b
--- /dev/null
+++ b/testsuites/samples/README
@@ -0,0 +1,73 @@
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+# $Id$
+#
+
+This directory contains the RTEMS Sample Application Suite.
+The tests in this directory perform two functions:
+
+ + provide simple examples of applications which can be
+ used as a starting point for your application.
+
+ + help test a new board support package
+
+The hello and ticker applications are useful when first bringing up
+a new board support package. The base_mp test is useful when
+performing initial checkout on a new MPCI layer.
+
+The following describes each of the sample applications:
+
+ base_mp
+
+ This is a very simple two node multiprocessor application. It consists
+ of a single initialization task on each node which print out
+ their respective node numbers and task IDs. This test can be
+ used as a simple test of a new MPCI layer because it minimizes
+ the number of packets sent by RTEMS.
+
+ This is intended as a starting point for custom developed multiprocessor
+ applications.
+
+ base_sp
+
+ This is a simple single processor application which consists of
+ an initialization task which creates another task.
+
+ This is intended as a starting point for custom developed single
+ processor applications.
+
+ cdtest
+
+ A very simple C++ application which demonstrates that it is
+ possible to use C++ contructors and destructors in an RTEMS
+ application. Also does a perfunctory iostream test.
+
+ hello
+
+ This is the RTEMS version of the classic hello world program.
+ It consists of single initialization task which prints out
+ a few messages.
+
+ This test does not include a Clock Tick device driver and can
+ be used to test the startup code of the board support package
+ as well as console output.
+
+ paranoia
+
+ A public domain test of the floating point and math library
+ capabilities of a toolset. It reports discrepancies between
+ actual and expected results. It is a large test.
+
+ ticker
+
+ This is a simple test of the user's Clock Tick device driver.
+ This test has an initialization task create three application
+ tasks which sleep and periodically wake up and print the time.
+
diff --git a/testsuites/samples/base_mp/apptask.c b/testsuites/samples/base_mp/apptask.c
new file mode 100644
index 0000000000..d73f4e612c
--- /dev/null
+++ b/testsuites/samples/base_mp/apptask.c
@@ -0,0 +1,37 @@
+/* Application_task
+ *
+ * This routine is as an example of an application task which
+ * prints a message including its RTEMS task id. This task
+ * then invokes exit to return to the monitor.
+ *
+ * Input parameters:
+ * node - processor's node number
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Application_task(
+ rtems_task_argument node
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ printf( "This task was invoked with the node argument (%d)\n", node );
+ printf( "This task has the id of 0x%x\n", tid );
+ printf( "*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***\n" );
+ exit( 0 );
+}
diff --git a/testsuites/samples/base_mp/init.c b/testsuites/samples/base_mp/init.c
new file mode 100644
index 0000000000..00ff01b1cf
--- /dev/null
+++ b/testsuites/samples/base_mp/init.c
@@ -0,0 +1,46 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the application, the current time might be
+ * set by this task.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_name task_name;
+ rtems_id tid;
+ rtems_status_code status;
+
+ printf( "\n\n*** SAMPLE MULTIPROCESSOR APPLICATION ***\n" );
+ printf( "Creating and starting an application task\n" );
+ task_name = rtems_build_name( 'T', 'A', '1', ' ' );
+ status = rtems_task_create( task_name, 1, RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_INTERRUPT_LEVEL(0), RTEMS_DEFAULT_ATTRIBUTES, &tid );
+ status = rtems_task_start(
+ tid,
+ Application_task,
+ Multiprocessing_configuration.node
+ );
+ status = rtems_task_delete( RTEMS_SELF );
+}
diff --git a/testsuites/samples/base_mp/node1/base_mp.doc b/testsuites/samples/base_mp/node1/base_mp.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/samples/base_mp/node1/base_mp.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/samples/base_mp/node1/base_mp.scn b/testsuites/samples/base_mp/node1/base_mp.scn
new file mode 100644
index 0000000000..a2d2f359be
--- /dev/null
+++ b/testsuites/samples/base_mp/node1/base_mp.scn
@@ -0,0 +1,5 @@
+*** SAMPLE MULTIPROCESSOR APPLICATION ***
+Creating and starting an application task
+This task was invoked with the node argument (1)
+This task has the id of 0x10002
+*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***
diff --git a/testsuites/samples/base_mp/node2/base_mp.doc b/testsuites/samples/base_mp/node2/base_mp.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/samples/base_mp/node2/base_mp.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/samples/base_mp/node2/base_mp.scn b/testsuites/samples/base_mp/node2/base_mp.scn
new file mode 100644
index 0000000000..95bc96a808
--- /dev/null
+++ b/testsuites/samples/base_mp/node2/base_mp.scn
@@ -0,0 +1,5 @@
+*** SAMPLE MULTIPROCESSOR APPLICATION ***
+Creating and starting an application task
+This task was invoked with the node argument (2)
+This task has the id of 0x20002
+*** END OF SAMPLE MULTIPROCESSOR APPLICATION ***
diff --git a/testsuites/samples/base_mp/system.h b/testsuites/samples/base_mp/system.h
new file mode 100644
index 0000000000..0e86d0cce6
--- /dev/null
+++ b/testsuites/samples/base_mp/system.h
@@ -0,0 +1,48 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Application_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_MPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+/*
+ * Put the overrides of default configuration parameters here.
+ */
+
+#include <confdefs.h>
+
+/* variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/testsuites/samples/base_sp/apptask.c b/testsuites/samples/base_sp/apptask.c
new file mode 100644
index 0000000000..f3a7ff2bc8
--- /dev/null
+++ b/testsuites/samples/base_sp/apptask.c
@@ -0,0 +1,38 @@
+/* Application_task
+ *
+ * This routine is as an example of an application task which
+ * prints a message including its RTEMS task id. This task
+ * then invokes exit to return to the monitor.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Application_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+
+ printf( "Application task was invoked with argument (%d) "
+ "and has id of 0x%x\n", argument, tid );
+
+ printf( "*** END OF SAMPLE SINGLE PROCESSOR APPLICATION ***\n" );
+ exit( 0 );
+}
diff --git a/testsuites/samples/base_sp/base_sp.doc b/testsuites/samples/base_sp/base_sp.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/samples/base_sp/base_sp.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/samples/base_sp/base_sp.scn b/testsuites/samples/base_sp/base_sp.scn
new file mode 100644
index 0000000000..117ddaecb8
--- /dev/null
+++ b/testsuites/samples/base_sp/base_sp.scn
@@ -0,0 +1,5 @@
+*** SAMPLE SINGLE PROCESSOR APPLICATION ***
+Creating and starting an application task
+Application task was invoked with argument (0) and has id of 0x10002
+*** END OF SAMPLE SINGLE PROCESSOR APPLICATION ***
+
diff --git a/testsuites/samples/base_sp/init.c b/testsuites/samples/base_sp/init.c
new file mode 100644
index 0000000000..7d3e8a0d6d
--- /dev/null
+++ b/testsuites/samples/base_sp/init.c
@@ -0,0 +1,48 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the application, the current time might be
+ * set by this task.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+#define ARGUMENT 0
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_name task_name;
+ rtems_id tid;
+ rtems_status_code status;
+
+ printf( "\n\n*** SAMPLE SINGLE PROCESSOR APPLICATION ***\n" );
+ printf( "Creating and starting an application task\n" );
+
+ task_name = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create( task_name, 1, RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_INTERRUPT_LEVEL(0), RTEMS_DEFAULT_ATTRIBUTES, &tid );
+
+ status = rtems_task_start( tid, Application_task, ARGUMENT );
+
+ status = rtems_task_delete( RTEMS_SELF );
+}
diff --git a/testsuites/samples/base_sp/system.h b/testsuites/samples/base_sp/system.h
new file mode 100644
index 0000000000..e86654304e
--- /dev/null
+++ b/testsuites/samples/base_sp/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Application_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/testsuites/samples/cdtest/cdtest.scn b/testsuites/samples/cdtest/cdtest.scn
new file mode 100644
index 0000000000..a832a72372
--- /dev/null
+++ b/testsuites/samples/cdtest/cdtest.scn
@@ -0,0 +1,31 @@
+Hey I'm in base class constructor number 1 for 0x400010cc.
+Hey I'm in base class constructor number 2 for 0x400010d4.
+Hey I'm in derived class constructor number 3 for 0x400010d4.
+
+
+*** CONSTRUCTOR/DESTRUCTOR TEST ***
+Hey I'm in base class constructor number 4 for 0x4009ee08.
+Hey I'm in base class constructor number 5 for 0x4009ee10.
+Hey I'm in base class constructor number 6 for 0x4009ee18.
+Hey I'm in base class constructor number 7 for 0x4009ee20.
+Hey I'm in derived class constructor number 8 for 0x4009ee20.
+Testing a C++ I/O stream
+Hey I'm in derived class destructor number 8 for 0x4009ee20.
+Derived class - Instantiation order 8
+Hey I'm in base class destructor number 7 for 0x4009ee20.
+Instantiation order 8
+Hey I'm in base class destructor number 6 for 0x4009ee18.
+Instantiation order 6
+Hey I'm in base class destructor number 5 for 0x4009ee10.
+Instantiation order 5
+Hey I'm in base class destructor number 4 for 0x4009ee08.
+Instantiation order 5
+*** END OF CONSTRUCTOR/DESTRUCTOR TEST ***
+
+
+Hey I'm in derived class destructor number 3 for 0x400010d4.
+Derived class - Instantiation order 3
+Hey I'm in base class destructor number 2 for 0x400010d4.
+Instantiation order 3
+Hey I'm in base class destructor number 1 for 0x400010cc.
+Instantiation order 1
diff --git a/testsuites/samples/cdtest/init.c b/testsuites/samples/cdtest/init.c
new file mode 100644
index 0000000000..d033fd4dda
--- /dev/null
+++ b/testsuites/samples/cdtest/init.c
@@ -0,0 +1,26 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+#include <stdio.h>
diff --git a/testsuites/samples/cdtest/main.cc b/testsuites/samples/cdtest/main.cc
new file mode 100644
index 0000000000..d55f96e9f0
--- /dev/null
+++ b/testsuites/samples/cdtest/main.cc
@@ -0,0 +1,137 @@
+/*
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ * Based in part on OAR works.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdio.h>
+#include <iostream.h>
+
+extern "C" {
+extern rtems_task main_task(rtems_task_argument);
+}
+
+static int num_inst = 0;
+
+class A {
+public:
+ A(void)
+ {
+ num_inst++;
+ printf(
+ "Hey I'm in base class constructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+
+ /*
+ * Make sure we use some space
+ */
+
+ string = new char[50];
+ sprintf(string, "Instantiation order %d", num_inst);
+ };
+
+ virtual ~A()
+ {
+ printf(
+ "Hey I'm in base class destructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+ print();
+ num_inst--;
+ };
+
+ virtual void print() { printf("%s\n", string); };
+
+protected:
+ char *string;
+};
+
+class B : public A {
+public:
+ B(void)
+ {
+ num_inst++;
+ printf(
+ "Hey I'm in derived class constructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+
+ /*
+ * Make sure we use some space
+ */
+
+ string = new char[50];
+ sprintf(string, "Instantiation order %d", num_inst);
+ };
+
+ ~B()
+ {
+ printf(
+ "Hey I'm in derived class destructor number %d for %p.\n",
+ num_inst,
+ this
+ );
+ print();
+ num_inst--;
+ };
+
+ void print() { printf("Derived class - %s\n", string); }
+};
+
+
+A foo;
+B foobar;
+
+void
+cdtest(void)
+{
+ A bar, blech, blah;
+ B bleak;
+
+ cout << "Testing a C++ I/O stream" << endl;
+
+ bar = blech;
+}
+
+//
+// main equivalent
+// It can not be called 'main' since the bsp owns that name
+// in many implementations in order to get global constructors
+// run.
+//
+// Ref: c/src/lib/libbsp/hppa1_1/pxfl/startup/bspstart.c
+//
+
+
+rtems_task main_task(
+ rtems_task_argument ignored
+)
+{
+ printf( "\n\n*** CONSTRUCTOR/DESTRUCTOR TEST ***\n" );
+
+ cdtest();
+
+ printf( "*** END OF CONSTRUCTOR/DESTRUCTOR TEST ***\n\n\n" );
+
+ exit(0);
+}
diff --git a/testsuites/samples/cdtest/system.h b/testsuites/samples/cdtest/system.h
new file mode 100644
index 0000000000..b7cea0b062
--- /dev/null
+++ b/testsuites/samples/cdtest/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task main_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_INIT_TASK_ENTRY_POINT main_task
+#define CONFIGURE_INIT_TASK_NAME rtems_build_name( 'C', 'T', 'O', 'R' )
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/testsuites/samples/hello/hello.doc b/testsuites/samples/hello/hello.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/samples/hello/hello.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/samples/hello/hello.scn b/testsuites/samples/hello/hello.scn
new file mode 100644
index 0000000000..d9e92d81d5
--- /dev/null
+++ b/testsuites/samples/hello/hello.scn
@@ -0,0 +1,3 @@
+*** HELLO WORLD TEST ***
+Hello World
+*** END OF HELLO WORLD TEST ***
diff --git a/testsuites/samples/hello/init.c b/testsuites/samples/hello/init.c
new file mode 100644
index 0000000000..0fc3555260
--- /dev/null
+++ b/testsuites/samples/hello/init.c
@@ -0,0 +1,36 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+#include <stdio.h>
+
+rtems_task Init(
+ rtems_task_argument ignored
+)
+{
+ printf( "\n\n*** HELLO WORLD TEST ***\n" );
+ printf( "Hello World\n" );
+ printf( "*** END OF HELLO WORLD TEST ***\n" );
+ exit( 0 );
+}
diff --git a/testsuites/samples/hello/system.h b/testsuites/samples/hello/system.h
new file mode 100644
index 0000000000..f3beb5cbce
--- /dev/null
+++ b/testsuites/samples/hello/system.h
@@ -0,0 +1,37 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/testsuites/samples/paranoia/init.c b/testsuites/samples/paranoia/init.c
new file mode 100644
index 0000000000..00466ebb02
--- /dev/null
+++ b/testsuites/samples/paranoia/init.c
@@ -0,0 +1,39 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+extern int paranoia(int, char **);
+
+char *args[2] = { "paranoia", 0 };
+
+rtems_task Init(
+ rtems_task_argument ignored
+)
+{
+ printf( "\n\n*** PARANOIA TEST ***\n" );
+ paranoia(1, args);
+ printf( "*** END OF PARANOIA TEST ***\n" );
+ exit( 0 );
+}
diff --git a/testsuites/samples/paranoia/paranoia.c b/testsuites/samples/paranoia/paranoia.c
new file mode 100644
index 0000000000..3b860c3b4a
--- /dev/null
+++ b/testsuites/samples/paranoia/paranoia.c
@@ -0,0 +1,2300 @@
+/*
+ * $Id$
+ *
+ * A C version of Kahan's Floating Point Test "Paranoia"
+ *
+ * Thos Sumner, UCSF, Feb. 1985
+ * David Gay, BTL, Jan. 1986
+ *
+ * This is a rewrite from the Pascal version by
+ *
+ * B. A. Wichmann, 18 Jan. 1985
+ *
+ * (and does NOT exhibit good C programming style).
+ *
+ * Sun May 16 18:21:51 MDT 1993 Jeffrey Wheat (cassidy@cygnus.com)
+ * Removed KR_headers defines, removed ANSI prototyping
+ * Cleaned up and reformated code. Added special CYGNUS
+ * "verbose" mode type messages (-DCYGNUS).
+ * Note: This code is VERY NASTY.
+ *
+ * Adjusted to use Standard C headers 19 Jan. 1992 (dmg);
+ * compile with -DKR_headers or insert
+ * #define KR_headers
+ * at the beginning if you have an old-style C compiler.
+ *
+ * (C) Apr 19 1983 in BASIC version by:
+ * Professor W. M. Kahan,
+ * 567 Evans Hall
+ * Electrical Engineering & Computer Science Dept.
+ * University of California
+ * Berkeley, California 94720
+ * USA
+ *
+ * converted to Pascal by:
+ * B. A. Wichmann
+ * National Physical Laboratory
+ * Teddington Middx
+ * TW11 OLW
+ * UK
+ *
+ * converted to C by:
+ *
+ * David M. Gay and Thos Sumner
+ * AT&T Bell Labs Computer Center, Rm. U-76
+ * 600 Mountain Avenue University of California
+ * Murray Hill, NJ 07974 San Francisco, CA 94143
+ * USA USA
+ *
+ * with simultaneous corrections to the Pascal source (reflected
+ * in the Pascal source available over netlib).
+ * [A couple of bug fixes from dgh = sun!dhough incorporated 31 July 1986.]
+ *
+ * Reports of results on various systems from all the versions
+ * of Paranoia are being collected by Richard Karpinski at the
+ * same address as Thos Sumner. This includes sample outputs,
+ * bug reports, and criticisms.
+ *
+ * You may copy this program freely if you acknowledge its source.
+ * Comments on the Pascal version to NPL, please.
+ *
+ *
+ * The C version catches signals from floating-point exceptions.
+ * If signal(SIGFPE,...) is unavailable in your environment, you may
+ * #define NOSIGNAL to comment out the invocations of signal.
+ *
+ * This source file is too big for some C compilers, but may be split
+ * into pieces. Comments containing "SPLIT" suggest convenient places
+ * for this splitting. At the end of these comments is an "ed script"
+ * (for the UNIX(tm) editor ed) that will do this splitting.
+ *
+ * By #defining SINGLE_PRECISION when you compile this source, you may
+ * obtain a single-precision C version of Paranoia.
+ *
+ * The following is from the introductory commentary from Wichmann's work:
+ *
+ * The BASIC program of Kahan is written in Microsoft BASIC using many
+ * facilities which have no exact analogy in Pascal. The Pascal
+ * version below cannot therefore be exactly the same. Rather than be
+ * a minimal transcription of the BASIC program, the Pascal coding
+ * follows the conventional style of block-structured languages. Hence
+ * the Pascal version could be useful in producing versions in other
+ * structured languages.
+ *
+ * Rather than use identifiers of minimal length (which therefore have
+ * little mnemonic significance), the Pascal version uses meaningful
+ * identifiers as follows [Note: A few changes have been made for C]:
+ *
+ *
+ * BASIC C BASIC C BASIC C
+ *
+ * A J S StickyBit
+ * A1 AInverse J0 NoErrors T
+ * B Radix [Failure] T0 Underflow
+ * B1 BInverse J1 NoErrors T2 ThirtyTwo
+ * B2 RadixD2 [SeriousDefect] T5 OneAndHalf
+ * B9 BMinusU2 J2 NoErrors T7 TwentySeven
+ * C [Defect] T8 TwoForty
+ * C1 CInverse J3 NoErrors U OneUlp
+ * D [Flaw] U0 UnderflowThreshold
+ * D4 FourD K PageNo U1
+ * E0 L Milestone U2
+ * E1 M V
+ * E2 Exp2 N V0
+ * E3 N1 V8
+ * E5 MinSqEr O Zero V9
+ * E6 SqEr O1 One W
+ * E7 MaxSqEr O2 Two X
+ * E8 O3 Three X1
+ * E9 O4 Four X8
+ * F1 MinusOne O5 Five X9 Random1
+ * F2 Half O8 Eight Y
+ * F3 Third O9 Nine Y1
+ * F6 P Precision Y2
+ * F9 Q Y9 Random2
+ * G1 GMult Q8 Z
+ * G2 GDiv Q9 Z0 PseudoZero
+ * G3 GAddSub R Z1
+ * H R1 RMult Z2
+ * H1 HInverse R2 RDiv Z9
+ * I R3 RAddSub
+ * IO NoTrials R4 RSqrt
+ * I3 IEEE R9 Random9
+ *
+ * SqRWrng
+ *
+ * All the variables in BASIC are true variables and in consequence,
+ * the program is more difficult to follow since the "constants" must
+ * be determined (the glossary is very helpful). The Pascal version
+ * uses Real constants, but checks are added to ensure that the values
+ * are correctly converted by the compiler.
+ *
+ * The major textual change to the Pascal version apart from the
+ * identifiersis that named procedures are used, inserting parameters
+ * wherehelpful. New procedures are also introduced. The
+ * correspondence is as follows:
+ *
+ *
+ * BASIC Pascal
+ * lines
+ *
+ * 90- 140 Pause
+ * 170- 250 Instructions
+ * 380- 460 Heading
+ * 480- 670 Characteristics
+ * 690- 870 History
+ * 2940-2950 Random
+ * 3710-3740 NewD
+ * 4040-4080 DoesYequalX
+ * 4090-4110 PrintIfNPositive
+ * 4640-4850 TestPartialUnderflow
+ *
+*/
+
+#include <stdio.h>
+#include <string.h>
+
+/*
+ * To compile this on host using only libm from newlib (and using host libc)
+ * do:
+ * gcc -g -DNEED_REENT -DCYGNUS paranoia.c .../newlib-1.6/newlib/libm.a
+ */
+
+#ifdef NEED_REENT
+#include <reent.h>
+struct _reent libm_reent = _REENT_INIT(libm_reent);
+struct _reent *_impure_ptr = &libm_reent;
+#endif
+
+#ifndef NOSIGNAL
+#include <signal.h>
+#include <setjmp.h>
+#else /* NOSIGNAL */
+#define longjmp(e,v)
+#define setjmp(e) 0
+#define jmp_buf int
+#endif /* NOSIGNAL */
+
+#ifdef SINGLE_PRECISION
+#define FLOAT float
+#define FABS(x) (float)fabs((double)(x))
+#define FLOOR(x) (float)floor((double)(x))
+#define LOG(x) (float)log((double)(x))
+#define POW(x,y) (float)pow((double)(x),(double)(y))
+#define SQRT(x) (float)sqrt((double)(x))
+#else /* !SINGLE_PRECISION */
+#define FLOAT double
+#define FABS(x) fabs(x)
+#define FLOOR(x) floor(x)
+#define LOG(x) log(x)
+#define POW(x,y) pow(x,y)
+#define SQRT(x) sqrt(x)
+#endif /* SINGLE_PRECISION */
+
+jmp_buf ovfl_buf;
+extern double fabs (), floor (), log (), pow (), sqrt ();
+extern void exit ();
+typedef void (*Sig_type) ();
+FLOAT Sign (), Random ();
+extern void BadCond ();
+extern void SqXMinX ();
+extern void TstCond ();
+extern void notify ();
+extern int read ();
+extern void Characteristics ();
+extern void Heading ();
+extern void History ();
+extern void Instructions ();
+extern void IsYeqX ();
+extern void NewD ();
+extern void Pause ();
+extern void PrintIfNPositive ();
+extern void SR3750 ();
+extern void SR3980 ();
+extern void TstPtUf ();
+
+Sig_type sigsave;
+
+#define KEYBOARD 0
+
+FLOAT Radix, BInvrse, RadixD2, BMinusU2;
+
+/*Small floating point constants.*/
+FLOAT Zero = 0.0;
+FLOAT Half = 0.5;
+FLOAT One = 1.0;
+FLOAT Two = 2.0;
+FLOAT Three = 3.0;
+FLOAT Four = 4.0;
+FLOAT Five = 5.0;
+FLOAT Eight = 8.0;
+FLOAT Nine = 9.0;
+FLOAT TwentySeven = 27.0;
+FLOAT ThirtyTwo = 32.0;
+FLOAT TwoForty = 240.0;
+FLOAT MinusOne = -1.0;
+FLOAT OneAndHalf = 1.5;
+
+/*Integer constants*/
+int NoTrials = 20; /*Number of tests for commutativity. */
+#define False 0
+#define True 1
+
+/*
+ * Definitions for declared types
+ * Guard == (Yes, No);
+ * Rounding == (Chopped, Rounded, Other);
+ * Message == packed array [1..40] of char;
+ * Class == (Flaw, Defect, Serious, Failure);
+ */
+#define Yes 1
+#define No 0
+#define Chopped 2
+#define Rounded 1
+#define Other 0
+#define Flaw 3
+#define Defect 2
+#define Serious 1
+#define Failure 0
+typedef int Guard, Rounding, Class;
+typedef char Message;
+
+/* Declarations of Variables */
+int Indx;
+char ch[8];
+FLOAT AInvrse, A1;
+FLOAT C, CInvrse;
+FLOAT D, FourD;
+FLOAT E0, E1, Exp2, E3, MinSqEr;
+FLOAT SqEr, MaxSqEr, E9;
+FLOAT Third;
+FLOAT F6, F9;
+FLOAT H, HInvrse;
+int I;
+FLOAT StickyBit, J;
+FLOAT MyZero;
+FLOAT Precision;
+FLOAT Q, Q9;
+FLOAT R, Random9;
+FLOAT T, Underflow, S;
+FLOAT OneUlp, UfThold, U1, U2;
+FLOAT V, V0, V9;
+FLOAT W;
+FLOAT X, X1, X2, X8, Random1;
+FLOAT Y, Y1, Y2, Random2;
+FLOAT Z, PseudoZero, Z1, Z2, Z9;
+int ErrCnt[4];
+int fpecount;
+int Milestone;
+int PageNo;
+int M, N, N1;
+Guard GMult, GDiv, GAddSub;
+Rounding RMult, RDiv, RAddSub, RSqrt;
+int Break, Done, NotMonot, Monot, Anomaly, IEEE, SqRWrng, UfNGrad;
+
+/* Computed constants.
+ * U1 gap below 1.0, i.e, 1.0 - U1 is next number below 1.0
+ * U2 gap above 1.0, i.e, 1.0 + U2 is next number above 1.0
+ */
+
+int batchmode; /* global batchmode test */
+
+/* program name and version variables and macro */
+char *temp;
+char *program_name;
+char *program_vers;
+
+#ifndef VERSION
+#define VERSION "1.1 [cygnus]"
+#endif /* VERSION */
+
+#define basename(cp) ((temp=(char *)strrchr((cp), '/')) ? temp+1 : (cp))
+
+#ifndef BATCHMODE
+# ifdef CYGNUS
+# define BATCHMODE
+# endif
+#endif
+
+/* floating point exception receiver */
+void
+_sigfpe (x)
+int x;
+{
+ fpecount++;
+ printf ("\n* * * FLOATING-POINT ERROR %d * * *\n", x);
+ fflush (stdout);
+ if (sigsave) {
+#ifndef NOSIGNAL
+ signal (SIGFPE, sigsave);
+#endif /* NOSIGNAL */
+ sigsave = 0;
+ longjmp (ovfl_buf, 1);
+ }
+ exit (1);
+}
+
+#ifdef NOMAIN
+#define main paranoia
+#endif
+
+int
+main (argc, argv)
+int argc;
+char **argv;
+{
+ /* First two assignments use integer right-hand sides. */
+ Zero = 0;
+ One = 1;
+ Two = One + One;
+ Three = Two + One;
+ Four = Three + One;
+ Five = Four + One;
+ Eight = Four + Four;
+ Nine = Three * Three;
+ TwentySeven = Nine * Three;
+ ThirtyTwo = Four * Eight;
+ TwoForty = Four * Five * Three * Four;
+ MinusOne = -One;
+ Half = One / Two;
+ OneAndHalf = One + Half;
+ ErrCnt[Failure] = 0;
+ ErrCnt[Serious] = 0;
+ ErrCnt[Defect] = 0;
+ ErrCnt[Flaw] = 0;
+ PageNo = 1;
+
+#ifdef BATCHMODE
+ batchmode = 1; /* run test in batchmode? */
+#else /* !BATCHMODE */
+ batchmode = 0; /* run test interactively */
+#endif /* BATCHMODE */
+
+ program_name = basename (argv[0]);
+ program_vers = VERSION;
+
+ printf ("%s version %s\n", program_name, program_vers);
+
+ /*=============================================*/
+ Milestone = 0;
+ /*=============================================*/
+#ifndef NOSIGNAL
+ signal (SIGFPE, _sigfpe);
+#endif
+
+ if (!batchmode) {
+ Instructions ();
+ Pause ();
+ Heading ();
+ Instructions ();
+ Pause ();
+ Heading ();
+ Pause ();
+ Characteristics ();
+ Pause ();
+ History ();
+ Pause ();
+ }
+
+ /*=============================================*/
+ Milestone = 7;
+ /*=============================================*/
+ printf ("Program is now RUNNING tests on small integers:\n");
+ TstCond (Failure, (Zero + Zero == Zero) && (One - One == Zero)
+ && (One > Zero) && (One + One == Two),
+ "0+0 != 0, 1-1 != 0, 1 <= 0, or 1+1 != 2");
+ Z = -Zero;
+ if (Z != 0.0) {
+ ErrCnt[Failure] = ErrCnt[Failure] + 1;
+ printf ("Comparison alleges that -0.0 is Non-zero!\n");
+ U1 = 0.001;
+ Radix = 1;
+ TstPtUf ();
+ }
+ TstCond (Failure, (Three == Two + One) && (Four == Three + One)
+ && (Four + Two * (-Two) == Zero)
+ && (Four - Three - One == Zero),
+ "3 != 2+1, 4 != 3+1, 4+2*(-2) != 0, or 4-3-1 != 0");
+ TstCond (Failure, (MinusOne == (0 - One))
+ && (MinusOne + One == Zero) && (One + MinusOne == Zero)
+ && (MinusOne + FABS (One) == Zero)
+ && (MinusOne + MinusOne * MinusOne == Zero),
+ "-1+1 != 0, (-1)+abs(1) != 0, or -1+(-1)*(-1) != 0");
+ TstCond (Failure, Half + MinusOne + Half == Zero,
+ "1/2 + (-1) + 1/2 != 0");
+ /*=============================================*/
+ Milestone = 10;
+ /*=============================================*/
+ TstCond (Failure, (Nine == Three * Three)
+ && (TwentySeven == Nine * Three) && (Eight == Four + Four)
+ && (ThirtyTwo == Eight * Four)
+ && (ThirtyTwo - TwentySeven - Four - One == Zero),
+ "9 != 3*3, 27 != 9*3, 32 != 8*4, or 32-27-4-1 != 0");
+ TstCond (Failure, (Five == Four + One) &&
+ (TwoForty == Four * Five * Three * Four)
+ && (TwoForty / Three - Four * Four * Five == Zero)
+ && (TwoForty / Four - Five * Three * Four == Zero)
+ && (TwoForty / Five - Four * Three * Four == Zero),
+ "5 != 4+1, 240/3 != 80, 240/4 != 60, or 240/5 != 48");
+ if (ErrCnt[Failure] == 0) {
+ printf ("-1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K.\n");
+ printf ("\n");
+ }
+ printf ("Searching for Radix and Precision.\n");
+ W = One;
+ do {
+ W = W + W;
+ Y = W + One;
+ Z = Y - W;
+ Y = Z - One;
+ }
+ while (MinusOne + FABS (Y) < Zero);
+ /*.. now W is just big enough that |((W+1)-W)-1| >= 1 ...*/
+ Precision = Zero;
+ Y = One;
+ do {
+ Radix = W + Y;
+ Y = Y + Y;
+ Radix = Radix - W;
+ }
+ while (Radix == Zero);
+ if (Radix < Two)
+ Radix = One;
+ printf ("Radix = %f .\n", Radix);
+ if (Radix != 1) {
+ W = One;
+ do {
+ Precision = Precision + One;
+ W = W * Radix;
+ Y = W + One;
+ }
+ while ((Y - W) == One);
+ }
+ /*... now W == Radix^Precision is barely too big to satisfy (W+1)-W == 1
+ ...*/
+ U1 = One / W;
+ U2 = Radix * U1;
+ printf ("Closest relative separation found is U1 = %.7e .\n\n", U1);
+ printf ("Recalculating radix and precision\n ");
+
+ /*save old values*/
+ E0 = Radix;
+ E1 = U1;
+ E9 = U2;
+ E3 = Precision;
+
+ X = Four / Three;
+ Third = X - One;
+ F6 = Half - Third;
+ X = F6 + F6;
+ X = FABS (X - Third);
+ if (X < U2)
+ X = U2;
+
+ /*... now X = (unknown no.) ulps of 1+...*/
+ do {
+ U2 = X;
+ Y = Half * U2 + ThirtyTwo * U2 * U2;
+ Y = One + Y;
+ X = Y - One;
+ }
+ while (!((U2 <= X) || (X <= Zero)));
+
+ /*... now U2 == 1 ulp of 1 + ... */
+ X = Two / Three;
+ F6 = X - Half;
+ Third = F6 + F6;
+ X = Third - Half;
+ X = FABS (X + F6);
+ if (X < U1)
+ X = U1;
+
+ /*... now X == (unknown no.) ulps of 1 -... */
+ do {
+ U1 = X;
+ Y = Half * U1 + ThirtyTwo * U1 * U1;
+ Y = Half - Y;
+ X = Half + Y;
+ Y = Half - X;
+ X = Half + Y;
+ }
+ while (!((U1 <= X) || (X <= Zero)));
+ /*... now U1 == 1 ulp of 1 - ... */
+ if (U1 == E1)
+ printf ("confirms closest relative separation U1 .\n");
+ else
+ printf ("gets better closest relative separation U1 = %.7e .\n", U1);
+ W = One / U1;
+ F9 = (Half - U1) + Half;
+ Radix = FLOOR (0.01 + U2 / U1);
+ if (Radix == E0)
+ printf ("Radix confirmed.\n");
+ else
+ printf ("MYSTERY: recalculated Radix = %.7e .\n", Radix);
+ TstCond (Defect, Radix <= Eight + Eight,
+ "Radix is too big: roundoff problems");
+ TstCond (Flaw, (Radix == Two) || (Radix == 10)
+ || (Radix == One), "Radix is not as good as 2 or 10");
+ /*=============================================*/
+ Milestone = 20;
+ /*=============================================*/
+ TstCond (Failure, F9 - Half < Half,
+ "(1-U1)-1/2 < 1/2 is FALSE, prog. fails?");
+ X = F9;
+ I = 1;
+ Y = X - Half;
+ Z = Y - Half;
+ TstCond (Failure, (X != One)
+ || (Z == Zero), "Comparison is fuzzy,X=1 but X-1/2-1/2 != 0");
+ X = One + U2;
+ I = 0;
+ /*=============================================*/
+ Milestone = 25;
+ /*=============================================*/
+ /*... BMinusU2 = nextafter(Radix, 0) */
+ BMinusU2 = Radix - One;
+ BMinusU2 = (BMinusU2 - U2) + One;
+ /* Purify Integers */
+ if (Radix != One) {
+ X = -TwoForty * LOG (U1) / LOG (Radix);
+ Y = FLOOR (Half + X);
+ if (FABS (X - Y) * Four < One)
+ X = Y;
+ Precision = X / TwoForty;
+ Y = FLOOR (Half + Precision);
+ if (FABS (Precision - Y) * TwoForty < Half)
+ Precision = Y;
+ }
+ if ((Precision != FLOOR (Precision)) || (Radix == One)) {
+ printf ("Precision cannot be characterized by an Integer number\n");
+ printf ("of significant digits but, by itself, this is a minor flaw.\n");
+ }
+ if (Radix == One)
+ printf ("logarithmic encoding has precision characterized solely by U1.\n");
+ else
+ printf ("The number of significant digits of the Radix is %f .\n",
+ Precision);
+ TstCond (Serious, U2 * Nine * Nine * TwoForty < One,
+ "Precision worse than 5 decimal figures ");
+ /*=============================================*/
+ Milestone = 30;
+ /*=============================================*/
+ /* Test for extra-precise subepressions */
+ X = FABS (((Four / Three - One) - One / Four) * Three - One / Four);
+ do {
+ Z2 = X;
+ X = (One + (Half * Z2 + ThirtyTwo * Z2 * Z2)) - One;
+ }
+ while (!((Z2 <= X) || (X <= Zero)));
+ X = Y = Z = FABS ((Three / Four - Two / Three) * Three - One / Four);
+ do {
+ Z1 = Z;
+ Z = (One / Two - ((One / Two - (Half * Z1 + ThirtyTwo * Z1 * Z1))
+ + One / Two)) + One / Two;
+ }
+ while (!((Z1 <= Z) || (Z <= Zero)));
+ do {
+ do {
+ Y1 = Y;
+ Y = (Half - ((Half - (Half * Y1 + ThirtyTwo * Y1 * Y1)) + Half
+ )) + Half;
+ }
+ while (!((Y1 <= Y) || (Y <= Zero)));
+ X1 = X;
+ X = ((Half * X1 + ThirtyTwo * X1 * X1) - F9) + F9;
+ }
+ while (!((X1 <= X) || (X <= Zero)));
+ if ((X1 != Y1) || (X1 != Z1)) {
+ BadCond (Serious, "Disagreements among the values X1, Y1, Z1,\n");
+ printf ("respectively %.7e, %.7e, %.7e,\n", X1, Y1, Z1);
+ printf ("are symptoms of inconsistencies introduced\n");
+ printf ("by extra-precise evaluation of arithmetic subexpressions.\n");
+ notify ("Possibly some part of this");
+ if ((X1 == U1) || (Y1 == U1) || (Z1 == U1))
+ printf (
+ "That feature is not tested further by this program.\n");
+ } else {
+ if ((Z1 != U1) || (Z2 != U2)) {
+ if ((Z1 >= U1) || (Z2 >= U2)) {
+ BadCond (Failure, "");
+ notify ("Precision");
+ printf ("\tU1 = %.7e, Z1 - U1 = %.7e\n", U1, Z1 - U1);
+ printf ("\tU2 = %.7e, Z2 - U2 = %.7e\n", U2, Z2 - U2);
+ } else {
+ if ((Z1 <= Zero) || (Z2 <= Zero)) {
+ printf ("Because of unusual Radix = %f", Radix);
+ printf (", or exact rational arithmetic a result\n");
+ printf ("Z1 = %.7e, or Z2 = %.7e ", Z1, Z2);
+ notify ("of an\nextra-precision");
+ }
+ if (Z1 != Z2 || Z1 > Zero) {
+ X = Z1 / U1;
+ Y = Z2 / U2;
+ if (Y > X)
+ X = Y;
+ Q = -LOG (X);
+ printf ("Some subexpressions appear to be calculated extra\n");
+ printf ("precisely with about %g extra B-digits, i.e.\n",
+ (Q / LOG (Radix)));
+ printf ("roughly %g extra significant decimals.\n",
+ Q / LOG (10.));
+ }
+ printf ("That feature is not tested further by this program.\n");
+ }
+ }
+ }
+ Pause ();
+ /*=============================================*/
+ Milestone = 35;
+ /*=============================================*/
+ if (Radix >= Two) {
+ X = W / (Radix * Radix);
+ Y = X + One;
+ Z = Y - X;
+ T = Z + U2;
+ X = T - Z;
+ TstCond (Failure, X == U2,
+ "Subtraction is not normalized X=Y,X+Z != Y+Z!");
+ if (X == U2)
+ printf (
+ "Subtraction appears to be normalized, as it should be.");
+ }
+ printf ("\nChecking for guard digit in *, /, and -.\n");
+ Y = F9 * One;
+ Z = One * F9;
+ X = F9 - Half;
+ Y = (Y - Half) - X;
+ Z = (Z - Half) - X;
+ X = One + U2;
+ T = X * Radix;
+ R = Radix * X;
+ X = T - Radix;
+ X = X - Radix * U2;
+ T = R - Radix;
+ T = T - Radix * U2;
+ X = X * (Radix - One);
+ T = T * (Radix - One);
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero))
+ GMult = Yes;
+ else {
+ GMult = No;
+ TstCond (Serious, False,
+ "* lacks a Guard Digit, so 1*X != X");
+ }
+ Z = Radix * U2;
+ X = One + Z;
+ Y = FABS ((X + Z) - X * X) - U2;
+ X = One - U2;
+ Z = FABS ((X - U2) - X * X) - U1;
+ TstCond (Failure, (Y <= Zero)
+ && (Z <= Zero), "* gets too many final digits wrong.\n");
+ Y = One - U2;
+ X = One + U2;
+ Z = One / Y;
+ Y = Z - X;
+ X = One / Three;
+ Z = Three / Nine;
+ X = X - Z;
+ T = Nine / TwentySeven;
+ Z = Z - T;
+ TstCond (Defect, X == Zero && Y == Zero && Z == Zero,
+ "Division lacks a Guard Digit, so error can exceed 1 ulp\n\
+or 1/3 and 3/9 and 9/27 may disagree");
+ Y = F9 / One;
+ X = F9 - Half;
+ Y = (Y - Half) - X;
+ X = One + U2;
+ T = X / One;
+ X = T - X;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero))
+ GDiv = Yes;
+ else {
+ GDiv = No;
+ TstCond (Serious, False,
+ "Division lacks a Guard Digit, so X/1 != X");
+ }
+ X = One / (One + U2);
+ Y = X - Half - Half;
+ TstCond (Serious, Y < Zero,
+ "Computed value of 1/1.000..1 >= 1");
+ X = One - U2;
+ Y = One + Radix * U2;
+ Z = X * Radix;
+ T = Y * Radix;
+ R = Z / Radix;
+ StickyBit = T / Radix;
+ X = R - X;
+ Y = StickyBit - Y;
+ TstCond (Failure, X == Zero && Y == Zero,
+ "* and/or / gets too many last digits wrong");
+ Y = One - U1;
+ X = One - F9;
+ Y = One - Y;
+ T = Radix - U2;
+ Z = Radix - BMinusU2;
+ T = Radix - T;
+ if ((X == U1) && (Y == U1) && (Z == U2) && (T == U2))
+ GAddSub = Yes;
+ else {
+ GAddSub = No;
+ TstCond (Serious, False,
+ "- lacks Guard Digit, so cancellation is obscured");
+ }
+ if (F9 != One && F9 - One >= Zero) {
+ BadCond (Serious, "comparison alleges (1-U1) < 1 although\n");
+ printf (" subtraction yields (1-U1) - 1 = 0 , thereby vitiating\n");
+ printf (" such precautions against division by zero as\n");
+ printf (" ... if (X == 1.0) {.....} else {.../(X-1.0)...}\n");
+ }
+ if (GMult == Yes && GDiv == Yes && GAddSub == Yes)
+ printf (
+ " *, /, and - appear to have guard digits, as they should.\n");
+ /*=============================================*/
+ Milestone = 40;
+ /*=============================================*/
+ Pause ();
+ printf ("Checking rounding on multiply, divide and add/subtract.\n");
+ RMult = Other;
+ RDiv = Other;
+ RAddSub = Other;
+ RadixD2 = Radix / Two;
+ A1 = Two;
+ Done = False;
+ do {
+ AInvrse = Radix;
+ do {
+ X = AInvrse;
+ AInvrse = AInvrse / A1;
+ }
+ while (!(FLOOR (AInvrse) != AInvrse));
+ Done = (X == One) || (A1 > Three);
+ if (!Done)
+ A1 = Nine + One;
+ }
+ while (!(Done));
+ if (X == One)
+ A1 = Radix;
+ AInvrse = One / A1;
+ X = A1;
+ Y = AInvrse;
+ Done = False;
+ do {
+ Z = X * Y - Half;
+ TstCond (Failure, Z == Half,
+ "X * (1/X) differs from 1");
+ Done = X == Radix;
+ X = Radix;
+ Y = One / X;
+ }
+ while (!(Done));
+ Y2 = One + U2;
+ Y1 = One - U2;
+ X = OneAndHalf - U2;
+ Y = OneAndHalf + U2;
+ Z = (X - U2) * Y2;
+ T = Y * Y1;
+ Z = Z - X;
+ T = T - X;
+ X = X * Y2;
+ Y = (Y + U2) * Y1;
+ X = X - OneAndHalf;
+ Y = Y - OneAndHalf;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T <= Zero)) {
+ X = (OneAndHalf + U2) * Y2;
+ Y = OneAndHalf - U2 - U2;
+ Z = OneAndHalf + U2 + U2;
+ T = (OneAndHalf - U2) * Y1;
+ X = X - (Z + U2);
+ StickyBit = Y * Y1;
+ S = Z * Y2;
+ T = T - Y;
+ Y = (U2 - Y) + StickyBit;
+ Z = S - (Z + U2 + U2);
+ StickyBit = (Y2 + U2) * Y1;
+ Y1 = Y2 * Y1;
+ StickyBit = StickyBit - Y2;
+ Y1 = Y1 - Half;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero)
+ && (StickyBit == Zero) && (Y1 == Half)) {
+ RMult = Rounded;
+ printf ("Multiplication appears to round correctly.\n");
+ } else if ((X + U2 == Zero) && (Y < Zero) && (Z + U2 == Zero)
+ && (T < Zero) && (StickyBit + U2 == Zero)
+ && (Y1 < Half)) {
+ RMult = Chopped;
+ printf ("Multiplication appears to chop.\n");
+ } else
+ printf ("* is neither chopped nor correctly rounded.\n");
+ if ((RMult == Rounded) && (GMult == No))
+ notify ("Multiplication");
+ } else
+ printf ("* is neither chopped nor correctly rounded.\n");
+ /*=============================================*/
+ Milestone = 45;
+ /*=============================================*/
+ Y2 = One + U2;
+ Y1 = One - U2;
+ Z = OneAndHalf + U2 + U2;
+ X = Z / Y2;
+ T = OneAndHalf - U2 - U2;
+ Y = (T - U2) / Y1;
+ Z = (Z + U2) / Y2;
+ X = X - OneAndHalf;
+ Y = Y - T;
+ T = T / Y1;
+ Z = Z - (OneAndHalf + U2);
+ T = (U2 - OneAndHalf) + T;
+ if (!((X > Zero) || (Y > Zero) || (Z > Zero) || (T > Zero))) {
+ X = OneAndHalf / Y2;
+ Y = OneAndHalf - U2;
+ Z = OneAndHalf + U2;
+ X = X - Y;
+ T = OneAndHalf / Y1;
+ Y = Y / Y1;
+ T = T - (Z + U2);
+ Y = Y - Z;
+ Z = Z / Y2;
+ Y1 = (Y2 + U2) / Y2;
+ Z = Z - OneAndHalf;
+ Y2 = Y1 - Y2;
+ Y1 = (F9 - U1) / F9;
+ if ((X == Zero) && (Y == Zero) && (Z == Zero) && (T == Zero)
+ && (Y2 == Zero) && (Y2 == Zero)
+ && (Y1 - Half == F9 - Half)) {
+ RDiv = Rounded;
+ printf ("Division appears to round correctly.\n");
+ if (GDiv == No)
+ notify ("Division");
+ } else if ((X < Zero) && (Y < Zero) && (Z < Zero) && (T < Zero)
+ && (Y2 < Zero) && (Y1 - Half < F9 - Half)) {
+ RDiv = Chopped;
+ printf ("Division appears to chop.\n");
+ }
+ }
+ if (RDiv == Other)
+ printf ("/ is neither chopped nor correctly rounded.\n");
+ BInvrse = One / Radix;
+ TstCond (Failure, (BInvrse * Radix - Half == Half),
+ "Radix * ( 1 / Radix ) differs from 1");
+ /*=============================================*/
+ Milestone = 50;
+ /*=============================================*/
+ TstCond (Failure, ((F9 + U1) - Half == Half)
+ && ((BMinusU2 + U2) - One == Radix - One),
+ "Incomplete carry-propagation in Addition");
+ X = One - U1 * U1;
+ Y = One + U2 * (One - U2);
+ Z = F9 - Half;
+ X = (X - Half) - Z;
+ Y = Y - One;
+ if ((X == Zero) && (Y == Zero)) {
+ RAddSub = Chopped;
+ printf ("Add/Subtract appears to be chopped.\n");
+ }
+ if (GAddSub == Yes) {
+ X = (Half + U2) * U2;
+ Y = (Half - U2) * U2;
+ X = One + X;
+ Y = One + Y;
+ X = (One + U2) - X;
+ Y = One - Y;
+ if ((X == Zero) && (Y == Zero)) {
+ X = (Half + U2) * U1;
+ Y = (Half - U2) * U1;
+ X = One - X;
+ Y = One - Y;
+ X = F9 - X;
+ Y = One - Y;
+ if ((X == Zero) && (Y == Zero)) {
+ RAddSub = Rounded;
+ printf ("Addition/Subtraction appears to round correctly.\n");
+ if (GAddSub == No)
+ notify ("Add/Subtract");
+ } else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ } else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ } else
+ printf ("Addition/Subtraction neither rounds nor chops.\n");
+ S = One;
+ X = One + Half * (One + Half);
+ Y = (One + U2) * Half;
+ Z = X - Y;
+ T = Y - X;
+ StickyBit = Z + T;
+ if (StickyBit != Zero) {
+ S = Zero;
+ BadCond (Flaw, "(X - Y) + (Y - X) is non zero!\n");
+ }
+ StickyBit = Zero;
+ if ((GMult == Yes) && (GDiv == Yes) && (GAddSub == Yes)
+ && (RMult == Rounded) && (RDiv == Rounded)
+ && (RAddSub == Rounded) && (FLOOR (RadixD2) == RadixD2)) {
+ printf ("Checking for sticky bit.\n");
+ X = (Half + U1) * U2;
+ Y = Half * U2;
+ Z = One + Y;
+ T = One + X;
+ if ((Z - One <= Zero) && (T - One >= U2)) {
+ Z = T + Y;
+ Y = Z - X;
+ if ((Z - T >= U2) && (Y - T == Zero)) {
+ X = (Half + U1) * U1;
+ Y = Half * U1;
+ Z = One - Y;
+ T = One - X;
+ if ((Z - One == Zero) && (T - F9 == Zero)) {
+ Z = (Half - U1) * U1;
+ T = F9 - Z;
+ Q = F9 - Y;
+ if ((T - F9 == Zero) && (F9 - U1 - Q == Zero)) {
+ Z = (One + U2) * OneAndHalf;
+ T = (OneAndHalf + U2) - Z + U2;
+ X = One + Half / Radix;
+ Y = One + Radix * U2;
+ Z = X * Y;
+ if (T == Zero && X + Radix * U2 - Z == Zero) {
+ if (Radix != Two) {
+ X = Two + U2;
+ Y = X / Two;
+ if ((Y - One == Zero))
+ StickyBit = S;
+ } else
+ StickyBit = S;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (StickyBit == One)
+ printf ("Sticky bit apparently used correctly.\n");
+ else
+ printf ("Sticky bit used incorrectly or not at all.\n");
+ TstCond (Flaw, !(GMult == No || GDiv == No || GAddSub == No ||
+ RMult == Other || RDiv == Other || RAddSub == Other),
+ "lack(s) of guard digits or failure(s) to correctly round or chop\n\
+(noted above) count as one flaw in the final tally below");
+ /*=============================================*/
+ Milestone = 60;
+ /*=============================================*/
+ printf ("\n");
+ printf ("Does Multiplication commute? ");
+ printf ("Testing on %d random pairs.\n", NoTrials);
+ Random9 = SQRT (3.0);
+ Random1 = Third;
+ I = 1;
+ do {
+ X = Random ();
+ Y = Random ();
+ Z9 = Y * X;
+ Z = X * Y;
+ Z9 = Z - Z9;
+ I = I + 1;
+ }
+ while (!((I > NoTrials) || (Z9 != Zero)));
+ if (I == NoTrials) {
+ Random1 = One + Half / Three;
+ Random2 = (U2 + U1) + One;
+ Z = Random1 * Random2;
+ Y = Random2 * Random1;
+ Z9 = (One + Half / Three) * ((U2 + U1) + One) - (One + Half /
+ Three) * ((U2 + U1) + One);
+ }
+ if (!((I == NoTrials) || (Z9 == Zero)))
+ BadCond (Defect, "X * Y == Y * X trial fails.\n");
+ else
+ printf (" No failures found in %d integer pairs.\n", NoTrials);
+ /*=============================================*/
+ Milestone = 70;
+ /*=============================================*/
+ printf ("\nRunning test of square root(x).\n");
+ TstCond (Failure, (Zero == SQRT (Zero))
+ && (-Zero == SQRT (-Zero))
+ && (One == SQRT (One)), "Square root of 0.0, -0.0 or 1.0 wrong");
+ MinSqEr = Zero;
+ MaxSqEr = Zero;
+ J = Zero;
+ X = Radix;
+ OneUlp = U2;
+ SqXMinX (Serious);
+ X = BInvrse;
+ OneUlp = BInvrse * U1;
+ SqXMinX (Serious);
+ X = U1;
+ OneUlp = U1 * U1;
+ SqXMinX (Serious);
+ if (J != Zero)
+ Pause ();
+ printf ("Testing if sqrt(X * X) == X for %d Integers X.\n", NoTrials);
+ J = Zero;
+ X = Two;
+ Y = Radix;
+ if ((Radix != One))
+ do {
+ X = Y;
+ Y = Radix * Y;
+ }
+ while (!((Y - X >= NoTrials)));
+ OneUlp = X * U2;
+ I = 1;
+ while (I <= NoTrials) {
+ X = X + One;
+ SqXMinX (Defect);
+ if (J > Zero)
+ break;
+ I = I + 1;
+ }
+ printf ("Test for sqrt monotonicity.\n");
+ I = -1;
+ X = BMinusU2;
+ Y = Radix;
+ Z = Radix + Radix * U2;
+ NotMonot = False;
+ Monot = False;
+ while (!(NotMonot || Monot)) {
+ I = I + 1;
+ X = SQRT (X);
+ Q = SQRT (Y);
+ Z = SQRT (Z);
+ if ((X > Q) || (Q > Z))
+ NotMonot = True;
+ else {
+ Q = FLOOR (Q + Half);
+ if ((I > 0) || (Radix == Q * Q))
+ Monot = True;
+ else if (I > 0) {
+ if (I > 1)
+ Monot = True;
+ else {
+ Y = Y * BInvrse;
+ X = Y - U1;
+ Z = Y + U1;
+ }
+ } else {
+ Y = Q;
+ X = Y - U2;
+ Z = Y + U2;
+ }
+ }
+ }
+ if (Monot)
+ printf ("sqrt has passed a test for Monotonicity.\n");
+ else {
+ BadCond (Defect, "");
+ printf ("sqrt(X) is non-monotonic for X near %.7e .\n", Y);
+ }
+ /*=============================================*/
+ Milestone = 80;
+ /*=============================================*/
+ MinSqEr = MinSqEr + Half;
+ MaxSqEr = MaxSqEr - Half;
+ Y = (SQRT (One + U2) - One) / U2;
+ SqEr = (Y - One) + U2 / Eight;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ SqEr = Y + U2 / Eight;
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ Y = ((SQRT (F9) - U2) - (One - U2)) / U1;
+ SqEr = Y + U1 / Eight;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ SqEr = (Y + One) + U1 / Eight;
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ OneUlp = U2;
+ X = OneUlp;
+ for (Indx = 1; Indx <= 3; ++Indx) {
+ Y = SQRT ((X + U1 + X) + F9);
+ Y = ((Y - U2) - ((One - U2) + X)) / OneUlp;
+ Z = ((U1 - X) + F9) * Half * X * X / OneUlp;
+ SqEr = (Y + Half) + Z;
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ SqEr = (Y - Half) + Z;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ if (((Indx == 1) || (Indx == 3)))
+ X = OneUlp * Sign (X) * FLOOR (Eight / (Nine * SQRT (OneUlp)));
+ else {
+ OneUlp = U1;
+ X = -OneUlp;
+ }
+ }
+ /*=============================================*/
+ Milestone = 85;
+ /*=============================================*/
+ SqRWrng = False;
+ Anomaly = False;
+ RSqrt = Other; /* ~dgh */
+ if (Radix != One) {
+ printf ("Testing whether sqrt is rounded or chopped.\n");
+ D = FLOOR (Half + POW (Radix, One + Precision - FLOOR (Precision)));
+ /* ... == Radix^(1 + fract) if (Precision == Integer + fract. */
+ X = D / Radix;
+ Y = D / A1;
+ if ((X != FLOOR (X)) || (Y != FLOOR (Y))) {
+ Anomaly = True;
+ } else {
+ X = Zero;
+ Z2 = X;
+ Y = One;
+ Y2 = Y;
+ Z1 = Radix - One;
+ FourD = Four * D;
+ do {
+ if (Y2 > Z2) {
+ Q = Radix;
+ Y1 = Y;
+ do {
+ X1 = FABS (Q + FLOOR (Half - Q / Y1) * Y1);
+ Q = Y1;
+ Y1 = X1;
+ }
+ while (!(X1 <= Zero));
+ if (Q <= One) {
+ Z2 = Y2;
+ Z = Y;
+ }
+ }
+ Y = Y + Two;
+ X = X + Eight;
+ Y2 = Y2 + X;
+ if (Y2 >= FourD)
+ Y2 = Y2 - FourD;
+ }
+ while (!(Y >= D));
+ X8 = FourD - Z2;
+ Q = (X8 + Z * Z) / FourD;
+ X8 = X8 / Eight;
+ if (Q != FLOOR (Q))
+ Anomaly = True;
+ else {
+ Break = False;
+ do {
+ X = Z1 * Z;
+ X = X - FLOOR (X / Radix) * Radix;
+ if (X == One)
+ Break = True;
+ else
+ Z1 = Z1 - One;
+ }
+ while (!(Break || (Z1 <= Zero)));
+ if ((Z1 <= Zero) && (!Break))
+ Anomaly = True;
+ else {
+ if (Z1 > RadixD2)
+ Z1 = Z1 - Radix;
+ do {
+ NewD ();
+ }
+ while (!(U2 * D >= F9));
+ if (D * Radix - D != W - D)
+ Anomaly = True;
+ else {
+ Z2 = D;
+ I = 0;
+ Y = D + (One + Z) * Half;
+ X = D + Z + Q;
+ SR3750 ();
+ Y = D + (One - Z) * Half + D;
+ X = D - Z + D;
+ X = X + Q + X;
+ SR3750 ();
+ NewD ();
+ if (D - Z2 != W - Z2)
+ Anomaly = True;
+ else {
+ Y = (D - Z2) + (Z2 + (One - Z) * Half);
+ X = (D - Z2) + (Z2 - Z + Q);
+ SR3750 ();
+ Y = (One + Z) * Half;
+ X = Q;
+ SR3750 ();
+ if (I == 0)
+ Anomaly = True;
+ }
+ }
+ }
+ }
+ }
+ if ((I == 0) || Anomaly) {
+ BadCond (Failure, "Anomalous arithmetic with Integer < ");
+ printf ("Radix^Precision = %.7e\n", W);
+ printf (" fails test whether sqrt rounds or chops.\n");
+ SqRWrng = True;
+ }
+ }
+ if (!Anomaly) {
+ if (!((MinSqEr < Zero) || (MaxSqEr > Zero))) {
+ RSqrt = Rounded;
+ printf ("Square root appears to be correctly rounded.\n");
+ } else {
+ if ((MaxSqEr + U2 > U2 - Half) || (MinSqEr > Half)
+ || (MinSqEr + Radix < Half))
+ SqRWrng = True;
+ else {
+ RSqrt = Chopped;
+ printf ("Square root appears to be chopped.\n");
+ }
+ }
+ }
+ if (SqRWrng) {
+ printf ("Square root is neither chopped nor correctly rounded.\n");
+ printf ("Observed errors run from %.7e ", MinSqEr - Half);
+ printf ("to %.7e ulps.\n", Half + MaxSqEr);
+ TstCond (Serious, MaxSqEr - MinSqEr < Radix * Radix,
+ "sqrt gets too many last digits wrong");
+ }
+ /*=============================================*/
+ Milestone = 90;
+ /*=============================================*/
+ Pause ();
+ printf ("Testing powers Z^i for small Integers Z and i.\n");
+ N = 0;
+ /* ... test powers of zero. */
+ I = 0;
+ Z = -Zero;
+ M = 3;
+ Break = False;
+ do {
+ X = One;
+ SR3980 ();
+ if (I <= 10) {
+ I = 1023;
+ SR3980 ();
+ }
+ if (Z == MinusOne)
+ Break = True;
+ else {
+ Z = MinusOne;
+ /* .. if(-1)^N is invalid, replace MinusOne by One. */
+ I = -4;
+ }
+ }
+ while (!Break);
+ PrintIfNPositive ();
+ N1 = N;
+ N = 0;
+ Z = A1;
+ M = (int) FLOOR (Two * LOG (W) / LOG (A1));
+ Break = False;
+ do {
+ X = Z;
+ I = 1;
+ SR3980 ();
+ if (Z == AInvrse)
+ Break = True;
+ else
+ Z = AInvrse;
+ }
+ while (!(Break));
+ /*=============================================*/
+ Milestone = 100;
+ /*=============================================*/
+ /* Powers of Radix have been tested, */
+ /* next try a few primes */
+ M = NoTrials;
+ Z = Three;
+ do {
+ X = Z;
+ I = 1;
+ SR3980 ();
+ do {
+ Z = Z + Two;
+ }
+ while (Three * FLOOR (Z / Three) == Z);
+ }
+ while (Z < Eight * Three);
+ if (N > 0) {
+ printf ("Errors like this may invalidate financial calculations\n");
+ printf ("\tinvolving interest rates.\n");
+ }
+ PrintIfNPositive ();
+ N += N1;
+ if (N == 0)
+ printf ("... no discrepancies found.\n");
+ if (N > 0)
+ Pause ();
+ else
+ printf ("\n");
+ /*=============================================*/
+ Milestone = 110;
+ /*=============================================*/
+ printf ("Seeking Underflow thresholds UfThold and E0.\n");
+ D = U1;
+ if (Precision != FLOOR (Precision)) {
+ D = BInvrse;
+ X = Precision;
+ do {
+ D = D * BInvrse;
+ X = X - One;
+ }
+ while (X > Zero);
+ }
+ Y = One;
+ Z = D;
+ /* ... D is power of 1/Radix < 1. */
+ do {
+ C = Y;
+ Y = Z;
+ Z = Y * Y;
+ }
+ while ((Y > Z) && (Z + Z > Z));
+ Y = C;
+ Z = Y * D;
+ do {
+ C = Y;
+ Y = Z;
+ Z = Y * D;
+ }
+ while ((Y > Z) && (Z + Z > Z));
+ if (Radix < Two)
+ HInvrse = Two;
+ else
+ HInvrse = Radix;
+ H = One / HInvrse;
+ /* ... 1/HInvrse == H == Min(1/Radix, 1/2) */
+ CInvrse = One / C;
+ E0 = C;
+ Z = E0 * H;
+ /* ...1/Radix^(BIG Integer) << 1 << CInvrse == 1/C */
+ do {
+ Y = E0;
+ E0 = Z;
+ Z = E0 * H;
+ }
+ while ((E0 > Z) && (Z + Z > Z));
+ UfThold = E0;
+ E1 = Zero;
+ Q = Zero;
+ E9 = U2;
+ S = One + E9;
+ D = C * S;
+ if (D <= C) {
+ E9 = Radix * U2;
+ S = One + E9;
+ D = C * S;
+ if (D <= C) {
+ BadCond (Failure, "multiplication gets too many last digits wrong.\n");
+ Underflow = E0;
+ Y1 = Zero;
+ PseudoZero = Z;
+ Pause ();
+ }
+ } else {
+ Underflow = D;
+ PseudoZero = Underflow * H;
+ UfThold = Zero;
+ do {
+ Y1 = Underflow;
+ Underflow = PseudoZero;
+ if (E1 + E1 <= E1) {
+ Y2 = Underflow * HInvrse;
+ E1 = FABS (Y1 - Y2);
+ Q = Y1;
+ if ((UfThold == Zero) && (Y1 != Y2))
+ UfThold = Y1;
+ }
+ PseudoZero = PseudoZero * H;
+ }
+ while ((Underflow > PseudoZero)
+ && (PseudoZero + PseudoZero > PseudoZero));
+ }
+ /* Comment line 4530 .. 4560 */
+ if (PseudoZero != Zero) {
+ printf ("\n");
+ Z = PseudoZero;
+ /* ... Test PseudoZero for "phoney- zero" violates */
+ /* ... PseudoZero < Underflow or PseudoZero < PseudoZero + PseudoZero
+ ... */
+ if (PseudoZero <= Zero) {
+ BadCond (Failure, "Positive expressions can underflow to an\n");
+ printf ("allegedly negative value\n");
+ printf ("PseudoZero that prints out as: %g .\n", PseudoZero);
+ X = -PseudoZero;
+ if (X <= Zero) {
+ printf ("But -PseudoZero, which should be\n");
+ printf ("positive, isn't; it prints out as %g .\n", X);
+ }
+ } else {
+ BadCond (Flaw, "Underflow can stick at an allegedly positive\n");
+ printf ("value PseudoZero that prints out as %g .\n", PseudoZero);
+ }
+ TstPtUf ();
+ }
+ /*=============================================*/
+ Milestone = 120;
+ /*=============================================*/
+ if (CInvrse * Y > CInvrse * Y1) {
+ S = H * S;
+ E0 = Underflow;
+ }
+ if (!((E1 == Zero) || (E1 == E0))) {
+ BadCond (Defect, "");
+ if (E1 < E0) {
+ printf ("Products underflow at a higher");
+ printf (" threshold than differences.\n");
+ if (PseudoZero == Zero)
+ E0 = E1;
+ } else {
+ printf ("Difference underflows at a higher");
+ printf (" threshold than products.\n");
+ }
+ }
+ printf ("Smallest strictly positive number found is E0 = %g .\n", E0);
+ Z = E0;
+ TstPtUf ();
+ Underflow = E0;
+ if (N == 1)
+ Underflow = Y;
+ I = 4;
+ if (E1 == Zero)
+ I = 3;
+ if (UfThold == Zero)
+ I = I - 2;
+ UfNGrad = True;
+ switch (I) {
+ case 1:
+ UfThold = Underflow;
+ if ((CInvrse * Q) != ((CInvrse * Y) * S)) {
+ UfThold = Y;
+ BadCond (Failure, "Either accuracy deteriorates as numbers\n");
+ printf ("approach a threshold = %.17e\n", UfThold);;
+ printf (" coming down from %.17e\n", C);
+ printf (" or else multiplication gets too many last digits wrong.\n");
+ }
+ Pause ();
+ break;
+
+ case 2:
+ BadCond (Failure, "Underflow confuses Comparison, which alleges that\n");
+ printf ("Q == Y while denying that |Q - Y| == 0; these values\n");
+ printf ("print out as Q = %.17e, Y = %.17e .\n", Q, Y2);
+ printf ("|Q - Y| = %.17e .\n", FABS (Q - Y2));
+ UfThold = Q;
+ break;
+
+ case 3:
+ X = X;
+ break;
+
+ case 4:
+ if ((Q == UfThold) && (E1 == E0)
+ && (FABS (UfThold - E1 / E9) <= E1)) {
+ UfNGrad = False;
+ printf ("Underflow is gradual; it incurs Absolute Error =\n");
+ printf ("(roundoff in UfThold) < E0.\n");
+ Y = E0 * CInvrse;
+ Y = Y * (OneAndHalf + U2);
+ X = CInvrse * (One + U2);
+ Y = Y / X;
+ IEEE = (Y == E0);
+ }
+ }
+ if (UfNGrad) {
+ printf ("\n");
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf)) {
+ printf ("Underflow / UfThold failed!\n");
+ R = H + H;
+ } else
+ R = SQRT (Underflow / UfThold);
+ sigsave = 0;
+ if (R <= H) {
+ Z = R * UfThold;
+ X = Z * (One + R * H * (One + H));
+ } else {
+ Z = UfThold;
+ X = Z * (One + H * H * (One + H));
+ }
+ if (!((X == Z) || (X - Z != Zero))) {
+ BadCond (Flaw, "");
+ printf ("X = %.17e\n\tis not equal to Z = %.17e .\n", X, Z);
+ Z9 = X - Z;
+ printf ("yet X - Z yields %.17e .\n", Z9);
+ printf (" Should this NOT signal Underflow, ");
+ printf ("this is a SERIOUS DEFECT\nthat causes ");
+ printf ("confusion when innocent statements like\n");;
+ printf (" if (X == Z) ... else");
+ printf (" ... (f(X) - f(Z)) / (X - Z) ...\n");
+ printf ("encounter Division by Zero although actually\n");
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf))
+ printf ("X / Z fails!\n");
+ else
+ printf ("X / Z = 1 + %g .\n", (X / Z - Half) - Half);
+ sigsave = 0;
+ }
+ }
+ printf ("The Underflow threshold is %.17e, %s\n", UfThold,
+ " below which");
+ printf ("calculation may suffer larger Relative error than ");
+ printf ("merely roundoff.\n");
+ Y2 = U1 * U1;
+ Y = Y2 * Y2;
+ Y2 = Y * U1;
+ if (Y2 <= UfThold) {
+ if (Y > E0) {
+ BadCond (Defect, "");
+ I = 5;
+ } else {
+ BadCond (Serious, "");
+ I = 4;
+ }
+ printf ("Range is too narrow; U1^%d Underflows.\n", I);
+ }
+ /*=============================================*/
+ Milestone = 130;
+ /*=============================================*/
+ Y = -FLOOR (Half - TwoForty * LOG (UfThold) / LOG (HInvrse)) / TwoForty;
+ Y2 = Y + Y;
+ printf ("Since underflow occurs below the threshold\n");
+ printf ("UfThold = (%.17e) ^ (%.17e)\nonly underflow ", HInvrse, Y);
+ printf ("should afflict the expression\n\t(%.17e) ^ (%.17e);\n",
+ HInvrse, Y2);
+ printf ("actually calculating yields:");
+ if (setjmp (ovfl_buf)) {
+ sigsave = 0;
+ BadCond (Serious, "trap on underflow.\n");
+ } else {
+ sigsave = _sigfpe;
+ V9 = POW (HInvrse, Y2);
+ sigsave = 0;
+ printf (" %.17e .\n", V9);
+ if (!((V9 >= Zero) && (V9 <= (Radix + Radix + E9) * UfThold))) {
+ BadCond (Serious, "this is not between 0 and underflow\n");
+ printf (" threshold = %.17e .\n", UfThold);
+ } else if (!(V9 > UfThold * (One + E9)))
+ printf ("This computed value is O.K.\n");
+ else {
+ BadCond (Defect, "this is not between 0 and underflow\n");
+ printf (" threshold = %.17e .\n", UfThold);
+ }
+ }
+ /*=============================================*/
+ Milestone = 140;
+ /*=============================================*/
+ printf ("\n");
+ /* ...calculate Exp2 == exp(2) == 7.389056099... */
+ X = Zero;
+ I = 2;
+ Y = Two * Three;
+ Q = Zero;
+ N = 0;
+ do {
+ Z = X;
+ I = I + 1;
+ Y = Y / (I + I);
+ R = Y + Q;
+ X = Z + R;
+ Q = (Z - X) + R;
+ }
+ while (X > Z);
+ Z = (OneAndHalf + One / Eight) + X / (OneAndHalf * ThirtyTwo);
+ X = Z * Z;
+ Exp2 = X * X;
+ X = F9;
+ Y = X - U1;
+ printf ("Testing X^((X + 1) / (X - 1)) vs. exp(2) = %.17e as X -> 1.\n",
+ Exp2);
+ for (I = 1;;) {
+ Z = X - BInvrse;
+ Z = (X + One) / (Z - (One - BInvrse));
+ Q = POW (X, Z) - Exp2;
+ if (FABS (Q) > TwoForty * U2) {
+ N = 1;
+ V9 = (X - BInvrse) - (One - BInvrse);
+ BadCond (Defect, "Calculated");
+ printf (" %.17e for\n", POW (X, Z));
+ printf ("\t(1 + (%.17e) ^ (%.17e);\n", V9, Z);
+ printf ("\tdiffers from correct value by %.17e .\n", Q);
+ printf ("\tThis much error may spoil financial\n");
+ printf ("\tcalculations involving tiny interest rates.\n");
+ break;
+ } else {
+ Z = (Y - X) * Two + Y;
+ X = Y;
+ Y = Z;
+ Z = One + (X - F9) * (X - F9);
+ if (Z > One && I < NoTrials)
+ I++;
+ else {
+ if (X > One) {
+ if (N == 0)
+ printf ("Accuracy seems adequate.\n");
+ break;
+ } else {
+ X = One + U2;
+ Y = U2 + U2;
+ Y += X;
+ I = 1;
+ }
+ }
+ }
+ }
+ /*=============================================*/
+ Milestone = 150;
+ /*=============================================*/
+ printf ("Testing powers Z^Q at four nearly extreme values.\n");
+ N = 0;
+ Z = A1;
+ Q = FLOOR (Half - LOG (C) / LOG (A1));
+ Break = False;
+ do {
+ X = CInvrse;
+ Y = POW (Z, Q);
+ IsYeqX ();
+ Q = -Q;
+ X = C;
+ Y = POW (Z, Q);
+ IsYeqX ();
+ if (Z < One)
+ Break = True;
+ else
+ Z = AInvrse;
+ }
+ while (!(Break));
+ PrintIfNPositive ();
+ if (N == 0)
+ printf (" ... no discrepancies found.\n");
+ printf ("\n");
+
+ /*=============================================*/
+ Milestone = 160;
+ /*=============================================*/
+ Pause ();
+ printf ("Searching for Overflow threshold:\n");
+ printf ("This may generate an error.\n");
+ Y = -CInvrse;
+ V9 = HInvrse * Y;
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf)) {
+ I = 0;
+ V9 = Y;
+ goto overflow;
+ }
+ do {
+ V = Y;
+ Y = V9;
+ V9 = HInvrse * Y;
+ }
+ while (V9 < Y);
+ I = 1;
+ overflow:
+ sigsave = 0;
+ Z = V9;
+ printf ("Can `Z = -Y' overflow?\n");
+ printf ("Trying it on Y = %.17e .\n", Y);
+ V9 = -Y;
+ V0 = V9;
+ if (V - Y == V + V0)
+ printf ("Seems O.K.\n");
+ else {
+ printf ("finds a ");
+ BadCond (Flaw, "-(-Y) differs from Y.\n");
+ }
+ if (Z != Y) {
+ BadCond (Serious, "");
+ printf ("overflow past %.17e\n\tshrinks to %.17e .\n", Y, Z);
+ }
+ if (I) {
+ Y = V * (HInvrse * U2 - HInvrse);
+ Z = Y + ((One - HInvrse) * U2) * V;
+ if (Z < V0)
+ Y = Z;
+ if (Y < V0)
+ V = Y;
+ if (V0 - V < V0)
+ V = V0;
+ } else {
+ V = Y * (HInvrse * U2 - HInvrse);
+ V = V + ((One - HInvrse) * U2) * Y;
+ }
+ printf ("Overflow threshold is V = %.17e .\n", V);
+ if (I)
+ printf ("Overflow saturates at V0 = %.17e .\n", V0);
+ else
+ printf ("There is no saturation value because \
+the system traps on overflow.\n");
+ V9 = V * One;
+ printf ("No Overflow should be signaled for V * 1 = %.17e\n", V9);
+ V9 = V / One;
+ printf (" nor for V / 1 = %.17e .\n", V9);
+ printf ("Any overflow signal separating this * from the one\n");
+ printf ("above is a DEFECT.\n");
+ /*=============================================*/
+ Milestone = 170;
+ /*=============================================*/
+ if (!(-V < V && -V0 < V0 && -UfThold < V && UfThold < V)) {
+ BadCond (Failure, "Comparisons involving ");
+ printf ("+-%g, +-%g\nand +-%g are confused by Overflow.",
+ V, V0, UfThold);
+ }
+ /*=============================================*/
+ Milestone = 175;
+ /*=============================================*/
+ printf ("\n");
+ for (Indx = 1; Indx <= 3; ++Indx) {
+ switch (Indx) {
+ case 1:
+ Z = UfThold;
+ break;
+ case 2:
+ Z = E0;
+ break;
+ case 3:
+ Z = PseudoZero;
+ break;
+ }
+ if (Z != Zero) {
+ V9 = SQRT (Z);
+ Y = V9 * V9;
+ if (Y / (One - Radix * E9) < Z
+ || Y > (One + Radix * E9) * Z) { /* dgh: + E9 --> * E9 */
+ if (V9 > U1)
+ BadCond (Serious, "");
+ else
+ BadCond (Defect, "");
+ printf ("Comparison alleges that what prints as Z = %.17e\n", Z);
+ printf (" is too far from sqrt(Z) ^ 2 = %.17e .\n", Y);
+ }
+ }
+ }
+ /*=============================================*/
+ Milestone = 180;
+ /*=============================================*/
+ for (Indx = 1; Indx <= 2; ++Indx) {
+ if (Indx == 1)
+ Z = V;
+ else
+ Z = V0;
+ V9 = SQRT (Z);
+ X = (One - Radix * E9) * V9;
+ V9 = V9 * X;
+ if (((V9 < (One - Two * Radix * E9) * Z) || (V9 > Z))) {
+ Y = V9;
+ if (X < W)
+ BadCond (Serious, "");
+ else
+ BadCond (Defect, "");
+ printf ("Comparison alleges that Z = %17e\n", Z);
+ printf (" is too far from sqrt(Z) ^ 2 (%.17e) .\n", Y);
+ }
+ }
+ /*=============================================*/
+ Milestone = 190;
+ /*=============================================*/
+ Pause ();
+ X = UfThold * V;
+ Y = Radix * Radix;
+ if (X * Y < One || X > Y) {
+ if (X * Y < U1 || X > Y / U1)
+ BadCond (Defect, "Badly");
+ else
+ BadCond (Flaw, "");
+
+ printf (" unbalanced range; UfThold * V = %.17e\n\t%s\n",
+ X, "is too far from 1.\n");
+ }
+ /*=============================================*/
+ Milestone = 200;
+ /*=============================================*/
+ for (Indx = 1; Indx <= 5; ++Indx) {
+ X = F9;
+ switch (Indx) {
+ case 2:
+ X = One + U2;
+ break;
+ case 3:
+ X = V;
+ break;
+ case 4:
+ X = UfThold;
+ break;
+ case 5:
+ X = Radix;
+ }
+ Y = X;
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf))
+ printf (" X / X traps when X = %g\n", X);
+ else {
+ V9 = (Y / X - Half) - Half;
+ if (V9 == Zero)
+ continue;
+ if (V9 == -U1 && Indx < 5)
+ BadCond (Flaw, "");
+ else
+ BadCond (Serious, "");
+ printf (" X / X differs from 1 when X = %.17e\n", X);
+ printf (" instead, X / X - 1/2 - 1/2 = %.17e .\n", V9);
+ }
+ sigsave = 0;
+ }
+ /*=============================================*/
+ Milestone = 210;
+ /*=============================================*/
+ MyZero = Zero;
+ printf ("\n");
+ printf ("What message and/or values does Division by Zero produce?\n");
+#ifndef BATCHMODE
+ printf ("This can interupt your program. You can ");
+ printf ("skip this part if you wish.\n");
+ printf ("Do you wish to compute 1 / 0? ");
+ fflush (stdout);
+ read (KEYBOARD, ch, 8);
+ if ((ch[0] == 'Y') || (ch[0] == 'y')) {
+#endif /* !BATCHMODE */
+ sigsave = _sigfpe;
+ printf (" Trying to compute 1 / 0 produces ...");
+ if (!setjmp (ovfl_buf))
+ printf (" %.7e .\n", One / MyZero);
+ sigsave = 0;
+#ifndef BATCHMODE
+ } else
+ printf ("O.K.\n");
+ printf ("\nDo you wish to compute 0 / 0? ");
+ fflush (stdout);
+ read (KEYBOARD, ch, 80);
+ if ((ch[0] == 'Y') || (ch[0] == 'y')) {
+#endif /* !BATCHMODE */
+ sigsave = _sigfpe;
+ printf ("\n Trying to compute 0 / 0 produces ...");
+ if (!setjmp (ovfl_buf))
+ printf (" %.7e .\n", Zero / MyZero);
+ sigsave = 0;
+#ifndef BATCHMODE
+ } else
+ printf ("O.K.\n");
+#endif /* !BATCHMODE */
+ /*=============================================*/
+ Milestone = 220;
+ /*=============================================*/
+
+ Pause ();
+ printf ("\n");
+ {
+ static char *msg[] =
+ {
+ "FAILUREs encountered =",
+ "SERIOUS DEFECTs discovered =",
+ "DEFECTs discovered =",
+ "FLAWs discovered ="};
+ int i;
+ for (i = 0; i < 4; i++)
+ if (ErrCnt[i])
+ printf ("The number of %-29s %d.\n",
+ msg[i], ErrCnt[i]);
+ }
+
+ printf ("\n");
+ if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[Defect]
+ + ErrCnt[Flaw]) > 0) {
+ if ((ErrCnt[Failure] + ErrCnt[Serious] + ErrCnt[
+ Defect] == 0) && (ErrCnt[Flaw] > 0)) {
+ printf ("The arithmetic diagnosed seems ");
+ printf ("Satisfactory though flawed.\n");
+ }
+ if ((ErrCnt[Failure] + ErrCnt[Serious] == 0)
+ && (ErrCnt[Defect] > 0)) {
+ printf ("The arithmetic diagnosed may be Acceptable\n");
+ printf ("despite inconvenient Defects.\n");
+ }
+ if ((ErrCnt[Failure] + ErrCnt[Serious]) > 0) {
+ printf ("The arithmetic diagnosed has ");
+ printf ("unacceptable Serious Defects.\n");
+ }
+ if (ErrCnt[Failure] > 0) {
+ printf ("Potentially fatal FAILURE may have spoiled this");
+ printf (" program's subsequent diagnoses.\n");
+ }
+ } else {
+
+ printf ("No failures, defects nor flaws have been discovered.\n");
+ if (!((RMult == Rounded) && (RDiv == Rounded)
+ && (RAddSub == Rounded) && (RSqrt == Rounded)))
+ printf ("The arithmetic diagnosed seems Satisfactory.\n");
+ else {
+ if (StickyBit >= One &&
+ (Radix - Two) * (Radix - Nine - One) == Zero) {
+ printf ("Rounding appears to conform to ");
+ printf ("the proposed IEEE standard P");
+ if ((Radix == Two) &&
+ ((Precision - Four * Three * Two) *
+ (Precision - TwentySeven -
+ TwentySeven + One) == Zero))
+ printf ("754");
+ else
+ printf ("854");
+ if (IEEE)
+ printf (".\n");
+ else {
+ printf (",\nexcept for possibly Double Rounding");
+ printf (" during Gradual Underflow.\n");
+ }
+ }
+ printf ("The arithmetic diagnosed appears to be Excellent!\n");
+ }
+ }
+
+ if (fpecount)
+ printf ("\nA total of %d floating point exceptions were registered.\n",
+ fpecount);
+ printf ("END OF TEST.\n");
+ return 0;
+}
+
+FLOAT
+Sign (X)
+ FLOAT X;
+{
+ return X >= 0. ? 1.0 : -1.0;
+}
+
+void
+Pause ()
+{
+#ifndef BATCHMODE
+ char ch[8];
+
+ printf ("\nTo continue, press RETURN");
+ fflush (stdout);
+ read (KEYBOARD, ch, 8);
+#endif /* !BATCHMODE */
+#ifndef CYGNUS
+ printf ("\nDiagnosis resumes after milestone Number %d", Milestone);
+ printf (" Page: %d\n\n", PageNo);
+ ++Milestone;
+ ++PageNo;
+#endif /* !CYGNUS */
+}
+
+void
+TstCond (K, Valid, T)
+ int K, Valid;
+ char *T;
+{
+#ifdef CYGNUS
+ printf ("TEST: %s\n", T);
+#endif /* CYGNUS */
+ if (!Valid) {
+ BadCond (K, T);
+ printf (".\n");
+ }
+#ifdef CYGNUS
+ printf ("PASS: %s\n", T);
+#endif /* CYGNUS */
+}
+
+void
+BadCond (K, T)
+ int K;
+ char *T;
+{
+ static char *msg[] =
+ {"FAILURE", "SERIOUS DEFECT", "DEFECT", "FLAW"};
+
+ ErrCnt[K] = ErrCnt[K] + 1;
+#ifndef CYGNUS
+ printf ("%s: %s", msg[K], T);
+#else
+ printf ("ERROR: Severity: %s: %s", msg[K], T);
+#endif /* CYGNUS */
+}
+
+/*
+ * Random computes
+ * X = (Random1 + Random9)^5
+ * Random1 = X - FLOOR(X) + 0.000005 * X;
+ * and returns the new value of Random1
+*/
+FLOAT
+Random ()
+{
+ FLOAT X, Y;
+
+ X = Random1 + Random9;
+ Y = X * X;
+ Y = Y * Y;
+ X = X * Y;
+ Y = X - FLOOR (X);
+ Random1 = Y + X * 0.000005;
+ return (Random1);
+}
+
+void
+SqXMinX (ErrKind)
+ int ErrKind;
+{
+ FLOAT XA, XB;
+
+ XB = X * BInvrse;
+ XA = X - XB;
+ SqEr = ((SQRT (X * X) - XB) - XA) / OneUlp;
+ if (SqEr != Zero) {
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ J = J + 1.0;
+ BadCond (ErrKind, "\n");
+ printf ("sqrt( %.17e) - %.17e = %.17e\n", X * X, X, OneUlp * SqEr);
+ printf ("\tinstead of correct value 0 .\n");
+ }
+}
+
+void
+NewD ()
+{
+ X = Z1 * Q;
+ X = FLOOR (Half - X / Radix) * Radix + X;
+ Q = (Q - X * Z) / Radix + X * X * (D / Radix);
+ Z = Z - Two * X * D;
+ if (Z <= Zero) {
+ Z = -Z;
+ Z1 = -Z1;
+ }
+ D = Radix * D;
+}
+
+void
+SR3750 ()
+{
+ if (!((X - Radix < Z2 - Radix) || (X - Z2 > W - Z2))) {
+ I = I + 1;
+ X2 = SQRT (X * D);
+ Y2 = (X2 - Z2) - (Y - Z2);
+ X2 = X8 / (Y - Half);
+ X2 = X2 - Half * X2 * X2;
+ SqEr = (Y2 + Half) + (Half - X2);
+ if (SqEr < MinSqEr)
+ MinSqEr = SqEr;
+ SqEr = Y2 - X2;
+ if (SqEr > MaxSqEr)
+ MaxSqEr = SqEr;
+ }
+}
+
+void
+IsYeqX ()
+{
+ if (Y != X) {
+ if (N <= 0) {
+ if (Z == Zero && Q <= Zero)
+ printf ("WARNING: computing\n");
+ else
+ BadCond (Defect, "computing\n");
+ printf ("\t(%.17e) ^ (%.17e)\n", Z, Q);
+ printf ("\tyielded %.17e;\n", Y);
+ printf ("\twhich compared unequal to correct %.17e ;\n",
+ X);
+ printf ("\t\tthey differ by %.17e .\n", Y - X);
+ }
+ N = N + 1; /* ... count discrepancies. */
+ }
+}
+
+void
+SR3980 ()
+{
+ do {
+ Q = (FLOAT) I;
+ Y = POW (Z, Q);
+ IsYeqX ();
+ if (++I > M)
+ break;
+ X = Z * X;
+ }
+ while (X < W);
+}
+
+void
+PrintIfNPositive ()
+{
+ if (N > 0)
+ printf ("Similar discrepancies have occurred %d times.\n", N);
+}
+
+void
+TstPtUf ()
+{
+ N = 0;
+ if (Z != Zero) {
+ printf ("Since comparison denies Z = 0, evaluating ");
+ printf ("(Z + Z) / Z should be safe.\n");
+ sigsave = _sigfpe;
+ if (setjmp (ovfl_buf))
+ goto very_serious;
+ Q9 = (Z + Z) / Z;
+ printf ("What the machine gets for (Z + Z) / Z is %.17e .\n",
+ Q9);
+ if (FABS (Q9 - Two) < Radix * U2) {
+ printf ("This is O.K., provided Over/Underflow");
+ printf (" has NOT just been signaled.\n");
+ } else {
+ if ((Q9 < One) || (Q9 > Two)) {
+ very_serious:
+ N = 1;
+ ErrCnt[Serious] = ErrCnt[Serious] + 1;
+ printf ("This is a VERY SERIOUS DEFECT!\n");
+ } else {
+ N = 1;
+ ErrCnt[Defect] = ErrCnt[Defect] + 1;
+ printf ("This is a DEFECT!\n");
+ }
+ }
+ sigsave = 0;
+ V9 = Z * One;
+ Random1 = V9;
+ V9 = One * Z;
+ Random2 = V9;
+ V9 = Z / One;
+ if ((Z == Random1) && (Z == Random2) && (Z == V9)) {
+ if (N > 0)
+ Pause ();
+ } else {
+ N = 1;
+ BadCond (Defect, "What prints as Z = ");
+ printf ("%.17e\n\tcompares different from ", Z);
+ if (Z != Random1)
+ printf ("Z * 1 = %.17e ", Random1);
+ if (!((Z == Random2)
+ || (Random2 == Random1)))
+ printf ("1 * Z == %g\n", Random2);
+ if (!(Z == V9))
+ printf ("Z / 1 = %.17e\n", V9);
+ if (Random2 != Random1) {
+ ErrCnt[Defect] = ErrCnt[Defect] + 1;
+ BadCond (Defect, "Multiplication does not commute!\n");
+ printf ("\tComparison alleges that 1 * Z = %.17e\n",
+ Random2);
+ printf ("\tdiffers from Z * 1 = %.17e\n", Random1);
+ }
+ Pause ();
+ }
+ }
+}
+
+void
+notify (s)
+ char *s;
+{
+ printf ("%s test appears to be inconsistent...\n", s);
+ printf (" PLEASE NOTIFY KARPINKSI!\n");
+}
+
+void
+msglist (s)
+ char **s;
+{
+ while (*s)
+ printf ("%s\n", *s++);
+}
+
+void
+Instructions ()
+{
+ static char *instr[] =
+ {
+ "Lest this program stop prematurely, i.e. before displaying\n",
+ " `END OF TEST',\n",
+ "try to persuade the computer NOT to terminate execution when an",
+ "error like Over/Underflow or Division by Zero occurs, but rather",
+ "to persevere with a surrogate value after, perhaps, displaying some",
+ "warning. If persuasion avails naught, don't despair but run this",
+ "program anyway to see how many milestones it passes, and then",
+ "amend it to make further progress.\n",
+ "Answer questions with Y, y, N or n (unless otherwise indicated).\n",
+ 0};
+
+ msglist (instr);
+}
+
+void
+Heading ()
+{
+ static char *head[] =
+ {
+ "Users are invited to help debug and augment this program so it will",
+ "cope with unanticipated and newly uncovered arithmetic pathologies.\n",
+ "Please send suggestions and interesting results to",
+ "\tRichard Karpinski",
+ "\tComputer Center U-76",
+ "\tUniversity of California",
+ "\tSan Francisco, CA 94143-0704, USA\n",
+ "In doing so, please include the following information:",
+#ifdef SINGLE_PRECISION
+ "\tPrecision:\tsingle;",
+#else /* !SINGLE_PRECISION */
+ "\tPrecision:\tdouble;",
+#endif /* SINGLE_PRECISION */
+ "\tVersion:\t10 February 1989;",
+ "\tComputer:\n",
+ "\tCompiler:\n",
+ "\tOptimization level:\n",
+ "\tOther relevant compiler options:",
+ 0};
+
+ msglist (head);
+}
+
+void
+Characteristics ()
+{
+ static char *chars[] =
+ {
+ "Running this program should reveal these characteristics:",
+ " Radix = 1, 2, 4, 8, 10, 16, 100, 256 ...",
+ " Precision = number of significant digits carried.",
+ " U2 = Radix/Radix^Precision = One Ulp",
+ "\t(OneUlpnit in the Last Place) of 1.000xxx .",
+ " U1 = 1/Radix^Precision = One Ulp of numbers a little less than 1.0 .",
+ " Adequacy of guard digits for Mult., Div. and Subt.",
+ " Whether arithmetic is chopped, correctly rounded, or something else",
+ "\tfor Mult., Div., Add/Subt. and Sqrt.",
+ " Whether a Sticky Bit used correctly for rounding.",
+ " UnderflowThreshold = an underflow threshold.",
+ " E0 and PseudoZero tell whether underflow is abrupt, gradual, or fuzzy.",
+ " V = an overflow threshold, roughly.",
+ " V0 tells, roughly, whether Infinity is represented.",
+ " Comparisions are checked for consistency with subtraction",
+ "\tand for contamination with pseudo-zeros.",
+ " Sqrt is tested. Y^X is not tested.",
+ " Extra-precise subexpressions are revealed but NOT YET tested.",
+ " Decimal-Binary conversion is NOT YET tested for accuracy.",
+ 0};
+
+ msglist (chars);
+}
+
+void
+History ()
+{ /* History */
+ /* Converted from Brian Wichmann's Pascal version to C by Thos Sumner,
+ with further massaging by David M. Gay. */
+
+ static char *hist[] =
+ {
+ "The program attempts to discriminate among",
+ " FLAWs, like lack of a sticky bit,",
+ " Serious DEFECTs, like lack of a guard digit, and",
+ " FAILUREs, like 2+2 == 5 .",
+ "Failures may confound subsequent diagnoses.\n",
+ "The diagnostic capabilities of this program go beyond an earlier",
+ "program called `MACHAR', which can be found at the end of the",
+ "book `Software Manual for the Elementary Functions' (1980) by",
+ "W. J. Cody and W. Waite. Although both programs try to discover",
+ "the Radix, Precision and range (over/underflow thresholds)",
+ "of the arithmetic, this program tries to cope with a wider variety",
+ "of pathologies, and to say how well the arithmetic is implemented.",
+ "\nThe program is based upon a conventional radix representation for",
+ "floating-point numbers, but also allows logarithmic encoding",
+ "as used by certain early WANG machines.\n",
+ "BASIC version of this program (C) 1983 by Prof. W. M. Kahan;",
+ "see source comments for more history.",
+ 0};
+
+ msglist (hist);
+}
diff --git a/testsuites/samples/paranoia/paranoia.doc b/testsuites/samples/paranoia/paranoia.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/samples/paranoia/paranoia.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/samples/paranoia/system.h b/testsuites/samples/paranoia/system.h
new file mode 100644
index 0000000000..76bc3b25a2
--- /dev/null
+++ b/testsuites/samples/paranoia/system.h
@@ -0,0 +1,40 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+#define CONFIGURE_INIT_TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE * 2)
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Global_variable; /* example global variable */
+
+/* end of include file */
diff --git a/testsuites/samples/ticker/init.c b/testsuites/samples/ticker/init.c
new file mode 100644
index 0000000000..68da76ff07
--- /dev/null
+++ b/testsuites/samples/ticker/init.c
@@ -0,0 +1,61 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is called from init_exec and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ puts( "\n\n*** CLOCK TICK TEST ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ], 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 1 ]
+ );
+ status = rtems_task_create(
+ Task_name[ 2 ], 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 2 ]
+ );
+ status = rtems_task_create(
+ Task_name[ 3 ], 1, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES, &Task_id[ 3 ]
+ );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 1 );
+ status = rtems_task_start( Task_id[ 2 ], Test_task, 2 );
+ status = rtems_task_start( Task_id[ 3 ], Test_task, 3 );
+
+ status = rtems_task_delete( RTEMS_SELF );
+}
diff --git a/testsuites/samples/ticker/system.h b/testsuites/samples/ticker/system.h
new file mode 100644
index 0000000000..e12ae48f95
--- /dev/null
+++ b/testsuites/samples/ticker/system.h
@@ -0,0 +1,45 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/samples/ticker/tasks.c b/testsuites/samples/ticker/tasks.c
new file mode 100644
index 0000000000..189b16f6da
--- /dev/null
+++ b/testsuites/samples/ticker/tasks.c
@@ -0,0 +1,44 @@
+/* Test_task
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument unused
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ task_index = task_number( tid );
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ if ( time.second >= 35 ) {
+ puts( "*** END OF CLOCK TICK TEST ***" );
+ exit( 0 );
+ }
+ put_name( Task_name[ task_index ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+ status = rtems_task_wake_after( task_index * 5 * TICKS_PER_SECOND );
+ }
+}
diff --git a/testsuites/samples/ticker/ticker.doc b/testsuites/samples/ticker/ticker.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/samples/ticker/ticker.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/samples/ticker/ticker.scn b/testsuites/samples/ticker/ticker.scn
new file mode 100644
index 0000000000..35952e6170
--- /dev/null
+++ b/testsuites/samples/ticker/ticker.scn
@@ -0,0 +1,16 @@
+*** CLOCK TICK TEST ***
+TA1 - tm_get - 09:00:00 12/31/1988
+TA2 - tm_get - 09:00:00 12/31/1988
+TA3 - tm_get - 09:00:00 12/31/1988
+TA1 - tm_get - 09:00:05 12/31/1988
+TA1 - tm_get - 09:00:10 12/31/1988
+TA2 - tm_get - 09:00:10 12/31/1988
+TA1 - tm_get - 09:00:15 12/31/1988
+TA3 - tm_get - 09:00:15 12/31/1988
+TA1 - tm_get - 09:00:20 12/31/1988
+TA2 - tm_get - 09:00:20 12/31/1988
+TA1 - tm_get - 09:00:25 12/31/1988
+TA1 - tm_get - 09:00:30 12/31/1988
+TA2 - tm_get - 09:00:30 12/31/1988
+TA3 - tm_get - 09:00:30 12/31/1988
+*** END OF CLOCK TICK TEST ***
diff --git a/testsuites/sptests/README b/testsuites/sptests/README
new file mode 100644
index 0000000000..2843063c31
--- /dev/null
+++ b/testsuites/sptests/README
@@ -0,0 +1,9 @@
+#
+# $Id$
+#
+
+This directory contains the RTEMS Single Processor Test Suite.
+The tests in this directory provide near complete (98%+) test
+coverage of the non-multiprocessor code in RTEMS.
+
+
diff --git a/testsuites/sptests/sp01/init.c b/testsuites/sptests/sp01/init.c
new file mode 100644
index 0000000000..99d5922a16
--- /dev/null
+++ b/testsuites/sptests/sp01/init.c
@@ -0,0 +1,86 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 1 ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_INTERRUPT_LEVEL(31),
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 3,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1_through_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp01/sp01.doc b/testsuites/sptests/sp01/sp01.doc
new file mode 100644
index 0000000000..d89d855f3c
--- /dev/null
+++ b/testsuites/sptests/sp01/sp01.doc
@@ -0,0 +1,43 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test1
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ tm_set, tm_get, tm_wkafter
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ c. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ d. Verifies interrupt handler can handle a task switch from an interrupt
+ as specified with the i_return directive.
+
+ e. Verifies executive initialization performed correctly.
+
+ f. Verifies the executive trap handler except for the halt function.
+
+ g. Verifies that a task can get the task identification number of itself.
+
+output:
+ "TA1" is printed once every 5 seconds. "TA2" is printed once
+ every 10 seconds. "TA3" is printed once every 15 seconds.
diff --git a/testsuites/sptests/sp01/sp01.scn b/testsuites/sptests/sp01/sp01.scn
new file mode 100644
index 0000000000..6d687d042a
--- /dev/null
+++ b/testsuites/sptests/sp01/sp01.scn
@@ -0,0 +1,18 @@
+*** TEST 1 ***
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA3 - rtems_clock_get - 09:00:15 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+TA2 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:25 12/31/1988
+TA3 - rtems_clock_get - 09:00:30 12/31/1988
+TA2 - rtems_clock_get - 09:00:30 12/31/1988
+TA1 - rtems_clock_get - 09:00:30 12/31/1988
+*** END OF TEST 1 ***
+
+NOTE: The order of the prints at each time interval is irrelevant.
diff --git a/testsuites/sptests/sp01/system.h b/testsuites/sptests/sp01/system.h
new file mode 100644
index 0000000000..423315e590
--- /dev/null
+++ b/testsuites/sptests/sp01/system.h
@@ -0,0 +1,45 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp01/task1.c b/testsuites/sptests/sp01/task1.c
new file mode 100644
index 0000000000..e911abd595
--- /dev/null
+++ b/testsuites/sptests/sp01/task1.c
@@ -0,0 +1,50 @@
+/* Task_1_through_3
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 35 ) {
+ puts( "*** END OF TEST 1 ***" );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_wake_after( task_number( tid ) * 5 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/testsuites/sptests/sp02/init.c b/testsuites/sptests/sp02/init.c
new file mode 100644
index 0000000000..e55f887074
--- /dev/null
+++ b/testsuites/sptests/sp02/init.c
@@ -0,0 +1,152 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 2 ***" );
+
+ Preempt_task_name = rtems_build_name( 'P', 'R', 'M', 'T' );
+
+ status = rtems_task_create(
+ Preempt_task_name,
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Preempt_task_id
+ );
+ directive_failed( status, "rtems_task_create of RTEMS_PREEMPT" );
+
+ status = rtems_task_start( Preempt_task_id, Preempt_task, 0 );
+ directive_failed( status, "rtems_task_start of RTEMS_PREEMPT" );
+
+ puts( "INIT - rtems_task_wake_after - yielding processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ puts( "INIT - suspending TA2 while middle task on a ready chain" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ status = rtems_task_delete( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_delete of TA1" );
+
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of TA2" );
+
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp02/preempt.c b/testsuites/sptests/sp02/preempt.c
new file mode 100644
index 0000000000..925b1d04a7
--- /dev/null
+++ b/testsuites/sptests/sp02/preempt.c
@@ -0,0 +1,32 @@
+/* Preempt_task
+ *
+ * This routine serves as a test task. It verifies the task manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "PREEMPT - rtems_task_delete - deleting self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_PREEMPT" );
+}
diff --git a/testsuites/sptests/sp02/sp02.doc b/testsuites/sptests/sp02/sp02.doc
new file mode 100644
index 0000000000..0c4c99e31e
--- /dev/null
+++ b/testsuites/sptests/sp02/sp02.doc
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test2
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ t_delete, tm_wkafter, t_setpri, t_suspend
+
+concepts:
+
+ a. Verifies that a task can delete another task and also delete itself.
+
+ b. Verifies that memory is freed back to the heap correctly.
+
+ c. Verifies that TCBs are freed back to the inactive chain correctly.
+
+ d. Verifies that a task can get the task identification number of
+ another task.
+
+ e. Verifies the _Set_state routine where the task is not READY.
+
+ f. Verifies the break statement in the _Block_activate routine.
+
+ g. Verifies the while loop in the _Prev_tcb routine.
diff --git a/testsuites/sptests/sp02/sp02.scn b/testsuites/sptests/sp02/sp02.scn
new file mode 100644
index 0000000000..d3f3d61cd1
--- /dev/null
+++ b/testsuites/sptests/sp02/sp02.scn
@@ -0,0 +1,15 @@
+*** TEST 2 ***
+INIT - rtems_task_wake_after - yielding processor
+PREEMPT - rtems_task_delete - deleting self
+INIT - suspending TA2 while middle task on a ready chain
+TA1 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 minute
+TA3 - rtems_task_wake_after - sleep 5 seconds
+TA1 - rtems_task_ident - tid of TA2 (0x08010007)
+TA1 - rtems_task_ident - tid of TA3 (0x08010008)
+TA1 - rtems_task_set_priority - set TA3's priority to 2
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_delete - delete TA2
+TA1 - rtems_task_wake_after - sleep for 5 seconds
+TA3 - rtems_task_delete - delete self
+*** END OF TEST 2 ***
diff --git a/testsuites/sptests/sp02/system.h b/testsuites/sptests/sp02/system.h
new file mode 100644
index 0000000000..15c15e1a18
--- /dev/null
+++ b/testsuites/sptests/sp02/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Preempt_task_id; /* preempt task id */
+TEST_EXTERN rtems_name Preempt_task_name; /* preempt task name */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp02/task1.c b/testsuites/sptests/sp02/task1.c
new file mode 100644
index 0000000000..560facc32c
--- /dev/null
+++ b/testsuites/sptests/sp02/task1.c
@@ -0,0 +1,66 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the task manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid2;
+ rtems_id tid3;
+ rtems_status_code status;
+ rtems_unsigned32 previous_priority;
+
+ puts( "TA1 - rtems_task_wake_after - sleep 1 second" );
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_task_ident( Task_name[ 2 ], RTEMS_SEARCH_ALL_NODES, &tid2 );
+ directive_failed( status, "rtems_task_ident of TA2" );
+
+ printf( "TA1 - rtems_task_ident - tid of TA2 (0x%.8x)\n", tid2 );
+
+ status = rtems_task_ident( Task_name[ 3 ], RTEMS_SEARCH_ALL_NODES, &tid3 );
+ directive_failed( status, "rtems_task_ident of TA3" );
+
+ printf( "TA1 - rtems_task_ident - tid of TA3 (0x%.8x)\n", tid3 );
+
+ status = rtems_task_set_priority( tid3, 2, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ puts( "TA1 - rtems_task_set_priority - set TA3's priority to 2" );
+
+
+ puts( "TA1 - rtems_task_suspend - suspend TA2" );
+ status = rtems_task_suspend( tid2 );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_delete - delete TA2" );
+ status = rtems_task_delete( tid2 );
+ directive_failed( status, "rtems_task_delete of TA2" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep for 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 2 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp02/task2.c b/testsuites/sptests/sp02/task2.c
new file mode 100644
index 0000000000..16c95eb798
--- /dev/null
+++ b/testsuites/sptests/sp02/task2.c
@@ -0,0 +1,34 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It sleeps for 1 minute but
+ * does not expect to wake up. Task 1 should suspend then delete it
+ * so that it appears to never wake up.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_task_wake_after - sleep 1 minute" );
+ status = rtems_task_wake_after( 60*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after in TA2" );
+}
diff --git a/testsuites/sptests/sp02/task3.c b/testsuites/sptests/sp02/task3.c
new file mode 100644
index 0000000000..c9231e7bd2
--- /dev/null
+++ b/testsuites/sptests/sp02/task3.c
@@ -0,0 +1,37 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It simply sleeps for 5 seconds
+ * and then deletes itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA3 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after in TA3" );
+
+ puts( "TA3 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA3" );
+}
diff --git a/testsuites/sptests/sp03/init.c b/testsuites/sptests/sp03/init.c
new file mode 100644
index 0000000000..615a974c8b
--- /dev/null
+++ b/testsuites/sptests/sp03/init.c
@@ -0,0 +1,67 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 3 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp03/sp03.doc b/testsuites/sptests/sp03/sp03.doc
new file mode 100644
index 0000000000..97dac0fd61
--- /dev/null
+++ b/testsuites/sptests/sp03/sp03.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test3
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, tm_wkafter,
+ tm_wkwhen, tm_set, tm_get
+
+concepts:
+
+ a. Verifies conversion routines - _Utd_to_etd and _Etd_to_utd
diff --git a/testsuites/sptests/sp03/sp03.scn b/testsuites/sptests/sp03/sp03.scn
new file mode 100644
index 0000000000..496982e86f
--- /dev/null
+++ b/testsuites/sptests/sp03/sp03.scn
@@ -0,0 +1,26 @@
+*** TEST 3 ***
+TA1 sets clock: 09:15:00 12/31/1988
+TA1 going to sleep: 09:15:00 12/31/1988
+TA2 09:15:01 12/31/1988
+TA2 09:15:02 12/31/1988
+TA2 09:15:03 12/31/1988
+TA2 09:15:04 12/31/1988
+TA1 awakened: 09:15:05 12/31/1988
+TA1 going to sleep: 09:15:05 12/31/1988
+TA2 09:15:05 12/31/1988
+TA2 09:15:06 12/31/1988
+TA2 09:15:07 12/31/1988
+TA2 09:15:08 12/31/1988
+TA2 09:15:09 12/31/1988
+TA1 awakened: 09:15:10 12/31/1988
+TA1 going to sleep: 09:15:10 12/31/1988
+TA2 09:15:10 12/31/1988
+TA2 09:15:11 12/31/1988
+TA2 09:15:12 12/31/1988
+TA2 09:15:13 12/31/1988
+TA2 09:15:14 12/31/1988
+TA1 awakened: 09:15:15 12/31/1988
+TA1 going to sleep: 09:15:15 12/31/1988
+TA2 09:15:15 12/31/1988
+TA2 09:15:16 12/31/1988
+*** END OF TEST 3 ***
diff --git a/testsuites/sptests/sp03/system.h b/testsuites/sptests/sp03/system.h
new file mode 100644
index 0000000000..2766458732
--- /dev/null
+++ b/testsuites/sptests/sp03/system.h
@@ -0,0 +1,49 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp03/task1.c b/testsuites/sptests/sp03/task1.c
new file mode 100644
index 0000000000..8ad2adba27
--- /dev/null
+++ b/testsuites/sptests/sp03/task1.c
@@ -0,0 +1,59 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the capability to
+ * set and read the executives calender and clock.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ build_time( &time, 12, 31, 1988, 9, 15, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( " sets clock: ", &time, "\n" );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( " going to sleep: ", &time, "\n" );
+
+ time.second += 5;
+ time.minute += ( time.second / 60 );
+ time.second %= 60;
+ time.hour += ( time.minute / 60 );
+ time.minute %= 60;
+ time.hour %= 24;
+
+ status = rtems_task_wake_when( &time );
+ directive_failed( status, "rtems_task_wake_when" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( " awakened: ", &time, "\n" );
+ }
+}
diff --git a/testsuites/sptests/sp03/task2.c b/testsuites/sptests/sp03/task2.c
new file mode 100644
index 0000000000..b25699ca45
--- /dev/null
+++ b/testsuites/sptests/sp03/task2.c
@@ -0,0 +1,46 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It repeatedly gets the system time
+ * and date, converts it to printable form, and print it.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ while( FOREVER ) {
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 17 ) {
+ puts( "*** END OF TEST 3 *** " );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ 2 ], FALSE );
+ print_time( " ", &time, "\n" );
+ }
+}
diff --git a/testsuites/sptests/sp04/init.c b/testsuites/sptests/sp04/init.c
new file mode 100644
index 0000000000..954e8b1f32
--- /dev/null
+++ b/testsuites/sptests/sp04/init.c
@@ -0,0 +1,110 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_extensions_table Extensions = {
+ NULL, /* task create user extension */
+ NULL, /* task start user extension */
+ NULL, /* task restart user extension */
+ NULL, /* task delete user extension */
+ Task_switch, /* task switch user extension */
+ NULL, /* task begin user extension */
+ NULL, /* task exitted user extension */
+ NULL /* fatal error user extension */
+};
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ puts( "\n\n*** TEST 4 ***" );
+ build_time( &time, 12, 31, 1988, 9, 15, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Extension_name[ 1 ] = rtems_build_name( 'E', 'X', 'T', ' ' );
+
+ status = rtems_extension_create(
+ Extension_name[ 1 ],
+ &Extensions,
+ &Extension_id[ 1 ]
+ );
+ directive_failed( status, "rtems_extension_create" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Run_count[ 1 ] = 0;
+ Run_count[ 2 ] = 0;
+ Run_count[ 3 ] = 0;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_TIMESLICE,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp04/sp04.doc b/testsuites/sptests/sp04/sp04.doc
new file mode 100644
index 0000000000..f15d9b73ef
--- /dev/null
+++ b/testsuites/sptests/sp04/sp04.doc
@@ -0,0 +1,38 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test4
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ tm_set, tm_get, ev_receive, t_mode
+
+concepts:
+
+ a. Verifies timeslicing ( all tasks are in timeslice mode ).
+
+ b. Verifies the tswitch user extension.
+
+ c. Verifies the no preemption mode.
+
+ d. Verifies time-slice gets reset even if only one task ready.
+
+output:
+ The task name and the current time are printed out each time that a new
+ task is being dispatched. The configured timeslice is 100 ticks
+ ( 1 second ); therefore, a task name and the time are printed once
+ every second. After each task runs 3 times, task 1 changes its mode to
+ no preempt and runs for about 6 seconds and then changes its mode back to
+ preempt mode.
diff --git a/testsuites/sptests/sp04/sp04.scn b/testsuites/sptests/sp04/sp04.scn
new file mode 100644
index 0000000000..1acd83a82f
--- /dev/null
+++ b/testsuites/sptests/sp04/sp04.scn
@@ -0,0 +1,23 @@
+*** TEST 4 ***
+TA1 - 09:15:00 12/31/1988
+TA1 - rtems_task_suspend - on Task 2
+TA1 - rtems_task_suspend - on Task 3
+TA1 - killing time
+TA1 - rtems_task_resume - on Task 2
+TA1 - rtems_task_resume - on Task 3
+TA2 - 09:15:04 12/31/1988
+TA3 - 09:15:05 12/31/1988
+TA1 - 09:15:06 12/31/1988
+TA2 - 09:15:07 12/31/1988
+TA3 - 09:15:08 12/31/1988
+TA1 - 09:15:09 12/31/1988
+TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT
+TA1 - 09:15:10 12/31/1988
+TA1 - 09:15:11 12/31/1988
+TA1 - 09:15:12 12/31/1988
+TA1 - 09:15:13 12/31/1988
+TA1 - 09:15:14 12/31/1988
+TA1 - 09:15:15 12/31/1988
+TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT
+TA2 - 09:15:16 12/31/1988
+*** END OF TEST 4 ***
diff --git a/testsuites/sptests/sp04/system.h b/testsuites/sptests/sp04/system.h
new file mode 100644
index 0000000000..eb9dc8ed14
--- /dev/null
+++ b/testsuites/sptests/sp04/system.h
@@ -0,0 +1,67 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+void Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Extension_id[ 4 ];
+TEST_EXTERN rtems_name Extension_name[ 4 ]; /* array of task names */
+
+/* array of task run counts */
+TEST_EXTERN volatile rtems_unsigned32 Run_count[ 4 ];
+
+/* end of include file */
diff --git a/testsuites/sptests/sp04/task1.c b/testsuites/sptests/sp04/task1.c
new file mode 100644
index 0000000000..b6dcdd6659
--- /dev/null
+++ b/testsuites/sptests/sp04/task1.c
@@ -0,0 +1,103 @@
+/* Task_1
+ *
+ * This test serves as a test task. It verifies timeslicing activities
+ * and tswitch extension processing.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 seconds;
+ rtems_unsigned32 old_seconds;
+ rtems_mode previous_mode;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ rtems_unsigned32 start_time;
+ rtems_unsigned32 end_time;
+
+ puts( "TA1 - rtems_task_suspend - on Task 2" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_suspend - on Task 3" );
+ status = rtems_task_suspend( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_suspend of TA3" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &start_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ puts( "TA1 - killing time" );
+
+ for ( ; ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH, &end_time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( end_time > (start_time + 2) )
+ break;
+ }
+
+ puts( "TA1 - rtems_task_resume - on Task 2" );
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_resume of TA2" );
+
+ puts( "TA1 - rtems_task_resume - on Task 3" );
+ status = rtems_task_resume( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_resume of TA3" );
+
+ while ( FOREVER ) {
+ if ( Run_count[ 1 ] == 3 ) {
+ puts( "TA1 - rtems_task_mode - change mode to NO RTEMS_PREEMPT" );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ old_seconds = time.second;
+
+ for ( seconds = 0 ; seconds < 6 ; ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second != old_seconds ) {
+ old_seconds = time.second;
+ seconds++;
+ print_time( "TA1 - ", &time, "\n" );
+ }
+ }
+
+ puts( "TA1 - rtems_task_mode - change mode to RTEMS_PREEMPT" );
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ while ( FOREVER );
+ }
+ }
+}
diff --git a/testsuites/sptests/sp04/task2.c b/testsuites/sptests/sp04/task2.c
new file mode 100644
index 0000000000..245c5a29bb
--- /dev/null
+++ b/testsuites/sptests/sp04/task2.c
@@ -0,0 +1,29 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/testsuites/sptests/sp04/task3.c b/testsuites/sptests/sp04/task3.c
new file mode 100644
index 0000000000..424fb28d4f
--- /dev/null
+++ b/testsuites/sptests/sp04/task3.c
@@ -0,0 +1,29 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It is just a CPU bound task
+ * requiring timesliced operation.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ while( FOREVER );
+}
diff --git a/testsuites/sptests/sp04/tswitch.c b/testsuites/sptests/sp04/tswitch.c
new file mode 100644
index 0000000000..8697b9670a
--- /dev/null
+++ b/testsuites/sptests/sp04/tswitch.c
@@ -0,0 +1,59 @@
+/* Task_switch
+ *
+ * This routine is the tswitch user extension. It determines which
+ * task is being switched to and displays a message indicating the
+ * time and date that it gained control.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * heir - pointer to heir TCB
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_switch(
+ rtems_tcb *unused,
+ rtems_tcb *heir
+)
+{
+ rtems_unsigned32 index;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ index = task_number( heir->Object.id );
+
+ switch( index ) {
+ case 1:
+ case 2:
+ case 3:
+ Run_count[ index ] += 1;
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ index ], FALSE );
+ print_time( "- ", &time, "\n" );
+
+ if ( time.second >= 16 ) {
+ puts( "*** END OF TEST 4 ***" );
+ exit( 0 );
+ }
+ break;
+
+ case 0:
+ default:
+ break;
+ }
+}
diff --git a/testsuites/sptests/sp05/init.c b/testsuites/sptests/sp05/init.c
new file mode 100644
index 0000000000..10db3b6321
--- /dev/null
+++ b/testsuites/sptests/sp05/init.c
@@ -0,0 +1,81 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 5 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp05/sp05.doc b/testsuites/sptests/sp05/sp05.doc
new file mode 100644
index 0000000000..69c4a468b2
--- /dev/null
+++ b/testsuites/sptests/sp05/sp05.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test5
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident
+ tm_wkafter, t_suspend, t_resume
+
+concepts:
+
+ a. Verifies that a task can be suspended and resumed.
+
+ b. Verifies that a task can suspend itself.
diff --git a/testsuites/sptests/sp05/sp05.scn b/testsuites/sptests/sp05/sp05.scn
new file mode 100644
index 0000000000..40afb2d4b2
--- /dev/null
+++ b/testsuites/sptests/sp05/sp05.scn
@@ -0,0 +1,47 @@
+*** TEST 5 ***
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_suspend - suspend self
+TA3 - rtems_task_suspend - suspend self
+TA1 - rtems_task_suspend - suspend TA3
+TA1 - rtems_task_resume - resume TA2
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_resume - resume TA3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA3
+TA1 - rtems_task_resume - resume TA2
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_resume - resume TA3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA3 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA3
+TA1 - rtems_task_resume - resume TA2
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA2 - rtems_task_wake_after - sleep 1 second
+TA1 - rtems_task_suspend - suspend TA2
+TA1 - rtems_task_resume - resume TA3
+*** END OF TEST 5 ***
diff --git a/testsuites/sptests/sp05/system.h b/testsuites/sptests/sp05/system.h
new file mode 100644
index 0000000000..fa31776238
--- /dev/null
+++ b/testsuites/sptests/sp05/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp05/task1.c b/testsuites/sptests/sp05/task1.c
new file mode 100644
index 0000000000..878e1b447a
--- /dev/null
+++ b/testsuites/sptests/sp05/task1.c
@@ -0,0 +1,78 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies that tasks can
+ * be suspended and resumed.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * NOTE: The rtems_task_suspend() directives fail on the first iteration.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid2;
+ rtems_id tid3;
+ rtems_unsigned32 pass;
+ rtems_status_code status;
+
+ status = rtems_task_ident( Task_name[ 2 ], 1, &tid2 );
+ directive_failed( status, "rtems_task_ident of TA2" );
+
+ status = rtems_task_ident( Task_name[ 3 ], 1, &tid3 );
+ directive_failed( status, "rtems_task_ident of TA3" );
+
+ for ( pass=1 ; pass <= 3 ; pass++ ) {
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after of TA1" );
+
+ puts( "TA1 - rtems_task_suspend - suspend TA3" );
+ status = rtems_task_suspend( tid3 );
+ if ( pass == 1 ) {
+ fatal_directive_status(
+ status,
+ RTEMS_ALREADY_SUSPENDED,
+ "rtems_task_suspend of TA3"
+ );
+ } else {
+ directive_failed( status, "rtems_task_suspend of TA3" );
+ }
+
+ puts( "TA1 - rtems_task_resume - resume TA2" );
+ status = rtems_task_resume( tid2 );
+ directive_failed( status, "rtems_task_resume of TA2" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_suspend - suspend TA2" );
+ status = rtems_task_suspend( tid2 );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA1 - rtems_task_resume - resume TA3" );
+ status = rtems_task_resume( tid3 );
+ directive_failed( status, "rtems_task_resume" );
+ }
+
+ puts( "*** END OF TEST 5 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp05/task2.c b/testsuites/sptests/sp05/task2.c
new file mode 100644
index 0000000000..c631d53cd8
--- /dev/null
+++ b/testsuites/sptests/sp05/task2.c
@@ -0,0 +1,39 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Makes sure a task can suspend
+ * itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_task_suspend - suspend self" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ while( FOREVER ) {
+ puts( "TA2 - rtems_task_wake_after - sleep 1 second" );
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after of TA2" );
+ }
+}
diff --git a/testsuites/sptests/sp05/task3.c b/testsuites/sptests/sp05/task3.c
new file mode 100644
index 0000000000..e0af170ce3
--- /dev/null
+++ b/testsuites/sptests/sp05/task3.c
@@ -0,0 +1,39 @@
+/* Task_3
+ *
+ * This routine serves as a test task. Makes sure a task can suspend
+ * itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA3 - rtems_task_suspend - suspend self" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA3" );
+
+ while( FOREVER ) {
+ puts( "TA3 - rtems_task_wake_after - sleep 1 second" );
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after of TA3" );
+ }
+}
diff --git a/testsuites/sptests/sp06/init.c b/testsuites/sptests/sp06/init.c
new file mode 100644
index 0000000000..3471294562
--- /dev/null
+++ b/testsuites/sptests/sp06/init.c
@@ -0,0 +1,87 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+
+ puts( "\n\n*** TEST 6 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Argument = 0;
+ Restart_argument = 1;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, Argument );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, Argument );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_set_priority( Task_id[ 3 ], 5, &previous_priority );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp06/sp06.doc b/testsuites/sptests/sp06/sp06.doc
new file mode 100644
index 0000000000..e09b7c04f2
--- /dev/null
+++ b/testsuites/sptests/sp06/sp06.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test6
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ tm_wkafter, t_restart
+
+concepts:
+
+ a. Verifies that a task can restart a task other than itself.
+
+ b. Verifies that a task can restart itself.
diff --git a/testsuites/sptests/sp06/sp06.scn b/testsuites/sptests/sp06/sp06.scn
new file mode 100644
index 0000000000..64f6489dc8
--- /dev/null
+++ b/testsuites/sptests/sp06/sp06.scn
@@ -0,0 +1,40 @@
+*** TEST 6 ***
+TA1 - is beginning to run
+TA1 - restarting TA3
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting TA2
+TA2 - is beginning to run
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA2 - rtems_task_wake_after - sleep 1/2 second
+TA1 - rtems_task_restart - restarting self
+TA1 - is beginning to run
+*** END OF TEST 6 ***
+
+NOTE: The prints from TA2 may not be as regular as indicated in the screen.
+ The important point is that TA2 is running and gets restarted.
diff --git a/testsuites/sptests/sp06/system.h b/testsuites/sptests/sp06/system.h
new file mode 100644
index 0000000000..e2065c8196
--- /dev/null
+++ b/testsuites/sptests/sp06/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_task_argument Argument; /* generic task argument */
+TEST_EXTERN rtems_task_argument Restart_argument; /* task 1 restart argument */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp06/task1.c b/testsuites/sptests/sp06/task1.c
new file mode 100644
index 0000000000..033b33b348
--- /dev/null
+++ b/testsuites/sptests/sp06/task1.c
@@ -0,0 +1,61 @@
+/* Task_1
+ *
+ * This task serves as a test task. Verifies that a task can restart
+ * both itself and other tasks.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1( argument )
+rtems_unsigned32 argument;
+{
+ rtems_unsigned32 pass;
+ rtems_status_code status;
+
+ puts( "TA1 - is beginning to run" );
+
+ pass = argument + 1;
+
+ if ( pass == 5 ) {
+ puts( "*** END OF TEST 6 ***" );
+ exit( 0 );
+ }
+
+ if ( pass == 1 ) {
+ puts( "TA1 - restarting TA3" );
+ status = rtems_task_restart( Task_id[ 3 ], Restart_argument );
+ directive_failed( status, "rtems_task_restart of TA3" );
+
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_restart - restarting TA2" );
+ status = rtems_task_restart( Task_id[ 2 ], Restart_argument );
+ directive_failed( status, "rtems_task_restart TA2" );
+
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_restart - restarting self" );
+ status = rtems_task_restart( Task_id[ 1 ], pass );
+ directive_failed( status, "rtems_task_restart of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp06/task2.c b/testsuites/sptests/sp06/task2.c
new file mode 100644
index 0000000000..04d16dbffc
--- /dev/null
+++ b/testsuites/sptests/sp06/task2.c
@@ -0,0 +1,40 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It simply runs forever so
+ * another task can restart it.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2( argument )
+rtems_task_argument argument;
+{
+ rtems_status_code status;
+
+ puts( "TA2 - is beginning to run" );
+ if ( argument == Argument ) {
+ status = rtems_task_wake_after( 2 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+
+ while( FOREVER ) {
+ puts( "TA2 - rtems_task_wake_after - sleep 1/2 second" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND / 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/testsuites/sptests/sp06/task3.c b/testsuites/sptests/sp06/task3.c
new file mode 100644
index 0000000000..21da8aea9f
--- /dev/null
+++ b/testsuites/sptests/sp06/task3.c
@@ -0,0 +1,32 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It is started, has its priority
+ * changed, and when it runs it deletes itself.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp07/init.c b/testsuites/sptests/sp07/init.c
new file mode 100644
index 0000000000..545bace5a7
--- /dev/null
+++ b/testsuites/sptests/sp07/init.c
@@ -0,0 +1,128 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_extensions_table Extensions = {
+ Task_create_extension, /* task create user extension */
+ Task_start_extension, /* task start user extension */
+ Task_restart_extension, /* task restart user extension */
+ Task_delete_extension, /* task delete user extension */
+ NULL, /* task switch user extension */
+ NULL, /* begin user extension */
+ Task_exit_extension, /* task exitted user extension */
+ NULL /* fatal error extension */
+};
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 7 ***" );
+
+ Extension_name[ 1 ] = rtems_build_name( 'E', 'X', 'T', ' ' );
+
+ status = rtems_extension_create(
+ Extension_name[ 1 ],
+ &Extensions,
+ &Extension_id[ 1 ]
+ );
+ directive_failed( status, "rtems_extension_create" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_restart( Task_id[ 3 ], 0 );
+ directive_failed( status, "rtems_task_restart of TA3" );
+
+ status = rtems_task_set_note( Task_id[ 1 ], RTEMS_NOTEPAD_8, 4 );
+ directive_failed( status, "task_set_node of TA1" );
+ printf( "INIT - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8 " );
+ puts ( "to TA1's priority: 04" );
+
+ status = rtems_task_set_note( Task_id[ 2 ], RTEMS_NOTEPAD_8, 4 );
+ directive_failed( status, "task_set_node of TA2" );
+ printf( "INIT - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8 " );
+ puts ( "to TA2's priority: 04");
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp07/sp07.doc b/testsuites/sptests/sp07/sp07.doc
new file mode 100644
index 0000000000..01af734c06
--- /dev/null
+++ b/testsuites/sptests/sp07/sp07.doc
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test7
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ t_delete, t_setreg, t_getreg, t_setpri, t_suspend
+
+concepts:
+
+ a. Verifies that tasks can communicate with each other via the
+ t_setreg and t_getreg directives.
+
+ b. Verifies that the highest priority task is dispatched to execute.
+
+ c. Verifies setting the priority of both a ready and a blocked task.
+
+ d. Verifies the deletion of ready and blocked tasks.
+
+ e. Verifies the tcreate user extension.
+
+ f. Verifies the tstart user extension.
+
+ g. Verifies the tdelete user extension.
diff --git a/testsuites/sptests/sp07/sp07.scn b/testsuites/sptests/sp07/sp07.scn
new file mode 100644
index 0000000000..1f6de2d93d
--- /dev/null
+++ b/testsuites/sptests/sp07/sp07.scn
@@ -0,0 +1,33 @@
+*** TEST 7 ***
+TASK_CREATE - TA1 - created.
+TASK_CREATE - TA2 - created.
+TASK_CREATE - TA3 - created.
+TASK_CREATE - TA4 - created.
+TASK_START - TA1 - started.
+TASK_START - TA2 - started.
+TASK_START - TA3 - started.
+TASK_START - TA4 - started.
+TASK_RESTART - TA3 - restarted.
+INIT - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8 to TA1's priority: 04
+INIT - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8 to TA2's priority: 04
+<pause>
+TA1 - rtems_task_set_priority - get initial priority of self: 04
+TA1 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 04
+TA1 - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8: 03
+TA1 - rtems_task_set_priority - set TA2's priority: 03
+TA2 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 03
+TA2 - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8: 02
+TA2 - rtems_task_set_priority - set TA1's priority: 02
+TA1 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 02
+TA1 - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8: 01
+TA1 - rtems_task_set_priority - set TA2's priority: 01
+TA2 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 01
+TA2 - rtems_task_suspend - suspend TA1
+TA2 - rtems_task_set_priority - set priority of TA1 ( blocked )
+TASK_DELETE - TA2 deleting TA1
+TASK_DELETE - TA2 deleting TA3
+TASK_DELETE - TA2 deleting TA2
+TA4 - exitting task
+RTEMS_TASK_EXITTED - extension invoked for TA4
+*** END OF TEST 7 ***
+TASK_DELETE - TA4 deleting TA4 <---- may not appear
diff --git a/testsuites/sptests/sp07/system.h b/testsuites/sptests/sp07/system.h
new file mode 100644
index 0000000000..89bc8ac9b6
--- /dev/null
+++ b/testsuites/sptests/sp07/system.h
@@ -0,0 +1,87 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_boolean Task_create_extension(
+ rtems_tcb *unused,
+ rtems_tcb *created_task
+);
+
+rtems_extension Task_delete_extension(
+ rtems_tcb *running_task,
+ rtems_tcb *deleted_task
+);
+
+rtems_extension Task_restart_extension(
+ rtems_tcb *unused,
+ rtems_tcb *restarted_task
+);
+
+rtems_extension Task_start_extension(
+ rtems_tcb *unused,
+ rtems_tcb *started_task
+);
+
+rtems_extension Task_exit_extension(
+ rtems_tcb *running_task
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 5 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 5 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Extension_id[ 4 ];
+TEST_EXTERN rtems_name Extension_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp07/task1.c b/testsuites/sptests/sp07/task1.c
new file mode 100644
index 0000000000..a829d68218
--- /dev/null
+++ b/testsuites/sptests/sp07/task1.c
@@ -0,0 +1,85 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies intertask communication
+ * using task notepads and verifies the the user extensions (tcreate, etc).
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority the_priority;
+ rtems_task_priority previous_priority;
+
+ rtems_test_pause();
+
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ RTEMS_CURRENT_PRIORITY,
+ &the_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ printf(
+ "TA1 - rtems_task_set_priority - get initial priority of self: %02d\n",
+ the_priority
+ );
+
+ while( FOREVER ) {
+ status = rtems_task_get_note( RTEMS_SELF, RTEMS_NOTEPAD_8, &the_priority );
+ directive_failed( status, "rtems_task_get_note" );
+ printf(
+"TA1 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: %02d\n",
+ the_priority
+ );
+
+ if ( --the_priority == 0 ) {
+ puts( "TA1 - rtems_task_suspend - suspend TA2" );
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend" );
+
+ puts( "TA1 - rtems_task_set_priority - set priority of TA2 ( blocked )" );
+ status = rtems_task_set_priority( Task_id[ 2 ], 5, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of TA2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+ }
+
+ printf( "TA1 - rtems_task_set_note - set TA2's RTEMS_NOTEPAD_8: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_note( Task_id[ 2 ], RTEMS_NOTEPAD_8, the_priority );
+ directive_failed( status, "rtems_task_set_note" );
+
+ printf( "TA1 - rtems_task_set_priority - set TA2's priority: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_priority(
+ Task_id[ 2 ],
+ the_priority,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ }
+}
diff --git a/testsuites/sptests/sp07/task2.c b/testsuites/sptests/sp07/task2.c
new file mode 100644
index 0000000000..54a575b5d0
--- /dev/null
+++ b/testsuites/sptests/sp07/task2.c
@@ -0,0 +1,78 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Plays with priorities to verify
+ * that the highest priority task is always executed.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority the_priority;
+ rtems_task_priority previous_priority;
+
+ while( FOREVER ) {
+
+ status = rtems_task_get_note( RTEMS_SELF, RTEMS_NOTEPAD_8, &the_priority );
+ directive_failed( status, "rtems_task_get_note" );
+ printf(
+"TA2 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: %02d\n",
+ the_priority
+ );
+
+ if ( --the_priority == 0 ) {
+ puts( "TA2 - rtems_task_suspend - suspend TA1" );
+ status = rtems_task_suspend( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_suspend" );
+
+ puts( "TA2 - rtems_task_set_priority - set priority of TA1 ( blocked )" );
+ status = rtems_task_set_priority( Task_id[ 1 ], 5, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_task_delete( Task_id[ 1 ] ); /* TA1 is blocked */
+ directive_failed( status, "rtems_task_delete of TA1" );
+
+ status = rtems_task_delete( Task_id[ 3 ] ); /* TA3 is ready */
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of SELD" );
+
+ } else {
+
+ printf( "TA2 - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_note(Task_id[ 1 ], RTEMS_NOTEPAD_8, the_priority);
+ directive_failed( status, "rtems_task_set_note" );
+
+ printf( "TA2 - rtems_task_set_priority - set TA1's priority: %02d\n",
+ the_priority
+ );
+ status = rtems_task_set_priority(
+ Task_id[ 1 ],
+ the_priority,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+ }
+ }
+}
diff --git a/testsuites/sptests/sp07/task3.c b/testsuites/sptests/sp07/task3.c
new file mode 100644
index 0000000000..f725488aaa
--- /dev/null
+++ b/testsuites/sptests/sp07/task3.c
@@ -0,0 +1,34 @@
+/* Task_3
+ *
+ * This routine serves as a low priority test task that should never
+ * execute.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ while( FOREVER ) {
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/testsuites/sptests/sp07/task4.c b/testsuites/sptests/sp07/task4.c
new file mode 100644
index 0000000000..9405a0a1f5
--- /dev/null
+++ b/testsuites/sptests/sp07/task4.c
@@ -0,0 +1,30 @@
+/* Task_4
+ *
+ * This routine serves as a low priority test task that should exit
+ * a soon as it runs to test the taskexitted user extension.
+ * execute.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ puts( "TA4 - exitting task" );
+}
diff --git a/testsuites/sptests/sp07/taskexit.c b/testsuites/sptests/sp07/taskexit.c
new file mode 100644
index 0000000000..27977432b8
--- /dev/null
+++ b/testsuites/sptests/sp07/taskexit.c
@@ -0,0 +1,33 @@
+/* Task_exit_extension
+ *
+ * This routine is the task exitted user extension.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_exit_extension(
+ rtems_tcb *running_task
+)
+{
+ if ( task_number( running_task->Object.id ) > 0 ) {
+ puts_nocr( "RTEMS_TASK_EXITTED - extension invoked for " );
+ put_name( Task_name[ task_number( running_task->Object.id ) ], TRUE );
+ }
+
+ puts("*** END OF TEST 7 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp07/tcreate.c b/testsuites/sptests/sp07/tcreate.c
new file mode 100644
index 0000000000..6e17e3ca56
--- /dev/null
+++ b/testsuites/sptests/sp07/tcreate.c
@@ -0,0 +1,35 @@
+/* Task_create_extension
+ *
+ * This routine is the tcreate user extension.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * created_task - pointer to new TCB being created
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_boolean Task_create_extension(
+ rtems_tcb *unused,
+ rtems_tcb *created_task
+)
+{
+ if ( task_number( created_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_CREATE - " );
+ put_name( Task_name[ task_number( created_task->Object.id ) ], FALSE );
+ puts( " - created." );
+ }
+ return TRUE;
+}
diff --git a/testsuites/sptests/sp07/tdelete.c b/testsuites/sptests/sp07/tdelete.c
new file mode 100644
index 0000000000..ba59d6be7d
--- /dev/null
+++ b/testsuites/sptests/sp07/tdelete.c
@@ -0,0 +1,37 @@
+/* Task_delete_extension
+ *
+ * This routine is the delete user extension.
+ *
+ * Input parameters:
+ * running_task - pointer to running TCB
+ * deleted_task - pointer to TCB deleted
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_delete_extension(
+ rtems_tcb *running_task,
+ rtems_tcb *deleted_task
+)
+{
+ if ( task_number( running_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_DELETE - " );
+ put_name( Task_name[ task_number( running_task->Object.id ) ], FALSE );
+ }
+ if ( task_number( deleted_task->Object.id ) > 0 ) {
+ puts_nocr( " deleting " );
+ put_name( Task_name[ task_number( deleted_task->Object.id ) ], TRUE );
+ }
+}
diff --git a/testsuites/sptests/sp07/trestart.c b/testsuites/sptests/sp07/trestart.c
new file mode 100644
index 0000000000..0e93ae506c
--- /dev/null
+++ b/testsuites/sptests/sp07/trestart.c
@@ -0,0 +1,34 @@
+/* Task_restart_extension
+ *
+ * This routine is the trestart user extension.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * restarted_task - pointer to new TCB being started
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Task_restart_extension(
+ rtems_tcb *unused,
+ rtems_tcb *restarted_task
+)
+{
+ if ( task_number( restarted_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_RESTART - " );
+ put_name( Task_name[ task_number( restarted_task->Object.id ) ], FALSE );
+ puts( " - restarted." );
+ }
+}
diff --git a/testsuites/sptests/sp07/tstart.c b/testsuites/sptests/sp07/tstart.c
new file mode 100644
index 0000000000..0143260c4a
--- /dev/null
+++ b/testsuites/sptests/sp07/tstart.c
@@ -0,0 +1,34 @@
+/* Task_start_extension
+ *
+ * This routine is the tstart user extension.
+ *
+ * Input parameters:
+ * unused - pointer to currently running TCB
+ * started_task - pointer to new TCB being started
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_extension Task_start_extension(
+ rtems_tcb *unused,
+ rtems_tcb *started_task
+)
+{
+ if ( task_number( started_task->Object.id ) > 0 ) {
+ puts_nocr( "TASK_START - " );
+ put_name( Task_name[ task_number( started_task->Object.id ) ], FALSE );
+ puts( " - started." );
+ }
+}
diff --git a/testsuites/sptests/sp08/init.c b/testsuites/sptests/sp08/init.c
new file mode 100644
index 0000000000..0e235a9bc9
--- /dev/null
+++ b/testsuites/sptests/sp08/init.c
@@ -0,0 +1,53 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 8 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp08/sp08.doc b/testsuites/sptests/sp08/sp08.doc
new file mode 100644
index 0000000000..72db2a37f9
--- /dev/null
+++ b/testsuites/sptests/sp08/sp08.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test8
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return,
+ t_mode
+
+concepts:
+
+ a. Verifies every mode change possible.
+
+ b. Verifies the fatal error handler.
diff --git a/testsuites/sptests/sp08/sp08.scn b/testsuites/sptests/sp08/sp08.scn
new file mode 100644
index 0000000000..d85ccc384f
--- /dev/null
+++ b/testsuites/sptests/sp08/sp08.scn
@@ -0,0 +1,22 @@
+*** TEST 8 ***
+TA1 - rtems_task_mode - RTEMS_ASR - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: 00000400
+TA1 - rtems_task_mode - RTEMS_ASR - previous mode: 00000400
+TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: 00000200
+TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: 00000200
+TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: 00000100
+TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: 00000100
+TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 3 ) - previous mode: 00000000
+TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 5 ) - previous mode: 00000003
+TA1 - rtems_task_mode - set all modes - previous mode: 00000005
+TA1 - rtems_task_mode - set all modes - previous mode: 00000703
+TA1 - rtems_task_mode - clear all modes - previous mode: 00000703
+TA1 - rtems_task_mode - get current mode - previous mode: 00000000
+*** END OF TEST 8 ***
+
+NOTE: The interrupt level lines will be different on CPUs with few levels.
diff --git a/testsuites/sptests/sp08/system.h b/testsuites/sptests/sp08/system.h
new file mode 100644
index 0000000000..2e43da787f
--- /dev/null
+++ b/testsuites/sptests/sp08/system.h
@@ -0,0 +1,50 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+#define put_mode( _comment, _output_mode ) \
+ printf( "%s %08x\n", _comment, _output_mode );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp08/task1.c b/testsuites/sptests/sp08/task1.c
new file mode 100644
index 0000000000..d2031fdde2
--- /dev/null
+++ b/testsuites/sptests/sp08/task1.c
@@ -0,0 +1,256 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies all combinations of
+ * task mode changes.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+/* BEGINNING OF RTEMS_ASR */
+
+ status = rtems_task_mode( RTEMS_ASR, RTEMS_ASR_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_ASR - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_ASR,
+ RTEMS_ASR_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_ASR,
+ RTEMS_ASR_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_ASR - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_ASR,
+ RTEMS_ASR_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_ASR - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_ASR */
+
+/* BEGINNING OF RTEMS_TIMESLICE */
+
+ status = rtems_task_mode(
+ RTEMS_NO_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_TIMESLICE,
+ RTEMS_TIMESLICE_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_TIMESLICE - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_TIMESLICE */
+
+/* BEGINNING OF RTEMS_PREEMPT */
+
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_NO_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_PREEMPT - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_PREEMPT */
+
+/* BEGINNING OF RTEMS_INTERRUPT_LEVEL */
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(3),
+ RTEMS_INTERRUPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 3 ) - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(5),
+ RTEMS_INTERRUPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - RTEMS_INTERRUPT_LEVEL( 5 ) - previous mode: ",
+ previous_mode
+ );
+
+/* END OF RTEMS_INTERRUPT_LEVEL */
+
+/* BEGINNING OF COMBINATIONS */
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(3) | RTEMS_NO_ASR |
+ RTEMS_TIMESLICE | RTEMS_NO_PREEMPT,
+ RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
+ RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - set all modes - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(3) | RTEMS_NO_ASR |
+ RTEMS_TIMESLICE | RTEMS_NO_PREEMPT,
+ RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
+ RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - set all modes - previous mode: ",
+ previous_mode
+ );
+
+ status = rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(0) | RTEMS_ASR | RTEMS_NO_TIMESLICE | RTEMS_PREEMPT,
+ RTEMS_INTERRUPT_MASK | RTEMS_ASR_MASK |
+ RTEMS_TIMESLICE_MASK | RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - clear all modes - previous mode: ",
+ previous_mode
+ );
+
+/* END OF COMBINATIONS */
+
+/* BEGINNING OF CURRENT MODE */
+
+ status = rtems_task_mode(
+ RTEMS_CURRENT_MODE,
+ RTEMS_CURRENT_MODE,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+ put_mode(
+ "TA1 - rtems_task_mode - get current mode - previous mode: ",
+ previous_mode
+ );
+
+/* END OF CURRENT MODE */
+
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp09/delay.c b/testsuites/sptests/sp09/delay.c
new file mode 100644
index 0000000000..a21516f216
--- /dev/null
+++ b/testsuites/sptests/sp09/delay.c
@@ -0,0 +1,28 @@
+/* Delayed_routine
+ *
+ * This routine is used as the timer routine for Timer Manager tests.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_routine(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+}
diff --git a/testsuites/sptests/sp09/init.c b/testsuites/sptests/sp09/init.c
new file mode 100644
index 0000000000..c0ff9d86c1
--- /dev/null
+++ b/testsuites/sptests/sp09/init.c
@@ -0,0 +1,120 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 9 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+ Task_name[ 6 ] = rtems_build_name( 'T', 'A', '6', ' ' );
+ Task_name[ 7 ] = rtems_build_name( 'T', 'A', '7', ' ' );
+ Task_name[ 8 ] = rtems_build_name( 'T', 'A', '8', ' ' );
+ Task_name[ 9 ] = rtems_build_name( 'T', 'A', '9', ' ' );
+ Task_name[ 10 ] = rtems_build_name( 'T', 'A', 'A', ' ' );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'M', '1', ' ' );
+ Semaphore_name[ 2 ] = rtems_build_name( 'S', 'M', '2', ' ' );
+ Semaphore_name[ 3 ] = rtems_build_name( 'S', 'M', '3', ' ' );
+
+ Queue_name[ 1 ] = rtems_build_name( 'M', 'Q', '1', ' ' );
+ Queue_name[ 2 ] = rtems_build_name( 'M', 'Q', '2', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'T', '1', ' ' );
+
+ Region_name[ 1 ] = rtems_build_name( 'R', 'N', '1', ' ' );
+
+ Port_name[ 1 ] = rtems_build_name( 'D', 'P', '1', ' ' );
+
+ Period_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+#if 0
+ status = rtems_task_create(
+ Task_name[1],
+ 4,
+ 10,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_task_create with illegal stack size"
+ );
+ puts( "INIT - rtems_task_create - RTEMS_INVALID_SIZE" );
+#endif
+ puts( "INIT - rtems_task_create - RTEMS_INVALID_SIZE -- NOT CHECKED" );
+
+ status = rtems_task_create(
+ Task_name[1],
+ 0,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_PRIORITY,
+ "rtems_task_create with illegal priority"
+ );
+ puts( "INIT - rtems_task_create - RTEMS_INVALID_PRIORITY" );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 3,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_restart( Task_id[ 1 ], 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INCORRECT_STATE,
+ "rtems_task_restart of DORMANT task"
+ );
+ puts( "INIT - rtems_task_restart - RTEMS_INCORRECT_STATE" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp09/isr.c b/testsuites/sptests/sp09/isr.c
new file mode 100644
index 0000000000..d829ff8944
--- /dev/null
+++ b/testsuites/sptests/sp09/isr.c
@@ -0,0 +1,27 @@
+/* Service_routine
+ *
+ * This routine is used as the timer routine for Interrupt Manager tests.
+ *
+ * Input parameters:
+ * ignored - this parameter is ignored
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_isr Service_routine(
+ rtems_vector_number ignored
+)
+{
+}
diff --git a/testsuites/sptests/sp09/screen01.c b/testsuites/sptests/sp09/screen01.c
new file mode 100644
index 0000000000..25e4f58591
--- /dev/null
+++ b/testsuites/sptests/sp09/screen01.c
@@ -0,0 +1,168 @@
+/* Screen1
+ *
+ * This routine generates error screen 1 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen1()
+{
+ rtems_unsigned32 notepad_value;
+ rtems_id self_id;
+ rtems_task_priority previous_priority;
+ rtems_status_code status;
+
+ status = rtems_task_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_delete with illegal id"
+ );
+ puts( "TA1 - rtems_task_delete - RTEMS_INVALID_ID" );
+
+ status = rtems_task_get_note( RTEMS_SELF, 100, &notepad_value );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_task_get_note with illegal notepad"
+ );
+ puts( "TA1 - rtems_task_get_note - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_task_get_note( 100, RTEMS_NOTEPAD_LAST, &notepad_value );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_get_note with illegal id"
+ );
+ puts( "TA1 - rtems_task_get_note - RTEMS_INVALID_ID" );
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &self_id );
+ directive_failed( status, "rtems_task_ident of self" );
+
+ if ( self_id != Task_id[ 1 ] ) {
+ puts( "ERROR - rtems_task_ident - incorrect ID returned!" );
+ }
+ puts( "TA1 - rtems_task_ident - current task RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_ident( 100, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_task_ident with illegal name (local)"
+ );
+ puts( "TA1 - rtems_task_ident - global RTEMS_INVALID_NAME" );
+
+ status = rtems_task_ident( 100, 1, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_task_ident with illegal name (global)"
+ );
+ puts( "TA1 - rtems_task_ident - local RTEMS_INVALID_NAME" );
+
+ status = rtems_task_ident( 100, 2, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NODE,
+ "rtems_task_ident with illegal node"
+ );
+ puts( "TA1 - rtems_task_ident - RTEMS_INVALID_NODE" );
+
+ status = rtems_task_restart( 100, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_restart with illegal id"
+ );
+ puts( "TA1 - rtems_task_restart - RTEMS_INVALID_ID" );
+
+ status = rtems_task_resume( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_resume with illegal id"
+ );
+ puts( "TA1 - rtems_task_resume - RTEMS_INVALID_ID" );
+
+ status = rtems_task_resume( RTEMS_SELF );
+ fatal_directive_status(
+ status,
+ RTEMS_INCORRECT_STATE,
+ "rtems_task_resume of ready task"
+ );
+ puts( "TA1 - rtems_task_resume - RTEMS_INCORRECT_STATE" );
+
+ status = rtems_task_set_priority( RTEMS_SELF, 512, &previous_priority );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_PRIORITY,
+ "rtems_task_set_priority with illegal priority"
+ );
+ puts( "TA1 - rtems_task_set_priority - RTEMS_INVALID_PRIORITY" );
+
+ status = rtems_task_set_priority( 100, 8, &previous_priority );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_set_priority with illegal id"
+ );
+ puts( "TA1 - rtems_task_set_priority - RTEMS_INVALID_ID" );
+
+ status = rtems_task_set_note(
+ RTEMS_SELF,
+ RTEMS_NOTEPAD_LAST+10,
+ notepad_value
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_task_set_note with illegal notepad"
+ );
+ puts( "TA1 - rtems_task_set_note - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_task_set_note( 100, RTEMS_NOTEPAD_LAST, notepad_value );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_set_note with illegal id"
+ );
+ puts( "TA1 - rtems_task_set_note - RTEMS_INVALID_ID" );
+
+ status = rtems_task_start( 100, Task_1, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_start with illegal id"
+ );
+ puts( "TA1 - rtems_task_start - RTEMS_INVALID_ID" );
+
+ status = rtems_task_start( 0, Task_1, 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INCORRECT_STATE,
+ "rtems_task_start of ready task"
+ );
+ puts( "TA1 - rtems_task_start - RTEMS_INCORRECT_STATE" );
+
+ status = rtems_task_suspend( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_suspend with illegal id"
+ );
+ puts( "TA1 - rtems_task_suspend - RTEMS_INVALID_ID" );
+}
diff --git a/testsuites/sptests/sp09/screen02.c b/testsuites/sptests/sp09/screen02.c
new file mode 100644
index 0000000000..2b4cd3142e
--- /dev/null
+++ b/testsuites/sptests/sp09/screen02.c
@@ -0,0 +1,192 @@
+/* Screen2
+ *
+ * This routine generates error screen 2 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen2()
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+/* errors before clock is set */
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ puts(
+ "TA1 - rtems_clock_get - RTEMS_NOT_DEFINED -- DID BSP SET THE TIME OF DAY?"
+ );
+ } else {
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_clock_get before clock is set"
+ );
+ puts( "TA1 - rtems_clock_get - RTEMS_NOT_DEFINED" );
+ }
+
+ status = rtems_task_wake_when( &time );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ puts(
+"TA1 - rtems_task_wake_when - RTEMS_NOT_DEFINED -- DID BSP SET THE TIME OF DAY?"
+ );
+ } else {
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_task_wake_when before clock is set"
+ );
+ puts( "TA1 - rtems_task_wake_when - RTEMS_NOT_DEFINED" );
+ }
+
+ status = rtems_timer_fire_when( 0, &time, Delayed_routine, NULL );
+ if ( status == RTEMS_SUCCESSFUL ) {
+ puts(
+ "TA1 - timer_wake_when - RTEMS_NOT_DEFINED -- DID BSP SET THE TIME OF DAY?"
+ );
+ } else {
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "task_fire_when before clock is set"
+ );
+ puts( "TA1 - rtems_timer_fire_when - RTEMS_NOT_DEFINED" );
+ }
+
+ build_time( &time, 2, 5, 1987, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid year"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 15, 5, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid month"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 32, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid day"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 25, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid hour"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 61, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid minute"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 61, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid second"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 45, TICKS_PER_SECOND + 1 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_clock_set with invalid ticks per second"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set successful" );
+ puts( " - RTEMS_SUCCESSFUL" );
+
+/* rtems_task_wake_when */
+
+ build_time( &time, 2, 5, 1988, 8, 30, 48, TICKS_PER_SECOND + 1 );
+ time.second += 3;
+ puts( "TA1 - rtems_task_wake_when - TICKINVALID - sleep about 3 seconds" );
+
+ status = rtems_task_wake_when( &time );
+ directive_failed(
+ status,
+ "rtems_task_wake_when with invalid ticks per second"
+ );
+ puts( "TA1 - rtems_task_wake_when - TICKINVALID - woke up RTEMS_SUCCESSFUL" );
+
+ build_time( &time, 2, 5, 1961, 8, 30, 48, 0 );
+ print_time( "TA1 - rtems_task_wake_when - ", &time, "" );
+ status = rtems_task_wake_when( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_task_wake_when with invalid year"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ build_time( &time, 2, 5, 1988, 25, 30, 48, 0 );
+ print_time( "TA1 - rtems_task_wake_when - ", &time, "" );
+ status = rtems_task_wake_when( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_task_wake_when with invalid hour"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+
+ rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ print_time( "TA1 - current time - ", &time, "\n" );
+
+ time.month = 1;
+ print_time( "TA1 - rtems_task_wake_when - ", &time, "" );
+ status = rtems_task_wake_when( &time );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_task_wake_when before current time"
+ );
+ puts( " - RTEMS_INVALID_CLOCK" );
+}
diff --git a/testsuites/sptests/sp09/screen03.c b/testsuites/sptests/sp09/screen03.c
new file mode 100644
index 0000000000..2c0b44a517
--- /dev/null
+++ b/testsuites/sptests/sp09/screen03.c
@@ -0,0 +1,217 @@
+/* Screen3
+ *
+ * This routine generates error screen 3 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+extern rtems_configuration_table BSP_Configuration;
+extern rtems_cpu_table _CPU_Table;
+
+void Screen3()
+{
+ rtems_name task_name;
+ rtems_status_code status;
+
+ task_name = 1;
+ status = rtems_task_create(
+ 0,
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_task_create with illegal name"
+ );
+ puts( "TA1 - rtems_task_create - RTEMS_INVALID_NAME" );
+
+ /*
+ * If the bsp provides its own stack allocator, then
+ * skip the test that tries to allocate a stack that is too big.
+ */
+
+ if (_CPU_Table.stack_allocate_hook)
+ {
+ puts( "TA1 - rtems_task_create - stack size - RTEMS_UNSATISFIED -- SKIPPED" );
+ }
+ else
+ {
+ status = rtems_task_create(
+ task_name,
+ 1,
+ BSP_Configuration.work_space_size,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_task_create with a stack size larger than the workspace"
+ );
+ puts( "TA1 - rtems_task_create - stack size - RTEMS_UNSATISFIED" );
+ }
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+ puts( "TA1 - rtems_task_create - TA2 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+ puts( "TA1 - rtems_task_suspend - suspend TA2 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_suspend( Task_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_ALREADY_SUSPENDED,
+ "rtems_task_suspend of suspended TA2"
+ );
+ puts( "TA1 - rtems_task_suspend - suspend TA2 - RTEMS_ALREADY_SUSPENDED" );
+
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_resume of TA2" );
+ puts( "TA1 - rtems_task_resume - TA2 resumed - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+ puts( "TA1 - rtems_task_create - TA3 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+ puts( "TA1 - rtems_task_create - 4 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+ puts( "TA1 - rtems_task_create - 5 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 6 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 6 ]
+ );
+ directive_failed( status, "rtems_task_create of TA6" );
+ puts( "TA1 - rtems_task_create - 6 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 7 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 7 ]
+ );
+ directive_failed( status, "rtems_task_create of TA7" );
+ puts( "TA1 - rtems_task_create - 7 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 8 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 8 ]
+ );
+ directive_failed( status, "rtems_task_create of TA8" );
+ puts( "TA1 - rtems_task_create - 8 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 9 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 9 ]
+ );
+ directive_failed( status, "rtems_task_create of TA9" );
+ puts( "TA1 - rtems_task_create - 9 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ Task_name[ 10 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 10 ]
+ );
+ directive_failed( status, "rtems_task_create of TA10" );
+ puts( "TA1 - rtems_task_create - 10 created - RTEMS_SUCCESSFUL" );
+
+ status = rtems_task_create(
+ task_name,
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_task_create for too many tasks"
+ );
+ puts( "TA1 - rtems_task_create - 11 - RTEMS_TOO_MANY" );
+
+ status = rtems_task_create(
+ task_name,
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_task_create of global task in a single cpu system"
+ );
+ puts( "TA1 - rtems_task_create - RTEMS_MP_NOT_CONFIGURED" );
+}
diff --git a/testsuites/sptests/sp09/screen04.c b/testsuites/sptests/sp09/screen04.c
new file mode 100644
index 0000000000..0dd78deed9
--- /dev/null
+++ b/testsuites/sptests/sp09/screen04.c
@@ -0,0 +1,85 @@
+/* Screen4
+ *
+ * This routine generates error screen 4 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen4()
+{
+ rtems_event_set event_out;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive unsatisfied (ALL)"
+ );
+ puts( "TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( all conditions )" );
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_EVENT_ANY | RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive unsatisfied (ANY)"
+ );
+ puts( "TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( any condition )" );
+
+ puts( "TA1 - rtems_event_receive - timeout in 3 seconds" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND,
+ &event_out
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_event_receive"
+ );
+ puts( "TA1 - rtems_event_receive - woke up with RTEMS_TIMEOUT" );
+
+ status = rtems_event_send( 100, RTEMS_EVENT_16 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_event_send with illegal id"
+ );
+ puts( "TA1 - rtems_event_send - RTEMS_INVALID_ID" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 1 second - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ build_time( &time, 2, 5, 1988, 8, 30, 45, 0 );
+ print_time( "TA1 - rtems_clock_set - ", &time, "" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ puts( " - RTEMS_SUCCESSFUL" );
+}
diff --git a/testsuites/sptests/sp09/screen05.c b/testsuites/sptests/sp09/screen05.c
new file mode 100644
index 0000000000..1070e654bf
--- /dev/null
+++ b/testsuites/sptests/sp09/screen05.c
@@ -0,0 +1,164 @@
+/* Screen5
+ *
+ * This routine generates error screen 5 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen5()
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_create(
+ 0,
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_semaphore_create with illegal name"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+ puts( "TA1 - rtems_semaphore_create - 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 1,
+ RTEMS_BINARY_SEMAPHORE,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+ puts( "TA1 - rtems_semaphore_create - 2 - RTEMS_SUCCESSFUL" );
+
+ do {
+ status = rtems_semaphore_create(
+ Semaphore_name[ 3 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ } while (status == RTEMS_SUCCESSFUL);
+
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_semaphore_create of too many"
+ );
+ puts( "TA1 - rtems_semaphore_create - 3 - RTEMS_TOO_MANY" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_INHERIT_PRIORITY | RTEMS_BINARY_SEMAPHORE | RTEMS_FIFO,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_semaphore_create of RTEMS_FIFO RTEMS_INHERIT_PRIORITY"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_INHERIT_PRIORITY | RTEMS_COUNTING_SEMAPHORE | RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_semaphore_create of RTEMS_COUNTING_SEMAPHORE RTEMS_INHERIT_PRIORITY"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 2,
+ RTEMS_BINARY_SEMAPHORE,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_semaphore_create of binary semaphore with count > 1"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 3 ],
+ 1,
+ RTEMS_GLOBAL,
+ RTEMS_NO_PRIORITY,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_semaphore_create of mp not configured"
+ );
+ puts( "TA1 - rtems_semaphore_create - RTEMS_MP_NOT_CONFIGURED" );
+
+ status = rtems_semaphore_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_delete with illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_semaphore_delete( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_delete with local illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_semaphore_ident( 100, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_semaphore_ident will illegal name (local)"
+ );
+ puts( "TA1 - rtems_semaphore_ident - global RTEMS_INVALID_NAME" );
+
+ status = rtems_semaphore_ident( 100, 1, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_semaphore_ident will illegal name (global)"
+ );
+ puts( "TA1 - rtems_semaphore_ident - local RTEMS_INVALID_NAME" );
+}
diff --git a/testsuites/sptests/sp09/screen06.c b/testsuites/sptests/sp09/screen06.c
new file mode 100644
index 0000000000..967b68b867
--- /dev/null
+++ b/testsuites/sptests/sp09/screen06.c
@@ -0,0 +1,125 @@
+/* Screen6
+ *
+ * This routine generates error screen 6 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen6()
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ 100,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_obtain with illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_obtain - RTEMS_INVALID_ID" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain successful" );
+ puts( "TA1 - rtems_semaphore_obtain - got sem 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_semaphore_obtain not available"
+ );
+ puts( "TA1 - rtems_semaphore_obtain - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_semaphore_obtain - timeout in 3 seconds" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_semaphore_obtain timeout"
+ );
+ puts( "TA1 - rtems_semaphore_obtain - woke up with RTEMS_TIMEOUT" );
+
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_OWNER_OF_RESOURCE,
+ "rtems_semaphore_release and not owner"
+ );
+ puts( "TA1 - rtems_semaphore_release - RTEMS_NOT_OWNER_OF_RESOURCE" );
+
+ status = rtems_semaphore_release( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_semaphore_release with illegal id"
+ );
+ puts( "TA1 - rtems_semaphore_release - RTEMS_INVALID_ID" );
+
+ puts( "TA1 - rtems_task_start - start TA2 - RTEMS_SUCCESSFUL" );
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+
+ puts( "TA1 - rtems_semaphore_delete - delete sem 1 - RTEMS_SUCCESSFUL" );
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM1" );
+
+ puts( "TA1 - rtems_semaphore_obtain - binary semaphore" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain");
+
+ puts( "TA1 - rtems_semaphore_delete - delete sem 2 - RTEMS_RESOURCE_IN_USE" );
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_RESOURCE_IN_USE,
+ "rtems_semaphore_delete of SM2"
+ );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+
+ status = rtems_task_delete( Task_id[ 2 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_task_delete after the task has been deleted"
+ );
+}
diff --git a/testsuites/sptests/sp09/screen07.c b/testsuites/sptests/sp09/screen07.c
new file mode 100644
index 0000000000..9fb884b45e
--- /dev/null
+++ b/testsuites/sptests/sp09/screen07.c
@@ -0,0 +1,192 @@
+/* Screen7
+ *
+ * This routine generates error screen 7 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen7()
+{
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ status = rtems_message_queue_broadcast( 100, (long (*)[4]) buffer, 16, &count );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_broadcast with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_broadcast - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_create(
+ 0,
+ 3,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_message_queue_create with illegal name"
+ );
+
+ puts( "TA1 - rtems_message_queue_create - Q 1 - RTEMS_INVALID_NAME" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 1,
+ 16,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_message_queue_create of mp not configured"
+ );
+ puts( "TA1 - rtems_message_queue_create - Q 1 - RTEMS_MP_NOT_CONFIGURED" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 2 ],
+ 1,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_create of too many"
+ );
+ puts( "TA1 - rtems_message_queue_create - Q 2 - RTEMS_TOO_MANY" );
+
+ status = rtems_message_queue_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_create with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_delete with local illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_ident( 100, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_message_queue_ident with illegal name"
+ );
+ puts( "TA1 - rtems_message_queue_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_message_queue_flush( 100, &count );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_flush with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_flush - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_receive(
+ 100,
+ (long (*)[4]) buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 0
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_receive wit illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_receive - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4]) buffer,
+ &size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_message_queue_receive unsatisfied"
+ );
+ puts( "TA1 - rtems_message_queue_receive - Q 1 - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_message_queue_receive - Q 1 - timeout in 3 seconds" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4]) buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_message_queue_receive 3 second timeout"
+ );
+
+ puts(
+ "TA1 - rtems_message_queue_receive - Q 1 - woke up with RTEMS_TIMEOUT"
+ );
+
+ status = rtems_message_queue_send( 100, (long (*)[4]) buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_message_queue_send with illegal id"
+ );
+ puts( "TA1 - rtems_message_queue_send - RTEMS_INVALID_ID" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4]) buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4]) buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4]) buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_send too many to a limited queue"
+ );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY" );
+}
diff --git a/testsuites/sptests/sp09/screen08.c b/testsuites/sptests/sp09/screen08.c
new file mode 100644
index 0000000000..1aaa9df451
--- /dev/null
+++ b/testsuites/sptests/sp09/screen08.c
@@ -0,0 +1,128 @@
+/* Screen8
+ *
+ * This routine generates error screen 8 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen8()
+{
+ long buffer[ 4 ];
+ rtems_status_code status;
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+ puts( "TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_send too many to limited queue"
+ );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY" );
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+ puts( "TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send successful" );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_send( Queue_id[ 1 ], (long (*)[4])buffer, 16 );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_message_queue_send too many to limited queue"
+ );
+ puts(
+ "TA1 - rtems_message_queue_send - BUFFER 4 TO Q 1 - RTEMS_TOO_MANY"
+ );
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+ puts( "TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 3,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create successful" );
+ puts(
+ "TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL"
+ );
+
+ puts( "TA1 - rtems_task_start - start TA3 - RTEMS_SUCCESSFUL" );
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+
+ puts( "TA1 - rtems_message_queue_delete - delete Q 1 - RTEMS_SUCCESSFUL" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete successful" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after (yield)" );
+}
diff --git a/testsuites/sptests/sp09/screen09.c b/testsuites/sptests/sp09/screen09.c
new file mode 100644
index 0000000000..0810c7c0ab
--- /dev/null
+++ b/testsuites/sptests/sp09/screen09.c
@@ -0,0 +1,144 @@
+/* Screen9
+ *
+ * This routine generates error screen 9 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen9()
+{
+ void *converted;
+ rtems_status_code status;
+ rtems_isr_entry old_service_routine;
+
+ status = rtems_interrupt_catch(
+ Service_routine,
+ ISR_INTERRUPT_MAXIMUM_VECTOR_NUMBER + 10,
+ &old_service_routine
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_interrupt_catch with invalid vector"
+ );
+ puts( "TA1 - rtems_interrupt_catch - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_interrupt_catch( NULL, 3, &old_service_routine );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_interrupt_catch with invalid handler"
+ );
+ puts( "TA1 - rtems_interrupt_catch - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_signal_send( 100, RTEMS_SIGNAL_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_signal_send with illegal id"
+ );
+ puts( "TA1 - rtems_signal_send - RTEMS_INVALID_ID" );
+
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_16 );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_signal_send with no handler"
+ );
+ puts( "TA1 - rtems_signal_send - RTEMS_NOT_DEFINED" );
+
+ status = rtems_port_create(
+ 0,
+ Internal_port_area,
+ External_port_area,
+ sizeof( Internal_port_area ),
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_port_create with illegal name"
+ );
+ puts( "TA1 - rtems_port_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_port_create(
+ Port_name[ 1 ],
+ &((char *)Internal_port_area)[ 1 ],
+ External_port_area,
+ sizeof( Internal_port_area ),
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_port_create with illegal address"
+ );
+ puts( "TA1 - rtems_port_create - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_port_create(
+ Port_name[ 1 ],
+ Internal_port_area,
+ External_port_area,
+ sizeof( Internal_port_area ),
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_port_create of too many"
+ );
+ puts( "TA1 - rtems_port_create - RTEMS_TOO_MANY" );
+
+ status = rtems_port_delete( 0 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_port_delete with illegal id"
+ );
+ puts( "TA1 - rtems_port_delete - RTEMS_INVALID_ID" );
+
+ status = rtems_port_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_port_ident with illegal name"
+ );
+ puts( "TA1 - rtems_port_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_port_external_to_internal(
+ 100,
+ Internal_port_area,
+ &converted
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_port_external_to_internal with illegal id"
+ );
+ puts( "TA1 - rtems_port_external_to_internal - RTEMS_INVALID_ID" );
+ status = rtems_port_internal_to_external(
+ 100,
+ Internal_port_area,
+ &converted
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_port_internal_to_external with illegal id"
+ );
+ puts( "TA1 - rtems_port_internal_to_external - RTEMS_INVALID_ID" );
+}
diff --git a/testsuites/sptests/sp09/screen10.c b/testsuites/sptests/sp09/screen10.c
new file mode 100644
index 0000000000..5b8bc1f69a
--- /dev/null
+++ b/testsuites/sptests/sp09/screen10.c
@@ -0,0 +1,164 @@
+/* Screen10
+ *
+ * This routine generates error screen 10 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen10()
+{
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_rate_monotonic_create with illegal name"
+ );
+ puts( "TA1 - rtems_rate_monotonic_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_rate_monotonic_create( Period_name[ 1 ], &Period_id[ 1 ] );
+ directive_failed( status, "rtems_rate_monotonic_create successful" );
+ puts( "TA1 - rtems_rate_monotonic_create - RTEMS_SUCCESSFUL" );
+
+ status = rtems_rate_monotonic_create( Period_name[ 1 ], &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_rate_monotonic_create of too many"
+ );
+ puts( "TA1 - rtems_rate_monotonic_create - RTEMS_TOO_MANY" );
+
+ status = rtems_rate_monotonic_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_rate_monotonic_ident with illegal name"
+ );
+ puts( "TA1 - rtems_rate_monotonic_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_rate_monotonic_period( 100, 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_period with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_period - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_period( 0x10100, 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_period with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_period - local RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_rate_monotonic_period status not defined"
+ );
+ puts(
+ "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_NOT_DEFINED"
+ );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 100 );
+ directive_failed( status, "rtems_rate_monotonic_period successful" );
+ puts( "TA1 - rtems_rate_monotonic_period - 100 ticks - RTEMS_SUCCESSFUL" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS );
+ directive_failed( status, "rtems_rate_monotonic_period status" );
+ puts(
+ "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_SUCCESSFUL"
+ );
+
+ while ( FOREVER ) {
+
+ status = rtems_rate_monotonic_period(Period_id[ 1 ], RTEMS_PERIOD_STATUS);
+
+ if ( status == RTEMS_TIMEOUT ) break;
+
+ directive_failed(
+ status,
+ "rtems_rate_monotonic_period waiting for timeout"
+ );
+ }
+ puts(
+ "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_TIMEOUT"
+ );
+
+ status = rtems_rate_monotonic_cancel( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_cancel with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_cancel - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_cancel( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_cancel will illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_cancel - local RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_cancel( Period_id[ 1 ] );
+ directive_failed( status, "rtems_rate_monotonic_cancel" );
+ puts( "TA1 - rtems_rate_monotonic_cancel - RTEMS_SUCCESSFUL" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 );
+ directive_failed( status, "rtems_rate_monotonic_period restart" );
+
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_rate_monotonic_period"
+ );
+ puts( "TA1 - rtems_rate_monotonic_period - 5 ticks - RTEMS_TIMEOUT" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ puts( "TA1 - yielding to TA4" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+
+ status = rtems_rate_monotonic_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_delete with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_rate_monotonic_delete with illegal id"
+ );
+ puts( "TA1 - rtems_rate_monotonic_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_rate_monotonic_delete( Period_id[ 1 ] );
+ directive_failed( status, "rtems_rate_monotonic_delete" );
+ puts( "TA1 - rtems_rate_monotonic_delete - RTEMS_SUCCESSFUL" );
+}
diff --git a/testsuites/sptests/sp09/screen11.c b/testsuites/sptests/sp09/screen11.c
new file mode 100644
index 0000000000..168c4c8788
--- /dev/null
+++ b/testsuites/sptests/sp09/screen11.c
@@ -0,0 +1,250 @@
+/* Screen11
+ *
+ * This routine generates error screen 11 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen11()
+{
+ void *buffer_address_1;
+ void *buffer_address_2;
+ void *buffer_address_3;
+ rtems_status_code status;
+
+ status = rtems_partition_create(
+ 0,
+ Partition_good_area,
+ 128,
+ 40,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_partition_create with illegal name"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 0,
+ 80,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with illegal length"
+ );
+ puts( "TA1 - rtems_partition_create - length - RTEMS_INVALID_SIZE" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with illegal buffer size"
+ );
+ puts( "TA1 - rtems_partition_create - buffer size - RTEMS_INVALID_SIZE" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 256,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with buffer_size > length"
+ );
+ puts(
+ "TA1 - rtems_partition_create - length < buffer size - RTEMS_INVALID_SIZE"
+ );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_MP_NOT_CONFIGURED,
+ "rtems_partition_create of global"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_MP_NOT_CONFIGURED" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_bad_area,
+ 128,
+ 64,
+ RTEMS_GLOBAL,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_partition_create with bad address"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 34,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_partition_create with unaligned buffer_size"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_INVALID_SIZE" );
+
+ status = rtems_partition_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_delete with illegal id"
+ );
+ puts( "TA1 - rtems_partition_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_partition_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_delete with illegal id"
+ );
+ puts( "TA1 - rtems_partition_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_partition_get_buffer( 100, &buffer_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_get_buffer with illegal id"
+ );
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_INVALID_ID" );
+
+ status = rtems_partition_ident( 0, RTEMS_SEARCH_ALL_NODES, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_partition_ident with illegal name"
+ );
+ puts( "TA1 - rtems_partition_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_partition_return_buffer( 100, buffer_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_partition_return_buffer with illegal id"
+ );
+ puts( "TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ID" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 64,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create" );
+ puts( "TA1 - rtems_partition_create - RTEMS_SUCCESSFUL" );
+
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Partition_good_area,
+ 128,
+ 32,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_partition_create of too many"
+ );
+ puts( "TA1 - rtems_partition_create - RTEMS_TOO_MANY" );
+
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer_address_1 );
+ directive_failed( status, "rtems_partition_get_buffer");
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL" );
+
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer_address_2 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL" );
+
+ status = rtems_partition_get_buffer( Partition_id[ 1 ], &buffer_address_3 );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_partition_get_buffer unsatisfied"
+ );
+ puts( "TA1 - rtems_partition_get_buffer - RTEMS_UNSATISFIED" );
+
+ status = rtems_partition_delete( Partition_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_RESOURCE_IN_USE,
+ "rtems_partition_delete with buffers in use"
+ );
+ puts( "TA1 - rtems_partition_delete - RTEMS_RESOURCE_IN_USE" );
+
+ status = rtems_partition_return_buffer(
+ Partition_id[ 1 ],
+ Region_good_area /* NOTE: Region Memory */
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_partition_return_buffer with buffer address out of partition"
+ );
+ puts(
+ "TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ADDRESS - out of range"
+ );
+
+ status = rtems_partition_return_buffer(
+ Partition_id[ 1 ],
+ &Partition_good_area[ 7 ]
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_partition_return_buffer with buffer address not on boundary"
+ );
+ puts_nocr( "TA1 - rtems_partition_return_buffer - " );
+ puts ( "RTEMS_INVALID_ADDRESS - not on boundary");
+}
diff --git a/testsuites/sptests/sp09/screen12.c b/testsuites/sptests/sp09/screen12.c
new file mode 100644
index 0000000000..2bebb3b6d9
--- /dev/null
+++ b/testsuites/sptests/sp09/screen12.c
@@ -0,0 +1,337 @@
+/* Screen12
+ *
+ * This routine generates error screen 12 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen12()
+{
+ void *segment_address_1;
+ void *segment_address_2;
+ void *segment_address_3;
+ rtems_unsigned32 offset;
+ rtems_unsigned32 good_front_flag;
+ rtems_unsigned32 good_back_flag;
+ rtems_status_code status;
+
+ status = rtems_region_create(
+ 0,
+ Region_good_area,
+ 0x40,
+ 32,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_region_create with illegal name"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Region_bad_area,
+ 0x40,
+ 32,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_create with illegal address"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Region_good_area,
+ 0x40,
+ 34,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_region_create with illegal size"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_INVALID_SIZE" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET ],
+ REGION_LENGTH,
+ 0x40,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 1 ]
+ );
+ directive_failed( status, "rtems_region_create" );
+ puts( "TA1 - rtems_region_create - RTEMS_SUCCESSFUL" );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Region_good_area,
+ 512,
+ 0x40,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Junk_id
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_region_create of too many"
+ );
+ puts( "TA1 - rtems_region_create - RTEMS_TOO_MANY" );
+
+ status = rtems_region_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_delete with illegal id"
+ );
+ puts( "TA1 - rtems_region_delete - unknown RTEMS_INVALID_ID" );
+
+ status = rtems_region_delete( 0x10100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_delete with illegal id"
+ );
+ puts( "TA1 - rtems_region_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_region_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_region_ident with illegal name"
+ );
+ puts( "TA1 - rtems_region_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_region_get_segment(
+ 100,
+ 0x40,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_get_segment with illegal id"
+ );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_INVALID_ID" );
+
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ sizeof( Region_good_area ) * 2,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_SIZE,
+ "rtems_region_get_segment with illegal size"
+ );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_INVALID_SIZE" );
+
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 384,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_SUCCESSFUL" );
+
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ REGION_LENGTH / 2,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_region_get_segment unsatisfied"
+ );
+ puts( "TA1 - rtems_region_get_segment - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_region_get_segment - timeout in 3 seconds" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 128,
+ RTEMS_DEFAULT_OPTIONS,
+ 3 * TICKS_PER_SECOND,
+ &segment_address_3
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_TIMEOUT,
+ "rtems_region_get_segment timeout"
+ );
+ puts( "TA1 - rtems_region_get_segment - woke up with RTEMS_TIMEOUT" );
+
+ status = rtems_region_delete( Region_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_RESOURCE_IN_USE,
+ "rtems_region_delete with buffers in use"
+ );
+ puts( "TA1 - rtems_region_delete - RTEMS_RESOURCE_IN_USE" );
+
+ status = rtems_region_return_segment( 100, segment_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_return_segment with illegal id"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ID" );
+
+ status = rtems_region_return_segment( Region_id[ 1 ], Region_good_area );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_return_segment with illegal segment"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS" );
+
+/*
+ * The following generate internal heap errors. Thus this code
+ * is subject to change if the heap code changes.
+ */
+
+ puts( "TA1 - rtems_debug_disable - RTEMS_DEBUG_REGION" );
+ rtems_debug_disable( RTEMS_DEBUG_REGION );
+
+#if 0
+
+ offset = (segment_address_1 - (void *)Region_good_area) / 4;
+
+/* bad FRONT_FLAG error */
+
+ good_front_flag = Region_good_area[ offset - 1 ];
+ Region_good_area[ offset - 1 ] = good_front_flag + 2;
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_return_segment with back_flag != front_flag"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS" );
+
+ Region_good_area[ offset - 1 ] = good_front_flag;
+
+/* bad FRONT_FLAG error */
+
+ good_back_flag = Region_good_area[ offset - 2 ];
+ Region_good_area[ offset - 2 ] = 1024;
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_return_segment with back_flag != front_flag"
+ );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS" );
+
+ Region_good_area[ offset - 2 ] = good_back_flag;
+
+#else
+ offset = 0;
+ good_front_flag = 0;
+ good_back_flag = 0;
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS - SKIPPED" );
+ puts( "TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS - SKIPPED" );
+#endif
+
+ puts( "TA1 - rtems_debug_enable - RTEMS_DEBUG_REGION" );
+ rtems_debug_enable( RTEMS_DEBUG_REGION );
+
+ status = rtems_region_extend(
+ 100,
+ Region_good_area,
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_region_extend with illegal id"
+ );
+ puts( "TA1 - rtems_region_extend - RTEMS_INVALID_ID" );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET + 16 ],
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ADDRESS,
+ "rtems_region_extend with illegal starting address"
+ );
+ puts( "TA1 - rtems_region_extend - within heap - RTEMS_INVALID_ADDRESS" );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ Region_bad_area,
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_IMPLEMENTED,
+ "rtems_region_extend with unsupported starting address"
+ );
+ puts(
+ "TA1 - rtems_region_extend - non-contiguous lower - RTEMS_NOT_IMPLEMENTED"
+ );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET - REGION_LENGTH ],
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_IMPLEMENTED,
+ "rtems_region_extend with unsupported starting address"
+ );
+ puts(
+ "TA1 - rtems_region_extend - contiguous lower - RTEMS_NOT_IMPLEMENTED"
+ );
+
+ status = rtems_region_extend(
+ Region_id[ 1 ],
+ &Region_good_area[ REGION_START_OFFSET + REGION_LENGTH + 16 ],
+ 128
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_IMPLEMENTED,
+ "rtems_region_extend with unsupported starting address"
+ );
+ puts(
+ "TA1 - rtems_region_extend - non-contiguous higher - RTEMS_NOT_IMPLEMENTED"
+ );
+
+}
diff --git a/testsuites/sptests/sp09/screen13.c b/testsuites/sptests/sp09/screen13.c
new file mode 100644
index 0000000000..779ef9e4f7
--- /dev/null
+++ b/testsuites/sptests/sp09/screen13.c
@@ -0,0 +1,114 @@
+/* Screen13
+ *
+ * This routine generates error screen 13 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen13()
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_io_close( 0xffff, 0x0000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_close with bad major number"
+ );
+ puts( "TA1 - rtems_io_close - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_control( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_close with bad major number"
+ );
+ puts( "TA1 - rtems_io_control - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_initialize( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_initialize with bad major number"
+ );
+ puts( "TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_open( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_open with bad major number"
+ );
+ puts( "TA1 - rtems_io_open - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_read( 0xffff, 0x00000, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_read with bad major number"
+ );
+ puts( "TA1 - rtems_io_read - RTEMS_INVALID_NUMBER" );
+ status = rtems_io_write( 0xffff, 0x0ffff, NULL);
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_write with bad major number"
+ );
+ puts( "TA1 - rtems_io_write - RTEMS_INVALID_NUMBER" );
+
+ build_time( &time, 12, 31, 2000, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 1999, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 2100, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 2099, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+
+ build_time( &time, 12, 31, 1991, 23, 59, 59, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_set - ", &time, " - RTEMS_SUCCESSFUL\n" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, " - RTEMS_SUCCESSFUL\n" );
+}
diff --git a/testsuites/sptests/sp09/screen14.c b/testsuites/sptests/sp09/screen14.c
new file mode 100644
index 0000000000..fe39bab676
--- /dev/null
+++ b/testsuites/sptests/sp09/screen14.c
@@ -0,0 +1,154 @@
+/* Screen14
+ *
+ * This routine generates error screen 14 for test 9.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Screen14()
+{
+ rtems_status_code status;
+ rtems_time_of_day time;
+
+ status = rtems_timer_create( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_timer_create with illegal name"
+ );
+ puts( "TA1 - rtems_timer_create - RTEMS_INVALID_NAME" );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+ puts( "TA1 - rtems_timer_create - 1 - RTEMS_SUCCESSFUL" );
+
+ status = rtems_timer_create( 2, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_TOO_MANY,
+ "rtems_timer_create for too many"
+ );
+ puts( "TA1 - rtems_timer_create - 2 - RTEMS_TOO_MANY" );
+
+ status = rtems_timer_delete( 100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_delete with illegal id"
+ );
+ puts( "TA1 - rtems_timer_delete - local RTEMS_INVALID_ID" );
+
+ status = rtems_timer_delete( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_delete with illegal id"
+ );
+ puts( "TA1 - rtems_timer_delete - global RTEMS_INVALID_ID" );
+
+ status = rtems_timer_ident( 0, &Junk_id );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NAME,
+ "rtems_timer_ident with illegal name"
+ );
+ puts( "TA1 - rtems_timer_ident - RTEMS_INVALID_NAME" );
+
+ status = rtems_timer_cancel( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_cancel with illegal id"
+ );
+ puts( "TA1 - rtems_timer_cancel - RTEMS_INVALID_ID" );
+
+ status = rtems_timer_reset( 0x010100 );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_reset with illegal id"
+ );
+ puts( "TA1 - rtems_timer_reset - RTEMS_INVALID_ID" );
+
+ status = rtems_timer_reset( Timer_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_DEFINED,
+ "rtems_timer_reset before initiated"
+ );
+ puts( "TA1 - rtems_timer_reset - RTEMS_NOT_DEFINED" );
+
+ status = rtems_timer_fire_after(
+ 0x010100,
+ 5 * TICKS_PER_SECOND,
+ Delayed_routine,
+ NULL
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_fire_after illegal id"
+ );
+ puts( "TA1 - rtems_timer_fire_after - RTEMS_INVALID_ID" );
+
+ build_time( &time, 12, 31, 1994, 9, 0, 0, 0 );
+ status = rtems_timer_fire_when( 0x010100, &time, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_ID,
+ "rtems_timer_fire_when with illegal id"
+ );
+ puts( "TA1 - rtems_timer_fire_when - RTEMS_INVALID_ID" );
+
+ status = rtems_timer_fire_after( Timer_id[ 1 ], 0, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_timer_fire_after with 0 ticks"
+ );
+ puts( "TA1 - rtems_timer_fire_after - RTEMS_INVALID_NUMBER" );
+
+ build_time( &time, 2, 5, 1987, 8, 30, 45, 0 );
+ status = rtems_timer_fire_when( Timer_id[ 1 ], &time, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_timer_fire_when with illegal time"
+ );
+ print_time(
+ "TA1 - rtems_timer_fire_when - ",
+ &time,
+ " - RTEMS_INVALID_CLOCK\n"
+ );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_set" );
+ print_time( "TA1 - rtems_clock_get - ", &time, "\n" );
+
+ build_time( &time, 2, 5, 1990, 8, 30, 45, 0 );
+ status = rtems_timer_fire_when( Timer_id[ 1 ], &time, Delayed_routine, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_CLOCK,
+ "rtems_timer_fire_when before current time"
+ );
+ print_time(
+ "TA1 - rtems_timer_fire_when - ",
+ &time,
+ " - before RTEMS_INVALID_CLOCK\n"
+ );
+}
diff --git a/testsuites/sptests/sp09/sp09.doc b/testsuites/sptests/sp09/sp09.doc
new file mode 100644
index 0000000000..a7e296ca7d
--- /dev/null
+++ b/testsuites/sptests/sp09/sp09.doc
@@ -0,0 +1,36 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test9
+
+directives:
+ ex_init, ex_start, tm_tick, i_return,
+ t_create,t_delete, t_getreg, t_ident, t_restart, t_resume, t_setpri,
+ t_setreg, t_start, t_suspend, tm_delete, tm_get,
+ tm_set, tm_wkafter, tm_wkwhen, ev_receive, ev_send, sm_create, sm_delete,
+ sm_ident, sm_p, sm_v, q_broadcast, q_create, q_delete, q_ident, q_receive,
+ q_send, q_urgent, as_catch, as_send, as_return, rn_create, rn_delete,
+ rn_getseg, rn_ident, rn_retseg, pt_create, pt_delete, pt_getbug, pt_ident,
+ pt_retbuf, de_close, de_cntrl, de_init, de_open, de_read, de_write
+
+concepts:
+
+ a. Verifies all error codes returned by the executive in single
+ processor configurations.
+
+ b. Verifies error conditions in the following kernel routines or macros:
+ _Ck_date_time, _Expired, _Q_submit, _Get_mnodes, _Get_node,
+ _Free_mem, _Get_mem, _Valid_block, _Set_tcb, _Set_resource,
+ _In_range, _On_boundary
diff --git a/testsuites/sptests/sp09/sp09.scn b/testsuites/sptests/sp09/sp09.scn
new file mode 100644
index 0000000000..e1c59f6397
--- /dev/null
+++ b/testsuites/sptests/sp09/sp09.scn
@@ -0,0 +1,249 @@
+*** TEST 9 ***
+INIT - rtems_task_create - RTEMS_INVALID_SIZE -- NOT CHECKED
+INIT - rtems_task_create - RTEMS_INVALID_PRIORITY
+INIT - rtems_task_restart - RTEMS_INCORRECT_STATE
+TA1 - rtems_task_delete - RTEMS_INVALID_ID
+TA1 - rtems_task_get_note - RTEMS_INVALID_NUMBER
+TA1 - rtems_task_get_note - RTEMS_INVALID_ID
+TA1 - rtems_task_ident - current task RTEMS_SUCCESSFUL
+TA1 - rtems_task_ident - global RTEMS_INVALID_NAME
+TA1 - rtems_task_ident - local RTEMS_INVALID_NAME
+TA1 - rtems_task_ident - RTEMS_INVALID_NODE
+TA1 - rtems_task_restart - RTEMS_INVALID_ID
+TA1 - rtems_task_resume - RTEMS_INVALID_ID
+TA1 - rtems_task_resume - RTEMS_INCORRECT_STATE
+TA1 - rtems_task_set_priority - RTEMS_INVALID_PRIORITY
+TA1 - rtems_task_set_priority - RTEMS_INVALID_ID
+TA1 - rtems_task_set_note - RTEMS_INVALID_NUMBER
+TA1 - rtems_task_set_note - RTEMS_INVALID_ID
+TA1 - rtems_task_start - RTEMS_INVALID_ID
+TA1 - rtems_task_start - RTEMS_INCORRECT_STATE
+TA1 - rtems_task_suspend - RTEMS_INVALID_ID
+<pause - screen 2>
+TA1 - rtems_clock_get - RTEMS_NOT_DEFINED
+TA1 - rtems_task_wake_when - RTEMS_NOT_DEFINED
+TA1 - rtems_timer_fire_when - RTEMS_NOT_DEFINED
+TA1 - rtems_clock_set - 08:30:45 02/05/1987 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 15/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 02/32/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 25:30:45 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:61:45 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:61 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_set - 08:30:45 02/05/1988 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_when - TICKINVALID - sleep about 3 seconds
+TA1 - rtems_task_wake_when - TICKINVALID - woke up RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_when - 08:30:48 02/05/1961 - RTEMS_INVALID_CLOCK
+TA1 - rtems_task_wake_when - 25:30:48 02/05/1988 - RTEMS_INVALID_CLOCK
+TA1 - current time - 08:30:51 02/05/1988
+TA1 - rtems_task_wake_when - 08:30:51 01/05/1988 - RTEMS_INVALID_CLOCK
+<pause - screen 3>
+TA1 - rtems_task_create - RTEMS_INVALID_NAME
+TA1 - rtems_task_create - stack size - RTEMS_UNSATISFIED
+TA1 - rtems_task_create - TA2 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_suspend - suspend TA2 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_suspend - suspend TA2 - RTEMS_ALREADY_SUSPENDED
+TA1 - rtems_task_resume - TA2 resumed - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - TA3 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 4 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 5 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 6 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 7 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 8 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 9 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 10 created - RTEMS_SUCCESSFUL
+TA1 - rtems_task_create - 11 - RTEMS_TOO_MANY
+TA1 - rtems_task_create - RTEMS_MP_NOT_CONFIGURED
+<pause - screen 4>
+TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( all conditions )
+TA1 - rtems_event_receive - RTEMS_UNSATISFIED ( any condition )
+TA1 - rtems_event_receive - timeout in 3 seconds
+TA1 - rtems_event_receive - woke up with RTEMS_TIMEOUT
+TA1 - rtems_event_send - RTEMS_INVALID_ID
+TA1 - rtems_task_wake_after - sleep 1 second - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 08:30:45 02/05/1988 - RTEMS_SUCCESSFUL
+<pause - screen 5>
+TA1 - rtems_semaphore_create - RTEMS_INVALID_NAME
+TA1 - rtems_semaphore_create - 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_create - 2 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_create - 3 - RTEMS_TOO_MANY
+TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED
+TA1 - rtems_semaphore_create - RTEMS_NOT_DEFINED
+TA1 - rtems_semaphore_create - RTEMS_INVALID_NUMBER
+TA1 - rtems_semaphore_create - RTEMS_MP_NOT_CONFIGURED
+TA1 - rtems_semaphore_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_semaphore_delete - local RTEMS_INVALID_ID
+TA1 - rtems_semaphore_ident - global RTEMS_INVALID_NAME
+TA1 - rtems_semaphore_ident - local RTEMS_INVALID_NAME
+<pause - screen 6>
+TA1 - rtems_semaphore_obtain - RTEMS_INVALID_ID
+TA1 - rtems_semaphore_obtain - got sem 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_obtain - RTEMS_UNSATISFIED
+TA1 - rtems_semaphore_obtain - timeout in 3 seconds
+TA1 - rtems_semaphore_obtain - woke up with RTEMS_TIMEOUT
+TA1 - rtems_semaphore_release - RTEMS_NOT_OWNER_OF_RESOURCE
+TA1 - rtems_semaphore_release - RTEMS_INVALID_ID
+TA1 - rtems_task_start - start TA2 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA2 - rtems_semaphore_obtain - sem 1 - RTEMS_WAIT FOREVER
+TA1 - rtems_semaphore_delete - delete sem 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_semaphore_obtain - binary semaphore
+TA1 - rtems_semaphore_delete - delete sem 2 - RTEMS_RESOURCE_IN_USE
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA2 - rtems_semaphore_obtain - woke up with RTEMS_OBJECT_WAS_DELETED
+TA2 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL
+<pause - screen 7>
+TA1 - rtems_message_queue_broadcast - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_create - Q 1 - RTEMS_INVALID_NAME
+TA1 - rtems_message_queue_create - Q 1 - RTEMS_MP_NOT_CONFIGURED
+TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 2 - RTEMS_TOO_MANY
+TA1 - rtems_message_queue_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_message_queue_delete - local RTEMS_INVALID_ID
+TA1 - rtems_message_queue_ident - RTEMS_INVALID_NAME
+TA1 - rtems_message_queue_flush - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_receive - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_receive - Q 1 - RTEMS_UNSATISFIED
+TA1 - rtems_message_queue_receive - Q 1 - timeout in 3 seconds
+TA1 - rtems_message_queue_receive - Q 1 - woke up with RTEMS_TIMEOUT
+TA1 - rtems_message_queue_send - RTEMS_INVALID_ID
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY
+<pause - screen 8>
+TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 1 - 2 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_TOO_MANY
+TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_send - BUFFER 4 TO Q 1 - RTEMS_TOO_MANY
+TA1 - rtems_message_queue_delete - Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_message_queue_create - Q 1 - 3 DEEP - RTEMS_SUCCESSFUL
+TA1 - rtems_task_start - start TA3 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA3 - rtems_message_queue_receive - Q 1 - RTEMS_WAIT FOREVER
+TA1 - rtems_message_queue_delete - delete Q 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_task_wake_after - yield processor - RTEMS_SUCCESSFUL
+TA3 - rtems_message_queue_receive - woke up with RTEMS_OBJECT_WAS_DELETED
+TA3 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL
+<pause - screen 9>
+TA1 - rtems_interrupt_catch - RTEMS_INVALID_NUMBER
+TA1 - rtems_interrupt_catch - RTEMS_INVALID_ADDRESS
+TA1 - rtems_signal_send - RTEMS_INVALID_ID
+TA1 - rtems_signal_send - RTEMS_NOT_DEFINED
+TA1 - rtems_port_create - RTEMS_INVALID_NAME
+TA1 - rtems_port_create - RTEMS_INVALID_ADDRESS
+TA1 - rtems_port_create - RTEMS_TOO_MANY
+TA1 - rtems_port_delete - RTEMS_INVALID_ID
+TA1 - rtems_port_ident - RTEMS_INVALID_NAME
+TA1 - rtems_port_external_to_internal - RTEMS_INVALID_ID
+TA1 - rtems_port_internal_to_external - RTEMS_INVALID_ID
+<pause - screen 10>
+TA1 - rtems_rate_monotonic_create - RTEMS_INVALID_NAME
+TA1 - rtems_rate_monotonic_create - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_create - RTEMS_TOO_MANY
+TA1 - rtems_rate_monotonic_ident - RTEMS_INVALID_NAME
+TA1 - rtems_rate_monotonic_period - unknown RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_period - local RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_NOT_DEFINED
+TA1 - rtems_rate_monotonic_period - 100 ticks - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_TIMEOUT
+TA1 - rtems_rate_monotonic_cancel - unknown RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_cancel - local RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_cancel - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_period - 5 ticks - RTEMS_TIMEOUT
+TA1 - yielding to TA4
+TA4 - rtems_rate_monotonic_cancel - RTEMS_NOT_OWNER_OF_RESOURCE
+TA4 - rtems_rate_monotonic_period - RTEMS_NOT_OWNER_OF_RESOURCE
+TA4 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL
+TA1 - rtems_rate_monotonic_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_delete - local RTEMS_INVALID_ID
+TA1 - rtems_rate_monotonic_delete - RTEMS_SUCCESSFUL
+<pause - screen 11>
+TA1 - rtems_partition_create - RTEMS_INVALID_NAME
+TA1 - rtems_partition_create - length - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_create - buffer size - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_create - length < buffer size - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_create - RTEMS_MP_NOT_CONFIGURED
+TA1 - rtems_partition_create - RTEMS_INVALID_ADDRESS
+TA1 - rtems_partition_create - RTEMS_INVALID_SIZE
+TA1 - rtems_partition_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_partition_delete - local RTEMS_INVALID_ID
+TA1 - rtems_partition_get_buffer - RTEMS_INVALID_ID
+TA1 - rtems_partition_ident - RTEMS_INVALID_NAME
+TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ID
+TA1 - rtems_partition_create - RTEMS_SUCCESSFUL
+TA1 - rtems_partition_create - RTEMS_TOO_MANY
+TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL
+TA1 - rtems_partition_get_buffer - RTEMS_SUCCESSFUL
+TA1 - rtems_partition_get_buffer - RTEMS_UNSATISFIED
+TA1 - rtems_partition_delete - RTEMS_RESOURCE_IN_USE
+TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ADDRESS - out of range
+TA1 - rtems_partition_return_buffer - RTEMS_INVALID_ADDRESS - not on boundary
+<pause - screen 12>
+TA1 - rtems_region_create - RTEMS_INVALID_NAME
+TA1 - rtems_region_create - RTEMS_INVALID_ADDRESS
+TA1 - rtems_region_create - RTEMS_INVALID_SIZE
+TA1 - rtems_region_create - RTEMS_SUCCESSFUL
+TA1 - rtems_region_create - RTEMS_TOO_MANY
+TA1 - rtems_region_delete - unknown RTEMS_INVALID_ID
+TA1 - rtems_region_delete - local RTEMS_INVALID_ID
+TA1 - rtems_region_ident - RTEMS_INVALID_NAME
+TA1 - rtems_region_get_segment - RTEMS_INVALID_ID
+TA1 - rtems_region_get_segment - RTEMS_INVALID_SIZE
+TA1 - rtems_region_get_segment - RTEMS_SUCCESSFUL
+TA1 - rtems_region_get_segment - RTEMS_UNSATISFIED
+TA1 - rtems_region_get_segment - timeout in 3 seconds
+TA1 - rtems_region_get_segment - woke up with RTEMS_TIMEOUT
+TA1 - rtems_region_delete - RTEMS_RESOURCE_IN_USE
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ID
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS
+TA1 - rtems_debug_disable - RTEMS_DEBUG_REGION
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS
+TA1 - rtems_region_return_segment - RTEMS_INVALID_ADDRESS
+TA1 - rtems_debug_enable - RTEMS_DEBUG_REGION
+TA1 - rtems_region_extend - RTEMS_INVALID_ID
+TA1 - rtems_region_extend - within heap - RTEMS_INVALID_ADDRESS
+TA1 - rtems_region_extend - non-contiguous lower - RTEMS_NOT_IMPLEMENTED
+TA1 - rtems_region_extend - contiguous lower - RTEMS_NOT_IMPLEMENTED
+TA1 - rtems_region_extend - non-contiguous higher - RTEMS_NOT_IMPLEMENTED
+<pause - screen 13>
+TA1 - rtems_io_close - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_control - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_open - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_read - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_write - RTEMS_INVALID_NUMBER
+TA1 - rtems_clock_set - 23:59:59 12/31/2000 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2001 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/1999 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2000 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/2100 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2101 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/2099 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/2100 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_set - 23:59:59 12/31/1991 - RTEMS_SUCCESSFUL
+TA1 - rtems_clock_get - 00:00:00 01/01/1992 - RTEMS_SUCCESSFUL
+<pause - screen 14>
+TA1 - rtems_timer_create - RTEMS_INVALID_NAME
+TA1 - rtems_timer_create - 1 - RTEMS_SUCCESSFUL
+TA1 - rtems_timer_create - 2 - RTEMS_TOO_MANY
+TA1 - rtems_timer_delete - local RTEMS_INVALID_ID
+TA1 - rtems_timer_delete - global RTEMS_INVALID_ID
+TA1 - rtems_timer_ident - RTEMS_INVALID_NAME
+TA1 - rtems_timer_cancel - RTEMS_INVALID_ID
+TA1 - rtems_timer_reset - RTEMS_INVALID_ID
+TA1 - rtems_timer_reset - RTEMS_NOT_DEFINED
+TA1 - rtems_timer_fire_after - RTEMS_INVALID_ID
+TA1 - rtems_timer_fire_when - RTEMS_INVALID_ID
+TA1 - rtems_timer_fire_after - RTEMS_INVALID_NUMBER
+TA1 - rtems_timer_fire_when - 08:30:45 02/05/1987 - RTEMS_INVALID_CLOCK
+TA1 - rtems_clock_get - 00:00:00 01/01/1992
+TA1 - rtems_timer_fire_when - 08:30:45 02/05/1990 - before RTEMS_INVALID_CLOCK
+*** END OF TEST 9 ***
diff --git a/testsuites/sptests/sp09/system.h b/testsuites/sptests/sp09/system.h
new file mode 100644
index 0000000000..7c482db2a7
--- /dev/null
+++ b/testsuites/sptests/sp09/system.h
@@ -0,0 +1,141 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Delayed_routine(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_isr Service_routine(
+ rtems_vector_number ignored
+);
+
+rtems_timer_service_routine Io_during_interrupt(
+ rtems_id ignored
+);
+
+void Screen1( void );
+
+void Screen2( void );
+
+void Screen3( void );
+
+void Screen4( void );
+
+void Screen5( void );
+
+void Screen6( void );
+
+void Screen7( void );
+
+void Screen8( void );
+
+void Screen9( void );
+
+void Screen10( void );
+
+void Screen11( void );
+
+void Screen12( void );
+
+void Screen13( void );
+
+void Screen14( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_MAXIMUM_SEMAPHORES 2
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#define CONFIGURE_MAXIMUM_REGIONS 1
+#define CONFIGURE_MAXIMUM_PERIODS 1
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 0
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 11 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 11 ]; /* array of task names */
+
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+
+TEST_EXTERN rtems_name Semaphore_name[ 4 ]; /* array of semaphore names */
+TEST_EXTERN rtems_id Semaphore_id[ 4 ]; /* array of semaphore ids */
+
+TEST_EXTERN rtems_name Queue_name[ 3 ]; /* array of queue names */
+TEST_EXTERN rtems_id Queue_id[ 3 ]; /* array of queue ids */
+
+TEST_EXTERN rtems_name Partition_name[ 2 ]; /* array of partition names */
+TEST_EXTERN rtems_id Partition_id[ 2 ]; /* array of partition ids */
+
+TEST_EXTERN rtems_name Region_name[ 2 ]; /* array of region names */
+TEST_EXTERN rtems_id Region_id[ 2 ]; /* array of region ids */
+
+TEST_EXTERN rtems_name Port_name[ 2 ]; /* array of port names */
+TEST_EXTERN rtems_id Port_id[ 2 ]; /* array of port ids */
+
+TEST_EXTERN rtems_name Period_name[ 2 ]; /* array of period names */
+TEST_EXTERN rtems_id Period_id[ 2 ]; /* array of period ids */
+
+TEST_EXTERN rtems_id Junk_id; /* id used to return errors */
+
+#define Internal_port_area (void *) 0x00001000
+#define External_port_area (void *) 0x00002000
+
+TEST_EXTERN rtems_unsigned8 Partition_good_area[256] CPU_STRUCTURE_ALIGNMENT;
+#define Partition_bad_area (void *) 0x00000006
+
+TEST_EXTERN rtems_unsigned32 Region_good_area[4096] CPU_STRUCTURE_ALIGNMENT;
+#define Region_bad_area (void *) 0x00000006
+#define REGION_START_OFFSET 1024
+#define REGION_LENGTH 512
+
+/* end of include file */
diff --git a/testsuites/sptests/sp09/task1.c b/testsuites/sptests/sp09/task1.c
new file mode 100644
index 0000000000..fb4f3f3941
--- /dev/null
+++ b/testsuites/sptests/sp09/task1.c
@@ -0,0 +1,70 @@
+/* Task_1
+ *
+ * This task generates all possible errors for the RTEMS executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ Screen1();
+ rtems_test_pause_and_screen_number( 2 );
+
+ Screen2();
+ rtems_test_pause_and_screen_number( 3 );
+
+ Screen3();
+ rtems_test_pause_and_screen_number( 4 );
+
+ Screen4();
+ rtems_test_pause_and_screen_number( 5 );
+
+ Screen5();
+ rtems_test_pause_and_screen_number( 6 );
+
+ Screen6();
+ rtems_test_pause_and_screen_number( 7 );
+
+ Screen7();
+ rtems_test_pause_and_screen_number( 8 );
+
+ Screen8();
+ rtems_test_pause_and_screen_number( 9 );
+
+ Screen9();
+ rtems_test_pause_and_screen_number( 10 );
+
+ Screen10();
+ rtems_test_pause_and_screen_number( 11 );
+
+ Screen11();
+ rtems_test_pause_and_screen_number( 12 );
+
+ Screen12();
+ rtems_test_pause_and_screen_number( 13 );
+
+ Screen13();
+ rtems_test_pause_and_screen_number( 14 );
+
+ Screen14();
+
+ puts( "*** END OF TEST 9 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp09/task2.c b/testsuites/sptests/sp09/task2.c
new file mode 100644
index 0000000000..096a423640
--- /dev/null
+++ b/testsuites/sptests/sp09/task2.c
@@ -0,0 +1,48 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Its only purpose is to generate the
+ * error where a semaphore is deleted while a task is waiting for it.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_semaphore_obtain - sem 1 - RTEMS_WAIT FOREVER" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_semaphore_obtain waiting to be deleted"
+ );
+ puts(
+ "TA2 - rtems_semaphore_obtain - woke up with RTEMS_OBJECT_WAS_DELETED"
+ );
+
+ puts( "TA2 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA2" );
+}
diff --git a/testsuites/sptests/sp09/task3.c b/testsuites/sptests/sp09/task3.c
new file mode 100644
index 0000000000..a96bfa5a68
--- /dev/null
+++ b/testsuites/sptests/sp09/task3.c
@@ -0,0 +1,53 @@
+/* Task_3
+ *
+ * This routine serves as a test task. Its only purpose in life is to
+ * generate the error where a message queue is deleted while a task
+ * is waiting there for a message.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+
+ puts( "TA3 - rtems_message_queue_receive - Q 1 - RTEMS_WAIT FOREVER" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_message_queue_receive waiting to be deleted"
+ );
+ puts(
+ "TA3 - rtems_message_queue_receive - woke up with RTEMS_OBJECT_WAS_DELETED"
+ );
+
+ puts( "TA3 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA3" );
+}
diff --git a/testsuites/sptests/sp09/task4.c b/testsuites/sptests/sp09/task4.c
new file mode 100644
index 0000000000..05f92f0dec
--- /dev/null
+++ b/testsuites/sptests/sp09/task4.c
@@ -0,0 +1,50 @@
+/* Task_4
+ *
+ * This routine serves as a test task. Its only purpose in life is to
+ * generate the error where a rate monotonic period is accessed by a
+ * task other than its creator.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_cancel( Period_id[ 1 ] );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_OWNER_OF_RESOURCE,
+ "rtems_rate_monotonic_cancel not the owner"
+ );
+ puts( "TA4 - rtems_rate_monotonic_cancel - RTEMS_NOT_OWNER_OF_RESOURCE" );
+
+ status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 );
+ fatal_directive_status(
+ status,
+ RTEMS_NOT_OWNER_OF_RESOURCE,
+ "rtems_rate_monotonic_period not the owner"
+ );
+ puts( "TA4 - rtems_rate_monotonic_period - RTEMS_NOT_OWNER_OF_RESOURCE" );
+
+ puts( "TA4 - rtems_task_delete - delete self - RTEMS_SUCCESSFUL" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA4" );
+}
diff --git a/testsuites/sptests/sp11/init.c b/testsuites/sptests/sp11/init.c
new file mode 100644
index 0000000000..f0792ce456
--- /dev/null
+++ b/testsuites/sptests/sp11/init.c
@@ -0,0 +1,92 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 11 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+ Timer_name[ 2 ] = rtems_build_name( 'T', 'M', '2', ' ' );
+ Timer_name[ 3 ] = rtems_build_name( 'T', 'M', '3', ' ' );
+ Timer_name[ 4 ] = rtems_build_name( 'T', 'M', '4', ' ' );
+ Timer_name[ 5 ] = rtems_build_name( 'T', 'M', '5', ' ' );
+ Timer_name[ 6 ] = rtems_build_name( 'T', 'M', '6', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create of TM1" );
+
+ status = rtems_timer_create( Timer_name[ 2 ], &Timer_id[ 2 ] );
+ directive_failed( status, "rtems_timer_create of TM2" );
+
+ status = rtems_timer_create( Timer_name[ 3 ], &Timer_id[ 3 ] );
+ directive_failed( status, "rtems_timer_create of TM3" );
+
+ status = rtems_timer_create( Timer_name[ 4 ], &Timer_id[ 4 ] );
+ directive_failed( status, "rtems_timer_create of TM4" );
+
+ status = rtems_timer_create( Timer_name[ 5 ], &Timer_id[ 5 ] );
+ directive_failed( status, "rtems_timer_create of TM5" );
+
+ status = rtems_timer_create( Timer_name[ 6 ], &Timer_id[ 6 ] );
+ directive_failed( status, "rtems_timer_create of TM6" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp11/sp11.doc b/testsuites/sptests/sp11/sp11.doc
new file mode 100644
index 0000000000..22f487a56b
--- /dev/null
+++ b/testsuites/sptests/sp11/sp11.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test11
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ ev_send, ev_receive
+ tm_wkafter, tm_set, tm_get
+
+concepts:
+
+ a. This test checks out the event manager along with the associated
+ event directives contained in the time manager.
diff --git a/testsuites/sptests/sp11/sp11.scn b/testsuites/sptests/sp11/sp11.scn
new file mode 100644
index 0000000000..db0469eb60
--- /dev/null
+++ b/testsuites/sptests/sp11/sp11.scn
@@ -0,0 +1,74 @@
+*** TEST 11 ***
+TA1 - rtems_event_send - send RTEMS_EVENT_16 to TA2
+TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_14 and RTEMS_EVENT_15
+TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_16
+TA2 - RTEMS_EVENT_16 received - eventout => 00010000
+TA2 - rtems_event_send - send RTEMS_EVENT_14 and RTEMS_EVENT_15 to TA1
+TA2 - rtems_event_receive - RTEMS_EVENT_17 or RTEMS_EVENT_18 - forever and ANY
+TA1 - RTEMS_EVENT_14 and RTEMS_EVENT_15 received - eventout => 0000c000
+TA1 - rtems_event_send - send RTEMS_EVENT_18 to TA2
+TA1 - rtems_event_receive - waiting with 10 second timeout on RTEMS_EVENT_14
+TA2 - RTEMS_EVENT_17 or RTEMS_EVENT_18 received - eventout => 00040000
+TA2 - rtems_event_send - send RTEMS_EVENT_14 to TA1
+TA2 - rtems_clock_set - 08:15:00 02/12/1988
+TA2 - rtems_event_send - sending RTEMS_EVENT_10 to self after 4 seconds
+TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_10
+TA1 - RTEMS_EVENT_14 received - eventout => 00004000
+TA1 - rtems_event_send - send RTEMS_EVENT_19 to TA2
+TA1 - rtems_clock_get - 08:15:00 02/12/1988
+<pause>
+TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds
+TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_18
+TA2 - RTEMS_EVENT_10 received - eventout => 00000400
+TA2 - rtems_clock_get - 08:15:05 02/12/1988
+TA2 - rtems_event_receive - RTEMS_PENDING_EVENTS
+TA2 - eventout => 00080000
+TA2 - rtems_event_receive - RTEMS_EVENT_19 - RTEMS_NO_WAIT
+TA2 - RTEMS_EVENT_19 received - eventout => 00080000
+TA2 - rtems_task_delete - deletes self
+TA1 - RTEMS_EVENT_18 received - eventout => 00040000
+TA1 - rtems_clock_get - 08:15:05 02/12/1988
+TA1 - rtems_event_send - send RTEMS_EVENT_3 to self
+TA1 - rtems_event_receive - RTEMS_EVENT_3 or RTEMS_EVENT_22 - NO_WAIT and ANY
+TA1 - RTEMS_EVENT_3 received - eventout => 00000008
+TA1 - rtems_event_send - send RTEMS_EVENT_4 to self
+TA1 - rtems_event_receive - RTEMS_EVENT_4 or RTEMS_EVENT_5 - forever and ANY
+TA1 - RTEMS_EVENT_4 received - eventout => 00000010
+<pause>
+TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds
+TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_18
+TA1 - rtems_event_send - send RTEMS_EVENT_8 to self after 60 seconds
+TA1 - rtems_event_send - send RTEMS_EVENT_9 to self after 60 seconds
+TA1 - rtems_event_send - send RTEMS_EVENT_10 to self after 60 seconds
+TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_8
+TA1 - rtems_clock_set - 08:15:00 02/12/1988
+TA1 - rtems_event_send - send RTEMS_EVENT_1 every second
+TA1 - RTEMS_EVENT_1 received - eventout => 00000002 - at 08:15:01 02/12/1988
+TA1 - RTEMS_EVENT_1 received - eventout => 00000002 - at 08:15:02 02/12/1988
+TA1 - RTEMS_EVENT_1 received - eventout => 00000002 - at 08:15:03 02/12/1988
+TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_1
+<pause>
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 1 day
+TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_event_send - resending RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_clock_set - 08:15:03 02/15/1988
+TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_11
+TA1 - RTEMS_EVENT_11 received - eventout => 00000800
+<pause>
+TA1 - rtems_event_send/rtems_event_receive combination
+TA1 - rtems_clock_set - 08:15:00 02/12/1988
+TA1 - rtems_event_receive all outstanding events
+TA1 - rtems_event_send - sending RTEMS_EVENT_10 to self in 1 day
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days
+TA1 - rtems_clock_set - 07:15:00 02/12/1988
+TA1 - set time backwards
+TA1 - no events received
+TA1 - rtems_clock_set - 07:15:00 02/14/1988
+TA1 - set time forwards (leave a timer)
+TA1 - RTEMS_EVENT_10 received
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 100 ticks
+TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 200 ticks
+*** END OF TEST 11 ***
diff --git a/testsuites/sptests/sp11/system.h b/testsuites/sptests/sp11/system.h
new file mode 100644
index 0000000000..b749025be5
--- /dev/null
+++ b/testsuites/sptests/sp11/system.h
@@ -0,0 +1,90 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine TA1_send_18_to_self_5_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_8_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_9_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_1_to_self_every_second(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA1_send_11_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_timer_service_routine TA2_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 6
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 7 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 7 ]; /* array of timer names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp11/task1.c b/testsuites/sptests/sp11/task1.c
new file mode 100644
index 0000000000..a7691dd2b0
--- /dev/null
+++ b/testsuites/sptests/sp11/task1.c
@@ -0,0 +1,410 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the event maager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set eventout;
+ rtems_time_of_day time;
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_16 to TA2" );
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_16 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA1 - rtems_event_receive - waiting forever on "
+ "RTEMS_EVENT_14 and RTEMS_EVENT_15"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_14 | RTEMS_EVENT_15,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf(
+ "TA1 - RTEMS_EVENT_14 and RTEMS_EVENT_15 received - eventout => %08x\n",
+ eventout
+ );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_18 to TA2" );
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_18 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA1 - rtems_event_receive - waiting with 10 second timeout on RTEMS_EVENT_14"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_14,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA1 - RTEMS_EVENT_14 received - eventout => %08x\n", eventout );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_19 to TA2" );
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_19 );
+ directive_failed( status, "rtems_event_send" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+ print_time( "TA1 - rtems_clock_get - ", &time, "\n" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ TA1_send_18_to_self_5_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 5 seconds" );
+
+ puts( "TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_18" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_18,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive of 18" );
+ printf( "TA1 - RTEMS_EVENT_18 received - eventout => %08x\n", eventout );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "TA1 rtems_clock_get" );
+ print_time( "TA1 - rtems_clock_get - ", &time, "\n" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_3 to self" );
+ status = rtems_event_send( RTEMS_SELF, RTEMS_EVENT_3 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA1 - rtems_event_receive - RTEMS_EVENT_3 or "
+ "RTEMS_EVENT_22 - NO_WAIT and ANY"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_3 | RTEMS_EVENT_22,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive of 3 and 22" );
+ printf( "TA1 - RTEMS_EVENT_3 received - eventout => %08x\n", eventout );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_4 to self" );
+ status = rtems_event_send( RTEMS_SELF, RTEMS_EVENT_4 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts (
+ "TA1 - rtems_event_receive - RTEMS_EVENT_4 or "
+ "RTEMS_EVENT_5 - forever and ANY"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_4 | RTEMS_EVENT_5,
+ RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA1 - RTEMS_EVENT_4 received - eventout => %08x\n", eventout );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_18 to self after 5 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 5 * TICKS_PER_SECOND,
+ TA1_send_18_to_self_5_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 5 seconds" );
+
+ puts( "TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_18");
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_8 to self after 60 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 60 * TICKS_PER_SECOND,
+ TA1_send_8_to_self_60_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 60 seconds" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_9 to self after 60 seconds");
+ status = rtems_timer_fire_after(
+ Timer_id[ 2 ],
+ 60 * TICKS_PER_SECOND,
+ TA1_send_9_to_self_60_seconds,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 60 seconds" );
+
+ puts(
+ "TA1 - rtems_event_send - send RTEMS_EVENT_10 to self after 60 seconds"
+ );
+ status = rtems_timer_fire_after(
+ Timer_id[ 3 ],
+ 60 * TICKS_PER_SECOND,
+ TA1_send_10_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 60 seconds" );
+
+ puts( "TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_8" );
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ build_time( &time, 2, 12, 1988, 8, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ puts( "TA1 - rtems_event_send - send RTEMS_EVENT_1 every second" );
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ TICKS_PER_SECOND,
+ TA1_send_1_to_self_every_second,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 1 second" );
+
+ for ( index = 0; index < 3; index++ ) {
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_1,
+ RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ printf( "TA1 - RTEMS_EVENT_1 received - eventout => %08x - ", eventout );
+ print_time( "at ", &time, "\n" );
+
+ if ( index < 2 ) {
+ status = rtems_timer_reset( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_reset" );
+ };
+
+ }
+
+ puts( "TA1 - rtems_timer_cancel - cancelling timer for event RTEMS_EVENT_1" );
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+rtems_test_pause();
+
+ time.day = 13;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 1 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 1 day" );
+
+ time.hour = 7;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 1 day" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 2 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 1 day" );
+
+ time.hour = 8; /* so code below has correct time/date */
+ time.day = 14;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 3 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 2 days" );
+
+ puts("TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 1 day");
+ status = rtems_timer_cancel( Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ puts(
+ "TA1 - rtems_timer_cancel - cancelling RTEMS_EVENT_11 to self in 2 days"
+ );
+ status = rtems_timer_cancel( Timer_id[ 3 ] );
+ directive_failed( status, "rtems_timer_cancel" );
+
+ puts(
+ "TA1 - rtems_event_send - resending RTEMS_EVENT_11 to self in 2 days"
+ );
+ status = rtems_timer_fire_when(
+ Timer_id[ 3 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 2 days" );
+
+ time.day = 15;
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "TA1 rtems_clock_set" );
+
+ puts( "TA1 - rtems_event_receive - waiting forever on RTEMS_EVENT_11" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_11,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA1 - RTEMS_EVENT_11 received - eventout => %08x\n", eventout );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_event_send/rtems_event_receive combination" );
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 10,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 10 ticks" );
+
+ status = rtems_event_receive(
+ RTEMS_EVENT_11,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+
+ build_time( &time, 2, 12, 1988, 8, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ time.day = 13;
+ puts( "TA1 - rtems_event_receive all outstanding events" );
+ status = rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ 0,
+ &eventout
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive all events"
+ );
+
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_10 to self in 1 day" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 1 ],
+ &time,
+ TA1_send_10_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 1 day" );
+
+ time.day = 14;
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 2 days" );
+ status = rtems_timer_fire_when(
+ Timer_id[ 2 ],
+ &time,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when 2 days" );
+
+ build_time( &time, 2, 12, 1988, 7, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ puts( "TA1 - set time backwards" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ status = rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ if ( eventout ) printf( "ERROR -0x%08x events received\n", eventout );
+ else puts( "TA1 - no events received" );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_event_receive all events"
+ );
+
+ build_time( &time, 2, 14, 1988, 7, 15, 0, 0 );
+
+ print_time( "TA1 - rtems_clock_set - ", &time, "\n" );
+ puts( "TA1 - set time forwards (leave a timer)" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ status = rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT | RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ if ( eventout == RTEMS_EVENT_10 ) puts( "TA1 - RTEMS_EVENT_10 received" );
+ else printf( "ERROR -0x%08x events received\n", eventout );
+ directive_failed( status, "rtems_event_receive all events" );
+
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 100 ticks");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 100,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 100 ticks" );
+
+ puts( "TA1 - rtems_event_send - sending RTEMS_EVENT_11 to self in 200 ticks");
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ 200,
+ TA1_send_11_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after 200 ticks" );
+
+ puts( "*** END OF TEST 11 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp11/task2.c b/testsuites/sptests/sp11/task2.c
new file mode 100644
index 0000000000..9a233dd52c
--- /dev/null
+++ b/testsuites/sptests/sp11/task2.c
@@ -0,0 +1,126 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Multiple tasks are required to
+ * verify all capabilities of the event manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set eventout;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_wake_after( 1*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_16" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA2 - RTEMS_EVENT_16 received - eventout => %08x\n", eventout );
+
+ puts(
+ "TA2 - rtems_event_send - send RTEMS_EVENT_14 and RTEMS_EVENT_15 to TA1"
+ );
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_14 | RTEMS_EVENT_15 );
+ directive_failed( status, "rtems_event_send" );
+
+ puts(
+ "TA2 - rtems_event_receive - RTEMS_EVENT_17 or "
+ "RTEMS_EVENT_18 - forever and ANY"
+ );
+ status = rtems_event_receive(
+ RTEMS_EVENT_17 | RTEMS_EVENT_18,
+ RTEMS_EVENT_ANY,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf(
+ "TA2 - RTEMS_EVENT_17 or RTEMS_EVENT_18 received - eventout => %08x\n",
+ eventout
+ );
+
+ puts( "TA2 - rtems_event_send - send RTEMS_EVENT_14 to TA1" );
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_14 );
+ directive_failed( status, "rtems_event_send" );
+
+ build_time( &time, 2, 12, 1988, 8, 15, 0, 0 );
+ print_time( "TA2 - rtems_clock_set - ", &time, "\n" );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "TA2 rtems_clock_set" );
+
+ time.second += 4;
+ puts(
+ "TA2 - rtems_event_send - sending RTEMS_EVENT_10 to self after 4 seconds"
+ );
+ status = rtems_timer_fire_when(
+ Timer_id[ 5 ],
+ &time,
+ TA2_send_10_to_self,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_when after 4 seconds" );
+
+ puts( "TA2 - rtems_event_receive - waiting forever on RTEMS_EVENT_10" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_10,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ printf( "TA2 - RTEMS_EVENT_10 received - eventout => %08x\n", eventout );
+ print_time( "TA2 - rtems_clock_get - ", &time, "\n" );
+
+ puts( "TA2 - rtems_event_receive - RTEMS_PENDING_EVENTS" );
+ status = rtems_event_receive(
+ RTEMS_PENDING_EVENTS,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA2 - eventout => %08x\n", eventout );
+
+ puts( "TA2 - rtems_event_receive - RTEMS_EVENT_19 - RTEMS_NO_WAIT" );
+ status = rtems_event_receive(
+ RTEMS_EVENT_19,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ directive_failed( status, "rtems_event_receive" );
+ printf( "TA2 - RTEMS_EVENT_19 received - eventout => %08x\n", eventout );
+
+ puts( "TA2 - rtems_task_delete - deletes self" );
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete of TA2" );
+}
diff --git a/testsuites/sptests/sp11/timer.c b/testsuites/sptests/sp11/timer.c
new file mode 100644
index 0000000000..4a7fb7044c
--- /dev/null
+++ b/testsuites/sptests/sp11/timer.c
@@ -0,0 +1,97 @@
+/* Timer_functions
+ *
+ * These routines are the timer service routines used by this test.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine TA1_send_18_to_self_5_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_18 );
+ directive_failed( status, "rtems_event_send of 18" );
+}
+
+rtems_timer_service_routine TA1_send_8_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_8 );
+ directive_failed( status, "rtems_event_send of 8" );
+}
+
+rtems_timer_service_routine TA1_send_9_to_self_60_seconds(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_9 );
+ directive_failed( status, "rtems_event_send of 9" );
+}
+
+rtems_timer_service_routine TA1_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_10 );
+ directive_failed( status, "rtems_event_send of 10" );
+}
+
+rtems_timer_service_routine TA1_send_1_to_self_every_second(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_1 );
+ directive_failed( status, "rtems_event_send of 1" );
+}
+
+rtems_timer_service_routine TA1_send_11_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 1 ], RTEMS_EVENT_11 );
+ directive_failed( status, "rtems_event_send of 11" );
+}
+
+rtems_timer_service_routine TA2_send_10_to_self(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_event_send( Task_id[ 2 ], RTEMS_EVENT_10 );
+ directive_failed( status, "rtems_event_send of 10" );
+}
diff --git a/testsuites/sptests/sp12/init.c b/testsuites/sptests/sp12/init.c
new file mode 100644
index 0000000000..862033ce1e
--- /dev/null
+++ b/testsuites/sptests/sp12/init.c
@@ -0,0 +1,179 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 12 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ Priority_task_name[ 1 ] = rtems_build_name( 'P', 'R', 'I', '1' );
+ Priority_task_name[ 2 ] = rtems_build_name( 'P', 'R', 'I', '2' );
+ Priority_task_name[ 3 ] = rtems_build_name( 'P', 'R', 'I', '3' );
+ Priority_task_name[ 4 ] = rtems_build_name( 'P', 'R', 'I', '4' );
+ Priority_task_name[ 5 ] = rtems_build_name( 'P', 'R', 'I', '5' );
+
+ Semaphore_name[ 1 ] = rtems_build_name( 'S', 'M', '1', ' ' );
+ Semaphore_name[ 2 ] = rtems_build_name( 'S', 'M', '2', ' ' );
+ Semaphore_name[ 3 ] = rtems_build_name( 'S', 'M', '3', ' ' );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 1 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 1 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 0,
+ RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of SM2" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 3 ],
+ 1,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 3 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of SM3" );
+
+ puts( "INIT - Forward priority queue test" );
+ Priority_test_driver( 0 );
+
+ puts( "INIT - Backward priority queue test" );
+ Priority_test_driver( 32 );
+
+rtems_test_pause();
+
+ puts( "INIT - Binary Semaphore and Priority Inheritance Test" );
+
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM2" );
+
+ puts( "INIT - rtems_semaphore_create - allocated binary semaphore" );
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 0,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of priority inherit SM2" );
+
+ puts( "INIT - rtems_semaphore_release - allocated binary semaphore" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release of SM2" );
+
+ puts( "INIT - rtems_semaphore_delete - allocated binary semaphore" );
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM2" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of priority inherit SM2" );
+
+ Priority_test_driver( 64 );
+
+rtems_test_pause();
+
+ status = rtems_semaphore_delete( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM2" );
+
+ status = rtems_semaphore_create(
+ Semaphore_name[ 2 ],
+ 0,
+ RTEMS_PRIORITY,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id[ 2 ]
+ );
+ directive_failed( status, "rtems_semaphore_create of priority SM2" );
+
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release of SM2" );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp12/pridrv.c b/testsuites/sptests/sp12/pridrv.c
new file mode 100644
index 0000000000..8ddf90749a
--- /dev/null
+++ b/testsuites/sptests/sp12/pridrv.c
@@ -0,0 +1,131 @@
+/* Priority_test_driver
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * priority_base - priority_base switch
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Priority_test_driver(
+ rtems_unsigned32 priority_base
+)
+{
+ rtems_task_priority previous_priority;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ switch ( index ) {
+ case 1:
+ case 2:
+ case 3:
+ Task_priority[ index ] = priority_base + index;
+ break;
+ default:
+ Task_priority[ index ] = priority_base + 3;
+ break;
+ }
+
+ status = rtems_task_create(
+ Priority_task_name[ index ],
+ Task_priority[ index ],
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Priority_task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ }
+
+ if ( priority_base == 0 ) {
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_start(
+ Priority_task_id[ index ],
+ Priority_task,
+ index
+ );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+ } else {
+ for ( index = 5 ; index >= 1 ; index-- ) {
+ status = rtems_task_start(
+ Priority_task_id[ index ],
+ Priority_task,
+ index
+ );
+ directive_failed( status, "rtems_task_start loop" );
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after loop" );
+
+ if ( priority_base == 64 ) {
+ if ( index == 4 ) {
+ status = rtems_task_set_priority(
+ Priority_task_id[ 5 ],
+ priority_base + 4,
+ &previous_priority
+ );
+ printf( "PDRV - change priority of PRI5 from %d to %d\n",
+ previous_priority,
+ priority_base + 4
+ );
+ directive_failed( status, "PDRV rtems_task_set_priority" );
+ }
+ status = rtems_task_set_priority(
+ Priority_task_id[ 5 ],
+ RTEMS_CURRENT_PRIORITY,
+ &previous_priority
+ );
+ directive_failed( status, "PDRV rtems_task_set_priority CURRENT" );
+ printf( "PDRV - priority of PRI5 is %d\n", previous_priority );
+ }
+ }
+ }
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after after loop" );
+
+ if ( priority_base == 0 ) {
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release loop" );
+ }
+ }
+
+ if ( priority_base == 64 ) {
+ puts( "PDRV - rtems_task_resume - PRI5" );
+ status = rtems_task_resume( Priority_task_id[ 5 ] );
+ directive_failed( status, "rtems_task_resume" );
+
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after so PRI5 can run" );
+
+ status = rtems_task_delete( Priority_task_id[ 5 ] );
+ directive_failed( status, "rtems_task_delete of PRI5" );
+ }
+ else {
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_delete( Priority_task_id[ index ] );
+ directive_failed( status, "rtems_task_delete loop" );
+ }
+ }
+}
diff --git a/testsuites/sptests/sp12/pritask.c b/testsuites/sptests/sp12/pritask.c
new file mode 100644
index 0000000000..24a1ceb4d6
--- /dev/null
+++ b/testsuites/sptests/sp12/pritask.c
@@ -0,0 +1,91 @@
+/* Priority_task
+ *
+ * This routine serves as a test task. It verifies the semaphore manager.
+ *
+ * Input parameters:
+ * its_index - priority index
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Priority_task(
+ rtems_task_argument its_index
+)
+{
+ rtems_interval timeout;
+ rtems_task_priority its_priority;
+ rtems_task_priority current_priority;
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ its_priority = Task_priority[ its_index ];
+
+ if ( its_priority < 3 )
+ timeout = 5 * TICKS_PER_SECOND;
+ else
+ timeout = RTEMS_NO_TIMEOUT;
+
+ put_name( Priority_task_name[ its_index ], FALSE );
+ puts( " - rtems_semaphore_obtain - wait forever on SM2" );
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ timeout
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM2" );
+
+ if ( its_priority < 64 ) {
+ printf( "PRI%d - WHY AM I HERE? (pri=%d)", its_index, its_priority );
+ exit( 0 );
+ }
+
+ if ( its_index == 5 )
+ puts( "PRI5 - rtems_task_suspend - until all priority tasks blocked" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ puts( "PRI5 - rtems_task_delete - all tasks waiting on SM2" );
+ for ( index = 1 ; index < 5 ; index++ ) {
+ status = rtems_task_delete( Priority_task_id[ index ] );
+ directive_failed( status, "rtems_task_delete loop" );
+ }
+
+ puts( "PRI5 - rtems_semaphore_obtain - nested" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ timeout
+ );
+ directive_failed( status, "rtems_semaphore_obtain nested" );
+
+ puts( "PRI5 - rtems_semaphore_release - nested" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release nested " );
+
+ puts( "PRI5 - rtems_semaphore_release - restore priority" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release" );
+
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ RTEMS_CURRENT_PRIORITY,
+ &current_priority
+ );
+ directive_failed( status, "PRI5 rtems_task_set_priority CURRENT" );
+ printf( "PRI5 - priority of PRI5 is %d\n", current_priority );
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
diff --git a/testsuites/sptests/sp12/sp12.doc b/testsuites/sptests/sp12/sp12.doc
new file mode 100644
index 0000000000..c68b14bf58
--- /dev/null
+++ b/testsuites/sptests/sp12/sp12.doc
@@ -0,0 +1,27 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test12
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ sm_create, sm_ident, sm_delete, sm_p, sm_v, tm_wkafter, t_setpri
+
+concepts:
+
+ a. This test checks out the semaphore manager.
+
+ b. This test forces _Flush_taskq() to unblock a task waiting
+ on a deleted object.
diff --git a/testsuites/sptests/sp12/sp12.scn b/testsuites/sptests/sp12/sp12.scn
new file mode 100644
index 0000000000..e87a729259
--- /dev/null
+++ b/testsuites/sptests/sp12/sp12.scn
@@ -0,0 +1,78 @@
+*** TEST 12 ***
+INIT - Forward priority queue test
+PRI1 - rtems_semaphore_obtain - wait forever on SM2
+PRI2 - rtems_semaphore_obtain - wait forever on SM2
+PRI3 - rtems_semaphore_obtain - wait forever on SM2
+PRI4 - rtems_semaphore_obtain - wait forever on SM2
+PRI5 - rtems_semaphore_obtain - wait forever on SM2
+INIT - Backward priority queue test
+PRI5 - rtems_semaphore_obtain - wait forever on SM2
+PRI4 - rtems_semaphore_obtain - wait forever on SM2
+PRI3 - rtems_semaphore_obtain - wait forever on SM2
+PRI2 - rtems_semaphore_obtain - wait forever on SM2
+PRI1 - rtems_semaphore_obtain - wait forever on SM2
+<pause>
+INIT - Binary Semaphore and Priority Inheritance Test
+INIT - rtems_semaphore_create - allocated binary semaphore
+INIT - rtems_semaphore_release - allocated binary semaphore
+INIT - rtems_semaphore_delete - allocated binary semaphore
+PRI5 - rtems_semaphore_obtain - wait forever on SM2
+PRI5 - rtems_task_suspend - until all priority tasks blocked
+PDRV - priority of PRI5 is 67
+PRI4 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - change priority of PRI5 from 67 to 68
+PDRV - priority of PRI5 is 67
+PRI3 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - priority of PRI5 is 67
+PRI2 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - priority of PRI5 is 66
+PRI1 - rtems_semaphore_obtain - wait forever on SM2
+PDRV - priority of PRI5 is 65
+PDRV - rtems_task_resume - PRI5
+PRI5 - rtems_task_delete - all tasks waiting on SM2
+PRI5 - rtems_semaphore_obtain - nested
+PRI5 - rtems_semaphore_release - nested
+PRI5 - rtems_semaphore_release - restore priority
+PRI5 - priority of PRI5 is 68
+<pause>
+TA1 - rtems_semaphore_ident - smid => 14010002
+TA1 - rtems_semaphore_obtain - wait forever on SM2
+TA1 - got SM2
+TA1 - rtems_semaphore_obtain - wait forever on SM3
+TA1 - got SM3
+TA1 - rtems_semaphore_obtain - get SM1 - RTEMS_NO_WAIT
+TA1 - got SM1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_semaphore_obtain - wait forever on SM1
+TA3 - rtems_semaphore_obtain - wait forever on SM2
+<pause>
+TA1 - rtems_semaphore_release - release SM1
+TA1 - rtems_semaphore_obtain - waiting for SM1 with 10 second timeout
+TA2 - got SM1
+TA2 - rtems_semaphore_release - release SM1
+TA2 - rtems_task_set_priority - make self highest priority task
+TA2 - rtems_semaphore_obtain - wait forever on SM2
+TA1 - got SM1
+TA1 - rtems_semaphore_release - release SM2
+TA2 - got SM2
+TA2 - rtems_semaphore_release - release SM2
+TA2 - rtems_task_delete - delete self
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - got SM2
+TA3 - rtems_semaphore_release - release SM2
+TA3 - rtems_semaphore_obtain - wait forever on SM3
+<pause>
+TA1 - rtems_task_delete - delete TA3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA4 - rtems_semaphore_obtain - wait forever on SM1
+TA5 - rtems_semaphore_obtain - wait forever on SM1
+TA1 - rtems_task_delete - delete TA4
+TA1 - rtems_semaphore_release - release SM1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA5 - got SM1
+TA5 - rtems_semaphore_obtain - wait forever on SM1
+TA1 - rtems_semaphore_delete - delete SM1
+TA1 - rtems_semaphore_delete - delete SM3
+TA1 - rtems_task_delete - delete self
+TA5 - SM1 deleted by TA1
+*** END OF TEST 12 ***
diff --git a/testsuites/sptests/sp12/system.h b/testsuites/sptests/sp12/system.h
new file mode 100644
index 0000000000..e06f3b1df8
--- /dev/null
+++ b/testsuites/sptests/sp12/system.h
@@ -0,0 +1,82 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+void Priority_test_driver(
+ rtems_unsigned32 priority_base
+);
+
+rtems_task Priority_task(
+ rtems_task_argument its_index
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_task Task5(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INIT_TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE * 2)
+#define CONFIGURE_MAXIMUM_SEMAPHORES 10
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Priority_task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Priority_task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN rtems_task_priority Task_priority[ 6 ];
+
+TEST_EXTERN rtems_id Semaphore_id[ 4 ]; /* array of semaphore ids */
+TEST_EXTERN rtems_name Semaphore_name[ 4 ]; /* array of semaphore names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp12/task1.c b/testsuites/sptests/sp12/task1.c
new file mode 100644
index 0000000000..75ca767d45
--- /dev/null
+++ b/testsuites/sptests/sp12/task1.c
@@ -0,0 +1,153 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the semaphore manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id smid;
+ rtems_status_code status;
+
+ status = rtems_semaphore_ident(
+ Semaphore_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &smid
+ );
+ printf( "TA1 - rtems_semaphore_ident - smid => %08x\n", smid );
+ directive_failed( status, "rtems_semaphore_ident of SM1" );
+
+ puts( "TA1 - rtems_semaphore_obtain - wait forever on SM2" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM2" );
+ puts( "TA1 - got SM2" );
+
+ puts( "TA1 - rtems_semaphore_obtain - wait forever on SM3" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 3 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM3" );
+ puts( "TA1 - got SM3" );
+
+ puts( "TA1 - rtems_semaphore_obtain - get SM1 - RTEMS_NO_WAIT" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM1" );
+ puts( "TA1 - got SM1" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_semaphore_release - release SM1" );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release of SM1" );
+
+ puts(
+ "TA1 - rtems_semaphore_obtain - waiting for SM1 with 10 second timeout"
+ );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_semaphore_obtain of SM1" );
+ puts( "TA1 - got SM1" );
+
+ puts( "TA1 - rtems_semaphore_release - release SM2" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release of SM2" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_task_delete - delete TA3" );
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], Task5, 0 );
+ directive_failed( status, "rtems_task_start of TA5" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_delete - delete TA4" );
+ status = rtems_task_delete( Task_id[ 4 ] );
+ directive_failed( status, "rtems_task_delete of TA4" );
+
+ puts( "TA1 - rtems_semaphore_release - release SM1" );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release on SM1" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_semaphore_delete - delete SM1" );
+ status = rtems_semaphore_delete( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM1" );
+
+ puts( "TA1 - rtems_semaphore_delete - delete SM3" );
+ status = rtems_semaphore_delete( Semaphore_id[ 3 ] );
+ directive_failed( status, "rtems_semaphore_delete of SM3" );
+
+ puts( "TA1 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA1" );
+}
diff --git a/testsuites/sptests/sp12/task2.c b/testsuites/sptests/sp12/task2.c
new file mode 100644
index 0000000000..0e2b2a4dfc
--- /dev/null
+++ b/testsuites/sptests/sp12/task2.c
@@ -0,0 +1,65 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It simply obtains semaphores
+ * 1 and 2, the later when it is a high priority task.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+
+ puts( "TA2 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "TA2 - got SM1" );
+ directive_failed( status, "rtems_semaphore_obtain on SM1" );
+
+ puts( "TA2 - rtems_semaphore_release - release SM1" );
+ status = rtems_semaphore_release( Semaphore_id[ 1 ] );
+ directive_failed( status, "rtems_semaphore_release on SM1" );
+
+ puts( "TA2 - rtems_task_set_priority - make self highest priority task" );
+ status = rtems_task_set_priority( RTEMS_SELF, 3, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority on TA2" );
+
+ puts( "TA2 - rtems_semaphore_obtain - wait forever on SM2" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ puts( "TA2 - got SM2" );
+ directive_failed( status, "rtems_semaphore_obtain on SM2" );
+
+ puts( "TA2 - rtems_semaphore_release - release SM2" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release on SM2" );
+
+ puts( "TA2 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA2" );
+}
diff --git a/testsuites/sptests/sp12/task3.c b/testsuites/sptests/sp12/task3.c
new file mode 100644
index 0000000000..c951a4bdc4
--- /dev/null
+++ b/testsuites/sptests/sp12/task3.c
@@ -0,0 +1,50 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It simply obtains semaphore
+ * 2 and waits forever attempting to obtain semaphore 3.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA3 - rtems_semaphore_obtain - wait forever on SM2" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 2 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM2" );
+ puts( "TA3 - got SM2" );
+
+ puts( "TA3 - rtems_semaphore_release - release SM2" );
+ status = rtems_semaphore_release( Semaphore_id[ 2 ] );
+ directive_failed( status, "rtems_semaphore_release on SM2" );
+
+ puts( "TA3 - rtems_semaphore_obtain - wait forever on SM3" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 3 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM3" );
+}
diff --git a/testsuites/sptests/sp12/task4.c b/testsuites/sptests/sp12/task4.c
new file mode 100644
index 0000000000..a0c8bb40c7
--- /dev/null
+++ b/testsuites/sptests/sp12/task4.c
@@ -0,0 +1,37 @@
+/* Task_4
+ *
+ * This routine serves as a test task. It waits forever attempting
+ * to obtain semaphore 1. However, it should never get the semaphore!
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA4 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM1" );
+}
diff --git a/testsuites/sptests/sp12/task5.c b/testsuites/sptests/sp12/task5.c
new file mode 100644
index 0000000000..ca3957015a
--- /dev/null
+++ b/testsuites/sptests/sp12/task5.c
@@ -0,0 +1,55 @@
+/* Task5
+ *
+ * This routine serves as a test task. It obtains semaphore 1 correctly
+ * once, then waits for semaphore 1 again. Task 1 should delete the
+ * semaphore, thus waking this task up.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task5(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA5 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_semaphore_obtain on SM1" );
+ puts( "TA5 - got SM1" );
+
+ puts( "TA5 - rtems_semaphore_obtain - wait forever on SM1" );
+ status = rtems_semaphore_obtain(
+ Semaphore_id[ 1 ],
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_OBJECT_WAS_DELETED,
+ "rtems_semaphore_obtain on SM1"
+ );
+ puts( "TA5 - SM1 deleted by TA1" );
+
+ puts( "*** END OF TEST 12 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp13/fillbuff.c b/testsuites/sptests/sp13/fillbuff.c
new file mode 100644
index 0000000000..b0d1186ddc
--- /dev/null
+++ b/testsuites/sptests/sp13/fillbuff.c
@@ -0,0 +1,31 @@
+/* Fill_buffer
+ *
+ * This test routine copies a given source string to a given destination
+ * buffer.
+ *
+ * Input parameters:
+ * source - pointer to string to be copied
+ * buffer - pointer to message buffer to be filled
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Fill_buffer(
+ char *source,
+ long *buffer
+)
+{
+ memcpy( buffer, source, 16 );
+}
diff --git a/testsuites/sptests/sp13/init.c b/testsuites/sptests/sp13/init.c
new file mode 100644
index 0000000000..afe7d4e19b
--- /dev/null
+++ b/testsuites/sptests/sp13/init.c
@@ -0,0 +1,112 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 13 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ Queue_name[ 1 ] = rtems_build_name( 'Q', '1', ' ', ' ' );
+ Queue_name[ 2 ] = rtems_build_name( 'Q', '2', ' ', ' ' );
+ Queue_name[ 3 ] = rtems_build_name( 'Q', '3', ' ', ' ' );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 100,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q1" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 2 ],
+ 10,
+ 16,
+ RTEMS_PRIORITY,
+ &Queue_id[ 2 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q2" );
+
+ status = rtems_message_queue_create(
+ Queue_name[ 3 ],
+ 100,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 3 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp13/putbuff.c b/testsuites/sptests/sp13/putbuff.c
new file mode 100644
index 0000000000..6a4c08ee1d
--- /dev/null
+++ b/testsuites/sptests/sp13/putbuff.c
@@ -0,0 +1,29 @@
+/* Put_buffer
+ *
+ * This test routine prints the given buffer.
+ * buffer.
+ *
+ * Input parameters:
+ * buffer - pointer to message buffer to be printer
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Put_buffer(
+ long *buffer
+)
+{
+ printf( "%16s", (char *)buffer );
+}
diff --git a/testsuites/sptests/sp13/sp13.doc b/testsuites/sptests/sp13/sp13.doc
new file mode 100644
index 0000000000..25747815aa
--- /dev/null
+++ b/testsuites/sptests/sp13/sp13.doc
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test13
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ q_create, q_ident, q_delete, q_send, q_urgent, q_broadcast, q_receive,
+ tm_wkafter, t_setpri
+
+concepts:
+
+ a. This test checks out the message manager.
diff --git a/testsuites/sptests/sp13/sp13.scn b/testsuites/sptests/sp13/sp13.scn
new file mode 100644
index 0000000000..11adfb8eb3
--- /dev/null
+++ b/testsuites/sptests/sp13/sp13.scn
@@ -0,0 +1,72 @@
+*** TEST 13 ***
+TA1 - rtems_message_queue_ident - qid => 18010001
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_NO_WAIT
+TA2 - buffer received: BUFFER 1 TO Q 1
+TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_WAIT FOREVER
+TA2 - buffer received: BUFFER 2 TO Q 1
+TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_WAIT FOREVER
+TA3 - rtems_message_queue_receive - receive from queue 2 - RTEMS_WAIT FOREVER
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA2 - buffer received: BUFFER 3 TO Q 1
+TA2 - rtems_task_set_priority - make self highest priority task
+TA2 - rtems_message_queue_receive - receive from queue 2 - RTEMS_WAIT FOREVER
+<pause>
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 2
+TA2 - buffer received: BUFFER 1 TO Q 2
+TA2 - rtems_message_queue_send - BUFFER 2 TO Q 2
+TA2 - rtems_message_queue_receive - receive from queue 1 - 10 second timeout
+TA1 - rtems_message_queue_receive - receive from queue 1 - 10 second timeout
+TA3 - buffer received: BUFFER 2 TO Q 2
+TA3 - rtems_message_queue_broadcast - BUFFER 3 TO Q 1
+TA2 - buffer received: BUFFER 3 TO Q 1
+TA2 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA3 - number of tasks awakened = 02
+TA3 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 3 TO Q 1
+TA1 - rtems_task_delete - delete TA2
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3
+TA1 - rtems_task_wake_after - sleep 5 seconds
+TA3 - buffer received: BUFFER 1 TO Q 3
+TA3 - rtems_task_delete - delete self
+<pause>
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 4 TO Q 3
+TA1 - rtems_message_queue_urgent - BUFFER 5 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 5 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 2 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 3 TO Q 3
+TA1 - rtems_message_queue_receive - receive from queue 3 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 4 TO Q 3
+TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2
+TA1 - rtems_message_queue_receive - receive from queue 2 - RTEMS_WAIT FOREVER
+TA1 - buffer received: BUFFER 3 TO Q 2
+<pause>
+TA1 - rtems_message_queue_delete - delete queue 1
+TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2
+TA1 - rtems_message_queue_delete - delete queue 2
+TA1 - rtems_message_queue_flush - empty Q 3
+TA1 - 0 messages were flushed from Q 3
+TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3
+TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3
+TA1 - rtems_message_queue_flush - Q 3
+TA1 - 3 messages were flushed from Q 3
+TA1 - rtems_message_queue_send until all message buffers consumed
+TA1 - all message buffers consumed
+TA1 - rtems_message_queue_flush - Q 3
+TA1 - 100 messages were flushed from Q 3
+<pause>
+TA1 - create message queue of 20 bytes on queue 1
+TA1 - rtems_message_queue_delete - delete queue 1
+<pause>
+TA1 - rtems_message_queue_create - variable sizes
+TA1 - rtems_message_queue_create and send - variable sizes
+*** END OF TEST 13 ***
diff --git a/testsuites/sptests/sp13/system.h b/testsuites/sptests/sp13/system.h
new file mode 100644
index 0000000000..7dbc55b933
--- /dev/null
+++ b/testsuites/sptests/sp13/system.h
@@ -0,0 +1,68 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+void Fill_buffer(
+ char source[],
+ long *buffer
+);
+
+void Put_buffer(
+ long *buffer
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 10
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Queue_id[ 4 ]; /* array of queue ids */
+TEST_EXTERN rtems_name Queue_name[ 4 ]; /* array of queue names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp13/task1.c b/testsuites/sptests/sp13/task1.c
new file mode 100644
index 0000000000..080d4608a7
--- /dev/null
+++ b/testsuites/sptests/sp13/task1.c
@@ -0,0 +1,344 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the message manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include <string.h> /* for memcmp */
+
+extern rtems_configuration_table BSP_Configuration;
+
+char big_send_buffer[2048];
+char big_receive_buffer[2048];
+
+long buffer[ 4 ];
+
+void dope_buffer(unsigned char *buff,
+ int buff_size,
+ unsigned32 v)
+{
+ int i;
+ unsigned char ch;
+
+ ch = (' ' + (v % (0x7f - ' ')));
+
+ for (i=0; i<buff_size; i++)
+ {
+ *buff++ = ch++;
+ if (ch >= 0x7f)
+ ch = ' ';
+ }
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id qid;
+ rtems_unsigned32 index;
+ rtems_unsigned32 count;
+ rtems_status_code status;
+ rtems_unsigned32 size;
+ rtems_unsigned32 queue_size;
+ char *cp;
+
+ status = rtems_message_queue_ident(
+ Queue_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &qid
+ );
+ printf( "TA1 - rtems_message_queue_ident - qid => %08x\n", qid );
+ directive_failed( status, "rtems_message_queue_ident" );
+
+ Fill_buffer( "BUFFER 1 TO Q 1", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 1" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 2 TO Q 1", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 1" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Fill_buffer( "BUFFER 3 TO Q 1", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 1" );
+ status = rtems_message_queue_send( Queue_id[ 1 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ Fill_buffer( "BUFFER 1 TO Q 2", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 2" );
+ status = rtems_message_queue_send( Queue_id[ 2 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts_nocr( "TA1 - rtems_message_queue_receive - receive from queue 1 - " );
+ puts ( "10 second timeout" );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA1 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts( "TA1 - rtems_task_delete - delete TA2" );
+ status = rtems_task_delete( Task_id[ 2 ] );
+ directive_failed( status, "rtems_task_delete" );
+
+ Fill_buffer( "BUFFER 1 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_task_wake_after - sleep 5 seconds" );
+ status = rtems_task_wake_after( 5*TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ Fill_buffer( "BUFFER 2 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 3 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 4 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 4 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 5 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_urgent - BUFFER 5 TO Q 3" );
+ status = rtems_message_queue_urgent( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ for ( index = 1 ; index <= 4 ; index++ ) {
+ puts(
+ "TA1 - rtems_message_queue_receive - receive from queue 3 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 3 ],
+ buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA1 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+ }
+
+ Fill_buffer( "BUFFER 3 TO Q 2", buffer );
+ puts( "TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2" );
+ status = rtems_message_queue_urgent( Queue_id[ 2 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ puts(
+ "TA1 - rtems_message_queue_receive - receive from queue 2 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 2 ],
+ buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA1 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_message_queue_delete - delete queue 1" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+
+ Fill_buffer( "BUFFER 3 TO Q 2", buffer );
+ puts( "TA1 - rtems_message_queue_urgent - BUFFER 3 TO Q 2" );
+ status = rtems_message_queue_urgent( Queue_id[ 2 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_urgent" );
+
+ puts( "TA1 - rtems_message_queue_delete - delete queue 2" );
+ status = rtems_message_queue_delete( Queue_id[ 2 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+
+ puts( "TA1 - rtems_message_queue_flush - empty Q 3" );
+ status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
+ printf( "TA1 - %d messages were flushed from Q 3\n", count );
+
+ Fill_buffer( "BUFFER 1 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 1 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 2 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 2 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Fill_buffer( "BUFFER 3 TO Q 3", buffer );
+ puts( "TA1 - rtems_message_queue_send - BUFFER 3 TO Q 3" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts( "TA1 - rtems_message_queue_flush - Q 3" );
+ status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
+ printf( "TA1 - %d messages were flushed from Q 3\n", count );
+
+ puts( "TA1 - rtems_message_queue_send until all message buffers consumed" );
+ while ( FOREVER ) {
+ status = rtems_message_queue_send( Queue_id[ 3 ], buffer, 16 );
+ if ( status == RTEMS_TOO_MANY ) break;
+ directive_failed( status, "rtems_message_queue_send loop" );
+ }
+
+ puts( "TA1 - all message buffers consumed" );
+ puts( "TA1 - rtems_message_queue_flush - Q 3" );
+ status = rtems_message_queue_flush( Queue_id[ 3 ], &count );
+ printf( "TA1 - %d messages were flushed from Q 3\n", count );
+
+rtems_test_pause();
+
+ puts( "TA1 - create message queue of 20 bytes on queue 1" );
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 100,
+ 20,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ directive_failed( status, "rtems_message_queue_create of Q1; 20 bytes each" );
+ status = rtems_message_queue_send( Queue_id[ 3 ], big_send_buffer, 40 );
+ fatal_directive_status(status, RTEMS_INVALID_SIZE, "expected RTEMS_INVALID_SIZE");
+
+ puts( "TA1 - rtems_message_queue_delete - delete queue 1" );
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_message_queue_create - variable sizes " );
+ for (queue_size = 1; queue_size < 1030; queue_size++)
+ {
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2, /* just 2 msgs each */
+ queue_size,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ printf("TA1 - msq que size: %d\n", queue_size);
+ directive_failed( status, "rtems_message_queue_create of Q1" );
+ }
+
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+ }
+
+ puts( "TA1 - rtems_message_queue_create and send - variable sizes " );
+ for (queue_size = 1; queue_size < 1030; queue_size++)
+ {
+ /* printf("TA1 - message queue size: %d\n", queue_size); */
+
+ status = rtems_message_queue_create(
+ Queue_name[ 1 ],
+ 2, /* just 2 msgs each */
+ queue_size,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id[ 1 ]
+ );
+
+ directive_failed( status, "rtems_message_queue_create of Q1" );
+
+ dope_buffer(big_send_buffer, sizeof(big_send_buffer), queue_size);
+ memset(big_receive_buffer, 'Z', sizeof(big_receive_buffer));
+
+ /* send a msg too big */
+ status = rtems_message_queue_send( Queue_id[ 1 ],
+ big_send_buffer,
+ queue_size + 1 );
+
+ fatal_directive_status(status,
+ RTEMS_INVALID_SIZE,
+ "rtems_message_queue_send too large");
+
+ /* send a msg that is just right */
+ status = rtems_message_queue_send(Queue_id[ 1 ],
+ big_send_buffer,
+ queue_size);
+ directive_failed(status, "rtems_message_queue_send exact size");
+
+ /* now read and verify the message just sent */
+ status = rtems_message_queue_receive(Queue_id[ 1 ],
+ big_receive_buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 1 * TICKS_PER_SECOND);
+ directive_failed(status, "rtems_message_queue_receive exact size");
+ if (size != queue_size)
+ {
+ puts("TA1 - exact size size match failed");
+ exit(1);
+ }
+
+ if (memcmp(big_send_buffer, big_receive_buffer, size) != 0)
+ {
+ puts("TA1 - exact size data match failed");
+ exit(1);
+ }
+
+ for (cp = (big_receive_buffer + size);
+ cp < (big_receive_buffer + sizeof(big_receive_buffer));
+ cp++)
+ if (*cp != 'Z')
+ {
+ puts("TA1 - exact size overrun match failed");
+ exit(1);
+ }
+
+ /* all done with this one; delete it */
+ status = rtems_message_queue_delete( Queue_id[ 1 ] );
+ directive_failed( status, "rtems_message_queue_delete" );
+ }
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp13/task2.c b/testsuites/sptests/sp13/task2.c
new file mode 100644
index 0000000000..00a002e31a
--- /dev/null
+++ b/testsuites/sptests/sp13/task2.c
@@ -0,0 +1,139 @@
+/* Task_2
+ *
+ * This routine serves as a test task. Multiple tasks are required to
+ * verify all message manager capabilities.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+ rtems_task_priority previous_priority;
+ rtems_status_code status;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - RTEMS_NO_WAIT"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts( "TA2 - rtems_task_set_priority - make self highest priority task" );
+ status = rtems_task_set_priority( RTEMS_SELF, 3, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 2 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 2 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ Fill_buffer( "BUFFER 2 TO Q 2", (long *)buffer );
+ puts( "TA2 - rtems_message_queue_send - BUFFER 2 TO Q 2" );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ status = rtems_message_queue_send( Queue_id[ 2 ], (long (*)[4])buffer, 16 );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 1 - "
+ "10 second timeout"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts(
+ "TA2 - rtems_message_queue_receive - receive from queue 3 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 3 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA2 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+}
diff --git a/testsuites/sptests/sp13/task3.c b/testsuites/sptests/sp13/task3.c
new file mode 100644
index 0000000000..43c1a31b12
--- /dev/null
+++ b/testsuites/sptests/sp13/task3.c
@@ -0,0 +1,78 @@
+/* Task_3
+ *
+ * This routine serves as a test task. Its major function is to
+ * broadcast a messge to all the other tasks.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ long buffer[ 4 ];
+ rtems_unsigned32 size;
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ puts(
+ "TA3 - rtems_message_queue_receive - receive from queue 2 - "
+ "RTEMS_WAIT FOREVER"
+ );
+ status = rtems_message_queue_receive(
+ Queue_id[ 2 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA3 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ Fill_buffer( "BUFFER 3 TO Q 1", (long *)buffer );
+ puts( "TA3 - rtems_message_queue_broadcast - BUFFER 3 TO Q 1" );
+ status = rtems_message_queue_broadcast(
+ Queue_id[ 1 ],
+ (long (*)[4])buffer,
+ 16,
+ &count
+ );
+ printf( "TA3 - number of tasks awakened = %02d\n", count );
+ puts(
+ "TA3 - rtems_message_queue_receive - receive from queue 3 - "
+ "RTEMS_WAIT FOREVER"
+ );
+
+ status = rtems_message_queue_receive(
+ Queue_id[ 3 ],
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "rtems_message_queue_receive" );
+ puts_nocr( "TA3 - buffer received: " );
+ Put_buffer( buffer );
+ new_line;
+
+ puts( "TA3 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp14/asr.c b/testsuites/sptests/sp14/asr.c
new file mode 100644
index 0000000000..85cf953b59
--- /dev/null
+++ b/testsuites/sptests/sp14/asr.c
@@ -0,0 +1,47 @@
+/* Process_asr
+ *
+ * This is the asynchronous signal routine (asr) for task 1.
+ * It demonstrates that ASRs can block execute and block.
+ *
+ * Input parameters:
+ * the_signal_set - signal set
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_asr Process_asr(
+ rtems_signal_set the_signal_set
+)
+{
+ rtems_status_code status;
+
+ printf( "ASR - ENTRY - signal => %08x\n", the_signal_set );
+ switch( the_signal_set ) {
+ case RTEMS_SIGNAL_16:
+ case RTEMS_SIGNAL_17:
+ case RTEMS_SIGNAL_18 | RTEMS_SIGNAL_19:
+ break;
+ case RTEMS_SIGNAL_0:
+ case RTEMS_SIGNAL_1:
+ puts( "ASR - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after yield" );
+ break;
+ case RTEMS_SIGNAL_3:
+ Asr_fired = TRUE;
+ break;
+ }
+ printf( "ASR - EXIT - signal => %08x\n", the_signal_set );
+}
diff --git a/testsuites/sptests/sp14/init.c b/testsuites/sptests/sp14/init.c
new file mode 100644
index 0000000000..b85f8bda77
--- /dev/null
+++ b/testsuites/sptests/sp14/init.c
@@ -0,0 +1,72 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 14 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create of TM1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp14/sp14.doc b/testsuites/sptests/sp14/sp14.doc
new file mode 100644
index 0000000000..ffd7c51519
--- /dev/null
+++ b/testsuites/sptests/sp14/sp14.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test14
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ as_catch, as_return, as_send, tm_wkafter
+
+concepts:
+
+ a. This test checks out the signal manager.
diff --git a/testsuites/sptests/sp14/sp14.scn b/testsuites/sptests/sp14/sp14.scn
new file mode 100644
index 0000000000..31e6d067d2
--- /dev/null
+++ b/testsuites/sptests/sp14/sp14.scn
@@ -0,0 +1,33 @@
+*** TEST 14 ***
+TA1 - rtems_signal_catch - RTEMS_INTERRUPT_LEVEL( 3 )
+TA1 - rtems_signal_send - RTEMS_SIGNAL_16 to self
+ASR - ENTRY - signal => 00010000
+ASR - EXIT - signal => 00010000
+TA1 - rtems_signal_send - RTEMS_SIGNAL_0 to self
+ASR - ENTRY - signal => 00000001
+ASR - rtems_task_wake_after - yield processor
+TA2 - rtems_signal_send - RTEMS_SIGNAL_17 to TA1
+TA2 - rtems_task_wake_after - yield processor
+ASR - ENTRY - signal => 00020000
+ASR - EXIT - signal => 00020000
+ASR - EXIT - signal => 00000001
+TA1 - rtems_signal_catch - RTEMS_NO_ASR
+<pause>
+TA1 - rtems_signal_send - RTEMS_SIGNAL_1 to self
+ASR - ENTRY - signal => 00000002
+ASR - rtems_task_wake_after - yield processor
+TA2 - rtems_signal_send - RTEMS_SIGNAL_18 and RTEMS_SIGNAL_19 to TA1
+TA2 - rtems_task_wake_after - yield processor
+ASR - EXIT - signal => 00000002
+ASR - ENTRY - signal => 000c0000
+ASR - EXIT - signal => 000c0000
+TA1 - rtems_task_mode - disable ASRs
+TA1 - sending signal to RTEMS_SELF from timer
+TA1 - waiting for signal to arrive
+TA1 - timer routine got the correct arguments
+TA1 - rtems_task_mode - enable ASRs
+ASR - ENTRY - signal => 00000008
+ASR - EXIT - signal => 00000008
+TA1 - rtems_signal_catch - asraddr of NULL
+TA1 - rtems_task_delete - delete self
+*** END OF TEST 14 ***
diff --git a/testsuites/sptests/sp14/system.h b/testsuites/sptests/sp14/system.h
new file mode 100644
index 0000000000..dbc837b435
--- /dev/null
+++ b/testsuites/sptests/sp14/system.h
@@ -0,0 +1,78 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Signal_3_to_task_1(
+ rtems_id id,
+ void *pointer
+);
+
+rtems_asr Process_asr(
+ rtems_signal_set the_signal_set
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 3 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 3 ]; /* array of timer names */
+
+TEST_EXTERN volatile rtems_unsigned32 Signals_sent;
+ /* set to TRUE to indicate that a */
+ /* signal set has been sent from */
+ /* an ISR to the executing task */
+
+TEST_EXTERN volatile rtems_unsigned32 Asr_fired;
+ /* set to TRUE to indicate that the */
+ /* RTEMS_ASR has executed and was */
+ /* passed the correct signal set */
+
+TEST_EXTERN volatile rtems_id Timer_got_this_id;
+
+TEST_EXTERN volatile void *Timer_got_this_pointer;
+
+/* end of include file */
diff --git a/testsuites/sptests/sp14/task1.c b/testsuites/sptests/sp14/task1.c
new file mode 100644
index 0000000000..8f5463c396
--- /dev/null
+++ b/testsuites/sptests/sp14/task1.c
@@ -0,0 +1,116 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It establishes an RTEMS_ASR and
+ * sends signal to itself to determine if the RTEMS_ASR gets to execute.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Signal_3_to_task_1(
+ rtems_id id,
+ void *pointer
+)
+{
+ rtems_status_code status;
+
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_3 );
+ directive_failed( status, "rtems_signal_send of 3" );
+
+ Timer_got_this_id = id;
+ Timer_got_this_pointer = pointer;
+
+ Signals_sent = TRUE;
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+ puts( "TA1 - rtems_signal_catch - RTEMS_INTERRUPT_LEVEL( 3 )" );
+ status = rtems_signal_catch( Process_asr, RTEMS_INTERRUPT_LEVEL(3) );
+ directive_failed( status, "rtems_signal_catch" );
+
+ puts( "TA1 - rtems_signal_send - RTEMS_SIGNAL_16 to self" );
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_16 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA1 - rtems_signal_send - RTEMS_SIGNAL_0 to self" );
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_0 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA1 - rtems_signal_catch - RTEMS_NO_ASR" );
+ status = rtems_signal_catch( Process_asr, RTEMS_NO_ASR );
+ directive_failed( status, "rtems_signal_catch" );
+
+rtems_test_pause();
+
+ puts( "TA1 - rtems_signal_send - RTEMS_SIGNAL_1 to self" );
+ status = rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_1 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA1 - rtems_task_mode - disable ASRs" );
+ status = rtems_task_mode( RTEMS_NO_ASR, RTEMS_ASR_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ Timer_got_this_id = 0;
+ Timer_got_this_pointer = NULL;
+
+ puts( "TA1 - sending signal to RTEMS_SELF from timer" );
+ status = rtems_timer_fire_after(
+ Timer_id[ 1 ],
+ TICKS_PER_SECOND / 2,
+ Signal_3_to_task_1,
+ (void *) Task_1
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - waiting for signal to arrive" );
+
+ Signals_sent = FALSE;
+ Asr_fired = FALSE;
+
+ while ( Signals_sent == FALSE )
+ ;
+
+ if ( Timer_got_this_id == Timer_id[ 1 ] &&
+ Timer_got_this_pointer == Task_1 )
+ puts( "TA1 - timer routine got the correct arguments" );
+ else
+ printf(
+ "TA1 - timer got (0x%x, %p) instead of (0x%x, %p)!!!!\n",
+ Timer_got_this_id,
+ Timer_got_this_pointer,
+ Timer_id[ 1 ],
+ Task_1
+ );
+
+ puts( "TA1 - rtems_task_mode - enable ASRs" );
+ status = rtems_task_mode( RTEMS_ASR, RTEMS_ASR_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ puts( "TA1 - rtems_signal_catch - asraddr of NULL" );
+ status = rtems_signal_catch( NULL, RTEMS_DEFAULT_MODES );
+ directive_failed( status, "rtems_signal_catch" );
+
+ puts( "TA1 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp14/task2.c b/testsuites/sptests/sp14/task2.c
new file mode 100644
index 0000000000..7a7927d981
--- /dev/null
+++ b/testsuites/sptests/sp14/task2.c
@@ -0,0 +1,48 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It verifies that one task can
+ * send signals to another task ( invoking the other task's RTEMS_ASR ).
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA2 - rtems_signal_send - RTEMS_SIGNAL_17 to TA1" );
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_17 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA2 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts("TA2 - rtems_signal_send - RTEMS_SIGNAL_18 and RTEMS_SIGNAL_19 to TA1");
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_18 | RTEMS_SIGNAL_19 );
+ directive_failed( status, "rtems_signal_send" );
+
+ puts( "TA2 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "*** END OF TEST 14 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp15/init.c b/testsuites/sptests/sp15/init.c
new file mode 100644
index 0000000000..23ece2e8c8
--- /dev/null
+++ b/testsuites/sptests/sp15/init.c
@@ -0,0 +1,78 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 15 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ Partition_name[ 1 ] = rtems_build_name( 'P', 'T', '1', ' ' );
+ Partition_name[ 2 ] = rtems_build_name( 'P', 'T', '2', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 4,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ puts("INIT - rtems_partition_create - partition 1");
+ status = rtems_partition_create(
+ Partition_name[ 1 ],
+ Area_1,
+ 4096,
+ 512,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id[ 1 ]
+ );
+ directive_failed( status, "rtems_partition_create of PT1" );
+
+ puts("INIT - rtems_partition_create - partition 2");
+ status = rtems_partition_create(
+ Partition_name[ 2 ],
+ Area_2,
+ 274,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id[ 2 ]
+ );
+ directive_failed( status, "rtems_partition_create of PT2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp15/sp15.doc b/testsuites/sptests/sp15/sp15.doc
new file mode 100644
index 0000000000..33e10b068c
--- /dev/null
+++ b/testsuites/sptests/sp15/sp15.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test15
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ pt_create, pt_ident, pt_getbuf, pt_retbuf, pt_delete
+
+concepts:
+
+ a. This test checks out the partition manager.
diff --git a/testsuites/sptests/sp15/sp15.scn b/testsuites/sptests/sp15/sp15.scn
new file mode 100644
index 0000000000..f1a800dc0d
--- /dev/null
+++ b/testsuites/sptests/sp15/sp15.scn
@@ -0,0 +1,16 @@
+*** TEST 15 ***
+INIT - rtems_partition_create - partition 1
+INIT - rtems_partition_create - partition 2
+TA1 - rtems_partition_ident - partition 1 id = 1c010001
+TA1 - rtems_partition_ident - partition 2 id = 1c010002
+TA1 - rtems_partition_get_buffer - buffer 1 from partition 1 - 0x00000000
+TA1 - rtems_partition_get_buffer - buffer 2 from partition 1 - 0x00000200
+TA1 - rtems_partition_get_buffer - buffer 1 from partition 2 - 0x00000000
+TA1 - rtems_partition_get_buffer - buffer 2 from partition 2 - 0x00000080
+TA1 - rtems_partition_return_buffer - buffer 1 to partition 1 - 0x00000000
+TA1 - rtems_partition_return_buffer - buffer 2 to partition 1 - 0x00000200
+TA1 - rtems_partition_return_buffer - buffer 1 to partition 2 - 0x00000000
+TA1 - rtems_partition_return_buffer - buffer 2 to partition 2 - 0x00000080
+TA1 - rtems_partition_delete - delete partition 1
+TA1 - rtems_partition_delete - delete partition 2
+*** END OF TEST 15 ***
diff --git a/testsuites/sptests/sp15/system.h b/testsuites/sptests/sp15/system.h
new file mode 100644
index 0000000000..cbd2ae934c
--- /dev/null
+++ b/testsuites/sptests/sp15/system.h
@@ -0,0 +1,62 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_PARTITIONS 2
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_name Partition_id[ 4 ]; /* array of partition ids */
+TEST_EXTERN rtems_name Partition_name[ 4 ]; /* array of partition names */
+
+TEST_EXTERN rtems_unsigned8 Area_1[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_2[274] CPU_STRUCTURE_ALIGNMENT;
+
+#define Put_address_from_area_1( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long)((rtems_unsigned8 *)(_to_be_printed) - Area_1 ) )
+
+#define Put_address_from_area_2( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long)((rtems_unsigned8 *)(_to_be_printed) - Area_2 ) )
+
+/* end of include file */
diff --git a/testsuites/sptests/sp15/task1.c b/testsuites/sptests/sp15/task1.c
new file mode 100644
index 0000000000..11664da95b
--- /dev/null
+++ b/testsuites/sptests/sp15/task1.c
@@ -0,0 +1,129 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the partition manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id ptid_1;
+ rtems_id ptid_2;
+ void *buffer_address_1;
+ void *buffer_address_2;
+ void *buffer_address_3;
+ void *buffer_address_4;
+ rtems_status_code status;
+
+ puts_nocr( "TA1 - rtems_partition_ident - partition 1 id = " );
+ status = rtems_partition_ident(
+ Partition_name[ 1 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &ptid_1
+ );
+ directive_failed( status, "rtems_partition_ident of PT1" );
+ printf( "%08x\n", ptid_1 );
+
+ puts_nocr( "TA1 - rtems_partition_ident - partition 2 id = " );
+ status = rtems_partition_ident(
+ Partition_name[ 2 ],
+ RTEMS_SEARCH_ALL_NODES,
+ &ptid_2
+ );
+ directive_failed( status, "rtems_partition_ident of PT2" );
+ printf( "%08x\n", ptid_2 );
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 1 from partition 1 - "
+ );
+ status = rtems_partition_get_buffer( ptid_1, &buffer_address_1 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_1( buffer_address_1 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 2 from partition 1 - "
+ );
+ status = rtems_partition_get_buffer( ptid_1, &buffer_address_2 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_1( buffer_address_2 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 1 from partition 2 - "
+ );
+ status = rtems_partition_get_buffer( ptid_2, &buffer_address_3 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_2( buffer_address_3 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_get_buffer - buffer 2 from partition 2 - "
+ );
+ status = rtems_partition_get_buffer( ptid_2, &buffer_address_4 );
+ directive_failed( status, "rtems_partition_get_buffer" );
+ Put_address_from_area_2( buffer_address_4 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 1 to partition 1 - "
+ );
+ Put_address_from_area_1( buffer_address_1 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_1, buffer_address_1 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 2 to partition 1 - "
+ );
+ Put_address_from_area_1( buffer_address_2 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_1, buffer_address_2 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 1 to partition 2 - "
+ );
+ Put_address_from_area_2( buffer_address_3 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_2, buffer_address_3 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts_nocr(
+ "TA1 - rtems_partition_return_buffer - buffer 2 to partition 2 - "
+ );
+ Put_address_from_area_2( buffer_address_4 );
+ new_line;
+ status = rtems_partition_return_buffer( ptid_2, buffer_address_4 );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ puts( "TA1 - rtems_partition_delete - delete partition 1"
+ );
+ status = rtems_partition_delete( ptid_1 );
+ directive_failed( status, "rtems_partition_delete" );
+
+ puts( "TA1 - rtems_partition_delete - delete partition 2"
+ );
+ status = rtems_partition_delete( ptid_2 );
+ directive_failed( status, "rtems_partition_delete" );
+
+ puts( "*** END OF TEST 15 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp16/init.c b/testsuites/sptests/sp16/init.c
new file mode 100644
index 0000000000..2dff7629bc
--- /dev/null
+++ b/testsuites/sptests/sp16/init.c
@@ -0,0 +1,128 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 16 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ Region_name[ 1 ] = rtems_build_name( 'R', 'N', '1', ' ' );
+ Region_name[ 2 ] = rtems_build_name( 'R', 'N', '2', ' ' );
+ Region_name[ 3 ] = rtems_build_name( 'R', 'N', '3', ' ' );
+ Region_name[ 4 ] = rtems_build_name( 'R', 'N', '4', ' ' );
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Area_1,
+ 4096,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 1 ]
+ );
+ directive_failed( status, "rtems_region_create of RN1" );
+
+ status = rtems_region_create(
+ Region_name[ 2 ],
+ Area_2,
+ 4096,
+ 128,
+ RTEMS_PRIORITY,
+ &Region_id[ 2 ]
+ );
+ directive_failed( status, "rtems_region_create of RN2" );
+
+ status = rtems_region_create(
+ Region_name[ 3 ],
+ Area_3,
+ 4096,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 3 ]
+ );
+ directive_failed( status, "rtems_region_create of RN3" );
+
+ status = rtems_region_create(
+ Region_name[ 4 ],
+ Area_4,
+ 4096,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 4 ]
+ );
+ directive_failed( status, "rtems_region_create of RN4" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp16/sp16.doc b/testsuites/sptests/sp16/sp16.doc
new file mode 100644
index 0000000000..86e8d7f236
--- /dev/null
+++ b/testsuites/sptests/sp16/sp16.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test16
+
+directives:
+ ex_init, ex_start, t_create, t_start, t_delete, tm_tick, i_return,
+ rn_create, rn_ident, rn_getbuf, rn_retbuf, rn_delete
+
+concepts:
+
+ a. This test checks out the region manager.
diff --git a/testsuites/sptests/sp16/sp16.scn b/testsuites/sptests/sp16/sp16.scn
new file mode 100644
index 0000000000..36d533c2b4
--- /dev/null
+++ b/testsuites/sptests/sp16/sp16.scn
@@ -0,0 +1,58 @@
+*** TEST 16 ***
+TA1 - rtems_region_ident - rnid => 20010002
+TA1 - rtems_region_get_segment - wait on 100 byte segment from region 2
+TA1 - got segment from region 2 - 0x00000f78
+TA1 - rtems_region_get_segment - wait on 3K segment from region 3
+TA1 - got segment from region 3 - 0x000003f8
+TA1 - rtems_region_get_segment - get 3080 byte segment from region 1 - NO_WAIT
+TA1 - got segment from region 1 - 0x00000378
+TA1 - rtems_task_wake_after - yield processor
+TA2 - rtems_region_get_segment - wait on 2K segment from region 1
+TA3 - rtems_region_get_segment - wait on 3968 byte segment from region 2
+<pause>
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x00000378
+TA1 - rtems_region_get_segment - wait 10 seconds for 3K segment from region 1
+TA2 - got segment from region 1 - 0x000007f8
+TA2 - rtems_region_return_segment - return segment to region 1 - 0x000007f8
+TA2 - rtems_task_set_priority - make self highest priority task
+TA2 - rtems_region_get_segment - wait on 3968 byte segment
+TA1 - got segment from region 1 - 0x000003f8
+TA1 - rtems_region_return_segment - return segment to region 2 - 0x00000f78
+TA2 - got segment from region 2 - 0x00000008
+TA2 - rtems_region_return_segment - return segment to region 2 - 0x00000008
+TA2 - rtems_task_delete - delete self
+TA1 - rtems_task_wake_after - yield processor
+TA3 - got segment from region 2 - 0x00000008
+TA3 - rtems_region_get_segment - wait on 2K segment from region 3
+TA1 - rtems_task_delete - delete TA3
+<pause>
+TA1 - rtems_task_wake_after - yield processor
+TA4 - rtems_region_get_segment - wait on 1.5K segment from region 1
+TA5 - rtems_region_get_segment - wait on 1.5K segment from region 1
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x000003f8
+TA1 - rtems_task_wake_after - yield processor
+TA4 - got and returned 0x000009f8
+TA5 - got and returned 0x000003f0
+TA1 - rtems_region_get_segment - wait 10 seconds for 3K segment from region 1
+TA1 - got segment from region 1 - 0x000003f8
+TA1 - rtems_task_wake_after - yield processor
+TA4 - rtems_region_get_segment - wait on 3K segment from region 1
+TA5 - rtems_region_get_segment - wait on 3K segment from region 1
+TA1 - rtems_task_delete - delete TA4
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x000003f8
+TA1 - rtems_task_wake_after - yield processor
+TA5 - got segment from region 1 - 0x000003f8
+TA5 - rtems_region_return_segment - return segment to region 1 - 0x000003f8
+TA5 - rtems_task_delete - delete self
+TA1 - rtems_region_delete - delete region 1
+TA1 - rtems_region_get_segment - get 3K segment from region 4
+TA1 - got segment from region 4 - 0x000003f8
+TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4
+TA1 - rtems_task_get_note - RTEMS_UNSATISFIED
+TA1 - rtems_region_extend - extend region 4 by 4K
+TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4
+TA1 - got 3K segment from region 4 - 0x00001400
+TA1 - rtems_region_return_segment - return segment to region 4 - 0x000003f8
+TA1 - rtems_region_return_segment - return segment to region 4 - 0x00001400
+TA1 - rtems_region_delete - delete region 4
+*** END OF TEST 16 ***
diff --git a/testsuites/sptests/sp16/system.h b/testsuites/sptests/sp16/system.h
new file mode 100644
index 0000000000..c8def60e12
--- /dev/null
+++ b/testsuites/sptests/sp16/system.h
@@ -0,0 +1,89 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Task_4(
+ rtems_task_argument argument
+);
+
+rtems_task Task5(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_REGIONS 4
+#define CONFIGURE_TICKS_PER_TIMESLICE 100
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+TEST_EXTERN rtems_id Region_id[ 5 ]; /* array of region ids */
+TEST_EXTERN rtems_name Region_name[ 5 ]; /* array of region names */
+
+TEST_EXTERN rtems_unsigned8 Area_1[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_2[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_3[4096] CPU_STRUCTURE_ALIGNMENT;
+TEST_EXTERN rtems_unsigned8 Area_4[8192] CPU_STRUCTURE_ALIGNMENT;
+
+#define BASE_PRIORITY 140
+
+#define Put_address_from_area_1( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_1 ) )
+
+#define Put_address_from_area_2( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_2 ) )
+
+#define Put_address_from_area_3( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_3 ) )
+
+#define Put_address_from_area_4( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_4 ) )
+
+/* end of include file */
diff --git a/testsuites/sptests/sp16/task1.c b/testsuites/sptests/sp16/task1.c
new file mode 100644
index 0000000000..b7560d7e95
--- /dev/null
+++ b/testsuites/sptests/sp16/task1.c
@@ -0,0 +1,282 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the region manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id rnid;
+ void *segment_address_1;
+ void *segment_address_2;
+ void *segment_address_3;
+ void *segment_address_4;
+ rtems_status_code status;
+
+ status = rtems_region_ident( Region_name[ 1 ], &rnid );
+ printf( "TA1 - rtems_region_ident - rnid => %08x\n", rnid );
+ directive_failed( status, "rtems_region_ident of RN1" );
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 100 byte segment from region 2"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 2 ],
+ 100,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 2 - " );
+ Put_address_from_area_2( segment_address_1 );
+ new_line;
+
+ puts( "TA1 - rtems_region_get_segment - wait on 3K segment from region 3" );
+ status = rtems_region_get_segment(
+ Region_id[ 3 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 3 - " );
+ Put_address_from_area_3( segment_address_2 );
+ new_line;
+
+ puts_nocr( "TA1 - rtems_region_get_segment - get 3080 byte segment " );
+ puts ( "from region 1 - NO_WAIT" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3080,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_3
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_3 );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+rtems_test_pause();
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_3 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait 10 seconds for 3K "
+ "segment from region 1"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND,
+ &segment_address_4
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_4 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 2 - "
+ );
+ Put_address_from_area_2( segment_address_1 );
+ new_line;
+ status = rtems_region_return_segment( Region_id[ 2 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_delete - delete TA3" );
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+rtems_test_pause();
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], Task5, 0 );
+ directive_failed( status, "rtems_task_start of TA5" );
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_4 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_4 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts_nocr( "TA1 - rtems_region_get_segment - wait 10 seconds for 3K " );
+ puts ( "segment from region 1");
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ 10 * TICKS_PER_SECOND,
+ &segment_address_4
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_4 );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - rtems_task_delete - delete TA4" );
+ status = rtems_task_delete( Task_id[ 4 ] );
+ directive_failed( status, "rtems_task_delete of TA4" );
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_4 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_4 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA1 - rtems_task_wake_after - yield processor" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+
+ puts( "TA1 - rtems_region_delete - delete region 1" );
+ status = rtems_region_delete( Region_id[ 1 ] );
+ directive_failed( status, "rtems_region_delete" );
+
+ puts( "TA1 - rtems_region_get_segment - get 3K segment from region 4" );
+ status = rtems_region_get_segment(
+ Region_id[ 4 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 4 - " );
+ Put_address_from_area_4( segment_address_1 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 4 ],
+ 3072,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ fatal_directive_status(
+ status,
+ RTEMS_UNSATISFIED,
+ "rtems_task_get_segment with no memory left"
+ );
+ puts( "TA1 - rtems_task_get_note - RTEMS_UNSATISFIED" );
+
+ puts( "TA1 - rtems_region_extend - extend region 4 by 4K" );
+ status = rtems_region_extend(
+ Region_id[ 4 ],
+ &Area_4[4096],
+ 4096
+ );
+ directive_failed( status, "rtems_region_extend" );
+
+ puts(
+ "TA1 - rtems_region_get_segment - attempt to get 3K segment from region 4"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 4 ],
+ 3072,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_3
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got 3K segment from region 4 - " );
+ Put_address_from_area_4( segment_address_3 );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 4 - "
+ );
+ Put_address_from_area_4( segment_address_1 );
+ status = rtems_region_return_segment( Region_id[ 4 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 4 - "
+ );
+ Put_address_from_area_4( segment_address_3 );
+ status = rtems_region_return_segment( Region_id[ 4 ], segment_address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA1 - rtems_region_delete - delete region 4" );
+ status = rtems_region_delete( Region_id[ 4 ] );
+ directive_failed( status, "rtems_region_delete" );
+
+ puts( "*** END OF TEST 16 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp16/task2.c b/testsuites/sptests/sp16/task2.c
new file mode 100644
index 0000000000..980b98bbe1
--- /dev/null
+++ b/testsuites/sptests/sp16/task2.c
@@ -0,0 +1,86 @@
+/* Task_2
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_task_priority previous_priority;
+ void *segment_address_1;
+ void *segment_address_2;
+
+ puts( "TA2 - rtems_region_get_segment - wait on 2K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 2048,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA2 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_1 );
+ new_line;
+
+ puts_nocr(
+ "TA2 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_1 );
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA2 - rtems_task_set_priority - make self highest priority task" );
+ status = rtems_task_set_priority(
+ RTEMS_SELF,
+ BASE_PRIORITY-1,
+ &previous_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ puts("TA2 - rtems_region_get_segment - wait on 3968 byte segment");
+ status = rtems_region_get_segment(
+ Region_id[ 2 ],
+ 3968,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA2 - got segment from region 2 - ");
+ Put_address_from_area_2( segment_address_2 );
+ new_line;
+
+ puts_nocr(
+ "TA2 - rtems_region_return_segment - return segment to region 2 - "
+ );
+ Put_address_from_area_2( segment_address_2 );
+ status = rtems_region_return_segment( Region_id[ 2 ], segment_address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+
+ puts( "TA2 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp16/task3.c b/testsuites/sptests/sp16/task3.c
new file mode 100644
index 0000000000..c4d727d2e2
--- /dev/null
+++ b/testsuites/sptests/sp16/task3.c
@@ -0,0 +1,57 @@
+/* Task_3
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ void *segment_address_1;
+ void *segment_address_2;
+
+ puts(
+ "TA3 - rtems_region_get_segment - wait on 3968 byte segment from region 2"
+ );
+ status = rtems_region_get_segment(
+ Region_id[ 2 ],
+ 3968,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA3 - got segment from region 2 - " );
+ Put_address_from_area_2( segment_address_1 );
+ new_line;
+ directive_failed( status, "rtems_region_return_segment" );
+
+ puts( "TA3 - rtems_region_get_segment - wait on 2K segment from region 3" );
+ status = rtems_region_get_segment(
+ Region_id[ 3 ],
+ 2048,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+}
diff --git a/testsuites/sptests/sp16/task4.c b/testsuites/sptests/sp16/task4.c
new file mode 100644
index 0000000000..7d100ce7d0
--- /dev/null
+++ b/testsuites/sptests/sp16/task4.c
@@ -0,0 +1,60 @@
+/* Task_4
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_4(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ void *segment_address_1;
+ void *segment_address_2;
+
+ puts( "TA4 - rtems_region_get_segment - wait on 1.5K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 1536,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ puts_nocr( "TA4 - got and returned " );
+ Put_address_from_area_1( segment_address_1 );
+ new_line;
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA4 - rtems_region_get_segment - wait on 3K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+}
diff --git a/testsuites/sptests/sp16/task5.c b/testsuites/sptests/sp16/task5.c
new file mode 100644
index 0000000000..c7f873f256
--- /dev/null
+++ b/testsuites/sptests/sp16/task5.c
@@ -0,0 +1,73 @@
+/* Task5
+ *
+ * This routine serves as a test task. It competes with the other tasks
+ * for region resources.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task5(
+ rtems_task_argument argument
+)
+{
+ void *segment_address_1;
+ void *segment_address_2;
+ rtems_status_code status;
+
+ puts( "TA5 - rtems_region_get_segment - wait on 1.5K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 1536,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ puts_nocr( "TA5 - got and returned " );
+ Put_address_from_area_1( segment_address_1 );
+ new_line;
+
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA5 - rtems_region_get_segment - wait on 3K segment from region 1" );
+ status = rtems_region_get_segment(
+ Region_id[ 1 ],
+ 3072,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &segment_address_2
+ );
+ puts_nocr( "TA5 - got segment from region 1 - " );
+ Put_address_from_area_1( segment_address_2 );
+ new_line;
+
+ status = rtems_region_return_segment( Region_id[ 1 ], segment_address_2 );
+ puts_nocr(
+ "TA5 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( segment_address_2 );
+ new_line;
+
+ puts( "TA5 - rtems_task_delete - delete self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp17/asr.c b/testsuites/sptests/sp17/asr.c
new file mode 100644
index 0000000000..08be97bb23
--- /dev/null
+++ b/testsuites/sptests/sp17/asr.c
@@ -0,0 +1,32 @@
+/* Process_asr
+ *
+ * This routine performs the processing for task 1's RTEMS_ASR. It is called
+ * by an assembly routine which saves the necessary registers.
+ *
+ * Input parameters:
+ * signal - signal set
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_asr Process_asr(
+ rtems_signal_set signal_set
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_resume( Task_id[ 2 ] );
+ directive_failed( status, "RTEMS_ASR - rtems_task_resume of TA2" );
+}
diff --git a/testsuites/sptests/sp17/init.c b/testsuites/sptests/sp17/init.c
new file mode 100644
index 0000000000..df369f0b3a
--- /dev/null
+++ b/testsuites/sptests/sp17/init.c
@@ -0,0 +1,69 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 17 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+
+ Task_2_preempted = FALSE;
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp17/sp17.doc b/testsuites/sptests/sp17/sp17.doc
new file mode 100644
index 0000000000..ff0586e337
--- /dev/null
+++ b/testsuites/sptests/sp17/sp17.doc
@@ -0,0 +1,35 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test17
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ as_catch, as_return
+
+concepts:
+
+ a. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ b. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ c. Verifies executive initialization performed correctly.
+
+ d. Verifies that a task can get the task identification number
+ of another task.
+
+ e. Verifies that a signal can be sent to a remote task.
diff --git a/testsuites/sptests/sp17/sp17.scn b/testsuites/sptests/sp17/sp17.scn
new file mode 100644
index 0000000000..47fd140e2a
--- /dev/null
+++ b/testsuites/sptests/sp17/sp17.scn
@@ -0,0 +1,8 @@
+*** TEST 17 ***
+TA2 - Suspending self
+TA1 - rtems_signal_catch: initializing signal catcher
+TA1 - Sending signal to self
+TA2 - signal_return preempted correctly
+TA1 - TA2 correctly preempted me
+TA1 - Got Back!!!
+*** END OF TEST 17 ***
diff --git a/testsuites/sptests/sp17/system.h b/testsuites/sptests/sp17/system.h
new file mode 100644
index 0000000000..7dd775af50
--- /dev/null
+++ b/testsuites/sptests/sp17/system.h
@@ -0,0 +1,58 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_asr Process_asr(
+ rtems_signal_set signal_set
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(25)
+#define CONFIGURE_TICKS_PER_TIMESLICE 1000
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_unsigned32 Task_2_preempted;
+
+/* end of include file */
diff --git a/testsuites/sptests/sp17/task1.c b/testsuites/sptests/sp17/task1.c
new file mode 100644
index 0000000000..656bdabc3c
--- /dev/null
+++ b/testsuites/sptests/sp17/task1.c
@@ -0,0 +1,48 @@
+/* Task_1
+ *
+ * This task initializes the signal catcher, sends the first signal
+ * if running on the first node, and loops while waiting for signals.
+ *
+ * NOTE: The signal catcher is not reentrant and hence RTEMS_NO_ASR must
+ * be a part of its execution mode.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "TA1 - rtems_signal_catch: initializing signal catcher" );
+ status = rtems_signal_catch( Process_asr, RTEMS_NO_ASR | RTEMS_NO_PREEMPT );
+ directive_failed( status, "rtems_signal_catch" );
+
+ puts( "TA1 - Sending signal to self" );
+ status = rtems_signal_send( Task_id[ 1 ], RTEMS_SIGNAL_16 );
+ directive_failed( status, "rtems_signal_send" );
+
+ if ( Task_2_preempted == TRUE )
+ puts( "TA1 - TA2 correctly preempted me" );
+
+ puts("TA1 - Got Back!!!");
+
+ puts( "*** END OF TEST 17 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp17/task2.c b/testsuites/sptests/sp17/task2.c
new file mode 100644
index 0000000000..6d9c6878e8
--- /dev/null
+++ b/testsuites/sptests/sp17/task2.c
@@ -0,0 +1,45 @@
+/* Task_2
+ *
+ * This task initializes the signal catcher, sends the first signal
+ * if running on the first node, and loops while waiting for signals.
+ *
+ * NOTE: The signal catcher is not reentrant and hence RTEMS_NO_ASR must
+ * be a part of its execution mode.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Task_2_preempted = FALSE;
+
+ puts( "TA2 - Suspending self" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+
+ puts( "TA2 - signal_return preempted correctly" );
+
+ Task_2_preempted = TRUE;
+
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend of TA2" );
+}
diff --git a/testsuites/sptests/sp19/first.c b/testsuites/sptests/sp19/first.c
new file mode 100644
index 0000000000..c21537b1b9
--- /dev/null
+++ b/testsuites/sptests/sp19/first.c
@@ -0,0 +1,66 @@
+/* First_FP_task
+ *
+ * This routine serves as a floating point test task. It verifies the
+ * basic task switching capabilities of the executive when floating
+ * point is configured.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include "fptest.h"
+#include "inttest.h"
+
+rtems_task First_FP_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ INTEGER_DECLARE;
+ FP_DECLARE;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ task_index = task_number( tid );
+
+ INTEGER_LOAD( INTEGER_factors[ task_index ] );
+ FP_LOAD( FP_factors[ task_index ] );
+
+ put_name( Task_name[ task_index ], FALSE );
+ printf( " - integer base = (0x%x)\n", INTEGER_factors[ task_index ] );
+ put_name( Task_name[ task_index ], FALSE );
+#if ( RTEMS_HAS_HARDWARE_FP == 1 )
+ printf( " - float base = (%g)\n", FP_factors[ task_index ] );
+#else
+ printf( " - float base = (NA)\n" );
+#endif
+
+ if ( argument == 0 ) {
+ status = rtems_task_restart( RTEMS_SELF, 1 );
+ directive_failed( status, "rtems_task_restart of RTEMS_SELF" );
+ } else {
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+ }
+}
diff --git a/testsuites/sptests/sp19/fptask.c b/testsuites/sptests/sp19/fptask.c
new file mode 100644
index 0000000000..14da9cf5ca
--- /dev/null
+++ b/testsuites/sptests/sp19/fptask.c
@@ -0,0 +1,98 @@
+/* FP_task
+ *
+ * This routine serves as a floating point test task. It verifies the
+ * basic task switching capabilities of the executive when floating
+ * point is configured.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include "fptest.h"
+#include "inttest.h"
+
+rtems_task FP_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ rtems_unsigned32 previous_seconds;
+ INTEGER_DECLARE;
+ FP_DECLARE;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident of self" );
+
+ task_index = task_number( tid );
+
+ INTEGER_LOAD( INTEGER_factors[ task_index ] );
+ FP_LOAD( FP_factors[ task_index ] );
+
+ put_name( Task_name[ task_index ], FALSE );
+ printf( " - integer base = (0x%x)\n", INTEGER_factors[ task_index ] );
+ put_name( Task_name[ task_index ], FALSE );
+#if ( RTEMS_HAS_HARDWARE_FP == 1 )
+ printf( " - float base = (%g)\n", FP_factors[ task_index ] );
+#else
+ printf( " - float base = (NA)\n" );
+#endif
+
+ previous_seconds = -1;
+
+ while( FOREVER ) {
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ if ( time.second >= 16 ) {
+
+ if ( task_number( tid ) == 4 ) {
+ puts( "TA4 - rtems_task_delete - self" );
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA4" );
+ }
+ puts( "TA5 - rtems_task_delete - TA3" );
+ status = rtems_task_delete( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_delete of TA3" );
+
+ puts( "*** END OF TEST 19 *** " );
+ exit( 0 );
+ }
+
+ if (previous_seconds != time.second)
+ {
+ put_name( Task_name[ task_index ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+ previous_seconds = time.second;
+ }
+
+ INTEGER_CHECK( INTEGER_factors[ task_index ] );
+ FP_CHECK( FP_factors[ task_index ] );
+
+ /* for the first 4 seconds we spin as fast as possible
+ * so that we likely are interrupted
+ * After that, we go to sleep for a second at a time
+ */
+ if (time.second >= 4)
+ {
+ status = rtems_task_wake_after( TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+ }
+}
diff --git a/testsuites/sptests/sp19/fptest.h b/testsuites/sptests/sp19/fptest.h
new file mode 100644
index 0000000000..7ea1dd7fcd
--- /dev/null
+++ b/testsuites/sptests/sp19/fptest.h
@@ -0,0 +1,172 @@
+/* fptest.h
+ *
+ * This include file contains the CPU dependent implementation
+ * of the following routines needed to test RTEMS floating
+ * point support:
+ * FP_load( &context )
+ * FP_check( &context )
+ *
+ * FP_load - loads the specified floating point context
+ * FP_check - checks the specified floating point context
+ *
+ * NOTE: These routines are VERY CPU dependent and are thus
+ * located in in the CPU dependent include file
+ * fptest.h. These routines form the core of the
+ * floating point context switch test.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __FPTEST_h
+#define __FPTEST_h
+
+#include <stdio.h>
+
+#ifndef RTEMS_HAS_HARDWARE_FP
+#error "This CPU does not have RTEMS_HAS_HARDWARE_FP defined"
+#endif
+
+#if ( RTEMS_HAS_HARDWARE_FP == FALSE )
+
+/*
+ * The following is useless except to avoid some warnings.
+ */
+
+#define FP_DECLARE unsigned int fp01 = 0;
+#define FP_LOAD( _factor ) fp01 = 2;
+#define FP_CHECK( _factor ) \
+ if ( fp01 != 2 ) \
+ printf("%d: single integer is wrong -- (%d != 2) \n", \
+ task_index, fp01 ); \
+
+#else
+
+#define FP_DECLARE \
+ double fp01 = 1.0; \
+ double fp02 = 2.0; \
+ double fp03 = 3.0; \
+ double fp04 = 4.0; \
+ double fp05 = 5.0; \
+ double fp06 = 6.0; \
+ double fp07 = 7.0; \
+ double fp08 = 8.0; \
+ double fp09 = 9.0; \
+ double fp10 = 10.0; \
+ double fp11 = 11.0; \
+ double fp12 = 12.0; \
+ double fp13 = 13.0; \
+ double fp14 = 14.0; \
+ double fp15 = 15.0; \
+ double fp16 = 16.0; \
+ double fp17 = 17.0; \
+ double fp18 = 18.0; \
+ double fp19 = 19.0; \
+ double fp20 = 20.0; \
+ double fp21 = 21.0; \
+ double fp22 = 22.0; \
+ double fp23 = 23.0; \
+ double fp24 = 24.0; \
+ double fp25 = 25.0; \
+ double fp26 = 26.0; \
+ double fp27 = 27.0; \
+ double fp28 = 28.0; \
+ double fp29 = 29.0; \
+ double fp30 = 30.0; \
+ double fp31 = 31.0; \
+ double fp32 = 32.0
+
+#define FP_LOAD( _factor ) \
+ do { \
+ fp01 += _factor; \
+ fp02 += _factor; \
+ fp03 += _factor; \
+ fp04 += _factor; \
+ fp05 += _factor; \
+ fp06 += _factor; \
+ fp07 += _factor; \
+ fp08 += _factor; \
+ fp09 += _factor; \
+ fp10 += _factor; \
+ fp11 += _factor; \
+ fp12 += _factor; \
+ fp13 += _factor; \
+ fp14 += _factor; \
+ fp15 += _factor; \
+ fp16 += _factor; \
+ fp17 += _factor; \
+ fp18 += _factor; \
+ fp19 += _factor; \
+ fp20 += _factor; \
+ fp21 += _factor; \
+ fp22 += _factor; \
+ fp23 += _factor; \
+ fp24 += _factor; \
+ fp25 += _factor; \
+ fp26 += _factor; \
+ fp27 += _factor; \
+ fp28 += _factor; \
+ fp29 += _factor; \
+ fp30 += _factor; \
+ fp31 += _factor; \
+ fp32 += _factor; \
+ } while (0)
+
+#define EPSILON (0.0005)
+#define FPABS(d) (((d) < 0.0) ? -(d) : (d))
+#define FPNEQ(a,b) (FPABS((a)-(b)) > EPSILON)
+
+#define FP_CHECK_ONE( _v, _base, _factor ) \
+ if ( FPNEQ( (_v), ((_base) + (_factor)) ) ) { \
+ printf("%d: " #_v " wrong -- (%g not %g)\n", \
+ task_index, (_v), (_base + _factor)); \
+ }
+
+
+#define FP_CHECK( _factor ) \
+ do { \
+ FP_CHECK_ONE( fp01, 1.0, (_factor) ); \
+ FP_CHECK_ONE( fp02, 2.0, (_factor) ); \
+ FP_CHECK_ONE( fp03, 3.0, (_factor) ); \
+ FP_CHECK_ONE( fp04, 4.0, (_factor) ); \
+ FP_CHECK_ONE( fp05, 5.0, (_factor) ); \
+ FP_CHECK_ONE( fp06, 6.0, (_factor) ); \
+ FP_CHECK_ONE( fp07, 7.0, (_factor) ); \
+ FP_CHECK_ONE( fp08, 8.0, (_factor) ); \
+ FP_CHECK_ONE( fp09, 9.0, (_factor) ); \
+ FP_CHECK_ONE( fp10, 10.0, (_factor) ); \
+ FP_CHECK_ONE( fp11, 11.0, (_factor) ); \
+ FP_CHECK_ONE( fp12, 12.0, (_factor) ); \
+ FP_CHECK_ONE( fp13, 13.0, (_factor) ); \
+ FP_CHECK_ONE( fp14, 14.0, (_factor) ); \
+ FP_CHECK_ONE( fp15, 15.0, (_factor) ); \
+ FP_CHECK_ONE( fp16, 16.0, (_factor) ); \
+ FP_CHECK_ONE( fp17, 17.0, (_factor) ); \
+ FP_CHECK_ONE( fp18, 18.0, (_factor) ); \
+ FP_CHECK_ONE( fp19, 19.0, (_factor) ); \
+ FP_CHECK_ONE( fp20, 20.0, (_factor) ); \
+ FP_CHECK_ONE( fp21, 21.0, (_factor) ); \
+ FP_CHECK_ONE( fp22, 22.0, (_factor) ); \
+ FP_CHECK_ONE( fp23, 23.0, (_factor) ); \
+ FP_CHECK_ONE( fp24, 24.0, (_factor) ); \
+ FP_CHECK_ONE( fp25, 25.0, (_factor) ); \
+ FP_CHECK_ONE( fp26, 26.0, (_factor) ); \
+ FP_CHECK_ONE( fp27, 27.0, (_factor) ); \
+ FP_CHECK_ONE( fp28, 28.0, (_factor) ); \
+ FP_CHECK_ONE( fp29, 29.0, (_factor) ); \
+ FP_CHECK_ONE( fp30, 30.0, (_factor) ); \
+ FP_CHECK_ONE( fp31, 31.0, (_factor) ); \
+ FP_CHECK_ONE( fp32, 32.0, (_factor) ); \
+ } while (0)
+
+#endif
+
+#endif
diff --git a/testsuites/sptests/sp19/init.c b/testsuites/sptests/sp19/init.c
new file mode 100644
index 0000000000..016f818da2
--- /dev/null
+++ b/testsuites/sptests/sp19/init.c
@@ -0,0 +1,150 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 19 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+ Task_name[ 6 ] = rtems_build_name( 'F', 'P', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_create(
+ Task_name[ 2 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TA2" );
+
+ status = rtems_task_create(
+ Task_name[ 3 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TA3" );
+
+ status = rtems_task_create(
+ Task_name[ 4 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 4 ]
+ );
+ directive_failed( status, "rtems_task_create of TA4" );
+
+ status = rtems_task_create(
+ Task_name[ 5 ],
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 5 ]
+ );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ status = rtems_task_create(
+ Task_name[ 6 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &Task_id[ 6 ]
+ );
+ directive_failed( status, "rtems_task_create of FP1" );
+
+ status = rtems_task_start( Task_id[ 6 ], First_FP_task, 0 );
+ directive_failed( status, "rtems_task_start of FP1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA2" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA3" );
+
+ status = rtems_task_start( Task_id[ 4 ], FP_task, 0 );
+ directive_failed( status, "rtems_task_start of TA4" );
+
+ status = rtems_task_start( Task_id[ 5 ], FP_task, 0 );
+ directive_failed( status, "rtems_task_create of TA5" );
+
+ /*
+ * Load "task dependent factors" in the context areas
+ */
+
+
+ FP_factors[0] = 0.0;
+ FP_factors[1] = 1000.1;
+ FP_factors[2] = 2000.2;
+ FP_factors[3] = 3000.3;
+ FP_factors[4] = 4000.4;
+ FP_factors[5] = 5000.5;
+ FP_factors[6] = 6000.6;
+ FP_factors[7] = 7000.7;
+ FP_factors[8] = 8000.8;
+ FP_factors[9] = 9000.9;
+
+ INTEGER_factors[0] = 0x0000;
+ INTEGER_factors[1] = 0x1000;
+ INTEGER_factors[2] = 0x2000;
+ INTEGER_factors[3] = 0x3000;
+ INTEGER_factors[4] = 0x4000;
+ INTEGER_factors[5] = 0x5000;
+ INTEGER_factors[6] = 0x6000;
+ INTEGER_factors[7] = 0x7000;
+ INTEGER_factors[8] = 0x8000;
+ INTEGER_factors[9] = 0x9000;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of TA1" );
+}
diff --git a/testsuites/sptests/sp19/inttest.h b/testsuites/sptests/sp19/inttest.h
new file mode 100644
index 0000000000..f06ede16ce
--- /dev/null
+++ b/testsuites/sptests/sp19/inttest.h
@@ -0,0 +1,149 @@
+/* inttest.h
+ *
+ * XXX: ???
+ * This include file contains the CPU dependent implementation
+ * of the following routines needed to test RTEMS floating
+ * point support:
+ * INTEGER_load( &context )
+ * INTEGER_check( &context )
+ *
+ * INTEGER_load - loads the specified floating point context
+ * INTEGER_check - checks the specified floating point context
+ *
+ * NOTE: These routines are VERY CPU dependent and are thus
+ * located in in the CPU dependent include file
+ * inttest.h. These routines form the core of the
+ * floating point context switch test.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __INTEGER_TEST_h
+#define __INTEGER_TEST_h
+
+#include <stdio.h>
+#define REG_VARIABLE rtems_unsigned32
+
+#define INTEGER_DECLARE \
+ REG_VARIABLE int01 = 1; \
+ REG_VARIABLE int02 = 2; \
+ REG_VARIABLE int03 = 3; \
+ REG_VARIABLE int04 = 4; \
+ REG_VARIABLE int05 = 5; \
+ REG_VARIABLE int06 = 6; \
+ REG_VARIABLE int07 = 7; \
+ REG_VARIABLE int08 = 8; \
+ REG_VARIABLE int09 = 9; \
+ REG_VARIABLE int10 = 10; \
+ REG_VARIABLE int11 = 11; \
+ REG_VARIABLE int12 = 12; \
+ REG_VARIABLE int13 = 13; \
+ REG_VARIABLE int14 = 14; \
+ REG_VARIABLE int15 = 15; \
+ REG_VARIABLE int16 = 16; \
+ REG_VARIABLE int17 = 17; \
+ REG_VARIABLE int18 = 18; \
+ REG_VARIABLE int19 = 19; \
+ REG_VARIABLE int20 = 20; \
+ REG_VARIABLE int21 = 21; \
+ REG_VARIABLE int22 = 22; \
+ REG_VARIABLE int23 = 23; \
+ REG_VARIABLE int24 = 24; \
+ REG_VARIABLE int25 = 25; \
+ REG_VARIABLE int26 = 26; \
+ REG_VARIABLE int27 = 27; \
+ REG_VARIABLE int28 = 28; \
+ REG_VARIABLE int29 = 29; \
+ REG_VARIABLE int30 = 30; \
+ REG_VARIABLE int31 = 31; \
+ REG_VARIABLE int32 = 32
+
+#define INTEGER_LOAD( _factor ) \
+ do { \
+ int01 += _factor; \
+ int02 += _factor; \
+ int03 += _factor; \
+ int04 += _factor; \
+ int05 += _factor; \
+ int06 += _factor; \
+ int07 += _factor; \
+ int08 += _factor; \
+ int09 += _factor; \
+ int10 += _factor; \
+ int11 += _factor; \
+ int12 += _factor; \
+ int13 += _factor; \
+ int14 += _factor; \
+ int15 += _factor; \
+ int16 += _factor; \
+ int17 += _factor; \
+ int18 += _factor; \
+ int19 += _factor; \
+ int20 += _factor; \
+ int21 += _factor; \
+ int22 += _factor; \
+ int23 += _factor; \
+ int24 += _factor; \
+ int25 += _factor; \
+ int26 += _factor; \
+ int27 += _factor; \
+ int28 += _factor; \
+ int29 += _factor; \
+ int30 += _factor; \
+ int31 += _factor; \
+ int32 += _factor; \
+ } while (0)
+
+#define INTEGER_CHECK_ONE( _v, _base, _factor ) \
+ if ( (_v) != ((_base) + (_factor)) ) { \
+ printf("%d: " #_v " wrong -- (0x%x not 0x%x)\n", \
+ task_index, (_v), (_base + _factor)); \
+ }
+
+
+#define INTEGER_CHECK( _factor ) \
+ do { \
+ INTEGER_CHECK_ONE( int01, 1, (_factor) ); \
+ INTEGER_CHECK_ONE( int02, 2, (_factor) ); \
+ INTEGER_CHECK_ONE( int03, 3, (_factor) ); \
+ INTEGER_CHECK_ONE( int04, 4, (_factor) ); \
+ INTEGER_CHECK_ONE( int05, 5, (_factor) ); \
+ INTEGER_CHECK_ONE( int06, 6, (_factor) ); \
+ INTEGER_CHECK_ONE( int07, 7, (_factor) ); \
+ INTEGER_CHECK_ONE( int08, 8, (_factor) ); \
+ INTEGER_CHECK_ONE( int09, 9, (_factor) ); \
+ INTEGER_CHECK_ONE( int10, 10, (_factor) ); \
+ INTEGER_CHECK_ONE( int11, 11, (_factor) ); \
+ INTEGER_CHECK_ONE( int12, 12, (_factor) ); \
+ INTEGER_CHECK_ONE( int13, 13, (_factor) ); \
+ INTEGER_CHECK_ONE( int14, 14, (_factor) ); \
+ INTEGER_CHECK_ONE( int15, 15, (_factor) ); \
+ INTEGER_CHECK_ONE( int16, 16, (_factor) ); \
+ INTEGER_CHECK_ONE( int17, 17, (_factor) ); \
+ INTEGER_CHECK_ONE( int18, 18, (_factor) ); \
+ INTEGER_CHECK_ONE( int19, 19, (_factor) ); \
+ INTEGER_CHECK_ONE( int20, 20, (_factor) ); \
+ INTEGER_CHECK_ONE( int21, 21, (_factor) ); \
+ INTEGER_CHECK_ONE( int22, 22, (_factor) ); \
+ INTEGER_CHECK_ONE( int23, 23, (_factor) ); \
+ INTEGER_CHECK_ONE( int24, 24, (_factor) ); \
+ INTEGER_CHECK_ONE( int25, 25, (_factor) ); \
+ INTEGER_CHECK_ONE( int26, 26, (_factor) ); \
+ INTEGER_CHECK_ONE( int27, 27, (_factor) ); \
+ INTEGER_CHECK_ONE( int28, 28, (_factor) ); \
+ INTEGER_CHECK_ONE( int29, 29, (_factor) ); \
+ INTEGER_CHECK_ONE( int30, 30, (_factor) ); \
+ INTEGER_CHECK_ONE( int31, 31, (_factor) ); \
+ INTEGER_CHECK_ONE( int32, 32, (_factor) ); \
+ } while (0)
+
+#endif
diff --git a/testsuites/sptests/sp19/sp19.doc b/testsuites/sptests/sp19/sp19.doc
new file mode 100644
index 0000000000..75a35ac0d2
--- /dev/null
+++ b/testsuites/sptests/sp19/sp19.doc
@@ -0,0 +1,23 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test19
+
+directives:
+
+concepts:
+
+ a. Verifies system can dispatch a mixture of floating point and
+ non-floating point tasks.
diff --git a/testsuites/sptests/sp19/sp19.scn b/testsuites/sptests/sp19/sp19.scn
new file mode 100644
index 0000000000..d70c8ad89a
--- /dev/null
+++ b/testsuites/sptests/sp19/sp19.scn
@@ -0,0 +1,50 @@
+*** TEST 19 ***
+FP1 - integer base = (0x6000)
+FP1 - float base = (6000.6)
+FP1 - integer base = (0x6000)
+FP1 - float base = (6000.6)
+TA1 - integer base = (0x1000)
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - integer base = (0x2000)
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - integer base = (0x3000)
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA4 - integer base = (0x4000)
+TA4 - float base = (4000.4)
+TA4 - rtems_clock_get - 09:00:00 12/31/1988
+TA4 - rtems_clock_get - 09:00:01 12/31/1988
+TA4 - rtems_clock_get - 09:00:02 12/31/1988
+TA4 - rtems_clock_get - 09:00:03 12/31/1988
+TA4 - rtems_clock_get - 09:00:04 12/31/1988
+TA5 - integer base = (0x5000)
+TA5 - float base = (5000.5)
+TA5 - rtems_clock_get - 09:00:04 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA5 - rtems_clock_get - 09:00:05 12/31/1988
+TA4 - rtems_clock_get - 09:00:05 12/31/1988
+TA5 - rtems_clock_get - 09:00:06 12/31/1988
+TA4 - rtems_clock_get - 09:00:06 12/31/1988
+TA5 - rtems_clock_get - 09:00:07 12/31/1988
+TA4 - rtems_clock_get - 09:00:07 12/31/1988
+TA5 - rtems_clock_get - 09:00:08 12/31/1988
+TA4 - rtems_clock_get - 09:00:08 12/31/1988
+TA5 - rtems_clock_get - 09:00:09 12/31/1988
+TA4 - rtems_clock_get - 09:00:09 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA5 - rtems_clock_get - 09:00:10 12/31/1988
+TA4 - rtems_clock_get - 09:00:10 12/31/1988
+TA5 - rtems_clock_get - 09:00:11 12/31/1988
+TA4 - rtems_clock_get - 09:00:11 12/31/1988
+TA5 - rtems_clock_get - 09:00:12 12/31/1988
+TA4 - rtems_clock_get - 09:00:12 12/31/1988
+TA5 - rtems_clock_get - 09:00:13 12/31/1988
+TA4 - rtems_clock_get - 09:00:13 12/31/1988
+TA5 - rtems_clock_get - 09:00:14 12/31/1988
+TA4 - rtems_clock_get - 09:00:14 12/31/1988
+TA3 - rtems_clock_get - 09:00:15 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+TA5 - rtems_clock_get - 09:00:15 12/31/1988
+TA4 - rtems_clock_get - 09:00:15 12/31/1988
+TA5 - rtems_task_delete - TA3
+*** END OF TEST 19 ***
diff --git a/testsuites/sptests/sp19/system.h b/testsuites/sptests/sp19/system.h
new file mode 100644
index 0000000000..36571c52a1
--- /dev/null
+++ b/testsuites/sptests/sp19/system.h
@@ -0,0 +1,57 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task First_FP_task(
+ rtems_task_argument argument
+);
+
+rtems_task FP_task(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 7 ]; /* array of task ids */
+TEST_EXTERN rtems_id Task_name[ 7 ]; /* array of task names */
+
+TEST_EXTERN rtems_double FP_factors[ 10 ]; /* FP "uniqueness" factors */
+TEST_EXTERN rtems_unsigned32 INTEGER_factors[ 10 ]; /* INT "uniqueness" factors */
+/* end of include file */
diff --git a/testsuites/sptests/sp19/task1.c b/testsuites/sptests/sp19/task1.c
new file mode 100644
index 0000000000..6337538f87
--- /dev/null
+++ b/testsuites/sptests/sp19/task1.c
@@ -0,0 +1,59 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+#include "inttest.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_unsigned32 task_index;
+ INTEGER_DECLARE;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident" );
+
+ task_index = task_number( tid );
+
+ INTEGER_LOAD( INTEGER_factors[ task_index ] );
+
+ put_name( Task_name[ task_index ], FALSE );
+ printf( " - integer base = (0x%x)\n", INTEGER_factors[ task_index ] );
+
+ while( FOREVER ) {
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ INTEGER_CHECK( INTEGER_factors[ task_index ] );
+
+ status = rtems_task_wake_after(
+ ( task_number( tid ) ) * 5 * TICKS_PER_SECOND
+ );
+ directive_failed( status, "rtems_task_wake_after" );
+ }
+}
diff --git a/testsuites/sptests/sp20/getall.c b/testsuites/sptests/sp20/getall.c
new file mode 100644
index 0000000000..26465e3919
--- /dev/null
+++ b/testsuites/sptests/sp20/getall.c
@@ -0,0 +1,43 @@
+/* Get_all_counters
+ *
+ * This routine allows TA5 to atomically obtain the iteration counters.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Get_all_counters()
+{
+ rtems_mode previous_mode;
+ rtems_status_code status;
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode to RTEMS_NO_PREEMPT" );
+
+ Temporary_count = Count;
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_mode( RTEMS_PREEMPT, RTEMS_PREEMPT_MASK, &previous_mode );
+ directive_failed( status, "rtems_task_mode to RTEMS_PREEMPT" );
+}
diff --git a/testsuites/sptests/sp20/init.c b/testsuites/sptests/sp20/init.c
new file mode 100644
index 0000000000..6fddd21688
--- /dev/null
+++ b/testsuites/sptests/sp20/init.c
@@ -0,0 +1,68 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 20 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+ Task_name[ 4 ] = rtems_build_name( 'T', 'A', '4', ' ' );
+ Task_name[ 5 ] = rtems_build_name( 'T', 'A', '5', ' ' );
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_create(
+ Task_name[ index ],
+ Priorities[ index ],
+ RTEMS_MINIMUM_STACK_SIZE * 4,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+ }
+
+ for ( index = 1 ; index <= 5 ; index++ ) {
+ status = rtems_task_start( Task_id[ index ], Task_1_through_5, index );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Count.count[ 1 ] = 0;
+ Count.count[ 2 ] = 0;
+ Count.count[ 3 ] = 0;
+ Count.count[ 4 ] = 0;
+ Count.count[ 5 ] = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp20/sp20.doc b/testsuites/sptests/sp20/sp20.doc
new file mode 100644
index 0000000000..9653ff4fa9
--- /dev/null
+++ b/testsuites/sptests/sp20/sp20.doc
@@ -0,0 +1,24 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test20
+
+directives:
+
+ rm_create, rm_period
+
+concepts:
+
+ a. Verifies Rate Monotonic Manager behavior.
diff --git a/testsuites/sptests/sp20/sp20.scn b/testsuites/sptests/sp20/sp20.scn
new file mode 100644
index 0000000000..bb4e8814da
--- /dev/null
+++ b/testsuites/sptests/sp20/sp20.scn
@@ -0,0 +1,27 @@
+*** TEST 20 ***
+TA1 - rtems_rate_monotonic_create id = 0x28010001
+TA1 - rtems_rate_monotonic_ident id = 0x28010001
+TA1 - (0x28010001) period 2
+TA2 - rtems_rate_monotonic_create id = 0x28010002
+TA2 - rtems_rate_monotonic_ident id = 0x28010002
+TA2 - (0x28010002) period 2
+TA3 - rtems_rate_monotonic_create id = 0x28010003
+TA3 - rtems_rate_monotonic_ident id = 0x28010003
+TA3 - (0x28010003) period 2
+TA4 - rtems_rate_monotonic_create id = 0x28010004
+TA4 - rtems_rate_monotonic_ident id = 0x28010004
+TA4 - (0x28010004) period 2
+TA5 - rtems_rate_monotonic_create id = 0x28010005
+TA5 - rtems_rate_monotonic_ident id = 0x28010005
+TA5 - (0x28010005) period 100
+TA5 - PERIODS CHECK OK (1)
+TA5 - PERIODS CHECK OK (2)
+TA5 - PERIODS CHECK OK (3)
+TA5 - PERIODS CHECK OK (4)
+TA5 - PERIODS CHECK OK (5)
+TA5 - PERIODS CHECK OK (6)
+TA5 - PERIODS CHECK OK (7)
+TA5 - PERIODS CHECK OK (8)
+TA5 - PERIODS CHECK OK (9)
+TA5 - PERIODS CHECK OK (10)
+*** END OF TEST 20 ***
diff --git a/testsuites/sptests/sp20/system.h b/testsuites/sptests/sp20/system.h
new file mode 100644
index 0000000000..4563730893
--- /dev/null
+++ b/testsuites/sptests/sp20/system.h
@@ -0,0 +1,61 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* types */
+
+struct counters {
+ rtems_unsigned32 count[6];
+};
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1_through_5(
+ rtems_task_argument argument
+);
+
+void Get_all_counters( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INIT_TASK_PRIORITY 10
+#define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_DEFAULT_MODES
+#define CONFIGURE_MAXIMUM_PERIODS 10
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+
+TEST_EXTERN struct counters Count; /* iteration counters */
+TEST_EXTERN struct counters Temporary_count;
+extern rtems_task_priority Priorities[ 6 ];
+
+/* end of include file */
diff --git a/testsuites/sptests/sp20/task1.c b/testsuites/sptests/sp20/task1.c
new file mode 100644
index 0000000000..71dd53021e
--- /dev/null
+++ b/testsuites/sptests/sp20/task1.c
@@ -0,0 +1,116 @@
+/* Task_1_through_5
+ *
+ * This routine serves as a test task for the period capabilities of the
+ * Rate Monotonic Manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_unsigned32 Periods[6] = { 0, 2, 2, 2, 2, 100 };
+rtems_unsigned32 Iterations[6] = { 0, 50, 50, 50, 50, 1 };
+rtems_task_priority Priorities[6] = { 0, 1, 1, 3, 4, 5 };
+
+rtems_task Task_1_through_5(
+ rtems_unsigned32 argument
+)
+{
+ rtems_id rmid;
+ rtems_id test_rmid;
+ rtems_unsigned32 index;
+ rtems_unsigned32 pass;
+ rtems_unsigned32 failed;
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( argument, &rmid );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_create id = 0x%08x\n", rmid );
+
+ status = rtems_rate_monotonic_ident( argument, &test_rmid );
+ directive_failed( status, "rtems_rate_monotonic_ident" );
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- rtems_rate_monotonic_ident id = 0x%08x\n", test_rmid );
+
+ if ( rmid != test_rmid ) {
+ printf( "RMID's DO NOT MATCH (0x%x and 0x%x)\n", rmid, test_rmid );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ argument ], FALSE );
+ printf( "- (0x%08x) period %d\n", rmid, Periods[ argument ] );
+
+ status = rtems_task_wake_after( 2 );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ switch ( argument ) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ while ( FOREVER ) {
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+ Count.count[ argument ]++;
+ }
+ break;
+ case 5:
+ pass = 0;
+ failed = 0;
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 1 of TA5" );
+
+ Get_all_counters();
+
+ while ( FOREVER ) {
+
+ status = rtems_rate_monotonic_period( rmid, Periods[ argument ] );
+ directive_failed( status, "rtems_rate_monotonic_period 2 of TA5" );
+
+ Get_all_counters();
+
+ for( index = 1 ; index <= 4 ; index++ ) {
+ if ( Temporary_count.count[ index ] != Iterations[ index ] ) {
+ puts_nocr( "FAIL -- " );
+ put_name ( Task_name[ index ], FALSE );
+ printf ( " Actual=%d, Expected=%d\n",
+ Temporary_count.count[ index ],
+ Iterations[ index ]
+ );
+ failed += 1;
+ }
+ }
+
+ if ( failed == 5 )
+ exit( 0 );
+
+ pass += 1;
+
+ printf( "TA5 - PERIODS CHECK OK (%d)\n", pass );
+
+ fflush( stdout );
+
+ if ( pass == 10 ) {
+ puts( "*** END OF TEST 20 ***" );
+ exit( 0 );
+ }
+
+ }
+ break;
+ }
+}
diff --git a/testsuites/sptests/sp21/init.c b/testsuites/sptests/sp21/init.c
new file mode 100644
index 0000000000..63a6e5ed0d
--- /dev/null
+++ b/testsuites/sptests/sp21/init.c
@@ -0,0 +1,53 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 21 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp21/sp21.doc b/testsuites/sptests/sp21/sp21.doc
new file mode 100644
index 0000000000..08f1b03c53
--- /dev/null
+++ b/testsuites/sptests/sp21/sp21.doc
@@ -0,0 +1,28 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test21
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_delete
+ de_init, de_open, de_close, de_read, de_write, de_cntrl
+
+concepts:
+
+ a. Verifies all I/O manager directives always return successful for
+ null drivers.
+
+ b. Verifies all I/O manager directives call and return from the driver
+ entry points in the driver address table.
diff --git a/testsuites/sptests/sp21/sp21.scn b/testsuites/sptests/sp21/sp21.scn
new file mode 100644
index 0000000000..c6392e3ea3
--- /dev/null
+++ b/testsuites/sptests/sp21/sp21.scn
@@ -0,0 +1,19 @@
+*** TEST 21 ***
+----- TESTING THE NULL DRIVER CHECKS -----
+TA1 - rtems_io_initialize - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_open - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_close - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_read - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_write - NULL DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_control - NULL DRIVER RTEMS_SUCCESSFUL
+----- TESTING THE I/O MANAGER DIRECTIVES -----
+TA1 - rtems_io_initialize - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_open - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_close - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_read - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_write - STUB DRIVER RTEMS_SUCCESSFUL
+TA1 - rtems_io_control - STUB DRIVER RTEMS_SUCCESSFUL
+----- RETURNING INVALID MAJOR NUMBER -----
+TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER
+TA1 - rtems_io_open - RTEMS_INVALID_NUMBER
+*** END OF TEST 21 ***
diff --git a/testsuites/sptests/sp21/system.h b/testsuites/sptests/sp21/system.h
new file mode 100644
index 0000000000..b48bd1ea2a
--- /dev/null
+++ b/testsuites/sptests/sp21/system.h
@@ -0,0 +1,46 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_TEST_NEEDS_STUB_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp21/task1.c b/testsuites/sptests/sp21/task1.c
new file mode 100644
index 0000000000..3106ad6a88
--- /dev/null
+++ b/testsuites/sptests/sp21/task1.c
@@ -0,0 +1,105 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the I/O manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#define STUB_DRIVER_MAJOR 0x2
+#define NO_DRIVER_MAJOR 0x3
+#define INVALID_DRIVER_MAJOR 0x5
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "----- TESTING THE NULL DRIVER CHECKS -----" );
+
+ status = rtems_io_initialize( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_initialize" );
+ puts( "TA1 - rtems_io_initialize - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_open( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_open" );
+ puts( "TA1 - rtems_io_open - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_close( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_close" );
+ puts( "TA1 - rtems_io_close - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_read( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_read" );
+ puts( "TA1 - rtems_io_read - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_write( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_write" );
+ puts( "TA1 - rtems_io_write - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_control( NO_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_control" );
+ puts( "TA1 - rtems_io_control - NULL DRIVER RTEMS_SUCCESSFUL" );
+
+ puts( "----- TESTING THE I/O MANAGER DIRECTIVES -----" );
+
+ status = rtems_io_initialize( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_initialize" );
+ puts( "TA1 - rtems_io_initialize - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_open( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_open" );
+ puts( "TA1 - rtems_io_open - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_close( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_close" );
+ puts( "TA1 - rtems_io_close - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_read( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_read" );
+ puts( "TA1 - rtems_io_read - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_write( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_write" );
+ puts( "TA1 - rtems_io_write - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ status = rtems_io_control( STUB_DRIVER_MAJOR, 0, NULL );
+ directive_failed( status, "rtems_io_control" );
+ puts( "TA1 - rtems_io_control - STUB DRIVER RTEMS_SUCCESSFUL" );
+
+ puts( "----- RETURNING INVALID MAJOR NUMBER -----" );
+
+ status = rtems_io_initialize( INVALID_DRIVER_MAJOR, 0, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_initialize"
+ );
+ puts( "TA1 - rtems_io_initialize - RTEMS_INVALID_NUMBER" );
+
+ status = rtems_io_open( INVALID_DRIVER_MAJOR, 0, NULL );
+ fatal_directive_status(
+ status,
+ RTEMS_INVALID_NUMBER,
+ "rtems_io_open"
+ );
+ puts( "TA1 - rtems_io_open - RTEMS_INVALID_NUMBER" );
+
+ puts( "*** END OF TEST 21 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp22/delay.c b/testsuites/sptests/sp22/delay.c
new file mode 100644
index 0000000000..f63fb1877a
--- /dev/null
+++ b/testsuites/sptests/sp22/delay.c
@@ -0,0 +1,32 @@
+/* Delayed_resume
+ *
+ * This routine is scheduled to be fired as a timer service routine.
+ * When fired this subprogram resumes Task_1.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Delayed_resume(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_resume( Task_id[ 1 ] );
+ directive_failed( status, "rtems_task_resume of self" );
+}
diff --git a/testsuites/sptests/sp22/init.c b/testsuites/sptests/sp22/init.c
new file mode 100644
index 0000000000..1c3459254f
--- /dev/null
+++ b/testsuites/sptests/sp22/init.c
@@ -0,0 +1,66 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 22 ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ puts( "INIT - rtems_timer_create - creating timer 1" );
+ status = rtems_timer_create( Timer_name[ 1 ], &Timer_id[ 1 ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ printf( "INIT - timer 1 has id (0x%x)\n", Timer_id[ 1 ] );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp22/prtime.c b/testsuites/sptests/sp22/prtime.c
new file mode 100644
index 0000000000..58b3aa66f8
--- /dev/null
+++ b/testsuites/sptests/sp22/prtime.c
@@ -0,0 +1,32 @@
+/* Print_time
+ *
+ * This routine prints the name of Task_1 and the current time of day.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+void Print_time( void )
+{
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ put_name( Task_name[ 1 ], FALSE );
+ print_time( "- rtems_clock_get - ", &time, "\n" );
+}
diff --git a/testsuites/sptests/sp22/sp22.doc b/testsuites/sptests/sp22/sp22.doc
new file mode 100644
index 0000000000..3b319ec311
--- /dev/null
+++ b/testsuites/sptests/sp22/sp22.doc
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test22
+
+directives:
+
+concepts:
diff --git a/testsuites/sptests/sp22/sp22.scn b/testsuites/sptests/sp22/sp22.scn
new file mode 100644
index 0000000000..6fb08156c5
--- /dev/null
+++ b/testsuites/sptests/sp22/sp22.scn
@@ -0,0 +1,29 @@
+*** TEST 22 ***
+INIT - rtems_timer_create - creating timer 1
+INIT - timer 1 has id (0x10010001)
+TA1 - rtems_timer_ident - identing timer 1
+TA1 - timer 1 has id (0x10010001)
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_timer_fire_after - timer 1 in 3 seconds
+TA1 - rtems_task_suspend( RTEMS_SELF )
+TA1 - rtems_clock_get - 09:00:03 12/31/1988
+TA1 - rtems_timer_fire_after - timer 1 in 3 seconds
+TA1 - rtems_task_wake_after - 1 second
+TA1 - rtems_clock_get - 09:00:04 12/31/1988
+TA1 - rtems_timer_reset - timer 1
+TA1 - rtems_task_suspend( RTEMS_SELF )
+TA1 - rtems_clock_get - 09:00:07 12/31/1988
+<pause>
+TA1 - rtems_timer_fire_after - timer 1 in 3 seconds
+TA1 - rtems_timer_cancel - timer 1
+TA1 - rtems_clock_get - 09:00:07 12/31/1988
+TA1 - rtems_timer_fire_when - timer 1 in 3 seconds
+TA1 - rtems_task_suspend( RTEMS_SELF )
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_timer_fire_when - timer 1 in 3 seconds
+TA1 - rtems_task_wake_after - 1 second
+TA1 - rtems_clock_get - 09:00:11 12/31/1988
+TA1 - rtems_timer_cancel - timer 1
+TA1 - rtems_task_wake_after - YIELD (only task at priority)
+TA1 - timer_deleting - timer 1
+*** END OF TEST 22 ***
diff --git a/testsuites/sptests/sp22/system.h b/testsuites/sptests/sp22/system.h
new file mode 100644
index 0000000000..5911cb1622
--- /dev/null
+++ b/testsuites/sptests/sp22/system.h
@@ -0,0 +1,57 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Delayed_resume(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+void Print_time( void );
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 2
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 2 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 2 ]; /* array of timer names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp22/task1.c b/testsuites/sptests/sp22/task1.c
new file mode 100644
index 0000000000..cd05c36273
--- /dev/null
+++ b/testsuites/sptests/sp22/task1.c
@@ -0,0 +1,164 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the basic task
+ * switching capabilities of the executive.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id tmid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+/* Get id */
+
+ puts( "TA1 - rtems_timer_ident - identing timer 1" );
+ status = rtems_timer_ident( Timer_name[ 1 ], &tmid );
+ directive_failed( status, "rtems_timer_ident" );
+ printf( "TA1 - timer 1 has id (0x%x)\n", tmid );
+
+/* after which is allowed to fire */
+
+ Print_time();
+
+ puts( "TA1 - rtems_timer_fire_after - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_after(
+ tmid,
+ 3 * TICKS_PER_SECOND,
+ Delayed_resume,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - rtems_task_suspend( RTEMS_SELF )" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ Print_time();
+
+/* after which is reset and allowed to fire */
+
+ puts( "TA1 - rtems_timer_fire_after - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_after(
+ tmid,
+ 3 * TICKS_PER_SECOND,
+ Delayed_resume,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - rtems_task_wake_after - 1 second" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Print_time();
+
+ puts( "TA1 - rtems_timer_reset - timer 1" );
+ status = rtems_timer_reset( tmid );
+ directive_failed( status, "rtems_timer_reset" );
+
+ puts( "TA1 - rtems_task_suspend( RTEMS_SELF )" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ Print_time();
+
+ rtems_test_pause();
+
+ /*
+ * Reset the time since we do not know how long the user waited
+ * before pressing <cr> at the pause. This insures that the
+ * actual output matches the screen.
+ */
+
+ build_time( &time, 12, 31, 1988, 9, 0, 7, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+/* after which is canceled */
+
+ puts( "TA1 - rtems_timer_fire_after - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_after(
+ tmid,
+ 3 * TICKS_PER_SECOND,
+ Delayed_resume,
+ NULL
+ );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ puts( "TA1 - rtems_timer_cancel - timer 1" );
+ status = rtems_timer_cancel( tmid );
+ directive_failed( status, "rtems_timer_cancel" );
+
+/* when which is allowed to fire */
+
+ Print_time();
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ time.second += 3;
+
+ puts( "TA1 - rtems_timer_fire_when - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_when( tmid, &time, Delayed_resume, NULL );
+ directive_failed( status, "rtems_timer_fire_when" );
+
+ puts( "TA1 - rtems_task_suspend( RTEMS_SELF )" );
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+
+ Print_time();
+
+/* when which is canceled */
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get" );
+
+ time.second += 3;
+
+ puts( "TA1 - rtems_timer_fire_when - timer 1 in 3 seconds" );
+ status = rtems_timer_fire_when( tmid, &time, Delayed_resume, NULL );
+ directive_failed( status, "rtems_timer_fire_when" );
+
+ puts( "TA1 - rtems_task_wake_after - 1 second" );
+ status = rtems_task_wake_after( 1 * TICKS_PER_SECOND );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Print_time();
+
+ puts( "TA1 - rtems_timer_cancel - timer 1" );
+ status = rtems_timer_cancel( tmid );
+ directive_failed( status, "rtems_timer_cancel" );
+
+/* delete */
+ puts( "TA1 - rtems_task_wake_after - YIELD (only task at priority)" );
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ puts( "TA1 - timer_deleting - timer 1" );
+ status = rtems_timer_delete( tmid );
+ directive_failed( status, "rtems_timer_delete" );
+
+ puts( "*** END OF TEST 22 *** " );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp23/init.c b/testsuites/sptests/sp23/init.c
new file mode 100644
index 0000000000..ddb9f51236
--- /dev/null
+++ b/testsuites/sptests/sp23/init.c
@@ -0,0 +1,69 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 23 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ Port_name[ 1 ] = rtems_build_name( 'D', 'P', '1', ' ' );
+
+ status = rtems_port_create(
+ Port_name[ 1 ],
+ Internal_port_area,
+ External_port_area,
+ 0xff,
+ &Port_id[ 1 ]
+ );
+ directive_failed( status, "rtems_port_create of DP1" );
+
+ printf( "INIT - rtems_port_create - DP1 - int = %p ext = %p\n",
+ Internal_port_area,
+ External_port_area
+ );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp23/sp23.doc b/testsuites/sptests/sp23/sp23.doc
new file mode 100644
index 0000000000..78bbc6f8cb
--- /dev/null
+++ b/testsuites/sptests/sp23/sp23.doc
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test23
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_delete,
+ m_ext2int, m_int2ext
+
+concepts:
+
+ a. Verifies the dual ported RAM directives work correctly.
+
+output:
diff --git a/testsuites/sptests/sp23/sp23.scn b/testsuites/sptests/sp23/sp23.scn
new file mode 100644
index 0000000000..7d9f8ff898
--- /dev/null
+++ b/testsuites/sptests/sp23/sp23.scn
@@ -0,0 +1,9 @@
+*** TEST 23 ***
+INIT - rtems_port_create - DP1 - int = 0x1000 ext = 0x2000
+TA1 - rtems_port_ident - 0x24010001
+TA1 - rtems_port_external_to_internal - 0x200e => 0x100e
+TA1 - rtems_port_internal_to_external - 0x100e => 0x200e
+TA1 - rtems_port_external_to_internal - 0x300e => 0x300e
+TA1 - rtems_port_internal_to_external - 0x50e => 0x50e
+TA1 - rtems_port_delete - DP1
+*** END OF TEST 23 ***
diff --git a/testsuites/sptests/sp23/system.h b/testsuites/sptests/sp23/system.h
new file mode 100644
index 0000000000..680088dd71
--- /dev/null
+++ b/testsuites/sptests/sp23/system.h
@@ -0,0 +1,56 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_PORTS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 2 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 2 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Port_id[ 2 ]; /* array of port ids */
+TEST_EXTERN rtems_name Port_name[ 2 ]; /* array of port names */
+
+#define Internal_port_area ((rtems_unsigned8 *) 0x00001000)
+#define External_port_area ((rtems_unsigned8 *) 0x00002000)
+
+#define Below_port_area ((rtems_unsigned8 *) 0x00000500)
+#define Above_port_area ((rtems_unsigned8 *) 0x00003000)
+
+/* end of include file */
diff --git a/testsuites/sptests/sp23/task1.c b/testsuites/sptests/sp23/task1.c
new file mode 100644
index 0000000000..cf1906ef37
--- /dev/null
+++ b/testsuites/sptests/sp23/task1.c
@@ -0,0 +1,96 @@
+/* Task_1
+ *
+ * This task verifies that the dual ported RAM directives work
+ * correctly by converting external addresses to internal addresses and
+ * internal addresses to external addresses.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_id dpid;
+ void *to_be_converted;
+ void *converted;
+ rtems_status_code status;
+
+ status = rtems_port_ident( Port_name[ 1 ], &dpid );
+ directive_failed( status, "rtems_port_ident" );
+ printf( "TA1 - rtems_port_ident - 0x%08x\n", dpid );
+
+ to_be_converted = &External_port_area[ 0xe ];
+ status = rtems_port_external_to_internal(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_external_to_internal" );
+ printf(
+ "TA1 - rtems_port_external_to_internal - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ to_be_converted = &Internal_port_area[ 0xe ];
+ status = rtems_port_internal_to_external(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_internal_to_external" );
+ printf(
+ "TA1 - rtems_port_internal_to_external - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ to_be_converted = &Above_port_area[ 0xe ];
+ status = rtems_port_external_to_internal(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_external_to_internal" );
+ printf(
+ "TA1 - rtems_port_external_to_internal - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ to_be_converted = &Below_port_area[ 0xe ];
+ status = rtems_port_internal_to_external(
+ Port_id[ 1 ],
+ to_be_converted,
+ &converted
+ );
+ directive_failed( status, "rtems_port_internal_to_external" );
+ printf(
+ "TA1 - rtems_port_internal_to_external - %p => %p\n",
+ to_be_converted,
+ converted
+ );
+
+ status = rtems_port_delete( Port_id[ 1 ] );
+ directive_failed( status, "rtems_port_delete" );
+ puts( "TA1 - rtems_port_delete - DP1" );
+
+ puts( "*** END OF TEST 23 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/sp24/init.c b/testsuites/sptests/sp24/init.c
new file mode 100644
index 0000000000..1741f80cb0
--- /dev/null
+++ b/testsuites/sptests/sp24/init.c
@@ -0,0 +1,76 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_time_of_day time;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 24 ***" );
+
+ build_time( &time, 12, 31, 1988, 9, 0, 0, 0 );
+
+ status = rtems_clock_set( &time );
+ directive_failed( status, "rtems_clock_set" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ Timer_name[ 1 ] = rtems_build_name( 'T', 'M', '1', ' ' );
+ Timer_name[ 2 ] = rtems_build_name( 'T', 'M', '2', ' ' );
+ Timer_name[ 3 ] = rtems_build_name( 'T', 'M', '3', ' ' );
+
+ for ( index = 1 ; index <= 3 ; index++ ) {
+ status = rtems_task_create(
+ Task_name[ index ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE * 2,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ status = rtems_timer_create(
+ Timer_name[ index ],
+ &Timer_id[ index ]
+ );
+ directive_failed( status, "rtems_timer_create loop" );
+ }
+
+ for ( index = 1 ; index <= 3 ; index++ ) {
+ status = rtems_task_start( Task_id[ index ], Task_1_through_3, index );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp24/resume.c b/testsuites/sptests/sp24/resume.c
new file mode 100644
index 0000000000..8c975c5460
--- /dev/null
+++ b/testsuites/sptests/sp24/resume.c
@@ -0,0 +1,34 @@
+/* Resume_task
+ *
+ * This subprogram is scheduled as a timer service routine. When
+ * it fires it resumes the task which is mapped to this timer.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Resume_task(
+ rtems_id timer_id,
+ void *ignored_address
+)
+{
+ rtems_id task_to_resume;
+ rtems_status_code status;
+
+ task_to_resume = Task_id[ rtems_get_index( timer_id ) ];
+ status = rtems_task_resume( task_to_resume );
+ directive_failed( status, "rtems_task_resume" );
+}
diff --git a/testsuites/sptests/sp24/sp24.doc b/testsuites/sptests/sp24/sp24.doc
new file mode 100644
index 0000000000..d848553c93
--- /dev/null
+++ b/testsuites/sptests/sp24/sp24.doc
@@ -0,0 +1,51 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test24
+
+directives:
+ ex_init, ex_start, t_create, t_start, tm_tick, i_return, t_ident,
+ ev_receive
+
+concepts:
+
+ a. This test is a cyclic version of test1. The times printed by
+ each test should not skew as in test1 (see output section).
+
+ b. Verifies system can create and start both the executive's system
+ initialization and idle task.
+
+ c. Verifies executive can swap between three application tasks at the
+ same priority and the executive's internal idle task.
+
+ d. Verifies can print strings to the CRT on port 2 of the mvme136 board
+ using Print and Println in the board support package.
+
+ e. Verifies interrupt handler can handler a task switch from an interrupt
+ as specified with the i_return directive.
+
+ f. Verifies executive initialization performed correctly.
+
+ g. Verifies the executive trap handler except for the halt function.
+
+ h. Verifies that a task can get the task identification number of itself.
+
+output:
+ "TA1" is printed once every 5 seconds. "TA2" is printed once
+ every 10 seconds. "TA3" is printed once every 15 seconds.
+
+ The times printed should be multiples of 5 seconds for TA1, 10 seconds
+ for TA2, and 15 seconds for TA3. If this does not happen, the calendar
+ time does not correspond correctly to the number of ticks.
diff --git a/testsuites/sptests/sp24/sp24.scn b/testsuites/sptests/sp24/sp24.scn
new file mode 100644
index 0000000000..96a58f35e3
--- /dev/null
+++ b/testsuites/sptests/sp24/sp24.scn
@@ -0,0 +1,16 @@
+*** TEST 24 ***
+TA1 - rtems_clock_get - 09:00:00 12/31/1988
+TA2 - rtems_clock_get - 09:00:00 12/31/1988
+TA3 - rtems_clock_get - 09:00:00 12/31/1988
+TA1 - rtems_clock_get - 09:00:05 12/31/1988
+TA2 - rtems_clock_get - 09:00:10 12/31/1988
+TA1 - rtems_clock_get - 09:00:10 12/31/1988
+TA3 - rtems_clock_get - 09:00:15 12/31/1988
+TA1 - rtems_clock_get - 09:00:15 12/31/1988
+TA2 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:20 12/31/1988
+TA1 - rtems_clock_get - 09:00:25 12/31/1988
+TA3 - rtems_clock_get - 09:00:30 12/31/1988
+TA2 - rtems_clock_get - 09:00:30 12/31/1988
+TA1 - rtems_clock_get - 09:00:30 12/31/1988
+*** END OF TEST 24 ***
diff --git a/testsuites/sptests/sp24/system.h b/testsuites/sptests/sp24/system.h
new file mode 100644
index 0000000000..a22c7cc021
--- /dev/null
+++ b/testsuites/sptests/sp24/system.h
@@ -0,0 +1,55 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Resume_task(
+ rtems_id timer_id,
+ void *ignored_address
+);
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_TIMERS 3
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_id Timer_id[ 4 ]; /* array of timer ids */
+TEST_EXTERN rtems_name Timer_name[ 4 ]; /* array of timer names */
+
+/* end of include file */
diff --git a/testsuites/sptests/sp24/task1.c b/testsuites/sptests/sp24/task1.c
new file mode 100644
index 0000000000..19892d5aed
--- /dev/null
+++ b/testsuites/sptests/sp24/task1.c
@@ -0,0 +1,58 @@
+/* Task_1_through_3
+ *
+ * This task is a cyclic version of test1 to asssure that the times
+ * displayed are not skewed as in test1. "TA1" is printed once every
+ * 5 seconds, "TA2" is printed once every 10 seconds, and "TA3" is
+ * printed once every 15 seconds. The times displayed should be
+ * in multiples of 5, 10, and 15 for TA1, TA2, and TA3 respectively.
+ * If the times are skewed from these values, then the calendar time
+ * does not correspond correctly with the number of ticks.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1_through_3(
+ rtems_task_argument argument
+)
+{
+ rtems_id tid;
+ rtems_time_of_day time;
+ rtems_status_code status;
+
+ status = rtems_task_ident( RTEMS_SELF, RTEMS_SEARCH_ALL_NODES, &tid );
+ directive_failed( status, "rtems_task_ident of self" );
+
+ while ( FOREVER ) {
+ status = rtems_timer_fire_after(
+ Timer_id[ argument ],
+ task_number( tid ) * 5 * TICKS_PER_SECOND,
+ Resume_task,
+ NULL
+ );
+ directive_failed( status, "tm_fire_after failed" );
+
+ status = rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ directive_failed( status, "rtems_clock_get failed" );
+
+ if ( time.second >= 35 ) {
+ puts( "*** END OF TEST 24 ***" );
+ exit( 0 );
+ }
+
+ put_name( Task_name[ task_number( tid ) ], FALSE );
+ print_time( " - rtems_clock_get - ", &time, "\n" );
+
+ status = rtems_task_suspend( RTEMS_SELF );
+ directive_failed( status, "rtems_task_suspend" );
+ }
+}
diff --git a/testsuites/sptests/sp25/init.c b/testsuites/sptests/sp25/init.c
new file mode 100644
index 0000000000..afb5e6f50e
--- /dev/null
+++ b/testsuites/sptests/sp25/init.c
@@ -0,0 +1,66 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ puts( "\n\n*** TEST 25 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ BASE_PRIORITY,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ Region_name[ 1 ] = rtems_build_name('R', 'N', '0', '1');
+
+
+ status = rtems_region_create(
+ Region_name[ 1 ],
+ Area_1,
+ sizeof( Area_1 ),
+ 64,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id[ 1 ]
+ );
+ directive_failed( status, "rtems_region_create of RN1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/sp25/sp25.doc b/testsuites/sptests/sp25/sp25.doc
new file mode 100644
index 0000000000..f9e6d621e1
--- /dev/null
+++ b/testsuites/sptests/sp25/sp25.doc
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: test25
+
+directives:
+ task_create
+ task_start
+ task_delete
+ region_create
+ region_ident
+ region_get_segment
+ region_return_segment
+ region_delete
+
+concepts:
+
+ a. Verifies that the heap maintains it's integrity trhough a series
+ on region_get_segments and region_return_segments.
+
diff --git a/testsuites/sptests/sp25/sp25.scn b/testsuites/sptests/sp25/sp25.scn
new file mode 100644
index 0000000000..af2599663d
--- /dev/null
+++ b/testsuites/sptests/sp25/sp25.scn
@@ -0,0 +1,29 @@
+*** TEST 25 ***
+TA1 - rtems_region_ident - 0x20010002
+TA1 - rtems_region_get_segment - wait on 64 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f9b8
+TA1 - rtems_region_get_segment - wait on 128 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f930
+TA1 - rtems_region_get_segment - wait on 256 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f828
+TA1 - rtems_region_get_segment - wait on 512 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f620
+TA1 - rtems_region_get_segment - wait on 1024 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000f218
+TA1 - rtems_region_get_segment - wait on 2048 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000ea10
+TA1 - rtems_region_get_segment - wait on 4096 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000da08
+TA1 - rtems_region_get_segment - wait on 8192 byte segment from region 1
+TA1 - got segment from region 1 - 0x0000ba00
+<pause>
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f828
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f620
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f9b8
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f930
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000da08
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000ea10
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000ba00
+TA1 - rtems_region_return_segment - return segment to region 1 - 0x0000f218
+TA1 - rtems_region_delete - walks heap if debug enabled
+*** END OF TEST 25 ***
diff --git a/testsuites/sptests/sp25/system.h b/testsuites/sptests/sp25/system.h
new file mode 100644
index 0000000000..b1eed6cf0f
--- /dev/null
+++ b/testsuites/sptests/sp25/system.h
@@ -0,0 +1,57 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MAXIMUM_REGIONS 1
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 6 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 6 ]; /* array of task names */
+TEST_EXTERN rtems_id Region_id[ 2 ]; /* array of region ids */
+TEST_EXTERN rtems_name Region_name[ 2 ]; /* array of region names */
+
+TEST_EXTERN rtems_unsigned8 Area_1[64000] CPU_STRUCTURE_ALIGNMENT;
+
+#define BASE_PRIORITY 140
+
+#define Put_address_from_area_1( _to_be_printed ) \
+ printf( "0x%08lx", \
+ (unsigned long) ((rtems_unsigned8 *)(_to_be_printed) - Area_1 ) )
+
+/* end of include file */
diff --git a/testsuites/sptests/sp25/task1.c b/testsuites/sptests/sp25/task1.c
new file mode 100644
index 0000000000..e279d5c401
--- /dev/null
+++ b/testsuites/sptests/sp25/task1.c
@@ -0,0 +1,241 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It tests the region manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ void *address_1;
+ void *address_2;
+ void *address_3;
+ void *address_4;
+ void *address_5;
+ void *address_6;
+ void *address_7;
+ void *address_8;
+ rtems_status_code status;
+ rtems_id region_id;
+
+ status = rtems_region_ident(Region_name[ 1 ], &region_id);
+ printf( "TA1 - rtems_region_ident - 0x%08x\n", region_id );
+ directive_failed(status, "rtems_region_ident of RN01");
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 64 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 64,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_1 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 128 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 128,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_2 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 256 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 256,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_3
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_3 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 512 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 512,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_4
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_4 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 1024 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 1024,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_5
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_5 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 2048 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 2048,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_6
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_6 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 4096 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 4096,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_7
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_7 );
+ new_line;
+
+ puts(
+ "TA1 - rtems_region_get_segment - wait on 8192 byte segment from region 1"
+ );
+ rtems_region_get_segment(
+ Region_id[ 1 ],
+ 8192,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &address_8
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+ puts_nocr( "TA1 - got segment from region 1 - " );
+ Put_address_from_area_1( address_8 );
+ new_line;
+
+rtems_test_pause();
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_3 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_3 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_4 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_4 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_4 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_1 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_1 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_1 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_2 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_2 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_7 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_7 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_7 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_6 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_6 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_6 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_8 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_8 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_8 = 0;
+
+ puts_nocr(
+ "TA1 - rtems_region_return_segment - return segment to region 1 - "
+ );
+ Put_address_from_area_1( address_5 );
+ status = rtems_region_return_segment( Region_id[ 1 ], address_5 );
+ directive_failed( status, "rtems_region_return_segment" );
+ new_line;
+ address_5 = 0;
+
+ puts( "TA1 - rtems_region_delete - walks heap if debug enabled" );
+ rtems_region_delete(Region_id[ 1 ]);
+
+ puts( "*** END OF TEST 25 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/sptests/spfatal/fatal.c b/testsuites/sptests/spfatal/fatal.c
new file mode 100644
index 0000000000..6a996ed50b
--- /dev/null
+++ b/testsuites/sptests/spfatal/fatal.c
@@ -0,0 +1,136 @@
+/* Fatal Error Test
+ *
+ * NOTE:
+ *
+ * This test actually modifies the Configuration table and restarts
+ * the executive. It is very carefully constructed to do this and
+ * uses the Configuration very carefully.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+#include <setjmp.h>
+
+char Workspace[ 64 * 1024 ] CPU_STRUCTURE_ALIGNMENT;
+
+typedef enum {
+ FATAL_WORKSPACE_OF_ZERO,
+ FATAL_NULL_WORKSPACE,
+ FATAL_WORKSPACE_TOO_SMALL,
+ FATAL_TASK_CREATE,
+ FATAL_TASK_START
+} Fatal_errors_t;
+
+#define FATAL_LAST FATAL_TASK_START
+
+volatile Fatal_errors_t Case_in_switch;
+
+rtems_status_code Expected_Errors[] = {
+ RTEMS_UNSATISFIED,
+ RTEMS_INVALID_ADDRESS,
+ RTEMS_UNSATISFIED,
+ RTEMS_INVALID_PRIORITY,
+ RTEMS_TASK_EXITTED
+};
+
+rtems_status_code Error_Happened[ FATAL_LAST + 1];
+
+jmp_buf Restart_Context;
+
+/*
+ * We depend on this being zeroed during initialization. This
+ * occurs automatically because this is part of the BSS.
+ */
+
+rtems_unsigned32 First_Time_Through;
+
+void Process_case();
+
+rtems_extension Fatal_extension(
+ rtems_unsigned32 source,
+ rtems_unsigned32 error,
+ boolean is_internal
+)
+{
+ int index;
+
+ Error_Happened[ Case_in_switch ] = error;
+
+ if ( First_Time_Through == 0 ) {
+ Case_in_switch = FATAL_WORKSPACE_OF_ZERO;
+ First_Time_Through = 1;
+ setjmp( Restart_Context );
+ } else if ( Case_in_switch == FATAL_LAST ) {
+
+ /*
+ * Depending on the C library we use, we cannot get the
+ * task exitted error so do not check for it.
+ */
+
+ puts( "*** TEST FATAL ***" );
+ for ( index=0 ; index< FATAL_LAST ; index++ )
+ put_error( Error_Happened[ index ], Expected_Errors[ index ] );
+ puts( "NOT TESTING FATAL ERROR WHEN TASK EXITS -- C LIBRARY CATCHES THIS" );
+ puts( "*** END OF TEST FATAL ***" );
+
+ /*
+ * returns to the default fatal error handler instead of
+ * calling rtems_shutdown_executive
+ */
+ return;
+
+ } else {
+
+ longjmp( Restart_Context, 1 );
+ }
+
+ Process_case();
+}
+
+
+
+void Process_case()
+{
+ switch ( Case_in_switch ) {
+ case FATAL_WORKSPACE_OF_ZERO:
+ New_Configuration = BSP_Configuration;
+ New_Configuration.work_space_start = NULL;
+ Case_in_switch = FATAL_NULL_WORKSPACE;
+ break;
+
+ case FATAL_NULL_WORKSPACE:
+ New_Configuration.work_space_start = Workspace;
+ New_Configuration.work_space_size = 256;
+ Case_in_switch = FATAL_WORKSPACE_TOO_SMALL;
+ break;
+
+ case FATAL_WORKSPACE_TOO_SMALL:
+ Initialization_tasks[ 0 ].initial_priority = RTEMS_CURRENT_PRIORITY;
+ New_Configuration.work_space_size = sizeof( Workspace );
+ Case_in_switch = FATAL_TASK_CREATE;
+ break;
+
+ case FATAL_TASK_CREATE:
+ Initialization_tasks[ 0 ].initial_priority = 1;
+ Initialization_tasks[ 0 ].entry_point = NULL;
+ Case_in_switch = FATAL_TASK_START;
+ break;
+
+ case FATAL_TASK_START:
+ /* this extension exits the test */
+ Initialization_tasks[ 0 ].entry_point = Init;
+ break;
+ }
+ rtems_initialize_executive( &New_Configuration, &Cpu_table );
+}
+
diff --git a/testsuites/sptests/spfatal/init.c b/testsuites/sptests/spfatal/init.c
new file mode 100644
index 0000000000..8ab0156dc7
--- /dev/null
+++ b/testsuites/sptests/spfatal/init.c
@@ -0,0 +1,51 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/sptests/spfatal/puterr.c b/testsuites/sptests/spfatal/puterr.c
new file mode 100644
index 0000000000..d994afe231
--- /dev/null
+++ b/testsuites/sptests/spfatal/puterr.c
@@ -0,0 +1,68 @@
+/* put_error
+ *
+ * This routine verifies that the given error is the expected error.
+ *
+ * Input parameters:
+ * error - actual error code
+ * expected - expected error code
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+char *Errors[] = {
+ "RTEMS_SUCCESSFUL", /* successful completion */
+ "RTEMS_TASK_EXITTED", /* returned from a task */
+ "RTEMS_MP_NOT_CONFIGURED", /* multiprocessing not configured */
+ "RTEMS_INVALID_NAME", /* invalid object name */
+ "RTEMS_INVALID_ID", /* invalid object id */
+ "RTEMS_TOO_MANY", /* too many */
+ "RTEMS_TIMEOUT", /* timed out waiting */
+ "RTEMS_OBJECT_WAS_DELETED", /* object was deleted while waiting */
+ "RTEMS_INVALID_SIZE", /* specified size was invalid */
+ "RTEMS_INVALID_ADDRESS", /* address specified is invalid */
+ "RTEMS_INVALID_NUMBER", /* number was invalid */
+ "RTEMS_NOT_DEFINED", /* item has not been initialized */
+ "RTEMS_RESOURCE_IN_USE", /* resources still outstanding */
+ "RTEMS_UNSATISFIED", /* request not satisfied */
+ "RTEMS_INCORRECT_STATE", /* task is in wrong state */
+ "RTEMS_ALREADY_SUSPENDED", /* task already in state */
+ "RTEMS_ILLEGAL_ON_SELF", /* illegal operation on calling task */
+ "RTEMS_ILLEGAL_ON_REMOTE_OBJECT", /* illegal operation for remote object */
+ "RTEMS_CALLED_FROM_ISR", /* called from ISR */
+ "RTEMS_INVALID_PRIORITY", /* invalid task priority */
+ "RTEMS_INVALID_CLOCK", /* invalid date/time */
+ "RTEMS_INVALID_NODE", /* invalid node id */
+ "RTEMS_NOT_OWNER_OF_RESOURCE", /* not owner of resource */
+ "RTEMS_NOT_CONFIGURED", /* directive not configured */
+ "RTEMS_NOT_IMPLEMENTED" /* directive not implemented */
+};
+
+/* Task states */
+
+void put_error(
+ rtems_unsigned32 error,
+ rtems_status_code expected
+)
+{
+
+ if ( error <= RTEMS_NOT_IMPLEMENTED )
+ printf( "EXPECTED FATAL - error code is correctly %s\n", Errors[ error ] );
+ else
+ printf( "ERROR - out of range error code is %d\n", error );
+
+ if ( error != expected ) {
+ printf( "ERROR - did not get expected code of %d\n", expected );
+ }
+}
diff --git a/testsuites/sptests/spfatal/spfatal.doc b/testsuites/sptests/spfatal/spfatal.doc
new file mode 100644
index 0000000000..449a87173b
--- /dev/null
+++ b/testsuites/sptests/spfatal/spfatal.doc
@@ -0,0 +1,28 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: testfatal
+
+directives: none
+
+concepts:
+
+ a. Verifies that the proper error is reported by k_fatal when a task
+ exits.
+
+ b. Verifies that the task exitted extension works correctly.
+
+ c. Verifies that the fatal error extension works corectly.
+
diff --git a/testsuites/sptests/spfatal/spfatal.scn b/testsuites/sptests/spfatal/spfatal.scn
new file mode 100644
index 0000000000..ecb9f63597
--- /dev/null
+++ b/testsuites/sptests/spfatal/spfatal.scn
@@ -0,0 +1,8 @@
+*** TEST FATAL ***
+EXPECTED FATAL - error code is correctly RTEMS_UNSATISFIED
+EXPECTED FATAL - error code is correctly RTEMS_INVALID_ADDRESS
+EXPECTED FATAL - error code is correctly RTEMS_UNSATISFIED
+EXPECTED FATAL - error code is correctly RTEMS_INVALID_PRIORITY
+EXPECTED FATAL - error code is correctly RTEMS_TASK_EXITTED
+NOT TESTING FATAL ERROR WHEN TASK EXITS -- C LIBRARY CATCHES THIS
+*** END OF TEST FATAL ***
diff --git a/testsuites/sptests/spfatal/system.h b/testsuites/sptests/spfatal/system.h
new file mode 100644
index 0000000000..17ed231bfa
--- /dev/null
+++ b/testsuites/sptests/spfatal/system.h
@@ -0,0 +1,82 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+void put_error(
+ rtems_unsigned32 error,
+ rtems_status_code expected
+);
+
+rtems_extension Fatal_extension(
+ rtems_unsigned32 source,
+ rtems_unsigned32 error,
+ boolean is_internal
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+extern rtems_extensions_table initial_extensions;
+
+#ifdef TEST_INIT
+rtems_extensions_table initial_extensions = {
+ NULL, /* create */
+ NULL, /* start */
+ NULL, /* restart */
+ NULL, /* delete */
+ NULL, /* switch */
+ NULL, /* begin */
+ NULL, /* exitted */
+ Fatal_extension /* fatal */
+};
+#endif
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(0)
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_INITIAL_EXTENSIONS &initial_extensions
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+TEST_EXTERN rtems_configuration_table New_Configuration;
+
+extern rtems_extensions_table Extensions;
+extern rtems_configuration_table BSP_Configuration;
+extern rtems_cpu_table Cpu_table;
+
+/* end of include file */
diff --git a/testsuites/sptests/spfatal/task1.c b/testsuites/sptests/spfatal/task1.c
new file mode 100644
index 0000000000..f0d0f51731
--- /dev/null
+++ b/testsuites/sptests/spfatal/task1.c
@@ -0,0 +1,29 @@
+/* Task_1
+ *
+ * This routine serves as a test task. It verifies the task manager.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ puts( "\n\n*** TEST FATAL ***" );
+ puts( "TA1 - exitting task" );
+}
diff --git a/testsuites/sptests/spsize/getint.c b/testsuites/sptests/spsize/getint.c
new file mode 100644
index 0000000000..3e0651e237
--- /dev/null
+++ b/testsuites/sptests/spsize/getint.c
@@ -0,0 +1,32 @@
+/* getint
+ *
+ * This routine reads and returns an integer.
+ * It assumes decimal.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters:
+ * returns - number read
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int getint( void )
+{
+ char buff[16];
+
+ gets(buff);
+ return atoi(buff);
+}
diff --git a/testsuites/sptests/spsize/init.c b/testsuites/sptests/spsize/init.c
new file mode 100644
index 0000000000..f8dee65981
--- /dev/null
+++ b/testsuites/sptests/spsize/init.c
@@ -0,0 +1,64 @@
+/* Init
+ *
+ * This routine is the initialization task for this test program.
+ * It is a user initialization task and has the responsibility for creating
+ * and starting the tasks that make up the test. If the time of day
+ * clock is required for the test, it should also be set to a known
+ * value by this function.
+ *
+ * Input parameters:
+ * argument - task argument
+ *
+ * Output parameters: NONE
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+/* #define HAVE_MENU */
+
+rtems_task Test_task();
+void size_rtems( int mode );
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+#if defined(HAVE_MENU)
+ int choice = 0;
+#endif
+
+ setvbuf(stdout, 0, _IONBF, 0);
+
+ puts( "\n*** RTEMS SIZE PROGRAM ***" );
+ size_rtems( 1 );
+ puts( "*** END OF RTEMS SIZE PROGRAM ***" );
+ exit( 0 );
+#if defined(HAVE_MENU)
+ do {
+ printf( "\n\nPlease select program mode:\n" );
+ printf( " 1) Print Formulas\n" );
+ printf( " 2) Determine Workspace Size\n" );
+ printf( " 3) Exit\n" );
+ printf( "Enter number of choice (1,2,3) : " );
+
+ choice = getint();
+ switch( choice ) {
+ case 1: size_rtems( 1 ); break;
+ case 2: size_rtems( 0 ); break;
+ case 3: exit( 0 );
+ default: continue;
+ }
+ } while ( FOREVER );
+#endif
+}
diff --git a/testsuites/sptests/spsize/size.c b/testsuites/sptests/spsize/size.c
new file mode 100644
index 0000000000..e7183bb1d0
--- /dev/null
+++ b/testsuites/sptests/spsize/size.c
@@ -0,0 +1,651 @@
+/* main
+ *
+ * This program is run to determine the data space and work space
+ * requirements of the current version of RTEMS.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/config.h>
+#include <rtems/directives.h>
+#include <rtems/score/apiext.h>
+#include <rtems/score/copyrt.h>
+#include <rtems/rtems/clock.h>
+#include <rtems/rtems/tasks.h>
+#include <rtems/rtems/dpmem.h>
+#include <rtems/rtems/event.h>
+#include <rtems/extension.h>
+#include <rtems/fatal.h>
+#include <rtems/init.h>
+#include <rtems/score/isr.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/io.h>
+#include <rtems/rtems/message.h>
+#include <rtems/rtems/mp.h>
+#include <rtems/score/mpci.h>
+#include <rtems/rtems/part.h>
+#include <rtems/score/priority.h>
+#include <rtems/rtems/ratemon.h>
+#include <rtems/rtems/region.h>
+#include <rtems/rtems/sem.h>
+#include <rtems/rtems/signal.h>
+#include <rtems/score/sysstate.h>
+#include <rtems/score/thread.h>
+#include <rtems/rtems/timer.h>
+#include <rtems/score/tod.h>
+#include <rtems/score/userext.h>
+#include <rtems/score/wkspace.h>
+
+#include <stdlib.h>
+
+/* These are always defined by the executive.
+ *
+ * #include <rtems/copyrt.h>
+ * #include <rtems/tables.h>
+ * #include <rtems/sptables.h>
+ */
+#define HEAP_OVHD 16 /* wasted heap space per task stack */
+#define NAME_PTR_SIZE 8 /* size of name and pointer table entries */
+#define READYCHAINS_SIZE \
+ ((RTEMS_MAXIMUM_PRIORITY + 1) * sizeof(Chain_Control ))
+
+#define PER_TASK \
+ (long) (sizeof (Thread_Control) + \
+ NAME_PTR_SIZE + HEAP_OVHD + sizeof( RTEMS_API_Control ))
+#define PER_SEMAPHORE \
+ (long) (sizeof (Semaphore_Control) + NAME_PTR_SIZE)
+#define PER_TIMER \
+ (long) (sizeof (Timer_Control) + NAME_PTR_SIZE)
+#define PER_MSGQ \
+ (long) (sizeof (Message_queue_Control) + NAME_PTR_SIZE)
+#define PER_REGN \
+ (long) (sizeof (Region_Control) + NAME_PTR_SIZE)
+#define PER_PART \
+ (long) (sizeof (Partition_Control) + NAME_PTR_SIZE)
+#define PER_PERIOD \
+ (long) (sizeof (Rate_monotonic_Control) + NAME_PTR_SIZE)
+#define PER_PORT \
+ (long) (sizeof (Dual_ported_memory_Control) + NAME_PTR_SIZE)
+#define PER_EXTENSION \
+ (long) (sizeof (Extension_Control) + NAME_PTR_SIZE)
+
+#define PER_DRV (long) (0)
+#define PER_FPTASK (long) (CONTEXT_FP_SIZE)
+#define PER_GOBTBL (long) (sizeof (Chain_Control)*4)
+#define PER_NODE (long) PER_GOBTBL
+#define PER_GOBJECT (long) (sizeof (Objects_MP_Control))
+#define PER_PROXY (long) (sizeof (Thread_Proxy_control))
+
+#if (CPU_ALL_TASKS_ARE_FP == TRUE)
+#define MPCI_RECEIVE_SERVER_FP (long) (sizeof( Context_Control_fp ))
+#else
+#define MPCI_RECEIVE_SERVER_FP (long) 0
+#endif
+
+#if (CPU_IDLE_TASK_IS_FP == TRUE)
+#define SYSTEM_IDLE_FP (long) (sizeof( Context_Control_fp ))
+#else
+#define SYSTEM_IDLE_FP (long) 0
+#endif
+
+#define SYSTEM_TASKS \
+ (THREAD_IDLE_STACK_SIZE + \
+ MPCI_RECEIVE_SERVER_STACK_SIZE + \
+ (2*sizeof(Thread_Control))) + \
+ MPCI_RECEIVE_SERVER_FP + \
+ SYSTEM_IDLE_FP
+
+#define rtems_unsigned32 unsigned32
+
+rtems_unsigned32 sys_req;
+
+/* to avoid warnings */
+int puts();
+int printf();
+int getint();
+#undef getchar
+int getchar();
+void help_size();
+void print_formula();
+
+void size_rtems(
+ int mode
+)
+{
+int uninitialized = 0;
+int initialized = 0;
+
+/*
+ * The following data is allocated for each Manager:
+ *
+ * + Per Manager Object Information
+ * - local pointer table
+ * - local name table
+ * - the object's control blocks
+ * - global name chains
+ *
+ * The following is the data allocate from the RTEMS Workspace Area.
+ * The order indicates the order in which RTEMS allocates it.
+ *
+ * + Object MP
+ * - Global Object CB's
+ * + Thread
+ * - Ready Chain
+ * + Thread MP
+ * - Proxies Chain
+ * + Interrupt Manager
+ * - Interrupt Stack
+ * + Timer Manager
+ * - per Manager Object Data
+ * + Extension Manager
+ * - per Manager Object Data
+ * + Message Queue Manager
+ * - per Manager Object Data
+ * - Message Buffers
+ * + Semaphore Manager
+ * - per Manager Object Data
+ * + Partition Manager
+ * - per Manager Object Data
+ * + Region Manager
+ * - per Manager Object Data
+ * + Dual Ported Memory Manager
+ * - per Manager Object Data
+ * + Rate Monotonic Manager
+ * - per Manager Object Data
+ * + Internal Threads Handler
+ * - MPCI Receive Server Thread TCB
+ * - IDLE Thread TCB
+ * - MPCI Receive Server Thread stack
+ * - MPCI Receive Server Thread FP area (if CPU requires this)
+ * - IDLE Thread stack
+ * - IDLE Thread FP area (if CPU requires this)
+ *
+ * This does not take into account any CPU dependent alignment requirements.
+ *
+ * The following calculates the overhead needed by RTEMS from the
+ * Workspace Area.
+ */
+sys_req = SYSTEM_TASKS + /* MPCI Receive Server and IDLE */
+ NAME_PTR_SIZE + /* Task Overhead */
+ READYCHAINS_SIZE + /* Ready Chains */
+ NAME_PTR_SIZE + /* Timer Overhead */
+ NAME_PTR_SIZE + /* Semaphore Overhead */
+ NAME_PTR_SIZE + /* Message Queue Overhead */
+ NAME_PTR_SIZE + /* Region Overhead */
+ NAME_PTR_SIZE + /* Partition Overhead */
+ NAME_PTR_SIZE + /* Dual-Ported Memory Overhead */
+ NAME_PTR_SIZE + /* Rate Monotonic Overhead */
+ NAME_PTR_SIZE + /* Extension Overhead */
+ PER_NODE; /* Extra Gobject Table */
+
+uninitialized =
+/*address.h*/ 0 +
+
+/*apiext.h*/ (sizeof _API_extensions_List) +
+
+/*asr.h*/ 0 +
+
+/*attr.h*/ 0 +
+
+/*bitfield.h*/ 0 +
+
+/*chain.h*/ 0 +
+
+/*clock.h*/ 0 +
+
+/*config.h*/ (sizeof _Configuration_Table) +
+ (sizeof _Configuration_MP_table) +
+
+/*context.h*/ (sizeof _Context_Switch_necessary) +
+
+/*copyrt.h*/ 0 +
+
+/*debug.h*/ (sizeof _Debug_Level) +
+
+/*dpmem.h*/ (sizeof _Dual_ported_memory_Information) +
+
+/*event.h*/ (sizeof _Event_Sync_state) +
+
+/*eventmp.h*/ 0 +
+
+/*eventset.h*/ 0 +
+
+/*extension.h*/ (sizeof _Extension_Information) +
+
+/*fatal.h*/ 0 +
+
+/*heap.h*/ 0 +
+
+/*init.h*/ 0 +
+
+/*interr.h*/ (sizeof Internal_errors_What_happened) +
+
+/*intr.h*/ 0 +
+
+/*io.h*/ (sizeof _IO_Number_of_drivers) +
+ (sizeof _IO_Driver_address_table) +
+ (sizeof _IO_Number_of_devices) +
+ (sizeof _IO_Driver_name_table) +
+
+/*isr.h*/ (sizeof _ISR_Nest_level) +
+ (sizeof _ISR_Vector_table) +
+ (sizeof _ISR_Signals_to_thread_executing) +
+
+/*message.h*/ (sizeof _Message_queue_Information) +
+
+/*modes.h*/ 0 +
+
+/*mp.h*/ 0 +
+
+/*mpci.h*/ (sizeof _MPCI_Remote_blocked_threads) +
+ (sizeof _MPCI_Semaphore) +
+ (sizeof _MPCI_table) +
+ (sizeof _MPCI_Receive_server_tcb) +
+ (sizeof _MPCI_Packet_processors) +
+
+/*mppkt.h*/ 0 +
+
+/*mptables.h*/ 0 +
+
+/*msgmp.h*/ 0 +
+
+/*object.h*/ (sizeof _Objects_Local_node) +
+ (sizeof _Objects_Maximum_nodes) +
+ (sizeof _Objects_Information_table) +
+
+/*objectmp.h*/ (sizeof _Objects_MP_Maximum_global_objects) +
+ (sizeof _Objects_MP_Inactive_global_objects) +
+
+/*options.h*/ 0 +
+
+/*part.h*/ (sizeof _Partition_Information) +
+
+/*partmp.h*/ 0 +
+
+/*priority.h*/ (sizeof _Priority_Major_bit_map) +
+ (sizeof _Priority_Bit_map) +
+
+/*ratemon.h*/ (sizeof _Rate_monotonic_Information) +
+
+/*region.h*/ (sizeof _Region_Information) +
+
+/*regionmp.h*/ 0 +
+
+/*rtems.h*/ /* Not applicable */
+
+/*sem.h*/ (sizeof _Semaphore_Information) +
+
+/*semmp.h*/ 0 +
+
+/*signal.h*/ 0 +
+
+/*signalmp.h*/ 0 +
+
+/*stack.h*/ 0 +
+
+/*states.h*/ 0 +
+
+/*status.h*/ 0 +
+
+/*sysstate.h*/ (sizeof _System_state_Is_multiprocessing) +
+ (sizeof _System_state_Current) +
+
+/*system.h*/ (sizeof _CPU_Table) +
+
+/*taskmp.h*/ 0 +
+
+/*tasks.h*/ (sizeof _RTEMS_tasks_Information) +
+ (sizeof _RTEMS_tasks_User_initialization_tasks) +
+ (sizeof _RTEMS_tasks_Number_of_initialization_tasks) +
+
+/*thread.h*/ (sizeof _Thread_BSP_context) +
+ (sizeof _Thread_Dispatch_disable_level) +
+ (sizeof _Thread_Do_post_task_switch_extension) +
+ (sizeof _Thread_Maximum_extensions) +
+ (sizeof _Thread_Ticks_per_timeslice) +
+ (sizeof _Thread_Ready_chain) +
+ (sizeof _Thread_Executing) +
+ (sizeof _Thread_Heir) +
+ (sizeof _Thread_Allocated_fp) +
+ (sizeof _Thread_Internal_information) +
+ (sizeof _Thread_Idle) +
+
+/*threadmp.h*/ (sizeof _Thread_MP_Receive) +
+ (sizeof _Thread_MP_Active_proxies) +
+ (sizeof _Thread_MP_Inactive_proxies) +
+
+/*threadq.h*/ (sizeof _Thread_queue_Extract_table) +
+
+/*timer.h*/ (sizeof _Timer_Information) +
+
+/*tod.h*/ (sizeof _TOD_Current) +
+ (sizeof _TOD_Seconds_since_epoch) +
+ (sizeof _TOD_Microseconds_per_tick) +
+ (sizeof _TOD_Ticks_per_second) +
+ (sizeof _TOD_Seconds_watchdog) +
+
+/*tqdata.h*/ 0 +
+
+/*types.h*/ 0 +
+
+/*userext.h*/ (sizeof _User_extensions_Initial) +
+ (sizeof _User_extensions_List) +
+
+/*watchdog.h*/ (sizeof _Watchdog_Sync_level) +
+ (sizeof _Watchdog_Sync_count) +
+ (sizeof _Watchdog_Ticks_since_boot) +
+ (sizeof _Watchdog_Ticks_chain) +
+ (sizeof _Watchdog_Seconds_chain) +
+
+/*wkspace.h*/ (sizeof _Workspace_Area);
+
+uninitialized = 0;
+
+#ifndef unix /* make sure this is not a native compile */
+
+#ifdef i386
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Null_fp_context) +
+ (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+
+#endif
+
+#ifdef i960
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+
+#endif
+
+#ifdef hppa1_1
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Null_fp_context) +
+#ifndef RTEMS_UNIX
+ (sizeof _CPU_Default_gr27) +
+#endif
+ (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+#endif
+
+#ifdef m68k
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high);
+
+#endif
+
+#ifdef sparc
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high) +
+ (sizeof _CPU_Null_fp_context);
+
+#ifndef NO_TABLE_MOVE
+uninitialized += (sizeof _CPU_Trap_Table_area);
+#endif
+
+#ifdef erc32
+uninitialized += (sizeof _ERC32_MEC_Timer_Control_Mirror);
+#endif
+
+
+#endif
+
+
+#ifdef no_cpu
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Null_fp_context) +
+ (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high) +
+ (sizeof _CPU_Thread_dispatch_pointer);
+
+#endif
+
+#ifdef ppc
+
+/* cpu.h */
+uninitialized += (sizeof _CPU_Interrupt_stack_low) +
+ (sizeof _CPU_Interrupt_stack_high) +
+ (sizeof _CPU_IRQ_info);
+
+#endif
+#endif /* !unix */
+
+initialized +=
+/*copyrt.h*/ (strlen(_Copyright_Notice)+1) +
+
+/*sptables.h*/ (sizeof _Initialization_Default_multiprocessing_table) +
+ (strlen(_RTEMS_version)+1) +
+ (sizeof _Entry_points) +
+
+
+/*tod.h*/ (sizeof _TOD_Days_per_month) +
+ (sizeof _TOD_Days_to_date) +
+ (sizeof _TOD_Days_since_last_leap_year);
+
+#ifndef unix /* make sure this is not native */
+#ifdef sparc
+
+initialized += (sizeof _CPU_Trap_slot_template);
+
+#endif
+#endif /* !unix */
+
+puts( "" );
+
+ if ( mode == 0 ) help_size();
+ else print_formula();
+
+printf( "\n" );
+printf( "RTEMS uninitialized data consumes %d bytes\n", uninitialized );
+printf( "RTEMS intialized data consumes %d bytes\n", initialized );
+
+}
+
+void help_size()
+{
+int c = '\0';
+int break_loop;
+int total_size;
+int task_stacks;
+int interrupt_stack;
+int maximum_tasks, size_tasks;
+int maximum_sems, size_sems;
+int maximum_timers, size_timers;
+int maximum_msgqs, size_msgqs;
+int maximum_msgs, size_msgs_overhead;
+int maximum_regns, size_regns;
+int maximum_parts, size_parts;
+int maximum_ports, size_ports;
+int maximum_periods, size_periods;
+int maximum_extensions, size_extensions;
+int maximum_drvs, size_drvs;
+int maximum_fps, size_fps;
+int maximum_nodes, size_nodes;
+int maximum_gobjs, size_gobjs;
+int maximum_proxies, size_proxies;
+
+total_size = sys_req; /* Fixed Overhead */
+printf( "What is maximum_tasks? " );
+maximum_tasks = getint();
+size_tasks = PER_TASK * maximum_tasks;
+total_size += size_tasks;
+
+printf( "What is maximum_semaphores? " );
+maximum_sems = getint();
+size_sems = PER_SEMAPHORE * maximum_sems;
+total_size += size_sems;
+
+printf( "What is maximum_timers? " );
+maximum_timers = getint();
+size_timers = PER_TIMER * maximum_timers;
+total_size += size_timers;
+
+printf( "What is maximum_message_queues? " );
+maximum_msgqs = getint();
+size_msgqs = PER_MSGQ * maximum_msgqs;
+total_size += size_msgqs;
+
+printf( "What is maximum_messages? XXXX " );
+maximum_msgs = getint();
+size_msgs_overhead = 0;
+total_size += size_msgs_overhead;
+
+printf( "What is maximum_regions? " );
+maximum_regns = getint();
+size_regns = PER_REGN * maximum_regns;
+total_size += size_regns;
+
+printf( "What is maximum_partitions? " );
+maximum_parts = getint();
+size_parts = PER_PART * maximum_parts;
+total_size += size_parts;
+
+printf( "What is maximum_ports? " );
+maximum_ports = getint();
+size_ports = PER_PORT * maximum_ports;
+total_size += size_ports;
+
+printf( "What is maximum_periods? " );
+maximum_periods = getint();
+size_periods = PER_PORT * maximum_periods;
+total_size += size_periods;
+
+printf( "What is maximum_extensions? " );
+maximum_extensions = getint();
+size_extensions = PER_EXTENSION * maximum_extensions;
+total_size += size_extensions;
+
+printf( "What is number_of_device_drivers? " );
+maximum_drvs = getint();
+size_drvs = PER_DRV * maximum_drvs;
+total_size += size_drvs;
+
+printf( "What will be total stack requirement for all tasks? " );
+task_stacks = getint();
+total_size += task_stacks;
+
+printf( "What is the size of the interrupt stack? " );
+interrupt_stack = getint();
+total_size += interrupt_stack;
+
+printf( "How many tasks will be created with the FP flag? " );
+maximum_fps = getint();
+size_fps = PER_FPTASK * maximum_fps;
+total_size += size_fps;
+
+printf( "Is this a single processor system? " );
+for ( break_loop=0 ; !break_loop; c = getchar() ) {
+ switch ( c ) {
+ case 'Y': case 'y':
+ case 'N': case 'n':
+ break_loop = 1;
+ break;
+ }
+}
+printf( "%c\n", c );
+if ( c == 'n' || c == 'N' ) {
+ printf( "What is maximum_nodes? " );
+ maximum_nodes = getint();
+ size_nodes = PER_NODE * maximum_nodes;
+ total_size += size_nodes;
+ printf( "What is maximum_global_objects? " );
+ maximum_gobjs = getint();
+ size_gobjs = PER_GOBJECT * maximum_gobjs;
+ total_size += size_gobjs;
+ printf( "What is maximum_proxies? " );
+ maximum_proxies = getint();
+ size_proxies = PER_PROXY * maximum_proxies;
+ total_size += size_proxies;
+} else {
+ maximum_nodes = 0;
+ size_nodes = PER_NODE * 0;
+ maximum_gobjs = 0;
+ size_gobjs = PER_GOBJECT * 0;
+ maximum_proxies = 0;
+ size_proxies = PER_PROXY * 0;
+}
+
+printf( "\n\n" );
+printf( " ************** EXECUTIVE WORK SPACE REQUIRED **************\n" );
+printf( " Tasks - %03d * %03ld = %ld\n",
+ maximum_tasks, PER_TASK, (long) size_tasks );
+printf( " Semaphores - %03d * %03ld = %ld\n",
+ maximum_sems, PER_SEMAPHORE, (long) size_sems );
+printf( " Timers - %03d * %03ld = %ld\n",
+ maximum_timers, PER_TIMER, (long) size_timers );
+printf( " Msg Queues - %03d * %03ld = %ld\n",
+ maximum_msgqs, PER_MSGQ, (long) size_msgqs );
+printf( " Messages Overhead - %03d * %03d = %ld\n",
+ maximum_msgs, 0 /* PER_MSG_OVERHEAD */, (long) size_msgs_overhead );
+printf( " Regions - %03d * %03ld = %ld\n",
+ maximum_regns, PER_REGN, (long) size_regns);
+printf( " Partitions - %03d * %03ld = %ld\n",
+ maximum_parts, PER_PART, (long) size_parts );
+printf( " Periods - %03d * %03ld = %ld\n",
+ maximum_periods, PER_PERIOD, (long) size_periods );
+printf( " Extensions - %03d * %03ld = %ld\n",
+ maximum_extensions, PER_EXTENSION, (long) size_extensions );
+printf( " Device Drivers - %03d * %03ld = %ld\n",
+ maximum_drvs, PER_DRV, (long) size_drvs );
+
+printf( " System Requirements - %04d = %d\n",
+ sys_req, sys_req );
+
+printf( " Floating Point Tasks - %03d * %03ld = %ld\n",
+ maximum_fps, PER_FPTASK, (long) size_fps );
+printf( " Application Task Stacks - = %d\n",
+ task_stacks );
+printf( " Interrupt Stacks - = %d\n",
+ task_stacks );
+printf( " \n" );
+printf( " Global object tables - %03d * %03ld = %ld\n",
+ maximum_nodes, PER_NODE, (long) size_nodes );
+printf( " Global objects - %03d * %03ld = %ld\n",
+ maximum_gobjs, PER_GOBJECT, (long) size_gobjs );
+printf( " Proxies - %03d * %03ld = %ld\n",
+ maximum_proxies, PER_PROXY, (long) size_proxies );
+printf( "\n\n" );
+printf( " TOTAL = %d bytes\n",
+ total_size );
+}
+
+void print_formula()
+{
+printf( " ************** EXECUTIVE WORK SPACE FORMULA **************\n" );
+printf( " Tasks - maximum_tasks * %ld\n", PER_TASK );
+printf( " Timers - maximum_timers * %ld\n", PER_TIMER );
+printf( " Semaphores - maximum_semaphores * %ld\n", PER_SEMAPHORE);
+printf( " Message Queues - maximum_message_queues * %ld\n", PER_MSGQ );
+printf( " Messages -\n");
+printf( " Regions - maximum_regions * %ld\n", PER_REGN );
+printf( " Partitions - maximum_partitions * %ld\n", PER_PART );
+printf( " Ports - maximum_ports * %ld\n", PER_PORT );
+printf( " Periods - maximum_periods * %ld\n", PER_PORT );
+printf( " Extensions - maximum_extensions * %ld\n", PER_EXTENSION );
+printf( " Device Drivers - number_of_device_drivers * %ld\n", PER_DRV);
+printf( " System Requirements - %d\n", sys_req );
+printf( " Floating Point Tasks - FPMASK Tasks * %ld\n", PER_FPTASK );
+printf( " User's Tasks' Stacks -\n" );
+printf( " Interrupt Stack -\n" );
+printf( " \n" );
+printf( " Global object tables - maximum_nodes * %ld\n", PER_NODE );
+printf( " Global objects - maximum_global_objects * %ld\n", PER_GOBJECT );
+printf( " Proxies - maximum_proxies * %ld\n", PER_PROXY );
+}
diff --git a/testsuites/sptests/spsize/system.h b/testsuites/sptests/spsize/system.h
new file mode 100644
index 0000000000..9b4c33cf8d
--- /dev/null
+++ b/testsuites/sptests/spsize/system.h
@@ -0,0 +1,47 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+int getint( void );
+
+/* configuration information */
+
+#define CONFIGURE_SPTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* global variables */
+
+TEST_EXTERN rtems_id Task_id[ 4 ]; /* array of task ids */
+TEST_EXTERN rtems_name Task_name[ 4 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/support/include/tmacros.h b/testsuites/support/include/tmacros.h
new file mode 100644
index 0000000000..7f27f0b9c8
--- /dev/null
+++ b/testsuites/support/include/tmacros.h
@@ -0,0 +1,140 @@
+/* tmacros.h
+ *
+ * This include file contains macros which are useful in the RTEMS
+ * test suites.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __TMACROS_h
+#define __TMACROS_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <bsp.h> /* includes <rtems.h> */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FOREVER 1 /* infinite loop */
+
+#ifdef TEST_INIT
+#define TEST_EXTERN
+#define CONFIGURE_INIT
+#else
+#define TEST_EXTERN extern
+#endif
+
+#define directive_failed( dirstat, failmsg ) \
+ fatal_directive_status( dirstat, RTEMS_SUCCESSFUL, failmsg )
+
+#define fatal_directive_status( stat, desired, msg ) \
+ do { \
+ if ( (stat) != (desired) ) { \
+ printf( "\n%s FAILED -- expected (%d) got (%d)\n", \
+ (msg), (desired), (stat) ); \
+ fflush(stdout); \
+ exit( stat ); \
+ } \
+ } while ( 0 )
+
+#define sprint_time(str,s1,tb,s2) \
+ do { \
+ sprintf( (str), "%s%02d:%02d:%02d %02d/%02d/%04d%s", \
+ s1, (tb)->hour, (tb)->minute, (tb)->second, \
+ (tb)->month, (tb)->day, (tb)->year, s2 ); \
+ } while ( 0 )
+
+#define print_time(s1,tb,s2) \
+ do { \
+ printf( "%s%02d:%02d:%02d %02d/%02d/%04d%s", \
+ s1, (tb)->hour, (tb)->minute, (tb)->second, \
+ (tb)->month, (tb)->day, (tb)->year, s2 ); \
+ fflush(stdout); \
+ } while ( 0 )
+
+#define put_dot( c ) putchar( c ); fflush( stdout )
+
+#define new_line puts( "" )
+
+#define puts_nocr printf
+
+#ifdef RTEMS_TEST_NO_PAUSE
+#define rtems_test_pause() \
+ do { \
+ printf( "<pause>\n" ); fflush( stdout ); \
+ } while ( 0 )
+
+#define rtems_test_pause_and_screen_number( _screen ) \
+ do { \
+ printf( "<pause - screen %d>\n", (_screen) ); fflush( stdout ); \
+ } while ( 0 )
+#else
+#define rtems_test_pause() \
+ do { \
+ char buffer[ 80 ]; \
+ printf( "<pause>" ); fflush( stdout ); \
+ gets( buffer ); \
+ puts( "" ); \
+ } while ( 0 )
+
+#define rtems_test_pause_and_screen_number( _screen ) \
+ do { \
+ char buffer[ 80 ]; \
+ printf( "<pause - screen %d>", (_screen) ); fflush( stdout ); \
+ gets( buffer ); \
+ puts( "" ); \
+ } while ( 0 )
+#endif
+
+#define put_name( name, crlf ) \
+{ rtems_unsigned32 c0, c1, c2, c3; \
+ c0 = (name >> 24) & 0xff; \
+ c1 = (name >> 16) & 0xff; \
+ c2 = (name >> 8) & 0xff; \
+ c3 = name & 0xff; \
+ putchar( (char)c0 ); \
+ if ( c1 ) putchar( (char)c1 ); \
+ if ( c2 ) putchar( (char)c2 ); \
+ if ( c3 ) putchar( (char)c3 ); \
+ if ( crlf ) \
+ putchar( '\n' ); \
+}
+
+#define build_time( TB, MON, DAY, YR, HR, MIN, SEC, TK ) \
+ { (TB)->year = YR; \
+ (TB)->month = MON; \
+ (TB)->day = DAY; \
+ (TB)->hour = HR; \
+ (TB)->minute = MIN; \
+ (TB)->second = SEC; \
+ (TB)->ticks = TK; }
+
+#define task_number( tid ) \
+ ( rtems_get_index( tid ) - \
+ BSP_Configuration.RTEMS_api_configuration->number_of_initialization_tasks )
+
+static inline rtems_unsigned32 get_ticks_per_second( void )
+{
+ rtems_interval ticks_per_second;
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticks_per_second );
+ return ticks_per_second;
+}
+
+#define TICKS_PER_SECOND get_ticks_per_second()
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/testsuites/tmtests/README b/testsuites/tmtests/README
new file mode 100644
index 0000000000..c27617d5a3
--- /dev/null
+++ b/testsuites/tmtests/README
@@ -0,0 +1,21 @@
+#
+# $Id$
+#
+
+This directory contains the RTEMS Timing Test Suite.
+The tests in this directory are used to measure the execution
+time of RTEMS directive and some critical internal functions.
+The results of these test are reported in the Fact Sheets
+and Supplental Manuals.
+
+These tests attempt to benchmark RTEMS as the user would. They measure
+the execution time for a directive (under various circumstances)
+from the time RTEMS is entered until it is executed. Where possible,
+the time is the average of at least 100 invocations of the directive.
+
+The accuracy of the times reported by these benchmarks is very dependent
+on the resolution of the timer being used. It is also important to
+insure that all sources of hardware interrupts are disabled during
+execution of the tests. This insures that the directive time reported
+does not include any interrupt time.
+
diff --git a/testsuites/tmtests/include/timesys.h b/testsuites/tmtests/include/timesys.h
new file mode 100644
index 0000000000..fb68ccb284
--- /dev/null
+++ b/testsuites/tmtests/include/timesys.h
@@ -0,0 +1,58 @@
+/* timesys.h
+ *
+ * This header file contains the global variables for the Time
+ * suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <tmacros.h>
+
+/*
+ * How many times a particular operation is performed while timed.
+ */
+
+#define OPERATION_COUNT 100
+#define IT_COUNT 100
+
+/* functions */
+
+#define put_time( _message, _total_time, \
+ _iterations, _loop_overhead, _overhead ) \
+ printf( \
+ "%s %d\n", \
+ (_message), \
+ (((_total_time) - (_loop_overhead)) / (_iterations)) - (_overhead) \
+ )
+
+#if defined(STACK_CHECKER_ON) || defined(RTEMS_DEBUG)
+#define Print_Warning() \
+ do { \
+ puts( \
+ "\n" \
+ "THE TIMES REPORTED BY THIS TEST INCLUDE DEBUG CODE!\n" \
+ "\n" \
+ ); \
+ } while (0)
+
+#else
+#define Print_Warning()
+#endif
+
+/* variables */
+
+TEST_EXTERN volatile rtems_unsigned32 end_time; /* ending time variable */
+TEST_EXTERN volatile rtems_unsigned32 overhead; /* loop overhead variable */
+
+TEST_EXTERN rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */
+TEST_EXTERN rtems_id Task_name[ OPERATION_COUNT+1 ]; /* array of task names */
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm01/system.h b/testsuites/tmtests/tm01/system.h
new file mode 100644
index 0000000000..25d3dede71
--- /dev/null
+++ b/testsuites/tmtests/tm01/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm01/task1.c b/testsuites/tmtests/tm01/task1.c
new file mode 100644
index 0000000000..64f5fa1f3c
--- /dev/null
+++ b/testsuites/tmtests/tm01/task1.c
@@ -0,0 +1,189 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 1 ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' );
+ Task_name[ 2 ] = rtems_build_name( 'T', 'A', '2', ' ' );
+ Task_name[ 3 ] = rtems_build_name( 'T', 'A', '3', ' ' );
+
+ status = rtems_task_create(
+ Task_name[ 1 ],
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+
+}
+
+rtems_task Test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 semaphore_obtain_time;
+ rtems_unsigned32 semaphore_release_time;
+ rtems_unsigned32 semaphore_obtain_no_wait_time;
+ rtems_unsigned32 semaphore_obtain_loop_time;
+ rtems_unsigned32 semaphore_release_loop_time;
+ rtems_unsigned32 index;
+ rtems_unsigned32 iterations;
+ rtems_name name;
+ rtems_id smid;
+ rtems_status_code status;
+
+ name = rtems_build_name( 'S', 'M', '1', ' ' );
+
+ semaphore_obtain_time = 0;
+ semaphore_release_time = 0;
+ semaphore_obtain_no_wait_time = 0;
+ semaphore_obtain_loop_time = 0;
+ semaphore_release_loop_time = 0;
+
+
+ /* Time one invocation of rtems_semaphore_create */
+
+ Timer_initialize();
+ (void) rtems_semaphore_create(
+ name,
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_NO_PRIORITY,
+ &smid
+ );
+ end_time = Read_timer();
+ put_time(
+ "rtems_semaphore_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_CREATE
+ );
+
+ /* Time one invocation of rtems_semaphore_delete */
+
+ Timer_initialize();
+ (void) rtems_semaphore_delete( smid );
+ end_time = Read_timer();
+ put_time(
+ "rtems_semaphore_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_CREATE
+ );
+
+ status = rtems_semaphore_create(
+ name,
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &smid
+ );
+
+ for ( iterations=OPERATION_COUNT ; iterations ; iterations-- ) {
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ semaphore_obtain_loop_time += end_time;
+ semaphore_release_loop_time += end_time;
+
+ /* rtems_semaphore_obtain (available) */
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ (void) rtems_semaphore_obtain(
+ smid,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ end_time = Read_timer();
+
+ semaphore_obtain_time += end_time;
+
+ /* rtems_semaphore_release */
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ (void) rtems_semaphore_release( smid );
+ end_time = Read_timer();
+
+ semaphore_release_time += end_time;
+
+ /* semaphore obtain (RTEMS_NO_WAIT) */
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ rtems_semaphore_obtain( smid, RTEMS_NO_WAIT, RTEMS_NO_TIMEOUT );
+ semaphore_obtain_no_wait_time += Read_timer();
+
+ Timer_initialize();
+ for ( index = 1 ; index<=OPERATION_COUNT ; index++ )
+ rtems_semaphore_release( smid );
+ end_time = Read_timer();
+
+ semaphore_release_time += end_time;
+ }
+
+ put_time(
+ "rtems_semaphore_obtain: available",
+ semaphore_obtain_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ semaphore_obtain_loop_time,
+ CALLING_OVERHEAD_SEMAPHORE_OBTAIN
+ );
+
+ put_time(
+ "rtems_semaphore_obtain: not available -- NO_WAIT",
+ semaphore_obtain_no_wait_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ semaphore_obtain_loop_time,
+ CALLING_OVERHEAD_SEMAPHORE_OBTAIN
+ );
+
+ put_time(
+ "rtems_semaphore_release: no waiting tasks",
+ semaphore_release_time,
+ OPERATION_COUNT * OPERATION_COUNT * 2,
+ semaphore_release_loop_time * 2,
+ CALLING_OVERHEAD_SEMAPHORE_RELEASE
+ );
+
+ puts( "*** END OF TEST 1 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm01/tm01.doc b/testsuites/tmtests/tm01/tm01.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm01/tm01.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm02/system.h b/testsuites/tmtests/tm02/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/testsuites/tmtests/tm02/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm02/task1.c b/testsuites/tmtests/tm02/task1.c
new file mode 100644
index 0000000000..5e415fa8bb
--- /dev/null
+++ b/testsuites/tmtests/tm02/task1.c
@@ -0,0 +1,158 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id High_id;
+rtems_id Low_id;
+rtems_id Semaphore_id;
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 2 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_task_priority priority;
+
+ priority = 5;
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &High_id
+ );
+ directive_failed( status, "rtems_task_create of high task" );
+
+ priority++;
+
+ status = rtems_task_start( High_id, High_task, 0 );
+ directive_failed( status, "rtems_task_start of high task" );
+
+ for ( index=2 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Low_id
+ );
+ directive_failed( status, "rtems_task_create middle" );
+
+ priority++;
+
+ status = rtems_task_start( Low_id, Middle_tasks, 0 );
+ directive_failed( status, "rtems_task_start middle" );
+ }
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Low_id
+ );
+ directive_failed( status, "rtems_task_create low" );
+
+ status = rtems_task_start( Low_id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start low" );
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', ' '),
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Timer_initialize(); /* start blocking rtems_semaphore_obtain time */
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_obtain: not available -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_OBTAIN
+ );
+
+ puts( "*** END OF TEST 2 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm02/tm02.doc b/testsuites/tmtests/tm02/tm02.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm02/tm02.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm03/system.h b/testsuites/tmtests/tm03/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/testsuites/tmtests/tm03/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm03/task1.c b/testsuites/tmtests/tm03/task1.c
new file mode 100644
index 0000000000..f4526f5a00
--- /dev/null
+++ b/testsuites/tmtests/tm03/task1.c
@@ -0,0 +1,151 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Semaphore_id;
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id task_id;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 3 ***" );
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '1', ' ' ),
+ 252,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of test_init" );
+
+ status = rtems_task_start( task_id, test_init, 0 );
+ directive_failed( status, "rtems_task_start of test_init" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_id task_id;
+ rtems_task_priority priority;
+
+ priority = 250;
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', '\0'),
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+
+ for ( index = 2 ; index <= OPERATION_COUNT ; index ++ ) {
+ rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create middle" );
+
+ priority--;
+
+ rtems_task_start( task_id, Middle_tasks, 0 );
+ directive_failed( status, "rtems_task_start middle" );
+ }
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of high task" );
+
+ status = rtems_task_start( task_id, High_task, 0 );
+ directive_failed( status, "rtems_task_start of high task" );
+
+ Timer_initialize(); /* start the timer */
+ status = rtems_semaphore_release( Semaphore_id );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ status = rtems_semaphore_release( Semaphore_id );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_release: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_RELEASE
+ );
+
+ puts( "*** END OF TEST 3 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm03/tm03.doc b/testsuites/tmtests/tm03/tm03.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm03/tm03.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm04/system.h b/testsuites/tmtests/tm04/system.h
new file mode 100644
index 0000000000..b984fea8b9
--- /dev/null
+++ b/testsuites/tmtests/tm04/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm04/task1.c b/testsuites/tmtests/tm04/task1.c
new file mode 100644
index 0000000000..74cccadf2b
--- /dev/null
+++ b/testsuites/tmtests/tm04/task1.c
@@ -0,0 +1,388 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Semaphore_id;
+rtems_id Task_id[OPERATION_COUNT+1];
+rtems_unsigned32 task_count;
+rtems_id Highest_id;
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Restart_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 4 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ task_count = OPERATION_COUNT;
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ status = rtems_task_start( Task_id[ index ], Low_tasks, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', ' ' ),
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+}
+
+rtems_task Highest_task(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority old_priority;
+ rtems_status_code status;
+
+ if ( argument == 1 ) {
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: blocked task -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ status = rtems_task_set_priority(
+ RTEMS_CURRENT_PRIORITY,
+ 254,
+ &old_priority
+ );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ } else if ( argument == 2 ) {
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: ready task -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+
+ } else
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_name name;
+ rtems_task_priority old_priority;
+
+ Timer_initialize();
+ (void) rtems_task_restart( Highest_id, 1 );
+ /* preempted by Higher_task */
+
+ Timer_initialize();
+ (void) rtems_task_restart( Highest_id, 2 );
+ /* preempted by Higher_task */
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ rtems_semaphore_release( Semaphore_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_release: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_SEMAPHORE_RELEASE
+ );
+
+ name = rtems_build_name( 'T', 'I', 'M', 'E' );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_delete( Task_id[index] );
+ directive_failed( status, "rtems_task_delete" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ rtems_task_create(
+ name,
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_CREATE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ rtems_task_start( Task_id[ index ], Low_tasks, 0 );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_start",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_START
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_delete( Task_id[ index ] );
+ directive_failed( status, "rtems_task_delete" );
+ }
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ name,
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( Task_id[ index ], Restart_task, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+
+ status = rtems_task_suspend( Task_id[ index ] );
+ directive_failed( status, "rtems_task_suspend LOOP" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_restart( Task_id[ index ], 0 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: suspended task -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_suspend( Task_id[ index ] );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_delete( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: suspended task",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_DELETE
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ name,
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( Task_id[ index ], Restart_task, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_restart( Task_id[ index ], 1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: ready task -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_set_priority( Task_id[ index ], 5, &old_priority );
+ directive_failed( status, "rtems_task_set_priority loop" );
+ }
+
+ /* yield processor -- tasks block */
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_restart( Task_id[ index ], 1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: blocked task -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ /* yield processor -- tasks block */
+ status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ directive_failed( status, "rtems_task_wake_after" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_delete( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: blocked task",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_DELETE
+ );
+
+ puts( "*** END OF TEST 4 ***" );
+ exit( 0 );
+}
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ task_count--;
+
+ if ( task_count == 0 ) {
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', ' ', ' ' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create HI" );
+
+ status = rtems_task_start( id, High_task, 0 );
+ directive_failed( status, "rtems_task_start HI" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 3,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Highest_id
+ );
+ directive_failed( status, "rtems_task_create HIGH" );
+
+ status = rtems_task_start( Highest_id, Highest_task, 0 );
+ directive_failed( status, "rtems_task_start HIGH" );
+
+ }
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Restart_task(
+ rtems_task_argument argument
+)
+{
+ if ( argument == 1 )
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
diff --git a/testsuites/tmtests/tm04/tm04.doc b/testsuites/tmtests/tm04/tm04.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm04/tm04.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm05/system.h b/testsuites/tmtests/tm05/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/testsuites/tmtests/tm05/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm05/task1.c b/testsuites/tmtests/tm05/task1.c
new file mode 100644
index 0000000000..46e10407bd
--- /dev/null
+++ b/testsuites/tmtests/tm05/task1.c
@@ -0,0 +1,132 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Task_id[OPERATION_COUNT+1];
+rtems_unsigned32 Task_index;
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 5 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_unsigned32 index;
+
+ priority = 250;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ priority--;
+
+ if ( index==0 ) task_entry = Low_task;
+ else if ( index==OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[ index ], task_entry, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_resume: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESUME
+ );
+
+ puts( "*** END OF TEST 5 ***" );
+ exit( 0 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ Task_index++;
+ (void) rtems_task_resume( Task_id[ Task_index ] );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_suspend: calling task",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_SUSPEND
+ );
+
+ Task_index = 1;
+ Timer_initialize();
+ (void) rtems_task_resume( Task_id[ Task_index ] );
+}
diff --git a/testsuites/tmtests/tm05/tm05.doc b/testsuites/tmtests/tm05/tm05.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm05/tm05.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm06/system.h b/testsuites/tmtests/tm06/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/testsuites/tmtests/tm06/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm06/task1.c b/testsuites/tmtests/tm06/task1.c
new file mode 100644
index 0000000000..6edeb7a8e1
--- /dev/null
+++ b/testsuites/tmtests/tm06/task1.c
@@ -0,0 +1,162 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Task_id[ OPERATION_COUNT + 1 ];
+
+rtems_unsigned32 Task_restarted;
+
+rtems_task null_task(
+ rtems_task_argument argument
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+void test_init( void );
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 6 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init( void )
+{
+ rtems_status_code status;
+ rtems_id id;
+
+ Task_restarted = OPERATION_COUNT;
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ if ( Task_restarted == OPERATION_COUNT )
+ Timer_initialize();
+
+ Task_restarted--;
+
+ if ( Task_restarted != 0 )
+ (void) rtems_task_restart( RTEMS_SELF, 0 );
+
+ end_time = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ put_time(
+ "rtems_task_restart: calling task",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ status = rtems_task_start( Task_id[ index ], null_task, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_suspend( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_suspend: returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_SUSPEND
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_resume( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_resume: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESUME
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_delete( Task_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: ready task",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESUME
+ );
+
+ puts( "*** END OF TEST 6 ***" );
+ exit( 0 );
+}
+
+rtems_task null_task(
+ rtems_task_argument argument
+)
+{
+ while ( FOREVER )
+ ;
+}
diff --git a/testsuites/tmtests/tm06/tm06.doc b/testsuites/tmtests/tm06/tm06.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm06/tm06.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm07/system.h b/testsuites/tmtests/tm07/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/testsuites/tmtests/tm07/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm07/task1.c b/testsuites/tmtests/tm07/task1.c
new file mode 100644
index 0000000000..518cc28148
--- /dev/null
+++ b/testsuites/tmtests/tm07/task1.c
@@ -0,0 +1,120 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Task_id[ OPERATION_COUNT+1 ], task_index;
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 7 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+ rtems_task_priority priority;
+ rtems_task_entry task_entry;
+ rtems_unsigned32 index;
+
+ priority = 250;
+
+ for( index=0 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[index]
+ );
+ directive_failed( status, "rtems_task_create" );
+ priority--;
+
+ if ( index == 0 ) task_entry = Low_task;
+ else if ( index == OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[index], task_entry, 0 );
+ directive_failed( status, "rtems_task_start" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ if ( argument != 0 ) {
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart: suspended task -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_RESTART
+ );
+ } else
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ puts( "*** END OF TEST 7 ***" );
+ exit( 0 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ task_index++;
+
+ if ( argument != 0 )
+ (void) rtems_task_restart( Task_id[ task_index ], 0xffffffff );
+ else
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ task_index = 1;
+
+ Timer_initialize();
+ (void) rtems_task_restart( Task_id[ task_index ], 0xffffffff );
+}
diff --git a/testsuites/tmtests/tm07/tm07.doc b/testsuites/tmtests/tm07/tm07.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm07/tm07.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm08/system.h b/testsuites/tmtests/tm08/system.h
new file mode 100644
index 0000000000..9cbcf06563
--- /dev/null
+++ b/testsuites/tmtests/tm08/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_MAXIMUM_SEMAPHORES 101
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm08/task1.c b/testsuites/tmtests/tm08/task1.c
new file mode 100644
index 0000000000..1b02b5e0ee
--- /dev/null
+++ b/testsuites/tmtests/tm08/task1.c
@@ -0,0 +1,255 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Test_task_id;
+
+rtems_task test_task(
+ rtems_task_argument argument
+);
+rtems_task test_task1(
+ rtems_task_argument argument
+);
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 8 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_status_code status;
+
+ status = rtems_task_create(
+ 1,
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Test_task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Test_task_id, test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_create(
+ 1,
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Test_task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Test_task_id, test_task1, 0 );
+ directive_failed( status, "rtems_task_start" );
+}
+
+rtems_task test_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_task_priority old_priority;
+ rtems_time_of_day time;
+ rtems_unsigned32 old_note;
+ rtems_unsigned32 old_mode;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_set_priority(
+ Test_task_id,
+ RTEMS_CURRENT_PRIORITY,
+ &old_priority
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority: obtain current priority",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_PRIORITY
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_set_priority( Test_task_id, 253, &old_priority );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority: returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_PRIORITY
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_mode(
+ RTEMS_CURRENT_MODE,
+ RTEMS_CURRENT_MODE,
+ &old_mode
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: obtain current mode",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ (void) rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(1),
+ RTEMS_INTERRUPT_MASK,
+ &old_mode
+ );
+ (void) rtems_task_mode(
+ RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_INTERRUPT_MASK,
+ &old_mode
+ );
+ }
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: no reschedule",
+ end_time,
+ OPERATION_COUNT * 2,
+ overhead,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ Timer_initialize(); /* must be one host */
+ (void) rtems_task_mode( RTEMS_NO_ASR, RTEMS_ASR_MASK, &old_mode );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: reschedule -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ status = rtems_task_mode( RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &old_mode );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_task_set_priority( Test_task_id, 1, &old_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ /* preempted by test_task1 */
+ Timer_initialize();
+ (void) rtems_task_mode( RTEMS_PREEMPT, RTEMS_PREEMPT_MASK, &old_mode );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_set_note( Test_task_id, 8, 10 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_NOTE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_get_note( Test_task_id, 8, &old_note );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_get_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_GET_NOTE
+ );
+
+ build_time( &time, 1, 1, 1988, 0, 0, 0, 0 );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_clock_set( &time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_set",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_CLOCK_SET
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_clock_get( RTEMS_CLOCK_GET_TOD, &time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_get",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_CLOCK_GET
+ );
+
+ puts( "*** END OF TEST 8 ***" );
+ exit( 0 );
+}
+
+rtems_task test_task1(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode: reschedule -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_TASK_MODE
+ );
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
diff --git a/testsuites/tmtests/tm08/tm08.doc b/testsuites/tmtests/tm08/tm08.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm08/tm08.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm09/system.h b/testsuites/tmtests/tm09/system.h
new file mode 100644
index 0000000000..4db3a16eea
--- /dev/null
+++ b/testsuites/tmtests/tm09/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm09/task1.c b/testsuites/tmtests/tm09/task1.c
new file mode 100644
index 0000000000..90d454b3d4
--- /dev/null
+++ b/testsuites/tmtests/tm09/task1.c
@@ -0,0 +1,226 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+void queue_test();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 9 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Test_task (
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+ rtems_message_queue_create(
+ 1,
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_CREATE
+ );
+
+ queue_test();
+
+ Timer_initialize();
+ rtems_message_queue_delete( Queue_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_DELETE
+ );
+
+ puts( "*** END OF TEST 9 ***" );
+ exit( 0 );
+}
+
+void queue_test()
+{
+ rtems_unsigned32 send_loop_time;
+ rtems_unsigned32 urgent_loop_time;
+ rtems_unsigned32 receive_loop_time;
+ rtems_unsigned32 send_time;
+ rtems_unsigned32 urgent_time;
+ rtems_unsigned32 receive_time;
+ rtems_unsigned32 empty_flush_time;
+ rtems_unsigned32 flush_time;
+ rtems_unsigned32 empty_flush_count;
+ rtems_unsigned32 flush_count;
+ rtems_unsigned32 index;
+ rtems_unsigned32 iterations;
+ long buffer[4];
+ rtems_status_code status;
+ rtems_unsigned32 size;
+
+ send_loop_time = 0;
+ urgent_loop_time = 0;
+ receive_loop_time = 0;
+ send_time = 0;
+ urgent_time = 0;
+ receive_time = 0;
+ empty_flush_time = 0;
+ flush_time = 0;
+ flush_count = 0;
+ empty_flush_count = 0;
+
+ for ( iterations = 1 ; iterations <= OPERATION_COUNT ; iterations++ ) {
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ send_loop_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ urgent_loop_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ receive_loop_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4])buffer, 16 );
+ send_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ receive_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4])buffer, 16 );
+ urgent_time += Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4])buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ receive_time += Read_timer();
+
+ Timer_initialize();
+ rtems_message_queue_flush( Queue_id, &empty_flush_count );
+ empty_flush_time += Read_timer();
+
+ /* send one message to flush */
+ status = rtems_message_queue_send(
+ Queue_id,
+ (long (*)[4])buffer,
+ 16
+ );
+ directive_failed( status, "rtems_message_queue_send" );
+
+ Timer_initialize();
+ rtems_message_queue_flush( Queue_id, &flush_count );
+ flush_time += Read_timer();
+ }
+
+ put_time(
+ "rtems_message_queue_send: no waiting tasks",
+ send_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ send_loop_time,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_SEND
+ );
+
+ put_time(
+ "rtems_message_queue_urgent: no waiting tasks",
+ urgent_time,
+ OPERATION_COUNT * OPERATION_COUNT,
+ urgent_loop_time,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT
+ );
+
+ put_time(
+ "rtems_message_queue_receive: available",
+ receive_time,
+ OPERATION_COUNT * OPERATION_COUNT * 2,
+ receive_loop_time * 2,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE
+ );
+
+ put_time(
+ "rtems_message_queue_flush: no messages flushed",
+ empty_flush_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH
+ );
+
+ put_time(
+ "rtems_message_queue_flush: messages flushed",
+ flush_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_FLUSH
+ );
+
+}
diff --git a/testsuites/tmtests/tm09/tm09.doc b/testsuites/tmtests/tm09/tm09.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm09/tm09.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm10/system.h b/testsuites/tmtests/tm10/system.h
new file mode 100644
index 0000000000..f16004b87b
--- /dev/null
+++ b/testsuites/tmtests/tm10/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 110
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm10/task1.c b/testsuites/tmtests/tm10/task1.c
new file mode 100644
index 0000000000..7cb30f1c33
--- /dev/null
+++ b/testsuites/tmtests/tm10/task1.c
@@ -0,0 +1,165 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+long Buffer[4];
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 10 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_unsigned32 index;
+ rtems_unsigned32 size;
+ rtems_task_entry task_entry;
+ rtems_status_code status;
+ rtems_task_priority priority;
+ rtems_id task_id;
+
+ priority = 5;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority++;
+
+ if ( index==0 ) task_entry = High_task;
+ else if ( index==OPERATION_COUNT ) task_entry = Low_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_message_queue_create(
+ 1,
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_receive: not available -- NO_WAIT",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE
+ );
+
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ Timer_initialize();
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
+
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_receive: not available -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_RECEIVE
+ );
+
+ puts( "*** END OF TEST 10 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm10/tm10.doc b/testsuites/tmtests/tm10/tm10.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm10/tm10.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm11/system.h b/testsuites/tmtests/tm11/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm11/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm11/task1.c b/testsuites/tmtests/tm11/task1.c
new file mode 100644
index 0000000000..a255c7cf2e
--- /dev/null
+++ b/testsuites/tmtests/tm11/task1.c
@@ -0,0 +1,155 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+
+void Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id id;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 11 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+/* As each task is started, it preempts this task and
+ * performs a blocking rtems_message_queue_receive. Upon completion of
+ * this loop all created tasks are blocked.
+ */
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index < OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT-1 ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4]) Buffer, 16 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4]) Buffer, size );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_send: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_SEND
+ );
+
+ puts( "*** END OF TEST 11 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm11/tm11.doc b/testsuites/tmtests/tm11/tm11.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm11/tm11.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm12/system.h b/testsuites/tmtests/tm12/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm12/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm12/task1.c b/testsuites/tmtests/tm12/task1.c
new file mode 100644
index 0000000000..d36f90a253
--- /dev/null
+++ b/testsuites/tmtests/tm12/task1.c
@@ -0,0 +1,146 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id task_id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 12 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( task_id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Low_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_send( Queue_id, (long (*)[4]) Buffer, 16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_send: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_SEND
+ );
+
+ puts( "*** END OF TEST 12 ***" );
+ exit( 0 );
+}
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
diff --git a/testsuites/tmtests/tm12/tm12.doc b/testsuites/tmtests/tm12/tm12.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm12/tm12.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm13/system.h b/testsuites/tmtests/tm13/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm13/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm13/task1.c b/testsuites/tmtests/tm13/task1.c
new file mode 100644
index 0000000000..b32f323064
--- /dev/null
+++ b/testsuites/tmtests/tm13/task1.c
@@ -0,0 +1,154 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+void Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_id id;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 13 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+/* As each task is started, it preempts this task and
+ * performs a blocking rtems_message_queue_receive. Upon completion of
+ * this loop all created tasks are blocked.
+ */
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index < OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT-1 ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4]) Buffer, 16 );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4]) Buffer, size );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_urgent: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT
+ );
+
+ puts( "*** END OF TEST 13 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm13/tm13.doc b/testsuites/tmtests/tm13/tm13.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm13/tm13.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm14/system.h b/testsuites/tmtests/tm14/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm14/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm14/task1.c b/testsuites/tmtests/tm14/task1.c
new file mode 100644
index 0000000000..39dfd85c31
--- /dev/null
+++ b/testsuites/tmtests/tm14/task1.c
@@ -0,0 +1,146 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id task_id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 14 ***" );
+
+ status = rtems_task_create(
+ 1,
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( task_id, test_init, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+ rtems_task_priority priority;
+ rtems_id task_id;
+ rtems_status_code status;
+
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' ' ),
+ OPERATION_COUNT,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ priority = 250;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ priority--;
+
+ if ( index==OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Low_tasks;
+
+ status = rtems_task_start( task_id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_urgent( Queue_id, (long (*)[4]) Buffer, 16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_urgent: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_URGENT
+ );
+
+ puts( "*** END OF TEST 14 ***" );
+ exit( 0 );
+}
+
+rtems_task Low_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 size;
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+}
diff --git a/testsuites/tmtests/tm14/tm14.doc b/testsuites/tmtests/tm14/tm14.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm14/tm14.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm15/system.h b/testsuites/tmtests/tm15/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm15/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm15/task1.c b/testsuites/tmtests/tm15/task1.c
new file mode 100644
index 0000000000..85cb8d2e4d
--- /dev/null
+++ b/testsuites/tmtests/tm15/task1.c
@@ -0,0 +1,222 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 time_set, eventout;
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 15 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_event_set event_out;
+ rtems_status_code status;
+
+ time_set = FALSE;
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOW" );
+
+ status = rtems_task_start( id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( Task_id[ index ], High_tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ {
+ (void) rtems_event_receive(
+ RTEMS_PENDING_EVENTS,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ }
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: obtain current events",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ {
+ (void) rtems_event_receive(
+ RTEMS_ALL_EVENTS,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ }
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: not available -- NO_WAIT",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_event_set event_out;
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: not available -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_event_send( RTEMS_SELF, RTEMS_EVENT_16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send: no task readied",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_SEND
+ );
+
+ Timer_initialize();
+ (void) rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive: available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_EVENT_RECEIVE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_event_send( Task_id[ index ], RTEMS_EVENT_16 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send: task readied -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_EVENT_SEND
+ );
+
+ puts( "*** END OF TEST 15 ***" );
+ exit( 0 );
+}
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ if ( time_set )
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ else {
+ time_set = 1;
+ Timer_initialize(); /* start blocking rtems_event_receive time */
+ status = rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &eventout
+ );
+ }
+}
diff --git a/testsuites/tmtests/tm15/tm15.doc b/testsuites/tmtests/tm15/tm15.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm15/tm15.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm16/system.h b/testsuites/tmtests/tm16/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm16/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm16/task1.c b/testsuites/tmtests/tm16/task1.c
new file mode 100644
index 0000000000..142512c053
--- /dev/null
+++ b/testsuites/tmtests/tm16/task1.c
@@ -0,0 +1,148 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 Task_count;
+
+rtems_task test_init(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 16 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ 251,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of test_init" );
+
+ status = rtems_task_start( id, test_init, 0 );
+ directive_failed( status, "rtems_task_start of test_init" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task test_init(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority priority;
+ rtems_status_code status;
+ rtems_unsigned32 index;
+ rtems_task_entry task_entry;
+
+/* As each task is started, it preempts this task and
+ * performs a blocking rtems_event_receive. Upon completion of
+ * this loop all created tasks are blocked.
+ */
+
+ priority = 250;
+
+ for( index = 0 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ if ( index == OPERATION_COUNT ) task_entry = High_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[ index ], task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+
+ priority--;
+ }
+
+ Task_count = 0;
+
+ Timer_initialize();
+ (void) rtems_event_send( Task_id[ Task_count ], RTEMS_EVENT_16 );
+ /* preempts task */
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set event_out;
+
+ (void) rtems_event_receive( /* task blocks */
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+
+ Task_count++;
+
+ (void) rtems_event_send( /* preempts task */
+ Task_id[ Task_count ],
+ RTEMS_EVENT_16
+ );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_event_set event_out;
+
+ (void) rtems_event_receive( /* task blocks */
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &event_out
+ );
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send: task readied -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_EVENT_SEND
+ );
+
+ puts( "*** END OF TEST 16 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm16/tm16.doc b/testsuites/tmtests/tm16/tm16.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm16/tm16.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm17/system.h b/testsuites/tmtests/tm17/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm17/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm17/task1.c b/testsuites/tmtests/tm17/task1.c
new file mode 100644
index 0000000000..e7cbc8052f
--- /dev/null
+++ b/testsuites/tmtests/tm17/task1.c
@@ -0,0 +1,127 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 Task_count;
+rtems_task_priority Task_priority;
+
+rtems_task First_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Last_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_task_entry task_entry;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 17 ***" );
+
+ Task_priority = 254;
+
+ for( index = 0; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ Task_priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ index ]
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ if ( index == OPERATION_COUNT ) task_entry = Last_task;
+ else if ( index == 0 ) task_entry = First_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( Task_id[ index ], task_entry, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+ Task_count = 1;
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task First_task(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority previous_priority;
+
+ Timer_initialize();
+
+ Task_priority--;
+ Task_count++;
+
+ (void) rtems_task_set_priority(
+ Task_id[ Task_count ],
+ Task_priority,
+ &previous_priority
+ );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_task_priority previous_priority;
+
+ Task_priority--;
+ Task_count++;
+
+ (void) rtems_task_set_priority(
+ Task_id[ Task_count ],
+ Task_priority,
+ &previous_priority
+ );
+}
+
+rtems_task Last_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ end_time = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority: preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_SET_PRIORITY
+ );
+
+ puts( "*** END OF TEST 17 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm17/tm17.doc b/testsuites/tmtests/tm17/tm17.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm17/tm17.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm18/system.h b/testsuites/tmtests/tm18/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm18/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm18/task1.c b/testsuites/tmtests/tm18/task1.c
new file mode 100644
index 0000000000..f7a877d7ca
--- /dev/null
+++ b/testsuites/tmtests/tm18/task1.c
@@ -0,0 +1,112 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 taskcount;
+rtems_task_priority taskpri;
+
+rtems_task First_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Last_task(
+ rtems_task_argument argument
+);
+
+
+void test_init();
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 18 ***" );
+
+ test_init();
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void test_init()
+{
+ rtems_id id;
+ rtems_task_entry task_entry;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ for ( index = 0 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create loop" );
+
+ if ( index == OPERATION_COUNT ) task_entry = Last_task;
+ else if ( index == 0 ) task_entry = First_task;
+ else task_entry = Middle_tasks;
+
+
+ status = rtems_task_start( id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start loop" );
+ }
+
+}
+
+rtems_task First_task(
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+
+ (void) rtems_task_delete( RTEMS_SELF );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_delete( RTEMS_SELF );
+}
+
+rtems_task Last_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete: calling task",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_DELETE
+ );
+
+ puts( "*** END OF TEST 18 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm18/tm18.doc b/testsuites/tmtests/tm18/tm18.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm18/tm18.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm19/system.h b/testsuites/tmtests/tm19/system.h
new file mode 100644
index 0000000000..e5e553ff19
--- /dev/null
+++ b/testsuites/tmtests/tm19/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm19/task1.c b/testsuites/tmtests/tm19/task1.c
new file mode 100644
index 0000000000..6c503531f1
--- /dev/null
+++ b/testsuites/tmtests/tm19/task1.c
@@ -0,0 +1,208 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_asr Process_asr_for_pass_1(
+ rtems_signal_set signals
+);
+
+rtems_asr Process_asr_for_pass_2(
+ rtems_signal_set signals
+);
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Task_3(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 19 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TASK1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 127,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TASK2" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 126,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 3 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK3" );
+
+ status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
+ directive_failed( status, "rtems_task_start of TASK3" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_asr Process_asr_for_pass_1(
+ rtems_signal_set signals
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_send: signal to self",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SIGNAL_SEND
+ );
+
+ Timer_initialize();
+}
+
+rtems_asr Process_asr_for_pass_2(
+ rtems_signal_set signals
+)
+{
+ rtems_status_code status;
+
+ status = rtems_task_resume( Task_id[ 3 ] );
+ directive_failed( status, "rtems_task_resume" );
+
+ Timer_initialize();
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Timer_initialize();
+ (void) rtems_signal_catch( Process_asr_for_pass_1, RTEMS_DEFAULT_MODES );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_catch",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SIGNAL_CATCH
+ );
+
+ Timer_initialize();
+ rtems_signal_send( Task_id[ 2 ], 1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_send: returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_SIGNAL_SEND
+ );
+
+ Timer_initialize();
+ (void) rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_1 );
+
+ /* end time is done is RTEMS_ASR */
+
+ end_time = Read_timer();
+
+ put_time(
+ "exit ASR overhead: returns to calling task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ status = rtems_signal_catch( Process_asr_for_pass_2, RTEMS_NO_PREEMPT );
+ directive_failed( status, "rtems_signal_catch" );
+
+ Timer_initialize();
+ (void) rtems_signal_send( RTEMS_SELF, RTEMS_SIGNAL_1 );
+}
+
+rtems_asr Process_asr_for_task_2(
+ rtems_signal_set signals
+)
+{
+ ;
+}
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ status = rtems_signal_catch( Process_asr_for_task_2, RTEMS_DEFAULT_MODES );
+ directive_failed( status, "rtems_signal_catch" );
+
+ (void) rtems_task_suspend( RTEMS_SELF );
+}
+
+rtems_task Task_3(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_suspend( RTEMS_SELF );
+
+ end_time = Read_timer();
+
+ put_time(
+ "exit ASR overhead: returns to preempting task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ puts( "*** END OF TEST 19 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm19/tm19.doc b/testsuites/tmtests/tm19/tm19.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm19/tm19.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm20/system.h b/testsuites/tmtests/tm20/system.h
new file mode 100644
index 0000000000..54be275388
--- /dev/null
+++ b/testsuites/tmtests/tm20/system.h
@@ -0,0 +1,44 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+#define CONFIGURE_TEST_NEEDS_STUB_DRIVER
+
+#define CONFIGURE_MAXIMUM_PARTITIONS 1
+#define CONFIGURE_MAXIMUM_REGIONS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm20/task1.c b/testsuites/tmtests/tm20/task1.c
new file mode 100644
index 0000000000..62d9d9a261
--- /dev/null
+++ b/testsuites/tmtests/tm20/task1.c
@@ -0,0 +1,466 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_device_major_number _STUB_major = 1;
+
+rtems_id Region_id;
+rtems_name Region_name;
+rtems_unsigned8 Region_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_id Partition_id;
+rtems_name Partition_name;
+rtems_unsigned8 Partition_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+
+void *Buffer_address_1;
+void *Buffer_address_2;
+void *Buffer_address_3;
+void *Buffer_address_4;
+
+rtems_unsigned32 buffer_count;
+
+void *Buffer_addresses[ OPERATION_COUNT+1 ];
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 20 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', '1' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TASK1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', '2' ),
+ 129,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of TASK2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of TASK2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_mode previous_mode;
+ rtems_task_priority previous_priority;
+ rtems_status_code status;
+
+ Partition_name = rtems_build_name( 'P', 'A', 'R', 'T' );
+
+ Timer_initialize();
+ rtems_partition_create(
+ Partition_name,
+ Partition_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Partition_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_CREATE
+ );
+
+ Region_name = rtems_build_name( 'R', 'E', 'G', 'N' );
+
+ Timer_initialize();
+ rtems_region_create(
+ Region_name,
+ Region_area,
+ 2048,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Region_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_CREATE
+ );
+
+ Timer_initialize();
+ (void) rtems_partition_get_buffer( Partition_id, &Buffer_address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_get_buffer: available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_GET_BUFFER
+ );
+
+ buffer_count = 0;
+ while ( FOREVER ) {
+
+ status = rtems_partition_get_buffer(
+ Partition_id,
+ &Buffer_addresses[ buffer_count ]
+ );
+
+ if ( status == RTEMS_UNSATISFIED ) break;
+
+ buffer_count++;
+ }
+
+ Timer_initialize();
+ (void) rtems_partition_get_buffer( Partition_id, &Buffer_address_2 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_get_buffer: not available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_GET_BUFFER
+ );
+
+ Timer_initialize();
+ (void) rtems_partition_return_buffer( Partition_id, Buffer_address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_return_buffer",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_RETURN_BUFFER
+ );
+
+ for ( index = 0 ; index < buffer_count ; index++ ) {
+
+ status = rtems_partition_return_buffer(
+ Partition_id,
+ Buffer_addresses[ index ]
+ );
+ directive_failed( status, "rtems_partition_return_buffer" );
+
+ }
+
+ Timer_initialize();
+ (void) rtems_partition_delete( Partition_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PARTITION_DELETE
+ );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_2
+ );
+ directive_failed( status, "region_get_semgent" );
+
+ Timer_initialize();
+ (void) rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_3
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment: available",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_GET_SEGMENT
+ );
+
+ Timer_initialize();
+ (void) rtems_region_get_segment(
+ Region_id,
+ 1998,
+ RTEMS_NO_WAIT,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_4
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment: not available -- NO_WAIT",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_GET_SEGMENT
+ );
+
+ status = rtems_region_return_segment( Region_id, Buffer_address_3 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ Timer_initialize();
+ (void) rtems_region_return_segment( Region_id, Buffer_address_2 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment: no waiting tasks",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_RETURN_SEGMENT
+ );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_1
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ Timer_initialize();
+ (void) rtems_region_get_segment(
+ Region_id,
+ 1998,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_2
+ );
+
+ /* execute Task_2 */
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment: task readied -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_RETURN_SEGMENT
+ );
+
+ status = rtems_region_return_segment( Region_id, Buffer_address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ status = rtems_task_mode(
+ RTEMS_NO_PREEMPT,
+ RTEMS_PREEMPT_MASK,
+ &previous_mode
+ );
+ directive_failed( status, "rtems_task_mode" );
+
+ status = rtems_task_set_priority( RTEMS_SELF, 254, &previous_priority );
+ directive_failed( status, "rtems_task_set_priority" );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 400,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_1
+ );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ status = rtems_region_get_segment(
+ Region_id,
+ 1998,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT,
+ &Buffer_address_2
+ );
+ directive_failed( status, "rtems_region_get_segment" );
+
+ /* execute Task_2 */
+
+ status = rtems_region_return_segment( Region_id, Buffer_address_2 );
+ directive_failed( status, "rtems_region_return_segment" );
+
+ Timer_initialize();
+ (void) rtems_region_delete( Region_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_DELETE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_initialize( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_initialize",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_INITIALIZE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_open( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_open",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_OPEN
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_close( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_close",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_CLOSE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_read( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_read",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_READ
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_write( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_write",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_WRITE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_io_control( _STUB_major, 0, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_control",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_IO_CONTROL
+ );
+
+ puts( "*** END OF TEST 20 ***" );
+ exit( 0 );
+}
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment: not available -- caller blocks",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_GET_SEGMENT
+ );
+
+ Timer_initialize();
+ (void) rtems_region_return_segment( Region_id, Buffer_address_1 );
+
+ /* preempt back to Task_1 */
+
+ Timer_initialize();
+ (void) rtems_region_return_segment( Region_id, Buffer_address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment: task readied -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_REGION_RETURN_SEGMENT
+ );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
diff --git a/testsuites/tmtests/tm20/tm20.doc b/testsuites/tmtests/tm20/tm20.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm20/tm20.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm21/system.h b/testsuites/tmtests/tm21/system.h
new file mode 100644
index 0000000000..4dd9ff035b
--- /dev/null
+++ b/testsuites/tmtests/tm21/system.h
@@ -0,0 +1,50 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 102
+#define CONFIGURE_MAXIMUM_TIMERS 100
+#define CONFIGURE_MAXIMUM_SEMAPHORES 100
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 100
+#define CONFIGURE_MAXIMUM_PARTITIONS 100
+#define CONFIGURE_MAXIMUM_REGIONS 100
+#define CONFIGURE_MAXIMUM_PORTS 100
+#define CONFIGURE_MAXIMUM_PERIODS 100
+
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm21/task1.c b/testsuites/tmtests/tm21/task1.c
new file mode 100644
index 0000000000..29184daecf
--- /dev/null
+++ b/testsuites/tmtests/tm21/task1.c
@@ -0,0 +1,236 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 Region_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+rtems_unsigned8 Partition_area[ 2048 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 21 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 250,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of TASK1" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TASK1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_id id;
+ rtems_status_code status;
+
+ for( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create (
+ index,
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_message_queue_create(
+ index,
+ 1, /* only going to ident this queue */
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ status = rtems_semaphore_create(
+ index,
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &id
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ status = rtems_region_create(
+ index,
+ Region_area,
+ 2048,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_region_create" );
+
+ status = rtems_partition_create(
+ index,
+ Partition_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_partition_create" );
+
+ status = rtems_port_create(
+ index,
+ Partition_area,
+ Region_area,
+ 0xff,
+ &id
+ );
+ directive_failed( status, "rtems_port_create" );
+
+ status = rtems_timer_create( index, &id );
+ directive_failed( status, "rtems_timer_create" );
+
+ status = rtems_rate_monotonic_create( index, &id );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_semaphore_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_SEMAPHORE_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_partition_ident( index, RTEMS_SEARCH_ALL_NODES, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PARTITION_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_region_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_REGION_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_port_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PORT_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_IDENT
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_rate_monotonic_ident( index, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_RATE_MONOTONIC_IDENT
+ );
+
+ puts( "*** END OF TEST 21 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm21/tm21.doc b/testsuites/tmtests/tm21/tm21.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm21/tm21.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm22/system.h b/testsuites/tmtests/tm22/system.h
new file mode 100644
index 0000000000..a91f3af44f
--- /dev/null
+++ b/testsuites/tmtests/tm22/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 103
+#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm22/task1.c b/testsuites/tmtests/tm22/task1.c
new file mode 100644
index 0000000000..ed71c734b8
--- /dev/null
+++ b/testsuites/tmtests/tm22/task1.c
@@ -0,0 +1,200 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Queue_id;
+
+long Buffer[4];
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 22 ***" );
+
+ status = rtems_message_queue_create(
+ rtems_build_name( 'M', 'Q', '1', ' '),
+ 100,
+ 16,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Queue_id
+ );
+ directive_failed( status, "rtems_message_queue_create" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ status = rtems_task_create(
+ 1,
+ 11,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create RTEMS_PREEMPT" );
+
+ status = rtems_task_start( id, Preempt_task, 0 );
+ directive_failed( status, "rtems_task_start RTEMS_PREEMPT" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+ rtems_status_code status;
+
+ Timer_initialize();
+ (void) rtems_message_queue_broadcast(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ 16,
+ &count
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast: task readied -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST
+ );
+
+ status = rtems_task_suspend(RTEMS_SELF);
+ directive_failed( status, "rtems_task_suspend" );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_unsigned32 count;
+ rtems_unsigned32 size;
+ rtems_status_code status;
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_NO_PREEMPT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( id, High_task, 0 );
+ directive_failed( status, "rtems_task_start HIGH" );
+
+ status = rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+ directive_failed( status, "message_queu_receive" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_message_queue_broadcast(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ 16,
+ &count
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast: no waiting tasks",
+ end_time,
+ OPERATION_COUNT,
+ 1,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST
+ );
+
+ (void) rtems_message_queue_receive(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ &size,
+ RTEMS_DEFAULT_OPTIONS,
+ RTEMS_NO_TIMEOUT
+ );
+
+ /* should go to Preempt_task here */
+
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast: task readied -- preempts caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_MESSAGE_QUEUE_BROADCAST
+ );
+
+ puts( "*** END OF TEST 22 ***" );
+ exit( 0 );
+}
+
+rtems_task Preempt_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 count;
+
+ Timer_initialize();
+ (void) rtems_message_queue_broadcast(
+ Queue_id,
+ (long (*)[4]) Buffer,
+ 16,
+ &count
+ );
+
+ /* should be preempted by low task */
+}
diff --git a/testsuites/tmtests/tm22/tm22.doc b/testsuites/tmtests/tm22/tm22.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm22/tm22.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm23/system.h b/testsuites/tmtests/tm23/system.h
new file mode 100644
index 0000000000..a76f89f27d
--- /dev/null
+++ b/testsuites/tmtests/tm23/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_TIMERS 110
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm23/task1.c b/testsuites/tmtests/tm23/task1.c
new file mode 100644
index 0000000000..2ee1ae247b
--- /dev/null
+++ b/testsuites/tmtests/tm23/task1.c
@@ -0,0 +1,302 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Timer_id[ OPERATION_COUNT+1 ];
+
+rtems_time_of_day time_of_day;
+
+void null_delay(
+ rtems_id ignored_id,
+ void *ignored_address
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+
+ rtems_task_priority priority;
+ rtems_unsigned32 index;
+ rtems_id id;
+ rtems_task_entry task_entry;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 23 ***" );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ priority = 5;
+
+ for( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ if ( index == 1 ) task_entry = High_task;
+ else if ( index == OPERATION_COUNT ) task_entry = Low_task;
+ else task_entry = Middle_tasks;
+
+ status = rtems_task_start( id, task_entry, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+
+ priority++;
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+void null_delay(
+ rtems_id ignored_id,
+ void *ignored_address
+)
+{
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_status_code status;
+ int i;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_create( index, &Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_CREATE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_after( Timer_id[ index ], 500, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_after: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_AFTER
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_after( Timer_id[ index ], 500, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_after: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_AFTER
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_cancel( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_cancel: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_CANCEL
+ );
+
+ for ( Timer_initialize(), i=0 ; i<OPERATION_COUNT ; i++ )
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_cancel( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_cancel: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_CANCEL
+ );
+
+ for ( Timer_initialize(), i=0 ; i<OPERATION_COUNT ; i++ )
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_reset( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_reset: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_RESET
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_reset( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_reset: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_RESET
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_reset( Timer_id[ index ] );
+
+ build_time( &time_of_day, 12, 31, 1988, 9, 0, 0, 0 );
+
+ status = rtems_clock_set( &time_of_day );
+ directive_failed( status, "rtems_clock_set" );
+
+ time_of_day.year = 1989;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_when(
+ Timer_id[ index ], &time_of_day, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_when: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_WHEN
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_fire_when(
+ Timer_id[ index ], &time_of_day, null_delay, NULL );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_when: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_FIRE_WHEN
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_delete( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_delete: active",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_DELETE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_timer_create( index, &Timer_id[ index ] );
+ directive_failed( status, "rtems_timer_create" );
+
+ status = rtems_timer_fire_after( Timer_id[ index ], 500, null_delay, NULL );
+ directive_failed( status, "rtems_timer_fire_after" );
+
+ status = rtems_timer_cancel( Timer_id[ index ] );
+ directive_failed( status, "rtems_timer_cancel" );
+ }
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_timer_delete( Timer_id[ index ] );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_delete: inactive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TIMER_DELETE
+ );
+
+ Timer_initialize();
+ (void) rtems_task_wake_when( &time_of_day );
+}
+
+rtems_task Middle_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_task_wake_when( &time_of_day );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_when",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ CALLING_OVERHEAD_TASK_WAKE_WHEN
+ );
+
+ puts( "*** END OF TEST 23 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm23/tm23.doc b/testsuites/tmtests/tm23/tm23.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm23/tm23.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm24/system.h b/testsuites/tmtests/tm24/system.h
new file mode 100644
index 0000000000..87dab5b295
--- /dev/null
+++ b/testsuites/tmtests/tm24/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm24/task1.c b/testsuites/tmtests/tm24/task1.c
new file mode 100644
index 0000000000..379e5eb54b
--- /dev/null
+++ b/testsuites/tmtests/tm24/task1.c
@@ -0,0 +1,124 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned32 Task_count;
+
+rtems_task Tasks(
+ rtems_task_argument argument
+);
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 24 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 10,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create HIGH" );
+
+ status = rtems_task_start( id, High_task, 0 );
+ directive_failed( status, "rtems_task_create HIGH" );
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'R', 'E', 'S', 'T' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( id, Tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+ rtems_unsigned32 index;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_after: yield -- returns to caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_WAKE_AFTER
+ );
+
+ Task_count = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Tasks(
+ rtems_task_argument argument
+)
+{
+ Task_count++;
+
+ if ( Task_count == 1 )
+ Timer_initialize();
+ else if ( Task_count == OPERATION_COUNT ) {
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_after: yields -- preempts caller",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_TASK_WAKE_AFTER
+ );
+
+ puts( "*** END OF TEST 24 ***" );
+ exit( 0 );
+ }
+ (void) rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+}
diff --git a/testsuites/tmtests/tm24/tm24.doc b/testsuites/tmtests/tm24/tm24.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm24/tm24.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm25/system.h b/testsuites/tmtests/tm25/system.h
new file mode 100644
index 0000000000..b984fea8b9
--- /dev/null
+++ b/testsuites/tmtests/tm25/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm25/task1.c b/testsuites/tmtests/tm25/task1.c
new file mode 100644
index 0000000000..888946b04f
--- /dev/null
+++ b/testsuites/tmtests/tm25/task1.c
@@ -0,0 +1,109 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Semaphore_id;
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id task_id;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 25 ***" );
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'M', '1', ' ') ,
+ 0,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create of SM1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOW" );
+
+ status = rtems_task_start( task_id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( task_id, High_tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_tasks(
+ rtems_task_argument argument
+)
+{
+ (void) rtems_semaphore_obtain(
+ Semaphore_id,
+ RTEMS_DEFAULT_OPTIONS,
+ 0xffffffff
+ );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ Timer_initialize();
+ (void) rtems_clock_tick();
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_tick",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_CLOCK_TICK
+ );
+
+ puts( "*** END OF TEST 25 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm25/tm25.doc b/testsuites/tmtests/tm25/tm25.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm25/tm25.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm26/fptest.h b/testsuites/tmtests/tm26/fptest.h
new file mode 100644
index 0000000000..daeab550ce
--- /dev/null
+++ b/testsuites/tmtests/tm26/fptest.h
@@ -0,0 +1,165 @@
+/* fptest.h
+ *
+ * This include file contains the CPU dependent implementation
+ * of the following routines needed to test RTEMS floating
+ * point support:
+ * FP_load( &context )
+ * FP_check( &context )
+ *
+ * FP_load - loads the specified floating point context
+ * FP_check - checks the specified floating point context
+ *
+ * NOTE: These routines are VERY CPU dependent and are thus
+ * located in in the CPU dependent include file
+ * fptest.h. These routines form the core of the
+ * floating point context switch test.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#ifndef __FPTEST_h
+#define __FPTEST_h
+
+#include <stdio.h>
+
+#ifndef CPU_HARDWARE_FP
+#error "This CPU does not have CPU_HARDWARE_FP defined"
+#endif
+
+#if ( CPU_HARDWARE_FP == FALSE )
+
+#define FP_DECLARE
+#define FP_LOAD( _factor )
+#define FP_CHECK( _factor ) 0
+
+#else
+
+#define FP_DECLARE \
+ double fp01 = 1.0; \
+ double fp02 = 2.0; \
+ double fp03 = 3.0; \
+ double fp04 = 4.0; \
+ double fp05 = 5.0; \
+ double fp06 = 6.0; \
+ double fp07 = 7.0; \
+ double fp08 = 8.0; \
+ double fp09 = 9.0; \
+ double fp10 = 10.0; \
+ double fp11 = 11.0; \
+ double fp12 = 12.0; \
+ double fp13 = 13.0; \
+ double fp14 = 14.0; \
+ double fp15 = 15.0; \
+ double fp16 = 16.0; \
+ double fp17 = 17.0; \
+ double fp18 = 18.0; \
+ double fp19 = 19.0; \
+ double fp20 = 20.0; \
+ double fp21 = 21.0; \
+ double fp22 = 22.0; \
+ double fp23 = 23.0; \
+ double fp24 = 24.0; \
+ double fp25 = 25.0; \
+ double fp26 = 26.0; \
+ double fp27 = 27.0; \
+ double fp28 = 28.0; \
+ double fp29 = 29.0; \
+ double fp30 = 30.0; \
+ double fp31 = 31.0; \
+ double fp32 = 32.0
+
+#define FP_LOAD( _factor ) \
+ do { \
+ fp01 += _factor; \
+ fp02 += _factor; \
+ fp03 += _factor; \
+ fp04 += _factor; \
+ fp05 += _factor; \
+ fp06 += _factor; \
+ fp07 += _factor; \
+ fp08 += _factor; \
+ fp09 += _factor; \
+ fp10 += _factor; \
+ fp11 += _factor; \
+ fp12 += _factor; \
+ fp13 += _factor; \
+ fp14 += _factor; \
+ fp15 += _factor; \
+ fp16 += _factor; \
+ fp17 += _factor; \
+ fp18 += _factor; \
+ fp19 += _factor; \
+ fp20 += _factor; \
+ fp21 += _factor; \
+ fp22 += _factor; \
+ fp23 += _factor; \
+ fp24 += _factor; \
+ fp25 += _factor; \
+ fp26 += _factor; \
+ fp27 += _factor; \
+ fp28 += _factor; \
+ fp29 += _factor; \
+ fp30 += _factor; \
+ fp31 += _factor; \
+ fp32 += _factor; \
+ } while (0)
+
+#define EPSILON (0.0005)
+#define FPABS(d) (((d) < 0.0) ? -(d) : (d))
+#define FPNEQ(a,b) (FPABS((a)-(b)) > EPSILON)
+
+#define FP_CHECK_ONE( _v, _base, _factor ) \
+ if ( FPNEQ( (_v), ((_base) + (_factor)) ) ) { \
+ printf("%d: " #_v " wrong -- (%g not %g)\n", \
+ task_index, (_v), (_base + _factor)); \
+ }
+
+
+#define FP_CHECK( _factor ) \
+ do { \
+ FP_CHECK_ONE( fp01, 1.0, (_factor) ); \
+ FP_CHECK_ONE( fp02, 2.0, (_factor) ); \
+ FP_CHECK_ONE( fp03, 3.0, (_factor) ); \
+ FP_CHECK_ONE( fp04, 4.0, (_factor) ); \
+ FP_CHECK_ONE( fp05, 5.0, (_factor) ); \
+ FP_CHECK_ONE( fp06, 6.0, (_factor) ); \
+ FP_CHECK_ONE( fp07, 7.0, (_factor) ); \
+ FP_CHECK_ONE( fp08, 8.0, (_factor) ); \
+ FP_CHECK_ONE( fp09, 9.0, (_factor) ); \
+ FP_CHECK_ONE( fp10, 10.0, (_factor) ); \
+ FP_CHECK_ONE( fp11, 11.0, (_factor) ); \
+ FP_CHECK_ONE( fp12, 12.0, (_factor) ); \
+ FP_CHECK_ONE( fp13, 13.0, (_factor) ); \
+ FP_CHECK_ONE( fp14, 14.0, (_factor) ); \
+ FP_CHECK_ONE( fp15, 15.0, (_factor) ); \
+ FP_CHECK_ONE( fp16, 16.0, (_factor) ); \
+ FP_CHECK_ONE( fp17, 17.0, (_factor) ); \
+ FP_CHECK_ONE( fp18, 18.0, (_factor) ); \
+ FP_CHECK_ONE( fp19, 19.0, (_factor) ); \
+ FP_CHECK_ONE( fp20, 20.0, (_factor) ); \
+ FP_CHECK_ONE( fp21, 21.0, (_factor) ); \
+ FP_CHECK_ONE( fp22, 22.0, (_factor) ); \
+ FP_CHECK_ONE( fp23, 23.0, (_factor) ); \
+ FP_CHECK_ONE( fp24, 24.0, (_factor) ); \
+ FP_CHECK_ONE( fp25, 25.0, (_factor) ); \
+ FP_CHECK_ONE( fp26, 26.0, (_factor) ); \
+ FP_CHECK_ONE( fp27, 27.0, (_factor) ); \
+ FP_CHECK_ONE( fp28, 28.0, (_factor) ); \
+ FP_CHECK_ONE( fp29, 29.0, (_factor) ); \
+ FP_CHECK_ONE( fp30, 30.0, (_factor) ); \
+ FP_CHECK_ONE( fp31, 31.0, (_factor) ); \
+ FP_CHECK_ONE( fp32, 32.0, (_factor) ); \
+ } while (0)
+
+#endif
+
+#endif
diff --git a/testsuites/tmtests/tm26/system.h b/testsuites/tmtests/tm26/system.h
new file mode 100644
index 0000000000..b984fea8b9
--- /dev/null
+++ b/testsuites/tmtests/tm26/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_SEMAPHORES 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm26/task1.c b/testsuites/tmtests/tm26/task1.c
new file mode 100644
index 0000000000..804418f9cd
--- /dev/null
+++ b/testsuites/tmtests/tm26/task1.c
@@ -0,0 +1,550 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
+#include <rtems.h>
+#include "system.h"
+#include "fptest.h"
+#include <coverhd.h>
+#include <tmacros.h>
+#include <timesys.h>
+
+
+/* TEST DATA */
+rtems_id Semaphore_id;
+
+Objects_Locations location; /* uses internal RTEMS type */
+
+Thread_Control *Middle_tcb; /* uses internal RTEMS type */
+
+Thread_Control *Low_tcb; /* uses internal RTEMS type */
+
+rtems_task High_task(
+ rtems_task_argument argument
+);
+
+rtems_task Middle_task(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_task Floating_point_task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Floating_point_task_2(
+ rtems_task_argument argument
+);
+
+void complete_test( void );
+
+rtems_task null_task(
+ rtems_task_argument argument
+)
+{
+}
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+ rtems_id task_id;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 26 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'F', 'P', '1', ' ' ),
+ 201,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of FP1" );
+
+ status = rtems_task_start( task_id, Floating_point_task_1, 0 );
+ directive_failed( status, "rtems_task_start of FP1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'F', 'P', '2', ' ' ),
+ 202,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_FLOATING_POINT,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of FP2" );
+
+ status = rtems_task_start( task_id, Floating_point_task_2, 0 );
+ directive_failed( status, "rtems_task_start of FP2" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 200,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of LOW" );
+
+ status = rtems_task_start( task_id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start of LOW" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'M', 'I', 'D', ' ' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of MIDDLE" );
+
+ status = rtems_task_start( task_id, Middle_task, 0 );
+ directive_failed( status, "rtems_task_start of MIDDLE" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'H', 'I', 'G', 'H' ),
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create of HIGH" );
+
+ status = rtems_task_start( task_id, High_task, 0 );
+ directive_failed( status, "rtems_task_start of HIGH" );
+
+ status = rtems_semaphore_create(
+ rtems_build_name( 'S', 'E', 'M', '1' ),
+ OPERATION_COUNT,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &Semaphore_id
+ );
+ directive_failed( status, "rtems_semaphore_create" );
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'N', 'U', 'L', 'L' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( task_id, null_task, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task High_task(
+ rtems_task_argument argument
+)
+{
+ rtems_interrupt_level level;
+
+ Timer_initialize();
+ rtems_interrupt_disable( level );
+ end_time = Read_timer();
+
+ put_time(
+ "_ISR_Disable",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ rtems_interrupt_flash( level );
+ end_time = Read_timer();
+
+ put_time(
+ "_ISR_Flash",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ rtems_interrupt_enable( level );
+ end_time = Read_timer();
+
+ put_time(
+ "_ISR_Enable",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ _Thread_Disable_dispatch();
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Disable_dispatch",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ _Thread_Enable_dispatch();
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Enable_dispatch",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ _Thread_Set_state( _Thread_Executing, STATES_SUSPENDED );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Set_state",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Context_Switch_necessary = TRUE;
+
+ Timer_initialize();
+ _Thread_Dispatch(); /* dispatches Middle_task */
+}
+
+rtems_task Middle_task(
+ rtems_task_argument argument
+)
+{
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Disptach (NO FP)",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Set_state( _Thread_Executing, STATES_SUSPENDED );
+
+ Middle_tcb = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[200].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Switch( &Middle_tcb->Registers, &_Thread_Executing->Registers );
+
+ Timer_initialize();
+ _Context_Switch(&Middle_tcb->Registers, &Low_tcb->Registers);
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ Thread_Control *executing;
+
+ end_time = Read_timer();
+
+ put_time(
+ "context switch: no floating point contexts",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ executing = _Thread_Executing;
+
+ Low_tcb = executing;
+
+ Timer_initialize();
+ _Context_Switch( &executing->Registers, &executing->Registers );
+
+ end_time = Read_timer();
+
+ put_time(
+ "context switch: self",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Context_Switch(&executing->Registers, &Middle_tcb->Registers);
+
+ end_time = Read_timer();
+
+ put_time(
+ "context switch: to another task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[201].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+}
+
+rtems_task Floating_point_task_1(
+ rtems_task_argument argument
+)
+{
+ Thread_Control *executing;
+ FP_DECLARE;
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: restore 1st FP task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ executing = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[202].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Save_fp( &executing->fp_context );
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+ /* switch to Floating_point_task_2 */
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: save idle, restore initialized",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ FP_LOAD( 1.0 );
+
+ executing = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[202].first;
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Save_fp( &executing->fp_context );
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+ /* switch to Floating_point_task_2 */
+}
+
+rtems_task Floating_point_task_2(
+ rtems_task_argument argument
+)
+{
+ Thread_Control *executing;
+ FP_DECLARE;
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: save idle, restore idle",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ executing = _Thread_Executing;
+
+ _Thread_Executing =
+ (Thread_Control *) _Thread_Ready_chain[201].first;
+
+ FP_LOAD( 1.0 );
+
+ /* do not force context switch */
+
+ _Context_Switch_necessary = FALSE;
+
+ _Thread_Disable_dispatch();
+
+ Timer_initialize();
+ _Context_Save_fp( &executing->fp_context );
+ _Context_Restore_fp( &_Thread_Executing->fp_context );
+ _Context_Switch( &executing->Registers, &_Thread_Executing->Registers );
+ /* switch to Floating_point_task_1 */
+
+ end_time = Read_timer();
+
+ put_time(
+ "fp context switch: save initialized, restore initialized",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ complete_test();
+}
+
+void complete_test( void )
+{
+ rtems_unsigned32 index;
+ rtems_id task_id;
+
+ Timer_initialize();
+ _Thread_Resume( Middle_tcb );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Resume",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Set_state( Middle_tcb, STATES_WAITING_FOR_MESSAGE );
+
+ Timer_initialize();
+ _Thread_Unblock( Middle_tcb );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Unblock",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ _Thread_Set_state( Middle_tcb, STATES_WAITING_FOR_MESSAGE );
+
+ Timer_initialize();
+ _Thread_Ready( Middle_tcb );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Ready",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ task_id = Middle_tcb->Object.id;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) _Thread_Get( task_id, &location );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Get",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) _Semaphore_Get( Semaphore_id, &location );
+ end_time = Read_timer();
+
+ put_time(
+ "_Semaphore_Get",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) _Thread_Get( 0x3, &location );
+ end_time = Read_timer();
+
+ put_time(
+ "_Thread_Get: invalid id",
+ end_time,
+ OPERATION_COUNT,
+ 0,
+ 0
+ );
+
+ puts( "*** END OF TEST 26 ***" );
+ exit( 0 );
+}
+
diff --git a/testsuites/tmtests/tm26/tm26.doc b/testsuites/tmtests/tm26/tm26.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm26/tm26.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm27/system.h b/testsuites/tmtests/tm27/system.h
new file mode 100644
index 0000000000..87dab5b295
--- /dev/null
+++ b/testsuites/tmtests/tm27/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm27/task1.c b/testsuites/tmtests/tm27/task1.c
new file mode 100644
index 0000000000..cb1c21da4a
--- /dev/null
+++ b/testsuites/tmtests/tm27/task1.c
@@ -0,0 +1,272 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+/*
+ * WARNING!!!!!!!!!
+ *
+ * THIS TEST USES INTERNAL RTEMS VARIABLES!!!
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+#include <bsp.h>
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Task_2(
+ rtems_task_argument argument
+);
+
+volatile rtems_unsigned32 Interrupt_occurred;
+volatile rtems_unsigned32 Interrupt_enter_time, Interrupt_enter_nested_time;
+volatile rtems_unsigned32 Interrupt_return_time, Interrupt_return_nested_time;
+rtems_unsigned32 Interrupt_nest;
+
+rtems_isr Isr_handler(
+ rtems_vector_number vector
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 27 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '1', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create Task_1" );
+
+ status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
+ directive_failed( status, "rtems_task_start Task_1" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '2', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 2 ]
+ );
+ directive_failed( status, "rtems_task_create of Task_2" );
+
+ status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
+ directive_failed( status, "rtems_task_start of Task_2" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ Install_tm27_vector( Isr_handler );
+
+ /*
+ * No preempt .. no nesting
+ */
+
+ Interrupt_nest = 0;
+
+ _Thread_Dispatch_disable_level = 0;
+
+ Interrupt_occurred = 0;
+ Timer_initialize();
+ Cause_tm27_intr();
+ /* goes to Isr_handler */
+
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ Interrupt_return_time = Read_timer();
+
+ put_time(
+ "interrupt entry overhead: returns to interrupted task",
+ Interrupt_enter_time,
+ 1,
+ 0,
+ 0
+ );
+
+ put_time(
+ "interrupt exit overhead: returns to interrupted task",
+ Interrupt_return_time,
+ 1,
+ 0,
+ 0
+ );
+
+ /*
+ * No preempt .. nested
+ */
+
+ _Thread_Dispatch_disable_level = 1;
+
+ Interrupt_nest = 1;
+
+ Interrupt_occurred = 0;
+ Timer_initialize();
+ Cause_tm27_intr();
+ /* goes to Isr_handler */
+
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ Interrupt_return_time = Read_timer();
+
+ put_time(
+ "interrupt entry overhead: returns to nested interrupt",
+ Interrupt_enter_nested_time,
+ 1,
+ 0,
+ 0
+ );
+
+ put_time(
+ "interrupt exit overhead: returns to nested interrupt",
+ Interrupt_return_nested_time,
+ 1,
+ 0,
+ 0
+ );
+
+ /*
+ * Does a preempt .. not nested
+ */
+
+ _Thread_Dispatch_disable_level = 0;
+
+ _Thread_Heir = (rtems_tcb *) _Thread_Ready_chain[254].last;
+
+ _Context_Switch_necessary = 1;
+
+ Interrupt_occurred = 0;
+ Timer_initialize();
+ Cause_tm27_intr();
+
+ /*
+ * goes to Isr_handler and then returns
+ */
+
+ puts( "*** END OF TEST 27 ***" );
+ exit( 0 );
+}
+
+/*
+ * NOTE: When this task is executing, some of the assumptions made
+ * regarding the placement of the currently executing task's TCB
+ * on the ready chains have been violated. At least the assumption
+ * that this task is at the head of the chain for its priority
+ * has been violated.
+ */
+
+rtems_task Task_2(
+ rtems_task_argument argument
+)
+{
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ end_time = Read_timer();
+
+ put_time(
+ "interrupt entry overhead: returns to preempting task",
+ Interrupt_enter_time,
+ 1,
+ 0,
+ 0
+ );
+
+ put_time(
+ "interrupt exit overhead: returns to preempting task",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ fflush( stdout );
+
+ /*
+ * Switch back to the other task to exit the test.
+ */
+
+ _Thread_Dispatch_disable_level = 0;
+
+ _Thread_Heir = (rtems_tcb *) _Thread_Ready_chain[254].first;
+
+ _Context_Switch_necessary = 1;
+
+ _Thread_Dispatch();
+
+}
+
+/* The Isr_handler() and Isr_handler_inner() routines are structured
+ * so that there will be as little entry overhead as possible included
+ * in the interrupt entry time.
+ */
+
+void Isr_handler_inner( void );
+
+rtems_isr Isr_handler(
+ rtems_vector_number vector
+)
+{
+ end_time = Read_timer();
+
+ Interrupt_occurred = 1;
+ Isr_handler_inner();
+}
+
+void Isr_handler_inner( void )
+{
+
+ /*enable_tracing();*/
+ Clear_tm27_intr();
+ switch ( Interrupt_nest ) {
+ case 0:
+ Interrupt_enter_time = end_time;
+ break;
+ case 1:
+ Interrupt_enter_time = end_time;
+ Interrupt_nest = 2;
+ Interrupt_occurred = 0;
+ Lower_tm27_intr();
+ Timer_initialize();
+ Cause_tm27_intr();
+ /* goes to a nested copy of Isr_handler */
+#if (MUST_WAIT_FOR_INTERRUPT == 1)
+ while ( Interrupt_occurred == 0 );
+#endif
+ Interrupt_return_nested_time = Read_timer();
+ break;
+ case 2:
+ Interrupt_enter_nested_time = end_time;
+ break;
+ }
+
+ Timer_initialize();
+}
diff --git a/testsuites/tmtests/tm27/tm27.doc b/testsuites/tmtests/tm27/tm27.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm27/tm27.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm28/system.h b/testsuites/tmtests/tm28/system.h
new file mode 100644
index 0000000000..ae0265c1eb
--- /dev/null
+++ b/testsuites/tmtests/tm28/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_MAXIMUM_PORTS 1
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm28/task1.c b/testsuites/tmtests/tm28/task1.c
new file mode 100644
index 0000000000..96c8707c76
--- /dev/null
+++ b/testsuites/tmtests/tm28/task1.c
@@ -0,0 +1,134 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_id Port_id;
+
+rtems_unsigned8 Internal_area[ 256 ] CPU_STRUCTURE_ALIGNMENT;
+rtems_unsigned8 External_area[ 256 ] CPU_STRUCTURE_ALIGNMENT;
+
+rtems_task Test_task(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 28 ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'I', 'M', 'E' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &Task_id[ 1 ]
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ status = rtems_task_start( Task_id[ 1 ], Test_task, 0 );
+ directive_failed( status, "rtems_task_start" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Test_task (
+ rtems_task_argument argument
+)
+{
+ rtems_name name;
+ rtems_unsigned32 index;
+ void *converted;
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ name = rtems_build_name( 'P', 'O', 'R', 'T' ),
+
+ Timer_initialize();
+ rtems_port_create(
+ name,
+ Internal_area,
+ External_area,
+ 0xff,
+ &Port_id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PORT_CREATE
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_port_external_to_internal(
+ Port_id,
+ &External_area[ 0xf ],
+ &converted
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_external_to_internal",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PORT_EXTERNAL_TO_INTERNAL
+ );
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_port_internal_to_external(
+ Port_id,
+ &Internal_area[ 0xf ],
+ &converted
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_internal_to_external",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_PORT_INTERNAL_TO_EXTERNAL
+ );
+
+ Timer_initialize();
+ rtems_port_delete( Port_id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_delete",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_PORT_DELETE
+ );
+
+ puts( "*** END OF TEST 28 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm28/tm28.doc b/testsuites/tmtests/tm28/tm28.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm28/tm28.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tm29/system.h b/testsuites/tmtests/tm29/system.h
new file mode 100644
index 0000000000..276d7b92f6
--- /dev/null
+++ b/testsuites/tmtests/tm29/system.h
@@ -0,0 +1,43 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 111
+#define CONFIGURE_MAXIMUM_PERIODS 111
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tm29/task1.c b/testsuites/tmtests/tm29/task1.c
new file mode 100644
index 0000000000..6c54b4a120
--- /dev/null
+++ b/testsuites/tmtests/tm29/task1.c
@@ -0,0 +1,207 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_name Period_name;
+
+rtems_task Tasks(
+ rtems_task_argument argument
+);
+
+rtems_task Low_task(
+ rtems_task_argument argument
+);
+
+rtems_unsigned32 Task_count;
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_unsigned32 index;
+ rtems_status_code status;
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST 29 ***" );
+
+ Period_name = rtems_build_name( 'P', 'R', 'D', ' ' );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_create( Period_name, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_create",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_CREATE
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_period( id, 10 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period: initiate period -- returns to caller",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_period( id, RTEMS_PERIOD_STATUS );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period: obtain status",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_cancel( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_cancel",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL
+ );
+
+ Timer_initialize();
+ (void) rtems_rate_monotonic_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_delete: inactive",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_DELETE
+ );
+
+ status = rtems_rate_monotonic_create( Period_name, &id );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+
+ status = rtems_rate_monotonic_period( id, 10 );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+
+ Timer_initialize();
+ rtems_rate_monotonic_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_delete: active",
+ end_time,
+ 1,
+ 0,
+ CALLING_OVERHEAD_RATE_MONOTONIC_DELETE
+ );
+
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ ) {
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'E', 'S', 'T' ),
+ 128,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOOP" );
+
+ status = rtems_task_start( id, Tasks, 0 );
+ directive_failed( status, "rtems_task_start LOOP" );
+ }
+
+ status = rtems_task_create(
+ rtems_build_name( 'L', 'O', 'W', ' ' ),
+ 200,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create LOW" );
+
+ status = rtems_task_start( id, Low_task, 0 );
+ directive_failed( status, "rtems_task_start LOW" );
+
+ Task_count = 0;
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Tasks(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ status = rtems_rate_monotonic_create( 1, &id );
+ directive_failed( status, "rtems_rate_monotonic_create" );
+
+ status = rtems_rate_monotonic_period( id, 100 );
+ directive_failed( status, "rtems_rate_monotonic_period" );
+
+ /*
+ * Give up the processor to allow all tasks to actually
+ * create and start their period timer before the benchmark
+ * timer is initialized.
+ */
+
+ (void) rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+
+ Task_count++;
+
+ if ( Task_count == 1 )
+ Timer_initialize();
+
+ (void) rtems_rate_monotonic_period( id, 100 );
+}
+
+rtems_task Low_task(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ end_time = Read_timer();
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) Empty_function();
+ overhead = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period: conclude periods -- caller blocks",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD
+ );
+
+ puts( "*** END OF TEST 29 ***" );
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tm29/tm29.doc b/testsuites/tmtests/tm29/tm29.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tm29/tm29.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/testsuites/tmtests/tmck/system.h b/testsuites/tmtests/tmck/system.h
new file mode 100644
index 0000000000..e5c25a505f
--- /dev/null
+++ b/testsuites/tmtests/tmck/system.h
@@ -0,0 +1,42 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tmck/task1.c b/testsuites/tmtests/tmck/task1.c
new file mode 100644
index 0000000000..2a6f3db9bb
--- /dev/null
+++ b/testsuites/tmtests/tmck/task1.c
@@ -0,0 +1,180 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#define TEST_INIT
+#include "system.h"
+
+#define MAXIMUM_DISTRIBUTION 10000
+
+#undef OPERATION_COUNT
+#define OPERATION_COUNT 100000
+
+int Distribution[ MAXIMUM_DISTRIBUTION + 1 ];
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+void check_read_timer( void );
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_id id;
+ rtems_status_code status;
+
+ /*
+ * Tell the Timer Driver what we are doing
+ */
+
+ Set_find_average_overhead( 1 );
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME CHECKER ***" );
+
+ Task_name[ 1 ] = rtems_build_name( 'T', 'A', '1', ' ' ),
+
+ status = rtems_task_create(
+ 1,
+ 5,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_unsigned32 index;
+
+ check_read_timer();
+rtems_test_pause();
+
+ Timer_initialize();
+ end_time = Read_timer();
+
+ put_time(
+ "NULL timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 1000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (1000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 10000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (10000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 50000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (50000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ Timer_initialize();
+ for ( index = 1 ; index <= 100000 ; index++ )
+ (void) Empty_function();
+ end_time = Read_timer();
+
+ put_time(
+ "LOOP (100000) timer stopped at",
+ end_time,
+ 1,
+ 0,
+ 0
+ );
+
+ puts( "*** END OF TIME CHECKER ***" );
+ exit( 0 );
+}
+
+void check_read_timer()
+{
+ rtems_unsigned32 index;
+ rtems_unsigned32 time;
+
+ for ( index = 1 ; index <= MAXIMUM_DISTRIBUTION ; index++ )
+ Distribution[ index ] = 0;
+
+ for ( index = 1 ; index <= OPERATION_COUNT ; index++ ) {
+ Timer_initialize();
+ end_time = Read_timer();
+ if ( end_time > MAXIMUM_DISTRIBUTION ) {
+ /*
+ * Under UNIX a simple process swap takes longer than we
+ * consider valid for our testing purposes.
+ */
+ printf( "TOO LONG (%d) at index %d!!!\n", end_time, index );
+#if defined(unix) || defined(go32)
+ index--;
+ continue;
+#else
+ exit( 1 );
+#endif
+ }
+ else
+ Distribution[ end_time ]++;
+ }
+
+ printf( "Units may not be in microseconds for this test!!!\n" );
+ time = 0;
+ for ( index = 0 ; index <= MAXIMUM_DISTRIBUTION ; index++ ) {
+ time += (Distribution[ index ] * index);
+ if ( Distribution[ index ] != 0 )
+ printf( "%d %d\n", index, Distribution[ index ] );
+ }
+ printf( "Total time = %d\n", time );
+ printf( "Average time = %d\n", time / OPERATION_COUNT );
+}
diff --git a/testsuites/tmtests/tmck/tmck.doc b/testsuites/tmtests/tmck/tmck.doc
new file mode 100644
index 0000000000..a4fa6eb188
--- /dev/null
+++ b/testsuites/tmtests/tmck/tmck.doc
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
+This file describes the directives timed by this test.
+
+benchmark name: timecheck
+
+This becnchmark is used to calibrate the timer. It is only used to
+when initial timing begins on a particular processor board.
+
diff --git a/testsuites/tmtests/tmoverhd/dumrtems.h b/testsuites/tmtests/tmoverhd/dumrtems.h
new file mode 100644
index 0000000000..db1146e3ae
--- /dev/null
+++ b/testsuites/tmtests/tmoverhd/dumrtems.h
@@ -0,0 +1,255 @@
+/* dumrtems.h
+ *
+ * This include file contains phony macros to map
+ * executive calls to Empty_directive().
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#ifndef __DUMRTEMS_h
+#define __DUMRTEMS_h
+
+/* RTEMS call redefinition macros */
+
+#undef rtems_signal_catch
+#undef rtems_signal_send
+#undef rtems_io_close
+#undef rtems_io_control
+#undef rtems_io_initialize
+#undef rtems_io_open
+#undef rtems_io_read
+#undef rtems_io_write
+#undef rtems_port_internal_to_external
+#undef rtems_port_external_to_internal
+#undef rtems_port_create
+#undef rtems_port_delete
+#undef rtems_port_ident
+#undef rtems_event_receive
+#undef rtems_event_send
+#undef rtems_initialize_executive
+#undef rtems_shutdown_executive
+#undef rtems_interrupt_catch
+#undef rtems_partition_create
+#undef rtems_partition_delete
+#undef rtems_partition_get_buffer
+#undef rtems_partition_ident
+#undef rtems_partition_return_buffer
+#undef rtems_message_queue_broadcast
+#undef rtems_message_queue_create
+#undef rtems_message_queue_delete
+#undef rtems_message_queue_flush
+#undef rtems_message_queue_ident
+#undef rtems_message_queue_receive
+#undef rtems_message_queue_send
+#undef rtems_message_queue_urgent
+#undef rtems_region_create
+#undef rtems_region_delete
+#undef rtems_region_get_segment
+#undef rtems_region_ident
+#undef rtems_region_return_segment
+#undef rtems_semaphore_create
+#undef rtems_semaphore_delete
+#undef rtems_semaphore_ident
+#undef rtems_semaphore_obtain
+#undef rtems_semaphore_release
+#undef rtems_task_create
+#undef rtems_task_delete
+#undef rtems_task_get_note
+#undef rtems_task_ident
+#undef rtems_task_mode
+#undef rtems_task_restart
+#undef rtems_task_resume
+#undef rtems_task_set_note
+#undef rtems_task_set_priority
+#undef rtems_task_start
+#undef rtems_task_suspend
+#undef rtems_clock_get
+#undef rtems_clock_set
+#undef rtems_clock_tick
+#undef rtems_task_wake_after
+#undef rtems_task_wake_when
+#undef rtems_fatal_error_occurred
+#undef rtems_rate_monotonic_create
+#undef rtems_rate_monotonic_ident
+#undef rtems_rate_monotonic_delete
+#undef rtems_rate_monotonic_cancel
+#undef rtems_rate_monotonic_period
+#undef rtems_multiprocessing_announce
+#undef rtems_timer_create
+#undef rtems_timer_ident
+#undef rtems_timer_delete
+#undef rtems_timer_cancel
+#undef rtems_timer_fire_after
+#undef rtems_timer_fire_when
+#undef rtems_timer_reset
+
+#define rtems_signal_catch( asraddr, mode ) \
+ Empty_directive( asraddr, mode )
+#define rtems_signal_send( tid, signal ) \
+ Empty_directive( tid, signal )
+
+#define rtems_io_close( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_control( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_initialize( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_open( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_read( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+#define rtems_io_write( major, minor, argp, rval ) \
+ Empty_directive( major, minor, argp, rval )
+
+#define rtems_port_internal_to_external( dpid, internal, external ) \
+ Empty_directive( dpid, internal, external )
+#define rtems_port_external_to_internal( dpid, external, internal ) \
+ Empty_directive( dpid, external, internal )
+#define rtems_port_create( name, intaddr, extaddr, length, dpid ) \
+ Empty_directive( name, intaddr, extaddr, length, dpid )
+#define rtems_port_delete( dpid ) \
+ Empty_directive( dpid )
+#define rtems_port_ident( name, dpid ) \
+ Empty_directive( name, dpid )
+
+#define rtems_event_receive( eventin, options, timeout, eventout ) \
+ Empty_directive( eventin, options, timeout, eventout )
+#define rtems_event_send( tid, event ) \
+ Empty_directive( tid, event )
+
+#define rtems_initialize_executive( conftbl, cputbl ) \
+ Empty_directive( conftbl, cputbl )
+#define rtems_shutdown_executive( the_error ) \
+ Empty_directive( the_error )
+
+#define rtems_interrupt_catch( israddr, vector, oldisr ) \
+ Empty_directive( israddr, vector, oldisr )
+
+#define rtems_partition_create( name, paddr, length, bsize, attr, ptid ) \
+ Empty_directive( name, paddr, length, bsize, attr, ptid )
+#define rtems_partition_delete( ptid ) \
+ Empty_directive( ptid )
+#define rtems_partition_get_buffer( ptid, bufaddr ) \
+ Empty_directive( ptid, bufaddr )
+#define rtems_partition_ident( name, node, ptid ) \
+ Empty_directive( name, node, ptid )
+#define rtems_partition_return_buffer( ptid, bufaddr ) \
+ Empty_directive( ptid, bufaddr )
+
+#define rtems_message_queue_broadcast( qid, buffer, count ) \
+ Empty_directive( qid, buffer, count )
+#define rtems_message_queue_create( name, count, attr, qid ) \
+ Empty_directive( name, count, attr, qid )
+#define rtems_message_queue_delete( qid ) \
+ Empty_directive( qid )
+#define rtems_message_queue_flush( qid, count ) \
+ Empty_directive( qid, count )
+#define rtems_message_queue_ident( name, node, qid ) \
+ Empty_directive( name, node, qid )
+#define rtems_message_queue_receive( qid, buffer, options, timeout ) \
+ Empty_directive( qid, buffer, options, timeout )
+#define rtems_message_queue_send( qid, buffer ) \
+ Empty_directive( qid, buffer )
+#define rtems_message_queue_urgent( qid, buffer ) \
+ Empty_directive( qid, buffer )
+
+#define rtems_region_create( name, paddr, length, pagesize, attr, rnid ) \
+ Empty_directive( name, paddr, length, pagesize, attr, rnid )
+#define rtems_region_delete( rnid ) \
+ Empty_directive( rnid )
+#define rtems_region_get_segment( rnid, size, options, timeout, segaddr ) \
+ Empty_directive( rnid, size, options, timeout, segaddr )
+#define rtems_region_ident( name, rnid ) \
+ Empty_directive( name, rnid )
+#define rtems_region_return_segment( rnid, segaddr ) \
+ Empty_directive( rnid, segaddr )
+
+#define rtems_semaphore_create( name, count, attr, priceil, smid ) \
+ Empty_directive( name, count, attr, priceil, smid )
+#define rtems_semaphore_delete( smid ) \
+ Empty_directive( smid )
+#define rtems_semaphore_ident( name, node, smid ) \
+ Empty_directive( name, node, smid )
+#define rtems_semaphore_obtain( smid, options, timeout ) \
+ Empty_directive( smid, options, timeout )
+#define rtems_semaphore_release( smid ) \
+ Empty_directive( smid )
+
+#define rtems_task_create( name, priority, stack_size, mode, attr, tid ) \
+ Empty_directive( name, priority, stack_size, mode, attr, tid )
+#define rtems_task_delete( tid ) \
+ Empty_directive( tid )
+#define rtems_task_get_note( tid, notepad, note ) \
+ Empty_directive( tid, notepad, note )
+#define rtems_task_ident( name, node, tid ) \
+ Empty_directive( name, node, tid )
+#define rtems_task_mode( mode, mask, pmode ) \
+ Empty_directive( mode, mask, pmode )
+#define rtems_task_restart( tid, arg ) \
+ Empty_directive( tid, arg )
+#define rtems_task_resume( tid ) \
+ Empty_directive( tid )
+#define rtems_task_set_note( tid, notepad, note ) \
+ Empty_directive( tid, notepad, note )
+#define rtems_task_set_priority( tid, priority, ppriority ) \
+ Empty_directive( tid, priority, ppriority )
+#define rtems_task_start( tid, saddr, arg ) \
+ Empty_directive( tid, saddr, arg )
+#define rtems_task_suspend( tid ) \
+ Empty_directive( tid )
+
+#define rtems_clock_get( options, time ) \
+ Empty_directive( options, time )
+#define rtems_clock_set( time ) \
+ Empty_directive( time )
+#define rtems_clock_tick() \
+ Empty_directive()
+#define rtems_task_wake_after( ticks ) \
+ Empty_directive( ticks )
+#define rtems_task_wake_when( time ) \
+ Empty_directive( time )
+
+#define rtems_fatal_error_occurred( errcode ) \
+ Empty_directive( errcode )
+
+#define rtems_rate_monotonic_create( name, id ) \
+ Empty_directive( name, id )
+#define rtems_rate_monotonic_ident( name, id ) \
+ Empty_directive( name, id )
+#define rtems_rate_monotonic_delete( id ) \
+ Empty_directive( id )
+#define rtems_rate_monotonic_cancel( id ) \
+ Empty_directive( id )
+#define rtems_rate_monotonic_period( id, period ) \
+ Empty_directive( id, period )
+
+#define rtems_multiprocessing_announce() \
+ Empty_directive()
+
+#define rtems_timer_create( name, tmid ) \
+ Empty_directive( name, tmid )
+#define rtems_timer_delete( tmid ) \
+ Empty_directive( tmid )
+#define rtems_timer_cancel( tmid ) \
+ Empty_directive( tmid )
+#define rtems_timer_ident( name, tmid ) \
+ Empty_directive( name, tmid )
+#define rtems_timer_fire_after( tmid, ticks, routine, user_data ) \
+ Empty_directive( tmid, ticks, routine, user_data )
+#define rtems_timer_fire_when( tmid, time, routine, user_data ) \
+ Empty_directive( tmid, time, routine, user_data )
+#define rtems_timer_reset( tmid ) \
+ Empty_directive( tmid )
+
+rtems_status_code Empty_directive();
+
+#endif
+/* end of include file */
diff --git a/testsuites/tmtests/tmoverhd/empty.c b/testsuites/tmtests/tmoverhd/empty.c
new file mode 100644
index 0000000000..8450272b3a
--- /dev/null
+++ b/testsuites/tmtests/tmoverhd/empty.c
@@ -0,0 +1,41 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include "system.h"
+
+rtems_timer_service_routine Timer_handler(
+ rtems_id argument
+)
+{
+}
+
+rtems_asr Isr_handler(
+ rtems_signal_set signals
+)
+{
+}
+
+rtems_asr Asr_handler(
+ rtems_signal_set signals
+)
+{
+}
+
+rtems_task task_func() {}
+
+void null_func() {}
+
+rtems_status_code Empty_directive()
+{
+ return( RTEMS_SUCCESSFUL );
+}
diff --git a/testsuites/tmtests/tmoverhd/system.h b/testsuites/tmtests/tmoverhd/system.h
new file mode 100644
index 0000000000..4e12e00e24
--- /dev/null
+++ b/testsuites/tmtests/tmoverhd/system.h
@@ -0,0 +1,60 @@
+/* system.h
+ *
+ * This include file is used by all tests in the Time Suite.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+
+#include <coverhd.h>
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+rtems_timer_service_routine Timer_handler(
+ rtems_id argument
+);
+
+rtems_asr Isr_handler(
+ rtems_signal_set signals
+);
+
+rtems_asr Asr_handler(
+ rtems_signal_set signals
+);
+
+rtems_task task_func();
+
+void null_func();
+
+rtems_status_code Empty_directive();
+
+#include <timesys.h>
+
+/* configuration information */
+
+#define CONFIGURE_TMTEST
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_TIMER_DRIVER
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_TICKS_PER_TIMESLICE 0
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <confdefs.h>
+
+/* end of include file */
diff --git a/testsuites/tmtests/tmoverhd/testtask.c b/testsuites/tmtests/tmoverhd/testtask.c
new file mode 100644
index 0000000000..bc1d64279c
--- /dev/null
+++ b/testsuites/tmtests/tmoverhd/testtask.c
@@ -0,0 +1,1279 @@
+/*
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ * Copyright assigned to U.S. Government, 1994.
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#define TEST_INIT
+#include "system.h"
+
+rtems_unsigned8 Memory_area[ 2048 ];
+rtems_unsigned8 Internal_port_area[ 256 ];
+rtems_unsigned8 External_port_area[ 256 ];
+
+rtems_task Task_1(
+ rtems_task_argument argument
+);
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{ rtems_id id;
+ rtems_status_code status;
+
+ Set_find_average_overhead( TRUE );
+
+ Print_Warning();
+
+ puts( "\n\n*** TIME TEST OVERHEAD ***" );
+
+ status = rtems_task_create(
+ rtems_build_name( 'T', 'A', '1', ' ' ),
+ 254,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ directive_failed( status, "rtems_task_create of TA1" );
+
+ status = rtems_task_start( id, Task_1, 0 );
+ directive_failed( status, "rtems_task_start of TA1" );
+
+ status = rtems_task_delete( RTEMS_SELF );
+ directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
+}
+
+/* comment out the following include to verify type are correct */
+#include "dumrtems.h"
+
+rtems_task Task_1(
+ rtems_task_argument argument
+)
+{
+ rtems_name name;
+ rtems_unsigned32 index;
+ rtems_cpu_table cpu_table;
+ rtems_id id;
+ rtems_task_priority in_priority;
+ rtems_task_priority out_priority;
+ rtems_mode in_mode;
+ rtems_mode mask;
+ rtems_mode out_mode;
+ rtems_unsigned32 note;
+ rtems_time_of_day time;
+ rtems_interval timeout;
+ rtems_signal_set signals;
+ void *address_1;
+ rtems_event_set events;
+ long buffer[ 4 ];
+ rtems_unsigned32 count;
+ rtems_device_major_number major;
+ rtems_device_minor_number minor;
+ rtems_unsigned32 io_result;
+ rtems_unsigned32 error;
+ rtems_clock_get_options options;
+
+ name = rtems_build_name( 'N', 'A', 'M', 'E' );
+ in_priority = 250;
+ in_mode = RTEMS_NO_PREEMPT;
+ mask = RTEMS_PREEMPT_MASK;
+ note = 8;
+ timeout = 100;
+ signals = RTEMS_SIGNAL_1 | RTEMS_SIGNAL_3;
+ major = 10;
+ minor = 0;
+ error = 100;
+ options = 0;
+
+/* rtems_initialize_executive */
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_initialize_executive( &BSP_Configuration, &cpu_table );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_initialize_executive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_shutdown_executive */
+
+ Timer_initialize();
+ for ( index=1 ; index <= OPERATION_COUNT ; index++ )
+ (void) rtems_shutdown_executive( error );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_shutdown_executive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_create(
+ name,
+ in_priority,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_ident( name, RTEMS_SEARCH_ALL_NODES, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_start */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_start( id, Task_1, 0 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_start",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_restart */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_restart( id, 0 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_restart",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_suspend */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_suspend( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_suspend",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_resume */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_resume( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_resume",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_set_priority */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_set_priority( id, in_priority, &out_priority );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_priority",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_mode */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_mode( in_mode, mask, &out_mode );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_mode",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_get_note */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_get_note( id, 1, note );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_get_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_set_note */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_set_note( id, 1, note );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_set_note",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_wake_when */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_wake_when( time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_when",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_task_wake_after */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_task_wake_after( timeout );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_task_wake_after",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_interrupt_catch */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_interrupt_catch( Isr_handler, 5, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_interrupt_catch",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_clock_get */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_clock_get( options, time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_get",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_clock_set */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_clock_set( time );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_set",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_clock_tick */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_clock_tick();
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_clock_tick",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+rtems_test_pause();
+
+/* rtems_timer_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_create( name, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_fire_after */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_fire_after(
+ id,
+ timeout,
+ Timer_handler,
+ NULL
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_after",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_fire_when */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_fire_when(
+ id,
+ time,
+ Timer_handler,
+ NULL
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_fire_when",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_reset */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_reset( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_reset",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_timer_cancel */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_timer_cancel( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_timer_cancel",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_create(
+ name,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ RTEMS_NO_PRIORITY,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_ident( name, RTEMS_SEARCH_ALL_NODES, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_obtain */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_obtain( id, RTEMS_DEFAULT_OPTIONS, timeout );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_obtain",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_semaphore_release */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_semaphore_release( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_semaphore_release",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_create(
+ name,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_ident(
+ name,
+ RTEMS_SEARCH_ALL_NODES,
+ id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_send */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_send( id, (long (*)[4])buffer );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_send",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_urgent */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_urgent( id, (long (*)[4])buffer );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_urgent",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_broadcast */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_broadcast(
+ id,
+ (long (*)[4])buffer,
+ &count
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_broadcast",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_receive */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_receive(
+ id,
+ (long (*)[4])buffer,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_receive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_message_queue_flush */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_message_queue_flush( id, &count );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_message_queue_flush",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+rtems_test_pause();
+
+/* rtems_event_send */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_event_send( id, events );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_send",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_event_receive */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_event_receive(
+ RTEMS_EVENT_16,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout,
+ &events
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_event_receive",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_signal_catch */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_signal_catch( Asr_handler, RTEMS_DEFAULT_MODES );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_catch",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_signal_send */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_signal_send( id, signals );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_signal_send",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_create(
+ name,
+ Memory_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_ident( name, RTEMS_SEARCH_ALL_NODES, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_get_buffer */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_get_buffer( id, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_get_buffer",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_partition_return_buffer */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_partition_return_buffer( id, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_partition_return_buffer",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_create(
+ name,
+ Memory_area,
+ 2048,
+ 128,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_get_segment */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_get_segment(
+ id,
+ 243,
+ RTEMS_DEFAULT_OPTIONS,
+ timeout,
+ &address_1
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_get_segment",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_region_return_segment */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_region_return_segment( id, address_1 );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_region_return_segment",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_create(
+ name,
+ Internal_port_area,
+ External_port_area,
+ 0xff,
+ &id
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_external_to_internal */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_external_to_internal(
+ id,
+ &External_port_area[ 7 ],
+ address_1
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_external_to_internal",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_port_internal_to_external */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_port_internal_to_external(
+ id,
+ &Internal_port_area[ 7 ],
+ address_1
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_port_internal_to_external",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+rtems_test_pause();
+
+/* rtems_io_initialize */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_initialize(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_initialize",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_open */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_open(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_open",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_close */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_close(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_close",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_read */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_read(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_read",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_write */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_write(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_write",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_io_control */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_io_control(
+ major,
+ minor,
+ address_1,
+ &io_result
+ );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_io_control",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_fatal_error_occurred */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_fatal_error_occurred( error );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_fatal_error_occurred",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_create */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_create( name, &id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_create",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_ident */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_ident( name, id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_ident",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_delete */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_delete( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_delete",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_cancel */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_cancel( id );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_cancel",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_rate_monotonic_period */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_rate_monotonic_period( id, timeout );
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_rate_monotonic_period",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+/* rtems_multiprocessing_announce */
+
+ Timer_initialize();
+ for ( index = 1 ; index <= OPERATION_COUNT ; index ++ )
+ (void) rtems_multiprocessing_announce();
+ end_time = Read_timer();
+
+ put_time(
+ "rtems_multiprocessing_announce",
+ end_time,
+ OPERATION_COUNT,
+ overhead,
+ 0
+ );
+
+ puts( "*** END OF TIME OVERHEAD ***" );
+
+ exit( 0 );
+}
diff --git a/testsuites/tmtests/tmoverhd/tmoverhd.doc b/testsuites/tmtests/tmoverhd/tmoverhd.doc
new file mode 100644
index 0000000000..2346fb9b52
--- /dev/null
+++ b/testsuites/tmtests/tmoverhd/tmoverhd.doc
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+# COPYRIGHT (c) 1989-1997.
+# On-Line Applications Research Corporation (OAR).
+# Copyright assigned to U.S. Government, 1994.
+#
+# The license and distribution terms for this file may in
+# the file LICENSE in this distribution or at
+# http://www.OARcorp.com/rtems/license.html.
+#
+
+
diff --git a/tools/build/Makefile.in b/tools/build/Makefile.in
new file mode 100644
index 0000000000..4170426842
--- /dev/null
+++ b/tools/build/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/directory.cfg
+
+SUB_DIRS=os scripts src
diff --git a/tools/build/README b/tools/build/README
new file mode 100644
index 0000000000..0436fc958d
--- /dev/null
+++ b/tools/build/README
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+Misc. support tools for RTEMS workspaces.
+More will be added later as they are converted from Teamware
+to CVS.
+
+install-if-change
+ Smart install script that also can append suffixes as it
+ installs (suffixes used for debug and profile variants).
+ Requires bash or ksh.
+
+rcs-clean
+ deletes all files from the current directory that can be
+ re-created from RCS. Careful to not delete locked files.
+ May be used by 'gmake clobber'
+
+lock-directory
+unlock-directory
+ traverse a directory structure making it unwritable.
+ Useful to keep people from accidentally overwriting
+ "released" trees if they get confused about which
+ module they have loaded.
+
+rtems-glom
+ glom together all the rtems libraries in order to simplify
+ the link line used by applications.
+ Produces rtems.rel.
+ Not used by the RTEMS src tree at all.
+ Strictly optional.
+
diff --git a/tools/build/cklength.c b/tools/build/cklength.c
new file mode 100644
index 0000000000..6059cacb1f
--- /dev/null
+++ b/tools/build/cklength.c
@@ -0,0 +1,364 @@
+/*
+ * cklength - check the length of lines in a file
+ *
+ * This program check to see if the files passed to it on the command line
+ * contain a line which exceeds the maximum allowable length. The default
+ * maximum line length is 80.
+ *
+ * usage: cklength [ -v ] [ arg ... ] files...
+ * -l length -- maximum line length
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "l:nNv"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -l length -- maximum line length\n\
+ -n -- report line numbers for offending lines\n\
+ -N -- report line numbers and length for offending lines\n\
+ -v -- verbose\n\
+\n\
+Print the name of files which have at least 1 line which exceeds the\n\
+maximum line length. The default maximum line length is 80.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 512
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int report_line_numbers = FALSE; /* report line numbers of offenders */
+int report_line_length = FALSE; /* report line length of offenders */
+
+int line_length = 80; /* maximum allowable line length */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 'l': /* line length */
+ line_length = atoi( optarg );
+ if ( line_length < 0 || line_length > BUFFER_SIZE )
+ error(ERR_FATAL, "(%d) is illegal line length\n",line_length);
+ break;
+
+ case 'n': /* toggle report_line_numbers */
+ report_line_numbers = ! report_line_numbers;
+ break;
+
+ case 'N': /* toggle both reports */
+ report_line_numbers = ! report_line_numbers;
+ report_line_length = ! report_line_length;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int line_number;
+ int length;
+ int count;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ count = 0;
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( length <= line_length )
+ continue;
+
+ if ( count == 0 ) {
+ fprintf( stderr, "%s\n", arg );
+ if ( !report_line_numbers )
+ break;
+ }
+
+ if ( verbose )
+ fprintf( stderr, "TOO LONG:%d: %s\n", line_number, buffer );
+
+ if ( report_line_numbers ) {
+ if ( report_line_length )
+ fprintf( stderr, "%d: %d\n" , line_number, length );
+ else
+ fprintf( stderr, "%d\n" , line_number );
+ }
+
+ count++;
+
+ }
+
+ fclose( in );
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/tools/build/eolstrip.c b/tools/build/eolstrip.c
new file mode 100644
index 0000000000..b4e0d5d165
--- /dev/null
+++ b/tools/build/eolstrip.c
@@ -0,0 +1,351 @@
+/*
+ * eolstrip - strip white space from end of lines
+ *
+ * This program strips the white space from the end of every line in the
+ * specified program.
+ *
+ * usage: eolstrip [ -v ] [ arg ... ] files...
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "vt"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -v -- verbose\n\
+ -t -- test only .. DO NOT OVERWRITE FILE!!!\n\
+\n\
+Strip the white space from the end of every line on the list of files.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 2048
+#define MAX_PATH 2048
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int test_only = FALSE; /* test only */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 't': /* toggle test only mode */
+ test_only = ! test_only;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ FILE *out = (FILE *) 0;
+ char outname[ MAX_PATH ];
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int length;
+ int line_number;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ if ( !test_only ) {
+ sprintf( outname, "%s.eoltmp", arg );
+
+ out = fopen( outname, "w" );
+ if (!out)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+ }
+
+ if ( verbose )
+ fprintf( stderr, "Processing %s\n", arg );
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( buffer[ length ] != '\n' )
+ error(ERR_ERRNO|ERR_FATAL, "Line %d too long in %s\n", line_number, arg);
+
+ while ( isspace( buffer[ length ] ) )
+ buffer[ length-- ] = '\0';
+
+ if ( test_only ) {
+ fprintf( stderr, "%s\n", arg );
+ break;
+ }
+
+ fprintf( out, "%s\n", buffer );
+ }
+
+ fclose( in );
+ if ( !test_only ) {
+ fclose( out );
+ rename( outname, arg );
+ }
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/tools/build/os/Makefile.in b/tools/build/os/Makefile.in
new file mode 100644
index 0000000000..26c85624db
--- /dev/null
+++ b/tools/build/os/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/directory.cfg
+
+SUB_DIRS=$(wildcard $(RTEMS_HOST))
diff --git a/tools/build/os/msdos/Makefile.in b/tools/build/os/msdos/Makefile.in
new file mode 100644
index 0000000000..5cf6608120
--- /dev/null
+++ b/tools/build/os/msdos/Makefile.in
@@ -0,0 +1,39 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/build-tools
+
+INSTALLED=$(DESTDIR)/ifc.exe \
+ $(DESTDIR)/cklength.exe \
+ $(DESTDIR)/fixtimer.exe
+
+all: $(DESTDIR) $(PGMS) install
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the programs
+$(DESTDIR)/ifc.exe: ifc_exe.uue
+ uudecode <ifc_exe.uue
+ mv ifc.exe $(DESTDIR)/ifc.exe
+
+$(DESTDIR)/cklength.exe: cklength.uue
+ uudecode <cklength.uue
+ mv cklength.exe $(DESTDIR)/cklength.exe
+
+$(DESTDIR)/fixtimer.exe: fixtimer.uue
+ uudecode <fixtimer.uue
+ mv fixtimer.exe $(DESTDIR)/fixtimer.exe
+
diff --git a/tools/build/os/msdos/README b/tools/build/os/msdos/README
new file mode 100644
index 0000000000..af3b0dfb31
--- /dev/null
+++ b/tools/build/os/msdos/README
@@ -0,0 +1,12 @@
+#
+# $Id$
+#
+
+ifc is an MS-DOS executable which is equivalent to the program
+install-if-change. It was compiled using Borland C 2.00.
+
+cklength is a precompiled version of the program cklength.c from
+the main source tree.
+
+fixtimer is a program to restore the clock if the program does not
+exit cleanly.
diff --git a/tools/build/os/msdos/cklength.uue b/tools/build/os/msdos/cklength.uue
new file mode 100644
index 0000000000..fd8052cd9a
--- /dev/null
+++ b/tools/build/os/msdos/cklength.uue
@@ -0,0 +1,286 @@
+#
+# $Id$
+#
+begin 664 cklength
+M?T5,1@$" 0 " ( ! $,% #0 "T8 T "
+M!0 H !H %P 8 T $ - "@ H 4 P
+M -0 !$ ! ! ! 7
+M2P %TL % $ $ !=, (73 &\ %? < 0
+M @ %U A=0 (@ !P O=7-R+VQI8B]L9"YS
+M;RXQ $, !6 20 #P
+M #@ $4 /0 !P !# &@
+M A 30 #\ *0 $X !" D
+M $@ W $8 )@ "
+M ! %( 4P Z *@ 00
+M $H 'P $L !5 3P L .P %0 H
+M-@ #$ P 40
+M
+M
+M G
+M '0 C ; N
+M "( -0 E #D R - !X
+M "T ,P !$ *P
+M ^ "\ 3 % !'
+M 0#4 , $ $ Z # "
+M ! U0 P P 0BT , 0 $*W #
+M % !"S P !@ 0P4 , < $32
+M # ( !$^ P "0 1/L , H $3
+M] # + !% P # A=, , T
+M (74 # . "%]@ P #P ACP , !
+M (9" # 1 P $@ ,
+M !, # 4 P %0
+M , !8 # 7 P &
+M , !D ! (8. 2 " !$_0 $0 "P !8
+M 0P4 =!( < = (8U 2 (@ "&$0 $@
+M "< 1/L !$ H U (8O 2 / "&0@ $$0
+M$0 $4 AB8 !( !. (9# 01 1 5P "',@
+M$0#_\0 %P 1+ 2!( < !B $2> $@2 ' 9P !$8@
+M "H$@ !P &\ AD8 !0"$ !$ !T (73 1 /_Q B@ "
+M&*0 $@ ) A@( !( "7 (8% 2
+MG !$T@ $@ " *( ACT !!$ ! "J (9$ 01 1
+M M "&E@ )@$0 $0 , AB !( #' (8\ 01
+M 0 S0 "%U $0#_\0 -8 0[H !0!( < #> (9&
+M 4 1 1 Y "&E@ )@$0 $0 /$ AC@ !( #W (8
+M+ 2 _P "&" $@ 04 AD, !"$ !$ $-
+M (<N 01 1 !$P "&+ $@ 1H 1 H !8!( <
+M $@ (8_ 01 0 !,P "'+P $$0 $0 3H AC( !(
+M $_ (<P 01 1 !1@ "&&@ $@ 4P AS$
+M!!$ !$ %3 (8^ 01 0 !9P "&0@ $0#_\0 6X A?8
+M !$ __$ &( (87 2 !C@ "&1 $$0 $0 9<
+M 1,( /!( < &I $3\ 1 * !M@ !%TL $0#_\0
+M ;T 10 !!$ P '* $2, $@2 ' !SP "&(P $@
+M =8 0R( !( < 'H $3^ 1 + !]0 !#10 '4
+M$@ !P ?H AD !!$ ! (& (8= 2 "#0 !$^
+M $@ "0 A, AA0 !( 9V5T;W!T %]?1%1/4E],25-47U\
+M7W-T87)T ')E860 871O:0!?7T-43U)?3$E35%]? '-T<G1O; !P<F]G;F%M
+M90!V9G!R:6YT9@!?96YV:7)O;@!?96YD %=R:71E %)E860 9V5T<&%R;0!?
+M:6]B %]'3$]"04Q?3T9&4T547U1!0DQ%7P!A8F]R= !A=&5X:70 97AI= !?
+M:6YI= !V97)B;W-E %]S>7-?;F5R<@!S>7-?97)R;&ES= !F8VQO<V4 55-!
+M1T4 7T193D%-24, <')O8V5S<P!?7VEO8@!?<WES7V5R<FQI<W0 =W)I=&4
+M<W1R<F-H<@!?97AI= !E;G9I<F]N &5R<FYO '-T<F-H<@!E<G)O<@!R97!O
+M<G1?;&EN95]L96YG=&@ ;W!T:6YD &]P96X ;W!T87)G &9G971S &]P=&5R
+M<@!R97!O<G1?;&EN95]N=6UB97)S %]E9&%T80!?4%)/0T5$55)%7TQ)3DM!
+M1T5?5$%"3$5? &9O<&5N '-Y<U]N97)R %]?9&]?9VQO8F%L7V1T;W)S %]?
+M0U1/4E]%3D1?7P!?971E>'0 7VQI8E]V97)S:6]N $]P96X 9F9L=7-H %]?
+M9&]?9VQO8F%L7V-T;W)S %]?1%1/4E]%3D1?7P!M86EN &QI;F5?;&5N9W1H
+M '-T<FQE;@!?9FEN:0!F<')I;G1F &QI8F,N<V\N,0 AD, C$P
+M AS$ !#$P AS !!$P AR\ _$P AD8 U
+M$P " AD0 !($P AI8 P$P A@( K%0 A@4
+M L%0 A@@ Y%0 A@L X%0 A@X :%0
+M AA$ >%0 AA0 !5%0 AA< !'%0 AAH !"%0
+M AAT !3%0 AB Q%0 AB, !.%0 AB8 B
+M%0 ABD J%0 ABP \%0 AB\ @%0 AC(
+M ! %0 AC4 =%0 AC@ W%0 "\$" X .@0*(#H$2<
+M(Z @@) 0* 20$ !0 !"]@$ 1 !$D!(CX$ 0O(! 0 !P $
+M "0$ 0DA $94L( *4 J $E 1 "A< (:6$N$,U"+ $ "D! 0 !"
+MYP$ ! $+H 0 ('#X @! $0 1-0"(^R HK__$H #9(2(^S0 F $
+M@*(@ * F4$" E@)@!)(0( "2 F $T ) "X"B( 2O__]E *@ 9*2@ "
+M@ ,$0 1!$ $2B$B/LH2I@ M $ !&?P@ 0 *"$/_PRO__]T 0 $1$
+M $1 $+!D!(C"(''X B!Z G>._F*@0 !BB$" L! @ - &0 ! $+!DA @
+M+Q, (: HB $H !- B80@0@ $T 9 - "80B0 B !T")A"!$ (;0 B$(
+MT"9 !$ (? (B#$(0 AB< (8E "&%0 19 0 !22$ 90 !"KI02H:"
+MHC__ H ,X"B(&PB@ 1$0 AQ2 F HB!N@*(@/P* "J HB!. H '- $
+M(/@0O__P%0 10* !. HB!V H 'M $H/00O__J%0 14 0IO0 B# E!
+M"!$ (: HJ( "+__XM0B(0 3 !%$0@ $ (N2$F&H$+__W14 $70!"#X
+M@* ")!@/_\0O__7T"0@^("@ B08#__T"0@^- $X/R H (D& __Q"__\_0
+M).#\@* ")!@/_\0O__+T"2@]!"__\FB$" !@*1@ "* L1 "'%0 AA$
+M (:0$B$X$P 19(28<A $)VU *@\$ 0F60$" !DA "- "(+R1*B "T 9
+M"("B( "@ 1(0 A] "8+R1*B "0 #] &0 B HC__(H K 0/__0!""\
+MD (@ = D(+R1*B "T 9 "("B( 2O__SDA $(''X B!Z G>.]F) 0 !@3
+M !%0 !"6I(28="JD@ $H !Z80( 1& $P 19(28=A !%E! &* 0
+M( &H![WX)0 ABT (:0$ 4DA B $ 0DV4$ 5@*(@ * #4! 0 !"
+M2Y 0 !2B C__$0 AM "(0" I$ (!( *X"DX 2@ +$0 AA, $60%*$X
+MDA)A^$ 0C64$ 8T 6@^("B( "@ B$0 AM "(/2 HB H !Q, $60
+M%*$XDA)B )00 !! $(HE@>]^- %H/B HB H $A$ (;0 B#\@*(@ *
+M D3 !%D!2A.)(28AB4$ 00 !"&Y80 !$0@ (I@3@ 1, $60%*$XDA)B
+M($ 0A24$ 0I@3@ 1"__\B@!" !0 !"&Y 0 !6P$" @<?@"('H "=X[^0
+M\B>@2/0GH$SV)Z!0^">@5/HGH%@1 "&0 !"$I 2(2@1' LBX "!$0 "
+MC@ ( H !*('H$P1 "'\@(@N. 'H$@5 "&-0 AI 6H3@3 !%DA)B*$
+M0?/4 J$(D!:A.)(0 !! $(!E! $8"F8 "@ :$0 A@2 !*0$B$X$0
+MAM "(1" ID (-H #!$ (85 "&E!*B6)<N8 *0%J$X$P 19(28C! $'=
+MU + "A" X1 "&D!(A.!, $62$F(X0 !!UI00 !D0@ '$0 AI 2(3@3
+M !%0 !!T)(28E 1 "&0 !!W) 2(3@1# @(X " * !41" @(X " *
+M R IF H !1$ $41 !%$( Y(2(EB2$B)P?___M) 0( ! $&MD!
+M&9 0( 3 !%?___KI(28GA $'+ 0 (''X B!Z G>._F* 0 !@1 !%
+MD!(BD$ 0<;23 @*(@ !* F0$ 0$0@ !, $62$F*@?___G)00 ! 0
+M@ :L! &9(0( ! $&\E! @ + 0 B I@ 9!H !("F !H$@ 1 0 ("F
+M0!H2@ ($0@ !, $62$F*XE! $'___XF6$ :,( !Q, $62$F+0E!
+M&Y80 !E___^"F! &H''X B!Z G>._F* 0 !B0$ 0DA &4 0:*4$ :
+ML! "("F/_\2@ ($1@ !, $62$F+PE! $)80 !E___]PF! &H''X B!
+MZ G>._F* 0 !B0$ 0DA &4 09.4$ :L! "("F/_\2@ ($1@ !,
+M $62$F,0E! $)80 !E___]>F! &H''X B!Z G>._F* 0 !B0$ 0DA
+M&4 0824$ :L! "("F/_\2@ ($1@ !, $62$F,PE! $)80 !E___],
+MF! &H''X B!Z G>._F!$ $32 B/X@*)@ * F@$B/XT 0 )_" "@
+M!" $T 0 ("B( 2O__[ 0 (''X B!Z G>._F)WCOZ"!Z G>._F!$
+M $34 B/L@**__Q* V2$B/LT )@!("B( "@ )E! @ )8"8 22$" D@)@
+M!- "0 N HB $K___90"H &2DH H #!$ $01 !$HA(C[*$J8 +0! 1
+MG\( $ "@A#_\,K___= $ !$1 !$0 !!$) 2(PB!Q^ (@>@ (''X B!
+MZ G>._H(''X B!Z _____P #_____ ! '5S
+M86=E.B @8VML96YG=&@@(%L@+78@72!;(&%R9R N+BX@72!F:6QE<RXN+B *
+M(" @(" @(" @(" @+6P@;&5N9W1H(" @+2T@;6%X:6UU;2!L:6YE(&QE;F=T
+M: H@(" @(" @(" @(" M;B @(" @(" @(" M+2!R97!O<G0@;&EN92!N=6UB
+M97)S(&9O<B!O9F9E;F1I;F<@;&EN97,*(" @(" @(" @(" @+4X@(" @(" @
+M(" @+2T@<F5P;W)T(&QI;F4@;G5M8F5R<R!A;F0@;&5N9W1H(&9O<B!O9F9E
+M;F1I;F<@;&EN97,*(" @(" @(" @(" @+78@(" @(" @(" @+2T@=F5R8F]S
+M90H*4')I;G0@=&AE(&YA;64@;V8@9FEL97,@=VAI8V@@:&%V92!A="!L96%S
+M=" Q(&QI;F4@=VAI8V@@97AC965D<R!T:&4*;6%X:6UU;2!L:6YE(&QE;F=T
+M:"X@(%1H92!D969A=6QT(&UA>&EM=6T@;&EN92!L96YG=&@@:7,@.# N"@
+M &PZ;DYV *"5D*2!I<R!I;&QE9V%L(&QI;F4@;&5N9W1H"@ E<P
+M '( 56YA8FQE('1O(&]P96X@9FEL92 H)7,I"@ E
+M<PH %1/3R!,3TY'.B5D.B E<PH "5D.B E9 H )60*
+M E<SH@ " H)7,I"@ ("AU;FMN;W=N(&5R<FYO/25D*0H "@
+M !F871A;"!E<G)O<BP@97AI=&EN9P !E>&ET:6YG &9A=&%L(&5R
+M<F]R+"!A8F]R=&EN9P # Q,C,T-38W.#DM G)7,G(&ES(&YO="!A
+M(&YU;6)E<@ E<R!C86X@;VYL>2!B92 E;&0 E<R!M=7-T(&)E
+M(&)E='=E96X@)6QD(&%N9" E;&0 &]P96XH)R5S)RP@,'@E>"P@,"5O*2!F
+M86EL960 <F5A9"@E9"P@,'@E>"P@)60I(&9A:6QE9 !W<FET
+M92@E9"P@,'@E>"P@)60I(&9A:6QE9 (74 $ (; # !$T@
+M - $3X 0 0#H !0 !"+0 * ")0 8 0-4 "P
+M ! 5 , A?8 @ .0 4 !P !< 0LP
+M!P !"MP ( !. D ,
+M # P,+__\P$ #
+M \,+__\ $ # !(,+__[0$ # !4,+__Z@$ # !@,+__YP$
+M # !L,+__Y $ # !X,+__X0$ # "$,+__W@$ # "0,+__
+MVP$ # "<,+__V $ # "H,+__U0$ # "T,+__T@$ # #
+M,+__SP$ # #,,+__S $ # #8,+__R0$ # #D,+__Q@$ #
+M #P,+__PP$ # #\,+__P $ # $(,+__O0$ ! $4"
+M % $
+M 0 __$ $ U # ! ! .@ P @ 0-4
+M , , $(M # $ !"MP P !0
+M 0LP , 8 $,% # ' !$T@ P "
+M 1/@ , D $3[ # * !$_0 P
+M"P 10 , P (73 # - "%U
+M P #@ A?8 , \ (8\ # 0 "&0@
+M P $0 , !( # 3
+M P % , !4 # 6
+M P %P , !@ # 9
+M #P ! #_\0 !8 0 __$ B $
+M /_Q +0 !$U @ " $, 0R( < !2 (8\
+M ! 0 8 ! #_\0 &L 0T4 < !Z
+M $ /_Q A ! #_\0 (\ 1-$ ( < "E
+M $31 ' M "&00 0 $ ,( 0 __$
+M #) (8. 2 T !$_0 $0 "P -X 0P4 =!(
+M < #E (8U 2 Z@ "&$0 $@ .\ 1/L
+M !$ H #] (8O 2 !! "&0@ $$0 $0 0T AB8
+M !( $6 (9# 01 1 !'P "',@ $0#_\0 20
+M 1+ 2!( < $J $2> $@2 ' !+P !$8@ "H$@ !P
+M 3< AD8 !0"$ !$ $\ (73 1 /_Q !4@ "&*0 $@
+M 5@ A@( !( %? (8% 2 !9 !$T@
+M$@ " 6H ACT !!$ ! %R (9$ 01 1 !? "&E@
+M )@$0 $0 8@ AB !( &/ (8\ 01 0 !E0 "
+M%U $0#_\0 9X 0[H !0!( < &F (9& 4 1 1 !
+MK "&E@ )@$0 $0 ;D AC@ !( &_ (8+ 2
+M !QP "&" $@ <T AD, !"$ !$ '5 (<N 01
+M 1 !VP "&+ $@ >( 1 H !8!( < 'H (8_
+M 01 0 !^P "'+P $$0 $0 @( AC( !( (' (<
+MP 01 1 "#@ "&&@ $@ A0 AS$ !!$ !$ (;
+M (8^ 01 0 "+P "&0@ $0#_\0 C8 A?8 !$ __$
+M )0 (87 2 "5@ "&1 $$0 $0 E\ 1,( /!(
+M < )Q $3\ 1 * "?@ !%TL $0#_\0 H4 10
+M!!$ P *2 $2, $@2 ' "EP "&(P $@ IX 0R(
+M !( < *P $3^ 1 + "O0 !#10 '4$@ !P L(
+M AD !!$ ! +. (8= 2 "U0 !$^ $@ "0
+M ML AA0 !( 9V\S,B]C:VQE;F=T: !C<G1I+G, =F%L=65S+5AA
+M+F, 8W)T<W1U9F8N8P!?7V1O7V=L;V)A;%]C=&]R<U]A=7@ 9V-C,E]C;VUP
+M:6QE9"X 9F]R8V5?=&]?9&%T80!C:VQE;F=T:"YC &=C8S)?8V]M<&EL960N
+M &QI8F=C8S(N8P!C<G1S='5F9BYC %]?9&]?9VQO8F%L7V-T;W)S7V%U> !G
+M8V,R7V-O;7!I;&5D+@!F;W)C95]T;U]D871A &-R=&XN<P!G971O<'0 7U]$
+M5$]27TQ)4U1?7P!?<W1A<G0 <F5A9 !A=&]I %]?0U1/4E],25-47U\ <W1R
+M=&]L '!R;V=N86UE '9F<')I;G1F %]E;G9I<F]N %]E;F0 5W)I=&4 4F5A
+M9 !G971P87)M %]I;V( 7T=,3T)!3%]/1D93151?5$%"3$5? &%B;W)T &%T
+M97AI= !E>&ET %]I;FET '9E<F)O<V4 7W-Y<U]N97)R '-Y<U]E<G)L:7-T
+M &9C;&]S90!54T%'10!?1%E.04U)0P!P<F]C97-S %]?:6]B %]S>7-?97)R
+M;&ES= !W<FET90!S=')R8VAR %]E>&ET &5N=FER;VX 97)R;F\ <W1R8VAR
+M &5R<F]R ')E<&]R=%]L:6YE7VQE;F=T: !O<'1I;F0 ;W!E;@!O<'1A<F<
+M9F=E=', ;W!T97)R ')E<&]R=%]L:6YE7VYU;6)E<G, 7V5D871A %]04D]#
+M14154D5?3$E.2T%'15]404),15\ 9F]P96X <WES7VYE<G( 7U]D;U]G;&]B
+M86Q?9'1O<G, 7U]#5$]27T5.1%]? %]E=&5X= !?;&EB7W9E<G-I;VX 3W!E
+M;@!F9FQU<V@ 7U]D;U]G;&]B86Q?8W1O<G, 7U]$5$]27T5.1%]? &UA:6X
+M;&EN95]L96YG=&@ <W1R;&5N %]F:6YI &9P<FEN=&8 $ %
+MFP UD "]D # %$X ((X
+M $8\ ! *",I4W5N3U,@-2XS($=E;F5R:6,@4V5P=&5M
+M8F5R(#$Y.3, &%S.B!30S,N,"!E87)L>2!A8V-E<W,@,#$@4V5P(#$Y.3,*
+M $=#0SH@*$=.52D@,BXV+C, &%S.B!30S,N,"!E87)L>2!A8V-E<W,@,#$@
+M4V5P(#$Y.3,* $=#0SH@*$=.52D@,BXV+C, &%S.B!30S,N,"!E87)L>2!A
+M8V-E<W,@,#$@4V5P(#$Y.3,* $=#0SH@*$=.52D@,BXV+C, &%S.B!30S,N
+M,"!E87)L>2!A8V-E<W,@,#$@4V5P(#$Y.3,* $=#0SH@*$=.52D@,BXV+C,
+M;&0Z("A31U4I(%-U;D]3+T5,1B H3$LM,2XS*0 0 "D 8?
+M"V0 1,( (60 1,( +3P /(
+M 7H <( EX L(
+M SH !$H !5H !=(
+M !EH !LX !SX !
+MX8 !]( "#( ".8
+M "5( "<( "D8 "G8
+M "R( #&8 $GH %+(
+M & %.8 ) %0X -< %3H #0 %
+M6H #4 %9( #8 %;X #< %>8 #@
+M %A( #D %CX #H %FH $8 %IX
+M %T( &T %]( "X &"20 !\L 1,( "YI;G1E
+M<G +FAA<V@ +F1Y;G-Y;0 N9'EN<W1R "YR96QA+F)S<P N<F5L82YP;'0
+M+G1E>'0 +FEN:70 +F9I;FD +F-T;W)S "YD=&]R<P N<F]D871A "YG;W0
+M+F1Y;F%M:6, +G!L= N9&%T80 N8G-S "YS>6UT86( +G-T<G1A8@ N<W1A
+M8BYI;F1E> N8V]M;65N= N<W1A8@ N<VAS=')T86( +G-T86(N:6YD97AS
+M='( +G-T86)S='( '9A;'5E<RU882YC "\Q,#DS+V]N,3 Y,U]W<R]U<W(O
+M<W)C+VQI8B]L:6)C+P!P;W)T+V=E;B]V86QU97,M6&$N8P %AT(#L@5CTR
+M+C +VYE="]M;W)G86YA+W5S<C$O<G1E;7,M,RXU+C P+V,O8G5I;&0M=&]O
+M;',O<W)C "]U<W(O8V-S+VQI8B]V86QU97,M6&$N;P ;&EB9V-C,BYC "]U
+M<W(T+T=.050O9V-C+3(N-BXS+P N+VQI8F=C8S(N8P!G8V,R7V-O;7!I;&5D
+M+@!I;G0Z=#$]<C$[+3(Q-#<T.#,V-#@[,C$T-S0X,S8T-SL 8VAA<CIT,CUR
+M,CLP.S$R-SL ;&]N9R!I;G0Z=#,]<C$[+3(Q-#<T.#,V-#@[,C$T-S0X,S8T
+M-SL =6YS:6=N960@:6YT.G0T/7(Q.S [+3$[ &QO;F<@=6YS:6=N960@:6YT
+M.G0U/7(Q.S [+3$[ &QO;F<@;&]N9R!I;G0Z=#8]<C$[,#$P,# P,# P,# P
+M,# P,# P,# P,# [,#<W-S<W-S<W-S<W-S<W-S<W-S<W-SL ;&]N9R!L;VYG
+M('5N<VEG;F5D(&EN=#IT-SUR,3LP,# P,# P,# P,# P.S Q-S<W-S<W-S<W
+M-S<W-S<W-S<W-S<W.P!S:&]R="!I;G0Z=#@]<C$[+3,R-S8X.S,R-S8W.P!S
+M:&]R="!U;G-I9VYE9"!I;G0Z=#D]<C$[,#LV-34S-3L <VEG;F5D(&-H87(Z
+M=#$P/7(Q.RTQ,C@[,3(W.P!U;G-I9VYE9"!C:&%R.G0Q,3UR,3LP.S(U-3L
+M9FQO870Z=#$R/7(Q.S0[,#L 9&]U8FQE.G0Q,SUR,3LX.S [ &QO;F<@9&]U
+M8FQE.G0Q-#UR,3LX.S [ &-O;7!L97@@:6YT.G0Q-3US.')E86PZ,2PP+#,R
+M.VEM86<Z,2PS,BPS,CL[ &-O;7!L97@@9FQO870Z=#$V/7(Q-CLT.S [ &-O
+M;7!L97@@9&]U8FQE.G0Q-SUR,3<[.#LP.P!C;VUP;&5X(&QO;F<@9&]U8FQE
+M.G0Q.#UR,3@[.#LP.P!V;VED.G0Q.3TQ.0!A<F-H7W1Y<&4Z5#(P/65!4D-(
+M7S,R0DE4.C L05)#2%\V-$))5#HQ+#L <F5G7V-L87-S.E0R,3UE3D]?4D5'
+M4SHP+$=%3D5204Q?4D5'4SHQ+$907U)%1U,Z,BQ!3$Q?4D5'4SHS+$Q)35]2
+M14=?0TQ!4U-%4SHT+#L ;6%C:&EN95]M;V1E.E0R,CUE5D])1&UO9&4Z,"Q1
+M26UO9&4Z,2Q(26UO9&4Z,BQ04TEM;V1E.C,L4TEM;V1E.C0L4$1);6]D93HU
+M+$1);6]D93HV+%1);6]D93HW+$]);6]D93HX+%%&;6]D93HY+$A&;6]D93HQ
+M,"Q4449M;V1E.C$Q+%-&;6]D93HQ,BQ$1FUO9&4Z,3,L6$9M;V1E.C$T+%1&
+M;6]D93HQ-2Q30VUO9&4Z,38L1$-M;V1E.C$W+%A#;6]D93HQ."Q40VUO9&4Z
+M,3DL0U%);6]D93HR,"Q#2$EM;V1E.C(Q+$-326UO9&4Z,C(L0T1);6]D93HR
+M,RQ#5$EM;V1E.C(T+$-/26UO9&4Z,C4L0DQ+;6]D93HR-BQ#0VUO9&4Z,C<L
+M0T-8;6]D93HR."Q#0U].3T]6;6]D93HR.2Q#0UA?3D]/5FUO9&4Z,S L0T-&
+M4&UO9&4Z,S$L0T-&4$5M;V1E.C,R+$U!6%]-04-(24Y%7TU/1$4Z,S,L.P!M
+M;V1E7V-L87-S.E0R,SUE34]$15]204Y$3TTZ,"Q-3T1%7TE.5#HQ+$U/1$5?
+M1DQ/050Z,BQ-3T1%7U!!4E1)04Q?24Y4.C,L34]$15]#0SHT+$U/1$5?0T]-
+M4$Q%6%])3E0Z-2Q-3T1%7T-/35!,15A?1DQ/050Z-BQ-05A?34]$15]#3$%3
+M4SHW+#L <'1R9&EF9E]T.G0Q '-I>F5?=#IT- !W8VAA<E]T.G0S %51271Y
+M<&4Z=#$Q %-)='EP93IT,0!54TET>7!E.G0T $1)='EP93IT-@!51$ET>7!E
+M.G0W %-&='EP93IT,3( 1$9T>7!E.G0Q,P!W;W)D7W1Y<&4Z=#$ 1$ES=')U
+M8W0Z5#(T/7,X:&EG:#HQ+# L,S([;&]W.C$L,S(L,S([.P!$275N:6]N.G0R
+M-3UU.',Z,C0L,"PV-#ML;#HV+# L-C0[.P!F=6YC7W!T<CIT,C8]*C(W/68Q
+M.0!?7V1O7V=L;V)A;%]D=&]R<SI&,3D
+M $ ! @ ! -0 #4 $0
+M 0 ) !0 ( 0#H Z FP #
+M 0 $ #P L " $#5 U0 5@ ! !H $
+M $ !< # @ !"+0 BT ")0 0
+M ? ! ( 0K< *W %0 # $0 0 , *0
+M 0 " $+, "S #D P \ $ # #, !
+M!@ !#!0 P4 '- ! Y 0 8 1-(
+M 32 )@ 0 /P $ & $3X $^
+M , $ $4 ! !@ !$^P !/L "
+M ! !, 0 8 1/T 3] @
+M 0 4P $ " $4 % -+ (
+M %L ! P "%TP !=, ! ! 0
+M !@ !@ , A=0 74 (@ $ 0 ( :0
+M $ ' (7V %]@ $8 $ # &X !
+M P "&/ !CP % ! !T " , AD(
+M 9" \ @ >0 ( &0@
+M 90 $P "D $ $ ($ # !]8 "XP
+M 0 ") 0 B/ $@
+M 0 , E0 $ (H0 $; !
+M )X ! ".@ !^ ! P
+M "D P EF ,8 $ K@
+M , )EX "; ! +T #
+= ";Y &'P 0 !
+
+end
diff --git a/tools/build/os/msdos/fixtimer.c b/tools/build/os/msdos/fixtimer.c
new file mode 100644
index 0000000000..3b71032550
--- /dev/null
+++ b/tools/build/os/msdos/fixtimer.c
@@ -0,0 +1,111 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <dos.h>
+
+#define IO_RTC 0x70 /* RTC */
+
+#define RTC_SEC 0x00 /* seconds */
+#define RTC_MIN 0x02 /* minutes */
+#define RTC_HRS 0x04 /* hours */
+#define RTC_WDAY 0x06 /* week day */
+#define RTC_DAY 0x07 /* day of month */
+#define RTC_MONTH 0x08 /* month of year */
+#define RTC_YEAR 0x09 /* month of year */
+#define RTC_STATUSA 0x0a /* status register A */
+#define RTCSA_TUP 0x80 /* time update, don't look now */
+
+#define RTC_STATUSB 0x0b /* status register B */
+
+#define RTC_DIAG 0x0e /* status register E - bios diagnostic */
+#define RTCDG_BITS "\020\010clock_battery\007ROM_cksum\006config_unit\005memory_size\004fixed_disk\003invalid_time"
+
+
+
+/* convert 2 digit BCD number */
+static int bcd( unsigned int i )
+{
+ return ((i/16)*10 + (i%16));
+}
+
+static unsigned int rtcin( unsigned int what )
+{
+ outportb( IO_RTC, what );
+ return inportb( IO_RTC+1 );
+}
+
+
+void fix_date( void )
+{
+ int s;
+ struct date date;
+ struct time time;
+
+ /* initialize brain-dead battery powered clock */
+ outportb( IO_RTC, RTC_STATUSA );
+ outportb( IO_RTC+1, 0x26 );
+ outportb( IO_RTC, RTC_STATUSB );
+ outportb( IO_RTC+1, 2 );
+
+ outportb( IO_RTC, RTC_DIAG );
+ s = inportb( IO_RTC+1 );
+ if (s) printf("RTC BIOS diagnostic error %b\n", s, RTCDG_BITS);
+
+ /* check for presence of clock */
+ s = rtcin(RTC_STATUSA);
+ if ( s == 0xff || s == 0 ) {
+ printf( "Real-time clock not found\n" );
+ return;
+ }
+
+ /* ready for a read? */
+ while ((s & RTCSA_TUP) == RTCSA_TUP)
+ s = rtcin(RTC_STATUSA);
+
+ date.da_year = bcd(rtcin(RTC_YEAR)) + 1900; /* year */
+ if ( date.da_year < 1970) date.da_year += 100;
+ date.da_year -= 1980;
+ date.da_mon = bcd(rtcin(RTC_MONTH)); /* month */
+ date.da_day = bcd(rtcin(RTC_DAY)); /* day */
+
+ (void)bcd(rtcin(RTC_WDAY)); /* weekday */
+
+ time.ti_hour = bcd(rtcin(RTC_HRS)); /* hour */
+ time.ti_min = bcd(rtcin(RTC_MIN)); /* minutes */
+ time.ti_sec = bcd(rtcin(RTC_SEC)); /* seconds */
+ time.ti_hund = 0;
+
+ setdate( & date );
+ settime( & time );
+}
+
+
+
+
+void fix_timer( void )
+{
+#define PIT_PORT 0x40
+#define TIMER_CNTR0 (PIT_PORT + 0) /* timer 0 counter port */
+#define TIMER_MODE (PIT_PORT + 3) /* timer mode port */
+#define TIMER_SEL0 0x00 /* select counter 0 */
+#define TIMER_RATEGEN 0x04 /* mode 2, rate generator */
+#define TIMER_16BIT 0x30 /* r/w counter 16 bits, LSB first */
+
+ /* set timer 0 to generate interrupts every period */
+ outportb( TIMER_MODE, TIMER_SEL0|TIMER_RATEGEN|TIMER_16BIT );
+ outportb( TIMER_CNTR0, 0 ); /* counter low */
+ outportb( TIMER_CNTR0, 0 ); /* counter high */
+}
+
+int main(void)
+{
+ /* Make timer count at correct pace */
+ fix_timer();
+
+ /* Fix the date */
+ fix_date();
+
+ return 0;
+}
diff --git a/tools/build/os/msdos/fixtimer.uue b/tools/build/os/msdos/fixtimer.uue
new file mode 100644
index 0000000000..bc4b10fc72
--- /dev/null
+++ b/tools/build/os/msdos/fixtimer.uue
@@ -0,0 +1,162 @@
+#
+# $Id$
+#
+begin 664 fixtimer.exe
+M35IF 0X 0 @ T __^; 8 (@ $ ^R!R:@$
+M
+M
+M
+M
+M
+M
+M
+M
+M
+M
+M "Z3 $NB1;X ;0PS2&++@( BQXL ([:HY( C :0
+M (D>C ")+JP QP:6 /__Z#0!Q#Z* (O'B]BY_W\F@3TX-W49)HM5 H#Z/740
+M@.;?_P:6 (#^674$_P:6 /*NXV%#)C@%==: S8#WV8D.B@"Y 0#3XX/#"(/C
+M^(D>C@",VBOJBSY\ H'_ )S![\ HD^? *!Q^P$<B@#/GH"<B*Q!-/O1SOO
+M<AF#/GP" '0'@SYZ @!U#K\ $#OO=P>+_>L#Z2$!B]\#VHD>I ")'J@ H9
+M*]B.P+1*5\TA7]/G^H[2B^?[,\ NC@;X ;^F!+GL!"O/\ZH._Q:8!.BU NB=
+M [0 S1J)%I@ B0Z: /\6G 3_-H@ _S:& /\VA #H%P)0Z%H"+HX>^ 'H? .
+M_Q::!#/ B_"Y+P"0_ ($@-0 1N+X+3<-D'0*N1D D+HO .B+ (OLM$R*1@+-
+M(;D. )"Z2 #IAP >N US2&)'G0 C 9V +@$-<TAB1YX (P&>@"X!37-(8D>
+M? ",!GX N 8US2&)'H C :" +@ )8S*CMJZ6 '-(1_#'K@ )<46= #-(1\>
+MN 0EQ19X ,TA'QZX!27%%GP S2$?'K@&)<46@ #-(1_#QP:6 R\.T0+L"
+M ,TAP[D> )"Z5@ NCA[X >CI_[@# %#H*?\ %6+[(M&!+$$T^BZ"@#WXHM6
+M!('B#P #PNL 7<-5B^R*1@3F<.1QM #K %W#58OL@^P(5K *YG"P)N9QL OF
+M<+ "YG&P#N9PY'&T (OP"_9T#[BR 5!6N)0!4.B<"8/$!K@* %#HM?]9B_"!
+M_O\ = 0+]G4+N/P!4.A^"5GIJ0#K"K@* %#HE/]9B_"+QB6 #V '3LN D
+M4.B _UE0Z%__605L!XE&^(%^^+('?02#1OAD@6[XO >X" !0Z%W_65#H//]9
+MB$;[N < 4.A-_UE0Z"S_68A&^K@& %#H/?]94.@<_UFX! !0Z##_65#H#_]9
+MB$;]N ( 4.@@_UE0Z/_^68A&_#/ 4.@1_UE0Z/#^68A&_\9&_@"-1OA0Z'H1
+M68U&_%#HA1%97HOE7<.P-.9#L #F0+ YD##Z/#_Z.S^,\#K ,-5B^Q6BW8$
+M"_9\%(/^6'8#OE< B388 HJ$&@*8ENL-]]Z#_B-WZL<&& +__XO&HY0 N/__
+MZP!>7<(" ,-5B^SK"HL>?@+1X_^7I@2A?@+_#GX""\!UZ_\6= +_%G8"_Q9X
+M O]V!.AZ_5E=PP "Z/!JH#+HP>K /\C@:0 +Z #+D)JQ C,6'UI.+
+M-HH @\8"N0$ @#Z2 -R$8X&C "+_K%_,L#RKN-V@/%_@^P"N $ \,#P27^
+M_XO\*_AR8(OGC,".V(S0CL!12?.D,L"JCMV'\H?9B\.+T$/H&0!W!W) Z!(
+M=_D\('0(/ UT!#P)=>@RP.OD"\!T!T*J"L!U 4.&X#+ ^>,5K$DL(G0/!"(\
+M7'4'@#PB=0*L20OVP^E^_5D#RBZ.'JP#B1Z$ $,#VXOTB^PKZW+FB^6)+H8
+MXPZ)=@"#Q0(VK K X/IT\#/ B48 +O\FJ@.+#HH 4>A' 5F+^ O ="0>'@>.
+M'HP ,_;\\Z0?B_@&_S:. .@I 8/$ HO8!Z.( O =0/I$?TSP+G__XD_@\,"
+M\JXF. 5U](D'PU6+[(,^?@(@=06X 0#K%8M&!(L>?@+1XXF'I@3_!GX",\#K
+M %W#58OL5E>+?@2+10:CZ 0[QW4(QP;H! ZQ"+=02+'N@$B7<$H>@$B40&
+M7UY=PU6+[%97BWX$BT8&*06+-0/WBT8&0(D$B7P"H>8$.\=U!HDVY@3K"(O^
+M WX&B74"B\8%! #K %]>7<-5B^Q6BT8$,](E__^!X@ 4E#H] !968OP@_[_
+M=00SP.L8H>8$B40"BT8$0(D$B3;F!*'F! 4$ .L 7EW#58OL5HM&!#/2)?__
+M@>( %)0Z+< 65F+\(/^_W4$,\#K%8DVZ@2)-N8$BT8$0(D$B\8%! #K %Y=
+MPU6+[%97BWX$"_]U!#/ ZUJ+QP4+ "7X_XOX@S[J! !U!U?HH?]9ZT*+-N@$
+MB\8+P'0QBP2+UX/"*#O"<@E75N@-_UE9ZR2+!#O'<@Y6Z-'^6?\$B\8%! #K
+M$(MT!CLVZ 1USU?H(O]9ZP!?7EW#58OLBT8$B]2!Z@ !.\)S!Z.> #/ ZPO'
+M!I0 " "X___K %W#58OLBT8$BU8& P:> (/2 (O(@<$ 8/2 O2=0H[S',&
+MAP:> .L+QP:4 @ N/__ZP!=PU6+[/]V!.B?_UGK %W#58OLBT8$F5)0Z++_
+MB^7K %W#58OL@^P"5E>+7@2+-XO&B4;^BUX$]T<"0 !T!(O&ZQ^+7@2+?PKK
+M"XO?1X _"G4#_T;^B\9."\!U[HM&_NL 7UZ+Y5W" @!5B^Q6BW8$5NA3!%D+
+MP'0%N/__ZTR#?@H!=1"#/ !^"U;HE?^9*48&&58(@60"7_['! BT0(B40*
+M_W8*_W8(_W8&BD0$F%#HW *#Q B#^O]U"CW__W4%N/__ZP(SP.L 7EW#58OL
+M@^P$5HMV!%;H[ -9"\!T"+K__[C__^L_N $ 4#/ 4%"*1 284.B8 H/$"(E6
+M_HE&_(,\ 'X9BU;^BT;\4E!6Z!#_F8O8B\I86BO#&]'K!HM6_HM&_.L 7HOE
+M7<-5B^RX $2+7@3-(;@ '($T>+1T.L 7<-5B^Q65XM^"HMV!(M$#CO&=0R#
+M?@@"?P:!__]_=@:X___IJ@"#/NH# '4/N) ".\9U",<&Z@,! .L4@S[H P!U
+M#;B CO&=0;'!N@# 0"#/ !T#[@! % SP%!05NC&_H/$"/=$ @0 = ?_= CH
+M"PQ9@60"\__'1 8 (O&!04 B40(B40*@WX( G0_"_]V.\<&= +$"(-^!@!U
+M&%?H6?U9B48&"\!T!X%, @0 ZP6X___K&XM&!HE$"HE$"(E\!H-^" %U!8%,
+M @@ ,\#K %]>7<-65[\$ +Z NL0]T0" P!T!5;HG )93X/&$ O_=>Q?7L-5
+MB^R![(H 5E>+1@A /0( <P4SP.GV (M>!-'C]X? P" =!+_=@C_=@;_=@3H
+MXP"#Q ;IUP"+7@31XX&GP /__8M&!HF&?/^+1@B)AGC_C;9^_^MM_XYX_XN>
+M?/__AGS_B@>(AGO_/ IU!,8$#4:*AGO_B 1&C89^_XO6*]"!^H ?#Z-AG[_
+MB_XK^%>-AG[_4/]V!.A[ (/$!HF&=O\[QW0;@[YV_P!S!;C__^L-BT8(*X9X
+M_P.&=O\KQ^M/C;9^_X.^>/\ = /IB?^-AG[_B_XK^(O'"\!V+E>-AG[_4/]V
+M!.@M (/$!HF&=O\[QW07@[YV_P!S!;C__^L)BT8( X9V_RO'ZP6+1@CK %]>
+MB^5=PU6+[(M>!-'C]X? P (=!"X @!0,\!04/]V!.@H (OEM$"+7@2+3@B+
+M5@;-(7(/4(M>!-'C@8_ P 06.L&4.@%^>L 7<-5B^R+7@31XX&GP /__;1"
+MBD8*BUX$BTX(BU8&S2%R NL'4.C;^)GK %W#58OL@^PB5E<&BWX*'@>+7@B#
+M^R1W6(#[ G)3BT8,BTX."\E]$8!^!@!T"\8%+4?WV??8@]D C7;>XP^1*]+W
+M\Y'W\X@41N,)Z_$KTO?SB!1&"\!U]8U.WO?9 \[\3HH$+ IS! 0ZZP,"1@2J
+MXN^P *H'BT8*ZP!?7HOE7<(, %6+[(-^" IU!HM&!)GK!8M&!#/24E#_=@;_
+M=@BP 5"P85#H7/_K %W#58OL_W8&_W8$_W8(_W8*L !0L&%0Z$#_ZP!=PU6+
+M[/]V!O]V!/]V"/]V"H-^"@IU!;@! .L",\!0L&%0Z!G_ZP!=P[KL ^L#NO$#
+MN04 D+1 NP( S2&Y)P"0NO8#M$#-(>EM]E6+[%97BW8$BT0..\9T!;C__^MF
+M@SP ?"WW1 (( '4,BT0*B]:#P@4[PG46QP0 (M$"HO6@\(%.\)U!HM$"(E$
+M"C/ ZS2+? 8#/$<I/%>+1 B)1 I0BD0$F%#H$OV#Q 8[QW01]T0" )U"H%,
+M A N/__ZP0SP.L 7UY=PU6+[+AK#5"XD )0_W8$C48&4.A, NL 7<-5B^R+
+M7@;_#_]V!HI&!)A0Z 8 B^7K %W#58OL@^P"5HMV!HI&!(A&__\$?3:*1O__
+M1 J+7 J(1__W1 (( '0;@'[_"G0&@'[_#74/5N@9_UD+P'0&N/__Z>D BD;_
+MM #IX0#_#/=$ I =0?W1 (" '4+@4P"$ "X___IQ@"!3 ( 8-\!@!T)H,\
+M '015NC7_ED+P'0&N/__Z:< ZPJX__^+5 8KPHD$Z7W_Z94 @S[J P!U.;B0
+M CO&=3**1 284.@)^UD+P'4%@60"__VX )0]T0" )T!;@" .L",\!0,\!0
+M5NC]^H/$".F/_X!^_PIU'_=$ D =1BX 0!0N!X$4(I$!)A0Z.#\@\0&/0$
+M=1BX 0!0C48$4(I$!)A0Z,C\@\0&/0$ =!'W1 ( G4*@4P"$ "X___K!XI&
+M_[0 ZP!>B^5=PU6+[%:+=@2XD )05NC!_EE9ZP!>7<-5B^R#[ )65XMV!(M^
+M!D?W1 (( '0CZP+K $^+QPO =!56BUX(_T8(B@>84.B+_EE9/?__=>+I=0#W
+M1 ) '0W@WP& '0QBT0&.\=S*H,\ '0-5NBT_5D+P'0$,\#K4T]7_W8(BD0$
+MF%#H(?R#Q :)1OXK?O[K-^L"ZP!/B\<+P'0L_P1]%8M>"/]&"(H'_T0*BUP*
+MB$?_M #K#E:+7@C_1@C_-^CZ_5E9/?__=<N+Q^L 7UZ+Y5W"!@#_)IX$58OL
+MBU8$N00/NR<$_(K&TNC7JHK&(L77JHK"TNC7JHK"(L77JNL 7<(" %6+[('L
+ME@!65\=&J@ QD:M4.LX5[G__S+ \J[WT4E?PX@%1_Y.K7XB4U%2!HU&KBOX
+MC4:N4%?_=@C_5@K&1JU0 7ZJC7ZN!UI96\,&_(U^KHF^;/^+OFS_BW8&K K
+M=!$\)700B 5'_DZM?^_HN?_KZNEU!(FV>/^L/"5TYXF^;/\SR8F.=O^)CFK_
+MB(YU_\>&</___\>&<O___^L!K#+DB]"+V(#K((#[8'-'BI\W!(O#/1< =@/I
+M'02+V-'C+O^G& ]C#TL/I ]7#\D/TP\5$!\0+Q"*#V00/Q!#$$<0Z1";$3P1
+M7!'_$BP3+!,L$W8/@ _IX0. _0!W^(..:O\!ZYN _0!W[(..:O\"ZX^ _0!W
+MX("^=?\K= 2(EG7_Z7S_@Z9J_]^U!>ER_X..:O\@M07I:/^ _0!W1/>&:O\"
+M '4A@XYJ_PBU >E1_^F( XM^!(L%@T8$ H#] G,)B89P_[4#Z3?_@/T$=>&)
+MAG+__L7I*?^ _01ST[4$Z1__DBPPF(#] G<;M0*'AG#_"\!\TM'@B]#1X-'@
+M \(!AG#_Z?O^@/T$=:6'AG+_"\!\M-'@B]#1X-'@ \(!AG+_Z=W^@XYJ_Q"U
+M!>G3_H&.:O\ 8.F:O_OM07IP_Z#IFK_[X&.:O^ +4%Z;/^MPCK"K<*ZPNW
+M$+/I MK&AG7_ ,:&;_\ B)9N_XM^!(L%,]+K$;<*QH9O_P&(EF[_BWX$BP69
+M1T>)=@;WAFK_$ !T!(L51T>)?@2-OGO_"\!U,PO2=2^#OG+_ '4MB[YL_XN.
+M</_C&X/Y_W06BX9J_R4( '0$LC#K K(@BL+HMOWB^>GI_8..:O\$4E!7BL>8
+M4(J&;_]04^B0^18'BY9R_PO2?P/I% 'I(0&(EF[_B78&C;YZ_XM>!/\W0T.)
+M7@3WAFK_( !T#_\W0T.)7@06!^@7_; ZJA8'Z _]Q@4 QH9O_P"#IFK_^XV.
+M>O\K^8?/BY9R_SO1?P*+T>F^ (EV!HB6;O^+?@2+!8-&! (6!XV^>_\RY(D%
+MN0$ Z=@ B78&B)9N_XM^!/>&:O\@ '4,BSV#1@0"'@<+_^L*Q#V#1@0$C, +
+MQW4%'@>_( 3HVOP[CG+_=@2+CG+_Z9D B78&B)9N_XM^!(N.<O\+R7T#N08
+M5U&-GGO_4U*X 0 CAFK_4(N&:O^I@ !T"K@" ,=&_@0 ZQ>I %T"K@( ,=&
+M_@H ZPC'1OX( +@& %#H-_R+1OX!1@06!XV^>__WAFK_" !T$XN6</\+TGX+
+MZ%O\*]%^!(F6=O^*AG7_"L!T%": /2UT#H.N=O\!@Y9V_P!/)H@%Z#3\B_>+
+MOFS_BYYP_[@% ".&:O\]!0!U%HJF;O^ _&]U$(.^=O\ ?P;'AG;_ 0#K'Y"
+M_'AT!8#\6'44@XYJ_T!+2X.N=O\"?0;'AG;_ #CG;_]X9J_P( =0SK!K @
+MZ.'[2SO9?_;WAFK_0 !T#+ PZ,_[BH9N_^C(^XN6=O\+TGXG*\HKVB:*!#PM
+M= @\('0$/"MU!R:LZ*C[24N'RN,'L##HG?OB^8?*XQ$KV2:LB 5'_DZM?P/H
+MD/OB\0O;?@F+R[ @Z'O[XOGIKON)=@:+?@3WAFK_( !U"HL]@T8$ AX'ZP;$
+M/8-&! 2X4 J1JT#1JHFB07I??N+MGC_B[YL_[ EZ#S[K K =?B ?JU0?0/H
+M-OL'BT:JZP!?7HOE7<(( %6+[%97BW8$@S[H! !T'(L>Z 2+?P:+'N@$B7<&
+MB74$B7P&H>@$B40$ZPJ)-N@$B70$B70&7UY=PU6+[(/L E97BW8&BWX$BP0!
+M!:'F!#O&=0:)/N8$ZPV+! /&B4;^BU[^B7\"5NA-\5E?7HOE7<-6H>H$.P;F
+M!'42_S;J!.C:\EDSP*/F!*/J!.L[BQ[F!(MW O<$ 0!U(E;H&?%9.S;J!'4*
+M,\"CY@2CZ@3K!HM$ J/F!%;HH_)9ZPS_-N8$Z)GR68DVY@1>PU6+[(/L E97
+MBW8$_PR+! /&B4;^BWP"]P4! '44.S;J!'0.BP0!!8M>_HE_ HOWZP56Z +_
+M68M>_O<' 0!U"?]V_E;H*O]965]>B^5=PU6+[%:+=@0+]G4"ZQ>+Q@7\_XOP
+M.S;F!'4%Z#S_ZP56Z(__65Y=PU6+[%:T*XMV!(L,BU0"S2%>7<-5B^Q6M"V+
+M=@2+#(M4 LTA7EW# !4=7)B;RU#("T@0V]P>7)I9VAT("AC
+M*2 Q.3@X($)O<FQA;F0@26YT;"X 3G5L;"!P;VEN=&5R(&%S<VEG;FUE;G0-
+M"D1I=FED92!E<G)O<@T*06)N;W)M86P@<')O9W)A;2!T97)M:6YA=&EO;@T*
+M .P$[ 3L
+M!
+M
+M
+M
+M
+M 4E1#($))3U,@9&EA9VYO<W1I8R!E<G)O<B E
+M8@H $ AC;&]C:U]B871T97)Y!U)/35]C:W-U;09C;VYF:6=?=6YI= 5M96UO
+M<GE?<VEZ901F:7AE9%]D:7-K VEN=F%L:61?=&EM90!296%L+71I;64@8VQO
+M8VL@;F]T(&9O=6YD"@ $P("! 4&" @(%!4%$_\6!1$"____________
+M_____P4%_____________________P__(P+_#_____\3__\" @4/ O___Q/_
+M_________R/_____(_\3_P!Z WH#>@, 0 D" ( "
+M * @$ "0 @ @(" H ( $," P
+M + " !" @0 # @ #_ T ( _P
+M . " /\ #P @ #_ , _P
+M ! # /\ @ P #_ , ,
+M_P $ # /\ !0 P #_ 8 ,
+M _P ' # /\ " P #_
+MD , _P * # /\ "P P$@ B "( 2@ J#_
+M______________________________________\ <')I;G0@<V-A;F8@
+M.B!F;&]A=&EN9R!P;VEN="!F;W)M871S(&YO="!L:6YK960-"@ - "AN=6QL
+M*0 P,3(S-#4V-S@Y04)#1$5& !04 105%!04% ( % ,$% D%!04%!04%!044
+M%!04%!04%!04% \7#P@4%!0'%!84%!04%!04%!0-%!04%!04%!04%! *#P\/
+G" H4% 84$@L.%!01% P4% T4%!04%!04 -(!T@'9 50+60M9"UD+
+
+end
diff --git a/tools/build/os/msdos/ifc.c b/tools/build/os/msdos/ifc.c
new file mode 100644
index 0000000000..091e2dd0ef
--- /dev/null
+++ b/tools/build/os/msdos/ifc.c
@@ -0,0 +1,331 @@
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <process.h>
+
+#include <io.h>
+
+void * xmalloc( int size )
+{
+ void * p = (void *)malloc( size );
+ if ( !p ) {
+ fprintf( stderr, "out of memory\n" );
+ exit( 1 );
+ }
+ return p;
+}
+void * xrealloc( void * old, int size )
+{
+ void * p = (void *)realloc( old, size );
+ if ( !p ) {
+ fprintf( stderr, "out of memory\n" );
+ exit( 1 );
+ }
+ return p;
+}
+
+char ** argv_fix( int * argc, char ** argv )
+{
+ char ** new = NULL;
+ int max = 20;
+ int cnt = 0;
+ int j;
+
+ for ( j = 1; argv[j]; ++j )
+ if ( argv[j][0] == '@' && access(argv[j]+1,0)==0 )
+ break;
+ if ( argv[j] == NULL )
+ return argv;
+
+ new = (char **)xmalloc( max * sizeof *new );
+ new[cnt++] = *argv++;
+ for ( ; *argv; ++argv ) {
+ if ( cnt >= max )
+ new = (char **)realloc( new, (max*=2) * sizeof *new );
+
+ if ( argv[0][0] != '@' || access(argv[0]+1,0) ) {
+ new[cnt++] = *argv;
+ } else {
+ char line[ 1000 ];
+ FILE * f = fopen( argv[0]+1, "r" );
+ if ( !f ) {
+ perror( argv[0]+1 );
+ exit( 2 );
+ }
+ while ( fgets( line, sizeof line, f ) ) {
+ int len = strlen( line );
+ /* delete trailing newlines */
+ while ( line[len-1] == '\n' || line[len-1] == '\r' )
+ line[--len] = '\0';
+ if ( cnt >= max )
+ new = (char **)xrealloc( new, (max*=2) * sizeof *new );
+ new[cnt] = (char *)xmalloc( len+1 );
+ strcpy( new[cnt], line );
+ ++cnt;
+ }
+ fclose( f );
+ }
+ }
+ if ( cnt >= max )
+ new = (char **)xrealloc( new, (max+1) * sizeof *new );
+ new[cnt] = NULL;
+ *argc = cnt;
+ return new;
+}
+
+
+const char * USAGE =
+"usage: $progname [ -cNvmV ] file [ file ... ] dest-directory-or-file\n"
+" -v -- verbose\n"
+" -V suffix -- suffix to append to targets (before any . suffix)\n"
+" eg: -V _g would change 'foo' to 'foo_g' and\n"
+" 'libfoo.a' to 'libfoo_g.a'\n"
+" -m mode -- mode for new file(s)\n"
+" -c -- copy instead of move (always on)\n"
+" -N -- copy only if source is newer than target\n"
+;
+
+void fatal( char * msg )
+{
+ if ( msg )
+ fprintf( stderr, "%s\n", msg );
+ fprintf( stderr, "%s", USAGE );
+ exit( 1 );
+}
+
+char * basename( char * f )
+{
+ char * b = strrchr( f, '/' );
+ if ( b ) ++b;
+ else b = f;
+ return b;
+}
+
+#include <sys/stat.h>
+int is_dir( char * path )
+{
+ struct stat buf;
+ if ( stat( path, &buf ) )
+ return 0;
+ return buf.st_mode & S_IFDIR;
+}
+int is_file( char * path )
+{
+ struct stat buf;
+ if ( stat( path, &buf ) )
+ return 0;
+ return buf.st_mode & S_IFREG;
+}
+int newer( char * p1, char * p2 )
+{
+ struct stat buf1;
+ struct stat buf2;
+ if ( stat( p1, &buf1 ) )
+ return 0;
+ if ( stat( p2, &buf2 ) )
+ return 0;
+ return buf1.st_mtime > buf2.st_mtime;
+}
+
+int filecopy( char * d, char * s, int preserve_time )
+{
+#if 0
+ int status;
+ char * argv[ 5 ];
+ argv[0] = "cp";
+ argv[1] = "-p";
+ argv[2] = s;
+ argv[3] = d;
+ argv[4] = NULL;
+ status = spawnvp( P_WAIT, argv[0], argv );
+ if ( status )
+ perror( "cp" );
+ return status;
+#else
+ FILE * fs;
+ FILE * fd;
+ char buffer[ 8192 ];
+ int n;
+ struct ftime When;
+ struct stat Stat;
+
+ fs = fopen( s, "rb" );
+ if ( fs == NULL ) {
+ perror( s );
+ return 1;
+ }
+ fd = fopen( d, "wb" );
+ if ( fd == NULL ) {
+ perror( d );
+ fclose( fs );
+ return 2;
+ }
+
+ if ( preserve_time )
+ if ( getftime( fileno(fs), &When ) ) {
+ perror( s );
+ preserve_time = 0;
+ }
+
+ do {
+ n = fread( buffer, 1, sizeof buffer, fs );
+ if ( n > 0 )
+ if ( fwrite( buffer, 1, n, fd ) < 0 ) {
+ perror( d );
+ return 3;
+ }
+ } while ( n > 0 );
+
+ fclose( fs );
+
+ /* Fix time stamp */
+ if ( preserve_time )
+ if ( setftime( fileno(fd), &When ) ) {
+ perror( s );
+ preserve_time = 0;
+ }
+ fclose( fd );
+
+ /* Fix access rights */
+ if ( stat( s, &Stat ) )
+ perror( s );
+ else if ( chmod( d, Stat.st_mode ) )
+ perror( d );
+
+ return 0;
+#endif
+}
+
+
+
+
+
+int main( int argc, char * argv[] )
+{
+ char * progname;
+ int verbose = 0;
+ int only_if_newer= 0;
+ char * suffix = NULL;
+ char * mode = NULL;
+ char * dest;
+ char ** pp;
+
+ argv = argv_fix( &argc, argv );
+
+ progname = basename( *argv++ );
+
+ /* process the options */
+ while ( argv[0] && argv[0][0] == '-' ) {
+ switch ( argv[0][1] ) {
+ case 'N':
+ ++argv;
+ only_if_newer = 1;
+ break;
+ case 'c':
+ ++argv;
+ /* We always copy, regardless */
+ break;
+ case 'v':
+ ++argv;
+ verbose = 1;
+ break;
+ case 'V':
+ ++argv;
+ suffix = *argv;
+ ++argv;
+ break;
+ case 'm':
+ ++argv;
+ mode = *argv;
+ ++argv;
+ break;
+ default:
+ fatal( NULL );
+ }
+ }
+
+ /* Separate source file(s) from dest directory or file */
+#if 0
+ if ( !argv[0] || !argv[1] )
+ fatal( "missing files or invalid destination" );
+#else
+ /* We used to require at least one file; not any more */
+ if ( !argv[0] )
+ fatal( "missing files or invalid destination" );
+ if ( !argv[1] )
+ return 0;
+#endif
+ for ( pp = argv; *pp; ++pp )
+ continue;
+ --pp;
+ dest = *pp;
+ *pp = NULL;
+
+ /* Process the arguments */
+ for (; *argv; ++argv ) {
+ char * f = *argv;
+ char * leaf = basename( f );
+ char target[ 128 ];
+
+ strcpy( target, dest );
+
+ if ( is_dir( target ) ) {
+ strcat( target, "/" );
+ /* if we were given a suffix, then add it as appropriate */
+ if ( suffix ) {
+ char * dot = strchr( leaf, '.' );
+ if ( dot ) {
+ strncat( target, leaf, dot-leaf );
+ strcat( target, suffix );
+ strcat( target, dot );
+ if ( verbose )
+ printf( "%s: %s will be installed as %s",
+ progname, f, strrchr(target,'/')+1 );
+ } else {
+ strcat( target, leaf );
+ strcat( target, suffix );
+ }
+ } else {
+ strcat( target, leaf );
+ }
+ }
+
+ if ( access( f, 0 ) ) {
+ char buf[200];
+ sprintf( buf, "cannot read %s", f );
+ fatal( buf );
+ }
+
+ if ( only_if_newer && is_file( target ) && !newer( f, target ) ) {
+ if ( verbose )
+ printf( "'%s' not newer than '%s'\n", f, target );
+ continue;
+ }
+
+ if ( verbose )
+ printf( "rm -f %s\n", target );
+ if ( chmod( target, 0777 ) )
+ if ( verbose )
+ perror( target );
+ if ( unlink( target ) )
+ if ( verbose )
+ perror( target );
+ if ( verbose )
+ printf( "cp -p %s %s\n", f, target );
+ if ( filecopy( target, f, 1 ) )
+ return 1;
+ if ( mode ) {
+ char buf[ 255 ];
+ sprintf( buf, "chmod %s %s\n", mode, target );
+ if ( verbose )
+ printf( "%s\n", buf );
+ system( buf );
+ }
+ }
+
+ return 0;
+}
+
diff --git a/tools/build/os/msdos/ifc_exe.uue b/tools/build/os/msdos/ifc_exe.uue
new file mode 100644
index 0000000000..cd9f52b8f0
--- /dev/null
+++ b/tools/build/os/msdos/ifc_exe.uue
@@ -0,0 +1,163 @@
+#
+# $Id$
+#
+
+begin 664 ifc.exe
+M(VEN8VQU9&4@/'-T9&EO+F@^#0HC:6YC;'5D92 \<W1R:6YG+F@^#0HC:6YC
+M;'5D92 \<')O8V5S<RYH/@T*#0HC:6YC;'5D92 \:6\N:#X-"@T*=F]I9" J
+M('AM86QL;V,H(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
+M("HI;6%L;&]C*"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)9G!R:6YT
+M9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H(#$@*3L-
+M"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0IV;VED("H@>')E86QL;V,H('9O
+M:60@*B!O;&0L(&EN="!S:7IE("D-"GL-"B @("!V;VED("H@<" ]("AV;VED
+M("HI<F5A;&QO8R@@;VQD+"!S:7IE("D[#0H@(" @:68@*" A<" I("![#0H)
+M9G!R:6YT9B@@<W1D97)R+" B;W5T(&]F(&UE;6]R>5QN(B I.PT*"65X:70H
+M(#$@*3L-"B @("!]#0H@(" @<F5T=7)N(' [#0I]#0H-"F-H87(@*BH@87)G
+M=E]F:7@H(&EN=" J(&%R9V,L(&-H87(@*BH@87)G=B I#0I[#0H@(" @8VAA
+M<B J*B!N97<@/2!.54Q,.PT*(" @(&EN=" @(" @;6%X(#T@,C [#0H@(" @
+M:6YT"2 @("!C;G0@/2 P.PT*(" @(&EN= D@(" @:CL-"@T*(" @(&9O<B H
+M(&H@/2 Q.R!A<F=V6VI=.R K*VH@*0T*"6EF("@@87)G=EMJ75LP72 ]/2 G
+M0"<@)B8@86-C97-S*&%R9W9;:ETK,2PP*3T]," I#0H)(" @(&)R96%K.PT*
+M(" @(&EF("@@87)G=EMJ72 ]/2!.54Q,("D-"@ER971U<FX@87)G=CL-"@T*
+M(" @(&YE=R ]("AC:&%R("HJ*7AM86QL;V,H(&UA>" J('-I>F5O9B J;F5W
+M("D[#0H@(" @;F5W6V-N="LK72 ]("IA<F=V*RL[#0H@(" @9F]R("@@.R J
+M87)G=CL@*RMA<F=V("D@('L-"@EI9B H(&-N=" ^/2!M87@@*0T*"2 @("!N
+M97<@/2 H8VAA<B J*BER96%L;&]C*"!N97<L("AM87@J/3(I("H@<VEZ96]F
+M("IN97<@*3L-"@D@(" @#0H):68@*"!A<F=V6S!=6S!=("$]("= )R!\?"!A
+M8V-E<W,H87)G=ELP72LQ+# I("D@('L-"@D@(" @;F5W6V-N="LK72 ]("IA
+M<F=V.PT*"7T@96QS92![#0H)(" @(&-H87(@;&EN95L@,3 P,"!=.PT*"2 @
+M("!&24Q%("H@9B ](&9O<&5N*"!A<F=V6S!=*S$L(")R(B I.PT*"2 @("!I
+M9B H("%F("D@('L-"@D)<&5R<F]R*"!A<F=V6S!=*S$@*3L-"@D)97AI="@@
+M,B I.PT*"2 @("!]#0H)(" @('=H:6QE("@@9F=E=',H(&QI;F4L('-I>F5O
+M9B!L:6YE+"!F("D@*2 @>PT*"0EI;G0@;&5N(#T@<W1R;&5N*"!L:6YE("D[
+M#0H)"2\J(&1E;&5T92!T<F%I;&EN9R!N97=L:6YE<R J+PT*"0EW:&EL92 H
+M(&QI;F5;;&5N+3%=(#T]("=<;B<@?'P@;&EN95ML96XM,5T@/3T@)UQR)R I
+M#0H)"2 @("!L:6YE6RTM;&5N72 ]("=<,"<[#0H)"6EF("@@8VYT(#X](&UA
+M>" I#0H)"2 @("!N97<@/2 H8VAA<B J*BEX<F5A;&QO8R@@;F5W+" H;6%X
+M*CTR*2 J('-I>F5O9B J;F5W("D[#0H)"6YE=UMC;G1=(#T@*&-H87(@*BEX
+M;6%L;&]C*"!L96XK,2 I.PT*"0ES=')C<'DH(&YE=UMC;G1=+"!L:6YE("D[
+M#0H)"2LK8VYT.PT*"2 @("!]#0H)(" @(&9C;&]S92@@9B I.PT*"7T)#0H@
+M(" @?0T*(" @(&EF("@@8VYT(#X](&UA>" I#0H);F5W(#T@*&-H87(@*BHI
+M>')E86QL;V,H(&YE=RP@*&UA>"LQ*2 J('-I>F5O9B J;F5W("D[#0H@(" @
+M;F5W6V-N=%T@/2!.54Q,.PT*(" @("IA<F=C(#T@8VYT.PT*(" @(')E='5R
+M;B!N97<[#0I]#0H-"@T*8V]N<W0@8VAA<B J(%5304=%(#T@#0HB=7-A9V4Z
+M("1P<F]G;F%M92!;("UC3G9M5B!=(&9I;&4@6R!F:6QE("XN+B!=(&1E<W0M
+M9&ER96-T;W)Y+6]R+69I;&5<;B(-"B(@(" @(" @("UV(" @(" @(" @("TM
+M('9E<F)O<V5<;B(-"B(@(" @(" @("U6('-U9F9I>" @("TM('-U9F9I>"!T
+M;R!A<'!E;F0@=&\@=&%R9V5T<R H8F5F;W)E(&%N>2 N('-U9F9I>"E<;B(-
+M"B(@(" @(" @(" @(" @(" @(" @(" @("!E9SH@+58@7V<@=V]U;&0@8VAA
+M;F=E("=F;V\G('1O("=F;V]?9R<@86YD7&XB#0HB(" @(" @(" @(" @(" @
+M(" @(" @(" @(" @(" @(" @(" @(" @(" @(" @(" G;&EB9F]O+F$G('1O
+M("=L:6)F;V]?9RYA)UQN(@T*(B @(" @(" @+6T@;6]D92 @(" @+2T@;6]D
+M92!F;W(@;F5W(&9I;&4H<RE<;B(-"B(@(" @(" @("UC(" @(" @(" @("TM
+M(&-O<'D@:6YS=&5A9"!O9B!M;W9E("AA;'=A>7,@;VXI7&XB#0HB(" @(" @
+M(" M3B @(" @(" @(" M+2!C;W!Y(&]N;'D@:68@<V]U<F-E(&ES(&YE=V5R
+M('1H86X@=&%R9V5T7&XB#0H[#0H-"G9O:60@9F%T86PH(&-H87(@*B!M<V<@
+M*0T*>PT*(" @(&EF("@@;7-G("D-"@EF<')I;G1F*"!S=&1E<G(L("(E<UQN
+M(BP@;7-G("D[#0H@(" @9G!R:6YT9B@@<W1D97)R+" B)7,B+"!54T%'12 I
+M.PT*(" @(&5X:70H(#$@*3L-"GT-"@T*8VAA<B J(&)A<V5N86UE*"!C:&%R
+M("H@9B I#0I[#0H@(" @8VAA<B J(&(@/2!S=')R8VAR*"!F+" G+R<@*3L-
+M"B @("!I9B H(&(@*0DK*V([#0H@(" @96QS90EB(#T@9CL-"B @("!R971U
+M<FX@8CL-"GT-"@T*(VEN8VQU9&4@/'-Y<R]S=&%T+F@^#0II;G0@:7-?9&ER
+M*"!C:&%R("H@<&%T:" I#0I[#0H@(" @<W1R=6-T('-T870@8G5F.PT*(" @
+M(&EF("@@<W1A="@@<&%T:"P@)F)U9B I("D-"@ER971U<FX@,#L-"B @("!R
+M971U<FX@8G5F+G-T7VUO9&4@)B!37TE&1$E2.PT*?0T*:6YT(&ES7V9I;&4H
+M(&-H87(@*B!P871H("D-"GL-"B @("!S=')U8W0@<W1A="!B=68[#0H@(" @
+M:68@*"!S=&%T*"!P871H+" F8G5F("D@*0T*"7)E='5R;B P.PT*(" @(')E
+M='5R;B!B=68N<W1?;6]D92 F(%-?249214<[#0I]#0II;G0@;F5W97(H(&-H
+M87(@*B!P,2P@8VAA<B J(' R("D-"GL-"B @("!S=')U8W0@<W1A="!B=68Q
+M.PT*(" @('-T<G5C="!S=&%T(&)U9C([#0H@(" @:68@*"!S=&%T*"!P,2P@
+M)F)U9C$@*2 I#0H)<F5T=7)N(# [#0H@(" @:68@*"!S=&%T*"!P,BP@)F)U
+M9C(@*2 I#0H)<F5T=7)N(# [#0H@(" @<F5T=7)N(&)U9C$N<W1?;71I;64@
+M/B!B=68R+G-T7VUT:6UE.PT*?0T*#0II;G0@9FEL96-O<'DH(&-H87(@*B!D
+M+"!C:&%R("H@<RP@:6YT('!R97-E<G9E7W1I;64@*0T*>PT*(VEF(# -"B @
+M("!I;G0)"7-T871U<SL-"B @("!C:&%R(" @(" @*B!A<F=V6R U(%T[#0H@
+M(" @87)G=ELP72 ](")C<"([#0H@(" @87)G=ELQ72 ]("(M<"([#0H@(" @
+M87)G=ELR72 ](',[#0H@(" @87)G=ELS72 ](&0[#0H@(" @87)G=ELT72 ]
+M($Y53$P[#0H@(" @<W1A='5S(#T@<W!A=VYV<"@@4%]704E4+"!A<F=V6S!=
+M+"!A<F=V("D[#0H@(" @:68@*"!S=&%T=7,@*0T*"7!E<G)O<B@@(F-P(B I
+M.PT*(" @(')E='5R;B!S=&%T=7,[#0HC96QS90T*(" @($9)3$4@(" @(" J
+M(&9S.PT*(" @($9)3$4@(" @(" J(&9D.PT*(" @(&-H87()8G5F9F5R6R X
+M,3DR(%T[#0H@(" @:6YT"0EN.PT*(" @('-T<G5C="!F=&EM90E7:&5N.PT*
+M(" @('-T<G5C="!S=&%T"0E3=&%T.PT*#0H@(" @9G,@/2!F;W!E;B@@<RP@
+M(G)B(B I.PT*(" @(&EF("@@9G,@/3T@3E5,3" I("![#0H)<&5R<F]R*"!S
+M("D[#0H)<F5T=7)N(#$[#0H@(" @?0T*(" @(&9D(#T@9F]P96XH(&0L(")W
+M8B(@*3L-"B @("!I9B H(&9D(#T]($Y53$P@*2 @>PT*"7!E<G)O<B@@9" I
+M.PT*"69C;&]S92@@9G,@*3L-"@ER971U<FX@,CL-"B @("!]#0H-"B @("!I
+M9B H('!R97-E<G9E7W1I;64@*0T*"6EF("@@9V5T9G1I;64H(&9I;&5N;RAF
+M<RDL("97:&5N("D@*2 @>PT*"2 @("!P97)R;W(H(',@*3L-"@D@(" @<')E
+M<V5R=F5?=&EM92 ](# [#0H)?0T*#0H@(" @9&\@>PT*"6X@/2!F<F5A9"@@
+M8G5F9F5R+" Q+"!S:7IE;V8@8G5F9F5R+"!F<R I.PT*"6EF("@@;B ^(# @
+M*0T*"2 @("!I9B H(&9W<FET92@@8G5F9F5R+" Q+"!N+"!F9" I(#P@," I
+M("![#0H)"7!E<G)O<B@@9" I.PT*"0ER971U<FX@,SL-"@D@(" @?0T*(" @
+M('T@=VAI;&4@*"!N(#X@," I.R @(" -"@T*(" @(&9C;&]S92@@9G,@*3L-
+M"@T*(" @("\J($9I>"!T:6UE('-T86UP("HO#0H@(" @:68@*"!P<F5S97)V
+M95]T:6UE("D-"@EI9B H('-E=&9T:6UE*"!F:6QE;F\H9F0I+" F5VAE;B I
+M("D@('L-"@D@(" @<&5R<F]R*"!S("D[#0H)(" @('!R97-E<G9E7W1I;64@
+M/2 P.PT*"7T-"B @("!F8VQO<V4H(&9D("D[#0H-"B @(" O*B!&:7@@86-C
+M97-S(')I9VAT<R J+PT*(" @(&EF("@@<W1A="@@<RP@)E-T870@*2 I#0H)
+M<&5R<F]R*"!S("D[#0H@(" @96QS92!I9B H(&-H;6]D*"!D+"!3=&%T+G-T
+M7VUO9&4@*2 I#0H)<&5R<F]R*"!D("D[#0H-"B @("!R971U<FX@,#L-"B-E
+M;F1I9@T*?0T*#0H-"@T*#0H-"FEN="!M86EN*"!I;G0@87)G8RP@8VAA<B J
+M(&%R9W9;72 I#0I[#0H@(" @8VAA<B J"7!R;V=N86UE.PT*(" @(&EN= D)
+M=F5R8F]S92 ](# [#0H@(" @:6YT"0EO;FQY7VEF7VYE=V5R/2 P.PT*(" @
+M(&-H87(@*@ES=69F:7@@(#T@3E5,3#L-"B @("!C:&%R("H);6]D90D]($Y5
+M3$P[#0H@(" @8VAA<B J( ED97-T.PT*(" @(&-H87(@*BH)<' [#0H-"B @
+M("!A<F=V(#T@87)G=E]F:7@H("9A<F=C+"!A<F=V("D[#0H-"B @("!P<F]G
+M;F%M92 ](&)A<V5N86UE*" J87)G=BLK("D[#0H-"B @(" O*B!P<F]C97-S
+M('1H92!O<'1I;VYS("HO#0H@(" @=VAI;&4@*"!A<F=V6S!=(" F)B @87)G
+M=ELP75LP72 ]/2 G+2<@*2 @>PT*"7-W:71C:" H(&%R9W9;,%U;,5T@*2 @
+M>PT*"2 @("!C87-E("=.)SH-"@D@(" @(" @("LK87)G=CL-"@D);VYL>5]I
+M9E]N97=E<B ](#$[#0H)"6)R96%K.PT*"2 @("!C87-E("=C)SH-"@D@(" @
+M(" @("LK87)G=CL-"@D)+RH@5V4@86QW87ES(&-O<'DL(')E9V%R9&QE<W,@
+M*B\-"@D)8G)E86L[#0H)(" @(&-A<V4@)W8G.@T*"0DK*V%R9W8[#0H)"79E
+M<F)O<V4@/2 Q.PT*"0EB<F5A:SL-"@D@(" @8V%S92 G5B<Z#0H)"2LK87)G
+M=CL-"@D)<W5F9FEX(#T@*F%R9W8[#0H)"2LK87)G=CL-"@D)8G)E86L[#0H)
+M(" @(&-A<V4@)VTG.@T*"0DK*V%R9W8[#0H)"6UO9&4@/2 J87)G=CL-"@D)
+M*RMA<F=V.PT*"0EB<F5A:SL-"@D@(" @9&5F875L=#H-"@D)9F%T86PH($Y5
+M3$P@*3L-"@E]#0H@(" @?0T*#0H@(" @+RH@4V5P87)A=&4@<V]U<F-E(&9I
+M;&4H<RD@9G)O;2!D97-T(&1I<F5C=&]R>2!O<B!F:6QE("HO#0HC:68@, T*
+M(" @(&EF("@@(6%R9W9;,%T@?'P@(6%R9W9;,5T@*0T*"69A=&%L*" B;6ES
+M<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*(V5L<V4-
+M"B @(" O*B!792!U<V5D('1O(')E<75I<F4@870@;&5A<W0@;VYE(&9I;&4[
+M(&YO="!A;GD@;6]R92 J+PT*(" @(&EF("@@(6%R9W9;,%T@*0T*"69A=&%L
+M*" B;6ES<VEN9R!F:6QE<R!O<B!I;G9A;&ED(&1E<W1I;F%T:6]N(B I.PT*
+M(" @(&EF("@@(6%R9W9;,5T@*0T*"7)E='5R;B P.PT*(V5N9&EF#0H@(" @
+M9F]R("@@<' @/2!A<F=V.R J<' [("LK<' @*0T*"6-O;G1I;G5E.PT*(" @
+M("TM<' [#0H@(" @9&5S=" ]("IP<#L-"B @(" J<' @/2!.54Q,.PT*#0H@
+M(" @+RH@4')O8V5S<R!T:&4@87)G=6UE;G1S("HO#0H@(" @9F]R("@[("IA
+M<F=V.R K*V%R9W8@*2 @>PT*"6-H87(@*B!F(#T@*F%R9W8[#0H)8VAA<B J
+M(&QE868@/2!B87-E;F%M92@@9B I.PT*"6-H87(@=&%R9V5T6R Q,C@@73L-
+M"@T*"7-T<F-P>2@@=&%R9V5T+"!D97-T("D[#0H-"@EI9B H(&ES7V1I<B@@
+M=&%R9V5T("D@*2 @>PT*"2 @("!S=')C870H('1A<F=E="P@(B\B("D[#0H)
+M(" @("\J(&EF('=E('=E<F4@9VEV96X@82!S=69F:7@L('1H96X@861D(&ET
+M(&%S(&%P<')O<')I871E("HO#0H)(" @(&EF("@@<W5F9FEX("D@('L-"@D)
+M8VAA<B J(&1O=" ]('-T<F-H<B@@;&5A9BP@)RXG("D[#0H)"6EF("@@9&]T
+M("D@('L-"@D)(" @('-T<FYC870H('1A<F=E="P@;&5A9BP@9&]T+6QE868@
+M*3L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!S=69F:7@@*3L-"@D)(" @('-T
+M<F-A="@@=&%R9V5T+"!D;W0@*3L-"@D)(" @(&EF("@@=F5R8F]S92 I#0H)
+M"0EP<FEN=&8H("(E<SH@)7,@=VEL;"!B92!I;G-T86QL960@87,@)7,B+ T*
+M"0D)(" @(" @('!R;V=N86UE+"!F+"!S=')R8VAR*'1A<F=E="PG+R<I*S$@
+M*3L-"@D)?2!E;'-E('L-"@D)(" @('-T<F-A="@@=&%R9V5T+"!L96%F("D[
+M#0H)"2 @("!S=')C870H('1A<F=E="P@<W5F9FEX("D[#0H)"7T-"@D@(" @
+M?2!E;'-E('L-"@D)<W1R8V%T*"!T87)G970L(&QE868@*3L-"@D@(" @?0T*
+M"7T-"@T*"6EF("@@86-C97-S*"!F+" P("D@*2 @>PT*"2 @("!C:&%R(&)U
+M9ELR,#!=.PT*"2 @("!S<')I;G1F*"!B=68L(")C86YN;W0@<F5A9" E<R(L
+M(&8@*3L-"@D@(" @9F%T86PH(&)U9B I.PT*"7T-"@T*"6EF("@@;VYL>5]I
+M9E]N97=E<B F)B!I<U]F:6QE*"!T87)G970@*2 F)B A;F5W97(H(&8L('1A
+M<F=E=" I("D@('L-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<')I;G1F*" B
+M)R5S)R!N;W0@;F5W97(@=&AA;B G)7,G7&XB+"!F+"!T87)G970@*3L-"@D@
+M(" @8V]N=&EN=64[#0H)?0T*#0H):68@*"!V97)B;W-E("D-"@D@(" @<')I
+M;G1F*" B<FT@+68@)7-<;B(L('1A<F=E=" I.PT*"6EF("@@8VAM;V0H('1A
+M<F=E="P@,#<W-R I("D-"@D@(" @:68@*"!V97)B;W-E("D-"@D)<&5R<F]R
+M*"!T87)G970@*3L-"@EI9B H('5N;&EN:R@@=&%R9V5T("D@*0T*"2 @("!I
+M9B H('9E<F)O<V4@*0T*"0EP97)R;W(H('1A<F=E=" I.PT*"6EF("@@=F5R
+M8F]S92 I#0H)(" @('!R:6YT9B@@(F-P("UP("5S("5S7&XB+"!F+"!T87)G
+M970@*3L-"@EI9B H(&9I;&5C;W!Y*"!T87)G970L(&8L(#$@*2 I#0H)(" @
+M(')E='5R;B Q.PT*"6EF("@@;6]D92 I("![#0H)(" @(&-H87(@8G5F6R R
+M-34@73L-"@D@(" @<W!R:6YT9B@@8G5F+" B8VAM;V0@)7,@)7-<;B(L(&UO
+M9&4L('1A<F=E=" I.PT*"2 @("!I9B H('9E<F)O<V4@*0T*"0EP<FEN=&8H
+M("(E<UQN(BP@8G5F("D[#0H)(" @('-Y<W1E;2@@8G5F("D[#0H)?0T*(" @
+:('T-"@T*(" @(')E='5R;B P.PT*?0T*#0IE
+
+end
diff --git a/tools/build/packhex.c b/tools/build/packhex.c
new file mode 100644
index 0000000000..ddd010c4a9
--- /dev/null
+++ b/tools/build/packhex.c
@@ -0,0 +1,513 @@
+
+/***** P A C K H E X . C ************************************************
+ *
+ * Packhex is a hex-file compaction utility. It attempts to concatenate
+ * hex records to produce more size-efficient packaging.
+ *
+ * Limitations: Input files must be correctly formatted. This utility
+ * is not robust enough to detect hex-record formatting
+ * errors.
+ *
+ * Published: 5/93 Embedded Systems magazine
+ *
+ * Compiler: Microsoft C 6.0
+ * cl /F 1000 packhex.c
+ *
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+/* #define SMALLER_RECORDS */
+#ifdef SMALLER_RECORDS
+#define MAX_LEN_S1_RECS 128
+#define MAX_LEN_S2_RECS 128
+#define MAX_LEN_S3_RECS 128
+#else
+#define MAX_LEN_S1_RECS 252
+#define MAX_LEN_S2_RECS 251
+#define MAX_LEN_S3_RECS 250
+#endif
+
+
+/*--------------------------------- includes ---------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(__unix__) && !defined(EXIT_FAILURE)
+#define EXIT_FAILURE -1
+#define EXIT_SUCCESS 0
+#endif
+
+/*--------------------------------- defines ----------------------------------*/
+
+#define YES 1
+#define MAX_LINE_SIZE 600
+#define EOS '\0'
+
+
+/*---------------------------------- macros ----------------------------------*/
+
+/* Convert ASCII hexadecimal digit to value. */
+
+#define HEX_DIGIT( C ) ( ( ( ( C ) > '9' ) ? ( C ) + 25 : ( C ) ) & 0xF )
+
+
+/*--------------------------------- typedefs ---------------------------------*/
+
+typedef unsigned char Boolean;
+typedef unsigned char Uchar;
+typedef unsigned int Uint;
+typedef unsigned long Ulong;
+
+typedef struct /* Functions and constant returning Hex-record vital stats. */
+{
+ Boolean ( *is_data_record )( char * );
+ Ulong ( *get_address )( char * );
+ Uint ( *get_data_count )( char * );
+ const Uint max_data_count;
+ char *( *get_data_start )( char * );
+ void ( *put_data_record )( Uint, Ulong, char * );
+} Rec_vitals;
+
+
+/*--------------------------- function prototypes ----------------------------*/
+
+Rec_vitals * identify_first_data_record( char * );
+Ulong get_ndigit_hex( char *, int );
+
+
+/*----------------------------- Intel Hex format -----------------------------*/
+
+/*
+ * Intel Hex data-record layout
+ *
+ * :aabbbbccd...dee
+ *
+ * : - header character
+ * aa - record data byte count, a 2-digit hex value
+ * bbbb - record address, a 4-digit hex value
+ * cc - record type, a 2-digit hex value:
+ * "00" is a data record
+ * "01" is an end-of-data record
+ * "02" is an extended-address record
+ * "03" is a start record
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 2's complement
+ * [ (sum of bytes: aabbbbccd...d) modulo 256 ]
+ */
+
+
+Boolean is_intel_data_rec( char * rec_str )
+{
+ return( ( rec_str[ 0 ] == ':' ) && ( rec_str[ 8 ] == '0' ) );
+}
+
+Uint get_intel_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 1, 2 ) );
+}
+
+Ulong get_intel_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 3, 4 ) );
+}
+
+char * get_intel_rec_data_start( char * rec_str )
+{
+ return( rec_str + 9 );
+}
+
+void put_intel_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = count + ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ ":%02X%04lX00%s%02X\n", count, address, data_str, (~sum + 1) & 0xff
+ );
+}
+
+
+Rec_vitals intel_hex =
+{
+ is_intel_data_rec,
+ get_intel_rec_address,
+ get_intel_rec_data_count,
+ 255, /* Maximum data bytes in a record. */
+ get_intel_rec_data_start,
+ put_intel_data_rec
+};
+
+
+/*------------------------- Motorola S1-record format ------------------------*/
+
+/*
+ * Motorola S-record data-record layout
+ *
+ * Sabbc...cd...dee
+ *
+ * S - header character
+ * a - record type, a 1-digit value:
+ * "0" is a header record
+ * "1" is a 2-byte-address data record
+ * "2" is a 3-byte-address data record
+ * "3" is a 4-byte-address data record
+ * "7" is a 4-byte-address end-of-data record
+ * "8" is a 3-byte-address end-of-data record
+ * "9" is a 2-byte-address end-of-data record
+ * bb - record length in bytes, a 2-digit hex value
+ * (record length doesn't count the header/type
+ * chars and checksum byte)
+ * c...c - record address, a 4-, 6-, or 8-digit value,
+ * depending on record type
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 1's complement
+ * [ (sum of all bytes: bbc..cd...d) modulo 256 ]
+ */
+
+#define S1_COUNT_OFFSET 3
+
+
+Boolean is_moto_s1_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '1' ) );
+}
+
+Uint get_moto_s1_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S1_COUNT_OFFSET );
+}
+
+Ulong get_moto_s1_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 4 ) );
+}
+
+char * get_moto_s1_rec_data_start( char * rec_str )
+{
+ return( rec_str + 8 );
+}
+
+void put_moto_s1_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S1_COUNT_OFFSET + count +
+ ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S1%02X%04lX%s%02X\n",
+ count + S1_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s1_rec =
+{
+ is_moto_s1_data_rec,
+ get_moto_s1_rec_address,
+ get_moto_s1_rec_data_count,
+ MAX_LEN_S1_RECS, /* Maximum data bytes in a record. */
+ get_moto_s1_rec_data_start,
+ put_moto_s1_data_rec
+};
+
+
+/*------------------------- Motorola S2-record format ------------------------*/
+
+#define S2_COUNT_OFFSET 4
+
+Boolean is_moto_s2_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '2' ) );
+}
+
+Uint get_moto_s2_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S2_COUNT_OFFSET );
+}
+
+Ulong get_moto_s2_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 6 ) );
+}
+
+char * get_moto_s2_rec_data_start( char * rec_str )
+{
+ return( rec_str + 10 );
+}
+
+void put_moto_s2_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S2_COUNT_OFFSET + count + ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S2%02X%06lX%s%02X\n",
+ count + S2_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s2_rec =
+{
+ is_moto_s2_data_rec,
+ get_moto_s2_rec_address,
+ get_moto_s2_rec_data_count,
+ MAX_LEN_S2_RECS, /* Maximum data bytes in a record. */
+ get_moto_s2_rec_data_start,
+ put_moto_s2_data_rec
+};
+
+
+/*------------------------- Motorola S3-record format ------------------------*/
+
+#define S3_COUNT_OFFSET 5
+
+Boolean is_moto_s3_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '3' ) );
+}
+
+Uint get_moto_s3_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S3_COUNT_OFFSET );
+}
+
+Ulong get_moto_s3_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 8 ) );
+}
+
+char * get_moto_s3_rec_data_start( char * rec_str )
+{
+ return( rec_str + 12 );
+}
+
+void put_moto_s3_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S3_COUNT_OFFSET + count + ( address >> 24 & 0xff ) +
+ ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S3%02X%08lX%s%02X\n",
+ count + S3_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s3_rec =
+{
+ is_moto_s3_data_rec,
+ get_moto_s3_rec_address,
+ get_moto_s3_rec_data_count,
+ MAX_LEN_S3_RECS, /* Maximum data bytes in a record. */
+ get_moto_s3_rec_data_start,
+ put_moto_s3_data_rec
+};
+
+
+/*-------------------- Put your favorite hex format here ---------------------*/
+
+/*
+ * * * * The following is a template for an additional hex format: * * *
+ *
+ *
+ * Boolean is_X_data_rec( char * rec_str ) {}
+ *
+ * Uint get_X_rec_data_count( char * rec_str ) {}
+ *
+ * Ulong get_X_rec_address( char * rec_str ) {}
+ *
+ * char * get_X_rec_data_start( char * rec_str ) {}
+ *
+ * void put_X_data_rec( Uint count, Ulong address, char * data_str ) {}
+ *
+ * Rec_vitals X_rec =
+ * {
+ * is_X_data_rec,
+ * get_X_rec_address,
+ * get_X_rec_data_count,
+ * MAXIMUM DATA BYTES IN A RECORD,
+ * get_X_rec_data_start,
+ * put_X_data_rec
+ * };
+ *
+ */
+
+/*----------------------------------------------------------------------------*/
+
+
+/*
+ * Put address of additional Rec_vitals structures
+ * in this array, before the NULL entry.
+ */
+
+Rec_vitals *formats[] =
+{
+ &intel_hex,
+ &motorola_s1_rec,
+ &motorola_s2_rec,
+ &motorola_s3_rec,
+ ( Rec_vitals * ) NULL
+};
+
+
+/**** main *****************************************************************
+*
+*
+* Expects: Nothing (no command-line parameters).
+*
+* Returns: Exit status (EXIT_SUCCESS or EXIT_FAILURE).
+*
+* Reads hex records on the standard input and attempts to
+* splice adjacent data fields together. Results appear on
+* the standard output.
+*
+*******************************************************************************/
+
+void main( void )
+{
+
+ char inbuff[ MAX_LINE_SIZE ], outbuff[ MAX_LINE_SIZE ];
+ char *in_dptr, *out_dptr;
+ int d_total, d_count, d_excess, n;
+ Ulong in_rec_addr, out_rec_addr = 0;
+ Rec_vitals *rptr;
+
+
+ /* Sift through file until first hex record is identified. */
+ if ( ( rptr = identify_first_data_record( inbuff ) ) == NULL )
+ {
+ fputs( "No hex records found.\n", stderr );
+ exit( EXIT_FAILURE );
+ }
+
+
+ /* Attempt data-record splicing until end-of-file is reached. */
+ d_total = 0;
+ do
+ {
+ if ( rptr->is_data_record( inbuff ) == YES )
+ { /* Input record is a data record. */
+ d_count = rptr->get_data_count( inbuff );
+ in_rec_addr = rptr->get_address( inbuff );
+ in_dptr = rptr->get_data_start( inbuff );
+
+ if ( d_total == 0 || in_rec_addr != out_rec_addr + d_total )
+ { /* Begin a new output record. */
+ if ( d_total != 0 )
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ out_dptr = outbuff;
+ n = d_total = d_count;
+ out_rec_addr = in_rec_addr;
+ }
+ else if
+ ( ( d_excess = d_total + d_count - rptr->max_data_count ) > 0 )
+ { /* Output a maximum-length record, then start a new record. */
+ strncat( outbuff, in_dptr, 2 * ( d_count - d_excess ) );
+ rptr->put_data_record(
+ rptr->max_data_count, out_rec_addr, outbuff
+ );
+ in_dptr += 2 * ( d_count - d_excess );
+ out_dptr = outbuff;
+ n = d_total = d_excess;
+ out_rec_addr += rptr->max_data_count;
+ }
+ else
+ { /* Append input record's data field with accumulated data. */
+ out_dptr = outbuff + ( 2 * d_total );
+ d_total += n = d_count;
+ }
+ strncpy( out_dptr, in_dptr, 2 * n );
+ out_dptr[ 2 * n ] = EOS;
+ }
+ else
+ { /* Not a data record;
+ * flush accumulated data then echo non-data record.
+ */
+ if ( d_total != 0 )
+ {
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ d_total = 0;
+ }
+ puts( inbuff );
+ }
+ } while ( gets( inbuff ) != NULL );
+
+
+ exit( EXIT_SUCCESS );
+
+}
+
+
+/**** identify_first_data_record *******************************************
+*
+* Expects: Pointer to hex-record line buffer.
+*
+* Returns: Pointer to hex-record structure (NULL if no match found).
+*
+* Reads the standard input, line by line, searching for a valid
+* record header character. If a valid header is found, a pointer
+* to the hex-record's type structure is returned, otherwise NULL.
+*
+* The input-stream pointer is left pointing to the first valid hex record.
+*
+*******************************************************************************/
+
+Rec_vitals * identify_first_data_record( char * buff_ptr )
+{
+ Rec_vitals ** ptr;
+
+ while ( gets( buff_ptr ) != NULL )
+ {
+ for ( ptr = formats ; *ptr != ( Rec_vitals * ) NULL ; ptr++ )
+ if ( ( *ptr )->is_data_record( buff_ptr ) == YES )
+ return( *ptr ); /* Successful return. */
+
+ puts( buff_ptr ); /* Echo non-hex-record line. */
+ }
+
+ return( ( Rec_vitals * ) NULL ); /* Unsuccessful return. */
+}
+
+
+/**** get_ndigit_hex *******************************************************
+*
+* Expects: Pointer to first ASCII hexadecimal digit, number of digits.
+*
+* Returns: Value of hexadecimal string as an unsigned long.
+*
+*******************************************************************************/
+
+Ulong get_ndigit_hex( char * cptr, int digits )
+{
+ Ulong value;
+
+ for ( value = 0 ; --digits >= 0 ; cptr++ )
+ value = ( value * 16L ) + HEX_DIGIT( *cptr );
+
+ return( value );
+}
diff --git a/tools/build/scripts/Makefile.in b/tools/build/scripts/Makefile.in
new file mode 100644
index 0000000000..7f2db3462c
--- /dev/null
+++ b/tools/build/scripts/Makefile.in
@@ -0,0 +1,34 @@
+#
+# $Id$
+#
+# RTEMS build tools
+# NOTE: of course we can't use any of these tools
+# in this Makefile. Most notably: install-if-change
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/build-tools
+
+PGMS=hackspecs.awk install-if-change rcs-clean \
+ lock-directory unlock-directory rtems-glom
+
+INSTALLED=$(PGMS:%=$(DESTDIR)/%)
+
+all: $(DESTDIR) $(PGMS) install
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
diff --git a/tools/build/scripts/README b/tools/build/scripts/README
new file mode 100644
index 0000000000..0436fc958d
--- /dev/null
+++ b/tools/build/scripts/README
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+
+Misc. support tools for RTEMS workspaces.
+More will be added later as they are converted from Teamware
+to CVS.
+
+install-if-change
+ Smart install script that also can append suffixes as it
+ installs (suffixes used for debug and profile variants).
+ Requires bash or ksh.
+
+rcs-clean
+ deletes all files from the current directory that can be
+ re-created from RCS. Careful to not delete locked files.
+ May be used by 'gmake clobber'
+
+lock-directory
+unlock-directory
+ traverse a directory structure making it unwritable.
+ Useful to keep people from accidentally overwriting
+ "released" trees if they get confused about which
+ module they have loaded.
+
+rtems-glom
+ glom together all the rtems libraries in order to simplify
+ the link line used by applications.
+ Produces rtems.rel.
+ Not used by the RTEMS src tree at all.
+ Strictly optional.
+
diff --git a/tools/build/src/Makefile.in b/tools/build/src/Makefile.in
new file mode 100644
index 0000000000..f6c3135d54
--- /dev/null
+++ b/tools/build/src/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+libdir = @libdir@
+includedir = @includedir@
+manext = 1
+mandir = @mandir@/man$(manext)
+
+
+VPATH=@srcdir@
+
+
+# we use host compiler in this directory
+USE_HOST_COMPILER=yes
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=cklength eolstrip packhex unhex
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=$(ARCH)/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(CC_FILES) $(H_FILES)
+OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES)
+
+PGMS=$(ARCH)/cklength $(ARCH)/eolstrip $(ARCH)/packhex $(ARCH)/unhex
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS +=
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here. The config files
+# already know how to delete some stuff, so you may want
+# to just run 'make clean' first to see what gets missed.
+# 'make clobber' already includes 'make clean'
+#
+
+CLEAN_ADDITIONS += $(HOST_ARCH)
+CLOBBER_ADDITIONS +=
+
+all: $(ARCH) $(SRCS) $(PGMS)
+ $(INSTALL_VARIANT) -m 555 $(PGMS) ${PROJECT_RELEASE}/build-tools
diff --git a/tools/build/src/cklength.c b/tools/build/src/cklength.c
new file mode 100644
index 0000000000..6059cacb1f
--- /dev/null
+++ b/tools/build/src/cklength.c
@@ -0,0 +1,364 @@
+/*
+ * cklength - check the length of lines in a file
+ *
+ * This program check to see if the files passed to it on the command line
+ * contain a line which exceeds the maximum allowable length. The default
+ * maximum line length is 80.
+ *
+ * usage: cklength [ -v ] [ arg ... ] files...
+ * -l length -- maximum line length
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "l:nNv"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -l length -- maximum line length\n\
+ -n -- report line numbers for offending lines\n\
+ -N -- report line numbers and length for offending lines\n\
+ -v -- verbose\n\
+\n\
+Print the name of files which have at least 1 line which exceeds the\n\
+maximum line length. The default maximum line length is 80.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 512
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int report_line_numbers = FALSE; /* report line numbers of offenders */
+int report_line_length = FALSE; /* report line length of offenders */
+
+int line_length = 80; /* maximum allowable line length */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 'l': /* line length */
+ line_length = atoi( optarg );
+ if ( line_length < 0 || line_length > BUFFER_SIZE )
+ error(ERR_FATAL, "(%d) is illegal line length\n",line_length);
+ break;
+
+ case 'n': /* toggle report_line_numbers */
+ report_line_numbers = ! report_line_numbers;
+ break;
+
+ case 'N': /* toggle both reports */
+ report_line_numbers = ! report_line_numbers;
+ report_line_length = ! report_line_length;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int line_number;
+ int length;
+ int count;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ count = 0;
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( length <= line_length )
+ continue;
+
+ if ( count == 0 ) {
+ fprintf( stderr, "%s\n", arg );
+ if ( !report_line_numbers )
+ break;
+ }
+
+ if ( verbose )
+ fprintf( stderr, "TOO LONG:%d: %s\n", line_number, buffer );
+
+ if ( report_line_numbers ) {
+ if ( report_line_length )
+ fprintf( stderr, "%d: %d\n" , line_number, length );
+ else
+ fprintf( stderr, "%d\n" , line_number );
+ }
+
+ count++;
+
+ }
+
+ fclose( in );
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/tools/build/src/eolstrip.c b/tools/build/src/eolstrip.c
new file mode 100644
index 0000000000..b4e0d5d165
--- /dev/null
+++ b/tools/build/src/eolstrip.c
@@ -0,0 +1,351 @@
+/*
+ * eolstrip - strip white space from end of lines
+ *
+ * This program strips the white space from the end of every line in the
+ * specified program.
+ *
+ * usage: eolstrip [ -v ] [ arg ... ] files...
+ * -v -- verbose
+ *
+ * $Id$
+ */
+
+#define GETOPTARGS "vt"
+
+char *USAGE = "\
+usage: cklength [ -v ] [ arg ... ] files... \n\
+ -v -- verbose\n\
+ -t -- test only .. DO NOT OVERWRITE FILE!!!\n\
+\n\
+Strip the white space from the end of every line on the list of files.\n\
+";
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <memory.h>
+#include <stdarg.h>
+
+#define BUFFER_SIZE 2048
+#define MAX_PATH 2048
+
+#define SUCCESS 0
+#define FAILURE -1
+#define Failed(x) (((int) (x)) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+#define STREQ(a,b) (strcmp(a,b) == 0)
+#define NUMELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
+
+/*
+ * Definitions for unsigned "ints"; especially for use in data structures
+ * that will be shared among (potentially) different cpu's (we punt on
+ * byte ordering problems tho)
+ */
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * vars controlled by command line options
+ */
+
+int verbose = FALSE; /* be verbose */
+int test_only = FALSE; /* test only */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind, opterr;
+extern int errno;
+
+char *progname; /* for error() */
+
+int process(char *arg);
+void error(int errn, ...);
+long getparm(char *s, long min, long max, char *msg);
+
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* fatal error ; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* fatal error ; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#define stol(p) strtol(p, (char **) NULL, 0)
+int Open(), Read(), Write();
+
+int
+main(int argc, char **argv, char **env)
+{
+ register int c;
+ int showusage = FALSE; /* usage error? */
+ int rc = 0;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ opterr = 0; /* we'll report all errors */
+ while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
+ switch (c)
+ {
+ case 't': /* toggle test only mode */
+ test_only = ! test_only;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ /*
+ * traverse and process the arguments
+ */
+
+ for ( ; argv[optind]; optind++)
+ if (Failed(process(argv[optind])))
+ rc = FAILURE;
+
+ return rc;
+}
+
+
+/*
+ * process(arg)
+ */
+
+int
+process(char *arg)
+{
+ FILE *in;
+ FILE *out = (FILE *) 0;
+ char outname[ MAX_PATH ];
+ char *bptr;
+ char buffer[ BUFFER_SIZE ];
+ int length;
+ int line_number;
+ int rc = SUCCESS; /* succeed by default */
+
+ in = fopen( arg, "r" );
+ if (!in)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+
+ if ( !test_only ) {
+ sprintf( outname, "%s.eoltmp", arg );
+
+ out = fopen( outname, "w" );
+ if (!out)
+ error( ERR_ERRNO | ERR_FATAL, "Unable to open file (%s)\n", arg );
+ }
+
+ if ( verbose )
+ fprintf( stderr, "Processing %s\n", arg );
+
+ for ( line_number=1 ; ; line_number++ ) {
+ bptr = fgets( buffer, BUFFER_SIZE, in );
+ if (!bptr)
+ break;
+
+ /*
+ * Don't count the carriage return.
+ */
+
+ length = strlen( buffer ) - 1;
+
+ if ( buffer[ length ] != '\n' )
+ error(ERR_ERRNO|ERR_FATAL, "Line %d too long in %s\n", line_number, arg);
+
+ while ( isspace( buffer[ length ] ) )
+ buffer[ length-- ] = '\0';
+
+ if ( test_only ) {
+ fprintf( stderr, "%s\n", arg );
+ break;
+ }
+
+ fprintf( out, "%s\n", buffer );
+ }
+
+ fclose( in );
+ if ( !test_only ) {
+ fclose( out );
+ rename( outname, arg );
+ }
+ return rc;
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_FATAL bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
+long
+getparm(char *s,
+ long min,
+ long max,
+ char *msg)
+{
+ long val;
+
+ if ( ! strchr("0123456789-", *s))
+ {
+ error(ERR_FATAL, "'%s' is not a number", s);
+ return min;
+ }
+
+ val = strtol(s, (char **) NULL, 0);
+ if ((val < min) || (val > max))
+ {
+ if (min == max)
+ error(ERR_FATAL, "%s can only be %ld", s, min);
+ else
+ error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
+ }
+
+ return val;
+}
+
+
+/*
+ * Open()
+ * Perform open(2), returning the file descriptor. Prints
+ * error message if open fails.
+ */
+
+int
+Open(char *file,
+ int oflag,
+ int mode)
+{
+ int O_fd;
+
+ if (Failed(O_fd = open(file, oflag, mode)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "open('%s', 0x%x, 0%o) failed", file, oflag, mode
+ );
+
+ return O_fd;
+}
+
+/*
+ * Read()
+ * Perform read(2); prints error message if fails.
+ */
+
+int
+Read(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = read(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "read(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
+
+/*
+ * Write()
+ * Perform write(2); prints error message if fails.
+ */
+
+int
+Write(int file,
+ char *buffer,
+ unsigned int count)
+{
+ int nbytes;
+
+ if (Failed(nbytes = write(file, buffer, count)))
+ error(
+ ERR_ERRNO | ERR_FATAL,
+ "write(%d, 0x%x, %d) failed", file, buffer, count
+ );
+
+ return nbytes;
+}
diff --git a/tools/build/src/packhex.c b/tools/build/src/packhex.c
new file mode 100644
index 0000000000..ddd010c4a9
--- /dev/null
+++ b/tools/build/src/packhex.c
@@ -0,0 +1,513 @@
+
+/***** P A C K H E X . C ************************************************
+ *
+ * Packhex is a hex-file compaction utility. It attempts to concatenate
+ * hex records to produce more size-efficient packaging.
+ *
+ * Limitations: Input files must be correctly formatted. This utility
+ * is not robust enough to detect hex-record formatting
+ * errors.
+ *
+ * Published: 5/93 Embedded Systems magazine
+ *
+ * Compiler: Microsoft C 6.0
+ * cl /F 1000 packhex.c
+ *
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+/* #define SMALLER_RECORDS */
+#ifdef SMALLER_RECORDS
+#define MAX_LEN_S1_RECS 128
+#define MAX_LEN_S2_RECS 128
+#define MAX_LEN_S3_RECS 128
+#else
+#define MAX_LEN_S1_RECS 252
+#define MAX_LEN_S2_RECS 251
+#define MAX_LEN_S3_RECS 250
+#endif
+
+
+/*--------------------------------- includes ---------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(__unix__) && !defined(EXIT_FAILURE)
+#define EXIT_FAILURE -1
+#define EXIT_SUCCESS 0
+#endif
+
+/*--------------------------------- defines ----------------------------------*/
+
+#define YES 1
+#define MAX_LINE_SIZE 600
+#define EOS '\0'
+
+
+/*---------------------------------- macros ----------------------------------*/
+
+/* Convert ASCII hexadecimal digit to value. */
+
+#define HEX_DIGIT( C ) ( ( ( ( C ) > '9' ) ? ( C ) + 25 : ( C ) ) & 0xF )
+
+
+/*--------------------------------- typedefs ---------------------------------*/
+
+typedef unsigned char Boolean;
+typedef unsigned char Uchar;
+typedef unsigned int Uint;
+typedef unsigned long Ulong;
+
+typedef struct /* Functions and constant returning Hex-record vital stats. */
+{
+ Boolean ( *is_data_record )( char * );
+ Ulong ( *get_address )( char * );
+ Uint ( *get_data_count )( char * );
+ const Uint max_data_count;
+ char *( *get_data_start )( char * );
+ void ( *put_data_record )( Uint, Ulong, char * );
+} Rec_vitals;
+
+
+/*--------------------------- function prototypes ----------------------------*/
+
+Rec_vitals * identify_first_data_record( char * );
+Ulong get_ndigit_hex( char *, int );
+
+
+/*----------------------------- Intel Hex format -----------------------------*/
+
+/*
+ * Intel Hex data-record layout
+ *
+ * :aabbbbccd...dee
+ *
+ * : - header character
+ * aa - record data byte count, a 2-digit hex value
+ * bbbb - record address, a 4-digit hex value
+ * cc - record type, a 2-digit hex value:
+ * "00" is a data record
+ * "01" is an end-of-data record
+ * "02" is an extended-address record
+ * "03" is a start record
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 2's complement
+ * [ (sum of bytes: aabbbbccd...d) modulo 256 ]
+ */
+
+
+Boolean is_intel_data_rec( char * rec_str )
+{
+ return( ( rec_str[ 0 ] == ':' ) && ( rec_str[ 8 ] == '0' ) );
+}
+
+Uint get_intel_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 1, 2 ) );
+}
+
+Ulong get_intel_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 3, 4 ) );
+}
+
+char * get_intel_rec_data_start( char * rec_str )
+{
+ return( rec_str + 9 );
+}
+
+void put_intel_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = count + ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ ":%02X%04lX00%s%02X\n", count, address, data_str, (~sum + 1) & 0xff
+ );
+}
+
+
+Rec_vitals intel_hex =
+{
+ is_intel_data_rec,
+ get_intel_rec_address,
+ get_intel_rec_data_count,
+ 255, /* Maximum data bytes in a record. */
+ get_intel_rec_data_start,
+ put_intel_data_rec
+};
+
+
+/*------------------------- Motorola S1-record format ------------------------*/
+
+/*
+ * Motorola S-record data-record layout
+ *
+ * Sabbc...cd...dee
+ *
+ * S - header character
+ * a - record type, a 1-digit value:
+ * "0" is a header record
+ * "1" is a 2-byte-address data record
+ * "2" is a 3-byte-address data record
+ * "3" is a 4-byte-address data record
+ * "7" is a 4-byte-address end-of-data record
+ * "8" is a 3-byte-address end-of-data record
+ * "9" is a 2-byte-address end-of-data record
+ * bb - record length in bytes, a 2-digit hex value
+ * (record length doesn't count the header/type
+ * chars and checksum byte)
+ * c...c - record address, a 4-, 6-, or 8-digit value,
+ * depending on record type
+ * d...d - data (always an even number of chars)
+ * ee - record checksum, a 2-digit hex value
+ * checksum = 1's complement
+ * [ (sum of all bytes: bbc..cd...d) modulo 256 ]
+ */
+
+#define S1_COUNT_OFFSET 3
+
+
+Boolean is_moto_s1_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '1' ) );
+}
+
+Uint get_moto_s1_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S1_COUNT_OFFSET );
+}
+
+Ulong get_moto_s1_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 4 ) );
+}
+
+char * get_moto_s1_rec_data_start( char * rec_str )
+{
+ return( rec_str + 8 );
+}
+
+void put_moto_s1_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S1_COUNT_OFFSET + count +
+ ( address >> 8 & 0xff ) + ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S1%02X%04lX%s%02X\n",
+ count + S1_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s1_rec =
+{
+ is_moto_s1_data_rec,
+ get_moto_s1_rec_address,
+ get_moto_s1_rec_data_count,
+ MAX_LEN_S1_RECS, /* Maximum data bytes in a record. */
+ get_moto_s1_rec_data_start,
+ put_moto_s1_data_rec
+};
+
+
+/*------------------------- Motorola S2-record format ------------------------*/
+
+#define S2_COUNT_OFFSET 4
+
+Boolean is_moto_s2_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '2' ) );
+}
+
+Uint get_moto_s2_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S2_COUNT_OFFSET );
+}
+
+Ulong get_moto_s2_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 6 ) );
+}
+
+char * get_moto_s2_rec_data_start( char * rec_str )
+{
+ return( rec_str + 10 );
+}
+
+void put_moto_s2_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S2_COUNT_OFFSET + count + ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S2%02X%06lX%s%02X\n",
+ count + S2_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s2_rec =
+{
+ is_moto_s2_data_rec,
+ get_moto_s2_rec_address,
+ get_moto_s2_rec_data_count,
+ MAX_LEN_S2_RECS, /* Maximum data bytes in a record. */
+ get_moto_s2_rec_data_start,
+ put_moto_s2_data_rec
+};
+
+
+/*------------------------- Motorola S3-record format ------------------------*/
+
+#define S3_COUNT_OFFSET 5
+
+Boolean is_moto_s3_data_rec( char * rec_str )
+{
+ return ( ( rec_str[ 0 ] == 'S' ) && ( rec_str[ 1 ] == '3' ) );
+}
+
+Uint get_moto_s3_rec_data_count( char * rec_str )
+{
+ return( ( Uint ) get_ndigit_hex( rec_str + 2, 2 ) - S3_COUNT_OFFSET );
+}
+
+Ulong get_moto_s3_rec_address( char * rec_str )
+{
+ return( get_ndigit_hex( rec_str + 4, 8 ) );
+}
+
+char * get_moto_s3_rec_data_start( char * rec_str )
+{
+ return( rec_str + 12 );
+}
+
+void put_moto_s3_data_rec( Uint count, Ulong address, char * data_str )
+{
+ char *ptr;
+ Uint sum = S3_COUNT_OFFSET + count + ( address >> 24 & 0xff ) +
+ ( address >> 16 & 0xff ) +
+ ( address >> 8 & 0xff ) +
+ ( address & 0xff );
+
+ for ( ptr = data_str ; *ptr != EOS ; ptr += 2 )
+ sum += ( Uint ) get_ndigit_hex( ptr, 2 );
+
+ printf(
+ "S3%02X%08lX%s%02X\n",
+ count + S3_COUNT_OFFSET, address, data_str, ~sum & 0xff
+ );
+}
+
+
+Rec_vitals motorola_s3_rec =
+{
+ is_moto_s3_data_rec,
+ get_moto_s3_rec_address,
+ get_moto_s3_rec_data_count,
+ MAX_LEN_S3_RECS, /* Maximum data bytes in a record. */
+ get_moto_s3_rec_data_start,
+ put_moto_s3_data_rec
+};
+
+
+/*-------------------- Put your favorite hex format here ---------------------*/
+
+/*
+ * * * * The following is a template for an additional hex format: * * *
+ *
+ *
+ * Boolean is_X_data_rec( char * rec_str ) {}
+ *
+ * Uint get_X_rec_data_count( char * rec_str ) {}
+ *
+ * Ulong get_X_rec_address( char * rec_str ) {}
+ *
+ * char * get_X_rec_data_start( char * rec_str ) {}
+ *
+ * void put_X_data_rec( Uint count, Ulong address, char * data_str ) {}
+ *
+ * Rec_vitals X_rec =
+ * {
+ * is_X_data_rec,
+ * get_X_rec_address,
+ * get_X_rec_data_count,
+ * MAXIMUM DATA BYTES IN A RECORD,
+ * get_X_rec_data_start,
+ * put_X_data_rec
+ * };
+ *
+ */
+
+/*----------------------------------------------------------------------------*/
+
+
+/*
+ * Put address of additional Rec_vitals structures
+ * in this array, before the NULL entry.
+ */
+
+Rec_vitals *formats[] =
+{
+ &intel_hex,
+ &motorola_s1_rec,
+ &motorola_s2_rec,
+ &motorola_s3_rec,
+ ( Rec_vitals * ) NULL
+};
+
+
+/**** main *****************************************************************
+*
+*
+* Expects: Nothing (no command-line parameters).
+*
+* Returns: Exit status (EXIT_SUCCESS or EXIT_FAILURE).
+*
+* Reads hex records on the standard input and attempts to
+* splice adjacent data fields together. Results appear on
+* the standard output.
+*
+*******************************************************************************/
+
+void main( void )
+{
+
+ char inbuff[ MAX_LINE_SIZE ], outbuff[ MAX_LINE_SIZE ];
+ char *in_dptr, *out_dptr;
+ int d_total, d_count, d_excess, n;
+ Ulong in_rec_addr, out_rec_addr = 0;
+ Rec_vitals *rptr;
+
+
+ /* Sift through file until first hex record is identified. */
+ if ( ( rptr = identify_first_data_record( inbuff ) ) == NULL )
+ {
+ fputs( "No hex records found.\n", stderr );
+ exit( EXIT_FAILURE );
+ }
+
+
+ /* Attempt data-record splicing until end-of-file is reached. */
+ d_total = 0;
+ do
+ {
+ if ( rptr->is_data_record( inbuff ) == YES )
+ { /* Input record is a data record. */
+ d_count = rptr->get_data_count( inbuff );
+ in_rec_addr = rptr->get_address( inbuff );
+ in_dptr = rptr->get_data_start( inbuff );
+
+ if ( d_total == 0 || in_rec_addr != out_rec_addr + d_total )
+ { /* Begin a new output record. */
+ if ( d_total != 0 )
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ out_dptr = outbuff;
+ n = d_total = d_count;
+ out_rec_addr = in_rec_addr;
+ }
+ else if
+ ( ( d_excess = d_total + d_count - rptr->max_data_count ) > 0 )
+ { /* Output a maximum-length record, then start a new record. */
+ strncat( outbuff, in_dptr, 2 * ( d_count - d_excess ) );
+ rptr->put_data_record(
+ rptr->max_data_count, out_rec_addr, outbuff
+ );
+ in_dptr += 2 * ( d_count - d_excess );
+ out_dptr = outbuff;
+ n = d_total = d_excess;
+ out_rec_addr += rptr->max_data_count;
+ }
+ else
+ { /* Append input record's data field with accumulated data. */
+ out_dptr = outbuff + ( 2 * d_total );
+ d_total += n = d_count;
+ }
+ strncpy( out_dptr, in_dptr, 2 * n );
+ out_dptr[ 2 * n ] = EOS;
+ }
+ else
+ { /* Not a data record;
+ * flush accumulated data then echo non-data record.
+ */
+ if ( d_total != 0 )
+ {
+ rptr->put_data_record( d_total, out_rec_addr, outbuff );
+ d_total = 0;
+ }
+ puts( inbuff );
+ }
+ } while ( gets( inbuff ) != NULL );
+
+
+ exit( EXIT_SUCCESS );
+
+}
+
+
+/**** identify_first_data_record *******************************************
+*
+* Expects: Pointer to hex-record line buffer.
+*
+* Returns: Pointer to hex-record structure (NULL if no match found).
+*
+* Reads the standard input, line by line, searching for a valid
+* record header character. If a valid header is found, a pointer
+* to the hex-record's type structure is returned, otherwise NULL.
+*
+* The input-stream pointer is left pointing to the first valid hex record.
+*
+*******************************************************************************/
+
+Rec_vitals * identify_first_data_record( char * buff_ptr )
+{
+ Rec_vitals ** ptr;
+
+ while ( gets( buff_ptr ) != NULL )
+ {
+ for ( ptr = formats ; *ptr != ( Rec_vitals * ) NULL ; ptr++ )
+ if ( ( *ptr )->is_data_record( buff_ptr ) == YES )
+ return( *ptr ); /* Successful return. */
+
+ puts( buff_ptr ); /* Echo non-hex-record line. */
+ }
+
+ return( ( Rec_vitals * ) NULL ); /* Unsuccessful return. */
+}
+
+
+/**** get_ndigit_hex *******************************************************
+*
+* Expects: Pointer to first ASCII hexadecimal digit, number of digits.
+*
+* Returns: Value of hexadecimal string as an unsigned long.
+*
+*******************************************************************************/
+
+Ulong get_ndigit_hex( char * cptr, int digits )
+{
+ Ulong value;
+
+ for ( value = 0 ; --digits >= 0 ; cptr++ )
+ value = ( value * 16L ) + HEX_DIGIT( *cptr );
+
+ return( value );
+}
diff --git a/tools/build/src/unhex.c b/tools/build/src/unhex.c
new file mode 100644
index 0000000000..a75ba8e665
--- /dev/null
+++ b/tools/build/src/unhex.c
@@ -0,0 +1,725 @@
+/*
+ * unhex
+ * convert a hex file to binary equivalent. If more than one file name
+ * is given, then the output will be logically concatenated together.
+ * stdin and stdout are defaults. Verbose will enable checksum output.
+ *
+ * Supported input formats are Intel hex, Motorola S records, and TI 'B'
+ * records.
+ *
+ * Intel hex input format is
+ * Byte
+ * 1 Colon :
+ * 2..3 Record length, eg: "20"
+ * 4..7 load address nibbles
+ * 8..9 record type: "00" (data) or "02" base addr
+ * 10..x data bytes in ascii-hex
+ * x+1..x+2 cksum (2's compl of (len+addr+data))
+ * x+3 \n -- newline
+ *
+ * $Id$
+ */
+
+char *USAGE = "\
+usage: unhex [-va] [ -o file ] [ file [file ... ] ]\n\
+ -v -- verbose\n\
+ -a base -- 1st byte of output corresponds to this address\n\
+ -l -- linear, just writes data out\n\
+ -o file -- output file; must not be input file\n\
+ -F k_bits -- \"holes\" in input will be filled with 0xFF's\n\
+ up to \"k_bits\" * 1024 bits\n\
+";
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define OK 0
+#define FAILURE (-1)
+#define Failed(x) ((x) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+typedef char bool;
+#define STREQ(a,b) (strcmp(a,b) == 0)
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * Pick out designated bytes
+ */
+
+#define B0(x) ((x) & 0xff)
+#define B1(x) B0((x) >> 8)
+#define B2(x) B0((x) >> 16)
+#define B3(x) B0((x) >> 24)
+
+typedef struct buffer_rec {
+ u32 dl_destaddr;
+ u32 dl_jumpaddr;
+ int dl_count;
+ u8 dl_buf[512];
+} buffer_rec;
+
+/*
+ * vars controlled by command line options
+ */
+
+bool verbose = FALSE; /* be verbose */
+bool linear = FALSE; /* just write out linear data */
+char *outfilename = "-"; /* default output is stdout */
+u32 base = 0L; /* base address */
+u32 FFfill = 0L; /* how far to fill w 0xFF's */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind;
+extern int errno;
+
+char *progname; /* for error() */
+
+void error(int errn, ...);
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* error is fatal; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#ifdef HAVE_STRTOUL
+#define stol(p) strtoul(p, (char **) NULL, 0)
+#else
+#define stol(p) strtol(p, (char **) NULL, 0)
+#endif
+
+int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_S_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_TI_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+void write_record(buffer_rec *tb, FILE *fp);
+int getnibble(char **p);
+int getbyte(char **p);
+long getNbytes(char **p, int n);
+void badformat(char *s, char *fname, char *msg);
+
+#define get1bytes(p) ((int) getbyte(p))
+#define get2bytes(p) ((int) getNbytes(p, 2))
+#define get3bytes(p) getNbytes(p, 3)
+#define get4bytes(p) getNbytes(p, 4)
+
+char *BADADDR = "Invalid record address";
+char *BADLEN = "Invalid record length";
+char *BADBASE = "Bad base or starting address";
+char *BADFMT = "Unrecognized record type";
+char *BADDATA = "Invalid data byte";
+char *BADCSUM = "Invalid checksum";
+char *MISCSUM = "Checksum mismatch";
+char *BADTYPE = "Unrecognized record type";
+char *MISTYPE = "Incompatible record types";
+
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+ register int c;
+ bool showusage = FALSE; /* usage error? */
+ int rc = 0;
+ FILE *outfp, *infp;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ progname = argv[0];
+ while ((c = getopt(argc, argv, "F:a:o:vl")) != EOF)
+ switch (c)
+ {
+ case 'a': /* base address */
+ base = stol(optarg);
+ break;
+
+ case 'l': /* linear output */
+ linear = TRUE;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case 'o': /* output file */
+ outfilename = optarg;
+ break;
+
+ case 'F': /* 0xFF fill amount (bytes) */
+ FFfill = stol(optarg) * 1024L / 8L;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ if (linear && (base != 0))
+ {
+ error(0, "-l and -a may not be specified in combination");
+ exit(1);
+ }
+
+ if (STREQ(outfilename, "-"))
+ {
+ outfp = stdout;
+ outfilename = "stdout";
+ }
+ else
+ if ((outfp = fopen(outfilename, "w")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for output", outfilename);
+ exit(1);
+ }
+
+ /*
+ * Now process the input files (or stdin, if none specified)
+ */
+
+ if (argv[optind] == (char *) NULL) /* just stdin */
+ exit(unhex(stdin, "stdin", outfp, outfilename));
+ else
+ for (; (optarg = argv[optind]); optind++)
+ {
+ if (STREQ(optarg, "-"))
+ rc += unhex(stdin, "stdin", outfp, outfilename);
+ else
+ {
+ if ((infp = fopen(optarg, "r")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for input", optarg);
+ exit(1);
+ }
+ rc += unhex(infp, optarg, outfp, outfilename);
+ }
+ }
+
+ return(rc);
+}
+
+u16 filesum;
+
+int
+unhex(FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ int c;
+
+ filesum = 0;
+
+ /*
+ * Make sure holes will be filled with 0xFF's if requested. We
+ * do this the easy way by just filling the file with FF's before
+ * getting started. To do it more optimally would be quite a bit
+ * more difficult since the user can skip around as much as he/she
+ * likes in the input hex file addressing.
+ *
+ * We'll clean this up later (after this program has run) with
+ * 'stripffs'
+ */
+
+ if (FFfill)
+ {
+ (void) fseek(ofp, 0, 0);
+ for (c = FFfill; c > 0; c--)
+ (void) fputc(0xFF, ofp);
+ }
+
+ /*
+ * Read the first char from file and determine record types
+ */
+
+ if ((c = getc(ifp)) != EOF)
+ {
+ ungetc(c, ifp);
+ switch(c)
+ {
+ case 'S':
+ convert_S_records(ifp, inm, ofp, onm);
+ break;
+
+ case ':':
+ convert_Intel_records(ifp, inm, ofp, onm);
+ break;
+
+ case '9':
+ case 'B':
+ convert_TI_records(ifp, inm, ofp, onm);
+ break;
+
+ default:
+ {
+ char tmp[2];
+ tmp[0] = c; tmp[1] = 0;
+ badformat(tmp, inm, BADFMT);
+ }
+ }
+ }
+
+ if (verbose)
+ fprintf(stderr, "'%s' checksum is 0x%04x\n", inm, filesum);
+
+ return 0;
+}
+
+int
+convert_Intel_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int rectype; /* record type */
+ int len; /* data length of current line */
+ u32 addr;
+ u32 base_address = 0;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != ':')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+
+ if ((addr = get2bytes(&p)) == -1L) /* record addr */
+ badformat(buff, inm, BADADDR);
+
+ rectype = getbyte(&p);
+
+ cksum = len + B0(addr) + B1(addr) + rectype;
+
+ switch (rectype)
+ {
+ case 0x00: /* normal data record */
+ tb.dl_destaddr = base_address + addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x01: /* execution start address */
+ base_address = addr;
+ endrecord = TRUE;
+ break;
+
+ case 0x02: /* new base */
+ if ((base_address = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADBASE);
+ cksum += B0(base_address) + B1(base_address);
+ base_address <<= 4;
+ break;
+
+ case 0x03: /* seg/off execution start address */
+ {
+ u32 seg, off;
+
+ seg = get2bytes(&p);
+ off = get2bytes(&p);
+ if ((seg == -1L) || (off == -1L))
+ badformat(buff, inm, BADADDR);
+
+ cksum += B0(seg) + B1(seg) + B0(off) + B1(off);
+
+ tb.dl_jumpaddr = (seg << 4) + off;
+ break;
+ }
+
+ default:
+ error(0, "unknown Intel-hex record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (-cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_S_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int len; /* data length of current line */
+ int rectype; /* record type */
+ u32 addr;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != 'S')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((rectype = getnibble(&p)) == -1) /* record type */
+ badformat(buff, inm, BADTYPE);
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+ cksum = len;
+
+ switch (rectype)
+ {
+ case 0x00: /* comment field, ignored */
+ goto write_it;
+
+ case 0x01: /* data record, 16 bit addr */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 3;
+ goto doit;
+
+ case 0x02: /* ... 24 bit addr */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 4;
+ goto doit;
+
+ case 0x03: /* ... 32 bit addr */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 5;
+ doit:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+
+ tb.dl_destaddr = addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x07: /* 32 bit end record */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x08: /* 24 bit end record */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x09: /* 16 bit end record */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+
+end_rec:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+ tb.dl_jumpaddr = addr;
+ break;
+
+ default:
+ error(0, "unknown Motorola-S record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ break;
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (~cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+write_it:
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_TI_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ int c;
+ bool endrecord = FALSE;
+ bool eol;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ p = &buff[0];
+ eol = FALSE;
+ while ( ! eol && ! endrecord)
+ {
+ switch (*p++)
+ {
+ case '9':
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ tb.dl_destaddr = get2bytes(&p);
+ break;
+
+ case 'B':
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ break;
+
+ case 'F':
+ eol = TRUE;
+ break;
+
+ case ':':
+ endrecord = TRUE;
+ break;
+
+ default:
+ badformat(p, inm, BADFMT);
+ }
+ }
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+void
+write_record(buffer_rec *tb,
+ FILE *fp)
+{
+ if ( ! linear)
+ {
+ if (tb->dl_destaddr < base)
+ error(ERR_FATAL, "record at address 0x%x precedes base of 0x%x",
+ tb->dl_destaddr, base);
+ (void) fseek(fp, tb->dl_destaddr - base, 0);
+ }
+
+ (void) fwrite(tb->dl_buf, tb->dl_count, 1, fp);
+ tb->dl_destaddr += tb->dl_count;
+ tb->dl_count = 0;
+}
+
+int
+getnibble(char **p)
+{
+ register int val;
+
+ **p = toupper(**p);
+ switch (**p)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ val = **p - '0';
+ break;
+
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ val = 10 + (**p - 'A');
+ break;
+
+ default:
+ return(-1);
+ }
+ *p += 1;
+
+ return(val & 0x0f);
+}
+
+int
+getbyte(char **p)
+{
+ int n0, n1;
+
+ if ((n0 = getnibble(p)) == -1)
+ return(-1);
+ if ((n1 = getnibble(p)) == -1)
+ return(-1);
+
+ return(((n0 << 4) + n1) & 0xff);
+}
+
+long
+getNbytes(char **p,
+ int n)
+{
+ int t;
+ u32 val = 0;
+
+ while (n--)
+ {
+ if ((t = getbyte(p)) == -1)
+ return(-1L);
+ val <<= 8;
+ val += t;
+ }
+
+ return(val);
+}
+
+void
+badformat(char *s,
+ char *fname,
+ char *msg)
+{
+ if (s[strlen(s)-1] == '\n') /* get rid of newline */
+ s[strlen(s)-1] = '\0';
+ error(0, "line '%s'::\n\tfrom file '%s'; %s", s, fname, msg);
+ exit(1);
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_EXIT bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
diff --git a/tools/build/unhex.c b/tools/build/unhex.c
new file mode 100644
index 0000000000..a75ba8e665
--- /dev/null
+++ b/tools/build/unhex.c
@@ -0,0 +1,725 @@
+/*
+ * unhex
+ * convert a hex file to binary equivalent. If more than one file name
+ * is given, then the output will be logically concatenated together.
+ * stdin and stdout are defaults. Verbose will enable checksum output.
+ *
+ * Supported input formats are Intel hex, Motorola S records, and TI 'B'
+ * records.
+ *
+ * Intel hex input format is
+ * Byte
+ * 1 Colon :
+ * 2..3 Record length, eg: "20"
+ * 4..7 load address nibbles
+ * 8..9 record type: "00" (data) or "02" base addr
+ * 10..x data bytes in ascii-hex
+ * x+1..x+2 cksum (2's compl of (len+addr+data))
+ * x+3 \n -- newline
+ *
+ * $Id$
+ */
+
+char *USAGE = "\
+usage: unhex [-va] [ -o file ] [ file [file ... ] ]\n\
+ -v -- verbose\n\
+ -a base -- 1st byte of output corresponds to this address\n\
+ -l -- linear, just writes data out\n\
+ -o file -- output file; must not be input file\n\
+ -F k_bits -- \"holes\" in input will be filled with 0xFF's\n\
+ up to \"k_bits\" * 1024 bits\n\
+";
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define OK 0
+#define FAILURE (-1)
+#define Failed(x) ((x) == FAILURE)
+#define TRUE 1
+#define FALSE 0
+typedef char bool;
+#define STREQ(a,b) (strcmp(a,b) == 0)
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned long u32;
+
+/*
+ * Pick out designated bytes
+ */
+
+#define B0(x) ((x) & 0xff)
+#define B1(x) B0((x) >> 8)
+#define B2(x) B0((x) >> 16)
+#define B3(x) B0((x) >> 24)
+
+typedef struct buffer_rec {
+ u32 dl_destaddr;
+ u32 dl_jumpaddr;
+ int dl_count;
+ u8 dl_buf[512];
+} buffer_rec;
+
+/*
+ * vars controlled by command line options
+ */
+
+bool verbose = FALSE; /* be verbose */
+bool linear = FALSE; /* just write out linear data */
+char *outfilename = "-"; /* default output is stdout */
+u32 base = 0L; /* base address */
+u32 FFfill = 0L; /* how far to fill w 0xFF's */
+
+extern char *optarg; /* getopt(3) control vars */
+extern int optind;
+extern int errno;
+
+char *progname; /* for error() */
+
+void error(int errn, ...);
+#define ERR_ERRNO (1<<((sizeof(int) * 8) - 2)) /* hi bit; use 'errno' */
+#define ERR_FATAL (ERR_ERRNO / 2) /* error is fatal; no return */
+#define ERR_ABORT (ERR_ERRNO / 4) /* error is fatal; abort */
+#define ERR_MASK (ERR_ERRNO | ERR_FATAL | ERR_ABORT) /* all */
+
+#ifdef HAVE_STRTOUL
+#define stol(p) strtoul(p, (char **) NULL, 0)
+#else
+#define stol(p) strtol(p, (char **) NULL, 0)
+#endif
+
+int unhex(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_Intel_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_S_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+int convert_TI_records(FILE *ifp, char *inm, FILE *ofp, char *onm);
+void write_record(buffer_rec *tb, FILE *fp);
+int getnibble(char **p);
+int getbyte(char **p);
+long getNbytes(char **p, int n);
+void badformat(char *s, char *fname, char *msg);
+
+#define get1bytes(p) ((int) getbyte(p))
+#define get2bytes(p) ((int) getNbytes(p, 2))
+#define get3bytes(p) getNbytes(p, 3)
+#define get4bytes(p) getNbytes(p, 4)
+
+char *BADADDR = "Invalid record address";
+char *BADLEN = "Invalid record length";
+char *BADBASE = "Bad base or starting address";
+char *BADFMT = "Unrecognized record type";
+char *BADDATA = "Invalid data byte";
+char *BADCSUM = "Invalid checksum";
+char *MISCSUM = "Checksum mismatch";
+char *BADTYPE = "Unrecognized record type";
+char *MISTYPE = "Incompatible record types";
+
+int
+main(argc, argv)
+int argc;
+char **argv;
+{
+ register int c;
+ bool showusage = FALSE; /* usage error? */
+ int rc = 0;
+ FILE *outfp, *infp;
+
+ /*
+ * figure out invocation leaf-name
+ */
+
+ if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
+ progname = argv[0];
+ else
+ progname++;
+
+ argv[0] = progname; /* for getopt err reporting */
+
+ /*
+ * Check options and arguments.
+ */
+
+ progname = argv[0];
+ while ((c = getopt(argc, argv, "F:a:o:vl")) != EOF)
+ switch (c)
+ {
+ case 'a': /* base address */
+ base = stol(optarg);
+ break;
+
+ case 'l': /* linear output */
+ linear = TRUE;
+ break;
+
+ case 'v': /* toggle verbose */
+ verbose = ! verbose;
+ break;
+
+ case 'o': /* output file */
+ outfilename = optarg;
+ break;
+
+ case 'F': /* 0xFF fill amount (bytes) */
+ FFfill = stol(optarg) * 1024L / 8L;
+ break;
+
+ case '?':
+ showusage = TRUE;
+ }
+
+ if (showusage)
+ {
+ (void) fprintf(stderr, "%s", USAGE);
+ exit(1);
+ }
+
+ if (linear && (base != 0))
+ {
+ error(0, "-l and -a may not be specified in combination");
+ exit(1);
+ }
+
+ if (STREQ(outfilename, "-"))
+ {
+ outfp = stdout;
+ outfilename = "stdout";
+ }
+ else
+ if ((outfp = fopen(outfilename, "w")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for output", outfilename);
+ exit(1);
+ }
+
+ /*
+ * Now process the input files (or stdin, if none specified)
+ */
+
+ if (argv[optind] == (char *) NULL) /* just stdin */
+ exit(unhex(stdin, "stdin", outfp, outfilename));
+ else
+ for (; (optarg = argv[optind]); optind++)
+ {
+ if (STREQ(optarg, "-"))
+ rc += unhex(stdin, "stdin", outfp, outfilename);
+ else
+ {
+ if ((infp = fopen(optarg, "r")) == (FILE *) NULL)
+ {
+ error(-1, "couldn't open '%s' for input", optarg);
+ exit(1);
+ }
+ rc += unhex(infp, optarg, outfp, outfilename);
+ }
+ }
+
+ return(rc);
+}
+
+u16 filesum;
+
+int
+unhex(FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ int c;
+
+ filesum = 0;
+
+ /*
+ * Make sure holes will be filled with 0xFF's if requested. We
+ * do this the easy way by just filling the file with FF's before
+ * getting started. To do it more optimally would be quite a bit
+ * more difficult since the user can skip around as much as he/she
+ * likes in the input hex file addressing.
+ *
+ * We'll clean this up later (after this program has run) with
+ * 'stripffs'
+ */
+
+ if (FFfill)
+ {
+ (void) fseek(ofp, 0, 0);
+ for (c = FFfill; c > 0; c--)
+ (void) fputc(0xFF, ofp);
+ }
+
+ /*
+ * Read the first char from file and determine record types
+ */
+
+ if ((c = getc(ifp)) != EOF)
+ {
+ ungetc(c, ifp);
+ switch(c)
+ {
+ case 'S':
+ convert_S_records(ifp, inm, ofp, onm);
+ break;
+
+ case ':':
+ convert_Intel_records(ifp, inm, ofp, onm);
+ break;
+
+ case '9':
+ case 'B':
+ convert_TI_records(ifp, inm, ofp, onm);
+ break;
+
+ default:
+ {
+ char tmp[2];
+ tmp[0] = c; tmp[1] = 0;
+ badformat(tmp, inm, BADFMT);
+ }
+ }
+ }
+
+ if (verbose)
+ fprintf(stderr, "'%s' checksum is 0x%04x\n", inm, filesum);
+
+ return 0;
+}
+
+int
+convert_Intel_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int rectype; /* record type */
+ int len; /* data length of current line */
+ u32 addr;
+ u32 base_address = 0;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != ':')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+
+ if ((addr = get2bytes(&p)) == -1L) /* record addr */
+ badformat(buff, inm, BADADDR);
+
+ rectype = getbyte(&p);
+
+ cksum = len + B0(addr) + B1(addr) + rectype;
+
+ switch (rectype)
+ {
+ case 0x00: /* normal data record */
+ tb.dl_destaddr = base_address + addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x01: /* execution start address */
+ base_address = addr;
+ endrecord = TRUE;
+ break;
+
+ case 0x02: /* new base */
+ if ((base_address = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADBASE);
+ cksum += B0(base_address) + B1(base_address);
+ base_address <<= 4;
+ break;
+
+ case 0x03: /* seg/off execution start address */
+ {
+ u32 seg, off;
+
+ seg = get2bytes(&p);
+ off = get2bytes(&p);
+ if ((seg == -1L) || (off == -1L))
+ badformat(buff, inm, BADADDR);
+
+ cksum += B0(seg) + B1(seg) + B0(off) + B1(off);
+
+ tb.dl_jumpaddr = (seg << 4) + off;
+ break;
+ }
+
+ default:
+ error(0, "unknown Intel-hex record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (-cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_S_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ u8 cksum;
+ int incksum;
+ int c;
+ int len; /* data length of current line */
+ int rectype; /* record type */
+ u32 addr;
+ bool endrecord = FALSE;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ p = &buff[0];
+
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ if (*p != 'S')
+ badformat(p, inm, BADFMT);
+ p++;
+
+ if ((rectype = getnibble(&p)) == -1) /* record type */
+ badformat(buff, inm, BADTYPE);
+
+ if ((len = getbyte(&p)) == -1) /* record len */
+ badformat(buff, inm, BADLEN);
+ cksum = len;
+
+ switch (rectype)
+ {
+ case 0x00: /* comment field, ignored */
+ goto write_it;
+
+ case 0x01: /* data record, 16 bit addr */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 3;
+ goto doit;
+
+ case 0x02: /* ... 24 bit addr */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 4;
+ goto doit;
+
+ case 0x03: /* ... 32 bit addr */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ len -= 5;
+ doit:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+
+ tb.dl_destaddr = addr;
+ while (len--)
+ {
+ if ((c = getbyte(&p)) == -1)
+ badformat(buff, inm, BADDATA);
+ cksum += c;
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ }
+ break;
+
+ case 0x07: /* 32 bit end record */
+ if ((addr = get4bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x08: /* 24 bit end record */
+ if ((addr = get3bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+ goto end_rec;
+
+ case 0x09: /* 16 bit end record */
+ if ((addr = get2bytes(&p)) == -1L)
+ badformat(buff, inm, BADADDR);
+
+end_rec:
+ cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
+ tb.dl_jumpaddr = addr;
+ break;
+
+ default:
+ error(0, "unknown Motorola-S record type: 0x%02x", rectype);
+ badformat(buff, inm, BADTYPE);
+ break;
+ }
+
+ /*
+ * Verify checksums are correct in file.
+ */
+
+ cksum = (~cksum) & 0xff;
+ if ((incksum = getbyte(&p)) == -1)
+ badformat(buff, inm, BADCSUM);
+ if (((u8) incksum) != cksum)
+ badformat(buff, inm, MISCSUM);
+
+write_it:
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+int
+convert_TI_records(
+ FILE *ifp,
+ char *inm,
+ FILE *ofp,
+ char *onm)
+{
+ char buff[512];
+ char *p;
+ int c;
+ bool endrecord = FALSE;
+ bool eol;
+ buffer_rec tb;
+
+ while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
+ {
+ if (p[strlen(p)-1] == '\n') /* get rid of newline */
+ p[strlen(p)-1] = '\0';
+
+ if (p[strlen(p)-1] == '\r') /* get rid of any CR */
+ p[strlen(p)-1] = '\0';
+
+ tb.dl_count = 0;
+
+ p = &buff[0];
+ eol = FALSE;
+ while ( ! eol && ! endrecord)
+ {
+ switch (*p++)
+ {
+ case '9':
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ tb.dl_destaddr = get2bytes(&p);
+ break;
+
+ case 'B':
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ c = getbyte(&p);
+ filesum += c;
+ tb.dl_buf[tb.dl_count++] = c;
+ break;
+
+ case 'F':
+ eol = TRUE;
+ break;
+
+ case ':':
+ endrecord = TRUE;
+ break;
+
+ default:
+ badformat(p, inm, BADFMT);
+ }
+ }
+ if (tb.dl_count)
+ write_record(&tb, ofp);
+ }
+ return 0;
+}
+
+void
+write_record(buffer_rec *tb,
+ FILE *fp)
+{
+ if ( ! linear)
+ {
+ if (tb->dl_destaddr < base)
+ error(ERR_FATAL, "record at address 0x%x precedes base of 0x%x",
+ tb->dl_destaddr, base);
+ (void) fseek(fp, tb->dl_destaddr - base, 0);
+ }
+
+ (void) fwrite(tb->dl_buf, tb->dl_count, 1, fp);
+ tb->dl_destaddr += tb->dl_count;
+ tb->dl_count = 0;
+}
+
+int
+getnibble(char **p)
+{
+ register int val;
+
+ **p = toupper(**p);
+ switch (**p)
+ {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ val = **p - '0';
+ break;
+
+ case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+ val = 10 + (**p - 'A');
+ break;
+
+ default:
+ return(-1);
+ }
+ *p += 1;
+
+ return(val & 0x0f);
+}
+
+int
+getbyte(char **p)
+{
+ int n0, n1;
+
+ if ((n0 = getnibble(p)) == -1)
+ return(-1);
+ if ((n1 = getnibble(p)) == -1)
+ return(-1);
+
+ return(((n0 << 4) + n1) & 0xff);
+}
+
+long
+getNbytes(char **p,
+ int n)
+{
+ int t;
+ u32 val = 0;
+
+ while (n--)
+ {
+ if ((t = getbyte(p)) == -1)
+ return(-1L);
+ val <<= 8;
+ val += t;
+ }
+
+ return(val);
+}
+
+void
+badformat(char *s,
+ char *fname,
+ char *msg)
+{
+ if (s[strlen(s)-1] == '\n') /* get rid of newline */
+ s[strlen(s)-1] = '\0';
+ error(0, "line '%s'::\n\tfrom file '%s'; %s", s, fname, msg);
+ exit(1);
+}
+
+/*
+ * error(errn, arglist)
+ * report an error to stderr using printf(3) conventions.
+ * Any output is preceded by '<progname>: '
+ *
+ * Uses ERR_EXIT bit to request exit(errn)
+ * ERR_ABORT to request abort()
+ * ERR_ERRNO to indicate use of errno instead of argument.
+ *
+ * If resulting 'errn' is non-zero, it is assumed to be an 'errno' and its
+ * associated error message is appended to the output.
+ */
+
+/*VARARGS*/
+
+void
+error(int error_flag, ...)
+{
+ va_list arglist;
+ register char *format;
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ int local_errno;
+
+ extern int errno;
+
+ (void) fflush(stdout); /* in case stdout/stderr same */
+
+ local_errno = error_flag & ~ERR_MASK;
+ if (error_flag & ERR_ERRNO) /* use errno? */
+ local_errno = errno;
+
+ va_start(arglist, error_flag);
+ format = va_arg(arglist, char *);
+ (void) fprintf(stderr, "%s: ", progname);
+ (void) vfprintf(stderr, format, arglist);
+ va_end(arglist);
+
+ if (local_errno)
+ if ((local_errno > 0) && (local_errno < sys_nerr))
+ (void) fprintf(stderr, " (%s)\n", sys_errlist[local_errno]);
+ else
+ (void) fprintf(stderr, " (unknown errno=%d)\n", local_errno);
+ else
+ (void) fprintf(stderr, "\n");
+
+ (void) fflush(stderr);
+
+ if (error_flag & (ERR_FATAL | ERR_ABORT))
+ {
+ if (error_flag & ERR_FATAL)
+ {
+ error(0, "fatal error, exiting");
+ exit(local_errno ? local_errno : 1);
+ }
+ else
+ {
+ error(0, "fatal error, aborting");
+ abort();
+ }
+ }
+}
+
diff --git a/tools/cpu/Makefile.in b/tools/cpu/Makefile.in
new file mode 100644
index 0000000000..185bdbb5e0
--- /dev/null
+++ b/tools/cpu/Makefile.in
@@ -0,0 +1,13 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/directory.cfg
+
+SUB_DIRS=generic $(wildcard $(RTEMS_CPU))
diff --git a/tools/cpu/generic/Makefile.in b/tools/cpu/generic/Makefile.in
new file mode 100644
index 0000000000..f673545ea1
--- /dev/null
+++ b/tools/cpu/generic/Makefile.in
@@ -0,0 +1,33 @@
+#
+# $Id$
+#
+# RTEMS build tools
+# NOTE: of course we can't use any of these tools
+# in this Makefile. Most notably: install-if-change
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/bin
+
+PGMS=size_rtems
+
+INSTALLED=$(PGMS:%=$(DESTDIR)/%)
+
+all: $(DESTDIR) $(PGMS) install
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
diff --git a/tools/cpu/hppa1.1/genoffsets.c b/tools/cpu/hppa1.1/genoffsets.c
new file mode 100644
index 0000000000..44a31bc7b0
--- /dev/null
+++ b/tools/cpu/hppa1.1/genoffsets.c
@@ -0,0 +1,348 @@
+/*
+ * genoffsets.c
+ *
+ * This file generates the offsets.h for the HP PA-RISC port of RTEMS.
+ *
+ * NOTE: It only prints the offset for structures actually used
+ * by the assembly code.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+
+#if defined(__hpux__) && defined(__hppa__)
+#include <rtems/system.h>
+#endif
+
+void print_information( void );
+
+int main(
+ int argc,
+ char **argv
+)
+{
+#if defined(__hpux__) && defined(__hppa__)
+ unsigned int size = 0;
+#endif
+
+ /*
+ * Print the file header
+ */
+
+printf(
+ "/* offsets.h\n"
+ " *\n"
+ " * This include file contains the offsets of elements in the\n"
+ " * C data structures used by the assembly language code for the\n"
+ " * HP PA-RISC 1.1 port of RTEMS.\n"
+ " *\n"
+ " * NOTE: THIS FILE IS AUTOMATICALLY GENERATED!!!!\n"
+ " * DO NOT EDIT THIS BY HAND!!!!\n"
+ " *\n"
+ " * COPYRIGHT (c) 1989-1997.\n"
+ " * On-Line Applications Research Corporation (OAR).\n"
+ " * Copyright assigned to U.S. Government, 1994.\n"
+ " *\n"
+ " * The license and distribution terms for this file may in\n"
+ " * the file LICENSE in this distribution or at\n"
+ " * http://www.OARcorp.com/rtems/license.html.\n"
+ " */\n"
+ "\n"
+ "#ifndef __OFFSETS_h\n"
+ "#define __OFFSETS_h\n"
+ "\n"
+);
+
+#define PRINT_IT( STRING, TYPE, FIELD ) \
+ printf( "#define\t%s\t0x%p\t\t/* %d */\n", \
+ STRING, \
+ &((TYPE)0)->FIELD, \
+ (int) &((TYPE)0)->FIELD );
+
+#define PRINT_SIZE( STRING, item ) \
+ printf( "#ifdef ASM\n#define\t%s\t%d\t\t/* 0x%x */\n#endif\n", \
+ STRING, \
+ sizeof(item), \
+ sizeof(item) );
+
+#define PRINT_COMMENT( STRING ) \
+ printf( \
+ "\n" \
+ "/*\n" \
+ " * " STRING "\n" \
+ " */\n" \
+ "\n" \
+ );
+
+#if defined(__hpux__) && defined(__hppa__)
+
+/*
+ * Offsets of elements in the Context_control structure.
+ */
+
+ PRINT_COMMENT("Context_Control information");
+
+ PRINT_IT( "FLAGS_OFFSET", Context_Control *, flags );
+ PRINT_IT( "R1_OFFSET", Context_Control *, gr1 );
+ PRINT_IT( "R2_OFFSET", Context_Control *, gr2 );
+ PRINT_IT( "R3_OFFSET", Context_Control *, gr3 );
+ PRINT_IT( "R4_OFFSET", Context_Control *, gr4 );
+ PRINT_IT( "R5_OFFSET", Context_Control *, gr5 );
+ PRINT_IT( "R6_OFFSET", Context_Control *, gr6 );
+ PRINT_IT( "R7_OFFSET", Context_Control *, gr7 );
+ PRINT_IT( "R8_OFFSET", Context_Control *, gr8 );
+ PRINT_IT( "R9_OFFSET", Context_Control *, gr9 );
+ PRINT_IT( "R10_OFFSET", Context_Control *, gr10 );
+ PRINT_IT( "R11_OFFSET", Context_Control *, gr11 );
+ PRINT_IT( "R12_OFFSET", Context_Control *, gr12 );
+ PRINT_IT( "R13_OFFSET", Context_Control *, gr13 );
+ PRINT_IT( "R14_OFFSET", Context_Control *, gr14 );
+ PRINT_IT( "R15_OFFSET", Context_Control *, gr15 );
+ PRINT_IT( "R16_OFFSET", Context_Control *, gr16 );
+ PRINT_IT( "R17_OFFSET", Context_Control *, gr17 );
+ PRINT_IT( "R18_OFFSET", Context_Control *, gr18 );
+ PRINT_IT( "R19_OFFSET", Context_Control *, gr19 );
+ PRINT_IT( "R20_OFFSET", Context_Control *, gr20 );
+ PRINT_IT( "R21_OFFSET", Context_Control *, gr21 );
+ PRINT_IT( "R22_OFFSET", Context_Control *, gr22 );
+ PRINT_IT( "R23_OFFSET", Context_Control *, gr23 );
+ PRINT_IT( "R24_OFFSET", Context_Control *, gr24 );
+ PRINT_IT( "R25_OFFSET", Context_Control *, gr25 );
+ PRINT_IT( "R26_OFFSET", Context_Control *, gr26 );
+ PRINT_IT( "R27_OFFSET", Context_Control *, gr27 );
+ PRINT_IT( "R28_OFFSET", Context_Control *, gr28 );
+ PRINT_IT( "R29_OFFSET", Context_Control *, gr29 );
+ PRINT_IT( "R30_OFFSET", Context_Control *, sp );
+ PRINT_IT( "R31_OFFSET", Context_Control *, gr31 );
+
+ /*
+ * And common aliases for the above
+ */
+
+ PRINT_COMMENT("Common aliases for above");
+
+ PRINT_IT( "RP_OFFSET", Context_Control *, gr2 );
+ PRINT_IT( "ARG3_OFFSET", Context_Control *, gr23 );
+ PRINT_IT( "ARG2_OFFSET", Context_Control *, gr24 );
+ PRINT_IT( "ARG1_OFFSET", Context_Control *, gr25 );
+ PRINT_IT( "ARG0_OFFSET", Context_Control *, gr26 );
+ PRINT_IT( "SP_OFFSET", Context_Control *, sp );
+ PRINT_IT( "DP_OFFSET", Context_Control *, gr27 );
+ PRINT_IT( "RET0_OFFSET", Context_Control *, gr28 );
+ PRINT_IT( "RET1_OFFSET", Context_Control *, gr29 );
+
+ PRINT_SIZE("CPU_CONTEXT_SIZE", Context_Control);
+
+ PRINT_COMMENT("Context_Control_fp information");
+
+ PRINT_IT( "FR0_OFFSET", Context_Control_fp *, fr0 );
+ PRINT_IT( "FR1_OFFSET", Context_Control_fp *, fr1 );
+ PRINT_IT( "FR2_OFFSET", Context_Control_fp *, fr2 );
+ PRINT_IT( "FR3_OFFSET", Context_Control_fp *, fr3 );
+ PRINT_IT( "FR4_OFFSET", Context_Control_fp *, fr4 );
+ PRINT_IT( "FR5_OFFSET", Context_Control_fp *, fr5 );
+ PRINT_IT( "FR6_OFFSET", Context_Control_fp *, fr6 );
+ PRINT_IT( "FR7_OFFSET", Context_Control_fp *, fr7 );
+ PRINT_IT( "FR8_OFFSET", Context_Control_fp *, fr8 );
+ PRINT_IT( "FR9_OFFSET", Context_Control_fp *, fr9 );
+ PRINT_IT( "FR10_OFFSET", Context_Control_fp *, fr10 );
+ PRINT_IT( "FR11_OFFSET", Context_Control_fp *, fr11 );
+ PRINT_IT( "FR12_OFFSET", Context_Control_fp *, fr12 );
+ PRINT_IT( "FR13_OFFSET", Context_Control_fp *, fr13 );
+ PRINT_IT( "FR14_OFFSET", Context_Control_fp *, fr14 );
+ PRINT_IT( "FR15_OFFSET", Context_Control_fp *, fr15 );
+ PRINT_IT( "FR16_OFFSET", Context_Control_fp *, fr16 );
+ PRINT_IT( "FR17_OFFSET", Context_Control_fp *, fr17 );
+ PRINT_IT( "FR18_OFFSET", Context_Control_fp *, fr18 );
+ PRINT_IT( "FR19_OFFSET", Context_Control_fp *, fr19 );
+ PRINT_IT( "FR20_OFFSET", Context_Control_fp *, fr20 );
+ PRINT_IT( "FR21_OFFSET", Context_Control_fp *, fr21 );
+ PRINT_IT( "FR22_OFFSET", Context_Control_fp *, fr22 );
+ PRINT_IT( "FR23_OFFSET", Context_Control_fp *, fr23 );
+ PRINT_IT( "FR24_OFFSET", Context_Control_fp *, fr24 );
+ PRINT_IT( "FR25_OFFSET", Context_Control_fp *, fr25 );
+ PRINT_IT( "FR26_OFFSET", Context_Control_fp *, fr26 );
+ PRINT_IT( "FR27_OFFSET", Context_Control_fp *, fr27 );
+ PRINT_IT( "FR28_OFFSET", Context_Control_fp *, fr28 );
+ PRINT_IT( "FR29_OFFSET", Context_Control_fp *, fr29 );
+ PRINT_IT( "FR30_OFFSET", Context_Control_fp *, fr30 );
+ PRINT_IT( "FR31_OFFSET", Context_Control_fp *, fr31 );
+
+ PRINT_SIZE("CPU_CONTEXT_FP_SIZE", Context_Control_fp);
+
+ /*
+ * And the control registers
+ */
+
+ PRINT_COMMENT("Control register portion of context");
+
+ PRINT_IT( "SAR_OFFSET", Context_Control *, sar );
+ PRINT_IT( "IPSW_OFFSET", Context_Control *, ipsw );
+ PRINT_IT( "IIR_OFFSET", Context_Control *, iir );
+ PRINT_IT( "IOR_OFFSET", Context_Control *, ior );
+ PRINT_IT( "ISR_OFFSET", Context_Control *, isr );
+ PRINT_IT( "PCOQFRONT_OFFSET", Context_Control *, pcoqfront );
+ PRINT_IT( "PCOQBACK_OFFSET", Context_Control *, pcoqback );
+ PRINT_IT( "PCSQFRONT_OFFSET", Context_Control *, pcsqfront );
+ PRINT_IT( "PCSQBACK_OFFSET", Context_Control *, pcsqback );
+ PRINT_IT( "ITIMER_OFFSET", Context_Control *, itimer );
+
+ /*
+ * Full interrupt frame (integer + float)
+ */
+ PRINT_COMMENT("Interrupt frame information");
+
+ PRINT_IT( "INTEGER_CONTEXT_OFFSET", CPU_Interrupt_frame *, Integer );
+ PRINT_IT( "FP_CONTEXT_OFFSET", CPU_Interrupt_frame *, Floating_Point );
+ size = sizeof( CPU_Interrupt_frame );
+
+ if ( size % CPU_STACK_ALIGNMENT )
+ size += CPU_STACK_ALIGNMENT - (size % CPU_STACK_ALIGNMENT);
+
+ printf( "#define\tCPU_INTERRUPT_FRAME_SIZE\t%d\t\t/* 0x%x */\n", size, size );
+
+#else
+
+ print_information();
+
+#endif
+
+#undef PRINT_IT
+#undef PRINT_SIZE
+#undef PRINT_COMMENT
+
+ /*
+ * Print the end of file stuff
+ */
+
+ printf(
+ "\n"
+ "#endif /* __OFFSETS_h */\n"
+ "\n"
+ "/* end of include file */\n"
+ );
+
+ return 0;
+}
+
+void print_information( void )
+{
+
+#define PRINT_IT( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_SIZE( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_COMMENT( STRING ) \
+ printf( \
+ "\n" \
+ "/*\n" \
+ " * " STRING "\n" \
+ " */\n" \
+ "\n" \
+ );
+
+/*
+ * Offsets of elements in the Context_control structure.
+ */
+
+ PRINT_COMMENT("Context_Control information");
+
+ PRINT_IT( "FLAGS_OFFSET", 0x00 );
+ PRINT_IT( "R1_OFFSET", 0x04 );
+ PRINT_IT( "R2_OFFSET", 0x08 );
+ PRINT_IT( "R3_OFFSET", 0x0c );
+ PRINT_IT( "R4_OFFSET", 0x00 );
+ PRINT_IT( "R5_OFFSET", 0x14 );
+ PRINT_IT( "R6_OFFSET", 0x18 );
+ PRINT_IT( "R7_OFFSET", 0x1c );
+ PRINT_IT( "R8_OFFSET", 0x20 );
+ PRINT_IT( "R9_OFFSET", 0x24 );
+ PRINT_IT( "R10_OFFSET", 0x28 );
+ PRINT_IT( "R11_OFFSET", 0x2c );
+ PRINT_IT( "R12_OFFSET", 0x30 );
+ PRINT_IT( "R13_OFFSET", 0x34 );
+ PRINT_IT( "R14_OFFSET", 0x38 );
+ PRINT_IT( "R15_OFFSET", 0x3c );
+ PRINT_IT( "R16_OFFSET", 0x40 );
+ PRINT_IT( "R17_OFFSET", 0x44 );
+ PRINT_IT( "R18_OFFSET", 0x48 );
+ PRINT_IT( "R19_OFFSET", 0x4c );
+ PRINT_IT( "R20_OFFSET", 0x50 );
+ PRINT_IT( "R21_OFFSET", 0x54 );
+ PRINT_IT( "R22_OFFSET", 0x58 );
+ PRINT_IT( "R23_OFFSET", 0x5c );
+ PRINT_IT( "R24_OFFSET", 0x60 );
+ PRINT_IT( "R25_OFFSET", 0x64 );
+ PRINT_IT( "R26_OFFSET", 0x68 );
+ PRINT_IT( "R27_OFFSET", 0x6c );
+ PRINT_IT( "R28_OFFSET", 0x70 );
+ PRINT_IT( "R29_OFFSET", 0x74 );
+ PRINT_IT( "R30_OFFSET", 0x78 );
+ PRINT_IT( "R31_OFFSET", 0x7c );
+
+ /*
+ * And common aliases for the above
+ */
+
+ PRINT_COMMENT("Common aliases for above");
+
+ PRINT_IT( "RP_OFFSET", 0x08 );
+ PRINT_IT( "ARG3_OFFSET", 0x5c );
+ PRINT_IT( "ARG2_OFFSET", 0x60 );
+ PRINT_IT( "ARG1_OFFSET", 0x64 );
+ PRINT_IT( "ARG0_OFFSET", 0x68 );
+ PRINT_IT( "SP_OFFSET", 0x78 );
+ PRINT_IT( "DP_OFFSET", 0x6c );
+ PRINT_IT( "RET0_OFFSET", 0x74 );
+ PRINT_IT( "RET1_OFFSET", 0x74 );
+
+ PRINT_SIZE("CPU_CONTEXT_SIZE", 168 );
+
+ PRINT_COMMENT("Context_Control_fp information");
+
+ PRINT_SIZE("CPU_CONTEXT_FP_SIZE", 256);
+
+ /*
+ * And the control registers
+ */
+
+ PRINT_COMMENT("Control register portion of context");
+
+ PRINT_IT( "SAR_OFFSET", 0x80 );
+ PRINT_IT( "IPSW_OFFSET", 0x84 );
+ PRINT_IT( "IIR_OFFSET", 0x88 );
+ PRINT_IT( "IOR_OFFSET", 0x8c );
+ PRINT_IT( "ISR_OFFSET", 0x90 );
+ PRINT_IT( "PCOQFRONT_OFFSET", 0x94 );
+ PRINT_IT( "PCOQBACK_OFFSET", 0x98 );
+ PRINT_IT( "PCSQFRONT_OFFSET", 0x9c );
+ PRINT_IT( "PCSQBACK_OFFSET", 0xa0 );
+ PRINT_IT( "ITIMER_OFFSET", 0xa4 );
+
+ /*
+ * Full interrupt frame (integer + float)
+ */
+
+ PRINT_COMMENT("Interrupt frame information");
+
+ PRINT_IT( "INTEGER_CONTEXT_OFFSET", 0x00 );
+ PRINT_IT( "FP_CONTEXT_OFFSET", 0xa8 );
+ PRINT_SIZE( "CPU_INTERRUPT_FRAME_SIZE", 448 );
+
+}
diff --git a/tools/cpu/unix/Makefile.in b/tools/cpu/unix/Makefile.in
new file mode 100644
index 0000000000..f2703f098b
--- /dev/null
+++ b/tools/cpu/unix/Makefile.in
@@ -0,0 +1,61 @@
+#
+# $Id$
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+# we use host compiler here for gensize. Hopefully it has same alignment!!
+USE_HOST_COMPILER=yes
+
+# C source names, if any, go here -- minus the .c
+C_PIECES=gensize
+C_FILES=$(C_PIECES:%=%.c)
+C_O_FILES=$(C_PIECES:%=${ARCH}/%.o)
+
+H_FILES=
+
+SRCS=$(C_FILES) $(H_FILES)
+OBJS=$(C_O_FILES)
+
+PGMS=${ARCH}/gensize
+
+include $(RTEMS_CUSTOM)
+include $(PROJECT_ROOT)/make/leaf.cfg
+
+# We use files that have not been installed yet.
+CPU_DIR=../../cpu/$(RTEMS_CPU)
+
+#
+# (OPTIONAL) Add local stuff here using +=
+#
+
+DEFINES +=
+CPPFLAGS += -I$(PROJECT_RELEASE)/include \
+ -I$(CPU_DIR)
+CFLAGS +=
+
+LD_PATHS +=
+LD_LIBS +=
+LDFLAGS +=
+
+#
+# Add your list of files to delete here.
+#
+
+CLEAN_ADDITIONS +=
+CLOBBER_ADDITIONS +=
+
+all: ${ARCH} $(SRCS) $(PGMS)
+ $(INSTALL) -m 555 ${PGMS} ${PROJECT_RELEASE}/bin
+
+# Hack
+# we are #including files that haven't been installed yet.
+# Make sure they are available in the src tree (ie: checked
+# out from SCCS or RCS)
+preinstall:
+
+# Install the program(s), appending _g or _p as appropriate.
+# for include files, just use $(INSTALL)
diff --git a/tools/cpu/unix/gensize.c b/tools/cpu/unix/gensize.c
new file mode 100644
index 0000000000..bb9d3bd20a
--- /dev/null
+++ b/tools/cpu/unix/gensize.c
@@ -0,0 +1,116 @@
+/*
+ * gensize.c
+ *
+ * This file generates the file unixsize.h
+ *
+ * NOTE: It only prints the minimal information required.
+ *
+ * COPYRIGHT (c) 1989-1997.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ *
+ */
+
+/*
+ * This feels like a very crude way to determine if we are on a Solaris
+ * host but it does work.
+ */
+
+#if defined(__sun__) && defined(__sparc__) && \
+ defined(__unix__) && defined(__svr4__)
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 3
+#undef __STRICT_ANSI__
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <setjmp.h>
+#include <signal.h>
+
+typedef struct {
+ jmp_buf regs;
+ int isr_level;
+} Context_Control;
+
+int main(
+ int argc,
+ char **argv
+)
+{
+ Context_Control *cc = 0;
+
+ /*
+ * Print the file header
+ */
+
+printf(
+ "/* unixsize.h\n"
+ " *\n"
+ " * This include file contans the size of the context control block\n"
+ " * C data structure. This structure must be defined in such a way\n"
+ " * that files NOT including the native header files can work.\n"
+ " *\n"
+ " * NOTE: THIS FILE IS AUTOMATICALLY GENERATED!!!!\n"
+ " * DO NOT EDIT THIS BY HAND!!!!\n"
+ " *\n"
+ " * COPYRIGHT (c) 1989-1997.\n"
+ " * On-Line Applications Research Corporation (OAR).\n"
+ " * Copyright assigned to U.S. Government, 1994.\n"
+ " *\n"
+ " * The license and distribution terms for this file may in\n"
+ " * the file LICENSE in this distribution or at\n"
+ " * http://www.OARcorp.com/rtems/license.html.\n"
+ " */\n"
+ "\n"
+ "#ifndef __UNIXSIZE_h\n"
+ "#define __UNIXSIZE_h\n"
+ "\n"
+);
+
+#define PRINT_IT( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_SIZE( STRING, NUMBER ) \
+ printf( "#define\t%s\t0x%x\t\t/* %d */\n", \
+ STRING, \
+ NUMBER, \
+ NUMBER );
+
+#define PRINT_COMMENT( STRING ) \
+ printf( \
+ "\n" \
+ "/*\n" \
+ " * " STRING "\n" \
+ " */\n" \
+ "\n" \
+ );
+
+ PRINT_COMMENT("Context_Control information");
+
+ PRINT_SIZE("CPU_CONTEXT_SIZE_IN_BYTES", sizeof( Context_Control ) );
+ PRINT_SIZE("CPU_CONTEXT_REGISTERS_OFFSET_IN_BYTES", (int) &cc->regs );
+ PRINT_SIZE("CPU_CONTEXT_SIGNALS_OFFSET_IN_BYTES", (int) &cc->isr_level );
+
+ /*
+ * Print the end of file stuff
+ */
+
+ printf(
+ "\n"
+ "#endif /* __UNIXSIZE_h */\n"
+ "\n"
+ "/* end of include file */\n"
+ );
+
+ return 0;
+}
+
diff --git a/tools/update/310_to_320_list b/tools/update/310_to_320_list
new file mode 100644
index 0000000000..b4add28685
--- /dev/null
+++ b/tools/update/310_to_320_list
@@ -0,0 +1,543 @@
+#
+# External API name
+#
+initialize_executive rtems_initialize_executive
+initialize_executive_early rtems_initialize_executive_early
+initialize_executive_late rtems_initialize_executive_late
+shutdown_executive rtems_shutdown_executive
+task_create rtems_task_create
+task_ident rtems_task_ident
+task_start rtems_task_start
+task_restart rtems_task_restart
+task_delete rtems_task_delete
+task_suspend rtems_task_suspend
+task_resume rtems_task_resume
+task_set_priority rtems_task_set_priority
+task_mode rtems_task_mode
+task_get_note rtems_task_get_note
+task_set_note rtems_task_set_note
+task_wake_after rtems_task_wake_after
+task_wake_when rtems_task_wake_when
+interrupt_catch rtems_interrupt_catch
+clock_set rtems_clock_set
+clock_get rtems_clock_get
+clock_tick rtems_clock_tick
+extension_create rtems_extension_create
+extension_ident rtems_extension_ident
+extension_delete rtems_extension_delete
+timer_create rtems_timer_create
+timer_ident rtems_timer_ident
+timer_cancel rtems_timer_cancel
+timer_delete rtems_timer_delete
+timer_fire_after rtems_timer_fire_after
+timer_fire_when rtems_timer_fire_when
+timer_reset rtems_timer_reset
+semaphore_create rtems_semaphore_create
+semaphore_ident rtems_semaphore_ident
+semaphore_delete rtems_semaphore_delete
+semaphore_obtain rtems_semaphore_obtain
+semaphore_release rtems_semaphore_release
+message_queue_create rtems_message_queue_create
+message_queue_ident rtems_message_queue_ident
+message_queue_delete rtems_message_queue_delete
+message_queue_send rtems_message_queue_send
+message_queue_urgent rtems_message_queue_urgent
+message_queue_broadcast rtems_message_queue_broadcast
+message_queue_receive rtems_message_queue_receive
+message_queue_flush rtems_message_queue_flush
+event_send rtems_event_send
+event_receive rtems_event_receive
+signal_catch rtems_signal_catch
+signal_send rtems_signal_send
+partition_create rtems_partition_create
+partition_ident rtems_partition_ident
+partition_delete rtems_partition_delete
+partition_get_buffer rtems_partition_get_buffer
+partition_return_buffer rtems_partition_return_buffer
+region_create rtems_region_create
+region_extend rtems_region_extend
+region_ident rtems_region_ident
+region_delete rtems_region_delete
+region_get_segment rtems_region_get_segment
+region_get_segment_size rtems_region_get_segment_size
+region_return_segment rtems_region_return_segment
+port_create rtems_port_create
+port_ident rtems_port_ident
+port_delete rtems_port_delete
+port_external_to_internal rtems_port_external_to_internal
+port_internal_to_external rtems_port_internal_to_external
+io_initialize rtems_io_initialize
+io_open rtems_io_open
+io_close rtems_io_close
+io_read rtems_io_read
+io_write rtems_io_write
+io_control rtems_io_control
+fatal_error_occurred rtems_fatal_error_occurred
+rate_monotonic_create rtems_rate_monotonic_create
+rate_monotonic_ident rtems_rate_monotonic_ident
+rate_monotonic_delete rtems_rate_monotonic_delete
+rate_monotonic_cancel rtems_rate_monotonic_cancel
+rate_monotonic_period rtems_rate_monotonic_period
+multiprocessing_announce rtems_multiprocessing_announce
+#
+# Internal Names for API
+#
+_Initialize_Executive rtems_initialize_executive
+_Initialize_Executive_early rtems_initialize_executive_early
+_Initialize_Executive_late rtems_initialize_executive_late
+_Shutdown_Executive rtems_shutdown_executive
+_RTEMS_tasks_Create rtems_task_create
+_RTEMS_tasks_Name_to_id rtems_task_ident
+_RTEMS_tasks_Start rtems_task_start
+_RTEMS_tasks_Restart rtems_task_restart
+_RTEMS_tasks_Delete rtems_task_delete
+_RTEMS_tasks_Suspend rtems_task_suspend
+_RTEMS_tasks_Resume rtems_task_resume
+_RTEMS_tasks_Set_priority rtems_task_set_priority
+_RTEMS_tasks_Mode rtems_task_mode
+_RTEMS_tasks_Get_note rtems_task_get_note
+_RTEMS_tasks_Set_note rtems_task_set_note
+_RTEMS_tasks_Wake_after rtems_task_wake_after
+_RTEMS_tasks_Wake_when rtems_task_wake_when
+_Interrupt_Catch rtems_interrupt_catch
+_Clock_Set rtems_clock_set
+_Clock_Get rtems_clock_get
+_Clock_Tick rtems_clock_tick
+_Extension_Create rtems_extension_create
+_Extension_Name_to_id rtems_extension_ident
+_Extension_Delete rtems_extension_delete
+_Timer_Create rtems_timer_create
+_Timer_Name_to_id rtems_timer_ident
+_Timer_Cancel rtems_timer_cancel
+_Timer_Delete rtems_timer_delete
+_Timer_Fire_after rtems_timer_fire_after
+_Timer_Fire_when rtems_timer_fire_when
+_Timer_Reset rtems_timer_reset
+_Semaphore_Create rtems_semaphore_create
+_Semaphore_Name_to_id rtems_semaphore_ident
+_Semaphore_Delete rtems_semaphore_delete
+_Semaphore_Obtain rtems_semaphore_obtain
+_Semaphore_Release rtems_semaphore_release
+_Message_queue_Create rtems_message_queue_create
+_Message_queue_Name_to_id rtems_message_queue_ident
+_Message_queue_Delete rtems_message_queue_delete
+_Message_queue_Send rtems_message_queue_send
+_Message_queue_Urgent rtems_message_queue_urgent
+_Message_queue_Broadcast rtems_message_queue_broadcast
+_Message_queue_Receive rtems_message_queue_receive
+_Message_queue_Flush rtems_message_queue_flush
+_Event_Send rtems_event_send
+_Event_Receive rtems_event_receive
+_Signal_Catch rtems_signal_catch
+_Signal_Send rtems_signal_send
+_Partition_Create rtems_partition_create
+_Partition_Name_to_id rtems_partition_ident
+_Partition_Delete rtems_partition_delete
+_Partition_Get_buffer rtems_partition_get_buffer
+_Partition_Return_buffer rtems_partition_return_buffer
+_Region_Create rtems_region_create
+_Region_Extend rtems_region_extend
+_Region_Name_to_id rtems_region_ident
+_Region_Delete rtems_region_delete
+_Region_Get_segment rtems_region_get_segment
+_Region_Get_segment_size rtems_region_get_segment_size
+_Region_Return_segment rtems_region_return_segment
+_Dual_ported_memory_Create rtems_port_create
+_Dual_ported_memory_Name_to_id rtems_port_ident
+_Dual_ported_memory_Delete rtems_port_delete
+_Dual_ported_memory_External_to_internal rtems_port_external_to_internal
+_Dual_ported_memory_Internal_to_external rtems_port_internal_to_external
+_IO_Initialize rtems_io_initialize
+_IO_Open rtems_io_open
+_IO_Close rtems_io_close
+_IO_Read rtems_io_read
+_IO_Write rtems_io_write
+_IO_Control rtems_io_control
+_Fatal_Error_occurred rtems_fatal_error_occurred
+_Rate_monotonic_Create rtems_rate_monotonic_create
+_Rate_monotonic_Name_to_id rtems_rate_monotonic_ident
+_Rate_monotonic_Delete rtems_rate_monotonic_delete
+_Rate_monotonic_Cancel rtems_rate_monotonic_cancel
+_Rate_monotonic_Period rtems_rate_monotonic_period
+_Multiprocessing_Announce rtems_multiprocessing_announce
+#
+# Status (API names)
+#
+SUCCESSFUL RTEMS_SUCCESSFUL
+TASK_EXITTED RTEMS_TASK_EXITTED
+MP_NOT_CONFIGURED RTEMS_MP_NOT_CONFIGURED
+INVALID_NAME RTEMS_INVALID_NAME
+INVALID_ID RTEMS_INVALID_ID
+TOO_MANY RTEMS_TOO_MANY
+TIMEOUT RTEMS_TIMEOUT
+OBJECT_WAS_DELETED RTEMS_OBJECT_WAS_DELETED
+INVALID_SIZE RTEMS_INVALID_SIZE
+INVALID_ADDRESS RTEMS_INVALID_ADDRESS
+INVALID_NUMBER RTEMS_INVALID_NUMBER
+NOT_DEFINED RTEMS_NOT_DEFINED
+RESOURCE_IN_USE RTEMS_RESOURCE_IN_USE
+UNSATISFIED RTEMS_UNSATISFIED
+INCORRECT_STATE RTEMS_INCORRECT_STATE
+ALREADY_SUSPENDED RTEMS_ALREADY_SUSPENDED
+ILLEGAL_ON_SELF RTEMS_ILLEGAL_ON_SELF
+ILLEGAL_ON_REMOTE_OBJECT RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+CALLED_FROM_ISR RTEMS_CALLED_FROM_ISR
+INVALID_PRIORITY RTEMS_INVALID_PRIORITY
+INVALID_CLOCK RTEMS_INVALID_CLOCK
+INVALID_NODE RTEMS_INVALID_NODE
+NOT_CONFIGURED RTEMS_NOT_CONFIGURED
+NOT_OWNER_OF_RESOURCE RTEMS_NOT_OWNER_OF_RESOURCE
+NOT_IMPLEMENTED RTEMS_NOT_IMPLEMENTED
+INTERNAL_ERROR RTEMS_INTERNAL_ERROR
+PROXY_BLOCKING RTEMS_PROXY_BLOCKING
+NO_MEMORY RTEMS_NO_MEMORY
+STATUS_CODES_FIRST RTEMS_STATUS_CODES_FIRST
+STATUS_CODES_LAST RTEMS_STATUS_CODES_LAST
+#
+# Status (Internal names)
+#
+STATUS_SUCCESSFUL RTEMS_SUCCESSFUL
+STATUS_TASK_EXITTED RTEMS_TASK_EXITTED
+STATUS_MP_NOT_CONFIGURED RTEMS_MP_NOT_CONFIGURED
+STATUS_INVALID_NAME RTEMS_INVALID_NAME
+STATUS_INVALID_ID RTEMS_INVALID_ID
+STATUS_TOO_MANY RTEMS_TOO_MANY
+STATUS_TIMEOUT RTEMS_TIMEOUT
+STATUS_OBJECT_WAS_DELETED RTEMS_OBJECT_WAS_DELETED
+STATUS_INVALID_SIZE RTEMS_INVALID_SIZE
+STATUS_INVALID_ADDRESS RTEMS_INVALID_ADDRESS
+STATUS_INVALID_NUMBER RTEMS_INVALID_NUMBER
+STATUS_NOT_DEFINED RTEMS_NOT_DEFINED
+STATUS_RESOURCE_IN_USE RTEMS_RESOURCE_IN_USE
+STATUS_UNSATISFIED RTEMS_UNSATISFIED
+STATUS_INCORRECT_STATE RTEMS_INCORRECT_STATE
+STATUS_ALREADY_SUSPENDED RTEMS_ALREADY_SUSPENDED
+STATUS_ILLEGAL_ON_SELF RTEMS_ILLEGAL_ON_SELF
+STATUS_ILLEGAL_ON_REMOTE_OBJECT RTEMS_ILLEGAL_ON_REMOTE_OBJECT
+STATUS_CALLED_FROM_ISR RTEMS_CALLED_FROM_ISR
+STATUS_INVALID_PRIORITY RTEMS_INVALID_PRIORITY
+STATUS_INVALID_CLOCK RTEMS_INVALID_CLOCK
+STATUS_INVALID_NODE RTEMS_INVALID_NODE
+STATUS_NOT_CONFIGURED RTEMS_NOT_CONFIGURED
+STATUS_NOT_OWNER_OF_RESOURCE RTEMS_NOT_OWNER_OF_RESOURCE
+STATUS_NOT_IMPLEMENTED RTEMS_NOT_IMPLEMENTED
+STATUS_INTERNAL_ERROR RTEMS_INTERNAL_ERROR
+STATUS_PROXY_BLOCKING RTEMS_PROXY_BLOCKING
+STATUS_NO_MEMORY RTEMS_NO_MEMORY
+#
+# Attributes (External)
+#
+DEFAULT_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
+NO_FLOATING_POINT RTEMS_NO_FLOATING_POINT
+FLOATING_POINT RTEMS_FLOATING_POINT
+LOCAL RTEMS_LOCAL
+GLOBAL RTEMS_GLOBAL
+FIFO RTEMS_FIFO
+PRIORITY RTEMS_PRIORITY
+NO_LIMIT RTEMS_NO_LIMIT
+LIMIT RTEMS_LIMIT
+COUNTING_SEMAPHORE RTEMS_COUNTING_SEMAPHORE
+BINARY_SEMAPHORE RTEMS_BINARY_SEMAPHORE
+NO_INHERIT_PRIORITY RTEMS_NO_INHERIT_PRIORITY
+INHERIT_PRIORITY RTEMS_INHERIT_PRIORITY
+#
+# Attributes (Internal)
+#
+ATTRIBUTES_DEFAULTS RTEMS_DEFAULT_ATTRIBUTES
+ATTRIBUTES_NO_FLOATING_POINT RTEMS_NO_FLOATING_POINT
+ATTRIBUTES_FLOATING_POINT RTEMS_FLOATING_POINT
+ATTRIBUTES_LOCAL RTEMS_LOCAL
+ATTRIBUTES_GLOBAL RTEMS_GLOBAL
+ATTRIBUTES_FIFO RTEMS_FIFO
+ATTRIBUTES_PRIORITY RTEMS_PRIORITY
+ATTRIBUTES_NO_LIMIT RTEMS_NO_LIMIT
+ATTRIBUTES_LIMIT RTEMS_LIMIT
+ATTRIBUTES_COUNTING_SEMAPHORE RTEMS_COUNTING_SEMAPHORE
+ATTRIBUTES_BINARY_SEMAPHORE RTEMS_BINARY_SEMAPHORE
+ATTRIBUTES_NO_INHERIT_PRIORITY RTEMS_NO_INHERIT_PRIORITY
+ATTRIBUTES_INHERIT_PRIORITY RTEMS_INHERIT_PRIORITY
+#
+# Options (External)
+#
+DEFAULT_OPTIONS RTEMS_DEFAULT_OPTIONS
+WAIT RTEMS_WAIT
+NO_WAIT RTEMS_NO_WAIT
+EVENT_ALL RTEMS_EVENT_ALL
+EVENT_ANY RTEMS_EVENT_ANY
+#
+# Options (Internal)
+#
+OPTIONS_DEFAULT RTEMS_DEFAULT_OPTIONS
+OPTIONS_WAIT RTEMS_WAIT
+OPTIONS_NO_WAIT RTEMS_NO_WAIT
+OPTIONS_EVENT_ALL RTEMS_EVENT_ALL
+OPTIONS_EVENT_ANY RTEMS_EVENT_ANY
+#
+# Masks (External)
+#
+ALL_MODE_MASKS RTEMS_ALL_MODE_MASKS
+PREEMPT_MASK RTEMS_PREEMPT_MASK
+TIMESLICE_MASK RTEMS_TIMESLICE_MASK
+ASR_MASK RTEMS_ASR_MASK
+INTERRUPT_MASK RTEMS_INTERRUPT_MASK
+#
+# Masks (Internal)
+#
+MODES_ALL_MASK RTEMS_ALL_MODE_MASKS
+MODES_PREEMPT_MASK RTEMS_PREEMPT_MASK
+MODES_TIMESLICE_MASK RTEMS_TIMESLICE_MASK
+MODES_ASR_MASK RTEMS_ASR_MASK
+MODES_INTERRUPT_MASK RTEMS_INTERRUPT_MASK
+#
+# Modes (Internal)
+#
+MODES_DEFAULTS RTEMS_DEFAULT_MODES
+MODES_PREEMPT RTEMS_PREEMPT
+MODES_NO_PREEMPT RTEMS_NO_PREEMPT
+MODES_NO_TIMESLICE RTEMS_NO_TIMESLICE
+MODES_TIMESLICE RTEMS_TIMESLICE
+MODES_ASR RTEMS_ASR
+MODES_NO_ASR RTEMS_NO_ASR
+_Modes_Interrupt_level RTEMS_INTERRUPT_LEVEL
+#
+# Modes (External)
+#
+DEFAULT_MODES RTEMS_DEFAULT_MODES
+PREEMPT RTEMS_PREEMPT
+NO_PREEMPT RTEMS_NO_PREEMPT
+NO_TIMESLICE RTEMS_NO_TIMESLICE
+TIMESLICE RTEMS_TIMESLICE
+ASR RTEMS_ASR
+NO_ASR RTEMS_NO_ASR
+INTERRUPT_LEVEL RTEMS_INTERRUPT_LEVEL
+#
+# Identification (External)
+#
+SEARCH_ALL_NODES RTEMS_SEARCH_ALL_NODES
+SEARCH_OTHER_NODES RTEMS_SEARCH_OTHER_NODES
+SEARCH_LOCAL_NODE RTEMS_SEARCH_LOCAL_NODE
+WHO_AM_I RTEMS_WHO_AM_I
+#
+# Identification (Internal)
+#
+OBJECTS_SEARCH_ALL_NODES RTEMS_SEARCH_ALL_NODES
+OBJECTS_SEARCH_OTHER_NODES RTEMS_SEARCH_OTHER_NODES
+OBJECTS_SEARCH_LOCAL_NODE RTEMS_SEARCH_LOCAL_NODE
+OBJECTS_WHO_AM_I RTEMS_WHO_AM_I
+#
+# Miscellaneous (External API)
+#
+CURRENT_MODE RTEMS_CURRENT_MODE
+CURRENT_PRIORITY RTEMS_CURRENT_PRIORITY
+PENDING_EVENTS RTEMS_PENDING_EVENTS
+NO_TIMEOUT RTEMS_NO_TIMEOUT
+SELF RTEMS_SELF
+PERIOD_STATUS RTEMS_PERIOD_STATUS
+YIELD_PROCESSOR RTEMS_YIELD_PROCESSOR
+MINIMUM_PRIORITY RTEMS_MINIMUM_PRIORITY
+MAXIMUM_PRIORITY RTEMS_MAXIMUM_PRIORITY
+MINIMUM_STACK_SIZE RTEMS_MINIMUM_STACK_SIZE
+#
+# Miscellaneous (External API)
+#
+MODES_CURRENT RTEMS_CURRENT_MODE
+PRIORITY_CURRENT RTEMS_CURRENT_PRIORITY
+#
+# Events
+#
+ALL_EVENTS RTEMS_ALL_EVENTS
+EVENT_0 RTEMS_EVENT_0
+EVENT_1 RTEMS_EVENT_1
+EVENT_2 RTEMS_EVENT_2
+EVENT_3 RTEMS_EVENT_3
+EVENT_4 RTEMS_EVENT_4
+EVENT_5 RTEMS_EVENT_5
+EVENT_6 RTEMS_EVENT_6
+EVENT_7 RTEMS_EVENT_7
+EVENT_8 RTEMS_EVENT_8
+EVENT_9 RTEMS_EVENT_9
+EVENT_10 RTEMS_EVENT_10
+EVENT_11 RTEMS_EVENT_11
+EVENT_12 RTEMS_EVENT_12
+EVENT_13 RTEMS_EVENT_13
+EVENT_14 RTEMS_EVENT_14
+EVENT_15 RTEMS_EVENT_15
+EVENT_16 RTEMS_EVENT_16
+EVENT_17 RTEMS_EVENT_17
+EVENT_18 RTEMS_EVENT_18
+EVENT_19 RTEMS_EVENT_19
+EVENT_20 RTEMS_EVENT_20
+EVENT_21 RTEMS_EVENT_21
+EVENT_22 RTEMS_EVENT_22
+EVENT_23 RTEMS_EVENT_23
+EVENT_24 RTEMS_EVENT_24
+EVENT_25 RTEMS_EVENT_25
+EVENT_26 RTEMS_EVENT_26
+EVENT_27 RTEMS_EVENT_27
+EVENT_28 RTEMS_EVENT_28
+EVENT_29 RTEMS_EVENT_29
+EVENT_30 RTEMS_EVENT_30
+EVENT_31 RTEMS_EVENT_31
+#
+# Signals
+#
+SIGNAL_0 RTEMS_SIGNAL_0
+SIGNAL_1 RTEMS_SIGNAL_1
+SIGNAL_2 RTEMS_SIGNAL_2
+SIGNAL_3 RTEMS_SIGNAL_3
+SIGNAL_4 RTEMS_SIGNAL_4
+SIGNAL_5 RTEMS_SIGNAL_5
+SIGNAL_6 RTEMS_SIGNAL_6
+SIGNAL_7 RTEMS_SIGNAL_7
+SIGNAL_8 RTEMS_SIGNAL_8
+SIGNAL_9 RTEMS_SIGNAL_9
+SIGNAL_10 RTEMS_SIGNAL_10
+SIGNAL_11 RTEMS_SIGNAL_11
+SIGNAL_12 RTEMS_SIGNAL_12
+SIGNAL_13 RTEMS_SIGNAL_13
+SIGNAL_14 RTEMS_SIGNAL_14
+SIGNAL_15 RTEMS_SIGNAL_15
+SIGNAL_16 RTEMS_SIGNAL_16
+SIGNAL_17 RTEMS_SIGNAL_17
+SIGNAL_18 RTEMS_SIGNAL_18
+SIGNAL_19 RTEMS_SIGNAL_19
+SIGNAL_20 RTEMS_SIGNAL_20
+SIGNAL_21 RTEMS_SIGNAL_21
+SIGNAL_22 RTEMS_SIGNAL_22
+SIGNAL_23 RTEMS_SIGNAL_23
+SIGNAL_24 RTEMS_SIGNAL_24
+SIGNAL_25 RTEMS_SIGNAL_25
+SIGNAL_26 RTEMS_SIGNAL_26
+SIGNAL_27 RTEMS_SIGNAL_27
+SIGNAL_28 RTEMS_SIGNAL_28
+SIGNAL_29 RTEMS_SIGNAL_29
+SIGNAL_30 RTEMS_SIGNAL_30
+SIGNAL_31 RTEMS_SIGNAL_31
+#
+# Notepads
+#
+NOTEPAD_FIRST RTEMS_NOTEPAD_FIRST
+NOTEPAD_0 RTEMS_NOTEPAD_0
+NOTEPAD_1 RTEMS_NOTEPAD_1
+NOTEPAD_2 RTEMS_NOTEPAD_2
+NOTEPAD_3 RTEMS_NOTEPAD_3
+NOTEPAD_4 RTEMS_NOTEPAD_4
+NOTEPAD_5 RTEMS_NOTEPAD_5
+NOTEPAD_6 RTEMS_NOTEPAD_6
+NOTEPAD_7 RTEMS_NOTEPAD_7
+NOTEPAD_8 RTEMS_NOTEPAD_8
+NOTEPAD_9 RTEMS_NOTEPAD_9
+NOTEPAD_10 RTEMS_NOTEPAD_10
+NOTEPAD_11 RTEMS_NOTEPAD_11
+NOTEPAD_12 RTEMS_NOTEPAD_12
+NOTEPAD_13 RTEMS_NOTEPAD_13
+NOTEPAD_14 RTEMS_NOTEPAD_14
+NOTEPAD_15 RTEMS_NOTEPAD_15
+NOTEPAD_LAST RTEMS_NOTEPAD_LAST
+#
+# Multiprocessing
+#
+MIN_PKTSIZE RTEMS_MINIMUM_PACKET_SIZE
+MIN_HETERO_CONV RTEMS_MINIMUN_HETERO_CONVERSION
+#
+# Name and ID External
+#
+get_node rtems_get_node
+get_index rtems_get_index
+build_name rtems_build_name
+name_to_characters rtems_name_to_characters
+#
+# Name and ID Internal
+#
+_Objects_Get_node rtems_get_node
+_Objects_Get_index rtems_get_index
+_Objects_Build_name rtems_build_name
+_Objects_Name_to_characters rtems_name_to_characters
+#
+# clock_get
+#
+CLOCK_GET_TOD RTEMS_CLOCK_GET_TOD
+CLOCK_GET_SECONDS_SINCE_EPOCH RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH
+CLOCK_GET_TICKS_SINCE_BOOT RTEMS_CLOCK_GET_TICKS_SINCE_BOOT
+CLOCK_GET_TICKS_PER_SECOND RTEMS_CLOCK_GET_TICKS_PER_SECOND
+CLOCK_GET_TIME_VALUE RTEMS_CLOCK_GET_TIME_VALUE
+#
+# Status Code Support Routines (External) -- NO CHANGES
+#
+#
+# Status Code Support Routines (Internal)
+#
+_Status_Is_successful rtems_is_status_successful
+_Status_Is_equal rtems_are_statuses_equal
+#
+# Time Conversion Support Routines (External) -- NO CHANGES
+#
+#
+# Time Conversion Support Routines (Internal)
+#
+_TOD_Milliseconds_to_microseconds RTEMS_MILLISECONDS_TO_MICROSECONDS
+_TOD_Milliseconds_to_ticks RTEMS_MILLISECONDS_TO_MICROSECONDS
+#
+# MP packet
+#
+MP_PACKET_INTERNAL_THREADS RTEMS_MP_PACKET_INTERNAL_THREADS
+MP_PACKET_RTEMS_TASKS RTEMS_MP_PACKET_TASKS
+MP_PACKET_MESSAGE_QUEUE RTEMS_MP_PACKET_MESSAGE_QUEUE
+MP_PACKET_SEMAPHORE RTEMS_MP_PACKET_SEMAPHORE
+MP_PACKET_PARTITION RTEMS_MP_PACKET_PARTITION
+MP_PACKET_REGION RTEMS_MP_PACKET_REGION
+MP_PACKET_EVENT RTEMS_MP_PACKET_EVENT
+MP_PACKET_SIGNAL RTEMS_MP_PACKET_SIGNAL
+#
+#
+#
+IO_Major_control rtems_device_major_number
+IO_Minor_control rtems_device_minor_number
+#
+# Configuration Info
+#
+Configuration_Table rtems_configuration_table
+Configuration_Initialization_tasks_table rtems_initialization_tasks_table
+Configuration_Driver_address_table rtems_driver_address_table
+Configuration_Extension_table rtems_extensions_table
+rtems_tasks_create_extension rtems_task_create_extension
+rtems_tasks_start_extension rtems_task_start_extension
+rtems_tasks_restart_extension rtems_task_restart_extension
+rtems_tasks_delete_extension rtems_task_delete_extension
+rtems_tasks_switch_extension rtems_task_switch_extension
+rtems_tasks_begin_extension rtems_task_begin_extension
+rtems_tasks_exitted_extension rtems_task_exitted_extension
+rtems_fatal_extension rtems_fatal_extension
+Configuration_MPCI_table rtems_mpci_table
+Configuration_Multiprocessing_table rtems_multiprocessing_table
+CPU_Table rtems_cpu_table
+#
+Clock_Get_options rtems_clock_get_options
+Clock_Time_value rtems_clock_time_value
+MP_packet_Prefix rtems_packet_prefix
+MP_packet_Classes rtems_mp_packet_classes
+TOD_Control rtems_time_of_day
+ISR_Vector rtems_vector_number
+Watchdog_Interval rtems_interval
+Watchdog_Service rtems_timer_service_routine_entry
+Attributes_Control rtems_attribute
+Modes_Control rtems_mode
+Options_Control rtems_option
+Priority_Control rtems_task_priority
+PRIORITY_MINIMUM RTEMS_MINIMUM_PRIORITY
+PRIORITY_MAXIMUM RTEMS_MAXIMUM_PRIORITY
+Event_sets_Control rtems_event_set
+ASR_Signal_set_control rtems_signal_set
+Status_Codes rtems_status_code
+RTEMS_TASKS_YIELD_PROCESSOR RTEMS_YIELD_PROCESSOR
+RATE_MONOTONIC_PERIOD_STATUS RTEMS_PERIOD_STATUS
+WATCHDOG_FOREVER RTEMS_NO_TIMEOUT
+STACK_MINIMUM_SIZE RTEMS_MINIMUM_STACK_SIZE
+#
+ASR_Handler rtems_asr_entry
+Thread_Entry rtems_task_entry
+#
+disable_intr rtems_interrupt_disable
+enable_intr rtems_interrupt_enable
+flash_intr rtems_interrupt_flash
+
diff --git a/tools/update/Makefile.in b/tools/update/Makefile.in
new file mode 100644
index 0000000000..200a2b5c6a
--- /dev/null
+++ b/tools/update/Makefile.in
@@ -0,0 +1,37 @@
+#
+# $Id$
+#
+# NOTE: of course we can't use any of these tools
+# in this Makefile. Most notably: install-if-change
+#
+
+@SET_MAKE@
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH=@srcdir@
+
+include $(RTEMS_CUSTOM)
+include $(RTEMS_ROOT)/make/leaf.cfg
+
+DESTDIR=$(PROJECT_RELEASE)/update-tools
+
+PGMS=update word-replace
+MISC_SUPPORT=310_to_320_list
+
+INSTALL_LIST= $(PGMS) $(MISC_SUPPORT)
+
+INSTALLED=$(INSTALL_LIST:%=$(DESTDIR)/%)
+
+all: $(DESTDIR)
+ echo $(DESTDIR)
+
+$(DESTDIR):
+ [ -d $@ ] || $(MKDIR) $@
+
+install: $(INSTALLED)
+
+# Install the program
+$(DESTDIR)/%: %
+ $(make-script)
+ $(INSTALL) -m 555 $(PERL_PGMS) ${DESTDIR}
+ $(INSTALL) -m 444 $(srcdir)/$(MISC_SUPPORT) ${DESTDIR}
diff --git a/tools/update/README b/tools/update/README
new file mode 100644
index 0000000000..bbf99cb71d
--- /dev/null
+++ b/tools/update/README
@@ -0,0 +1,7 @@
+#
+# $Id$
+#
+
+This directory contains tools which aid in upgrading from RTEMS 3.1.0
+to RTEMS 3.2.0.
+